diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 3cb7b27c3a..777381f589 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -15,7 +15,7 @@ jobs: name: Create App Bundle (Gplay) runs-on: ubuntu-latest concurrency: - group: ${{ github.ref == 'refs/head/main' && format('build-release-main-gplay-{0}', github.sha) }} + group: ${{ format('build-release-main-gplay-{0}', github.sha) }} cancel-in-progress: true steps: - uses: actions/checkout@v4 @@ -43,7 +43,7 @@ jobs: name: Create APKs (FDroid) runs-on: ubuntu-latest concurrency: - group: ${{ github.ref == 'refs/head/main' && format('build-release-main-fdroid-{0}', github.sha) }} + group: ${{ format('build-release-main-fdroid-{0}', github.sha) }} cancel-in-progress: true steps: - uses: actions/checkout@v4 diff --git a/CHANGES.md b/CHANGES.md index d303339a27..bd05deed76 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -1,3 +1,30 @@ +Changes in Element X v0.4.14 (2024-06-07) +========================================= + +Features ✨ +---------- + - Add support for incoming share (text or files) from other apps ([#1980](https://github.com/element-hq/element-x-android/issues/1980)) + +Bugfixes 🐛 +---------- + - Render selected/deselected room list filters on top ([#2809](https://github.com/element-hq/element-x-android/issues/2809)) + - Set auto captilization, multiline and autocompletion flags for the markdown EditText. ([#2896](https://github.com/element-hq/element-x-android/issues/2896)) + - Restore Markdown text input contents when returning to the room screen. ([#2898](https://github.com/element-hq/element-x-android/issues/2898)) + - Fixed sending rich content from android keyboards on the markdown text input ([#2917](https://github.com/element-hq/element-x-android/issues/2917)) + - Fix crash when restoring the selection values in the plain text editor. ([#2959](https://github.com/element-hq/element-x-android/issues/2959)) + +Other changes +------------- + - BugReporting | Add public device keys to rageshakes ([#2893](https://github.com/element-hq/element-x-android/issues/2893)) + - Move push provider setting to the "Notifications" screen and display it only when several push provider are available. ([#2912](https://github.com/element-hq/element-x-android/issues/2912)) + - Simplify notifications by removing the custom persistence layer. + - Bump minSdk to 24 (Android 7). ([#2924](https://github.com/element-hq/element-x-android/issues/2924)) + - Add a feature flag ShowBlockedUsersDetails, disabled by default to render display name and avatar of blocked users in the blocked users list. ([#2930](https://github.com/element-hq/element-x-android/issues/2930)) + - Be more specific with the widget permissions ([#2932](https://github.com/element-hq/element-x-android/issues/2932)) + - Analytics | Add support for SuperProperties ([#2953](https://github.com/element-hq/element-x-android/issues/2953)) + - Track when the user starts a room call and when they enable formatting options on the message composer ([#2969](https://github.com/element-hq/element-x-android/issues/2969)) + + Changes in Element X v0.4.13 (2024-05-22) ========================================= diff --git a/README.md b/README.md index 0029966aa7..7924c369a5 100644 --- a/README.md +++ b/README.md @@ -10,7 +10,7 @@ Element X Android is a [Matrix](https://matrix.org/) Android Client provided by [element.io](https://element.io/). This app is currently in a pre-alpha release stage with only basic functionalities. -The application is a total rewrite of [Element-Android](https://github.com/element-hq/element-android) using the [Matrix Rust SDK](https://github.com/matrix-org/matrix-rust-sdk) underneath and targeting devices running Android 6+. The UI layer is written using [Jetpack Compose](https://developer.android.com/jetpack/compose), and the navigation is managed using [Appyx](https://github.com/bumble-tech/appyx). +The application is a total rewrite of [Element-Android](https://github.com/element-hq/element-android) using the [Matrix Rust SDK](https://github.com/matrix-org/matrix-rust-sdk) underneath and targeting devices running Android 7+. The UI layer is written using [Jetpack Compose](https://developer.android.com/jetpack/compose), and the navigation is managed using [Appyx](https://github.com/bumble-tech/appyx). Learn more about why we are building Element X in our blog post: [https://element.io/blog/element-x-experience-the-future-of-element/](https://element.io/blog/element-x-experience-the-future-of-element/). diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 931c995d9a..b3872a18fd 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -122,6 +122,30 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/appconfig/src/main/kotlin/io/element/android/appconfig/ElementCallConfig.kt b/appconfig/src/main/kotlin/io/element/android/appconfig/ElementCallConfig.kt index bbd9f62689..64d75c6aa9 100644 --- a/appconfig/src/main/kotlin/io/element/android/appconfig/ElementCallConfig.kt +++ b/appconfig/src/main/kotlin/io/element/android/appconfig/ElementCallConfig.kt @@ -17,5 +17,13 @@ package io.element.android.appconfig object ElementCallConfig { + /** + * The default base URL for the Element Call service. + */ const val DEFAULT_BASE_URL = "https://call.element.io" + + /** + * The default duration of a ringing call in seconds before it's automatically dismissed. + */ + const val RINGING_CALL_DURATION_SECONDS = 15 } diff --git a/appnav/build.gradle.kts b/appnav/build.gradle.kts index c24e544240..95fb4a8a08 100644 --- a/appnav/build.gradle.kts +++ b/appnav/build.gradle.kts @@ -52,6 +52,7 @@ dependencies { implementation(libs.coil) implementation(projects.features.ftue.api) + implementation(projects.features.share.api) implementation(projects.features.viewfolder.api) implementation(projects.services.apperror.impl) @@ -71,6 +72,7 @@ dependencies { testImplementation(projects.tests.testutils) testImplementation(projects.features.rageshake.test) testImplementation(projects.features.rageshake.impl) + testImplementation(projects.features.share.test) testImplementation(projects.services.appnavstate.test) testImplementation(projects.services.analytics.test) testImplementation(libs.test.appyx.junit) diff --git a/appnav/src/main/kotlin/io/element/android/appnav/LoggedInFlowNode.kt b/appnav/src/main/kotlin/io/element/android/appnav/LoggedInFlowNode.kt index 911ec52d7c..b91cf18464 100644 --- a/appnav/src/main/kotlin/io/element/android/appnav/LoggedInFlowNode.kt +++ b/appnav/src/main/kotlin/io/element/android/appnav/LoggedInFlowNode.kt @@ -16,6 +16,7 @@ package io.element.android.appnav +import android.content.Intent import android.os.Parcelable import androidx.compose.foundation.layout.Box import androidx.compose.runtime.Composable @@ -55,6 +56,7 @@ import io.element.android.features.roomdirectory.api.RoomDescription import io.element.android.features.roomdirectory.api.RoomDirectoryEntryPoint import io.element.android.features.roomlist.api.RoomListEntryPoint import io.element.android.features.securebackup.api.SecureBackupEntryPoint +import io.element.android.features.share.api.ShareEntryPoint import io.element.android.features.userprofile.api.UserProfileEntryPoint import io.element.android.libraries.architecture.BackstackView import io.element.android.libraries.architecture.BaseFlowNode @@ -99,6 +101,7 @@ class LoggedInFlowNode @AssistedInject constructor( private val networkMonitor: NetworkMonitor, private val ftueService: FtueService, private val roomDirectoryEntryPoint: RoomDirectoryEntryPoint, + private val shareEntryPoint: ShareEntryPoint, private val matrixClient: MatrixClient, private val sendingQueue: SendingQueue, snackbarDispatcher: SnackbarDispatcher, @@ -226,6 +229,9 @@ class LoggedInFlowNode @AssistedInject constructor( @Parcelize data object RoomDirectorySearch : NavTarget + + @Parcelize + data class IncomingShare(val intent: Intent) : NavTarget } override fun resolve(navTarget: NavTarget, buildContext: BuildContext): Node { @@ -382,6 +388,20 @@ class LoggedInFlowNode @AssistedInject constructor( }) .build() } + is NavTarget.IncomingShare -> { + shareEntryPoint.nodeBuilder(this, buildContext) + .callback(object : ShareEntryPoint.Callback { + override fun onDone(roomIds: List) { + navigateUp() + if (roomIds.size == 1) { + val targetRoomId = roomIds.first() + backstack.push(NavTarget.Room(targetRoomId.toRoomIdOrAlias())) + } + } + }) + .params(ShareEntryPoint.Params(intent = navTarget.intent)) + .build() + } } } @@ -421,6 +441,17 @@ class LoggedInFlowNode @AssistedInject constructor( } } + internal suspend fun attachIncomingShare(intent: Intent) { + waitForNavTargetAttached { navTarget -> + navTarget is NavTarget.RoomList + } + attachChild { + backstack.push( + NavTarget.IncomingShare(intent) + ) + } + } + @Composable override fun View(modifier: Modifier) { Box(modifier = modifier) { diff --git a/appnav/src/main/kotlin/io/element/android/appnav/RootFlowNode.kt b/appnav/src/main/kotlin/io/element/android/appnav/RootFlowNode.kt index 4b886d9c99..d200acb84e 100644 --- a/appnav/src/main/kotlin/io/element/android/appnav/RootFlowNode.kt +++ b/appnav/src/main/kotlin/io/element/android/appnav/RootFlowNode.kt @@ -283,6 +283,19 @@ class RootFlowNode @AssistedInject constructor( is ResolvedIntent.Navigation -> navigateTo(resolvedIntent.deeplinkData) is ResolvedIntent.Oidc -> onOidcAction(resolvedIntent.oidcAction) is ResolvedIntent.Permalink -> navigateTo(resolvedIntent.permalinkData) + is ResolvedIntent.IncomingShare -> onIncomingShare(resolvedIntent.intent) + } + } + + private suspend fun onIncomingShare(intent: Intent) { + // Is there a session already? + val latestSessionId = authenticationService.getLatestSessionId() + if (latestSessionId == null) { + // No session, open login + switchToNotLoggedInFlow() + } else { + attachSession(latestSessionId) + .attachIncomingShare(intent) } } diff --git a/appnav/src/main/kotlin/io/element/android/appnav/intent/IntentResolver.kt b/appnav/src/main/kotlin/io/element/android/appnav/intent/IntentResolver.kt index dafbf8c283..d41fbbfebb 100644 --- a/appnav/src/main/kotlin/io/element/android/appnav/intent/IntentResolver.kt +++ b/appnav/src/main/kotlin/io/element/android/appnav/intent/IntentResolver.kt @@ -30,6 +30,7 @@ sealed interface ResolvedIntent { data class Navigation(val deeplinkData: DeeplinkData) : ResolvedIntent data class Oidc(val oidcAction: OidcAction) : ResolvedIntent data class Permalink(val permalinkData: PermalinkData) : ResolvedIntent + data class IncomingShare(val intent: Intent) : ResolvedIntent } class IntentResolver @Inject constructor( @@ -56,6 +57,10 @@ class IntentResolver @Inject constructor( ?.takeIf { it !is PermalinkData.FallbackLink } if (permalinkData != null) return ResolvedIntent.Permalink(permalinkData) + if (intent.action == Intent.ACTION_SEND || intent.action == Intent.ACTION_SEND_MULTIPLE) { + return ResolvedIntent.IncomingShare(intent) + } + // Unknown intent Timber.w("Unknown intent") return null diff --git a/appnav/src/main/kotlin/io/element/android/appnav/root/RootPresenter.kt b/appnav/src/main/kotlin/io/element/android/appnav/root/RootPresenter.kt index cfd686a655..fe76113a95 100644 --- a/appnav/src/main/kotlin/io/element/android/appnav/root/RootPresenter.kt +++ b/appnav/src/main/kotlin/io/element/android/appnav/root/RootPresenter.kt @@ -23,6 +23,7 @@ import androidx.compose.runtime.getValue import im.vector.app.features.analytics.plan.SuperProperties import io.element.android.features.rageshake.api.crash.CrashDetectionPresenter import io.element.android.features.rageshake.api.detection.RageshakeDetectionPresenter +import io.element.android.features.share.api.ShareService import io.element.android.libraries.architecture.Presenter import io.element.android.libraries.matrix.api.SdkMetadata import io.element.android.services.analytics.api.AnalyticsService @@ -34,6 +35,7 @@ class RootPresenter @Inject constructor( private val rageshakeDetectionPresenter: RageshakeDetectionPresenter, private val appErrorStateService: AppErrorStateService, private val analyticsService: AnalyticsService, + private val shareService: ShareService, private val sdkMetadata: SdkMetadata, ) : Presenter { @Composable @@ -52,6 +54,10 @@ class RootPresenter @Inject constructor( ) } + LaunchedEffect(Unit) { + shareService.observeFeatureFlag(this) + } + return RootState( rageshakeDetectionState = rageshakeDetectionState, crashDetectionState = crashDetectionState, diff --git a/appnav/src/test/kotlin/io/element/android/appnav/RootPresenterTest.kt b/appnav/src/test/kotlin/io/element/android/appnav/RootPresenterTest.kt index 118ecd1e46..aeaeb10859 100644 --- a/appnav/src/test/kotlin/io/element/android/appnav/RootPresenterTest.kt +++ b/appnav/src/test/kotlin/io/element/android/appnav/RootPresenterTest.kt @@ -28,6 +28,8 @@ import io.element.android.features.rageshake.test.crash.FakeCrashDataStore 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.share.api.ShareService +import io.element.android.features.share.test.FakeShareService import io.element.android.libraries.matrix.test.FakeSdkMetadata import io.element.android.libraries.matrix.test.core.aBuildMeta import io.element.android.services.analytics.test.FakeAnalyticsService @@ -35,6 +37,8 @@ import io.element.android.services.apperror.api.AppErrorState import io.element.android.services.apperror.api.AppErrorStateService import io.element.android.services.apperror.impl.DefaultAppErrorStateService import io.element.android.tests.testutils.WarmUpRule +import io.element.android.tests.testutils.lambda.lambdaRecorder +import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.test.runTest import org.junit.Rule import org.junit.Test @@ -55,6 +59,22 @@ class RootPresenterTest { } } + @Test + fun `present - check that share service is invoked`() = runTest { + val lambda = lambdaRecorder { _ -> } + val presenter = createRootPresenter( + shareService = FakeShareService { + lambda(it) + } + ) + moleculeFlow(RecompositionMode.Immediate) { + presenter.present() + }.test { + skipItems(2) + lambda.assertions().isCalledOnce() + } + } + @Test fun `present - passes app error state`() = runTest { val presenter = createRootPresenter( @@ -79,7 +99,8 @@ class RootPresenterTest { } private fun createRootPresenter( - appErrorService: AppErrorStateService = DefaultAppErrorStateService() + appErrorService: AppErrorStateService = DefaultAppErrorStateService(), + shareService: ShareService = FakeShareService {}, ): RootPresenter { val crashDataStore = FakeCrashDataStore() val rageshakeDataStore = FakeRageshakeDataStore() @@ -102,6 +123,7 @@ class RootPresenterTest { rageshakeDetectionPresenter = rageshakeDetectionPresenter, appErrorStateService = appErrorService, analyticsService = FakeAnalyticsService(), + shareService = shareService, sdkMetadata = FakeSdkMetadata("sha") ) } 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 0a0b507742..aa0fe9cbf1 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 @@ -209,13 +209,33 @@ class IntentResolverTest { permalinkParserResult = { permalinkData } ) val intent = Intent(RuntimeEnvironment.getApplication(), Activity::class.java).apply { - action = Intent.ACTION_SEND + action = Intent.ACTION_BATTERY_LOW data = "https://matrix.to/invalid".toUri() } val result = sut.resolve(intent) assertThat(result).isNull() } + @Test + fun `test incoming share simple`() { + val sut = createIntentResolver() + val intent = Intent(RuntimeEnvironment.getApplication(), Activity::class.java).apply { + action = Intent.ACTION_SEND + } + val result = sut.resolve(intent) + assertThat(result).isEqualTo(ResolvedIntent.IncomingShare(intent = intent)) + } + + @Test + fun `test incoming share multiple`() { + val sut = createIntentResolver() + val intent = Intent(RuntimeEnvironment.getApplication(), Activity::class.java).apply { + action = Intent.ACTION_SEND_MULTIPLE + } + val result = sut.resolve(intent) + assertThat(result).isEqualTo(ResolvedIntent.IncomingShare(intent = intent)) + } + @Test fun `test resolve invalid`() { val sut = createIntentResolver( diff --git a/build.gradle.kts b/build.gradle.kts index 869bae5f8b..ce822e3fa5 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -60,7 +60,7 @@ allprojects { config.from(files("$rootDir/tools/detekt/detekt.yml")) } dependencies { - detektPlugins("io.nlopez.compose.rules:detekt:0.4.3") + detektPlugins("io.nlopez.compose.rules:detekt:0.4.4") } // KtLint diff --git a/changelog.d/2809.bugfix b/changelog.d/2809.bugfix deleted file mode 100644 index 70e3079686..0000000000 --- a/changelog.d/2809.bugfix +++ /dev/null @@ -1 +0,0 @@ -Render selected/deselected room list filters on top diff --git a/changelog.d/2893.misc b/changelog.d/2893.misc deleted file mode 100644 index ee122ae436..0000000000 --- a/changelog.d/2893.misc +++ /dev/null @@ -1 +0,0 @@ -BugReporting | Add public device keys to rageshakes diff --git a/changelog.d/2894.feature b/changelog.d/2894.feature new file mode 100644 index 0000000000..6c9067ebed --- /dev/null +++ b/changelog.d/2894.feature @@ -0,0 +1 @@ +Ringing call notifications and full screen ringing screen for DMs when the device is locked. diff --git a/changelog.d/2896.bugfix b/changelog.d/2896.bugfix deleted file mode 100644 index ac1c95b47b..0000000000 --- a/changelog.d/2896.bugfix +++ /dev/null @@ -1 +0,0 @@ -Set auto captilization, multiline and autocompletion flags for the markdown EditText. diff --git a/changelog.d/2898.bugfix b/changelog.d/2898.bugfix deleted file mode 100644 index 74dbdb7b85..0000000000 --- a/changelog.d/2898.bugfix +++ /dev/null @@ -1 +0,0 @@ -Restoree Markdown text input contents when returning to the room screen. diff --git a/changelog.d/2912.misc b/changelog.d/2912.misc deleted file mode 100644 index c9e5ea0ae2..0000000000 --- a/changelog.d/2912.misc +++ /dev/null @@ -1 +0,0 @@ -Move push provider setting to the "Notifications" screen and display it only when several push provider are available. diff --git a/changelog.d/2917.bugfix b/changelog.d/2917.bugfix deleted file mode 100644 index cc810393fc..0000000000 --- a/changelog.d/2917.bugfix +++ /dev/null @@ -1 +0,0 @@ -Fixed sending rich content from android keyboards on the markdown text input diff --git a/changelog.d/2924.misc b/changelog.d/2924.misc deleted file mode 100644 index c43093e0fa..0000000000 --- a/changelog.d/2924.misc +++ /dev/null @@ -1,3 +0,0 @@ -Simplify notifications by removing the custom persistence layer. - -Bump minSdk to 24 (Android 7). diff --git a/changelog.d/2930.misc b/changelog.d/2930.misc deleted file mode 100644 index dd04ffcffc..0000000000 --- a/changelog.d/2930.misc +++ /dev/null @@ -1 +0,0 @@ -Add a feature flag ShowBlockedUsersDetails, disabled by default to render display name and avatar of blocked users in the blocked users list. diff --git a/changelog.d/2932.misc b/changelog.d/2932.misc deleted file mode 100644 index d8810fe08c..0000000000 --- a/changelog.d/2932.misc +++ /dev/null @@ -1 +0,0 @@ -Be more specific with the widget permissions diff --git a/changelog.d/2953.misc b/changelog.d/2953.misc deleted file mode 100644 index acdf2cd717..0000000000 --- a/changelog.d/2953.misc +++ /dev/null @@ -1 +0,0 @@ -Analytics | Add support for SuperProperties diff --git a/changelog.d/2959.bugfix b/changelog.d/2959.bugfix deleted file mode 100644 index 777c5da212..0000000000 --- a/changelog.d/2959.bugfix +++ /dev/null @@ -1 +0,0 @@ -Fix crash when restoring the selection values in the plain text editor. diff --git a/changelog.d/2969.misc b/changelog.d/2969.misc deleted file mode 100644 index 327a778f74..0000000000 --- a/changelog.d/2969.misc +++ /dev/null @@ -1 +0,0 @@ -Track when the user starts a room call and when they enable formatting options on the message composer diff --git a/fastlane/metadata/android/en-US/changelogs/40004140.txt b/fastlane/metadata/android/en-US/changelogs/40004140.txt new file mode 100644 index 0000000000..b4b4c008b8 --- /dev/null +++ b/fastlane/metadata/android/en-US/changelogs/40004140.txt @@ -0,0 +1,2 @@ +Main changes in this version: Add support for incoming share (text or files) from other apps. Bug fixes. +Full changelog: https://github.com/element-hq/element-x-android/releases diff --git a/features/analytics/api/src/main/res/values-et/translations.xml b/features/analytics/api/src/main/res/values-et/translations.xml new file mode 100644 index 0000000000..66da1fec3b --- /dev/null +++ b/features/analytics/api/src/main/res/values-et/translations.xml @@ -0,0 +1,7 @@ + + + "Võimalike rakenduse vigade leidmiseks palun jaga anonüümset kasutusteavet." + "Sa võid lugeda meie kasutustingimusi %1$s" + "siin" + "Jaga andmeid rakenduse kasutuse kohta" + diff --git a/features/analytics/impl/src/main/res/values-et/translations.xml b/features/analytics/impl/src/main/res/values-et/translations.xml new file mode 100644 index 0000000000..e066cd14f7 --- /dev/null +++ b/features/analytics/impl/src/main/res/values-et/translations.xml @@ -0,0 +1,10 @@ + + + "Me ei salvesta ega profileeri sinu isiklikke andmeid" + "Võimalike rakenduse vigade leidmiseks palun jaga anonüümset kasutusteavet." + "Sa võid lugeda meie kasutustingimusi %1$s" + "siin" + "Selle valiku saad igal ajal välja lülitada" + "Me ei jaga andmeid kolmandate osapooltega" + "Aita parandada %1$s rakendust" + diff --git a/features/call/api/build.gradle.kts b/features/call/api/build.gradle.kts new file mode 100644 index 0000000000..100960d544 --- /dev/null +++ b/features/call/api/build.gradle.kts @@ -0,0 +1,31 @@ +/* + * Copyright (c) 2024 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") + id("kotlin-parcelize") +} + +android { + namespace = "io.element.android.features.call.api" +} + +dependencies { + implementation(projects.anvilannotations) + implementation(projects.libraries.architecture) + implementation(projects.libraries.core) + implementation(projects.libraries.matrix.api) +} diff --git a/features/call/src/main/kotlin/io/element/android/features/call/CallType.kt b/features/call/api/src/main/kotlin/io/element/android/features/call/api/CallType.kt similarity index 92% rename from features/call/src/main/kotlin/io/element/android/features/call/CallType.kt rename to features/call/api/src/main/kotlin/io/element/android/features/call/api/CallType.kt index a3615671b6..4ce3a35fb6 100644 --- a/features/call/src/main/kotlin/io/element/android/features/call/CallType.kt +++ b/features/call/api/src/main/kotlin/io/element/android/features/call/api/CallType.kt @@ -1,5 +1,5 @@ /* - * Copyright (c) 2023 New Vector Ltd + * Copyright (c) 2024 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. @@ -14,7 +14,7 @@ * limitations under the License. */ -package io.element.android.features.call +package io.element.android.features.call.api import android.os.Parcelable import io.element.android.libraries.architecture.NodeInputs 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 new file mode 100644 index 0000000000..5f4a5c3a65 --- /dev/null +++ b/features/call/api/src/main/kotlin/io/element/android/features/call/api/ElementCallEntryPoint.kt @@ -0,0 +1,53 @@ +/* + * Copyright (c) 2024 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. + */ + +package io.element.android.features.call.api + +import io.element.android.libraries.matrix.api.core.EventId +import io.element.android.libraries.matrix.api.core.UserId + +/** + * Entry point for the call feature. + */ +interface ElementCallEntryPoint { + /** + * Start a call of the given type. + * @param callType The type of call to start. + */ + fun startCall(callType: CallType) + + /** + * Handle an incoming call. + * @param callType The type of call. + * @param eventId The event id of the event that started the call. + * @param senderId The user id of the sender of the event that started the call. + * @param roomName The name of the room the call is in. + * @param senderName The name of the sender of the event that started the call. + * @param avatarUrl The avatar url of the room or DM. + * @param timestamp The timestamp of the event that started the call. + * @param notificationChannelId The id of the notification channel to use for the call notification. + */ + fun handleIncomingCall( + callType: CallType.RoomCall, + eventId: EventId, + senderId: UserId, + roomName: String?, + senderName: String?, + avatarUrl: String?, + timestamp: Long, + notificationChannelId: String, + ) +} diff --git a/features/call/build.gradle.kts b/features/call/impl/build.gradle.kts similarity index 78% rename from features/call/build.gradle.kts rename to features/call/impl/build.gradle.kts index 7ff1510cef..72ccdc089b 100644 --- a/features/call/build.gradle.kts +++ b/features/call/impl/build.gradle.kts @@ -1,5 +1,5 @@ /* - * Copyright (c) 2023 New Vector Ltd + * Copyright (c) 2024 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. @@ -23,11 +23,15 @@ plugins { } android { - namespace = "io.element.android.features.call" + namespace = "io.element.android.features.call.impl" buildFeatures { buildConfig = true } + + testOptions { + unitTests.isIncludeAndroidResources = true + } } anvil { @@ -41,12 +45,17 @@ dependencies { implementation(projects.libraries.core) implementation(projects.libraries.designsystem) implementation(projects.libraries.matrix.impl) + implementation(projects.libraries.matrixui) implementation(projects.libraries.network) implementation(projects.libraries.preferences.api) + implementation(projects.libraries.push.api) + implementation(projects.libraries.uiStrings) implementation(projects.services.analytics.api) implementation(projects.services.toolbox.api) implementation(libs.androidx.webkit) + implementation(libs.coil.compose) implementation(libs.serialization.json) + api(projects.features.call.api) ksp(libs.showkase.processor) testImplementation(libs.coroutines.test) @@ -54,9 +63,12 @@ dependencies { testImplementation(libs.test.truth) testImplementation(libs.test.turbine) testImplementation(libs.test.robolectric) + testImplementation(libs.test.mockk) + testImplementation(projects.features.call.test) testImplementation(projects.libraries.featureflag.test) testImplementation(projects.libraries.preferences.test) testImplementation(projects.libraries.matrix.test) + testImplementation(projects.libraries.push.test) testImplementation(projects.services.analytics.test) testImplementation(projects.tests.testutils) } diff --git a/features/call/src/main/AndroidManifest.xml b/features/call/impl/src/main/AndroidManifest.xml similarity index 75% rename from features/call/src/main/AndroidManifest.xml rename to features/call/impl/src/main/AndroidManifest.xml index 532d5bc40c..354ea7533d 100644 --- a/features/call/src/main/AndroidManifest.xml +++ b/features/call/impl/src/main/AndroidManifest.xml @@ -23,11 +23,17 @@ android:name="android.hardware.microphone" android:required="false" /> + + + + + + + + + + android:exported="false" + android:foregroundServiceType="phoneCall" /> + + + 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 new file mode 100644 index 0000000000..8350e01e8d --- /dev/null +++ b/features/call/impl/src/main/kotlin/io/element/android/features/call/impl/DefaultElementCallEntryPoint.kt @@ -0,0 +1,69 @@ +/* + * Copyright (c) 2024 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. + */ + +package io.element.android.features.call.impl + +import android.content.Context +import com.squareup.anvil.annotations.ContributesBinding +import io.element.android.features.call.api.CallType +import io.element.android.features.call.api.ElementCallEntryPoint +import io.element.android.features.call.impl.notifications.CallNotificationData +import io.element.android.features.call.impl.utils.ActiveCallManager +import io.element.android.features.call.impl.utils.IntentProvider +import io.element.android.libraries.di.AppScope +import io.element.android.libraries.di.ApplicationContext +import io.element.android.libraries.matrix.api.core.EventId +import io.element.android.libraries.matrix.api.core.UserId +import javax.inject.Inject + +@ContributesBinding(AppScope::class) +class DefaultElementCallEntryPoint @Inject constructor( + @ApplicationContext private val context: Context, + private val activeCallManager: ActiveCallManager, +) : ElementCallEntryPoint { + companion object { + const val EXTRA_CALL_TYPE = "EXTRA_CALL_TYPE" + const val REQUEST_CODE = 2255 + } + + override fun startCall(callType: CallType) { + context.startActivity(IntentProvider.createIntent(context, callType)) + } + + override fun handleIncomingCall( + callType: CallType.RoomCall, + eventId: EventId, + senderId: UserId, + roomName: String?, + senderName: String?, + avatarUrl: String?, + timestamp: Long, + notificationChannelId: String, + ) { + val incomingCallNotificationData = CallNotificationData( + sessionId = callType.sessionId, + roomId = callType.roomId, + eventId = eventId, + senderId = senderId, + roomName = roomName, + senderName = senderName, + avatarUrl = avatarUrl, + timestamp = timestamp, + notificationChannelId = notificationChannelId, + ) + activeCallManager.registerIncomingCall(notificationData = incomingCallNotificationData) + } +} diff --git a/features/call/src/main/kotlin/io/element/android/features/call/data/WidgetMessage.kt b/features/call/impl/src/main/kotlin/io/element/android/features/call/impl/data/WidgetMessage.kt similarity index 96% rename from features/call/src/main/kotlin/io/element/android/features/call/data/WidgetMessage.kt rename to features/call/impl/src/main/kotlin/io/element/android/features/call/impl/data/WidgetMessage.kt index 0d9be99cf7..a75132abae 100644 --- a/features/call/src/main/kotlin/io/element/android/features/call/data/WidgetMessage.kt +++ b/features/call/impl/src/main/kotlin/io/element/android/features/call/impl/data/WidgetMessage.kt @@ -14,7 +14,7 @@ * limitations under the License. */ -package io.element.android.features.call.data +package io.element.android.features.call.impl.data import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable diff --git a/features/call/src/main/kotlin/io/element/android/features/call/di/CallBindings.kt b/features/call/impl/src/main/kotlin/io/element/android/features/call/impl/di/CallBindings.kt similarity index 67% rename from features/call/src/main/kotlin/io/element/android/features/call/di/CallBindings.kt rename to features/call/impl/src/main/kotlin/io/element/android/features/call/impl/di/CallBindings.kt index acbf3dba1f..88fea81149 100644 --- a/features/call/src/main/kotlin/io/element/android/features/call/di/CallBindings.kt +++ b/features/call/impl/src/main/kotlin/io/element/android/features/call/impl/di/CallBindings.kt @@ -14,13 +14,17 @@ * limitations under the License. */ -package io.element.android.features.call.di +package io.element.android.features.call.impl.di import com.squareup.anvil.annotations.ContributesTo -import io.element.android.features.call.ui.ElementCallActivity +import io.element.android.features.call.impl.receivers.DeclineCallBroadcastReceiver +import io.element.android.features.call.impl.ui.ElementCallActivity +import io.element.android.features.call.impl.ui.IncomingCallActivity import io.element.android.libraries.di.AppScope @ContributesTo(AppScope::class) interface CallBindings { fun inject(callActivity: ElementCallActivity) + fun inject(callActivity: IncomingCallActivity) + fun inject(declineCallBroadcastReceiver: DeclineCallBroadcastReceiver) } diff --git a/features/call/impl/src/main/kotlin/io/element/android/features/call/impl/notifications/CallNotificationData.kt b/features/call/impl/src/main/kotlin/io/element/android/features/call/impl/notifications/CallNotificationData.kt new file mode 100644 index 0000000000..9f49c6e869 --- /dev/null +++ b/features/call/impl/src/main/kotlin/io/element/android/features/call/impl/notifications/CallNotificationData.kt @@ -0,0 +1,37 @@ +/* + * Copyright (c) 2024 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. + */ + +package io.element.android.features.call.impl.notifications + +import android.os.Parcelable +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.UserId +import kotlinx.parcelize.Parcelize + +@Parcelize +data class CallNotificationData( + val sessionId: SessionId, + val roomId: RoomId, + val eventId: EventId, + val senderId: UserId, + val roomName: String?, + val senderName: String?, + val avatarUrl: String?, + val notificationChannelId: String, + val timestamp: Long, +) : Parcelable diff --git a/features/call/impl/src/main/kotlin/io/element/android/features/call/impl/notifications/RingingCallNotificationCreator.kt b/features/call/impl/src/main/kotlin/io/element/android/features/call/impl/notifications/RingingCallNotificationCreator.kt new file mode 100644 index 0000000000..cd4c3692d2 --- /dev/null +++ b/features/call/impl/src/main/kotlin/io/element/android/features/call/impl/notifications/RingingCallNotificationCreator.kt @@ -0,0 +1,130 @@ +/* + * Copyright (c) 2024 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. + */ +package io.element.android.features.call.impl.notifications + +import android.app.Notification +import android.app.PendingIntent +import android.content.Context +import android.content.Intent +import android.media.AudioManager +import android.media.RingtoneManager +import androidx.core.app.NotificationCompat +import androidx.core.app.PendingIntentCompat +import androidx.core.app.Person +import io.element.android.appconfig.ElementCallConfig +import io.element.android.features.call.api.CallType +import io.element.android.features.call.impl.receivers.DeclineCallBroadcastReceiver +import io.element.android.features.call.impl.ui.IncomingCallActivity +import io.element.android.features.call.impl.utils.IntentProvider +import io.element.android.libraries.designsystem.utils.CommonDrawables +import io.element.android.libraries.di.ApplicationContext +import io.element.android.libraries.matrix.api.MatrixClientProvider +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.UserId +import io.element.android.libraries.matrix.ui.media.ImageLoaderHolder +import io.element.android.libraries.push.api.notifications.NotificationBitmapLoader +import javax.inject.Inject +import kotlin.time.Duration.Companion.seconds + +/** + * Creates a notification for a ringing call. + */ +class RingingCallNotificationCreator @Inject constructor( + @ApplicationContext private val context: Context, + private val matrixClientProvider: MatrixClientProvider, + private val imageLoaderHolder: ImageLoaderHolder, + private val notificationBitmapLoader: NotificationBitmapLoader, +) { + companion object { + /** + * Request code for the decline action. + */ + const val DECLINE_REQUEST_CODE = 1 + + /** + * Request code for the full screen intent. + */ + const val FULL_SCREEN_INTENT_REQUEST_CODE = 2 + } + + suspend fun createNotification( + sessionId: SessionId, + roomId: RoomId, + eventId: EventId, + senderId: UserId, + roomName: String?, + senderDisplayName: String, + roomAvatarUrl: String?, + notificationChannelId: String, + timestamp: Long, + ): Notification? { + val matrixClient = matrixClientProvider.getOrRestore(sessionId).getOrNull() ?: return null + val imageLoader = imageLoaderHolder.get(matrixClient) + val largeIcon = notificationBitmapLoader.getUserIcon(roomAvatarUrl, imageLoader) + + val caller = Person.Builder() + .setName(senderDisplayName) + .setIcon(largeIcon) + .setImportant(true) + .build() + + val answerIntent = IntentProvider.getPendingIntent(context, CallType.RoomCall(sessionId, roomId)) + + val declineIntent = PendingIntentCompat.getBroadcast( + context, + DECLINE_REQUEST_CODE, + Intent(context, DeclineCallBroadcastReceiver::class.java), + PendingIntent.FLAG_CANCEL_CURRENT, + false, + )!! + + val fullScreenIntent = PendingIntentCompat.getActivity( + context, + FULL_SCREEN_INTENT_REQUEST_CODE, + Intent(context, IncomingCallActivity::class.java).apply { + putExtra( + IncomingCallActivity.EXTRA_NOTIFICATION_DATA, + CallNotificationData(sessionId, roomId, eventId, senderId, roomName, senderDisplayName, roomAvatarUrl, notificationChannelId, timestamp) + ) + }, + PendingIntent.FLAG_CANCEL_CURRENT, + false + ) + + val ringtoneUri = RingtoneManager.getActualDefaultRingtoneUri(context, RingtoneManager.TYPE_RINGTONE) + return NotificationCompat.Builder(context, notificationChannelId) + .setSmallIcon(CommonDrawables.ic_notification_small) + .setPriority(NotificationCompat.PRIORITY_MAX) + .setCategory(NotificationCompat.CATEGORY_CALL) + .setStyle(NotificationCompat.CallStyle.forIncomingCall(caller, declineIntent, answerIntent).setIsVideo(true)) + .addPerson(caller) + .setAutoCancel(true) + .setWhen(timestamp) + .setOngoing(true) + .setShowWhen(false) + .setSound(ringtoneUri, AudioManager.STREAM_RING) + .setTimeoutAfter(ElementCallConfig.RINGING_CALL_DURATION_SECONDS.seconds.inWholeMilliseconds) + .setContentIntent(answerIntent) + .setDeleteIntent(declineIntent) + .setFullScreenIntent(fullScreenIntent, true) + .build() + .apply { + flags = flags.or(Notification.FLAG_INSISTENT) + } + } +} 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 new file mode 100644 index 0000000000..27b46db5fe --- /dev/null +++ b/features/call/impl/src/main/kotlin/io/element/android/features/call/impl/receivers/DeclineCallBroadcastReceiver.kt @@ -0,0 +1,37 @@ +/* + * Copyright (c) 2024 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. + */ + +package io.element.android.features.call.impl.receivers + +import android.content.BroadcastReceiver +import android.content.Context +import android.content.Intent +import io.element.android.features.call.impl.di.CallBindings +import io.element.android.features.call.impl.utils.ActiveCallManager +import io.element.android.libraries.architecture.bindings +import javax.inject.Inject + +/** + * Broadcast receiver to decline the incoming call. + */ +class DeclineCallBroadcastReceiver : BroadcastReceiver() { + @Inject + lateinit var activeCallManager: ActiveCallManager + override fun onReceive(context: Context, intent: Intent?) { + context.bindings().inject(this) + activeCallManager.hungUpCall() + } +} diff --git a/features/call/src/main/kotlin/io/element/android/features/call/CallForegroundService.kt b/features/call/impl/src/main/kotlin/io/element/android/features/call/impl/services/CallForegroundService.kt similarity index 69% rename from features/call/src/main/kotlin/io/element/android/features/call/CallForegroundService.kt rename to features/call/impl/src/main/kotlin/io/element/android/features/call/impl/services/CallForegroundService.kt index 10168eba2f..29f7f92139 100644 --- a/features/call/src/main/kotlin/io/element/android/features/call/CallForegroundService.kt +++ b/features/call/impl/src/main/kotlin/io/element/android/features/call/impl/services/CallForegroundService.kt @@ -1,5 +1,5 @@ /* - * Copyright (c) 2023 New Vector Ltd + * Copyright (c) 2024 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. @@ -14,30 +14,36 @@ * limitations under the License. */ -package io.element.android.features.call +package io.element.android.features.call.impl.services import android.app.Service import android.content.Context import android.content.Intent +import android.content.pm.ServiceInfo import android.os.Build import android.os.IBinder import androidx.core.app.NotificationChannelCompat import androidx.core.app.NotificationCompat import androidx.core.app.NotificationManagerCompat import androidx.core.app.PendingIntentCompat +import androidx.core.app.ServiceCompat +import androidx.core.content.ContextCompat import androidx.core.graphics.drawable.IconCompat -import io.element.android.features.call.ui.ElementCallActivity +import io.element.android.features.call.impl.R +import io.element.android.features.call.impl.ui.ElementCallActivity import io.element.android.libraries.designsystem.utils.CommonDrawables +import io.element.android.libraries.push.api.notifications.ForegroundServiceType +import io.element.android.libraries.push.api.notifications.NotificationIdProvider +import timber.log.Timber +/** + * A foreground service that shows a notification for an ongoing call while the UI is in background. + */ class CallForegroundService : Service() { companion object { fun start(context: Context) { val intent = Intent(context, CallForegroundService::class.java) - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { - context.startForegroundService(intent) - } else { - context.startService(intent) - } + ContextCompat.startForegroundService(context, intent) } fun stop(context: Context) { @@ -69,7 +75,17 @@ class CallForegroundService : Service() { .setContentText(getString(R.string.call_foreground_service_message_android)) .setContentIntent(pendingIntent) .build() - startForeground(1, notification) + val notificationId = NotificationIdProvider.getForegroundServiceNotificationId(ForegroundServiceType.ONGOING_CALL) + val serviceType = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) { + ServiceInfo.FOREGROUND_SERVICE_TYPE_PHONE_CALL + } else { + 0 + } + runCatching { + ServiceCompat.startForeground(this, notificationId, notification, serviceType) + }.onFailure { + Timber.e(it, "Failed to start ongoing call foreground service") + } } override fun onDestroy() { diff --git a/features/call/src/main/kotlin/io/element/android/features/call/ui/CallScreenEvents.kt b/features/call/impl/src/main/kotlin/io/element/android/features/call/impl/ui/CallScreenEvents.kt similarity index 80% rename from features/call/src/main/kotlin/io/element/android/features/call/ui/CallScreenEvents.kt rename to features/call/impl/src/main/kotlin/io/element/android/features/call/impl/ui/CallScreenEvents.kt index d16baacf3e..a4d60549c9 100644 --- a/features/call/src/main/kotlin/io/element/android/features/call/ui/CallScreenEvents.kt +++ b/features/call/impl/src/main/kotlin/io/element/android/features/call/impl/ui/CallScreenEvents.kt @@ -14,11 +14,12 @@ * limitations under the License. */ -package io.element.android.features.call.ui +package io.element.android.features.call.impl.ui -import io.element.android.features.call.utils.WidgetMessageInterceptor +import io.element.android.features.call.impl.utils.WidgetMessageInterceptor sealed interface CallScreenEvents { data object Hangup : CallScreenEvents - data class SetupMessageChannels(val widgetMessageInterceptor: WidgetMessageInterceptor) : CallScreenEvents + data class SetupMessageChannels(val widgetMessageInterceptor: WidgetMessageInterceptor) : + CallScreenEvents } diff --git a/features/call/src/main/kotlin/io/element/android/features/call/ui/CallScreenPresenter.kt b/features/call/impl/src/main/kotlin/io/element/android/features/call/impl/ui/CallScreenPresenter.kt similarity index 91% rename from features/call/src/main/kotlin/io/element/android/features/call/ui/CallScreenPresenter.kt rename to features/call/impl/src/main/kotlin/io/element/android/features/call/impl/ui/CallScreenPresenter.kt index 49f6352212..a2e8359284 100644 --- a/features/call/src/main/kotlin/io/element/android/features/call/ui/CallScreenPresenter.kt +++ b/features/call/impl/src/main/kotlin/io/element/android/features/call/impl/ui/CallScreenPresenter.kt @@ -14,7 +14,7 @@ * limitations under the License. */ -package io.element.android.features.call.ui +package io.element.android.features.call.impl.ui import androidx.compose.runtime.Composable import androidx.compose.runtime.DisposableEffect @@ -30,11 +30,12 @@ import dagger.assisted.Assisted import dagger.assisted.AssistedFactory import dagger.assisted.AssistedInject import im.vector.app.features.analytics.plan.MobileScreen -import io.element.android.features.call.CallType -import io.element.android.features.call.data.WidgetMessage -import io.element.android.features.call.utils.CallWidgetProvider -import io.element.android.features.call.utils.WidgetMessageInterceptor -import io.element.android.features.call.utils.WidgetMessageSerializer +import io.element.android.features.call.api.CallType +import io.element.android.features.call.impl.data.WidgetMessage +import io.element.android.features.call.impl.utils.ActiveCallManager +import io.element.android.features.call.impl.utils.CallWidgetProvider +import io.element.android.features.call.impl.utils.WidgetMessageInterceptor +import io.element.android.features.call.impl.utils.WidgetMessageSerializer import io.element.android.libraries.architecture.AsyncData import io.element.android.libraries.architecture.Presenter import io.element.android.libraries.architecture.runCatchingUpdatingState @@ -65,6 +66,7 @@ class CallScreenPresenter @AssistedInject constructor( private val matrixClientsProvider: MatrixClientProvider, private val screenTracker: ScreenTracker, private val appCoroutineScope: CoroutineScope, + private val activeCallManager: ActiveCallManager, ) : Presenter { @AssistedFactory interface Factory { @@ -84,6 +86,10 @@ class CallScreenPresenter @AssistedInject constructor( LaunchedEffect(Unit) { loadUrl(callType, urlState, callWidgetDriver) + + if (callType is CallType.RoomCall) { + activeCallManager.joinedCall(callType.sessionId, callType.roomId) + } } when (callType) { @@ -134,6 +140,14 @@ class CallScreenPresenter @AssistedInject constructor( } } + DisposableEffect(Unit) { + onDispose { + if (callType is CallType.RoomCall) { + activeCallManager.hungUpCall() + } + } + } + fun handleEvents(event: CallScreenEvents) { when (event) { is CallScreenEvents.Hangup -> { @@ -193,7 +207,6 @@ class CallScreenPresenter @AssistedInject constructor( val client = (callType as? CallType.RoomCall)?.sessionId?.let { matrixClientsProvider.getOrNull(it) } ?: return@DisposableEffect onDispose { } - coroutineScope.launch { client.syncService().syncState .onEach { state -> diff --git a/features/call/src/main/kotlin/io/element/android/features/call/ui/CallScreenState.kt b/features/call/impl/src/main/kotlin/io/element/android/features/call/impl/ui/CallScreenState.kt similarity index 94% rename from features/call/src/main/kotlin/io/element/android/features/call/ui/CallScreenState.kt rename to features/call/impl/src/main/kotlin/io/element/android/features/call/impl/ui/CallScreenState.kt index 76926bfb9f..9b0931d5fd 100644 --- a/features/call/src/main/kotlin/io/element/android/features/call/ui/CallScreenState.kt +++ b/features/call/impl/src/main/kotlin/io/element/android/features/call/impl/ui/CallScreenState.kt @@ -14,7 +14,7 @@ * limitations under the License. */ -package io.element.android.features.call.ui +package io.element.android.features.call.impl.ui import io.element.android.libraries.architecture.AsyncData diff --git a/features/call/src/main/kotlin/io/element/android/features/call/ui/CallScreenView.kt b/features/call/impl/src/main/kotlin/io/element/android/features/call/impl/ui/CallScreenView.kt similarity index 96% rename from features/call/src/main/kotlin/io/element/android/features/call/ui/CallScreenView.kt rename to features/call/impl/src/main/kotlin/io/element/android/features/call/impl/ui/CallScreenView.kt index cc62ce03e1..ebf006d102 100644 --- a/features/call/src/main/kotlin/io/element/android/features/call/ui/CallScreenView.kt +++ b/features/call/impl/src/main/kotlin/io/element/android/features/call/impl/ui/CallScreenView.kt @@ -14,7 +14,7 @@ * limitations under the License. */ -package io.element.android.features.call.ui +package io.element.android.features.call.impl.ui import android.annotation.SuppressLint import android.view.ViewGroup @@ -34,8 +34,8 @@ import androidx.compose.ui.platform.LocalInspectionMode import androidx.compose.ui.res.stringResource import androidx.compose.ui.viewinterop.AndroidView import io.element.android.compound.tokens.generated.CompoundIcons -import io.element.android.features.call.R -import io.element.android.features.call.utils.WebViewWidgetMessageInterceptor +import io.element.android.features.call.impl.R +import io.element.android.features.call.impl.utils.WebViewWidgetMessageInterceptor import io.element.android.libraries.architecture.AsyncData import io.element.android.libraries.designsystem.components.button.BackButton import io.element.android.libraries.designsystem.preview.ElementPreview diff --git a/features/call/src/main/kotlin/io/element/android/features/call/ui/ElementCallActivity.kt b/features/call/impl/src/main/kotlin/io/element/android/features/call/impl/ui/ElementCallActivity.kt similarity index 86% rename from features/call/src/main/kotlin/io/element/android/features/call/ui/ElementCallActivity.kt rename to features/call/impl/src/main/kotlin/io/element/android/features/call/impl/ui/ElementCallActivity.kt index f810dbb496..8d6324c86a 100644 --- a/features/call/src/main/kotlin/io/element/android/features/call/ui/ElementCallActivity.kt +++ b/features/call/impl/src/main/kotlin/io/element/android/features/call/impl/ui/ElementCallActivity.kt @@ -14,12 +14,10 @@ * limitations under the License. */ -package io.element.android.features.call.ui +package io.element.android.features.call.impl.ui import android.Manifest -import android.content.Context import android.content.Intent -import android.content.Intent.FLAG_ACTIVITY_NEW_TASK import android.content.res.Configuration import android.media.AudioAttributes import android.media.AudioFocusRequest @@ -41,30 +39,16 @@ import io.element.android.compound.theme.ElementTheme import io.element.android.compound.theme.Theme import io.element.android.compound.theme.isDark import io.element.android.compound.theme.mapToTheme -import io.element.android.features.call.CallForegroundService -import io.element.android.features.call.CallType -import io.element.android.features.call.di.CallBindings -import io.element.android.features.call.utils.CallIntentDataParser +import io.element.android.features.call.api.CallType +import io.element.android.features.call.impl.DefaultElementCallEntryPoint +import io.element.android.features.call.impl.di.CallBindings +import io.element.android.features.call.impl.services.CallForegroundService +import io.element.android.features.call.impl.utils.CallIntentDataParser import io.element.android.features.preferences.api.store.AppPreferencesStore import io.element.android.libraries.architecture.bindings import javax.inject.Inject class ElementCallActivity : AppCompatActivity(), CallScreenNavigator { - companion object { - private const val EXTRA_CALL_WIDGET_SETTINGS = "EXTRA_CALL_WIDGET_SETTINGS" - - fun start( - context: Context, - callInputs: CallType, - ) { - val intent = Intent(context, ElementCallActivity::class.java).apply { - putExtra(EXTRA_CALL_WIDGET_SETTINGS, callInputs) - addFlags(FLAG_ACTIVITY_NEW_TASK) - } - context.startActivity(intent) - } - } - @Inject lateinit var callIntentDataParser: CallIntentDataParser @Inject lateinit var presenterFactory: CallScreenPresenter.Factory @Inject lateinit var appPreferencesStore: AppPreferencesStore @@ -88,7 +72,13 @@ class ElementCallActivity : AppCompatActivity(), CallScreenNavigator { applicationContext.bindings().inject(this) - window.addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON) + @Suppress("DEPRECATION") + window.addFlags( + WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON or + WindowManager.LayoutParams.FLAG_ALLOW_LOCK_WHILE_SCREEN_ON or + WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED or + WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON + ) setCallType(intent) @@ -157,16 +147,16 @@ class ElementCallActivity : AppCompatActivity(), CallScreenNavigator { } private fun setCallType(intent: Intent?) { - val inputs = intent?.let { - IntentCompat.getParcelableExtra(it, EXTRA_CALL_WIDGET_SETTINGS, CallType::class.java) + val callType = intent?.let { + IntentCompat.getParcelableExtra(it, DefaultElementCallEntryPoint.EXTRA_CALL_TYPE, CallType::class.java) } val intentUrl = intent?.dataString?.let(::parseUrl) when { // Re-opened the activity but we have no url to load or a cached one, finish the activity - intent?.dataString == null && inputs == null && webViewTarget.value == null -> finish() - inputs != null -> { - webViewTarget.value = inputs - presenter = presenterFactory.create(inputs, this) + intent?.dataString == null && callType == null && webViewTarget.value == null -> finish() + callType != null -> { + webViewTarget.value = callType + presenter = presenterFactory.create(callType, this) } intentUrl != null -> { val fallbackInputs = CallType.ExternalUrl(intentUrl) 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 new file mode 100644 index 0000000000..cc39dd124f --- /dev/null +++ b/features/call/impl/src/main/kotlin/io/element/android/features/call/impl/ui/IncomingCallActivity.kt @@ -0,0 +1,96 @@ +/* + * Copyright (c) 2024 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. + */ + +package io.element.android.features.call.impl.ui + +import android.os.Bundle +import android.view.WindowManager +import androidx.activity.compose.setContent +import androidx.appcompat.app.AppCompatActivity +import androidx.core.content.IntentCompat +import androidx.lifecycle.lifecycleScope +import io.element.android.features.call.api.CallType +import io.element.android.features.call.api.ElementCallEntryPoint +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.features.call.impl.utils.CallState +import io.element.android.libraries.architecture.bindings +import kotlinx.coroutines.flow.filter +import kotlinx.coroutines.flow.launchIn +import kotlinx.coroutines.flow.onEach +import javax.inject.Inject + +/** + * Activity that's displayed as a full screen intent when an incoming call is received. + */ +class IncomingCallActivity : AppCompatActivity() { + companion object { + /** + * Extra key for the notification data. + */ + const val EXTRA_NOTIFICATION_DATA = "EXTRA_NOTIFICATION_DATA" + } + + @Inject + lateinit var elementCallEntryPoint: ElementCallEntryPoint + + @Inject + lateinit var activeCallManager: ActiveCallManager + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + + applicationContext.bindings().inject(this) + + // Set flags so it can be displayed in the lock screen + @Suppress("DEPRECATION") + window.addFlags( + WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON or + WindowManager.LayoutParams.FLAG_ALLOW_LOCK_WHILE_SCREEN_ON or + WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED or + WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON + ) + + val notificationData = intent?.let { IntentCompat.getParcelableExtra(it, EXTRA_NOTIFICATION_DATA, CallNotificationData::class.java) } + if (notificationData != null) { + setContent { + IncomingCallScreen( + notificationData = notificationData, + onAnswer = ::onAnswer, + onCancel = ::onCancel, + ) + } + } else { + // No data, finish the activity + finish() + return + } + + activeCallManager.activeCall + .filter { it?.callState !is CallState.Ringing } + .onEach { finish() } + .launchIn(lifecycleScope) + } + + private fun onAnswer(notificationData: CallNotificationData) { + elementCallEntryPoint.startCall(CallType.RoomCall(notificationData.sessionId, notificationData.roomId)) + } + + private fun onCancel() { + activeCallManager.hungUpCall() + } +} diff --git a/features/call/impl/src/main/kotlin/io/element/android/features/call/impl/ui/IncomingCallScreen.kt b/features/call/impl/src/main/kotlin/io/element/android/features/call/impl/ui/IncomingCallScreen.kt new file mode 100644 index 0000000000..80dc2353ca --- /dev/null +++ b/features/call/impl/src/main/kotlin/io/element/android/features/call/impl/ui/IncomingCallScreen.kt @@ -0,0 +1,192 @@ +/* + * Copyright (c) 2024 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. + */ + +package io.element.android.features.call.impl.ui + +import androidx.compose.foundation.border +import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.Spacer +import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.height +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.size +import androidx.compose.foundation.layout.width +import androidx.compose.foundation.shape.CircleShape +import androidx.compose.material3.FilledIconButton +import androidx.compose.material3.IconButtonDefaults +import androidx.compose.runtime.Composable +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.graphics.Color +import androidx.compose.ui.graphics.vector.ImageVector +import androidx.compose.ui.res.stringResource +import androidx.compose.ui.text.style.TextAlign +import androidx.compose.ui.text.style.TextOverflow +import androidx.compose.ui.unit.Dp +import androidx.compose.ui.unit.dp +import io.element.android.compound.theme.ElementTheme +import io.element.android.compound.tokens.generated.CompoundIcons +import io.element.android.features.call.impl.R +import io.element.android.features.call.impl.notifications.CallNotificationData +import io.element.android.libraries.designsystem.background.OnboardingBackground +import io.element.android.libraries.designsystem.components.avatar.Avatar +import io.element.android.libraries.designsystem.components.avatar.AvatarData +import io.element.android.libraries.designsystem.components.avatar.AvatarSize +import io.element.android.libraries.designsystem.preview.ElementPreview +import io.element.android.libraries.designsystem.preview.PreviewsDayNight +import io.element.android.libraries.designsystem.theme.components.Icon +import io.element.android.libraries.designsystem.theme.components.Text +import io.element.android.libraries.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.UserId +import io.element.android.libraries.ui.strings.CommonStrings + +@Composable +internal fun IncomingCallScreen( + notificationData: CallNotificationData, + onAnswer: (CallNotificationData) -> Unit, + onCancel: () -> Unit, +) { + ElementTheme { + OnboardingBackground() + Column( + modifier = Modifier.fillMaxSize(), + horizontalAlignment = Alignment.CenterHorizontally, + verticalArrangement = Arrangement.Bottom + ) { + Column( + modifier = Modifier + .fillMaxWidth() + .padding(start = 20.dp, end = 20.dp, top = 124.dp) + .weight(1f), + horizontalAlignment = Alignment.CenterHorizontally + ) { + Avatar( + avatarData = AvatarData( + id = notificationData.senderId.value, + name = notificationData.senderName, + url = notificationData.avatarUrl, + size = AvatarSize.IncomingCall, + ) + ) + Spacer(modifier = Modifier.height(24.dp)) + Text( + text = notificationData.senderName ?: notificationData.senderId.value, + style = ElementTheme.typography.fontHeadingMdBold, + textAlign = TextAlign.Center, + ) + Spacer(modifier = Modifier.height(8.dp)) + Text( + text = stringResource(R.string.screen_incoming_call_subtitle_android), + style = ElementTheme.typography.fontBodyLgRegular, + color = ElementTheme.colors.textSecondary, + textAlign = TextAlign.Center, + ) + } + Row( + modifier = Modifier + .fillMaxWidth() + .padding(start = 24.dp, end = 24.dp, bottom = 64.dp), + horizontalArrangement = Arrangement.SpaceBetween, + verticalAlignment = Alignment.CenterVertically + ) { + ActionButton( + size = 64.dp, + onClick = { onAnswer(notificationData) }, + icon = CompoundIcons.VoiceCall(), + title = stringResource(CommonStrings.action_accept), + backgroundColor = ElementTheme.colors.iconSuccessPrimary, + borderColor = ElementTheme.colors.borderSuccessSubtle + ) + + ActionButton( + size = 64.dp, + onClick = onCancel, + icon = CompoundIcons.EndCall(), + title = stringResource(CommonStrings.action_reject), + backgroundColor = ElementTheme.colors.iconCriticalPrimary, + borderColor = ElementTheme.colors.borderCriticalSubtle + ) + } + } + } +} + +@Composable +private fun ActionButton( + size: Dp, + onClick: () -> Unit, + icon: ImageVector, + title: String, + backgroundColor: Color, + borderColor: Color, + contentDescription: String? = title, + borderSize: Dp = 1.33.dp, +) { + Column( + modifier = Modifier.width(120.dp), + horizontalAlignment = Alignment.CenterHorizontally + ) { + FilledIconButton( + modifier = Modifier.size(size + borderSize) + .border(borderSize, borderColor, CircleShape), + onClick = onClick, + colors = IconButtonDefaults.filledIconButtonColors( + containerColor = backgroundColor, + contentColor = Color.White, + ) + ) { + Icon( + modifier = Modifier.size(32.dp), + imageVector = icon, + contentDescription = contentDescription + ) + } + Spacer(modifier = Modifier.height(16.dp)) + Text( + text = title, + style = ElementTheme.typography.fontBodyLgMedium, + color = ElementTheme.colors.textPrimary, + overflow = TextOverflow.Ellipsis, + ) + } +} + +@PreviewsDayNight +@Composable +internal fun IncomingCallScreenPreview() { + ElementPreview { + IncomingCallScreen( + notificationData = CallNotificationData( + sessionId = SessionId("@alice:matrix.org"), + roomId = RoomId("!1234:matrix.org"), + eventId = EventId("\$asdadadsad:matrix.org"), + senderId = UserId("@bob:matrix.org"), + roomName = "A room", + senderName = "Bob", + avatarUrl = null, + notificationChannelId = "incoming_call", + timestamp = 0L, + ), + onAnswer = {}, + onCancel = {}, + ) + } +} 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 new file mode 100644 index 0000000000..b381b3ed27 --- /dev/null +++ b/features/call/impl/src/main/kotlin/io/element/android/features/call/impl/utils/ActiveCallManager.kt @@ -0,0 +1,206 @@ +/* + * Copyright (c) 2024 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. + */ + +package io.element.android.features.call.impl.utils + +import android.annotation.SuppressLint +import androidx.core.app.NotificationManagerCompat +import com.squareup.anvil.annotations.ContributesBinding +import io.element.android.appconfig.ElementCallConfig +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.SingleIn +import io.element.android.libraries.matrix.api.MatrixClientProvider +import io.element.android.libraries.matrix.api.core.RoomId +import io.element.android.libraries.matrix.api.core.SessionId +import io.element.android.libraries.push.api.notifications.ForegroundServiceType +import io.element.android.libraries.push.api.notifications.NotificationIdProvider +import io.element.android.libraries.push.api.notifications.OnMissedCallNotificationHandler +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.Job +import kotlinx.coroutines.delay +import kotlinx.coroutines.flow.MutableStateFlow +import kotlinx.coroutines.flow.StateFlow +import kotlinx.coroutines.launch +import timber.log.Timber +import javax.inject.Inject +import kotlin.time.Duration.Companion.seconds + +/** + * Manages the active call state. + */ +interface ActiveCallManager { + /** + * The active call state flow, which will be updated when the active call changes. + */ + val activeCall: StateFlow + + /** + * 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) + + /** + * Called when the incoming call timed out. It will remove the active call and remove any associated UI, adding a 'missed call' notification. + */ + fun incomingCallTimedOut() + + /** + * Hangs up the active call and removes any associated UI. + */ + fun hungUpCall() + + /** + * Called when the user joins a call. It will remove any existing UI and set the call state as [CallState.InCall]. + * + * @param sessionId The session ID of the user joining the call. + * @param roomId The room ID of the call. + */ + fun joinedCall(sessionId: SessionId, roomId: RoomId) +} + +@SingleIn(AppScope::class) +@ContributesBinding(AppScope::class) +class DefaultActiveCallManager @Inject constructor( + private val coroutineScope: CoroutineScope, + private val matrixClientProvider: MatrixClientProvider, + private val onMissedCallNotificationHandler: OnMissedCallNotificationHandler, + private val ringingCallNotificationCreator: RingingCallNotificationCreator, + private val notificationManagerCompat: NotificationManagerCompat, +) : ActiveCallManager { + private var timedOutCallJob: Job? = null + + override val activeCall = MutableStateFlow(null) + + 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( + sessionId = notificationData.sessionId, + roomId = notificationData.roomId, + callState = CallState.Ringing(notificationData), + ) + + timedOutCallJob = coroutineScope.launch { + showIncomingCallNotification(notificationData) + + // Wait for the call to end + delay(ElementCallConfig.RINGING_CALL_DURATION_SECONDS.seconds) + incomingCallTimedOut() + } + } + + override fun incomingCallTimedOut() { + val previousActiveCall = activeCall.value ?: return + val notificationData = (previousActiveCall.callState as? CallState.Ringing)?.notificationData ?: return + activeCall.value = null + + cancelIncomingCallNotification() + + displayMissedCallNotification(notificationData) + } + + override fun hungUpCall() { + cancelIncomingCallNotification() + timedOutCallJob?.cancel() + activeCall.value = null + } + + override fun joinedCall(sessionId: SessionId, roomId: RoomId) { + cancelIncomingCallNotification() + timedOutCallJob?.cancel() + + activeCall.value = ActiveCall( + sessionId = sessionId, + roomId = roomId, + callState = CallState.InCall, + ) + // Send call notification to the room + coroutineScope.launch { + matrixClientProvider.getOrRestore(sessionId) + .getOrNull() + ?.getRoom(roomId) + ?.sendCallNotificationIfNeeded() + } + } + + @SuppressLint("MissingPermission") + private suspend fun showIncomingCallNotification(notificationData: CallNotificationData) { + val notification = ringingCallNotificationCreator.createNotification( + sessionId = notificationData.sessionId, + roomId = notificationData.roomId, + eventId = notificationData.eventId, + senderId = notificationData.senderId, + roomName = notificationData.roomName, + senderDisplayName = notificationData.senderName ?: notificationData.senderId.value, + roomAvatarUrl = notificationData.avatarUrl, + notificationChannelId = notificationData.notificationChannelId, + timestamp = notificationData.timestamp + ) ?: return + runCatching { + notificationManagerCompat.notify( + NotificationIdProvider.getForegroundServiceNotificationId(ForegroundServiceType.INCOMING_CALL), + notification, + ) + }.onFailure { + Timber.e(it, "Failed to publish notification for incoming call") + } + } + + private fun cancelIncomingCallNotification() { + notificationManagerCompat.cancel(NotificationIdProvider.getForegroundServiceNotificationId(ForegroundServiceType.INCOMING_CALL)) + } + + private fun displayMissedCallNotification(notificationData: CallNotificationData) { + coroutineScope.launch { + onMissedCallNotificationHandler.addMissedCallNotification( + sessionId = notificationData.sessionId, + roomId = notificationData.roomId, + eventId = notificationData.eventId, + ) + } + } +} + +/** + * Represents an active call. + */ +data class ActiveCall( + val sessionId: SessionId, + val roomId: RoomId, + val callState: CallState, +) + +/** + * Represents the state of an active call. + */ +sealed interface CallState { + /** + * The call is in a ringing state. + * @param notificationData The data for the incoming call notification. + */ + data class Ringing(val notificationData: CallNotificationData) : CallState + + /** + * The call is in an in-call state. + */ + data object InCall : CallState +} diff --git a/features/call/src/main/kotlin/io/element/android/features/call/utils/CallIntentDataParser.kt b/features/call/impl/src/main/kotlin/io/element/android/features/call/impl/utils/CallIntentDataParser.kt similarity index 98% rename from features/call/src/main/kotlin/io/element/android/features/call/utils/CallIntentDataParser.kt rename to features/call/impl/src/main/kotlin/io/element/android/features/call/impl/utils/CallIntentDataParser.kt index c9f4532951..fcbd535a37 100644 --- a/features/call/src/main/kotlin/io/element/android/features/call/utils/CallIntentDataParser.kt +++ b/features/call/impl/src/main/kotlin/io/element/android/features/call/impl/utils/CallIntentDataParser.kt @@ -14,7 +14,7 @@ * limitations under the License. */ -package io.element.android.features.call.utils +package io.element.android.features.call.impl.utils import android.net.Uri import javax.inject.Inject diff --git a/features/call/src/main/kotlin/io/element/android/features/call/utils/CallWidgetProvider.kt b/features/call/impl/src/main/kotlin/io/element/android/features/call/impl/utils/CallWidgetProvider.kt similarity index 95% rename from features/call/src/main/kotlin/io/element/android/features/call/utils/CallWidgetProvider.kt rename to features/call/impl/src/main/kotlin/io/element/android/features/call/impl/utils/CallWidgetProvider.kt index b65298854d..670571476c 100644 --- a/features/call/src/main/kotlin/io/element/android/features/call/utils/CallWidgetProvider.kt +++ b/features/call/impl/src/main/kotlin/io/element/android/features/call/impl/utils/CallWidgetProvider.kt @@ -14,7 +14,7 @@ * limitations under the License. */ -package io.element.android.features.call.utils +package io.element.android.features.call.impl.utils import io.element.android.libraries.matrix.api.core.RoomId import io.element.android.libraries.matrix.api.core.SessionId diff --git a/features/call/src/main/kotlin/io/element/android/features/call/utils/DefaultCallWidgetProvider.kt b/features/call/impl/src/main/kotlin/io/element/android/features/call/impl/utils/DefaultCallWidgetProvider.kt similarity index 97% rename from features/call/src/main/kotlin/io/element/android/features/call/utils/DefaultCallWidgetProvider.kt rename to features/call/impl/src/main/kotlin/io/element/android/features/call/impl/utils/DefaultCallWidgetProvider.kt index 7fb6d3cb48..1daa0a8f3d 100644 --- a/features/call/src/main/kotlin/io/element/android/features/call/utils/DefaultCallWidgetProvider.kt +++ b/features/call/impl/src/main/kotlin/io/element/android/features/call/impl/utils/DefaultCallWidgetProvider.kt @@ -14,7 +14,7 @@ * limitations under the License. */ -package io.element.android.features.call.utils +package io.element.android.features.call.impl.utils import com.squareup.anvil.annotations.ContributesBinding import io.element.android.appconfig.ElementCallConfig diff --git a/features/call/impl/src/main/kotlin/io/element/android/features/call/impl/utils/IntentProvider.kt b/features/call/impl/src/main/kotlin/io/element/android/features/call/impl/utils/IntentProvider.kt new file mode 100644 index 0000000000..bc5816220a --- /dev/null +++ b/features/call/impl/src/main/kotlin/io/element/android/features/call/impl/utils/IntentProvider.kt @@ -0,0 +1,42 @@ +/* + * Copyright (c) 2024 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. + */ + +package io.element.android.features.call.impl.utils + +import android.app.PendingIntent +import android.content.Context +import android.content.Intent +import androidx.core.app.PendingIntentCompat +import io.element.android.features.call.api.CallType +import io.element.android.features.call.impl.DefaultElementCallEntryPoint +import io.element.android.features.call.impl.ui.ElementCallActivity + +internal object IntentProvider { + fun createIntent(context: Context, callType: CallType): Intent = Intent(context, ElementCallActivity::class.java).apply { + putExtra(DefaultElementCallEntryPoint.EXTRA_CALL_TYPE, callType) + addFlags(Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_NO_USER_ACTION) + } + + fun getPendingIntent(context: Context, callType: CallType): PendingIntent { + return PendingIntentCompat.getActivity( + context, + DefaultElementCallEntryPoint.REQUEST_CODE, + createIntent(context, callType), + 0, + false + )!! + } +} diff --git a/features/call/src/main/kotlin/io/element/android/features/call/utils/WebViewWidgetMessageInterceptor.kt b/features/call/impl/src/main/kotlin/io/element/android/features/call/impl/utils/WebViewWidgetMessageInterceptor.kt similarity index 97% rename from features/call/src/main/kotlin/io/element/android/features/call/utils/WebViewWidgetMessageInterceptor.kt rename to features/call/impl/src/main/kotlin/io/element/android/features/call/impl/utils/WebViewWidgetMessageInterceptor.kt index c4676ac9dc..5332c75f6c 100644 --- a/features/call/src/main/kotlin/io/element/android/features/call/utils/WebViewWidgetMessageInterceptor.kt +++ b/features/call/impl/src/main/kotlin/io/element/android/features/call/impl/utils/WebViewWidgetMessageInterceptor.kt @@ -14,7 +14,7 @@ * limitations under the License. */ -package io.element.android.features.call.utils +package io.element.android.features.call.impl.utils import android.graphics.Bitmap import android.webkit.JavascriptInterface @@ -22,7 +22,7 @@ import android.webkit.WebView import android.webkit.WebViewClient import androidx.webkit.WebViewCompat import androidx.webkit.WebViewFeature -import io.element.android.features.call.BuildConfig +import io.element.android.features.call.impl.BuildConfig import kotlinx.coroutines.flow.MutableSharedFlow class WebViewWidgetMessageInterceptor( diff --git a/features/call/src/main/kotlin/io/element/android/features/call/utils/WidgetMessageInterceptor.kt b/features/call/impl/src/main/kotlin/io/element/android/features/call/impl/utils/WidgetMessageInterceptor.kt similarity index 93% rename from features/call/src/main/kotlin/io/element/android/features/call/utils/WidgetMessageInterceptor.kt rename to features/call/impl/src/main/kotlin/io/element/android/features/call/impl/utils/WidgetMessageInterceptor.kt index fa5c3bea67..6a6ca5788a 100644 --- a/features/call/src/main/kotlin/io/element/android/features/call/utils/WidgetMessageInterceptor.kt +++ b/features/call/impl/src/main/kotlin/io/element/android/features/call/impl/utils/WidgetMessageInterceptor.kt @@ -14,7 +14,7 @@ * limitations under the License. */ -package io.element.android.features.call.utils +package io.element.android.features.call.impl.utils import kotlinx.coroutines.flow.Flow diff --git a/features/call/src/main/kotlin/io/element/android/features/call/utils/WidgetMessageSerializer.kt b/features/call/impl/src/main/kotlin/io/element/android/features/call/impl/utils/WidgetMessageSerializer.kt similarity index 89% rename from features/call/src/main/kotlin/io/element/android/features/call/utils/WidgetMessageSerializer.kt rename to features/call/impl/src/main/kotlin/io/element/android/features/call/impl/utils/WidgetMessageSerializer.kt index aa7424e9a3..3d97a31ceb 100644 --- a/features/call/src/main/kotlin/io/element/android/features/call/utils/WidgetMessageSerializer.kt +++ b/features/call/impl/src/main/kotlin/io/element/android/features/call/impl/utils/WidgetMessageSerializer.kt @@ -14,9 +14,9 @@ * limitations under the License. */ -package io.element.android.features.call.utils +package io.element.android.features.call.impl.utils -import io.element.android.features.call.data.WidgetMessage +import io.element.android.features.call.impl.data.WidgetMessage import kotlinx.serialization.json.Json object WidgetMessageSerializer { diff --git a/features/call/src/main/res/values-be/translations.xml b/features/call/impl/src/main/res/values-be/translations.xml similarity index 100% rename from features/call/src/main/res/values-be/translations.xml rename to features/call/impl/src/main/res/values-be/translations.xml diff --git a/features/call/src/main/res/values-cs/translations.xml b/features/call/impl/src/main/res/values-cs/translations.xml similarity index 100% rename from features/call/src/main/res/values-cs/translations.xml rename to features/call/impl/src/main/res/values-cs/translations.xml diff --git a/features/call/src/main/res/values-de/translations.xml b/features/call/impl/src/main/res/values-de/translations.xml similarity index 100% rename from features/call/src/main/res/values-de/translations.xml rename to features/call/impl/src/main/res/values-de/translations.xml diff --git a/features/call/src/main/res/values-es/translations.xml b/features/call/impl/src/main/res/values-es/translations.xml similarity index 100% rename from features/call/src/main/res/values-es/translations.xml rename to features/call/impl/src/main/res/values-es/translations.xml diff --git a/features/call/src/main/res/values-fr/translations.xml b/features/call/impl/src/main/res/values-fr/translations.xml similarity index 100% rename from features/call/src/main/res/values-fr/translations.xml rename to features/call/impl/src/main/res/values-fr/translations.xml diff --git a/features/call/src/main/res/values-hu/translations.xml b/features/call/impl/src/main/res/values-hu/translations.xml similarity index 100% rename from features/call/src/main/res/values-hu/translations.xml rename to features/call/impl/src/main/res/values-hu/translations.xml diff --git a/features/call/src/main/res/values-in/translations.xml b/features/call/impl/src/main/res/values-in/translations.xml similarity index 100% rename from features/call/src/main/res/values-in/translations.xml rename to features/call/impl/src/main/res/values-in/translations.xml diff --git a/features/call/src/main/res/values-it/translations.xml b/features/call/impl/src/main/res/values-it/translations.xml similarity index 100% rename from features/call/src/main/res/values-it/translations.xml rename to features/call/impl/src/main/res/values-it/translations.xml diff --git a/features/call/src/main/res/values-ka/translations.xml b/features/call/impl/src/main/res/values-ka/translations.xml similarity index 100% rename from features/call/src/main/res/values-ka/translations.xml rename to features/call/impl/src/main/res/values-ka/translations.xml diff --git a/features/call/src/main/res/values-pt/translations.xml b/features/call/impl/src/main/res/values-pt/translations.xml similarity index 100% rename from features/call/src/main/res/values-pt/translations.xml rename to features/call/impl/src/main/res/values-pt/translations.xml diff --git a/features/call/src/main/res/values-ro/translations.xml b/features/call/impl/src/main/res/values-ro/translations.xml similarity index 100% rename from features/call/src/main/res/values-ro/translations.xml rename to features/call/impl/src/main/res/values-ro/translations.xml diff --git a/features/call/src/main/res/values-ru/translations.xml b/features/call/impl/src/main/res/values-ru/translations.xml similarity index 100% rename from features/call/src/main/res/values-ru/translations.xml rename to features/call/impl/src/main/res/values-ru/translations.xml diff --git a/features/call/src/main/res/values-sk/translations.xml b/features/call/impl/src/main/res/values-sk/translations.xml similarity index 100% rename from features/call/src/main/res/values-sk/translations.xml rename to features/call/impl/src/main/res/values-sk/translations.xml diff --git a/features/call/src/main/res/values-sv/translations.xml b/features/call/impl/src/main/res/values-sv/translations.xml similarity index 100% rename from features/call/src/main/res/values-sv/translations.xml rename to features/call/impl/src/main/res/values-sv/translations.xml diff --git a/features/call/src/main/res/values-uk/translations.xml b/features/call/impl/src/main/res/values-uk/translations.xml similarity index 100% rename from features/call/src/main/res/values-uk/translations.xml rename to features/call/impl/src/main/res/values-uk/translations.xml diff --git a/features/call/src/main/res/values-zh-rTW/translations.xml b/features/call/impl/src/main/res/values-zh-rTW/translations.xml similarity index 100% rename from features/call/src/main/res/values-zh-rTW/translations.xml rename to features/call/impl/src/main/res/values-zh-rTW/translations.xml diff --git a/features/call/src/main/res/values-zh/translations.xml b/features/call/impl/src/main/res/values-zh/translations.xml similarity index 100% rename from features/call/src/main/res/values-zh/translations.xml rename to features/call/impl/src/main/res/values-zh/translations.xml diff --git a/features/call/src/main/res/values/do_not_translate.xml b/features/call/impl/src/main/res/values/do_not_translate.xml similarity index 100% rename from features/call/src/main/res/values/do_not_translate.xml rename to features/call/impl/src/main/res/values/do_not_translate.xml diff --git a/features/call/src/main/res/values/localazy.xml b/features/call/impl/src/main/res/values/localazy.xml similarity index 81% rename from features/call/src/main/res/values/localazy.xml rename to features/call/impl/src/main/res/values/localazy.xml index cfe40526f4..5a386b2416 100644 --- a/features/call/src/main/res/values/localazy.xml +++ b/features/call/impl/src/main/res/values/localazy.xml @@ -3,4 +3,5 @@ "Ongoing call" "Tap to return to the call" "☎️ Call in progress" + "Incoming Element Call" 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 new file mode 100644 index 0000000000..c78b0bbe20 --- /dev/null +++ b/features/call/impl/src/test/kotlin/io/element/android/features/call/DefaultElementCallEntryPointTest.kt @@ -0,0 +1,77 @@ +/* + * Copyright (c) 2024 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. + */ + +package io.element.android.features.call + +import android.content.Intent +import androidx.test.platform.app.InstrumentationRegistry +import com.google.common.truth.Truth.assertThat +import io.element.android.features.call.api.CallType +import io.element.android.features.call.impl.DefaultElementCallEntryPoint +import io.element.android.features.call.impl.notifications.CallNotificationData +import io.element.android.features.call.impl.ui.ElementCallActivity +import io.element.android.features.call.utils.FakeActiveCallManager +import io.element.android.libraries.matrix.test.AN_EVENT_ID +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 org.junit.Test +import org.junit.runner.RunWith +import org.robolectric.RobolectricTestRunner +import org.robolectric.RuntimeEnvironment +import org.robolectric.Shadows.shadowOf + +@RunWith(RobolectricTestRunner::class) +class DefaultElementCallEntryPointTest { + @Test + fun `startCall - starts ElementCallActivity setup with the needed extras`() { + val entryPoint = createEntryPoint() + entryPoint.startCall(CallType.RoomCall(A_SESSION_ID, A_ROOM_ID)) + + val expectedIntent = Intent(InstrumentationRegistry.getInstrumentation().targetContext, ElementCallActivity::class.java) + val intent = shadowOf(RuntimeEnvironment.getApplication()).nextStartedActivity + assertThat(intent.component).isEqualTo(expectedIntent.component) + assertThat(intent.extras?.containsKey("EXTRA_CALL_TYPE")).isTrue() + } + + @Test + fun `handleIncomingCall - registers the incoming call using ActiveCallManager`() { + val registerIncomingCallLambda = lambdaRecorder {} + val activeCallManager = FakeActiveCallManager(registerIncomingCallResult = registerIncomingCallLambda) + val entryPoint = createEntryPoint(activeCallManager = activeCallManager) + + entryPoint.handleIncomingCall( + callType = CallType.RoomCall(A_SESSION_ID, A_ROOM_ID), + eventId = AN_EVENT_ID, + senderId = A_USER_ID_2, + roomName = "roomName", + senderName = "senderName", + avatarUrl = "avatarUrl", + timestamp = 0, + notificationChannelId = "notificationChannelId", + ) + + registerIncomingCallLambda.assertions().isCalledOnce() + } + + private fun createEntryPoint( + activeCallManager: FakeActiveCallManager = FakeActiveCallManager(), + ) = DefaultElementCallEntryPoint( + context = InstrumentationRegistry.getInstrumentation().targetContext, + activeCallManager = activeCallManager, + ) +} diff --git a/features/call/src/test/kotlin/io/element/android/features/call/MapWebkitPermissionsTest.kt b/features/call/impl/src/test/kotlin/io/element/android/features/call/MapWebkitPermissionsTest.kt similarity index 95% rename from features/call/src/test/kotlin/io/element/android/features/call/MapWebkitPermissionsTest.kt rename to features/call/impl/src/test/kotlin/io/element/android/features/call/MapWebkitPermissionsTest.kt index 6a24698efa..359483520a 100644 --- a/features/call/src/test/kotlin/io/element/android/features/call/MapWebkitPermissionsTest.kt +++ b/features/call/impl/src/test/kotlin/io/element/android/features/call/MapWebkitPermissionsTest.kt @@ -19,7 +19,7 @@ package io.element.android.features.call import android.Manifest import android.webkit.PermissionRequest import com.google.common.truth.Truth.assertThat -import io.element.android.features.call.ui.mapWebkitPermissions +import io.element.android.features.call.impl.ui.mapWebkitPermissions import org.junit.Test class MapWebkitPermissionsTest { diff --git a/features/call/impl/src/test/kotlin/io/element/android/features/call/notifications/RingingCallNotificationCreatorTest.kt b/features/call/impl/src/test/kotlin/io/element/android/features/call/notifications/RingingCallNotificationCreatorTest.kt new file mode 100644 index 0000000000..40cdc0522f --- /dev/null +++ b/features/call/impl/src/test/kotlin/io/element/android/features/call/notifications/RingingCallNotificationCreatorTest.kt @@ -0,0 +1,97 @@ +/* + * Copyright (c) 2024 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. + */ + +package io.element.android.features.call.notifications + +import androidx.core.graphics.drawable.IconCompat +import androidx.test.platform.app.InstrumentationRegistry +import coil.ImageLoader +import com.google.common.truth.Truth.assertThat +import io.element.android.features.call.impl.notifications.RingingCallNotificationCreator +import io.element.android.libraries.matrix.test.AN_EVENT_ID +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.libraries.matrix.test.FakeMatrixClient +import io.element.android.libraries.matrix.test.FakeMatrixClientProvider +import io.element.android.libraries.push.test.notifications.FakeImageLoaderHolder +import io.element.android.libraries.push.test.notifications.push.FakeNotificationBitmapLoader +import io.element.android.tests.testutils.lambda.lambdaRecorder +import kotlinx.coroutines.test.runTest +import org.junit.Test +import org.junit.runner.RunWith +import org.robolectric.RobolectricTestRunner + +@RunWith(RobolectricTestRunner::class) +class RingingCallNotificationCreatorTest { + @Test + fun `createNotification - with no associated MatrixClient does nothing`() = runTest { + val notificationCreator = createRingingCallNotificationCreator( + matrixClientProvider = FakeMatrixClientProvider(getClient = { Result.failure(IllegalStateException("No client found")) }) + ) + + val result = notificationCreator.createTestNotification() + + assertThat(result).isNull() + } + + @Test + fun `createNotification - creates a valid notification`() = runTest { + val notificationCreator = createRingingCallNotificationCreator( + matrixClientProvider = FakeMatrixClientProvider(getClient = { Result.success(FakeMatrixClient()) }) + ) + + val result = notificationCreator.createTestNotification() + + assertThat(result).isNotNull() + } + + @Test + fun `createNotification - tries to load the avatar URL`() = runTest { + val getUserIconLambda = lambdaRecorder { _, _ -> null } + val notificationCreator = createRingingCallNotificationCreator( + matrixClientProvider = FakeMatrixClientProvider(getClient = { Result.success(FakeMatrixClient()) }), + notificationBitmapLoader = FakeNotificationBitmapLoader(getUserIconResult = getUserIconLambda) + ) + + notificationCreator.createTestNotification() + + getUserIconLambda.assertions().isCalledOnce() + } + + private suspend fun RingingCallNotificationCreator.createTestNotification() = createNotification( + sessionId = A_SESSION_ID, + roomId = A_ROOM_ID, + eventId = AN_EVENT_ID, + senderId = A_USER_ID_2, + roomName = "Room", + senderDisplayName = "Johnnie Murphy", + roomAvatarUrl = "https://example.com/avatar.jpg", + notificationChannelId = "channelId", + timestamp = 0L, + ) + + private fun createRingingCallNotificationCreator( + matrixClientProvider: FakeMatrixClientProvider = FakeMatrixClientProvider(), + imageLoaderHolder: FakeImageLoaderHolder = FakeImageLoaderHolder(), + notificationBitmapLoader: FakeNotificationBitmapLoader = FakeNotificationBitmapLoader(), + ) = RingingCallNotificationCreator( + context = InstrumentationRegistry.getInstrumentation().targetContext, + matrixClientProvider = matrixClientProvider, + imageLoaderHolder = imageLoaderHolder, + notificationBitmapLoader = notificationBitmapLoader, + ) +} diff --git a/features/call/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 similarity index 96% rename from features/call/src/test/kotlin/io/element/android/features/call/ui/CallScreenPresenterTest.kt rename to features/call/impl/src/test/kotlin/io/element/android/features/call/ui/CallScreenPresenterTest.kt index 30579ad99c..b734a8ff5c 100644 --- a/features/call/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 @@ -21,7 +21,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.MobileScreen -import io.element.android.features.call.CallType +import io.element.android.features.call.api.CallType +import io.element.android.features.call.impl.ui.CallScreenEvents +import io.element.android.features.call.impl.ui.CallScreenNavigator +import io.element.android.features.call.impl.ui.CallScreenPresenter +import io.element.android.features.call.utils.FakeActiveCallManager import io.element.android.features.call.utils.FakeCallWidgetProvider import io.element.android.features.call.utils.FakeWidgetMessageInterceptor import io.element.android.libraries.architecture.AsyncData @@ -254,6 +258,7 @@ class CallScreenPresenterTest { widgetProvider: FakeCallWidgetProvider = FakeCallWidgetProvider(widgetDriver), dispatchers: CoroutineDispatchers = testCoroutineDispatchers(), matrixClientsProvider: FakeMatrixClientProvider = FakeMatrixClientProvider(), + activeCallManager: FakeActiveCallManager = FakeActiveCallManager(), screenTracker: ScreenTracker = FakeScreenTracker(), ): CallScreenPresenter { val userAgentProvider = object : UserAgentProvider { @@ -270,8 +275,9 @@ class CallScreenPresenterTest { clock = clock, dispatchers = dispatchers, matrixClientsProvider = matrixClientsProvider, - screenTracker = screenTracker, appCoroutineScope = this, + activeCallManager = activeCallManager, + screenTracker = screenTracker, ) } } diff --git a/features/call/src/test/kotlin/io/element/android/features/call/ui/FakeCallScreenNavigator.kt b/features/call/impl/src/test/kotlin/io/element/android/features/call/ui/FakeCallScreenNavigator.kt similarity index 92% rename from features/call/src/test/kotlin/io/element/android/features/call/ui/FakeCallScreenNavigator.kt rename to features/call/impl/src/test/kotlin/io/element/android/features/call/ui/FakeCallScreenNavigator.kt index 23e0cf9027..c280a1a61d 100644 --- a/features/call/src/test/kotlin/io/element/android/features/call/ui/FakeCallScreenNavigator.kt +++ b/features/call/impl/src/test/kotlin/io/element/android/features/call/ui/FakeCallScreenNavigator.kt @@ -16,6 +16,8 @@ package io.element.android.features.call.ui +import io.element.android.features.call.impl.ui.CallScreenNavigator + class FakeCallScreenNavigator : CallScreenNavigator { var closeCalled = false private set diff --git a/features/call/src/test/kotlin/io/element/android/features/call/utils/CallIntentDataParserTest.kt b/features/call/impl/src/test/kotlin/io/element/android/features/call/utils/CallIntentDataParserTest.kt similarity index 99% rename from features/call/src/test/kotlin/io/element/android/features/call/utils/CallIntentDataParserTest.kt rename to features/call/impl/src/test/kotlin/io/element/android/features/call/utils/CallIntentDataParserTest.kt index 093b6aab3b..595f5aa41d 100644 --- a/features/call/src/test/kotlin/io/element/android/features/call/utils/CallIntentDataParserTest.kt +++ b/features/call/impl/src/test/kotlin/io/element/android/features/call/utils/CallIntentDataParserTest.kt @@ -17,6 +17,7 @@ package io.element.android.features.call.utils import com.google.common.truth.Truth.assertThat +import io.element.android.features.call.impl.utils.CallIntentDataParser import org.junit.Test import org.junit.runner.RunWith import org.robolectric.RobolectricTestRunner 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 new file mode 100644 index 0000000000..92b727c05f --- /dev/null +++ b/features/call/impl/src/test/kotlin/io/element/android/features/call/utils/DefaultActiveCallManagerTest.kt @@ -0,0 +1,203 @@ +/* + * Copyright (c) 2024 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. + */ + +package io.element.android.features.call.utils + +import androidx.core.app.NotificationManagerCompat +import androidx.test.platform.app.InstrumentationRegistry +import com.google.common.truth.Truth.assertThat +import io.element.android.features.call.impl.notifications.RingingCallNotificationCreator +import io.element.android.features.call.impl.utils.ActiveCall +import io.element.android.features.call.impl.utils.CallState +import io.element.android.features.call.impl.utils.DefaultActiveCallManager +import io.element.android.features.call.test.aCallNotificationData +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.test.AN_EVENT_ID +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_SESSION_ID +import io.element.android.libraries.matrix.test.FakeMatrixClient +import io.element.android.libraries.matrix.test.FakeMatrixClientProvider +import io.element.android.libraries.matrix.test.room.FakeMatrixRoom +import io.element.android.libraries.push.api.notifications.ForegroundServiceType +import io.element.android.libraries.push.api.notifications.NotificationIdProvider +import io.element.android.libraries.push.test.notifications.FakeImageLoaderHolder +import io.element.android.libraries.push.test.notifications.FakeOnMissedCallNotificationHandler +import io.element.android.libraries.push.test.notifications.push.FakeNotificationBitmapLoader +import io.element.android.tests.testutils.lambda.lambdaRecorder +import io.element.android.tests.testutils.lambda.value +import io.mockk.mockk +import io.mockk.verify +import kotlinx.coroutines.ExperimentalCoroutinesApi +import kotlinx.coroutines.test.TestScope +import kotlinx.coroutines.test.advanceTimeBy +import kotlinx.coroutines.test.runCurrent +import kotlinx.coroutines.test.runTest +import org.junit.Test +import org.junit.runner.RunWith +import org.robolectric.RobolectricTestRunner + +@RunWith(RobolectricTestRunner::class) +class DefaultActiveCallManagerTest { + private val notificationId = NotificationIdProvider.getForegroundServiceNotificationId(ForegroundServiceType.INCOMING_CALL) + + @OptIn(ExperimentalCoroutinesApi::class) + @Test + fun `registerIncomingCall - sets the incoming call as active`() = runTest { + val notificationManagerCompat = mockk(relaxed = true) + val manager = createActiveCallManager(notificationManagerCompat = notificationManagerCompat) + + assertThat(manager.activeCall.value).isNull() + + val callNotificationData = aCallNotificationData() + manager.registerIncomingCall(callNotificationData) + + assertThat(manager.activeCall.value).isEqualTo( + ActiveCall( + sessionId = callNotificationData.sessionId, + roomId = callNotificationData.roomId, + callState = CallState.Ringing(callNotificationData) + ) + ) + + runCurrent() + + verify { notificationManagerCompat.notify(notificationId, any()) } + } + + @OptIn(ExperimentalCoroutinesApi::class) + @Test + fun `registerIncomingCall - when there is an already active call adds missed call notification`() = runTest { + val addMissedCallNotificationLambda = lambdaRecorder { _, _, _ -> } + val onMissedCallNotificationHandler = FakeOnMissedCallNotificationHandler(addMissedCallNotificationLambda = addMissedCallNotificationLambda) + val manager = createActiveCallManager( + onMissedCallNotificationHandler = onMissedCallNotificationHandler, + ) + + // Register existing call + val callNotificationData = aCallNotificationData() + manager.registerIncomingCall(callNotificationData) + val activeCall = manager.activeCall.value + + // Now add a new call + manager.registerIncomingCall(aCallNotificationData(roomId = A_ROOM_ID_2)) + + assertThat(manager.activeCall.value).isEqualTo(activeCall) + assertThat(manager.activeCall.value?.roomId).isNotEqualTo(A_ROOM_ID_2) + + advanceTimeBy(1) + + addMissedCallNotificationLambda.assertions() + .isCalledOnce() + .with(value(A_SESSION_ID), value(A_ROOM_ID_2), value(AN_EVENT_ID)) + } + + @Test + fun `incomingCallTimedOut - when there isn't an active call does nothing`() = runTest { + val addMissedCallNotificationLambda = lambdaRecorder { _, _, _ -> } + val manager = createActiveCallManager( + onMissedCallNotificationHandler = FakeOnMissedCallNotificationHandler(addMissedCallNotificationLambda = addMissedCallNotificationLambda) + ) + + manager.incomingCallTimedOut() + + addMissedCallNotificationLambda.assertions().isNeverCalled() + } + + @OptIn(ExperimentalCoroutinesApi::class) + @Test + fun `incomingCallTimedOut - when there is an active call removes it and adds a missed call notification`() = runTest { + val notificationManagerCompat = mockk(relaxed = true) + val addMissedCallNotificationLambda = lambdaRecorder { _, _, _ -> } + val manager = createActiveCallManager( + onMissedCallNotificationHandler = FakeOnMissedCallNotificationHandler(addMissedCallNotificationLambda = addMissedCallNotificationLambda), + notificationManagerCompat = notificationManagerCompat, + ) + + manager.registerIncomingCall(aCallNotificationData()) + assertThat(manager.activeCall.value).isNotNull() + + manager.incomingCallTimedOut() + advanceTimeBy(1) + + assertThat(manager.activeCall.value).isNull() + addMissedCallNotificationLambda.assertions().isCalledOnce() + verify { notificationManagerCompat.cancel(notificationId) } + } + + @Test + fun `hungUpCall - removes existing call`() = runTest { + val notificationManagerCompat = mockk(relaxed = true) + val manager = createActiveCallManager(notificationManagerCompat = notificationManagerCompat) + + manager.registerIncomingCall(aCallNotificationData()) + assertThat(manager.activeCall.value).isNotNull() + + manager.hungUpCall() + assertThat(manager.activeCall.value).isNull() + + verify { notificationManagerCompat.cancel(notificationId) } + } + + @OptIn(ExperimentalCoroutinesApi::class) + @Test + fun `joinedCall - register an ongoing call and tries sending the call notify event`() = runTest { + val notificationManagerCompat = mockk(relaxed = true) + val sendCallNotifyLambda = lambdaRecorder> { Result.success(Unit) } + val room = FakeMatrixRoom(sendCallNotificationIfNeededResult = sendCallNotifyLambda) + val client = FakeMatrixClient().apply { + givenGetRoomResult(A_ROOM_ID, room) + } + val manager = createActiveCallManager( + matrixClientProvider = FakeMatrixClientProvider(getClient = { Result.success(client) }), + notificationManagerCompat = notificationManagerCompat, + ) + assertThat(manager.activeCall.value).isNull() + + manager.joinedCall(A_SESSION_ID, A_ROOM_ID) + assertThat(manager.activeCall.value).isEqualTo( + ActiveCall( + sessionId = A_SESSION_ID, + roomId = A_ROOM_ID, + callState = CallState.InCall, + ) + ) + + runCurrent() + + sendCallNotifyLambda.assertions().isCalledOnce() + verify { notificationManagerCompat.cancel(notificationId) } + } + + private fun TestScope.createActiveCallManager( + matrixClientProvider: FakeMatrixClientProvider = FakeMatrixClientProvider(), + onMissedCallNotificationHandler: FakeOnMissedCallNotificationHandler = FakeOnMissedCallNotificationHandler(), + notificationManagerCompat: NotificationManagerCompat = mockk(relaxed = true), + ) = DefaultActiveCallManager( + coroutineScope = this, + matrixClientProvider = matrixClientProvider, + onMissedCallNotificationHandler = onMissedCallNotificationHandler, + ringingCallNotificationCreator = RingingCallNotificationCreator( + context = InstrumentationRegistry.getInstrumentation().targetContext, + matrixClientProvider = matrixClientProvider, + imageLoaderHolder = FakeImageLoaderHolder(), + notificationBitmapLoader = FakeNotificationBitmapLoader(), + ), + notificationManagerCompat = notificationManagerCompat, + ) +} diff --git a/features/call/src/test/kotlin/io/element/android/features/call/utils/DefaultCallWidgetProviderTest.kt b/features/call/impl/src/test/kotlin/io/element/android/features/call/utils/DefaultCallWidgetProviderTest.kt similarity index 98% rename from features/call/src/test/kotlin/io/element/android/features/call/utils/DefaultCallWidgetProviderTest.kt rename to features/call/impl/src/test/kotlin/io/element/android/features/call/utils/DefaultCallWidgetProviderTest.kt index 0b7e2ce953..a41b5f0296 100644 --- a/features/call/src/test/kotlin/io/element/android/features/call/utils/DefaultCallWidgetProviderTest.kt +++ b/features/call/impl/src/test/kotlin/io/element/android/features/call/utils/DefaultCallWidgetProviderTest.kt @@ -17,6 +17,7 @@ package io.element.android.features.call.utils import com.google.common.truth.Truth.assertThat +import io.element.android.features.call.impl.utils.DefaultCallWidgetProvider import io.element.android.features.preferences.api.store.AppPreferencesStore import io.element.android.libraries.matrix.api.MatrixClientProvider import io.element.android.libraries.matrix.api.widget.CallWidgetSettingsProvider 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 new file mode 100644 index 0000000000..763d7bf8d5 --- /dev/null +++ b/features/call/impl/src/test/kotlin/io/element/android/features/call/utils/FakeActiveCallManager.kt @@ -0,0 +1,53 @@ +/* + * Copyright (c) 2024 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. + */ + +package io.element.android.features.call.utils + +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.libraries.matrix.api.core.RoomId +import io.element.android.libraries.matrix.api.core.SessionId +import kotlinx.coroutines.flow.MutableStateFlow + +class FakeActiveCallManager( + var registerIncomingCallResult: (CallNotificationData) -> Unit = {}, + var incomingCallTimedOutResult: () -> Unit = {}, + var hungUpCallResult: () -> Unit = {}, + var joinedCallResult: (SessionId, RoomId) -> Unit = { _, _ -> }, +) : ActiveCallManager { + override val activeCall = MutableStateFlow(null) + + override fun registerIncomingCall(notificationData: CallNotificationData) { + registerIncomingCallResult(notificationData) + } + + override fun incomingCallTimedOut() { + incomingCallTimedOutResult() + } + + override fun hungUpCall() { + hungUpCallResult() + } + + override fun joinedCall(sessionId: SessionId, roomId: RoomId) { + joinedCallResult(sessionId, roomId) + } + + fun setActiveCall(value: ActiveCall?) { + this.activeCall.value = value + } +} diff --git a/features/call/src/test/kotlin/io/element/android/features/call/utils/FakeCallWidgetProvider.kt b/features/call/impl/src/test/kotlin/io/element/android/features/call/utils/FakeCallWidgetProvider.kt similarity index 95% rename from features/call/src/test/kotlin/io/element/android/features/call/utils/FakeCallWidgetProvider.kt rename to features/call/impl/src/test/kotlin/io/element/android/features/call/utils/FakeCallWidgetProvider.kt index c9e9ebb2ae..b957122a3f 100644 --- a/features/call/src/test/kotlin/io/element/android/features/call/utils/FakeCallWidgetProvider.kt +++ b/features/call/impl/src/test/kotlin/io/element/android/features/call/utils/FakeCallWidgetProvider.kt @@ -16,6 +16,7 @@ package io.element.android.features.call.utils +import io.element.android.features.call.impl.utils.CallWidgetProvider 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.widget.MatrixWidgetDriver diff --git a/features/call/src/test/kotlin/io/element/android/features/call/utils/FakeWidgetMessageInterceptor.kt b/features/call/impl/src/test/kotlin/io/element/android/features/call/utils/FakeWidgetMessageInterceptor.kt similarity index 93% rename from features/call/src/test/kotlin/io/element/android/features/call/utils/FakeWidgetMessageInterceptor.kt rename to features/call/impl/src/test/kotlin/io/element/android/features/call/utils/FakeWidgetMessageInterceptor.kt index 5a312250b0..0ef5046028 100644 --- a/features/call/src/test/kotlin/io/element/android/features/call/utils/FakeWidgetMessageInterceptor.kt +++ b/features/call/impl/src/test/kotlin/io/element/android/features/call/utils/FakeWidgetMessageInterceptor.kt @@ -16,6 +16,7 @@ package io.element.android.features.call.utils +import io.element.android.features.call.impl.utils.WidgetMessageInterceptor import kotlinx.coroutines.flow.MutableSharedFlow class FakeWidgetMessageInterceptor : WidgetMessageInterceptor { diff --git a/features/call/src/main/res/values-et/translations.xml b/features/call/src/main/res/values-et/translations.xml new file mode 100644 index 0000000000..59ae957be1 --- /dev/null +++ b/features/call/src/main/res/values-et/translations.xml @@ -0,0 +1,6 @@ + + + "Käimasolev kõne" + "Kõne juurde naasmiseks klõpsa" + "☎️ Kõne on pooleli" + diff --git a/features/call/test/build.gradle.kts b/features/call/test/build.gradle.kts new file mode 100644 index 0000000000..729811f434 --- /dev/null +++ b/features/call/test/build.gradle.kts @@ -0,0 +1,34 @@ +/* + * Copyright (c) 2024 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-compose-library") + id("kotlin-parcelize") +} + +android { + namespace = "io.element.android.features.call.test" +} + +dependencies { + implementation(projects.libraries.architecture) + implementation(projects.libraries.core) + + api(projects.features.call.api) + implementation(projects.features.call.impl) + implementation(projects.libraries.matrix.api) + implementation(projects.libraries.matrix.test) +} diff --git a/features/call/test/src/main/kotlin/io/element/android/features/call/test/CallNotificationData.kt b/features/call/test/src/main/kotlin/io/element/android/features/call/test/CallNotificationData.kt new file mode 100644 index 0000000000..c69e4b9e6c --- /dev/null +++ b/features/call/test/src/main/kotlin/io/element/android/features/call/test/CallNotificationData.kt @@ -0,0 +1,52 @@ +/* + * Copyright (c) 2024 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. + */ + +package io.element.android.features.call.test + +import io.element.android.features.call.impl.notifications.CallNotificationData +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.UserId +import io.element.android.libraries.matrix.test.AN_AVATAR_URL +import io.element.android.libraries.matrix.test.AN_EVENT_ID +import io.element.android.libraries.matrix.test.A_ROOM_ID +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_2 +import io.element.android.libraries.matrix.test.A_USER_NAME + +fun aCallNotificationData( + sessionId: SessionId = A_SESSION_ID, + roomId: RoomId = A_ROOM_ID, + eventId: EventId = AN_EVENT_ID, + senderId: UserId = A_USER_ID_2, + roomName: String = A_ROOM_NAME, + senderName: String? = A_USER_NAME, + avatarUrl: String? = AN_AVATAR_URL, + notificationChannelId: String = "channel_id", + timestamp: Long = 0L, +): CallNotificationData = CallNotificationData( + sessionId = sessionId, + roomId = roomId, + eventId = eventId, + senderId = senderId, + roomName = roomName, + senderName = senderName, + avatarUrl = avatarUrl, + notificationChannelId = notificationChannelId, + timestamp = timestamp, +) 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 new file mode 100644 index 0000000000..cda9cf98f0 --- /dev/null +++ b/features/call/test/src/main/kotlin/io/element/android/features/call/test/FakeElementCallEntryPoint.kt @@ -0,0 +1,44 @@ +/* + * Copyright (c) 2024 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. + */ + +package io.element.android.features.call.test + +import io.element.android.features.call.api.CallType +import io.element.android.features.call.api.ElementCallEntryPoint +import io.element.android.libraries.matrix.api.core.EventId +import io.element.android.libraries.matrix.api.core.UserId + +class FakeElementCallEntryPoint( + var startCallResult: (CallType) -> Unit = {}, + var handleIncomingCallResult: (CallType.RoomCall, EventId, UserId, String?, String?, String?, String) -> Unit = { _, _, _, _, _, _, _ -> } +) : ElementCallEntryPoint { + override fun startCall(callType: CallType) { + startCallResult(callType) + } + + override fun handleIncomingCall( + callType: CallType.RoomCall, + eventId: EventId, + senderId: UserId, + roomName: String?, + senderName: String?, + avatarUrl: String?, + timestamp: Long, + notificationChannelId: String + ) { + handleIncomingCallResult(callType, eventId, senderId, roomName, senderName, avatarUrl, notificationChannelId) + } +} diff --git a/features/createroom/impl/src/main/res/values-et/translations.xml b/features/createroom/impl/src/main/res/values-et/translations.xml new file mode 100644 index 0000000000..8d225ad508 --- /dev/null +++ b/features/createroom/impl/src/main/res/values-et/translations.xml @@ -0,0 +1,9 @@ + + + "Uus jututuba" + "Kutsu osalejaid" + "Sõnumid siin jututoas on krüptitud ja seda ei saa hiljem välja lülitada." + "Sõnumid pole krüptitud ja neid saavad kõik lugeda. Soovi korral saad hiljem krüptimise sisse lülitada." + "Jututoa nimi" + "Loo jututuba" + diff --git a/features/ftue/impl/src/main/res/values-et/translations.xml b/features/ftue/impl/src/main/res/values-et/translations.xml new file mode 100644 index 0000000000..83f6cb93fa --- /dev/null +++ b/features/ftue/impl/src/main/res/values-et/translations.xml @@ -0,0 +1,11 @@ + + + "Sa võid seadistusi hiljem alati muuta." + "Luba teavitused ja kunagi ei jää sul sõnumid märkamata" + "Kõned, küsitlused, otsing ja palju muud lisanduvad hiljem selle aasta jooksul." + "Krüptitud jututubade sõnumite ajalugu pole veel saadaval." + "Me soovime teada mida sa arvad. Seadistuste lehel olevast valikust võid saata meile oma kommentaare." + "Alustame!" + "Sa peaksid teadma alljärgnevat:" + "Tere tulemast rakendusse %1$s!" + 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 72552b9ed1..672c5b58ee 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 @@ -23,8 +23,10 @@ import io.element.android.features.invite.api.response.InviteData import io.element.android.libraries.architecture.AsyncAction import io.element.android.libraries.matrix.api.MatrixClient import io.element.android.libraries.matrix.api.core.RoomId +import io.element.android.libraries.matrix.api.core.SessionId import io.element.android.libraries.matrix.test.A_ROOM_ID import io.element.android.libraries.matrix.test.A_ROOM_NAME +import io.element.android.libraries.matrix.test.A_SESSION_ID import io.element.android.libraries.matrix.test.FakeMatrixClient import io.element.android.libraries.matrix.test.room.FakeMatrixRoom import io.element.android.libraries.matrix.test.room.join.FakeJoinRoom @@ -128,6 +130,12 @@ class AcceptDeclineInvitePresenterTest { @Test fun `present - declining invite success flow`() = runTest { + val clearMembershipNotificationForRoomLambda = lambdaRecorder { _, _ -> + Result.success(Unit) + } + val notificationDrawerManager = FakeNotificationDrawerManager( + clearMembershipNotificationForRoomLambda = clearMembershipNotificationForRoomLambda + ) val declineInviteSuccess = lambdaRecorder { -> Result.success(Unit) } @@ -139,7 +147,10 @@ class AcceptDeclineInvitePresenterTest { } ) } - val presenter = createAcceptDeclineInvitePresenter(client = client) + val presenter = createAcceptDeclineInvitePresenter( + client = client, + notificationDrawerManager = notificationDrawerManager, + ) presenter.test { val inviteData = anInviteData() awaitItem().also { state -> @@ -159,7 +170,10 @@ class AcceptDeclineInvitePresenterTest { } cancelAndConsumeRemainingEvents() } - assert(declineInviteSuccess).isCalledOnce() + declineInviteSuccess.assertions().isCalledOnce() + clearMembershipNotificationForRoomLambda.assertions() + .isCalledOnce() + .with(value(A_SESSION_ID), value(A_ROOM_ID)) } @Test @@ -202,10 +216,19 @@ class AcceptDeclineInvitePresenterTest { @Test fun `present - accepting invite success flow`() = runTest { + val clearMembershipNotificationForRoomLambda = lambdaRecorder { _, _ -> + Result.success(Unit) + } + val notificationDrawerManager = FakeNotificationDrawerManager( + clearMembershipNotificationForRoomLambda = clearMembershipNotificationForRoomLambda + ) val joinRoomSuccess = lambdaRecorder { _: RoomId, _: List, _: JoinedRoom.Trigger -> Result.success(Unit) } - val presenter = createAcceptDeclineInvitePresenter(joinRoomLambda = joinRoomSuccess) + val presenter = createAcceptDeclineInvitePresenter( + joinRoomLambda = joinRoomSuccess, + notificationDrawerManager = notificationDrawerManager, + ) presenter.test { val inviteData = anInviteData() awaitItem().also { state -> @@ -229,6 +252,9 @@ class AcceptDeclineInvitePresenterTest { value(emptyList()), value(JoinedRoom.Trigger.Invite) ) + clearMembershipNotificationForRoomLambda.assertions() + .isCalledOnce() + .with(value(A_SESSION_ID), value(A_ROOM_ID)) } private fun anInviteData( diff --git a/features/leaveroom/api/src/main/res/values-be/translations.xml b/features/leaveroom/api/src/main/res/values-be/translations.xml index c8bb068fa7..aae2572ad0 100644 --- a/features/leaveroom/api/src/main/res/values-be/translations.xml +++ b/features/leaveroom/api/src/main/res/values-be/translations.xml @@ -2,6 +2,6 @@ "Вы ўпэўнены, што хочаце пакінуць гэту размову? Гэта размова не з\'яўляецца публічнай, і вы не зможаце далучыцца зноў без запрашэння." "Вы ўпэўнены, што хочаце пакінуць гэты пакой? Вы тут адзіны карыстальнік. Калі вы выйдзеце, ніхто не зможа далучыцца ў будучыні, у тым ліку і вы." - "Вы ўпэўнены, што жхочаце пакінуць гэты пакой? Гэты пакой не агульнадаступны, і вы не зможаце далучыцца да яго зноў без запрашэння." + "Вы ўпэўнены, што хочаце пакінуць гэты пакой? Гэты пакой не агульнадаступны, і вы не зможаце далучыцца да яго зноў без запрашэння." "Вы ўпэўнены, што хочаце пакінуць пакой?" diff --git a/features/leaveroom/api/src/main/res/values-et/translations.xml b/features/leaveroom/api/src/main/res/values-et/translations.xml new file mode 100644 index 0000000000..e0636a37f8 --- /dev/null +++ b/features/leaveroom/api/src/main/res/values-et/translations.xml @@ -0,0 +1,7 @@ + + + "Kas sa oled kindel, et soovid sellest vestlusest lahkuda? See vestlus pole avalik ja uuesti liitumiseks vajad kutset." + "Kas sa oled kindel, et soovid sellest jututoast lahkuda? Sa oled siin viimane osaleja ja peale sinu lahkumist ei saa keegi enam liituda, isegi sina mitte." + "Kas sa oled kindel, et soovid sellest jututoast lahkuda? See jututuba pole avalik ja uuesti liitumiseks vajad kutset." + "Kas sa oled kindel, et soovid sellest jututoast lahkuda?" + diff --git a/features/lockscreen/impl/src/main/res/values-et/translations.xml b/features/lockscreen/impl/src/main/res/values-et/translations.xml new file mode 100644 index 0000000000..fd2632b884 --- /dev/null +++ b/features/lockscreen/impl/src/main/res/values-et/translations.xml @@ -0,0 +1,37 @@ + + + "biomeetrilist autentimist" + "biomeetrilist lukustuse eemaldamist" + "Eemalda lukustus biomeetrilise tuvastuse abil" + "Kas unustasid PIN-koodi?" + "Muuda PIN-koodi" + "Kasuta lukustuse eemaldamiseks biomeetrilist tuvastust" + "Eemalda PIN-kood" + "Kas sa oled kindel, et soovid eemaldada PIN-koodi?" + "Kas eemaldame PIN-koodi?" + "Kasuta %1$s" + "Pigem kasutan PIN-koodi" + "Säästa aega ja kasuta alati %1$s rakenduse lukustuse eemaldamiseks" + "Vali PIN-kood" + "Korda PIN-koodi" + "Turvakaalutlustel sa ei saa sellist PIN-koodi kasutada" + "Kasuta mõnda teist PIN-koodi" + "Lisamaks oma %1$s vestlustele turvalisust ja privaatsust, lukusta oma nutiseade. + +Vali midagi, mis hästi meelde jääb. Kui unustad selle PIN-koodi, siis turvakaalutlustel logitakse sind rakendusest välja." + "Palun sisesta sama PIN-kood kaks korda" + "PIN-koodid ei klapi omavahel" + "Jätkamaks pead uuesti sisse logima ja looma uue PIN-koodi" + "Sa oled logimas välja" + + "Sul on lukustuse eemaldamiseks jäänud %1$d katse" + "Sul on lukustuse eemaldamiseks jäänud %1$d katset" + + + "Vale PIN-kood. Saad proovida veel %1$d korra" + "Vale PIN-kood. Saad proovida veel %1$d korda" + + "Kasuta biomeetrilist tuvastust" + "Kasuta PIN-koodi" + "Logime välja…" + diff --git a/features/login/impl/src/main/res/values-cs/translations.xml b/features/login/impl/src/main/res/values-cs/translations.xml index 41ac3ced66..c0f00a87af 100644 --- a/features/login/impl/src/main/res/values-cs/translations.xml +++ b/features/login/impl/src/main/res/values-cs/translations.xml @@ -43,7 +43,7 @@ "Druhé zařízení není přihlášeno" "Přihlášení bylo na druhém zařízení zrušeno." "Žádost o přihlášení zrušena" - "Požadavek na vašem druhém zařízení nebyl přijat." + "Přihlášení bylo na druhém zařízení odmítnuto." "Přihlášení odmítnuto" "Platnost přihlášení vypršela. Zkuste to prosím znovu." "Přihlášení nebylo dokončeno včas" diff --git a/features/login/impl/src/main/res/values-et/translations.xml b/features/login/impl/src/main/res/values-et/translations.xml new file mode 100644 index 0000000000..466b28855d --- /dev/null +++ b/features/login/impl/src/main/res/values-et/translations.xml @@ -0,0 +1,26 @@ + + + "Muuda teenusepakkujat" + "Koduserveri aadress" + "Sisesta otsingusõna või domeeni nimi." + "Otsi äriühingut, kogukonda või võrgus leiduvat Matrixi serverit." + "Leia teenusepakkuja" + "Sa oled sisse logimas %s teenusesse" + "Sa oled loomas kasutajakontot %s teenuses" + "Koduserveri url" + "Mis on sinu koduserveri aadress?" + "Vali oma server" + "Konto on kasutusest eemaldatud." + "Vigane kasutajanimi ja/või salasõna" + "See ei ole korrektne kasutajanimi. Õige vorming on: „@kasutaja:koduserver.ee“" + "Proovi uuesti" + "Jätkamiseks pead lubama, et %1$s saab kasutada sinu nutiseadme kaamerat" + "QR-koodi lugemiseks luba kaamerat kasutada" + "Skaneeri QR-koodi" + "Alusta uuesti" + "Tekkis ootamatu viga. Palun proovi uuesti." + "Ootame sinu teise seadme järgi" + "Sinu teenusepakkuja võib sisselogimisel eeldada selle verifitseerimiskoodi kasutamist." + "Sinu verifitseerimiskood" + "Tere tulemast rakendusse %1$s!" + diff --git a/features/login/impl/src/main/res/values-pt/translations.xml b/features/login/impl/src/main/res/values-pt/translations.xml index 9720234463..859eb92d71 100644 --- a/features/login/impl/src/main/res/values-pt/translations.xml +++ b/features/login/impl/src/main/res/values-pt/translations.xml @@ -39,7 +39,20 @@ "Ligação insegura" "Ser-te-á pedido que insiras os dois dígitos indicados neste dispositivo." "Insere o número abaixo no teu dispositivo" + "Inicia a sessão no teu outro dispositivo e tenta novamente, ou utiliza outro dispositivo que já tenha a sessão iniciada." + "O outro dispositivo não tem a sessão iniciada" + "O início de sessão foi cancelado no outro dispositivo." "Pedido de início de sessão cancelado" + "O início de sessão foi recusado no outro dispositivo." + "Início de sessão cancelado" + "O início de sessão expirou. Por favor, tenta novamente." + "O início de sessão não foi concluído a tempo" + "O teu outro dispositivo não suporta o início de sessão na %s com um código QR. + +Tenta iniciar a sessão manualmente ou digitaliza o código QR com outro dispositivo." + "Código QR não suportado" + "O teu operador de conta não suporta %1$s." + "%1$s não suportado" "Pronto para ler" "Abre a %1$s num computador" "Carrega no teu avatar" diff --git a/features/login/impl/src/main/res/values-ru/translations.xml b/features/login/impl/src/main/res/values-ru/translations.xml index ed5940dd26..c64d683a12 100644 --- a/features/login/impl/src/main/res/values-ru/translations.xml +++ b/features/login/impl/src/main/res/values-ru/translations.xml @@ -39,9 +39,11 @@ "Соединение не защищено" "Вам нужно будет ввести две цифры, показанные на этом устройстве." "Введите показанный номер на своем другом устройстве" + "Войдите на другое устройство и повторите попытку или используйте другое устройство, на котором уже выполнен вход." + "На другом устройстве вход не выполнен." "Вход на другом устройстве был отменен." "Запрос на вход отменен" - "Запрос не был принят на другом устройстве." + "Вход в систему был отклонен на другом устройстве." "Вход отклонен" "Срок действия входа истек. Пожалуйста, попробуйте еще раз." "Вход в систему не был выполнен вовремя" diff --git a/features/login/impl/src/main/res/values-zh/translations.xml b/features/login/impl/src/main/res/values-zh/translations.xml index 0311d9cd82..bc5421e42e 100644 --- a/features/login/impl/src/main/res/values-zh/translations.xml +++ b/features/login/impl/src/main/res/values-zh/translations.xml @@ -39,11 +39,24 @@ "连接不安全" "您会被要求输入此设备上显示的两位数。" "在您的其他设备上输入下面的数字" + "登录被另一台设备取消" + "登录请求已取消" + "其它设备未接受请求" + "登录被拒绝" + "登录已过期. 请重试." + "登录未及时完成" + "另一个设备不支持使用二维码登录 %s. + +尝试手动或使用另一个设备扫描二维码." + "不支持二维码" + "账户提供者不支持 %1$s." + "不支持 %1$s." + "准备进行扫描" "在桌面设备上打开 %1$s" "点击你的头像" "选择 %1$s" "「连接新设备」" - "按照说明进行操作" + "使用此设备扫描二维码" "在另一台设备上打开 %1$s 以获取二维码" "使用其他设备上显示的二维码。" "再试一次" diff --git a/features/logout/impl/src/main/res/values-et/translations.xml b/features/logout/impl/src/main/res/values-et/translations.xml new file mode 100644 index 0000000000..876247ddbd --- /dev/null +++ b/features/logout/impl/src/main/res/values-et/translations.xml @@ -0,0 +1,8 @@ + + + "Kas sa oled kindel, et soovid välja logida?" + "Logi välja" + "Logi välja" + "Logime välja…" + "Logi välja" + diff --git a/features/messages/impl/build.gradle.kts b/features/messages/impl/build.gradle.kts index df0c4dff7a..6032d195e6 100644 --- a/features/messages/impl/build.gradle.kts +++ b/features/messages/impl/build.gradle.kts @@ -39,7 +39,7 @@ dependencies { anvil(projects.anvilcodegen) api(projects.features.messages.api) implementation(projects.appconfig) - implementation(projects.features.call) + implementation(projects.features.call.api) implementation(projects.features.location.api) implementation(projects.features.poll.api) implementation(projects.libraries.androidutils) 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 6665c5fa2a..8859c4ae03 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 @@ -16,7 +16,6 @@ package io.element.android.features.messages.impl -import android.content.Context import android.os.Parcelable import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier @@ -31,8 +30,8 @@ import dagger.assisted.Assisted import dagger.assisted.AssistedInject import im.vector.app.features.analytics.plan.Interaction import io.element.android.anvilannotations.ContributesNode -import io.element.android.features.call.CallType -import io.element.android.features.call.ui.ElementCallActivity +import io.element.android.features.call.api.CallType +import io.element.android.features.call.api.ElementCallEntryPoint import io.element.android.features.location.api.Location import io.element.android.features.location.api.SendLocationEntryPoint import io.element.android.features.location.api.ShowLocationEntryPoint @@ -58,7 +57,6 @@ import io.element.android.libraries.architecture.createNode import io.element.android.libraries.architecture.inputs import io.element.android.libraries.architecture.overlay.Overlay import io.element.android.libraries.architecture.overlay.operation.show -import io.element.android.libraries.di.ApplicationContext import io.element.android.libraries.di.RoomScope import io.element.android.libraries.matrix.api.MatrixClient import io.element.android.libraries.matrix.api.core.EventId @@ -78,11 +76,11 @@ import kotlinx.parcelize.Parcelize class MessagesFlowNode @AssistedInject constructor( @Assisted buildContext: BuildContext, @Assisted plugins: List, - @ApplicationContext private val context: Context, private val matrixClient: MatrixClient, private val sendLocationEntryPoint: SendLocationEntryPoint, private val showLocationEntryPoint: ShowLocationEntryPoint, private val createPollEntryPoint: CreatePollEntryPoint, + private val elementCallEntryPoint: ElementCallEntryPoint, private val analyticsService: AnalyticsService, ) : BaseFlowNode( backstack = BackStack( @@ -188,12 +186,12 @@ class MessagesFlowNode @AssistedInject constructor( } override fun onJoinCallClick(roomId: RoomId) { - val inputs = CallType.RoomCall( + val callType = CallType.RoomCall( sessionId = matrixClient.sessionId, roomId = roomId, ) analyticsService.captureInteraction(Interaction.Name.MobileRoomCallButton) - ElementCallActivity.start(context, inputs) + elementCallEntryPoint.startCall(callType) } } val inputs = MessagesNode.Inputs( 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 5537ea3288..065c81e407 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 @@ -48,6 +48,7 @@ import io.element.android.features.messages.impl.timeline.components.reactionsum import io.element.android.features.messages.impl.timeline.components.receipt.bottomsheet.ReadReceiptBottomSheetPresenter import io.element.android.features.messages.impl.timeline.model.TimelineItem import io.element.android.features.messages.impl.timeline.model.event.TimelineItemAudioContent +import io.element.android.features.messages.impl.timeline.model.event.TimelineItemCallNotifyContent import io.element.android.features.messages.impl.timeline.model.event.TimelineItemEncryptedContent import io.element.android.features.messages.impl.timeline.model.event.TimelineItemFileContent import io.element.android.features.messages.impl.timeline.model.event.TimelineItemImageContent @@ -386,6 +387,7 @@ class MessagesPresenter @AssistedInject constructor( is TimelineItemStateContent, is TimelineItemEncryptedContent, is TimelineItemLegacyCallInviteContent, + is TimelineItemCallNotifyContent, is TimelineItemUnknownContent -> null } val composerMode = MessageComposerMode.Reply( 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 f1eb0894a6..b9b9e7e4a7 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 @@ -21,7 +21,6 @@ import androidx.compose.foundation.clickable import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.Column -import androidx.compose.foundation.layout.PaddingValues import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.Spacer import androidx.compose.foundation.layout.WindowInsets @@ -32,10 +31,8 @@ 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.size import androidx.compose.foundation.layout.statusBars import androidx.compose.foundation.layout.width -import androidx.compose.material3.ButtonDefaults import androidx.compose.material3.ExperimentalMaterial3Api import androidx.compose.material3.MaterialTheme import androidx.compose.runtime.Composable @@ -70,6 +67,7 @@ import io.element.android.features.messages.impl.messagecomposer.AttachmentsStat import io.element.android.features.messages.impl.messagecomposer.MessageComposerEvents import io.element.android.features.messages.impl.messagecomposer.MessageComposerView import io.element.android.features.messages.impl.timeline.TimelineView +import io.element.android.features.messages.impl.timeline.components.JoinCallMenuItem import io.element.android.features.messages.impl.timeline.components.customreaction.CustomReactionBottomSheet import io.element.android.features.messages.impl.timeline.components.customreaction.CustomReactionEvents import io.element.android.features.messages.impl.timeline.components.reactionsummary.ReactionSummaryEvents @@ -107,7 +105,6 @@ import io.element.android.libraries.ui.strings.CommonStrings import kotlinx.collections.immutable.ImmutableList import timber.log.Timber import kotlin.random.Random -import androidx.compose.material3.Button as Material3Button @Composable fun MessagesView( @@ -224,6 +221,7 @@ fun MessagesView( state.eventSink(MessagesEvents.HandleAction(TimelineItemAction.Reply, targetEvent)) }, forceJumpToBottomVisibility = forceJumpToBottomVisibility, + onJoinCallClick = onJoinCallClick, ) }, snackbarHost = { @@ -314,6 +312,7 @@ private fun MessagesViewContent( onMessageLongClick: (TimelineItem.Event) -> Unit, onSendLocationClick: () -> Unit, onCreatePollClick: () -> Unit, + onJoinCallClick: () -> Unit, forceJumpToBottomVisibility: Boolean, modifier: Modifier = Modifier, onSwipeToReply: (TimelineItem.Event) -> Unit, @@ -385,6 +384,7 @@ private fun MessagesViewContent( onReadReceiptClick = onReadReceiptClick, modifier = Modifier.padding(paddingValues), forceJumpToBottomVisibility = forceJumpToBottomVisibility, + onJoinCallClick = onJoinCallClick, ) }, sheetContent = { subcomposing: Boolean -> @@ -467,16 +467,11 @@ private fun MessagesViewTopBar( } }, actions = { - if (callState == RoomCallState.ONGOING) { - JoinCallMenuItem(onJoinCallClick = onJoinCallClick) - } else { - IconButton(onClick = onJoinCallClick, enabled = callState != RoomCallState.DISABLED) { - Icon( - imageVector = CompoundIcons.VideoCallSolid(), - contentDescription = stringResource(CommonStrings.a11y_start_call), - ) - } - } + CallMenuItem( + isCallOngoing = callState == RoomCallState.ONGOING, + onClick = onJoinCallClick, + enabled = callState != RoomCallState.DISABLED + ) Spacer(Modifier.width(8.dp)) }, windowInsets = WindowInsets(0.dp) @@ -484,29 +479,20 @@ private fun MessagesViewTopBar( } @Composable -private fun JoinCallMenuItem( - onJoinCallClick: () -> Unit, +private fun CallMenuItem( + isCallOngoing: Boolean, + enabled: Boolean = true, + onClick: () -> Unit, ) { - Material3Button( - onClick = onJoinCallClick, - colors = ButtonDefaults.buttonColors( - contentColor = ElementTheme.colors.bgCanvasDefault, - containerColor = ElementTheme.colors.iconAccentTertiary - ), - contentPadding = PaddingValues(horizontal = 10.dp, vertical = 0.dp), - modifier = Modifier.heightIn(min = 36.dp), - ) { - Icon( - modifier = Modifier.size(20.dp), - imageVector = CompoundIcons.VideoCallSolid(), - contentDescription = null - ) - Spacer(Modifier.width(8.dp)) - Text( - text = stringResource(CommonStrings.action_join), - style = ElementTheme.typography.fontBodyMdMedium - ) - Spacer(Modifier.width(8.dp)) + if (isCallOngoing) { + JoinCallMenuItem(onJoinCallClick = onClick) + } else { + IconButton(onClick = onClick, enabled = enabled) { + Icon( + imageVector = CompoundIcons.VideoCallSolid(), + contentDescription = stringResource(CommonStrings.a11y_start_call), + ) + } } } 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 5ebedeb06f..609ab5c3b3 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 @@ -25,6 +25,7 @@ import androidx.compose.runtime.remember import androidx.compose.runtime.rememberCoroutineScope import io.element.android.features.messages.impl.actionlist.model.TimelineItemAction import io.element.android.features.messages.impl.timeline.model.TimelineItem +import io.element.android.features.messages.impl.timeline.model.event.TimelineItemCallNotifyContent import io.element.android.features.messages.impl.timeline.model.event.TimelineItemLegacyCallInviteContent import io.element.android.features.messages.impl.timeline.model.event.TimelineItemPollContent import io.element.android.features.messages.impl.timeline.model.event.TimelineItemRedactedContent @@ -86,6 +87,13 @@ class ActionListPresenter @Inject constructor( val canRedact = timelineItem.isMine && userCanRedactOwn || !timelineItem.isMine && userCanRedactOther val actions = when (timelineItem.content) { + is TimelineItemCallNotifyContent -> { + if (isDeveloperModeEnabled) { + listOf(TimelineItemAction.ViewSource) + } else { + emptyList() + } + } is TimelineItemRedactedContent -> { if (isDeveloperModeEnabled) { listOf(TimelineItemAction.ViewSource) diff --git a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/actionlist/ActionListView.kt b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/actionlist/ActionListView.kt index 010ebbe99d..e9588ea55f 100644 --- a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/actionlist/ActionListView.kt +++ b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/actionlist/ActionListView.kt @@ -59,6 +59,7 @@ import io.element.android.features.messages.impl.sender.SenderName import io.element.android.features.messages.impl.sender.SenderNameMode import io.element.android.features.messages.impl.timeline.model.TimelineItem import io.element.android.features.messages.impl.timeline.model.event.TimelineItemAudioContent +import io.element.android.features.messages.impl.timeline.model.event.TimelineItemCallNotifyContent import io.element.android.features.messages.impl.timeline.model.event.TimelineItemEncryptedContent import io.element.android.features.messages.impl.timeline.model.event.TimelineItemFileContent import io.element.android.features.messages.impl.timeline.model.event.TimelineItemImageContent @@ -265,6 +266,9 @@ private fun MessageSummary(event: TimelineItem.Event, modifier: Modifier = Modif is TimelineItemLegacyCallInviteContent -> { content = { ContentForBody(textContent) } } + is TimelineItemCallNotifyContent -> { + content = { ContentForBody(stringResource(CommonStrings.common_call_started)) } + } } Row(modifier = modifier) { icon() 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 fca11f6d8e..61a445b187 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 @@ -38,6 +38,7 @@ import io.element.android.features.poll.api.actions.EndPollAction import io.element.android.features.poll.api.actions.SendPollResponseAction import io.element.android.features.preferences.api.store.SessionPreferencesStore import io.element.android.libraries.architecture.Presenter +import io.element.android.libraries.core.bool.orFalse import io.element.android.libraries.core.coroutine.CoroutineDispatchers import io.element.android.libraries.matrix.api.core.EventId import io.element.android.libraries.matrix.api.room.MatrixRoom @@ -85,6 +86,7 @@ class TimelinePresenter @AssistedInject constructor( val lastReadReceiptId = rememberSaveable { mutableStateOf(null) } val timelineItems by timelineItemsFactory.collectItemsAsState() + val roomInfo by room.roomInfoFlow.collectAsState(initial = null) val syncUpdateFlow = room.syncUpdateFlow.collectAsState() @@ -196,6 +198,7 @@ class TimelinePresenter @AssistedInject constructor( isDm = room.isDm, userHasPermissionToSendMessage = userHasPermissionToSendMessage, userHasPermissionToSendReaction = userHasPermissionToSendReaction, + isCallOngoing = roomInfo?.hasRoomCall.orFalse(), ) } } diff --git a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/TimelineState.kt b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/TimelineState.kt index c32dbad723..971f231546 100644 --- a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/TimelineState.kt +++ b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/TimelineState.kt @@ -51,4 +51,5 @@ data class TimelineRoomInfo( val name: String?, val userHasPermissionToSendMessage: Boolean, val userHasPermissionToSendReaction: Boolean, + val isCallOngoing: Boolean, ) diff --git a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/TimelineStateProvider.kt b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/TimelineStateProvider.kt index b9e417b188..964a5d2ef7 100644 --- a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/TimelineStateProvider.kt +++ b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/TimelineStateProvider.kt @@ -232,4 +232,5 @@ internal fun aTimelineRoomInfo( name = name, userHasPermissionToSendMessage = userHasPermissionToSendMessage, userHasPermissionToSendReaction = true, + isCallOngoing = false, ) diff --git a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/TimelineView.kt b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/TimelineView.kt index 3b52a9fc4c..370d7bc517 100644 --- a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/TimelineView.kt +++ b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/TimelineView.kt @@ -88,6 +88,7 @@ fun TimelineView( onReactionLongClick: (emoji: String, TimelineItem.Event) -> Unit, onMoreReactionsClick: (TimelineItem.Event) -> Unit, onReadReceiptClick: (TimelineItem.Event) -> Unit, + onJoinCallClick: () -> Unit, modifier: Modifier = Modifier, forceJumpToBottomVisibility: Boolean = false ) { @@ -148,6 +149,7 @@ fun TimelineView( onReadReceiptClick = onReadReceiptClick, eventSink = state.eventSink, onSwipeToReply = onSwipeToReply, + onJoinCallClick = onJoinCallClick, ) } } @@ -302,6 +304,7 @@ internal fun TimelineViewPreview( onReactionLongClick = { _, _ -> }, onMoreReactionsClick = {}, onReadReceiptClick = {}, + onJoinCallClick = {}, forceJumpToBottomVisibility = true, ) } diff --git a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/components/JoinCallMenuItem.kt b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/components/JoinCallMenuItem.kt new file mode 100644 index 0000000000..0b37a4f5fb --- /dev/null +++ b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/components/JoinCallMenuItem.kt @@ -0,0 +1,61 @@ +/* + * Copyright (c) 2024 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. + */ + +package io.element.android.features.messages.impl.timeline.components + +import androidx.compose.foundation.layout.PaddingValues +import androidx.compose.foundation.layout.Spacer +import androidx.compose.foundation.layout.heightIn +import androidx.compose.foundation.layout.size +import androidx.compose.foundation.layout.width +import androidx.compose.material3.Button +import androidx.compose.material3.ButtonDefaults +import androidx.compose.runtime.Composable +import androidx.compose.ui.Modifier +import androidx.compose.ui.res.stringResource +import androidx.compose.ui.unit.dp +import io.element.android.compound.theme.ElementTheme +import io.element.android.compound.tokens.generated.CompoundIcons +import io.element.android.libraries.designsystem.theme.components.Icon +import io.element.android.libraries.designsystem.theme.components.Text +import io.element.android.libraries.ui.strings.CommonStrings + +@Composable +internal fun JoinCallMenuItem( + onJoinCallClick: () -> Unit, +) { + Button( + onClick = onJoinCallClick, + colors = ButtonDefaults.buttonColors( + contentColor = ElementTheme.colors.bgCanvasDefault, + containerColor = ElementTheme.colors.iconAccentTertiary + ), + contentPadding = PaddingValues(horizontal = 10.dp, vertical = 0.dp), + modifier = Modifier.heightIn(min = 36.dp), + ) { + Icon( + modifier = Modifier.size(20.dp), + imageVector = CompoundIcons.VideoCallSolid(), + contentDescription = null + ) + Spacer(Modifier.width(8.dp)) + Text( + text = stringResource(CommonStrings.action_join), + style = ElementTheme.typography.fontBodyMdMedium + ) + Spacer(Modifier.width(8.dp)) + } +} diff --git a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/components/TimelineItemCallNotifyView.kt b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/components/TimelineItemCallNotifyView.kt new file mode 100644 index 0000000000..f64776249c --- /dev/null +++ b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/components/TimelineItemCallNotifyView.kt @@ -0,0 +1,127 @@ +/* + * Copyright (c) 2024 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. + */ + +package io.element.android.features.messages.impl.timeline.components + +import androidx.compose.foundation.ExperimentalFoundationApi +import androidx.compose.foundation.border +import androidx.compose.foundation.combinedClickable +import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.size +import androidx.compose.foundation.shape.RoundedCornerShape +import androidx.compose.material3.Icon +import androidx.compose.material3.Text +import androidx.compose.runtime.Composable +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.res.stringResource +import androidx.compose.ui.text.style.TextOverflow +import androidx.compose.ui.unit.dp +import androidx.compose.ui.unit.sp +import io.element.android.compound.theme.ElementTheme +import io.element.android.compound.tokens.generated.CompoundIcons +import io.element.android.features.messages.impl.timeline.aTimelineItemEvent +import io.element.android.features.messages.impl.timeline.model.TimelineItem +import io.element.android.features.messages.impl.timeline.model.event.TimelineItemCallNotifyContent +import io.element.android.libraries.designsystem.components.avatar.Avatar +import io.element.android.libraries.designsystem.preview.ElementPreview +import io.element.android.libraries.designsystem.preview.PreviewsDayNight +import io.element.android.libraries.designsystem.text.toDp +import io.element.android.libraries.ui.strings.CommonStrings + +@OptIn(ExperimentalFoundationApi::class) +@Composable +internal fun TimelineItemCallNotifyView( + event: TimelineItem.Event, + isCallOngoing: Boolean, + onLongClick: (TimelineItem.Event) -> Unit, + onJoinCallClick: () -> Unit, + modifier: Modifier = Modifier +) { + Row( + modifier = modifier + .fillMaxWidth() + .border(1.dp, ElementTheme.colors.borderInteractiveSecondary, RoundedCornerShape(8.dp)) + .combinedClickable(enabled = true, onClick = {}, onLongClick = { onLongClick(event) }) + .padding(12.dp), + horizontalArrangement = Arrangement.spacedBy(12.dp), + verticalAlignment = Alignment.CenterVertically, + ) { + Avatar(avatarData = event.senderAvatar) + Column(modifier = Modifier.weight(1f)) { + Text( + text = event.safeSenderName, + style = ElementTheme.typography.fontBodyLgMedium, + maxLines = 1, + overflow = TextOverflow.Ellipsis, + ) + Row( + horizontalArrangement = Arrangement.spacedBy(4.dp), + verticalAlignment = Alignment.CenterVertically + ) { + Icon( + modifier = Modifier.size(20.sp.toDp()), + imageVector = CompoundIcons.VideoCallSolid(), + contentDescription = null, + tint = ElementTheme.colors.iconSecondary, + ) + Text( + text = stringResource(CommonStrings.common_call_started), + style = ElementTheme.typography.fontBodyMdRegular, + color = ElementTheme.colors.textSecondary, + maxLines = 1, + overflow = TextOverflow.Ellipsis, + ) + } + } + if (isCallOngoing) { + JoinCallMenuItem(onJoinCallClick) + } else { + Text( + text = event.sentTime, + style = ElementTheme.typography.fontBodyMdRegular, + color = ElementTheme.colors.textSecondary, + maxLines = 1, + overflow = TextOverflow.Ellipsis, + ) + } + } +} + +@PreviewsDayNight +@Composable +internal fun TimelineItemCallNotifyViewPreview() { + ElementPreview { + Column(modifier = Modifier.padding(16.dp), verticalArrangement = Arrangement.spacedBy(16.dp)) { + TimelineItemCallNotifyView( + event = aTimelineItemEvent(content = TimelineItemCallNotifyContent()), + isCallOngoing = true, + onLongClick = {}, + onJoinCallClick = {}, + ) + TimelineItemCallNotifyView( + event = aTimelineItemEvent(content = TimelineItemCallNotifyContent()), + isCallOngoing = false, + onLongClick = {}, + onJoinCallClick = {}, + ) + } + } +} diff --git a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/components/TimelineItemGroupedEventsRow.kt b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/components/TimelineItemGroupedEventsRow.kt index 96857802e0..4dd4d4e356 100644 --- a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/components/TimelineItemGroupedEventsRow.kt +++ b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/components/TimelineItemGroupedEventsRow.kt @@ -136,6 +136,7 @@ private fun TimelineItemGroupedEventsRowContent( onReadReceiptClick = onReadReceiptClick, eventSink = eventSink, onSwipeToReply = {}, + onJoinCallClick = {}, ) } } diff --git a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/components/TimelineItemRow.kt b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/components/TimelineItemRow.kt index 4ff835949d..2a3a0305c2 100644 --- a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/components/TimelineItemRow.kt +++ b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/components/TimelineItemRow.kt @@ -30,6 +30,7 @@ import io.element.android.compound.theme.ElementTheme import io.element.android.features.messages.impl.timeline.TimelineEvents import io.element.android.features.messages.impl.timeline.TimelineRoomInfo import io.element.android.features.messages.impl.timeline.model.TimelineItem +import io.element.android.features.messages.impl.timeline.model.event.TimelineItemCallNotifyContent import io.element.android.features.messages.impl.timeline.model.event.TimelineItemLegacyCallInviteContent import io.element.android.features.messages.impl.timeline.model.event.TimelineItemStateContent import io.element.android.libraries.designsystem.text.toPx @@ -54,6 +55,7 @@ internal fun TimelineItemRow( onMoreReactionsClick: (TimelineItem.Event) -> Unit, onReadReceiptClick: (TimelineItem.Event) -> Unit, onSwipeToReply: (TimelineItem.Event) -> Unit, + onJoinCallClick: () -> Unit, eventSink: (TimelineEvents.EventFromTimelineItem) -> Unit, modifier: Modifier = Modifier ) { @@ -77,36 +79,48 @@ internal fun TimelineItemRow( ) } is TimelineItem.Event -> { - if (timelineItem.content is TimelineItemStateContent || timelineItem.content is TimelineItemLegacyCallInviteContent) { - TimelineItemStateEventRow( - event = timelineItem, - renderReadReceipts = renderReadReceipts, - isLastOutgoingMessage = isLastOutgoingMessage, - isHighlighted = timelineItem.isEvent(focusedEventId), - onClick = { onClick(timelineItem) }, - onReadReceiptsClick = onReadReceiptClick, - onLongClick = { onLongClick(timelineItem) }, - eventSink = eventSink, - ) - } else { - TimelineItemEventRow( - event = timelineItem, - timelineRoomInfo = timelineRoomInfo, - renderReadReceipts = renderReadReceipts, - isLastOutgoingMessage = isLastOutgoingMessage, - isHighlighted = timelineItem.isEvent(focusedEventId), - onClick = { onClick(timelineItem) }, - onLongClick = { onLongClick(timelineItem) }, - onUserDataClick = onUserDataClick, - onLinkClick = onLinkClick, - inReplyToClick = inReplyToClick, - onReactionClick = onReactionClick, - onReactionLongClick = onReactionLongClick, - onMoreReactionsClick = onMoreReactionsClick, - onReadReceiptClick = onReadReceiptClick, - onSwipeToReply = { onSwipeToReply(timelineItem) }, - eventSink = eventSink, - ) + when (timelineItem.content) { + is TimelineItemStateContent, is TimelineItemLegacyCallInviteContent -> { + TimelineItemStateEventRow( + event = timelineItem, + renderReadReceipts = renderReadReceipts, + isLastOutgoingMessage = isLastOutgoingMessage, + isHighlighted = timelineItem.isEvent(focusedEventId), + onClick = { onClick(timelineItem) }, + onReadReceiptsClick = onReadReceiptClick, + onLongClick = { onLongClick(timelineItem) }, + eventSink = eventSink, + ) + } + is TimelineItemCallNotifyContent -> { + TimelineItemCallNotifyView( + modifier = Modifier.padding(start = 16.dp, end = 16.dp, top = 16.dp), + event = timelineItem, + isCallOngoing = timelineRoomInfo.isCallOngoing, + onLongClick = onLongClick, + onJoinCallClick = onJoinCallClick, + ) + } + else -> { + TimelineItemEventRow( + event = timelineItem, + timelineRoomInfo = timelineRoomInfo, + renderReadReceipts = renderReadReceipts, + isLastOutgoingMessage = isLastOutgoingMessage, + isHighlighted = timelineItem.isEvent(focusedEventId), + onClick = { onClick(timelineItem) }, + onLongClick = { onLongClick(timelineItem) }, + onUserDataClick = onUserDataClick, + onLinkClick = onLinkClick, + inReplyToClick = inReplyToClick, + onReactionClick = onReactionClick, + onReactionLongClick = onReactionLongClick, + onMoreReactionsClick = onMoreReactionsClick, + onReadReceiptClick = onReadReceiptClick, + onSwipeToReply = { onSwipeToReply(timelineItem) }, + eventSink = eventSink, + ) + } } } is TimelineItem.GroupedEvents -> { diff --git a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/components/event/TimelineItemEventContentView.kt b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/components/event/TimelineItemEventContentView.kt index 09eeee22e0..90988f1a26 100644 --- a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/components/event/TimelineItemEventContentView.kt +++ b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/components/event/TimelineItemEventContentView.kt @@ -23,6 +23,7 @@ import io.element.android.features.messages.impl.timeline.components.layout.Cont import io.element.android.features.messages.impl.timeline.di.LocalTimelineItemPresenterFactories import io.element.android.features.messages.impl.timeline.di.rememberPresenter import io.element.android.features.messages.impl.timeline.model.event.TimelineItemAudioContent +import io.element.android.features.messages.impl.timeline.model.event.TimelineItemCallNotifyContent import io.element.android.features.messages.impl.timeline.model.event.TimelineItemEncryptedContent import io.element.android.features.messages.impl.timeline.model.event.TimelineItemEventContent import io.element.android.features.messages.impl.timeline.model.event.TimelineItemFileContent @@ -118,5 +119,6 @@ fun TimelineItemEventContentView( modifier = modifier ) } + is TimelineItemCallNotifyContent -> error("This shouldn't be rendered as the content of a bubble") } } diff --git a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/factories/event/TimelineItemContentFactory.kt b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/factories/event/TimelineItemContentFactory.kt index 807137a978..0d73e40202 100644 --- a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/factories/event/TimelineItemContentFactory.kt +++ b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/factories/event/TimelineItemContentFactory.kt @@ -16,9 +16,11 @@ package io.element.android.features.messages.impl.timeline.factories.event +import io.element.android.features.messages.impl.timeline.model.event.TimelineItemCallNotifyContent import io.element.android.features.messages.impl.timeline.model.event.TimelineItemEventContent import io.element.android.features.messages.impl.timeline.model.event.TimelineItemLegacyCallInviteContent import io.element.android.features.messages.impl.timeline.model.event.TimelineItemUnknownContent +import io.element.android.libraries.matrix.api.timeline.item.event.CallNotifyContent import io.element.android.libraries.matrix.api.timeline.item.event.EventTimelineItem import io.element.android.libraries.matrix.api.timeline.item.event.FailedToParseMessageLikeContent import io.element.android.libraries.matrix.api.timeline.item.event.FailedToParseStateContent @@ -67,6 +69,7 @@ class TimelineItemContentFactory @Inject constructor( is StickerContent -> stickerFactory.create(itemContent) is PollContent -> pollFactory.create(eventTimelineItem, itemContent) is UnableToDecryptContent -> utdFactory.create(itemContent) + is CallNotifyContent -> TimelineItemCallNotifyContent() is UnknownContent -> TimelineItemUnknownContent } } diff --git a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/factories/event/TimelineItemContentStickerFactory.kt b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/factories/event/TimelineItemContentStickerFactory.kt index 91b62a6d51..0f0c2b8552 100644 --- a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/factories/event/TimelineItemContentStickerFactory.kt +++ b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/factories/event/TimelineItemContentStickerFactory.kt @@ -20,7 +20,6 @@ import io.element.android.features.messages.impl.timeline.model.event.TimelineIt import io.element.android.features.messages.impl.timeline.model.event.TimelineItemStickerContent import io.element.android.libraries.androidutils.filesize.FileSizeFormatter import io.element.android.libraries.core.mimetype.MimeTypes -import io.element.android.libraries.matrix.api.media.MediaSource import io.element.android.libraries.matrix.api.timeline.item.event.StickerContent import io.element.android.libraries.mediaviewer.api.util.FileExtensionExtractor import javax.inject.Inject @@ -44,7 +43,7 @@ class TimelineItemContentStickerFactory @Inject constructor( return TimelineItemStickerContent( body = content.body, - mediaSource = MediaSource(content.url), + mediaSource = content.source, thumbnailSource = content.info.thumbnailSource, mimeType = content.info.mimetype ?: MimeTypes.OctetStream, blurhash = content.info.blurhash, diff --git a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/groups/Groupability.kt b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/groups/Groupability.kt index c14ba6ca1d..02362408ee 100644 --- a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/groups/Groupability.kt +++ b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/groups/Groupability.kt @@ -18,6 +18,7 @@ package io.element.android.features.messages.impl.timeline.groups import io.element.android.features.messages.impl.timeline.model.TimelineItem import io.element.android.features.messages.impl.timeline.model.event.TimelineItemAudioContent +import io.element.android.features.messages.impl.timeline.model.event.TimelineItemCallNotifyContent import io.element.android.features.messages.impl.timeline.model.event.TimelineItemEncryptedContent import io.element.android.features.messages.impl.timeline.model.event.TimelineItemFileContent import io.element.android.features.messages.impl.timeline.model.event.TimelineItemImageContent @@ -34,6 +35,7 @@ import io.element.android.features.messages.impl.timeline.model.event.TimelineIt 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.matrix.api.timeline.MatrixTimelineItem +import io.element.android.libraries.matrix.api.timeline.item.event.CallNotifyContent import io.element.android.libraries.matrix.api.timeline.item.event.FailedToParseMessageLikeContent import io.element.android.libraries.matrix.api.timeline.item.event.FailedToParseStateContent import io.element.android.libraries.matrix.api.timeline.item.event.LegacyCallInviteContent @@ -66,7 +68,8 @@ internal fun TimelineItem.Event.canBeGrouped(): Boolean { is TimelineItemVoiceContent, TimelineItemRedactedContent, TimelineItemUnknownContent, - is TimelineItemLegacyCallInviteContent -> false + is TimelineItemLegacyCallInviteContent, + is TimelineItemCallNotifyContent -> false is TimelineItemProfileChangeContent, is TimelineItemRoomMembershipContent, is TimelineItemStateEventContent -> true @@ -93,6 +96,7 @@ internal fun MatrixTimelineItem.Event.canBeDisplayedInBubbleBlock(): Boolean { is RoomMembershipContent, UnknownContent, is LegacyCallInviteContent, + CallNotifyContent, is StateContent -> false } } diff --git a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/model/InReplyToMetadata.kt b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/model/InReplyToMetadata.kt index ee6589f046..ab2e418587 100644 --- a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/model/InReplyToMetadata.kt +++ b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/model/InReplyToMetadata.kt @@ -19,8 +19,8 @@ package io.element.android.features.messages.impl.timeline.model import androidx.compose.runtime.Composable import androidx.compose.runtime.Immutable import androidx.compose.ui.res.stringResource -import io.element.android.libraries.matrix.api.media.MediaSource import io.element.android.libraries.matrix.api.timeline.item.event.AudioMessageType +import io.element.android.libraries.matrix.api.timeline.item.event.CallNotifyContent import io.element.android.libraries.matrix.api.timeline.item.event.FailedToParseMessageLikeContent import io.element.android.libraries.matrix.api.timeline.item.event.FailedToParseStateContent import io.element.android.libraries.matrix.api.timeline.item.event.FileMessageType @@ -113,7 +113,7 @@ internal fun InReplyToDetails.Ready.metadata(): InReplyToMetadata? = when (event } is StickerContent -> InReplyToMetadata.Thumbnail( AttachmentThumbnailInfo( - thumbnailSource = MediaSource(eventContent.url), + thumbnailSource = eventContent.source, textContent = eventContent.body, type = AttachmentThumbnailType.Image, blurHash = eventContent.info.blurhash, @@ -134,5 +134,6 @@ internal fun InReplyToDetails.Ready.metadata(): InReplyToMetadata? = when (event is StateContent, UnknownContent, is LegacyCallInviteContent, + is CallNotifyContent, null -> null } diff --git a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/model/event/TimelineItemCallNotifyContent.kt b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/model/event/TimelineItemCallNotifyContent.kt new file mode 100644 index 0000000000..aad38ff39d --- /dev/null +++ b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/model/event/TimelineItemCallNotifyContent.kt @@ -0,0 +1,21 @@ +/* + * Copyright (c) 2024 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. + */ + +package io.element.android.features.messages.impl.timeline.model.event + +class TimelineItemCallNotifyContent : TimelineItemEventContent { + override val type: String = "m.call.notify" +} diff --git a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/model/event/TimelineItemEventContent.kt b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/model/event/TimelineItemEventContent.kt index d08485e8e1..43fb947433 100644 --- a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/model/event/TimelineItemEventContent.kt +++ b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/model/event/TimelineItemEventContent.kt @@ -42,6 +42,7 @@ fun TimelineItemEventContent.canBeRepliedTo(): Boolean = when (this) { is TimelineItemRedactedContent, is TimelineItemLegacyCallInviteContent, + is TimelineItemCallNotifyContent, is TimelineItemStateContent -> false else -> true } @@ -65,6 +66,7 @@ fun TimelineItemEventContent.canReact(): Boolean = is TimelineItemStateContent, is TimelineItemRedactedContent, is TimelineItemLegacyCallInviteContent, + is TimelineItemCallNotifyContent, TimelineItemUnknownContent -> false } 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 c6615dc74b..fc17a9bbd0 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 @@ -20,6 +20,7 @@ import android.content.Context import com.squareup.anvil.annotations.ContributesBinding import io.element.android.features.messages.impl.timeline.model.TimelineItem import io.element.android.features.messages.impl.timeline.model.event.TimelineItemAudioContent +import io.element.android.features.messages.impl.timeline.model.event.TimelineItemCallNotifyContent import io.element.android.features.messages.impl.timeline.model.event.TimelineItemEncryptedContent import io.element.android.features.messages.impl.timeline.model.event.TimelineItemFileContent import io.element.android.features.messages.impl.timeline.model.event.TimelineItemImageContent @@ -65,6 +66,7 @@ class DefaultMessageSummaryFormatter @Inject constructor( is TimelineItemFileContent -> context.getString(CommonStrings.common_file) is TimelineItemAudioContent -> context.getString(CommonStrings.common_audio) is TimelineItemLegacyCallInviteContent -> context.getString(CommonStrings.common_call_invite) + is TimelineItemCallNotifyContent -> context.getString(CommonStrings.common_call_started) }.take(MAX_SAFE_LENGTH) } } diff --git a/features/messages/impl/src/main/res/values-be/translations.xml b/features/messages/impl/src/main/res/values-be/translations.xml index c10a0afad3..7ea003cfd7 100644 --- a/features/messages/impl/src/main/res/values-be/translations.xml +++ b/features/messages/impl/src/main/res/values-be/translations.xml @@ -36,7 +36,7 @@ "У Вас няма дазволу на публікацыю ў гэтым пакоі" "Паказаць менш" "Паказаць больш" - "Новы" + "Новае" "%1$d змена ў пакоі" "%1$d змены ў пакоі" diff --git a/features/messages/impl/src/main/res/values-et/translations.xml b/features/messages/impl/src/main/res/values-et/translations.xml new file mode 100644 index 0000000000..a47e6969e5 --- /dev/null +++ b/features/messages/impl/src/main/res/values-et/translations.xml @@ -0,0 +1,40 @@ + + + "Tegevused" + "Lipud" + "Toit ja jook" + "Loomad ja loodus" + "Esemed" + "Emotikonid ja inimesed" + "Reisimine ja kohad" + "Sümbolid" + "Teade selle sõnumi kohta edastatakse sinu koduserveri haldajale. Haldajal ei ole võimalik lugeda krüptitud sõnumite sisu." + "Sellest sisust teatamise põhjus" + "Kaamera" + "Tee pilt" + "Salvesta video" + "Manus" + "Fotode ja videote galerii" + "Asukoht" + "Küsitlus" + "Tekstivorming" + "Sõnumite ajalugu pole hetkel saadaval" + "Selle jututoa sõnumite ajalugu pole hetkel saadaval. Verifitseeri see seade ja näed tervet oma sõnumiteajalugu." + "Teavita kogu jututuba" + "Kõik" + "See on %1$s jututoa algus." + "See on antud vestluse algus." + "Uus" + + "%1$d jututoa muudatus" + "%1$d jututoa muudatust" + + + "%1$s, %2$s ja veel %3$d huviline" + "%1$s, %2$s ja veel %3$d huvilist" + + + "%1$s kirjutab" + "%1$s kirjutavad" + + 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 39ffda04b2..99b266dd82 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 @@ -23,6 +23,7 @@ import com.google.common.truth.Truth.assertThat import io.element.android.features.messages.impl.actionlist.model.TimelineItemAction import io.element.android.features.messages.impl.fixtures.aMessageEvent import io.element.android.features.messages.impl.timeline.aTimelineItemEvent +import io.element.android.features.messages.impl.timeline.model.event.TimelineItemCallNotifyContent import io.element.android.features.messages.impl.timeline.model.event.TimelineItemRedactedContent import io.element.android.features.messages.impl.timeline.model.event.TimelineItemTextContent import io.element.android.features.messages.impl.timeline.model.event.aTimelineItemImageContent @@ -759,6 +760,39 @@ class ActionListPresenterTest { ) } } + + @Test + fun `present - compute for call notify`() = runTest { + val presenter = createActionListPresenter(isDeveloperModeEnabled = true) + moleculeFlow(RecompositionMode.Immediate) { + presenter.present() + }.test { + val initialState = awaitItem() + val messageEvent = aMessageEvent( + isMine = true, + content = TimelineItemCallNotifyContent(), + ) + initialState.eventSink.invoke( + ActionListEvents.ComputeForMessage( + event = messageEvent, + canRedactOwn = true, + canRedactOther = false, + canSendMessage = true, + canSendReaction = true, + ) + ) + val successState = awaitItem() + assertThat(successState.target).isEqualTo( + ActionListState.Target.Success( + event = messageEvent, + displayEmojiReactions = false, + actions = persistentListOf( + TimelineItemAction.ViewSource + ) + ) + ) + } + } } private fun createActionListPresenter(isDeveloperModeEnabled: Boolean): ActionListPresenter { diff --git a/features/messages/impl/src/test/kotlin/io/element/android/features/messages/impl/textcomposer/MessageComposerPresenterTest.kt b/features/messages/impl/src/test/kotlin/io/element/android/features/messages/impl/textcomposer/MessageComposerPresenterTest.kt index a9a5dfe356..5315cd54e2 100644 --- a/features/messages/impl/src/test/kotlin/io/element/android/features/messages/impl/textcomposer/MessageComposerPresenterTest.kt +++ b/features/messages/impl/src/test/kotlin/io/element/android/features/messages/impl/textcomposer/MessageComposerPresenterTest.kt @@ -395,7 +395,7 @@ class MessageComposerPresenterTest { @Test fun `present - reply message`() = runTest { - val replyMessageLambda = lambdaRecorder { _: EventId, _: String, _: String?, _: List -> + val replyMessageLambda = lambdaRecorder { _: EventId, _: String, _: String?, _: List, _: Boolean -> Result.success(Unit) } val timeline = FakeTimeline().apply { @@ -426,7 +426,7 @@ class MessageComposerPresenterTest { assert(replyMessageLambda) .isCalledOnce() - .with(any(), value(A_REPLY), value(A_REPLY), any()) + .with(any(), value(A_REPLY), value(A_REPLY), any(), value(false)) assertThat(analyticsService.capturedEvents).containsExactly( Composer( @@ -909,7 +909,7 @@ class MessageComposerPresenterTest { @OptIn(ExperimentalCoroutinesApi::class) @Test fun `present - send messages with intentional mentions`() = runTest { - val replyMessageLambda = lambdaRecorder { _: EventId, _: String, _: String?, _: List -> + val replyMessageLambda = lambdaRecorder { _: EventId, _: String, _: String?, _: List, _: Boolean -> Result.success(Unit) } val editMessageLambda = lambdaRecorder { _: EventId?, _: TransactionId?, _: String, _: String?, _: List -> @@ -956,7 +956,7 @@ class MessageComposerPresenterTest { assert(replyMessageLambda) .isCalledOnce() - .with(any(), any(), any(), value(listOf(Mention.User(A_USER_ID_2)))) + .with(any(), any(), any(), value(listOf(Mention.User(A_USER_ID_2))), value(false)) // Check intentional mentions on edit message skipItems(1) diff --git a/features/messages/impl/src/test/kotlin/io/element/android/features/messages/impl/timeline/TimelineControllerTest.kt b/features/messages/impl/src/test/kotlin/io/element/android/features/messages/impl/timeline/TimelineControllerTest.kt index 4b6d28bd89..58cf11c4a7 100644 --- a/features/messages/impl/src/test/kotlin/io/element/android/features/messages/impl/timeline/TimelineControllerTest.kt +++ b/features/messages/impl/src/test/kotlin/io/element/android/features/messages/impl/timeline/TimelineControllerTest.kt @@ -173,6 +173,7 @@ class TimelineControllerTest { matrixRoom.givenTimelineFocusedOnEventResult(Result.success(detachedTimeline)) val sut = TimelineController(matrixRoom) sut.activeTimelineFlow().test { + sut.focusOnEvent(AN_EVENT_ID) awaitItem().also { state -> assertThat(state).isEqualTo(liveTimeline) } diff --git a/features/messages/impl/src/test/kotlin/io/element/android/features/messages/impl/timeline/TimelineViewTest.kt b/features/messages/impl/src/test/kotlin/io/element/android/features/messages/impl/timeline/TimelineViewTest.kt index 318b166a89..e66bd4c7a1 100644 --- a/features/messages/impl/src/test/kotlin/io/element/android/features/messages/impl/timeline/TimelineViewTest.kt +++ b/features/messages/impl/src/test/kotlin/io/element/android/features/messages/impl/timeline/TimelineViewTest.kt @@ -29,6 +29,7 @@ import io.element.android.features.messages.impl.typing.aTypingNotificationState import io.element.android.libraries.matrix.api.core.UserId import io.element.android.libraries.matrix.api.timeline.Timeline import io.element.android.libraries.ui.strings.CommonStrings +import io.element.android.tests.testutils.EnsureNeverCalled import io.element.android.tests.testutils.EnsureNeverCalledWithParam import io.element.android.tests.testutils.EnsureNeverCalledWithTwoParams import io.element.android.tests.testutils.EventsRecorder @@ -110,6 +111,7 @@ private fun AndroidComposeTestRule.setTimel onReactionLongClick: (emoji: String, TimelineItem.Event) -> Unit = EnsureNeverCalledWithTwoParams(), onMoreReactionsClick: (TimelineItem.Event) -> Unit = EnsureNeverCalledWithParam(), onReadReceiptClick: (TimelineItem.Event) -> Unit = EnsureNeverCalledWithParam(), + onJoinCallClick: () -> Unit = EnsureNeverCalled(), forceJumpToBottomVisibility: Boolean = false, ) { setContent { @@ -125,6 +127,7 @@ private fun AndroidComposeTestRule.setTimel onReactionLongClick = onReactionLongClick, onMoreReactionsClick = onMoreReactionsClick, onReadReceiptClick = onReadReceiptClick, + onJoinCallClick = onJoinCallClick, forceJumpToBottomVisibility = forceJumpToBottomVisibility, ) } 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 6d8fb1ad9a..ec5571df68 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 @@ -66,6 +66,7 @@ import io.element.android.libraries.matrix.api.timeline.item.event.TextMessageTy import io.element.android.libraries.matrix.api.timeline.item.event.VideoMessageType import io.element.android.libraries.matrix.api.timeline.item.event.VoiceMessageType import io.element.android.libraries.matrix.test.AN_EVENT_ID +import io.element.android.libraries.matrix.test.media.aMediaSource import io.element.android.libraries.matrix.test.permalink.FakePermalinkParser import io.element.android.libraries.matrix.ui.components.A_BLUR_HASH import io.element.android.libraries.mediaviewer.api.util.FileExtensionExtractorWithoutValidation @@ -706,9 +707,10 @@ class TimelineItemContentMessageFactoryTest { return StickerContent( body = body, info = inImageInfo, - url = inUrl + source = aMediaSource(url = inUrl), ) } + private fun createTimelineItemContentStickerFactory() = TimelineItemContentStickerFactory( fileSizeFormatter = FakeFileSizeFormatter(), fileExtensionExtractor = FileExtensionExtractorWithoutValidation() diff --git a/features/messages/impl/src/test/kotlin/io/element/android/features/messages/impl/timeline/model/InReplyToMetadataKtTest.kt b/features/messages/impl/src/test/kotlin/io/element/android/features/messages/impl/timeline/model/InReplyToMetadataKtTest.kt index c155325444..134d9ffde3 100644 --- a/features/messages/impl/src/test/kotlin/io/element/android/features/messages/impl/timeline/model/InReplyToMetadataKtTest.kt +++ b/features/messages/impl/src/test/kotlin/io/element/android/features/messages/impl/timeline/model/InReplyToMetadataKtTest.kt @@ -115,7 +115,7 @@ class InReplyToMetadataKtTest { eventContent = StickerContent( body = "body", info = anImageInfo(), - url = "url" + source = aMediaSource(url = "url") ) ).metadata() }.test { diff --git a/features/migration/impl/src/test/kotlin/io/element/android/features/migration/impl/migrations/AppMigration02Test.kt b/features/migration/impl/src/test/kotlin/io/element/android/features/migration/impl/migrations/AppMigration02Test.kt index 6bb2f5babd..3df93806d5 100644 --- a/features/migration/impl/src/test/kotlin/io/element/android/features/migration/impl/migrations/AppMigration02Test.kt +++ b/features/migration/impl/src/test/kotlin/io/element/android/features/migration/impl/migrations/AppMigration02Test.kt @@ -35,6 +35,7 @@ class AppMigration02Test { val sessionPreferencesStore = InMemorySessionPreferencesStore(isSessionVerificationSkipped = false) val sessionPreferencesStoreFactory = FakeSessionPreferencesStoreFactory( getLambda = lambdaRecorder { _, _, -> sessionPreferencesStore }, + removeLambda = lambdaRecorder { _ -> } ) val migration = AppMigration02(sessionStore = sessionStore, sessionPreferenceStoreFactory = sessionPreferencesStoreFactory) diff --git a/features/onboarding/impl/src/main/res/values-et/translations.xml b/features/onboarding/impl/src/main/res/values-et/translations.xml new file mode 100644 index 0000000000..b6aba3f925 --- /dev/null +++ b/features/onboarding/impl/src/main/res/values-et/translations.xml @@ -0,0 +1,6 @@ + + + "Logi sisse käsitsi" + "Logi sisse QR-koodi alusel" + "Loo kasutajakonto" + diff --git a/features/poll/impl/src/main/res/values-et/translations.xml b/features/poll/impl/src/main/res/values-et/translations.xml new file mode 100644 index 0000000000..2bb49f5160 --- /dev/null +++ b/features/poll/impl/src/main/res/values-et/translations.xml @@ -0,0 +1,19 @@ + + + "Lisa veel üks valik" + "Näita tulemusi alles pärast küsitluse lõppu" + "Peida hääled" + "Valik %1$d" + "Sinu muudatused jäävad salvestamata. Kas oled kindel, et soovid tagasi minna?" + "Küsimus või teema" + "Mis on küsitluse teema?" + "Loo küsitlus" + "Kas sa oled kindel, et soovid selle küsitluse kustutada?" + "Kustuta küsitlus" + "Muuda küsitlust" + "Ei leia ühtegi käimasolevat küsitlust." + "Ei leia ühtegi varasemat küsitlust." + "Käimasolev küsitlus" + "Varasem küsitlus" + "Küsitlused" + diff --git a/features/preferences/impl/src/main/res/values-et/translations.xml b/features/preferences/impl/src/main/res/values-et/translations.xml new file mode 100644 index 0000000000..59722a9580 --- /dev/null +++ b/features/preferences/impl/src/main/res/values-et/translations.xml @@ -0,0 +1,49 @@ + + + "Vali kuidas sa soovid saada teavitusi" + "Arendaja valikud" + "Selle eelistuse sisselülitamisel lisanduvad rakendusse arendaja tööks vajalikud valikud." + "Vigane url. Palun vaata, et url algaks protokolliga (http/https) ning aadress ise oleks ka õige." + "Tõuketeavituste pakkuja" + "Kui soovid Markdown-vormingut käsitsi lisada, siis lülita vormindatud teksti toimeti välja." + "Lugemisteatised" + "Kui lülitad selle valiku välja, siis mitte keegi enam ei saa sinult lugemisteatisi. Küll aga saad sina teiste kasutajate lugemisteatisi." + "Jaga oma olekut" + "Kui see eelistus on välja lülitatud, siis sa ei saa ega saada ei lugemisteatisi ega kirjutamise teavitusi" + "Selle eelistuse sisselülitamisel on võimalik ajajoonel vaadata sõnumite lähtekoodi." + "Sa pole ühtegi kasutajat blokeerinud" + "Eemaldame blokeeringu…" + "Kuvatav nimi" + "Sinu kuvatav nimi" + "Tekkis tundmatu viga ning teavet ei õnnestunud muuta." + "Profiili uuendamine ei õnnestunud" + "Muuda profiili" + "Profiil on muutmisel…" + "Täiendavad seadistused" + "Hääl- ja videokõned" + "Eelistused ei sobi omavahel" + "Et eelistusi oleks kergem leida, me oleme lihtsustanud teavituste seadistusi. Kuigi mõned varem valitud eelistused pole siin näha, siis nad kehtivad jätkuvalt. + +Kui sa jätkad muutmist, siis võivad muutuda ka need peidetud eelistused." + "Otsevestlused" + "Kohandatud seadistused eraldi igale vestlusele" + "Teavituste seadistamisel tekkis viga" + "Kõikide sõnumite korral" + "Mainimiste ja võtmesõnade alusel" + "Otsevestluste puhul teavita mind" + "Jututubades teavita mind" + "Lülita teavitused selles seadmes sisse" + "Seadistus on veel parandamata, palun proovi uuesti." + "Rühmavestlused" + "Kutsed" + "Sinu koduserver ei toeta seda funktsionaalsust krüptitud jututubades ja seega ei pruugi kõik teavitused sinuni jõuda." + "Mainimised" + "Kõik" + "Mainimiste alusel" + "Teavita mind" + "Teavita mind @jututoa puhul" + "Teavituste saamiseks palun muuda oma %1$s." + "süsteemi seadistusi" + "Süsteemi teavitused on välja lülitatud" + "Teavitused" + diff --git a/features/preferences/impl/src/main/res/values-zh/translations.xml b/features/preferences/impl/src/main/res/values-zh/translations.xml index 5a4485ed14..13e52fdcda 100644 --- a/features/preferences/impl/src/main/res/values-zh/translations.xml +++ b/features/preferences/impl/src/main/res/values-zh/translations.xml @@ -6,6 +6,7 @@ "自定义 Element 通话 URL" "为 Element 通话设置根 URL。" "URL 无效,请确保包含协议(http/https)和正确的地址。" + "通知推送提供者" "禁用富文本编辑器,手动输入 Markdown。" "已读回执" "如果关闭,您的已读回执将不会发送给别人。您仍能收到别人的已读回执。" diff --git a/features/rageshake/api/src/main/res/values-et/translations.xml b/features/rageshake/api/src/main/res/values-et/translations.xml new file mode 100644 index 0000000000..9e7315068f --- /dev/null +++ b/features/rageshake/api/src/main/res/values-et/translations.xml @@ -0,0 +1,7 @@ + + + "%1$s jooksis kokku viimatu kui seda kasutasid. Kas tahaksid selle kohta meile aruande saata?" + "Tundub, et sa raputad oma nutiseadet ägedalt. Kas sa soovid saata meile veateadet?" + "Seadme äge raputamine" + "Tuvastamise lävi" + diff --git a/features/rageshake/impl/src/main/res/values-et/translations.xml b/features/rageshake/impl/src/main/res/values-et/translations.xml new file mode 100644 index 0000000000..92e0bf52c5 --- /dev/null +++ b/features/rageshake/impl/src/main/res/values-et/translations.xml @@ -0,0 +1,17 @@ + + + "Lisa ekraanitõmmis" + "Kui sul on täiendavaid küsimusi, siis võid minuga ühendust võtta." + "Võta minuga ühendust" + "Muuda ekraanitõmmist" + "Palun kirjelda juhtunut. Mida sina tegid? Mis sinu arvates pidi juhtuma? Mis tegelikult juhtus? Palun kirjelda kõike seda võimalikult üksikasjalikult." + "Palun kirjelda probleemi…" + "Kui vähegi võimalik, siis kirjuta inglise keeles." + "Kirjeldus on liiga lühike. Palun jaga täpsemat teavet selle kohta, mis juhtus. Tänud juba ette!" + "Saada krahhilogid" + "Luba logide saatmine" + "Saada ekraanitõmmis" + "Tõhusama veaotsingu nimel lisame sinu veateatele logid. Kui sa seda ei soovi, siis lülita antud valik välja." + "%1$s jooksis kokku viimatu kui seda kasutasid. Kas tahaksid selle kohta meile aruande saata?" + "Vaata logisid" + diff --git a/features/roomdetails/impl/build.gradle.kts b/features/roomdetails/impl/build.gradle.kts index 037165e4ee..b90a0e679d 100644 --- a/features/roomdetails/impl/build.gradle.kts +++ b/features/roomdetails/impl/build.gradle.kts @@ -56,7 +56,7 @@ dependencies { api(projects.libraries.usersearch.api) api(projects.services.apperror.api) implementation(libs.coil.compose) - implementation(projects.features.call) + implementation(projects.features.call.api) implementation(projects.features.createroom.api) implementation(projects.features.leaveroom.api) implementation(projects.features.userprofile.shared) diff --git a/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/RoomDetailsFlowNode.kt b/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/RoomDetailsFlowNode.kt index 9b3cb0f8bc..4a34d64ad0 100644 --- a/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/RoomDetailsFlowNode.kt +++ b/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/RoomDetailsFlowNode.kt @@ -16,7 +16,6 @@ package io.element.android.features.roomdetails.impl -import android.content.Context import android.os.Parcelable import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier @@ -30,8 +29,8 @@ import dagger.assisted.Assisted import dagger.assisted.AssistedInject import im.vector.app.features.analytics.plan.Interaction import io.element.android.anvilannotations.ContributesNode -import io.element.android.features.call.CallType -import io.element.android.features.call.ui.ElementCallActivity +import io.element.android.features.call.api.CallType +import io.element.android.features.call.api.ElementCallEntryPoint import io.element.android.features.poll.api.history.PollHistoryEntryPoint import io.element.android.features.roomdetails.api.RoomDetailsEntryPoint import io.element.android.features.roomdetails.impl.edit.RoomDetailsEditNode @@ -46,7 +45,6 @@ import io.element.android.libraries.architecture.BackstackView import io.element.android.libraries.architecture.BaseFlowNode import io.element.android.libraries.architecture.createNode import io.element.android.libraries.core.mimetype.MimeTypes -import io.element.android.libraries.di.ApplicationContext import io.element.android.libraries.di.RoomScope import io.element.android.libraries.matrix.api.core.RoomId import io.element.android.libraries.matrix.api.core.UserId @@ -62,8 +60,8 @@ import kotlinx.parcelize.Parcelize class RoomDetailsFlowNode @AssistedInject constructor( @Assisted buildContext: BuildContext, @Assisted plugins: List, - @ApplicationContext private val context: Context, private val pollHistoryEntryPoint: PollHistoryEntryPoint, + private val elementCallEntryPoint: ElementCallEntryPoint, private val room: MatrixRoom, private val analyticsService: AnalyticsService, ) : BaseFlowNode( @@ -147,7 +145,7 @@ class RoomDetailsFlowNode @AssistedInject constructor( roomId = room.roomId, ) analyticsService.captureInteraction(Interaction.Name.MobileRoomCallButton) - ElementCallActivity.start(context, inputs) + elementCallEntryPoint.startCall(inputs) } } createNode(buildContext, listOf(roomDetailsCallback)) @@ -195,7 +193,7 @@ class RoomDetailsFlowNode @AssistedInject constructor( } override fun onStartCall(dmRoomId: RoomId) { - ElementCallActivity.start(context, CallType.RoomCall(sessionId = room.sessionId, roomId = dmRoomId)) + elementCallEntryPoint.startCall(CallType.RoomCall(roomId = dmRoomId, sessionId = room.sessionId)) } } val plugins = listOf(RoomMemberDetailsNode.RoomMemberDetailsInput(navTarget.roomMemberId), callback) diff --git a/features/roomdetails/impl/src/main/res/values-be/translations.xml b/features/roomdetails/impl/src/main/res/values-be/translations.xml index 90f9a983af..7cbf1fcd6d 100644 --- a/features/roomdetails/impl/src/main/res/values-be/translations.xml +++ b/features/roomdetails/impl/src/main/res/values-be/translations.xml @@ -78,7 +78,7 @@ "Яны змогуць зноў далучыцца да гэтага пакоя, калі іх запросяць." "Разблакіраваць удзельніка" "Прагляд профілю" - "Заблакіраваны" + "Заблакіраваныя" "Удзельнікі" "У чаканні" "Выдаленне %1$s …" diff --git a/features/roomdetails/impl/src/main/res/values-et/translations.xml b/features/roomdetails/impl/src/main/res/values-et/translations.xml new file mode 100644 index 0000000000..7934b165d6 --- /dev/null +++ b/features/roomdetails/impl/src/main/res/values-et/translations.xml @@ -0,0 +1,73 @@ + + + "Teavituste seadistamisel tekkis viga" + "Sinu koduserver ei toeta seda funktsionaalsust krüptitud jututubades ja seega ei pruugi kõik teavitused sinuni jõuda." + "Küsitlused" + "Vaid peakasutajad" + "Suhtluskeelu seadmine" + "Sõnumite kustutamine" + "Kõik" + "Kutsete saatmine" + "Jututoas osalejate modereerimine" + "Sõnumid ja sisu" + "Peakasutajad ja moderaatorid" + "Osalejate eemaldamine jututoast" + "Jututoa tunnuspildi muutmine" + "Jututoa üksikasjad" + "Jututoa nime muutmine" + "Jututoa teema muutmine" + "Sõnumite saatmine" + "Peakasutajad" + "Moderaatorid" + "Lisa teema" + "Sa juba oled jututoa liige" + "Sa juba oled kutse saanud" + "Krüptitud jututuba" + "Krüptimata jututuba" + "Avalik jututuba" + "Muuda jututuba" + "Tekkis tundmatu viga ja andmed jäid muutmata." + "Jututoa andmete muutmine ei õnnestu" + "Sõnumid on turvatud krüptimise abil. Ainult sinul ja sõnumite saajatel on vajalikud võtmed nende lugemiseks." + "Sõnumite krüptimine on kasutusel" + "Teavituste seadistuste laadimisel tekkis viga." + "Selle jututoa summutamine ei õnnestunud. Palun proovi uuesti." + "Selle jututoa summutamise eemaldamine ei õnnestunud. Palun proovi uuesti." + "Kutsu osalejaid" + "Lahku vestlusest" + "Lahku jututoast" + "Kohandatud" + "Vaikimisi" + "Teavitused" + "Rollid ja õigused" + "Jututoa nimi" + "Turvalisus" + "Jaga jututuba" + "Jututoa teave" + "Teema" + "Uuendame jututuba…" + + "%1$d osaleja" + "%1$d osalejat" + + "Eemalda kasutaja jututoast" + "Peakasutaja" + "Moderaator" + "Vaikimisi seadistuste taastamine ei õnnestunud. Palun proovi uuesti." + "Seadistuste muutmine ei õnnestunud. Palun proovi uuesti." + "Mainimiste ja võtmesõnade alusel" + "Peakasutajad" + "Muuda minu rolli" + "Muuda tavaliikmeks" + "Muuda moderaatoriks" + "Jututoas osalejate modereerimine" + "Sõnumid ja sisu" + "Moderaatorid" + "Õigused" + "Lähtesta õigused" + "Kui lähtestad õigused, siis praegune õiguste kombinatsioon läheb kaotsi." + "Kas lähtestame õigused?" + "Rollid" + "Jututoa üksikasjad" + "Rollid ja õigused" + diff --git a/features/roomdetails/impl/src/main/res/values-zh/translations.xml b/features/roomdetails/impl/src/main/res/values-zh/translations.xml index b4314fa71a..c6cf9890b3 100644 --- a/features/roomdetails/impl/src/main/res/values-zh/translations.xml +++ b/features/roomdetails/impl/src/main/res/values-zh/translations.xml @@ -35,6 +35,9 @@ "添加主题" "已经是成员" "已邀请" + "加密的" + "未加密的" + "公开房间" "编辑聊天室" "出现未知错误,无法更改信息。" "无法更新聊天室" diff --git a/features/roomdirectory/impl/src/main/res/values-et/translations.xml b/features/roomdirectory/impl/src/main/res/values-et/translations.xml new file mode 100644 index 0000000000..e31e0695e1 --- /dev/null +++ b/features/roomdirectory/impl/src/main/res/values-et/translations.xml @@ -0,0 +1,4 @@ + + + "Andmeid ei õnnestunud laadida" + diff --git a/features/roomlist/impl/src/main/res/values-et/translations.xml b/features/roomlist/impl/src/main/res/values-et/translations.xml new file mode 100644 index 0000000000..eaa92cd437 --- /dev/null +++ b/features/roomlist/impl/src/main/res/values-et/translations.xml @@ -0,0 +1,7 @@ + + + "Sisesta oma taastevõti" + "Inimesed" + "Tundub, et kasutad uut seadet. Oma krüptitud sõnumite lugemiseks verifitseeri ta mõne muu oma seadmega." + "Verifitseeri, et see oled sina" + diff --git a/features/roomlist/impl/src/main/res/values-zh/translations.xml b/features/roomlist/impl/src/main/res/values-zh/translations.xml index 0fa5542b5d..053de06f1a 100644 --- a/features/roomlist/impl/src/main/res/values-zh/translations.xml +++ b/features/roomlist/impl/src/main/res/values-zh/translations.xml @@ -22,7 +22,7 @@ "低优先级" "您可以取消选择过滤器以查看其他对话" "您没有关于此选项的聊天" - "人" + "用户" "目前您还没有私信" "聊天室" "您尚未进入任何聊天室" diff --git a/features/securebackup/impl/build.gradle.kts b/features/securebackup/impl/build.gradle.kts index b1060dcd0e..64c207c798 100644 --- a/features/securebackup/impl/build.gradle.kts +++ b/features/securebackup/impl/build.gradle.kts @@ -40,7 +40,6 @@ dependencies { implementation(projects.anvilannotations) implementation(projects.appconfig) - implementation(projects.libraries.androidutils) implementation(projects.libraries.core) implementation(projects.libraries.androidutils) implementation(projects.libraries.architecture) diff --git a/features/securebackup/impl/src/main/kotlin/io/element/android/features/securebackup/impl/createkey/CreateNewRecoveryKeyView.kt b/features/securebackup/impl/src/main/kotlin/io/element/android/features/securebackup/impl/createkey/CreateNewRecoveryKeyView.kt index 202766e4ac..ab19c0b522 100644 --- a/features/securebackup/impl/src/main/kotlin/io/element/android/features/securebackup/impl/createkey/CreateNewRecoveryKeyView.kt +++ b/features/securebackup/impl/src/main/kotlin/io/element/android/features/securebackup/impl/createkey/CreateNewRecoveryKeyView.kt @@ -70,7 +70,10 @@ private fun Content(desktopApplicationName: String) { add(AnnotatedString(stringResource(R.string.screen_create_new_recovery_key_list_item_2))) add( annotatedTextWithBold( - text = stringResource(R.string.screen_create_new_recovery_key_list_item_3), + text = stringResource( + id = R.string.screen_create_new_recovery_key_list_item_3, + stringResource(R.string.screen_create_new_recovery_key_list_item_3_reset_all) + ), boldText = stringResource(R.string.screen_create_new_recovery_key_list_item_3_reset_all) ) ) diff --git a/features/securebackup/impl/src/main/res/values-et/translations.xml b/features/securebackup/impl/src/main/res/values-et/translations.xml new file mode 100644 index 0000000000..8aa23adc02 --- /dev/null +++ b/features/securebackup/impl/src/main/res/values-et/translations.xml @@ -0,0 +1,41 @@ + + + "Lülita võtmete varundamine välja" + "Lülita võtmete varundamine sisse" + "Varundamine tagab, et sinu sõnumite ajalugu on alati loetav. %1$s." + "Varundus" + "Muuda taastevõtit" + "Sisesta oma taastevõti" + "Sinu vestluste krüptograafia varukoopia pole hetkel enam sünkroonis." + "Seadista krüptovõtmete varundus" + "Säilita ligipääs oma krüptitud sõnumitele ka siis, kui sa kaotad kõik oma seadmed ja/või logid kõikjal välja rakendusest %1$s." + "Kas sa oled kindel, et soovid varunduse välja lülitada?" + "Kui oled vana taastevõtme kaotanud, siis loo uus. Peale seda muudatust vana taastevõti enam ei tööta." + "Loo uus taastevõti" + "Palun hoia taastevõtit turvaliselt, näiteks vana kooli seifis või digitaalses salasõnalaekas" + "Taastevõti on muudetud" + "Kas muudame taastevõtme?" + "Loo uus taastevõti" + "Palun vaata, et keegi teine ei näeks seda ekraanivaadet!" + "Kinnitamaks ligipääsu sinu vestluse varukoopiale, palun proovi uuesti" + "Vigane taastevõti" + "Kui sul on turvavõti või turvafraas, siis need toimivad ka." + "Taastevõti või turvafraas" + "Sisesta…" + "Kas sa oled taastevõtme kaotanud?" + "Taastevõti on kinnitatud" + "Sisesta oma taastevõti" + "Taastevõti on kopeeritud lõikelauale" + "Loome…" + "Salvesta taastevõti" + "Palun märgi taastevõti üles ja hoia seda turvaliselt, näiteks vana kooli seifis või digitaalses salasõnalaekas" + "Taastevõtme kopeerimiseks puuduta" + "Salvesta oma taastevõti" + "Peale seda sammu sul pole enam ligipääsu oma taastevõtmele." + "Kas sa oled oma taastevõtme talletanud?" + "Sinu vestluste varundus on krüptitud taastevõtmega. Kui peale muutusi peaks vaja olema uut taastevõtit, siis palun kasuta valikut „Loo taastevõti“" + "Loo oma taastevõti" + "Palun hoia taastevõtit turvaliselt, näiteks vana kooli seifis või digitaalses salasõnalaekas" + "Andmete taastamise seadistamine õnnestus" + "Seadista andmete taastamine" + diff --git a/features/share/api/build.gradle.kts b/features/share/api/build.gradle.kts new file mode 100644 index 0000000000..14528434a6 --- /dev/null +++ b/features/share/api/build.gradle.kts @@ -0,0 +1,29 @@ +/* + * Copyright (c) 2023 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") + id("kotlin-parcelize") +} + +android { + namespace = "io.element.android.features.share.api" +} + +dependencies { + implementation(projects.libraries.architecture) + implementation(projects.libraries.matrix.api) +} diff --git a/features/share/api/src/main/kotlin/io/element/android/features/share/api/ShareEntryPoint.kt b/features/share/api/src/main/kotlin/io/element/android/features/share/api/ShareEntryPoint.kt new file mode 100644 index 0000000000..0861e00ca2 --- /dev/null +++ b/features/share/api/src/main/kotlin/io/element/android/features/share/api/ShareEntryPoint.kt @@ -0,0 +1,41 @@ +/* + * Copyright (c) 2024 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. + */ + +package io.element.android.features.share.api + +import android.content.Intent +import com.bumble.appyx.core.modality.BuildContext +import com.bumble.appyx.core.node.Node +import com.bumble.appyx.core.plugin.Plugin +import io.element.android.libraries.architecture.FeatureEntryPoint +import io.element.android.libraries.architecture.NodeInputs +import io.element.android.libraries.matrix.api.core.RoomId + +interface ShareEntryPoint : FeatureEntryPoint { + data class Params(val intent: Intent) : NodeInputs + + fun nodeBuilder(parentNode: Node, buildContext: BuildContext): NodeBuilder + + interface Callback : Plugin { + fun onDone(roomIds: List) + } + + interface NodeBuilder { + fun params(params: Params): NodeBuilder + fun callback(callback: Callback): NodeBuilder + fun build(): Node + } +} diff --git a/features/share/api/src/main/kotlin/io/element/android/features/share/api/ShareService.kt b/features/share/api/src/main/kotlin/io/element/android/features/share/api/ShareService.kt new file mode 100644 index 0000000000..c46f5b3215 --- /dev/null +++ b/features/share/api/src/main/kotlin/io/element/android/features/share/api/ShareService.kt @@ -0,0 +1,23 @@ +/* + * Copyright (c) 2024 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. + */ + +package io.element.android.features.share.api + +import kotlinx.coroutines.CoroutineScope + +interface ShareService { + fun observeFeatureFlag(coroutineScope: CoroutineScope) +} diff --git a/features/share/impl/build.gradle.kts b/features/share/impl/build.gradle.kts new file mode 100644 index 0000000000..c180c5d29a --- /dev/null +++ b/features/share/impl/build.gradle.kts @@ -0,0 +1,70 @@ +/* + * Copyright (c) 2023 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-compose-library") + alias(libs.plugins.ksp) + alias(libs.plugins.anvil) + id("kotlin-parcelize") +} + +android { + namespace = "io.element.android.features.share.impl" + + testOptions { + unitTests { + isIncludeAndroidResources = true + } + } +} + +anvil { + generateDaggerFactories.set(true) +} + +dependencies { + anvil(projects.anvilcodegen) + implementation(projects.anvilannotations) + + implementation(projects.appconfig) + implementation(projects.libraries.androidutils) + implementation(projects.libraries.core) + implementation(projects.libraries.architecture) + implementation(projects.libraries.featureflag.api) + implementation(projects.libraries.matrix.api) + implementation(projects.libraries.matrixui) + implementation(projects.libraries.designsystem) + implementation(projects.libraries.mediaupload.api) + implementation(projects.libraries.roomselect.api) + implementation(projects.libraries.uiStrings) + implementation(projects.libraries.testtags) + api(libs.statemachine) + api(projects.features.share.api) + + testImplementation(libs.test.junit) + testImplementation(libs.coroutines.test) + testImplementation(libs.molecule.runtime) + testImplementation(libs.test.truth) + testImplementation(libs.test.turbine) + testImplementation(libs.test.robolectric) + testImplementation(libs.androidx.compose.ui.test.junit) + testImplementation(projects.libraries.matrix.test) + testImplementation(projects.libraries.mediaupload.test) + testImplementation(projects.tests.testutils) + testReleaseImplementation(libs.androidx.compose.ui.test.manifest) + + ksp(libs.showkase.processor) +} diff --git a/features/share/impl/src/main/kotlin/io/element/android/features/share/impl/DefaultShareEntryPoint.kt b/features/share/impl/src/main/kotlin/io/element/android/features/share/impl/DefaultShareEntryPoint.kt new file mode 100644 index 0000000000..95859cc8b0 --- /dev/null +++ b/features/share/impl/src/main/kotlin/io/element/android/features/share/impl/DefaultShareEntryPoint.kt @@ -0,0 +1,49 @@ +/* + * Copyright (c) 2024 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. + */ + +package io.element.android.features.share.impl + +import com.bumble.appyx.core.modality.BuildContext +import com.bumble.appyx.core.node.Node +import com.bumble.appyx.core.plugin.Plugin +import com.squareup.anvil.annotations.ContributesBinding +import io.element.android.features.share.api.ShareEntryPoint +import io.element.android.libraries.architecture.createNode +import io.element.android.libraries.di.SessionScope +import javax.inject.Inject + +@ContributesBinding(SessionScope::class) +class DefaultShareEntryPoint @Inject constructor() : ShareEntryPoint { + override fun nodeBuilder(parentNode: Node, buildContext: BuildContext): ShareEntryPoint.NodeBuilder { + val plugins = ArrayList() + + return object : ShareEntryPoint.NodeBuilder { + override fun params(params: ShareEntryPoint.Params): ShareEntryPoint.NodeBuilder { + plugins += ShareNode.Inputs(intent = params.intent) + return this + } + + override fun callback(callback: ShareEntryPoint.Callback): ShareEntryPoint.NodeBuilder { + plugins += callback + return this + } + + override fun build(): Node { + return parentNode.createNode(buildContext, plugins) + } + } + } +} diff --git a/features/share/impl/src/main/kotlin/io/element/android/features/share/impl/DefaultShareService.kt b/features/share/impl/src/main/kotlin/io/element/android/features/share/impl/DefaultShareService.kt new file mode 100644 index 0000000000..2ea15a5d71 --- /dev/null +++ b/features/share/impl/src/main/kotlin/io/element/android/features/share/impl/DefaultShareService.kt @@ -0,0 +1,83 @@ +/* + * Copyright (c) 2024 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. + */ + +package io.element.android.features.share.impl + +import android.content.ComponentName +import android.content.Context +import android.content.pm.PackageManager +import com.squareup.anvil.annotations.ContributesBinding +import io.element.android.features.share.api.ShareService +import io.element.android.libraries.di.AppScope +import io.element.android.libraries.di.ApplicationContext +import io.element.android.libraries.featureflag.api.FeatureFlagService +import io.element.android.libraries.featureflag.api.FeatureFlags +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.flow.launchIn +import kotlinx.coroutines.flow.onEach +import timber.log.Timber +import javax.inject.Inject + +@ContributesBinding(AppScope::class) +class DefaultShareService @Inject constructor( + private val featureFlagService: FeatureFlagService, + @ApplicationContext private val context: Context, +) : ShareService { + override fun observeFeatureFlag(coroutineScope: CoroutineScope) { + val shareActivityComponent = getShareActivityComponent() + ?: return Unit.also { + Timber.w("ShareActivity not found") + } + featureFlagService.isFeatureEnabledFlow(FeatureFlags.IncomingShare) + .onEach { enabled -> + shareActivityComponent.enableOrDisable(enabled) + } + .launchIn(coroutineScope) + } + + private fun getShareActivityComponent(): ComponentName? { + return context.packageManager + .getPackageInfo( + context.packageName, + PackageManager.GET_ACTIVITIES or PackageManager.MATCH_DISABLED_COMPONENTS + ) + .activities + .firstOrNull { it.name.endsWith(".ShareActivity") } + ?.let { shareActivityInfo -> + ComponentName( + shareActivityInfo.packageName, + shareActivityInfo.name, + ) + } + } + + private fun ComponentName.enableOrDisable(enabled: Boolean) { + val state = if (enabled) { + PackageManager.COMPONENT_ENABLED_STATE_DEFAULT + } else { + PackageManager.COMPONENT_ENABLED_STATE_DISABLED + } + try { + context.packageManager.setComponentEnabledSetting( + this, + state, + PackageManager.DONT_KILL_APP, + ) + } catch (e: Exception) { + Timber.e(e, "Failed to enable or disable the component") + } + } +} diff --git a/features/share/impl/src/main/kotlin/io/element/android/features/share/impl/ShareEvents.kt b/features/share/impl/src/main/kotlin/io/element/android/features/share/impl/ShareEvents.kt new file mode 100644 index 0000000000..9fe24660ec --- /dev/null +++ b/features/share/impl/src/main/kotlin/io/element/android/features/share/impl/ShareEvents.kt @@ -0,0 +1,21 @@ +/* + * Copyright (c) 2024 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. + */ + +package io.element.android.features.share.impl + +sealed interface ShareEvents { + data object ClearError : ShareEvents +} diff --git a/features/share/impl/src/main/kotlin/io/element/android/features/share/impl/ShareIntentHandler.kt b/features/share/impl/src/main/kotlin/io/element/android/features/share/impl/ShareIntentHandler.kt new file mode 100644 index 0000000000..9eaaf2b8f6 --- /dev/null +++ b/features/share/impl/src/main/kotlin/io/element/android/features/share/impl/ShareIntentHandler.kt @@ -0,0 +1,147 @@ +/* + * Copyright (c) 2024 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. + */ + +package io.element.android.features.share.impl + +import android.content.ComponentName +import android.content.Context +import android.content.Intent +import android.content.pm.PackageManager +import android.content.pm.ResolveInfo +import android.net.Uri +import android.os.Build +import androidx.core.content.IntentCompat +import com.squareup.anvil.annotations.ContributesBinding +import io.element.android.libraries.androidutils.compat.queryIntentActivitiesCompat +import io.element.android.libraries.core.mimetype.MimeTypes +import io.element.android.libraries.core.mimetype.MimeTypes.isMimeTypeAny +import io.element.android.libraries.core.mimetype.MimeTypes.isMimeTypeApplication +import io.element.android.libraries.core.mimetype.MimeTypes.isMimeTypeAudio +import io.element.android.libraries.core.mimetype.MimeTypes.isMimeTypeFile +import io.element.android.libraries.core.mimetype.MimeTypes.isMimeTypeImage +import io.element.android.libraries.core.mimetype.MimeTypes.isMimeTypeText +import io.element.android.libraries.core.mimetype.MimeTypes.isMimeTypeVideo +import io.element.android.libraries.di.AppScope +import io.element.android.libraries.di.ApplicationContext +import timber.log.Timber +import javax.inject.Inject + +interface ShareIntentHandler { + data class UriToShare( + val uri: Uri, + val mimeType: String, + ) + + /** + * This methods aims to handle incoming share intents. + * + * @return true if it can handle the intent data, false otherwise + */ + suspend fun handleIncomingShareIntent( + intent: Intent, + onUris: suspend (List) -> Boolean, + onPlainText: suspend (String) -> Boolean, + ): Boolean +} + +@ContributesBinding(AppScope::class) +class DefaultShareIntentHandler @Inject constructor( + @ApplicationContext private val context: Context, +) : ShareIntentHandler { + override suspend fun handleIncomingShareIntent( + intent: Intent, + onUris: suspend (List) -> Boolean, + onPlainText: suspend (String) -> Boolean, + ): Boolean { + val type = intent.resolveType(context) ?: return false + return when { + type == MimeTypes.PlainText -> handlePlainText(intent, onPlainText) + type.isMimeTypeImage() || + type.isMimeTypeVideo() || + type.isMimeTypeAudio() || + type.isMimeTypeApplication() || + type.isMimeTypeFile() || + type.isMimeTypeText() || + type.isMimeTypeAny() -> { + val uris = getIncomingUris(intent, type) + val result = onUris(uris) + revokeUriPermissions(uris.map { it.uri }) + result + } + else -> false + } + } + + private suspend fun handlePlainText(intent: Intent, onPlainText: suspend (String) -> Boolean): Boolean { + val content = intent.getCharSequenceExtra(Intent.EXTRA_TEXT)?.toString() + return if (content?.isNotEmpty() == true) { + onPlainText(content) + } else { + false + } + } + + /** + * Use this function to retrieve files which are shared from another application or internally + * by using android.intent.action.SEND or android.intent.action.SEND_MULTIPLE actions. + */ + private fun getIncomingUris(intent: Intent, type: String): List { + val uriList = mutableListOf() + if (intent.action == Intent.ACTION_SEND) { + IntentCompat.getParcelableExtra(intent, Intent.EXTRA_STREAM, Uri::class.java) + ?.let { uriList.add(it) } + } else if (intent.action == Intent.ACTION_SEND_MULTIPLE) { + IntentCompat.getParcelableArrayListExtra(intent, Intent.EXTRA_STREAM, Uri::class.java) + ?.let { uriList.addAll(it) } + } + val resInfoList: List = context.packageManager.queryIntentActivitiesCompat(intent, PackageManager.MATCH_DEFAULT_ONLY) + uriList.forEach { uri -> + resInfoList.forEach resolve@{ resolveInfo -> + val packageName: String = resolveInfo.activityInfo.packageName + // Replace implicit intent by an explicit to fix crash on some devices like Xiaomi. + // see https://juejin.cn/post/7031736325422186510 + try { + context.grantUriPermission(packageName, uri, Intent.FLAG_GRANT_READ_URI_PERMISSION) + } catch (e: Exception) { + Timber.w(e, "Unable to grant Uri permission") + return@resolve + } + intent.action = null + intent.component = ComponentName(packageName, resolveInfo.activityInfo.name) + } + } + return uriList.map { uri -> + ShareIntentHandler.UriToShare( + uri = uri, + mimeType = type + ) + } + } + + private fun revokeUriPermissions(uris: List) { + uris.forEach { uri -> + try { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { + context.revokeUriPermission(context.packageName, uri, Intent.FLAG_GRANT_READ_URI_PERMISSION) + } else { + context.revokeUriPermission(uri, Intent.FLAG_GRANT_READ_URI_PERMISSION) + } + } catch (e: Exception) { + Timber.w(e, "Unable to revoke Uri permission") + } + } + } +} diff --git a/features/share/impl/src/main/kotlin/io/element/android/features/share/impl/ShareNode.kt b/features/share/impl/src/main/kotlin/io/element/android/features/share/impl/ShareNode.kt new file mode 100644 index 0000000000..ad360b09ea --- /dev/null +++ b/features/share/impl/src/main/kotlin/io/element/android/features/share/impl/ShareNode.kt @@ -0,0 +1,101 @@ +/* + * Copyright (c) 2024 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. + */ + +package io.element.android.features.share.impl + +import android.content.Intent +import android.os.Parcelable +import androidx.compose.foundation.layout.Box +import androidx.compose.runtime.Composable +import androidx.compose.ui.Modifier +import com.bumble.appyx.core.composable.Children +import com.bumble.appyx.core.modality.BuildContext +import com.bumble.appyx.core.navigation.model.permanent.PermanentNavModel +import com.bumble.appyx.core.node.Node +import com.bumble.appyx.core.node.ParentNode +import com.bumble.appyx.core.plugin.Plugin +import dagger.assisted.Assisted +import dagger.assisted.AssistedInject +import io.element.android.anvilannotations.ContributesNode +import io.element.android.features.share.api.ShareEntryPoint +import io.element.android.libraries.architecture.NodeInputs +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.roomselect.api.RoomSelectEntryPoint +import io.element.android.libraries.roomselect.api.RoomSelectMode +import kotlinx.parcelize.Parcelize + +@ContributesNode(SessionScope::class) +class ShareNode @AssistedInject constructor( + @Assisted buildContext: BuildContext, + @Assisted plugins: List, + presenterFactory: SharePresenter.Factory, + private val roomSelectEntryPoint: RoomSelectEntryPoint, +) : ParentNode( + navModel = PermanentNavModel( + navTargets = setOf(NavTarget), + savedStateMap = buildContext.savedStateMap, + ), + buildContext = buildContext, + plugins = plugins, +) { + @Parcelize + object NavTarget : Parcelable + + data class Inputs(val intent: Intent) : NodeInputs + + private val inputs = inputs() + private val presenter = presenterFactory.create(inputs.intent) + private val callbacks = plugins.filterIsInstance() + + override fun resolve(navTarget: NavTarget, buildContext: BuildContext): Node { + val callback = object : RoomSelectEntryPoint.Callback { + override fun onRoomSelected(roomIds: List) { + presenter.onRoomSelected(roomIds) + } + + override fun onCancel() { + navigateUp() + } + } + + return roomSelectEntryPoint.nodeBuilder(this, buildContext) + .callback(callback) + .params(RoomSelectEntryPoint.Params(mode = RoomSelectMode.Share)) + .build() + } + + @Composable + override fun View(modifier: Modifier) { + Box(modifier = modifier) { + // Will render to room select screen + Children( + navModel = navModel, + ) + + val state = presenter.present() + ShareView( + state = state, + onShareSuccess = ::onShareSuccess, + ) + } + } + + private fun onShareSuccess(roomIds: List) { + callbacks.forEach { it.onDone(roomIds) } + } +} diff --git a/features/share/impl/src/main/kotlin/io/element/android/features/share/impl/SharePresenter.kt b/features/share/impl/src/main/kotlin/io/element/android/features/share/impl/SharePresenter.kt new file mode 100644 index 0000000000..c0ebb4ee16 --- /dev/null +++ b/features/share/impl/src/main/kotlin/io/element/android/features/share/impl/SharePresenter.kt @@ -0,0 +1,115 @@ +/* + * Copyright (c) 2024 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. + */ + +package io.element.android.features.share.impl + +import android.content.Intent +import androidx.compose.runtime.Composable +import androidx.compose.runtime.MutableState +import androidx.compose.runtime.mutableStateOf +import dagger.assisted.Assisted +import dagger.assisted.AssistedFactory +import dagger.assisted.AssistedInject +import io.element.android.libraries.architecture.AsyncAction +import io.element.android.libraries.architecture.Presenter +import io.element.android.libraries.architecture.runCatchingUpdatingState +import io.element.android.libraries.core.bool.orFalse +import io.element.android.libraries.matrix.api.MatrixClient +import io.element.android.libraries.matrix.api.core.RoomId +import io.element.android.libraries.mediaupload.api.MediaPreProcessor +import io.element.android.libraries.mediaupload.api.MediaSender +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.launch + +class SharePresenter @AssistedInject constructor( + @Assisted private val intent: Intent, + private val appCoroutineScope: CoroutineScope, + private val shareIntentHandler: ShareIntentHandler, + private val matrixClient: MatrixClient, + private val mediaPreProcessor: MediaPreProcessor, +) : Presenter { + @AssistedFactory + interface Factory { + fun create(intent: Intent): SharePresenter + } + + private val shareActionState: MutableState>> = mutableStateOf(AsyncAction.Uninitialized) + + fun onRoomSelected(roomIds: List) { + appCoroutineScope.share(intent, roomIds) + } + + @Composable + override fun present(): ShareState { + fun handleEvents(event: ShareEvents) { + when (event) { + ShareEvents.ClearError -> shareActionState.value = AsyncAction.Uninitialized + } + } + + return ShareState( + shareAction = shareActionState.value, + eventSink = { handleEvents(it) } + ) + } + + private fun CoroutineScope.share( + intent: Intent, + roomIds: List, + ) = launch { + suspend { + val result = shareIntentHandler.handleIncomingShareIntent( + intent, + onUris = { filesToShare -> + if (filesToShare.isEmpty()) { + false + } else { + roomIds + .map { roomId -> + val room = matrixClient.getRoom(roomId) ?: return@map false + val mediaSender = MediaSender(preProcessor = mediaPreProcessor, room = room) + filesToShare + .map { fileToShare -> + mediaSender.sendMedia( + uri = fileToShare.uri, + mimeType = fileToShare.mimeType, + compressIfPossible = true, + ).isSuccess + } + .all { it } + } + .all { it } + } + }, + onPlainText = { text -> + roomIds + .map { roomId -> + matrixClient.getRoom(roomId)?.sendMessage( + body = text, + htmlBody = null, + mentions = emptyList(), + )?.isSuccess.orFalse() + } + .all { it } + } + ) + if (!result) { + error("Failed to handle incoming share intent") + } + roomIds + }.runCatchingUpdatingState(shareActionState) + } +} diff --git a/features/share/impl/src/main/kotlin/io/element/android/features/share/impl/ShareState.kt b/features/share/impl/src/main/kotlin/io/element/android/features/share/impl/ShareState.kt new file mode 100644 index 0000000000..b7e3510033 --- /dev/null +++ b/features/share/impl/src/main/kotlin/io/element/android/features/share/impl/ShareState.kt @@ -0,0 +1,25 @@ +/* + * Copyright (c) 2024 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. + */ + +package io.element.android.features.share.impl + +import io.element.android.libraries.architecture.AsyncAction +import io.element.android.libraries.matrix.api.core.RoomId + +data class ShareState( + val shareAction: AsyncAction>, + val eventSink: (ShareEvents) -> Unit +) diff --git a/features/share/impl/src/main/kotlin/io/element/android/features/share/impl/ShareStateProvider.kt b/features/share/impl/src/main/kotlin/io/element/android/features/share/impl/ShareStateProvider.kt new file mode 100644 index 0000000000..a8b766f238 --- /dev/null +++ b/features/share/impl/src/main/kotlin/io/element/android/features/share/impl/ShareStateProvider.kt @@ -0,0 +1,47 @@ +/* + * Copyright (c) 2024 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. + */ + +package io.element.android.features.share.impl + +import androidx.compose.ui.tooling.preview.PreviewParameterProvider +import io.element.android.libraries.architecture.AsyncAction +import io.element.android.libraries.matrix.api.core.RoomId + +open class ShareStateProvider : PreviewParameterProvider { + override val values: Sequence + get() = sequenceOf( + aShareState(), + aShareState( + shareAction = AsyncAction.Loading, + ), + aShareState( + shareAction = AsyncAction.Success( + listOf(RoomId("!room2:domain")), + ) + ), + aShareState( + shareAction = AsyncAction.Failure(Throwable("error")), + ), + ) +} + +fun aShareState( + shareAction: AsyncAction> = AsyncAction.Uninitialized, + eventSink: (ShareEvents) -> Unit = {} +) = ShareState( + shareAction = shareAction, + eventSink = eventSink +) diff --git a/features/share/impl/src/main/kotlin/io/element/android/features/share/impl/ShareView.kt b/features/share/impl/src/main/kotlin/io/element/android/features/share/impl/ShareView.kt new file mode 100644 index 0000000000..1bc3e2325b --- /dev/null +++ b/features/share/impl/src/main/kotlin/io/element/android/features/share/impl/ShareView.kt @@ -0,0 +1,49 @@ +/* + * Copyright (c) 2024 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. + */ + +package io.element.android.features.share.impl + +import androidx.compose.runtime.Composable +import androidx.compose.ui.tooling.preview.PreviewParameter +import io.element.android.libraries.designsystem.components.async.AsyncActionView +import io.element.android.libraries.designsystem.preview.ElementPreview +import io.element.android.libraries.designsystem.preview.PreviewsDayNight +import io.element.android.libraries.matrix.api.core.RoomId + +@Composable +fun ShareView( + state: ShareState, + onShareSuccess: (List) -> Unit, +) { + AsyncActionView( + async = state.shareAction, + onSuccess = { + onShareSuccess(it) + }, + onErrorDismiss = { + state.eventSink(ShareEvents.ClearError) + }, + ) +} + +@PreviewsDayNight +@Composable +internal fun ShareViewPreview(@PreviewParameter(ShareStateProvider::class) state: ShareState) = ElementPreview { + ShareView( + state = state, + onShareSuccess = {} + ) +} diff --git a/features/share/impl/src/test/kotlin/io/element/android/features/share/impl/FakeShareIntentHandler.kt b/features/share/impl/src/test/kotlin/io/element/android/features/share/impl/FakeShareIntentHandler.kt new file mode 100644 index 0000000000..682bb177cc --- /dev/null +++ b/features/share/impl/src/test/kotlin/io/element/android/features/share/impl/FakeShareIntentHandler.kt @@ -0,0 +1,35 @@ +/* + * Copyright (c) 2024 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. + */ + +package io.element.android.features.share.impl + +import android.content.Intent + +class FakeShareIntentHandler( + private val onIncomingShareIntent: suspend ( + Intent, + suspend (List) -> Boolean, + suspend (String) -> Boolean, + ) -> Boolean = { _, _, _ -> false }, +) : ShareIntentHandler { + override suspend fun handleIncomingShareIntent( + intent: Intent, + onUris: suspend (List) -> Boolean, + onPlainText: suspend (String) -> Boolean, + ): Boolean { + return onIncomingShareIntent(intent, onUris, onPlainText) + } +} 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 new file mode 100644 index 0000000000..42c053bafb --- /dev/null +++ b/features/share/impl/src/test/kotlin/io/element/android/features/share/impl/SharePresenterTest.kt @@ -0,0 +1,164 @@ +/* + * Copyright (c) 2024 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. + */ + +package io.element.android.features.share.impl + +import android.content.Intent +import android.net.Uri +import app.cash.molecule.RecompositionMode +import app.cash.molecule.moleculeFlow +import app.cash.turbine.test +import com.google.common.truth.Truth.assertThat +import io.element.android.libraries.architecture.AsyncAction +import io.element.android.libraries.core.mimetype.MimeTypes +import io.element.android.libraries.matrix.api.MatrixClient +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 +import io.element.android.libraries.matrix.test.room.FakeMatrixRoom +import io.element.android.libraries.mediaupload.api.MediaPreProcessor +import io.element.android.libraries.mediaupload.test.FakeMediaPreProcessor +import io.element.android.tests.testutils.WarmUpRule +import kotlinx.coroutines.test.TestScope +import kotlinx.coroutines.test.runTest +import org.junit.Rule +import org.junit.Test +import org.junit.runner.RunWith +import org.robolectric.RobolectricTestRunner + +@RunWith(RobolectricTestRunner::class) +class SharePresenterTest { + @get:Rule + val warmUpRule = WarmUpRule() + + @Test + fun `present - initial state`() = runTest { + val presenter = createSharePresenter() + moleculeFlow(RecompositionMode.Immediate) { + presenter.present() + }.test { + val initialState = awaitItem() + assertThat(initialState.shareAction.isUninitialized()).isTrue() + } + } + + @Test + fun `present - on room selected error then clear error`() = runTest { + val presenter = createSharePresenter() + moleculeFlow(RecompositionMode.Immediate) { + presenter.present() + }.test { + val initialState = awaitItem() + assertThat(initialState.shareAction.isUninitialized()).isTrue() + presenter.onRoomSelected(listOf(A_ROOM_ID)) + assertThat(awaitItem().shareAction.isLoading()).isTrue() + val failure = awaitItem() + assertThat(failure.shareAction.isFailure()).isTrue() + failure.eventSink.invoke(ShareEvents.ClearError) + assertThat(awaitItem().shareAction.isUninitialized()).isTrue() + } + } + + @Test + fun `present - on room selected ok`() = runTest { + val presenter = createSharePresenter( + shareIntentHandler = FakeShareIntentHandler { _, _, _ -> true } + ) + moleculeFlow(RecompositionMode.Immediate) { + presenter.present() + }.test { + val initialState = awaitItem() + assertThat(initialState.shareAction.isUninitialized()).isTrue() + presenter.onRoomSelected(listOf(A_ROOM_ID)) + assertThat(awaitItem().shareAction.isLoading()).isTrue() + val success = awaitItem() + assertThat(success.shareAction.isSuccess()).isTrue() + assertThat(success.shareAction).isEqualTo(AsyncAction.Success(listOf(A_ROOM_ID))) + } + } + + @Test + fun `present - send text ok`() = runTest { + val matrixRoom = FakeMatrixRoom() + val matrixClient = FakeMatrixClient().apply { + givenGetRoomResult(A_ROOM_ID, matrixRoom) + } + val presenter = createSharePresenter( + matrixClient = matrixClient, + shareIntentHandler = FakeShareIntentHandler { _, _, onText -> + onText(A_MESSAGE) + } + ) + moleculeFlow(RecompositionMode.Immediate) { + presenter.present() + }.test { + val initialState = awaitItem() + assertThat(initialState.shareAction.isUninitialized()).isTrue() + presenter.onRoomSelected(listOf(A_ROOM_ID)) + assertThat(awaitItem().shareAction.isLoading()).isTrue() + val success = awaitItem() + assertThat(success.shareAction.isSuccess()).isTrue() + assertThat(success.shareAction).isEqualTo(AsyncAction.Success(listOf(A_ROOM_ID))) + } + } + + @Test + fun `present - send media ok`() = runTest { + val matrixRoom = FakeMatrixRoom() + val matrixClient = FakeMatrixClient().apply { + givenGetRoomResult(A_ROOM_ID, matrixRoom) + } + val presenter = createSharePresenter( + matrixClient = matrixClient, + shareIntentHandler = FakeShareIntentHandler { _, onFile, _ -> + onFile( + listOf( + ShareIntentHandler.UriToShare( + uri = Uri.parse("content://image.jpg"), + mimeType = MimeTypes.Jpeg, + ) + ) + ) + } + ) + moleculeFlow(RecompositionMode.Immediate) { + presenter.present() + }.test { + val initialState = awaitItem() + assertThat(initialState.shareAction.isUninitialized()).isTrue() + presenter.onRoomSelected(listOf(A_ROOM_ID)) + assertThat(awaitItem().shareAction.isLoading()).isTrue() + val success = awaitItem() + assertThat(success.shareAction.isSuccess()).isTrue() + assertThat(success.shareAction).isEqualTo(AsyncAction.Success(listOf(A_ROOM_ID))) + } + } + + private fun TestScope.createSharePresenter( + intent: Intent = Intent(), + shareIntentHandler: ShareIntentHandler = FakeShareIntentHandler(), + matrixClient: MatrixClient = FakeMatrixClient(), + mediaPreProcessor: MediaPreProcessor = FakeMediaPreProcessor() + ): SharePresenter { + return SharePresenter( + intent = intent, + appCoroutineScope = this, + shareIntentHandler = shareIntentHandler, + matrixClient = matrixClient, + mediaPreProcessor = mediaPreProcessor + ) + } +} diff --git a/features/share/test/build.gradle.kts b/features/share/test/build.gradle.kts new file mode 100644 index 0000000000..0eaa0bedd2 --- /dev/null +++ b/features/share/test/build.gradle.kts @@ -0,0 +1,28 @@ +/* + * Copyright (c) 2024 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.share.test" +} + +dependencies { + implementation(projects.features.share.api) + implementation(libs.coroutines.core) + implementation(projects.tests.testutils) +} diff --git a/features/share/test/src/main/kotlin/io/element/android/features/share/test/FakeShareService.kt b/features/share/test/src/main/kotlin/io/element/android/features/share/test/FakeShareService.kt new file mode 100644 index 0000000000..302d8e2a54 --- /dev/null +++ b/features/share/test/src/main/kotlin/io/element/android/features/share/test/FakeShareService.kt @@ -0,0 +1,29 @@ +/* + * Copyright (c) 2024 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. + */ + +package io.element.android.features.share.test + +import io.element.android.features.share.api.ShareService +import io.element.android.tests.testutils.lambda.lambdaError +import kotlinx.coroutines.CoroutineScope + +class FakeShareService( + private val observeFeatureFlagLambda: (CoroutineScope) -> Unit = { lambdaError() } +) : ShareService { + override fun observeFeatureFlag(coroutineScope: CoroutineScope) { + observeFeatureFlagLambda(coroutineScope) + } +} diff --git a/features/signedout/impl/src/main/res/values-et/translations.xml b/features/signedout/impl/src/main/res/values-et/translations.xml new file mode 100644 index 0000000000..5b51d9902f --- /dev/null +++ b/features/signedout/impl/src/main/res/values-et/translations.xml @@ -0,0 +1,8 @@ + + + "Sa oled muutnud oma salasõna ühes teises sessioonis" + "Sa oled kustutanud selle sessiooni ühest teisest oma sessioonist" + "Sinu koduserveri haldaja on sinu ligipääsu keelanud" + "Sa oled välja logitud ühel alltoodud põhjusel. Teenuse %s kasutamiseks palun logi uuesti sisse." + "Sa oled välja loginud" + diff --git a/features/userprofile/impl/build.gradle.kts b/features/userprofile/impl/build.gradle.kts index e41524abb2..3837e81f9b 100644 --- a/features/userprofile/impl/build.gradle.kts +++ b/features/userprofile/impl/build.gradle.kts @@ -46,7 +46,7 @@ dependencies { implementation(projects.libraries.uiStrings) implementation(projects.libraries.androidutils) implementation(projects.libraries.mediaviewer.api) - implementation(projects.features.call) + implementation(projects.features.call.api) api(projects.features.userprofile.api) api(projects.features.userprofile.shared) implementation(libs.coil.compose) diff --git a/features/userprofile/impl/src/main/kotlin/io/element/android/features/userprofile/impl/UserProfileFlowNode.kt b/features/userprofile/impl/src/main/kotlin/io/element/android/features/userprofile/impl/UserProfileFlowNode.kt index 9101254126..d4335f5d3a 100644 --- a/features/userprofile/impl/src/main/kotlin/io/element/android/features/userprofile/impl/UserProfileFlowNode.kt +++ b/features/userprofile/impl/src/main/kotlin/io/element/android/features/userprofile/impl/UserProfileFlowNode.kt @@ -16,7 +16,6 @@ package io.element.android.features.userprofile.impl -import android.content.Context import android.os.Parcelable import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier @@ -29,8 +28,8 @@ import com.bumble.appyx.navmodel.backstack.operation.push import dagger.assisted.Assisted import dagger.assisted.AssistedInject import io.element.android.anvilannotations.ContributesNode -import io.element.android.features.call.CallType -import io.element.android.features.call.ui.ElementCallActivity +import io.element.android.features.call.api.CallType +import io.element.android.features.call.api.ElementCallEntryPoint import io.element.android.features.userprofile.api.UserProfileEntryPoint import io.element.android.features.userprofile.impl.root.UserProfileNode import io.element.android.features.userprofile.shared.UserProfileNodeHelper @@ -40,7 +39,6 @@ import io.element.android.libraries.architecture.BaseFlowNode import io.element.android.libraries.architecture.createNode import io.element.android.libraries.architecture.inputs import io.element.android.libraries.core.mimetype.MimeTypes -import io.element.android.libraries.di.ApplicationContext import io.element.android.libraries.di.SessionScope import io.element.android.libraries.matrix.api.core.RoomId import io.element.android.libraries.matrix.api.media.MediaSource @@ -53,7 +51,7 @@ import kotlinx.parcelize.Parcelize class UserProfileFlowNode @AssistedInject constructor( @Assisted buildContext: BuildContext, @Assisted plugins: List, - @ApplicationContext private val context: Context, + private val elementCallEntryPoint: ElementCallEntryPoint, private val sessionIdHolder: CurrentSessionIdHolder, ) : BaseFlowNode( backstack = BackStack( @@ -84,7 +82,7 @@ class UserProfileFlowNode @AssistedInject constructor( } override fun onStartCall(dmRoomId: RoomId) { - ElementCallActivity.start(context, CallType.RoomCall(sessionId = sessionIdHolder.current, roomId = dmRoomId)) + elementCallEntryPoint.startCall(CallType.RoomCall(sessionId = sessionIdHolder.current, roomId = dmRoomId)) } } val params = UserProfileNode.UserProfileInputs(userId = inputs().userId) diff --git a/features/verifysession/impl/src/main/res/values-et/translations.xml b/features/verifysession/impl/src/main/res/values-et/translations.xml new file mode 100644 index 0000000000..e058012acc --- /dev/null +++ b/features/verifysession/impl/src/main/res/values-et/translations.xml @@ -0,0 +1,8 @@ + + + "Krüptitud sõnumivahetuse tagamiseks verifitseeri see seade." + "Kinnita, et see oled sina" + "Nüüd saad saata või lugeda sõnumeid turvaliselt ning kõik sinu vestluspartnerid võivad usaldada seda seadet." + "Seade on verifitseeritud" + "Kasuta mõnda muud seadet" + diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 14e48107a9..6713343727 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -162,7 +162,7 @@ jsoup = "org.jsoup:jsoup:1.17.2" 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:0.2.23" +matrix_sdk = "org.matrix.rustcomponents:sdk-android:0.2.24" 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" } @@ -184,8 +184,8 @@ kotlinpoet = "com.squareup:kotlinpoet:1.17.0" zxing_cpp = "io.github.zxing-cpp:android:2.2.0" # Analytics -posthog = "com.posthog:posthog-android:3.3.0" -sentry = "io.sentry:sentry-android:7.9.0" +posthog = "com.posthog:posthog-android:3.3.1" +sentry = "io.sentry:sentry-android:7.10.0" # main branch can be tested replacing the version with main-SNAPSHOT matrix_analytics_events = "com.github.matrix-org:matrix-analytics-events:0.23.1" diff --git a/libraries/androidutils/src/main/kotlin/io/element/android/libraries/androidutils/compat/Compat.kt b/libraries/androidutils/src/main/kotlin/io/element/android/libraries/androidutils/compat/Compat.kt index 3c897b3d88..7fe91eb2e9 100644 --- a/libraries/androidutils/src/main/kotlin/io/element/android/libraries/androidutils/compat/Compat.kt +++ b/libraries/androidutils/src/main/kotlin/io/element/android/libraries/androidutils/compat/Compat.kt @@ -16,10 +16,22 @@ package io.element.android.libraries.androidutils.compat +import android.content.Intent import android.content.pm.ApplicationInfo import android.content.pm.PackageManager +import android.content.pm.ResolveInfo import android.os.Build +fun PackageManager.queryIntentActivitiesCompat(data: Intent, flags: Int): List { + return when { + Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU -> queryIntentActivities( + data, + PackageManager.ResolveInfoFlags.of(flags.toLong()) + ) + else -> @Suppress("DEPRECATION") queryIntentActivities(data, flags) + } +} + fun PackageManager.getApplicationInfoCompat(packageName: String, flags: Int): ApplicationInfo { return when { Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU -> getApplicationInfo( diff --git a/libraries/androidutils/src/main/res/values-et/translations.xml b/libraries/androidutils/src/main/res/values-et/translations.xml new file mode 100644 index 0000000000..80c50f18e1 --- /dev/null +++ b/libraries/androidutils/src/main/res/values-et/translations.xml @@ -0,0 +1,4 @@ + + + "Ei õnnestunud leida selle tegevuse jaoks vajalikku välist rakendust." + diff --git a/libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/components/avatar/AvatarSize.kt b/libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/components/avatar/AvatarSize.kt index 2dc6c8875f..54791f8505 100644 --- a/libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/components/avatar/AvatarSize.kt +++ b/libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/components/avatar/AvatarSize.kt @@ -22,6 +22,7 @@ import androidx.compose.ui.unit.dp enum class AvatarSize(val dp: Dp) { CurrentUserTopBar(32.dp), + IncomingCall(140.dp), RoomHeader(96.dp), RoomListItem(52.dp), diff --git a/libraries/eventformatter/impl/src/main/kotlin/io/element/android/libraries/eventformatter/impl/DefaultRoomLastMessageFormatter.kt b/libraries/eventformatter/impl/src/main/kotlin/io/element/android/libraries/eventformatter/impl/DefaultRoomLastMessageFormatter.kt index f541941818..428e6d1da1 100644 --- a/libraries/eventformatter/impl/src/main/kotlin/io/element/android/libraries/eventformatter/impl/DefaultRoomLastMessageFormatter.kt +++ b/libraries/eventformatter/impl/src/main/kotlin/io/element/android/libraries/eventformatter/impl/DefaultRoomLastMessageFormatter.kt @@ -27,6 +27,7 @@ import io.element.android.libraries.eventformatter.api.RoomLastMessageFormatter import io.element.android.libraries.eventformatter.impl.mode.RenderingMode import io.element.android.libraries.matrix.api.permalink.PermalinkParser import io.element.android.libraries.matrix.api.timeline.item.event.AudioMessageType +import io.element.android.libraries.matrix.api.timeline.item.event.CallNotifyContent import io.element.android.libraries.matrix.api.timeline.item.event.EmoteMessageType import io.element.android.libraries.matrix.api.timeline.item.event.EventTimelineItem import io.element.android.libraries.matrix.api.timeline.item.event.FailedToParseMessageLikeContent @@ -111,6 +112,8 @@ class DefaultRoomLastMessageFormatter @Inject constructor( prefixIfNeeded(sp.getString(CommonStrings.common_unsupported_event), senderDisambiguatedDisplayName, isDmRoom) } is LegacyCallInviteContent -> sp.getString(CommonStrings.common_call_invite) + is CallNotifyContent -> sp.getString(CommonStrings.common_call_started) + else -> null }?.take(MAX_SAFE_LENGTH) } diff --git a/libraries/eventformatter/impl/src/main/kotlin/io/element/android/libraries/eventformatter/impl/DefaultTimelineEventFormatter.kt b/libraries/eventformatter/impl/src/main/kotlin/io/element/android/libraries/eventformatter/impl/DefaultTimelineEventFormatter.kt index e77659a99e..22998c1781 100644 --- a/libraries/eventformatter/impl/src/main/kotlin/io/element/android/libraries/eventformatter/impl/DefaultTimelineEventFormatter.kt +++ b/libraries/eventformatter/impl/src/main/kotlin/io/element/android/libraries/eventformatter/impl/DefaultTimelineEventFormatter.kt @@ -21,6 +21,7 @@ import io.element.android.libraries.core.meta.BuildMeta import io.element.android.libraries.di.SessionScope import io.element.android.libraries.eventformatter.api.TimelineEventFormatter import io.element.android.libraries.eventformatter.impl.mode.RenderingMode +import io.element.android.libraries.matrix.api.timeline.item.event.CallNotifyContent import io.element.android.libraries.matrix.api.timeline.item.event.EventTimelineItem import io.element.android.libraries.matrix.api.timeline.item.event.FailedToParseMessageLikeContent import io.element.android.libraries.matrix.api.timeline.item.event.FailedToParseStateContent @@ -63,6 +64,9 @@ class DefaultTimelineEventFormatter @Inject constructor( is LegacyCallInviteContent -> { sp.getString(CommonStrings.common_call_invite) } + is CallNotifyContent -> { + sp.getString(CommonStrings.common_call_started) + } RedactedContent, is StickerContent, is PollContent, diff --git a/libraries/eventformatter/impl/src/main/res/values-et/translations.xml b/libraries/eventformatter/impl/src/main/res/values-et/translations.xml new file mode 100644 index 0000000000..28e5a56f34 --- /dev/null +++ b/libraries/eventformatter/impl/src/main/res/values-et/translations.xml @@ -0,0 +1,63 @@ + + + "(tunnuspilt muutus ka)" + "%1$s muutis oma tunnuspilti" + "Sina muutsid oma tunnuspilti" + "%1$s on nüüd tavakasutaja rollis" + "%1$s on nüüd moderaatori rollis" + "%1$s muutis senise kuvatava nime „%2$s“ asemele uueks nimeks „%3$s“" + "Sina muutsid senise kuvatava nime „%1$s“ asemel uueks nimeks „%2$s“" + "%1$s eemaldas oma kuvatava nime (mis oli „%2$s“)" + "Sina eemaldasid oma kuvatava nime (mis oli „%1$s“)" + "%1$s määras oma kuvatavaks nimeks „%2$s“" + "Sina määrasid oma kuvatavaks nimeks „%1$s“" + "%1$s on nüüd peakasutaja rollis" + "%1$s on nüüd moderaatori rollis" + "%1$s muutis jututoa tunnuspilti" + "Sina muutsid jututoa tunnuspilti" + "%1$s eemaldas jututoa tunnuspildi" + "Sina eemaldasid jututoa tunnuspildi" + "%1$s keelas %2$s ligipääsu" + "Sina keelasid %1$s ligipääsu" + "%1$s lõi jututoa" + "Sina lõid jututoa" + "%1$s saatis kutse kasutajale %2$s" + "%1$s võttis kutse vastu" + "Sina võtsid kutse vastu" + "Sina saatsid kutse kasutajale %1$s" + "%1$s saatis sulle kutse" + "%1$s liitus jututoaga" + "Sina liitusid jututoaga" + "%1$s palus liitumist" + "%1$s lubas kasutajal %2$s liituda" + "Sina lubasid kasutajal %1$s liituda" + "Sina palusid liitumist" + "%1$s lükkas tagasi kasutaja %2$s liitumispalve" + "Sina lükkasid tagasi kasutaja %1$s liitumispalve" + "%1$s lükkas tagasi sinu liitumispalve" + "%1$s pole enam liitumisest huvitatud" + "Sina tühitasid oma liitumissoovi" + "%1$s lahkus jututoast" + "Sina lahkusid jututoast" + "%1$s muutis jututoa uueks nimeks „%2$s“" + "Sina muutsid jututoa uueks nimeks „%1$s“" + "%1$s eemaldas jututoa nime" + "Sina eemaldasid jututoa nime" + "%1$s ei teinud ühtegi muudatust" + "Sina ei teinud ühtegi muudatust" + "%1$s lükkas kutse tagasi" + "Sina lükkasid kutse tagasi" + "%1$s eemaldas jututoast kasutaja %2$s" + "Sina eemaldasid jututoast kasutaja %1$s" + "%1$s saatis jututoaga liitumiseks kutse kasutajale %2$s" + "Sina saatsid kasutajale %1$s kutse jututoaga liitumiseks" + "%1$s võttis tagasi jututoaga liitumise kutse kasutajalt %2$s" + "Sina võtsid tagasi jututoaga liitumise kutse kasutajalt %1$s" + "%1$s muutis uueks teemaks %2$s" + "Sina muutsid uueks teemaks %1$s" + "%1$s eemaldas jututoa teema" + "Sina eemaldasid jututoa teema" + "%1$s taastas %2$s ligipääsu" + "Sina taastasid %1$s ligipääsu" + "%1$s tegi oma liikmelisuses teadmata muutatuse" + diff --git a/libraries/eventformatter/impl/src/test/kotlin/io/element/android/libraries/eventformatter/impl/DefaultRoomLastMessageFormatterTest.kt b/libraries/eventformatter/impl/src/test/kotlin/io/element/android/libraries/eventformatter/impl/DefaultRoomLastMessageFormatterTest.kt index f5e151b541..5255fcea4a 100644 --- a/libraries/eventformatter/impl/src/test/kotlin/io/element/android/libraries/eventformatter/impl/DefaultRoomLastMessageFormatterTest.kt +++ b/libraries/eventformatter/impl/src/test/kotlin/io/element/android/libraries/eventformatter/impl/DefaultRoomLastMessageFormatterTest.kt @@ -50,6 +50,7 @@ import io.element.android.libraries.matrix.api.timeline.item.event.VideoMessageT import io.element.android.libraries.matrix.api.timeline.item.event.VoiceMessageType import io.element.android.libraries.matrix.test.A_USER_ID import io.element.android.libraries.matrix.test.FakeMatrixClient +import io.element.android.libraries.matrix.test.media.aMediaSource import io.element.android.libraries.matrix.test.permalink.FakePermalinkParser import io.element.android.libraries.matrix.test.timeline.aPollContent import io.element.android.libraries.matrix.test.timeline.aProfileChangeMessageContent @@ -106,7 +107,7 @@ class DefaultRoomLastMessageFormatterTest { fun `Sticker content`() { val body = "body" val info = ImageInfo(null, null, null, null, null, null, null) - val message = createRoomEvent(false, null, StickerContent(body, info, "url")) + val message = createRoomEvent(false, null, StickerContent(body, info, aMediaSource(url = "url"))) val result = formatter.format(message, false) assertThat(result).isEqualTo(body) } diff --git a/libraries/featureflag/api/src/main/kotlin/io/element/android/libraries/featureflag/api/FeatureFlags.kt b/libraries/featureflag/api/src/main/kotlin/io/element/android/libraries/featureflag/api/FeatureFlags.kt index 5c3bd8efd4..4d0c50a533 100644 --- a/libraries/featureflag/api/src/main/kotlin/io/element/android/libraries/featureflag/api/FeatureFlags.kt +++ b/libraries/featureflag/api/src/main/kotlin/io/element/android/libraries/featureflag/api/FeatureFlags.kt @@ -96,4 +96,11 @@ enum class FeatureFlags( defaultValue = true, isFinished = false, ), + IncomingShare( + key = "feature.incomingShare", + title = "Incoming Share support", + description = "Allow the application to receive data from other applications", + defaultValue = true, + isFinished = false, + ), } diff --git a/libraries/featureflag/impl/src/main/kotlin/io/element/android/libraries/featureflag/impl/StaticFeatureFlagProvider.kt b/libraries/featureflag/impl/src/main/kotlin/io/element/android/libraries/featureflag/impl/StaticFeatureFlagProvider.kt index 139877500b..7574144066 100644 --- a/libraries/featureflag/impl/src/main/kotlin/io/element/android/libraries/featureflag/impl/StaticFeatureFlagProvider.kt +++ b/libraries/featureflag/impl/src/main/kotlin/io/element/android/libraries/featureflag/impl/StaticFeatureFlagProvider.kt @@ -44,6 +44,7 @@ class StaticFeatureFlagProvider @Inject constructor() : FeatureFlags.RoomDirectorySearch -> false FeatureFlags.ShowBlockedUsersDetails -> false FeatureFlags.QrCodeLogin -> OnBoardingConfig.CAN_LOGIN_WITH_QR_CODE + FeatureFlags.IncomingShare -> true } } else { false diff --git a/libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/core/ThreadId.kt b/libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/core/ThreadId.kt index 09ba7f37f8..8e5845f621 100644 --- a/libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/core/ThreadId.kt +++ b/libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/core/ThreadId.kt @@ -33,3 +33,5 @@ value class ThreadId(val value: String) : Serializable { override fun toString(): String = value } + +fun ThreadId.asEventId(): EventId = EventId(value) 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 7ba0ad35ca..458b17209c 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 @@ -330,5 +330,10 @@ interface MatrixRoom : Closeable { */ suspend fun getPermalinkFor(eventId: EventId): Result + /** + * Send an Element Call started notification if needed. + */ + suspend fun sendCallNotificationIfNeeded(): Result + override fun close() = destroy() } 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 d3200ed92c..ee745ea59d 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 @@ -57,7 +57,13 @@ interface Timeline : AutoCloseable { suspend fun enterSpecialMode(eventId: EventId?): Result - suspend fun replyMessage(eventId: EventId, body: String, htmlBody: String?, mentions: List): Result + suspend fun replyMessage( + eventId: EventId, + body: String, + htmlBody: String?, + mentions: List, + fromNotification: Boolean = false, + ): Result suspend fun sendImage( file: File, diff --git a/libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/timeline/item/event/EventContent.kt b/libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/timeline/item/event/EventContent.kt index 0150c78a4a..c9d81ec817 100644 --- a/libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/timeline/item/event/EventContent.kt +++ b/libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/timeline/item/event/EventContent.kt @@ -19,6 +19,7 @@ package io.element.android.libraries.matrix.api.timeline.item.event import androidx.compose.runtime.Immutable import io.element.android.libraries.matrix.api.core.UserId import io.element.android.libraries.matrix.api.media.ImageInfo +import io.element.android.libraries.matrix.api.media.MediaSource import io.element.android.libraries.matrix.api.poll.PollAnswer import io.element.android.libraries.matrix.api.poll.PollKind import kotlinx.collections.immutable.ImmutableList @@ -40,7 +41,7 @@ data object RedactedContent : EventContent data class StickerContent( val body: String, val info: ImageInfo, - val url: String + val source: MediaSource, ) : EventContent data class PollContent( @@ -102,4 +103,6 @@ data class FailedToParseStateContent( data object LegacyCallInviteContent : EventContent +data object CallNotifyContent : EventContent + data object UnknownContent : EventContent diff --git a/libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/timeline/item/event/EventType.kt b/libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/timeline/item/event/EventType.kt index 67b57b6a07..8367f70725 100644 --- a/libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/timeline/item/event/EventType.kt +++ b/libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/timeline/item/event/EventType.kt @@ -72,6 +72,7 @@ object EventType { const val CALL_NEGOTIATE = "m.call.negotiate" const val CALL_REJECT = "m.call.reject" const val CALL_HANGUP = "m.call.hangup" + const val CALL_NOTIFY = "m.call.notify" // This type is not processed by the client, just sent to the server const val CALL_REPLACES = "m.call.replaces" @@ -94,6 +95,7 @@ object EventType { type == CALL_SELECT_ANSWER || type == CALL_NEGOTIATE || type == CALL_REJECT || - type == CALL_REPLACES + type == CALL_REPLACES || + type == CALL_NOTIFY } } diff --git a/libraries/matrix/api/src/test/kotlin/io/element/android/libraries/matrix/api/notification/NotificationDataTest.kt b/libraries/matrix/api/src/test/kotlin/io/element/android/libraries/matrix/api/notification/NotificationDataTest.kt index 0bd661637c..cb9eee808e 100644 --- a/libraries/matrix/api/src/test/kotlin/io/element/android/libraries/matrix/api/notification/NotificationDataTest.kt +++ b/libraries/matrix/api/src/test/kotlin/io/element/android/libraries/matrix/api/notification/NotificationDataTest.kt @@ -17,9 +17,8 @@ package io.element.android.libraries.matrix.api.notification import com.google.common.truth.Truth.assertThat -import io.element.android.libraries.matrix.test.AN_EVENT_ID -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.notification.aNotificationData import org.junit.Test class NotificationDataTest { @@ -49,25 +48,4 @@ class NotificationDataTest { ) assertThat(sut.getDisambiguatedDisplayName(A_USER_ID)).isEqualTo("Alice (@alice:server.org)") } - - private fun aNotificationData( - senderDisplayName: String?, - senderIsNameAmbiguous: Boolean, - ): NotificationData { - return NotificationData( - eventId = AN_EVENT_ID, - roomId = A_ROOM_ID, - senderAvatarUrl = null, - senderDisplayName = senderDisplayName, - senderIsNameAmbiguous = senderIsNameAmbiguous, - roomAvatarUrl = null, - roomDisplayName = null, - isDirect = false, - isEncrypted = false, - isNoisy = false, - timestamp = 0L, - content = NotificationContent.MessageLike.RoomEncrypted, - hasMention = false, - ) - } } diff --git a/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/room/RoomSyncSubscriber.kt b/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/room/RoomSyncSubscriber.kt index 771bf59680..a65dc17a43 100644 --- a/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/room/RoomSyncSubscriber.kt +++ b/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/room/RoomSyncSubscriber.kt @@ -27,6 +27,8 @@ import org.matrix.rustcomponents.sdk.RoomListService import org.matrix.rustcomponents.sdk.RoomSubscription import timber.log.Timber +private const val DEFAULT_TIMELINE_LIMIT = 20u + class RoomSyncSubscriber( private val roomListService: RoomListService, private val dispatchers: CoroutineDispatchers, @@ -41,8 +43,9 @@ class RoomSyncSubscriber( RequiredState(key = EventType.STATE_ROOM_JOIN_RULES, value = ""), RequiredState(key = EventType.STATE_ROOM_POWER_LEVELS, value = ""), ), - timelineLimit = null, - includeHeroes = true, + timelineLimit = DEFAULT_TIMELINE_LIMIT, + // We don't need heroes here as they're already included in the `all_rooms` list + includeHeroes = false, ) suspend fun subscribe(roomId: RoomId) = mutex.withLock { 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 e2a3ffef8c..4ee8c220f1 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 @@ -590,6 +590,10 @@ class RustMatrixRoom( innerRoom.matrixToEventPermalink(eventId.value) } + override suspend fun sendCallNotificationIfNeeded(): Result = runCatching { + innerRoom.sendCallNotificationIfNeeded() + } + private fun createTimeline( timeline: InnerTimeline, isLive: Boolean, diff --git a/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/timeline/RoomTimelineExtensions.kt b/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/timeline/RoomTimelineExtensions.kt index 381bfd8c95..2ce9d4d435 100644 --- a/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/timeline/RoomTimelineExtensions.kt +++ b/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/timeline/RoomTimelineExtensions.kt @@ -25,11 +25,27 @@ import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.buffer import kotlinx.coroutines.flow.callbackFlow import kotlinx.coroutines.flow.catch +import org.matrix.rustcomponents.sdk.PaginationStatusListener import org.matrix.rustcomponents.sdk.Timeline import org.matrix.rustcomponents.sdk.TimelineDiff import org.matrix.rustcomponents.sdk.TimelineItem import org.matrix.rustcomponents.sdk.TimelineListener import timber.log.Timber +import uniffi.matrix_sdk_ui.LiveBackPaginationStatus + +internal fun Timeline.liveBackPaginationStatus(): Flow = callbackFlow { + val listener = object : PaginationStatusListener { + override fun onUpdate(status: LiveBackPaginationStatus) { + trySend(status) + } + } + val result = subscribeToBackPaginationStatus(listener) + awaitClose { + result.cancelAndDestroy() + } +}.catch { + Timber.d(it, "liveBackPaginationStatus() failed") +}.buffer(Channel.UNLIMITED) internal fun Timeline.timelineDiffFlow(onInitialList: suspend (List) -> Unit): Flow> = callbackFlow { 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 025700c3bd..e9b2265e76 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 @@ -79,6 +79,7 @@ import org.matrix.rustcomponents.sdk.messageEventContentFromMarkdown import org.matrix.rustcomponents.sdk.use import timber.log.Timber import uniffi.matrix_sdk_ui.EventItemOrigin +import uniffi.matrix_sdk_ui.LiveBackPaginationStatus import java.io.File import java.util.Date import java.util.concurrent.atomic.AtomicBoolean @@ -154,6 +155,21 @@ class RustTimeline( launch { fetchMembers() } + + if (isLive) { + // When timeline is live, we need to listen to the back pagination status as + // sdk can automatically paginate backwards. + inner.liveBackPaginationStatus() + .onEach { backPaginationStatus -> + updatePaginationStatus(Timeline.PaginationDirection.BACKWARDS) { + when (backPaginationStatus) { + is LiveBackPaginationStatus.Idle -> it.copy(isPaginating = false, hasMoreToLoad = !backPaginationStatus.hitStartOfTimeline) + is LiveBackPaginationStatus.Paginating -> it.copy(isPaginating = true, hasMoreToLoad = true) + } + } + } + .launchIn(this) + } } } @@ -333,13 +349,28 @@ class RustTimeline( } } - override suspend fun replyMessage(eventId: EventId, body: String, htmlBody: String?, mentions: List): Result = withContext(dispatcher) { + override suspend fun replyMessage( + eventId: EventId, + body: String, + htmlBody: String?, + mentions: List, + fromNotification: Boolean, + ): Result = withContext(dispatcher) { runCatching { - val inReplyTo = specialModeEventTimelineItem ?: inner.getEventTimelineItemByEventId(eventId.value) - inReplyTo.use { eventTimelineItem -> - inner.sendReply(messageEventContentFromParts(body, htmlBody).withMentions(mentions.map()), eventTimelineItem) + val msg = messageEventContentFromParts(body, htmlBody).withMentions(mentions.map()) + if (fromNotification) { + // When replying from a notification, do not interfere with `specialModeEventTimelineItem` + val inReplyTo = inner.getEventTimelineItemByEventId(eventId.value) + inReplyTo.use { eventTimelineItem -> + inner.sendReply(msg, eventTimelineItem) + } + } else { + val inReplyTo = specialModeEventTimelineItem ?: inner.getEventTimelineItemByEventId(eventId.value) + inReplyTo.use { eventTimelineItem -> + inner.sendReply(msg, eventTimelineItem) + } + specialModeEventTimelineItem = null } - specialModeEventTimelineItem = null } } 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 04e3632d09..6b0da71eee 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 @@ -17,6 +17,7 @@ package io.element.android.libraries.matrix.impl.timeline.item.event import io.element.android.libraries.matrix.api.core.UserId +import io.element.android.libraries.matrix.api.timeline.item.event.CallNotifyContent import io.element.android.libraries.matrix.api.timeline.item.event.EventContent import io.element.android.libraries.matrix.api.timeline.item.event.FailedToParseMessageLikeContent import io.element.android.libraries.matrix.api.timeline.item.event.FailedToParseStateContent @@ -103,7 +104,7 @@ class TimelineEventContentMapper(private val eventMessageMapper: EventMessageMap StickerContent( body = kind.body, info = kind.info.map(), - url = kind.url, + source = kind.source.map(), ) } is TimelineItemContentKind.Poll -> { @@ -125,6 +126,7 @@ class TimelineEventContentMapper(private val eventMessageMapper: EventMessageMap ) } is TimelineItemContentKind.CallInvite -> LegacyCallInviteContent + is TimelineItemContentKind.CallNotify -> CallNotifyContent else -> UnknownContent } } 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 new file mode 100644 index 0000000000..330db62274 --- /dev/null +++ b/libraries/matrix/test/src/main/kotlin/io/element/android/libraries/matrix/test/notification/NotificationData.kt @@ -0,0 +1,43 @@ +/* + * Copyright (c) 2024 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. + */ + +package io.element.android.libraries.matrix.test.notification + +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 +import io.element.android.libraries.matrix.test.A_ROOM_ID + +fun aNotificationData( + senderDisplayName: String?, + senderIsNameAmbiguous: Boolean, +): NotificationData { + return NotificationData( + eventId = AN_EVENT_ID, + roomId = A_ROOM_ID, + senderAvatarUrl = null, + senderDisplayName = senderDisplayName, + senderIsNameAmbiguous = senderIsNameAmbiguous, + roomAvatarUrl = null, + roomDisplayName = null, + isDirect = false, + isEncrypted = false, + isNoisy = false, + timestamp = 0L, + content = NotificationContent.MessageLike.RoomEncrypted, + hasMention = false, + ) +} 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 c2db4b83dd..281c763c03 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 @@ -86,6 +86,7 @@ class FakeMatrixRoom( override val liveTimeline: Timeline = FakeTimeline(), private var roomPermalinkResult: () -> Result = { Result.success("room link") }, private var eventPermalinkResult: (EventId) -> Result = { Result.success("event link") }, + var sendCallNotificationIfNeededResult: () -> Result = { Result.success(Unit) }, canRedactOwn: Boolean = false, canRedactOther: Boolean = false, ) : MatrixRoom { @@ -520,6 +521,10 @@ class FakeMatrixRoom( theme: String?, ): Result = generateWidgetWebViewUrlResult + override suspend fun sendCallNotificationIfNeeded(): Result { + return sendCallNotificationIfNeededResult() + } + override fun getWidgetDriver(widgetSettings: MatrixWidgetSettings): Result = getWidgetDriverResult fun givenRoomMembersState(state: MatrixRoomMembersState) { 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 e34d000aca..9f62df2ca6 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 @@ -114,7 +114,8 @@ class FakeTimeline( body: String, htmlBody: String?, mentions: List, - ) -> Result = { _, _, _, _ -> + fromNotification: Boolean, + ) -> Result = { _, _, _, _, _ -> Result.success(Unit) } @@ -123,11 +124,13 @@ class FakeTimeline( body: String, htmlBody: String?, mentions: List, + fromNotification: Boolean, ): Result = replyMessageLambda( eventId, body, htmlBody, - mentions + mentions, + fromNotification, ) var sendImageLambda: ( diff --git a/libraries/permissions/api/src/main/res/values-et/translations.xml b/libraries/permissions/api/src/main/res/values-et/translations.xml new file mode 100644 index 0000000000..fe65b6fde5 --- /dev/null +++ b/libraries/permissions/api/src/main/res/values-et/translations.xml @@ -0,0 +1,7 @@ + + + "Selleks, et rakendus saaks kaamerat kasutada, palun luba see süsteemi seadistuses." + "Palun luba süsteemi seadistustest vajalikud õigused." + "Selleks, et rakendus saaks mikrofoni kasutada, palun luba see süsteemi seadistuses." + "Selleks, et rakendus saaks kuvada teavitusi, palun anna vajalikud õiguse süsteemi seadistustes." + diff --git a/libraries/permissions/impl/src/main/res/values-et/translations.xml b/libraries/permissions/impl/src/main/res/values-et/translations.xml new file mode 100644 index 0000000000..688a592323 --- /dev/null +++ b/libraries/permissions/impl/src/main/res/values-et/translations.xml @@ -0,0 +1,4 @@ + + + "Täpsusta õigusi" + diff --git a/libraries/preferences/test/src/main/kotlin/io/element/android/libraries/preferences/test/FakeSessionPreferencesStoreFactory.kt b/libraries/preferences/test/src/main/kotlin/io/element/android/libraries/preferences/test/FakeSessionPreferencesStoreFactory.kt index 96761a9712..aee59c942b 100644 --- a/libraries/preferences/test/src/main/kotlin/io/element/android/libraries/preferences/test/FakeSessionPreferencesStoreFactory.kt +++ b/libraries/preferences/test/src/main/kotlin/io/element/android/libraries/preferences/test/FakeSessionPreferencesStoreFactory.kt @@ -21,12 +21,13 @@ import io.element.android.features.preferences.api.store.SessionPreferencesStore import io.element.android.libraries.matrix.api.core.SessionId import io.element.android.tests.testutils.lambda.LambdaOneParamRecorder import io.element.android.tests.testutils.lambda.LambdaTwoParamsRecorder +import io.element.android.tests.testutils.lambda.lambdaError import io.element.android.tests.testutils.lambda.lambdaRecorder import kotlinx.coroutines.CoroutineScope class FakeSessionPreferencesStoreFactory( - var getLambda: LambdaTwoParamsRecorder = lambdaRecorder { _, _ -> throw NotImplementedError() }, - var removeLambda: LambdaOneParamRecorder = lambdaRecorder { _ -> }, + val getLambda: LambdaTwoParamsRecorder = lambdaRecorder { _, _ -> lambdaError() }, + val removeLambda: LambdaOneParamRecorder = lambdaRecorder { _ -> lambdaError() }, ) : SessionPreferencesStoreFactory { override fun get(sessionId: SessionId, sessionCoroutineScope: CoroutineScope): SessionPreferencesStore { return getLambda(sessionId, sessionCoroutineScope) diff --git a/libraries/push/api/build.gradle.kts b/libraries/push/api/build.gradle.kts index c4d78b432d..d043254933 100644 --- a/libraries/push/api/build.gradle.kts +++ b/libraries/push/api/build.gradle.kts @@ -24,6 +24,7 @@ android { dependencies { implementation(libs.androidx.corektx) implementation(libs.coroutines.core) + implementation(libs.coil.compose) implementation(projects.libraries.matrix.api) implementation(projects.libraries.pushproviders.api) } diff --git a/libraries/push/api/src/main/kotlin/io/element/android/libraries/push/api/notifications/NotificationBitmapLoader.kt b/libraries/push/api/src/main/kotlin/io/element/android/libraries/push/api/notifications/NotificationBitmapLoader.kt new file mode 100644 index 0000000000..6b56eb9e2a --- /dev/null +++ b/libraries/push/api/src/main/kotlin/io/element/android/libraries/push/api/notifications/NotificationBitmapLoader.kt @@ -0,0 +1,38 @@ +/* + * Copyright (c) 2024 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. + */ + +package io.element.android.libraries.push.api.notifications + +import android.graphics.Bitmap +import androidx.core.graphics.drawable.IconCompat +import coil.ImageLoader + +interface NotificationBitmapLoader { + /** + * Get icon of a room. + * @param path mxc url + * @param imageLoader Coil image loader + */ + suspend fun getRoomBitmap(path: String?, imageLoader: ImageLoader): Bitmap? + + /** + * Get icon of a user. + * Before Android P, this does nothing because the icon won't be used + * @param path mxc url + * @param imageLoader Coil image loader + */ + suspend fun getUserIcon(path: String?, imageLoader: ImageLoader): IconCompat? +} diff --git a/libraries/push/api/src/main/kotlin/io/element/android/libraries/push/api/notifications/NotificationDrawerManager.kt b/libraries/push/api/src/main/kotlin/io/element/android/libraries/push/api/notifications/NotificationDrawerManager.kt index 9a778195fa..f7babb1e35 100644 --- a/libraries/push/api/src/main/kotlin/io/element/android/libraries/push/api/notifications/NotificationDrawerManager.kt +++ b/libraries/push/api/src/main/kotlin/io/element/android/libraries/push/api/notifications/NotificationDrawerManager.kt @@ -16,10 +16,15 @@ package io.element.android.libraries.push.api.notifications +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 interface NotificationDrawerManager { + fun clearAllMessagesEvents(sessionId: SessionId) + fun clearMessagesForRoom(sessionId: SessionId, roomId: RoomId) + fun clearEvent(sessionId: SessionId, eventId: EventId) + fun clearMembershipNotificationForSession(sessionId: SessionId) fun clearMembershipNotificationForRoom(sessionId: SessionId, roomId: RoomId) } diff --git a/libraries/push/impl/src/main/kotlin/io/element/android/libraries/push/impl/notifications/NotificationIdProvider.kt b/libraries/push/api/src/main/kotlin/io/element/android/libraries/push/api/notifications/NotificationIdProvider.kt similarity index 63% rename from libraries/push/impl/src/main/kotlin/io/element/android/libraries/push/impl/notifications/NotificationIdProvider.kt rename to libraries/push/api/src/main/kotlin/io/element/android/libraries/push/api/notifications/NotificationIdProvider.kt index 050edfcc11..0edfe405ac 100644 --- a/libraries/push/impl/src/main/kotlin/io/element/android/libraries/push/impl/notifications/NotificationIdProvider.kt +++ b/libraries/push/api/src/main/kotlin/io/element/android/libraries/push/api/notifications/NotificationIdProvider.kt @@ -1,5 +1,5 @@ /* - * Copyright (c) 2023 New Vector Ltd + * Copyright (c) 2024 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. @@ -14,13 +14,12 @@ * limitations under the License. */ -package io.element.android.libraries.push.impl.notifications +package io.element.android.libraries.push.api.notifications import io.element.android.libraries.matrix.api.core.SessionId -import javax.inject.Inject import kotlin.math.abs -class NotificationIdProvider @Inject constructor() { +object NotificationIdProvider { fun getSummaryNotificationId(sessionId: SessionId): Int { return getOffset(sessionId) + SUMMARY_NOTIFICATION_ID } @@ -41,16 +40,30 @@ class NotificationIdProvider @Inject constructor() { return getOffset(sessionId) + FALLBACK_NOTIFICATION_ID } + fun getCallNotificationId(sessionId: SessionId): Int { + return getOffset(sessionId) + ROOM_CALL_NOTIFICATION_ID + } + + fun getForegroundServiceNotificationId(type: ForegroundServiceType): Int { + return type.id * 10 + FOREGROUND_SERVICE_NOTIFICATION_ID + } + private fun getOffset(sessionId: SessionId): Int { // Compute a int from a string with a low risk of collision. return abs(sessionId.value.hashCode() % 100_000) * 10 } - companion object { - private const val FALLBACK_NOTIFICATION_ID = -1 - private const val SUMMARY_NOTIFICATION_ID = 0 - private const val ROOM_MESSAGES_NOTIFICATION_ID = 1 - private const val ROOM_EVENT_NOTIFICATION_ID = 2 - private const val ROOM_INVITATION_NOTIFICATION_ID = 3 - } + private const val FALLBACK_NOTIFICATION_ID = -1 + private const val SUMMARY_NOTIFICATION_ID = 0 + private const val ROOM_MESSAGES_NOTIFICATION_ID = 1 + private const val ROOM_EVENT_NOTIFICATION_ID = 2 + private const val ROOM_INVITATION_NOTIFICATION_ID = 3 + private const val ROOM_CALL_NOTIFICATION_ID = 3 + + private const val FOREGROUND_SERVICE_NOTIFICATION_ID = 4 +} + +enum class ForegroundServiceType(val id: Int) { + INCOMING_CALL(1), + ONGOING_CALL(2), } diff --git a/libraries/push/api/src/main/kotlin/io/element/android/libraries/push/api/notifications/OnMissedCallNotificationHandler.kt b/libraries/push/api/src/main/kotlin/io/element/android/libraries/push/api/notifications/OnMissedCallNotificationHandler.kt new file mode 100644 index 0000000000..40bf786536 --- /dev/null +++ b/libraries/push/api/src/main/kotlin/io/element/android/libraries/push/api/notifications/OnMissedCallNotificationHandler.kt @@ -0,0 +1,35 @@ +/* + * Copyright (c) 2024 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. + */ + +package io.element.android.libraries.push.api.notifications + +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 + +/** + * Handles missed calls by creating a new notification. + */ +interface OnMissedCallNotificationHandler { + /** + * Adds a missed call notification. + */ + suspend fun addMissedCallNotification( + sessionId: SessionId, + roomId: RoomId, + eventId: EventId, + ) +} diff --git a/libraries/push/impl/build.gradle.kts b/libraries/push/impl/build.gradle.kts index 36dddbcedf..8970f1e3d0 100644 --- a/libraries/push/impl/build.gradle.kts +++ b/libraries/push/impl/build.gradle.kts @@ -55,6 +55,7 @@ dependencies { implementation(projects.libraries.preferences.api) implementation(projects.libraries.uiStrings) implementation(projects.libraries.troubleshoot.api) + implementation(projects.features.call.api) api(projects.libraries.pushproviders.api) api(projects.libraries.pushstore.api) api(projects.libraries.push.api) @@ -71,10 +72,12 @@ dependencies { testImplementation(libs.coil.test) testImplementation(libs.coroutines.test) testImplementation(projects.libraries.matrix.test) + testImplementation(projects.libraries.preferences.test) testImplementation(projects.libraries.push.test) testImplementation(projects.libraries.pushproviders.test) testImplementation(projects.libraries.pushstore.test) testImplementation(projects.tests.testutils) + testImplementation(projects.features.call.test) testImplementation(projects.services.appnavstate.test) testImplementation(projects.services.toolbox.impl) testImplementation(projects.services.toolbox.test) diff --git a/libraries/push/impl/src/main/kotlin/io/element/android/libraries/push/impl/notifications/ActiveNotificationsProvider.kt b/libraries/push/impl/src/main/kotlin/io/element/android/libraries/push/impl/notifications/ActiveNotificationsProvider.kt index 0746e9c5cd..01b9837f3b 100644 --- a/libraries/push/impl/src/main/kotlin/io/element/android/libraries/push/impl/notifications/ActiveNotificationsProvider.kt +++ b/libraries/push/impl/src/main/kotlin/io/element/android/libraries/push/impl/notifications/ActiveNotificationsProvider.kt @@ -22,6 +22,7 @@ import com.squareup.anvil.annotations.ContributesBinding import io.element.android.libraries.di.AppScope import io.element.android.libraries.matrix.api.core.RoomId import io.element.android.libraries.matrix.api.core.SessionId +import io.element.android.libraries.push.api.notifications.NotificationIdProvider import javax.inject.Inject interface ActiveNotificationsProvider { @@ -37,7 +38,6 @@ interface ActiveNotificationsProvider { @ContributesBinding(AppScope::class) class DefaultActiveNotificationsProvider @Inject constructor( private val notificationManager: NotificationManagerCompat, - private val notificationIdProvider: NotificationIdProvider, ) : ActiveNotificationsProvider { override fun getAllNotifications(): List { return notificationManager.activeNotifications @@ -48,22 +48,22 @@ class DefaultActiveNotificationsProvider @Inject constructor( } override fun getMembershipNotificationForSession(sessionId: SessionId): List { - val notificationId = notificationIdProvider.getRoomInvitationNotificationId(sessionId) + val notificationId = NotificationIdProvider.getRoomInvitationNotificationId(sessionId) return getNotificationsForSession(sessionId).filter { it.id == notificationId } } override fun getMessageNotificationsForRoom(sessionId: SessionId, roomId: RoomId): List { - val notificationId = notificationIdProvider.getRoomMessagesNotificationId(sessionId) + val notificationId = NotificationIdProvider.getRoomMessagesNotificationId(sessionId) return getNotificationsForSession(sessionId).filter { it.id == notificationId && it.tag == roomId.value } } override fun getMembershipNotificationForRoom(sessionId: SessionId, roomId: RoomId): List { - val notificationId = notificationIdProvider.getRoomInvitationNotificationId(sessionId) + val notificationId = NotificationIdProvider.getRoomInvitationNotificationId(sessionId) return getNotificationsForSession(sessionId).filter { it.id == notificationId && it.tag == roomId.value } } override fun getSummaryNotification(sessionId: SessionId): StatusBarNotification? { - val summaryId = notificationIdProvider.getSummaryNotificationId(sessionId) + val summaryId = NotificationIdProvider.getSummaryNotificationId(sessionId) return getNotificationsForSession(sessionId).find { it.id == summaryId } } diff --git a/libraries/push/impl/src/main/kotlin/io/element/android/libraries/push/impl/notifications/CallNotificationEventResolver.kt b/libraries/push/impl/src/main/kotlin/io/element/android/libraries/push/impl/notifications/CallNotificationEventResolver.kt new file mode 100644 index 0000000000..b14fcdeab3 --- /dev/null +++ b/libraries/push/impl/src/main/kotlin/io/element/android/libraries/push/impl/notifications/CallNotificationEventResolver.kt @@ -0,0 +1,90 @@ +/* + * Copyright (c) 2024 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. + */ + +package io.element.android.libraries.push.impl.notifications + +import com.squareup.anvil.annotations.ContributesBinding +import io.element.android.libraries.di.AppScope +import io.element.android.libraries.matrix.api.core.SessionId +import io.element.android.libraries.matrix.api.notification.NotificationContent +import io.element.android.libraries.matrix.api.notification.NotificationData +import io.element.android.libraries.matrix.api.timeline.item.event.EventType +import io.element.android.libraries.push.impl.R +import io.element.android.libraries.push.impl.notifications.model.NotifiableEvent +import io.element.android.libraries.push.impl.notifications.model.NotifiableRingingCallEvent +import io.element.android.services.toolbox.api.strings.StringProvider +import javax.inject.Inject + +/** + * Helper to resolve a valid [NotifiableEvent] from a [NotificationData]. + */ +interface CallNotificationEventResolver { + /** + * Resolve a call notification event from a notification data depending on whether it should be a ringing one or not. + * @param sessionId the current session id + * @param notificationData the notification data + * @param forceNotify `true` to force the notification to be non-ringing, `false` to use the default behaviour. Default is `false`. + * @return a [NotifiableEvent] if the notification data is a call notification, null otherwise + */ + fun resolveEvent(sessionId: SessionId, notificationData: NotificationData, forceNotify: Boolean = false): NotifiableEvent? +} + +@ContributesBinding(AppScope::class) +class DefaultCallNotificationEventResolver @Inject constructor( + private val stringProvider: StringProvider, +) : CallNotificationEventResolver { + override fun resolveEvent(sessionId: SessionId, notificationData: NotificationData, forceNotify: Boolean): NotifiableEvent? { + val content = notificationData.content as? NotificationContent.MessageLike.CallNotify ?: return null + return notificationData.run { + if (NotifiableRingingCallEvent.shouldRing(content.type, timestamp) && !forceNotify) { + NotifiableRingingCallEvent( + sessionId = sessionId, + roomId = roomId, + eventId = eventId, + roomName = roomDisplayName, + editedEventId = null, + canBeReplaced = true, + timestamp = this.timestamp, + isRedacted = false, + isUpdated = false, + description = stringProvider.getString(R.string.notification_incoming_call), + senderDisambiguatedDisplayName = getDisambiguatedDisplayName(content.senderId), + roomAvatarUrl = roomAvatarUrl, + callNotifyType = content.type, + senderId = content.senderId, + senderAvatarUrl = senderAvatarUrl, + ) + } else { + // Create a simple message notification event + buildNotifiableMessageEvent( + sessionId = sessionId, + senderId = content.senderId, + roomId = roomId, + eventId = eventId, + noisy = true, + timestamp = this.timestamp, + senderDisambiguatedDisplayName = getDisambiguatedDisplayName(content.senderId), + body = "☎️ ${stringProvider.getString(R.string.notification_incoming_call)}", + roomName = roomDisplayName, + roomIsDirect = isDirect, + roomAvatarPath = roomAvatarUrl, + senderAvatarPath = senderAvatarUrl, + type = EventType.CALL_NOTIFY, + ) + } + } + } +} 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 78414fddd1..30ede8f3d1 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 @@ -36,6 +36,7 @@ import io.element.android.libraries.matrix.api.permalink.PermalinkParser import io.element.android.libraries.matrix.api.room.RoomMembershipState import io.element.android.libraries.matrix.api.timeline.item.event.AudioMessageType import io.element.android.libraries.matrix.api.timeline.item.event.EmoteMessageType +import io.element.android.libraries.matrix.api.timeline.item.event.EventType import io.element.android.libraries.matrix.api.timeline.item.event.FileMessageType import io.element.android.libraries.matrix.api.timeline.item.event.ImageMessageType import io.element.android.libraries.matrix.api.timeline.item.event.LocationMessageType @@ -77,6 +78,7 @@ class DefaultNotifiableEventResolver @Inject constructor( private val notificationMediaRepoFactory: NotificationMediaRepo.Factory, @ApplicationContext private val context: Context, private val permalinkParser: PermalinkParser, + private val callNotificationEventResolver: CallNotificationEventResolver, ) : NotifiableEventResolver { override suspend fun resolveEvent(sessionId: SessionId, roomId: RoomId, eventId: EventId): NotifiableEvent? { // Restore session @@ -150,8 +152,7 @@ class DefaultNotifiableEventResolver @Inject constructor( } NotificationContent.MessageLike.CallAnswer, NotificationContent.MessageLike.CallCandidates, - NotificationContent.MessageLike.CallHangup, - is NotificationContent.MessageLike.CallNotify -> { // TODO CallNotify will be handled separately in the future + NotificationContent.MessageLike.CallHangup -> { Timber.tag(loggerTag.value).d("Ignoring notification for call ${content.javaClass.simpleName}") null } @@ -172,6 +173,9 @@ class DefaultNotifiableEventResolver @Inject constructor( senderAvatarPath = senderAvatarUrl, ) } + is NotificationContent.MessageLike.CallNotify -> { + callNotificationEventResolver.resolveEvent(userId, this) + } NotificationContent.MessageLike.KeyVerificationAccept, NotificationContent.MessageLike.KeyVerificationCancel, NotificationContent.MessageLike.KeyVerificationDone, @@ -310,7 +314,7 @@ class DefaultNotifiableEventResolver @Inject constructor( } @Suppress("LongParameterList") -private fun buildNotifiableMessageEvent( +internal fun buildNotifiableMessageEvent( sessionId: SessionId, senderId: UserId, roomId: RoomId, @@ -334,7 +338,8 @@ private fun buildNotifiableMessageEvent( outGoingMessage: Boolean = false, outGoingMessageFailed: Boolean = false, isRedacted: Boolean = false, - isUpdated: Boolean = false + isUpdated: Boolean = false, + type: String = EventType.MESSAGE, ) = NotifiableMessageEvent( sessionId = sessionId, senderId = senderId, @@ -356,5 +361,6 @@ private fun buildNotifiableMessageEvent( outGoingMessage = outGoingMessage, outGoingMessageFailed = outGoingMessageFailed, isRedacted = isRedacted, - isUpdated = isUpdated + isUpdated = isUpdated, + type = type, ) diff --git a/libraries/push/impl/src/main/kotlin/io/element/android/libraries/push/impl/notifications/NotificationBitmapLoader.kt b/libraries/push/impl/src/main/kotlin/io/element/android/libraries/push/impl/notifications/DefaultNotificationBitmapLoader.kt similarity index 86% rename from libraries/push/impl/src/main/kotlin/io/element/android/libraries/push/impl/notifications/NotificationBitmapLoader.kt rename to libraries/push/impl/src/main/kotlin/io/element/android/libraries/push/impl/notifications/DefaultNotificationBitmapLoader.kt index 97232320c2..94ff9b8139 100644 --- a/libraries/push/impl/src/main/kotlin/io/element/android/libraries/push/impl/notifications/NotificationBitmapLoader.kt +++ b/libraries/push/impl/src/main/kotlin/io/element/android/libraries/push/impl/notifications/DefaultNotificationBitmapLoader.kt @@ -24,23 +24,27 @@ import androidx.core.graphics.drawable.toBitmap import coil.ImageLoader import coil.request.ImageRequest import coil.transform.CircleCropTransformation +import com.squareup.anvil.annotations.ContributesBinding +import io.element.android.libraries.di.AppScope import io.element.android.libraries.di.ApplicationContext import io.element.android.libraries.matrix.api.media.MediaSource import io.element.android.libraries.matrix.ui.media.MediaRequestData +import io.element.android.libraries.push.api.notifications.NotificationBitmapLoader import io.element.android.services.toolbox.api.sdk.BuildVersionSdkIntProvider import timber.log.Timber import javax.inject.Inject -class NotificationBitmapLoader @Inject constructor( +@ContributesBinding(AppScope::class) +class DefaultNotificationBitmapLoader @Inject constructor( @ApplicationContext private val context: Context, private val sdkIntProvider: BuildVersionSdkIntProvider, -) { +) : NotificationBitmapLoader { /** * Get icon of a room. * @param path mxc url * @param imageLoader Coil image loader */ - suspend fun getRoomBitmap(path: String?, imageLoader: ImageLoader): Bitmap? { + override suspend fun getRoomBitmap(path: String?, imageLoader: ImageLoader): Bitmap? { if (path == null) { return null } @@ -67,7 +71,7 @@ class NotificationBitmapLoader @Inject constructor( * @param path mxc url * @param imageLoader Coil image loader */ - suspend fun getUserIcon(path: String?, imageLoader: ImageLoader): IconCompat? { + override suspend fun getUserIcon(path: String?, imageLoader: ImageLoader): IconCompat? { if (path == null || sdkIntProvider.get() < Build.VERSION_CODES.P) { return null } diff --git a/libraries/push/impl/src/main/kotlin/io/element/android/libraries/push/impl/notifications/DefaultNotificationDrawerManager.kt b/libraries/push/impl/src/main/kotlin/io/element/android/libraries/push/impl/notifications/DefaultNotificationDrawerManager.kt index cfbf3c6950..f485e29847 100644 --- a/libraries/push/impl/src/main/kotlin/io/element/android/libraries/push/impl/notifications/DefaultNotificationDrawerManager.kt +++ b/libraries/push/impl/src/main/kotlin/io/element/android/libraries/push/impl/notifications/DefaultNotificationDrawerManager.kt @@ -31,6 +31,7 @@ import io.element.android.libraries.matrix.api.core.ThreadId import io.element.android.libraries.matrix.api.user.MatrixUser import io.element.android.libraries.matrix.ui.media.ImageLoaderHolder import io.element.android.libraries.push.api.notifications.NotificationDrawerManager +import io.element.android.libraries.push.api.notifications.NotificationIdProvider import io.element.android.libraries.push.impl.notifications.model.NotifiableEvent import io.element.android.libraries.push.impl.notifications.model.shouldIgnoreEventInRoom import io.element.android.services.appnavstate.api.AppNavigationStateService @@ -53,7 +54,6 @@ private val loggerTag = LoggerTag("DefaultNotificationDrawerManager", LoggerTag. class DefaultNotificationDrawerManager @Inject constructor( private val notificationManager: NotificationManagerCompat, private val notificationRenderer: NotificationRenderer, - private val notificationIdProvider: NotificationIdProvider, private val appNavigationStateService: AppNavigationStateService, coroutineScope: CoroutineScope, private val matrixClientProvider: MatrixClientProvider, @@ -123,8 +123,8 @@ class DefaultNotificationDrawerManager @Inject constructor( /** * Clear all known message events for a [sessionId]. */ - fun clearAllMessagesEvents(sessionId: SessionId) { - notificationManager.cancel(null, notificationIdProvider.getRoomMessagesNotificationId(sessionId)) + override fun clearAllMessagesEvents(sessionId: SessionId) { + notificationManager.cancel(null, NotificationIdProvider.getRoomMessagesNotificationId(sessionId)) clearSummaryNotificationIfNeeded(sessionId) } @@ -141,8 +141,8 @@ class DefaultNotificationDrawerManager @Inject constructor( * Used to ignore events related to that room (no need to display notification) and clean any existing notification on this room. * Can also be called when a notification for this room is dismissed by the user. */ - fun clearMessagesForRoom(sessionId: SessionId, roomId: RoomId) { - notificationManager.cancel(roomId.value, notificationIdProvider.getRoomMessagesNotificationId(sessionId)) + override fun clearMessagesForRoom(sessionId: SessionId, roomId: RoomId) { + notificationManager.cancel(roomId.value, NotificationIdProvider.getRoomMessagesNotificationId(sessionId)) clearSummaryNotificationIfNeeded(sessionId) } @@ -164,8 +164,8 @@ class DefaultNotificationDrawerManager @Inject constructor( /** * Clear the notifications for a single event. */ - fun clearEvent(sessionId: SessionId, eventId: EventId) { - val id = notificationIdProvider.getRoomEventNotificationId(sessionId) + override fun clearEvent(sessionId: SessionId, eventId: EventId) { + val id = NotificationIdProvider.getRoomEventNotificationId(sessionId) notificationManager.cancel(eventId.value, id) clearSummaryNotificationIfNeeded(sessionId) } diff --git a/libraries/push/impl/src/main/kotlin/io/element/android/libraries/push/impl/notifications/DefaultOnMissedCallNotificationHandler.kt b/libraries/push/impl/src/main/kotlin/io/element/android/libraries/push/impl/notifications/DefaultOnMissedCallNotificationHandler.kt new file mode 100644 index 0000000000..dcc1fce3a8 --- /dev/null +++ b/libraries/push/impl/src/main/kotlin/io/element/android/libraries/push/impl/notifications/DefaultOnMissedCallNotificationHandler.kt @@ -0,0 +1,54 @@ +/* + * Copyright (c) 2024 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. + */ + +package io.element.android.libraries.push.impl.notifications + +import com.squareup.anvil.annotations.ContributesBinding +import io.element.android.libraries.di.AppScope +import io.element.android.libraries.matrix.api.MatrixClientProvider +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.push.api.notifications.OnMissedCallNotificationHandler +import javax.inject.Inject + +@ContributesBinding(AppScope::class) +class DefaultOnMissedCallNotificationHandler @Inject constructor( + private val matrixClientProvider: MatrixClientProvider, + private val defaultNotificationDrawerManager: DefaultNotificationDrawerManager, + private val callNotificationEventResolver: CallNotificationEventResolver, +) : OnMissedCallNotificationHandler { + override suspend fun addMissedCallNotification( + sessionId: SessionId, + roomId: RoomId, + eventId: EventId, + ) { + // Resolve the event and add a notification for it, at this point it should no longer be a ringing one + val notificationData = matrixClientProvider.getOrRestore(sessionId).getOrNull() + ?.notificationService() + ?.getNotification(sessionId, roomId, eventId) + ?.getOrNull() + ?: return + + val notifiableEvent = callNotificationEventResolver.resolveEvent( + sessionId = sessionId, + notificationData = notificationData, + // Make sure the notifiable event is not a ringing one + forceNotify = true, + ) + notifiableEvent?.let { defaultNotificationDrawerManager.onNotifiableEventReceived(it) } + } +} diff --git a/libraries/push/impl/src/main/kotlin/io/element/android/libraries/push/impl/notifications/NotificationActionIds.kt b/libraries/push/impl/src/main/kotlin/io/element/android/libraries/push/impl/notifications/NotificationActionIds.kt index 6141079130..1907d11732 100644 --- a/libraries/push/impl/src/main/kotlin/io/element/android/libraries/push/impl/notifications/NotificationActionIds.kt +++ b/libraries/push/impl/src/main/kotlin/io/element/android/libraries/push/impl/notifications/NotificationActionIds.kt @@ -20,16 +20,13 @@ import io.element.android.libraries.core.meta.BuildMeta import javax.inject.Inject /** - * Util class for creating notifications. - * Note: Cannot inject ColorProvider in the constructor, because it requires an Activity + * Util class for creating notifications action Ids, using the application id. */ - data class NotificationActionIds @Inject constructor( private val buildMeta: BuildMeta, ) { val join = "${buildMeta.applicationId}.NotificationActions.JOIN_ACTION" val reject = "${buildMeta.applicationId}.NotificationActions.REJECT_ACTION" - val quickLaunch = "${buildMeta.applicationId}.NotificationActions.QUICK_LAUNCH_ACTION" val markRoomRead = "${buildMeta.applicationId}.NotificationActions.MARK_ROOM_READ_ACTION" val smartReply = "${buildMeta.applicationId}.NotificationActions.SMART_REPLY_ACTION" val dismissSummary = "${buildMeta.applicationId}.NotificationActions.DISMISS_SUMMARY_ACTION" @@ -37,5 +34,4 @@ data class NotificationActionIds @Inject constructor( val dismissInvite = "${buildMeta.applicationId}.NotificationActions.DISMISS_INVITE_NOTIF_ACTION" val dismissEvent = "${buildMeta.applicationId}.NotificationActions.DISMISS_EVENT_NOTIF_ACTION" val diagnostic = "${buildMeta.applicationId}.NotificationActions.DIAGNOSTIC" - val push = "${buildMeta.applicationId}.PUSH" } diff --git a/libraries/push/impl/src/main/kotlin/io/element/android/libraries/push/impl/notifications/NotificationBroadcastReceiver.kt b/libraries/push/impl/src/main/kotlin/io/element/android/libraries/push/impl/notifications/NotificationBroadcastReceiver.kt index 0f00d552e7..5933cb885f 100644 --- a/libraries/push/impl/src/main/kotlin/io/element/android/libraries/push/impl/notifications/NotificationBroadcastReceiver.kt +++ b/libraries/push/impl/src/main/kotlin/io/element/android/libraries/push/impl/notifications/NotificationBroadcastReceiver.kt @@ -19,210 +19,20 @@ package io.element.android.libraries.push.impl.notifications import android.content.BroadcastReceiver import android.content.Context import android.content.Intent -import io.element.android.features.preferences.api.store.SessionPreferencesStoreFactory import io.element.android.libraries.architecture.bindings -import io.element.android.libraries.core.log.logger.LoggerTag -import io.element.android.libraries.matrix.api.MatrixClientProvider -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.timeline.ReceiptType -import kotlinx.coroutines.CoroutineScope -import kotlinx.coroutines.flow.first -import kotlinx.coroutines.launch -import timber.log.Timber import javax.inject.Inject -private val loggerTag = LoggerTag("NotificationBroadcastReceiver", LoggerTag.NotificationLoggerTag) - /** * Receives actions broadcast by notification (on click, on dismiss, inline replies, etc.). */ class NotificationBroadcastReceiver : BroadcastReceiver() { - @Inject lateinit var appCoroutineScope: CoroutineScope - @Inject lateinit var matrixClientProvider: MatrixClientProvider - @Inject lateinit var sessionPreferencesStore: SessionPreferencesStoreFactory - @Inject lateinit var defaultNotificationDrawerManager: DefaultNotificationDrawerManager - @Inject lateinit var actionIds: NotificationActionIds + @Inject lateinit var notificationBroadcastReceiverHandler: NotificationBroadcastReceiverHandler override fun onReceive(context: Context?, intent: Intent?) { if (intent == null || context == null) return - val sessionId = intent.extras?.getString(KEY_SESSION_ID)?.let(::SessionId) ?: return - val roomId = intent.getStringExtra(KEY_ROOM_ID)?.let(::RoomId) - val eventId = intent.getStringExtra(KEY_EVENT_ID)?.let(::EventId) - context.bindings().inject(this) - - Timber.tag(loggerTag.value).d("onReceive: ${intent.action} ${intent.data} for: ${roomId?.value}/${eventId?.value}") - when (intent.action) { - actionIds.smartReply -> - handleSmartReply(intent, context) - actionIds.dismissRoom -> if (roomId != null) { - defaultNotificationDrawerManager.clearMessagesForRoom(sessionId, roomId) - } - actionIds.dismissSummary -> - defaultNotificationDrawerManager.clearAllMessagesEvents(sessionId) - actionIds.dismissInvite -> if (roomId != null) { - defaultNotificationDrawerManager.clearMembershipNotificationForRoom(sessionId, roomId) - } - actionIds.dismissEvent -> if (eventId != null) { - defaultNotificationDrawerManager.clearEvent(sessionId, eventId) - } - actionIds.markRoomRead -> if (roomId != null) { - defaultNotificationDrawerManager.clearMessagesForRoom(sessionId, roomId) - handleMarkAsRead(sessionId, roomId) - } - actionIds.join -> if (roomId != null) { - defaultNotificationDrawerManager.clearMembershipNotificationForRoom(sessionId, roomId) - handleJoinRoom(sessionId, roomId) - } - actionIds.reject -> if (roomId != null) { - defaultNotificationDrawerManager.clearMembershipNotificationForRoom(sessionId, roomId) - handleRejectRoom(sessionId, roomId) - } - } - } - - private fun handleJoinRoom(sessionId: SessionId, roomId: RoomId) = appCoroutineScope.launch { - val client = matrixClientProvider.getOrRestore(sessionId).getOrNull() ?: return@launch - client.joinRoom(roomId) - } - - private fun handleRejectRoom(sessionId: SessionId, roomId: RoomId) = appCoroutineScope.launch { - val client = matrixClientProvider.getOrRestore(sessionId).getOrNull() ?: return@launch - client.getRoom(roomId)?.leave() - } - - private fun handleMarkAsRead(sessionId: SessionId, roomId: RoomId) = appCoroutineScope.launch { - val client = matrixClientProvider.getOrRestore(sessionId).getOrNull() ?: return@launch - val isSendPublicReadReceiptsEnabled = sessionPreferencesStore.get(sessionId, this).isSendPublicReadReceiptsEnabled().first() - val receiptType = if (isSendPublicReadReceiptsEnabled) { - ReceiptType.READ - } else { - ReceiptType.READ_PRIVATE - } - client.getRoom(roomId)?.markAsRead(receiptType = receiptType) - } - - @Suppress("UNUSED_PARAMETER") - private fun handleSmartReply(intent: Intent, context: Context) { - /* - val message = getReplyMessage(intent) - val sessionId = intent.getStringExtra(KEY_SESSION_ID)?.let(::SessionId) - val roomId = intent.getStringExtra(KEY_ROOM_ID)?.let(::RoomId) - val threadId = intent.getStringExtra(KEY_THREAD_ID)?.let(::ThreadId) - - if (message.isNullOrBlank() || roomId == null) { - // ignore this event - // Can this happen? should we update notification? - return - } - activeSessionHolder.getActiveSession().let { session -> - session.getRoom(roomId)?.let { room -> - sendMatrixEvent(message, threadId, session, room, context) - } - } - */ - } - - /* - private fun sendMatrixEvent(message: String, threadId: String?, session: Session, room: Room, context: Context?) { - if (threadId != null) { - room.relationService().replyInThread( - rootThreadEventId = threadId, - replyInThreadText = message, - ) - } else { - room.sendService().sendTextMessage(message) - } - - // Create a new event to be displayed in the notification drawer, right now - - val notifiableMessageEvent = NotifiableMessageEvent( - // Generate a Fake event id - eventId = UUID.randomUUID().toString(), - editedEventId = null, - noisy = false, - timestamp = clock.epochMillis(), - senderName = session.roomService().getRoomMember(session.myUserId, room.roomId)?.displayName - ?: context?.getString(R.string.notification_sender_me), - senderId = session.myUserId, - body = message, - imageUriString = null, - roomId = room.roomId, - threadId = threadId, - roomName = room.roomSummary()?.displayName ?: room.roomId, - roomIsDirect = room.roomSummary()?.isDirect == true, - outGoingMessage = true, - canBeReplaced = false - ) - - notificationDrawerManager.updateEvents { it.onNotifiableEventReceived(notifiableMessageEvent) } - - /* - // TODO Error cannot be managed the same way than in Riot - - val event = Event(mxMessage, session.credentials.userId, roomId) - room.storeOutgoingEvent(event) - room.sendEvent(event, object : MatrixCallback { - override fun onSuccess(info: Void?) { - Timber.v("Send message : onSuccess ") - } - - override fun onNetworkError(e: Exception) { - Timber.e(e, "Send message : onNetworkError") - onSmartReplyFailed(e.localizedMessage) - } - - override fun onMatrixError(e: MatrixError) { - Timber.v("Send message : onMatrixError " + e.message) - if (e is MXCryptoError) { - Toast.makeText(context, e.detailedErrorDescription, Toast.LENGTH_SHORT).show() - onSmartReplyFailed(e.detailedErrorDescription) - } else { - Toast.makeText(context, e.localizedMessage, Toast.LENGTH_SHORT).show() - onSmartReplyFailed(e.localizedMessage) - } - } - - override fun onUnexpectedError(e: Exception) { - Timber.e(e, "Send message : onUnexpectedError " + e.message) - onSmartReplyFailed(e.message) - } - - - fun onSmartReplyFailed(reason: String?) { - val notifiableMessageEvent = NotifiableMessageEvent( - event.eventId, - false, - clock.epochMillis(), - session.myUser?.displayname - ?: context?.getString(R.string.notification_sender_me), - session.myUserId, - message, - roomId, - room.getRoomDisplayName(context), - room.isDirect) - notifiableMessageEvent.outGoingMessage = true - notifiableMessageEvent.outGoingMessageFailed = true - - VectorApp.getInstance().notificationDrawerManager.onNotifiableEventReceived(notifiableMessageEvent) - VectorApp.getInstance().notificationDrawerManager.refreshNotificationDrawer(null) - } - }) - */ - } - - private fun getReplyMessage(intent: Intent?): String? { - if (intent != null) { - val remoteInput = RemoteInput.getResultsFromIntent(intent) - if (remoteInput != null) { - return remoteInput.getCharSequence(KEY_TEXT_REPLY)?.toString() - } - } - return null + notificationBroadcastReceiverHandler.onReceive(intent) } - */ companion object { const val KEY_SESSION_ID = "sessionID" 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 new file mode 100644 index 0000000000..1dc529cf58 --- /dev/null +++ b/libraries/push/impl/src/main/kotlin/io/element/android/libraries/push/impl/notifications/NotificationBroadcastReceiverHandler.kt @@ -0,0 +1,191 @@ +/* + * Copyright (c) 2024 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. + */ + +package io.element.android.libraries.push.impl.notifications + +import android.content.Intent +import io.element.android.features.preferences.api.store.SessionPreferencesStoreFactory +import io.element.android.libraries.core.log.logger.LoggerTag +import io.element.android.libraries.matrix.api.MatrixClientProvider +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.timeline.ReceiptType +import io.element.android.libraries.push.api.notifications.NotificationDrawerManager +import io.element.android.libraries.push.impl.R +import io.element.android.libraries.push.impl.notifications.model.NotifiableMessageEvent +import io.element.android.libraries.push.impl.push.OnNotifiableEventReceived +import io.element.android.services.toolbox.api.strings.StringProvider +import io.element.android.services.toolbox.api.systemclock.SystemClock +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.flow.first +import kotlinx.coroutines.launch +import timber.log.Timber +import java.util.UUID +import javax.inject.Inject + +private val loggerTag = LoggerTag("NotificationBroadcastReceiverHandler", LoggerTag.NotificationLoggerTag) + +class NotificationBroadcastReceiverHandler @Inject constructor( + private val appCoroutineScope: CoroutineScope, + private val matrixClientProvider: MatrixClientProvider, + private val sessionPreferencesStore: SessionPreferencesStoreFactory, + private val notificationDrawerManager: NotificationDrawerManager, + private val actionIds: NotificationActionIds, + private val systemClock: SystemClock, + private val onNotifiableEventReceived: OnNotifiableEventReceived, + private val stringProvider: StringProvider, + private val replyMessageExtractor: ReplyMessageExtractor, +) { + fun onReceive(intent: Intent) { + val sessionId = intent.getStringExtra(NotificationBroadcastReceiver.KEY_SESSION_ID)?.let(::SessionId) ?: return + val roomId = intent.getStringExtra(NotificationBroadcastReceiver.KEY_ROOM_ID)?.let(::RoomId) + val threadId = intent.getStringExtra(NotificationBroadcastReceiver.KEY_THREAD_ID)?.let(::ThreadId) + val eventId = intent.getStringExtra(NotificationBroadcastReceiver.KEY_EVENT_ID)?.let(::EventId) + + 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) + } + actionIds.dismissRoom -> if (roomId != null) { + notificationDrawerManager.clearMessagesForRoom(sessionId, roomId) + } + actionIds.dismissSummary -> + notificationDrawerManager.clearAllMessagesEvents(sessionId) + actionIds.dismissInvite -> if (roomId != null) { + notificationDrawerManager.clearMembershipNotificationForRoom(sessionId, roomId) + } + actionIds.dismissEvent -> if (eventId != null) { + notificationDrawerManager.clearEvent(sessionId, eventId) + } + actionIds.markRoomRead -> if (roomId != null) { + notificationDrawerManager.clearMessagesForRoom(sessionId, roomId) + handleMarkAsRead(sessionId, roomId) + } + actionIds.join -> if (roomId != null) { + notificationDrawerManager.clearMembershipNotificationForRoom(sessionId, roomId) + handleJoinRoom(sessionId, roomId) + } + actionIds.reject -> if (roomId != null) { + notificationDrawerManager.clearMembershipNotificationForRoom(sessionId, roomId) + handleRejectRoom(sessionId, roomId) + } + } + } + + private fun handleJoinRoom(sessionId: SessionId, roomId: RoomId) = appCoroutineScope.launch { + val client = matrixClientProvider.getOrRestore(sessionId).getOrNull() ?: return@launch + client.joinRoom(roomId) + } + + private fun handleRejectRoom(sessionId: SessionId, roomId: RoomId) = appCoroutineScope.launch { + val client = matrixClientProvider.getOrRestore(sessionId).getOrNull() ?: return@launch + client.getRoom(roomId)?.leave() + } + + private fun handleMarkAsRead(sessionId: SessionId, roomId: RoomId) = appCoroutineScope.launch { + val client = matrixClientProvider.getOrRestore(sessionId).getOrNull() ?: return@launch + val isSendPublicReadReceiptsEnabled = sessionPreferencesStore.get(sessionId, this).isSendPublicReadReceiptsEnabled().first() + val receiptType = if (isSendPublicReadReceiptsEnabled) { + ReceiptType.READ + } else { + ReceiptType.READ_PRIVATE + } + client.getRoom(roomId)?.markAsRead(receiptType = receiptType) + } + + private fun handleSmartReply( + sessionId: SessionId, + roomId: RoomId, + threadId: ThreadId?, + intent: Intent, + ) = appCoroutineScope.launch { + val message = replyMessageExtractor.getReplyMessage(intent) + if (message.isNullOrBlank()) { + // ignore this event + // Can this happen? should we update notification? + return@launch + } + val client = matrixClientProvider.getOrRestore(sessionId).getOrNull() ?: return@launch + client.getRoom(roomId)?.let { room -> + sendMatrixEvent( + sessionId = sessionId, + roomId = roomId, + threadId = threadId, + room = room, + message = message, + ) + } + } + + private suspend fun sendMatrixEvent( + sessionId: SessionId, + roomId: RoomId, + threadId: ThreadId?, + room: MatrixRoom, + message: String, + ) { + // Create a new event to be displayed in the notification drawer, right now + val notifiableMessageEvent = NotifiableMessageEvent( + sessionId = sessionId, + roomId = roomId, + // Generate a Fake event id + eventId = EventId("\$" + UUID.randomUUID().toString()), + editedEventId = null, + canBeReplaced = false, + senderId = sessionId, + noisy = false, + timestamp = systemClock.epochMillis(), + senderDisambiguatedDisplayName = room.getUpdatedMember(sessionId).getOrNull() + ?.disambiguatedDisplayName + ?: stringProvider.getString(R.string.notification_sender_me), + body = message, + imageUriString = null, + threadId = threadId, + roomName = room.displayName, + roomIsDirect = room.isDirect, + outGoingMessage = true, + ) + onNotifiableEventReceived.onNotifiableEventReceived(notifiableMessageEvent) + + if (threadId != null) { + room.liveTimeline.replyMessage( + eventId = threadId.asEventId(), + body = message, + htmlBody = null, + mentions = emptyList(), + fromNotification = true, + ) + } else { + room.liveTimeline.sendMessage( + body = message, + htmlBody = null, + mentions = emptyList() + ) + }.onFailure { + Timber.e(it, "Failed to send smart reply message") + onNotifiableEventReceived.onNotifiableEventReceived( + notifiableMessageEvent.copy( + outGoingMessageFailed = true + ) + ) + } + } +} diff --git a/libraries/push/impl/src/main/kotlin/io/element/android/libraries/push/impl/notifications/NotificationDataFactory.kt b/libraries/push/impl/src/main/kotlin/io/element/android/libraries/push/impl/notifications/NotificationDataFactory.kt index aff2cc7fca..a0b7e30218 100644 --- a/libraries/push/impl/src/main/kotlin/io/element/android/libraries/push/impl/notifications/NotificationDataFactory.kt +++ b/libraries/push/impl/src/main/kotlin/io/element/android/libraries/push/impl/notifications/NotificationDataFactory.kt @@ -49,6 +49,8 @@ interface NotificationDataFactory { @JvmName("toNotificationSimpleEvents") @Suppress("INAPPLICABLE_JVM_NAME") fun toNotifications(simpleEvents: List): List + @JvmName("toNotificationFallbackEvents") + @Suppress("INAPPLICABLE_JVM_NAME") fun toNotifications(fallback: List): List fun createSummaryNotification( @@ -130,6 +132,8 @@ class DefaultNotificationDataFactory @Inject constructor( } } + @JvmName("toNotificationFallbackEvents") + @Suppress("INAPPLICABLE_JVM_NAME") override fun toNotifications(fallback: List): List { return fallback.map { event -> OneShotNotification( diff --git a/libraries/push/impl/src/main/kotlin/io/element/android/libraries/push/impl/notifications/NotificationRenderer.kt b/libraries/push/impl/src/main/kotlin/io/element/android/libraries/push/impl/notifications/NotificationRenderer.kt index a1509aaa96..e36966cc9a 100644 --- a/libraries/push/impl/src/main/kotlin/io/element/android/libraries/push/impl/notifications/NotificationRenderer.kt +++ b/libraries/push/impl/src/main/kotlin/io/element/android/libraries/push/impl/notifications/NotificationRenderer.kt @@ -19,10 +19,12 @@ package io.element.android.libraries.push.impl.notifications import coil.ImageLoader import io.element.android.libraries.core.log.logger.LoggerTag import io.element.android.libraries.matrix.api.user.MatrixUser +import io.element.android.libraries.push.api.notifications.NotificationIdProvider import io.element.android.libraries.push.impl.notifications.model.FallbackNotifiableEvent import io.element.android.libraries.push.impl.notifications.model.InviteNotifiableEvent import io.element.android.libraries.push.impl.notifications.model.NotifiableEvent import io.element.android.libraries.push.impl.notifications.model.NotifiableMessageEvent +import io.element.android.libraries.push.impl.notifications.model.NotifiableRingingCallEvent import io.element.android.libraries.push.impl.notifications.model.SimpleNotifiableEvent import timber.log.Timber import javax.inject.Inject @@ -30,7 +32,6 @@ import javax.inject.Inject private val loggerTag = LoggerTag("NotificationRenderer", LoggerTag.NotificationLoggerTag) class NotificationRenderer @Inject constructor( - private val notificationIdProvider: NotificationIdProvider, private val notificationDisplayer: NotificationDisplayer, private val notificationDataFactory: NotificationDataFactory, ) { @@ -59,14 +60,14 @@ class NotificationRenderer @Inject constructor( Timber.tag(loggerTag.value).d("Removing summary notification") notificationDisplayer.cancelNotificationMessage( tag = null, - id = notificationIdProvider.getSummaryNotificationId(currentUser.userId) + id = NotificationIdProvider.getSummaryNotificationId(currentUser.userId) ) } roomNotifications.forEach { notificationData -> notificationDisplayer.showNotificationMessage( tag = notificationData.roomId.value, - id = notificationIdProvider.getRoomMessagesNotificationId(currentUser.userId), + id = NotificationIdProvider.getRoomMessagesNotificationId(currentUser.userId), notification = notificationData.notification ) } @@ -76,7 +77,7 @@ class NotificationRenderer @Inject constructor( Timber.tag(loggerTag.value).d("Updating invitation notification ${notificationData.key}") notificationDisplayer.showNotificationMessage( tag = notificationData.key, - id = notificationIdProvider.getRoomInvitationNotificationId(currentUser.userId), + id = NotificationIdProvider.getRoomInvitationNotificationId(currentUser.userId), notification = notificationData.notification ) } @@ -87,7 +88,7 @@ class NotificationRenderer @Inject constructor( Timber.tag(loggerTag.value).d("Updating simple notification ${notificationData.key}") notificationDisplayer.showNotificationMessage( tag = notificationData.key, - id = notificationIdProvider.getRoomEventNotificationId(currentUser.userId), + id = NotificationIdProvider.getRoomEventNotificationId(currentUser.userId), notification = notificationData.notification ) } @@ -98,7 +99,7 @@ class NotificationRenderer @Inject constructor( Timber.tag(loggerTag.value).d("Showing fallback notification") notificationDisplayer.showNotificationMessage( tag = "FALLBACK", - id = notificationIdProvider.getFallbackNotificationId(currentUser.userId), + id = NotificationIdProvider.getFallbackNotificationId(currentUser.userId), notification = fallbackNotifications.first().notification ) } @@ -108,7 +109,7 @@ class NotificationRenderer @Inject constructor( Timber.tag(loggerTag.value).d("Updating summary notification") notificationDisplayer.showNotificationMessage( tag = null, - id = notificationIdProvider.getSummaryNotificationId(currentUser.userId), + id = NotificationIdProvider.getSummaryNotificationId(currentUser.userId), notification = summaryNotification.notification ) } @@ -127,6 +128,8 @@ private fun List.groupByType(): GroupedNotificationEvents { is NotifiableMessageEvent -> roomEvents.add(event.castedToEventType()) is SimpleNotifiableEvent -> simpleEvents.add(event.castedToEventType()) is FallbackNotifiableEvent -> fallbackEvents.add(event.castedToEventType()) + // Nothing should be done for ringing call events as they're not handled here + is NotifiableRingingCallEvent -> {} } } return GroupedNotificationEvents(roomEvents, simpleEvents, invitationEvents, fallbackEvents) diff --git a/libraries/push/impl/src/main/kotlin/io/element/android/libraries/push/impl/notifications/ReplyMessageExtractor.kt b/libraries/push/impl/src/main/kotlin/io/element/android/libraries/push/impl/notifications/ReplyMessageExtractor.kt new file mode 100644 index 0000000000..8c7fc5dbd8 --- /dev/null +++ b/libraries/push/impl/src/main/kotlin/io/element/android/libraries/push/impl/notifications/ReplyMessageExtractor.kt @@ -0,0 +1,36 @@ +/* + * Copyright (c) 2024 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. + */ + +package io.element.android.libraries.push.impl.notifications + +import android.content.Intent +import androidx.core.app.RemoteInput +import com.squareup.anvil.annotations.ContributesBinding +import io.element.android.libraries.di.AppScope +import javax.inject.Inject + +interface ReplyMessageExtractor { + fun getReplyMessage(intent: Intent): String? +} + +@ContributesBinding(AppScope::class) +class AndroidReplyMessageExtractor @Inject constructor() : ReplyMessageExtractor { + override fun getReplyMessage(intent: Intent): String? { + return RemoteInput.getResultsFromIntent(intent) + ?.getCharSequence(NotificationBroadcastReceiver.KEY_TEXT_REPLY) + ?.toString() + } +} diff --git a/libraries/push/impl/src/main/kotlin/io/element/android/libraries/push/impl/notifications/RoomGroupMessageCreator.kt b/libraries/push/impl/src/main/kotlin/io/element/android/libraries/push/impl/notifications/RoomGroupMessageCreator.kt index 3285a7ae90..9fcbf8c152 100644 --- a/libraries/push/impl/src/main/kotlin/io/element/android/libraries/push/impl/notifications/RoomGroupMessageCreator.kt +++ b/libraries/push/impl/src/main/kotlin/io/element/android/libraries/push/impl/notifications/RoomGroupMessageCreator.kt @@ -23,6 +23,7 @@ import com.squareup.anvil.annotations.ContributesBinding import io.element.android.libraries.di.AppScope import io.element.android.libraries.matrix.api.core.RoomId import io.element.android.libraries.matrix.api.user.MatrixUser +import io.element.android.libraries.push.api.notifications.NotificationBitmapLoader import io.element.android.libraries.push.impl.R import io.element.android.libraries.push.impl.notifications.factories.NotificationCreator import io.element.android.libraries.push.impl.notifications.factories.isSmartReplyError diff --git a/libraries/push/impl/src/main/kotlin/io/element/android/libraries/push/impl/notifications/channels/NotificationChannels.kt b/libraries/push/impl/src/main/kotlin/io/element/android/libraries/push/impl/notifications/channels/NotificationChannels.kt index 8c74f845b7..a40871be4c 100644 --- a/libraries/push/impl/src/main/kotlin/io/element/android/libraries/push/impl/notifications/channels/NotificationChannels.kt +++ b/libraries/push/impl/src/main/kotlin/io/element/android/libraries/push/impl/notifications/channels/NotificationChannels.kt @@ -19,10 +19,15 @@ package io.element.android.libraries.push.impl.notifications.channels import android.app.NotificationChannel import android.app.NotificationManager import android.content.Context +import android.media.AudioAttributes +import android.media.AudioManager +import android.media.RingtoneManager import android.os.Build import androidx.annotation.ChecksSdkIntAtLeast +import androidx.core.app.NotificationChannelCompat import androidx.core.app.NotificationManagerCompat import androidx.core.content.ContextCompat +import com.squareup.anvil.annotations.ContributesBinding import io.element.android.libraries.di.AppScope import io.element.android.libraries.di.ApplicationContext import io.element.android.libraries.di.SingleIn @@ -30,15 +35,51 @@ import io.element.android.libraries.push.impl.R import io.element.android.services.toolbox.api.strings.StringProvider import javax.inject.Inject +/* ========================================================================================== + * IDs for channels + * ========================================================================================== */ +private const val LISTENING_FOR_EVENTS_NOTIFICATION_CHANNEL_ID = "LISTEN_FOR_EVENTS_NOTIFICATION_CHANNEL_ID" +internal const val SILENT_NOTIFICATION_CHANNEL_ID = "DEFAULT_SILENT_NOTIFICATION_CHANNEL_ID_V2" +internal const val NOISY_NOTIFICATION_CHANNEL_ID = "DEFAULT_NOISY_NOTIFICATION_CHANNEL_ID" + +// Legacy channel +private const val CALL_NOTIFICATION_CHANNEL_ID_V2 = "CALL_NOTIFICATION_CHANNEL_ID_V2" + +internal const val CALL_NOTIFICATION_CHANNEL_ID_V3 = "CALL_NOTIFICATION_CHANNEL_ID_V3" +internal const val RINGING_CALL_NOTIFICATION_CHANNEL_ID = "RINGING_CALL_NOTIFICATION_CHANNEL_ID" + /** * on devices >= android O, we need to define a channel for each notifications. */ +interface NotificationChannels { + /** + * Get the channel for incoming call. + * @param ring true if the device should ring when receiving the call. + */ + fun getChannelForIncomingCall(ring: Boolean): String + + /** + * Get the channel for messages. + * @param noisy true if the notification should have sound and vibration. + */ + fun getChannelIdForMessage(noisy: Boolean): String + + /** + * Get the channel for test notifications. + */ + fun getChannelIdForTest(): String +} + +@ChecksSdkIntAtLeast(api = Build.VERSION_CODES.O) +private fun supportNotificationChannels() = Build.VERSION.SDK_INT >= Build.VERSION_CODES.O + @SingleIn(AppScope::class) -class NotificationChannels @Inject constructor( +@ContributesBinding(AppScope::class) +class DefaultNotificationChannels @Inject constructor( @ApplicationContext private val context: Context, private val notificationManager: NotificationManagerCompat, private val stringProvider: StringProvider, -) { +) : NotificationChannels { init { createNotificationChannels() } @@ -75,6 +116,9 @@ class NotificationChannels @Inject constructor( } } + // Migration - Create new call channel + notificationManager.deleteNotificationChannel(CALL_NOTIFICATION_CHANNEL_ID_V2) + /** * Default notification importance: shows everywhere, makes noise, but does not visually * intrude. @@ -123,46 +167,52 @@ class NotificationChannels @Inject constructor( } ) + // Register a channel for incoming and in progress call notifications with no ringing notificationManager.createNotificationChannel( NotificationChannel( - CALL_NOTIFICATION_CHANNEL_ID, + CALL_NOTIFICATION_CHANNEL_ID_V3, stringProvider.getString(R.string.notification_channel_call).ifEmpty { "Call" }, NotificationManager.IMPORTANCE_HIGH ) .apply { description = stringProvider.getString(R.string.notification_channel_call) - setSound(null, null) + enableVibration(true) enableLights(true) lightColor = accentColor } ) - } - private fun getChannel(channelId: String): NotificationChannel? { - return notificationManager.getNotificationChannel(channelId) + // Register a channel for incoming call notifications which will ring the device when received + val ringtoneUri = RingtoneManager.getActualDefaultRingtoneUri(context, RingtoneManager.TYPE_RINGTONE) + notificationManager.createNotificationChannel( + NotificationChannelCompat.Builder( + RINGING_CALL_NOTIFICATION_CHANNEL_ID, + NotificationManagerCompat.IMPORTANCE_MAX, + ) + .setName(stringProvider.getString(R.string.notification_channel_ringing_calls).ifEmpty { "Ringing calls" }) + .setVibrationEnabled(true) + .setSound( + ringtoneUri, + AudioAttributes.Builder() + .setContentType(AudioAttributes.CONTENT_TYPE_SONIFICATION) + .setLegacyStreamType(AudioManager.STREAM_RING) + .setUsage(AudioAttributes.USAGE_NOTIFICATION_RINGTONE) + .build() + ) + .setDescription(stringProvider.getString(R.string.notification_channel_ringing_calls)) + .setLightsEnabled(true) + .setLightColor(accentColor) + .build() + ) } - fun getChannelForIncomingCall(fromBg: Boolean): NotificationChannel? { - val notificationChannel = if (fromBg) CALL_NOTIFICATION_CHANNEL_ID else SILENT_NOTIFICATION_CHANNEL_ID - return getChannel(notificationChannel) + override fun getChannelForIncomingCall(ring: Boolean): String { + return if (ring) RINGING_CALL_NOTIFICATION_CHANNEL_ID else CALL_NOTIFICATION_CHANNEL_ID_V3 } - fun getChannelIdForMessage(noisy: Boolean): String { + override fun getChannelIdForMessage(noisy: Boolean): String { return if (noisy) NOISY_NOTIFICATION_CHANNEL_ID else SILENT_NOTIFICATION_CHANNEL_ID } - fun getChannelIdForTest(): String = NOISY_NOTIFICATION_CHANNEL_ID - - companion object { - /* ========================================================================================== - * IDs for channels - * ========================================================================================== */ - private const val LISTENING_FOR_EVENTS_NOTIFICATION_CHANNEL_ID = "LISTEN_FOR_EVENTS_NOTIFICATION_CHANNEL_ID" - private const val SILENT_NOTIFICATION_CHANNEL_ID = "DEFAULT_SILENT_NOTIFICATION_CHANNEL_ID_V2" - private const val NOISY_NOTIFICATION_CHANNEL_ID = "DEFAULT_NOISY_NOTIFICATION_CHANNEL_ID" - private const val CALL_NOTIFICATION_CHANNEL_ID = "CALL_NOTIFICATION_CHANNEL_ID_V2" - - @ChecksSdkIntAtLeast(api = Build.VERSION_CODES.O) - private fun supportNotificationChannels() = Build.VERSION.SDK_INT >= Build.VERSION_CODES.O - } + override fun getChannelIdForTest(): String = NOISY_NOTIFICATION_CHANNEL_ID } 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 cd6b32086b..5c8dd1dc77 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 @@ -35,9 +35,10 @@ import io.element.android.libraries.di.AppScope import io.element.android.libraries.di.ApplicationContext 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.timeline.item.event.EventType import io.element.android.libraries.matrix.api.user.MatrixUser +import io.element.android.libraries.push.api.notifications.NotificationBitmapLoader import io.element.android.libraries.push.impl.R -import io.element.android.libraries.push.impl.notifications.NotificationBitmapLoader import io.element.android.libraries.push.impl.notifications.RoomEventGroupInfo import io.element.android.libraries.push.impl.notifications.channels.NotificationChannels import io.element.android.libraries.push.impl.notifications.debug.annotateForDebug @@ -129,12 +130,16 @@ class DefaultNotificationCreator @Inject constructor( val smallIcon = CommonDrawables.ic_notification_small - val channelId = notificationChannels.getChannelIdForMessage(roomInfo.shouldBing) + val containsMissedCall = events.any { it.type == EventType.CALL_NOTIFY } + val channelId = if (containsMissedCall) { + notificationChannels.getChannelForIncomingCall(false) + } else { + notificationChannels.getChannelIdForMessage(noisy = roomInfo.shouldBing) + } val builder = if (existingNotification != null) { NotificationCompat.Builder(context, existingNotification) } else { NotificationCompat.Builder(context, channelId) - .setOnlyAlertOnce(roomInfo.isUpdated) // A category allows groups of notifications to be ranked and filtered – per user or system settings. // For example, alarm notifications should display before promo notifications, or message from known contact // that can be displayed in not disturb mode if white listed (the later will need compat28.x) @@ -210,6 +215,11 @@ class DefaultNotificationCreator @Inject constructor( setLargeIcon(largeIcon) } setDeleteIntent(pendingIntentFactory.createDismissRoomPendingIntent(roomInfo.sessionId, roomInfo.roomId)) + + // If any of the events are of call notify type it means a missed call, set the category to the right value + if (events.any { it.type == EventType.CALL_NOTIFY }) { + setCategory(NotificationCompat.CATEGORY_MISSED_CALL) + } } .setTicker(tickerText) .build() @@ -343,7 +353,6 @@ class DefaultNotificationCreator @Inject constructor( .setWhen(lastMessageTimestamp) .setCategory(NotificationCompat.CATEGORY_MESSAGE) .setSmallIcon(smallIcon) - // set content text to support devices running API level < 24 .setGroup(currentUser.userId.value) // set this notification as the summary for the group .setGroupSummary(true) diff --git a/libraries/push/impl/src/main/kotlin/io/element/android/libraries/push/impl/notifications/model/NotifiableMessageEvent.kt b/libraries/push/impl/src/main/kotlin/io/element/android/libraries/push/impl/notifications/model/NotifiableMessageEvent.kt index 015e24d5e6..4f3dbf57b3 100644 --- a/libraries/push/impl/src/main/kotlin/io/element/android/libraries/push/impl/notifications/model/NotifiableMessageEvent.kt +++ b/libraries/push/impl/src/main/kotlin/io/element/android/libraries/push/impl/notifications/model/NotifiableMessageEvent.kt @@ -51,9 +51,9 @@ data class NotifiableMessageEvent( val outGoingMessage: Boolean = false, val outGoingMessageFailed: Boolean = false, override val isRedacted: Boolean = false, - override val isUpdated: Boolean = false -) : NotifiableEvent { + override val isUpdated: Boolean = false, val type: String = EventType.MESSAGE +) : NotifiableEvent { override val description: String = body ?: "" // Example of value: @@ -69,9 +69,16 @@ fun NotifiableEvent.shouldIgnoreEventInRoom(appNavigationState: AppNavigationSta val currentSessionId = appNavigationState.navigationState.currentSessionId() ?: return false return when (val currentRoomId = appNavigationState.navigationState.currentRoomId()) { null -> false - else -> appNavigationState.isInForeground && - sessionId == currentSessionId && - roomId == currentRoomId && - (this as? NotifiableMessageEvent)?.threadId == appNavigationState.navigationState.currentThreadId() + else -> { + // Never ignore ringing call notifications + if (this is NotifiableRingingCallEvent) { + false + } else { + appNavigationState.isInForeground && + sessionId == currentSessionId && + roomId == currentRoomId && + (this as? NotifiableMessageEvent)?.threadId == appNavigationState.navigationState.currentThreadId() + } + } } } diff --git a/libraries/push/impl/src/main/kotlin/io/element/android/libraries/push/impl/notifications/model/NotifiableRingingCallEvent.kt b/libraries/push/impl/src/main/kotlin/io/element/android/libraries/push/impl/notifications/model/NotifiableRingingCallEvent.kt new file mode 100644 index 0000000000..0b9696177d --- /dev/null +++ b/libraries/push/impl/src/main/kotlin/io/element/android/libraries/push/impl/notifications/model/NotifiableRingingCallEvent.kt @@ -0,0 +1,52 @@ +/* + * Copyright (c) 2024 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. + */ + +package io.element.android.libraries.push.impl.notifications.model + +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.UserId +import io.element.android.libraries.matrix.api.notification.CallNotifyType +import java.time.Instant +import kotlin.time.Duration.Companion.seconds + +data class NotifiableRingingCallEvent( + override val sessionId: SessionId, + override val roomId: RoomId, + override val eventId: EventId, + override val editedEventId: EventId?, + override val description: String?, + override val canBeReplaced: Boolean, + override val isRedacted: Boolean, + override val isUpdated: Boolean, + val roomName: String?, + val senderId: UserId, + val senderDisambiguatedDisplayName: String?, + val senderAvatarUrl: String?, + val roomAvatarUrl: String? = null, + val callNotifyType: CallNotifyType, + val timestamp: Long, +) : NotifiableEvent { + companion object { + fun shouldRing(callNotifyType: CallNotifyType, timestamp: Long): Boolean { + val timeout = 10.seconds.inWholeMilliseconds + val elapsed = Instant.now().toEpochMilli() - timestamp + // Only ring if the type is RING and the elapsed time is less than the timeout + return callNotifyType == CallNotifyType.RING && elapsed < timeout + } + } +} 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 1d3f349364..fda14f294f 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 @@ -17,11 +17,15 @@ package io.element.android.libraries.push.impl.push import com.squareup.anvil.annotations.ContributesBinding +import io.element.android.features.call.api.CallType +import io.element.android.features.call.api.ElementCallEntryPoint import io.element.android.libraries.core.log.logger.LoggerTag import io.element.android.libraries.core.meta.BuildMeta import io.element.android.libraries.di.AppScope import io.element.android.libraries.matrix.api.auth.MatrixAuthenticationService import io.element.android.libraries.push.impl.notifications.NotifiableEventResolver +import io.element.android.libraries.push.impl.notifications.channels.NotificationChannels +import io.element.android.libraries.push.impl.notifications.model.NotifiableRingingCallEvent import io.element.android.libraries.push.impl.test.DefaultTestPush import io.element.android.libraries.push.impl.troubleshoot.DiagnosticPushHandler import io.element.android.libraries.pushproviders.api.PushData @@ -44,6 +48,8 @@ class DefaultPushHandler @Inject constructor( private val buildMeta: BuildMeta, private val matrixAuthenticationService: MatrixAuthenticationService, private val diagnosticPushHandler: DiagnosticPushHandler, + private val elementCallEntryPoint: ElementCallEntryPoint, + private val notificationChannels: NotificationChannels, ) : PushHandler { /** * Called when message is received. @@ -91,19 +97,33 @@ class DefaultPushHandler @Inject constructor( return } val userPushStore = userPushStoreFactory.getOrCreate(userId) - if (userPushStore.getNotificationEnabledForDevice().first()) { + val areNotificationsEnabled = userPushStore.getNotificationEnabledForDevice().first() + if (areNotificationsEnabled) { val notifiableEvent = notifiableEventResolver.resolveEvent(userId, pushData.roomId, pushData.eventId) - if (notifiableEvent == null) { - Timber.w("Unable to get a notification data") - return + when (notifiableEvent) { + null -> Timber.tag(loggerTag.value).w("Unable to get a notification data") + is NotifiableRingingCallEvent -> handleRingingCallEvent(notifiableEvent) + else -> onNotifiableEventReceived.onNotifiableEventReceived(notifiableEvent) } - onNotifiableEventReceived.onNotifiableEventReceived(notifiableEvent) } else { - // TODO We need to check if this is an incoming call Timber.tag(loggerTag.value).i("Notification are disabled for this device, ignore push.") } } catch (e: Exception) { Timber.tag(loggerTag.value).e(e, "## handleInternal() failed") } } + + private fun handleRingingCallEvent(notifiableEvent: NotifiableRingingCallEvent) { + Timber.i("## handleInternal() : Incoming call.") + elementCallEntryPoint.handleIncomingCall( + callType = CallType.RoomCall(notifiableEvent.sessionId, notifiableEvent.roomId), + eventId = notifiableEvent.eventId, + senderId = notifiableEvent.senderId, + roomName = notifiableEvent.roomName, + senderName = notifiableEvent.senderDisambiguatedDisplayName, + avatarUrl = notifiableEvent.roomAvatarUrl, + timestamp = notifiableEvent.timestamp, + notificationChannelId = notificationChannels.getChannelForIncomingCall(ring = true), + ) + } } diff --git a/libraries/push/impl/src/main/res/values-be/translations.xml b/libraries/push/impl/src/main/res/values-be/translations.xml index bccd5df946..074693ec08 100644 --- a/libraries/push/impl/src/main/res/values-be/translations.xml +++ b/libraries/push/impl/src/main/res/values-be/translations.xml @@ -3,6 +3,7 @@ "Пазваніць" "Праслухоўванне падзей" "Шумныя апавяшчэнні" + "Званкі" "Ціхія апавяшчэнні" "%1$s: %2$d паведамленне" @@ -15,6 +16,7 @@ "%d апавяшчэнняў" "Апавяшчэнне" + "Уваходны званок" "** Не атрымалася даслаць - калі ласка, адкрыйце пакой" "Далучыцца" "Адхіліць" diff --git a/libraries/push/impl/src/main/res/values-cs/translations.xml b/libraries/push/impl/src/main/res/values-cs/translations.xml index c2d93dc94b..d0f83fd311 100644 --- a/libraries/push/impl/src/main/res/values-cs/translations.xml +++ b/libraries/push/impl/src/main/res/values-cs/translations.xml @@ -3,6 +3,7 @@ "Hovor" "Naslouchání událostem" "Hlasitá oznámení" + "Vyzvánění hovorů" "Tichá oznámení" "%1$s: %2$d zpráva" @@ -15,6 +16,7 @@ "%d oznámení" "Oznámení" + "Příchozí hovor" "** Nepodařilo se odeslat - otevřete prosím místnost" "Vstoupit" "Odmítnout" diff --git a/libraries/push/impl/src/main/res/values-et/translations.xml b/libraries/push/impl/src/main/res/values-et/translations.xml new file mode 100644 index 0000000000..a2899757d1 --- /dev/null +++ b/libraries/push/impl/src/main/res/values-et/translations.xml @@ -0,0 +1,49 @@ + + + "Kõne" + "Kontrollime, kas on uusi sündmusi" + "Lärmakad teavitused" + "Vaiksed teavitused" + + "%1$s: %2$d sõnum" + "%1$s: %2$d sõnumit" + + + "%d teavitus" + "%d teavitust" + + "Teavitus" + "** Saatmine ei õnnestunud - palun ava jututoa täisvaade" + "Liitu" + "Lükka tagasi" + + "%d kutse" + "%d kutset" + + "Kutse osalema vestluses" + "Mainis sind: %1$s" + "Uued sõnumid" + + "%d uus sõnum" + "%d uut sõnumit" + + "Kiirvastus" + "Mina" + "See ongi teavitus! Klõpsi mind!" + "%1$s: %2$s" + + "%d lugemata sõnum, millele on teavitus saadetud" + "%d lugemata sõnumit, millele on teavitus saadetud" + + "%1$s ja %2$s" + "%1$s jututoas %2$s" + "%1$s jututoas %2$s ning kutse jututuppa %3$s" + + "%d jututuba" + "%d jututuba" + + "Sünkroniseerimine taustal" + "Google\'i teenused" + "Google Play Services taustateenust ei leidu. Teavitused ei pruugi toimida korrektselt." + "Viga: %1$s." + diff --git a/libraries/push/impl/src/main/res/values-pt/translations.xml b/libraries/push/impl/src/main/res/values-pt/translations.xml index c5513675f5..a756150247 100644 --- a/libraries/push/impl/src/main/res/values-pt/translations.xml +++ b/libraries/push/impl/src/main/res/values-pt/translations.xml @@ -3,6 +3,7 @@ "Chamada" "À escuta de eventos" "Notificações barulhentas" + "Chamadas a tocar" "Notificações silenciosas" "%1$s: %2$d mensagem" @@ -13,6 +14,7 @@ "%d notificações" "Notificação" + "Chamada recebida" "** Falha no envio - por favor abre a sala" "Entrar" "Rejeitar" diff --git a/libraries/push/impl/src/main/res/values-ru/translations.xml b/libraries/push/impl/src/main/res/values-ru/translations.xml index ff78cba4ee..30a2128d63 100644 --- a/libraries/push/impl/src/main/res/values-ru/translations.xml +++ b/libraries/push/impl/src/main/res/values-ru/translations.xml @@ -3,6 +3,7 @@ "Позвонить" "Прослушивание событий" "Шумные уведомления" + "Звонки" "Бесшумные уведомления" "%1$s: %2$d сообщение" @@ -15,6 +16,7 @@ "%d уведомлений" "Уведомление" + "Входящий вызов" "** Не удалось отправить - пожалуйста, откройте комнату" "Присоединиться" "Отклонить" diff --git a/libraries/push/impl/src/main/res/values-sk/translations.xml b/libraries/push/impl/src/main/res/values-sk/translations.xml index e984d1547c..a0639b695b 100644 --- a/libraries/push/impl/src/main/res/values-sk/translations.xml +++ b/libraries/push/impl/src/main/res/values-sk/translations.xml @@ -3,6 +3,7 @@ "Zavolať" "Počúvanie udalostí" "Hlasité oznámenia" + "Vyzváňanie hovorov" "Tiché oznámenia" "%1$s: %2$d správa" @@ -15,6 +16,7 @@ "%d oznámení" "Oznámenie" + "Prichádzajúci hovor" "** Nepodarilo sa odoslať - prosím otvorte miestnosť" "Pripojiť sa" "Zamietnuť" diff --git a/libraries/push/impl/src/main/res/values/localazy.xml b/libraries/push/impl/src/main/res/values/localazy.xml index 1064d5c31e..e1bfa07d29 100644 --- a/libraries/push/impl/src/main/res/values/localazy.xml +++ b/libraries/push/impl/src/main/res/values/localazy.xml @@ -3,6 +3,7 @@ "Call" "Listening for events" "Noisy notifications" + "Ringing calls" "Silent notifications" "%1$s: %2$d message" @@ -13,6 +14,7 @@ "%d notifications" "Notification" + "Incoming call" "** Failed to send - please open room" "Join" "Reject" diff --git a/libraries/push/impl/src/test/kotlin/io/element/android/libraries/push/impl/notifications/DefaultActiveNotificationsProviderTest.kt b/libraries/push/impl/src/test/kotlin/io/element/android/libraries/push/impl/notifications/DefaultActiveNotificationsProviderTest.kt index 4f715ed283..70403e1986 100644 --- a/libraries/push/impl/src/test/kotlin/io/element/android/libraries/push/impl/notifications/DefaultActiveNotificationsProviderTest.kt +++ b/libraries/push/impl/src/test/kotlin/io/element/android/libraries/push/impl/notifications/DefaultActiveNotificationsProviderTest.kt @@ -25,6 +25,7 @@ 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_SESSION_ID import io.element.android.libraries.matrix.test.A_SESSION_ID_2 +import io.element.android.libraries.push.api.notifications.NotificationIdProvider import io.mockk.every import io.mockk.mockk import org.junit.Test @@ -33,6 +34,8 @@ import org.robolectric.RobolectricTestRunner @RunWith(RobolectricTestRunner::class) class DefaultActiveNotificationsProviderTest { + private val notificationIdProvider = NotificationIdProvider + @Test fun `getAllNotifications with no active notifications returns empty list`() { val activeNotificationsProvider = createActiveNotificationsProvider(activeNotifications = emptyList()) @@ -43,7 +46,6 @@ class DefaultActiveNotificationsProviderTest { @Test fun `getAllNotifications with active notifications returns all`() { - val notificationIdProvider = NotificationIdProvider() val activeNotifications = listOf( aStatusBarNotification(id = notificationIdProvider.getRoomMessagesNotificationId(A_SESSION_ID), groupId = A_SESSION_ID.value), aStatusBarNotification(id = notificationIdProvider.getSummaryNotificationId(A_SESSION_ID), groupId = A_SESSION_ID.value), @@ -57,7 +59,6 @@ class DefaultActiveNotificationsProviderTest { @Test fun `getNotificationsForSession returns only notifications for that session id`() { - val notificationIdProvider = NotificationIdProvider() val activeNotifications = listOf( aStatusBarNotification(id = notificationIdProvider.getRoomMessagesNotificationId(A_SESSION_ID), groupId = A_SESSION_ID.value), aStatusBarNotification(id = notificationIdProvider.getSummaryNotificationId(A_SESSION_ID_2), groupId = A_SESSION_ID_2.value), @@ -71,7 +72,6 @@ class DefaultActiveNotificationsProviderTest { @Test fun `getMembershipNotificationsForSession returns only membership notifications for that session id`() { - val notificationIdProvider = NotificationIdProvider() val activeNotifications = listOf( aStatusBarNotification(id = notificationIdProvider.getRoomMessagesNotificationId(A_SESSION_ID), groupId = A_SESSION_ID.value,), aStatusBarNotification(id = notificationIdProvider.getSummaryNotificationId(A_SESSION_ID_2), groupId = A_SESSION_ID_2.value), @@ -89,7 +89,6 @@ class DefaultActiveNotificationsProviderTest { @Test fun `getMessageNotificationsForRoom returns only message notifications for those session and room ids`() { - val notificationIdProvider = NotificationIdProvider() val activeNotifications = listOf( aStatusBarNotification( id = notificationIdProvider.getRoomMessagesNotificationId(A_SESSION_ID), @@ -117,7 +116,6 @@ class DefaultActiveNotificationsProviderTest { @Test fun `getMembershipNotificationsForRoom returns only membership notifications for those session and room ids`() { - val notificationIdProvider = NotificationIdProvider() val activeNotifications = listOf( aStatusBarNotification( id = notificationIdProvider.getRoomMessagesNotificationId(A_SESSION_ID), @@ -145,7 +143,6 @@ class DefaultActiveNotificationsProviderTest { @Test fun `getSummaryNotification returns only the summary notification for that session id if it exists`() { - val notificationIdProvider = NotificationIdProvider() val activeNotifications = listOf( aStatusBarNotification(id = notificationIdProvider.getRoomMessagesNotificationId(A_SESSION_ID), groupId = A_SESSION_ID.value), aStatusBarNotification(id = notificationIdProvider.getSummaryNotificationId(A_SESSION_ID), groupId = A_SESSION_ID.value), @@ -172,7 +169,6 @@ class DefaultActiveNotificationsProviderTest { } return DefaultActiveNotificationsProvider( notificationManager = notificationManager, - notificationIdProvider = NotificationIdProvider(), ) } } diff --git a/libraries/push/impl/src/test/kotlin/io/element/android/libraries/push/impl/notifications/DefaultNotifiableEventResolverTest.kt b/libraries/push/impl/src/test/kotlin/io/element/android/libraries/push/impl/notifications/DefaultNotifiableEventResolverTest.kt index 8eebbbbb5c..6caaac207b 100644 --- a/libraries/push/impl/src/test/kotlin/io/element/android/libraries/push/impl/notifications/DefaultNotifiableEventResolverTest.kt +++ b/libraries/push/impl/src/test/kotlin/io/element/android/libraries/push/impl/notifications/DefaultNotifiableEventResolverTest.kt @@ -18,12 +18,15 @@ package io.element.android.libraries.push.impl.notifications import android.content.Context import com.google.common.truth.Truth.assertThat +import io.element.android.libraries.matrix.api.core.UserId import io.element.android.libraries.matrix.api.media.MediaSource +import io.element.android.libraries.matrix.api.notification.CallNotifyType import io.element.android.libraries.matrix.api.notification.NotificationContent import io.element.android.libraries.matrix.api.notification.NotificationData import io.element.android.libraries.matrix.api.room.RoomMembershipState import io.element.android.libraries.matrix.api.timeline.item.event.AudioMessageType import io.element.android.libraries.matrix.api.timeline.item.event.EmoteMessageType +import io.element.android.libraries.matrix.api.timeline.item.event.EventType import io.element.android.libraries.matrix.api.timeline.item.event.FileMessageType import io.element.android.libraries.matrix.api.timeline.item.event.FormattedBody import io.element.android.libraries.matrix.api.timeline.item.event.ImageMessageType @@ -48,7 +51,9 @@ import io.element.android.libraries.push.impl.notifications.fake.FakeNotificatio import io.element.android.libraries.push.impl.notifications.model.FallbackNotifiableEvent import io.element.android.libraries.push.impl.notifications.model.InviteNotifiableEvent import io.element.android.libraries.push.impl.notifications.model.NotifiableMessageEvent +import io.element.android.libraries.push.impl.notifications.model.NotifiableRingingCallEvent import io.element.android.services.toolbox.impl.strings.AndroidStringProvider +import io.element.android.services.toolbox.impl.systemclock.DefaultSystemClock import io.element.android.services.toolbox.test.systemclock.A_FAKE_TIMESTAMP import io.element.android.services.toolbox.test.systemclock.FakeSystemClock import kotlinx.coroutines.test.runTest @@ -58,6 +63,7 @@ import org.robolectric.RobolectricTestRunner import org.robolectric.RuntimeEnvironment import org.robolectric.annotation.Config +@Suppress("LargeClass") @RunWith(RobolectricTestRunner::class) class DefaultNotifiableEventResolverTest { @Test @@ -479,6 +485,109 @@ class DefaultNotifiableEventResolverTest { assertThat(result).isEqualTo(expectedResult) } + @Test + fun `resolve CallNotify - ringing`() = runTest { + val timestamp = DefaultSystemClock().epochMillis() + val sut = createDefaultNotifiableEventResolver( + notificationResult = Result.success( + createNotificationData( + content = NotificationContent.MessageLike.CallNotify( + A_USER_ID_2, + CallNotifyType.RING + ), + timestamp = timestamp, + ) + ) + ) + val expectedResult = NotifiableRingingCallEvent( + sessionId = A_SESSION_ID, + roomId = A_ROOM_ID, + eventId = AN_EVENT_ID, + senderId = A_USER_ID_2, + roomName = null, + editedEventId = null, + description = "Incoming call", + timestamp = timestamp, + canBeReplaced = true, + isRedacted = false, + isUpdated = false, + senderDisambiguatedDisplayName = "Bob", + senderAvatarUrl = null, + callNotifyType = CallNotifyType.RING, + ) + val result = sut.resolveEvent(A_SESSION_ID, A_ROOM_ID, AN_EVENT_ID) + assertThat(result).isEqualTo(expectedResult) + } + + @Test + fun `resolve CallNotify - ring but timed out displays the same as notify`() = runTest { + val sut = createDefaultNotifiableEventResolver( + notificationResult = Result.success( + createNotificationData( + content = NotificationContent.MessageLike.CallNotify( + A_USER_ID_2, + CallNotifyType.RING + ), + timestamp = 0L, + ) + ) + ) + val expectedResult = NotifiableMessageEvent( + sessionId = A_SESSION_ID, + eventId = AN_EVENT_ID, + editedEventId = null, + noisy = true, + timestamp = 0L, + senderDisambiguatedDisplayName = "Bob", + senderId = UserId("@bob:server.org"), + body = "☎\uFE0F Incoming call", + roomId = A_ROOM_ID, + threadId = null, + roomName = null, + roomIsDirect = false, + canBeReplaced = false, + isRedacted = false, + imageUriString = null, + type = EventType.CALL_NOTIFY, + ) + val result = sut.resolveEvent(A_SESSION_ID, A_ROOM_ID, AN_EVENT_ID) + assertThat(result).isEqualTo(expectedResult) + } + + @Test + fun `resolve CallNotify - notify`() = runTest { + val sut = createDefaultNotifiableEventResolver( + notificationResult = Result.success( + createNotificationData( + content = NotificationContent.MessageLike.CallNotify( + A_USER_ID_2, + CallNotifyType.NOTIFY + ) + ) + ) + ) + val expectedResult = NotifiableMessageEvent( + sessionId = A_SESSION_ID, + eventId = AN_EVENT_ID, + editedEventId = null, + noisy = true, + timestamp = A_TIMESTAMP, + senderDisambiguatedDisplayName = "Bob", + senderId = UserId("@bob:server.org"), + body = "☎\uFE0F Incoming call", + roomId = A_ROOM_ID, + threadId = null, + roomName = null, + roomIsDirect = false, + canBeReplaced = false, + isRedacted = false, + imageUriString = null, + type = EventType.CALL_NOTIFY, + ) + val result = sut.resolveEvent(A_SESSION_ID, A_ROOM_ID, AN_EVENT_ID) + assertThat(result).isEqualTo(expectedResult) + } + @Test fun `resolve null cases`() { testNull(NotificationContent.MessageLike.CallAnswer) @@ -551,6 +660,9 @@ class DefaultNotifiableEventResolverTest { notificationMediaRepoFactory = notificationMediaRepoFactory, context = context, permalinkParser = FakePermalinkParser(), + callNotificationEventResolver = DefaultCallNotificationEventResolver( + stringProvider = AndroidStringProvider(context.resources) + ), ) } @@ -558,6 +670,7 @@ class DefaultNotifiableEventResolverTest { content: NotificationContent, isDirect: Boolean = false, hasMention: Boolean = false, + timestamp: Long = A_TIMESTAMP, ): NotificationData { return NotificationData( eventId = AN_EVENT_ID, @@ -570,7 +683,7 @@ class DefaultNotifiableEventResolverTest { isDirect = isDirect, isEncrypted = false, isNoisy = false, - timestamp = A_TIMESTAMP, + timestamp = timestamp, content = content, hasMention = hasMention, ) diff --git a/libraries/push/impl/src/test/kotlin/io/element/android/libraries/push/impl/notifications/DefaultNotificationDrawerManagerTest.kt b/libraries/push/impl/src/test/kotlin/io/element/android/libraries/push/impl/notifications/DefaultNotificationDrawerManagerTest.kt index 3924171d60..bbe5e273b2 100644 --- a/libraries/push/impl/src/test/kotlin/io/element/android/libraries/push/impl/notifications/DefaultNotificationDrawerManagerTest.kt +++ b/libraries/push/impl/src/test/kotlin/io/element/android/libraries/push/impl/notifications/DefaultNotificationDrawerManagerTest.kt @@ -28,12 +28,13 @@ import io.element.android.libraries.matrix.test.A_THREAD_ID import io.element.android.libraries.matrix.test.FakeMatrixClient import io.element.android.libraries.matrix.test.FakeMatrixClientProvider import io.element.android.libraries.matrix.ui.components.aMatrixUser +import io.element.android.libraries.push.api.notifications.NotificationIdProvider import io.element.android.libraries.push.impl.notifications.fake.FakeActiveNotificationsProvider -import io.element.android.libraries.push.impl.notifications.fake.FakeImageLoaderHolder import io.element.android.libraries.push.impl.notifications.fake.FakeNotificationCreator import io.element.android.libraries.push.impl.notifications.fake.FakeRoomGroupMessageCreator import io.element.android.libraries.push.impl.notifications.fake.FakeSummaryGroupMessageCreator import io.element.android.libraries.push.impl.notifications.fixtures.aNotifiableMessageEvent +import io.element.android.libraries.push.test.notifications.FakeImageLoaderHolder import io.element.android.services.appnavstate.api.AppNavigationState import io.element.android.services.appnavstate.api.AppNavigationStateService import io.element.android.services.appnavstate.api.NavigationState @@ -164,7 +165,7 @@ class DefaultNotificationDrawerManagerTest { val notificationManager = mockk { every { cancel(any(), any()) } returns Unit } - val summaryId = NotificationIdProvider().getSummaryNotificationId(A_SESSION_ID) + val summaryId = NotificationIdProvider.getSummaryNotificationId(A_SESSION_ID) val activeNotificationsProvider = FakeActiveNotificationsProvider( mutableListOf( mockk { @@ -198,7 +199,6 @@ class DefaultNotificationDrawerManagerTest { return DefaultNotificationDrawerManager( notificationManager = notificationManager, notificationRenderer = NotificationRenderer( - notificationIdProvider = NotificationIdProvider(), notificationDisplayer = DefaultNotificationDisplayer(context, NotificationManagerCompat.from(context)), notificationDataFactory = DefaultNotificationDataFactory( notificationCreator = FakeNotificationCreator(), @@ -208,7 +208,6 @@ class DefaultNotificationDrawerManagerTest { stringProvider = FakeStringProvider(), ), ), - notificationIdProvider = NotificationIdProvider(), appNavigationStateService = appNavigationStateService, coroutineScope = this, matrixClientProvider = matrixClientProvider, diff --git a/libraries/push/impl/src/test/kotlin/io/element/android/libraries/push/impl/notifications/DefaultOnMissedCallNotificationHandlerTest.kt b/libraries/push/impl/src/test/kotlin/io/element/android/libraries/push/impl/notifications/DefaultOnMissedCallNotificationHandlerTest.kt new file mode 100644 index 0000000000..34be1bc1e6 --- /dev/null +++ b/libraries/push/impl/src/test/kotlin/io/element/android/libraries/push/impl/notifications/DefaultOnMissedCallNotificationHandlerTest.kt @@ -0,0 +1,92 @@ +/* + * Copyright (c) 2024 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. + */ + +package io.element.android.libraries.push.impl.notifications + +import io.element.android.libraries.matrix.test.AN_EVENT_ID +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_NAME +import io.element.android.libraries.matrix.test.FakeMatrixClient +import io.element.android.libraries.matrix.test.FakeMatrixClientProvider +import io.element.android.libraries.matrix.test.notification.FakeNotificationService +import io.element.android.libraries.matrix.test.notification.aNotificationData +import io.element.android.libraries.push.impl.notifications.fake.FakeActiveNotificationsProvider +import io.element.android.libraries.push.impl.notifications.fake.FakeNotificationDataFactory +import io.element.android.libraries.push.impl.notifications.fake.FakeNotificationDisplayer +import io.element.android.libraries.push.impl.notifications.fixtures.aNotifiableMessageEvent +import io.element.android.libraries.push.test.notifications.FakeCallNotificationEventResolver +import io.element.android.libraries.push.test.notifications.FakeImageLoaderHolder +import io.element.android.services.appnavstate.test.FakeAppNavigationStateService +import io.element.android.tests.testutils.lambda.lambdaRecorder +import io.mockk.mockk +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.ExperimentalCoroutinesApi +import kotlinx.coroutines.SupervisorJob +import kotlinx.coroutines.cancel +import kotlinx.coroutines.test.runCurrent +import kotlinx.coroutines.test.runTest +import org.junit.Test +import org.junit.runner.RunWith +import org.robolectric.RobolectricTestRunner + +@RunWith(RobolectricTestRunner::class) +class DefaultOnMissedCallNotificationHandlerTest { + @OptIn(ExperimentalCoroutinesApi::class) + @Test + fun `addMissedCallNotification - should add missed call notification`() = runTest { + val childScope = CoroutineScope(coroutineContext + SupervisorJob()) + val dataFactory = FakeNotificationDataFactory( + messageEventToNotificationsResult = lambdaRecorder { _, _, _ -> emptyList() } + ) + // Create a fake matrix client provider that returns a fake matrix client with a fake notification service that returns a valid notification data + val matrixClientProvider = FakeMatrixClientProvider(getClient = { + val notificationService = FakeNotificationService().apply { + givenGetNotificationResult(Result.success(aNotificationData(senderDisplayName = A_USER_NAME, senderIsNameAmbiguous = false))) + } + Result.success(FakeMatrixClient(notificationService = notificationService)) + }) + val defaultOnMissedCallNotificationHandler = DefaultOnMissedCallNotificationHandler( + matrixClientProvider = matrixClientProvider, + defaultNotificationDrawerManager = DefaultNotificationDrawerManager( + notificationManager = mockk(relaxed = true), + notificationRenderer = NotificationRenderer( + notificationDisplayer = FakeNotificationDisplayer(), + notificationDataFactory = dataFactory, + ), + appNavigationStateService = FakeAppNavigationStateService(), + coroutineScope = childScope, + matrixClientProvider = FakeMatrixClientProvider(), + imageLoaderHolder = FakeImageLoaderHolder(), + activeNotificationsProvider = FakeActiveNotificationsProvider(), + ), + callNotificationEventResolver = FakeCallNotificationEventResolver(resolveEventLambda = { _, _, _ -> aNotifiableMessageEvent() }), + ) + + defaultOnMissedCallNotificationHandler.addMissedCallNotification( + sessionId = A_SESSION_ID, + roomId = A_ROOM_ID, + eventId = AN_EVENT_ID, + ) + + runCurrent() + + dataFactory.messageEventToNotificationsResult.assertions().isCalledOnce() + + // Cancel the coroutine scope so the test can finish + childScope.cancel() + } +} diff --git a/libraries/push/impl/src/test/kotlin/io/element/android/libraries/push/impl/notifications/DefaultRoomGroupMessageCreatorTest.kt b/libraries/push/impl/src/test/kotlin/io/element/android/libraries/push/impl/notifications/DefaultRoomGroupMessageCreatorTest.kt index 8a8b5efd43..2b5b941292 100644 --- a/libraries/push/impl/src/test/kotlin/io/element/android/libraries/push/impl/notifications/DefaultRoomGroupMessageCreatorTest.kt +++ b/libraries/push/impl/src/test/kotlin/io/element/android/libraries/push/impl/notifications/DefaultRoomGroupMessageCreatorTest.kt @@ -25,8 +25,8 @@ import io.element.android.libraries.matrix.test.A_ROOM_ID import io.element.android.libraries.matrix.ui.components.aMatrixUser import io.element.android.libraries.matrix.ui.media.MediaRequestData import io.element.android.libraries.push.impl.notifications.factories.createNotificationCreator -import io.element.android.libraries.push.impl.notifications.fake.FakeImageLoader import io.element.android.libraries.push.impl.notifications.fixtures.aNotifiableMessageEvent +import io.element.android.libraries.push.test.notifications.FakeImageLoader import io.element.android.services.toolbox.api.sdk.BuildVersionSdkIntProvider import io.element.android.services.toolbox.impl.strings.AndroidStringProvider import io.element.android.services.toolbox.test.sdk.FakeBuildVersionSdkIntProvider @@ -212,7 +212,7 @@ fun createRoomGroupMessageCreator( sdkIntProvider: BuildVersionSdkIntProvider = FakeBuildVersionSdkIntProvider(Build.VERSION_CODES.O), ): RoomGroupMessageCreator { val context = RuntimeEnvironment.getApplication() as Context - val bitmapLoader = NotificationBitmapLoader( + val bitmapLoader = DefaultNotificationBitmapLoader( context = RuntimeEnvironment.getApplication(), sdkIntProvider = sdkIntProvider, ) diff --git a/libraries/push/impl/src/test/kotlin/io/element/android/libraries/push/impl/notifications/FakeReplyMessageExtractor.kt b/libraries/push/impl/src/test/kotlin/io/element/android/libraries/push/impl/notifications/FakeReplyMessageExtractor.kt new file mode 100644 index 0000000000..4baeedc92b --- /dev/null +++ b/libraries/push/impl/src/test/kotlin/io/element/android/libraries/push/impl/notifications/FakeReplyMessageExtractor.kt @@ -0,0 +1,27 @@ +/* + * Copyright (c) 2024 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. + */ + +package io.element.android.libraries.push.impl.notifications + +import android.content.Intent + +class FakeReplyMessageExtractor( + private val result: String? = null, +) : ReplyMessageExtractor { + override fun getReplyMessage(intent: Intent): String? { + return result + } +} 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 new file mode 100644 index 0000000000..7266f9fe98 --- /dev/null +++ b/libraries/push/impl/src/test/kotlin/io/element/android/libraries/push/impl/notifications/NotificationBroadcastReceiverHandlerTest.kt @@ -0,0 +1,474 @@ +/* + * Copyright (c) 2024 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. + */ + +package io.element.android.libraries.push.impl.notifications + +import android.content.Intent +import com.google.common.truth.Truth.assertThat +import io.element.android.features.preferences.api.store.SessionPreferencesStore +import io.element.android.features.preferences.api.store.SessionPreferencesStoreFactory +import io.element.android.libraries.matrix.api.MatrixClient +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.Mention +import io.element.android.libraries.matrix.api.timeline.ReceiptType +import io.element.android.libraries.matrix.test.AN_EVENT_ID +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.A_SESSION_ID +import io.element.android.libraries.matrix.test.A_THREAD_ID +import io.element.android.libraries.matrix.test.FakeMatrixClient +import io.element.android.libraries.matrix.test.FakeMatrixClientProvider +import io.element.android.libraries.matrix.test.core.aBuildMeta +import io.element.android.libraries.matrix.test.room.FakeMatrixRoom +import io.element.android.libraries.matrix.test.timeline.FakeTimeline +import io.element.android.libraries.preferences.test.FakeSessionPreferencesStoreFactory +import io.element.android.libraries.preferences.test.InMemorySessionPreferencesStore +import io.element.android.libraries.push.api.notifications.NotificationDrawerManager +import io.element.android.libraries.push.impl.notifications.model.NotifiableEvent +import io.element.android.libraries.push.impl.push.FakeOnNotifiableEventReceived +import io.element.android.libraries.push.impl.push.OnNotifiableEventReceived +import io.element.android.libraries.push.test.notifications.FakeNotificationDrawerManager +import io.element.android.services.toolbox.api.strings.StringProvider +import io.element.android.services.toolbox.api.systemclock.SystemClock +import io.element.android.services.toolbox.test.strings.FakeStringProvider +import io.element.android.services.toolbox.test.systemclock.FakeSystemClock +import io.element.android.tests.testutils.lambda.lambdaError +import io.element.android.tests.testutils.lambda.lambdaRecorder +import io.element.android.tests.testutils.lambda.value +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.ExperimentalCoroutinesApi +import kotlinx.coroutines.test.TestScope +import kotlinx.coroutines.test.runCurrent +import kotlinx.coroutines.test.runTest +import org.junit.Test +import org.junit.runner.RunWith +import org.robolectric.RobolectricTestRunner + +@ExperimentalCoroutinesApi +@RunWith(RobolectricTestRunner::class) +class NotificationBroadcastReceiverHandlerTest { + private val actionIds = NotificationActionIds(aBuildMeta()) + + @Test + fun `When no sessionId, nothing happen`() = runTest { + val sut = createNotificationBroadcastReceiverHandler() + sut.onReceive( + createIntent( + action = actionIds.join, + sessionId = null + ), + ) + } + + @Test + fun `Test dismiss room without a roomId, nothing happen`() = runTest { + val sut = createNotificationBroadcastReceiverHandler() + sut.onReceive( + createIntent( + action = actionIds.dismissRoom, + ), + ) + } + + @Test + fun `Test dismiss room`() = runTest { + val clearMessagesForRoomLambda = lambdaRecorder { _, _ -> } + val notificationDrawerManager = FakeNotificationDrawerManager( + clearMessagesForRoomLambda = clearMessagesForRoomLambda, + ) + val sut = createNotificationBroadcastReceiverHandler( + notificationDrawerManager = notificationDrawerManager + ) + sut.onReceive( + createIntent( + action = actionIds.dismissRoom, + roomId = A_ROOM_ID, + ), + ) + runCurrent() + clearMessagesForRoomLambda.assertions() + .isCalledOnce() + .with(value(A_SESSION_ID), value(A_ROOM_ID)) + } + + @Test + fun `Test dismiss summary`() = runTest { + val clearAllMessagesEventsLambda = lambdaRecorder { _ -> } + val notificationDrawerManager = FakeNotificationDrawerManager( + clearAllMessagesEventsLambda = clearAllMessagesEventsLambda, + ) + val sut = createNotificationBroadcastReceiverHandler( + notificationDrawerManager = notificationDrawerManager + ) + sut.onReceive( + createIntent( + action = actionIds.dismissSummary, + ), + ) + clearAllMessagesEventsLambda.assertions() + .isCalledOnce() + .with(value(A_SESSION_ID)) + } + + @Test + fun `Test dismiss Invite without room`() = runTest { + val sut = createNotificationBroadcastReceiverHandler() + sut.onReceive( + createIntent( + action = actionIds.dismissInvite, + ), + ) + } + + @Test + fun `Test dismiss Invite`() = runTest { + val clearMembershipNotificationForRoomLambda = lambdaRecorder { _, _ -> } + val notificationDrawerManager = FakeNotificationDrawerManager( + clearMembershipNotificationForRoomLambda = clearMembershipNotificationForRoomLambda, + ) + val sut = createNotificationBroadcastReceiverHandler( + notificationDrawerManager = notificationDrawerManager + ) + sut.onReceive( + createIntent( + action = actionIds.dismissInvite, + roomId = A_ROOM_ID, + ), + ) + clearMembershipNotificationForRoomLambda.assertions() + .isCalledOnce() + .with(value(A_SESSION_ID), value(A_ROOM_ID)) + } + + @Test + fun `Test dismiss Event without event`() = runTest { + val sut = createNotificationBroadcastReceiverHandler() + sut.onReceive( + createIntent( + action = actionIds.dismissEvent, + ), + ) + } + + @Test + fun `Test dismiss Event`() = runTest { + val clearEventLambda = lambdaRecorder { _, _ -> } + val notificationDrawerManager = FakeNotificationDrawerManager( + clearEventLambda = clearEventLambda, + ) + val sut = createNotificationBroadcastReceiverHandler( + notificationDrawerManager = notificationDrawerManager + ) + sut.onReceive( + createIntent( + action = actionIds.dismissEvent, + eventId = AN_EVENT_ID, + ), + ) + clearEventLambda.assertions() + .isCalledOnce() + .with(value(A_SESSION_ID), value(AN_EVENT_ID)) + } + + @Test + fun `Test mark room as read without room`() = runTest { + val sut = createNotificationBroadcastReceiverHandler() + sut.onReceive( + createIntent( + action = actionIds.markRoomRead, + ), + ) + } + + @Test + fun `Test mark room as read, send public RR`() { + testMarkRoomAsRead( + isSendPublicReadReceiptsEnabled = true, + expectedReceiptType = ReceiptType.READ + ) + } + + @Test + fun `Test mark room as read, send private RR`() { + testMarkRoomAsRead( + isSendPublicReadReceiptsEnabled = false, + expectedReceiptType = ReceiptType.READ_PRIVATE + ) + } + + private fun testMarkRoomAsRead( + isSendPublicReadReceiptsEnabled: Boolean, + expectedReceiptType: ReceiptType, + ) = runTest { + val getLambda = lambdaRecorder { _, _ -> + InMemorySessionPreferencesStore( + isSendPublicReadReceiptsEnabled = isSendPublicReadReceiptsEnabled + ) + } + val sessionPreferencesStore = FakeSessionPreferencesStoreFactory( + getLambda = getLambda + ) + val clearMessagesForRoomLambda = lambdaRecorder { _, _ -> } + val matrixRoom = FakeMatrixRoom() + val notificationDrawerManager = FakeNotificationDrawerManager( + clearMessagesForRoomLambda = clearMessagesForRoomLambda, + ) + val sut = createNotificationBroadcastReceiverHandler( + sessionPreferencesStore = sessionPreferencesStore, + matrixRoom = matrixRoom, + notificationDrawerManager = notificationDrawerManager + ) + sut.onReceive( + createIntent( + action = actionIds.markRoomRead, + roomId = A_ROOM_ID, + ), + ) + runCurrent() + clearMessagesForRoomLambda.assertions() + .isCalledOnce() + .with(value(A_SESSION_ID), value(A_ROOM_ID)) + assertThat(matrixRoom.markAsReadCalls).isEqualTo(listOf(expectedReceiptType)) + } + + @Test + fun `Test join room without room`() = runTest { + val sut = createNotificationBroadcastReceiverHandler() + sut.onReceive( + createIntent( + action = actionIds.join, + ), + ) + } + + @Test + fun `Test join room`() = runTest { + val joinRoom = lambdaRecorder> { _ -> Result.success(Unit) } + val clearMembershipNotificationForRoomLambda = lambdaRecorder { _, _ -> } + val notificationDrawerManager = FakeNotificationDrawerManager( + clearMembershipNotificationForRoomLambda = clearMembershipNotificationForRoomLambda, + ) + val sut = createNotificationBroadcastReceiverHandler( + joinRoom = joinRoom, + notificationDrawerManager = notificationDrawerManager, + ) + sut.onReceive( + createIntent( + action = actionIds.join, + roomId = A_ROOM_ID, + ), + ) + runCurrent() + joinRoom.assertions() + .isCalledOnce() + .with(value(A_ROOM_ID)) + clearMembershipNotificationForRoomLambda.assertions() + .isCalledOnce() + .with(value(A_SESSION_ID), value(A_ROOM_ID)) + } + + @Test + fun `Test reject room without room`() = runTest { + val sut = createNotificationBroadcastReceiverHandler() + sut.onReceive( + createIntent( + action = actionIds.reject, + ), + ) + } + + @Test + fun `Test reject room`() = runTest { + val leaveRoom = lambdaRecorder> { Result.success(Unit) } + val matrixRoom = FakeMatrixRoom().apply { + leaveRoomLambda = leaveRoom + } + val clearMembershipNotificationForRoomLambda = lambdaRecorder { _, _ -> } + val notificationDrawerManager = FakeNotificationDrawerManager( + clearMembershipNotificationForRoomLambda = clearMembershipNotificationForRoomLambda, + ) + val sut = createNotificationBroadcastReceiverHandler( + matrixRoom = matrixRoom, + notificationDrawerManager = notificationDrawerManager + ) + sut.onReceive( + createIntent( + action = actionIds.reject, + roomId = A_ROOM_ID, + ), + ) + runCurrent() + clearMembershipNotificationForRoomLambda.assertions() + .isCalledOnce() + .with(value(A_SESSION_ID), value(A_ROOM_ID)) + leaveRoom.assertions() + .isCalledOnce() + .with() + } + + @Test + fun `Test send reply without room`() = runTest { + val sut = createNotificationBroadcastReceiverHandler() + sut.onReceive( + createIntent( + action = actionIds.smartReply, + ), + ) + } + + @Test + fun `Test send reply`() = runTest { + val sendMessage = lambdaRecorder, Result> { _, _, _ -> Result.success(Unit) } + val replyMessage = lambdaRecorder, Boolean, Result> { _, _, _, _, _ -> Result.success(Unit) } + val liveTimeline = FakeTimeline().apply { + sendMessageLambda = sendMessage + replyMessageLambda = replyMessage + } + val matrixRoom = FakeMatrixRoom( + liveTimeline = liveTimeline + ) + val onNotifiableEventReceivedResult = lambdaRecorder { _ -> } + val onNotifiableEventReceived = FakeOnNotifiableEventReceived(onNotifiableEventReceivedResult = onNotifiableEventReceivedResult) + val sut = createNotificationBroadcastReceiverHandler( + matrixRoom = matrixRoom, + onNotifiableEventReceived = onNotifiableEventReceived, + replyMessageExtractor = FakeReplyMessageExtractor(A_MESSAGE) + ) + sut.onReceive( + createIntent( + action = actionIds.smartReply, + roomId = A_ROOM_ID, + ), + ) + runCurrent() + sendMessage.assertions() + .isCalledOnce() + .with(value(A_MESSAGE), value(null), value(emptyList())) + onNotifiableEventReceivedResult.assertions() + .isCalledOnce() + replyMessage.assertions() + .isNeverCalled() + } + + @Test + fun `Test send reply blank message`() = runTest { + val sendMessage = lambdaRecorder, Result> { _, _, _ -> Result.success(Unit) } + val liveTimeline = FakeTimeline().apply { + sendMessageLambda = sendMessage + } + val matrixRoom = FakeMatrixRoom( + liveTimeline = liveTimeline + ) + val sut = createNotificationBroadcastReceiverHandler( + matrixRoom = matrixRoom, + replyMessageExtractor = FakeReplyMessageExtractor(" "), + ) + sut.onReceive( + createIntent( + action = actionIds.smartReply, + roomId = A_ROOM_ID, + ), + ) + runCurrent() + sendMessage.assertions() + .isNeverCalled() + } + + @Test + fun `Test send reply to thread`() = runTest { + val sendMessage = lambdaRecorder, Result> { _, _, _ -> Result.success(Unit) } + val replyMessage = lambdaRecorder, Boolean, Result> { _, _, _, _, _ -> Result.success(Unit) } + val liveTimeline = FakeTimeline().apply { + sendMessageLambda = sendMessage + replyMessageLambda = replyMessage + } + val matrixRoom = FakeMatrixRoom( + liveTimeline = liveTimeline + ) + val onNotifiableEventReceivedResult = lambdaRecorder { _ -> } + val onNotifiableEventReceived = FakeOnNotifiableEventReceived(onNotifiableEventReceivedResult = onNotifiableEventReceivedResult) + val sut = createNotificationBroadcastReceiverHandler( + matrixRoom = matrixRoom, + onNotifiableEventReceived = onNotifiableEventReceived, + replyMessageExtractor = FakeReplyMessageExtractor(A_MESSAGE) + ) + sut.onReceive( + createIntent( + action = actionIds.smartReply, + roomId = A_ROOM_ID, + threadId = A_THREAD_ID, + ), + ) + runCurrent() + sendMessage.assertions() + .isNeverCalled() + onNotifiableEventReceivedResult.assertions() + .isCalledOnce() + replyMessage.assertions() + .isCalledOnce() + .with(value(A_THREAD_ID.asEventId()), value(A_MESSAGE), value(null), value(emptyList()), value(true)) + } + + private fun createIntent( + action: String, + sessionId: SessionId? = A_SESSION_ID, + roomId: RoomId? = null, + eventId: EventId? = null, + threadId: ThreadId? = null, + ) = Intent(action).apply { + putExtra(NotificationBroadcastReceiver.KEY_SESSION_ID, sessionId?.value) + putExtra(NotificationBroadcastReceiver.KEY_ROOM_ID, roomId?.value) + putExtra(NotificationBroadcastReceiver.KEY_THREAD_ID, threadId?.value) + putExtra(NotificationBroadcastReceiver.KEY_EVENT_ID, eventId?.value) + } + + private fun TestScope.createNotificationBroadcastReceiverHandler( + matrixRoom: FakeMatrixRoom? = FakeMatrixRoom(), + joinRoom: (RoomId) -> Result = { lambdaError() }, + matrixClient: MatrixClient? = FakeMatrixClient().apply { + givenGetRoomResult(A_ROOM_ID, matrixRoom) + joinRoomLambda = joinRoom + }, + sessionPreferencesStore: SessionPreferencesStoreFactory = FakeSessionPreferencesStoreFactory(), + notificationDrawerManager: NotificationDrawerManager = FakeNotificationDrawerManager(), + systemClock: SystemClock = FakeSystemClock(), + onNotifiableEventReceived: OnNotifiableEventReceived = FakeOnNotifiableEventReceived(), + stringProvider: StringProvider = FakeStringProvider(), + replyMessageExtractor: ReplyMessageExtractor = FakeReplyMessageExtractor(), + ): NotificationBroadcastReceiverHandler { + return NotificationBroadcastReceiverHandler( + appCoroutineScope = this, + matrixClientProvider = FakeMatrixClientProvider { + if (matrixClient == null) { + Result.failure(Exception("No matrix client")) + } else { + Result.success(matrixClient) + } + }, + sessionPreferencesStore = sessionPreferencesStore, + notificationDrawerManager = notificationDrawerManager, + actionIds = actionIds, + systemClock = systemClock, + onNotifiableEventReceived = onNotifiableEventReceived, + stringProvider = stringProvider, + replyMessageExtractor = replyMessageExtractor, + ) + } +} diff --git a/libraries/push/impl/src/test/kotlin/io/element/android/libraries/push/impl/notifications/NotificationDataFactoryTest.kt b/libraries/push/impl/src/test/kotlin/io/element/android/libraries/push/impl/notifications/NotificationDataFactoryTest.kt index aff5de7d4b..27f66a7b33 100644 --- a/libraries/push/impl/src/test/kotlin/io/element/android/libraries/push/impl/notifications/NotificationDataFactoryTest.kt +++ b/libraries/push/impl/src/test/kotlin/io/element/android/libraries/push/impl/notifications/NotificationDataFactoryTest.kt @@ -23,13 +23,13 @@ import io.element.android.libraries.matrix.test.AN_EVENT_ID 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.push.impl.notifications.fake.FakeActiveNotificationsProvider -import io.element.android.libraries.push.impl.notifications.fake.FakeImageLoader import io.element.android.libraries.push.impl.notifications.fake.FakeNotificationCreator import io.element.android.libraries.push.impl.notifications.fake.FakeRoomGroupMessageCreator import io.element.android.libraries.push.impl.notifications.fake.FakeSummaryGroupMessageCreator import io.element.android.libraries.push.impl.notifications.fixtures.aNotifiableMessageEvent import io.element.android.libraries.push.impl.notifications.fixtures.aSimpleNotifiableEvent import io.element.android.libraries.push.impl.notifications.fixtures.anInviteNotifiableEvent +import io.element.android.libraries.push.test.notifications.FakeImageLoader import io.element.android.services.toolbox.test.strings.FakeStringProvider import kotlinx.coroutines.test.runTest import org.junit.Test @@ -37,6 +37,7 @@ import org.junit.runner.RunWith import org.robolectric.RobolectricTestRunner private val MY_AVATAR_URL: String? = null + private val AN_INVITATION_EVENT = anInviteNotifiableEvent(roomId = A_ROOM_ID) private val A_SIMPLE_EVENT = aSimpleNotifiableEvent(eventId = AN_EVENT_ID) private val A_MESSAGE_EVENT = aNotifiableMessageEvent(eventId = AN_EVENT_ID, roomId = A_ROOM_ID) diff --git a/libraries/push/impl/src/test/kotlin/io/element/android/libraries/push/impl/notifications/NotificationIdProviderTest.kt b/libraries/push/impl/src/test/kotlin/io/element/android/libraries/push/impl/notifications/NotificationIdProviderTest.kt index b9664ef577..17f736df86 100644 --- a/libraries/push/impl/src/test/kotlin/io/element/android/libraries/push/impl/notifications/NotificationIdProviderTest.kt +++ b/libraries/push/impl/src/test/kotlin/io/element/android/libraries/push/impl/notifications/NotificationIdProviderTest.kt @@ -19,12 +19,13 @@ package io.element.android.libraries.push.impl.notifications import com.google.common.truth.Truth.assertThat import io.element.android.libraries.matrix.test.A_SESSION_ID import io.element.android.libraries.matrix.test.A_SESSION_ID_2 +import io.element.android.libraries.push.api.notifications.NotificationIdProvider import org.junit.Test class NotificationIdProviderTest { @Test fun `test notification id provider`() { - val sut = NotificationIdProvider() + val sut = NotificationIdProvider val offsetForASessionId = 305_410 assertThat(sut.getSummaryNotificationId(A_SESSION_ID)).isEqualTo(offsetForASessionId + 0) assertThat(sut.getRoomMessagesNotificationId(A_SESSION_ID)).isEqualTo(offsetForASessionId + 1) diff --git a/libraries/push/impl/src/test/kotlin/io/element/android/libraries/push/impl/notifications/NotificationRendererTest.kt b/libraries/push/impl/src/test/kotlin/io/element/android/libraries/push/impl/notifications/NotificationRendererTest.kt index 0a5b216ea0..e83c5d2351 100644 --- a/libraries/push/impl/src/test/kotlin/io/element/android/libraries/push/impl/notifications/NotificationRendererTest.kt +++ b/libraries/push/impl/src/test/kotlin/io/element/android/libraries/push/impl/notifications/NotificationRendererTest.kt @@ -20,8 +20,8 @@ import io.element.android.libraries.matrix.api.user.MatrixUser import io.element.android.libraries.matrix.test.AN_EVENT_ID 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.push.api.notifications.NotificationIdProvider import io.element.android.libraries.push.impl.notifications.fake.FakeActiveNotificationsProvider -import io.element.android.libraries.push.impl.notifications.fake.FakeImageLoader import io.element.android.libraries.push.impl.notifications.fake.FakeNotificationCreator import io.element.android.libraries.push.impl.notifications.fake.FakeNotificationDisplayer import io.element.android.libraries.push.impl.notifications.fake.FakeRoomGroupMessageCreator @@ -31,6 +31,7 @@ import io.element.android.libraries.push.impl.notifications.fixtures.aNotifiable import io.element.android.libraries.push.impl.notifications.fixtures.aSimpleNotifiableEvent import io.element.android.libraries.push.impl.notifications.fixtures.anInviteNotifiableEvent import io.element.android.libraries.push.impl.notifications.model.NotifiableEvent +import io.element.android.libraries.push.test.notifications.FakeImageLoader import io.element.android.services.toolbox.test.strings.FakeStringProvider import io.element.android.tests.testutils.lambda.lambdaRecorder import io.element.android.tests.testutils.lambda.value @@ -61,10 +62,9 @@ class NotificationRendererTest { activeNotificationsProvider = FakeActiveNotificationsProvider(), stringProvider = FakeStringProvider(), ) - private val notificationIdProvider = NotificationIdProvider() + private val notificationIdProvider = NotificationIdProvider private val notificationRenderer = NotificationRenderer( - notificationIdProvider = notificationIdProvider, notificationDisplayer = notificationDisplayer, notificationDataFactory = notificationDataFactory, ) diff --git a/libraries/push/impl/src/test/kotlin/io/element/android/libraries/push/impl/notifications/channels/FakeNotificationChannels.kt b/libraries/push/impl/src/test/kotlin/io/element/android/libraries/push/impl/notifications/channels/FakeNotificationChannels.kt new file mode 100644 index 0000000000..9b5f8de3be --- /dev/null +++ b/libraries/push/impl/src/test/kotlin/io/element/android/libraries/push/impl/notifications/channels/FakeNotificationChannels.kt @@ -0,0 +1,35 @@ +/* + * Copyright (c) 2024 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. + */ + +package io.element.android.libraries.push.impl.notifications.channels + +class FakeNotificationChannels( + var channelForIncomingCall: (ring: Boolean) -> String = { _ -> "" }, + var channelIdForMessage: (noisy: Boolean) -> String = { _ -> "" }, + var channelIdForTest: () -> String = { "" } +) : NotificationChannels { + override fun getChannelForIncomingCall(ring: Boolean): String { + return channelForIncomingCall(ring) + } + + override fun getChannelIdForMessage(noisy: Boolean): String { + return channelIdForMessage(noisy) + } + + override fun getChannelIdForTest(): String { + return channelIdForTest() + } +} diff --git a/libraries/push/impl/src/test/kotlin/io/element/android/libraries/push/impl/notifications/channels/NotificationChannelsTest.kt b/libraries/push/impl/src/test/kotlin/io/element/android/libraries/push/impl/notifications/channels/NotificationChannelsTest.kt new file mode 100644 index 0000000000..ec87069cd2 --- /dev/null +++ b/libraries/push/impl/src/test/kotlin/io/element/android/libraries/push/impl/notifications/channels/NotificationChannelsTest.kt @@ -0,0 +1,83 @@ +/* + * Copyright (c) 2024 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. + */ + +package io.element.android.libraries.push.impl.notifications.channels + +import android.app.NotificationChannel +import android.os.Build +import androidx.core.app.NotificationChannelCompat +import androidx.core.app.NotificationManagerCompat +import androidx.test.platform.app.InstrumentationRegistry +import com.google.common.truth.Truth.assertThat +import io.element.android.services.toolbox.test.strings.FakeStringProvider +import io.mockk.every +import io.mockk.mockk +import io.mockk.verify +import org.junit.Test +import org.junit.runner.RunWith +import org.robolectric.RobolectricTestRunner +import org.robolectric.annotation.Config + +@RunWith(RobolectricTestRunner::class) +class NotificationChannelsTest { + @Test + @Config(sdk = [Build.VERSION_CODES.O]) + fun `init - creates notification channels and migrates old ones`() { + val notificationManager = mockk(relaxed = true) { + every { notificationChannels } returns emptyList() + } + + createNotificationChannels(notificationManager = notificationManager) + + verify { notificationManager.createNotificationChannel(any()) } + verify { notificationManager.createNotificationChannel(any()) } + verify { notificationManager.deleteNotificationChannel(any()) } + } + + @Test + fun `getChannelForIncomingCall - returns the right channel`() { + val notificationChannels = createNotificationChannels() + + val ringingChannel = notificationChannels.getChannelForIncomingCall(ring = true) + assertThat(ringingChannel).isEqualTo(RINGING_CALL_NOTIFICATION_CHANNEL_ID) + + val normalChannel = notificationChannels.getChannelForIncomingCall(ring = false) + assertThat(normalChannel).isEqualTo(CALL_NOTIFICATION_CHANNEL_ID_V3) + } + + @Test + fun `getChannelIdForMessage - returns the right channel`() { + val notificationChannels = createNotificationChannels() + + assertThat(notificationChannels.getChannelIdForMessage(noisy = true)).isEqualTo(NOISY_NOTIFICATION_CHANNEL_ID) + assertThat(notificationChannels.getChannelIdForMessage(noisy = false)).isEqualTo(SILENT_NOTIFICATION_CHANNEL_ID) + } + + @Test + fun `getChannelIdForTest - returns the right channel`() { + val notificationChannels = createNotificationChannels() + + assertThat(notificationChannels.getChannelIdForTest()).isEqualTo(NOISY_NOTIFICATION_CHANNEL_ID) + } + + private fun createNotificationChannels( + notificationManager: NotificationManagerCompat = mockk(relaxed = true), + ) = DefaultNotificationChannels( + context = InstrumentationRegistry.getInstrumentation().targetContext, + notificationManager = notificationManager, + stringProvider = FakeStringProvider(), + ) +} diff --git a/libraries/push/impl/src/test/kotlin/io/element/android/libraries/push/impl/notifications/factories/DefaultNotificationCreatorTest.kt b/libraries/push/impl/src/test/kotlin/io/element/android/libraries/push/impl/notifications/factories/DefaultNotificationCreatorTest.kt index de0c22d1a6..124c71adcf 100644 --- a/libraries/push/impl/src/test/kotlin/io/element/android/libraries/push/impl/notifications/factories/DefaultNotificationCreatorTest.kt +++ b/libraries/push/impl/src/test/kotlin/io/element/android/libraries/push/impl/notifications/factories/DefaultNotificationCreatorTest.kt @@ -29,18 +29,20 @@ import io.element.android.libraries.matrix.test.A_SESSION_ID import io.element.android.libraries.matrix.test.A_THREAD_ID import io.element.android.libraries.matrix.test.core.aBuildMeta import io.element.android.libraries.matrix.ui.components.aMatrixUser +import io.element.android.libraries.push.api.notifications.NotificationBitmapLoader +import io.element.android.libraries.push.impl.notifications.DefaultNotificationBitmapLoader import io.element.android.libraries.push.impl.notifications.NotificationActionIds -import io.element.android.libraries.push.impl.notifications.NotificationBitmapLoader import io.element.android.libraries.push.impl.notifications.RoomEventGroupInfo +import io.element.android.libraries.push.impl.notifications.channels.DefaultNotificationChannels import io.element.android.libraries.push.impl.notifications.channels.NotificationChannels import io.element.android.libraries.push.impl.notifications.factories.action.AcceptInvitationActionFactory import io.element.android.libraries.push.impl.notifications.factories.action.MarkAsReadActionFactory import io.element.android.libraries.push.impl.notifications.factories.action.QuickReplyActionFactory import io.element.android.libraries.push.impl.notifications.factories.action.RejectInvitationActionFactory -import io.element.android.libraries.push.impl.notifications.fake.FakeImageLoader import io.element.android.libraries.push.impl.notifications.model.FallbackNotifiableEvent import io.element.android.libraries.push.impl.notifications.model.InviteNotifiableEvent import io.element.android.libraries.push.impl.notifications.model.SimpleNotifiableEvent +import io.element.android.libraries.push.test.notifications.FakeImageLoader import io.element.android.services.toolbox.test.sdk.FakeBuildVersionSdkIntProvider import io.element.android.services.toolbox.test.strings.FakeStringProvider import io.element.android.services.toolbox.test.systemclock.A_FAKE_TIMESTAMP @@ -284,7 +286,7 @@ fun createNotificationCreator( context: Context = RuntimeEnvironment.getApplication(), buildMeta: BuildMeta = aBuildMeta(), notificationChannels: NotificationChannels = createNotificationChannels(), - bitmapLoader: NotificationBitmapLoader = NotificationBitmapLoader(context, FakeBuildVersionSdkIntProvider(Build.VERSION_CODES.R)), + bitmapLoader: NotificationBitmapLoader = DefaultNotificationBitmapLoader(context, FakeBuildVersionSdkIntProvider(Build.VERSION_CODES.R)), ): NotificationCreator { return DefaultNotificationCreator( context = context, @@ -327,5 +329,5 @@ fun createNotificationCreator( fun createNotificationChannels(): NotificationChannels { val context = RuntimeEnvironment.getApplication() - return NotificationChannels(context, NotificationManagerCompat.from(context), FakeStringProvider("")) + return DefaultNotificationChannels(context, NotificationManagerCompat.from(context), FakeStringProvider("")) } diff --git a/libraries/push/impl/src/test/kotlin/io/element/android/libraries/push/impl/notifications/fake/FakeNotificationDataFactory.kt b/libraries/push/impl/src/test/kotlin/io/element/android/libraries/push/impl/notifications/fake/FakeNotificationDataFactory.kt index 221d3d0878..a35ee45996 100644 --- a/libraries/push/impl/src/test/kotlin/io/element/android/libraries/push/impl/notifications/fake/FakeNotificationDataFactory.kt +++ b/libraries/push/impl/src/test/kotlin/io/element/android/libraries/push/impl/notifications/fake/FakeNotificationDataFactory.kt @@ -46,7 +46,7 @@ class FakeNotificationDataFactory( var inviteToNotificationsResult: LambdaOneParamRecorder, List> = lambdaRecorder { _ -> emptyList() }, var simpleEventToNotificationsResult: LambdaOneParamRecorder, List> = lambdaRecorder { _ -> emptyList() }, var fallbackEventToNotificationsResult: LambdaOneParamRecorder, List> = - lambdaRecorder { _ -> emptyList() }, + lambdaRecorder { _ -> emptyList() }, ) : NotificationDataFactory { override suspend fun toNotifications(messages: List, currentUser: MatrixUser, imageLoader: ImageLoader): List { return messageEventToNotificationsResult(messages, currentUser, imageLoader) @@ -64,6 +64,8 @@ class FakeNotificationDataFactory( return simpleEventToNotificationsResult(simpleEvents) } + @JvmName("toNotificationFallbackEvents") + @Suppress("INAPPLICABLE_JVM_NAME") override fun toNotifications(fallback: List): List { return fallbackEventToNotificationsResult(fallback) } diff --git a/libraries/push/impl/src/test/kotlin/io/element/android/libraries/push/impl/notifications/fake/FakeNotificationDisplayer.kt b/libraries/push/impl/src/test/kotlin/io/element/android/libraries/push/impl/notifications/fake/FakeNotificationDisplayer.kt index c8c041720c..3ce472b02d 100644 --- a/libraries/push/impl/src/test/kotlin/io/element/android/libraries/push/impl/notifications/fake/FakeNotificationDisplayer.kt +++ b/libraries/push/impl/src/test/kotlin/io/element/android/libraries/push/impl/notifications/fake/FakeNotificationDisplayer.kt @@ -18,8 +18,8 @@ package io.element.android.libraries.push.impl.notifications.fake import android.app.Notification import io.element.android.libraries.matrix.test.A_SESSION_ID +import io.element.android.libraries.push.api.notifications.NotificationIdProvider import io.element.android.libraries.push.impl.notifications.NotificationDisplayer -import io.element.android.libraries.push.impl.notifications.NotificationIdProvider import io.element.android.tests.testutils.lambda.LambdaNoParamRecorder import io.element.android.tests.testutils.lambda.LambdaOneParamRecorder import io.element.android.tests.testutils.lambda.LambdaThreeParamsRecorder @@ -51,7 +51,7 @@ class FakeNotificationDisplayer( fun verifySummaryCancelled(times: Int = 1) { cancelNotificationMessageResult.assertions().isCalledExactly(times).withSequence( - listOf(value(null), value(NotificationIdProvider().getSummaryNotificationId(A_SESSION_ID))) + listOf(value(null), value(NotificationIdProvider.getSummaryNotificationId(A_SESSION_ID))) ) } } diff --git a/libraries/push/impl/src/test/kotlin/io/element/android/libraries/push/impl/notifications/fixtures/NotifiableEventFixture.kt b/libraries/push/impl/src/test/kotlin/io/element/android/libraries/push/impl/notifications/fixtures/NotifiableEventFixture.kt index 096ae254b8..fabe4bd353 100644 --- a/libraries/push/impl/src/test/kotlin/io/element/android/libraries/push/impl/notifications/fixtures/NotifiableEventFixture.kt +++ b/libraries/push/impl/src/test/kotlin/io/element/android/libraries/push/impl/notifications/fixtures/NotifiableEventFixture.kt @@ -21,11 +21,16 @@ 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.UserId +import io.element.android.libraries.matrix.api.notification.CallNotifyType +import io.element.android.libraries.matrix.api.timeline.item.event.EventType +import io.element.android.libraries.matrix.test.AN_AVATAR_URL import io.element.android.libraries.matrix.test.AN_EVENT_ID import io.element.android.libraries.matrix.test.A_ROOM_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.libraries.push.impl.notifications.model.InviteNotifiableEvent import io.element.android.libraries.push.impl.notifications.model.NotifiableMessageEvent +import io.element.android.libraries.push.impl.notifications.model.NotifiableRingingCallEvent import io.element.android.libraries.push.impl.notifications.model.SimpleNotifiableEvent fun aSimpleNotifiableEvent( @@ -79,6 +84,7 @@ fun aNotifiableMessageEvent( threadId: ThreadId? = null, isRedacted: Boolean = false, timestamp: Long = 0, + type: String = EventType.MESSAGE, ) = NotifiableMessageEvent( sessionId = sessionId, eventId = eventId, @@ -94,5 +100,34 @@ fun aNotifiableMessageEvent( roomIsDirect = false, canBeReplaced = false, isRedacted = isRedacted, - imageUriString = null + imageUriString = null, + type = type, +) + +fun aNotifiableCallEvent( + sessionId: SessionId = A_SESSION_ID, + roomId: RoomId = A_ROOM_ID, + eventId: EventId = AN_EVENT_ID, + senderId: UserId = A_USER_ID_2, + senderName: String? = null, + roomAvatarUrl: String? = AN_AVATAR_URL, + senderAvatarUrl: String? = AN_AVATAR_URL, + callNotifyType: CallNotifyType = CallNotifyType.NOTIFY, + timestamp: Long = 0L, +) = NotifiableRingingCallEvent( + sessionId = sessionId, + eventId = eventId, + roomId = roomId, + roomName = "a room name", + editedEventId = null, + description = "description", + timestamp = timestamp, + canBeReplaced = false, + isRedacted = false, + isUpdated = false, + senderDisambiguatedDisplayName = senderName, + senderId = senderId, + roomAvatarUrl = roomAvatarUrl, + senderAvatarUrl = senderAvatarUrl, + callNotifyType = callNotifyType, ) diff --git a/libraries/push/impl/src/test/kotlin/io/element/android/libraries/push/impl/push/DefaultPushHandlerTest.kt b/libraries/push/impl/src/test/kotlin/io/element/android/libraries/push/impl/push/DefaultPushHandlerTest.kt index 7739efbd1d..9e37aae29d 100644 --- a/libraries/push/impl/src/test/kotlin/io/element/android/libraries/push/impl/push/DefaultPushHandlerTest.kt +++ b/libraries/push/impl/src/test/kotlin/io/element/android/libraries/push/impl/push/DefaultPushHandlerTest.kt @@ -19,11 +19,16 @@ package io.element.android.libraries.push.impl.push import app.cash.turbine.test +import io.element.android.features.call.api.CallType +import io.element.android.features.call.test.FakeElementCallEntryPoint import io.element.android.libraries.core.meta.BuildMeta import io.element.android.libraries.matrix.api.auth.MatrixAuthenticationService 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.UserId +import io.element.android.libraries.matrix.api.notification.CallNotifyType +import io.element.android.libraries.matrix.api.timeline.item.event.EventType import io.element.android.libraries.matrix.test.AN_EVENT_ID import io.element.android.libraries.matrix.test.A_ROOM_ID import io.element.android.libraries.matrix.test.A_SECRET @@ -31,6 +36,8 @@ import io.element.android.libraries.matrix.test.A_USER_ID import io.element.android.libraries.matrix.test.auth.FakeMatrixAuthenticationService import io.element.android.libraries.matrix.test.core.aBuildMeta import io.element.android.libraries.push.impl.notifications.FakeNotifiableEventResolver +import io.element.android.libraries.push.impl.notifications.channels.FakeNotificationChannels +import io.element.android.libraries.push.impl.notifications.fixtures.aNotifiableCallEvent import io.element.android.libraries.push.impl.notifications.fixtures.aNotifiableMessageEvent import io.element.android.libraries.push.impl.notifications.model.NotifiableEvent import io.element.android.libraries.push.impl.test.DefaultTestPush @@ -47,6 +54,7 @@ import io.element.android.tests.testutils.lambda.value import kotlinx.coroutines.ExperimentalCoroutinesApi import kotlinx.coroutines.test.runTest import org.junit.Test +import java.time.Instant class DefaultPushHandlerTest { @Test @@ -220,6 +228,55 @@ class DefaultPushHandlerTest { .isNeverCalled() } + @Test + fun `when ringing call PushData is received, the incoming call will be handled`() = runTest { + val aPushData = PushData( + eventId = AN_EVENT_ID, + roomId = A_ROOM_ID, + unread = 0, + clientSecret = A_SECRET, + ) + val handleIncomingCallLambda = lambdaRecorder { _, _, _, _, _, _, _ -> } + val elementCallEntryPoint = FakeElementCallEntryPoint(handleIncomingCallResult = handleIncomingCallLambda) + val defaultPushHandler = createDefaultPushHandler( + elementCallEntryPoint = elementCallEntryPoint, + notifiableEventResult = { _, _, _ -> aNotifiableCallEvent(callNotifyType = CallNotifyType.RING, timestamp = Instant.now().toEpochMilli()) }, + incrementPushCounterResult = {}, + pushClientSecret = FakePushClientSecret( + getUserIdFromSecretResult = { A_USER_ID } + ), + ) + defaultPushHandler.handle(aPushData) + + handleIncomingCallLambda.assertions().isCalledOnce() + } + + @Test + fun `when notify call PushData is received, the incoming call will be treated as a normal notification`() = runTest { + val aPushData = PushData( + eventId = AN_EVENT_ID, + roomId = A_ROOM_ID, + unread = 0, + clientSecret = A_SECRET, + ) + val onNotifiableEventReceived = lambdaRecorder {} + val handleIncomingCallLambda = lambdaRecorder { _, _, _, _, _, _, _ -> } + val elementCallEntryPoint = FakeElementCallEntryPoint(handleIncomingCallResult = handleIncomingCallLambda) + val defaultPushHandler = createDefaultPushHandler( + elementCallEntryPoint = elementCallEntryPoint, + onNotifiableEventReceived = onNotifiableEventReceived, + notifiableEventResult = { _, _, _ -> aNotifiableMessageEvent(type = EventType.CALL_NOTIFY) }, + incrementPushCounterResult = {}, + pushClientSecret = FakePushClientSecret( + getUserIdFromSecretResult = { A_USER_ID } + ), + ) + defaultPushHandler.handle(aPushData) + + handleIncomingCallLambda.assertions().isNeverCalled() + onNotifiableEventReceived.assertions().isCalledOnce() + } + @Test fun `when diagnostic PushData is received, the diagnostic push handler is informed `() = runTest { @@ -249,6 +306,8 @@ class DefaultPushHandlerTest { buildMeta: BuildMeta = aBuildMeta(), matrixAuthenticationService: MatrixAuthenticationService = FakeMatrixAuthenticationService(), diagnosticPushHandler: DiagnosticPushHandler = DiagnosticPushHandler(), + elementCallEntryPoint: FakeElementCallEntryPoint = FakeElementCallEntryPoint(), + notificationChannels: FakeNotificationChannels = FakeNotificationChannels(), ): DefaultPushHandler { return DefaultPushHandler( onNotifiableEventReceived = FakeOnNotifiableEventReceived(onNotifiableEventReceived), @@ -263,6 +322,8 @@ class DefaultPushHandlerTest { buildMeta = buildMeta, matrixAuthenticationService = matrixAuthenticationService, diagnosticPushHandler = diagnosticPushHandler, + elementCallEntryPoint = elementCallEntryPoint, + notificationChannels = notificationChannels, ) } } diff --git a/libraries/push/impl/src/test/kotlin/io/element/android/libraries/push/impl/push/FakeOnNotifiableEventReceived.kt b/libraries/push/impl/src/test/kotlin/io/element/android/libraries/push/impl/push/FakeOnNotifiableEventReceived.kt index 3c9e025830..d7fb3ce048 100644 --- a/libraries/push/impl/src/test/kotlin/io/element/android/libraries/push/impl/push/FakeOnNotifiableEventReceived.kt +++ b/libraries/push/impl/src/test/kotlin/io/element/android/libraries/push/impl/push/FakeOnNotifiableEventReceived.kt @@ -17,9 +17,10 @@ package io.element.android.libraries.push.impl.push import io.element.android.libraries.push.impl.notifications.model.NotifiableEvent +import io.element.android.tests.testutils.lambda.lambdaError class FakeOnNotifiableEventReceived( - private val onNotifiableEventReceivedResult: (NotifiableEvent) -> Unit, + private val onNotifiableEventReceivedResult: (NotifiableEvent) -> Unit = { lambdaError() }, ) : OnNotifiableEventReceived { override fun onNotifiableEventReceived(notifiableEvent: NotifiableEvent) { onNotifiableEventReceivedResult(notifiableEvent) diff --git a/libraries/push/test/build.gradle.kts b/libraries/push/test/build.gradle.kts index 7826c3072b..be8acf362c 100644 --- a/libraries/push/test/build.gradle.kts +++ b/libraries/push/test/build.gradle.kts @@ -24,7 +24,13 @@ android { dependencies { api(projects.libraries.push.api) + implementation(projects.libraries.push.impl) implementation(projects.libraries.matrix.api) + implementation(projects.libraries.matrixui) implementation(projects.libraries.pushproviders.api) implementation(projects.tests.testutils) + implementation(libs.androidx.core) + implementation(libs.coil.compose) + implementation(libs.coil.test) + implementation(libs.test.robolectric) } diff --git a/libraries/push/test/src/main/kotlin/io/element/android/libraries/push/test/notifications/FakeCallNotificationEventResolver.kt b/libraries/push/test/src/main/kotlin/io/element/android/libraries/push/test/notifications/FakeCallNotificationEventResolver.kt new file mode 100644 index 0000000000..b8fc620619 --- /dev/null +++ b/libraries/push/test/src/main/kotlin/io/element/android/libraries/push/test/notifications/FakeCallNotificationEventResolver.kt @@ -0,0 +1,30 @@ +/* + * Copyright (c) 2024 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. + */ + +package io.element.android.libraries.push.test.notifications + +import io.element.android.libraries.matrix.api.core.SessionId +import io.element.android.libraries.matrix.api.notification.NotificationData +import io.element.android.libraries.push.impl.notifications.CallNotificationEventResolver +import io.element.android.libraries.push.impl.notifications.model.NotifiableEvent + +class FakeCallNotificationEventResolver( + var resolveEventLambda: (sessionId: SessionId, notificationData: NotificationData, forceNotify: Boolean) -> NotifiableEvent? = { _, _, _ -> null }, +) : CallNotificationEventResolver { + override fun resolveEvent(sessionId: SessionId, notificationData: NotificationData, forceNotify: Boolean): NotifiableEvent? { + return resolveEventLambda(sessionId, notificationData, forceNotify) + } +} diff --git a/libraries/push/impl/src/test/kotlin/io/element/android/libraries/push/impl/notifications/fake/FakeImageLoader.kt b/libraries/push/test/src/main/kotlin/io/element/android/libraries/push/test/notifications/FakeImageLoader.kt similarity index 96% rename from libraries/push/impl/src/test/kotlin/io/element/android/libraries/push/impl/notifications/fake/FakeImageLoader.kt rename to libraries/push/test/src/main/kotlin/io/element/android/libraries/push/test/notifications/FakeImageLoader.kt index 5c747b45e2..7fd8945e91 100644 --- a/libraries/push/impl/src/test/kotlin/io/element/android/libraries/push/impl/notifications/fake/FakeImageLoader.kt +++ b/libraries/push/test/src/main/kotlin/io/element/android/libraries/push/test/notifications/FakeImageLoader.kt @@ -14,7 +14,7 @@ * limitations under the License. */ -package io.element.android.libraries.push.impl.notifications.fake +package io.element.android.libraries.push.test.notifications import android.graphics.Color import android.graphics.drawable.ColorDrawable diff --git a/libraries/push/impl/src/test/kotlin/io/element/android/libraries/push/impl/notifications/fake/FakeImageLoaderHolder.kt b/libraries/push/test/src/main/kotlin/io/element/android/libraries/push/test/notifications/FakeImageLoaderHolder.kt similarity index 90% rename from libraries/push/impl/src/test/kotlin/io/element/android/libraries/push/impl/notifications/fake/FakeImageLoaderHolder.kt rename to libraries/push/test/src/main/kotlin/io/element/android/libraries/push/test/notifications/FakeImageLoaderHolder.kt index 0e18036e94..57b71007e4 100644 --- a/libraries/push/impl/src/test/kotlin/io/element/android/libraries/push/impl/notifications/fake/FakeImageLoaderHolder.kt +++ b/libraries/push/test/src/main/kotlin/io/element/android/libraries/push/test/notifications/FakeImageLoaderHolder.kt @@ -1,5 +1,5 @@ /* - * Copyright (c) 2023 New Vector Ltd + * Copyright (c) 2024 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. @@ -14,7 +14,7 @@ * limitations under the License. */ -package io.element.android.libraries.push.impl.notifications.fake +package io.element.android.libraries.push.test.notifications import coil.ImageLoader import io.element.android.libraries.matrix.api.MatrixClient diff --git a/libraries/push/test/src/main/kotlin/io/element/android/libraries/push/test/notifications/FakeNotificationDrawerManager.kt b/libraries/push/test/src/main/kotlin/io/element/android/libraries/push/test/notifications/FakeNotificationDrawerManager.kt index 1531d2df48..b42f05aa5f 100644 --- a/libraries/push/test/src/main/kotlin/io/element/android/libraries/push/test/notifications/FakeNotificationDrawerManager.kt +++ b/libraries/push/test/src/main/kotlin/io/element/android/libraries/push/test/notifications/FakeNotificationDrawerManager.kt @@ -16,33 +16,36 @@ package io.element.android.libraries.push.test.notifications +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.push.api.notifications.NotificationDrawerManager - -class FakeNotificationDrawerManager : NotificationDrawerManager { - private val clearMemberShipNotificationForSessionCallsCount = mutableMapOf() - private val clearMemberShipNotificationForRoomCallsCount = mutableMapOf() - - override fun clearMembershipNotificationForSession(sessionId: SessionId) { - clearMemberShipNotificationForSessionCallsCount.merge(sessionId.value, 1) { oldValue, value -> oldValue + value } +import io.element.android.tests.testutils.lambda.lambdaError + +class FakeNotificationDrawerManager( + private val clearAllMessagesEventsLambda: (SessionId) -> Unit = { lambdaError() }, + private val clearMessagesForRoomLambda: (SessionId, RoomId) -> Unit = { _, _ -> lambdaError() }, + private val clearEventLambda: (SessionId, EventId) -> Unit = { _, _ -> lambdaError() }, + private val clearMembershipNotificationForSessionLambda: (SessionId) -> Unit = { lambdaError() }, + private val clearMembershipNotificationForRoomLambda: (SessionId, RoomId) -> Unit = { _, _ -> lambdaError() } +) : NotificationDrawerManager { + override fun clearAllMessagesEvents(sessionId: SessionId) { + clearAllMessagesEventsLambda(sessionId) } - override fun clearMembershipNotificationForRoom(sessionId: SessionId, roomId: RoomId) { - val key = getMembershipNotificationKey(sessionId, roomId) - clearMemberShipNotificationForRoomCallsCount.merge(key, 1) { oldValue, value -> oldValue + value } + override fun clearMessagesForRoom(sessionId: SessionId, roomId: RoomId) { + clearMessagesForRoomLambda(sessionId, roomId) } - fun getClearMembershipNotificationForSessionCount(sessionId: SessionId): Int { - return clearMemberShipNotificationForRoomCallsCount[sessionId.value] ?: 0 + override fun clearEvent(sessionId: SessionId, eventId: EventId) { + clearEventLambda(sessionId, eventId) } - fun getClearMembershipNotificationForRoomCount(sessionId: SessionId, roomId: RoomId): Int { - val key = getMembershipNotificationKey(sessionId, roomId) - return clearMemberShipNotificationForRoomCallsCount[key] ?: 0 + override fun clearMembershipNotificationForSession(sessionId: SessionId) { + clearMembershipNotificationForSessionLambda(sessionId) } - private fun getMembershipNotificationKey(sessionId: SessionId, roomId: RoomId): String { - return "$sessionId-$roomId" + override fun clearMembershipNotificationForRoom(sessionId: SessionId, roomId: RoomId) { + clearMembershipNotificationForRoomLambda(sessionId, roomId) } } diff --git a/libraries/push/test/src/main/kotlin/io/element/android/libraries/push/test/notifications/FakeOnMissedCallNotificationHandler.kt b/libraries/push/test/src/main/kotlin/io/element/android/libraries/push/test/notifications/FakeOnMissedCallNotificationHandler.kt new file mode 100644 index 0000000000..1803be9a0a --- /dev/null +++ b/libraries/push/test/src/main/kotlin/io/element/android/libraries/push/test/notifications/FakeOnMissedCallNotificationHandler.kt @@ -0,0 +1,34 @@ +/* + * Copyright (c) 2024 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. + */ + +package io.element.android.libraries.push.test.notifications + +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.push.api.notifications.OnMissedCallNotificationHandler + +class FakeOnMissedCallNotificationHandler( + var addMissedCallNotificationLambda: (SessionId, RoomId, EventId) -> Unit = { _, _, _ -> } +) : OnMissedCallNotificationHandler { + override suspend fun addMissedCallNotification( + sessionId: SessionId, + roomId: RoomId, + eventId: EventId, + ) { + addMissedCallNotificationLambda(sessionId, roomId, eventId) + } +} diff --git a/libraries/push/test/src/main/kotlin/io/element/android/libraries/push/test/notifications/push/FakeNotificationBitmapLoader.kt b/libraries/push/test/src/main/kotlin/io/element/android/libraries/push/test/notifications/push/FakeNotificationBitmapLoader.kt new file mode 100644 index 0000000000..e21c409ccb --- /dev/null +++ b/libraries/push/test/src/main/kotlin/io/element/android/libraries/push/test/notifications/push/FakeNotificationBitmapLoader.kt @@ -0,0 +1,35 @@ +/* + * Copyright (c) 2024 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. + */ + +package io.element.android.libraries.push.test.notifications.push + +import android.graphics.Bitmap +import androidx.core.graphics.drawable.IconCompat +import coil.ImageLoader +import io.element.android.libraries.push.api.notifications.NotificationBitmapLoader + +class FakeNotificationBitmapLoader( + var getRoomBitmapResult: (String?, ImageLoader) -> Bitmap? = { _, _ -> null }, + var getUserIconResult: (String?, ImageLoader) -> IconCompat? = { _, _ -> null }, +) : NotificationBitmapLoader { + override suspend fun getRoomBitmap(path: String?, imageLoader: ImageLoader): Bitmap? { + return getRoomBitmapResult(path, imageLoader) + } + + override suspend fun getUserIcon(path: String?, imageLoader: ImageLoader): IconCompat? { + return getUserIconResult(path, imageLoader) + } +} diff --git a/libraries/roomselect/api/src/main/kotlin/io/element/android/libraries/roomselect/api/RoomSelectMode.kt b/libraries/roomselect/api/src/main/kotlin/io/element/android/libraries/roomselect/api/RoomSelectMode.kt index d3f63e366c..bff273aa9f 100644 --- a/libraries/roomselect/api/src/main/kotlin/io/element/android/libraries/roomselect/api/RoomSelectMode.kt +++ b/libraries/roomselect/api/src/main/kotlin/io/element/android/libraries/roomselect/api/RoomSelectMode.kt @@ -18,4 +18,5 @@ package io.element.android.libraries.roomselect.api enum class RoomSelectMode { Forward, + Share, } diff --git a/libraries/roomselect/impl/src/main/kotlin/io/element/android/libraries/roomselect/impl/RoomSelectStateProvider.kt b/libraries/roomselect/impl/src/main/kotlin/io/element/android/libraries/roomselect/impl/RoomSelectStateProvider.kt index 7bfddeb280..2821efd36a 100644 --- a/libraries/roomselect/impl/src/main/kotlin/io/element/android/libraries/roomselect/impl/RoomSelectStateProvider.kt +++ b/libraries/roomselect/impl/src/main/kotlin/io/element/android/libraries/roomselect/impl/RoomSelectStateProvider.kt @@ -31,29 +31,33 @@ open class RoomSelectStateProvider : PreviewParameterProvider { get() = sequenceOf( aRoomSelectState(), aRoomSelectState(query = "Test", isSearchActive = true), - aRoomSelectState(resultState = SearchBarResultState.Results(aForwardMessagesRoomList())), + aRoomSelectState(resultState = SearchBarResultState.Results(aRoomSelectRoomList())), aRoomSelectState( - resultState = SearchBarResultState.Results(aForwardMessagesRoomList()), + resultState = SearchBarResultState.Results(aRoomSelectRoomList()), query = "Test", isSearchActive = true, ), aRoomSelectState( - resultState = SearchBarResultState.Results(aForwardMessagesRoomList()), + resultState = SearchBarResultState.Results(aRoomSelectRoomList()), query = "Test", isSearchActive = true, selectedRooms = persistentListOf(aRoomSummaryDetails(roomId = RoomId("!room2:domain"))) ), - // Add other states here + aRoomSelectState( + mode = RoomSelectMode.Share, + resultState = SearchBarResultState.Results(aRoomSelectRoomList()), + ), ) } private fun aRoomSelectState( + mode: RoomSelectMode = RoomSelectMode.Forward, resultState: SearchBarResultState> = SearchBarResultState.Initial(), query: String = "", isSearchActive: Boolean = false, selectedRooms: ImmutableList = persistentListOf(), ) = RoomSelectState( - mode = RoomSelectMode.Forward, + mode = mode, resultState = resultState, query = query, isSearchActive = isSearchActive, @@ -61,7 +65,7 @@ private fun aRoomSelectState( eventSink = {} ) -private fun aForwardMessagesRoomList() = persistentListOf( +private fun aRoomSelectRoomList() = persistentListOf( aRoomSummaryDetails(), aRoomSummaryDetails( roomId = RoomId("!room2:domain"), diff --git a/libraries/roomselect/impl/src/main/kotlin/io/element/android/libraries/roomselect/impl/RoomSelectView.kt b/libraries/roomselect/impl/src/main/kotlin/io/element/android/libraries/roomselect/impl/RoomSelectView.kt index 438cb8d4e6..fa8525bdc1 100644 --- a/libraries/roomselect/impl/src/main/kotlin/io/element/android/libraries/roomselect/impl/RoomSelectView.kt +++ b/libraries/roomselect/impl/src/main/kotlin/io/element/android/libraries/roomselect/impl/RoomSelectView.kt @@ -105,6 +105,7 @@ fun RoomSelectView( Text( text = when (state.mode) { RoomSelectMode.Forward -> stringResource(CommonStrings.common_forward_message) + RoomSelectMode.Share -> stringResource(CommonStrings.common_send_to) }, style = ElementTheme.typography.aliasScreenTitle ) diff --git a/libraries/textcomposer/impl/src/main/res/values-et/translations.xml b/libraries/textcomposer/impl/src/main/res/values-et/translations.xml new file mode 100644 index 0000000000..ae4ac16f03 --- /dev/null +++ b/libraries/textcomposer/impl/src/main/res/values-et/translations.xml @@ -0,0 +1,24 @@ + + + "Lisa manus" + "Lülita mummudega loend sisse/välja" + "Sulge vorminduse valikud" + "Lülita lähtekoodi lõik sisse/välja" + "Sõnum…" + "Lisa link" + "Muuda linki" + "Kasuta paksu kirja" + "Kasuta kaldkirja" + "Kasuta läbikriipsutatud kirja" + "Kasuta allajoonitud kirja" + "Lülita täisekraanivaade sisse/välja" + "Lisa taandrida" + "Kuva lähtekoodi lõiguna" + "Lisa link" + "Lülita nummerdatud loend sisse/välja" + "Ava vorminduse valikud" + "Lülita tsiteerimine sisse/välja" + "Eemalda link" + "Eemalda taandrida" + "Link" + diff --git a/libraries/ui-strings/src/main/res/values-be/translations.xml b/libraries/ui-strings/src/main/res/values-be/translations.xml index d5fe6ede80..fbe9910683 100644 --- a/libraries/ui-strings/src/main/res/values-be/translations.xml +++ b/libraries/ui-strings/src/main/res/values-be/translations.xml @@ -85,6 +85,7 @@ "Хуткі адказ" "Цытата" "Рэакцыя" + "Адхіліць" "Выдаліць" "Адказаць" "Адказаць у гутаркі" @@ -162,7 +163,7 @@ "Выгляд паведамлення" "Паведамленне выдалена" "Сучасны" - "Адключыць гук" + "Адкл. гук" "Вынікаў няма" "Няма назвы пакоя" "Па-за сеткай" @@ -201,6 +202,7 @@ "Вынікі пошуку" "Бяспека" "Прагледжана" + "Адправіць" "Адпраўка…" "Памылка адпраўкі" "Адпраўлена" @@ -226,7 +228,7 @@ "Не ўдалося адправіць запрашэнні аднаму або некалькім карыстальнікам." "Немагчыма адправіць запрашэнне(я)" "Разблакіраваць" - "Уключыць гук" + "Укл. гук" "Падзея не падтрымліваецца" "Імя карыстальніка" "Праверка адменена" @@ -235,7 +237,7 @@ "Відэа" "Галасавое паведамленне" "Чакаем…" - "Чакаю гэтага паведамлення" + "Чакаю гэта паведамленне" "Пацвярджэнне" "Памылка" "Поспех" @@ -257,6 +259,7 @@ "Гэй, пагавары са мной у %1$s: %2$s" "%1$s Android" "Паведаміць аб памылцы з дапамогай Rageshake" + "Уваходны званок Element Call" "Не ўдалося выбраць носьбіт, паўтарыце спробу." "Не атрымалася апрацаваць медыяфайл для загрузкі, паспрабуйце яшчэ раз." "Не атрымалася загрузіць медыяфайлы, паспрабуйце яшчэ раз." 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 2a344bff38..029ab4ef00 100644 --- a/libraries/ui-strings/src/main/res/values-cs/translations.xml +++ b/libraries/ui-strings/src/main/res/values-cs/translations.xml @@ -85,6 +85,7 @@ "Rychlá odpověď" "Citovat" "Reagovat" + "Odmítnout" "Odstranit" "Odpovědět" "Odpovědět ve vlákně" @@ -201,6 +202,7 @@ "Výsledky hledání" "Zabezpečení" "Viděno" + "Odeslat do" "Odesílání…" "Odeslání se nezdařilo" "Odesláno" @@ -257,6 +259,7 @@ "Ahoj, ozvi se mi na %1$s: %2$s" "%1$s Android" "Zatřeste zařízením pro nahlášení chyby" + "Příchozí Element Call" "Výběr média se nezdařil, zkuste to prosím znovu." "Nahrání média se nezdařilo, zkuste to prosím znovu." "Nahrání média se nezdařilo, zkuste to prosím znovu." diff --git a/libraries/ui-strings/src/main/res/values-et/translations.xml b/libraries/ui-strings/src/main/res/values-et/translations.xml new file mode 100644 index 0000000000..a3f580eb19 --- /dev/null +++ b/libraries/ui-strings/src/main/res/values-et/translations.xml @@ -0,0 +1,262 @@ + + + "Kustuta" + + "%1$d number sisestatud" + "%1$d numbrit sisestatud" + + "Peida salasõna" + "Mine lõppu" + "Ainult mainimised" + "Summutatud" + "%1$d. lehekülg" + "Peata" + "PIN-koodi väli" + "Esita" + "Küsitlus" + "Lõppenud küsitlus" + "Reageeri emotikoniga %1$s" + "Reageeri mõne muu emotikoniga" + "Seda lugesid %1$s ja %2$s" + + "Seda lugesid %1$s ja veel %2$d kasutaja" + "Seda lugesid %1$s ja veel %2$d kasutajat" + + "Seda luges %1$s" + "Vaata kõiki" + "Eemalda reageerimine %1$s emotikoniga" + "Saada faile" + "Näita salasõna" + "Helista" + "Kasutajamenüü" + "Salvesta häälsõnum" + "Lõpeta salvestamine" + "Nõustu" + "Lisa ajajoonele" + "Tagasi" + "Helista kasutajale" + "Loobu" + "Vali foto" + "Selge" + "Sulge" + "Tee verifitseerimine lõpuni" + "Kinnita" + "Jätka" + "Kopeeri" + "Kopeeri link" + "Kopeeri sõnumi link" + "Loo" + "Loo jututuba" + "Keeldu" + "Kustuta küsitlus" + "Lülita välja" + "Loobu" + "Valmis" + "Muuda" + "Muuda küsitlust" + "Võta kasutusele" + "Lõpeta küsitlus" + "Sisesta PIN-kood" + "Kas unustasid salasõna?" + "Edasta" + "Tagasi eelmisesse vaatesse" + "Kutsu" + "Kutsu osalejaid" + "Kutsu huvilisi kasutama rakendust %1$s" + "Kutsed" + "Liitu" + "Lisateave" + "Lahku" + "Lahku vestlusest" + "Lahku jututoast" + "Näita veel" + "Halda kasutajakontot" + "Halda seadmeid" + "Saada sõnum kasutajale" + "Edasi" + "Ei" + "Mitte praegu" + "OK" + "Seadistused" + "Ava rakendusega" + "Kiirvastus" + "Tsiteeri" + "Reageeri" + "Eemalda" + "Vasta" + "Vasta jutulõngas" + "Teata veast" + "Teata sisust haldurile" + "Lähtesta" + "Proovi uuesti" + "Proovi dekrüptimist uuesti" + "Salvesta" + "Otsi" + "Saada" + "Saada sõnum" + "Jaga" + "Jaga linki" + "Logi uuesti sisse" + "Logi välja" + "Ikkagi logi välja" + "Jäta vahele" + "Alusta" + "Alusta vestlust" + "Alusta verifitseerimist" + "Kaardi laadimiseks klõpsa" + "Tee pilt" + "Valikuteks klõpsa" + "Proovi uuesti" + "Vaata lähtekoodi" + "Jah" + "Rakenduse teave" + "Vastuvõetava kasutamise põhimõtted" + "Täiendavad seadistused" + "Analüütika" + "Välimus" + "Heli" + "Blokeeritud kasutajad" + "Mullid" + "Kõne on pooleli (pole toetatud)" + "Kõne algas" + "Vestluse varukoopia" + "Autoriõigused" + "Loome jututoa…" + "Lahkus jututoast" + "Tume" + "Dekrüptimisviga" + "Arendaja valikud" + "Otsevestlus" + "(muudetud)" + "Muutmine" + "* %1$s %2$s" + "Krüptimine on kasutusel" + "Sisesta oma PIN-kood" + "Viga" + "Kõik" + "Ei õnnestunud" + "Lemmik" + "Lemmikuks määratud" + "Fail" + "Fail on salvestatud kausta Allalaadimised" + "Edasta sõnum" + "GIF" + "Pilt" + "Vastuseks kasutajale %1$s" + "Paigalda APK-failist" + "Sellist Matrix\'i kasutajatunnust ei õnnestu leida, seega sõnumit ilmselt keegi kätte ei saa." + "On lahkumas jututoast" + "Hele" + "Link on kopeeritud lõikelauale" + "Laadime…" + + "%1$d liige" + "%1$d liiget" + + "Sõnum" + "Tegevused sõnumiga" + "Sõnumi paigutus" + "Sõnum on eemaldatud" + "Kaasaegne" + "Summuta" + "Otsingul pole tulemusi" + "Jututoal puudub nimi" + "Võrgust väljas" + "või" + "Salasõna" + "Inimesed" + "Püsilink" + "Õigus" + "Palun oota…" + "Kas oled kindel, et soovid selle küsitluse lõpetada?" + "Küsitlus: %1$s" + "Hääli kokku: %1$s" + "Tulemused on näha peale küsitluse lõppemist" + + "%d hääl" + "%d häält" + + "Privaatsuspoliitika" + "Reaktsioon" + "Reaktsioonid" + "Taastevõti" + "Värskendame andmeid…" + "Vastates kasutajale %1$s" + "Teata veast" + "Teata veast" + "Veateade on saadetud" + "Vormindatud teksti toimeti" + "Jututuba" + "Jututoa nimi" + "näiteks sinu projekti või seltsingu nimi" + "Muudatused on salvestatud" + "Salvestame" + "Ekraanilukk" + "Otsi kedagi" + "Otsingutulemused" + "Turvalisus" + "Seda nägi" + "Saadame…" + "Saatmine ei õnnestunud" + "Saadetud" + "Server pole toetatud" + "Serveri URL" + "Seadistused" + "Jagatud asukoht" + "Logime välja" + "Midagi läks valesti" + "Alustame vestlust…" + "Kleeps" + "Õnnestus" + "Soovitused" + "Kolmandate osapoolte teatised" + "Jutulõng" + "Teema" + "Mis on selle jututoa mõte?" + "Dekrüptimine ei olnud võimalik" + "Sul pole ligipääsu antud sõnumile" + "Kutset polnud võimalik saata ühele või enamale kasutajale." + "Kutse(te) saatmine ei õnnestunud" + "Eemalda lukustus" + "Lõpeta summutamine" + "Toetamata sündmus" + "Kasutajanimi" + "Verifitseerimine on katkestatud" + "Verifitseerimine on tehtud" + "Verifitseeri seade" + "Video" + "Häälsõnum" + "Ootame…" + "Ootame selle sõnumi dekrüptimisvõtit" + "Kinnitus" + "Viga" + "Õnnestus" + "Hoiatus" + "Sinu tehtud muudatused pole veel salvestatud. Kas sa oled kindel, et soovid minna tagasi?" + "Kas salvestame muudatused?" + "Püsilingi loomine ei õnnestumud" + "%1$s kaardi laadimine ei õnnestunud. Palun proovi hiljem uuesti." + "Sõnumite laadimine ei õnnestunud" + "Rakendus %1$s ei suutnud tuvastada sinu asukohta. Palun proovi hiljem uuesti." + "Sinu häälsõnumi üleslaadimine ei õnnestunud." + "Sõnumit ei leidu" + "Rakendusel %1$s puudub õigus sinu asukohta tuvastada. Sa saad seda lubada süsteemi seadistustest." + "Rakendusel %1$s puudub õigus sinu asukohta tuvastada. Alljärgnevas luba vastavad õigused." + "Rakendusel %1$s puudub õigus sinu nutiseadme mikrofoni kasutada. Alljärgnevas luba õigused heli salvestamiseks." + "Mõned sõnumid on saatmata" + "Vabandust, ilmnes viga" + "🔐️ Liitu minuga rakenduses %1$s" + "Hei, suhtle minuga %1$s võrgus: %2$s" + "%1$s Android" + "Veast teatamiseks raputa nutiseadet ägedalt" + "Meediafaili valimine ei õnnestunud. Palun proovi uuesti." + "Meediafaili töötlemine enne üleslaadimist ei õnnestunud. Palun proovi uuesti." + "Meediafaili üleslaadimine ei õnnestunud. Palun proovi uuesti." + "Meediafaili töötlemine enne üleslaadimist ei õnnestunud. Palun proovi uuesti." + "Jaga asukohta" + "Jaga minu asukohta" + "Jaga seda asukohta" + "Asukoht" + "Versioon: %1$s (%2$s)" + "et" + 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 d4c1b3126c..568989ab65 100644 --- a/libraries/ui-strings/src/main/res/values-fr/translations.xml +++ b/libraries/ui-strings/src/main/res/values-fr/translations.xml @@ -197,6 +197,7 @@ "Résultats de la recherche" "Sécurité" "Vu par" + "Envoyer vers" "Envoi en cours…" "Échec de l’envoi" "Envoyé" diff --git a/libraries/ui-strings/src/main/res/values-pt/translations.xml b/libraries/ui-strings/src/main/res/values-pt/translations.xml index f1ee60abe5..51baf0a9c6 100644 --- a/libraries/ui-strings/src/main/res/values-pt/translations.xml +++ b/libraries/ui-strings/src/main/res/values-pt/translations.xml @@ -83,6 +83,7 @@ "Resposta rápida" "Citação" "Reagir" + "Rejeitar" "Remover" "Responder" "Responder ao tópico" @@ -197,6 +198,7 @@ "Resultados da pesquisa" "Segurança" "Vista por" + "Enviar para" "A enviar…" "Falha no envio" "Enviada" @@ -253,6 +255,7 @@ "Alô! Fala comigo na %1$s: %2$s" "%1$s Android" "Agita o dispositivo em fúria para comunicar um problema" + "A receber chamada da Element " "Falha ao selecionar multimédia, por favor tente novamente." "Falha ao processar multimédia para carregamento, por favor tente novamente." "Falhar ao carregar multimédia, por favor tente novamente." diff --git a/libraries/ui-strings/src/main/res/values-ru/translations.xml b/libraries/ui-strings/src/main/res/values-ru/translations.xml index 5544635732..1509e7865d 100644 --- a/libraries/ui-strings/src/main/res/values-ru/translations.xml +++ b/libraries/ui-strings/src/main/res/values-ru/translations.xml @@ -85,6 +85,7 @@ "Быстрый ответ" "Цитата" "Реакция" + "Отклонить" "Удалить" "Ответить" "Ответить в теме" @@ -203,6 +204,7 @@ "Результаты поиска" "Безопасность" "Просмотрено" + "Отправить" "Отправка…" "Сбой отправки" "Отправлено" @@ -259,6 +261,7 @@ "Привет, поговори со мной по %1$s: %2$s" "%1$s Android" "Встряхните устройство, чтобы сообщить об ошибке" + "Входящий вызов Element" "Не удалось выбрать носитель, попробуйте еще раз." "Не удалось обработать медиафайл для загрузки, попробуйте еще раз." "Не удалось загрузить медиафайлы, попробуйте еще раз." 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 d9afe4ba65..1bbd526b74 100644 --- a/libraries/ui-strings/src/main/res/values-sk/translations.xml +++ b/libraries/ui-strings/src/main/res/values-sk/translations.xml @@ -85,6 +85,7 @@ "Rýchla odpoveď" "Citovať" "Reagovať" + "Odmietnuť" "Odstrániť" "Odpovedať" "Odpovedať vo vlákne" @@ -201,6 +202,7 @@ "Výsledky hľadania" "Bezpečnosť" "Videné" + "Odoslať" "Odosiela sa…" "Odoslanie zlyhalo" "Odoslané" @@ -257,6 +259,7 @@ "Ahoj, porozprávajte sa so mnou na %1$s: %2$s" "%1$s Android" "Zúrivo potriasť pre nahlásenie chyby" + "Prichádzajúci hovor Element Call" "Nepodarilo sa vybrať médium, skúste to prosím znova." "Nepodarilo sa spracovať médiá na odoslanie, skúste to prosím znova." "Nepodarilo sa nahrať médiá, skúste to prosím znova." diff --git a/libraries/ui-strings/src/main/res/values-zh/translations.xml b/libraries/ui-strings/src/main/res/values-zh/translations.xml index ded718fcec..df039a5054 100644 --- a/libraries/ui-strings/src/main/res/values-zh/translations.xml +++ b/libraries/ui-strings/src/main/res/values-zh/translations.xml @@ -32,6 +32,7 @@ "接受" "添加到时间线" "返回" + "呼叫" "取消" "选择照片" "清除" @@ -70,6 +71,7 @@ "载入更多" "管理账户" "管理设备" + "发送消息给" "下一步" "否" "以后再说" @@ -115,6 +117,7 @@ "已屏蔽用户" "气泡" "通话进行中(不支持)" + "通话已开始" "聊天记录备份" "版权" "正在创建房间…" @@ -159,7 +162,7 @@ "离线" "或" "密码" - "人" + "用户" "固定链接" "权限" "请稍候……" diff --git a/libraries/ui-strings/src/main/res/values/localazy.xml b/libraries/ui-strings/src/main/res/values/localazy.xml index 8d46b6e5b1..346b1af8f2 100644 --- a/libraries/ui-strings/src/main/res/values/localazy.xml +++ b/libraries/ui-strings/src/main/res/values/localazy.xml @@ -83,6 +83,7 @@ "Quick reply" "Quote" "React" + "Reject" "Remove" "Reply" "Reply in thread" @@ -197,6 +198,7 @@ "Search results" "Security" "Seen by" + "Send to" "Sending…" "Sending failed" "Sent" @@ -253,6 +255,7 @@ "Hey, talk to me on %1$s: %2$s" "%1$s Android" "Rageshake to report bug" + "Incoming Element Call" "Failed selecting media, please try again." "Failed processing media to upload, please try again." "Failed uploading media, please try again." diff --git a/plugins/src/main/kotlin/Versions.kt b/plugins/src/main/kotlin/Versions.kt index 9e3d157c6c..249f469d30 100644 --- a/plugins/src/main/kotlin/Versions.kt +++ b/plugins/src/main/kotlin/Versions.kt @@ -56,7 +56,7 @@ private const val versionMinor = 4 // Note: even values are reserved for regular release, odd values for hotfix release. // When creating a hotfix, you should decrease the value, since the current value // is the value for the next regular release. -private const val versionPatch = 14 +private const val versionPatch = 15 object Versions { val versionCode = 4_000_000 + versionMajor * 1_00_00 + versionMinor * 1_00 + versionPatch diff --git a/plugins/src/main/kotlin/extension/locales.kt b/plugins/src/main/kotlin/extension/locales.kt index 4b5ae81f62..78509ab59f 100644 --- a/plugins/src/main/kotlin/extension/locales.kt +++ b/plugins/src/main/kotlin/extension/locales.kt @@ -9,6 +9,7 @@ val locales = setOf( "de", "en", "es", + "et", "fr", "hu", "in", diff --git a/screenshots/html/data.js b/screenshots/html/data.js index 5416483849..c738d8f3ec 100644 --- a/screenshots/html/data.js +++ b/screenshots/html/data.js @@ -1,39 +1,39 @@ // Generated file, do not edit export const screenshots = [ ["en","en-dark","de",], -["ui_S_t[f.preferences.impl.about_AboutView_null_AboutView-Day-0_1_null_0,NEXUS_5,1.0,en]","ui_S_t[f.preferences.impl.about_AboutView_null_AboutView-Night-0_2_null_0,NEXUS_5,1.0,en]",19874,], +["ui_S_t[f.preferences.impl.about_AboutView_null_AboutView-Day-0_1_null_0,NEXUS_5,1.0,en]","ui_S_t[f.preferences.impl.about_AboutView_null_AboutView-Night-0_2_null_0,NEXUS_5,1.0,en]",19881,], ["ui_S_t[f.invite.impl.response_AcceptDeclineInviteView_null_AcceptDeclineInviteView-Day-0_1_null_0,NEXUS_5,1.0,en]","ui_S_t[f.invite.impl.response_AcceptDeclineInviteView_null_AcceptDeclineInviteView-Night-0_2_null_0,NEXUS_5,1.0,en]",0,], -["ui_S_t[f.invite.impl.response_AcceptDeclineInviteView_null_AcceptDeclineInviteView-Day-0_1_null_1,NEXUS_5,1.0,en]","ui_S_t[f.invite.impl.response_AcceptDeclineInviteView_null_AcceptDeclineInviteView-Night-0_2_null_1,NEXUS_5,1.0,en]",19874,], -["ui_S_t[f.invite.impl.response_AcceptDeclineInviteView_null_AcceptDeclineInviteView-Day-0_1_null_2,NEXUS_5,1.0,en]","ui_S_t[f.invite.impl.response_AcceptDeclineInviteView_null_AcceptDeclineInviteView-Night-0_2_null_2,NEXUS_5,1.0,en]",19874,], -["ui_S_t[f.invite.impl.response_AcceptDeclineInviteView_null_AcceptDeclineInviteView-Day-0_1_null_3,NEXUS_5,1.0,en]","ui_S_t[f.invite.impl.response_AcceptDeclineInviteView_null_AcceptDeclineInviteView-Night-0_2_null_3,NEXUS_5,1.0,en]",19874,], -["ui_S_t[f.invite.impl.response_AcceptDeclineInviteView_null_AcceptDeclineInviteView-Day-0_1_null_4,NEXUS_5,1.0,en]","ui_S_t[f.invite.impl.response_AcceptDeclineInviteView_null_AcceptDeclineInviteView-Night-0_2_null_4,NEXUS_5,1.0,en]",19874,], +["ui_S_t[f.invite.impl.response_AcceptDeclineInviteView_null_AcceptDeclineInviteView-Day-0_1_null_1,NEXUS_5,1.0,en]","ui_S_t[f.invite.impl.response_AcceptDeclineInviteView_null_AcceptDeclineInviteView-Night-0_2_null_1,NEXUS_5,1.0,en]",19881,], +["ui_S_t[f.invite.impl.response_AcceptDeclineInviteView_null_AcceptDeclineInviteView-Day-0_1_null_2,NEXUS_5,1.0,en]","ui_S_t[f.invite.impl.response_AcceptDeclineInviteView_null_AcceptDeclineInviteView-Night-0_2_null_2,NEXUS_5,1.0,en]",19881,], +["ui_S_t[f.invite.impl.response_AcceptDeclineInviteView_null_AcceptDeclineInviteView-Day-0_1_null_3,NEXUS_5,1.0,en]","ui_S_t[f.invite.impl.response_AcceptDeclineInviteView_null_AcceptDeclineInviteView-Night-0_2_null_3,NEXUS_5,1.0,en]",19881,], +["ui_S_t[f.invite.impl.response_AcceptDeclineInviteView_null_AcceptDeclineInviteView-Day-0_1_null_4,NEXUS_5,1.0,en]","ui_S_t[f.invite.impl.response_AcceptDeclineInviteView_null_AcceptDeclineInviteView-Night-0_2_null_4,NEXUS_5,1.0,en]",19881,], ["ui_S_t[f.login.impl.accountprovider_AccountProviderView_null_AccountProviderView-Day-0_1_null_0,NEXUS_5,1.0,en]","ui_S_t[f.login.impl.accountprovider_AccountProviderView_null_AccountProviderView-Night-0_2_null_0,NEXUS_5,1.0,en]",0,], ["ui_S_t[f.login.impl.accountprovider_AccountProviderView_null_AccountProviderView-Day-0_1_null_1,NEXUS_5,1.0,en]","ui_S_t[f.login.impl.accountprovider_AccountProviderView_null_AccountProviderView-Night-0_2_null_1,NEXUS_5,1.0,en]",0,], ["ui_S_t[f.login.impl.accountprovider_AccountProviderView_null_AccountProviderView-Day-0_1_null_2,NEXUS_5,1.0,en]","ui_S_t[f.login.impl.accountprovider_AccountProviderView_null_AccountProviderView-Night-0_2_null_2,NEXUS_5,1.0,en]",0,], ["ui_S_t[f.login.impl.accountprovider_AccountProviderView_null_AccountProviderView-Day-0_1_null_3,NEXUS_5,1.0,en]","ui_S_t[f.login.impl.accountprovider_AccountProviderView_null_AccountProviderView-Night-0_2_null_3,NEXUS_5,1.0,en]",0,], ["ui_S_t[f.login.impl.accountprovider_AccountProviderView_null_AccountProviderView-Day-0_1_null_4,NEXUS_5,1.0,en]","ui_S_t[f.login.impl.accountprovider_AccountProviderView_null_AccountProviderView-Night-0_2_null_4,NEXUS_5,1.0,en]",0,], -["ui_S_t[f.createroom.impl.addpeople_AddPeopleView_null_AddPeopleView-Day-0_1_null_0,NEXUS_5,1.0,en]","ui_S_t[f.createroom.impl.addpeople_AddPeopleView_null_AddPeopleView-Night-0_2_null_0,NEXUS_5,1.0,en]",19874,], -["ui_S_t[f.createroom.impl.addpeople_AddPeopleView_null_AddPeopleView-Day-0_1_null_1,NEXUS_5,1.0,en]","ui_S_t[f.createroom.impl.addpeople_AddPeopleView_null_AddPeopleView-Night-0_2_null_1,NEXUS_5,1.0,en]",19874,], -["ui_S_t[f.createroom.impl.addpeople_AddPeopleView_null_AddPeopleView-Day-0_1_null_2,NEXUS_5,1.0,en]","ui_S_t[f.createroom.impl.addpeople_AddPeopleView_null_AddPeopleView-Night-0_2_null_2,NEXUS_5,1.0,en]",19874,], -["ui_S_t[f.createroom.impl.addpeople_AddPeopleView_null_AddPeopleView-Day-0_1_null_3,NEXUS_5,1.0,en]","ui_S_t[f.createroom.impl.addpeople_AddPeopleView_null_AddPeopleView-Night-0_2_null_3,NEXUS_5,1.0,en]",19874,], -["ui_S_t[f.preferences.impl.advanced_AdvancedSettingsView_null_AdvancedSettingsView-Day-1_2_null_0,NEXUS_5,1.0,en]","ui_S_t[f.preferences.impl.advanced_AdvancedSettingsView_null_AdvancedSettingsView-Night-1_3_null_0,NEXUS_5,1.0,en]",19874,], -["ui_S_t[f.preferences.impl.advanced_AdvancedSettingsView_null_AdvancedSettingsView-Day-1_2_null_1,NEXUS_5,1.0,en]","ui_S_t[f.preferences.impl.advanced_AdvancedSettingsView_null_AdvancedSettingsView-Night-1_3_null_1,NEXUS_5,1.0,en]",19874,], -["ui_S_t[f.preferences.impl.advanced_AdvancedSettingsView_null_AdvancedSettingsView-Day-1_2_null_2,NEXUS_5,1.0,en]","ui_S_t[f.preferences.impl.advanced_AdvancedSettingsView_null_AdvancedSettingsView-Night-1_3_null_2,NEXUS_5,1.0,en]",19874,], -["ui_S_t[f.preferences.impl.advanced_AdvancedSettingsView_null_AdvancedSettingsView-Day-1_2_null_3,NEXUS_5,1.0,en]","ui_S_t[f.preferences.impl.advanced_AdvancedSettingsView_null_AdvancedSettingsView-Night-1_3_null_3,NEXUS_5,1.0,en]",19874,], -["ui_S_t[f.analytics.impl_AnalyticsOptInView_null_AnalyticsOptInView-Day-0_1_null_0,NEXUS_5,1.0,en]","ui_S_t[f.analytics.impl_AnalyticsOptInView_null_AnalyticsOptInView-Night-0_2_null_0,NEXUS_5,1.0,en]",19874,], -["ui_S_t[f.analytics.api.preferences_AnalyticsPreferencesView_null_AnalyticsPreferencesView-Day-0_1_null_0,NEXUS_5,1.0,en]","ui_S_t[f.analytics.api.preferences_AnalyticsPreferencesView_null_AnalyticsPreferencesView-Night-0_2_null_0,NEXUS_5,1.0,en]",19874,], -["ui_S_t[f.preferences.impl.analytics_AnalyticsSettingsView_null_AnalyticsSettingsView-Day-2_3_null_0,NEXUS_5,1.0,en]","ui_S_t[f.preferences.impl.analytics_AnalyticsSettingsView_null_AnalyticsSettingsView-Night-2_4_null_0,NEXUS_5,1.0,en]",19874,], -["ui_S_t[services.apperror.impl_AppErrorView_null_AppErrorView-Day-0_1_null,NEXUS_5,1.0,en]","ui_S_t[services.apperror.impl_AppErrorView_null_AppErrorView-Night-0_2_null,NEXUS_5,1.0,en]",19874,], +["ui_S_t[f.createroom.impl.addpeople_AddPeopleView_null_AddPeopleView-Day-0_1_null_0,NEXUS_5,1.0,en]","ui_S_t[f.createroom.impl.addpeople_AddPeopleView_null_AddPeopleView-Night-0_2_null_0,NEXUS_5,1.0,en]",19881,], +["ui_S_t[f.createroom.impl.addpeople_AddPeopleView_null_AddPeopleView-Day-0_1_null_1,NEXUS_5,1.0,en]","ui_S_t[f.createroom.impl.addpeople_AddPeopleView_null_AddPeopleView-Night-0_2_null_1,NEXUS_5,1.0,en]",19881,], +["ui_S_t[f.createroom.impl.addpeople_AddPeopleView_null_AddPeopleView-Day-0_1_null_2,NEXUS_5,1.0,en]","ui_S_t[f.createroom.impl.addpeople_AddPeopleView_null_AddPeopleView-Night-0_2_null_2,NEXUS_5,1.0,en]",19881,], +["ui_S_t[f.createroom.impl.addpeople_AddPeopleView_null_AddPeopleView-Day-0_1_null_3,NEXUS_5,1.0,en]","ui_S_t[f.createroom.impl.addpeople_AddPeopleView_null_AddPeopleView-Night-0_2_null_3,NEXUS_5,1.0,en]",19881,], +["ui_S_t[f.preferences.impl.advanced_AdvancedSettingsView_null_AdvancedSettingsView-Day-1_2_null_0,NEXUS_5,1.0,en]","ui_S_t[f.preferences.impl.advanced_AdvancedSettingsView_null_AdvancedSettingsView-Night-1_3_null_0,NEXUS_5,1.0,en]",19881,], +["ui_S_t[f.preferences.impl.advanced_AdvancedSettingsView_null_AdvancedSettingsView-Day-1_2_null_1,NEXUS_5,1.0,en]","ui_S_t[f.preferences.impl.advanced_AdvancedSettingsView_null_AdvancedSettingsView-Night-1_3_null_1,NEXUS_5,1.0,en]",19881,], +["ui_S_t[f.preferences.impl.advanced_AdvancedSettingsView_null_AdvancedSettingsView-Day-1_2_null_2,NEXUS_5,1.0,en]","ui_S_t[f.preferences.impl.advanced_AdvancedSettingsView_null_AdvancedSettingsView-Night-1_3_null_2,NEXUS_5,1.0,en]",19881,], +["ui_S_t[f.preferences.impl.advanced_AdvancedSettingsView_null_AdvancedSettingsView-Day-1_2_null_3,NEXUS_5,1.0,en]","ui_S_t[f.preferences.impl.advanced_AdvancedSettingsView_null_AdvancedSettingsView-Night-1_3_null_3,NEXUS_5,1.0,en]",19881,], +["ui_S_t[f.analytics.impl_AnalyticsOptInView_null_AnalyticsOptInView-Day-0_1_null_0,NEXUS_5,1.0,en]","ui_S_t[f.analytics.impl_AnalyticsOptInView_null_AnalyticsOptInView-Night-0_2_null_0,NEXUS_5,1.0,en]",19881,], +["ui_S_t[f.analytics.api.preferences_AnalyticsPreferencesView_null_AnalyticsPreferencesView-Day-0_1_null_0,NEXUS_5,1.0,en]","ui_S_t[f.analytics.api.preferences_AnalyticsPreferencesView_null_AnalyticsPreferencesView-Night-0_2_null_0,NEXUS_5,1.0,en]",19881,], +["ui_S_t[f.preferences.impl.analytics_AnalyticsSettingsView_null_AnalyticsSettingsView-Day-2_3_null_0,NEXUS_5,1.0,en]","ui_S_t[f.preferences.impl.analytics_AnalyticsSettingsView_null_AnalyticsSettingsView-Night-2_4_null_0,NEXUS_5,1.0,en]",19881,], +["ui_S_t[services.apperror.impl_AppErrorView_null_AppErrorView-Day-0_1_null,NEXUS_5,1.0,en]","ui_S_t[services.apperror.impl_AppErrorView_null_AppErrorView-Night-0_2_null,NEXUS_5,1.0,en]",19881,], ["ui_S_t[l.designsystem.components.async_AsyncActionView_null_AsyncActionView-Day_0_null_0,NEXUS_5,1.0,en]","ui_S_t[l.designsystem.components.async_AsyncActionView_null_AsyncActionView-Night_1_null_0,NEXUS_5,1.0,en]",0,], -["ui_S_t[l.designsystem.components.async_AsyncActionView_null_AsyncActionView-Day_0_null_1,NEXUS_5,1.0,en]","ui_S_t[l.designsystem.components.async_AsyncActionView_null_AsyncActionView-Night_1_null_1,NEXUS_5,1.0,en]",19874,], +["ui_S_t[l.designsystem.components.async_AsyncActionView_null_AsyncActionView-Day_0_null_1,NEXUS_5,1.0,en]","ui_S_t[l.designsystem.components.async_AsyncActionView_null_AsyncActionView-Night_1_null_1,NEXUS_5,1.0,en]",19881,], ["ui_S_t[l.designsystem.components.async_AsyncActionView_null_AsyncActionView-Day_0_null_2,NEXUS_5,1.0,en]","ui_S_t[l.designsystem.components.async_AsyncActionView_null_AsyncActionView-Night_1_null_2,NEXUS_5,1.0,en]",0,], -["ui_S_t[l.designsystem.components.async_AsyncActionView_null_AsyncActionView-Day_0_null_3,NEXUS_5,1.0,en]","ui_S_t[l.designsystem.components.async_AsyncActionView_null_AsyncActionView-Night_1_null_3,NEXUS_5,1.0,en]",19874,], +["ui_S_t[l.designsystem.components.async_AsyncActionView_null_AsyncActionView-Day_0_null_3,NEXUS_5,1.0,en]","ui_S_t[l.designsystem.components.async_AsyncActionView_null_AsyncActionView-Night_1_null_3,NEXUS_5,1.0,en]",19881,], ["ui_S_t[l.designsystem.components.async_AsyncActionView_null_AsyncActionView-Day_0_null_4,NEXUS_5,1.0,en]","ui_S_t[l.designsystem.components.async_AsyncActionView_null_AsyncActionView-Night_1_null_4,NEXUS_5,1.0,en]",0,], -["ui_S_t[l.designsystem.components.async_AsyncFailure_null_AsyncFailure-Day_0_null,NEXUS_5,1.0,en]","ui_S_t[l.designsystem.components.async_AsyncFailure_null_AsyncFailure-Night_1_null,NEXUS_5,1.0,en]",19874,], +["ui_S_t[l.designsystem.components.async_AsyncFailure_null_AsyncFailure-Day_0_null,NEXUS_5,1.0,en]","ui_S_t[l.designsystem.components.async_AsyncFailure_null_AsyncFailure-Night_1_null,NEXUS_5,1.0,en]",19881,], ["ui_S_t[l.designsystem.components.async_AsyncIndicatorFailure_null_AsyncIndicatorFailure-Day_0_null,NEXUS_5,1.0,en]","ui_S_t[l.designsystem.components.async_AsyncIndicatorFailure_null_AsyncIndicatorFailure-Night_1_null,NEXUS_5,1.0,en]",0,], ["ui_S_t[l.designsystem.components.async_AsyncIndicatorLoading_null_AsyncIndicatorLoading-Day_0_null,NEXUS_5,1.0,en]","ui_S_t[l.designsystem.components.async_AsyncIndicatorLoading_null_AsyncIndicatorLoading-Night_1_null,NEXUS_5,1.0,en]",0,], ["ui_S_t[l.designsystem.components.async_AsyncLoading_null_AsyncLoading-Day_0_null,NEXUS_5,1.0,en]","ui_S_t[l.designsystem.components.async_AsyncLoading_null_AsyncLoading-Night_1_null,NEXUS_5,1.0,en]",0,], -["ui_S_t[f.messages.impl.messagecomposer_AttachmentSourcePickerMenu_null_AttachmentSourcePickerMenu-Day-4_4_null,NEXUS_5,1.0,en]","ui_S_t[f.messages.impl.messagecomposer_AttachmentSourcePickerMenu_null_AttachmentSourcePickerMenu-Night-4_5_null,NEXUS_5,1.0,en]",19874,], +["ui_S_t[f.messages.impl.messagecomposer_AttachmentSourcePickerMenu_null_AttachmentSourcePickerMenu-Day-4_4_null,NEXUS_5,1.0,en]","ui_S_t[f.messages.impl.messagecomposer_AttachmentSourcePickerMenu_null_AttachmentSourcePickerMenu-Night-4_5_null,NEXUS_5,1.0,en]",19881,], ["ui_S_t[l.matrix.ui.components_AttachmentThumbnail_null_AttachmentThumbnail-Day-0_1_null_0,NEXUS_5,1.0,en]","ui_S_t[l.matrix.ui.components_AttachmentThumbnail_null_AttachmentThumbnail-Night-0_2_null_0,NEXUS_5,1.0,en]",0,], ["ui_S_t[l.matrix.ui.components_AttachmentThumbnail_null_AttachmentThumbnail-Day-0_1_null_1,NEXUS_5,1.0,en]","ui_S_t[l.matrix.ui.components_AttachmentThumbnail_null_AttachmentThumbnail-Night-0_2_null_1,NEXUS_5,1.0,en]",0,], ["ui_S_t[l.matrix.ui.components_AttachmentThumbnail_null_AttachmentThumbnail-Day-0_1_null_2,NEXUS_5,1.0,en]","ui_S_t[l.matrix.ui.components_AttachmentThumbnail_null_AttachmentThumbnail-Night-0_2_null_2,NEXUS_5,1.0,en]",0,], @@ -43,11 +43,11 @@ export const screenshots = [ ["ui_S_t[l.matrix.ui.components_AttachmentThumbnail_null_AttachmentThumbnail-Day-0_1_null_6,NEXUS_5,1.0,en]","ui_S_t[l.matrix.ui.components_AttachmentThumbnail_null_AttachmentThumbnail-Night-0_2_null_6,NEXUS_5,1.0,en]",0,], ["ui_S_t[l.matrix.ui.components_AttachmentThumbnail_null_AttachmentThumbnail-Day-0_1_null_7,NEXUS_5,1.0,en]","ui_S_t[l.matrix.ui.components_AttachmentThumbnail_null_AttachmentThumbnail-Night-0_2_null_7,NEXUS_5,1.0,en]",0,], ["ui_S_t[l.matrix.ui.components_AttachmentThumbnail_null_AttachmentThumbnail-Day-0_1_null_8,NEXUS_5,1.0,en]","ui_S_t[l.matrix.ui.components_AttachmentThumbnail_null_AttachmentThumbnail-Night-0_2_null_8,NEXUS_5,1.0,en]",0,], -["ui_S_t[f.messages.impl.attachments.preview_AttachmentsPreviewView_null_AttachmentsPreviewView_0_null_0,NEXUS_5,1.0,en]","",19874,], -["ui_S_t[f.messages.impl.attachments.preview_AttachmentsPreviewView_null_AttachmentsPreviewView_0_null_1,NEXUS_5,1.0,en]","",19874,], -["ui_S_t[f.messages.impl.attachments.preview_AttachmentsPreviewView_null_AttachmentsPreviewView_0_null_2,NEXUS_5,1.0,en]","",19874,], -["ui_S_t[f.messages.impl.attachments.preview_AttachmentsPreviewView_null_AttachmentsPreviewView_0_null_3,NEXUS_5,1.0,en]","",19874,], -["ui_S_t[l.matrix.ui.components_AvatarActionBottomSheet_null_AvatarActionBottomSheet-Day-1_2_null,NEXUS_5,1.0,en]","ui_S_t[l.matrix.ui.components_AvatarActionBottomSheet_null_AvatarActionBottomSheet-Night-1_3_null,NEXUS_5,1.0,en]",19874,], +["ui_S_t[f.messages.impl.attachments.preview_AttachmentsPreviewView_null_AttachmentsPreviewView_0_null_0,NEXUS_5,1.0,en]","",19881,], +["ui_S_t[f.messages.impl.attachments.preview_AttachmentsPreviewView_null_AttachmentsPreviewView_0_null_1,NEXUS_5,1.0,en]","",19881,], +["ui_S_t[f.messages.impl.attachments.preview_AttachmentsPreviewView_null_AttachmentsPreviewView_0_null_2,NEXUS_5,1.0,en]","",19881,], +["ui_S_t[f.messages.impl.attachments.preview_AttachmentsPreviewView_null_AttachmentsPreviewView_0_null_3,NEXUS_5,1.0,en]","",19881,], +["ui_S_t[l.matrix.ui.components_AvatarActionBottomSheet_null_AvatarActionBottomSheet-Day-1_2_null,NEXUS_5,1.0,en]","ui_S_t[l.matrix.ui.components_AvatarActionBottomSheet_null_AvatarActionBottomSheet-Night-1_3_null,NEXUS_5,1.0,en]",19881,], ["ui_S_t[l.designsystem.components.avatar_Avatar_null_Avatars_Avatar_0_null_0,NEXUS_5,1.0,en]","",0,], ["ui_S_t[l.designsystem.components.avatar_Avatar_null_Avatars_Avatar_0_null_1,NEXUS_5,1.0,en]","",0,], ["ui_S_t[l.designsystem.components.avatar_Avatar_null_Avatars_Avatar_0_null_10,NEXUS_5,1.0,en]","",0,], @@ -115,13 +115,13 @@ export const screenshots = [ ["ui_S_t[l.designsystem.components_Badge_null_Badge-Day_0_null,NEXUS_5,1.0,en]","ui_S_t[l.designsystem.components_Badge_null_Badge-Night_1_null,NEXUS_5,1.0,en]",0,], ["ui_S_t[l.designsystem.components_BigCheckmark_null_BigCheckmark-Day_0_null,NEXUS_5,1.0,en]","ui_S_t[l.designsystem.components_BigCheckmark_null_BigCheckmark-Night_1_null,NEXUS_5,1.0,en]",0,], ["ui_S_t[l.designsystem.components_BigIcon_null_BigIcon-Day_0_null,NEXUS_5,1.0,en]","ui_S_t[l.designsystem.components_BigIcon_null_BigIcon-Night_1_null,NEXUS_5,1.0,en]",0,], -["ui_S_t[f.preferences.impl.blockedusers_BlockedUsersView_null_BlockedUsersView-Day-3_4_null_0,NEXUS_5,1.0,en]","ui_S_t[f.preferences.impl.blockedusers_BlockedUsersView_null_BlockedUsersView-Night-3_5_null_0,NEXUS_5,1.0,en]",19874,], -["ui_S_t[f.preferences.impl.blockedusers_BlockedUsersView_null_BlockedUsersView-Day-3_4_null_1,NEXUS_5,1.0,en]","ui_S_t[f.preferences.impl.blockedusers_BlockedUsersView_null_BlockedUsersView-Night-3_5_null_1,NEXUS_5,1.0,en]",19874,], -["ui_S_t[f.preferences.impl.blockedusers_BlockedUsersView_null_BlockedUsersView-Day-3_4_null_2,NEXUS_5,1.0,en]","ui_S_t[f.preferences.impl.blockedusers_BlockedUsersView_null_BlockedUsersView-Night-3_5_null_2,NEXUS_5,1.0,en]",19874,], -["ui_S_t[f.preferences.impl.blockedusers_BlockedUsersView_null_BlockedUsersView-Day-3_4_null_3,NEXUS_5,1.0,en]","ui_S_t[f.preferences.impl.blockedusers_BlockedUsersView_null_BlockedUsersView-Night-3_5_null_3,NEXUS_5,1.0,en]",19874,], -["ui_S_t[f.preferences.impl.blockedusers_BlockedUsersView_null_BlockedUsersView-Day-3_4_null_4,NEXUS_5,1.0,en]","ui_S_t[f.preferences.impl.blockedusers_BlockedUsersView_null_BlockedUsersView-Night-3_5_null_4,NEXUS_5,1.0,en]",19874,], -["ui_S_t[f.preferences.impl.blockedusers_BlockedUsersView_null_BlockedUsersView-Day-3_4_null_5,NEXUS_5,1.0,en]","ui_S_t[f.preferences.impl.blockedusers_BlockedUsersView_null_BlockedUsersView-Night-3_5_null_5,NEXUS_5,1.0,en]",19874,], -["ui_S_t[f.preferences.impl.blockedusers_BlockedUsersView_null_BlockedUsersView-Day-3_4_null_6,NEXUS_5,1.0,en]","ui_S_t[f.preferences.impl.blockedusers_BlockedUsersView_null_BlockedUsersView-Night-3_5_null_6,NEXUS_5,1.0,en]",19874,], +["ui_S_t[f.preferences.impl.blockedusers_BlockedUsersView_null_BlockedUsersView-Day-3_4_null_0,NEXUS_5,1.0,en]","ui_S_t[f.preferences.impl.blockedusers_BlockedUsersView_null_BlockedUsersView-Night-3_5_null_0,NEXUS_5,1.0,en]",19881,], +["ui_S_t[f.preferences.impl.blockedusers_BlockedUsersView_null_BlockedUsersView-Day-3_4_null_1,NEXUS_5,1.0,en]","ui_S_t[f.preferences.impl.blockedusers_BlockedUsersView_null_BlockedUsersView-Night-3_5_null_1,NEXUS_5,1.0,en]",19881,], +["ui_S_t[f.preferences.impl.blockedusers_BlockedUsersView_null_BlockedUsersView-Day-3_4_null_2,NEXUS_5,1.0,en]","ui_S_t[f.preferences.impl.blockedusers_BlockedUsersView_null_BlockedUsersView-Night-3_5_null_2,NEXUS_5,1.0,en]",19881,], +["ui_S_t[f.preferences.impl.blockedusers_BlockedUsersView_null_BlockedUsersView-Day-3_4_null_3,NEXUS_5,1.0,en]","ui_S_t[f.preferences.impl.blockedusers_BlockedUsersView_null_BlockedUsersView-Night-3_5_null_3,NEXUS_5,1.0,en]",19881,], +["ui_S_t[f.preferences.impl.blockedusers_BlockedUsersView_null_BlockedUsersView-Day-3_4_null_4,NEXUS_5,1.0,en]","ui_S_t[f.preferences.impl.blockedusers_BlockedUsersView_null_BlockedUsersView-Night-3_5_null_4,NEXUS_5,1.0,en]",19881,], +["ui_S_t[f.preferences.impl.blockedusers_BlockedUsersView_null_BlockedUsersView-Day-3_4_null_5,NEXUS_5,1.0,en]","ui_S_t[f.preferences.impl.blockedusers_BlockedUsersView_null_BlockedUsersView-Night-3_5_null_5,NEXUS_5,1.0,en]",19881,], +["ui_S_t[f.preferences.impl.blockedusers_BlockedUsersView_null_BlockedUsersView-Day-3_4_null_6,NEXUS_5,1.0,en]","ui_S_t[f.preferences.impl.blockedusers_BlockedUsersView_null_BlockedUsersView-Night-3_5_null_6,NEXUS_5,1.0,en]",19881,], ["ui_S_t[l.designsystem.components_BloomInitials_null_Bloom_BloomInitials_0_null_0,NEXUS_5,1.0,en]","",0,], ["ui_S_t[l.designsystem.components_BloomInitials_null_Bloom_BloomInitials_0_null_1,NEXUS_5,1.0,en]","",0,], ["ui_S_t[l.designsystem.components_BloomInitials_null_Bloom_BloomInitials_0_null_2,NEXUS_5,1.0,en]","",0,], @@ -132,36 +132,36 @@ export const screenshots = [ ["ui_S_t[l.designsystem.components_BloomInitials_null_Bloom_BloomInitials_0_null_7,NEXUS_5,1.0,en]","",0,], ["ui_S_t[l.designsystem.components_Bloom_null_Bloom_Bloom_0_null,NEXUS_5,1.0,en]","",0,], ["ui_S_t[l.designsystem.theme.components_BottomSheetDragHandle_null_BottomSheetDragHandle-Day_0_null,NEXUS_5,1.0,en]","ui_S_t[l.designsystem.theme.components_BottomSheetDragHandle_null_BottomSheetDragHandle-Night_1_null,NEXUS_5,1.0,en]",0,], -["ui_S_t[f.rageshake.impl.bugreport_BugReportView_null_BugReportView-Day-0_1_null_0,NEXUS_5,1.0,en]","ui_S_t[f.rageshake.impl.bugreport_BugReportView_null_BugReportView-Night-0_2_null_0,NEXUS_5,1.0,en]",19874,], -["ui_S_t[f.rageshake.impl.bugreport_BugReportView_null_BugReportView-Day-0_1_null_1,NEXUS_5,1.0,en]","ui_S_t[f.rageshake.impl.bugreport_BugReportView_null_BugReportView-Night-0_2_null_1,NEXUS_5,1.0,en]",19874,], -["ui_S_t[f.rageshake.impl.bugreport_BugReportView_null_BugReportView-Day-0_1_null_2,NEXUS_5,1.0,en]","ui_S_t[f.rageshake.impl.bugreport_BugReportView_null_BugReportView-Night-0_2_null_2,NEXUS_5,1.0,en]",19874,], -["ui_S_t[f.rageshake.impl.bugreport_BugReportView_null_BugReportView-Day-0_1_null_3,NEXUS_5,1.0,en]","ui_S_t[f.rageshake.impl.bugreport_BugReportView_null_BugReportView-Night-0_2_null_3,NEXUS_5,1.0,en]",19874,], -["ui_S_t[f.rageshake.impl.bugreport_BugReportView_null_BugReportView-Day-0_1_null_4,NEXUS_5,1.0,en]","ui_S_t[f.rageshake.impl.bugreport_BugReportView_null_BugReportView-Night-0_2_null_4,NEXUS_5,1.0,en]",19874,], +["ui_S_t[f.rageshake.impl.bugreport_BugReportView_null_BugReportView-Day-0_1_null_0,NEXUS_5,1.0,en]","ui_S_t[f.rageshake.impl.bugreport_BugReportView_null_BugReportView-Night-0_2_null_0,NEXUS_5,1.0,en]",19881,], +["ui_S_t[f.rageshake.impl.bugreport_BugReportView_null_BugReportView-Day-0_1_null_1,NEXUS_5,1.0,en]","ui_S_t[f.rageshake.impl.bugreport_BugReportView_null_BugReportView-Night-0_2_null_1,NEXUS_5,1.0,en]",19881,], +["ui_S_t[f.rageshake.impl.bugreport_BugReportView_null_BugReportView-Day-0_1_null_2,NEXUS_5,1.0,en]","ui_S_t[f.rageshake.impl.bugreport_BugReportView_null_BugReportView-Night-0_2_null_2,NEXUS_5,1.0,en]",19881,], +["ui_S_t[f.rageshake.impl.bugreport_BugReportView_null_BugReportView-Day-0_1_null_3,NEXUS_5,1.0,en]","ui_S_t[f.rageshake.impl.bugreport_BugReportView_null_BugReportView-Night-0_2_null_3,NEXUS_5,1.0,en]",19881,], +["ui_S_t[f.rageshake.impl.bugreport_BugReportView_null_BugReportView-Day-0_1_null_4,NEXUS_5,1.0,en]","ui_S_t[f.rageshake.impl.bugreport_BugReportView_null_BugReportView-Night-0_2_null_4,NEXUS_5,1.0,en]",19881,], ["ui_S_t[l.designsystem.atomic.molecules_ButtonColumnMolecule_null_ButtonColumnMolecule-Day_0_null,NEXUS_5,1.0,en]","ui_S_t[l.designsystem.atomic.molecules_ButtonColumnMolecule_null_ButtonColumnMolecule-Night_1_null,NEXUS_5,1.0,en]",0,], ["ui_S_t[l.designsystem.atomic.molecules_ButtonRowMolecule_null_ButtonRowMolecule-Day_0_null,NEXUS_5,1.0,en]","ui_S_t[l.designsystem.atomic.molecules_ButtonRowMolecule_null_ButtonRowMolecule-Night_1_null,NEXUS_5,1.0,en]",0,], ["ui_S_t[f.call.ui_CallScreenView_null_CallScreenView-Day-0_1_null,NEXUS_5,1.0,en]","ui_S_t[f.call.ui_CallScreenView_null_CallScreenView-Night-0_2_null,NEXUS_5,1.0,en]",0,], -["ui_S_t[f.login.impl.screens.changeaccountprovider_ChangeAccountProviderView_null_ChangeAccountProviderView-Day-4_5_null_0,NEXUS_5,1.0,en]","ui_S_t[f.login.impl.screens.changeaccountprovider_ChangeAccountProviderView_null_ChangeAccountProviderView-Night-4_6_null_0,NEXUS_5,1.0,en]",19874,], -["ui_S_t[f.roomdetails.impl.rolesandpermissions.changeroles_ChangeRolesView_null_ChangeRolesView-Day-12_12_null_0,NEXUS_5,1.0,en]","ui_S_t[f.roomdetails.impl.rolesandpermissions.changeroles_ChangeRolesView_null_ChangeRolesView-Night-12_13_null_0,NEXUS_5,1.0,en]",19874,], -["ui_S_t[f.roomdetails.impl.rolesandpermissions.changeroles_ChangeRolesView_null_ChangeRolesView-Day-12_12_null_1,NEXUS_5,1.0,en]","ui_S_t[f.roomdetails.impl.rolesandpermissions.changeroles_ChangeRolesView_null_ChangeRolesView-Night-12_13_null_1,NEXUS_5,1.0,en]",19874,], -["ui_S_t[f.roomdetails.impl.rolesandpermissions.changeroles_ChangeRolesView_null_ChangeRolesView-Day-12_12_null_10,NEXUS_5,1.0,en]","ui_S_t[f.roomdetails.impl.rolesandpermissions.changeroles_ChangeRolesView_null_ChangeRolesView-Night-12_13_null_10,NEXUS_5,1.0,en]",19874,], -["ui_S_t[f.roomdetails.impl.rolesandpermissions.changeroles_ChangeRolesView_null_ChangeRolesView-Day-12_12_null_2,NEXUS_5,1.0,en]","ui_S_t[f.roomdetails.impl.rolesandpermissions.changeroles_ChangeRolesView_null_ChangeRolesView-Night-12_13_null_2,NEXUS_5,1.0,en]",19874,], -["ui_S_t[f.roomdetails.impl.rolesandpermissions.changeroles_ChangeRolesView_null_ChangeRolesView-Day-12_12_null_3,NEXUS_5,1.0,en]","ui_S_t[f.roomdetails.impl.rolesandpermissions.changeroles_ChangeRolesView_null_ChangeRolesView-Night-12_13_null_3,NEXUS_5,1.0,en]",19874,], -["ui_S_t[f.roomdetails.impl.rolesandpermissions.changeroles_ChangeRolesView_null_ChangeRolesView-Day-12_12_null_4,NEXUS_5,1.0,en]","ui_S_t[f.roomdetails.impl.rolesandpermissions.changeroles_ChangeRolesView_null_ChangeRolesView-Night-12_13_null_4,NEXUS_5,1.0,en]",19874,], -["ui_S_t[f.roomdetails.impl.rolesandpermissions.changeroles_ChangeRolesView_null_ChangeRolesView-Day-12_12_null_5,NEXUS_5,1.0,en]","ui_S_t[f.roomdetails.impl.rolesandpermissions.changeroles_ChangeRolesView_null_ChangeRolesView-Night-12_13_null_5,NEXUS_5,1.0,en]",19874,], -["ui_S_t[f.roomdetails.impl.rolesandpermissions.changeroles_ChangeRolesView_null_ChangeRolesView-Day-12_12_null_6,NEXUS_5,1.0,en]","ui_S_t[f.roomdetails.impl.rolesandpermissions.changeroles_ChangeRolesView_null_ChangeRolesView-Night-12_13_null_6,NEXUS_5,1.0,en]",19874,], -["ui_S_t[f.roomdetails.impl.rolesandpermissions.changeroles_ChangeRolesView_null_ChangeRolesView-Day-12_12_null_7,NEXUS_5,1.0,en]","ui_S_t[f.roomdetails.impl.rolesandpermissions.changeroles_ChangeRolesView_null_ChangeRolesView-Night-12_13_null_7,NEXUS_5,1.0,en]",19874,], -["ui_S_t[f.roomdetails.impl.rolesandpermissions.changeroles_ChangeRolesView_null_ChangeRolesView-Day-12_12_null_8,NEXUS_5,1.0,en]","ui_S_t[f.roomdetails.impl.rolesandpermissions.changeroles_ChangeRolesView_null_ChangeRolesView-Night-12_13_null_8,NEXUS_5,1.0,en]",19874,], -["ui_S_t[f.roomdetails.impl.rolesandpermissions.changeroles_ChangeRolesView_null_ChangeRolesView-Day-12_12_null_9,NEXUS_5,1.0,en]","ui_S_t[f.roomdetails.impl.rolesandpermissions.changeroles_ChangeRolesView_null_ChangeRolesView-Night-12_13_null_9,NEXUS_5,1.0,en]",19874,], -["ui_S_t[f.roomdetails.impl.rolesandpermissions.permissions_ChangeRoomPermissionsView_null_ChangeRoomPermissionsView-Day-14_14_null_0,NEXUS_5,1.0,en]","ui_S_t[f.roomdetails.impl.rolesandpermissions.permissions_ChangeRoomPermissionsView_null_ChangeRoomPermissionsView-Night-14_15_null_0,NEXUS_5,1.0,en]",19874,], -["ui_S_t[f.roomdetails.impl.rolesandpermissions.permissions_ChangeRoomPermissionsView_null_ChangeRoomPermissionsView-Day-14_14_null_1,NEXUS_5,1.0,en]","ui_S_t[f.roomdetails.impl.rolesandpermissions.permissions_ChangeRoomPermissionsView_null_ChangeRoomPermissionsView-Night-14_15_null_1,NEXUS_5,1.0,en]",19874,], -["ui_S_t[f.roomdetails.impl.rolesandpermissions.permissions_ChangeRoomPermissionsView_null_ChangeRoomPermissionsView-Day-14_14_null_2,NEXUS_5,1.0,en]","ui_S_t[f.roomdetails.impl.rolesandpermissions.permissions_ChangeRoomPermissionsView_null_ChangeRoomPermissionsView-Night-14_15_null_2,NEXUS_5,1.0,en]",19874,], -["ui_S_t[f.roomdetails.impl.rolesandpermissions.permissions_ChangeRoomPermissionsView_null_ChangeRoomPermissionsView-Day-14_14_null_3,NEXUS_5,1.0,en]","ui_S_t[f.roomdetails.impl.rolesandpermissions.permissions_ChangeRoomPermissionsView_null_ChangeRoomPermissionsView-Night-14_15_null_3,NEXUS_5,1.0,en]",19874,], -["ui_S_t[f.roomdetails.impl.rolesandpermissions.permissions_ChangeRoomPermissionsView_null_ChangeRoomPermissionsView-Day-14_14_null_4,NEXUS_5,1.0,en]","ui_S_t[f.roomdetails.impl.rolesandpermissions.permissions_ChangeRoomPermissionsView_null_ChangeRoomPermissionsView-Night-14_15_null_4,NEXUS_5,1.0,en]",19874,], -["ui_S_t[f.roomdetails.impl.rolesandpermissions.permissions_ChangeRoomPermissionsView_null_ChangeRoomPermissionsView-Day-14_14_null_5,NEXUS_5,1.0,en]","ui_S_t[f.roomdetails.impl.rolesandpermissions.permissions_ChangeRoomPermissionsView_null_ChangeRoomPermissionsView-Night-14_15_null_5,NEXUS_5,1.0,en]",19874,], -["ui_S_t[f.roomdetails.impl.rolesandpermissions.permissions_ChangeRoomPermissionsView_null_ChangeRoomPermissionsView-Day-14_14_null_6,NEXUS_5,1.0,en]","ui_S_t[f.roomdetails.impl.rolesandpermissions.permissions_ChangeRoomPermissionsView_null_ChangeRoomPermissionsView-Night-14_15_null_6,NEXUS_5,1.0,en]",19874,], +["ui_S_t[f.login.impl.screens.changeaccountprovider_ChangeAccountProviderView_null_ChangeAccountProviderView-Day-4_5_null_0,NEXUS_5,1.0,en]","ui_S_t[f.login.impl.screens.changeaccountprovider_ChangeAccountProviderView_null_ChangeAccountProviderView-Night-4_6_null_0,NEXUS_5,1.0,en]",19881,], +["ui_S_t[f.roomdetails.impl.rolesandpermissions.changeroles_ChangeRolesView_null_ChangeRolesView-Day-12_12_null_0,NEXUS_5,1.0,en]","ui_S_t[f.roomdetails.impl.rolesandpermissions.changeroles_ChangeRolesView_null_ChangeRolesView-Night-12_13_null_0,NEXUS_5,1.0,en]",19881,], +["ui_S_t[f.roomdetails.impl.rolesandpermissions.changeroles_ChangeRolesView_null_ChangeRolesView-Day-12_12_null_1,NEXUS_5,1.0,en]","ui_S_t[f.roomdetails.impl.rolesandpermissions.changeroles_ChangeRolesView_null_ChangeRolesView-Night-12_13_null_1,NEXUS_5,1.0,en]",19881,], +["ui_S_t[f.roomdetails.impl.rolesandpermissions.changeroles_ChangeRolesView_null_ChangeRolesView-Day-12_12_null_10,NEXUS_5,1.0,en]","ui_S_t[f.roomdetails.impl.rolesandpermissions.changeroles_ChangeRolesView_null_ChangeRolesView-Night-12_13_null_10,NEXUS_5,1.0,en]",19881,], +["ui_S_t[f.roomdetails.impl.rolesandpermissions.changeroles_ChangeRolesView_null_ChangeRolesView-Day-12_12_null_2,NEXUS_5,1.0,en]","ui_S_t[f.roomdetails.impl.rolesandpermissions.changeroles_ChangeRolesView_null_ChangeRolesView-Night-12_13_null_2,NEXUS_5,1.0,en]",19881,], +["ui_S_t[f.roomdetails.impl.rolesandpermissions.changeroles_ChangeRolesView_null_ChangeRolesView-Day-12_12_null_3,NEXUS_5,1.0,en]","ui_S_t[f.roomdetails.impl.rolesandpermissions.changeroles_ChangeRolesView_null_ChangeRolesView-Night-12_13_null_3,NEXUS_5,1.0,en]",19881,], +["ui_S_t[f.roomdetails.impl.rolesandpermissions.changeroles_ChangeRolesView_null_ChangeRolesView-Day-12_12_null_4,NEXUS_5,1.0,en]","ui_S_t[f.roomdetails.impl.rolesandpermissions.changeroles_ChangeRolesView_null_ChangeRolesView-Night-12_13_null_4,NEXUS_5,1.0,en]",19881,], +["ui_S_t[f.roomdetails.impl.rolesandpermissions.changeroles_ChangeRolesView_null_ChangeRolesView-Day-12_12_null_5,NEXUS_5,1.0,en]","ui_S_t[f.roomdetails.impl.rolesandpermissions.changeroles_ChangeRolesView_null_ChangeRolesView-Night-12_13_null_5,NEXUS_5,1.0,en]",19881,], +["ui_S_t[f.roomdetails.impl.rolesandpermissions.changeroles_ChangeRolesView_null_ChangeRolesView-Day-12_12_null_6,NEXUS_5,1.0,en]","ui_S_t[f.roomdetails.impl.rolesandpermissions.changeroles_ChangeRolesView_null_ChangeRolesView-Night-12_13_null_6,NEXUS_5,1.0,en]",19881,], +["ui_S_t[f.roomdetails.impl.rolesandpermissions.changeroles_ChangeRolesView_null_ChangeRolesView-Day-12_12_null_7,NEXUS_5,1.0,en]","ui_S_t[f.roomdetails.impl.rolesandpermissions.changeroles_ChangeRolesView_null_ChangeRolesView-Night-12_13_null_7,NEXUS_5,1.0,en]",19881,], +["ui_S_t[f.roomdetails.impl.rolesandpermissions.changeroles_ChangeRolesView_null_ChangeRolesView-Day-12_12_null_8,NEXUS_5,1.0,en]","ui_S_t[f.roomdetails.impl.rolesandpermissions.changeroles_ChangeRolesView_null_ChangeRolesView-Night-12_13_null_8,NEXUS_5,1.0,en]",19881,], +["ui_S_t[f.roomdetails.impl.rolesandpermissions.changeroles_ChangeRolesView_null_ChangeRolesView-Day-12_12_null_9,NEXUS_5,1.0,en]","ui_S_t[f.roomdetails.impl.rolesandpermissions.changeroles_ChangeRolesView_null_ChangeRolesView-Night-12_13_null_9,NEXUS_5,1.0,en]",19881,], +["ui_S_t[f.roomdetails.impl.rolesandpermissions.permissions_ChangeRoomPermissionsView_null_ChangeRoomPermissionsView-Day-14_14_null_0,NEXUS_5,1.0,en]","ui_S_t[f.roomdetails.impl.rolesandpermissions.permissions_ChangeRoomPermissionsView_null_ChangeRoomPermissionsView-Night-14_15_null_0,NEXUS_5,1.0,en]",19881,], +["ui_S_t[f.roomdetails.impl.rolesandpermissions.permissions_ChangeRoomPermissionsView_null_ChangeRoomPermissionsView-Day-14_14_null_1,NEXUS_5,1.0,en]","ui_S_t[f.roomdetails.impl.rolesandpermissions.permissions_ChangeRoomPermissionsView_null_ChangeRoomPermissionsView-Night-14_15_null_1,NEXUS_5,1.0,en]",19881,], +["ui_S_t[f.roomdetails.impl.rolesandpermissions.permissions_ChangeRoomPermissionsView_null_ChangeRoomPermissionsView-Day-14_14_null_2,NEXUS_5,1.0,en]","ui_S_t[f.roomdetails.impl.rolesandpermissions.permissions_ChangeRoomPermissionsView_null_ChangeRoomPermissionsView-Night-14_15_null_2,NEXUS_5,1.0,en]",19881,], +["ui_S_t[f.roomdetails.impl.rolesandpermissions.permissions_ChangeRoomPermissionsView_null_ChangeRoomPermissionsView-Day-14_14_null_3,NEXUS_5,1.0,en]","ui_S_t[f.roomdetails.impl.rolesandpermissions.permissions_ChangeRoomPermissionsView_null_ChangeRoomPermissionsView-Night-14_15_null_3,NEXUS_5,1.0,en]",19881,], +["ui_S_t[f.roomdetails.impl.rolesandpermissions.permissions_ChangeRoomPermissionsView_null_ChangeRoomPermissionsView-Day-14_14_null_4,NEXUS_5,1.0,en]","ui_S_t[f.roomdetails.impl.rolesandpermissions.permissions_ChangeRoomPermissionsView_null_ChangeRoomPermissionsView-Night-14_15_null_4,NEXUS_5,1.0,en]",19881,], +["ui_S_t[f.roomdetails.impl.rolesandpermissions.permissions_ChangeRoomPermissionsView_null_ChangeRoomPermissionsView-Day-14_14_null_5,NEXUS_5,1.0,en]","ui_S_t[f.roomdetails.impl.rolesandpermissions.permissions_ChangeRoomPermissionsView_null_ChangeRoomPermissionsView-Night-14_15_null_5,NEXUS_5,1.0,en]",19881,], +["ui_S_t[f.roomdetails.impl.rolesandpermissions.permissions_ChangeRoomPermissionsView_null_ChangeRoomPermissionsView-Day-14_14_null_6,NEXUS_5,1.0,en]","ui_S_t[f.roomdetails.impl.rolesandpermissions.permissions_ChangeRoomPermissionsView_null_ChangeRoomPermissionsView-Night-14_15_null_6,NEXUS_5,1.0,en]",19881,], ["ui_S_t[f.login.impl.changeserver_ChangeServerView_null_ChangeServerView-Day-1_2_null_0,NEXUS_5,1.0,en]","ui_S_t[f.login.impl.changeserver_ChangeServerView_null_ChangeServerView-Night-1_3_null_0,NEXUS_5,1.0,en]",0,], ["ui_S_t[l.matrix.ui.components_CheckableResolvedUserRow_null_CheckableResolvedUserRow_0_null,NEXUS_5,1.0,en]","",0,], -["ui_S_t[l.matrix.ui.components_CheckableUnresolvedUserRow_null_CheckableUnresolvedUserRow_0_null,NEXUS_5,1.0,en]","",19874,], +["ui_S_t[l.matrix.ui.components_CheckableUnresolvedUserRow_null_CheckableUnresolvedUserRow_0_null,NEXUS_5,1.0,en]","",19881,], ["ui_S_t[l.designsystem.theme.components_Checkboxes_null_Toggles_Checkboxes_0_null,NEXUS_5,1.0,en]","",0,], ["ui_S_t[l.designsystem.theme.components_CircularProgressIndicator_null_ProgressIndicators_CircularProgressIndicator_0_null,NEXUS_5,1.0,en]","",0,], ["ui_S_t[l.designsystem.components_ClickableLinkText_null_Text_ClickableLinkText_0_null,NEXUS_5,1.0,en]","",0,], @@ -179,42 +179,42 @@ export const screenshots = [ ["ui_S_t[Typo_Compound_M3 Title Large,NEXUS_5,1.0,en]","",0,], ["ui_S_t[Typo_Compound_M3 Title Medium,NEXUS_5,1.0,en]","",0,], ["ui_S_t[Typo_Compound_M3 Title Small,NEXUS_5,1.0,en]","",0,], -["ui_S_t[f.createroom.impl.configureroom_ConfigureRoomView_null_ConfigureRoomView-Day-3_4_null_0,NEXUS_5,1.0,en]","ui_S_t[f.createroom.impl.configureroom_ConfigureRoomView_null_ConfigureRoomView-Night-3_5_null_0,NEXUS_5,1.0,en]",19874,], -["ui_S_t[f.createroom.impl.configureroom_ConfigureRoomView_null_ConfigureRoomView-Day-3_4_null_1,NEXUS_5,1.0,en]","ui_S_t[f.createroom.impl.configureroom_ConfigureRoomView_null_ConfigureRoomView-Night-3_5_null_1,NEXUS_5,1.0,en]",19874,], +["ui_S_t[f.createroom.impl.configureroom_ConfigureRoomView_null_ConfigureRoomView-Day-3_4_null_0,NEXUS_5,1.0,en]","ui_S_t[f.createroom.impl.configureroom_ConfigureRoomView_null_ConfigureRoomView-Night-3_5_null_0,NEXUS_5,1.0,en]",19881,], +["ui_S_t[f.createroom.impl.configureroom_ConfigureRoomView_null_ConfigureRoomView-Day-3_4_null_1,NEXUS_5,1.0,en]","ui_S_t[f.createroom.impl.configureroom_ConfigureRoomView_null_ConfigureRoomView-Night-3_5_null_1,NEXUS_5,1.0,en]",19881,], ["ui_S_t[f.preferences.impl.developer.tracing_ConfigureTracingView_null_ConfigureTracingView-Day-5_6_null_0,NEXUS_5,1.0,en]","ui_S_t[f.preferences.impl.developer.tracing_ConfigureTracingView_null_ConfigureTracingView-Night-5_7_null_0,NEXUS_5,1.0,en]",0,], -["ui_S_t[f.login.impl.screens.confirmaccountprovider_ConfirmAccountProviderView_null_ConfirmAccountProviderView-Day-5_6_null_0,NEXUS_5,1.0,en]","ui_S_t[f.login.impl.screens.confirmaccountprovider_ConfirmAccountProviderView_null_ConfirmAccountProviderView-Night-5_7_null_0,NEXUS_5,1.0,en]",19874,], -["ui_S_t[f.roomlist.impl.components_ConfirmRecoveryKeyBanner_null_ConfirmRecoveryKeyBanner-Day-2_3_null,NEXUS_5,1.0,en]","ui_S_t[f.roomlist.impl.components_ConfirmRecoveryKeyBanner_null_ConfirmRecoveryKeyBanner-Night-2_4_null,NEXUS_5,1.0,en]",19874,], +["ui_S_t[f.login.impl.screens.confirmaccountprovider_ConfirmAccountProviderView_null_ConfirmAccountProviderView-Day-5_6_null_0,NEXUS_5,1.0,en]","ui_S_t[f.login.impl.screens.confirmaccountprovider_ConfirmAccountProviderView_null_ConfirmAccountProviderView-Night-5_7_null_0,NEXUS_5,1.0,en]",19881,], +["ui_S_t[f.roomlist.impl.components_ConfirmRecoveryKeyBanner_null_ConfirmRecoveryKeyBanner-Day-2_3_null,NEXUS_5,1.0,en]","ui_S_t[f.roomlist.impl.components_ConfirmRecoveryKeyBanner_null_ConfirmRecoveryKeyBanner-Night-2_4_null,NEXUS_5,1.0,en]",19881,], ["ui_S_t[l.designsystem.components.dialogs_ConfirmationDialogContent_null_Dialogs_ConfirmationDialogContent_0_null,NEXUS_5,1.0,en]","",0,], ["ui_S_t[l.designsystem.components.dialogs_ConfirmationDialog_null_ConfirmationDialog-Day_0_null,NEXUS_5,1.0,en]","ui_S_t[l.designsystem.components.dialogs_ConfirmationDialog_null_ConfirmationDialog-Night_1_null,NEXUS_5,1.0,en]",0,], ["ui_S_t[f.networkmonitor.api.ui_ConnectivityIndicatorView_null_ConnectivityIndicatorView-Day-0_1_null,NEXUS_5,1.0,en]","ui_S_t[f.networkmonitor.api.ui_ConnectivityIndicatorView_null_ConnectivityIndicatorView-Night-0_2_null,NEXUS_5,1.0,en]",0,], -["ui_S_t[f.rageshake.api.crash_CrashDetectionView_null_CrashDetectionView-Day-0_1_null,NEXUS_5,1.0,en]","ui_S_t[f.rageshake.api.crash_CrashDetectionView_null_CrashDetectionView-Night-0_2_null,NEXUS_5,1.0,en]",19874,], -["ui_S_t[f.securebackup.impl.createkey_CreateNewRecoveryKeyView_null_CreateNewRecoveryKeyView-Day-0_1_null,NEXUS_5,1.0,en]","ui_S_t[f.securebackup.impl.createkey_CreateNewRecoveryKeyView_null_CreateNewRecoveryKeyView-Night-0_2_null,NEXUS_5,1.0,en]",19874,], -["ui_S_t[f.poll.impl.create_CreatePollView_null_CreatePollView-Day-0_1_null_0,NEXUS_5,1.0,en]","ui_S_t[f.poll.impl.create_CreatePollView_null_CreatePollView-Night-0_2_null_0,NEXUS_5,1.0,en]",19874,], -["ui_S_t[f.poll.impl.create_CreatePollView_null_CreatePollView-Day-0_1_null_1,NEXUS_5,1.0,en]","ui_S_t[f.poll.impl.create_CreatePollView_null_CreatePollView-Night-0_2_null_1,NEXUS_5,1.0,en]",19874,], -["ui_S_t[f.poll.impl.create_CreatePollView_null_CreatePollView-Day-0_1_null_2,NEXUS_5,1.0,en]","ui_S_t[f.poll.impl.create_CreatePollView_null_CreatePollView-Night-0_2_null_2,NEXUS_5,1.0,en]",19874,], -["ui_S_t[f.poll.impl.create_CreatePollView_null_CreatePollView-Day-0_1_null_3,NEXUS_5,1.0,en]","ui_S_t[f.poll.impl.create_CreatePollView_null_CreatePollView-Night-0_2_null_3,NEXUS_5,1.0,en]",19874,], -["ui_S_t[f.poll.impl.create_CreatePollView_null_CreatePollView-Day-0_1_null_4,NEXUS_5,1.0,en]","ui_S_t[f.poll.impl.create_CreatePollView_null_CreatePollView-Night-0_2_null_4,NEXUS_5,1.0,en]",19874,], -["ui_S_t[f.poll.impl.create_CreatePollView_null_CreatePollView-Day-0_1_null_5,NEXUS_5,1.0,en]","ui_S_t[f.poll.impl.create_CreatePollView_null_CreatePollView-Night-0_2_null_5,NEXUS_5,1.0,en]",19874,], -["ui_S_t[f.poll.impl.create_CreatePollView_null_CreatePollView-Day-0_1_null_6,NEXUS_5,1.0,en]","ui_S_t[f.poll.impl.create_CreatePollView_null_CreatePollView-Night-0_2_null_6,NEXUS_5,1.0,en]",19874,], -["ui_S_t[f.poll.impl.create_CreatePollView_null_CreatePollView-Day-0_1_null_7,NEXUS_5,1.0,en]","ui_S_t[f.poll.impl.create_CreatePollView_null_CreatePollView-Night-0_2_null_7,NEXUS_5,1.0,en]",19874,], -["ui_S_t[f.createroom.impl.root_CreateRoomRootView_null_CreateRoomRootView-Day-4_5_null_0,NEXUS_5,1.0,en]","ui_S_t[f.createroom.impl.root_CreateRoomRootView_null_CreateRoomRootView-Night-4_6_null_0,NEXUS_5,1.0,en]",19874,], -["ui_S_t[f.createroom.impl.root_CreateRoomRootView_null_CreateRoomRootView-Day-4_5_null_1,NEXUS_5,1.0,en]","ui_S_t[f.createroom.impl.root_CreateRoomRootView_null_CreateRoomRootView-Night-4_6_null_1,NEXUS_5,1.0,en]",19874,], -["ui_S_t[f.createroom.impl.root_CreateRoomRootView_null_CreateRoomRootView-Day-4_5_null_2,NEXUS_5,1.0,en]","ui_S_t[f.createroom.impl.root_CreateRoomRootView_null_CreateRoomRootView-Night-4_6_null_2,NEXUS_5,1.0,en]",19874,], -["ui_S_t[f.createroom.impl.root_CreateRoomRootView_null_CreateRoomRootView-Day-4_5_null_3,NEXUS_5,1.0,en]","ui_S_t[f.createroom.impl.root_CreateRoomRootView_null_CreateRoomRootView-Night-4_6_null_3,NEXUS_5,1.0,en]",19874,], -["ui_S_t[l.designsystem.theme.components.previews_DatePickerDark_null_DateTimepickers_DatePickerDark_0_null,NEXUS_5,1.0,en]","",19874,], -["ui_S_t[l.designsystem.theme.components.previews_DatePickerLight_null_DateTimepickers_DatePickerLight_0_null,NEXUS_5,1.0,en]","",19874,], +["ui_S_t[f.rageshake.api.crash_CrashDetectionView_null_CrashDetectionView-Day-0_1_null,NEXUS_5,1.0,en]","ui_S_t[f.rageshake.api.crash_CrashDetectionView_null_CrashDetectionView-Night-0_2_null,NEXUS_5,1.0,en]",19881,], +["ui_S_t[f.securebackup.impl.createkey_CreateNewRecoveryKeyView_null_CreateNewRecoveryKeyView-Day-0_1_null,NEXUS_5,1.0,en]","ui_S_t[f.securebackup.impl.createkey_CreateNewRecoveryKeyView_null_CreateNewRecoveryKeyView-Night-0_2_null,NEXUS_5,1.0,en]",19881,], +["ui_S_t[f.poll.impl.create_CreatePollView_null_CreatePollView-Day-0_1_null_0,NEXUS_5,1.0,en]","ui_S_t[f.poll.impl.create_CreatePollView_null_CreatePollView-Night-0_2_null_0,NEXUS_5,1.0,en]",19881,], +["ui_S_t[f.poll.impl.create_CreatePollView_null_CreatePollView-Day-0_1_null_1,NEXUS_5,1.0,en]","ui_S_t[f.poll.impl.create_CreatePollView_null_CreatePollView-Night-0_2_null_1,NEXUS_5,1.0,en]",19881,], +["ui_S_t[f.poll.impl.create_CreatePollView_null_CreatePollView-Day-0_1_null_2,NEXUS_5,1.0,en]","ui_S_t[f.poll.impl.create_CreatePollView_null_CreatePollView-Night-0_2_null_2,NEXUS_5,1.0,en]",19881,], +["ui_S_t[f.poll.impl.create_CreatePollView_null_CreatePollView-Day-0_1_null_3,NEXUS_5,1.0,en]","ui_S_t[f.poll.impl.create_CreatePollView_null_CreatePollView-Night-0_2_null_3,NEXUS_5,1.0,en]",19881,], +["ui_S_t[f.poll.impl.create_CreatePollView_null_CreatePollView-Day-0_1_null_4,NEXUS_5,1.0,en]","ui_S_t[f.poll.impl.create_CreatePollView_null_CreatePollView-Night-0_2_null_4,NEXUS_5,1.0,en]",19881,], +["ui_S_t[f.poll.impl.create_CreatePollView_null_CreatePollView-Day-0_1_null_5,NEXUS_5,1.0,en]","ui_S_t[f.poll.impl.create_CreatePollView_null_CreatePollView-Night-0_2_null_5,NEXUS_5,1.0,en]",19881,], +["ui_S_t[f.poll.impl.create_CreatePollView_null_CreatePollView-Day-0_1_null_6,NEXUS_5,1.0,en]","ui_S_t[f.poll.impl.create_CreatePollView_null_CreatePollView-Night-0_2_null_6,NEXUS_5,1.0,en]",19881,], +["ui_S_t[f.poll.impl.create_CreatePollView_null_CreatePollView-Day-0_1_null_7,NEXUS_5,1.0,en]","ui_S_t[f.poll.impl.create_CreatePollView_null_CreatePollView-Night-0_2_null_7,NEXUS_5,1.0,en]",19881,], +["ui_S_t[f.createroom.impl.root_CreateRoomRootView_null_CreateRoomRootView-Day-4_5_null_0,NEXUS_5,1.0,en]","ui_S_t[f.createroom.impl.root_CreateRoomRootView_null_CreateRoomRootView-Night-4_6_null_0,NEXUS_5,1.0,en]",19881,], +["ui_S_t[f.createroom.impl.root_CreateRoomRootView_null_CreateRoomRootView-Day-4_5_null_1,NEXUS_5,1.0,en]","ui_S_t[f.createroom.impl.root_CreateRoomRootView_null_CreateRoomRootView-Night-4_6_null_1,NEXUS_5,1.0,en]",19881,], +["ui_S_t[f.createroom.impl.root_CreateRoomRootView_null_CreateRoomRootView-Day-4_5_null_2,NEXUS_5,1.0,en]","ui_S_t[f.createroom.impl.root_CreateRoomRootView_null_CreateRoomRootView-Night-4_6_null_2,NEXUS_5,1.0,en]",19881,], +["ui_S_t[f.createroom.impl.root_CreateRoomRootView_null_CreateRoomRootView-Day-4_5_null_3,NEXUS_5,1.0,en]","ui_S_t[f.createroom.impl.root_CreateRoomRootView_null_CreateRoomRootView-Night-4_6_null_3,NEXUS_5,1.0,en]",19881,], +["ui_S_t[l.designsystem.theme.components.previews_DatePickerDark_null_DateTimepickers_DatePickerDark_0_null,NEXUS_5,1.0,en]","",19881,], +["ui_S_t[l.designsystem.theme.components.previews_DatePickerLight_null_DateTimepickers_DatePickerLight_0_null,NEXUS_5,1.0,en]","",19881,], ["ui_S_t[f.logout.impl.direct_DefaultDirectLogoutView_null_DefaultDirectLogoutView-Day-1_2_null_0,NEXUS_5,1.0,en]","ui_S_t[f.logout.impl.direct_DefaultDirectLogoutView_null_DefaultDirectLogoutView-Night-1_3_null_0,NEXUS_5,1.0,en]",0,], -["ui_S_t[f.logout.impl.direct_DefaultDirectLogoutView_null_DefaultDirectLogoutView-Day-1_2_null_1,NEXUS_5,1.0,en]","ui_S_t[f.logout.impl.direct_DefaultDirectLogoutView_null_DefaultDirectLogoutView-Night-1_3_null_1,NEXUS_5,1.0,en]",19874,], -["ui_S_t[f.logout.impl.direct_DefaultDirectLogoutView_null_DefaultDirectLogoutView-Day-1_2_null_2,NEXUS_5,1.0,en]","ui_S_t[f.logout.impl.direct_DefaultDirectLogoutView_null_DefaultDirectLogoutView-Night-1_3_null_2,NEXUS_5,1.0,en]",19874,], -["ui_S_t[f.logout.impl.direct_DefaultDirectLogoutView_null_DefaultDirectLogoutView-Day-1_2_null_3,NEXUS_5,1.0,en]","ui_S_t[f.logout.impl.direct_DefaultDirectLogoutView_null_DefaultDirectLogoutView-Night-1_3_null_3,NEXUS_5,1.0,en]",19874,], +["ui_S_t[f.logout.impl.direct_DefaultDirectLogoutView_null_DefaultDirectLogoutView-Day-1_2_null_1,NEXUS_5,1.0,en]","ui_S_t[f.logout.impl.direct_DefaultDirectLogoutView_null_DefaultDirectLogoutView-Night-1_3_null_1,NEXUS_5,1.0,en]",19881,], +["ui_S_t[f.logout.impl.direct_DefaultDirectLogoutView_null_DefaultDirectLogoutView-Day-1_2_null_2,NEXUS_5,1.0,en]","ui_S_t[f.logout.impl.direct_DefaultDirectLogoutView_null_DefaultDirectLogoutView-Night-1_3_null_2,NEXUS_5,1.0,en]",19881,], +["ui_S_t[f.logout.impl.direct_DefaultDirectLogoutView_null_DefaultDirectLogoutView-Day-1_2_null_3,NEXUS_5,1.0,en]","ui_S_t[f.logout.impl.direct_DefaultDirectLogoutView_null_DefaultDirectLogoutView-Night-1_3_null_3,NEXUS_5,1.0,en]",19881,], ["ui_S_t[f.logout.impl.direct_DefaultDirectLogoutView_null_DefaultDirectLogoutView-Day-1_2_null_4,NEXUS_5,1.0,en]","ui_S_t[f.logout.impl.direct_DefaultDirectLogoutView_null_DefaultDirectLogoutView-Night-1_3_null_4,NEXUS_5,1.0,en]",0,], -["ui_S_t[f.preferences.impl.notifications.edit_DefaultNotificationSettingOption_null_DefaultNotificationSettingOption-Day-7_8_null,NEXUS_5,1.0,en]","ui_S_t[f.preferences.impl.notifications.edit_DefaultNotificationSettingOption_null_DefaultNotificationSettingOption-Night-7_9_null,NEXUS_5,1.0,en]",19874,], -["ui_S_t[f.roomlist.impl.components_DefaultRoomListTopBarWithIndicator_null_DefaultRoomListTopBarWithIndicator-Day-5_6_null,NEXUS_5,1.0,en]","ui_S_t[f.roomlist.impl.components_DefaultRoomListTopBarWithIndicator_null_DefaultRoomListTopBarWithIndicator-Night-5_7_null,NEXUS_5,1.0,en]",19874,], -["ui_S_t[f.roomlist.impl.components_DefaultRoomListTopBar_null_DefaultRoomListTopBar-Day-4_5_null,NEXUS_5,1.0,en]","ui_S_t[f.roomlist.impl.components_DefaultRoomListTopBar_null_DefaultRoomListTopBar-Night-4_6_null,NEXUS_5,1.0,en]",19874,], -["ui_S_t[f.preferences.impl.developer_DeveloperSettingsView_null_DeveloperSettingsView-Day-4_5_null_0,NEXUS_5,1.0,en]","ui_S_t[f.preferences.impl.developer_DeveloperSettingsView_null_DeveloperSettingsView-Night-4_6_null_0,NEXUS_5,1.0,en]",19874,], -["ui_S_t[f.preferences.impl.developer_DeveloperSettingsView_null_DeveloperSettingsView-Day-4_5_null_1,NEXUS_5,1.0,en]","ui_S_t[f.preferences.impl.developer_DeveloperSettingsView_null_DeveloperSettingsView-Night-4_6_null_1,NEXUS_5,1.0,en]",19874,], -["ui_S_t[f.preferences.impl.developer_DeveloperSettingsView_null_DeveloperSettingsView-Day-4_5_null_2,NEXUS_5,1.0,en]","ui_S_t[f.preferences.impl.developer_DeveloperSettingsView_null_DeveloperSettingsView-Night-4_6_null_2,NEXUS_5,1.0,en]",19874,], -["ui_S_t[l.designsystem.atomic.molecules_DialogLikeBannerMolecule_null_DialogLikeBannerMolecule-Day_0_null,NEXUS_5,1.0,en]","ui_S_t[l.designsystem.atomic.molecules_DialogLikeBannerMolecule_null_DialogLikeBannerMolecule-Night_1_null,NEXUS_5,1.0,en]",19874,], +["ui_S_t[f.preferences.impl.notifications.edit_DefaultNotificationSettingOption_null_DefaultNotificationSettingOption-Day-7_8_null,NEXUS_5,1.0,en]","ui_S_t[f.preferences.impl.notifications.edit_DefaultNotificationSettingOption_null_DefaultNotificationSettingOption-Night-7_9_null,NEXUS_5,1.0,en]",19881,], +["ui_S_t[f.roomlist.impl.components_DefaultRoomListTopBarWithIndicator_null_DefaultRoomListTopBarWithIndicator-Day-5_6_null,NEXUS_5,1.0,en]","ui_S_t[f.roomlist.impl.components_DefaultRoomListTopBarWithIndicator_null_DefaultRoomListTopBarWithIndicator-Night-5_7_null,NEXUS_5,1.0,en]",19881,], +["ui_S_t[f.roomlist.impl.components_DefaultRoomListTopBar_null_DefaultRoomListTopBar-Day-4_5_null,NEXUS_5,1.0,en]","ui_S_t[f.roomlist.impl.components_DefaultRoomListTopBar_null_DefaultRoomListTopBar-Night-4_6_null,NEXUS_5,1.0,en]",19881,], +["ui_S_t[f.preferences.impl.developer_DeveloperSettingsView_null_DeveloperSettingsView-Day-4_5_null_0,NEXUS_5,1.0,en]","ui_S_t[f.preferences.impl.developer_DeveloperSettingsView_null_DeveloperSettingsView-Night-4_6_null_0,NEXUS_5,1.0,en]",19881,], +["ui_S_t[f.preferences.impl.developer_DeveloperSettingsView_null_DeveloperSettingsView-Day-4_5_null_1,NEXUS_5,1.0,en]","ui_S_t[f.preferences.impl.developer_DeveloperSettingsView_null_DeveloperSettingsView-Night-4_6_null_1,NEXUS_5,1.0,en]",19881,], +["ui_S_t[f.preferences.impl.developer_DeveloperSettingsView_null_DeveloperSettingsView-Day-4_5_null_2,NEXUS_5,1.0,en]","ui_S_t[f.preferences.impl.developer_DeveloperSettingsView_null_DeveloperSettingsView-Night-4_6_null_2,NEXUS_5,1.0,en]",19881,], +["ui_S_t[l.designsystem.atomic.molecules_DialogLikeBannerMolecule_null_DialogLikeBannerMolecule-Day_0_null,NEXUS_5,1.0,en]","ui_S_t[l.designsystem.atomic.molecules_DialogLikeBannerMolecule_null_DialogLikeBannerMolecule-Night_1_null,NEXUS_5,1.0,en]",19881,], ["ui_S_t[l.designsystem.theme.components_DialogWithDestructiveButton_null_Dialogs_Dialogwithdestructivebutton_0_null,NEXUS_5,1.0,en]","",0,], ["ui_S_t[l.designsystem.theme.components_DialogWithOnlyMessageAndOkButton_null_Dialogs_Dialogwithonlymessageandokbutton_0_null,NEXUS_5,1.0,en]","",0,], ["ui_S_t[l.designsystem.theme.components_DialogWithThirdButton_null_Dialogs_Dialogwiththirdbutton_0_null,NEXUS_5,1.0,en]","",0,], @@ -225,12 +225,12 @@ export const screenshots = [ ["ui_S_t[l.designsystem.text_DpScale_1_0f__null_DpScale_1_0f__0_null,NEXUS_5,1.0,en]","",0,], ["ui_S_t[l.designsystem.text_DpScale_1_5f__null_DpScale_1_5f__0_null,NEXUS_5,1.0,en]","",0,], ["ui_S_t[l.designsystem.theme.components_DropdownMenuItem_null_Menus_DropdownMenuItem_0_null,NEXUS_5,1.0,en]","",0,], -["ui_S_t[f.preferences.impl.notifications.edit_EditDefaultNotificationSettingView_null_EditDefaultNotificationSettingView-Day-8_9_null_0,NEXUS_5,1.0,en]","ui_S_t[f.preferences.impl.notifications.edit_EditDefaultNotificationSettingView_null_EditDefaultNotificationSettingView-Night-8_10_null_0,NEXUS_5,1.0,en]",19874,], -["ui_S_t[f.preferences.impl.notifications.edit_EditDefaultNotificationSettingView_null_EditDefaultNotificationSettingView-Day-8_9_null_1,NEXUS_5,1.0,en]","ui_S_t[f.preferences.impl.notifications.edit_EditDefaultNotificationSettingView_null_EditDefaultNotificationSettingView-Night-8_10_null_1,NEXUS_5,1.0,en]",19874,], -["ui_S_t[f.preferences.impl.notifications.edit_EditDefaultNotificationSettingView_null_EditDefaultNotificationSettingView-Day-8_9_null_2,NEXUS_5,1.0,en]","ui_S_t[f.preferences.impl.notifications.edit_EditDefaultNotificationSettingView_null_EditDefaultNotificationSettingView-Night-8_10_null_2,NEXUS_5,1.0,en]",19874,], -["ui_S_t[f.preferences.impl.notifications.edit_EditDefaultNotificationSettingView_null_EditDefaultNotificationSettingView-Day-8_9_null_3,NEXUS_5,1.0,en]","ui_S_t[f.preferences.impl.notifications.edit_EditDefaultNotificationSettingView_null_EditDefaultNotificationSettingView-Night-8_10_null_3,NEXUS_5,1.0,en]",19874,], -["ui_S_t[f.preferences.impl.notifications.edit_EditDefaultNotificationSettingView_null_EditDefaultNotificationSettingView-Day-8_9_null_4,NEXUS_5,1.0,en]","ui_S_t[f.preferences.impl.notifications.edit_EditDefaultNotificationSettingView_null_EditDefaultNotificationSettingView-Night-8_10_null_4,NEXUS_5,1.0,en]",19874,], -["ui_S_t[f.preferences.impl.user.editprofile_EditUserProfileView_null_EditUserProfileView-Day-10_11_null_0,NEXUS_5,1.0,en]","ui_S_t[f.preferences.impl.user.editprofile_EditUserProfileView_null_EditUserProfileView-Night-10_12_null_0,NEXUS_5,1.0,en]",19874,], +["ui_S_t[f.preferences.impl.notifications.edit_EditDefaultNotificationSettingView_null_EditDefaultNotificationSettingView-Day-8_9_null_0,NEXUS_5,1.0,en]","ui_S_t[f.preferences.impl.notifications.edit_EditDefaultNotificationSettingView_null_EditDefaultNotificationSettingView-Night-8_10_null_0,NEXUS_5,1.0,en]",19881,], +["ui_S_t[f.preferences.impl.notifications.edit_EditDefaultNotificationSettingView_null_EditDefaultNotificationSettingView-Day-8_9_null_1,NEXUS_5,1.0,en]","ui_S_t[f.preferences.impl.notifications.edit_EditDefaultNotificationSettingView_null_EditDefaultNotificationSettingView-Night-8_10_null_1,NEXUS_5,1.0,en]",19881,], +["ui_S_t[f.preferences.impl.notifications.edit_EditDefaultNotificationSettingView_null_EditDefaultNotificationSettingView-Day-8_9_null_2,NEXUS_5,1.0,en]","ui_S_t[f.preferences.impl.notifications.edit_EditDefaultNotificationSettingView_null_EditDefaultNotificationSettingView-Night-8_10_null_2,NEXUS_5,1.0,en]",19881,], +["ui_S_t[f.preferences.impl.notifications.edit_EditDefaultNotificationSettingView_null_EditDefaultNotificationSettingView-Day-8_9_null_3,NEXUS_5,1.0,en]","ui_S_t[f.preferences.impl.notifications.edit_EditDefaultNotificationSettingView_null_EditDefaultNotificationSettingView-Night-8_10_null_3,NEXUS_5,1.0,en]",19881,], +["ui_S_t[f.preferences.impl.notifications.edit_EditDefaultNotificationSettingView_null_EditDefaultNotificationSettingView-Day-8_9_null_4,NEXUS_5,1.0,en]","ui_S_t[f.preferences.impl.notifications.edit_EditDefaultNotificationSettingView_null_EditDefaultNotificationSettingView-Night-8_10_null_4,NEXUS_5,1.0,en]",19881,], +["ui_S_t[f.preferences.impl.user.editprofile_EditUserProfileView_null_EditUserProfileView-Day-10_11_null_0,NEXUS_5,1.0,en]","ui_S_t[f.preferences.impl.user.editprofile_EditUserProfileView_null_EditUserProfileView-Night-10_12_null_0,NEXUS_5,1.0,en]",19881,], ["ui_S_t[l.matrix.ui.components_EditableAvatarView_null_EditableAvatarView-Day-2_3_null_0,NEXUS_5,1.0,en]","ui_S_t[l.matrix.ui.components_EditableAvatarView_null_EditableAvatarView-Night-2_4_null_0,NEXUS_5,1.0,en]",0,], ["ui_S_t[l.matrix.ui.components_EditableAvatarView_null_EditableAvatarView-Day-2_3_null_1,NEXUS_5,1.0,en]","ui_S_t[l.matrix.ui.components_EditableAvatarView_null_EditableAvatarView-Night-2_4_null_1,NEXUS_5,1.0,en]",0,], ["ui_S_t[l.matrix.ui.components_EditableAvatarView_null_EditableAvatarView-Day-2_3_null_2,NEXUS_5,1.0,en]","ui_S_t[l.matrix.ui.components_EditableAvatarView_null_EditableAvatarView-Night-2_4_null_2,NEXUS_5,1.0,en]",0,], @@ -240,9 +240,9 @@ export const screenshots = [ ["ui_S_t[l.designsystem.atomic.atoms_ElementLogoAtomMedium_null_ElementLogoAtomMedium-Day_0_null,NEXUS_5,1.0,en]","ui_S_t[l.designsystem.atomic.atoms_ElementLogoAtomMedium_null_ElementLogoAtomMedium-Night_1_null,NEXUS_5,1.0,en]",0,], ["ui_S_t[f.messages.impl.timeline.components.customreaction_EmojiItem_null_EmojiItem-Day-34_34_null,NEXUS_5,1.0,en]","ui_S_t[f.messages.impl.timeline.components.customreaction_EmojiItem_null_EmojiItem-Night-34_35_null,NEXUS_5,1.0,en]",0,], ["ui_S_t[f.messages.impl.timeline.components.customreaction_EmojiPicker_null_EmojiPicker-Day-35_35_null,NEXUS_5,1.0,en]","ui_S_t[f.messages.impl.timeline.components.customreaction_EmojiPicker_null_EmojiPicker-Night-35_36_null,NEXUS_5,1.0,en]",0,], -["ui_S_t[f.messages.impl.timeline.components.virtual_EncryptedHistoryBannerView_null_EncryptedHistoryBannerView-Day-60_60_null,NEXUS_5,1.0,en]","ui_S_t[f.messages.impl.timeline.components.virtual_EncryptedHistoryBannerView_null_EncryptedHistoryBannerView-Night-60_61_null,NEXUS_5,1.0,en]",19874,], -["ui_S_t[l.designsystem.components.dialogs_ErrorDialogContent_null_Dialogs_ErrorDialogContent_0_null,NEXUS_5,1.0,en]","",19874,], -["ui_S_t[l.designsystem.components.dialogs_ErrorDialog_null_ErrorDialog-Day_0_null,NEXUS_5,1.0,en]","ui_S_t[l.designsystem.components.dialogs_ErrorDialog_null_ErrorDialog-Night_1_null,NEXUS_5,1.0,en]",19874,], +["ui_S_t[f.messages.impl.timeline.components.virtual_EncryptedHistoryBannerView_null_EncryptedHistoryBannerView-Day-60_60_null,NEXUS_5,1.0,en]","ui_S_t[f.messages.impl.timeline.components.virtual_EncryptedHistoryBannerView_null_EncryptedHistoryBannerView-Night-60_61_null,NEXUS_5,1.0,en]",19881,], +["ui_S_t[l.designsystem.components.dialogs_ErrorDialogContent_null_Dialogs_ErrorDialogContent_0_null,NEXUS_5,1.0,en]","",19881,], +["ui_S_t[l.designsystem.components.dialogs_ErrorDialog_null_ErrorDialog-Day_0_null,NEXUS_5,1.0,en]","ui_S_t[l.designsystem.components.dialogs_ErrorDialog_null_ErrorDialog-Night_1_null,NEXUS_5,1.0,en]",19881,], ["ui_S_t[f.messages.impl.timeline.debug_EventDebugInfoView_null_EventDebugInfoView-Day-65_65_null,NEXUS_5,1.0,en]","ui_S_t[f.messages.impl.timeline.debug_EventDebugInfoView_null_EventDebugInfoView-Night-65_66_null,NEXUS_5,1.0,en]",0,], ["ui_S_t[l.designsystem.theme.components_FilledButtonLarge_null_Buttons_FilledButtonLarge_0_null,NEXUS_5,1.0,en]","",0,], ["ui_S_t[l.designsystem.theme.components_FilledButtonMedium_null_Buttons_FilledButtonMedium_0_null,NEXUS_5,1.0,en]","",0,], @@ -250,14 +250,14 @@ export const screenshots = [ ["ui_S_t[l.designsystem.theme.components_FloatingActionButton_null_FloatingActionButtons_FloatingActionButton_0_null,NEXUS_5,1.0,en]","",0,], ["ui_S_t[l.designsystem.atomic.pages_FlowStepPage_null_FlowStepPage-Day_0_null,NEXUS_5,1.0,en]","ui_S_t[l.designsystem.atomic.pages_FlowStepPage_null_FlowStepPage-Night_1_null,NEXUS_5,1.0,en]",0,], ["ui_S_t[f.messages.impl.timeline.focus_FocusRequestStateView_null_FocusRequestStateView-Day-66_66_null_0,NEXUS_5,1.0,en]","ui_S_t[f.messages.impl.timeline.focus_FocusRequestStateView_null_FocusRequestStateView-Night-66_67_null_0,NEXUS_5,1.0,en]",0,], -["ui_S_t[f.messages.impl.timeline.focus_FocusRequestStateView_null_FocusRequestStateView-Day-66_66_null_1,NEXUS_5,1.0,en]","ui_S_t[f.messages.impl.timeline.focus_FocusRequestStateView_null_FocusRequestStateView-Night-66_67_null_1,NEXUS_5,1.0,en]",19874,], -["ui_S_t[f.messages.impl.timeline.focus_FocusRequestStateView_null_FocusRequestStateView-Day-66_66_null_2,NEXUS_5,1.0,en]","ui_S_t[f.messages.impl.timeline.focus_FocusRequestStateView_null_FocusRequestStateView-Night-66_67_null_2,NEXUS_5,1.0,en]",19874,], -["ui_S_t[f.messages.impl.timeline.focus_FocusRequestStateView_null_FocusRequestStateView-Day-66_66_null_3,NEXUS_5,1.0,en]","ui_S_t[f.messages.impl.timeline.focus_FocusRequestStateView_null_FocusRequestStateView-Night-66_67_null_3,NEXUS_5,1.0,en]",19874,], +["ui_S_t[f.messages.impl.timeline.focus_FocusRequestStateView_null_FocusRequestStateView-Day-66_66_null_1,NEXUS_5,1.0,en]","ui_S_t[f.messages.impl.timeline.focus_FocusRequestStateView_null_FocusRequestStateView-Night-66_67_null_1,NEXUS_5,1.0,en]",19881,], +["ui_S_t[f.messages.impl.timeline.focus_FocusRequestStateView_null_FocusRequestStateView-Day-66_66_null_2,NEXUS_5,1.0,en]","ui_S_t[f.messages.impl.timeline.focus_FocusRequestStateView_null_FocusRequestStateView-Night-66_67_null_2,NEXUS_5,1.0,en]",19881,], +["ui_S_t[f.messages.impl.timeline.focus_FocusRequestStateView_null_FocusRequestStateView-Day-66_66_null_3,NEXUS_5,1.0,en]","ui_S_t[f.messages.impl.timeline.focus_FocusRequestStateView_null_FocusRequestStateView-Night-66_67_null_3,NEXUS_5,1.0,en]",19881,], ["ui_S_t[l.textcomposer.components_FormattingOption_null_FormattingOption-Day-11_12_null,NEXUS_5,1.0,en]","ui_S_t[l.textcomposer.components_FormattingOption_null_FormattingOption-Night-11_13_null,NEXUS_5,1.0,en]",0,], ["ui_S_t[f.messages.impl.forward_ForwardMessagesView_null_ForwardMessagesView-Day-2_2_null_0,NEXUS_5,1.0,en]","ui_S_t[f.messages.impl.forward_ForwardMessagesView_null_ForwardMessagesView-Night-2_3_null_0,NEXUS_5,1.0,en]",0,], ["ui_S_t[f.messages.impl.forward_ForwardMessagesView_null_ForwardMessagesView-Day-2_2_null_1,NEXUS_5,1.0,en]","ui_S_t[f.messages.impl.forward_ForwardMessagesView_null_ForwardMessagesView-Night-2_3_null_1,NEXUS_5,1.0,en]",0,], ["ui_S_t[f.messages.impl.forward_ForwardMessagesView_null_ForwardMessagesView-Day-2_2_null_2,NEXUS_5,1.0,en]","ui_S_t[f.messages.impl.forward_ForwardMessagesView_null_ForwardMessagesView-Night-2_3_null_2,NEXUS_5,1.0,en]",0,], -["ui_S_t[f.messages.impl.forward_ForwardMessagesView_null_ForwardMessagesView-Day-2_2_null_3,NEXUS_5,1.0,en]","ui_S_t[f.messages.impl.forward_ForwardMessagesView_null_ForwardMessagesView-Night-2_3_null_3,NEXUS_5,1.0,en]",19874,], +["ui_S_t[f.messages.impl.forward_ForwardMessagesView_null_ForwardMessagesView-Day-2_2_null_3,NEXUS_5,1.0,en]","ui_S_t[f.messages.impl.forward_ForwardMessagesView_null_ForwardMessagesView-Night-2_3_null_3,NEXUS_5,1.0,en]",19881,], ["ui_S_t[l.designsystem.components.button_GradientFloatingActionButtonCircleShape_null_GradientFloatingActionButtonCircleShape-Day_0_null,NEXUS_5,1.0,en]","ui_S_t[l.designsystem.components.button_GradientFloatingActionButtonCircleShape_null_GradientFloatingActionButtonCircleShape-Night_1_null,NEXUS_5,1.0,en]",0,], ["ui_S_t[l.designsystem.components.button_GradientFloatingActionButton_null_GradientFloatingActionButton-Day_0_null,NEXUS_5,1.0,en]","ui_S_t[l.designsystem.components.button_GradientFloatingActionButton_null_GradientFloatingActionButton-Night_1_null,NEXUS_5,1.0,en]",0,], ["ui_S_t[f.messages.impl.timeline.components.group_GroupHeaderView_null_GroupHeaderView-Day-55_55_null,NEXUS_5,1.0,en]","ui_S_t[f.messages.impl.timeline.components.group_GroupHeaderView_null_GroupHeaderView-Night-55_56_null,NEXUS_5,1.0,en]",0,], @@ -278,27 +278,27 @@ export const screenshots = [ ["ui_S_t[l.designsystem.icons_IconsOther_null_IconsOther-Day_0_null_0,NEXUS_5,1.0,en]","ui_S_t[l.designsystem.icons_IconsOther_null_IconsOther-Night_1_null_0,NEXUS_5,1.0,en]",0,], ["ui_S_t[l.designsystem.atomic.molecules_InfoListItemMolecule_null_InfoListItemMolecule-Day_0_null,NEXUS_5,1.0,en]","ui_S_t[l.designsystem.atomic.molecules_InfoListItemMolecule_null_InfoListItemMolecule-Night_1_null,NEXUS_5,1.0,en]",0,], ["ui_S_t[l.designsystem.atomic.organisms_InfoListOrganism_null_InfoListOrganism-Day_0_null,NEXUS_5,1.0,en]","ui_S_t[l.designsystem.atomic.organisms_InfoListOrganism_null_InfoListOrganism-Night_1_null,NEXUS_5,1.0,en]",0,], -["ui_S_t[l.matrix.ui.components_InviteSenderView_null_InviteSenderView-Day-3_4_null,NEXUS_5,1.0,en]","ui_S_t[l.matrix.ui.components_InviteSenderView_null_InviteSenderView-Night-3_5_null,NEXUS_5,1.0,en]",19874,], +["ui_S_t[l.matrix.ui.components_InviteSenderView_null_InviteSenderView-Day-3_4_null,NEXUS_5,1.0,en]","ui_S_t[l.matrix.ui.components_InviteSenderView_null_InviteSenderView-Night-3_5_null,NEXUS_5,1.0,en]",19881,], ["ui_S_t[f.joinroom.impl_JoinRoomView_null_JoinRoomView-Day-0_1_null_0,NEXUS_5,1.0,en]","ui_S_t[f.joinroom.impl_JoinRoomView_null_JoinRoomView-Night-0_2_null_0,NEXUS_5,1.0,en]",0,], -["ui_S_t[f.joinroom.impl_JoinRoomView_null_JoinRoomView-Day-0_1_null_1,NEXUS_5,1.0,en]","ui_S_t[f.joinroom.impl_JoinRoomView_null_JoinRoomView-Night-0_2_null_1,NEXUS_5,1.0,en]",19874,], -["ui_S_t[f.joinroom.impl_JoinRoomView_null_JoinRoomView-Day-0_1_null_2,NEXUS_5,1.0,en]","ui_S_t[f.joinroom.impl_JoinRoomView_null_JoinRoomView-Night-0_2_null_2,NEXUS_5,1.0,en]",19874,], -["ui_S_t[f.joinroom.impl_JoinRoomView_null_JoinRoomView-Day-0_1_null_3,NEXUS_5,1.0,en]","ui_S_t[f.joinroom.impl_JoinRoomView_null_JoinRoomView-Night-0_2_null_3,NEXUS_5,1.0,en]",19874,], -["ui_S_t[f.joinroom.impl_JoinRoomView_null_JoinRoomView-Day-0_1_null_4,NEXUS_5,1.0,en]","ui_S_t[f.joinroom.impl_JoinRoomView_null_JoinRoomView-Night-0_2_null_4,NEXUS_5,1.0,en]",19874,], -["ui_S_t[f.joinroom.impl_JoinRoomView_null_JoinRoomView-Day-0_1_null_5,NEXUS_5,1.0,en]","ui_S_t[f.joinroom.impl_JoinRoomView_null_JoinRoomView-Night-0_2_null_5,NEXUS_5,1.0,en]",19874,], -["ui_S_t[f.joinroom.impl_JoinRoomView_null_JoinRoomView-Day-0_1_null_6,NEXUS_5,1.0,en]","ui_S_t[f.joinroom.impl_JoinRoomView_null_JoinRoomView-Night-0_2_null_6,NEXUS_5,1.0,en]",19874,], -["ui_S_t[f.joinroom.impl_JoinRoomView_null_JoinRoomView-Day-0_1_null_7,NEXUS_5,1.0,en]","ui_S_t[f.joinroom.impl_JoinRoomView_null_JoinRoomView-Night-0_2_null_7,NEXUS_5,1.0,en]",19874,], -["ui_S_t[f.joinroom.impl_JoinRoomView_null_JoinRoomView-Day-0_1_null_8,NEXUS_5,1.0,en]","ui_S_t[f.joinroom.impl_JoinRoomView_null_JoinRoomView-Night-0_2_null_8,NEXUS_5,1.0,en]",19874,], -["ui_S_t[f.joinroom.impl_JoinRoomView_null_JoinRoomView-Day-0_1_null_9,NEXUS_5,1.0,en]","ui_S_t[f.joinroom.impl_JoinRoomView_null_JoinRoomView-Night-0_2_null_9,NEXUS_5,1.0,en]",19874,], +["ui_S_t[f.joinroom.impl_JoinRoomView_null_JoinRoomView-Day-0_1_null_1,NEXUS_5,1.0,en]","ui_S_t[f.joinroom.impl_JoinRoomView_null_JoinRoomView-Night-0_2_null_1,NEXUS_5,1.0,en]",19881,], +["ui_S_t[f.joinroom.impl_JoinRoomView_null_JoinRoomView-Day-0_1_null_2,NEXUS_5,1.0,en]","ui_S_t[f.joinroom.impl_JoinRoomView_null_JoinRoomView-Night-0_2_null_2,NEXUS_5,1.0,en]",19881,], +["ui_S_t[f.joinroom.impl_JoinRoomView_null_JoinRoomView-Day-0_1_null_3,NEXUS_5,1.0,en]","ui_S_t[f.joinroom.impl_JoinRoomView_null_JoinRoomView-Night-0_2_null_3,NEXUS_5,1.0,en]",19881,], +["ui_S_t[f.joinroom.impl_JoinRoomView_null_JoinRoomView-Day-0_1_null_4,NEXUS_5,1.0,en]","ui_S_t[f.joinroom.impl_JoinRoomView_null_JoinRoomView-Night-0_2_null_4,NEXUS_5,1.0,en]",19881,], +["ui_S_t[f.joinroom.impl_JoinRoomView_null_JoinRoomView-Day-0_1_null_5,NEXUS_5,1.0,en]","ui_S_t[f.joinroom.impl_JoinRoomView_null_JoinRoomView-Night-0_2_null_5,NEXUS_5,1.0,en]",19881,], +["ui_S_t[f.joinroom.impl_JoinRoomView_null_JoinRoomView-Day-0_1_null_6,NEXUS_5,1.0,en]","ui_S_t[f.joinroom.impl_JoinRoomView_null_JoinRoomView-Night-0_2_null_6,NEXUS_5,1.0,en]",19881,], +["ui_S_t[f.joinroom.impl_JoinRoomView_null_JoinRoomView-Day-0_1_null_7,NEXUS_5,1.0,en]","ui_S_t[f.joinroom.impl_JoinRoomView_null_JoinRoomView-Night-0_2_null_7,NEXUS_5,1.0,en]",19881,], +["ui_S_t[f.joinroom.impl_JoinRoomView_null_JoinRoomView-Day-0_1_null_8,NEXUS_5,1.0,en]","ui_S_t[f.joinroom.impl_JoinRoomView_null_JoinRoomView-Night-0_2_null_8,NEXUS_5,1.0,en]",19881,], +["ui_S_t[f.joinroom.impl_JoinRoomView_null_JoinRoomView-Day-0_1_null_9,NEXUS_5,1.0,en]","ui_S_t[f.joinroom.impl_JoinRoomView_null_JoinRoomView-Night-0_2_null_9,NEXUS_5,1.0,en]",19881,], ["ui_S_t[l.designsystem.components_LabelledCheckbox_null_Toggles_LabelledCheckbox_0_null,NEXUS_5,1.0,en]","",0,], ["ui_S_t[l.designsystem.components_LabelledOutlinedTextField_null_LabelledOutlinedTextField-Day_0_null,NEXUS_5,1.0,en]","ui_S_t[l.designsystem.components_LabelledOutlinedTextField_null_LabelledOutlinedTextField-Night_1_null,NEXUS_5,1.0,en]",0,], ["ui_S_t[l.designsystem.components_LabelledTextField_null_LabelledTextField-Day_0_null,NEXUS_5,1.0,en]","ui_S_t[l.designsystem.components_LabelledTextField_null_LabelledTextField-Night_1_null,NEXUS_5,1.0,en]",0,], ["ui_S_t[f.leaveroom.api_LeaveRoomView_null_LeaveRoomView-Day-0_1_null_0,NEXUS_5,1.0,en]","ui_S_t[f.leaveroom.api_LeaveRoomView_null_LeaveRoomView-Night-0_2_null_0,NEXUS_5,1.0,en]",0,], -["ui_S_t[f.leaveroom.api_LeaveRoomView_null_LeaveRoomView-Day-0_1_null_1,NEXUS_5,1.0,en]","ui_S_t[f.leaveroom.api_LeaveRoomView_null_LeaveRoomView-Night-0_2_null_1,NEXUS_5,1.0,en]",19874,], -["ui_S_t[f.leaveroom.api_LeaveRoomView_null_LeaveRoomView-Day-0_1_null_2,NEXUS_5,1.0,en]","ui_S_t[f.leaveroom.api_LeaveRoomView_null_LeaveRoomView-Night-0_2_null_2,NEXUS_5,1.0,en]",19874,], -["ui_S_t[f.leaveroom.api_LeaveRoomView_null_LeaveRoomView-Day-0_1_null_3,NEXUS_5,1.0,en]","ui_S_t[f.leaveroom.api_LeaveRoomView_null_LeaveRoomView-Night-0_2_null_3,NEXUS_5,1.0,en]",19874,], -["ui_S_t[f.leaveroom.api_LeaveRoomView_null_LeaveRoomView-Day-0_1_null_4,NEXUS_5,1.0,en]","ui_S_t[f.leaveroom.api_LeaveRoomView_null_LeaveRoomView-Night-0_2_null_4,NEXUS_5,1.0,en]",19874,], -["ui_S_t[f.leaveroom.api_LeaveRoomView_null_LeaveRoomView-Day-0_1_null_5,NEXUS_5,1.0,en]","ui_S_t[f.leaveroom.api_LeaveRoomView_null_LeaveRoomView-Night-0_2_null_5,NEXUS_5,1.0,en]",19874,], -["ui_S_t[f.leaveroom.api_LeaveRoomView_null_LeaveRoomView-Day-0_1_null_6,NEXUS_5,1.0,en]","ui_S_t[f.leaveroom.api_LeaveRoomView_null_LeaveRoomView-Night-0_2_null_6,NEXUS_5,1.0,en]",19874,], +["ui_S_t[f.leaveroom.api_LeaveRoomView_null_LeaveRoomView-Day-0_1_null_1,NEXUS_5,1.0,en]","ui_S_t[f.leaveroom.api_LeaveRoomView_null_LeaveRoomView-Night-0_2_null_1,NEXUS_5,1.0,en]",19881,], +["ui_S_t[f.leaveroom.api_LeaveRoomView_null_LeaveRoomView-Day-0_1_null_2,NEXUS_5,1.0,en]","ui_S_t[f.leaveroom.api_LeaveRoomView_null_LeaveRoomView-Night-0_2_null_2,NEXUS_5,1.0,en]",19881,], +["ui_S_t[f.leaveroom.api_LeaveRoomView_null_LeaveRoomView-Day-0_1_null_3,NEXUS_5,1.0,en]","ui_S_t[f.leaveroom.api_LeaveRoomView_null_LeaveRoomView-Night-0_2_null_3,NEXUS_5,1.0,en]",19881,], +["ui_S_t[f.leaveroom.api_LeaveRoomView_null_LeaveRoomView-Day-0_1_null_4,NEXUS_5,1.0,en]","ui_S_t[f.leaveroom.api_LeaveRoomView_null_LeaveRoomView-Night-0_2_null_4,NEXUS_5,1.0,en]",19881,], +["ui_S_t[f.leaveroom.api_LeaveRoomView_null_LeaveRoomView-Day-0_1_null_5,NEXUS_5,1.0,en]","ui_S_t[f.leaveroom.api_LeaveRoomView_null_LeaveRoomView-Night-0_2_null_5,NEXUS_5,1.0,en]",19881,], +["ui_S_t[f.leaveroom.api_LeaveRoomView_null_LeaveRoomView-Day-0_1_null_6,NEXUS_5,1.0,en]","ui_S_t[f.leaveroom.api_LeaveRoomView_null_LeaveRoomView-Night-0_2_null_6,NEXUS_5,1.0,en]",19881,], ["ui_S_t[l.designsystem.background_LightGradientBackground_null_LightGradientBackground-Day_0_null,NEXUS_5,1.0,en]","ui_S_t[l.designsystem.background_LightGradientBackground_null_LightGradientBackground-Night_1_null,NEXUS_5,1.0,en]",0,], ["ui_S_t[l.designsystem.theme.components_LinearProgressIndicator_null_ProgressIndicators_LinearProgressIndicator_0_null,NEXUS_5,1.0,en]","",0,], ["ui_S_t[l.designsystem.components.dialogs_ListDialogContent_null_Dialogs_ListDialogContent_0_null,NEXUS_5,1.0,en]","",0,], @@ -349,27 +349,27 @@ export const screenshots = [ ["ui_S_t[l.designsystem.theme.components_ListSupportingTextSmallPadding_null_Listsections_Listsupportingtext-smallpadding_0_null,NEXUS_5,1.0,en]","",0,], ["ui_S_t[l.textcomposer.components_LiveWaveformView_null_LiveWaveformView-Day-12_13_null,NEXUS_5,1.0,en]","ui_S_t[l.textcomposer.components_LiveWaveformView_null_LiveWaveformView-Night-12_14_null,NEXUS_5,1.0,en]",0,], ["ui_S_t[appnav.room.joined_LoadingRoomNodeView_null_LoadingRoomNodeView-Day-2_2_null_0,NEXUS_5,1.0,en]","ui_S_t[appnav.room.joined_LoadingRoomNodeView_null_LoadingRoomNodeView-Night-2_3_null_0,NEXUS_5,1.0,en]",0,], -["ui_S_t[appnav.room.joined_LoadingRoomNodeView_null_LoadingRoomNodeView-Day-2_2_null_1,NEXUS_5,1.0,en]","ui_S_t[appnav.room.joined_LoadingRoomNodeView_null_LoadingRoomNodeView-Night-2_3_null_1,NEXUS_5,1.0,en]",19874,], -["ui_S_t[f.lockscreen.impl.settings_LockScreenSettingsView_null_LockScreenSettingsView-Day-1_2_null_0,NEXUS_5,1.0,en]","ui_S_t[f.lockscreen.impl.settings_LockScreenSettingsView_null_LockScreenSettingsView-Night-1_3_null_0,NEXUS_5,1.0,en]",19874,], -["ui_S_t[f.lockscreen.impl.settings_LockScreenSettingsView_null_LockScreenSettingsView-Day-1_2_null_1,NEXUS_5,1.0,en]","ui_S_t[f.lockscreen.impl.settings_LockScreenSettingsView_null_LockScreenSettingsView-Night-1_3_null_1,NEXUS_5,1.0,en]",19874,], -["ui_S_t[f.lockscreen.impl.settings_LockScreenSettingsView_null_LockScreenSettingsView-Day-1_2_null_2,NEXUS_5,1.0,en]","ui_S_t[f.lockscreen.impl.settings_LockScreenSettingsView_null_LockScreenSettingsView-Night-1_3_null_2,NEXUS_5,1.0,en]",19874,], +["ui_S_t[appnav.room.joined_LoadingRoomNodeView_null_LoadingRoomNodeView-Day-2_2_null_1,NEXUS_5,1.0,en]","ui_S_t[appnav.room.joined_LoadingRoomNodeView_null_LoadingRoomNodeView-Night-2_3_null_1,NEXUS_5,1.0,en]",19881,], +["ui_S_t[f.lockscreen.impl.settings_LockScreenSettingsView_null_LockScreenSettingsView-Day-1_2_null_0,NEXUS_5,1.0,en]","ui_S_t[f.lockscreen.impl.settings_LockScreenSettingsView_null_LockScreenSettingsView-Night-1_3_null_0,NEXUS_5,1.0,en]",19881,], +["ui_S_t[f.lockscreen.impl.settings_LockScreenSettingsView_null_LockScreenSettingsView-Day-1_2_null_1,NEXUS_5,1.0,en]","ui_S_t[f.lockscreen.impl.settings_LockScreenSettingsView_null_LockScreenSettingsView-Night-1_3_null_1,NEXUS_5,1.0,en]",19881,], +["ui_S_t[f.lockscreen.impl.settings_LockScreenSettingsView_null_LockScreenSettingsView-Day-1_2_null_2,NEXUS_5,1.0,en]","ui_S_t[f.lockscreen.impl.settings_LockScreenSettingsView_null_LockScreenSettingsView-Night-1_3_null_2,NEXUS_5,1.0,en]",19881,], ["ui_S_t[appnav.loggedin_LoggedInView_null_LoggedInView-Day-0_0_null_0,NEXUS_5,1.0,en]","ui_S_t[appnav.loggedin_LoggedInView_null_LoggedInView-Night-0_1_null_0,NEXUS_5,1.0,en]",0,], -["ui_S_t[appnav.loggedin_LoggedInView_null_LoggedInView-Day-0_0_null_1,NEXUS_5,1.0,en]","ui_S_t[appnav.loggedin_LoggedInView_null_LoggedInView-Night-0_1_null_1,NEXUS_5,1.0,en]",19874,], -["ui_S_t[f.login.impl.screens.loginpassword_LoginPasswordView_null_LoginPasswordView-Day-6_7_null_0,NEXUS_5,1.0,en]","ui_S_t[f.login.impl.screens.loginpassword_LoginPasswordView_null_LoginPasswordView-Night-6_8_null_0,NEXUS_5,1.0,en]",19874,], -["ui_S_t[f.login.impl.screens.loginpassword_LoginPasswordView_null_LoginPasswordView-Day-6_7_null_1,NEXUS_5,1.0,en]","ui_S_t[f.login.impl.screens.loginpassword_LoginPasswordView_null_LoginPasswordView-Night-6_8_null_1,NEXUS_5,1.0,en]",19874,], -["ui_S_t[f.login.impl.screens.loginpassword_LoginPasswordView_null_LoginPasswordView-Day-6_7_null_2,NEXUS_5,1.0,en]","ui_S_t[f.login.impl.screens.loginpassword_LoginPasswordView_null_LoginPasswordView-Night-6_8_null_2,NEXUS_5,1.0,en]",19874,], -["ui_S_t[f.logout.impl_LogoutView_null_LogoutView-Day-0_1_null_0,NEXUS_5,1.0,en]","ui_S_t[f.logout.impl_LogoutView_null_LogoutView-Night-0_2_null_0,NEXUS_5,1.0,en]",19874,], -["ui_S_t[f.logout.impl_LogoutView_null_LogoutView-Day-0_1_null_1,NEXUS_5,1.0,en]","ui_S_t[f.logout.impl_LogoutView_null_LogoutView-Night-0_2_null_1,NEXUS_5,1.0,en]",19874,], -["ui_S_t[f.logout.impl_LogoutView_null_LogoutView-Day-0_1_null_2,NEXUS_5,1.0,en]","ui_S_t[f.logout.impl_LogoutView_null_LogoutView-Night-0_2_null_2,NEXUS_5,1.0,en]",19874,], -["ui_S_t[f.logout.impl_LogoutView_null_LogoutView-Day-0_1_null_3,NEXUS_5,1.0,en]","ui_S_t[f.logout.impl_LogoutView_null_LogoutView-Night-0_2_null_3,NEXUS_5,1.0,en]",19874,], -["ui_S_t[f.logout.impl_LogoutView_null_LogoutView-Day-0_1_null_4,NEXUS_5,1.0,en]","ui_S_t[f.logout.impl_LogoutView_null_LogoutView-Night-0_2_null_4,NEXUS_5,1.0,en]",19874,], -["ui_S_t[f.logout.impl_LogoutView_null_LogoutView-Day-0_1_null_5,NEXUS_5,1.0,en]","ui_S_t[f.logout.impl_LogoutView_null_LogoutView-Night-0_2_null_5,NEXUS_5,1.0,en]",19874,], -["ui_S_t[f.logout.impl_LogoutView_null_LogoutView-Day-0_1_null_6,NEXUS_5,1.0,en]","ui_S_t[f.logout.impl_LogoutView_null_LogoutView-Night-0_2_null_6,NEXUS_5,1.0,en]",19874,], -["ui_S_t[f.logout.impl_LogoutView_null_LogoutView-Day-0_1_null_7,NEXUS_5,1.0,en]","ui_S_t[f.logout.impl_LogoutView_null_LogoutView-Night-0_2_null_7,NEXUS_5,1.0,en]",19874,], -["ui_S_t[f.logout.impl_LogoutView_null_LogoutView-Day-0_1_null_8,NEXUS_5,1.0,en]","ui_S_t[f.logout.impl_LogoutView_null_LogoutView-Night-0_2_null_8,NEXUS_5,1.0,en]",19874,], -["ui_S_t[f.logout.impl_LogoutView_null_LogoutView-Day-0_1_null_9,NEXUS_5,1.0,en]","ui_S_t[f.logout.impl_LogoutView_null_LogoutView-Night-0_2_null_9,NEXUS_5,1.0,en]",19874,], +["ui_S_t[appnav.loggedin_LoggedInView_null_LoggedInView-Day-0_0_null_1,NEXUS_5,1.0,en]","ui_S_t[appnav.loggedin_LoggedInView_null_LoggedInView-Night-0_1_null_1,NEXUS_5,1.0,en]",19881,], +["ui_S_t[f.login.impl.screens.loginpassword_LoginPasswordView_null_LoginPasswordView-Day-6_7_null_0,NEXUS_5,1.0,en]","ui_S_t[f.login.impl.screens.loginpassword_LoginPasswordView_null_LoginPasswordView-Night-6_8_null_0,NEXUS_5,1.0,en]",19881,], +["ui_S_t[f.login.impl.screens.loginpassword_LoginPasswordView_null_LoginPasswordView-Day-6_7_null_1,NEXUS_5,1.0,en]","ui_S_t[f.login.impl.screens.loginpassword_LoginPasswordView_null_LoginPasswordView-Night-6_8_null_1,NEXUS_5,1.0,en]",19881,], +["ui_S_t[f.login.impl.screens.loginpassword_LoginPasswordView_null_LoginPasswordView-Day-6_7_null_2,NEXUS_5,1.0,en]","ui_S_t[f.login.impl.screens.loginpassword_LoginPasswordView_null_LoginPasswordView-Night-6_8_null_2,NEXUS_5,1.0,en]",19881,], +["ui_S_t[f.logout.impl_LogoutView_null_LogoutView-Day-0_1_null_0,NEXUS_5,1.0,en]","ui_S_t[f.logout.impl_LogoutView_null_LogoutView-Night-0_2_null_0,NEXUS_5,1.0,en]",19881,], +["ui_S_t[f.logout.impl_LogoutView_null_LogoutView-Day-0_1_null_1,NEXUS_5,1.0,en]","ui_S_t[f.logout.impl_LogoutView_null_LogoutView-Night-0_2_null_1,NEXUS_5,1.0,en]",19881,], +["ui_S_t[f.logout.impl_LogoutView_null_LogoutView-Day-0_1_null_2,NEXUS_5,1.0,en]","ui_S_t[f.logout.impl_LogoutView_null_LogoutView-Night-0_2_null_2,NEXUS_5,1.0,en]",19881,], +["ui_S_t[f.logout.impl_LogoutView_null_LogoutView-Day-0_1_null_3,NEXUS_5,1.0,en]","ui_S_t[f.logout.impl_LogoutView_null_LogoutView-Night-0_2_null_3,NEXUS_5,1.0,en]",19881,], +["ui_S_t[f.logout.impl_LogoutView_null_LogoutView-Day-0_1_null_4,NEXUS_5,1.0,en]","ui_S_t[f.logout.impl_LogoutView_null_LogoutView-Night-0_2_null_4,NEXUS_5,1.0,en]",19881,], +["ui_S_t[f.logout.impl_LogoutView_null_LogoutView-Day-0_1_null_5,NEXUS_5,1.0,en]","ui_S_t[f.logout.impl_LogoutView_null_LogoutView-Night-0_2_null_5,NEXUS_5,1.0,en]",19881,], +["ui_S_t[f.logout.impl_LogoutView_null_LogoutView-Day-0_1_null_6,NEXUS_5,1.0,en]","ui_S_t[f.logout.impl_LogoutView_null_LogoutView-Night-0_2_null_6,NEXUS_5,1.0,en]",19881,], +["ui_S_t[f.logout.impl_LogoutView_null_LogoutView-Day-0_1_null_7,NEXUS_5,1.0,en]","ui_S_t[f.logout.impl_LogoutView_null_LogoutView-Night-0_2_null_7,NEXUS_5,1.0,en]",19881,], +["ui_S_t[f.logout.impl_LogoutView_null_LogoutView-Day-0_1_null_8,NEXUS_5,1.0,en]","ui_S_t[f.logout.impl_LogoutView_null_LogoutView-Night-0_2_null_8,NEXUS_5,1.0,en]",19881,], +["ui_S_t[f.logout.impl_LogoutView_null_LogoutView-Day-0_1_null_9,NEXUS_5,1.0,en]","ui_S_t[f.logout.impl_LogoutView_null_LogoutView-Night-0_2_null_9,NEXUS_5,1.0,en]",19881,], ["ui_S_t[l.designsystem.components.button_MainActionButton_null_Buttons_MainActionButton_0_null,NEXUS_5,1.0,en]","",0,], -["ui_S_t[l.textcomposer_MarkdownTextComposerEdit_null_MarkdownTextComposerEdit-Day-3_4_null,NEXUS_5,1.0,en]","ui_S_t[l.textcomposer_MarkdownTextComposerEdit_null_MarkdownTextComposerEdit-Night-3_5_null,NEXUS_5,1.0,en]",19874,], +["ui_S_t[l.textcomposer_MarkdownTextComposerEdit_null_MarkdownTextComposerEdit-Day-3_4_null,NEXUS_5,1.0,en]","ui_S_t[l.textcomposer_MarkdownTextComposerEdit_null_MarkdownTextComposerEdit-Night-3_5_null,NEXUS_5,1.0,en]",19881,], ["ui_S_t[l.textcomposer.components.markdown_MarkdownTextInput_null_MarkdownTextInput-Day-19_20_null,NEXUS_5,1.0,en]","ui_S_t[l.textcomposer.components.markdown_MarkdownTextInput_null_MarkdownTextInput-Night-19_21_null,NEXUS_5,1.0,en]",0,], ["ui_S_t[l.matrix.ui.components_MatrixUserHeaderPlaceholder_null_MatrixUserHeaderPlaceholder-Day-5_6_null,NEXUS_5,1.0,en]","ui_S_t[l.matrix.ui.components_MatrixUserHeaderPlaceholder_null_MatrixUserHeaderPlaceholder-Night-5_7_null,NEXUS_5,1.0,en]",0,], ["ui_S_t[l.matrix.ui.components_MatrixUserHeader_null_MatrixUserHeader-Day-4_5_null_0,NEXUS_5,1.0,en]","ui_S_t[l.matrix.ui.components_MatrixUserHeader_null_MatrixUserHeader-Night-4_6_null_0,NEXUS_5,1.0,en]",0,], @@ -379,7 +379,7 @@ export const screenshots = [ ["ui_S_t[l.mediaviewer.api.viewer_MediaViewerView_null_MediaViewerView_0_null_0,NEXUS_5,1.0,en]","",0,], ["ui_S_t[l.mediaviewer.api.viewer_MediaViewerView_null_MediaViewerView_0_null_1,NEXUS_5,1.0,en]","",0,], ["ui_S_t[l.mediaviewer.api.viewer_MediaViewerView_null_MediaViewerView_0_null_10,NEXUS_5,1.0,en]","",0,], -["ui_S_t[l.mediaviewer.api.viewer_MediaViewerView_null_MediaViewerView_0_null_2,NEXUS_5,1.0,en]","",19874,], +["ui_S_t[l.mediaviewer.api.viewer_MediaViewerView_null_MediaViewerView_0_null_2,NEXUS_5,1.0,en]","",19881,], ["ui_S_t[l.mediaviewer.api.viewer_MediaViewerView_null_MediaViewerView_0_null_3,NEXUS_5,1.0,en]","",0,], ["ui_S_t[l.mediaviewer.api.viewer_MediaViewerView_null_MediaViewerView_0_null_4,NEXUS_5,1.0,en]","",0,], ["ui_S_t[l.mediaviewer.api.viewer_MediaViewerView_null_MediaViewerView_0_null_5,NEXUS_5,1.0,en]","",0,], @@ -389,10 +389,10 @@ export const screenshots = [ ["ui_S_t[l.mediaviewer.api.viewer_MediaViewerView_null_MediaViewerView_0_null_9,NEXUS_5,1.0,en]","",0,], ["ui_S_t[l.designsystem.theme.components_MediumTopAppBar_null_AppBars_MediumTopAppBar_0_null,NEXUS_5,1.0,en]","",0,], ["ui_S_t[l.textcomposer.mentions_MentionSpan_null_MentionSpan-Day-20_21_null,NEXUS_5,1.0,en]","ui_S_t[l.textcomposer.mentions_MentionSpan_null_MentionSpan-Night-20_22_null,NEXUS_5,1.0,en]",0,], -["ui_S_t[f.messages.impl.mentions_MentionSuggestionsPickerView_null_MentionSuggestionsPickerView-Day-3_3_null,NEXUS_5,1.0,en]","ui_S_t[f.messages.impl.mentions_MentionSuggestionsPickerView_null_MentionSuggestionsPickerView-Night-3_4_null,NEXUS_5,1.0,en]",19874,], +["ui_S_t[f.messages.impl.mentions_MentionSuggestionsPickerView_null_MentionSuggestionsPickerView-Day-3_3_null,NEXUS_5,1.0,en]","ui_S_t[f.messages.impl.mentions_MentionSuggestionsPickerView_null_MentionSuggestionsPickerView-Night-3_4_null,NEXUS_5,1.0,en]",19881,], ["ui_S_t[l.designsystem.theme.components.previews_Menu_null_Menus_Menu_0_null,NEXUS_5,1.0,en]","",0,], ["ui_S_t[f.messages.impl.messagecomposer_MessageComposerViewVoice_null_MessageComposerViewVoice-Day-6_6_null_0,NEXUS_5,1.0,en]","ui_S_t[f.messages.impl.messagecomposer_MessageComposerViewVoice_null_MessageComposerViewVoice-Night-6_7_null_0,NEXUS_5,1.0,en]",0,], -["ui_S_t[f.messages.impl.messagecomposer_MessageComposerView_null_MessageComposerView-Day-5_5_null_0,NEXUS_5,1.0,en]","ui_S_t[f.messages.impl.messagecomposer_MessageComposerView_null_MessageComposerView-Night-5_6_null_0,NEXUS_5,1.0,en]",19874,], +["ui_S_t[f.messages.impl.messagecomposer_MessageComposerView_null_MessageComposerView-Day-5_5_null_0,NEXUS_5,1.0,en]","ui_S_t[f.messages.impl.messagecomposer_MessageComposerView_null_MessageComposerView-Night-5_6_null_0,NEXUS_5,1.0,en]",19881,], ["ui_S_t[f.messages.impl.timeline.components_MessageEventBubble_null_MessageEventBubble-Day-10_10_null_0,NEXUS_5,1.0,en]","ui_S_t[f.messages.impl.timeline.components_MessageEventBubble_null_MessageEventBubble-Night-10_11_null_0,NEXUS_5,1.0,en]",0,], ["ui_S_t[f.messages.impl.timeline.components_MessageEventBubble_null_MessageEventBubble-Day-10_10_null_1,NEXUS_5,1.0,en]","ui_S_t[f.messages.impl.timeline.components_MessageEventBubble_null_MessageEventBubble-Night-10_11_null_1,NEXUS_5,1.0,en]",0,], ["ui_S_t[f.messages.impl.timeline.components_MessageEventBubble_null_MessageEventBubble-Day-10_10_null_10,NEXUS_5,1.0,en]","ui_S_t[f.messages.impl.timeline.components_MessageEventBubble_null_MessageEventBubble-Night-10_11_null_10,NEXUS_5,1.0,en]",0,], @@ -416,25 +416,25 @@ export const screenshots = [ ["ui_S_t[f.messages.impl.timeline.components_MessagesReactionButton_null_MessagesReactionButton-Day-12_12_null_1,NEXUS_5,1.0,en]","ui_S_t[f.messages.impl.timeline.components_MessagesReactionButton_null_MessagesReactionButton-Night-12_13_null_1,NEXUS_5,1.0,en]",0,], ["ui_S_t[f.messages.impl.timeline.components_MessagesReactionButton_null_MessagesReactionButton-Day-12_12_null_2,NEXUS_5,1.0,en]","ui_S_t[f.messages.impl.timeline.components_MessagesReactionButton_null_MessagesReactionButton-Night-12_13_null_2,NEXUS_5,1.0,en]",0,], ["ui_S_t[f.messages.impl.timeline.components_MessagesReactionButton_null_MessagesReactionButton-Day-12_12_null_3,NEXUS_5,1.0,en]","ui_S_t[f.messages.impl.timeline.components_MessagesReactionButton_null_MessagesReactionButton-Night-12_13_null_3,NEXUS_5,1.0,en]",0,], -["ui_S_t[f.messages.impl.typing_MessagesViewWithTyping_null_MessagesViewWithTyping-Day-67_67_null_0,NEXUS_5,1.0,en]","ui_S_t[f.messages.impl.typing_MessagesViewWithTyping_null_MessagesViewWithTyping-Night-67_68_null_0,NEXUS_5,1.0,en]",19874,], -["ui_S_t[f.messages.impl.typing_MessagesViewWithTyping_null_MessagesViewWithTyping-Day-67_67_null_1,NEXUS_5,1.0,en]","ui_S_t[f.messages.impl.typing_MessagesViewWithTyping_null_MessagesViewWithTyping-Night-67_68_null_1,NEXUS_5,1.0,en]",19874,], +["ui_S_t[f.messages.impl.typing_MessagesViewWithTyping_null_MessagesViewWithTyping-Day-67_67_null_0,NEXUS_5,1.0,en]","ui_S_t[f.messages.impl.typing_MessagesViewWithTyping_null_MessagesViewWithTyping-Night-67_68_null_0,NEXUS_5,1.0,en]",19881,], +["ui_S_t[f.messages.impl.typing_MessagesViewWithTyping_null_MessagesViewWithTyping-Day-67_67_null_1,NEXUS_5,1.0,en]","ui_S_t[f.messages.impl.typing_MessagesViewWithTyping_null_MessagesViewWithTyping-Night-67_68_null_1,NEXUS_5,1.0,en]",19881,], ["ui_S_t[f.messages.impl.typing_MessagesViewWithTyping_null_MessagesViewWithTyping-Day-67_67_null_2,NEXUS_5,1.0,en]","ui_S_t[f.messages.impl.typing_MessagesViewWithTyping_null_MessagesViewWithTyping-Night-67_68_null_2,NEXUS_5,1.0,en]",0,], -["ui_S_t[f.messages.impl_MessagesView_null_MessagesView-Day-0_0_null_0,NEXUS_5,1.0,en]","ui_S_t[f.messages.impl_MessagesView_null_MessagesView-Night-0_1_null_0,NEXUS_5,1.0,en]",19874,], +["ui_S_t[f.messages.impl_MessagesView_null_MessagesView-Day-0_0_null_0,NEXUS_5,1.0,en]","ui_S_t[f.messages.impl_MessagesView_null_MessagesView-Night-0_1_null_0,NEXUS_5,1.0,en]",19881,], ["ui_S_t[f.messages.impl_MessagesView_null_MessagesView-Day-0_0_null_1,NEXUS_5,1.0,en]","ui_S_t[f.messages.impl_MessagesView_null_MessagesView-Night-0_1_null_1,NEXUS_5,1.0,en]",0,], -["ui_S_t[f.messages.impl_MessagesView_null_MessagesView-Day-0_0_null_10,NEXUS_5,1.0,en]","ui_S_t[f.messages.impl_MessagesView_null_MessagesView-Night-0_1_null_10,NEXUS_5,1.0,en]",19874,], -["ui_S_t[f.messages.impl_MessagesView_null_MessagesView-Day-0_0_null_11,NEXUS_5,1.0,en]","ui_S_t[f.messages.impl_MessagesView_null_MessagesView-Night-0_1_null_11,NEXUS_5,1.0,en]",19874,], -["ui_S_t[f.messages.impl_MessagesView_null_MessagesView-Day-0_0_null_12,NEXUS_5,1.0,en]","ui_S_t[f.messages.impl_MessagesView_null_MessagesView-Night-0_1_null_12,NEXUS_5,1.0,en]",19874,], -["ui_S_t[f.messages.impl_MessagesView_null_MessagesView-Day-0_0_null_2,NEXUS_5,1.0,en]","ui_S_t[f.messages.impl_MessagesView_null_MessagesView-Night-0_1_null_2,NEXUS_5,1.0,en]",19874,], -["ui_S_t[f.messages.impl_MessagesView_null_MessagesView-Day-0_0_null_3,NEXUS_5,1.0,en]","ui_S_t[f.messages.impl_MessagesView_null_MessagesView-Night-0_1_null_3,NEXUS_5,1.0,en]",19874,], -["ui_S_t[f.messages.impl_MessagesView_null_MessagesView-Day-0_0_null_4,NEXUS_5,1.0,en]","ui_S_t[f.messages.impl_MessagesView_null_MessagesView-Night-0_1_null_4,NEXUS_5,1.0,en]",19874,], -["ui_S_t[f.messages.impl_MessagesView_null_MessagesView-Day-0_0_null_5,NEXUS_5,1.0,en]","ui_S_t[f.messages.impl_MessagesView_null_MessagesView-Night-0_1_null_5,NEXUS_5,1.0,en]",19874,], -["ui_S_t[f.messages.impl_MessagesView_null_MessagesView-Day-0_0_null_6,NEXUS_5,1.0,en]","ui_S_t[f.messages.impl_MessagesView_null_MessagesView-Night-0_1_null_6,NEXUS_5,1.0,en]",19874,], -["ui_S_t[f.messages.impl_MessagesView_null_MessagesView-Day-0_0_null_7,NEXUS_5,1.0,en]","ui_S_t[f.messages.impl_MessagesView_null_MessagesView-Night-0_1_null_7,NEXUS_5,1.0,en]",19874,], -["ui_S_t[f.messages.impl_MessagesView_null_MessagesView-Day-0_0_null_8,NEXUS_5,1.0,en]","ui_S_t[f.messages.impl_MessagesView_null_MessagesView-Night-0_1_null_8,NEXUS_5,1.0,en]",19874,], -["ui_S_t[f.messages.impl_MessagesView_null_MessagesView-Day-0_0_null_9,NEXUS_5,1.0,en]","ui_S_t[f.messages.impl_MessagesView_null_MessagesView-Night-0_1_null_9,NEXUS_5,1.0,en]",19874,], -["ui_S_t[f.roomlist.impl.migration_MigrationScreenView_null_MigrationScreenView-Day-9_10_null,NEXUS_5,1.0,en]","ui_S_t[f.roomlist.impl.migration_MigrationScreenView_null_MigrationScreenView-Night-9_11_null,NEXUS_5,1.0,en]",19874,], +["ui_S_t[f.messages.impl_MessagesView_null_MessagesView-Day-0_0_null_10,NEXUS_5,1.0,en]","ui_S_t[f.messages.impl_MessagesView_null_MessagesView-Night-0_1_null_10,NEXUS_5,1.0,en]",19881,], +["ui_S_t[f.messages.impl_MessagesView_null_MessagesView-Day-0_0_null_11,NEXUS_5,1.0,en]","ui_S_t[f.messages.impl_MessagesView_null_MessagesView-Night-0_1_null_11,NEXUS_5,1.0,en]",19881,], +["ui_S_t[f.messages.impl_MessagesView_null_MessagesView-Day-0_0_null_12,NEXUS_5,1.0,en]","ui_S_t[f.messages.impl_MessagesView_null_MessagesView-Night-0_1_null_12,NEXUS_5,1.0,en]",19881,], +["ui_S_t[f.messages.impl_MessagesView_null_MessagesView-Day-0_0_null_2,NEXUS_5,1.0,en]","ui_S_t[f.messages.impl_MessagesView_null_MessagesView-Night-0_1_null_2,NEXUS_5,1.0,en]",19881,], +["ui_S_t[f.messages.impl_MessagesView_null_MessagesView-Day-0_0_null_3,NEXUS_5,1.0,en]","ui_S_t[f.messages.impl_MessagesView_null_MessagesView-Night-0_1_null_3,NEXUS_5,1.0,en]",19881,], +["ui_S_t[f.messages.impl_MessagesView_null_MessagesView-Day-0_0_null_4,NEXUS_5,1.0,en]","ui_S_t[f.messages.impl_MessagesView_null_MessagesView-Night-0_1_null_4,NEXUS_5,1.0,en]",19881,], +["ui_S_t[f.messages.impl_MessagesView_null_MessagesView-Day-0_0_null_5,NEXUS_5,1.0,en]","ui_S_t[f.messages.impl_MessagesView_null_MessagesView-Night-0_1_null_5,NEXUS_5,1.0,en]",19881,], +["ui_S_t[f.messages.impl_MessagesView_null_MessagesView-Day-0_0_null_6,NEXUS_5,1.0,en]","ui_S_t[f.messages.impl_MessagesView_null_MessagesView-Night-0_1_null_6,NEXUS_5,1.0,en]",19881,], +["ui_S_t[f.messages.impl_MessagesView_null_MessagesView-Day-0_0_null_7,NEXUS_5,1.0,en]","ui_S_t[f.messages.impl_MessagesView_null_MessagesView-Night-0_1_null_7,NEXUS_5,1.0,en]",19881,], +["ui_S_t[f.messages.impl_MessagesView_null_MessagesView-Day-0_0_null_8,NEXUS_5,1.0,en]","ui_S_t[f.messages.impl_MessagesView_null_MessagesView-Night-0_1_null_8,NEXUS_5,1.0,en]",19881,], +["ui_S_t[f.messages.impl_MessagesView_null_MessagesView-Day-0_0_null_9,NEXUS_5,1.0,en]","ui_S_t[f.messages.impl_MessagesView_null_MessagesView-Night-0_1_null_9,NEXUS_5,1.0,en]",19881,], +["ui_S_t[f.roomlist.impl.migration_MigrationScreenView_null_MigrationScreenView-Day-9_10_null,NEXUS_5,1.0,en]","ui_S_t[f.roomlist.impl.migration_MigrationScreenView_null_MigrationScreenView-Night-9_11_null,NEXUS_5,1.0,en]",19881,], ["ui_S_t[f.migration.impl_MigrationView_null_MigrationView-Day-0_1_null_0,NEXUS_5,1.0,en]","ui_S_t[f.migration.impl_MigrationView_null_MigrationView-Night-0_2_null_0,NEXUS_5,1.0,en]",0,], -["ui_S_t[f.migration.impl_MigrationView_null_MigrationView-Day-0_1_null_1,NEXUS_5,1.0,en]","ui_S_t[f.migration.impl_MigrationView_null_MigrationView-Night-0_2_null_1,NEXUS_5,1.0,en]",19874,], +["ui_S_t[f.migration.impl_MigrationView_null_MigrationView-Day-0_1_null_1,NEXUS_5,1.0,en]","ui_S_t[f.migration.impl_MigrationView_null_MigrationView-Night-0_2_null_1,NEXUS_5,1.0,en]",19881,], ["ui_S_t[l.designsystem.theme.components_ModalBottomSheetDark_null_BottomSheets_ModalBottomSheetDark_0_null,NEXUS_5,1.0,en]","",0,], ["ui_S_t[l.designsystem.theme.components_ModalBottomSheetLight_null_BottomSheets_ModalBottomSheetLight_0_null,NEXUS_5,1.0,en]","",0,], ["ui_S_t[l.designsystem.components.dialogs_MultipleSelectionDialogContent_null_Dialogs_MultipleSelectionDialogContent_0_null,NEXUS_5,1.0,en]","",0,], @@ -442,26 +442,26 @@ export const screenshots = [ ["ui_S_t[l.designsystem.components.list_MutipleSelectionListItemSelectedTrailingContent_null_Listitems_MultipleselectionListitem-selectionintrailingcontent_0_null,NEXUS_5,1.0,en]","",0,], ["ui_S_t[l.designsystem.components.list_MutipleSelectionListItemSelected_null_Listitems_MultipleselectionListitem-selectioninsupportingtext_0_null,NEXUS_5,1.0,en]","",0,], ["ui_S_t[l.designsystem.components.list_MutipleSelectionListItem_null_Listitems_MultipleselectionListitem-noselection_0_null,NEXUS_5,1.0,en]","",0,], -["ui_S_t[f.preferences.impl.notifications_NotificationSettingsView_null_NotificationSettingsView-Day-6_7_null_0,NEXUS_5,1.0,en]","ui_S_t[f.preferences.impl.notifications_NotificationSettingsView_null_NotificationSettingsView-Night-6_8_null_0,NEXUS_5,1.0,en]",19874,], -["ui_S_t[f.preferences.impl.notifications_NotificationSettingsView_null_NotificationSettingsView-Day-6_7_null_1,NEXUS_5,1.0,en]","ui_S_t[f.preferences.impl.notifications_NotificationSettingsView_null_NotificationSettingsView-Night-6_8_null_1,NEXUS_5,1.0,en]",19874,], -["ui_S_t[f.preferences.impl.notifications_NotificationSettingsView_null_NotificationSettingsView-Day-6_7_null_10,NEXUS_5,1.0,en]","ui_S_t[f.preferences.impl.notifications_NotificationSettingsView_null_NotificationSettingsView-Night-6_8_null_10,NEXUS_5,1.0,en]",19874,], -["ui_S_t[f.preferences.impl.notifications_NotificationSettingsView_null_NotificationSettingsView-Day-6_7_null_2,NEXUS_5,1.0,en]","ui_S_t[f.preferences.impl.notifications_NotificationSettingsView_null_NotificationSettingsView-Night-6_8_null_2,NEXUS_5,1.0,en]",19874,], -["ui_S_t[f.preferences.impl.notifications_NotificationSettingsView_null_NotificationSettingsView-Day-6_7_null_3,NEXUS_5,1.0,en]","ui_S_t[f.preferences.impl.notifications_NotificationSettingsView_null_NotificationSettingsView-Night-6_8_null_3,NEXUS_5,1.0,en]",19874,], -["ui_S_t[f.preferences.impl.notifications_NotificationSettingsView_null_NotificationSettingsView-Day-6_7_null_4,NEXUS_5,1.0,en]","ui_S_t[f.preferences.impl.notifications_NotificationSettingsView_null_NotificationSettingsView-Night-6_8_null_4,NEXUS_5,1.0,en]",19874,], -["ui_S_t[f.preferences.impl.notifications_NotificationSettingsView_null_NotificationSettingsView-Day-6_7_null_5,NEXUS_5,1.0,en]","ui_S_t[f.preferences.impl.notifications_NotificationSettingsView_null_NotificationSettingsView-Night-6_8_null_5,NEXUS_5,1.0,en]",19874,], -["ui_S_t[f.preferences.impl.notifications_NotificationSettingsView_null_NotificationSettingsView-Day-6_7_null_6,NEXUS_5,1.0,en]","ui_S_t[f.preferences.impl.notifications_NotificationSettingsView_null_NotificationSettingsView-Night-6_8_null_6,NEXUS_5,1.0,en]",19874,], -["ui_S_t[f.preferences.impl.notifications_NotificationSettingsView_null_NotificationSettingsView-Day-6_7_null_7,NEXUS_5,1.0,en]","ui_S_t[f.preferences.impl.notifications_NotificationSettingsView_null_NotificationSettingsView-Night-6_8_null_7,NEXUS_5,1.0,en]",19874,], -["ui_S_t[f.preferences.impl.notifications_NotificationSettingsView_null_NotificationSettingsView-Day-6_7_null_8,NEXUS_5,1.0,en]","ui_S_t[f.preferences.impl.notifications_NotificationSettingsView_null_NotificationSettingsView-Night-6_8_null_8,NEXUS_5,1.0,en]",19874,], -["ui_S_t[f.preferences.impl.notifications_NotificationSettingsView_null_NotificationSettingsView-Day-6_7_null_9,NEXUS_5,1.0,en]","ui_S_t[f.preferences.impl.notifications_NotificationSettingsView_null_NotificationSettingsView-Night-6_8_null_9,NEXUS_5,1.0,en]",19874,], -["ui_S_t[f.ftue.impl.notifications_NotificationsOptInView_null_NotificationsOptInView-Day-0_1_null_0,NEXUS_5,1.0,en]","ui_S_t[f.ftue.impl.notifications_NotificationsOptInView_null_NotificationsOptInView-Night-0_2_null_0,NEXUS_5,1.0,en]",19874,], +["ui_S_t[f.preferences.impl.notifications_NotificationSettingsView_null_NotificationSettingsView-Day-6_7_null_0,NEXUS_5,1.0,en]","ui_S_t[f.preferences.impl.notifications_NotificationSettingsView_null_NotificationSettingsView-Night-6_8_null_0,NEXUS_5,1.0,en]",19881,], +["ui_S_t[f.preferences.impl.notifications_NotificationSettingsView_null_NotificationSettingsView-Day-6_7_null_1,NEXUS_5,1.0,en]","ui_S_t[f.preferences.impl.notifications_NotificationSettingsView_null_NotificationSettingsView-Night-6_8_null_1,NEXUS_5,1.0,en]",19881,], +["ui_S_t[f.preferences.impl.notifications_NotificationSettingsView_null_NotificationSettingsView-Day-6_7_null_10,NEXUS_5,1.0,en]","ui_S_t[f.preferences.impl.notifications_NotificationSettingsView_null_NotificationSettingsView-Night-6_8_null_10,NEXUS_5,1.0,en]",19881,], +["ui_S_t[f.preferences.impl.notifications_NotificationSettingsView_null_NotificationSettingsView-Day-6_7_null_2,NEXUS_5,1.0,en]","ui_S_t[f.preferences.impl.notifications_NotificationSettingsView_null_NotificationSettingsView-Night-6_8_null_2,NEXUS_5,1.0,en]",19881,], +["ui_S_t[f.preferences.impl.notifications_NotificationSettingsView_null_NotificationSettingsView-Day-6_7_null_3,NEXUS_5,1.0,en]","ui_S_t[f.preferences.impl.notifications_NotificationSettingsView_null_NotificationSettingsView-Night-6_8_null_3,NEXUS_5,1.0,en]",19881,], +["ui_S_t[f.preferences.impl.notifications_NotificationSettingsView_null_NotificationSettingsView-Day-6_7_null_4,NEXUS_5,1.0,en]","ui_S_t[f.preferences.impl.notifications_NotificationSettingsView_null_NotificationSettingsView-Night-6_8_null_4,NEXUS_5,1.0,en]",19881,], +["ui_S_t[f.preferences.impl.notifications_NotificationSettingsView_null_NotificationSettingsView-Day-6_7_null_5,NEXUS_5,1.0,en]","ui_S_t[f.preferences.impl.notifications_NotificationSettingsView_null_NotificationSettingsView-Night-6_8_null_5,NEXUS_5,1.0,en]",19881,], +["ui_S_t[f.preferences.impl.notifications_NotificationSettingsView_null_NotificationSettingsView-Day-6_7_null_6,NEXUS_5,1.0,en]","ui_S_t[f.preferences.impl.notifications_NotificationSettingsView_null_NotificationSettingsView-Night-6_8_null_6,NEXUS_5,1.0,en]",19881,], +["ui_S_t[f.preferences.impl.notifications_NotificationSettingsView_null_NotificationSettingsView-Day-6_7_null_7,NEXUS_5,1.0,en]","ui_S_t[f.preferences.impl.notifications_NotificationSettingsView_null_NotificationSettingsView-Night-6_8_null_7,NEXUS_5,1.0,en]",19881,], +["ui_S_t[f.preferences.impl.notifications_NotificationSettingsView_null_NotificationSettingsView-Day-6_7_null_8,NEXUS_5,1.0,en]","ui_S_t[f.preferences.impl.notifications_NotificationSettingsView_null_NotificationSettingsView-Night-6_8_null_8,NEXUS_5,1.0,en]",19881,], +["ui_S_t[f.preferences.impl.notifications_NotificationSettingsView_null_NotificationSettingsView-Day-6_7_null_9,NEXUS_5,1.0,en]","ui_S_t[f.preferences.impl.notifications_NotificationSettingsView_null_NotificationSettingsView-Night-6_8_null_9,NEXUS_5,1.0,en]",19881,], +["ui_S_t[f.ftue.impl.notifications_NotificationsOptInView_null_NotificationsOptInView-Day-0_1_null_0,NEXUS_5,1.0,en]","ui_S_t[f.ftue.impl.notifications_NotificationsOptInView_null_NotificationsOptInView-Night-0_2_null_0,NEXUS_5,1.0,en]",19881,], ["ui_S_t[f.login.impl.oidc.webview_OidcView_null_OidcView-Day-3_4_null_0,NEXUS_5,1.0,en]","ui_S_t[f.login.impl.oidc.webview_OidcView_null_OidcView-Night-3_5_null_0,NEXUS_5,1.0,en]",0,], ["ui_S_t[f.login.impl.oidc.webview_OidcView_null_OidcView-Day-3_4_null_1,NEXUS_5,1.0,en]","ui_S_t[f.login.impl.oidc.webview_OidcView_null_OidcView-Night-3_5_null_1,NEXUS_5,1.0,en]",0,], ["ui_S_t[l.designsystem.atomic.pages_OnBoardingPage_null_OnBoardingPage-Day_0_null,NEXUS_5,1.0,en]","ui_S_t[l.designsystem.atomic.pages_OnBoardingPage_null_OnBoardingPage-Night_1_null,NEXUS_5,1.0,en]",0,], -["ui_S_t[f.onboarding.impl_OnBoardingView_null_OnBoardingView-Day-0_1_null_0,NEXUS_5,1.0,en]","ui_S_t[f.onboarding.impl_OnBoardingView_null_OnBoardingView-Night-0_2_null_0,NEXUS_5,1.0,en]",19874,], -["ui_S_t[f.onboarding.impl_OnBoardingView_null_OnBoardingView-Day-0_1_null_1,NEXUS_5,1.0,en]","ui_S_t[f.onboarding.impl_OnBoardingView_null_OnBoardingView-Night-0_2_null_1,NEXUS_5,1.0,en]",19874,], -["ui_S_t[f.onboarding.impl_OnBoardingView_null_OnBoardingView-Day-0_1_null_2,NEXUS_5,1.0,en]","ui_S_t[f.onboarding.impl_OnBoardingView_null_OnBoardingView-Night-0_2_null_2,NEXUS_5,1.0,en]",19874,], -["ui_S_t[f.onboarding.impl_OnBoardingView_null_OnBoardingView-Day-0_1_null_3,NEXUS_5,1.0,en]","ui_S_t[f.onboarding.impl_OnBoardingView_null_OnBoardingView-Night-0_2_null_3,NEXUS_5,1.0,en]",19874,], -["ui_S_t[f.onboarding.impl_OnBoardingView_null_OnBoardingView-Day-0_1_null_4,NEXUS_5,1.0,en]","ui_S_t[f.onboarding.impl_OnBoardingView_null_OnBoardingView-Night-0_2_null_4,NEXUS_5,1.0,en]",19874,], +["ui_S_t[f.onboarding.impl_OnBoardingView_null_OnBoardingView-Day-0_1_null_0,NEXUS_5,1.0,en]","ui_S_t[f.onboarding.impl_OnBoardingView_null_OnBoardingView-Night-0_2_null_0,NEXUS_5,1.0,en]",19881,], +["ui_S_t[f.onboarding.impl_OnBoardingView_null_OnBoardingView-Day-0_1_null_1,NEXUS_5,1.0,en]","ui_S_t[f.onboarding.impl_OnBoardingView_null_OnBoardingView-Night-0_2_null_1,NEXUS_5,1.0,en]",19881,], +["ui_S_t[f.onboarding.impl_OnBoardingView_null_OnBoardingView-Day-0_1_null_2,NEXUS_5,1.0,en]","ui_S_t[f.onboarding.impl_OnBoardingView_null_OnBoardingView-Night-0_2_null_2,NEXUS_5,1.0,en]",19881,], +["ui_S_t[f.onboarding.impl_OnBoardingView_null_OnBoardingView-Day-0_1_null_3,NEXUS_5,1.0,en]","ui_S_t[f.onboarding.impl_OnBoardingView_null_OnBoardingView-Night-0_2_null_3,NEXUS_5,1.0,en]",19881,], +["ui_S_t[f.onboarding.impl_OnBoardingView_null_OnBoardingView-Day-0_1_null_4,NEXUS_5,1.0,en]","ui_S_t[f.onboarding.impl_OnBoardingView_null_OnBoardingView-Night-0_2_null_4,NEXUS_5,1.0,en]",19881,], ["ui_S_t[l.designsystem.background_OnboardingBackground_null_OnboardingBackground-Day_0_null,NEXUS_5,1.0,en]","ui_S_t[l.designsystem.background_OnboardingBackground_null_OnboardingBackground-Night_1_null,NEXUS_5,1.0,en]",0,], ["ui_S_t[l.designsystem.theme.components_OutlinedButtonLarge_null_Buttons_OutlinedButtonLarge_0_null,NEXUS_5,1.0,en]","",0,], ["ui_S_t[l.designsystem.theme.components_OutlinedButtonMedium_null_Buttons_OutlinedButtonMedium_0_null,NEXUS_5,1.0,en]","",0,], @@ -474,47 +474,47 @@ export const screenshots = [ ["ui_S_t[l.designsystem.components_PageTitleWithIconFull_null_PageTitleWithIconFull-Day_0_null_3,NEXUS_5,1.0,en]","ui_S_t[l.designsystem.components_PageTitleWithIconFull_null_PageTitleWithIconFull-Night_1_null_3,NEXUS_5,1.0,en]",0,], ["ui_S_t[l.designsystem.components_PageTitleWithIconFull_null_PageTitleWithIconFull-Day_0_null_4,NEXUS_5,1.0,en]","ui_S_t[l.designsystem.components_PageTitleWithIconFull_null_PageTitleWithIconFull-Night_1_null_4,NEXUS_5,1.0,en]",0,], ["ui_S_t[l.designsystem.components_PageTitleWithIconMinimal_null_PageTitleWithIconMinimal-Day_0_null,NEXUS_5,1.0,en]","ui_S_t[l.designsystem.components_PageTitleWithIconMinimal_null_PageTitleWithIconMinimal-Night_1_null,NEXUS_5,1.0,en]",0,], -["ui_S_t[f.roomdetails.impl.rolesandpermissions.changeroles_PendingMemberRowWithLongName_null_PendingMemberRowWithLongName-Day-13_13_null,NEXUS_5,1.0,en]","ui_S_t[f.roomdetails.impl.rolesandpermissions.changeroles_PendingMemberRowWithLongName_null_PendingMemberRowWithLongName-Night-13_14_null,NEXUS_5,1.0,en]",19874,], -["ui_S_t[l.permissions.api_PermissionsView_null_PermissionsView-Day-0_1_null_0,NEXUS_5,1.0,en]","ui_S_t[l.permissions.api_PermissionsView_null_PermissionsView-Night-0_2_null_0,NEXUS_5,1.0,en]",19874,], -["ui_S_t[l.permissions.api_PermissionsView_null_PermissionsView-Day-0_1_null_1,NEXUS_5,1.0,en]","ui_S_t[l.permissions.api_PermissionsView_null_PermissionsView-Night-0_2_null_1,NEXUS_5,1.0,en]",19874,], -["ui_S_t[l.permissions.api_PermissionsView_null_PermissionsView-Day-0_1_null_2,NEXUS_5,1.0,en]","ui_S_t[l.permissions.api_PermissionsView_null_PermissionsView-Night-0_2_null_2,NEXUS_5,1.0,en]",19874,], -["ui_S_t[l.permissions.api_PermissionsView_null_PermissionsView-Day-0_1_null_3,NEXUS_5,1.0,en]","ui_S_t[l.permissions.api_PermissionsView_null_PermissionsView-Night-0_2_null_3,NEXUS_5,1.0,en]",19874,], +["ui_S_t[f.roomdetails.impl.rolesandpermissions.changeroles_PendingMemberRowWithLongName_null_PendingMemberRowWithLongName-Day-13_13_null,NEXUS_5,1.0,en]","ui_S_t[f.roomdetails.impl.rolesandpermissions.changeroles_PendingMemberRowWithLongName_null_PendingMemberRowWithLongName-Night-13_14_null,NEXUS_5,1.0,en]",19881,], +["ui_S_t[l.permissions.api_PermissionsView_null_PermissionsView-Day-0_1_null_0,NEXUS_5,1.0,en]","ui_S_t[l.permissions.api_PermissionsView_null_PermissionsView-Night-0_2_null_0,NEXUS_5,1.0,en]",19881,], +["ui_S_t[l.permissions.api_PermissionsView_null_PermissionsView-Day-0_1_null_1,NEXUS_5,1.0,en]","ui_S_t[l.permissions.api_PermissionsView_null_PermissionsView-Night-0_2_null_1,NEXUS_5,1.0,en]",19881,], +["ui_S_t[l.permissions.api_PermissionsView_null_PermissionsView-Day-0_1_null_2,NEXUS_5,1.0,en]","ui_S_t[l.permissions.api_PermissionsView_null_PermissionsView-Night-0_2_null_2,NEXUS_5,1.0,en]",19881,], +["ui_S_t[l.permissions.api_PermissionsView_null_PermissionsView-Day-0_1_null_3,NEXUS_5,1.0,en]","ui_S_t[l.permissions.api_PermissionsView_null_PermissionsView-Night-0_2_null_3,NEXUS_5,1.0,en]",19881,], ["ui_S_t[f.lockscreen.impl.components_PinEntryTextField_null_PinEntryTextField-Day-0_1_null,NEXUS_5,1.0,en]","ui_S_t[f.lockscreen.impl.components_PinEntryTextField_null_PinEntryTextField-Night-0_2_null,NEXUS_5,1.0,en]",0,], ["ui_S_t[l.designsystem.components_PinIcon_null_PinIcon-Day_0_null,NEXUS_5,1.0,en]","ui_S_t[l.designsystem.components_PinIcon_null_PinIcon-Night_1_null,NEXUS_5,1.0,en]",0,], ["ui_S_t[f.lockscreen.impl.unlock.keypad_PinKeypad_null_PinKeypad-Day-6_7_null,NEXUS_5,1.0,en]","ui_S_t[f.lockscreen.impl.unlock.keypad_PinKeypad_null_PinKeypad-Night-6_8_null,NEXUS_5,1.0,en]",0,], -["ui_S_t[f.lockscreen.impl.unlock_PinUnlockViewInApp_null_PinUnlockViewInApp-Day-4_5_null_0,NEXUS_5,1.0,en]","ui_S_t[f.lockscreen.impl.unlock_PinUnlockViewInApp_null_PinUnlockViewInApp-Night-4_6_null_0,NEXUS_5,1.0,en]",19874,], -["ui_S_t[f.lockscreen.impl.unlock_PinUnlockViewInApp_null_PinUnlockViewInApp-Day-4_5_null_1,NEXUS_5,1.0,en]","ui_S_t[f.lockscreen.impl.unlock_PinUnlockViewInApp_null_PinUnlockViewInApp-Night-4_6_null_1,NEXUS_5,1.0,en]",19874,], -["ui_S_t[f.lockscreen.impl.unlock_PinUnlockViewInApp_null_PinUnlockViewInApp-Day-4_5_null_2,NEXUS_5,1.0,en]","ui_S_t[f.lockscreen.impl.unlock_PinUnlockViewInApp_null_PinUnlockViewInApp-Night-4_6_null_2,NEXUS_5,1.0,en]",19874,], -["ui_S_t[f.lockscreen.impl.unlock_PinUnlockViewInApp_null_PinUnlockViewInApp-Day-4_5_null_3,NEXUS_5,1.0,en]","ui_S_t[f.lockscreen.impl.unlock_PinUnlockViewInApp_null_PinUnlockViewInApp-Night-4_6_null_3,NEXUS_5,1.0,en]",19874,], -["ui_S_t[f.lockscreen.impl.unlock_PinUnlockViewInApp_null_PinUnlockViewInApp-Day-4_5_null_4,NEXUS_5,1.0,en]","ui_S_t[f.lockscreen.impl.unlock_PinUnlockViewInApp_null_PinUnlockViewInApp-Night-4_6_null_4,NEXUS_5,1.0,en]",19874,], -["ui_S_t[f.lockscreen.impl.unlock_PinUnlockViewInApp_null_PinUnlockViewInApp-Day-4_5_null_5,NEXUS_5,1.0,en]","ui_S_t[f.lockscreen.impl.unlock_PinUnlockViewInApp_null_PinUnlockViewInApp-Night-4_6_null_5,NEXUS_5,1.0,en]",19874,], -["ui_S_t[f.lockscreen.impl.unlock_PinUnlockViewInApp_null_PinUnlockViewInApp-Day-4_5_null_6,NEXUS_5,1.0,en]","ui_S_t[f.lockscreen.impl.unlock_PinUnlockViewInApp_null_PinUnlockViewInApp-Night-4_6_null_6,NEXUS_5,1.0,en]",19874,], -["ui_S_t[f.lockscreen.impl.unlock_PinUnlockView_null_PinUnlockView-Day-5_6_null_0,NEXUS_5,1.0,en]","ui_S_t[f.lockscreen.impl.unlock_PinUnlockView_null_PinUnlockView-Night-5_7_null_0,NEXUS_5,1.0,en]",19874,], -["ui_S_t[f.lockscreen.impl.unlock_PinUnlockView_null_PinUnlockView-Day-5_6_null_1,NEXUS_5,1.0,en]","ui_S_t[f.lockscreen.impl.unlock_PinUnlockView_null_PinUnlockView-Night-5_7_null_1,NEXUS_5,1.0,en]",19874,], -["ui_S_t[f.lockscreen.impl.unlock_PinUnlockView_null_PinUnlockView-Day-5_6_null_2,NEXUS_5,1.0,en]","ui_S_t[f.lockscreen.impl.unlock_PinUnlockView_null_PinUnlockView-Night-5_7_null_2,NEXUS_5,1.0,en]",19874,], -["ui_S_t[f.lockscreen.impl.unlock_PinUnlockView_null_PinUnlockView-Day-5_6_null_3,NEXUS_5,1.0,en]","ui_S_t[f.lockscreen.impl.unlock_PinUnlockView_null_PinUnlockView-Night-5_7_null_3,NEXUS_5,1.0,en]",19874,], -["ui_S_t[f.lockscreen.impl.unlock_PinUnlockView_null_PinUnlockView-Day-5_6_null_4,NEXUS_5,1.0,en]","ui_S_t[f.lockscreen.impl.unlock_PinUnlockView_null_PinUnlockView-Night-5_7_null_4,NEXUS_5,1.0,en]",19874,], -["ui_S_t[f.lockscreen.impl.unlock_PinUnlockView_null_PinUnlockView-Day-5_6_null_5,NEXUS_5,1.0,en]","ui_S_t[f.lockscreen.impl.unlock_PinUnlockView_null_PinUnlockView-Night-5_7_null_5,NEXUS_5,1.0,en]",19874,], -["ui_S_t[f.lockscreen.impl.unlock_PinUnlockView_null_PinUnlockView-Day-5_6_null_6,NEXUS_5,1.0,en]","ui_S_t[f.lockscreen.impl.unlock_PinUnlockView_null_PinUnlockView-Night-5_7_null_6,NEXUS_5,1.0,en]",19874,], +["ui_S_t[f.lockscreen.impl.unlock_PinUnlockViewInApp_null_PinUnlockViewInApp-Day-4_5_null_0,NEXUS_5,1.0,en]","ui_S_t[f.lockscreen.impl.unlock_PinUnlockViewInApp_null_PinUnlockViewInApp-Night-4_6_null_0,NEXUS_5,1.0,en]",19881,], +["ui_S_t[f.lockscreen.impl.unlock_PinUnlockViewInApp_null_PinUnlockViewInApp-Day-4_5_null_1,NEXUS_5,1.0,en]","ui_S_t[f.lockscreen.impl.unlock_PinUnlockViewInApp_null_PinUnlockViewInApp-Night-4_6_null_1,NEXUS_5,1.0,en]",19881,], +["ui_S_t[f.lockscreen.impl.unlock_PinUnlockViewInApp_null_PinUnlockViewInApp-Day-4_5_null_2,NEXUS_5,1.0,en]","ui_S_t[f.lockscreen.impl.unlock_PinUnlockViewInApp_null_PinUnlockViewInApp-Night-4_6_null_2,NEXUS_5,1.0,en]",19881,], +["ui_S_t[f.lockscreen.impl.unlock_PinUnlockViewInApp_null_PinUnlockViewInApp-Day-4_5_null_3,NEXUS_5,1.0,en]","ui_S_t[f.lockscreen.impl.unlock_PinUnlockViewInApp_null_PinUnlockViewInApp-Night-4_6_null_3,NEXUS_5,1.0,en]",19881,], +["ui_S_t[f.lockscreen.impl.unlock_PinUnlockViewInApp_null_PinUnlockViewInApp-Day-4_5_null_4,NEXUS_5,1.0,en]","ui_S_t[f.lockscreen.impl.unlock_PinUnlockViewInApp_null_PinUnlockViewInApp-Night-4_6_null_4,NEXUS_5,1.0,en]",19881,], +["ui_S_t[f.lockscreen.impl.unlock_PinUnlockViewInApp_null_PinUnlockViewInApp-Day-4_5_null_5,NEXUS_5,1.0,en]","ui_S_t[f.lockscreen.impl.unlock_PinUnlockViewInApp_null_PinUnlockViewInApp-Night-4_6_null_5,NEXUS_5,1.0,en]",19881,], +["ui_S_t[f.lockscreen.impl.unlock_PinUnlockViewInApp_null_PinUnlockViewInApp-Day-4_5_null_6,NEXUS_5,1.0,en]","ui_S_t[f.lockscreen.impl.unlock_PinUnlockViewInApp_null_PinUnlockViewInApp-Night-4_6_null_6,NEXUS_5,1.0,en]",19881,], +["ui_S_t[f.lockscreen.impl.unlock_PinUnlockView_null_PinUnlockView-Day-5_6_null_0,NEXUS_5,1.0,en]","ui_S_t[f.lockscreen.impl.unlock_PinUnlockView_null_PinUnlockView-Night-5_7_null_0,NEXUS_5,1.0,en]",19881,], +["ui_S_t[f.lockscreen.impl.unlock_PinUnlockView_null_PinUnlockView-Day-5_6_null_1,NEXUS_5,1.0,en]","ui_S_t[f.lockscreen.impl.unlock_PinUnlockView_null_PinUnlockView-Night-5_7_null_1,NEXUS_5,1.0,en]",19881,], +["ui_S_t[f.lockscreen.impl.unlock_PinUnlockView_null_PinUnlockView-Day-5_6_null_2,NEXUS_5,1.0,en]","ui_S_t[f.lockscreen.impl.unlock_PinUnlockView_null_PinUnlockView-Night-5_7_null_2,NEXUS_5,1.0,en]",19881,], +["ui_S_t[f.lockscreen.impl.unlock_PinUnlockView_null_PinUnlockView-Day-5_6_null_3,NEXUS_5,1.0,en]","ui_S_t[f.lockscreen.impl.unlock_PinUnlockView_null_PinUnlockView-Night-5_7_null_3,NEXUS_5,1.0,en]",19881,], +["ui_S_t[f.lockscreen.impl.unlock_PinUnlockView_null_PinUnlockView-Day-5_6_null_4,NEXUS_5,1.0,en]","ui_S_t[f.lockscreen.impl.unlock_PinUnlockView_null_PinUnlockView-Night-5_7_null_4,NEXUS_5,1.0,en]",19881,], +["ui_S_t[f.lockscreen.impl.unlock_PinUnlockView_null_PinUnlockView-Day-5_6_null_5,NEXUS_5,1.0,en]","ui_S_t[f.lockscreen.impl.unlock_PinUnlockView_null_PinUnlockView-Night-5_7_null_5,NEXUS_5,1.0,en]",19881,], +["ui_S_t[f.lockscreen.impl.unlock_PinUnlockView_null_PinUnlockView-Day-5_6_null_6,NEXUS_5,1.0,en]","ui_S_t[f.lockscreen.impl.unlock_PinUnlockView_null_PinUnlockView-Night-5_7_null_6,NEXUS_5,1.0,en]",19881,], ["ui_S_t[l.designsystem.atomic.atoms_PlaceholderAtom_null_PlaceholderAtom-Day_0_null,NEXUS_5,1.0,en]","ui_S_t[l.designsystem.atomic.atoms_PlaceholderAtom_null_PlaceholderAtom-Night_1_null,NEXUS_5,1.0,en]",0,], -["ui_S_t[f.poll.api.pollcontent_PollAnswerViewDisclosedNotSelected_null_PollAnswerViewDisclosedNotSelected-Day-0_1_null,NEXUS_5,1.0,en]","ui_S_t[f.poll.api.pollcontent_PollAnswerViewDisclosedNotSelected_null_PollAnswerViewDisclosedNotSelected-Night-0_2_null,NEXUS_5,1.0,en]",19874,], -["ui_S_t[f.poll.api.pollcontent_PollAnswerViewDisclosedSelected_null_PollAnswerViewDisclosedSelected-Day-1_2_null,NEXUS_5,1.0,en]","ui_S_t[f.poll.api.pollcontent_PollAnswerViewDisclosedSelected_null_PollAnswerViewDisclosedSelected-Night-1_3_null,NEXUS_5,1.0,en]",19874,], -["ui_S_t[f.poll.api.pollcontent_PollAnswerViewEndedSelected_null_PollAnswerViewEndedSelected-Day-6_7_null,NEXUS_5,1.0,en]","ui_S_t[f.poll.api.pollcontent_PollAnswerViewEndedSelected_null_PollAnswerViewEndedSelected-Night-6_8_null,NEXUS_5,1.0,en]",19874,], -["ui_S_t[f.poll.api.pollcontent_PollAnswerViewEndedWinnerNotSelected_null_PollAnswerViewEndedWinnerNotSelected-Day-4_5_null,NEXUS_5,1.0,en]","ui_S_t[f.poll.api.pollcontent_PollAnswerViewEndedWinnerNotSelected_null_PollAnswerViewEndedWinnerNotSelected-Night-4_6_null,NEXUS_5,1.0,en]",19874,], -["ui_S_t[f.poll.api.pollcontent_PollAnswerViewEndedWinnerSelected_null_PollAnswerViewEndedWinnerSelected-Day-5_6_null,NEXUS_5,1.0,en]","ui_S_t[f.poll.api.pollcontent_PollAnswerViewEndedWinnerSelected_null_PollAnswerViewEndedWinnerSelected-Night-5_7_null,NEXUS_5,1.0,en]",19874,], +["ui_S_t[f.poll.api.pollcontent_PollAnswerViewDisclosedNotSelected_null_PollAnswerViewDisclosedNotSelected-Day-0_1_null,NEXUS_5,1.0,en]","ui_S_t[f.poll.api.pollcontent_PollAnswerViewDisclosedNotSelected_null_PollAnswerViewDisclosedNotSelected-Night-0_2_null,NEXUS_5,1.0,en]",19881,], +["ui_S_t[f.poll.api.pollcontent_PollAnswerViewDisclosedSelected_null_PollAnswerViewDisclosedSelected-Day-1_2_null,NEXUS_5,1.0,en]","ui_S_t[f.poll.api.pollcontent_PollAnswerViewDisclosedSelected_null_PollAnswerViewDisclosedSelected-Night-1_3_null,NEXUS_5,1.0,en]",19881,], +["ui_S_t[f.poll.api.pollcontent_PollAnswerViewEndedSelected_null_PollAnswerViewEndedSelected-Day-6_7_null,NEXUS_5,1.0,en]","ui_S_t[f.poll.api.pollcontent_PollAnswerViewEndedSelected_null_PollAnswerViewEndedSelected-Night-6_8_null,NEXUS_5,1.0,en]",19881,], +["ui_S_t[f.poll.api.pollcontent_PollAnswerViewEndedWinnerNotSelected_null_PollAnswerViewEndedWinnerNotSelected-Day-4_5_null,NEXUS_5,1.0,en]","ui_S_t[f.poll.api.pollcontent_PollAnswerViewEndedWinnerNotSelected_null_PollAnswerViewEndedWinnerNotSelected-Night-4_6_null,NEXUS_5,1.0,en]",19881,], +["ui_S_t[f.poll.api.pollcontent_PollAnswerViewEndedWinnerSelected_null_PollAnswerViewEndedWinnerSelected-Day-5_6_null,NEXUS_5,1.0,en]","ui_S_t[f.poll.api.pollcontent_PollAnswerViewEndedWinnerSelected_null_PollAnswerViewEndedWinnerSelected-Night-5_7_null,NEXUS_5,1.0,en]",19881,], ["ui_S_t[f.poll.api.pollcontent_PollAnswerViewUndisclosedNotSelected_null_PollAnswerViewUndisclosedNotSelected-Day-2_3_null,NEXUS_5,1.0,en]","ui_S_t[f.poll.api.pollcontent_PollAnswerViewUndisclosedNotSelected_null_PollAnswerViewUndisclosedNotSelected-Night-2_4_null,NEXUS_5,1.0,en]",0,], ["ui_S_t[f.poll.api.pollcontent_PollAnswerViewUndisclosedSelected_null_PollAnswerViewUndisclosedSelected-Day-3_4_null,NEXUS_5,1.0,en]","ui_S_t[f.poll.api.pollcontent_PollAnswerViewUndisclosedSelected_null_PollAnswerViewUndisclosedSelected-Night-3_5_null,NEXUS_5,1.0,en]",0,], -["ui_S_t[f.poll.api.pollcontent_PollContentViewCreatorEditable_null_PollContentViewCreatorEditable-Day-10_11_null,NEXUS_5,1.0,en]","ui_S_t[f.poll.api.pollcontent_PollContentViewCreatorEditable_null_PollContentViewCreatorEditable-Night-10_12_null,NEXUS_5,1.0,en]",19874,], -["ui_S_t[f.poll.api.pollcontent_PollContentViewCreatorEnded_null_PollContentViewCreatorEnded-Day-12_13_null,NEXUS_5,1.0,en]","ui_S_t[f.poll.api.pollcontent_PollContentViewCreatorEnded_null_PollContentViewCreatorEnded-Night-12_14_null,NEXUS_5,1.0,en]",19874,], -["ui_S_t[f.poll.api.pollcontent_PollContentViewCreator_null_PollContentViewCreator-Day-11_12_null,NEXUS_5,1.0,en]","ui_S_t[f.poll.api.pollcontent_PollContentViewCreator_null_PollContentViewCreator-Night-11_13_null,NEXUS_5,1.0,en]",19874,], -["ui_S_t[f.poll.api.pollcontent_PollContentViewDisclosed_null_PollContentViewDisclosed-Day-8_9_null,NEXUS_5,1.0,en]","ui_S_t[f.poll.api.pollcontent_PollContentViewDisclosed_null_PollContentViewDisclosed-Night-8_10_null,NEXUS_5,1.0,en]",19874,], -["ui_S_t[f.poll.api.pollcontent_PollContentViewEnded_null_PollContentViewEnded-Day-9_10_null,NEXUS_5,1.0,en]","ui_S_t[f.poll.api.pollcontent_PollContentViewEnded_null_PollContentViewEnded-Night-9_11_null,NEXUS_5,1.0,en]",19874,], -["ui_S_t[f.poll.api.pollcontent_PollContentViewUndisclosed_null_PollContentViewUndisclosed-Day-7_8_null,NEXUS_5,1.0,en]","ui_S_t[f.poll.api.pollcontent_PollContentViewUndisclosed_null_PollContentViewUndisclosed-Night-7_9_null,NEXUS_5,1.0,en]",19874,], -["ui_S_t[f.poll.impl.history_PollHistoryView_null_PollHistoryView-Day-1_2_null_0,NEXUS_5,1.0,en]","ui_S_t[f.poll.impl.history_PollHistoryView_null_PollHistoryView-Night-1_3_null_0,NEXUS_5,1.0,en]",19874,], -["ui_S_t[f.poll.impl.history_PollHistoryView_null_PollHistoryView-Day-1_2_null_1,NEXUS_5,1.0,en]","ui_S_t[f.poll.impl.history_PollHistoryView_null_PollHistoryView-Night-1_3_null_1,NEXUS_5,1.0,en]",19874,], -["ui_S_t[f.poll.impl.history_PollHistoryView_null_PollHistoryView-Day-1_2_null_2,NEXUS_5,1.0,en]","ui_S_t[f.poll.impl.history_PollHistoryView_null_PollHistoryView-Night-1_3_null_2,NEXUS_5,1.0,en]",19874,], -["ui_S_t[f.poll.impl.history_PollHistoryView_null_PollHistoryView-Day-1_2_null_3,NEXUS_5,1.0,en]","ui_S_t[f.poll.impl.history_PollHistoryView_null_PollHistoryView-Night-1_3_null_3,NEXUS_5,1.0,en]",19874,], -["ui_S_t[f.poll.impl.history_PollHistoryView_null_PollHistoryView-Day-1_2_null_4,NEXUS_5,1.0,en]","ui_S_t[f.poll.impl.history_PollHistoryView_null_PollHistoryView-Night-1_3_null_4,NEXUS_5,1.0,en]",19874,], +["ui_S_t[f.poll.api.pollcontent_PollContentViewCreatorEditable_null_PollContentViewCreatorEditable-Day-10_11_null,NEXUS_5,1.0,en]","ui_S_t[f.poll.api.pollcontent_PollContentViewCreatorEditable_null_PollContentViewCreatorEditable-Night-10_12_null,NEXUS_5,1.0,en]",19881,], +["ui_S_t[f.poll.api.pollcontent_PollContentViewCreatorEnded_null_PollContentViewCreatorEnded-Day-12_13_null,NEXUS_5,1.0,en]","ui_S_t[f.poll.api.pollcontent_PollContentViewCreatorEnded_null_PollContentViewCreatorEnded-Night-12_14_null,NEXUS_5,1.0,en]",19881,], +["ui_S_t[f.poll.api.pollcontent_PollContentViewCreator_null_PollContentViewCreator-Day-11_12_null,NEXUS_5,1.0,en]","ui_S_t[f.poll.api.pollcontent_PollContentViewCreator_null_PollContentViewCreator-Night-11_13_null,NEXUS_5,1.0,en]",19881,], +["ui_S_t[f.poll.api.pollcontent_PollContentViewDisclosed_null_PollContentViewDisclosed-Day-8_9_null,NEXUS_5,1.0,en]","ui_S_t[f.poll.api.pollcontent_PollContentViewDisclosed_null_PollContentViewDisclosed-Night-8_10_null,NEXUS_5,1.0,en]",19881,], +["ui_S_t[f.poll.api.pollcontent_PollContentViewEnded_null_PollContentViewEnded-Day-9_10_null,NEXUS_5,1.0,en]","ui_S_t[f.poll.api.pollcontent_PollContentViewEnded_null_PollContentViewEnded-Night-9_11_null,NEXUS_5,1.0,en]",19881,], +["ui_S_t[f.poll.api.pollcontent_PollContentViewUndisclosed_null_PollContentViewUndisclosed-Day-7_8_null,NEXUS_5,1.0,en]","ui_S_t[f.poll.api.pollcontent_PollContentViewUndisclosed_null_PollContentViewUndisclosed-Night-7_9_null,NEXUS_5,1.0,en]",19881,], +["ui_S_t[f.poll.impl.history_PollHistoryView_null_PollHistoryView-Day-1_2_null_0,NEXUS_5,1.0,en]","ui_S_t[f.poll.impl.history_PollHistoryView_null_PollHistoryView-Night-1_3_null_0,NEXUS_5,1.0,en]",19881,], +["ui_S_t[f.poll.impl.history_PollHistoryView_null_PollHistoryView-Day-1_2_null_1,NEXUS_5,1.0,en]","ui_S_t[f.poll.impl.history_PollHistoryView_null_PollHistoryView-Night-1_3_null_1,NEXUS_5,1.0,en]",19881,], +["ui_S_t[f.poll.impl.history_PollHistoryView_null_PollHistoryView-Day-1_2_null_2,NEXUS_5,1.0,en]","ui_S_t[f.poll.impl.history_PollHistoryView_null_PollHistoryView-Night-1_3_null_2,NEXUS_5,1.0,en]",19881,], +["ui_S_t[f.poll.impl.history_PollHistoryView_null_PollHistoryView-Day-1_2_null_3,NEXUS_5,1.0,en]","ui_S_t[f.poll.impl.history_PollHistoryView_null_PollHistoryView-Night-1_3_null_3,NEXUS_5,1.0,en]",19881,], +["ui_S_t[f.poll.impl.history_PollHistoryView_null_PollHistoryView-Day-1_2_null_4,NEXUS_5,1.0,en]","ui_S_t[f.poll.impl.history_PollHistoryView_null_PollHistoryView-Night-1_3_null_4,NEXUS_5,1.0,en]",19881,], ["ui_S_t[l.designsystem.components.preferences_PreferenceCategory_null_Preferences_PreferenceCategory_0_null,NEXUS_5,1.0,en]","",0,], ["ui_S_t[l.designsystem.components.preferences_PreferenceCheckbox_null_Preferences_PreferenceCheckbox_0_null,NEXUS_5,1.0,en]","",0,], ["ui_S_t[l.designsystem.components.preferences_PreferenceDivider_null_Preferences_PreferenceDivider_0_null,NEXUS_5,1.0,en]","",0,], @@ -530,180 +530,181 @@ export const screenshots = [ ["ui_S_t[l.designsystem.components.preferences_PreferenceTextLight_null_Preferences_PreferenceTextLight_0_null,NEXUS_5,1.0,en]","",0,], ["ui_S_t[l.designsystem.components.preferences_PreferenceTextWithEndBadgeDark_null_Preferences_PreferenceTextWithEndBadgeDark_0_null,NEXUS_5,1.0,en]","",0,], ["ui_S_t[l.designsystem.components.preferences_PreferenceTextWithEndBadgeLight_null_Preferences_PreferenceTextWithEndBadgeLight_0_null,NEXUS_5,1.0,en]","",0,], -["ui_S_t[f.preferences.impl.root_PreferencesRootViewDark_null_PreferencesRootViewDark--1_1_null_0,NEXUS_5,1.0,en]","",19874,], -["ui_S_t[f.preferences.impl.root_PreferencesRootViewDark_null_PreferencesRootViewDark--1_1_null_1,NEXUS_5,1.0,en]","",19874,], -["ui_S_t[f.preferences.impl.root_PreferencesRootViewLight_null_PreferencesRootViewLight--0_0_null_0,NEXUS_5,1.0,en]","",19874,], -["ui_S_t[f.preferences.impl.root_PreferencesRootViewLight_null_PreferencesRootViewLight--0_0_null_1,NEXUS_5,1.0,en]","",19874,], +["ui_S_t[f.preferences.impl.root_PreferencesRootViewDark_null_PreferencesRootViewDark--1_1_null_0,NEXUS_5,1.0,en]","",19881,], +["ui_S_t[f.preferences.impl.root_PreferencesRootViewDark_null_PreferencesRootViewDark--1_1_null_1,NEXUS_5,1.0,en]","",19881,], +["ui_S_t[f.preferences.impl.root_PreferencesRootViewLight_null_PreferencesRootViewLight--0_0_null_0,NEXUS_5,1.0,en]","",19881,], +["ui_S_t[f.preferences.impl.root_PreferencesRootViewLight_null_PreferencesRootViewLight--0_0_null_1,NEXUS_5,1.0,en]","",19881,], ["ui_S_t[f.messages.impl.timeline.components.event_ProgressButton_null_ProgressButton-Day-54_54_null,NEXUS_5,1.0,en]","ui_S_t[f.messages.impl.timeline.components.event_ProgressButton_null_ProgressButton-Night-54_55_null,NEXUS_5,1.0,en]",0,], -["ui_S_t[l.designsystem.components_ProgressDialogContent_null_Dialogs_ProgressDialogContent_0_null,NEXUS_5,1.0,en]","",19874,], -["ui_S_t[l.designsystem.components_ProgressDialog_null_ProgressDialog-Day_0_null,NEXUS_5,1.0,en]","ui_S_t[l.designsystem.components_ProgressDialog_null_ProgressDialog-Night_1_null,NEXUS_5,1.0,en]",19874,], -["ui_S_t[f.login.impl.screens.qrcode.confirmation_QrCodeConfirmationView_null_QrCodeConfirmationView-Day-7_8_null_0,NEXUS_5,1.0,en]","ui_S_t[f.login.impl.screens.qrcode.confirmation_QrCodeConfirmationView_null_QrCodeConfirmationView-Night-7_9_null_0,NEXUS_5,1.0,en]",19877,], -["ui_S_t[f.login.impl.screens.qrcode.confirmation_QrCodeConfirmationView_null_QrCodeConfirmationView-Day-7_8_null_1,NEXUS_5,1.0,en]","ui_S_t[f.login.impl.screens.qrcode.confirmation_QrCodeConfirmationView_null_QrCodeConfirmationView-Night-7_9_null_1,NEXUS_5,1.0,en]",19877,], -["ui_S_t[f.login.impl.screens.qrcode.confirmation_QrCodeConfirmationView_null_QrCodeConfirmationView-Day-7_8_null_2,NEXUS_5,1.0,en]","ui_S_t[f.login.impl.screens.qrcode.confirmation_QrCodeConfirmationView_null_QrCodeConfirmationView-Night-7_9_null_2,NEXUS_5,1.0,en]",19877,], -["ui_S_t[f.login.impl.screens.qrcode.error_QrCodeErrorView_null_QrCodeErrorView-Day-8_9_null_0,NEXUS_5,1.0,en]","ui_S_t[f.login.impl.screens.qrcode.error_QrCodeErrorView_null_QrCodeErrorView-Night-8_10_null_0,NEXUS_5,1.0,en]",19877,], -["ui_S_t[f.login.impl.screens.qrcode.error_QrCodeErrorView_null_QrCodeErrorView-Day-8_9_null_1,NEXUS_5,1.0,en]","ui_S_t[f.login.impl.screens.qrcode.error_QrCodeErrorView_null_QrCodeErrorView-Night-8_10_null_1,NEXUS_5,1.0,en]",19877,], -["ui_S_t[f.login.impl.screens.qrcode.error_QrCodeErrorView_null_QrCodeErrorView-Day-8_9_null_2,NEXUS_5,1.0,en]","ui_S_t[f.login.impl.screens.qrcode.error_QrCodeErrorView_null_QrCodeErrorView-Night-8_10_null_2,NEXUS_5,1.0,en]",19877,], -["ui_S_t[f.login.impl.screens.qrcode.error_QrCodeErrorView_null_QrCodeErrorView-Day-8_9_null_3,NEXUS_5,1.0,en]","ui_S_t[f.login.impl.screens.qrcode.error_QrCodeErrorView_null_QrCodeErrorView-Night-8_10_null_3,NEXUS_5,1.0,en]",19877,], -["ui_S_t[f.login.impl.screens.qrcode.error_QrCodeErrorView_null_QrCodeErrorView-Day-8_9_null_4,NEXUS_5,1.0,en]","ui_S_t[f.login.impl.screens.qrcode.error_QrCodeErrorView_null_QrCodeErrorView-Night-8_10_null_4,NEXUS_5,1.0,en]",19877,], -["ui_S_t[f.login.impl.screens.qrcode.error_QrCodeErrorView_null_QrCodeErrorView-Day-8_9_null_5,NEXUS_5,1.0,en]","ui_S_t[f.login.impl.screens.qrcode.error_QrCodeErrorView_null_QrCodeErrorView-Night-8_10_null_5,NEXUS_5,1.0,en]",19877,], -["ui_S_t[f.login.impl.screens.qrcode.error_QrCodeErrorView_null_QrCodeErrorView-Day-8_9_null_6,NEXUS_5,1.0,en]","ui_S_t[f.login.impl.screens.qrcode.error_QrCodeErrorView_null_QrCodeErrorView-Night-8_10_null_6,NEXUS_5,1.0,en]",19877,], -["ui_S_t[f.login.impl.screens.qrcode.intro_QrCodeIntroView_null_QrCodeIntroView-Day-9_10_null_0,NEXUS_5,1.0,en]","ui_S_t[f.login.impl.screens.qrcode.intro_QrCodeIntroView_null_QrCodeIntroView-Night-9_11_null_0,NEXUS_5,1.0,en]",19877,], -["ui_S_t[f.login.impl.screens.qrcode.intro_QrCodeIntroView_null_QrCodeIntroView-Day-9_10_null_1,NEXUS_5,1.0,en]","ui_S_t[f.login.impl.screens.qrcode.intro_QrCodeIntroView_null_QrCodeIntroView-Night-9_11_null_1,NEXUS_5,1.0,en]",19877,], -["ui_S_t[f.login.impl.screens.qrcode.scan_QrCodeScanView_null_QrCodeScanView-Day-10_11_null_0,NEXUS_5,1.0,en]","ui_S_t[f.login.impl.screens.qrcode.scan_QrCodeScanView_null_QrCodeScanView-Night-10_12_null_0,NEXUS_5,1.0,en]",19877,], -["ui_S_t[f.login.impl.screens.qrcode.scan_QrCodeScanView_null_QrCodeScanView-Day-10_11_null_1,NEXUS_5,1.0,en]","ui_S_t[f.login.impl.screens.qrcode.scan_QrCodeScanView_null_QrCodeScanView-Night-10_12_null_1,NEXUS_5,1.0,en]",19877,], -["ui_S_t[f.login.impl.screens.qrcode.scan_QrCodeScanView_null_QrCodeScanView-Day-10_11_null_2,NEXUS_5,1.0,en]","ui_S_t[f.login.impl.screens.qrcode.scan_QrCodeScanView_null_QrCodeScanView-Night-10_12_null_2,NEXUS_5,1.0,en]",19877,], -["ui_S_t[f.login.impl.screens.qrcode.scan_QrCodeScanView_null_QrCodeScanView-Day-10_11_null_3,NEXUS_5,1.0,en]","ui_S_t[f.login.impl.screens.qrcode.scan_QrCodeScanView_null_QrCodeScanView-Night-10_12_null_3,NEXUS_5,1.0,en]",19877,], +["ui_S_t[l.designsystem.components_ProgressDialogContent_null_Dialogs_ProgressDialogContent_0_null,NEXUS_5,1.0,en]","",19881,], +["ui_S_t[l.designsystem.components_ProgressDialog_null_ProgressDialog-Day_0_null,NEXUS_5,1.0,en]","ui_S_t[l.designsystem.components_ProgressDialog_null_ProgressDialog-Night_1_null,NEXUS_5,1.0,en]",19881,], +["ui_S_t[f.login.impl.screens.qrcode.confirmation_QrCodeConfirmationView_null_QrCodeConfirmationView-Day-7_8_null_0,NEXUS_5,1.0,en]","ui_S_t[f.login.impl.screens.qrcode.confirmation_QrCodeConfirmationView_null_QrCodeConfirmationView-Night-7_9_null_0,NEXUS_5,1.0,en]",19881,], +["ui_S_t[f.login.impl.screens.qrcode.confirmation_QrCodeConfirmationView_null_QrCodeConfirmationView-Day-7_8_null_1,NEXUS_5,1.0,en]","ui_S_t[f.login.impl.screens.qrcode.confirmation_QrCodeConfirmationView_null_QrCodeConfirmationView-Night-7_9_null_1,NEXUS_5,1.0,en]",19881,], +["ui_S_t[f.login.impl.screens.qrcode.confirmation_QrCodeConfirmationView_null_QrCodeConfirmationView-Day-7_8_null_2,NEXUS_5,1.0,en]","ui_S_t[f.login.impl.screens.qrcode.confirmation_QrCodeConfirmationView_null_QrCodeConfirmationView-Night-7_9_null_2,NEXUS_5,1.0,en]",19881,], +["ui_S_t[f.login.impl.screens.qrcode.error_QrCodeErrorView_null_QrCodeErrorView-Day-8_9_null_0,NEXUS_5,1.0,en]","ui_S_t[f.login.impl.screens.qrcode.error_QrCodeErrorView_null_QrCodeErrorView-Night-8_10_null_0,NEXUS_5,1.0,en]",19881,], +["ui_S_t[f.login.impl.screens.qrcode.error_QrCodeErrorView_null_QrCodeErrorView-Day-8_9_null_1,NEXUS_5,1.0,en]","ui_S_t[f.login.impl.screens.qrcode.error_QrCodeErrorView_null_QrCodeErrorView-Night-8_10_null_1,NEXUS_5,1.0,en]",19881,], +["ui_S_t[f.login.impl.screens.qrcode.error_QrCodeErrorView_null_QrCodeErrorView-Day-8_9_null_2,NEXUS_5,1.0,en]","ui_S_t[f.login.impl.screens.qrcode.error_QrCodeErrorView_null_QrCodeErrorView-Night-8_10_null_2,NEXUS_5,1.0,en]",19881,], +["ui_S_t[f.login.impl.screens.qrcode.error_QrCodeErrorView_null_QrCodeErrorView-Day-8_9_null_3,NEXUS_5,1.0,en]","ui_S_t[f.login.impl.screens.qrcode.error_QrCodeErrorView_null_QrCodeErrorView-Night-8_10_null_3,NEXUS_5,1.0,en]",19881,], +["ui_S_t[f.login.impl.screens.qrcode.error_QrCodeErrorView_null_QrCodeErrorView-Day-8_9_null_4,NEXUS_5,1.0,en]","ui_S_t[f.login.impl.screens.qrcode.error_QrCodeErrorView_null_QrCodeErrorView-Night-8_10_null_4,NEXUS_5,1.0,en]",19881,], +["ui_S_t[f.login.impl.screens.qrcode.error_QrCodeErrorView_null_QrCodeErrorView-Day-8_9_null_5,NEXUS_5,1.0,en]","ui_S_t[f.login.impl.screens.qrcode.error_QrCodeErrorView_null_QrCodeErrorView-Night-8_10_null_5,NEXUS_5,1.0,en]",19881,], +["ui_S_t[f.login.impl.screens.qrcode.error_QrCodeErrorView_null_QrCodeErrorView-Day-8_9_null_6,NEXUS_5,1.0,en]","ui_S_t[f.login.impl.screens.qrcode.error_QrCodeErrorView_null_QrCodeErrorView-Night-8_10_null_6,NEXUS_5,1.0,en]",19881,], +["ui_S_t[f.login.impl.screens.qrcode.intro_QrCodeIntroView_null_QrCodeIntroView-Day-9_10_null_0,NEXUS_5,1.0,en]","ui_S_t[f.login.impl.screens.qrcode.intro_QrCodeIntroView_null_QrCodeIntroView-Night-9_11_null_0,NEXUS_5,1.0,en]",19881,], +["ui_S_t[f.login.impl.screens.qrcode.intro_QrCodeIntroView_null_QrCodeIntroView-Day-9_10_null_1,NEXUS_5,1.0,en]","ui_S_t[f.login.impl.screens.qrcode.intro_QrCodeIntroView_null_QrCodeIntroView-Night-9_11_null_1,NEXUS_5,1.0,en]",19881,], +["ui_S_t[f.login.impl.screens.qrcode.scan_QrCodeScanView_null_QrCodeScanView-Day-10_11_null_0,NEXUS_5,1.0,en]","ui_S_t[f.login.impl.screens.qrcode.scan_QrCodeScanView_null_QrCodeScanView-Night-10_12_null_0,NEXUS_5,1.0,en]",19881,], +["ui_S_t[f.login.impl.screens.qrcode.scan_QrCodeScanView_null_QrCodeScanView-Day-10_11_null_1,NEXUS_5,1.0,en]","ui_S_t[f.login.impl.screens.qrcode.scan_QrCodeScanView_null_QrCodeScanView-Night-10_12_null_1,NEXUS_5,1.0,en]",19881,], +["ui_S_t[f.login.impl.screens.qrcode.scan_QrCodeScanView_null_QrCodeScanView-Day-10_11_null_2,NEXUS_5,1.0,en]","ui_S_t[f.login.impl.screens.qrcode.scan_QrCodeScanView_null_QrCodeScanView-Night-10_12_null_2,NEXUS_5,1.0,en]",19881,], +["ui_S_t[f.login.impl.screens.qrcode.scan_QrCodeScanView_null_QrCodeScanView-Day-10_11_null_3,NEXUS_5,1.0,en]","ui_S_t[f.login.impl.screens.qrcode.scan_QrCodeScanView_null_QrCodeScanView-Night-10_12_null_3,NEXUS_5,1.0,en]",19881,], ["ui_S_t[l.designsystem.theme.components_RadioButton_null_Toggles_RadioButton_0_null,NEXUS_5,1.0,en]","",0,], -["ui_S_t[f.rageshake.api.detection_RageshakeDialogContent_null_RageshakeDialogContent-Day-1_2_null,NEXUS_5,1.0,en]","ui_S_t[f.rageshake.api.detection_RageshakeDialogContent_null_RageshakeDialogContent-Night-1_3_null,NEXUS_5,1.0,en]",19874,], -["ui_S_t[f.rageshake.api.preferences_RageshakePreferencesView_null_RageshakePreferencesView-Day-2_3_null_0,NEXUS_5,1.0,en]","ui_S_t[f.rageshake.api.preferences_RageshakePreferencesView_null_RageshakePreferencesView-Night-2_4_null_0,NEXUS_5,1.0,en]",19874,], +["ui_S_t[f.rageshake.api.detection_RageshakeDialogContent_null_RageshakeDialogContent-Day-1_2_null,NEXUS_5,1.0,en]","ui_S_t[f.rageshake.api.detection_RageshakeDialogContent_null_RageshakeDialogContent-Night-1_3_null,NEXUS_5,1.0,en]",19881,], +["ui_S_t[f.rageshake.api.preferences_RageshakePreferencesView_null_RageshakePreferencesView-Day-2_3_null_0,NEXUS_5,1.0,en]","ui_S_t[f.rageshake.api.preferences_RageshakePreferencesView_null_RageshakePreferencesView-Night-2_4_null_0,NEXUS_5,1.0,en]",19881,], ["ui_S_t[f.rageshake.api.preferences_RageshakePreferencesView_null_RageshakePreferencesView-Day-2_3_null_1,NEXUS_5,1.0,en]","ui_S_t[f.rageshake.api.preferences_RageshakePreferencesView_null_RageshakePreferencesView-Night-2_4_null_1,NEXUS_5,1.0,en]",0,], -["ui_S_t[f.messages.impl.timeline.components.receipt.bottomsheet_ReadReceiptBottomSheet_null_ReadReceiptBottomSheet-Day-58_58_null_0,NEXUS_5,1.0,en]","ui_S_t[f.messages.impl.timeline.components.receipt.bottomsheet_ReadReceiptBottomSheet_null_ReadReceiptBottomSheet-Night-58_59_null_0,NEXUS_5,1.0,en]",19874,], -["ui_S_t[f.messages.impl.timeline.components.receipt.bottomsheet_ReadReceiptBottomSheet_null_ReadReceiptBottomSheet-Day-58_58_null_1,NEXUS_5,1.0,en]","ui_S_t[f.messages.impl.timeline.components.receipt.bottomsheet_ReadReceiptBottomSheet_null_ReadReceiptBottomSheet-Night-58_59_null_1,NEXUS_5,1.0,en]",19874,], -["ui_S_t[f.messages.impl.timeline.components.receipt.bottomsheet_ReadReceiptBottomSheet_null_ReadReceiptBottomSheet-Day-58_58_null_2,NEXUS_5,1.0,en]","ui_S_t[f.messages.impl.timeline.components.receipt.bottomsheet_ReadReceiptBottomSheet_null_ReadReceiptBottomSheet-Night-58_59_null_2,NEXUS_5,1.0,en]",19874,], -["ui_S_t[f.messages.impl.timeline.components.receipt.bottomsheet_ReadReceiptBottomSheet_null_ReadReceiptBottomSheet-Day-58_58_null_3,NEXUS_5,1.0,en]","ui_S_t[f.messages.impl.timeline.components.receipt.bottomsheet_ReadReceiptBottomSheet_null_ReadReceiptBottomSheet-Night-58_59_null_3,NEXUS_5,1.0,en]",19874,], -["ui_S_t[f.messages.impl.timeline.components.receipt.bottomsheet_ReadReceiptBottomSheet_null_ReadReceiptBottomSheet-Day-58_58_null_4,NEXUS_5,1.0,en]","ui_S_t[f.messages.impl.timeline.components.receipt.bottomsheet_ReadReceiptBottomSheet_null_ReadReceiptBottomSheet-Night-58_59_null_4,NEXUS_5,1.0,en]",19874,], -["ui_S_t[f.messages.impl.timeline.components.receipt.bottomsheet_ReadReceiptBottomSheet_null_ReadReceiptBottomSheet-Day-58_58_null_5,NEXUS_5,1.0,en]","ui_S_t[f.messages.impl.timeline.components.receipt.bottomsheet_ReadReceiptBottomSheet_null_ReadReceiptBottomSheet-Night-58_59_null_5,NEXUS_5,1.0,en]",19874,], -["ui_S_t[f.securebackup.impl.setup.views_RecoveryKeyView_null_RecoveryKeyView-Day-7_8_null_0,NEXUS_5,1.0,en]","ui_S_t[f.securebackup.impl.setup.views_RecoveryKeyView_null_RecoveryKeyView-Night-7_9_null_0,NEXUS_5,1.0,en]",19874,], -["ui_S_t[f.securebackup.impl.setup.views_RecoveryKeyView_null_RecoveryKeyView-Day-7_8_null_1,NEXUS_5,1.0,en]","ui_S_t[f.securebackup.impl.setup.views_RecoveryKeyView_null_RecoveryKeyView-Night-7_9_null_1,NEXUS_5,1.0,en]",19874,], -["ui_S_t[f.securebackup.impl.setup.views_RecoveryKeyView_null_RecoveryKeyView-Day-7_8_null_10,NEXUS_5,1.0,en]","ui_S_t[f.securebackup.impl.setup.views_RecoveryKeyView_null_RecoveryKeyView-Night-7_9_null_10,NEXUS_5,1.0,en]",19874,], -["ui_S_t[f.securebackup.impl.setup.views_RecoveryKeyView_null_RecoveryKeyView-Day-7_8_null_11,NEXUS_5,1.0,en]","ui_S_t[f.securebackup.impl.setup.views_RecoveryKeyView_null_RecoveryKeyView-Night-7_9_null_11,NEXUS_5,1.0,en]",19874,], -["ui_S_t[f.securebackup.impl.setup.views_RecoveryKeyView_null_RecoveryKeyView-Day-7_8_null_2,NEXUS_5,1.0,en]","ui_S_t[f.securebackup.impl.setup.views_RecoveryKeyView_null_RecoveryKeyView-Night-7_9_null_2,NEXUS_5,1.0,en]",19874,], -["ui_S_t[f.securebackup.impl.setup.views_RecoveryKeyView_null_RecoveryKeyView-Day-7_8_null_3,NEXUS_5,1.0,en]","ui_S_t[f.securebackup.impl.setup.views_RecoveryKeyView_null_RecoveryKeyView-Night-7_9_null_3,NEXUS_5,1.0,en]",19874,], -["ui_S_t[f.securebackup.impl.setup.views_RecoveryKeyView_null_RecoveryKeyView-Day-7_8_null_4,NEXUS_5,1.0,en]","ui_S_t[f.securebackup.impl.setup.views_RecoveryKeyView_null_RecoveryKeyView-Night-7_9_null_4,NEXUS_5,1.0,en]",19874,], -["ui_S_t[f.securebackup.impl.setup.views_RecoveryKeyView_null_RecoveryKeyView-Day-7_8_null_5,NEXUS_5,1.0,en]","ui_S_t[f.securebackup.impl.setup.views_RecoveryKeyView_null_RecoveryKeyView-Night-7_9_null_5,NEXUS_5,1.0,en]",19874,], -["ui_S_t[f.securebackup.impl.setup.views_RecoveryKeyView_null_RecoveryKeyView-Day-7_8_null_6,NEXUS_5,1.0,en]","ui_S_t[f.securebackup.impl.setup.views_RecoveryKeyView_null_RecoveryKeyView-Night-7_9_null_6,NEXUS_5,1.0,en]",19874,], -["ui_S_t[f.securebackup.impl.setup.views_RecoveryKeyView_null_RecoveryKeyView-Day-7_8_null_7,NEXUS_5,1.0,en]","ui_S_t[f.securebackup.impl.setup.views_RecoveryKeyView_null_RecoveryKeyView-Night-7_9_null_7,NEXUS_5,1.0,en]",19874,], -["ui_S_t[f.securebackup.impl.setup.views_RecoveryKeyView_null_RecoveryKeyView-Day-7_8_null_8,NEXUS_5,1.0,en]","ui_S_t[f.securebackup.impl.setup.views_RecoveryKeyView_null_RecoveryKeyView-Night-7_9_null_8,NEXUS_5,1.0,en]",19874,], -["ui_S_t[f.securebackup.impl.setup.views_RecoveryKeyView_null_RecoveryKeyView-Day-7_8_null_9,NEXUS_5,1.0,en]","ui_S_t[f.securebackup.impl.setup.views_RecoveryKeyView_null_RecoveryKeyView-Night-7_9_null_9,NEXUS_5,1.0,en]",19874,], +["ui_S_t[f.messages.impl.timeline.components.receipt.bottomsheet_ReadReceiptBottomSheet_null_ReadReceiptBottomSheet-Day-58_58_null_0,NEXUS_5,1.0,en]","ui_S_t[f.messages.impl.timeline.components.receipt.bottomsheet_ReadReceiptBottomSheet_null_ReadReceiptBottomSheet-Night-58_59_null_0,NEXUS_5,1.0,en]",19881,], +["ui_S_t[f.messages.impl.timeline.components.receipt.bottomsheet_ReadReceiptBottomSheet_null_ReadReceiptBottomSheet-Day-58_58_null_1,NEXUS_5,1.0,en]","ui_S_t[f.messages.impl.timeline.components.receipt.bottomsheet_ReadReceiptBottomSheet_null_ReadReceiptBottomSheet-Night-58_59_null_1,NEXUS_5,1.0,en]",19881,], +["ui_S_t[f.messages.impl.timeline.components.receipt.bottomsheet_ReadReceiptBottomSheet_null_ReadReceiptBottomSheet-Day-58_58_null_2,NEXUS_5,1.0,en]","ui_S_t[f.messages.impl.timeline.components.receipt.bottomsheet_ReadReceiptBottomSheet_null_ReadReceiptBottomSheet-Night-58_59_null_2,NEXUS_5,1.0,en]",19881,], +["ui_S_t[f.messages.impl.timeline.components.receipt.bottomsheet_ReadReceiptBottomSheet_null_ReadReceiptBottomSheet-Day-58_58_null_3,NEXUS_5,1.0,en]","ui_S_t[f.messages.impl.timeline.components.receipt.bottomsheet_ReadReceiptBottomSheet_null_ReadReceiptBottomSheet-Night-58_59_null_3,NEXUS_5,1.0,en]",19881,], +["ui_S_t[f.messages.impl.timeline.components.receipt.bottomsheet_ReadReceiptBottomSheet_null_ReadReceiptBottomSheet-Day-58_58_null_4,NEXUS_5,1.0,en]","ui_S_t[f.messages.impl.timeline.components.receipt.bottomsheet_ReadReceiptBottomSheet_null_ReadReceiptBottomSheet-Night-58_59_null_4,NEXUS_5,1.0,en]",19881,], +["ui_S_t[f.messages.impl.timeline.components.receipt.bottomsheet_ReadReceiptBottomSheet_null_ReadReceiptBottomSheet-Day-58_58_null_5,NEXUS_5,1.0,en]","ui_S_t[f.messages.impl.timeline.components.receipt.bottomsheet_ReadReceiptBottomSheet_null_ReadReceiptBottomSheet-Night-58_59_null_5,NEXUS_5,1.0,en]",19881,], +["ui_S_t[f.securebackup.impl.setup.views_RecoveryKeyView_null_RecoveryKeyView-Day-7_8_null_0,NEXUS_5,1.0,en]","ui_S_t[f.securebackup.impl.setup.views_RecoveryKeyView_null_RecoveryKeyView-Night-7_9_null_0,NEXUS_5,1.0,en]",19881,], +["ui_S_t[f.securebackup.impl.setup.views_RecoveryKeyView_null_RecoveryKeyView-Day-7_8_null_1,NEXUS_5,1.0,en]","ui_S_t[f.securebackup.impl.setup.views_RecoveryKeyView_null_RecoveryKeyView-Night-7_9_null_1,NEXUS_5,1.0,en]",19881,], +["ui_S_t[f.securebackup.impl.setup.views_RecoveryKeyView_null_RecoveryKeyView-Day-7_8_null_10,NEXUS_5,1.0,en]","ui_S_t[f.securebackup.impl.setup.views_RecoveryKeyView_null_RecoveryKeyView-Night-7_9_null_10,NEXUS_5,1.0,en]",19881,], +["ui_S_t[f.securebackup.impl.setup.views_RecoveryKeyView_null_RecoveryKeyView-Day-7_8_null_11,NEXUS_5,1.0,en]","ui_S_t[f.securebackup.impl.setup.views_RecoveryKeyView_null_RecoveryKeyView-Night-7_9_null_11,NEXUS_5,1.0,en]",19881,], +["ui_S_t[f.securebackup.impl.setup.views_RecoveryKeyView_null_RecoveryKeyView-Day-7_8_null_2,NEXUS_5,1.0,en]","ui_S_t[f.securebackup.impl.setup.views_RecoveryKeyView_null_RecoveryKeyView-Night-7_9_null_2,NEXUS_5,1.0,en]",19881,], +["ui_S_t[f.securebackup.impl.setup.views_RecoveryKeyView_null_RecoveryKeyView-Day-7_8_null_3,NEXUS_5,1.0,en]","ui_S_t[f.securebackup.impl.setup.views_RecoveryKeyView_null_RecoveryKeyView-Night-7_9_null_3,NEXUS_5,1.0,en]",19881,], +["ui_S_t[f.securebackup.impl.setup.views_RecoveryKeyView_null_RecoveryKeyView-Day-7_8_null_4,NEXUS_5,1.0,en]","ui_S_t[f.securebackup.impl.setup.views_RecoveryKeyView_null_RecoveryKeyView-Night-7_9_null_4,NEXUS_5,1.0,en]",19881,], +["ui_S_t[f.securebackup.impl.setup.views_RecoveryKeyView_null_RecoveryKeyView-Day-7_8_null_5,NEXUS_5,1.0,en]","ui_S_t[f.securebackup.impl.setup.views_RecoveryKeyView_null_RecoveryKeyView-Night-7_9_null_5,NEXUS_5,1.0,en]",19881,], +["ui_S_t[f.securebackup.impl.setup.views_RecoveryKeyView_null_RecoveryKeyView-Day-7_8_null_6,NEXUS_5,1.0,en]","ui_S_t[f.securebackup.impl.setup.views_RecoveryKeyView_null_RecoveryKeyView-Night-7_9_null_6,NEXUS_5,1.0,en]",19881,], +["ui_S_t[f.securebackup.impl.setup.views_RecoveryKeyView_null_RecoveryKeyView-Day-7_8_null_7,NEXUS_5,1.0,en]","ui_S_t[f.securebackup.impl.setup.views_RecoveryKeyView_null_RecoveryKeyView-Night-7_9_null_7,NEXUS_5,1.0,en]",19881,], +["ui_S_t[f.securebackup.impl.setup.views_RecoveryKeyView_null_RecoveryKeyView-Day-7_8_null_8,NEXUS_5,1.0,en]","ui_S_t[f.securebackup.impl.setup.views_RecoveryKeyView_null_RecoveryKeyView-Night-7_9_null_8,NEXUS_5,1.0,en]",19881,], +["ui_S_t[f.securebackup.impl.setup.views_RecoveryKeyView_null_RecoveryKeyView-Day-7_8_null_9,NEXUS_5,1.0,en]","ui_S_t[f.securebackup.impl.setup.views_RecoveryKeyView_null_RecoveryKeyView-Night-7_9_null_9,NEXUS_5,1.0,en]",19881,], ["ui_S_t[l.designsystem.atomic.atoms_RedIndicatorAtom_null_RedIndicatorAtom-Day_0_null,NEXUS_5,1.0,en]","ui_S_t[l.designsystem.atomic.atoms_RedIndicatorAtom_null_RedIndicatorAtom-Night_1_null,NEXUS_5,1.0,en]",0,], ["ui_S_t[f.messages.impl.timeline.components_ReplySwipeIndicator_null_ReplySwipeIndicator-Day-15_15_null,NEXUS_5,1.0,en]","ui_S_t[f.messages.impl.timeline.components_ReplySwipeIndicator_null_ReplySwipeIndicator-Night-15_16_null,NEXUS_5,1.0,en]",0,], -["ui_S_t[f.messages.impl.report_ReportMessageView_null_ReportMessageView-Day-7_7_null_0,NEXUS_5,1.0,en]","ui_S_t[f.messages.impl.report_ReportMessageView_null_ReportMessageView-Night-7_8_null_0,NEXUS_5,1.0,en]",19874,], -["ui_S_t[f.messages.impl.report_ReportMessageView_null_ReportMessageView-Day-7_7_null_1,NEXUS_5,1.0,en]","ui_S_t[f.messages.impl.report_ReportMessageView_null_ReportMessageView-Night-7_8_null_1,NEXUS_5,1.0,en]",19874,], -["ui_S_t[f.messages.impl.report_ReportMessageView_null_ReportMessageView-Day-7_7_null_2,NEXUS_5,1.0,en]","ui_S_t[f.messages.impl.report_ReportMessageView_null_ReportMessageView-Night-7_8_null_2,NEXUS_5,1.0,en]",19874,], -["ui_S_t[f.messages.impl.report_ReportMessageView_null_ReportMessageView-Day-7_7_null_3,NEXUS_5,1.0,en]","ui_S_t[f.messages.impl.report_ReportMessageView_null_ReportMessageView-Night-7_8_null_3,NEXUS_5,1.0,en]",19874,], -["ui_S_t[f.messages.impl.report_ReportMessageView_null_ReportMessageView-Day-7_7_null_4,NEXUS_5,1.0,en]","ui_S_t[f.messages.impl.report_ReportMessageView_null_ReportMessageView-Night-7_8_null_4,NEXUS_5,1.0,en]",19874,], -["ui_S_t[f.messages.impl.report_ReportMessageView_null_ReportMessageView-Day-7_7_null_5,NEXUS_5,1.0,en]","ui_S_t[f.messages.impl.report_ReportMessageView_null_ReportMessageView-Night-7_8_null_5,NEXUS_5,1.0,en]",19874,], -["ui_S_t[l.designsystem.components.dialogs_RetryDialogContent_null_Dialogs_RetryDialogContent_0_null,NEXUS_5,1.0,en]","",19874,], -["ui_S_t[l.designsystem.components.dialogs_RetryDialog_null_RetryDialog-Day_0_null,NEXUS_5,1.0,en]","ui_S_t[l.designsystem.components.dialogs_RetryDialog_null_RetryDialog-Night_1_null,NEXUS_5,1.0,en]",19874,], +["ui_S_t[f.messages.impl.report_ReportMessageView_null_ReportMessageView-Day-7_7_null_0,NEXUS_5,1.0,en]","ui_S_t[f.messages.impl.report_ReportMessageView_null_ReportMessageView-Night-7_8_null_0,NEXUS_5,1.0,en]",19881,], +["ui_S_t[f.messages.impl.report_ReportMessageView_null_ReportMessageView-Day-7_7_null_1,NEXUS_5,1.0,en]","ui_S_t[f.messages.impl.report_ReportMessageView_null_ReportMessageView-Night-7_8_null_1,NEXUS_5,1.0,en]",19881,], +["ui_S_t[f.messages.impl.report_ReportMessageView_null_ReportMessageView-Day-7_7_null_2,NEXUS_5,1.0,en]","ui_S_t[f.messages.impl.report_ReportMessageView_null_ReportMessageView-Night-7_8_null_2,NEXUS_5,1.0,en]",19881,], +["ui_S_t[f.messages.impl.report_ReportMessageView_null_ReportMessageView-Day-7_7_null_3,NEXUS_5,1.0,en]","ui_S_t[f.messages.impl.report_ReportMessageView_null_ReportMessageView-Night-7_8_null_3,NEXUS_5,1.0,en]",19881,], +["ui_S_t[f.messages.impl.report_ReportMessageView_null_ReportMessageView-Day-7_7_null_4,NEXUS_5,1.0,en]","ui_S_t[f.messages.impl.report_ReportMessageView_null_ReportMessageView-Night-7_8_null_4,NEXUS_5,1.0,en]",19881,], +["ui_S_t[f.messages.impl.report_ReportMessageView_null_ReportMessageView-Day-7_7_null_5,NEXUS_5,1.0,en]","ui_S_t[f.messages.impl.report_ReportMessageView_null_ReportMessageView-Night-7_8_null_5,NEXUS_5,1.0,en]",19881,], +["ui_S_t[l.designsystem.components.dialogs_RetryDialogContent_null_Dialogs_RetryDialogContent_0_null,NEXUS_5,1.0,en]","",19881,], +["ui_S_t[l.designsystem.components.dialogs_RetryDialog_null_RetryDialog-Day_0_null,NEXUS_5,1.0,en]","ui_S_t[l.designsystem.components.dialogs_RetryDialog_null_RetryDialog-Night_1_null,NEXUS_5,1.0,en]",19881,], ["ui_S_t[f.messages.impl.timeline.components.retrysendmenu_RetrySendMessageMenu_null_RetrySendMessageMenu-Day-59_59_null_0,NEXUS_5,1.0,en]","ui_S_t[f.messages.impl.timeline.components.retrysendmenu_RetrySendMessageMenu_null_RetrySendMessageMenu-Night-59_60_null_0,NEXUS_5,1.0,en]",0,], -["ui_S_t[f.messages.impl.timeline.components.retrysendmenu_RetrySendMessageMenu_null_RetrySendMessageMenu-Day-59_59_null_1,NEXUS_5,1.0,en]","ui_S_t[f.messages.impl.timeline.components.retrysendmenu_RetrySendMessageMenu_null_RetrySendMessageMenu-Night-59_60_null_1,NEXUS_5,1.0,en]",19874,], -["ui_S_t[f.roomdetails.impl.rolesandpermissions_RolesAndPermissionsView_null_RolesAndPermissionsView-Day-11_11_null_0,NEXUS_5,1.0,en]","ui_S_t[f.roomdetails.impl.rolesandpermissions_RolesAndPermissionsView_null_RolesAndPermissionsView-Night-11_12_null_0,NEXUS_5,1.0,en]",19874,], -["ui_S_t[f.roomdetails.impl.rolesandpermissions_RolesAndPermissionsView_null_RolesAndPermissionsView-Day-11_11_null_1,NEXUS_5,1.0,en]","ui_S_t[f.roomdetails.impl.rolesandpermissions_RolesAndPermissionsView_null_RolesAndPermissionsView-Night-11_12_null_1,NEXUS_5,1.0,en]",19874,], -["ui_S_t[f.roomdetails.impl.rolesandpermissions_RolesAndPermissionsView_null_RolesAndPermissionsView-Day-11_11_null_2,NEXUS_5,1.0,en]","ui_S_t[f.roomdetails.impl.rolesandpermissions_RolesAndPermissionsView_null_RolesAndPermissionsView-Night-11_12_null_2,NEXUS_5,1.0,en]",19874,], -["ui_S_t[f.roomdetails.impl.rolesandpermissions_RolesAndPermissionsView_null_RolesAndPermissionsView-Day-11_11_null_3,NEXUS_5,1.0,en]","ui_S_t[f.roomdetails.impl.rolesandpermissions_RolesAndPermissionsView_null_RolesAndPermissionsView-Night-11_12_null_3,NEXUS_5,1.0,en]",19874,], -["ui_S_t[f.roomdetails.impl.rolesandpermissions_RolesAndPermissionsView_null_RolesAndPermissionsView-Day-11_11_null_4,NEXUS_5,1.0,en]","ui_S_t[f.roomdetails.impl.rolesandpermissions_RolesAndPermissionsView_null_RolesAndPermissionsView-Night-11_12_null_4,NEXUS_5,1.0,en]",19874,], -["ui_S_t[f.roomdetails.impl.rolesandpermissions_RolesAndPermissionsView_null_RolesAndPermissionsView-Day-11_11_null_5,NEXUS_5,1.0,en]","ui_S_t[f.roomdetails.impl.rolesandpermissions_RolesAndPermissionsView_null_RolesAndPermissionsView-Night-11_12_null_5,NEXUS_5,1.0,en]",19874,], -["ui_S_t[f.roomdetails.impl.rolesandpermissions_RolesAndPermissionsView_null_RolesAndPermissionsView-Day-11_11_null_6,NEXUS_5,1.0,en]","ui_S_t[f.roomdetails.impl.rolesandpermissions_RolesAndPermissionsView_null_RolesAndPermissionsView-Night-11_12_null_6,NEXUS_5,1.0,en]",19874,], -["ui_S_t[f.roomdetails.impl.rolesandpermissions_RolesAndPermissionsView_null_RolesAndPermissionsView-Day-11_11_null_7,NEXUS_5,1.0,en]","ui_S_t[f.roomdetails.impl.rolesandpermissions_RolesAndPermissionsView_null_RolesAndPermissionsView-Night-11_12_null_7,NEXUS_5,1.0,en]",19874,], +["ui_S_t[f.messages.impl.timeline.components.retrysendmenu_RetrySendMessageMenu_null_RetrySendMessageMenu-Day-59_59_null_1,NEXUS_5,1.0,en]","ui_S_t[f.messages.impl.timeline.components.retrysendmenu_RetrySendMessageMenu_null_RetrySendMessageMenu-Night-59_60_null_1,NEXUS_5,1.0,en]",19881,], +["ui_S_t[f.roomdetails.impl.rolesandpermissions_RolesAndPermissionsView_null_RolesAndPermissionsView-Day-11_11_null_0,NEXUS_5,1.0,en]","ui_S_t[f.roomdetails.impl.rolesandpermissions_RolesAndPermissionsView_null_RolesAndPermissionsView-Night-11_12_null_0,NEXUS_5,1.0,en]",19881,], +["ui_S_t[f.roomdetails.impl.rolesandpermissions_RolesAndPermissionsView_null_RolesAndPermissionsView-Day-11_11_null_1,NEXUS_5,1.0,en]","ui_S_t[f.roomdetails.impl.rolesandpermissions_RolesAndPermissionsView_null_RolesAndPermissionsView-Night-11_12_null_1,NEXUS_5,1.0,en]",19881,], +["ui_S_t[f.roomdetails.impl.rolesandpermissions_RolesAndPermissionsView_null_RolesAndPermissionsView-Day-11_11_null_2,NEXUS_5,1.0,en]","ui_S_t[f.roomdetails.impl.rolesandpermissions_RolesAndPermissionsView_null_RolesAndPermissionsView-Night-11_12_null_2,NEXUS_5,1.0,en]",19881,], +["ui_S_t[f.roomdetails.impl.rolesandpermissions_RolesAndPermissionsView_null_RolesAndPermissionsView-Day-11_11_null_3,NEXUS_5,1.0,en]","ui_S_t[f.roomdetails.impl.rolesandpermissions_RolesAndPermissionsView_null_RolesAndPermissionsView-Night-11_12_null_3,NEXUS_5,1.0,en]",19881,], +["ui_S_t[f.roomdetails.impl.rolesandpermissions_RolesAndPermissionsView_null_RolesAndPermissionsView-Day-11_11_null_4,NEXUS_5,1.0,en]","ui_S_t[f.roomdetails.impl.rolesandpermissions_RolesAndPermissionsView_null_RolesAndPermissionsView-Night-11_12_null_4,NEXUS_5,1.0,en]",19881,], +["ui_S_t[f.roomdetails.impl.rolesandpermissions_RolesAndPermissionsView_null_RolesAndPermissionsView-Day-11_11_null_5,NEXUS_5,1.0,en]","ui_S_t[f.roomdetails.impl.rolesandpermissions_RolesAndPermissionsView_null_RolesAndPermissionsView-Night-11_12_null_5,NEXUS_5,1.0,en]",19881,], +["ui_S_t[f.roomdetails.impl.rolesandpermissions_RolesAndPermissionsView_null_RolesAndPermissionsView-Day-11_11_null_6,NEXUS_5,1.0,en]","ui_S_t[f.roomdetails.impl.rolesandpermissions_RolesAndPermissionsView_null_RolesAndPermissionsView-Night-11_12_null_6,NEXUS_5,1.0,en]",19881,], +["ui_S_t[f.roomdetails.impl.rolesandpermissions_RolesAndPermissionsView_null_RolesAndPermissionsView-Day-11_11_null_7,NEXUS_5,1.0,en]","ui_S_t[f.roomdetails.impl.rolesandpermissions_RolesAndPermissionsView_null_RolesAndPermissionsView-Night-11_12_null_7,NEXUS_5,1.0,en]",19881,], ["ui_S_t[f.roomaliasresolver.impl_RoomAliasResolverView_null_RoomAliasResolverView-Day-0_1_null_0,NEXUS_5,1.0,en]","ui_S_t[f.roomaliasresolver.impl_RoomAliasResolverView_null_RoomAliasResolverView-Night-0_2_null_0,NEXUS_5,1.0,en]",0,], ["ui_S_t[f.roomaliasresolver.impl_RoomAliasResolverView_null_RoomAliasResolverView-Day-0_1_null_1,NEXUS_5,1.0,en]","ui_S_t[f.roomaliasresolver.impl_RoomAliasResolverView_null_RoomAliasResolverView-Night-0_2_null_1,NEXUS_5,1.0,en]",0,], -["ui_S_t[f.roomaliasresolver.impl_RoomAliasResolverView_null_RoomAliasResolverView-Day-0_1_null_2,NEXUS_5,1.0,en]","ui_S_t[f.roomaliasresolver.impl_RoomAliasResolverView_null_RoomAliasResolverView-Night-0_2_null_2,NEXUS_5,1.0,en]",19874,], +["ui_S_t[f.roomaliasresolver.impl_RoomAliasResolverView_null_RoomAliasResolverView-Day-0_1_null_2,NEXUS_5,1.0,en]","ui_S_t[f.roomaliasresolver.impl_RoomAliasResolverView_null_RoomAliasResolverView-Night-0_2_null_2,NEXUS_5,1.0,en]",19881,], ["ui_S_t[f.roomdetails.impl.components_RoomBadgeNegative_null_RoomBadgeNegative-Day-2_2_null,NEXUS_5,1.0,en]","ui_S_t[f.roomdetails.impl.components_RoomBadgeNegative_null_RoomBadgeNegative-Night-2_3_null,NEXUS_5,1.0,en]",0,], ["ui_S_t[f.roomdetails.impl.components_RoomBadgeNeutral_null_RoomBadgeNeutral-Day-1_1_null,NEXUS_5,1.0,en]","ui_S_t[f.roomdetails.impl.components_RoomBadgeNeutral_null_RoomBadgeNeutral-Night-1_2_null,NEXUS_5,1.0,en]",0,], ["ui_S_t[f.roomdetails.impl.components_RoomBadgePositive_null_RoomBadgePositive-Day-0_0_null,NEXUS_5,1.0,en]","ui_S_t[f.roomdetails.impl.components_RoomBadgePositive_null_RoomBadgePositive-Night-0_1_null,NEXUS_5,1.0,en]",0,], -["ui_S_t[f.roomdetails.impl_RoomDetailsDark_null_RoomDetailsDark--1_3_null_0,NEXUS_5,1.0,en]","",19874,], -["ui_S_t[f.roomdetails.impl_RoomDetailsDark_null_RoomDetailsDark--1_3_null_1,NEXUS_5,1.0,en]","",19874,], -["ui_S_t[f.roomdetails.impl_RoomDetailsDark_null_RoomDetailsDark--1_3_null_10,NEXUS_5,1.0,en]","",19874,], -["ui_S_t[f.roomdetails.impl_RoomDetailsDark_null_RoomDetailsDark--1_3_null_11,NEXUS_5,1.0,en]","",19874,], -["ui_S_t[f.roomdetails.impl_RoomDetailsDark_null_RoomDetailsDark--1_3_null_2,NEXUS_5,1.0,en]","",19874,], -["ui_S_t[f.roomdetails.impl_RoomDetailsDark_null_RoomDetailsDark--1_3_null_3,NEXUS_5,1.0,en]","",19874,], -["ui_S_t[f.roomdetails.impl_RoomDetailsDark_null_RoomDetailsDark--1_3_null_4,NEXUS_5,1.0,en]","",19874,], -["ui_S_t[f.roomdetails.impl_RoomDetailsDark_null_RoomDetailsDark--1_3_null_5,NEXUS_5,1.0,en]","",19874,], -["ui_S_t[f.roomdetails.impl_RoomDetailsDark_null_RoomDetailsDark--1_3_null_6,NEXUS_5,1.0,en]","",19874,], -["ui_S_t[f.roomdetails.impl_RoomDetailsDark_null_RoomDetailsDark--1_3_null_7,NEXUS_5,1.0,en]","",19874,], -["ui_S_t[f.roomdetails.impl_RoomDetailsDark_null_RoomDetailsDark--1_3_null_8,NEXUS_5,1.0,en]","",19874,], -["ui_S_t[f.roomdetails.impl_RoomDetailsDark_null_RoomDetailsDark--1_3_null_9,NEXUS_5,1.0,en]","",19874,], -["ui_S_t[f.roomdetails.impl.edit_RoomDetailsEditView_null_RoomDetailsEditView-Day-3_3_null_0,NEXUS_5,1.0,en]","ui_S_t[f.roomdetails.impl.edit_RoomDetailsEditView_null_RoomDetailsEditView-Night-3_4_null_0,NEXUS_5,1.0,en]",19874,], -["ui_S_t[f.roomdetails.impl.edit_RoomDetailsEditView_null_RoomDetailsEditView-Day-3_3_null_1,NEXUS_5,1.0,en]","ui_S_t[f.roomdetails.impl.edit_RoomDetailsEditView_null_RoomDetailsEditView-Night-3_4_null_1,NEXUS_5,1.0,en]",19874,], -["ui_S_t[f.roomdetails.impl.edit_RoomDetailsEditView_null_RoomDetailsEditView-Day-3_3_null_2,NEXUS_5,1.0,en]","ui_S_t[f.roomdetails.impl.edit_RoomDetailsEditView_null_RoomDetailsEditView-Night-3_4_null_2,NEXUS_5,1.0,en]",19874,], -["ui_S_t[f.roomdetails.impl.edit_RoomDetailsEditView_null_RoomDetailsEditView-Day-3_3_null_3,NEXUS_5,1.0,en]","ui_S_t[f.roomdetails.impl.edit_RoomDetailsEditView_null_RoomDetailsEditView-Night-3_4_null_3,NEXUS_5,1.0,en]",19874,], -["ui_S_t[f.roomdetails.impl.edit_RoomDetailsEditView_null_RoomDetailsEditView-Day-3_3_null_4,NEXUS_5,1.0,en]","ui_S_t[f.roomdetails.impl.edit_RoomDetailsEditView_null_RoomDetailsEditView-Night-3_4_null_4,NEXUS_5,1.0,en]",19874,], -["ui_S_t[f.roomdetails.impl.edit_RoomDetailsEditView_null_RoomDetailsEditView-Day-3_3_null_5,NEXUS_5,1.0,en]","ui_S_t[f.roomdetails.impl.edit_RoomDetailsEditView_null_RoomDetailsEditView-Night-3_4_null_5,NEXUS_5,1.0,en]",19874,], -["ui_S_t[f.roomdetails.impl.edit_RoomDetailsEditView_null_RoomDetailsEditView-Day-3_3_null_6,NEXUS_5,1.0,en]","ui_S_t[f.roomdetails.impl.edit_RoomDetailsEditView_null_RoomDetailsEditView-Night-3_4_null_6,NEXUS_5,1.0,en]",19874,], -["ui_S_t[f.roomdetails.impl.edit_RoomDetailsEditView_null_RoomDetailsEditView-Day-3_3_null_7,NEXUS_5,1.0,en]","ui_S_t[f.roomdetails.impl.edit_RoomDetailsEditView_null_RoomDetailsEditView-Night-3_4_null_7,NEXUS_5,1.0,en]",19874,], -["ui_S_t[f.roomdetails.impl_RoomDetails_null_RoomDetails--0_2_null_0,NEXUS_5,1.0,en]","",19874,], -["ui_S_t[f.roomdetails.impl_RoomDetails_null_RoomDetails--0_2_null_1,NEXUS_5,1.0,en]","",19874,], -["ui_S_t[f.roomdetails.impl_RoomDetails_null_RoomDetails--0_2_null_10,NEXUS_5,1.0,en]","",19874,], -["ui_S_t[f.roomdetails.impl_RoomDetails_null_RoomDetails--0_2_null_11,NEXUS_5,1.0,en]","",19874,], -["ui_S_t[f.roomdetails.impl_RoomDetails_null_RoomDetails--0_2_null_2,NEXUS_5,1.0,en]","",19874,], -["ui_S_t[f.roomdetails.impl_RoomDetails_null_RoomDetails--0_2_null_3,NEXUS_5,1.0,en]","",19874,], -["ui_S_t[f.roomdetails.impl_RoomDetails_null_RoomDetails--0_2_null_4,NEXUS_5,1.0,en]","",19874,], -["ui_S_t[f.roomdetails.impl_RoomDetails_null_RoomDetails--0_2_null_5,NEXUS_5,1.0,en]","",19874,], -["ui_S_t[f.roomdetails.impl_RoomDetails_null_RoomDetails--0_2_null_6,NEXUS_5,1.0,en]","",19874,], -["ui_S_t[f.roomdetails.impl_RoomDetails_null_RoomDetails--0_2_null_7,NEXUS_5,1.0,en]","",19874,], -["ui_S_t[f.roomdetails.impl_RoomDetails_null_RoomDetails--0_2_null_8,NEXUS_5,1.0,en]","",19874,], -["ui_S_t[f.roomdetails.impl_RoomDetails_null_RoomDetails--0_2_null_9,NEXUS_5,1.0,en]","",19874,], -["ui_S_t[f.roomdirectory.impl.root_RoomDirectoryView_null_RoomDirectoryView-Day-0_1_null_0,NEXUS_5,1.0,en]","ui_S_t[f.roomdirectory.impl.root_RoomDirectoryView_null_RoomDirectoryView-Night-0_2_null_0,NEXUS_5,1.0,en]",19874,], -["ui_S_t[f.roomdirectory.impl.root_RoomDirectoryView_null_RoomDirectoryView-Day-0_1_null_1,NEXUS_5,1.0,en]","ui_S_t[f.roomdirectory.impl.root_RoomDirectoryView_null_RoomDirectoryView-Night-0_2_null_1,NEXUS_5,1.0,en]",19874,], -["ui_S_t[f.roomdirectory.impl.root_RoomDirectoryView_null_RoomDirectoryView-Day-0_1_null_2,NEXUS_5,1.0,en]","ui_S_t[f.roomdirectory.impl.root_RoomDirectoryView_null_RoomDirectoryView-Night-0_2_null_2,NEXUS_5,1.0,en]",19874,], -["ui_S_t[f.roomdetails.impl.invite_RoomInviteMembersView_null_RoomInviteMembersView-Day-4_4_null_0,NEXUS_5,1.0,en]","ui_S_t[f.roomdetails.impl.invite_RoomInviteMembersView_null_RoomInviteMembersView-Night-4_5_null_0,NEXUS_5,1.0,en]",19874,], -["ui_S_t[f.roomdetails.impl.invite_RoomInviteMembersView_null_RoomInviteMembersView-Day-4_4_null_1,NEXUS_5,1.0,en]","ui_S_t[f.roomdetails.impl.invite_RoomInviteMembersView_null_RoomInviteMembersView-Night-4_5_null_1,NEXUS_5,1.0,en]",19874,], -["ui_S_t[f.roomdetails.impl.invite_RoomInviteMembersView_null_RoomInviteMembersView-Day-4_4_null_2,NEXUS_5,1.0,en]","ui_S_t[f.roomdetails.impl.invite_RoomInviteMembersView_null_RoomInviteMembersView-Night-4_5_null_2,NEXUS_5,1.0,en]",19874,], -["ui_S_t[f.roomdetails.impl.invite_RoomInviteMembersView_null_RoomInviteMembersView-Day-4_4_null_3,NEXUS_5,1.0,en]","ui_S_t[f.roomdetails.impl.invite_RoomInviteMembersView_null_RoomInviteMembersView-Night-4_5_null_3,NEXUS_5,1.0,en]",19874,], -["ui_S_t[f.roomdetails.impl.invite_RoomInviteMembersView_null_RoomInviteMembersView-Day-4_4_null_4,NEXUS_5,1.0,en]","ui_S_t[f.roomdetails.impl.invite_RoomInviteMembersView_null_RoomInviteMembersView-Night-4_5_null_4,NEXUS_5,1.0,en]",19874,], -["ui_S_t[f.roomdetails.impl.invite_RoomInviteMembersView_null_RoomInviteMembersView-Day-4_4_null_5,NEXUS_5,1.0,en]","ui_S_t[f.roomdetails.impl.invite_RoomInviteMembersView_null_RoomInviteMembersView-Night-4_5_null_5,NEXUS_5,1.0,en]",19874,], -["ui_S_t[f.roomdetails.impl.invite_RoomInviteMembersView_null_RoomInviteMembersView-Day-4_4_null_6,NEXUS_5,1.0,en]","ui_S_t[f.roomdetails.impl.invite_RoomInviteMembersView_null_RoomInviteMembersView-Night-4_5_null_6,NEXUS_5,1.0,en]",19874,], -["ui_S_t[f.roomdetails.impl.invite_RoomInviteMembersView_null_RoomInviteMembersView-Day-4_4_null_7,NEXUS_5,1.0,en]","ui_S_t[f.roomdetails.impl.invite_RoomInviteMembersView_null_RoomInviteMembersView-Night-4_5_null_7,NEXUS_5,1.0,en]",19874,], -["ui_S_t[f.roomlist.impl.components_RoomListContentView_null_RoomListContentView-Day-3_4_null_0,NEXUS_5,1.0,en]","ui_S_t[f.roomlist.impl.components_RoomListContentView_null_RoomListContentView-Night-3_5_null_0,NEXUS_5,1.0,en]",19874,], -["ui_S_t[f.roomlist.impl.components_RoomListContentView_null_RoomListContentView-Day-3_4_null_1,NEXUS_5,1.0,en]","ui_S_t[f.roomlist.impl.components_RoomListContentView_null_RoomListContentView-Night-3_5_null_1,NEXUS_5,1.0,en]",19874,], +["ui_S_t[f.roomdetails.impl_RoomDetailsDark_null_RoomDetailsDark--1_3_null_0,NEXUS_5,1.0,en]","",19881,], +["ui_S_t[f.roomdetails.impl_RoomDetailsDark_null_RoomDetailsDark--1_3_null_1,NEXUS_5,1.0,en]","",19881,], +["ui_S_t[f.roomdetails.impl_RoomDetailsDark_null_RoomDetailsDark--1_3_null_10,NEXUS_5,1.0,en]","",19881,], +["ui_S_t[f.roomdetails.impl_RoomDetailsDark_null_RoomDetailsDark--1_3_null_11,NEXUS_5,1.0,en]","",19881,], +["ui_S_t[f.roomdetails.impl_RoomDetailsDark_null_RoomDetailsDark--1_3_null_2,NEXUS_5,1.0,en]","",19881,], +["ui_S_t[f.roomdetails.impl_RoomDetailsDark_null_RoomDetailsDark--1_3_null_3,NEXUS_5,1.0,en]","",19881,], +["ui_S_t[f.roomdetails.impl_RoomDetailsDark_null_RoomDetailsDark--1_3_null_4,NEXUS_5,1.0,en]","",19881,], +["ui_S_t[f.roomdetails.impl_RoomDetailsDark_null_RoomDetailsDark--1_3_null_5,NEXUS_5,1.0,en]","",19881,], +["ui_S_t[f.roomdetails.impl_RoomDetailsDark_null_RoomDetailsDark--1_3_null_6,NEXUS_5,1.0,en]","",19881,], +["ui_S_t[f.roomdetails.impl_RoomDetailsDark_null_RoomDetailsDark--1_3_null_7,NEXUS_5,1.0,en]","",19881,], +["ui_S_t[f.roomdetails.impl_RoomDetailsDark_null_RoomDetailsDark--1_3_null_8,NEXUS_5,1.0,en]","",19881,], +["ui_S_t[f.roomdetails.impl_RoomDetailsDark_null_RoomDetailsDark--1_3_null_9,NEXUS_5,1.0,en]","",19881,], +["ui_S_t[f.roomdetails.impl.edit_RoomDetailsEditView_null_RoomDetailsEditView-Day-3_3_null_0,NEXUS_5,1.0,en]","ui_S_t[f.roomdetails.impl.edit_RoomDetailsEditView_null_RoomDetailsEditView-Night-3_4_null_0,NEXUS_5,1.0,en]",19881,], +["ui_S_t[f.roomdetails.impl.edit_RoomDetailsEditView_null_RoomDetailsEditView-Day-3_3_null_1,NEXUS_5,1.0,en]","ui_S_t[f.roomdetails.impl.edit_RoomDetailsEditView_null_RoomDetailsEditView-Night-3_4_null_1,NEXUS_5,1.0,en]",19881,], +["ui_S_t[f.roomdetails.impl.edit_RoomDetailsEditView_null_RoomDetailsEditView-Day-3_3_null_2,NEXUS_5,1.0,en]","ui_S_t[f.roomdetails.impl.edit_RoomDetailsEditView_null_RoomDetailsEditView-Night-3_4_null_2,NEXUS_5,1.0,en]",19881,], +["ui_S_t[f.roomdetails.impl.edit_RoomDetailsEditView_null_RoomDetailsEditView-Day-3_3_null_3,NEXUS_5,1.0,en]","ui_S_t[f.roomdetails.impl.edit_RoomDetailsEditView_null_RoomDetailsEditView-Night-3_4_null_3,NEXUS_5,1.0,en]",19881,], +["ui_S_t[f.roomdetails.impl.edit_RoomDetailsEditView_null_RoomDetailsEditView-Day-3_3_null_4,NEXUS_5,1.0,en]","ui_S_t[f.roomdetails.impl.edit_RoomDetailsEditView_null_RoomDetailsEditView-Night-3_4_null_4,NEXUS_5,1.0,en]",19881,], +["ui_S_t[f.roomdetails.impl.edit_RoomDetailsEditView_null_RoomDetailsEditView-Day-3_3_null_5,NEXUS_5,1.0,en]","ui_S_t[f.roomdetails.impl.edit_RoomDetailsEditView_null_RoomDetailsEditView-Night-3_4_null_5,NEXUS_5,1.0,en]",19881,], +["ui_S_t[f.roomdetails.impl.edit_RoomDetailsEditView_null_RoomDetailsEditView-Day-3_3_null_6,NEXUS_5,1.0,en]","ui_S_t[f.roomdetails.impl.edit_RoomDetailsEditView_null_RoomDetailsEditView-Night-3_4_null_6,NEXUS_5,1.0,en]",19881,], +["ui_S_t[f.roomdetails.impl.edit_RoomDetailsEditView_null_RoomDetailsEditView-Day-3_3_null_7,NEXUS_5,1.0,en]","ui_S_t[f.roomdetails.impl.edit_RoomDetailsEditView_null_RoomDetailsEditView-Night-3_4_null_7,NEXUS_5,1.0,en]",19881,], +["ui_S_t[f.roomdetails.impl_RoomDetails_null_RoomDetails--0_2_null_0,NEXUS_5,1.0,en]","",19881,], +["ui_S_t[f.roomdetails.impl_RoomDetails_null_RoomDetails--0_2_null_1,NEXUS_5,1.0,en]","",19881,], +["ui_S_t[f.roomdetails.impl_RoomDetails_null_RoomDetails--0_2_null_10,NEXUS_5,1.0,en]","",19881,], +["ui_S_t[f.roomdetails.impl_RoomDetails_null_RoomDetails--0_2_null_11,NEXUS_5,1.0,en]","",19881,], +["ui_S_t[f.roomdetails.impl_RoomDetails_null_RoomDetails--0_2_null_2,NEXUS_5,1.0,en]","",19881,], +["ui_S_t[f.roomdetails.impl_RoomDetails_null_RoomDetails--0_2_null_3,NEXUS_5,1.0,en]","",19881,], +["ui_S_t[f.roomdetails.impl_RoomDetails_null_RoomDetails--0_2_null_4,NEXUS_5,1.0,en]","",19881,], +["ui_S_t[f.roomdetails.impl_RoomDetails_null_RoomDetails--0_2_null_5,NEXUS_5,1.0,en]","",19881,], +["ui_S_t[f.roomdetails.impl_RoomDetails_null_RoomDetails--0_2_null_6,NEXUS_5,1.0,en]","",19881,], +["ui_S_t[f.roomdetails.impl_RoomDetails_null_RoomDetails--0_2_null_7,NEXUS_5,1.0,en]","",19881,], +["ui_S_t[f.roomdetails.impl_RoomDetails_null_RoomDetails--0_2_null_8,NEXUS_5,1.0,en]","",19881,], +["ui_S_t[f.roomdetails.impl_RoomDetails_null_RoomDetails--0_2_null_9,NEXUS_5,1.0,en]","",19881,], +["ui_S_t[f.roomdirectory.impl.root_RoomDirectoryView_null_RoomDirectoryView-Day-0_1_null_0,NEXUS_5,1.0,en]","ui_S_t[f.roomdirectory.impl.root_RoomDirectoryView_null_RoomDirectoryView-Night-0_2_null_0,NEXUS_5,1.0,en]",19881,], +["ui_S_t[f.roomdirectory.impl.root_RoomDirectoryView_null_RoomDirectoryView-Day-0_1_null_1,NEXUS_5,1.0,en]","ui_S_t[f.roomdirectory.impl.root_RoomDirectoryView_null_RoomDirectoryView-Night-0_2_null_1,NEXUS_5,1.0,en]",19881,], +["ui_S_t[f.roomdirectory.impl.root_RoomDirectoryView_null_RoomDirectoryView-Day-0_1_null_2,NEXUS_5,1.0,en]","ui_S_t[f.roomdirectory.impl.root_RoomDirectoryView_null_RoomDirectoryView-Night-0_2_null_2,NEXUS_5,1.0,en]",19881,], +["ui_S_t[f.roomdetails.impl.invite_RoomInviteMembersView_null_RoomInviteMembersView-Day-4_4_null_0,NEXUS_5,1.0,en]","ui_S_t[f.roomdetails.impl.invite_RoomInviteMembersView_null_RoomInviteMembersView-Night-4_5_null_0,NEXUS_5,1.0,en]",19881,], +["ui_S_t[f.roomdetails.impl.invite_RoomInviteMembersView_null_RoomInviteMembersView-Day-4_4_null_1,NEXUS_5,1.0,en]","ui_S_t[f.roomdetails.impl.invite_RoomInviteMembersView_null_RoomInviteMembersView-Night-4_5_null_1,NEXUS_5,1.0,en]",19881,], +["ui_S_t[f.roomdetails.impl.invite_RoomInviteMembersView_null_RoomInviteMembersView-Day-4_4_null_2,NEXUS_5,1.0,en]","ui_S_t[f.roomdetails.impl.invite_RoomInviteMembersView_null_RoomInviteMembersView-Night-4_5_null_2,NEXUS_5,1.0,en]",19881,], +["ui_S_t[f.roomdetails.impl.invite_RoomInviteMembersView_null_RoomInviteMembersView-Day-4_4_null_3,NEXUS_5,1.0,en]","ui_S_t[f.roomdetails.impl.invite_RoomInviteMembersView_null_RoomInviteMembersView-Night-4_5_null_3,NEXUS_5,1.0,en]",19881,], +["ui_S_t[f.roomdetails.impl.invite_RoomInviteMembersView_null_RoomInviteMembersView-Day-4_4_null_4,NEXUS_5,1.0,en]","ui_S_t[f.roomdetails.impl.invite_RoomInviteMembersView_null_RoomInviteMembersView-Night-4_5_null_4,NEXUS_5,1.0,en]",19881,], +["ui_S_t[f.roomdetails.impl.invite_RoomInviteMembersView_null_RoomInviteMembersView-Day-4_4_null_5,NEXUS_5,1.0,en]","ui_S_t[f.roomdetails.impl.invite_RoomInviteMembersView_null_RoomInviteMembersView-Night-4_5_null_5,NEXUS_5,1.0,en]",19881,], +["ui_S_t[f.roomdetails.impl.invite_RoomInviteMembersView_null_RoomInviteMembersView-Day-4_4_null_6,NEXUS_5,1.0,en]","ui_S_t[f.roomdetails.impl.invite_RoomInviteMembersView_null_RoomInviteMembersView-Night-4_5_null_6,NEXUS_5,1.0,en]",19881,], +["ui_S_t[f.roomdetails.impl.invite_RoomInviteMembersView_null_RoomInviteMembersView-Day-4_4_null_7,NEXUS_5,1.0,en]","ui_S_t[f.roomdetails.impl.invite_RoomInviteMembersView_null_RoomInviteMembersView-Night-4_5_null_7,NEXUS_5,1.0,en]",19881,], +["ui_S_t[f.roomlist.impl.components_RoomListContentView_null_RoomListContentView-Day-3_4_null_0,NEXUS_5,1.0,en]","ui_S_t[f.roomlist.impl.components_RoomListContentView_null_RoomListContentView-Night-3_5_null_0,NEXUS_5,1.0,en]",19881,], +["ui_S_t[f.roomlist.impl.components_RoomListContentView_null_RoomListContentView-Day-3_4_null_1,NEXUS_5,1.0,en]","ui_S_t[f.roomlist.impl.components_RoomListContentView_null_RoomListContentView-Night-3_5_null_1,NEXUS_5,1.0,en]",19881,], ["ui_S_t[f.roomlist.impl.components_RoomListContentView_null_RoomListContentView-Day-3_4_null_2,NEXUS_5,1.0,en]","ui_S_t[f.roomlist.impl.components_RoomListContentView_null_RoomListContentView-Night-3_5_null_2,NEXUS_5,1.0,en]",0,], -["ui_S_t[f.roomlist.impl.components_RoomListContentView_null_RoomListContentView-Day-3_4_null_3,NEXUS_5,1.0,en]","ui_S_t[f.roomlist.impl.components_RoomListContentView_null_RoomListContentView-Night-3_5_null_3,NEXUS_5,1.0,en]",19874,], -["ui_S_t[f.roomlist.impl.components_RoomListContentView_null_RoomListContentView-Day-3_4_null_4,NEXUS_5,1.0,en]","ui_S_t[f.roomlist.impl.components_RoomListContentView_null_RoomListContentView-Night-3_5_null_4,NEXUS_5,1.0,en]",19874,], -["ui_S_t[f.roomlist.impl.filters_RoomListFiltersView_null_RoomListFiltersView-Day-8_9_null_0,NEXUS_5,1.0,en]","ui_S_t[f.roomlist.impl.filters_RoomListFiltersView_null_RoomListFiltersView-Night-8_10_null_0,NEXUS_5,1.0,en]",19874,], -["ui_S_t[f.roomlist.impl.filters_RoomListFiltersView_null_RoomListFiltersView-Day-8_9_null_1,NEXUS_5,1.0,en]","ui_S_t[f.roomlist.impl.filters_RoomListFiltersView_null_RoomListFiltersView-Night-8_10_null_1,NEXUS_5,1.0,en]",19874,], -["ui_S_t[f.roomlist.impl_RoomListModalBottomSheetContent_null_RoomListModalBottomSheetContent-Day-0_1_null_0,NEXUS_5,1.0,en]","ui_S_t[f.roomlist.impl_RoomListModalBottomSheetContent_null_RoomListModalBottomSheetContent-Night-0_2_null_0,NEXUS_5,1.0,en]",19874,], -["ui_S_t[f.roomlist.impl_RoomListModalBottomSheetContent_null_RoomListModalBottomSheetContent-Day-0_1_null_1,NEXUS_5,1.0,en]","ui_S_t[f.roomlist.impl_RoomListModalBottomSheetContent_null_RoomListModalBottomSheetContent-Night-0_2_null_1,NEXUS_5,1.0,en]",19874,], -["ui_S_t[f.roomlist.impl_RoomListModalBottomSheetContent_null_RoomListModalBottomSheetContent-Day-0_1_null_2,NEXUS_5,1.0,en]","ui_S_t[f.roomlist.impl_RoomListModalBottomSheetContent_null_RoomListModalBottomSheetContent-Night-0_2_null_2,NEXUS_5,1.0,en]",19874,], +["ui_S_t[f.roomlist.impl.components_RoomListContentView_null_RoomListContentView-Day-3_4_null_3,NEXUS_5,1.0,en]","ui_S_t[f.roomlist.impl.components_RoomListContentView_null_RoomListContentView-Night-3_5_null_3,NEXUS_5,1.0,en]",19881,], +["ui_S_t[f.roomlist.impl.components_RoomListContentView_null_RoomListContentView-Day-3_4_null_4,NEXUS_5,1.0,en]","ui_S_t[f.roomlist.impl.components_RoomListContentView_null_RoomListContentView-Night-3_5_null_4,NEXUS_5,1.0,en]",19881,], +["ui_S_t[f.roomlist.impl.filters_RoomListFiltersView_null_RoomListFiltersView-Day-8_9_null_0,NEXUS_5,1.0,en]","ui_S_t[f.roomlist.impl.filters_RoomListFiltersView_null_RoomListFiltersView-Night-8_10_null_0,NEXUS_5,1.0,en]",19881,], +["ui_S_t[f.roomlist.impl.filters_RoomListFiltersView_null_RoomListFiltersView-Day-8_9_null_1,NEXUS_5,1.0,en]","ui_S_t[f.roomlist.impl.filters_RoomListFiltersView_null_RoomListFiltersView-Night-8_10_null_1,NEXUS_5,1.0,en]",19881,], +["ui_S_t[f.roomlist.impl_RoomListModalBottomSheetContent_null_RoomListModalBottomSheetContent-Day-0_1_null_0,NEXUS_5,1.0,en]","ui_S_t[f.roomlist.impl_RoomListModalBottomSheetContent_null_RoomListModalBottomSheetContent-Night-0_2_null_0,NEXUS_5,1.0,en]",19881,], +["ui_S_t[f.roomlist.impl_RoomListModalBottomSheetContent_null_RoomListModalBottomSheetContent-Day-0_1_null_1,NEXUS_5,1.0,en]","ui_S_t[f.roomlist.impl_RoomListModalBottomSheetContent_null_RoomListModalBottomSheetContent-Night-0_2_null_1,NEXUS_5,1.0,en]",19881,], +["ui_S_t[f.roomlist.impl_RoomListModalBottomSheetContent_null_RoomListModalBottomSheetContent-Day-0_1_null_2,NEXUS_5,1.0,en]","ui_S_t[f.roomlist.impl_RoomListModalBottomSheetContent_null_RoomListModalBottomSheetContent-Night-0_2_null_2,NEXUS_5,1.0,en]",19881,], ["ui_S_t[f.roomlist.impl.search_RoomListSearchContent_null_RoomListSearchContent-Day-10_11_null_0,NEXUS_5,1.0,en]","ui_S_t[f.roomlist.impl.search_RoomListSearchContent_null_RoomListSearchContent-Night-10_12_null_0,NEXUS_5,1.0,en]",0,], -["ui_S_t[f.roomlist.impl.search_RoomListSearchContent_null_RoomListSearchContent-Day-10_11_null_1,NEXUS_5,1.0,en]","ui_S_t[f.roomlist.impl.search_RoomListSearchContent_null_RoomListSearchContent-Night-10_12_null_1,NEXUS_5,1.0,en]",19874,], -["ui_S_t[f.roomlist.impl.search_RoomListSearchContent_null_RoomListSearchContent-Day-10_11_null_2,NEXUS_5,1.0,en]","ui_S_t[f.roomlist.impl.search_RoomListSearchContent_null_RoomListSearchContent-Night-10_12_null_2,NEXUS_5,1.0,en]",19874,], -["ui_S_t[f.roomlist.impl_RoomListView_null_RoomListView-Day-1_2_null_0,NEXUS_5,1.0,en]","ui_S_t[f.roomlist.impl_RoomListView_null_RoomListView-Night-1_3_null_0,NEXUS_5,1.0,en]",19874,], -["ui_S_t[f.roomlist.impl_RoomListView_null_RoomListView-Day-1_2_null_1,NEXUS_5,1.0,en]","ui_S_t[f.roomlist.impl_RoomListView_null_RoomListView-Night-1_3_null_1,NEXUS_5,1.0,en]",19874,], +["ui_S_t[f.roomlist.impl.search_RoomListSearchContent_null_RoomListSearchContent-Day-10_11_null_1,NEXUS_5,1.0,en]","ui_S_t[f.roomlist.impl.search_RoomListSearchContent_null_RoomListSearchContent-Night-10_12_null_1,NEXUS_5,1.0,en]",19881,], +["ui_S_t[f.roomlist.impl.search_RoomListSearchContent_null_RoomListSearchContent-Day-10_11_null_2,NEXUS_5,1.0,en]","ui_S_t[f.roomlist.impl.search_RoomListSearchContent_null_RoomListSearchContent-Night-10_12_null_2,NEXUS_5,1.0,en]",19881,], +["ui_S_t[f.roomlist.impl_RoomListView_null_RoomListView-Day-1_2_null_0,NEXUS_5,1.0,en]","ui_S_t[f.roomlist.impl_RoomListView_null_RoomListView-Night-1_3_null_0,NEXUS_5,1.0,en]",19881,], +["ui_S_t[f.roomlist.impl_RoomListView_null_RoomListView-Day-1_2_null_1,NEXUS_5,1.0,en]","ui_S_t[f.roomlist.impl_RoomListView_null_RoomListView-Night-1_3_null_1,NEXUS_5,1.0,en]",19881,], ["ui_S_t[f.roomlist.impl_RoomListView_null_RoomListView-Day-1_2_null_10,NEXUS_5,1.0,en]","ui_S_t[f.roomlist.impl_RoomListView_null_RoomListView-Night-1_3_null_10,NEXUS_5,1.0,en]",0,], -["ui_S_t[f.roomlist.impl_RoomListView_null_RoomListView-Day-1_2_null_2,NEXUS_5,1.0,en]","ui_S_t[f.roomlist.impl_RoomListView_null_RoomListView-Night-1_3_null_2,NEXUS_5,1.0,en]",19874,], -["ui_S_t[f.roomlist.impl_RoomListView_null_RoomListView-Day-1_2_null_3,NEXUS_5,1.0,en]","ui_S_t[f.roomlist.impl_RoomListView_null_RoomListView-Night-1_3_null_3,NEXUS_5,1.0,en]",19874,], -["ui_S_t[f.roomlist.impl_RoomListView_null_RoomListView-Day-1_2_null_4,NEXUS_5,1.0,en]","ui_S_t[f.roomlist.impl_RoomListView_null_RoomListView-Night-1_3_null_4,NEXUS_5,1.0,en]",19874,], -["ui_S_t[f.roomlist.impl_RoomListView_null_RoomListView-Day-1_2_null_5,NEXUS_5,1.0,en]","ui_S_t[f.roomlist.impl_RoomListView_null_RoomListView-Night-1_3_null_5,NEXUS_5,1.0,en]",19874,], -["ui_S_t[f.roomlist.impl_RoomListView_null_RoomListView-Day-1_2_null_6,NEXUS_5,1.0,en]","ui_S_t[f.roomlist.impl_RoomListView_null_RoomListView-Night-1_3_null_6,NEXUS_5,1.0,en]",19874,], -["ui_S_t[f.roomlist.impl_RoomListView_null_RoomListView-Day-1_2_null_7,NEXUS_5,1.0,en]","ui_S_t[f.roomlist.impl_RoomListView_null_RoomListView-Night-1_3_null_7,NEXUS_5,1.0,en]",19874,], +["ui_S_t[f.roomlist.impl_RoomListView_null_RoomListView-Day-1_2_null_2,NEXUS_5,1.0,en]","ui_S_t[f.roomlist.impl_RoomListView_null_RoomListView-Night-1_3_null_2,NEXUS_5,1.0,en]",19881,], +["ui_S_t[f.roomlist.impl_RoomListView_null_RoomListView-Day-1_2_null_3,NEXUS_5,1.0,en]","ui_S_t[f.roomlist.impl_RoomListView_null_RoomListView-Night-1_3_null_3,NEXUS_5,1.0,en]",19881,], +["ui_S_t[f.roomlist.impl_RoomListView_null_RoomListView-Day-1_2_null_4,NEXUS_5,1.0,en]","ui_S_t[f.roomlist.impl_RoomListView_null_RoomListView-Night-1_3_null_4,NEXUS_5,1.0,en]",19881,], +["ui_S_t[f.roomlist.impl_RoomListView_null_RoomListView-Day-1_2_null_5,NEXUS_5,1.0,en]","ui_S_t[f.roomlist.impl_RoomListView_null_RoomListView-Night-1_3_null_5,NEXUS_5,1.0,en]",19881,], +["ui_S_t[f.roomlist.impl_RoomListView_null_RoomListView-Day-1_2_null_6,NEXUS_5,1.0,en]","ui_S_t[f.roomlist.impl_RoomListView_null_RoomListView-Night-1_3_null_6,NEXUS_5,1.0,en]",19881,], +["ui_S_t[f.roomlist.impl_RoomListView_null_RoomListView-Day-1_2_null_7,NEXUS_5,1.0,en]","ui_S_t[f.roomlist.impl_RoomListView_null_RoomListView-Night-1_3_null_7,NEXUS_5,1.0,en]",19881,], ["ui_S_t[f.roomlist.impl_RoomListView_null_RoomListView-Day-1_2_null_8,NEXUS_5,1.0,en]","ui_S_t[f.roomlist.impl_RoomListView_null_RoomListView-Night-1_3_null_8,NEXUS_5,1.0,en]",0,], -["ui_S_t[f.roomlist.impl_RoomListView_null_RoomListView-Day-1_2_null_9,NEXUS_5,1.0,en]","ui_S_t[f.roomlist.impl_RoomListView_null_RoomListView-Night-1_3_null_9,NEXUS_5,1.0,en]",19874,], -["ui_S_t[f.roomdetails.impl.members_RoomMemberListViewBanned_null_RoomMemberListViewBanned-Day-6_6_null_0,NEXUS_5,1.0,en]","ui_S_t[f.roomdetails.impl.members_RoomMemberListViewBanned_null_RoomMemberListViewBanned-Night-6_7_null_0,NEXUS_5,1.0,en]",19874,], -["ui_S_t[f.roomdetails.impl.members_RoomMemberListViewBanned_null_RoomMemberListViewBanned-Day-6_6_null_1,NEXUS_5,1.0,en]","ui_S_t[f.roomdetails.impl.members_RoomMemberListViewBanned_null_RoomMemberListViewBanned-Night-6_7_null_1,NEXUS_5,1.0,en]",19874,], -["ui_S_t[f.roomdetails.impl.members_RoomMemberListViewBanned_null_RoomMemberListViewBanned-Day-6_6_null_2,NEXUS_5,1.0,en]","ui_S_t[f.roomdetails.impl.members_RoomMemberListViewBanned_null_RoomMemberListViewBanned-Night-6_7_null_2,NEXUS_5,1.0,en]",19874,], -["ui_S_t[f.roomdetails.impl.members_RoomMemberListView_null_RoomMemberListView-Day-5_5_null_0,NEXUS_5,1.0,en]","ui_S_t[f.roomdetails.impl.members_RoomMemberListView_null_RoomMemberListView-Night-5_6_null_0,NEXUS_5,1.0,en]",19874,], -["ui_S_t[f.roomdetails.impl.members_RoomMemberListView_null_RoomMemberListView-Day-5_5_null_1,NEXUS_5,1.0,en]","ui_S_t[f.roomdetails.impl.members_RoomMemberListView_null_RoomMemberListView-Night-5_6_null_1,NEXUS_5,1.0,en]",19874,], -["ui_S_t[f.roomdetails.impl.members_RoomMemberListView_null_RoomMemberListView-Day-5_5_null_2,NEXUS_5,1.0,en]","ui_S_t[f.roomdetails.impl.members_RoomMemberListView_null_RoomMemberListView-Night-5_6_null_2,NEXUS_5,1.0,en]",19874,], -["ui_S_t[f.roomdetails.impl.members_RoomMemberListView_null_RoomMemberListView-Day-5_5_null_3,NEXUS_5,1.0,en]","ui_S_t[f.roomdetails.impl.members_RoomMemberListView_null_RoomMemberListView-Night-5_6_null_3,NEXUS_5,1.0,en]",19874,], -["ui_S_t[f.roomdetails.impl.members_RoomMemberListView_null_RoomMemberListView-Day-5_5_null_4,NEXUS_5,1.0,en]","ui_S_t[f.roomdetails.impl.members_RoomMemberListView_null_RoomMemberListView-Night-5_6_null_4,NEXUS_5,1.0,en]",19874,], +["ui_S_t[f.roomlist.impl_RoomListView_null_RoomListView-Day-1_2_null_9,NEXUS_5,1.0,en]","ui_S_t[f.roomlist.impl_RoomListView_null_RoomListView-Night-1_3_null_9,NEXUS_5,1.0,en]",19881,], +["ui_S_t[f.roomdetails.impl.members_RoomMemberListViewBanned_null_RoomMemberListViewBanned-Day-6_6_null_0,NEXUS_5,1.0,en]","ui_S_t[f.roomdetails.impl.members_RoomMemberListViewBanned_null_RoomMemberListViewBanned-Night-6_7_null_0,NEXUS_5,1.0,en]",19881,], +["ui_S_t[f.roomdetails.impl.members_RoomMemberListViewBanned_null_RoomMemberListViewBanned-Day-6_6_null_1,NEXUS_5,1.0,en]","ui_S_t[f.roomdetails.impl.members_RoomMemberListViewBanned_null_RoomMemberListViewBanned-Night-6_7_null_1,NEXUS_5,1.0,en]",19881,], +["ui_S_t[f.roomdetails.impl.members_RoomMemberListViewBanned_null_RoomMemberListViewBanned-Day-6_6_null_2,NEXUS_5,1.0,en]","ui_S_t[f.roomdetails.impl.members_RoomMemberListViewBanned_null_RoomMemberListViewBanned-Night-6_7_null_2,NEXUS_5,1.0,en]",19881,], +["ui_S_t[f.roomdetails.impl.members_RoomMemberListView_null_RoomMemberListView-Day-5_5_null_0,NEXUS_5,1.0,en]","ui_S_t[f.roomdetails.impl.members_RoomMemberListView_null_RoomMemberListView-Night-5_6_null_0,NEXUS_5,1.0,en]",19881,], +["ui_S_t[f.roomdetails.impl.members_RoomMemberListView_null_RoomMemberListView-Day-5_5_null_1,NEXUS_5,1.0,en]","ui_S_t[f.roomdetails.impl.members_RoomMemberListView_null_RoomMemberListView-Night-5_6_null_1,NEXUS_5,1.0,en]",19881,], +["ui_S_t[f.roomdetails.impl.members_RoomMemberListView_null_RoomMemberListView-Day-5_5_null_2,NEXUS_5,1.0,en]","ui_S_t[f.roomdetails.impl.members_RoomMemberListView_null_RoomMemberListView-Night-5_6_null_2,NEXUS_5,1.0,en]",19881,], +["ui_S_t[f.roomdetails.impl.members_RoomMemberListView_null_RoomMemberListView-Day-5_5_null_3,NEXUS_5,1.0,en]","ui_S_t[f.roomdetails.impl.members_RoomMemberListView_null_RoomMemberListView-Night-5_6_null_3,NEXUS_5,1.0,en]",19881,], +["ui_S_t[f.roomdetails.impl.members_RoomMemberListView_null_RoomMemberListView-Day-5_5_null_4,NEXUS_5,1.0,en]","ui_S_t[f.roomdetails.impl.members_RoomMemberListView_null_RoomMemberListView-Night-5_6_null_4,NEXUS_5,1.0,en]",19881,], ["ui_S_t[f.roomdetails.impl.members_RoomMemberListView_null_RoomMemberListView-Day-5_5_null_5,NEXUS_5,1.0,en]","ui_S_t[f.roomdetails.impl.members_RoomMemberListView_null_RoomMemberListView-Night-5_6_null_5,NEXUS_5,1.0,en]",0,], -["ui_S_t[f.roomdetails.impl.members_RoomMemberListView_null_RoomMemberListView-Day-5_5_null_6,NEXUS_5,1.0,en]","ui_S_t[f.roomdetails.impl.members_RoomMemberListView_null_RoomMemberListView-Night-5_6_null_6,NEXUS_5,1.0,en]",19874,], -["ui_S_t[f.roomdetails.impl.members_RoomMemberListView_null_RoomMemberListView-Day-5_5_null_7,NEXUS_5,1.0,en]","ui_S_t[f.roomdetails.impl.members_RoomMemberListView_null_RoomMemberListView-Night-5_6_null_7,NEXUS_5,1.0,en]",19874,], -["ui_S_t[f.roomdetails.impl.members.moderation_RoomMembersModerationView_null_RoomMembersModerationView-Day-7_7_null_0,NEXUS_5,1.0,en]","ui_S_t[f.roomdetails.impl.members.moderation_RoomMembersModerationView_null_RoomMembersModerationView-Night-7_8_null_0,NEXUS_5,1.0,en]",19874,], -["ui_S_t[f.roomdetails.impl.members.moderation_RoomMembersModerationView_null_RoomMembersModerationView-Day-7_7_null_1,NEXUS_5,1.0,en]","ui_S_t[f.roomdetails.impl.members.moderation_RoomMembersModerationView_null_RoomMembersModerationView-Night-7_8_null_1,NEXUS_5,1.0,en]",19874,], -["ui_S_t[f.roomdetails.impl.members.moderation_RoomMembersModerationView_null_RoomMembersModerationView-Day-7_7_null_2,NEXUS_5,1.0,en]","ui_S_t[f.roomdetails.impl.members.moderation_RoomMembersModerationView_null_RoomMembersModerationView-Night-7_8_null_2,NEXUS_5,1.0,en]",19874,], -["ui_S_t[f.roomdetails.impl.members.moderation_RoomMembersModerationView_null_RoomMembersModerationView-Day-7_7_null_3,NEXUS_5,1.0,en]","ui_S_t[f.roomdetails.impl.members.moderation_RoomMembersModerationView_null_RoomMembersModerationView-Night-7_8_null_3,NEXUS_5,1.0,en]",19874,], -["ui_S_t[f.roomdetails.impl.members.moderation_RoomMembersModerationView_null_RoomMembersModerationView-Day-7_7_null_4,NEXUS_5,1.0,en]","ui_S_t[f.roomdetails.impl.members.moderation_RoomMembersModerationView_null_RoomMembersModerationView-Night-7_8_null_4,NEXUS_5,1.0,en]",19874,], -["ui_S_t[f.roomdetails.impl.members.moderation_RoomMembersModerationView_null_RoomMembersModerationView-Day-7_7_null_5,NEXUS_5,1.0,en]","ui_S_t[f.roomdetails.impl.members.moderation_RoomMembersModerationView_null_RoomMembersModerationView-Night-7_8_null_5,NEXUS_5,1.0,en]",19874,], -["ui_S_t[f.roomdetails.impl.members.moderation_RoomMembersModerationView_null_RoomMembersModerationView-Day-7_7_null_6,NEXUS_5,1.0,en]","ui_S_t[f.roomdetails.impl.members.moderation_RoomMembersModerationView_null_RoomMembersModerationView-Night-7_8_null_6,NEXUS_5,1.0,en]",19874,], -["ui_S_t[f.roomdetails.impl.members.moderation_RoomMembersModerationView_null_RoomMembersModerationView-Day-7_7_null_7,NEXUS_5,1.0,en]","ui_S_t[f.roomdetails.impl.members.moderation_RoomMembersModerationView_null_RoomMembersModerationView-Night-7_8_null_7,NEXUS_5,1.0,en]",19874,], -["ui_S_t[f.roomdetails.impl.members.moderation_RoomMembersModerationView_null_RoomMembersModerationView-Day-7_7_null_8,NEXUS_5,1.0,en]","ui_S_t[f.roomdetails.impl.members.moderation_RoomMembersModerationView_null_RoomMembersModerationView-Night-7_8_null_8,NEXUS_5,1.0,en]",19874,], +["ui_S_t[f.roomdetails.impl.members_RoomMemberListView_null_RoomMemberListView-Day-5_5_null_6,NEXUS_5,1.0,en]","ui_S_t[f.roomdetails.impl.members_RoomMemberListView_null_RoomMemberListView-Night-5_6_null_6,NEXUS_5,1.0,en]",19881,], +["ui_S_t[f.roomdetails.impl.members_RoomMemberListView_null_RoomMemberListView-Day-5_5_null_7,NEXUS_5,1.0,en]","ui_S_t[f.roomdetails.impl.members_RoomMemberListView_null_RoomMemberListView-Night-5_6_null_7,NEXUS_5,1.0,en]",19881,], +["ui_S_t[f.roomdetails.impl.members.moderation_RoomMembersModerationView_null_RoomMembersModerationView-Day-7_7_null_0,NEXUS_5,1.0,en]","ui_S_t[f.roomdetails.impl.members.moderation_RoomMembersModerationView_null_RoomMembersModerationView-Night-7_8_null_0,NEXUS_5,1.0,en]",19881,], +["ui_S_t[f.roomdetails.impl.members.moderation_RoomMembersModerationView_null_RoomMembersModerationView-Day-7_7_null_1,NEXUS_5,1.0,en]","ui_S_t[f.roomdetails.impl.members.moderation_RoomMembersModerationView_null_RoomMembersModerationView-Night-7_8_null_1,NEXUS_5,1.0,en]",19881,], +["ui_S_t[f.roomdetails.impl.members.moderation_RoomMembersModerationView_null_RoomMembersModerationView-Day-7_7_null_2,NEXUS_5,1.0,en]","ui_S_t[f.roomdetails.impl.members.moderation_RoomMembersModerationView_null_RoomMembersModerationView-Night-7_8_null_2,NEXUS_5,1.0,en]",19881,], +["ui_S_t[f.roomdetails.impl.members.moderation_RoomMembersModerationView_null_RoomMembersModerationView-Day-7_7_null_3,NEXUS_5,1.0,en]","ui_S_t[f.roomdetails.impl.members.moderation_RoomMembersModerationView_null_RoomMembersModerationView-Night-7_8_null_3,NEXUS_5,1.0,en]",19881,], +["ui_S_t[f.roomdetails.impl.members.moderation_RoomMembersModerationView_null_RoomMembersModerationView-Day-7_7_null_4,NEXUS_5,1.0,en]","ui_S_t[f.roomdetails.impl.members.moderation_RoomMembersModerationView_null_RoomMembersModerationView-Night-7_8_null_4,NEXUS_5,1.0,en]",19881,], +["ui_S_t[f.roomdetails.impl.members.moderation_RoomMembersModerationView_null_RoomMembersModerationView-Day-7_7_null_5,NEXUS_5,1.0,en]","ui_S_t[f.roomdetails.impl.members.moderation_RoomMembersModerationView_null_RoomMembersModerationView-Night-7_8_null_5,NEXUS_5,1.0,en]",19881,], +["ui_S_t[f.roomdetails.impl.members.moderation_RoomMembersModerationView_null_RoomMembersModerationView-Day-7_7_null_6,NEXUS_5,1.0,en]","ui_S_t[f.roomdetails.impl.members.moderation_RoomMembersModerationView_null_RoomMembersModerationView-Night-7_8_null_6,NEXUS_5,1.0,en]",19881,], +["ui_S_t[f.roomdetails.impl.members.moderation_RoomMembersModerationView_null_RoomMembersModerationView-Day-7_7_null_7,NEXUS_5,1.0,en]","ui_S_t[f.roomdetails.impl.members.moderation_RoomMembersModerationView_null_RoomMembersModerationView-Night-7_8_null_7,NEXUS_5,1.0,en]",19881,], +["ui_S_t[f.roomdetails.impl.members.moderation_RoomMembersModerationView_null_RoomMembersModerationView-Day-7_7_null_8,NEXUS_5,1.0,en]","ui_S_t[f.roomdetails.impl.members.moderation_RoomMembersModerationView_null_RoomMembersModerationView-Night-7_8_null_8,NEXUS_5,1.0,en]",19881,], ["ui_S_t[f.roomdetails.impl.members.moderation_RoomMembersModerationView_null_RoomMembersModerationView-Day-7_7_null_9,NEXUS_5,1.0,en]","ui_S_t[f.roomdetails.impl.members.moderation_RoomMembersModerationView_null_RoomMembersModerationView-Night-7_8_null_9,NEXUS_5,1.0,en]",0,], -["ui_S_t[f.roomdetails.impl.notificationsettings_RoomNotificationSettingsOption_null_RoomNotificationSettingsOption-Day-8_8_null,NEXUS_5,1.0,en]","ui_S_t[f.roomdetails.impl.notificationsettings_RoomNotificationSettingsOption_null_RoomNotificationSettingsOption-Night-8_9_null,NEXUS_5,1.0,en]",19874,], -["ui_S_t[f.roomdetails.impl.notificationsettings_RoomNotificationSettingsView_null_RoomNotificationSettingsView-Day-9_9_null_0,NEXUS_5,1.0,en]","ui_S_t[f.roomdetails.impl.notificationsettings_RoomNotificationSettingsView_null_RoomNotificationSettingsView-Night-9_10_null_0,NEXUS_5,1.0,en]",19874,], -["ui_S_t[f.roomdetails.impl.notificationsettings_RoomNotificationSettingsView_null_RoomNotificationSettingsView-Day-9_9_null_1,NEXUS_5,1.0,en]","ui_S_t[f.roomdetails.impl.notificationsettings_RoomNotificationSettingsView_null_RoomNotificationSettingsView-Night-9_10_null_1,NEXUS_5,1.0,en]",19874,], -["ui_S_t[f.roomdetails.impl.notificationsettings_RoomNotificationSettingsView_null_RoomNotificationSettingsView-Day-9_9_null_2,NEXUS_5,1.0,en]","ui_S_t[f.roomdetails.impl.notificationsettings_RoomNotificationSettingsView_null_RoomNotificationSettingsView-Night-9_10_null_2,NEXUS_5,1.0,en]",19874,], -["ui_S_t[f.roomdetails.impl.notificationsettings_RoomNotificationSettingsView_null_RoomNotificationSettingsView-Day-9_9_null_3,NEXUS_5,1.0,en]","ui_S_t[f.roomdetails.impl.notificationsettings_RoomNotificationSettingsView_null_RoomNotificationSettingsView-Night-9_10_null_3,NEXUS_5,1.0,en]",19874,], -["ui_S_t[f.roomdetails.impl.notificationsettings_RoomNotificationSettingsView_null_RoomNotificationSettingsView-Day-9_9_null_4,NEXUS_5,1.0,en]","ui_S_t[f.roomdetails.impl.notificationsettings_RoomNotificationSettingsView_null_RoomNotificationSettingsView-Night-9_10_null_4,NEXUS_5,1.0,en]",19874,], -["ui_S_t[f.roomdetails.impl.notificationsettings_RoomNotificationSettingsView_null_RoomNotificationSettingsView-Day-9_9_null_5,NEXUS_5,1.0,en]","ui_S_t[f.roomdetails.impl.notificationsettings_RoomNotificationSettingsView_null_RoomNotificationSettingsView-Night-9_10_null_5,NEXUS_5,1.0,en]",19874,], -["ui_S_t[f.roomdetails.impl.notificationsettings_RoomNotificationSettingsView_null_RoomNotificationSettingsView-Day-9_9_null_6,NEXUS_5,1.0,en]","ui_S_t[f.roomdetails.impl.notificationsettings_RoomNotificationSettingsView_null_RoomNotificationSettingsView-Night-9_10_null_6,NEXUS_5,1.0,en]",19874,], +["ui_S_t[f.roomdetails.impl.notificationsettings_RoomNotificationSettingsOption_null_RoomNotificationSettingsOption-Day-8_8_null,NEXUS_5,1.0,en]","ui_S_t[f.roomdetails.impl.notificationsettings_RoomNotificationSettingsOption_null_RoomNotificationSettingsOption-Night-8_9_null,NEXUS_5,1.0,en]",19881,], +["ui_S_t[f.roomdetails.impl.notificationsettings_RoomNotificationSettingsView_null_RoomNotificationSettingsView-Day-9_9_null_0,NEXUS_5,1.0,en]","ui_S_t[f.roomdetails.impl.notificationsettings_RoomNotificationSettingsView_null_RoomNotificationSettingsView-Night-9_10_null_0,NEXUS_5,1.0,en]",19881,], +["ui_S_t[f.roomdetails.impl.notificationsettings_RoomNotificationSettingsView_null_RoomNotificationSettingsView-Day-9_9_null_1,NEXUS_5,1.0,en]","ui_S_t[f.roomdetails.impl.notificationsettings_RoomNotificationSettingsView_null_RoomNotificationSettingsView-Night-9_10_null_1,NEXUS_5,1.0,en]",19881,], +["ui_S_t[f.roomdetails.impl.notificationsettings_RoomNotificationSettingsView_null_RoomNotificationSettingsView-Day-9_9_null_2,NEXUS_5,1.0,en]","ui_S_t[f.roomdetails.impl.notificationsettings_RoomNotificationSettingsView_null_RoomNotificationSettingsView-Night-9_10_null_2,NEXUS_5,1.0,en]",19881,], +["ui_S_t[f.roomdetails.impl.notificationsettings_RoomNotificationSettingsView_null_RoomNotificationSettingsView-Day-9_9_null_3,NEXUS_5,1.0,en]","ui_S_t[f.roomdetails.impl.notificationsettings_RoomNotificationSettingsView_null_RoomNotificationSettingsView-Night-9_10_null_3,NEXUS_5,1.0,en]",19881,], +["ui_S_t[f.roomdetails.impl.notificationsettings_RoomNotificationSettingsView_null_RoomNotificationSettingsView-Day-9_9_null_4,NEXUS_5,1.0,en]","ui_S_t[f.roomdetails.impl.notificationsettings_RoomNotificationSettingsView_null_RoomNotificationSettingsView-Night-9_10_null_4,NEXUS_5,1.0,en]",19881,], +["ui_S_t[f.roomdetails.impl.notificationsettings_RoomNotificationSettingsView_null_RoomNotificationSettingsView-Day-9_9_null_5,NEXUS_5,1.0,en]","ui_S_t[f.roomdetails.impl.notificationsettings_RoomNotificationSettingsView_null_RoomNotificationSettingsView-Night-9_10_null_5,NEXUS_5,1.0,en]",19881,], +["ui_S_t[f.roomdetails.impl.notificationsettings_RoomNotificationSettingsView_null_RoomNotificationSettingsView-Day-9_9_null_6,NEXUS_5,1.0,en]","ui_S_t[f.roomdetails.impl.notificationsettings_RoomNotificationSettingsView_null_RoomNotificationSettingsView-Night-9_10_null_6,NEXUS_5,1.0,en]",19881,], ["ui_S_t[l.designsystem.atomic.molecules_RoomPreviewMembersCountMolecule_null_RoomPreviewMembersCountMolecule-Day_0_null,NEXUS_5,1.0,en]","ui_S_t[l.designsystem.atomic.molecules_RoomPreviewMembersCountMolecule_null_RoomPreviewMembersCountMolecule-Night_1_null,NEXUS_5,1.0,en]",0,], -["ui_S_t[f.createroom.impl.components_RoomPrivacyOption_null_RoomPrivacyOption-Day-1_2_null,NEXUS_5,1.0,en]","ui_S_t[f.createroom.impl.components_RoomPrivacyOption_null_RoomPrivacyOption-Night-1_3_null,NEXUS_5,1.0,en]",19874,], -["ui_S_t[l.roomselect.impl_RoomSelectView_null_RoomSelectView-Day-0_1_null_0,NEXUS_5,1.0,en]","ui_S_t[l.roomselect.impl_RoomSelectView_null_RoomSelectView-Night-0_2_null_0,NEXUS_5,1.0,en]",19874,], -["ui_S_t[l.roomselect.impl_RoomSelectView_null_RoomSelectView-Day-0_1_null_1,NEXUS_5,1.0,en]","ui_S_t[l.roomselect.impl_RoomSelectView_null_RoomSelectView-Night-0_2_null_1,NEXUS_5,1.0,en]",19874,], -["ui_S_t[l.roomselect.impl_RoomSelectView_null_RoomSelectView-Day-0_1_null_2,NEXUS_5,1.0,en]","ui_S_t[l.roomselect.impl_RoomSelectView_null_RoomSelectView-Night-0_2_null_2,NEXUS_5,1.0,en]",19874,], -["ui_S_t[l.roomselect.impl_RoomSelectView_null_RoomSelectView-Day-0_1_null_3,NEXUS_5,1.0,en]","ui_S_t[l.roomselect.impl_RoomSelectView_null_RoomSelectView-Night-0_2_null_3,NEXUS_5,1.0,en]",19874,], -["ui_S_t[l.roomselect.impl_RoomSelectView_null_RoomSelectView-Day-0_1_null_4,NEXUS_5,1.0,en]","ui_S_t[l.roomselect.impl_RoomSelectView_null_RoomSelectView-Night-0_2_null_4,NEXUS_5,1.0,en]",19874,], +["ui_S_t[f.createroom.impl.components_RoomPrivacyOption_null_RoomPrivacyOption-Day-1_2_null,NEXUS_5,1.0,en]","ui_S_t[f.createroom.impl.components_RoomPrivacyOption_null_RoomPrivacyOption-Night-1_3_null,NEXUS_5,1.0,en]",19881,], +["ui_S_t[l.roomselect.impl_RoomSelectView_null_RoomSelectView-Day-0_1_null_0,NEXUS_5,1.0,en]","ui_S_t[l.roomselect.impl_RoomSelectView_null_RoomSelectView-Night-0_2_null_0,NEXUS_5,1.0,en]",19881,], +["ui_S_t[l.roomselect.impl_RoomSelectView_null_RoomSelectView-Day-0_1_null_1,NEXUS_5,1.0,en]","ui_S_t[l.roomselect.impl_RoomSelectView_null_RoomSelectView-Night-0_2_null_1,NEXUS_5,1.0,en]",19881,], +["ui_S_t[l.roomselect.impl_RoomSelectView_null_RoomSelectView-Day-0_1_null_2,NEXUS_5,1.0,en]","ui_S_t[l.roomselect.impl_RoomSelectView_null_RoomSelectView-Night-0_2_null_2,NEXUS_5,1.0,en]",19881,], +["ui_S_t[l.roomselect.impl_RoomSelectView_null_RoomSelectView-Day-0_1_null_3,NEXUS_5,1.0,en]","ui_S_t[l.roomselect.impl_RoomSelectView_null_RoomSelectView-Night-0_2_null_3,NEXUS_5,1.0,en]",19881,], +["ui_S_t[l.roomselect.impl_RoomSelectView_null_RoomSelectView-Day-0_1_null_4,NEXUS_5,1.0,en]","ui_S_t[l.roomselect.impl_RoomSelectView_null_RoomSelectView-Night-0_2_null_4,NEXUS_5,1.0,en]",19881,], +["ui_S_t[l.roomselect.impl_RoomSelectView_null_RoomSelectView-Day-0_1_null_5,NEXUS_5,1.0,en]","ui_S_t[l.roomselect.impl_RoomSelectView_null_RoomSelectView-Night-0_2_null_5,NEXUS_5,1.0,en]",0,], ["ui_S_t[f.roomlist.impl.components_RoomSummaryPlaceholderRow_null_RoomSummaryPlaceholderRow-Day-6_7_null,NEXUS_5,1.0,en]","ui_S_t[f.roomlist.impl.components_RoomSummaryPlaceholderRow_null_RoomSummaryPlaceholderRow-Night-6_8_null,NEXUS_5,1.0,en]",0,], ["ui_S_t[f.roomlist.impl.components_RoomSummaryRow_null_RoomSummaryRow-Day-7_8_null_0,NEXUS_5,1.0,en]","ui_S_t[f.roomlist.impl.components_RoomSummaryRow_null_RoomSummaryRow-Night-7_9_null_0,NEXUS_5,1.0,en]",0,], ["ui_S_t[f.roomlist.impl.components_RoomSummaryRow_null_RoomSummaryRow-Day-7_8_null_1,NEXUS_5,1.0,en]","ui_S_t[f.roomlist.impl.components_RoomSummaryRow_null_RoomSummaryRow-Night-7_9_null_1,NEXUS_5,1.0,en]",0,], @@ -717,7 +718,7 @@ export const screenshots = [ ["ui_S_t[f.roomlist.impl.components_RoomSummaryRow_null_RoomSummaryRow-Day-7_8_null_17,NEXUS_5,1.0,en]","ui_S_t[f.roomlist.impl.components_RoomSummaryRow_null_RoomSummaryRow-Night-7_9_null_17,NEXUS_5,1.0,en]",0,], ["ui_S_t[f.roomlist.impl.components_RoomSummaryRow_null_RoomSummaryRow-Day-7_8_null_18,NEXUS_5,1.0,en]","ui_S_t[f.roomlist.impl.components_RoomSummaryRow_null_RoomSummaryRow-Night-7_9_null_18,NEXUS_5,1.0,en]",0,], ["ui_S_t[f.roomlist.impl.components_RoomSummaryRow_null_RoomSummaryRow-Day-7_8_null_19,NEXUS_5,1.0,en]","ui_S_t[f.roomlist.impl.components_RoomSummaryRow_null_RoomSummaryRow-Night-7_9_null_19,NEXUS_5,1.0,en]",0,], -["ui_S_t[f.roomlist.impl.components_RoomSummaryRow_null_RoomSummaryRow-Day-7_8_null_2,NEXUS_5,1.0,en]","ui_S_t[f.roomlist.impl.components_RoomSummaryRow_null_RoomSummaryRow-Night-7_9_null_2,NEXUS_5,1.0,en]",19874,], +["ui_S_t[f.roomlist.impl.components_RoomSummaryRow_null_RoomSummaryRow-Day-7_8_null_2,NEXUS_5,1.0,en]","ui_S_t[f.roomlist.impl.components_RoomSummaryRow_null_RoomSummaryRow-Night-7_9_null_2,NEXUS_5,1.0,en]",19881,], ["ui_S_t[f.roomlist.impl.components_RoomSummaryRow_null_RoomSummaryRow-Day-7_8_null_20,NEXUS_5,1.0,en]","ui_S_t[f.roomlist.impl.components_RoomSummaryRow_null_RoomSummaryRow-Night-7_9_null_20,NEXUS_5,1.0,en]",0,], ["ui_S_t[f.roomlist.impl.components_RoomSummaryRow_null_RoomSummaryRow-Day-7_8_null_21,NEXUS_5,1.0,en]","ui_S_t[f.roomlist.impl.components_RoomSummaryRow_null_RoomSummaryRow-Night-7_9_null_21,NEXUS_5,1.0,en]",0,], ["ui_S_t[f.roomlist.impl.components_RoomSummaryRow_null_RoomSummaryRow-Day-7_8_null_22,NEXUS_5,1.0,en]","ui_S_t[f.roomlist.impl.components_RoomSummaryRow_null_RoomSummaryRow-Night-7_9_null_22,NEXUS_5,1.0,en]",0,], @@ -727,72 +728,72 @@ export const screenshots = [ ["ui_S_t[f.roomlist.impl.components_RoomSummaryRow_null_RoomSummaryRow-Day-7_8_null_26,NEXUS_5,1.0,en]","ui_S_t[f.roomlist.impl.components_RoomSummaryRow_null_RoomSummaryRow-Night-7_9_null_26,NEXUS_5,1.0,en]",0,], ["ui_S_t[f.roomlist.impl.components_RoomSummaryRow_null_RoomSummaryRow-Day-7_8_null_27,NEXUS_5,1.0,en]","ui_S_t[f.roomlist.impl.components_RoomSummaryRow_null_RoomSummaryRow-Night-7_9_null_27,NEXUS_5,1.0,en]",0,], ["ui_S_t[f.roomlist.impl.components_RoomSummaryRow_null_RoomSummaryRow-Day-7_8_null_28,NEXUS_5,1.0,en]","ui_S_t[f.roomlist.impl.components_RoomSummaryRow_null_RoomSummaryRow-Night-7_9_null_28,NEXUS_5,1.0,en]",0,], -["ui_S_t[f.roomlist.impl.components_RoomSummaryRow_null_RoomSummaryRow-Day-7_8_null_29,NEXUS_5,1.0,en]","ui_S_t[f.roomlist.impl.components_RoomSummaryRow_null_RoomSummaryRow-Night-7_9_null_29,NEXUS_5,1.0,en]",19874,], +["ui_S_t[f.roomlist.impl.components_RoomSummaryRow_null_RoomSummaryRow-Day-7_8_null_29,NEXUS_5,1.0,en]","ui_S_t[f.roomlist.impl.components_RoomSummaryRow_null_RoomSummaryRow-Night-7_9_null_29,NEXUS_5,1.0,en]",19881,], ["ui_S_t[f.roomlist.impl.components_RoomSummaryRow_null_RoomSummaryRow-Day-7_8_null_3,NEXUS_5,1.0,en]","ui_S_t[f.roomlist.impl.components_RoomSummaryRow_null_RoomSummaryRow-Night-7_9_null_3,NEXUS_5,1.0,en]",0,], -["ui_S_t[f.roomlist.impl.components_RoomSummaryRow_null_RoomSummaryRow-Day-7_8_null_30,NEXUS_5,1.0,en]","ui_S_t[f.roomlist.impl.components_RoomSummaryRow_null_RoomSummaryRow-Night-7_9_null_30,NEXUS_5,1.0,en]",19874,], -["ui_S_t[f.roomlist.impl.components_RoomSummaryRow_null_RoomSummaryRow-Day-7_8_null_31,NEXUS_5,1.0,en]","ui_S_t[f.roomlist.impl.components_RoomSummaryRow_null_RoomSummaryRow-Night-7_9_null_31,NEXUS_5,1.0,en]",19874,], +["ui_S_t[f.roomlist.impl.components_RoomSummaryRow_null_RoomSummaryRow-Day-7_8_null_30,NEXUS_5,1.0,en]","ui_S_t[f.roomlist.impl.components_RoomSummaryRow_null_RoomSummaryRow-Night-7_9_null_30,NEXUS_5,1.0,en]",19881,], +["ui_S_t[f.roomlist.impl.components_RoomSummaryRow_null_RoomSummaryRow-Day-7_8_null_31,NEXUS_5,1.0,en]","ui_S_t[f.roomlist.impl.components_RoomSummaryRow_null_RoomSummaryRow-Night-7_9_null_31,NEXUS_5,1.0,en]",19881,], ["ui_S_t[f.roomlist.impl.components_RoomSummaryRow_null_RoomSummaryRow-Day-7_8_null_4,NEXUS_5,1.0,en]","ui_S_t[f.roomlist.impl.components_RoomSummaryRow_null_RoomSummaryRow-Night-7_9_null_4,NEXUS_5,1.0,en]",0,], ["ui_S_t[f.roomlist.impl.components_RoomSummaryRow_null_RoomSummaryRow-Day-7_8_null_5,NEXUS_5,1.0,en]","ui_S_t[f.roomlist.impl.components_RoomSummaryRow_null_RoomSummaryRow-Night-7_9_null_5,NEXUS_5,1.0,en]",0,], ["ui_S_t[f.roomlist.impl.components_RoomSummaryRow_null_RoomSummaryRow-Day-7_8_null_6,NEXUS_5,1.0,en]","ui_S_t[f.roomlist.impl.components_RoomSummaryRow_null_RoomSummaryRow-Night-7_9_null_6,NEXUS_5,1.0,en]",0,], ["ui_S_t[f.roomlist.impl.components_RoomSummaryRow_null_RoomSummaryRow-Day-7_8_null_7,NEXUS_5,1.0,en]","ui_S_t[f.roomlist.impl.components_RoomSummaryRow_null_RoomSummaryRow-Night-7_9_null_7,NEXUS_5,1.0,en]",0,], ["ui_S_t[f.roomlist.impl.components_RoomSummaryRow_null_RoomSummaryRow-Day-7_8_null_8,NEXUS_5,1.0,en]","ui_S_t[f.roomlist.impl.components_RoomSummaryRow_null_RoomSummaryRow-Night-7_9_null_8,NEXUS_5,1.0,en]",0,], ["ui_S_t[f.roomlist.impl.components_RoomSummaryRow_null_RoomSummaryRow-Day-7_8_null_9,NEXUS_5,1.0,en]","ui_S_t[f.roomlist.impl.components_RoomSummaryRow_null_RoomSummaryRow-Night-7_9_null_9,NEXUS_5,1.0,en]",0,], -["ui_S_t[appnav.root_RootView_null_RootView-Day-3_3_null_0,NEXUS_5,1.0,en]","ui_S_t[appnav.root_RootView_null_RootView-Night-3_4_null_0,NEXUS_5,1.0,en]",19874,], -["ui_S_t[appnav.root_RootView_null_RootView-Day-3_3_null_1,NEXUS_5,1.0,en]","ui_S_t[appnav.root_RootView_null_RootView-Night-3_4_null_1,NEXUS_5,1.0,en]",19874,], -["ui_S_t[appnav.root_RootView_null_RootView-Day-3_3_null_2,NEXUS_5,1.0,en]","ui_S_t[appnav.root_RootView_null_RootView-Night-3_4_null_2,NEXUS_5,1.0,en]",19874,], +["ui_S_t[appnav.root_RootView_null_RootView-Day-3_3_null_0,NEXUS_5,1.0,en]","ui_S_t[appnav.root_RootView_null_RootView-Night-3_4_null_0,NEXUS_5,1.0,en]",19881,], +["ui_S_t[appnav.root_RootView_null_RootView-Day-3_3_null_1,NEXUS_5,1.0,en]","ui_S_t[appnav.root_RootView_null_RootView-Night-3_4_null_1,NEXUS_5,1.0,en]",19881,], +["ui_S_t[appnav.root_RootView_null_RootView-Day-3_3_null_2,NEXUS_5,1.0,en]","ui_S_t[appnav.root_RootView_null_RootView-Night-3_4_null_2,NEXUS_5,1.0,en]",19881,], ["ui_S_t[l.designsystem.atomic.atoms_RoundedIconAtom_null_RoundedIconAtom-Day_0_null,NEXUS_5,1.0,en]","ui_S_t[l.designsystem.atomic.atoms_RoundedIconAtom_null_RoundedIconAtom-Night_1_null,NEXUS_5,1.0,en]",0,], -["ui_S_t[f.verifysession.impl.emoji_SasEmojis_null_SasEmojis-Day-1_2_null,NEXUS_5,1.0,en]","ui_S_t[f.verifysession.impl.emoji_SasEmojis_null_SasEmojis-Night-1_3_null,NEXUS_5,1.0,en]",19874,], -["ui_S_t[f.login.impl.screens.searchaccountprovider_SearchAccountProviderView_null_SearchAccountProviderView-Day-11_12_null_0,NEXUS_5,1.0,en]","ui_S_t[f.login.impl.screens.searchaccountprovider_SearchAccountProviderView_null_SearchAccountProviderView-Night-11_13_null_0,NEXUS_5,1.0,en]",19877,], -["ui_S_t[f.login.impl.screens.searchaccountprovider_SearchAccountProviderView_null_SearchAccountProviderView-Day-11_12_null_1,NEXUS_5,1.0,en]","ui_S_t[f.login.impl.screens.searchaccountprovider_SearchAccountProviderView_null_SearchAccountProviderView-Night-11_13_null_1,NEXUS_5,1.0,en]",19877,], +["ui_S_t[f.verifysession.impl.emoji_SasEmojis_null_SasEmojis-Day-1_2_null,NEXUS_5,1.0,en]","ui_S_t[f.verifysession.impl.emoji_SasEmojis_null_SasEmojis-Night-1_3_null,NEXUS_5,1.0,en]",19881,], +["ui_S_t[f.login.impl.screens.searchaccountprovider_SearchAccountProviderView_null_SearchAccountProviderView-Day-11_12_null_0,NEXUS_5,1.0,en]","ui_S_t[f.login.impl.screens.searchaccountprovider_SearchAccountProviderView_null_SearchAccountProviderView-Night-11_13_null_0,NEXUS_5,1.0,en]",19881,], +["ui_S_t[f.login.impl.screens.searchaccountprovider_SearchAccountProviderView_null_SearchAccountProviderView-Day-11_12_null_1,NEXUS_5,1.0,en]","ui_S_t[f.login.impl.screens.searchaccountprovider_SearchAccountProviderView_null_SearchAccountProviderView-Night-11_13_null_1,NEXUS_5,1.0,en]",19881,], ["ui_S_t[l.designsystem.theme.components_SearchBarActiveNoneQuery_null_Searchviews_SearchBarActiveNoneQuery_0_null,NEXUS_5,1.0,en]","",0,], ["ui_S_t[l.designsystem.theme.components_SearchBarActiveWithContent_null_Searchviews_SearchBarActiveWithContent_0_null,NEXUS_5,1.0,en]","",0,], -["ui_S_t[l.designsystem.theme.components_SearchBarActiveWithNoResults_null_Searchviews_SearchBarActiveWithNoResults_0_null,NEXUS_5,1.0,en]","",19874,], +["ui_S_t[l.designsystem.theme.components_SearchBarActiveWithNoResults_null_Searchviews_SearchBarActiveWithNoResults_0_null,NEXUS_5,1.0,en]","",19881,], ["ui_S_t[l.designsystem.theme.components_SearchBarActiveWithQueryNoBackButton_null_Searchviews_SearchBarActiveWithQueryNoBackButton_0_null,NEXUS_5,1.0,en]","",0,], ["ui_S_t[l.designsystem.theme.components_SearchBarActiveWithQuery_null_Searchviews_SearchBarActiveWithQuery_0_null,NEXUS_5,1.0,en]","",0,], ["ui_S_t[l.designsystem.theme.components_SearchBarInactive_null_Searchviews_SearchBarInactive_0_null,NEXUS_5,1.0,en]","",0,], -["ui_S_t[f.createroom.impl.components_SearchMultipleUsersResultItem_null_SearchMultipleUsersResultItem_0_null,NEXUS_5,1.0,en]","",19874,], -["ui_S_t[f.createroom.impl.components_SearchSingleUserResultItem_null_SearchSingleUserResultItem_0_null,NEXUS_5,1.0,en]","",19874,], -["ui_S_t[f.securebackup.impl.disable_SecureBackupDisableView_null_SecureBackupDisableView-Day-1_2_null_0,NEXUS_5,1.0,en]","ui_S_t[f.securebackup.impl.disable_SecureBackupDisableView_null_SecureBackupDisableView-Night-1_3_null_0,NEXUS_5,1.0,en]",19874,], -["ui_S_t[f.securebackup.impl.disable_SecureBackupDisableView_null_SecureBackupDisableView-Day-1_2_null_1,NEXUS_5,1.0,en]","ui_S_t[f.securebackup.impl.disable_SecureBackupDisableView_null_SecureBackupDisableView-Night-1_3_null_1,NEXUS_5,1.0,en]",19874,], -["ui_S_t[f.securebackup.impl.disable_SecureBackupDisableView_null_SecureBackupDisableView-Day-1_2_null_2,NEXUS_5,1.0,en]","ui_S_t[f.securebackup.impl.disable_SecureBackupDisableView_null_SecureBackupDisableView-Night-1_3_null_2,NEXUS_5,1.0,en]",19874,], -["ui_S_t[f.securebackup.impl.disable_SecureBackupDisableView_null_SecureBackupDisableView-Day-1_2_null_3,NEXUS_5,1.0,en]","ui_S_t[f.securebackup.impl.disable_SecureBackupDisableView_null_SecureBackupDisableView-Night-1_3_null_3,NEXUS_5,1.0,en]",19874,], -["ui_S_t[f.securebackup.impl.enable_SecureBackupEnableView_null_SecureBackupEnableView-Day-2_3_null_0,NEXUS_5,1.0,en]","ui_S_t[f.securebackup.impl.enable_SecureBackupEnableView_null_SecureBackupEnableView-Night-2_4_null_0,NEXUS_5,1.0,en]",19874,], -["ui_S_t[f.securebackup.impl.enable_SecureBackupEnableView_null_SecureBackupEnableView-Day-2_3_null_1,NEXUS_5,1.0,en]","ui_S_t[f.securebackup.impl.enable_SecureBackupEnableView_null_SecureBackupEnableView-Night-2_4_null_1,NEXUS_5,1.0,en]",19874,], -["ui_S_t[f.securebackup.impl.enable_SecureBackupEnableView_null_SecureBackupEnableView-Day-2_3_null_2,NEXUS_5,1.0,en]","ui_S_t[f.securebackup.impl.enable_SecureBackupEnableView_null_SecureBackupEnableView-Night-2_4_null_2,NEXUS_5,1.0,en]",19874,], -["ui_S_t[f.securebackup.impl.enter_SecureBackupEnterRecoveryKeyView_null_SecureBackupEnterRecoveryKeyView-Day-3_4_null_0,NEXUS_5,1.0,en]","ui_S_t[f.securebackup.impl.enter_SecureBackupEnterRecoveryKeyView_null_SecureBackupEnterRecoveryKeyView-Night-3_5_null_0,NEXUS_5,1.0,en]",19874,], -["ui_S_t[f.securebackup.impl.enter_SecureBackupEnterRecoveryKeyView_null_SecureBackupEnterRecoveryKeyView-Day-3_4_null_1,NEXUS_5,1.0,en]","ui_S_t[f.securebackup.impl.enter_SecureBackupEnterRecoveryKeyView_null_SecureBackupEnterRecoveryKeyView-Night-3_5_null_1,NEXUS_5,1.0,en]",19874,], -["ui_S_t[f.securebackup.impl.enter_SecureBackupEnterRecoveryKeyView_null_SecureBackupEnterRecoveryKeyView-Day-3_4_null_2,NEXUS_5,1.0,en]","ui_S_t[f.securebackup.impl.enter_SecureBackupEnterRecoveryKeyView_null_SecureBackupEnterRecoveryKeyView-Night-3_5_null_2,NEXUS_5,1.0,en]",19874,], -["ui_S_t[f.securebackup.impl.enter_SecureBackupEnterRecoveryKeyView_null_SecureBackupEnterRecoveryKeyView-Day-3_4_null_3,NEXUS_5,1.0,en]","ui_S_t[f.securebackup.impl.enter_SecureBackupEnterRecoveryKeyView_null_SecureBackupEnterRecoveryKeyView-Night-3_5_null_3,NEXUS_5,1.0,en]",19874,], -["ui_S_t[f.securebackup.impl.root_SecureBackupRootView_null_SecureBackupRootView-Day-4_5_null_0,NEXUS_5,1.0,en]","ui_S_t[f.securebackup.impl.root_SecureBackupRootView_null_SecureBackupRootView-Night-4_6_null_0,NEXUS_5,1.0,en]",19874,], -["ui_S_t[f.securebackup.impl.root_SecureBackupRootView_null_SecureBackupRootView-Day-4_5_null_1,NEXUS_5,1.0,en]","ui_S_t[f.securebackup.impl.root_SecureBackupRootView_null_SecureBackupRootView-Night-4_6_null_1,NEXUS_5,1.0,en]",19874,], -["ui_S_t[f.securebackup.impl.root_SecureBackupRootView_null_SecureBackupRootView-Day-4_5_null_2,NEXUS_5,1.0,en]","ui_S_t[f.securebackup.impl.root_SecureBackupRootView_null_SecureBackupRootView-Night-4_6_null_2,NEXUS_5,1.0,en]",19874,], -["ui_S_t[f.securebackup.impl.root_SecureBackupRootView_null_SecureBackupRootView-Day-4_5_null_3,NEXUS_5,1.0,en]","ui_S_t[f.securebackup.impl.root_SecureBackupRootView_null_SecureBackupRootView-Night-4_6_null_3,NEXUS_5,1.0,en]",19874,], -["ui_S_t[f.securebackup.impl.root_SecureBackupRootView_null_SecureBackupRootView-Day-4_5_null_4,NEXUS_5,1.0,en]","ui_S_t[f.securebackup.impl.root_SecureBackupRootView_null_SecureBackupRootView-Night-4_6_null_4,NEXUS_5,1.0,en]",19874,], -["ui_S_t[f.securebackup.impl.root_SecureBackupRootView_null_SecureBackupRootView-Day-4_5_null_5,NEXUS_5,1.0,en]","ui_S_t[f.securebackup.impl.root_SecureBackupRootView_null_SecureBackupRootView-Night-4_6_null_5,NEXUS_5,1.0,en]",19874,], -["ui_S_t[f.securebackup.impl.root_SecureBackupRootView_null_SecureBackupRootView-Day-4_5_null_6,NEXUS_5,1.0,en]","ui_S_t[f.securebackup.impl.root_SecureBackupRootView_null_SecureBackupRootView-Night-4_6_null_6,NEXUS_5,1.0,en]",19874,], -["ui_S_t[f.securebackup.impl.root_SecureBackupRootView_null_SecureBackupRootView-Day-4_5_null_7,NEXUS_5,1.0,en]","ui_S_t[f.securebackup.impl.root_SecureBackupRootView_null_SecureBackupRootView-Night-4_6_null_7,NEXUS_5,1.0,en]",19874,], -["ui_S_t[f.securebackup.impl.root_SecureBackupRootView_null_SecureBackupRootView-Day-4_5_null_8,NEXUS_5,1.0,en]","ui_S_t[f.securebackup.impl.root_SecureBackupRootView_null_SecureBackupRootView-Night-4_6_null_8,NEXUS_5,1.0,en]",19874,], -["ui_S_t[f.securebackup.impl.setup_SecureBackupSetupViewChange_null_SecureBackupSetupViewChange-Day-6_7_null_0,NEXUS_5,1.0,en]","ui_S_t[f.securebackup.impl.setup_SecureBackupSetupViewChange_null_SecureBackupSetupViewChange-Night-6_8_null_0,NEXUS_5,1.0,en]",19874,], -["ui_S_t[f.securebackup.impl.setup_SecureBackupSetupViewChange_null_SecureBackupSetupViewChange-Day-6_7_null_1,NEXUS_5,1.0,en]","ui_S_t[f.securebackup.impl.setup_SecureBackupSetupViewChange_null_SecureBackupSetupViewChange-Night-6_8_null_1,NEXUS_5,1.0,en]",19874,], -["ui_S_t[f.securebackup.impl.setup_SecureBackupSetupViewChange_null_SecureBackupSetupViewChange-Day-6_7_null_2,NEXUS_5,1.0,en]","ui_S_t[f.securebackup.impl.setup_SecureBackupSetupViewChange_null_SecureBackupSetupViewChange-Night-6_8_null_2,NEXUS_5,1.0,en]",19874,], -["ui_S_t[f.securebackup.impl.setup_SecureBackupSetupViewChange_null_SecureBackupSetupViewChange-Day-6_7_null_3,NEXUS_5,1.0,en]","ui_S_t[f.securebackup.impl.setup_SecureBackupSetupViewChange_null_SecureBackupSetupViewChange-Night-6_8_null_3,NEXUS_5,1.0,en]",19874,], -["ui_S_t[f.securebackup.impl.setup_SecureBackupSetupViewChange_null_SecureBackupSetupViewChange-Day-6_7_null_4,NEXUS_5,1.0,en]","ui_S_t[f.securebackup.impl.setup_SecureBackupSetupViewChange_null_SecureBackupSetupViewChange-Night-6_8_null_4,NEXUS_5,1.0,en]",19874,], -["ui_S_t[f.securebackup.impl.setup_SecureBackupSetupView_null_SecureBackupSetupView-Day-5_6_null_0,NEXUS_5,1.0,en]","ui_S_t[f.securebackup.impl.setup_SecureBackupSetupView_null_SecureBackupSetupView-Night-5_7_null_0,NEXUS_5,1.0,en]",19874,], -["ui_S_t[f.securebackup.impl.setup_SecureBackupSetupView_null_SecureBackupSetupView-Day-5_6_null_1,NEXUS_5,1.0,en]","ui_S_t[f.securebackup.impl.setup_SecureBackupSetupView_null_SecureBackupSetupView-Night-5_7_null_1,NEXUS_5,1.0,en]",19874,], -["ui_S_t[f.securebackup.impl.setup_SecureBackupSetupView_null_SecureBackupSetupView-Day-5_6_null_2,NEXUS_5,1.0,en]","ui_S_t[f.securebackup.impl.setup_SecureBackupSetupView_null_SecureBackupSetupView-Night-5_7_null_2,NEXUS_5,1.0,en]",19874,], -["ui_S_t[f.securebackup.impl.setup_SecureBackupSetupView_null_SecureBackupSetupView-Day-5_6_null_3,NEXUS_5,1.0,en]","ui_S_t[f.securebackup.impl.setup_SecureBackupSetupView_null_SecureBackupSetupView-Night-5_7_null_3,NEXUS_5,1.0,en]",19874,], -["ui_S_t[f.securebackup.impl.setup_SecureBackupSetupView_null_SecureBackupSetupView-Day-5_6_null_4,NEXUS_5,1.0,en]","ui_S_t[f.securebackup.impl.setup_SecureBackupSetupView_null_SecureBackupSetupView-Night-5_7_null_4,NEXUS_5,1.0,en]",19874,], +["ui_S_t[f.createroom.impl.components_SearchMultipleUsersResultItem_null_SearchMultipleUsersResultItem_0_null,NEXUS_5,1.0,en]","",19881,], +["ui_S_t[f.createroom.impl.components_SearchSingleUserResultItem_null_SearchSingleUserResultItem_0_null,NEXUS_5,1.0,en]","",19881,], +["ui_S_t[f.securebackup.impl.disable_SecureBackupDisableView_null_SecureBackupDisableView-Day-1_2_null_0,NEXUS_5,1.0,en]","ui_S_t[f.securebackup.impl.disable_SecureBackupDisableView_null_SecureBackupDisableView-Night-1_3_null_0,NEXUS_5,1.0,en]",19881,], +["ui_S_t[f.securebackup.impl.disable_SecureBackupDisableView_null_SecureBackupDisableView-Day-1_2_null_1,NEXUS_5,1.0,en]","ui_S_t[f.securebackup.impl.disable_SecureBackupDisableView_null_SecureBackupDisableView-Night-1_3_null_1,NEXUS_5,1.0,en]",19881,], +["ui_S_t[f.securebackup.impl.disable_SecureBackupDisableView_null_SecureBackupDisableView-Day-1_2_null_2,NEXUS_5,1.0,en]","ui_S_t[f.securebackup.impl.disable_SecureBackupDisableView_null_SecureBackupDisableView-Night-1_3_null_2,NEXUS_5,1.0,en]",19881,], +["ui_S_t[f.securebackup.impl.disable_SecureBackupDisableView_null_SecureBackupDisableView-Day-1_2_null_3,NEXUS_5,1.0,en]","ui_S_t[f.securebackup.impl.disable_SecureBackupDisableView_null_SecureBackupDisableView-Night-1_3_null_3,NEXUS_5,1.0,en]",19881,], +["ui_S_t[f.securebackup.impl.enable_SecureBackupEnableView_null_SecureBackupEnableView-Day-2_3_null_0,NEXUS_5,1.0,en]","ui_S_t[f.securebackup.impl.enable_SecureBackupEnableView_null_SecureBackupEnableView-Night-2_4_null_0,NEXUS_5,1.0,en]",19881,], +["ui_S_t[f.securebackup.impl.enable_SecureBackupEnableView_null_SecureBackupEnableView-Day-2_3_null_1,NEXUS_5,1.0,en]","ui_S_t[f.securebackup.impl.enable_SecureBackupEnableView_null_SecureBackupEnableView-Night-2_4_null_1,NEXUS_5,1.0,en]",19881,], +["ui_S_t[f.securebackup.impl.enable_SecureBackupEnableView_null_SecureBackupEnableView-Day-2_3_null_2,NEXUS_5,1.0,en]","ui_S_t[f.securebackup.impl.enable_SecureBackupEnableView_null_SecureBackupEnableView-Night-2_4_null_2,NEXUS_5,1.0,en]",19881,], +["ui_S_t[f.securebackup.impl.enter_SecureBackupEnterRecoveryKeyView_null_SecureBackupEnterRecoveryKeyView-Day-3_4_null_0,NEXUS_5,1.0,en]","ui_S_t[f.securebackup.impl.enter_SecureBackupEnterRecoveryKeyView_null_SecureBackupEnterRecoveryKeyView-Night-3_5_null_0,NEXUS_5,1.0,en]",19881,], +["ui_S_t[f.securebackup.impl.enter_SecureBackupEnterRecoveryKeyView_null_SecureBackupEnterRecoveryKeyView-Day-3_4_null_1,NEXUS_5,1.0,en]","ui_S_t[f.securebackup.impl.enter_SecureBackupEnterRecoveryKeyView_null_SecureBackupEnterRecoveryKeyView-Night-3_5_null_1,NEXUS_5,1.0,en]",19881,], +["ui_S_t[f.securebackup.impl.enter_SecureBackupEnterRecoveryKeyView_null_SecureBackupEnterRecoveryKeyView-Day-3_4_null_2,NEXUS_5,1.0,en]","ui_S_t[f.securebackup.impl.enter_SecureBackupEnterRecoveryKeyView_null_SecureBackupEnterRecoveryKeyView-Night-3_5_null_2,NEXUS_5,1.0,en]",19881,], +["ui_S_t[f.securebackup.impl.enter_SecureBackupEnterRecoveryKeyView_null_SecureBackupEnterRecoveryKeyView-Day-3_4_null_3,NEXUS_5,1.0,en]","ui_S_t[f.securebackup.impl.enter_SecureBackupEnterRecoveryKeyView_null_SecureBackupEnterRecoveryKeyView-Night-3_5_null_3,NEXUS_5,1.0,en]",19881,], +["ui_S_t[f.securebackup.impl.root_SecureBackupRootView_null_SecureBackupRootView-Day-4_5_null_0,NEXUS_5,1.0,en]","ui_S_t[f.securebackup.impl.root_SecureBackupRootView_null_SecureBackupRootView-Night-4_6_null_0,NEXUS_5,1.0,en]",19881,], +["ui_S_t[f.securebackup.impl.root_SecureBackupRootView_null_SecureBackupRootView-Day-4_5_null_1,NEXUS_5,1.0,en]","ui_S_t[f.securebackup.impl.root_SecureBackupRootView_null_SecureBackupRootView-Night-4_6_null_1,NEXUS_5,1.0,en]",19881,], +["ui_S_t[f.securebackup.impl.root_SecureBackupRootView_null_SecureBackupRootView-Day-4_5_null_2,NEXUS_5,1.0,en]","ui_S_t[f.securebackup.impl.root_SecureBackupRootView_null_SecureBackupRootView-Night-4_6_null_2,NEXUS_5,1.0,en]",19881,], +["ui_S_t[f.securebackup.impl.root_SecureBackupRootView_null_SecureBackupRootView-Day-4_5_null_3,NEXUS_5,1.0,en]","ui_S_t[f.securebackup.impl.root_SecureBackupRootView_null_SecureBackupRootView-Night-4_6_null_3,NEXUS_5,1.0,en]",19881,], +["ui_S_t[f.securebackup.impl.root_SecureBackupRootView_null_SecureBackupRootView-Day-4_5_null_4,NEXUS_5,1.0,en]","ui_S_t[f.securebackup.impl.root_SecureBackupRootView_null_SecureBackupRootView-Night-4_6_null_4,NEXUS_5,1.0,en]",19881,], +["ui_S_t[f.securebackup.impl.root_SecureBackupRootView_null_SecureBackupRootView-Day-4_5_null_5,NEXUS_5,1.0,en]","ui_S_t[f.securebackup.impl.root_SecureBackupRootView_null_SecureBackupRootView-Night-4_6_null_5,NEXUS_5,1.0,en]",19881,], +["ui_S_t[f.securebackup.impl.root_SecureBackupRootView_null_SecureBackupRootView-Day-4_5_null_6,NEXUS_5,1.0,en]","ui_S_t[f.securebackup.impl.root_SecureBackupRootView_null_SecureBackupRootView-Night-4_6_null_6,NEXUS_5,1.0,en]",19881,], +["ui_S_t[f.securebackup.impl.root_SecureBackupRootView_null_SecureBackupRootView-Day-4_5_null_7,NEXUS_5,1.0,en]","ui_S_t[f.securebackup.impl.root_SecureBackupRootView_null_SecureBackupRootView-Night-4_6_null_7,NEXUS_5,1.0,en]",19881,], +["ui_S_t[f.securebackup.impl.root_SecureBackupRootView_null_SecureBackupRootView-Day-4_5_null_8,NEXUS_5,1.0,en]","ui_S_t[f.securebackup.impl.root_SecureBackupRootView_null_SecureBackupRootView-Night-4_6_null_8,NEXUS_5,1.0,en]",19881,], +["ui_S_t[f.securebackup.impl.setup_SecureBackupSetupViewChange_null_SecureBackupSetupViewChange-Day-6_7_null_0,NEXUS_5,1.0,en]","ui_S_t[f.securebackup.impl.setup_SecureBackupSetupViewChange_null_SecureBackupSetupViewChange-Night-6_8_null_0,NEXUS_5,1.0,en]",19881,], +["ui_S_t[f.securebackup.impl.setup_SecureBackupSetupViewChange_null_SecureBackupSetupViewChange-Day-6_7_null_1,NEXUS_5,1.0,en]","ui_S_t[f.securebackup.impl.setup_SecureBackupSetupViewChange_null_SecureBackupSetupViewChange-Night-6_8_null_1,NEXUS_5,1.0,en]",19881,], +["ui_S_t[f.securebackup.impl.setup_SecureBackupSetupViewChange_null_SecureBackupSetupViewChange-Day-6_7_null_2,NEXUS_5,1.0,en]","ui_S_t[f.securebackup.impl.setup_SecureBackupSetupViewChange_null_SecureBackupSetupViewChange-Night-6_8_null_2,NEXUS_5,1.0,en]",19881,], +["ui_S_t[f.securebackup.impl.setup_SecureBackupSetupViewChange_null_SecureBackupSetupViewChange-Day-6_7_null_3,NEXUS_5,1.0,en]","ui_S_t[f.securebackup.impl.setup_SecureBackupSetupViewChange_null_SecureBackupSetupViewChange-Night-6_8_null_3,NEXUS_5,1.0,en]",19881,], +["ui_S_t[f.securebackup.impl.setup_SecureBackupSetupViewChange_null_SecureBackupSetupViewChange-Day-6_7_null_4,NEXUS_5,1.0,en]","ui_S_t[f.securebackup.impl.setup_SecureBackupSetupViewChange_null_SecureBackupSetupViewChange-Night-6_8_null_4,NEXUS_5,1.0,en]",19881,], +["ui_S_t[f.securebackup.impl.setup_SecureBackupSetupView_null_SecureBackupSetupView-Day-5_6_null_0,NEXUS_5,1.0,en]","ui_S_t[f.securebackup.impl.setup_SecureBackupSetupView_null_SecureBackupSetupView-Night-5_7_null_0,NEXUS_5,1.0,en]",19881,], +["ui_S_t[f.securebackup.impl.setup_SecureBackupSetupView_null_SecureBackupSetupView-Day-5_6_null_1,NEXUS_5,1.0,en]","ui_S_t[f.securebackup.impl.setup_SecureBackupSetupView_null_SecureBackupSetupView-Night-5_7_null_1,NEXUS_5,1.0,en]",19881,], +["ui_S_t[f.securebackup.impl.setup_SecureBackupSetupView_null_SecureBackupSetupView-Day-5_6_null_2,NEXUS_5,1.0,en]","ui_S_t[f.securebackup.impl.setup_SecureBackupSetupView_null_SecureBackupSetupView-Night-5_7_null_2,NEXUS_5,1.0,en]",19881,], +["ui_S_t[f.securebackup.impl.setup_SecureBackupSetupView_null_SecureBackupSetupView-Day-5_6_null_3,NEXUS_5,1.0,en]","ui_S_t[f.securebackup.impl.setup_SecureBackupSetupView_null_SecureBackupSetupView-Night-5_7_null_3,NEXUS_5,1.0,en]",19881,], +["ui_S_t[f.securebackup.impl.setup_SecureBackupSetupView_null_SecureBackupSetupView-Day-5_6_null_4,NEXUS_5,1.0,en]","ui_S_t[f.securebackup.impl.setup_SecureBackupSetupView_null_SecureBackupSetupView-Night-5_7_null_4,NEXUS_5,1.0,en]",19881,], ["ui_S_t[l.matrix.ui.components_SelectedRoom_null_SelectedRoom-Day-7_8_null_0,NEXUS_5,1.0,en]","ui_S_t[l.matrix.ui.components_SelectedRoom_null_SelectedRoom-Night-7_9_null_0,NEXUS_5,1.0,en]",0,], ["ui_S_t[l.matrix.ui.components_SelectedRoom_null_SelectedRoom-Day-7_8_null_1,NEXUS_5,1.0,en]","ui_S_t[l.matrix.ui.components_SelectedRoom_null_SelectedRoom-Night-7_9_null_1,NEXUS_5,1.0,en]",0,], ["ui_S_t[l.matrix.ui.components_SelectedUserCannotRemove_null_SelectedUserCannotRemove-Day-9_10_null,NEXUS_5,1.0,en]","ui_S_t[l.matrix.ui.components_SelectedUserCannotRemove_null_SelectedUserCannotRemove-Night-9_11_null,NEXUS_5,1.0,en]",0,], ["ui_S_t[l.matrix.ui.components_SelectedUser_null_SelectedUser-Day-8_9_null,NEXUS_5,1.0,en]","ui_S_t[l.matrix.ui.components_SelectedUser_null_SelectedUser-Night-8_10_null,NEXUS_5,1.0,en]",0,], ["ui_S_t[l.matrix.ui.components_SelectedUsersRowList_null_SelectedUsersRowList-Day-10_11_null,NEXUS_5,1.0,en]","ui_S_t[l.matrix.ui.components_SelectedUsersRowList_null_SelectedUsersRowList-Night-10_12_null,NEXUS_5,1.0,en]",0,], ["ui_S_t[l.textcomposer.components_SendButton_null_SendButton-Day-13_14_null,NEXUS_5,1.0,en]","ui_S_t[l.textcomposer.components_SendButton_null_SendButton-Night-13_15_null,NEXUS_5,1.0,en]",0,], -["ui_S_t[f.location.impl.send_SendLocationView_null_SendLocationView-Day-0_1_null_0,NEXUS_5,1.0,en]","ui_S_t[f.location.impl.send_SendLocationView_null_SendLocationView-Night-0_2_null_0,NEXUS_5,1.0,en]",19874,], -["ui_S_t[f.location.impl.send_SendLocationView_null_SendLocationView-Day-0_1_null_1,NEXUS_5,1.0,en]","ui_S_t[f.location.impl.send_SendLocationView_null_SendLocationView-Night-0_2_null_1,NEXUS_5,1.0,en]",19874,], -["ui_S_t[f.location.impl.send_SendLocationView_null_SendLocationView-Day-0_1_null_2,NEXUS_5,1.0,en]","ui_S_t[f.location.impl.send_SendLocationView_null_SendLocationView-Night-0_2_null_2,NEXUS_5,1.0,en]",19874,], -["ui_S_t[f.location.impl.send_SendLocationView_null_SendLocationView-Day-0_1_null_3,NEXUS_5,1.0,en]","ui_S_t[f.location.impl.send_SendLocationView_null_SendLocationView-Night-0_2_null_3,NEXUS_5,1.0,en]",19874,], -["ui_S_t[f.location.impl.send_SendLocationView_null_SendLocationView-Day-0_1_null_4,NEXUS_5,1.0,en]","ui_S_t[f.location.impl.send_SendLocationView_null_SendLocationView-Night-0_2_null_4,NEXUS_5,1.0,en]",19874,], +["ui_S_t[f.location.impl.send_SendLocationView_null_SendLocationView-Day-0_1_null_0,NEXUS_5,1.0,en]","ui_S_t[f.location.impl.send_SendLocationView_null_SendLocationView-Night-0_2_null_0,NEXUS_5,1.0,en]",19881,], +["ui_S_t[f.location.impl.send_SendLocationView_null_SendLocationView-Day-0_1_null_1,NEXUS_5,1.0,en]","ui_S_t[f.location.impl.send_SendLocationView_null_SendLocationView-Night-0_2_null_1,NEXUS_5,1.0,en]",19881,], +["ui_S_t[f.location.impl.send_SendLocationView_null_SendLocationView-Day-0_1_null_2,NEXUS_5,1.0,en]","ui_S_t[f.location.impl.send_SendLocationView_null_SendLocationView-Night-0_2_null_2,NEXUS_5,1.0,en]",19881,], +["ui_S_t[f.location.impl.send_SendLocationView_null_SendLocationView-Day-0_1_null_3,NEXUS_5,1.0,en]","ui_S_t[f.location.impl.send_SendLocationView_null_SendLocationView-Night-0_2_null_3,NEXUS_5,1.0,en]",19881,], +["ui_S_t[f.location.impl.send_SendLocationView_null_SendLocationView-Day-0_1_null_4,NEXUS_5,1.0,en]","ui_S_t[f.location.impl.send_SendLocationView_null_SendLocationView-Night-0_2_null_4,NEXUS_5,1.0,en]",19881,], ["ui_S_t[f.messages.impl.sender_SenderName_null_SenderName-Day-8_8_null_0,NEXUS_5,1.0,en]","ui_S_t[f.messages.impl.sender_SenderName_null_SenderName-Night-8_9_null_0,NEXUS_5,1.0,en]",0,], ["ui_S_t[f.messages.impl.sender_SenderName_null_SenderName-Day-8_8_null_1,NEXUS_5,1.0,en]","ui_S_t[f.messages.impl.sender_SenderName_null_SenderName-Night-8_9_null_1,NEXUS_5,1.0,en]",0,], ["ui_S_t[f.messages.impl.sender_SenderName_null_SenderName-Day-8_8_null_2,NEXUS_5,1.0,en]","ui_S_t[f.messages.impl.sender_SenderName_null_SenderName-Night-8_9_null_2,NEXUS_5,1.0,en]",0,], @@ -802,33 +803,37 @@ export const screenshots = [ ["ui_S_t[f.messages.impl.sender_SenderName_null_SenderName-Day-8_8_null_6,NEXUS_5,1.0,en]","ui_S_t[f.messages.impl.sender_SenderName_null_SenderName-Night-8_9_null_6,NEXUS_5,1.0,en]",0,], ["ui_S_t[f.messages.impl.sender_SenderName_null_SenderName-Day-8_8_null_7,NEXUS_5,1.0,en]","ui_S_t[f.messages.impl.sender_SenderName_null_SenderName-Night-8_9_null_7,NEXUS_5,1.0,en]",0,], ["ui_S_t[f.messages.impl.sender_SenderName_null_SenderName-Day-8_8_null_8,NEXUS_5,1.0,en]","ui_S_t[f.messages.impl.sender_SenderName_null_SenderName-Night-8_9_null_8,NEXUS_5,1.0,en]",0,], -["ui_S_t[f.lockscreen.impl.setup.biometric_SetupBiometricView_null_SetupBiometricView-Day-2_3_null_0,NEXUS_5,1.0,en]","ui_S_t[f.lockscreen.impl.setup.biometric_SetupBiometricView_null_SetupBiometricView-Night-2_4_null_0,NEXUS_5,1.0,en]",19874,], -["ui_S_t[f.lockscreen.impl.setup.pin_SetupPinView_null_SetupPinView-Day-3_4_null_0,NEXUS_5,1.0,en]","ui_S_t[f.lockscreen.impl.setup.pin_SetupPinView_null_SetupPinView-Night-3_5_null_0,NEXUS_5,1.0,en]",19874,], -["ui_S_t[f.lockscreen.impl.setup.pin_SetupPinView_null_SetupPinView-Day-3_4_null_1,NEXUS_5,1.0,en]","ui_S_t[f.lockscreen.impl.setup.pin_SetupPinView_null_SetupPinView-Night-3_5_null_1,NEXUS_5,1.0,en]",19874,], -["ui_S_t[f.lockscreen.impl.setup.pin_SetupPinView_null_SetupPinView-Day-3_4_null_2,NEXUS_5,1.0,en]","ui_S_t[f.lockscreen.impl.setup.pin_SetupPinView_null_SetupPinView-Night-3_5_null_2,NEXUS_5,1.0,en]",19874,], -["ui_S_t[f.lockscreen.impl.setup.pin_SetupPinView_null_SetupPinView-Day-3_4_null_3,NEXUS_5,1.0,en]","ui_S_t[f.lockscreen.impl.setup.pin_SetupPinView_null_SetupPinView-Night-3_5_null_3,NEXUS_5,1.0,en]",19874,], -["ui_S_t[f.lockscreen.impl.setup.pin_SetupPinView_null_SetupPinView-Day-3_4_null_4,NEXUS_5,1.0,en]","ui_S_t[f.lockscreen.impl.setup.pin_SetupPinView_null_SetupPinView-Night-3_5_null_4,NEXUS_5,1.0,en]",19874,], +["ui_S_t[f.lockscreen.impl.setup.biometric_SetupBiometricView_null_SetupBiometricView-Day-2_3_null_0,NEXUS_5,1.0,en]","ui_S_t[f.lockscreen.impl.setup.biometric_SetupBiometricView_null_SetupBiometricView-Night-2_4_null_0,NEXUS_5,1.0,en]",19881,], +["ui_S_t[f.lockscreen.impl.setup.pin_SetupPinView_null_SetupPinView-Day-3_4_null_0,NEXUS_5,1.0,en]","ui_S_t[f.lockscreen.impl.setup.pin_SetupPinView_null_SetupPinView-Night-3_5_null_0,NEXUS_5,1.0,en]",19881,], +["ui_S_t[f.lockscreen.impl.setup.pin_SetupPinView_null_SetupPinView-Day-3_4_null_1,NEXUS_5,1.0,en]","ui_S_t[f.lockscreen.impl.setup.pin_SetupPinView_null_SetupPinView-Night-3_5_null_1,NEXUS_5,1.0,en]",19881,], +["ui_S_t[f.lockscreen.impl.setup.pin_SetupPinView_null_SetupPinView-Day-3_4_null_2,NEXUS_5,1.0,en]","ui_S_t[f.lockscreen.impl.setup.pin_SetupPinView_null_SetupPinView-Night-3_5_null_2,NEXUS_5,1.0,en]",19881,], +["ui_S_t[f.lockscreen.impl.setup.pin_SetupPinView_null_SetupPinView-Day-3_4_null_3,NEXUS_5,1.0,en]","ui_S_t[f.lockscreen.impl.setup.pin_SetupPinView_null_SetupPinView-Night-3_5_null_3,NEXUS_5,1.0,en]",19881,], +["ui_S_t[f.lockscreen.impl.setup.pin_SetupPinView_null_SetupPinView-Day-3_4_null_4,NEXUS_5,1.0,en]","ui_S_t[f.lockscreen.impl.setup.pin_SetupPinView_null_SetupPinView-Night-3_5_null_4,NEXUS_5,1.0,en]",19881,], +["ui_S_t[f.share.impl_ShareView_null_ShareView-Day-0_1_null_0,NEXUS_5,1.0,en]","ui_S_t[f.share.impl_ShareView_null_ShareView-Night-0_2_null_0,NEXUS_5,1.0,en]",0,], +["ui_S_t[f.share.impl_ShareView_null_ShareView-Day-0_1_null_1,NEXUS_5,1.0,en]","ui_S_t[f.share.impl_ShareView_null_ShareView-Night-0_2_null_1,NEXUS_5,1.0,en]",0,], +["ui_S_t[f.share.impl_ShareView_null_ShareView-Day-0_1_null_2,NEXUS_5,1.0,en]","ui_S_t[f.share.impl_ShareView_null_ShareView-Night-0_2_null_2,NEXUS_5,1.0,en]",0,], +["ui_S_t[f.share.impl_ShareView_null_ShareView-Day-0_1_null_3,NEXUS_5,1.0,en]","ui_S_t[f.share.impl_ShareView_null_ShareView-Night-0_2_null_3,NEXUS_5,1.0,en]",0,], ["ui_S_t[f.messages.impl.actionlist_SheetContent_null_SheetContent-Day-1_1_null_0,NEXUS_5,1.0,en]","ui_S_t[f.messages.impl.actionlist_SheetContent_null_SheetContent-Night-1_2_null_0,NEXUS_5,1.0,en]",0,], ["ui_S_t[f.messages.impl.actionlist_SheetContent_null_SheetContent-Day-1_1_null_1,NEXUS_5,1.0,en]","ui_S_t[f.messages.impl.actionlist_SheetContent_null_SheetContent-Night-1_2_null_1,NEXUS_5,1.0,en]",0,], -["ui_S_t[f.messages.impl.actionlist_SheetContent_null_SheetContent-Day-1_1_null_10,NEXUS_5,1.0,en]","ui_S_t[f.messages.impl.actionlist_SheetContent_null_SheetContent-Night-1_2_null_10,NEXUS_5,1.0,en]",19874,], -["ui_S_t[f.messages.impl.actionlist_SheetContent_null_SheetContent-Day-1_1_null_2,NEXUS_5,1.0,en]","ui_S_t[f.messages.impl.actionlist_SheetContent_null_SheetContent-Night-1_2_null_2,NEXUS_5,1.0,en]",19874,], -["ui_S_t[f.messages.impl.actionlist_SheetContent_null_SheetContent-Day-1_1_null_3,NEXUS_5,1.0,en]","ui_S_t[f.messages.impl.actionlist_SheetContent_null_SheetContent-Night-1_2_null_3,NEXUS_5,1.0,en]",19874,], -["ui_S_t[f.messages.impl.actionlist_SheetContent_null_SheetContent-Day-1_1_null_4,NEXUS_5,1.0,en]","ui_S_t[f.messages.impl.actionlist_SheetContent_null_SheetContent-Night-1_2_null_4,NEXUS_5,1.0,en]",19874,], -["ui_S_t[f.messages.impl.actionlist_SheetContent_null_SheetContent-Day-1_1_null_5,NEXUS_5,1.0,en]","ui_S_t[f.messages.impl.actionlist_SheetContent_null_SheetContent-Night-1_2_null_5,NEXUS_5,1.0,en]",19874,], -["ui_S_t[f.messages.impl.actionlist_SheetContent_null_SheetContent-Day-1_1_null_6,NEXUS_5,1.0,en]","ui_S_t[f.messages.impl.actionlist_SheetContent_null_SheetContent-Night-1_2_null_6,NEXUS_5,1.0,en]",19874,], -["ui_S_t[f.messages.impl.actionlist_SheetContent_null_SheetContent-Day-1_1_null_7,NEXUS_5,1.0,en]","ui_S_t[f.messages.impl.actionlist_SheetContent_null_SheetContent-Night-1_2_null_7,NEXUS_5,1.0,en]",19874,], -["ui_S_t[f.messages.impl.actionlist_SheetContent_null_SheetContent-Day-1_1_null_8,NEXUS_5,1.0,en]","ui_S_t[f.messages.impl.actionlist_SheetContent_null_SheetContent-Night-1_2_null_8,NEXUS_5,1.0,en]",19874,], -["ui_S_t[f.messages.impl.actionlist_SheetContent_null_SheetContent-Day-1_1_null_9,NEXUS_5,1.0,en]","ui_S_t[f.messages.impl.actionlist_SheetContent_null_SheetContent-Night-1_2_null_9,NEXUS_5,1.0,en]",19874,], +["ui_S_t[f.messages.impl.actionlist_SheetContent_null_SheetContent-Day-1_1_null_10,NEXUS_5,1.0,en]","ui_S_t[f.messages.impl.actionlist_SheetContent_null_SheetContent-Night-1_2_null_10,NEXUS_5,1.0,en]",19881,], +["ui_S_t[f.messages.impl.actionlist_SheetContent_null_SheetContent-Day-1_1_null_2,NEXUS_5,1.0,en]","ui_S_t[f.messages.impl.actionlist_SheetContent_null_SheetContent-Night-1_2_null_2,NEXUS_5,1.0,en]",19881,], +["ui_S_t[f.messages.impl.actionlist_SheetContent_null_SheetContent-Day-1_1_null_3,NEXUS_5,1.0,en]","ui_S_t[f.messages.impl.actionlist_SheetContent_null_SheetContent-Night-1_2_null_3,NEXUS_5,1.0,en]",19881,], +["ui_S_t[f.messages.impl.actionlist_SheetContent_null_SheetContent-Day-1_1_null_4,NEXUS_5,1.0,en]","ui_S_t[f.messages.impl.actionlist_SheetContent_null_SheetContent-Night-1_2_null_4,NEXUS_5,1.0,en]",19881,], +["ui_S_t[f.messages.impl.actionlist_SheetContent_null_SheetContent-Day-1_1_null_5,NEXUS_5,1.0,en]","ui_S_t[f.messages.impl.actionlist_SheetContent_null_SheetContent-Night-1_2_null_5,NEXUS_5,1.0,en]",19881,], +["ui_S_t[f.messages.impl.actionlist_SheetContent_null_SheetContent-Day-1_1_null_6,NEXUS_5,1.0,en]","ui_S_t[f.messages.impl.actionlist_SheetContent_null_SheetContent-Night-1_2_null_6,NEXUS_5,1.0,en]",19881,], +["ui_S_t[f.messages.impl.actionlist_SheetContent_null_SheetContent-Day-1_1_null_7,NEXUS_5,1.0,en]","ui_S_t[f.messages.impl.actionlist_SheetContent_null_SheetContent-Night-1_2_null_7,NEXUS_5,1.0,en]",19881,], +["ui_S_t[f.messages.impl.actionlist_SheetContent_null_SheetContent-Day-1_1_null_8,NEXUS_5,1.0,en]","ui_S_t[f.messages.impl.actionlist_SheetContent_null_SheetContent-Night-1_2_null_8,NEXUS_5,1.0,en]",19881,], +["ui_S_t[f.messages.impl.actionlist_SheetContent_null_SheetContent-Day-1_1_null_9,NEXUS_5,1.0,en]","ui_S_t[f.messages.impl.actionlist_SheetContent_null_SheetContent-Night-1_2_null_9,NEXUS_5,1.0,en]",19881,], ["ui_S_t[f.messages.impl.timeline.components.reactionsummary_SheetContent_null_SheetContent-Day-56_56_null_0,NEXUS_5,1.0,en]","ui_S_t[f.messages.impl.timeline.components.reactionsummary_SheetContent_null_SheetContent-Night-56_57_null_0,NEXUS_5,1.0,en]",0,], -["ui_S_t[f.location.impl.show_ShowLocationView_null_ShowLocationView-Day-1_2_null_0,NEXUS_5,1.0,en]","ui_S_t[f.location.impl.show_ShowLocationView_null_ShowLocationView-Night-1_3_null_0,NEXUS_5,1.0,en]",19874,], -["ui_S_t[f.location.impl.show_ShowLocationView_null_ShowLocationView-Day-1_2_null_1,NEXUS_5,1.0,en]","ui_S_t[f.location.impl.show_ShowLocationView_null_ShowLocationView-Night-1_3_null_1,NEXUS_5,1.0,en]",19874,], -["ui_S_t[f.location.impl.show_ShowLocationView_null_ShowLocationView-Day-1_2_null_2,NEXUS_5,1.0,en]","ui_S_t[f.location.impl.show_ShowLocationView_null_ShowLocationView-Night-1_3_null_2,NEXUS_5,1.0,en]",19874,], -["ui_S_t[f.location.impl.show_ShowLocationView_null_ShowLocationView-Day-1_2_null_3,NEXUS_5,1.0,en]","ui_S_t[f.location.impl.show_ShowLocationView_null_ShowLocationView-Night-1_3_null_3,NEXUS_5,1.0,en]",19874,], -["ui_S_t[f.location.impl.show_ShowLocationView_null_ShowLocationView-Day-1_2_null_4,NEXUS_5,1.0,en]","ui_S_t[f.location.impl.show_ShowLocationView_null_ShowLocationView-Night-1_3_null_4,NEXUS_5,1.0,en]",19874,], -["ui_S_t[f.location.impl.show_ShowLocationView_null_ShowLocationView-Day-1_2_null_5,NEXUS_5,1.0,en]","ui_S_t[f.location.impl.show_ShowLocationView_null_ShowLocationView-Night-1_3_null_5,NEXUS_5,1.0,en]",19874,], -["ui_S_t[f.location.impl.show_ShowLocationView_null_ShowLocationView-Day-1_2_null_6,NEXUS_5,1.0,en]","ui_S_t[f.location.impl.show_ShowLocationView_null_ShowLocationView-Night-1_3_null_6,NEXUS_5,1.0,en]",19874,], -["ui_S_t[f.location.impl.show_ShowLocationView_null_ShowLocationView-Day-1_2_null_7,NEXUS_5,1.0,en]","ui_S_t[f.location.impl.show_ShowLocationView_null_ShowLocationView-Night-1_3_null_7,NEXUS_5,1.0,en]",19874,], -["ui_S_t[f.signedout.impl_SignedOutView_null_SignedOutView-Day-0_1_null_0,NEXUS_5,1.0,en]","ui_S_t[f.signedout.impl_SignedOutView_null_SignedOutView-Night-0_2_null_0,NEXUS_5,1.0,en]",19874,], +["ui_S_t[f.location.impl.show_ShowLocationView_null_ShowLocationView-Day-1_2_null_0,NEXUS_5,1.0,en]","ui_S_t[f.location.impl.show_ShowLocationView_null_ShowLocationView-Night-1_3_null_0,NEXUS_5,1.0,en]",19881,], +["ui_S_t[f.location.impl.show_ShowLocationView_null_ShowLocationView-Day-1_2_null_1,NEXUS_5,1.0,en]","ui_S_t[f.location.impl.show_ShowLocationView_null_ShowLocationView-Night-1_3_null_1,NEXUS_5,1.0,en]",19881,], +["ui_S_t[f.location.impl.show_ShowLocationView_null_ShowLocationView-Day-1_2_null_2,NEXUS_5,1.0,en]","ui_S_t[f.location.impl.show_ShowLocationView_null_ShowLocationView-Night-1_3_null_2,NEXUS_5,1.0,en]",19881,], +["ui_S_t[f.location.impl.show_ShowLocationView_null_ShowLocationView-Day-1_2_null_3,NEXUS_5,1.0,en]","ui_S_t[f.location.impl.show_ShowLocationView_null_ShowLocationView-Night-1_3_null_3,NEXUS_5,1.0,en]",19881,], +["ui_S_t[f.location.impl.show_ShowLocationView_null_ShowLocationView-Day-1_2_null_4,NEXUS_5,1.0,en]","ui_S_t[f.location.impl.show_ShowLocationView_null_ShowLocationView-Night-1_3_null_4,NEXUS_5,1.0,en]",19881,], +["ui_S_t[f.location.impl.show_ShowLocationView_null_ShowLocationView-Day-1_2_null_5,NEXUS_5,1.0,en]","ui_S_t[f.location.impl.show_ShowLocationView_null_ShowLocationView-Night-1_3_null_5,NEXUS_5,1.0,en]",19881,], +["ui_S_t[f.location.impl.show_ShowLocationView_null_ShowLocationView-Day-1_2_null_6,NEXUS_5,1.0,en]","ui_S_t[f.location.impl.show_ShowLocationView_null_ShowLocationView-Night-1_3_null_6,NEXUS_5,1.0,en]",19881,], +["ui_S_t[f.location.impl.show_ShowLocationView_null_ShowLocationView-Day-1_2_null_7,NEXUS_5,1.0,en]","ui_S_t[f.location.impl.show_ShowLocationView_null_ShowLocationView-Night-1_3_null_7,NEXUS_5,1.0,en]",19881,], +["ui_S_t[f.signedout.impl_SignedOutView_null_SignedOutView-Day-0_1_null_0,NEXUS_5,1.0,en]","ui_S_t[f.signedout.impl_SignedOutView_null_SignedOutView-Night-0_2_null_0,NEXUS_5,1.0,en]",19881,], ["ui_S_t[l.designsystem.components.dialogs_SingleSelectionDialogContent_null_Dialogs_SingleSelectionDialogContent_0_null,NEXUS_5,1.0,en]","",0,], ["ui_S_t[l.designsystem.components.dialogs_SingleSelectionDialog_null_SingleSelectionDialog-Day_0_null,NEXUS_5,1.0,en]","ui_S_t[l.designsystem.components.dialogs_SingleSelectionDialog_null_SingleSelectionDialog-Night_1_null,NEXUS_5,1.0,en]",0,], ["ui_S_t[l.designsystem.components.list_SingleSelectionListItemCustomFormattert_null_Listitems_SingleselectionListitem-customformatter_0_null,NEXUS_5,1.0,en]","",0,], @@ -837,7 +842,7 @@ export const screenshots = [ ["ui_S_t[l.designsystem.components.list_SingleSelectionListItemUnselectedWithSupportingText_null_Listitems_SingleselectionListitem-noselection,supportingtext_0_null,NEXUS_5,1.0,en]","",0,], ["ui_S_t[l.designsystem.components.list_SingleSelectionListItem_null_Listitems_SingleselectionListitem-noselection_0_null,NEXUS_5,1.0,en]","",0,], ["ui_S_t[l.designsystem.theme.components_Sliders_null_Sliders_Sliders_0_null,NEXUS_5,1.0,en]","",0,], -["ui_S_t[f.login.impl.dialogs_SlidingSyncNotSupportedDialog_null_SlidingSyncNotSupportedDialog-Day-2_3_null,NEXUS_5,1.0,en]","ui_S_t[f.login.impl.dialogs_SlidingSyncNotSupportedDialog_null_SlidingSyncNotSupportedDialog-Night-2_4_null,NEXUS_5,1.0,en]",19874,], +["ui_S_t[f.login.impl.dialogs_SlidingSyncNotSupportedDialog_null_SlidingSyncNotSupportedDialog-Day-2_3_null,NEXUS_5,1.0,en]","ui_S_t[f.login.impl.dialogs_SlidingSyncNotSupportedDialog_null_SlidingSyncNotSupportedDialog-Night-2_4_null,NEXUS_5,1.0,en]",19881,], ["ui_S_t[l.designsystem.theme.components_SnackbarWithActionAndCloseButton_null_Snackbars_Snackbarwithactionandclosebutton_0_null,NEXUS_5,1.0,en]","",0,], ["ui_S_t[l.designsystem.theme.components_SnackbarWithActionOnNewLineAndCloseButton_null_Snackbars_Snackbarwithactionandclosebuttononnewline_0_null,NEXUS_5,1.0,en]","",0,], ["ui_S_t[l.designsystem.theme.components_SnackbarWithActionOnNewLine_null_Snackbars_Snackbarwithactiononnewline_0_null,NEXUS_5,1.0,en]","",0,], @@ -847,23 +852,23 @@ export const screenshots = [ ["ui_S_t[l.designsystem.modifiers_SquareSizeModifierLargeHeight_null_SquareSizeModifierLargeHeight_0_null,NEXUS_5,1.0,en]","",0,], ["ui_S_t[l.designsystem.modifiers_SquareSizeModifierLargeWidth_null_SquareSizeModifierLargeWidth_0_null,NEXUS_5,1.0,en]","",0,], ["ui_S_t[f.location.api.internal_StaticMapPlaceholder_null_StaticMapPlaceholder-Day-1_2_null_0,NEXUS_5,1.0,en]","ui_S_t[f.location.api.internal_StaticMapPlaceholder_null_StaticMapPlaceholder-Night-1_3_null_0,NEXUS_5,1.0,en]",0,], -["ui_S_t[f.location.api.internal_StaticMapPlaceholder_null_StaticMapPlaceholder-Day-1_2_null_1,NEXUS_5,1.0,en]","ui_S_t[f.location.api.internal_StaticMapPlaceholder_null_StaticMapPlaceholder-Night-1_3_null_1,NEXUS_5,1.0,en]",19874,], +["ui_S_t[f.location.api.internal_StaticMapPlaceholder_null_StaticMapPlaceholder-Day-1_2_null_1,NEXUS_5,1.0,en]","ui_S_t[f.location.api.internal_StaticMapPlaceholder_null_StaticMapPlaceholder-Night-1_3_null_1,NEXUS_5,1.0,en]",19881,], ["ui_S_t[f.location.api_StaticMapView_null_StaticMapView-Day-0_1_null,NEXUS_5,1.0,en]","ui_S_t[f.location.api_StaticMapView_null_StaticMapView-Night-0_2_null,NEXUS_5,1.0,en]",0,], ["ui_S_t[l.designsystem.atomic.pages_SunsetPage_null_SunsetPage-Day_0_null,NEXUS_5,1.0,en]","ui_S_t[l.designsystem.atomic.pages_SunsetPage_null_SunsetPage-Night_1_null,NEXUS_5,1.0,en]",0,], ["ui_S_t[l.designsystem.components.button_SuperButton_null_SuperButton-Day_0_null,NEXUS_5,1.0,en]","ui_S_t[l.designsystem.components.button_SuperButton_null_SuperButton-Night_1_null,NEXUS_5,1.0,en]",0,], ["ui_S_t[l.designsystem.theme.components_Surface_null_Surface_0_null,NEXUS_5,1.0,en]","",0,], ["ui_S_t[l.designsystem.theme.components_Switch_null_Toggles_Switch_0_null,NEXUS_5,1.0,en]","",0,], -["ui_S_t[appnav.loggedin_SyncStateView_null_SyncStateView-Day-1_1_null,NEXUS_5,1.0,en]","ui_S_t[appnav.loggedin_SyncStateView_null_SyncStateView-Night-1_2_null,NEXUS_5,1.0,en]",19874,], +["ui_S_t[appnav.loggedin_SyncStateView_null_SyncStateView-Day-1_1_null,NEXUS_5,1.0,en]","ui_S_t[appnav.loggedin_SyncStateView_null_SyncStateView-Night-1_2_null,NEXUS_5,1.0,en]",19881,], ["ui_S_t[l.designsystem.theme.components_TextButtonLarge_null_Buttons_TextButtonLarge_0_null,NEXUS_5,1.0,en]","",0,], ["ui_S_t[l.designsystem.theme.components_TextButtonMedium_null_Buttons_TextButtonMedium_0_null,NEXUS_5,1.0,en]","",0,], ["ui_S_t[l.designsystem.theme.components_TextButtonSmall_null_Buttons_TextButtonSmall_0_null,NEXUS_5,1.0,en]","",0,], -["ui_S_t[l.textcomposer_TextComposerEdit_null_TextComposerEdit-Day-2_3_null,NEXUS_5,1.0,en]","ui_S_t[l.textcomposer_TextComposerEdit_null_TextComposerEdit-Night-2_4_null,NEXUS_5,1.0,en]",19874,], -["ui_S_t[l.textcomposer_TextComposerFormatting_null_TextComposerFormatting-Day-1_2_null,NEXUS_5,1.0,en]","ui_S_t[l.textcomposer_TextComposerFormatting_null_TextComposerFormatting-Night-1_3_null,NEXUS_5,1.0,en]",19874,], -["ui_S_t[l.textcomposer_TextComposerLinkDialogCreateLinkWithoutText_null_TextComposerLinkDialogCreateLinkWithoutText-Day-7_8_null,NEXUS_5,1.0,en]","ui_S_t[l.textcomposer_TextComposerLinkDialogCreateLinkWithoutText_null_TextComposerLinkDialogCreateLinkWithoutText-Night-7_9_null,NEXUS_5,1.0,en]",19874,], -["ui_S_t[l.textcomposer_TextComposerLinkDialogCreateLink_null_TextComposerLinkDialogCreateLink-Day-6_7_null,NEXUS_5,1.0,en]","ui_S_t[l.textcomposer_TextComposerLinkDialogCreateLink_null_TextComposerLinkDialogCreateLink-Night-6_8_null,NEXUS_5,1.0,en]",19874,], -["ui_S_t[l.textcomposer_TextComposerLinkDialogEditLink_null_TextComposerLinkDialogEditLink-Day-8_9_null,NEXUS_5,1.0,en]","ui_S_t[l.textcomposer_TextComposerLinkDialogEditLink_null_TextComposerLinkDialogEditLink-Night-8_10_null,NEXUS_5,1.0,en]",19874,], -["ui_S_t[l.textcomposer_TextComposerReply_null_TextComposerReply-Day-4_5_null,NEXUS_5,1.0,en]","ui_S_t[l.textcomposer_TextComposerReply_null_TextComposerReply-Night-4_6_null,NEXUS_5,1.0,en]",19874,], -["ui_S_t[l.textcomposer_TextComposerSimple_null_TextComposerSimple-Day-0_1_null,NEXUS_5,1.0,en]","ui_S_t[l.textcomposer_TextComposerSimple_null_TextComposerSimple-Night-0_2_null,NEXUS_5,1.0,en]",19874,], +["ui_S_t[l.textcomposer_TextComposerEdit_null_TextComposerEdit-Day-2_3_null,NEXUS_5,1.0,en]","ui_S_t[l.textcomposer_TextComposerEdit_null_TextComposerEdit-Night-2_4_null,NEXUS_5,1.0,en]",19881,], +["ui_S_t[l.textcomposer_TextComposerFormatting_null_TextComposerFormatting-Day-1_2_null,NEXUS_5,1.0,en]","ui_S_t[l.textcomposer_TextComposerFormatting_null_TextComposerFormatting-Night-1_3_null,NEXUS_5,1.0,en]",19881,], +["ui_S_t[l.textcomposer_TextComposerLinkDialogCreateLinkWithoutText_null_TextComposerLinkDialogCreateLinkWithoutText-Day-7_8_null,NEXUS_5,1.0,en]","ui_S_t[l.textcomposer_TextComposerLinkDialogCreateLinkWithoutText_null_TextComposerLinkDialogCreateLinkWithoutText-Night-7_9_null,NEXUS_5,1.0,en]",19881,], +["ui_S_t[l.textcomposer_TextComposerLinkDialogCreateLink_null_TextComposerLinkDialogCreateLink-Day-6_7_null,NEXUS_5,1.0,en]","ui_S_t[l.textcomposer_TextComposerLinkDialogCreateLink_null_TextComposerLinkDialogCreateLink-Night-6_8_null,NEXUS_5,1.0,en]",19881,], +["ui_S_t[l.textcomposer_TextComposerLinkDialogEditLink_null_TextComposerLinkDialogEditLink-Day-8_9_null,NEXUS_5,1.0,en]","ui_S_t[l.textcomposer_TextComposerLinkDialogEditLink_null_TextComposerLinkDialogEditLink-Night-8_10_null,NEXUS_5,1.0,en]",19881,], +["ui_S_t[l.textcomposer_TextComposerReply_null_TextComposerReply-Day-4_5_null,NEXUS_5,1.0,en]","ui_S_t[l.textcomposer_TextComposerReply_null_TextComposerReply-Night-4_6_null,NEXUS_5,1.0,en]",19881,], +["ui_S_t[l.textcomposer_TextComposerSimple_null_TextComposerSimple-Day-0_1_null,NEXUS_5,1.0,en]","ui_S_t[l.textcomposer_TextComposerSimple_null_TextComposerSimple-Night-0_2_null,NEXUS_5,1.0,en]",19881,], ["ui_S_t[l.textcomposer_TextComposerVoice_null_TextComposerVoice-Day-5_6_null,NEXUS_5,1.0,en]","ui_S_t[l.textcomposer_TextComposerVoice_null_TextComposerVoice-Night-5_7_null,NEXUS_5,1.0,en]",0,], ["ui_S_t[l.designsystem.theme.components_TextDark_null_Text_TextDark_0_null,NEXUS_5,1.0,en]","",0,], ["ui_S_t[l.designsystem.theme.components_TextFieldDark_null_TextFields_TextFieldDark_0_null,NEXUS_5,1.0,en]","",0,], @@ -875,35 +880,35 @@ export const screenshots = [ ["ui_S_t[l.designsystem.theme.components_TextFieldValueTextFieldDark_null_TextFields_TextFieldValueTextFieldDark_0_null,NEXUS_5,1.0,en]","",0,], ["ui_S_t[l.textcomposer.components_TextFormatting_null_TextFormatting-Day-14_15_null,NEXUS_5,1.0,en]","ui_S_t[l.textcomposer.components_TextFormatting_null_TextFormatting-Night-14_16_null,NEXUS_5,1.0,en]",0,], ["ui_S_t[l.designsystem.theme.components_TextLight_null_Text_TextLight_0_null,NEXUS_5,1.0,en]","",0,], -["ui_S_t[l.designsystem.theme.components.previews_TimePickerHorizontal_null_DateTimepickers_TimePickerHorizontal_0_null,NEXUS_5,1.0,en]","",19874,], -["ui_S_t[l.designsystem.theme.components.previews_TimePickerVerticalDark_null_DateTimepickers_TimePickerVerticalDark_0_null,NEXUS_5,1.0,en]","",19874,], -["ui_S_t[l.designsystem.theme.components.previews_TimePickerVerticalLight_null_DateTimepickers_TimePickerVerticalLight_0_null,NEXUS_5,1.0,en]","",19874,], +["ui_S_t[l.designsystem.theme.components.previews_TimePickerHorizontal_null_DateTimepickers_TimePickerHorizontal_0_null,NEXUS_5,1.0,en]","",19881,], +["ui_S_t[l.designsystem.theme.components.previews_TimePickerVerticalDark_null_DateTimepickers_TimePickerVerticalDark_0_null,NEXUS_5,1.0,en]","",19881,], +["ui_S_t[l.designsystem.theme.components.previews_TimePickerVerticalLight_null_DateTimepickers_TimePickerVerticalLight_0_null,NEXUS_5,1.0,en]","",19881,], ["ui_S_t[f.messages.impl.timeline.components_TimelineEventTimestampView_null_TimelineEventTimestampView-Day-16_16_null_0,NEXUS_5,1.0,en]","ui_S_t[f.messages.impl.timeline.components_TimelineEventTimestampView_null_TimelineEventTimestampView-Night-16_17_null_0,NEXUS_5,1.0,en]",0,], ["ui_S_t[f.messages.impl.timeline.components_TimelineEventTimestampView_null_TimelineEventTimestampView-Day-16_16_null_1,NEXUS_5,1.0,en]","ui_S_t[f.messages.impl.timeline.components_TimelineEventTimestampView_null_TimelineEventTimestampView-Night-16_17_null_1,NEXUS_5,1.0,en]",0,], -["ui_S_t[f.messages.impl.timeline.components_TimelineEventTimestampView_null_TimelineEventTimestampView-Day-16_16_null_2,NEXUS_5,1.0,en]","ui_S_t[f.messages.impl.timeline.components_TimelineEventTimestampView_null_TimelineEventTimestampView-Night-16_17_null_2,NEXUS_5,1.0,en]",19874,], -["ui_S_t[f.messages.impl.timeline.components_TimelineEventTimestampView_null_TimelineEventTimestampView-Day-16_16_null_3,NEXUS_5,1.0,en]","ui_S_t[f.messages.impl.timeline.components_TimelineEventTimestampView_null_TimelineEventTimestampView-Night-16_17_null_3,NEXUS_5,1.0,en]",19874,], +["ui_S_t[f.messages.impl.timeline.components_TimelineEventTimestampView_null_TimelineEventTimestampView-Day-16_16_null_2,NEXUS_5,1.0,en]","ui_S_t[f.messages.impl.timeline.components_TimelineEventTimestampView_null_TimelineEventTimestampView-Night-16_17_null_2,NEXUS_5,1.0,en]",19881,], +["ui_S_t[f.messages.impl.timeline.components_TimelineEventTimestampView_null_TimelineEventTimestampView-Day-16_16_null_3,NEXUS_5,1.0,en]","ui_S_t[f.messages.impl.timeline.components_TimelineEventTimestampView_null_TimelineEventTimestampView-Night-16_17_null_3,NEXUS_5,1.0,en]",19881,], ["ui_S_t[f.messages.impl.timeline.components.event_TimelineImageWithCaptionRow_null_TimelineImageWithCaptionRow-Day-40_40_null,NEXUS_5,1.0,en]","ui_S_t[f.messages.impl.timeline.components.event_TimelineImageWithCaptionRow_null_TimelineImageWithCaptionRow-Night-40_41_null,NEXUS_5,1.0,en]",0,], ["ui_S_t[f.messages.impl.timeline.components.event_TimelineItemAudioView_null_TimelineItemAudioView-Day-36_36_null_0,NEXUS_5,1.0,en]","ui_S_t[f.messages.impl.timeline.components.event_TimelineItemAudioView_null_TimelineItemAudioView-Night-36_37_null_0,NEXUS_5,1.0,en]",0,], ["ui_S_t[f.messages.impl.timeline.components.event_TimelineItemAudioView_null_TimelineItemAudioView-Day-36_36_null_1,NEXUS_5,1.0,en]","ui_S_t[f.messages.impl.timeline.components.event_TimelineItemAudioView_null_TimelineItemAudioView-Night-36_37_null_1,NEXUS_5,1.0,en]",0,], ["ui_S_t[f.messages.impl.timeline.components.event_TimelineItemAudioView_null_TimelineItemAudioView-Day-36_36_null_2,NEXUS_5,1.0,en]","ui_S_t[f.messages.impl.timeline.components.event_TimelineItemAudioView_null_TimelineItemAudioView-Night-36_37_null_2,NEXUS_5,1.0,en]",0,], ["ui_S_t[f.messages.impl.timeline.components.virtual_TimelineItemDaySeparatorView_null_TimelineItemDaySeparatorView-Day-61_61_null_0,NEXUS_5,1.0,en]","ui_S_t[f.messages.impl.timeline.components.virtual_TimelineItemDaySeparatorView_null_TimelineItemDaySeparatorView-Night-61_62_null_0,NEXUS_5,1.0,en]",0,], ["ui_S_t[f.messages.impl.timeline.components.virtual_TimelineItemDaySeparatorView_null_TimelineItemDaySeparatorView-Day-61_61_null_1,NEXUS_5,1.0,en]","ui_S_t[f.messages.impl.timeline.components.virtual_TimelineItemDaySeparatorView_null_TimelineItemDaySeparatorView-Night-61_62_null_1,NEXUS_5,1.0,en]",0,], -["ui_S_t[f.messages.impl.timeline.components.event_TimelineItemEncryptedView_null_TimelineItemEncryptedView-Day-37_37_null_0,NEXUS_5,1.0,en]","ui_S_t[f.messages.impl.timeline.components.event_TimelineItemEncryptedView_null_TimelineItemEncryptedView-Night-37_38_null_0,NEXUS_5,1.0,en]",19874,], -["ui_S_t[f.messages.impl.timeline.components.event_TimelineItemEncryptedView_null_TimelineItemEncryptedView-Day-37_37_null_1,NEXUS_5,1.0,en]","ui_S_t[f.messages.impl.timeline.components.event_TimelineItemEncryptedView_null_TimelineItemEncryptedView-Night-37_38_null_1,NEXUS_5,1.0,en]",19874,], -["ui_S_t[f.messages.impl.timeline.components.event_TimelineItemEncryptedView_null_TimelineItemEncryptedView-Day-37_37_null_2,NEXUS_5,1.0,en]","ui_S_t[f.messages.impl.timeline.components.event_TimelineItemEncryptedView_null_TimelineItemEncryptedView-Night-37_38_null_2,NEXUS_5,1.0,en]",19874,], +["ui_S_t[f.messages.impl.timeline.components.event_TimelineItemEncryptedView_null_TimelineItemEncryptedView-Day-37_37_null_0,NEXUS_5,1.0,en]","ui_S_t[f.messages.impl.timeline.components.event_TimelineItemEncryptedView_null_TimelineItemEncryptedView-Night-37_38_null_0,NEXUS_5,1.0,en]",19881,], +["ui_S_t[f.messages.impl.timeline.components.event_TimelineItemEncryptedView_null_TimelineItemEncryptedView-Day-37_37_null_1,NEXUS_5,1.0,en]","ui_S_t[f.messages.impl.timeline.components.event_TimelineItemEncryptedView_null_TimelineItemEncryptedView-Night-37_38_null_1,NEXUS_5,1.0,en]",19881,], +["ui_S_t[f.messages.impl.timeline.components.event_TimelineItemEncryptedView_null_TimelineItemEncryptedView-Day-37_37_null_2,NEXUS_5,1.0,en]","ui_S_t[f.messages.impl.timeline.components.event_TimelineItemEncryptedView_null_TimelineItemEncryptedView-Night-37_38_null_2,NEXUS_5,1.0,en]",19881,], ["ui_S_t[f.messages.impl.timeline.components_TimelineItemEventRowDisambiguated_null_TimelineItemEventRowDisambiguated-Day-18_18_null_0,NEXUS_5,1.0,en]","ui_S_t[f.messages.impl.timeline.components_TimelineItemEventRowDisambiguated_null_TimelineItemEventRowDisambiguated-Night-18_19_null_0,NEXUS_5,1.0,en]",0,], ["ui_S_t[f.messages.impl.timeline.components_TimelineItemEventRowForDirectRoom_null_TimelineItemEventRowForDirectRoom-Day-19_19_null,NEXUS_5,1.0,en]","ui_S_t[f.messages.impl.timeline.components_TimelineItemEventRowForDirectRoom_null_TimelineItemEventRowForDirectRoom-Night-19_20_null,NEXUS_5,1.0,en]",0,], ["ui_S_t[f.messages.impl.timeline.components_TimelineItemEventRowLongSenderName_null_TimelineItemEventRowLongSenderName_0_null,NEXUS_5,1.0,en]","",0,], ["ui_S_t[f.messages.impl.timeline.components_TimelineItemEventRowTimestamp_null_TimelineItemEventRowTimestamp-Day-20_20_null_0,NEXUS_5,1.0,en]","ui_S_t[f.messages.impl.timeline.components_TimelineItemEventRowTimestamp_null_TimelineItemEventRowTimestamp-Night-20_21_null_0,NEXUS_5,1.0,en]",0,], ["ui_S_t[f.messages.impl.timeline.components_TimelineItemEventRowTimestamp_null_TimelineItemEventRowTimestamp-Day-20_20_null_1,NEXUS_5,1.0,en]","ui_S_t[f.messages.impl.timeline.components_TimelineItemEventRowTimestamp_null_TimelineItemEventRowTimestamp-Night-20_21_null_1,NEXUS_5,1.0,en]",0,], -["ui_S_t[f.messages.impl.timeline.components_TimelineItemEventRowTimestamp_null_TimelineItemEventRowTimestamp-Day-20_20_null_2,NEXUS_5,1.0,en]","ui_S_t[f.messages.impl.timeline.components_TimelineItemEventRowTimestamp_null_TimelineItemEventRowTimestamp-Night-20_21_null_2,NEXUS_5,1.0,en]",19874,], -["ui_S_t[f.messages.impl.timeline.components_TimelineItemEventRowTimestamp_null_TimelineItemEventRowTimestamp-Day-20_20_null_3,NEXUS_5,1.0,en]","ui_S_t[f.messages.impl.timeline.components_TimelineItemEventRowTimestamp_null_TimelineItemEventRowTimestamp-Night-20_21_null_3,NEXUS_5,1.0,en]",19874,], -["ui_S_t[f.messages.impl.timeline.components_TimelineItemEventRowWithManyReactions_null_TimelineItemEventRowWithManyReactions-Day-21_21_null,NEXUS_5,1.0,en]","ui_S_t[f.messages.impl.timeline.components_TimelineItemEventRowWithManyReactions_null_TimelineItemEventRowWithManyReactions-Night-21_22_null,NEXUS_5,1.0,en]",19874,], +["ui_S_t[f.messages.impl.timeline.components_TimelineItemEventRowTimestamp_null_TimelineItemEventRowTimestamp-Day-20_20_null_2,NEXUS_5,1.0,en]","ui_S_t[f.messages.impl.timeline.components_TimelineItemEventRowTimestamp_null_TimelineItemEventRowTimestamp-Night-20_21_null_2,NEXUS_5,1.0,en]",19881,], +["ui_S_t[f.messages.impl.timeline.components_TimelineItemEventRowTimestamp_null_TimelineItemEventRowTimestamp-Day-20_20_null_3,NEXUS_5,1.0,en]","ui_S_t[f.messages.impl.timeline.components_TimelineItemEventRowTimestamp_null_TimelineItemEventRowTimestamp-Night-20_21_null_3,NEXUS_5,1.0,en]",19881,], +["ui_S_t[f.messages.impl.timeline.components_TimelineItemEventRowWithManyReactions_null_TimelineItemEventRowWithManyReactions-Day-21_21_null,NEXUS_5,1.0,en]","ui_S_t[f.messages.impl.timeline.components_TimelineItemEventRowWithManyReactions_null_TimelineItemEventRowWithManyReactions-Night-21_22_null,NEXUS_5,1.0,en]",19881,], ["ui_S_t[f.messages.impl.timeline.components_TimelineItemEventRowWithRR_null_TimelineItemEventRowWithRR-Day-22_22_null_0,NEXUS_5,1.0,en]","ui_S_t[f.messages.impl.timeline.components_TimelineItemEventRowWithRR_null_TimelineItemEventRowWithRR-Night-22_23_null_0,NEXUS_5,1.0,en]",0,], ["ui_S_t[f.messages.impl.timeline.components_TimelineItemEventRowWithRR_null_TimelineItemEventRowWithRR-Day-22_22_null_1,NEXUS_5,1.0,en]","ui_S_t[f.messages.impl.timeline.components_TimelineItemEventRowWithRR_null_TimelineItemEventRowWithRR-Night-22_23_null_1,NEXUS_5,1.0,en]",0,], ["ui_S_t[f.messages.impl.timeline.components_TimelineItemEventRowWithRR_null_TimelineItemEventRowWithRR-Day-22_22_null_2,NEXUS_5,1.0,en]","ui_S_t[f.messages.impl.timeline.components_TimelineItemEventRowWithRR_null_TimelineItemEventRowWithRR-Night-22_23_null_2,NEXUS_5,1.0,en]",0,], -["ui_S_t[f.messages.impl.timeline.components_TimelineItemEventRowWithReplyInformative_null_TimelineItemEventRowWithReplyInformative-Day-23_23_null_0,NEXUS_5,1.0,en]","ui_S_t[f.messages.impl.timeline.components_TimelineItemEventRowWithReplyInformative_null_TimelineItemEventRowWithReplyInformative-Night-23_24_null_0,NEXUS_5,1.0,en]",19874,], -["ui_S_t[f.messages.impl.timeline.components_TimelineItemEventRowWithReplyInformative_null_TimelineItemEventRowWithReplyInformative-Day-23_23_null_1,NEXUS_5,1.0,en]","ui_S_t[f.messages.impl.timeline.components_TimelineItemEventRowWithReplyInformative_null_TimelineItemEventRowWithReplyInformative-Night-23_24_null_1,NEXUS_5,1.0,en]",19874,], +["ui_S_t[f.messages.impl.timeline.components_TimelineItemEventRowWithReplyInformative_null_TimelineItemEventRowWithReplyInformative-Day-23_23_null_0,NEXUS_5,1.0,en]","ui_S_t[f.messages.impl.timeline.components_TimelineItemEventRowWithReplyInformative_null_TimelineItemEventRowWithReplyInformative-Night-23_24_null_0,NEXUS_5,1.0,en]",19881,], +["ui_S_t[f.messages.impl.timeline.components_TimelineItemEventRowWithReplyInformative_null_TimelineItemEventRowWithReplyInformative-Day-23_23_null_1,NEXUS_5,1.0,en]","ui_S_t[f.messages.impl.timeline.components_TimelineItemEventRowWithReplyInformative_null_TimelineItemEventRowWithReplyInformative-Night-23_24_null_1,NEXUS_5,1.0,en]",19881,], ["ui_S_t[f.messages.impl.timeline.components_TimelineItemEventRowWithReplyOther_null_TimelineItemEventRowWithReplyOther-Day-24_24_null_0,NEXUS_5,1.0,en]","ui_S_t[f.messages.impl.timeline.components_TimelineItemEventRowWithReplyOther_null_TimelineItemEventRowWithReplyOther-Night-24_25_null_0,NEXUS_5,1.0,en]",0,], ["ui_S_t[f.messages.impl.timeline.components_TimelineItemEventRowWithReplyOther_null_TimelineItemEventRowWithReplyOther-Day-24_24_null_1,NEXUS_5,1.0,en]","ui_S_t[f.messages.impl.timeline.components_TimelineItemEventRowWithReplyOther_null_TimelineItemEventRowWithReplyOther-Night-24_25_null_1,NEXUS_5,1.0,en]",0,], ["ui_S_t[f.messages.impl.timeline.components_TimelineItemEventRowWithReply_null_TimelineItemEventRowWithReply-Day-25_25_null_0,NEXUS_5,1.0,en]","ui_S_t[f.messages.impl.timeline.components_TimelineItemEventRowWithReply_null_TimelineItemEventRowWithReply-Night-25_26_null_0,NEXUS_5,1.0,en]",0,], @@ -912,36 +917,36 @@ export const screenshots = [ ["ui_S_t[f.messages.impl.timeline.components_TimelineItemEventRowWithReply_null_TimelineItemEventRowWithReply-Day-25_25_null_11,NEXUS_5,1.0,en]","ui_S_t[f.messages.impl.timeline.components_TimelineItemEventRowWithReply_null_TimelineItemEventRowWithReply-Night-25_26_null_11,NEXUS_5,1.0,en]",0,], ["ui_S_t[f.messages.impl.timeline.components_TimelineItemEventRowWithReply_null_TimelineItemEventRowWithReply-Day-25_25_null_2,NEXUS_5,1.0,en]","ui_S_t[f.messages.impl.timeline.components_TimelineItemEventRowWithReply_null_TimelineItemEventRowWithReply-Night-25_26_null_2,NEXUS_5,1.0,en]",0,], ["ui_S_t[f.messages.impl.timeline.components_TimelineItemEventRowWithReply_null_TimelineItemEventRowWithReply-Day-25_25_null_3,NEXUS_5,1.0,en]","ui_S_t[f.messages.impl.timeline.components_TimelineItemEventRowWithReply_null_TimelineItemEventRowWithReply-Night-25_26_null_3,NEXUS_5,1.0,en]",0,], -["ui_S_t[f.messages.impl.timeline.components_TimelineItemEventRowWithReply_null_TimelineItemEventRowWithReply-Day-25_25_null_4,NEXUS_5,1.0,en]","ui_S_t[f.messages.impl.timeline.components_TimelineItemEventRowWithReply_null_TimelineItemEventRowWithReply-Night-25_26_null_4,NEXUS_5,1.0,en]",19874,], +["ui_S_t[f.messages.impl.timeline.components_TimelineItemEventRowWithReply_null_TimelineItemEventRowWithReply-Day-25_25_null_4,NEXUS_5,1.0,en]","ui_S_t[f.messages.impl.timeline.components_TimelineItemEventRowWithReply_null_TimelineItemEventRowWithReply-Night-25_26_null_4,NEXUS_5,1.0,en]",19881,], ["ui_S_t[f.messages.impl.timeline.components_TimelineItemEventRowWithReply_null_TimelineItemEventRowWithReply-Day-25_25_null_5,NEXUS_5,1.0,en]","ui_S_t[f.messages.impl.timeline.components_TimelineItemEventRowWithReply_null_TimelineItemEventRowWithReply-Night-25_26_null_5,NEXUS_5,1.0,en]",0,], ["ui_S_t[f.messages.impl.timeline.components_TimelineItemEventRowWithReply_null_TimelineItemEventRowWithReply-Day-25_25_null_6,NEXUS_5,1.0,en]","ui_S_t[f.messages.impl.timeline.components_TimelineItemEventRowWithReply_null_TimelineItemEventRowWithReply-Night-25_26_null_6,NEXUS_5,1.0,en]",0,], ["ui_S_t[f.messages.impl.timeline.components_TimelineItemEventRowWithReply_null_TimelineItemEventRowWithReply-Day-25_25_null_7,NEXUS_5,1.0,en]","ui_S_t[f.messages.impl.timeline.components_TimelineItemEventRowWithReply_null_TimelineItemEventRowWithReply-Night-25_26_null_7,NEXUS_5,1.0,en]",0,], -["ui_S_t[f.messages.impl.timeline.components_TimelineItemEventRowWithReply_null_TimelineItemEventRowWithReply-Day-25_25_null_8,NEXUS_5,1.0,en]","ui_S_t[f.messages.impl.timeline.components_TimelineItemEventRowWithReply_null_TimelineItemEventRowWithReply-Night-25_26_null_8,NEXUS_5,1.0,en]",19874,], +["ui_S_t[f.messages.impl.timeline.components_TimelineItemEventRowWithReply_null_TimelineItemEventRowWithReply-Day-25_25_null_8,NEXUS_5,1.0,en]","ui_S_t[f.messages.impl.timeline.components_TimelineItemEventRowWithReply_null_TimelineItemEventRowWithReply-Night-25_26_null_8,NEXUS_5,1.0,en]",19881,], ["ui_S_t[f.messages.impl.timeline.components_TimelineItemEventRowWithReply_null_TimelineItemEventRowWithReply-Day-25_25_null_9,NEXUS_5,1.0,en]","ui_S_t[f.messages.impl.timeline.components_TimelineItemEventRowWithReply_null_TimelineItemEventRowWithReply-Night-25_26_null_9,NEXUS_5,1.0,en]",0,], ["ui_S_t[f.messages.impl.timeline.components_TimelineItemEventRow_null_TimelineItemEventRow-Day-17_17_null,NEXUS_5,1.0,en]","ui_S_t[f.messages.impl.timeline.components_TimelineItemEventRow_null_TimelineItemEventRow-Night-17_18_null,NEXUS_5,1.0,en]",0,], -["ui_S_t[f.messages.impl.timeline.components_TimelineItemEventTimestampBelow_null_TimelineItemEventTimestampBelow_0_null,NEXUS_5,1.0,en]","",19874,], +["ui_S_t[f.messages.impl.timeline.components_TimelineItemEventTimestampBelow_null_TimelineItemEventTimestampBelow_0_null,NEXUS_5,1.0,en]","",19881,], ["ui_S_t[f.messages.impl.timeline.components.event_TimelineItemFileView_null_TimelineItemFileView-Day-38_38_null_0,NEXUS_5,1.0,en]","ui_S_t[f.messages.impl.timeline.components.event_TimelineItemFileView_null_TimelineItemFileView-Night-38_39_null_0,NEXUS_5,1.0,en]",0,], ["ui_S_t[f.messages.impl.timeline.components.event_TimelineItemFileView_null_TimelineItemFileView-Day-38_38_null_1,NEXUS_5,1.0,en]","ui_S_t[f.messages.impl.timeline.components.event_TimelineItemFileView_null_TimelineItemFileView-Night-38_39_null_1,NEXUS_5,1.0,en]",0,], ["ui_S_t[f.messages.impl.timeline.components.event_TimelineItemFileView_null_TimelineItemFileView-Day-38_38_null_2,NEXUS_5,1.0,en]","ui_S_t[f.messages.impl.timeline.components.event_TimelineItemFileView_null_TimelineItemFileView-Night-38_39_null_2,NEXUS_5,1.0,en]",0,], -["ui_S_t[f.messages.impl.timeline.components_TimelineItemGroupedEventsRowContentCollapse_null_TimelineItemGroupedEventsRowContentCollapse-Day-27_27_null,NEXUS_5,1.0,en]","ui_S_t[f.messages.impl.timeline.components_TimelineItemGroupedEventsRowContentCollapse_null_TimelineItemGroupedEventsRowContentCollapse-Night-27_28_null,NEXUS_5,1.0,en]",19874,], -["ui_S_t[f.messages.impl.timeline.components_TimelineItemGroupedEventsRowContentExpanded_null_TimelineItemGroupedEventsRowContentExpanded-Day-26_26_null,NEXUS_5,1.0,en]","ui_S_t[f.messages.impl.timeline.components_TimelineItemGroupedEventsRowContentExpanded_null_TimelineItemGroupedEventsRowContentExpanded-Night-26_27_null,NEXUS_5,1.0,en]",19874,], +["ui_S_t[f.messages.impl.timeline.components_TimelineItemGroupedEventsRowContentCollapse_null_TimelineItemGroupedEventsRowContentCollapse-Day-27_27_null,NEXUS_5,1.0,en]","ui_S_t[f.messages.impl.timeline.components_TimelineItemGroupedEventsRowContentCollapse_null_TimelineItemGroupedEventsRowContentCollapse-Night-27_28_null,NEXUS_5,1.0,en]",19881,], +["ui_S_t[f.messages.impl.timeline.components_TimelineItemGroupedEventsRowContentExpanded_null_TimelineItemGroupedEventsRowContentExpanded-Day-26_26_null,NEXUS_5,1.0,en]","ui_S_t[f.messages.impl.timeline.components_TimelineItemGroupedEventsRowContentExpanded_null_TimelineItemGroupedEventsRowContentExpanded-Night-26_27_null,NEXUS_5,1.0,en]",19881,], ["ui_S_t[f.messages.impl.timeline.components.event_TimelineItemImageView_null_TimelineItemImageView-Day-39_39_null_0,NEXUS_5,1.0,en]","ui_S_t[f.messages.impl.timeline.components.event_TimelineItemImageView_null_TimelineItemImageView-Night-39_40_null_0,NEXUS_5,1.0,en]",0,], ["ui_S_t[f.messages.impl.timeline.components.event_TimelineItemImageView_null_TimelineItemImageView-Day-39_39_null_1,NEXUS_5,1.0,en]","ui_S_t[f.messages.impl.timeline.components.event_TimelineItemImageView_null_TimelineItemImageView-Night-39_40_null_1,NEXUS_5,1.0,en]",0,], ["ui_S_t[f.messages.impl.timeline.components.event_TimelineItemImageView_null_TimelineItemImageView-Day-39_39_null_2,NEXUS_5,1.0,en]","ui_S_t[f.messages.impl.timeline.components.event_TimelineItemImageView_null_TimelineItemImageView-Night-39_40_null_2,NEXUS_5,1.0,en]",0,], ["ui_S_t[f.messages.impl.timeline.components.event_TimelineItemInformativeView_null_TimelineItemInformativeView-Day-41_41_null,NEXUS_5,1.0,en]","ui_S_t[f.messages.impl.timeline.components.event_TimelineItemInformativeView_null_TimelineItemInformativeView-Night-41_42_null,NEXUS_5,1.0,en]",0,], -["ui_S_t[f.messages.impl.timeline.components.event_TimelineItemLegacyCallInviteView_null_TimelineItemLegacyCallInviteView-Day-42_42_null,NEXUS_5,1.0,en]","ui_S_t[f.messages.impl.timeline.components.event_TimelineItemLegacyCallInviteView_null_TimelineItemLegacyCallInviteView-Night-42_43_null,NEXUS_5,1.0,en]",19874,], +["ui_S_t[f.messages.impl.timeline.components.event_TimelineItemLegacyCallInviteView_null_TimelineItemLegacyCallInviteView-Day-42_42_null,NEXUS_5,1.0,en]","ui_S_t[f.messages.impl.timeline.components.event_TimelineItemLegacyCallInviteView_null_TimelineItemLegacyCallInviteView-Night-42_43_null,NEXUS_5,1.0,en]",19881,], ["ui_S_t[f.messages.impl.timeline.components.event_TimelineItemLocationView_null_TimelineItemLocationView-Day-43_43_null_0,NEXUS_5,1.0,en]","ui_S_t[f.messages.impl.timeline.components.event_TimelineItemLocationView_null_TimelineItemLocationView-Night-43_44_null_0,NEXUS_5,1.0,en]",0,], ["ui_S_t[f.messages.impl.timeline.components.event_TimelineItemLocationView_null_TimelineItemLocationView-Day-43_43_null_1,NEXUS_5,1.0,en]","ui_S_t[f.messages.impl.timeline.components.event_TimelineItemLocationView_null_TimelineItemLocationView-Night-43_44_null_1,NEXUS_5,1.0,en]",0,], -["ui_S_t[f.messages.impl.timeline.components.event_TimelineItemPollView_null_TimelineItemPollView-Day-44_44_null_0,NEXUS_5,1.0,en]","ui_S_t[f.messages.impl.timeline.components.event_TimelineItemPollView_null_TimelineItemPollView-Night-44_45_null_0,NEXUS_5,1.0,en]",19874,], -["ui_S_t[f.messages.impl.timeline.components.event_TimelineItemPollView_null_TimelineItemPollView-Day-44_44_null_1,NEXUS_5,1.0,en]","ui_S_t[f.messages.impl.timeline.components.event_TimelineItemPollView_null_TimelineItemPollView-Night-44_45_null_1,NEXUS_5,1.0,en]",19874,], -["ui_S_t[f.messages.impl.timeline.components.event_TimelineItemPollView_null_TimelineItemPollView-Day-44_44_null_2,NEXUS_5,1.0,en]","ui_S_t[f.messages.impl.timeline.components.event_TimelineItemPollView_null_TimelineItemPollView-Night-44_45_null_2,NEXUS_5,1.0,en]",19874,], -["ui_S_t[f.messages.impl.timeline.components.event_TimelineItemPollView_null_TimelineItemPollView-Day-44_44_null_3,NEXUS_5,1.0,en]","ui_S_t[f.messages.impl.timeline.components.event_TimelineItemPollView_null_TimelineItemPollView-Night-44_45_null_3,NEXUS_5,1.0,en]",19874,], -["ui_S_t[f.messages.impl.timeline.components_TimelineItemReactionsLayout_null_TimelineItemReactionsLayout-Day-28_28_null,NEXUS_5,1.0,en]","ui_S_t[f.messages.impl.timeline.components_TimelineItemReactionsLayout_null_TimelineItemReactionsLayout-Night-28_29_null,NEXUS_5,1.0,en]",19874,], +["ui_S_t[f.messages.impl.timeline.components.event_TimelineItemPollView_null_TimelineItemPollView-Day-44_44_null_0,NEXUS_5,1.0,en]","ui_S_t[f.messages.impl.timeline.components.event_TimelineItemPollView_null_TimelineItemPollView-Night-44_45_null_0,NEXUS_5,1.0,en]",19881,], +["ui_S_t[f.messages.impl.timeline.components.event_TimelineItemPollView_null_TimelineItemPollView-Day-44_44_null_1,NEXUS_5,1.0,en]","ui_S_t[f.messages.impl.timeline.components.event_TimelineItemPollView_null_TimelineItemPollView-Night-44_45_null_1,NEXUS_5,1.0,en]",19881,], +["ui_S_t[f.messages.impl.timeline.components.event_TimelineItemPollView_null_TimelineItemPollView-Day-44_44_null_2,NEXUS_5,1.0,en]","ui_S_t[f.messages.impl.timeline.components.event_TimelineItemPollView_null_TimelineItemPollView-Night-44_45_null_2,NEXUS_5,1.0,en]",19881,], +["ui_S_t[f.messages.impl.timeline.components.event_TimelineItemPollView_null_TimelineItemPollView-Day-44_44_null_3,NEXUS_5,1.0,en]","ui_S_t[f.messages.impl.timeline.components.event_TimelineItemPollView_null_TimelineItemPollView-Night-44_45_null_3,NEXUS_5,1.0,en]",19881,], +["ui_S_t[f.messages.impl.timeline.components_TimelineItemReactionsLayout_null_TimelineItemReactionsLayout-Day-28_28_null,NEXUS_5,1.0,en]","ui_S_t[f.messages.impl.timeline.components_TimelineItemReactionsLayout_null_TimelineItemReactionsLayout-Night-28_29_null,NEXUS_5,1.0,en]",19881,], ["ui_S_t[f.messages.impl.timeline.components_TimelineItemReactionsViewFew_null_TimelineItemReactionsViewFew-Day-30_30_null,NEXUS_5,1.0,en]","ui_S_t[f.messages.impl.timeline.components_TimelineItemReactionsViewFew_null_TimelineItemReactionsViewFew-Night-30_31_null,NEXUS_5,1.0,en]",0,], -["ui_S_t[f.messages.impl.timeline.components_TimelineItemReactionsViewIncoming_null_TimelineItemReactionsViewIncoming-Day-31_31_null,NEXUS_5,1.0,en]","ui_S_t[f.messages.impl.timeline.components_TimelineItemReactionsViewIncoming_null_TimelineItemReactionsViewIncoming-Night-31_32_null,NEXUS_5,1.0,en]",19874,], -["ui_S_t[f.messages.impl.timeline.components_TimelineItemReactionsViewOutgoing_null_TimelineItemReactionsViewOutgoing-Day-32_32_null,NEXUS_5,1.0,en]","ui_S_t[f.messages.impl.timeline.components_TimelineItemReactionsViewOutgoing_null_TimelineItemReactionsViewOutgoing-Night-32_33_null,NEXUS_5,1.0,en]",19874,], +["ui_S_t[f.messages.impl.timeline.components_TimelineItemReactionsViewIncoming_null_TimelineItemReactionsViewIncoming-Day-31_31_null,NEXUS_5,1.0,en]","ui_S_t[f.messages.impl.timeline.components_TimelineItemReactionsViewIncoming_null_TimelineItemReactionsViewIncoming-Night-31_32_null,NEXUS_5,1.0,en]",19881,], +["ui_S_t[f.messages.impl.timeline.components_TimelineItemReactionsViewOutgoing_null_TimelineItemReactionsViewOutgoing-Day-32_32_null,NEXUS_5,1.0,en]","ui_S_t[f.messages.impl.timeline.components_TimelineItemReactionsViewOutgoing_null_TimelineItemReactionsViewOutgoing-Night-32_33_null,NEXUS_5,1.0,en]",19881,], ["ui_S_t[f.messages.impl.timeline.components_TimelineItemReactionsView_null_TimelineItemReactionsView-Day-29_29_null,NEXUS_5,1.0,en]","ui_S_t[f.messages.impl.timeline.components_TimelineItemReactionsView_null_TimelineItemReactionsView-Night-29_30_null,NEXUS_5,1.0,en]",0,], -["ui_S_t[f.messages.impl.timeline.components.virtual_TimelineItemReadMarkerView_null_TimelineItemReadMarkerView-Day-62_62_null,NEXUS_5,1.0,en]","ui_S_t[f.messages.impl.timeline.components.virtual_TimelineItemReadMarkerView_null_TimelineItemReadMarkerView-Night-62_63_null,NEXUS_5,1.0,en]",19874,], +["ui_S_t[f.messages.impl.timeline.components.virtual_TimelineItemReadMarkerView_null_TimelineItemReadMarkerView-Day-62_62_null,NEXUS_5,1.0,en]","ui_S_t[f.messages.impl.timeline.components.virtual_TimelineItemReadMarkerView_null_TimelineItemReadMarkerView-Night-62_63_null,NEXUS_5,1.0,en]",19881,], ["ui_S_t[f.messages.impl.timeline.components.receipt_TimelineItemReadReceiptView_null_TimelineItemReadReceiptView-Day-57_57_null_0,NEXUS_5,1.0,en]","ui_S_t[f.messages.impl.timeline.components.receipt_TimelineItemReadReceiptView_null_TimelineItemReadReceiptView-Night-57_58_null_0,NEXUS_5,1.0,en]",0,], ["ui_S_t[f.messages.impl.timeline.components.receipt_TimelineItemReadReceiptView_null_TimelineItemReadReceiptView-Day-57_57_null_1,NEXUS_5,1.0,en]","ui_S_t[f.messages.impl.timeline.components.receipt_TimelineItemReadReceiptView_null_TimelineItemReadReceiptView-Night-57_58_null_1,NEXUS_5,1.0,en]",0,], ["ui_S_t[f.messages.impl.timeline.components.receipt_TimelineItemReadReceiptView_null_TimelineItemReadReceiptView-Day-57_57_null_2,NEXUS_5,1.0,en]","ui_S_t[f.messages.impl.timeline.components.receipt_TimelineItemReadReceiptView_null_TimelineItemReadReceiptView-Night-57_58_null_2,NEXUS_5,1.0,en]",0,], @@ -950,8 +955,8 @@ export const screenshots = [ ["ui_S_t[f.messages.impl.timeline.components.receipt_TimelineItemReadReceiptView_null_TimelineItemReadReceiptView-Day-57_57_null_5,NEXUS_5,1.0,en]","ui_S_t[f.messages.impl.timeline.components.receipt_TimelineItemReadReceiptView_null_TimelineItemReadReceiptView-Night-57_58_null_5,NEXUS_5,1.0,en]",0,], ["ui_S_t[f.messages.impl.timeline.components.receipt_TimelineItemReadReceiptView_null_TimelineItemReadReceiptView-Day-57_57_null_6,NEXUS_5,1.0,en]","ui_S_t[f.messages.impl.timeline.components.receipt_TimelineItemReadReceiptView_null_TimelineItemReadReceiptView-Night-57_58_null_6,NEXUS_5,1.0,en]",0,], ["ui_S_t[f.messages.impl.timeline.components.receipt_TimelineItemReadReceiptView_null_TimelineItemReadReceiptView-Day-57_57_null_7,NEXUS_5,1.0,en]","ui_S_t[f.messages.impl.timeline.components.receipt_TimelineItemReadReceiptView_null_TimelineItemReadReceiptView-Night-57_58_null_7,NEXUS_5,1.0,en]",0,], -["ui_S_t[f.messages.impl.timeline.components.event_TimelineItemRedactedView_null_TimelineItemRedactedView-Day-45_45_null,NEXUS_5,1.0,en]","ui_S_t[f.messages.impl.timeline.components.event_TimelineItemRedactedView_null_TimelineItemRedactedView-Night-45_46_null,NEXUS_5,1.0,en]",19874,], -["ui_S_t[f.messages.impl.timeline.components.virtual_TimelineItemRoomBeginningView_null_TimelineItemRoomBeginningView-Day-63_63_null,NEXUS_5,1.0,en]","ui_S_t[f.messages.impl.timeline.components.virtual_TimelineItemRoomBeginningView_null_TimelineItemRoomBeginningView-Night-63_64_null,NEXUS_5,1.0,en]",19874,], +["ui_S_t[f.messages.impl.timeline.components.event_TimelineItemRedactedView_null_TimelineItemRedactedView-Day-45_45_null,NEXUS_5,1.0,en]","ui_S_t[f.messages.impl.timeline.components.event_TimelineItemRedactedView_null_TimelineItemRedactedView-Night-45_46_null,NEXUS_5,1.0,en]",19881,], +["ui_S_t[f.messages.impl.timeline.components.virtual_TimelineItemRoomBeginningView_null_TimelineItemRoomBeginningView-Day-63_63_null,NEXUS_5,1.0,en]","ui_S_t[f.messages.impl.timeline.components.virtual_TimelineItemRoomBeginningView_null_TimelineItemRoomBeginningView-Night-63_64_null,NEXUS_5,1.0,en]",19881,], ["ui_S_t[f.messages.impl.timeline.components_TimelineItemStateEventRow_null_TimelineItemStateEventRow-Day-33_33_null,NEXUS_5,1.0,en]","ui_S_t[f.messages.impl.timeline.components_TimelineItemStateEventRow_null_TimelineItemStateEventRow-Night-33_34_null,NEXUS_5,1.0,en]",0,], ["ui_S_t[f.messages.impl.timeline.components.event_TimelineItemStateView_null_TimelineItemStateView-Day-46_46_null,NEXUS_5,1.0,en]","ui_S_t[f.messages.impl.timeline.components.event_TimelineItemStateView_null_TimelineItemStateView-Night-46_47_null,NEXUS_5,1.0,en]",0,], ["ui_S_t[f.messages.impl.timeline.components.event_TimelineItemStickerView_null_TimelineItemStickerView-Day-47_47_null_0,NEXUS_5,1.0,en]","ui_S_t[f.messages.impl.timeline.components.event_TimelineItemStickerView_null_TimelineItemStickerView-Night-47_48_null_0,NEXUS_5,1.0,en]",0,], @@ -963,7 +968,7 @@ export const screenshots = [ ["ui_S_t[f.messages.impl.timeline.components.event_TimelineItemTextView_null_TimelineItemTextView-Day-48_48_null_3,NEXUS_5,1.0,en]","ui_S_t[f.messages.impl.timeline.components.event_TimelineItemTextView_null_TimelineItemTextView-Night-48_49_null_3,NEXUS_5,1.0,en]",0,], ["ui_S_t[f.messages.impl.timeline.components.event_TimelineItemTextView_null_TimelineItemTextView-Day-48_48_null_4,NEXUS_5,1.0,en]","ui_S_t[f.messages.impl.timeline.components.event_TimelineItemTextView_null_TimelineItemTextView-Night-48_49_null_4,NEXUS_5,1.0,en]",0,], ["ui_S_t[f.messages.impl.timeline.components.event_TimelineItemTextView_null_TimelineItemTextView-Day-48_48_null_5,NEXUS_5,1.0,en]","ui_S_t[f.messages.impl.timeline.components.event_TimelineItemTextView_null_TimelineItemTextView-Night-48_49_null_5,NEXUS_5,1.0,en]",0,], -["ui_S_t[f.messages.impl.timeline.components.event_TimelineItemUnknownView_null_TimelineItemUnknownView-Day-49_49_null,NEXUS_5,1.0,en]","ui_S_t[f.messages.impl.timeline.components.event_TimelineItemUnknownView_null_TimelineItemUnknownView-Night-49_50_null,NEXUS_5,1.0,en]",19874,], +["ui_S_t[f.messages.impl.timeline.components.event_TimelineItemUnknownView_null_TimelineItemUnknownView-Day-49_49_null,NEXUS_5,1.0,en]","ui_S_t[f.messages.impl.timeline.components.event_TimelineItemUnknownView_null_TimelineItemUnknownView-Night-49_50_null,NEXUS_5,1.0,en]",19881,], ["ui_S_t[f.messages.impl.timeline.components.event_TimelineItemVideoView_null_TimelineItemVideoView-Day-50_50_null_0,NEXUS_5,1.0,en]","ui_S_t[f.messages.impl.timeline.components.event_TimelineItemVideoView_null_TimelineItemVideoView-Night-50_51_null_0,NEXUS_5,1.0,en]",0,], ["ui_S_t[f.messages.impl.timeline.components.event_TimelineItemVideoView_null_TimelineItemVideoView-Day-50_50_null_1,NEXUS_5,1.0,en]","ui_S_t[f.messages.impl.timeline.components.event_TimelineItemVideoView_null_TimelineItemVideoView-Night-50_51_null_1,NEXUS_5,1.0,en]",0,], ["ui_S_t[f.messages.impl.timeline.components.event_TimelineItemVideoView_null_TimelineItemVideoView-Day-50_50_null_2,NEXUS_5,1.0,en]","ui_S_t[f.messages.impl.timeline.components.event_TimelineItemVideoView_null_TimelineItemVideoView-Night-50_51_null_2,NEXUS_5,1.0,en]",0,], @@ -985,78 +990,78 @@ export const screenshots = [ ["ui_S_t[f.messages.impl.timeline.components.event_TimelineItemVoiceView_null_TimelineItemVoiceView-Day-52_52_null_9,NEXUS_5,1.0,en]","ui_S_t[f.messages.impl.timeline.components.event_TimelineItemVoiceView_null_TimelineItemVoiceView-Night-52_53_null_9,NEXUS_5,1.0,en]",0,], ["ui_S_t[f.messages.impl.timeline.components.virtual_TimelineLoadingMoreIndicator_null_TimelineLoadingMoreIndicator-Day-64_64_null,NEXUS_5,1.0,en]","ui_S_t[f.messages.impl.timeline.components.virtual_TimelineLoadingMoreIndicator_null_TimelineLoadingMoreIndicator-Night-64_65_null,NEXUS_5,1.0,en]",0,], ["ui_S_t[f.messages.impl.timeline.components.event_TimelineVideoWithCaptionRow_null_TimelineVideoWithCaptionRow-Day-51_51_null,NEXUS_5,1.0,en]","ui_S_t[f.messages.impl.timeline.components.event_TimelineVideoWithCaptionRow_null_TimelineVideoWithCaptionRow-Night-51_52_null,NEXUS_5,1.0,en]",0,], -["ui_S_t[f.messages.impl.timeline_TimelineView_null_TimelineView-Day-9_9_null_0,NEXUS_5,1.0,en]","ui_S_t[f.messages.impl.timeline_TimelineView_null_TimelineView-Night-9_10_null_0,NEXUS_5,1.0,en]",19874,], -["ui_S_t[f.messages.impl.timeline_TimelineView_null_TimelineView-Day-9_9_null_1,NEXUS_5,1.0,en]","ui_S_t[f.messages.impl.timeline_TimelineView_null_TimelineView-Night-9_10_null_1,NEXUS_5,1.0,en]",19874,], +["ui_S_t[f.messages.impl.timeline_TimelineView_null_TimelineView-Day-9_9_null_0,NEXUS_5,1.0,en]","ui_S_t[f.messages.impl.timeline_TimelineView_null_TimelineView-Night-9_10_null_0,NEXUS_5,1.0,en]",19881,], +["ui_S_t[f.messages.impl.timeline_TimelineView_null_TimelineView-Day-9_9_null_1,NEXUS_5,1.0,en]","ui_S_t[f.messages.impl.timeline_TimelineView_null_TimelineView-Night-9_10_null_1,NEXUS_5,1.0,en]",19881,], ["ui_S_t[f.messages.impl.timeline_TimelineView_null_TimelineView-Day-9_9_null_10,NEXUS_5,1.0,en]","ui_S_t[f.messages.impl.timeline_TimelineView_null_TimelineView-Night-9_10_null_10,NEXUS_5,1.0,en]",0,], -["ui_S_t[f.messages.impl.timeline_TimelineView_null_TimelineView-Day-9_9_null_11,NEXUS_5,1.0,en]","ui_S_t[f.messages.impl.timeline_TimelineView_null_TimelineView-Night-9_10_null_11,NEXUS_5,1.0,en]",19874,], -["ui_S_t[f.messages.impl.timeline_TimelineView_null_TimelineView-Day-9_9_null_12,NEXUS_5,1.0,en]","ui_S_t[f.messages.impl.timeline_TimelineView_null_TimelineView-Night-9_10_null_12,NEXUS_5,1.0,en]",19874,], -["ui_S_t[f.messages.impl.timeline_TimelineView_null_TimelineView-Day-9_9_null_13,NEXUS_5,1.0,en]","ui_S_t[f.messages.impl.timeline_TimelineView_null_TimelineView-Night-9_10_null_13,NEXUS_5,1.0,en]",19874,], -["ui_S_t[f.messages.impl.timeline_TimelineView_null_TimelineView-Day-9_9_null_14,NEXUS_5,1.0,en]","ui_S_t[f.messages.impl.timeline_TimelineView_null_TimelineView-Night-9_10_null_14,NEXUS_5,1.0,en]",19874,], -["ui_S_t[f.messages.impl.timeline_TimelineView_null_TimelineView-Day-9_9_null_15,NEXUS_5,1.0,en]","ui_S_t[f.messages.impl.timeline_TimelineView_null_TimelineView-Night-9_10_null_15,NEXUS_5,1.0,en]",19874,], -["ui_S_t[f.messages.impl.timeline_TimelineView_null_TimelineView-Day-9_9_null_16,NEXUS_5,1.0,en]","ui_S_t[f.messages.impl.timeline_TimelineView_null_TimelineView-Night-9_10_null_16,NEXUS_5,1.0,en]",19874,], +["ui_S_t[f.messages.impl.timeline_TimelineView_null_TimelineView-Day-9_9_null_11,NEXUS_5,1.0,en]","ui_S_t[f.messages.impl.timeline_TimelineView_null_TimelineView-Night-9_10_null_11,NEXUS_5,1.0,en]",19881,], +["ui_S_t[f.messages.impl.timeline_TimelineView_null_TimelineView-Day-9_9_null_12,NEXUS_5,1.0,en]","ui_S_t[f.messages.impl.timeline_TimelineView_null_TimelineView-Night-9_10_null_12,NEXUS_5,1.0,en]",19881,], +["ui_S_t[f.messages.impl.timeline_TimelineView_null_TimelineView-Day-9_9_null_13,NEXUS_5,1.0,en]","ui_S_t[f.messages.impl.timeline_TimelineView_null_TimelineView-Night-9_10_null_13,NEXUS_5,1.0,en]",19881,], +["ui_S_t[f.messages.impl.timeline_TimelineView_null_TimelineView-Day-9_9_null_14,NEXUS_5,1.0,en]","ui_S_t[f.messages.impl.timeline_TimelineView_null_TimelineView-Night-9_10_null_14,NEXUS_5,1.0,en]",19881,], +["ui_S_t[f.messages.impl.timeline_TimelineView_null_TimelineView-Day-9_9_null_15,NEXUS_5,1.0,en]","ui_S_t[f.messages.impl.timeline_TimelineView_null_TimelineView-Night-9_10_null_15,NEXUS_5,1.0,en]",19881,], +["ui_S_t[f.messages.impl.timeline_TimelineView_null_TimelineView-Day-9_9_null_16,NEXUS_5,1.0,en]","ui_S_t[f.messages.impl.timeline_TimelineView_null_TimelineView-Night-9_10_null_16,NEXUS_5,1.0,en]",19881,], ["ui_S_t[f.messages.impl.timeline_TimelineView_null_TimelineView-Day-9_9_null_2,NEXUS_5,1.0,en]","ui_S_t[f.messages.impl.timeline_TimelineView_null_TimelineView-Night-9_10_null_2,NEXUS_5,1.0,en]",0,], ["ui_S_t[f.messages.impl.timeline_TimelineView_null_TimelineView-Day-9_9_null_3,NEXUS_5,1.0,en]","ui_S_t[f.messages.impl.timeline_TimelineView_null_TimelineView-Night-9_10_null_3,NEXUS_5,1.0,en]",0,], -["ui_S_t[f.messages.impl.timeline_TimelineView_null_TimelineView-Day-9_9_null_4,NEXUS_5,1.0,en]","ui_S_t[f.messages.impl.timeline_TimelineView_null_TimelineView-Night-9_10_null_4,NEXUS_5,1.0,en]",19874,], +["ui_S_t[f.messages.impl.timeline_TimelineView_null_TimelineView-Day-9_9_null_4,NEXUS_5,1.0,en]","ui_S_t[f.messages.impl.timeline_TimelineView_null_TimelineView-Night-9_10_null_4,NEXUS_5,1.0,en]",19881,], ["ui_S_t[f.messages.impl.timeline_TimelineView_null_TimelineView-Day-9_9_null_5,NEXUS_5,1.0,en]","ui_S_t[f.messages.impl.timeline_TimelineView_null_TimelineView-Night-9_10_null_5,NEXUS_5,1.0,en]",0,], -["ui_S_t[f.messages.impl.timeline_TimelineView_null_TimelineView-Day-9_9_null_6,NEXUS_5,1.0,en]","ui_S_t[f.messages.impl.timeline_TimelineView_null_TimelineView-Night-9_10_null_6,NEXUS_5,1.0,en]",19874,], +["ui_S_t[f.messages.impl.timeline_TimelineView_null_TimelineView-Day-9_9_null_6,NEXUS_5,1.0,en]","ui_S_t[f.messages.impl.timeline_TimelineView_null_TimelineView-Night-9_10_null_6,NEXUS_5,1.0,en]",19881,], ["ui_S_t[f.messages.impl.timeline_TimelineView_null_TimelineView-Day-9_9_null_7,NEXUS_5,1.0,en]","ui_S_t[f.messages.impl.timeline_TimelineView_null_TimelineView-Night-9_10_null_7,NEXUS_5,1.0,en]",0,], -["ui_S_t[f.messages.impl.timeline_TimelineView_null_TimelineView-Day-9_9_null_8,NEXUS_5,1.0,en]","ui_S_t[f.messages.impl.timeline_TimelineView_null_TimelineView-Night-9_10_null_8,NEXUS_5,1.0,en]",19874,], +["ui_S_t[f.messages.impl.timeline_TimelineView_null_TimelineView-Day-9_9_null_8,NEXUS_5,1.0,en]","ui_S_t[f.messages.impl.timeline_TimelineView_null_TimelineView-Night-9_10_null_8,NEXUS_5,1.0,en]",19881,], ["ui_S_t[f.messages.impl.timeline_TimelineView_null_TimelineView-Day-9_9_null_9,NEXUS_5,1.0,en]","ui_S_t[f.messages.impl.timeline_TimelineView_null_TimelineView-Night-9_10_null_9,NEXUS_5,1.0,en]",0,], ["ui_S_t[l.designsystem.theme.components_TopAppBar_null_AppBars_TopAppBar_0_null,NEXUS_5,1.0,en]","",0,], -["ui_S_t[l.troubleshoot.impl_TroubleshootNotificationsView_null_TroubleshootNotificationsView-Day-0_1_null_0,NEXUS_5,1.0,en]","ui_S_t[l.troubleshoot.impl_TroubleshootNotificationsView_null_TroubleshootNotificationsView-Night-0_2_null_0,NEXUS_5,1.0,en]",19874,], -["ui_S_t[l.troubleshoot.impl_TroubleshootNotificationsView_null_TroubleshootNotificationsView-Day-0_1_null_1,NEXUS_5,1.0,en]","ui_S_t[l.troubleshoot.impl_TroubleshootNotificationsView_null_TroubleshootNotificationsView-Night-0_2_null_1,NEXUS_5,1.0,en]",19874,], -["ui_S_t[l.troubleshoot.impl_TroubleshootNotificationsView_null_TroubleshootNotificationsView-Day-0_1_null_2,NEXUS_5,1.0,en]","ui_S_t[l.troubleshoot.impl_TroubleshootNotificationsView_null_TroubleshootNotificationsView-Night-0_2_null_2,NEXUS_5,1.0,en]",19874,], -["ui_S_t[l.troubleshoot.impl_TroubleshootNotificationsView_null_TroubleshootNotificationsView-Day-0_1_null_3,NEXUS_5,1.0,en]","ui_S_t[l.troubleshoot.impl_TroubleshootNotificationsView_null_TroubleshootNotificationsView-Night-0_2_null_3,NEXUS_5,1.0,en]",19874,], -["ui_S_t[l.troubleshoot.impl_TroubleshootNotificationsView_null_TroubleshootNotificationsView-Day-0_1_null_4,NEXUS_5,1.0,en]","ui_S_t[l.troubleshoot.impl_TroubleshootNotificationsView_null_TroubleshootNotificationsView-Night-0_2_null_4,NEXUS_5,1.0,en]",19874,], -["ui_S_t[l.troubleshoot.impl_TroubleshootNotificationsView_null_TroubleshootNotificationsView-Day-0_1_null_5,NEXUS_5,1.0,en]","ui_S_t[l.troubleshoot.impl_TroubleshootNotificationsView_null_TroubleshootNotificationsView-Night-0_2_null_5,NEXUS_5,1.0,en]",19874,], -["ui_S_t[l.troubleshoot.impl_TroubleshootNotificationsView_null_TroubleshootNotificationsView-Day-0_1_null_6,NEXUS_5,1.0,en]","ui_S_t[l.troubleshoot.impl_TroubleshootNotificationsView_null_TroubleshootNotificationsView-Night-0_2_null_6,NEXUS_5,1.0,en]",19874,], -["ui_S_t[l.troubleshoot.impl_TroubleshootNotificationsView_null_TroubleshootNotificationsView-Day-0_1_null_7,NEXUS_5,1.0,en]","ui_S_t[l.troubleshoot.impl_TroubleshootNotificationsView_null_TroubleshootNotificationsView-Night-0_2_null_7,NEXUS_5,1.0,en]",19874,], +["ui_S_t[l.troubleshoot.impl_TroubleshootNotificationsView_null_TroubleshootNotificationsView-Day-0_1_null_0,NEXUS_5,1.0,en]","ui_S_t[l.troubleshoot.impl_TroubleshootNotificationsView_null_TroubleshootNotificationsView-Night-0_2_null_0,NEXUS_5,1.0,en]",19881,], +["ui_S_t[l.troubleshoot.impl_TroubleshootNotificationsView_null_TroubleshootNotificationsView-Day-0_1_null_1,NEXUS_5,1.0,en]","ui_S_t[l.troubleshoot.impl_TroubleshootNotificationsView_null_TroubleshootNotificationsView-Night-0_2_null_1,NEXUS_5,1.0,en]",19881,], +["ui_S_t[l.troubleshoot.impl_TroubleshootNotificationsView_null_TroubleshootNotificationsView-Day-0_1_null_2,NEXUS_5,1.0,en]","ui_S_t[l.troubleshoot.impl_TroubleshootNotificationsView_null_TroubleshootNotificationsView-Night-0_2_null_2,NEXUS_5,1.0,en]",19881,], +["ui_S_t[l.troubleshoot.impl_TroubleshootNotificationsView_null_TroubleshootNotificationsView-Day-0_1_null_3,NEXUS_5,1.0,en]","ui_S_t[l.troubleshoot.impl_TroubleshootNotificationsView_null_TroubleshootNotificationsView-Night-0_2_null_3,NEXUS_5,1.0,en]",19881,], +["ui_S_t[l.troubleshoot.impl_TroubleshootNotificationsView_null_TroubleshootNotificationsView-Day-0_1_null_4,NEXUS_5,1.0,en]","ui_S_t[l.troubleshoot.impl_TroubleshootNotificationsView_null_TroubleshootNotificationsView-Night-0_2_null_4,NEXUS_5,1.0,en]",19881,], +["ui_S_t[l.troubleshoot.impl_TroubleshootNotificationsView_null_TroubleshootNotificationsView-Day-0_1_null_5,NEXUS_5,1.0,en]","ui_S_t[l.troubleshoot.impl_TroubleshootNotificationsView_null_TroubleshootNotificationsView-Night-0_2_null_5,NEXUS_5,1.0,en]",19881,], +["ui_S_t[l.troubleshoot.impl_TroubleshootNotificationsView_null_TroubleshootNotificationsView-Day-0_1_null_6,NEXUS_5,1.0,en]","ui_S_t[l.troubleshoot.impl_TroubleshootNotificationsView_null_TroubleshootNotificationsView-Night-0_2_null_6,NEXUS_5,1.0,en]",19881,], +["ui_S_t[l.troubleshoot.impl_TroubleshootNotificationsView_null_TroubleshootNotificationsView-Day-0_1_null_7,NEXUS_5,1.0,en]","ui_S_t[l.troubleshoot.impl_TroubleshootNotificationsView_null_TroubleshootNotificationsView-Night-0_2_null_7,NEXUS_5,1.0,en]",19881,], ["ui_S_t[f.messages.impl.typing_TypingNotificationView_null_TypingNotificationView-Day-68_68_null_0,NEXUS_5,1.0,en]","ui_S_t[f.messages.impl.typing_TypingNotificationView_null_TypingNotificationView-Night-68_69_null_0,NEXUS_5,1.0,en]",0,], -["ui_S_t[f.messages.impl.typing_TypingNotificationView_null_TypingNotificationView-Day-68_68_null_1,NEXUS_5,1.0,en]","ui_S_t[f.messages.impl.typing_TypingNotificationView_null_TypingNotificationView-Night-68_69_null_1,NEXUS_5,1.0,en]",19874,], -["ui_S_t[f.messages.impl.typing_TypingNotificationView_null_TypingNotificationView-Day-68_68_null_2,NEXUS_5,1.0,en]","ui_S_t[f.messages.impl.typing_TypingNotificationView_null_TypingNotificationView-Night-68_69_null_2,NEXUS_5,1.0,en]",19874,], -["ui_S_t[f.messages.impl.typing_TypingNotificationView_null_TypingNotificationView-Day-68_68_null_3,NEXUS_5,1.0,en]","ui_S_t[f.messages.impl.typing_TypingNotificationView_null_TypingNotificationView-Night-68_69_null_3,NEXUS_5,1.0,en]",19874,], -["ui_S_t[f.messages.impl.typing_TypingNotificationView_null_TypingNotificationView-Day-68_68_null_4,NEXUS_5,1.0,en]","ui_S_t[f.messages.impl.typing_TypingNotificationView_null_TypingNotificationView-Night-68_69_null_4,NEXUS_5,1.0,en]",19874,], -["ui_S_t[f.messages.impl.typing_TypingNotificationView_null_TypingNotificationView-Day-68_68_null_5,NEXUS_5,1.0,en]","ui_S_t[f.messages.impl.typing_TypingNotificationView_null_TypingNotificationView-Night-68_69_null_5,NEXUS_5,1.0,en]",19874,], -["ui_S_t[f.messages.impl.typing_TypingNotificationView_null_TypingNotificationView-Day-68_68_null_6,NEXUS_5,1.0,en]","ui_S_t[f.messages.impl.typing_TypingNotificationView_null_TypingNotificationView-Night-68_69_null_6,NEXUS_5,1.0,en]",19874,], +["ui_S_t[f.messages.impl.typing_TypingNotificationView_null_TypingNotificationView-Day-68_68_null_1,NEXUS_5,1.0,en]","ui_S_t[f.messages.impl.typing_TypingNotificationView_null_TypingNotificationView-Night-68_69_null_1,NEXUS_5,1.0,en]",19881,], +["ui_S_t[f.messages.impl.typing_TypingNotificationView_null_TypingNotificationView-Day-68_68_null_2,NEXUS_5,1.0,en]","ui_S_t[f.messages.impl.typing_TypingNotificationView_null_TypingNotificationView-Night-68_69_null_2,NEXUS_5,1.0,en]",19881,], +["ui_S_t[f.messages.impl.typing_TypingNotificationView_null_TypingNotificationView-Day-68_68_null_3,NEXUS_5,1.0,en]","ui_S_t[f.messages.impl.typing_TypingNotificationView_null_TypingNotificationView-Night-68_69_null_3,NEXUS_5,1.0,en]",19881,], +["ui_S_t[f.messages.impl.typing_TypingNotificationView_null_TypingNotificationView-Day-68_68_null_4,NEXUS_5,1.0,en]","ui_S_t[f.messages.impl.typing_TypingNotificationView_null_TypingNotificationView-Night-68_69_null_4,NEXUS_5,1.0,en]",19881,], +["ui_S_t[f.messages.impl.typing_TypingNotificationView_null_TypingNotificationView-Day-68_68_null_5,NEXUS_5,1.0,en]","ui_S_t[f.messages.impl.typing_TypingNotificationView_null_TypingNotificationView-Night-68_69_null_5,NEXUS_5,1.0,en]",19881,], +["ui_S_t[f.messages.impl.typing_TypingNotificationView_null_TypingNotificationView-Day-68_68_null_6,NEXUS_5,1.0,en]","ui_S_t[f.messages.impl.typing_TypingNotificationView_null_TypingNotificationView-Night-68_69_null_6,NEXUS_5,1.0,en]",19881,], ["ui_S_t[f.messages.impl.typing_TypingNotificationView_null_TypingNotificationView-Day-68_68_null_7,NEXUS_5,1.0,en]","ui_S_t[f.messages.impl.typing_TypingNotificationView_null_TypingNotificationView-Night-68_69_null_7,NEXUS_5,1.0,en]",0,], ["ui_S_t[f.messages.impl.typing_TypingNotificationView_null_TypingNotificationView-Day-68_68_null_8,NEXUS_5,1.0,en]","ui_S_t[f.messages.impl.typing_TypingNotificationView_null_TypingNotificationView-Night-68_69_null_8,NEXUS_5,1.0,en]",0,], ["ui_S_t[l.designsystem.atomic.atoms_UnreadIndicatorAtom_null_UnreadIndicatorAtom-Day_0_null,NEXUS_5,1.0,en]","ui_S_t[l.designsystem.atomic.atoms_UnreadIndicatorAtom_null_UnreadIndicatorAtom-Night_1_null,NEXUS_5,1.0,en]",0,], -["ui_S_t[l.matrix.ui.components_UnresolvedUserRow_null_UnresolvedUserRow_0_null,NEXUS_5,1.0,en]","",19874,], +["ui_S_t[l.matrix.ui.components_UnresolvedUserRow_null_UnresolvedUserRow_0_null,NEXUS_5,1.0,en]","",19881,], ["ui_S_t[l.matrix.ui.components_UnsavedAvatar_null_UnsavedAvatar-Day-11_12_null,NEXUS_5,1.0,en]","ui_S_t[l.matrix.ui.components_UnsavedAvatar_null_UnsavedAvatar-Night-11_13_null,NEXUS_5,1.0,en]",0,], ["ui_S_t[l.designsystem.components.avatar_UserAvatarColors_null_UserAvatarColors-Day_0_null,NEXUS_5,1.0,en]","ui_S_t[l.designsystem.components.avatar_UserAvatarColors_null_UserAvatarColors-Night_1_null,NEXUS_5,1.0,en]",0,], -["ui_S_t[f.roomdetails.impl.notificationsettings_UserDefinedRoomNotificationSettingsView_null_UserDefinedRoomNotificationSettingsView-Day-10_10_null_0,NEXUS_5,1.0,en]","ui_S_t[f.roomdetails.impl.notificationsettings_UserDefinedRoomNotificationSettingsView_null_UserDefinedRoomNotificationSettingsView-Night-10_11_null_0,NEXUS_5,1.0,en]",19874,], -["ui_S_t[f.createroom.impl.components_UserListView_null_UserListView-Day-2_3_null_0,NEXUS_5,1.0,en]","ui_S_t[f.createroom.impl.components_UserListView_null_UserListView-Night-2_4_null_0,NEXUS_5,1.0,en]",19874,], -["ui_S_t[f.createroom.impl.components_UserListView_null_UserListView-Day-2_3_null_1,NEXUS_5,1.0,en]","ui_S_t[f.createroom.impl.components_UserListView_null_UserListView-Night-2_4_null_1,NEXUS_5,1.0,en]",19874,], -["ui_S_t[f.createroom.impl.components_UserListView_null_UserListView-Day-2_3_null_2,NEXUS_5,1.0,en]","ui_S_t[f.createroom.impl.components_UserListView_null_UserListView-Night-2_4_null_2,NEXUS_5,1.0,en]",19874,], +["ui_S_t[f.roomdetails.impl.notificationsettings_UserDefinedRoomNotificationSettingsView_null_UserDefinedRoomNotificationSettingsView-Day-10_10_null_0,NEXUS_5,1.0,en]","ui_S_t[f.roomdetails.impl.notificationsettings_UserDefinedRoomNotificationSettingsView_null_UserDefinedRoomNotificationSettingsView-Night-10_11_null_0,NEXUS_5,1.0,en]",19881,], +["ui_S_t[f.createroom.impl.components_UserListView_null_UserListView-Day-2_3_null_0,NEXUS_5,1.0,en]","ui_S_t[f.createroom.impl.components_UserListView_null_UserListView-Night-2_4_null_0,NEXUS_5,1.0,en]",19881,], +["ui_S_t[f.createroom.impl.components_UserListView_null_UserListView-Day-2_3_null_1,NEXUS_5,1.0,en]","ui_S_t[f.createroom.impl.components_UserListView_null_UserListView-Night-2_4_null_1,NEXUS_5,1.0,en]",19881,], +["ui_S_t[f.createroom.impl.components_UserListView_null_UserListView-Day-2_3_null_2,NEXUS_5,1.0,en]","ui_S_t[f.createroom.impl.components_UserListView_null_UserListView-Night-2_4_null_2,NEXUS_5,1.0,en]",19881,], ["ui_S_t[f.createroom.impl.components_UserListView_null_UserListView-Day-2_3_null_3,NEXUS_5,1.0,en]","ui_S_t[f.createroom.impl.components_UserListView_null_UserListView-Night-2_4_null_3,NEXUS_5,1.0,en]",0,], ["ui_S_t[f.createroom.impl.components_UserListView_null_UserListView-Day-2_3_null_4,NEXUS_5,1.0,en]","ui_S_t[f.createroom.impl.components_UserListView_null_UserListView-Night-2_4_null_4,NEXUS_5,1.0,en]",0,], ["ui_S_t[f.createroom.impl.components_UserListView_null_UserListView-Day-2_3_null_5,NEXUS_5,1.0,en]","ui_S_t[f.createroom.impl.components_UserListView_null_UserListView-Night-2_4_null_5,NEXUS_5,1.0,en]",0,], ["ui_S_t[f.createroom.impl.components_UserListView_null_UserListView-Day-2_3_null_6,NEXUS_5,1.0,en]","ui_S_t[f.createroom.impl.components_UserListView_null_UserListView-Night-2_4_null_6,NEXUS_5,1.0,en]",0,], -["ui_S_t[f.createroom.impl.components_UserListView_null_UserListView-Day-2_3_null_7,NEXUS_5,1.0,en]","ui_S_t[f.createroom.impl.components_UserListView_null_UserListView-Night-2_4_null_7,NEXUS_5,1.0,en]",19874,], +["ui_S_t[f.createroom.impl.components_UserListView_null_UserListView-Day-2_3_null_7,NEXUS_5,1.0,en]","ui_S_t[f.createroom.impl.components_UserListView_null_UserListView-Night-2_4_null_7,NEXUS_5,1.0,en]",19881,], ["ui_S_t[f.createroom.impl.components_UserListView_null_UserListView-Day-2_3_null_8,NEXUS_5,1.0,en]","ui_S_t[f.createroom.impl.components_UserListView_null_UserListView-Night-2_4_null_8,NEXUS_5,1.0,en]",0,], -["ui_S_t[f.createroom.impl.components_UserListView_null_UserListView-Day-2_3_null_9,NEXUS_5,1.0,en]","ui_S_t[f.createroom.impl.components_UserListView_null_UserListView-Night-2_4_null_9,NEXUS_5,1.0,en]",19874,], +["ui_S_t[f.createroom.impl.components_UserListView_null_UserListView-Day-2_3_null_9,NEXUS_5,1.0,en]","ui_S_t[f.createroom.impl.components_UserListView_null_UserListView-Night-2_4_null_9,NEXUS_5,1.0,en]",19881,], ["ui_S_t[f.preferences.impl.user_UserPreferences_null_UserPreferences-Day-9_10_null_0,NEXUS_5,1.0,en]","ui_S_t[f.preferences.impl.user_UserPreferences_null_UserPreferences-Night-9_11_null_0,NEXUS_5,1.0,en]",0,], ["ui_S_t[f.preferences.impl.user_UserPreferences_null_UserPreferences-Day-9_10_null_1,NEXUS_5,1.0,en]","ui_S_t[f.preferences.impl.user_UserPreferences_null_UserPreferences-Night-9_11_null_1,NEXUS_5,1.0,en]",0,], ["ui_S_t[f.preferences.impl.user_UserPreferences_null_UserPreferences-Day-9_10_null_2,NEXUS_5,1.0,en]","ui_S_t[f.preferences.impl.user_UserPreferences_null_UserPreferences-Night-9_11_null_2,NEXUS_5,1.0,en]",0,], -["ui_S_t[f.userprofile.shared_UserProfileView_null_UserProfileView-Day-0_1_null_0,NEXUS_5,1.0,en]","ui_S_t[f.userprofile.shared_UserProfileView_null_UserProfileView-Night-0_2_null_0,NEXUS_5,1.0,en]",19874,], -["ui_S_t[f.userprofile.shared_UserProfileView_null_UserProfileView-Day-0_1_null_1,NEXUS_5,1.0,en]","ui_S_t[f.userprofile.shared_UserProfileView_null_UserProfileView-Night-0_2_null_1,NEXUS_5,1.0,en]",19874,], -["ui_S_t[f.userprofile.shared_UserProfileView_null_UserProfileView-Day-0_1_null_2,NEXUS_5,1.0,en]","ui_S_t[f.userprofile.shared_UserProfileView_null_UserProfileView-Night-0_2_null_2,NEXUS_5,1.0,en]",19874,], -["ui_S_t[f.userprofile.shared_UserProfileView_null_UserProfileView-Day-0_1_null_3,NEXUS_5,1.0,en]","ui_S_t[f.userprofile.shared_UserProfileView_null_UserProfileView-Night-0_2_null_3,NEXUS_5,1.0,en]",19874,], -["ui_S_t[f.userprofile.shared_UserProfileView_null_UserProfileView-Day-0_1_null_4,NEXUS_5,1.0,en]","ui_S_t[f.userprofile.shared_UserProfileView_null_UserProfileView-Night-0_2_null_4,NEXUS_5,1.0,en]",19874,], -["ui_S_t[f.userprofile.shared_UserProfileView_null_UserProfileView-Day-0_1_null_5,NEXUS_5,1.0,en]","ui_S_t[f.userprofile.shared_UserProfileView_null_UserProfileView-Night-0_2_null_5,NEXUS_5,1.0,en]",19874,], -["ui_S_t[f.userprofile.shared_UserProfileView_null_UserProfileView-Day-0_1_null_6,NEXUS_5,1.0,en]","ui_S_t[f.userprofile.shared_UserProfileView_null_UserProfileView-Night-0_2_null_6,NEXUS_5,1.0,en]",19874,], -["ui_S_t[f.userprofile.shared_UserProfileView_null_UserProfileView-Day-0_1_null_7,NEXUS_5,1.0,en]","ui_S_t[f.userprofile.shared_UserProfileView_null_UserProfileView-Night-0_2_null_7,NEXUS_5,1.0,en]",19874,], -["ui_S_t[f.userprofile.shared_UserProfileView_null_UserProfileView-Day-0_1_null_8,NEXUS_5,1.0,en]","ui_S_t[f.userprofile.shared_UserProfileView_null_UserProfileView-Night-0_2_null_8,NEXUS_5,1.0,en]",19874,], -["ui_S_t[f.verifysession.impl_VerifySelfSessionView_null_VerifySelfSessionView-Day-0_1_null_0,NEXUS_5,1.0,en]","ui_S_t[f.verifysession.impl_VerifySelfSessionView_null_VerifySelfSessionView-Night-0_2_null_0,NEXUS_5,1.0,en]",19874,], -["ui_S_t[f.verifysession.impl_VerifySelfSessionView_null_VerifySelfSessionView-Day-0_1_null_1,NEXUS_5,1.0,en]","ui_S_t[f.verifysession.impl_VerifySelfSessionView_null_VerifySelfSessionView-Night-0_2_null_1,NEXUS_5,1.0,en]",19874,], -["ui_S_t[f.verifysession.impl_VerifySelfSessionView_null_VerifySelfSessionView-Day-0_1_null_2,NEXUS_5,1.0,en]","ui_S_t[f.verifysession.impl_VerifySelfSessionView_null_VerifySelfSessionView-Night-0_2_null_2,NEXUS_5,1.0,en]",19874,], -["ui_S_t[f.verifysession.impl_VerifySelfSessionView_null_VerifySelfSessionView-Day-0_1_null_3,NEXUS_5,1.0,en]","ui_S_t[f.verifysession.impl_VerifySelfSessionView_null_VerifySelfSessionView-Night-0_2_null_3,NEXUS_5,1.0,en]",19874,], -["ui_S_t[f.verifysession.impl_VerifySelfSessionView_null_VerifySelfSessionView-Day-0_1_null_4,NEXUS_5,1.0,en]","ui_S_t[f.verifysession.impl_VerifySelfSessionView_null_VerifySelfSessionView-Night-0_2_null_4,NEXUS_5,1.0,en]",19874,], -["ui_S_t[f.verifysession.impl_VerifySelfSessionView_null_VerifySelfSessionView-Day-0_1_null_5,NEXUS_5,1.0,en]","ui_S_t[f.verifysession.impl_VerifySelfSessionView_null_VerifySelfSessionView-Night-0_2_null_5,NEXUS_5,1.0,en]",19874,], -["ui_S_t[f.verifysession.impl_VerifySelfSessionView_null_VerifySelfSessionView-Day-0_1_null_6,NEXUS_5,1.0,en]","ui_S_t[f.verifysession.impl_VerifySelfSessionView_null_VerifySelfSessionView-Night-0_2_null_6,NEXUS_5,1.0,en]",19874,], -["ui_S_t[f.verifysession.impl_VerifySelfSessionView_null_VerifySelfSessionView-Day-0_1_null_7,NEXUS_5,1.0,en]","ui_S_t[f.verifysession.impl_VerifySelfSessionView_null_VerifySelfSessionView-Night-0_2_null_7,NEXUS_5,1.0,en]",19874,], -["ui_S_t[f.verifysession.impl_VerifySelfSessionView_null_VerifySelfSessionView-Day-0_1_null_8,NEXUS_5,1.0,en]","ui_S_t[f.verifysession.impl_VerifySelfSessionView_null_VerifySelfSessionView-Night-0_2_null_8,NEXUS_5,1.0,en]",19874,], -["ui_S_t[f.verifysession.impl_VerifySelfSessionView_null_VerifySelfSessionView-Day-0_1_null_9,NEXUS_5,1.0,en]","ui_S_t[f.verifysession.impl_VerifySelfSessionView_null_VerifySelfSessionView-Night-0_2_null_9,NEXUS_5,1.0,en]",19874,], +["ui_S_t[f.userprofile.shared_UserProfileView_null_UserProfileView-Day-0_1_null_0,NEXUS_5,1.0,en]","ui_S_t[f.userprofile.shared_UserProfileView_null_UserProfileView-Night-0_2_null_0,NEXUS_5,1.0,en]",19881,], +["ui_S_t[f.userprofile.shared_UserProfileView_null_UserProfileView-Day-0_1_null_1,NEXUS_5,1.0,en]","ui_S_t[f.userprofile.shared_UserProfileView_null_UserProfileView-Night-0_2_null_1,NEXUS_5,1.0,en]",19881,], +["ui_S_t[f.userprofile.shared_UserProfileView_null_UserProfileView-Day-0_1_null_2,NEXUS_5,1.0,en]","ui_S_t[f.userprofile.shared_UserProfileView_null_UserProfileView-Night-0_2_null_2,NEXUS_5,1.0,en]",19881,], +["ui_S_t[f.userprofile.shared_UserProfileView_null_UserProfileView-Day-0_1_null_3,NEXUS_5,1.0,en]","ui_S_t[f.userprofile.shared_UserProfileView_null_UserProfileView-Night-0_2_null_3,NEXUS_5,1.0,en]",19881,], +["ui_S_t[f.userprofile.shared_UserProfileView_null_UserProfileView-Day-0_1_null_4,NEXUS_5,1.0,en]","ui_S_t[f.userprofile.shared_UserProfileView_null_UserProfileView-Night-0_2_null_4,NEXUS_5,1.0,en]",19881,], +["ui_S_t[f.userprofile.shared_UserProfileView_null_UserProfileView-Day-0_1_null_5,NEXUS_5,1.0,en]","ui_S_t[f.userprofile.shared_UserProfileView_null_UserProfileView-Night-0_2_null_5,NEXUS_5,1.0,en]",19881,], +["ui_S_t[f.userprofile.shared_UserProfileView_null_UserProfileView-Day-0_1_null_6,NEXUS_5,1.0,en]","ui_S_t[f.userprofile.shared_UserProfileView_null_UserProfileView-Night-0_2_null_6,NEXUS_5,1.0,en]",19881,], +["ui_S_t[f.userprofile.shared_UserProfileView_null_UserProfileView-Day-0_1_null_7,NEXUS_5,1.0,en]","ui_S_t[f.userprofile.shared_UserProfileView_null_UserProfileView-Night-0_2_null_7,NEXUS_5,1.0,en]",19881,], +["ui_S_t[f.userprofile.shared_UserProfileView_null_UserProfileView-Day-0_1_null_8,NEXUS_5,1.0,en]","ui_S_t[f.userprofile.shared_UserProfileView_null_UserProfileView-Night-0_2_null_8,NEXUS_5,1.0,en]",19881,], +["ui_S_t[f.verifysession.impl_VerifySelfSessionView_null_VerifySelfSessionView-Day-0_1_null_0,NEXUS_5,1.0,en]","ui_S_t[f.verifysession.impl_VerifySelfSessionView_null_VerifySelfSessionView-Night-0_2_null_0,NEXUS_5,1.0,en]",19881,], +["ui_S_t[f.verifysession.impl_VerifySelfSessionView_null_VerifySelfSessionView-Day-0_1_null_1,NEXUS_5,1.0,en]","ui_S_t[f.verifysession.impl_VerifySelfSessionView_null_VerifySelfSessionView-Night-0_2_null_1,NEXUS_5,1.0,en]",19881,], +["ui_S_t[f.verifysession.impl_VerifySelfSessionView_null_VerifySelfSessionView-Day-0_1_null_2,NEXUS_5,1.0,en]","ui_S_t[f.verifysession.impl_VerifySelfSessionView_null_VerifySelfSessionView-Night-0_2_null_2,NEXUS_5,1.0,en]",19881,], +["ui_S_t[f.verifysession.impl_VerifySelfSessionView_null_VerifySelfSessionView-Day-0_1_null_3,NEXUS_5,1.0,en]","ui_S_t[f.verifysession.impl_VerifySelfSessionView_null_VerifySelfSessionView-Night-0_2_null_3,NEXUS_5,1.0,en]",19881,], +["ui_S_t[f.verifysession.impl_VerifySelfSessionView_null_VerifySelfSessionView-Day-0_1_null_4,NEXUS_5,1.0,en]","ui_S_t[f.verifysession.impl_VerifySelfSessionView_null_VerifySelfSessionView-Night-0_2_null_4,NEXUS_5,1.0,en]",19881,], +["ui_S_t[f.verifysession.impl_VerifySelfSessionView_null_VerifySelfSessionView-Day-0_1_null_5,NEXUS_5,1.0,en]","ui_S_t[f.verifysession.impl_VerifySelfSessionView_null_VerifySelfSessionView-Night-0_2_null_5,NEXUS_5,1.0,en]",19881,], +["ui_S_t[f.verifysession.impl_VerifySelfSessionView_null_VerifySelfSessionView-Day-0_1_null_6,NEXUS_5,1.0,en]","ui_S_t[f.verifysession.impl_VerifySelfSessionView_null_VerifySelfSessionView-Night-0_2_null_6,NEXUS_5,1.0,en]",19881,], +["ui_S_t[f.verifysession.impl_VerifySelfSessionView_null_VerifySelfSessionView-Day-0_1_null_7,NEXUS_5,1.0,en]","ui_S_t[f.verifysession.impl_VerifySelfSessionView_null_VerifySelfSessionView-Night-0_2_null_7,NEXUS_5,1.0,en]",19881,], +["ui_S_t[f.verifysession.impl_VerifySelfSessionView_null_VerifySelfSessionView-Day-0_1_null_8,NEXUS_5,1.0,en]","ui_S_t[f.verifysession.impl_VerifySelfSessionView_null_VerifySelfSessionView-Night-0_2_null_8,NEXUS_5,1.0,en]",19881,], +["ui_S_t[f.verifysession.impl_VerifySelfSessionView_null_VerifySelfSessionView-Day-0_1_null_9,NEXUS_5,1.0,en]","ui_S_t[f.verifysession.impl_VerifySelfSessionView_null_VerifySelfSessionView-Night-0_2_null_9,NEXUS_5,1.0,en]",19881,], ["ui_S_t[l.designsystem.ruler_VerticalRuler_null_VerticalRuler-Day_0_null,NEXUS_5,1.0,en]","ui_S_t[l.designsystem.ruler_VerticalRuler_null_VerticalRuler-Night_1_null,NEXUS_5,1.0,en]",0,], ["ui_S_t[f.viewfolder.impl.file_ViewFileView_null_ViewFileView-Day-0_1_null_0,NEXUS_5,1.0,en]","ui_S_t[f.viewfolder.impl.file_ViewFileView_null_ViewFileView-Night-0_2_null_0,NEXUS_5,1.0,en]",0,], ["ui_S_t[f.viewfolder.impl.file_ViewFileView_null_ViewFileView-Day-0_1_null_1,NEXUS_5,1.0,en]","ui_S_t[f.viewfolder.impl.file_ViewFileView_null_ViewFileView-Night-0_2_null_1,NEXUS_5,1.0,en]",0,], @@ -1070,12 +1075,12 @@ export const screenshots = [ ["ui_S_t[l.textcomposer.components_VoiceMessagePreview_null_VoiceMessagePreview-Day-16_17_null,NEXUS_5,1.0,en]","ui_S_t[l.textcomposer.components_VoiceMessagePreview_null_VoiceMessagePreview-Night-16_18_null,NEXUS_5,1.0,en]",0,], ["ui_S_t[l.textcomposer.components_VoiceMessageRecorderButton_null_VoiceMessageRecorderButton-Day-17_18_null,NEXUS_5,1.0,en]","ui_S_t[l.textcomposer.components_VoiceMessageRecorderButton_null_VoiceMessageRecorderButton-Night-17_19_null,NEXUS_5,1.0,en]",0,], ["ui_S_t[l.textcomposer.components_VoiceMessageRecording_null_VoiceMessageRecording-Day-18_19_null,NEXUS_5,1.0,en]","ui_S_t[l.textcomposer.components_VoiceMessageRecording_null_VoiceMessageRecording-Night-18_20_null,NEXUS_5,1.0,en]",0,], -["ui_S_t[f.login.impl.screens.waitlistscreen_WaitListView_null_WaitListView-Day-12_13_null_0,NEXUS_5,1.0,en]","ui_S_t[f.login.impl.screens.waitlistscreen_WaitListView_null_WaitListView-Night-12_14_null_0,NEXUS_5,1.0,en]",19877,], -["ui_S_t[f.login.impl.screens.waitlistscreen_WaitListView_null_WaitListView-Day-12_13_null_1,NEXUS_5,1.0,en]","ui_S_t[f.login.impl.screens.waitlistscreen_WaitListView_null_WaitListView-Night-12_14_null_1,NEXUS_5,1.0,en]",19877,], -["ui_S_t[f.login.impl.screens.waitlistscreen_WaitListView_null_WaitListView-Day-12_13_null_2,NEXUS_5,1.0,en]","ui_S_t[f.login.impl.screens.waitlistscreen_WaitListView_null_WaitListView-Night-12_14_null_2,NEXUS_5,1.0,en]",19877,], -["ui_S_t[f.login.impl.screens.waitlistscreen_WaitListView_null_WaitListView-Day-12_13_null_3,NEXUS_5,1.0,en]","ui_S_t[f.login.impl.screens.waitlistscreen_WaitListView_null_WaitListView-Night-12_14_null_3,NEXUS_5,1.0,en]",19877,], -["ui_S_t[f.login.impl.screens.waitlistscreen_WaitListView_null_WaitListView-Day-12_13_null_4,NEXUS_5,1.0,en]","ui_S_t[f.login.impl.screens.waitlistscreen_WaitListView_null_WaitListView-Night-12_14_null_4,NEXUS_5,1.0,en]",19877,], +["ui_S_t[f.login.impl.screens.waitlistscreen_WaitListView_null_WaitListView-Day-12_13_null_0,NEXUS_5,1.0,en]","ui_S_t[f.login.impl.screens.waitlistscreen_WaitListView_null_WaitListView-Night-12_14_null_0,NEXUS_5,1.0,en]",19881,], +["ui_S_t[f.login.impl.screens.waitlistscreen_WaitListView_null_WaitListView-Day-12_13_null_1,NEXUS_5,1.0,en]","ui_S_t[f.login.impl.screens.waitlistscreen_WaitListView_null_WaitListView-Night-12_14_null_1,NEXUS_5,1.0,en]",19881,], +["ui_S_t[f.login.impl.screens.waitlistscreen_WaitListView_null_WaitListView-Day-12_13_null_2,NEXUS_5,1.0,en]","ui_S_t[f.login.impl.screens.waitlistscreen_WaitListView_null_WaitListView-Night-12_14_null_2,NEXUS_5,1.0,en]",19881,], +["ui_S_t[f.login.impl.screens.waitlistscreen_WaitListView_null_WaitListView-Day-12_13_null_3,NEXUS_5,1.0,en]","ui_S_t[f.login.impl.screens.waitlistscreen_WaitListView_null_WaitListView-Night-12_14_null_3,NEXUS_5,1.0,en]",19881,], +["ui_S_t[f.login.impl.screens.waitlistscreen_WaitListView_null_WaitListView-Day-12_13_null_4,NEXUS_5,1.0,en]","ui_S_t[f.login.impl.screens.waitlistscreen_WaitListView_null_WaitListView-Night-12_14_null_4,NEXUS_5,1.0,en]",19881,], ["ui_S_t[l.designsystem.components.media_WaveformPlaybackView_null_WaveformPlaybackView-Day_0_null,NEXUS_5,1.0,en]","ui_S_t[l.designsystem.components.media_WaveformPlaybackView_null_WaveformPlaybackView-Night_1_null,NEXUS_5,1.0,en]",0,], -["ui_S_t[f.ftue.impl.welcome_WelcomeView_null_WelcomeView-Day-1_2_null,NEXUS_5,1.0,en]","ui_S_t[f.ftue.impl.welcome_WelcomeView_null_WelcomeView-Night-1_3_null,NEXUS_5,1.0,en]",19874,], +["ui_S_t[f.ftue.impl.welcome_WelcomeView_null_WelcomeView-Day-1_2_null,NEXUS_5,1.0,en]","ui_S_t[f.ftue.impl.welcome_WelcomeView_null_WelcomeView-Night-1_3_null,NEXUS_5,1.0,en]",19881,], ["ui_S_t[l.designsystem.ruler_WithRulers_null_WithRulers-Day_0_null,NEXUS_5,1.0,en]","ui_S_t[l.designsystem.ruler_WithRulers_null_WithRulers-Night_1_null,NEXUS_5,1.0,en]",0,], ]; diff --git a/tests/testutils/src/main/kotlin/io/element/android/tests/testutils/lambda/LambdaRecorder.kt b/tests/testutils/src/main/kotlin/io/element/android/tests/testutils/lambda/LambdaRecorder.kt index b227918461..18285488e0 100644 --- a/tests/testutils/src/main/kotlin/io/element/android/tests/testutils/lambda/LambdaRecorder.kt +++ b/tests/testutils/src/main/kotlin/io/element/android/tests/testutils/lambda/LambdaRecorder.kt @@ -85,6 +85,13 @@ inline fun lambdaRecorder( + ensureNeverCalled: Boolean = false, + noinline block: (T1, T2, T3, T4, T5, T6, T7) -> R +): LambdaSevenParamsRecorder { + return LambdaSevenParamsRecorder(ensureNeverCalled, block) +} + inline fun lambdaAnyRecorder( ensureNeverCalled: Boolean = false, noinline block: (List) -> R diff --git a/tests/uitests/src/test/snapshots/images/ui_S_t[f.call.ui_CallScreenView_null_CallScreenView-Day-0_1_null,NEXUS_5,1.0,en].png b/tests/uitests/src/test/snapshots/images/ui_S_t[f.call.impl.ui_CallScreenView_null_CallScreenView-Day-0_1_null,NEXUS_5,1.0,en].png similarity index 100% rename from tests/uitests/src/test/snapshots/images/ui_S_t[f.call.ui_CallScreenView_null_CallScreenView-Day-0_1_null,NEXUS_5,1.0,en].png rename to tests/uitests/src/test/snapshots/images/ui_S_t[f.call.impl.ui_CallScreenView_null_CallScreenView-Day-0_1_null,NEXUS_5,1.0,en].png diff --git a/tests/uitests/src/test/snapshots/images/ui_S_t[f.call.ui_CallScreenView_null_CallScreenView-Night-0_2_null,NEXUS_5,1.0,en].png b/tests/uitests/src/test/snapshots/images/ui_S_t[f.call.impl.ui_CallScreenView_null_CallScreenView-Night-0_2_null,NEXUS_5,1.0,en].png similarity index 100% rename from tests/uitests/src/test/snapshots/images/ui_S_t[f.call.ui_CallScreenView_null_CallScreenView-Night-0_2_null,NEXUS_5,1.0,en].png rename to tests/uitests/src/test/snapshots/images/ui_S_t[f.call.impl.ui_CallScreenView_null_CallScreenView-Night-0_2_null,NEXUS_5,1.0,en].png diff --git a/tests/uitests/src/test/snapshots/images/ui_S_t[f.call.impl.ui_IncomingCallScreen_null_IncomingCallScreen-Day-1_2_null,NEXUS_5,1.0,en].png b/tests/uitests/src/test/snapshots/images/ui_S_t[f.call.impl.ui_IncomingCallScreen_null_IncomingCallScreen-Day-1_2_null,NEXUS_5,1.0,en].png new file mode 100644 index 0000000000..85e6cc4f6f --- /dev/null +++ b/tests/uitests/src/test/snapshots/images/ui_S_t[f.call.impl.ui_IncomingCallScreen_null_IncomingCallScreen-Day-1_2_null,NEXUS_5,1.0,en].png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:52ba9c146f9ceee768b971bee87c7db41321684c77727669acf38e9c32698f96 +size 65711 diff --git a/tests/uitests/src/test/snapshots/images/ui_S_t[f.call.impl.ui_IncomingCallScreen_null_IncomingCallScreen-Night-1_3_null,NEXUS_5,1.0,en].png b/tests/uitests/src/test/snapshots/images/ui_S_t[f.call.impl.ui_IncomingCallScreen_null_IncomingCallScreen-Night-1_3_null,NEXUS_5,1.0,en].png new file mode 100644 index 0000000000..6920a3fd65 --- /dev/null +++ b/tests/uitests/src/test/snapshots/images/ui_S_t[f.call.impl.ui_IncomingCallScreen_null_IncomingCallScreen-Night-1_3_null,NEXUS_5,1.0,en].png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:7d4019a436d20847db4e2e2b35f96d143790056b867d40dcdc93fe4af33c7f77 +size 59021 diff --git a/tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.customreaction_EmojiItem_null_EmojiItem-Day-34_34_null,NEXUS_5,1.0,en].png b/tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.customreaction_EmojiItem_null_EmojiItem-Day-35_35_null,NEXUS_5,1.0,en].png similarity index 100% rename from tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.customreaction_EmojiItem_null_EmojiItem-Day-34_34_null,NEXUS_5,1.0,en].png rename to tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.customreaction_EmojiItem_null_EmojiItem-Day-35_35_null,NEXUS_5,1.0,en].png diff --git a/tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.customreaction_EmojiItem_null_EmojiItem-Night-34_35_null,NEXUS_5,1.0,en].png b/tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.customreaction_EmojiItem_null_EmojiItem-Night-35_36_null,NEXUS_5,1.0,en].png similarity index 100% rename from tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.customreaction_EmojiItem_null_EmojiItem-Night-34_35_null,NEXUS_5,1.0,en].png rename to tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.customreaction_EmojiItem_null_EmojiItem-Night-35_36_null,NEXUS_5,1.0,en].png diff --git a/tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.customreaction_EmojiPicker_null_EmojiPicker-Day-35_35_null,NEXUS_5,1.0,en].png b/tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.customreaction_EmojiPicker_null_EmojiPicker-Day-36_36_null,NEXUS_5,1.0,en].png similarity index 100% rename from tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.customreaction_EmojiPicker_null_EmojiPicker-Day-35_35_null,NEXUS_5,1.0,en].png rename to tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.customreaction_EmojiPicker_null_EmojiPicker-Day-36_36_null,NEXUS_5,1.0,en].png diff --git a/tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.customreaction_EmojiPicker_null_EmojiPicker-Night-35_36_null,NEXUS_5,1.0,en].png b/tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.customreaction_EmojiPicker_null_EmojiPicker-Night-36_37_null,NEXUS_5,1.0,en].png similarity index 100% rename from tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.customreaction_EmojiPicker_null_EmojiPicker-Night-35_36_null,NEXUS_5,1.0,en].png rename to tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.customreaction_EmojiPicker_null_EmojiPicker-Night-36_37_null,NEXUS_5,1.0,en].png diff --git a/tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.event_ProgressButton_null_ProgressButton-Day-54_54_null,NEXUS_5,1.0,en].png b/tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.event_ProgressButton_null_ProgressButton-Day-55_55_null,NEXUS_5,1.0,en].png similarity index 100% rename from tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.event_ProgressButton_null_ProgressButton-Day-54_54_null,NEXUS_5,1.0,en].png rename to tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.event_ProgressButton_null_ProgressButton-Day-55_55_null,NEXUS_5,1.0,en].png diff --git a/tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.event_ProgressButton_null_ProgressButton-Night-54_55_null,NEXUS_5,1.0,en].png b/tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.event_ProgressButton_null_ProgressButton-Night-55_56_null,NEXUS_5,1.0,en].png similarity index 100% rename from tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.event_ProgressButton_null_ProgressButton-Night-54_55_null,NEXUS_5,1.0,en].png rename to tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.event_ProgressButton_null_ProgressButton-Night-55_56_null,NEXUS_5,1.0,en].png diff --git a/tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.event_TimelineImageWithCaptionRow_null_TimelineImageWithCaptionRow-Day-40_40_null,NEXUS_5,1.0,en].png b/tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.event_TimelineImageWithCaptionRow_null_TimelineImageWithCaptionRow-Day-41_41_null,NEXUS_5,1.0,en].png similarity index 100% rename from tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.event_TimelineImageWithCaptionRow_null_TimelineImageWithCaptionRow-Day-40_40_null,NEXUS_5,1.0,en].png rename to tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.event_TimelineImageWithCaptionRow_null_TimelineImageWithCaptionRow-Day-41_41_null,NEXUS_5,1.0,en].png diff --git a/tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.event_TimelineImageWithCaptionRow_null_TimelineImageWithCaptionRow-Night-40_41_null,NEXUS_5,1.0,en].png b/tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.event_TimelineImageWithCaptionRow_null_TimelineImageWithCaptionRow-Night-41_42_null,NEXUS_5,1.0,en].png similarity index 100% rename from tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.event_TimelineImageWithCaptionRow_null_TimelineImageWithCaptionRow-Night-40_41_null,NEXUS_5,1.0,en].png rename to tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.event_TimelineImageWithCaptionRow_null_TimelineImageWithCaptionRow-Night-41_42_null,NEXUS_5,1.0,en].png diff --git a/tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.event_TimelineItemAudioView_null_TimelineItemAudioView-Day-36_36_null_0,NEXUS_5,1.0,en].png b/tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.event_TimelineItemAudioView_null_TimelineItemAudioView-Day-37_37_null_0,NEXUS_5,1.0,en].png similarity index 100% rename from tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.event_TimelineItemAudioView_null_TimelineItemAudioView-Day-36_36_null_0,NEXUS_5,1.0,en].png rename to tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.event_TimelineItemAudioView_null_TimelineItemAudioView-Day-37_37_null_0,NEXUS_5,1.0,en].png diff --git a/tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.event_TimelineItemAudioView_null_TimelineItemAudioView-Day-36_36_null_1,NEXUS_5,1.0,en].png b/tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.event_TimelineItemAudioView_null_TimelineItemAudioView-Day-37_37_null_1,NEXUS_5,1.0,en].png similarity index 100% rename from tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.event_TimelineItemAudioView_null_TimelineItemAudioView-Day-36_36_null_1,NEXUS_5,1.0,en].png rename to tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.event_TimelineItemAudioView_null_TimelineItemAudioView-Day-37_37_null_1,NEXUS_5,1.0,en].png diff --git a/tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.event_TimelineItemAudioView_null_TimelineItemAudioView-Day-36_36_null_2,NEXUS_5,1.0,en].png b/tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.event_TimelineItemAudioView_null_TimelineItemAudioView-Day-37_37_null_2,NEXUS_5,1.0,en].png similarity index 100% rename from tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.event_TimelineItemAudioView_null_TimelineItemAudioView-Day-36_36_null_2,NEXUS_5,1.0,en].png rename to tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.event_TimelineItemAudioView_null_TimelineItemAudioView-Day-37_37_null_2,NEXUS_5,1.0,en].png diff --git a/tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.event_TimelineItemAudioView_null_TimelineItemAudioView-Night-36_37_null_0,NEXUS_5,1.0,en].png b/tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.event_TimelineItemAudioView_null_TimelineItemAudioView-Night-37_38_null_0,NEXUS_5,1.0,en].png similarity index 100% rename from tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.event_TimelineItemAudioView_null_TimelineItemAudioView-Night-36_37_null_0,NEXUS_5,1.0,en].png rename to tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.event_TimelineItemAudioView_null_TimelineItemAudioView-Night-37_38_null_0,NEXUS_5,1.0,en].png diff --git a/tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.event_TimelineItemAudioView_null_TimelineItemAudioView-Night-36_37_null_1,NEXUS_5,1.0,en].png b/tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.event_TimelineItemAudioView_null_TimelineItemAudioView-Night-37_38_null_1,NEXUS_5,1.0,en].png similarity index 100% rename from tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.event_TimelineItemAudioView_null_TimelineItemAudioView-Night-36_37_null_1,NEXUS_5,1.0,en].png rename to tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.event_TimelineItemAudioView_null_TimelineItemAudioView-Night-37_38_null_1,NEXUS_5,1.0,en].png diff --git a/tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.event_TimelineItemAudioView_null_TimelineItemAudioView-Night-36_37_null_2,NEXUS_5,1.0,en].png b/tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.event_TimelineItemAudioView_null_TimelineItemAudioView-Night-37_38_null_2,NEXUS_5,1.0,en].png similarity index 100% rename from tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.event_TimelineItemAudioView_null_TimelineItemAudioView-Night-36_37_null_2,NEXUS_5,1.0,en].png rename to tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.event_TimelineItemAudioView_null_TimelineItemAudioView-Night-37_38_null_2,NEXUS_5,1.0,en].png diff --git a/tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.event_TimelineItemEncryptedView_null_TimelineItemEncryptedView-Day-37_37_null_0,NEXUS_5,1.0,en].png b/tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.event_TimelineItemEncryptedView_null_TimelineItemEncryptedView-Day-38_38_null_0,NEXUS_5,1.0,en].png similarity index 100% rename from tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.event_TimelineItemEncryptedView_null_TimelineItemEncryptedView-Day-37_37_null_0,NEXUS_5,1.0,en].png rename to tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.event_TimelineItemEncryptedView_null_TimelineItemEncryptedView-Day-38_38_null_0,NEXUS_5,1.0,en].png diff --git a/tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.event_TimelineItemEncryptedView_null_TimelineItemEncryptedView-Day-37_37_null_1,NEXUS_5,1.0,en].png b/tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.event_TimelineItemEncryptedView_null_TimelineItemEncryptedView-Day-38_38_null_1,NEXUS_5,1.0,en].png similarity index 100% rename from tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.event_TimelineItemEncryptedView_null_TimelineItemEncryptedView-Day-37_37_null_1,NEXUS_5,1.0,en].png rename to tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.event_TimelineItemEncryptedView_null_TimelineItemEncryptedView-Day-38_38_null_1,NEXUS_5,1.0,en].png diff --git a/tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.event_TimelineItemEncryptedView_null_TimelineItemEncryptedView-Day-37_37_null_2,NEXUS_5,1.0,en].png b/tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.event_TimelineItemEncryptedView_null_TimelineItemEncryptedView-Day-38_38_null_2,NEXUS_5,1.0,en].png similarity index 100% rename from tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.event_TimelineItemEncryptedView_null_TimelineItemEncryptedView-Day-37_37_null_2,NEXUS_5,1.0,en].png rename to tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.event_TimelineItemEncryptedView_null_TimelineItemEncryptedView-Day-38_38_null_2,NEXUS_5,1.0,en].png diff --git a/tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.event_TimelineItemEncryptedView_null_TimelineItemEncryptedView-Night-37_38_null_0,NEXUS_5,1.0,en].png b/tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.event_TimelineItemEncryptedView_null_TimelineItemEncryptedView-Night-38_39_null_0,NEXUS_5,1.0,en].png similarity index 100% rename from tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.event_TimelineItemEncryptedView_null_TimelineItemEncryptedView-Night-37_38_null_0,NEXUS_5,1.0,en].png rename to tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.event_TimelineItemEncryptedView_null_TimelineItemEncryptedView-Night-38_39_null_0,NEXUS_5,1.0,en].png diff --git a/tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.event_TimelineItemEncryptedView_null_TimelineItemEncryptedView-Night-37_38_null_1,NEXUS_5,1.0,en].png b/tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.event_TimelineItemEncryptedView_null_TimelineItemEncryptedView-Night-38_39_null_1,NEXUS_5,1.0,en].png similarity index 100% rename from tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.event_TimelineItemEncryptedView_null_TimelineItemEncryptedView-Night-37_38_null_1,NEXUS_5,1.0,en].png rename to tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.event_TimelineItemEncryptedView_null_TimelineItemEncryptedView-Night-38_39_null_1,NEXUS_5,1.0,en].png diff --git a/tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.event_TimelineItemEncryptedView_null_TimelineItemEncryptedView-Night-37_38_null_2,NEXUS_5,1.0,en].png b/tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.event_TimelineItemEncryptedView_null_TimelineItemEncryptedView-Night-38_39_null_2,NEXUS_5,1.0,en].png similarity index 100% rename from tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.event_TimelineItemEncryptedView_null_TimelineItemEncryptedView-Night-37_38_null_2,NEXUS_5,1.0,en].png rename to tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.event_TimelineItemEncryptedView_null_TimelineItemEncryptedView-Night-38_39_null_2,NEXUS_5,1.0,en].png diff --git a/tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.event_TimelineItemFileView_null_TimelineItemFileView-Day-38_38_null_0,NEXUS_5,1.0,en].png b/tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.event_TimelineItemFileView_null_TimelineItemFileView-Day-39_39_null_0,NEXUS_5,1.0,en].png similarity index 100% rename from tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.event_TimelineItemFileView_null_TimelineItemFileView-Day-38_38_null_0,NEXUS_5,1.0,en].png rename to tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.event_TimelineItemFileView_null_TimelineItemFileView-Day-39_39_null_0,NEXUS_5,1.0,en].png diff --git a/tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.event_TimelineItemFileView_null_TimelineItemFileView-Day-38_38_null_1,NEXUS_5,1.0,en].png b/tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.event_TimelineItemFileView_null_TimelineItemFileView-Day-39_39_null_1,NEXUS_5,1.0,en].png similarity index 100% rename from tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.event_TimelineItemFileView_null_TimelineItemFileView-Day-38_38_null_1,NEXUS_5,1.0,en].png rename to tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.event_TimelineItemFileView_null_TimelineItemFileView-Day-39_39_null_1,NEXUS_5,1.0,en].png diff --git a/tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.event_TimelineItemFileView_null_TimelineItemFileView-Day-38_38_null_2,NEXUS_5,1.0,en].png b/tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.event_TimelineItemFileView_null_TimelineItemFileView-Day-39_39_null_2,NEXUS_5,1.0,en].png similarity index 100% rename from tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.event_TimelineItemFileView_null_TimelineItemFileView-Day-38_38_null_2,NEXUS_5,1.0,en].png rename to tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.event_TimelineItemFileView_null_TimelineItemFileView-Day-39_39_null_2,NEXUS_5,1.0,en].png diff --git a/tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.event_TimelineItemFileView_null_TimelineItemFileView-Night-38_39_null_0,NEXUS_5,1.0,en].png b/tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.event_TimelineItemFileView_null_TimelineItemFileView-Night-39_40_null_0,NEXUS_5,1.0,en].png similarity index 100% rename from tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.event_TimelineItemFileView_null_TimelineItemFileView-Night-38_39_null_0,NEXUS_5,1.0,en].png rename to tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.event_TimelineItemFileView_null_TimelineItemFileView-Night-39_40_null_0,NEXUS_5,1.0,en].png diff --git a/tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.event_TimelineItemFileView_null_TimelineItemFileView-Night-38_39_null_1,NEXUS_5,1.0,en].png b/tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.event_TimelineItemFileView_null_TimelineItemFileView-Night-39_40_null_1,NEXUS_5,1.0,en].png similarity index 100% rename from tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.event_TimelineItemFileView_null_TimelineItemFileView-Night-38_39_null_1,NEXUS_5,1.0,en].png rename to tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.event_TimelineItemFileView_null_TimelineItemFileView-Night-39_40_null_1,NEXUS_5,1.0,en].png diff --git a/tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.event_TimelineItemFileView_null_TimelineItemFileView-Night-38_39_null_2,NEXUS_5,1.0,en].png b/tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.event_TimelineItemFileView_null_TimelineItemFileView-Night-39_40_null_2,NEXUS_5,1.0,en].png similarity index 100% rename from tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.event_TimelineItemFileView_null_TimelineItemFileView-Night-38_39_null_2,NEXUS_5,1.0,en].png rename to tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.event_TimelineItemFileView_null_TimelineItemFileView-Night-39_40_null_2,NEXUS_5,1.0,en].png diff --git a/tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.event_TimelineItemImageView_null_TimelineItemImageView-Day-39_39_null_0,NEXUS_5,1.0,en].png b/tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.event_TimelineItemImageView_null_TimelineItemImageView-Day-40_40_null_0,NEXUS_5,1.0,en].png similarity index 100% rename from tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.event_TimelineItemImageView_null_TimelineItemImageView-Day-39_39_null_0,NEXUS_5,1.0,en].png rename to tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.event_TimelineItemImageView_null_TimelineItemImageView-Day-40_40_null_0,NEXUS_5,1.0,en].png diff --git a/tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.event_TimelineItemImageView_null_TimelineItemImageView-Day-39_39_null_1,NEXUS_5,1.0,en].png b/tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.event_TimelineItemImageView_null_TimelineItemImageView-Day-40_40_null_1,NEXUS_5,1.0,en].png similarity index 100% rename from tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.event_TimelineItemImageView_null_TimelineItemImageView-Day-39_39_null_1,NEXUS_5,1.0,en].png rename to tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.event_TimelineItemImageView_null_TimelineItemImageView-Day-40_40_null_1,NEXUS_5,1.0,en].png diff --git a/tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.event_TimelineItemImageView_null_TimelineItemImageView-Day-39_39_null_2,NEXUS_5,1.0,en].png b/tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.event_TimelineItemImageView_null_TimelineItemImageView-Day-40_40_null_2,NEXUS_5,1.0,en].png similarity index 100% rename from tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.event_TimelineItemImageView_null_TimelineItemImageView-Day-39_39_null_2,NEXUS_5,1.0,en].png rename to tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.event_TimelineItemImageView_null_TimelineItemImageView-Day-40_40_null_2,NEXUS_5,1.0,en].png diff --git a/tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.event_TimelineItemImageView_null_TimelineItemImageView-Night-39_40_null_0,NEXUS_5,1.0,en].png b/tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.event_TimelineItemImageView_null_TimelineItemImageView-Night-40_41_null_0,NEXUS_5,1.0,en].png similarity index 100% rename from tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.event_TimelineItemImageView_null_TimelineItemImageView-Night-39_40_null_0,NEXUS_5,1.0,en].png rename to tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.event_TimelineItemImageView_null_TimelineItemImageView-Night-40_41_null_0,NEXUS_5,1.0,en].png diff --git a/tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.event_TimelineItemImageView_null_TimelineItemImageView-Night-39_40_null_1,NEXUS_5,1.0,en].png b/tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.event_TimelineItemImageView_null_TimelineItemImageView-Night-40_41_null_1,NEXUS_5,1.0,en].png similarity index 100% rename from tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.event_TimelineItemImageView_null_TimelineItemImageView-Night-39_40_null_1,NEXUS_5,1.0,en].png rename to tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.event_TimelineItemImageView_null_TimelineItemImageView-Night-40_41_null_1,NEXUS_5,1.0,en].png diff --git a/tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.event_TimelineItemImageView_null_TimelineItemImageView-Night-39_40_null_2,NEXUS_5,1.0,en].png b/tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.event_TimelineItemImageView_null_TimelineItemImageView-Night-40_41_null_2,NEXUS_5,1.0,en].png similarity index 100% rename from tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.event_TimelineItemImageView_null_TimelineItemImageView-Night-39_40_null_2,NEXUS_5,1.0,en].png rename to tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.event_TimelineItemImageView_null_TimelineItemImageView-Night-40_41_null_2,NEXUS_5,1.0,en].png diff --git a/tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.event_TimelineItemInformativeView_null_TimelineItemInformativeView-Day-41_41_null,NEXUS_5,1.0,en].png b/tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.event_TimelineItemInformativeView_null_TimelineItemInformativeView-Day-42_42_null,NEXUS_5,1.0,en].png similarity index 100% rename from tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.event_TimelineItemInformativeView_null_TimelineItemInformativeView-Day-41_41_null,NEXUS_5,1.0,en].png rename to tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.event_TimelineItemInformativeView_null_TimelineItemInformativeView-Day-42_42_null,NEXUS_5,1.0,en].png diff --git a/tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.event_TimelineItemInformativeView_null_TimelineItemInformativeView-Night-41_42_null,NEXUS_5,1.0,en].png b/tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.event_TimelineItemInformativeView_null_TimelineItemInformativeView-Night-42_43_null,NEXUS_5,1.0,en].png similarity index 100% rename from tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.event_TimelineItemInformativeView_null_TimelineItemInformativeView-Night-41_42_null,NEXUS_5,1.0,en].png rename to tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.event_TimelineItemInformativeView_null_TimelineItemInformativeView-Night-42_43_null,NEXUS_5,1.0,en].png diff --git a/tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.event_TimelineItemLegacyCallInviteView_null_TimelineItemLegacyCallInviteView-Day-42_42_null,NEXUS_5,1.0,en].png b/tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.event_TimelineItemLegacyCallInviteView_null_TimelineItemLegacyCallInviteView-Day-43_43_null,NEXUS_5,1.0,en].png similarity index 100% rename from tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.event_TimelineItemLegacyCallInviteView_null_TimelineItemLegacyCallInviteView-Day-42_42_null,NEXUS_5,1.0,en].png rename to tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.event_TimelineItemLegacyCallInviteView_null_TimelineItemLegacyCallInviteView-Day-43_43_null,NEXUS_5,1.0,en].png diff --git a/tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.event_TimelineItemLegacyCallInviteView_null_TimelineItemLegacyCallInviteView-Night-42_43_null,NEXUS_5,1.0,en].png b/tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.event_TimelineItemLegacyCallInviteView_null_TimelineItemLegacyCallInviteView-Night-43_44_null,NEXUS_5,1.0,en].png similarity index 100% rename from tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.event_TimelineItemLegacyCallInviteView_null_TimelineItemLegacyCallInviteView-Night-42_43_null,NEXUS_5,1.0,en].png rename to tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.event_TimelineItemLegacyCallInviteView_null_TimelineItemLegacyCallInviteView-Night-43_44_null,NEXUS_5,1.0,en].png diff --git a/tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.event_TimelineItemLocationView_null_TimelineItemLocationView-Day-43_43_null_0,NEXUS_5,1.0,en].png b/tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.event_TimelineItemLocationView_null_TimelineItemLocationView-Day-44_44_null_0,NEXUS_5,1.0,en].png similarity index 100% rename from tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.event_TimelineItemLocationView_null_TimelineItemLocationView-Day-43_43_null_0,NEXUS_5,1.0,en].png rename to tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.event_TimelineItemLocationView_null_TimelineItemLocationView-Day-44_44_null_0,NEXUS_5,1.0,en].png diff --git a/tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.event_TimelineItemLocationView_null_TimelineItemLocationView-Day-43_43_null_1,NEXUS_5,1.0,en].png b/tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.event_TimelineItemLocationView_null_TimelineItemLocationView-Day-44_44_null_1,NEXUS_5,1.0,en].png similarity index 100% rename from tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.event_TimelineItemLocationView_null_TimelineItemLocationView-Day-43_43_null_1,NEXUS_5,1.0,en].png rename to tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.event_TimelineItemLocationView_null_TimelineItemLocationView-Day-44_44_null_1,NEXUS_5,1.0,en].png diff --git a/tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.event_TimelineItemLocationView_null_TimelineItemLocationView-Night-43_44_null_0,NEXUS_5,1.0,en].png b/tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.event_TimelineItemLocationView_null_TimelineItemLocationView-Night-44_45_null_0,NEXUS_5,1.0,en].png similarity index 100% rename from tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.event_TimelineItemLocationView_null_TimelineItemLocationView-Night-43_44_null_0,NEXUS_5,1.0,en].png rename to tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.event_TimelineItemLocationView_null_TimelineItemLocationView-Night-44_45_null_0,NEXUS_5,1.0,en].png diff --git a/tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.event_TimelineItemLocationView_null_TimelineItemLocationView-Night-43_44_null_1,NEXUS_5,1.0,en].png b/tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.event_TimelineItemLocationView_null_TimelineItemLocationView-Night-44_45_null_1,NEXUS_5,1.0,en].png similarity index 100% rename from tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.event_TimelineItemLocationView_null_TimelineItemLocationView-Night-43_44_null_1,NEXUS_5,1.0,en].png rename to tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.event_TimelineItemLocationView_null_TimelineItemLocationView-Night-44_45_null_1,NEXUS_5,1.0,en].png diff --git a/tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.event_TimelineItemPollView_null_TimelineItemPollView-Day-44_44_null_0,NEXUS_5,1.0,en].png b/tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.event_TimelineItemPollView_null_TimelineItemPollView-Day-45_45_null_0,NEXUS_5,1.0,en].png similarity index 100% rename from tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.event_TimelineItemPollView_null_TimelineItemPollView-Day-44_44_null_0,NEXUS_5,1.0,en].png rename to tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.event_TimelineItemPollView_null_TimelineItemPollView-Day-45_45_null_0,NEXUS_5,1.0,en].png diff --git a/tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.event_TimelineItemPollView_null_TimelineItemPollView-Day-44_44_null_1,NEXUS_5,1.0,en].png b/tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.event_TimelineItemPollView_null_TimelineItemPollView-Day-45_45_null_1,NEXUS_5,1.0,en].png similarity index 100% rename from tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.event_TimelineItemPollView_null_TimelineItemPollView-Day-44_44_null_1,NEXUS_5,1.0,en].png rename to tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.event_TimelineItemPollView_null_TimelineItemPollView-Day-45_45_null_1,NEXUS_5,1.0,en].png diff --git a/tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.event_TimelineItemPollView_null_TimelineItemPollView-Day-44_44_null_2,NEXUS_5,1.0,en].png b/tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.event_TimelineItemPollView_null_TimelineItemPollView-Day-45_45_null_2,NEXUS_5,1.0,en].png similarity index 100% rename from tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.event_TimelineItemPollView_null_TimelineItemPollView-Day-44_44_null_2,NEXUS_5,1.0,en].png rename to tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.event_TimelineItemPollView_null_TimelineItemPollView-Day-45_45_null_2,NEXUS_5,1.0,en].png diff --git a/tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.event_TimelineItemPollView_null_TimelineItemPollView-Day-44_44_null_3,NEXUS_5,1.0,en].png b/tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.event_TimelineItemPollView_null_TimelineItemPollView-Day-45_45_null_3,NEXUS_5,1.0,en].png similarity index 100% rename from tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.event_TimelineItemPollView_null_TimelineItemPollView-Day-44_44_null_3,NEXUS_5,1.0,en].png rename to tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.event_TimelineItemPollView_null_TimelineItemPollView-Day-45_45_null_3,NEXUS_5,1.0,en].png diff --git a/tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.event_TimelineItemPollView_null_TimelineItemPollView-Night-44_45_null_0,NEXUS_5,1.0,en].png b/tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.event_TimelineItemPollView_null_TimelineItemPollView-Night-45_46_null_0,NEXUS_5,1.0,en].png similarity index 100% rename from tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.event_TimelineItemPollView_null_TimelineItemPollView-Night-44_45_null_0,NEXUS_5,1.0,en].png rename to tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.event_TimelineItemPollView_null_TimelineItemPollView-Night-45_46_null_0,NEXUS_5,1.0,en].png diff --git a/tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.event_TimelineItemPollView_null_TimelineItemPollView-Night-44_45_null_1,NEXUS_5,1.0,en].png b/tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.event_TimelineItemPollView_null_TimelineItemPollView-Night-45_46_null_1,NEXUS_5,1.0,en].png similarity index 100% rename from tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.event_TimelineItemPollView_null_TimelineItemPollView-Night-44_45_null_1,NEXUS_5,1.0,en].png rename to tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.event_TimelineItemPollView_null_TimelineItemPollView-Night-45_46_null_1,NEXUS_5,1.0,en].png diff --git a/tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.event_TimelineItemPollView_null_TimelineItemPollView-Night-44_45_null_2,NEXUS_5,1.0,en].png b/tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.event_TimelineItemPollView_null_TimelineItemPollView-Night-45_46_null_2,NEXUS_5,1.0,en].png similarity index 100% rename from tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.event_TimelineItemPollView_null_TimelineItemPollView-Night-44_45_null_2,NEXUS_5,1.0,en].png rename to tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.event_TimelineItemPollView_null_TimelineItemPollView-Night-45_46_null_2,NEXUS_5,1.0,en].png diff --git a/tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.event_TimelineItemPollView_null_TimelineItemPollView-Night-44_45_null_3,NEXUS_5,1.0,en].png b/tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.event_TimelineItemPollView_null_TimelineItemPollView-Night-45_46_null_3,NEXUS_5,1.0,en].png similarity index 100% rename from tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.event_TimelineItemPollView_null_TimelineItemPollView-Night-44_45_null_3,NEXUS_5,1.0,en].png rename to tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.event_TimelineItemPollView_null_TimelineItemPollView-Night-45_46_null_3,NEXUS_5,1.0,en].png diff --git a/tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.event_TimelineItemRedactedView_null_TimelineItemRedactedView-Day-45_45_null,NEXUS_5,1.0,en].png b/tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.event_TimelineItemRedactedView_null_TimelineItemRedactedView-Day-46_46_null,NEXUS_5,1.0,en].png similarity index 100% rename from tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.event_TimelineItemRedactedView_null_TimelineItemRedactedView-Day-45_45_null,NEXUS_5,1.0,en].png rename to tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.event_TimelineItemRedactedView_null_TimelineItemRedactedView-Day-46_46_null,NEXUS_5,1.0,en].png diff --git a/tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.event_TimelineItemRedactedView_null_TimelineItemRedactedView-Night-45_46_null,NEXUS_5,1.0,en].png b/tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.event_TimelineItemRedactedView_null_TimelineItemRedactedView-Night-46_47_null,NEXUS_5,1.0,en].png similarity index 100% rename from tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.event_TimelineItemRedactedView_null_TimelineItemRedactedView-Night-45_46_null,NEXUS_5,1.0,en].png rename to tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.event_TimelineItemRedactedView_null_TimelineItemRedactedView-Night-46_47_null,NEXUS_5,1.0,en].png diff --git a/tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.event_TimelineItemStateView_null_TimelineItemStateView-Day-46_46_null,NEXUS_5,1.0,en].png b/tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.event_TimelineItemStateView_null_TimelineItemStateView-Day-47_47_null,NEXUS_5,1.0,en].png similarity index 100% rename from tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.event_TimelineItemStateView_null_TimelineItemStateView-Day-46_46_null,NEXUS_5,1.0,en].png rename to tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.event_TimelineItemStateView_null_TimelineItemStateView-Day-47_47_null,NEXUS_5,1.0,en].png diff --git a/tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.event_TimelineItemStateView_null_TimelineItemStateView-Night-46_47_null,NEXUS_5,1.0,en].png b/tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.event_TimelineItemStateView_null_TimelineItemStateView-Night-47_48_null,NEXUS_5,1.0,en].png similarity index 100% rename from tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.event_TimelineItemStateView_null_TimelineItemStateView-Night-46_47_null,NEXUS_5,1.0,en].png rename to tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.event_TimelineItemStateView_null_TimelineItemStateView-Night-47_48_null,NEXUS_5,1.0,en].png diff --git a/tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.event_TimelineItemStickerView_null_TimelineItemStickerView-Day-47_47_null_0,NEXUS_5,1.0,en].png b/tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.event_TimelineItemStickerView_null_TimelineItemStickerView-Day-48_48_null_0,NEXUS_5,1.0,en].png similarity index 100% rename from tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.event_TimelineItemStickerView_null_TimelineItemStickerView-Day-47_47_null_0,NEXUS_5,1.0,en].png rename to tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.event_TimelineItemStickerView_null_TimelineItemStickerView-Day-48_48_null_0,NEXUS_5,1.0,en].png diff --git a/tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.event_TimelineItemStickerView_null_TimelineItemStickerView-Day-47_47_null_1,NEXUS_5,1.0,en].png b/tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.event_TimelineItemStickerView_null_TimelineItemStickerView-Day-48_48_null_1,NEXUS_5,1.0,en].png similarity index 100% rename from tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.event_TimelineItemStickerView_null_TimelineItemStickerView-Day-47_47_null_1,NEXUS_5,1.0,en].png rename to tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.event_TimelineItemStickerView_null_TimelineItemStickerView-Day-48_48_null_1,NEXUS_5,1.0,en].png diff --git a/tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.event_TimelineItemStickerView_null_TimelineItemStickerView-Day-47_47_null_2,NEXUS_5,1.0,en].png b/tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.event_TimelineItemStickerView_null_TimelineItemStickerView-Day-48_48_null_2,NEXUS_5,1.0,en].png similarity index 100% rename from tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.event_TimelineItemStickerView_null_TimelineItemStickerView-Day-47_47_null_2,NEXUS_5,1.0,en].png rename to tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.event_TimelineItemStickerView_null_TimelineItemStickerView-Day-48_48_null_2,NEXUS_5,1.0,en].png diff --git a/tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.event_TimelineItemStickerView_null_TimelineItemStickerView-Night-47_48_null_0,NEXUS_5,1.0,en].png b/tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.event_TimelineItemStickerView_null_TimelineItemStickerView-Night-48_49_null_0,NEXUS_5,1.0,en].png similarity index 100% rename from tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.event_TimelineItemStickerView_null_TimelineItemStickerView-Night-47_48_null_0,NEXUS_5,1.0,en].png rename to tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.event_TimelineItemStickerView_null_TimelineItemStickerView-Night-48_49_null_0,NEXUS_5,1.0,en].png diff --git a/tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.event_TimelineItemStickerView_null_TimelineItemStickerView-Night-47_48_null_1,NEXUS_5,1.0,en].png b/tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.event_TimelineItemStickerView_null_TimelineItemStickerView-Night-48_49_null_1,NEXUS_5,1.0,en].png similarity index 100% rename from tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.event_TimelineItemStickerView_null_TimelineItemStickerView-Night-47_48_null_1,NEXUS_5,1.0,en].png rename to tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.event_TimelineItemStickerView_null_TimelineItemStickerView-Night-48_49_null_1,NEXUS_5,1.0,en].png diff --git a/tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.event_TimelineItemStickerView_null_TimelineItemStickerView-Night-47_48_null_2,NEXUS_5,1.0,en].png b/tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.event_TimelineItemStickerView_null_TimelineItemStickerView-Night-48_49_null_2,NEXUS_5,1.0,en].png similarity index 100% rename from tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.event_TimelineItemStickerView_null_TimelineItemStickerView-Night-47_48_null_2,NEXUS_5,1.0,en].png rename to tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.event_TimelineItemStickerView_null_TimelineItemStickerView-Night-48_49_null_2,NEXUS_5,1.0,en].png diff --git a/tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.event_TimelineItemTextView_null_TimelineItemTextView-Day-48_48_null_0,NEXUS_5,1.0,en].png b/tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.event_TimelineItemTextView_null_TimelineItemTextView-Day-49_49_null_0,NEXUS_5,1.0,en].png similarity index 100% rename from tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.event_TimelineItemTextView_null_TimelineItemTextView-Day-48_48_null_0,NEXUS_5,1.0,en].png rename to tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.event_TimelineItemTextView_null_TimelineItemTextView-Day-49_49_null_0,NEXUS_5,1.0,en].png diff --git a/tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.event_TimelineItemTextView_null_TimelineItemTextView-Day-48_48_null_1,NEXUS_5,1.0,en].png b/tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.event_TimelineItemTextView_null_TimelineItemTextView-Day-49_49_null_1,NEXUS_5,1.0,en].png similarity index 100% rename from tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.event_TimelineItemTextView_null_TimelineItemTextView-Day-48_48_null_1,NEXUS_5,1.0,en].png rename to tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.event_TimelineItemTextView_null_TimelineItemTextView-Day-49_49_null_1,NEXUS_5,1.0,en].png diff --git a/tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.event_TimelineItemTextView_null_TimelineItemTextView-Day-48_48_null_2,NEXUS_5,1.0,en].png b/tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.event_TimelineItemTextView_null_TimelineItemTextView-Day-49_49_null_2,NEXUS_5,1.0,en].png similarity index 100% rename from tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.event_TimelineItemTextView_null_TimelineItemTextView-Day-48_48_null_2,NEXUS_5,1.0,en].png rename to tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.event_TimelineItemTextView_null_TimelineItemTextView-Day-49_49_null_2,NEXUS_5,1.0,en].png diff --git a/tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.event_TimelineItemTextView_null_TimelineItemTextView-Day-48_48_null_3,NEXUS_5,1.0,en].png b/tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.event_TimelineItemTextView_null_TimelineItemTextView-Day-49_49_null_3,NEXUS_5,1.0,en].png similarity index 100% rename from tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.event_TimelineItemTextView_null_TimelineItemTextView-Day-48_48_null_3,NEXUS_5,1.0,en].png rename to tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.event_TimelineItemTextView_null_TimelineItemTextView-Day-49_49_null_3,NEXUS_5,1.0,en].png diff --git a/tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.event_TimelineItemTextView_null_TimelineItemTextView-Day-48_48_null_4,NEXUS_5,1.0,en].png b/tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.event_TimelineItemTextView_null_TimelineItemTextView-Day-49_49_null_4,NEXUS_5,1.0,en].png similarity index 100% rename from tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.event_TimelineItemTextView_null_TimelineItemTextView-Day-48_48_null_4,NEXUS_5,1.0,en].png rename to tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.event_TimelineItemTextView_null_TimelineItemTextView-Day-49_49_null_4,NEXUS_5,1.0,en].png diff --git a/tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.event_TimelineItemTextView_null_TimelineItemTextView-Day-48_48_null_5,NEXUS_5,1.0,en].png b/tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.event_TimelineItemTextView_null_TimelineItemTextView-Day-49_49_null_5,NEXUS_5,1.0,en].png similarity index 100% rename from tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.event_TimelineItemTextView_null_TimelineItemTextView-Day-48_48_null_5,NEXUS_5,1.0,en].png rename to tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.event_TimelineItemTextView_null_TimelineItemTextView-Day-49_49_null_5,NEXUS_5,1.0,en].png diff --git a/tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.event_TimelineItemTextView_null_TimelineItemTextView-Night-48_49_null_0,NEXUS_5,1.0,en].png b/tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.event_TimelineItemTextView_null_TimelineItemTextView-Night-49_50_null_0,NEXUS_5,1.0,en].png similarity index 100% rename from tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.event_TimelineItemTextView_null_TimelineItemTextView-Night-48_49_null_0,NEXUS_5,1.0,en].png rename to tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.event_TimelineItemTextView_null_TimelineItemTextView-Night-49_50_null_0,NEXUS_5,1.0,en].png diff --git a/tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.event_TimelineItemTextView_null_TimelineItemTextView-Night-48_49_null_1,NEXUS_5,1.0,en].png b/tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.event_TimelineItemTextView_null_TimelineItemTextView-Night-49_50_null_1,NEXUS_5,1.0,en].png similarity index 100% rename from tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.event_TimelineItemTextView_null_TimelineItemTextView-Night-48_49_null_1,NEXUS_5,1.0,en].png rename to tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.event_TimelineItemTextView_null_TimelineItemTextView-Night-49_50_null_1,NEXUS_5,1.0,en].png diff --git a/tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.event_TimelineItemTextView_null_TimelineItemTextView-Night-48_49_null_2,NEXUS_5,1.0,en].png b/tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.event_TimelineItemTextView_null_TimelineItemTextView-Night-49_50_null_2,NEXUS_5,1.0,en].png similarity index 100% rename from tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.event_TimelineItemTextView_null_TimelineItemTextView-Night-48_49_null_2,NEXUS_5,1.0,en].png rename to tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.event_TimelineItemTextView_null_TimelineItemTextView-Night-49_50_null_2,NEXUS_5,1.0,en].png diff --git a/tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.event_TimelineItemTextView_null_TimelineItemTextView-Night-48_49_null_3,NEXUS_5,1.0,en].png b/tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.event_TimelineItemTextView_null_TimelineItemTextView-Night-49_50_null_3,NEXUS_5,1.0,en].png similarity index 100% rename from tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.event_TimelineItemTextView_null_TimelineItemTextView-Night-48_49_null_3,NEXUS_5,1.0,en].png rename to tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.event_TimelineItemTextView_null_TimelineItemTextView-Night-49_50_null_3,NEXUS_5,1.0,en].png diff --git a/tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.event_TimelineItemTextView_null_TimelineItemTextView-Night-48_49_null_4,NEXUS_5,1.0,en].png b/tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.event_TimelineItemTextView_null_TimelineItemTextView-Night-49_50_null_4,NEXUS_5,1.0,en].png similarity index 100% rename from tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.event_TimelineItemTextView_null_TimelineItemTextView-Night-48_49_null_4,NEXUS_5,1.0,en].png rename to tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.event_TimelineItemTextView_null_TimelineItemTextView-Night-49_50_null_4,NEXUS_5,1.0,en].png diff --git a/tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.event_TimelineItemTextView_null_TimelineItemTextView-Night-48_49_null_5,NEXUS_5,1.0,en].png b/tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.event_TimelineItemTextView_null_TimelineItemTextView-Night-49_50_null_5,NEXUS_5,1.0,en].png similarity index 100% rename from tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.event_TimelineItemTextView_null_TimelineItemTextView-Night-48_49_null_5,NEXUS_5,1.0,en].png rename to tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.event_TimelineItemTextView_null_TimelineItemTextView-Night-49_50_null_5,NEXUS_5,1.0,en].png diff --git a/tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.event_TimelineItemUnknownView_null_TimelineItemUnknownView-Day-49_49_null,NEXUS_5,1.0,en].png b/tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.event_TimelineItemUnknownView_null_TimelineItemUnknownView-Day-50_50_null,NEXUS_5,1.0,en].png similarity index 100% rename from tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.event_TimelineItemUnknownView_null_TimelineItemUnknownView-Day-49_49_null,NEXUS_5,1.0,en].png rename to tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.event_TimelineItemUnknownView_null_TimelineItemUnknownView-Day-50_50_null,NEXUS_5,1.0,en].png diff --git a/tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.event_TimelineItemUnknownView_null_TimelineItemUnknownView-Night-49_50_null,NEXUS_5,1.0,en].png b/tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.event_TimelineItemUnknownView_null_TimelineItemUnknownView-Night-50_51_null,NEXUS_5,1.0,en].png similarity index 100% rename from tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.event_TimelineItemUnknownView_null_TimelineItemUnknownView-Night-49_50_null,NEXUS_5,1.0,en].png rename to tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.event_TimelineItemUnknownView_null_TimelineItemUnknownView-Night-50_51_null,NEXUS_5,1.0,en].png diff --git a/tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.event_TimelineItemVideoView_null_TimelineItemVideoView-Day-50_50_null_0,NEXUS_5,1.0,en].png b/tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.event_TimelineItemVideoView_null_TimelineItemVideoView-Day-51_51_null_0,NEXUS_5,1.0,en].png similarity index 100% rename from tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.event_TimelineItemVideoView_null_TimelineItemVideoView-Day-50_50_null_0,NEXUS_5,1.0,en].png rename to tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.event_TimelineItemVideoView_null_TimelineItemVideoView-Day-51_51_null_0,NEXUS_5,1.0,en].png diff --git a/tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.event_TimelineItemVideoView_null_TimelineItemVideoView-Day-50_50_null_1,NEXUS_5,1.0,en].png b/tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.event_TimelineItemVideoView_null_TimelineItemVideoView-Day-51_51_null_1,NEXUS_5,1.0,en].png similarity index 100% rename from tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.event_TimelineItemVideoView_null_TimelineItemVideoView-Day-50_50_null_1,NEXUS_5,1.0,en].png rename to tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.event_TimelineItemVideoView_null_TimelineItemVideoView-Day-51_51_null_1,NEXUS_5,1.0,en].png diff --git a/tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.event_TimelineItemVideoView_null_TimelineItemVideoView-Day-50_50_null_2,NEXUS_5,1.0,en].png b/tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.event_TimelineItemVideoView_null_TimelineItemVideoView-Day-51_51_null_2,NEXUS_5,1.0,en].png similarity index 100% rename from tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.event_TimelineItemVideoView_null_TimelineItemVideoView-Day-50_50_null_2,NEXUS_5,1.0,en].png rename to tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.event_TimelineItemVideoView_null_TimelineItemVideoView-Day-51_51_null_2,NEXUS_5,1.0,en].png diff --git a/tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.event_TimelineItemVideoView_null_TimelineItemVideoView-Night-50_51_null_0,NEXUS_5,1.0,en].png b/tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.event_TimelineItemVideoView_null_TimelineItemVideoView-Night-51_52_null_0,NEXUS_5,1.0,en].png similarity index 100% rename from tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.event_TimelineItemVideoView_null_TimelineItemVideoView-Night-50_51_null_0,NEXUS_5,1.0,en].png rename to tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.event_TimelineItemVideoView_null_TimelineItemVideoView-Night-51_52_null_0,NEXUS_5,1.0,en].png diff --git a/tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.event_TimelineItemVideoView_null_TimelineItemVideoView-Night-50_51_null_1,NEXUS_5,1.0,en].png b/tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.event_TimelineItemVideoView_null_TimelineItemVideoView-Night-51_52_null_1,NEXUS_5,1.0,en].png similarity index 100% rename from tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.event_TimelineItemVideoView_null_TimelineItemVideoView-Night-50_51_null_1,NEXUS_5,1.0,en].png rename to tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.event_TimelineItemVideoView_null_TimelineItemVideoView-Night-51_52_null_1,NEXUS_5,1.0,en].png diff --git a/tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.event_TimelineItemVideoView_null_TimelineItemVideoView-Night-50_51_null_2,NEXUS_5,1.0,en].png b/tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.event_TimelineItemVideoView_null_TimelineItemVideoView-Night-51_52_null_2,NEXUS_5,1.0,en].png similarity index 100% rename from tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.event_TimelineItemVideoView_null_TimelineItemVideoView-Night-50_51_null_2,NEXUS_5,1.0,en].png rename to tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.event_TimelineItemVideoView_null_TimelineItemVideoView-Night-51_52_null_2,NEXUS_5,1.0,en].png diff --git a/tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.event_TimelineItemVoiceViewUnified_null_TimelineItemVoiceViewUnified-Day-53_53_null,NEXUS_5,1.0,en].png b/tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.event_TimelineItemVoiceViewUnified_null_TimelineItemVoiceViewUnified-Day-54_54_null,NEXUS_5,1.0,en].png similarity index 100% rename from tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.event_TimelineItemVoiceViewUnified_null_TimelineItemVoiceViewUnified-Day-53_53_null,NEXUS_5,1.0,en].png rename to tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.event_TimelineItemVoiceViewUnified_null_TimelineItemVoiceViewUnified-Day-54_54_null,NEXUS_5,1.0,en].png diff --git a/tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.event_TimelineItemVoiceViewUnified_null_TimelineItemVoiceViewUnified-Night-53_54_null,NEXUS_5,1.0,en].png b/tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.event_TimelineItemVoiceViewUnified_null_TimelineItemVoiceViewUnified-Night-54_55_null,NEXUS_5,1.0,en].png similarity index 100% rename from tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.event_TimelineItemVoiceViewUnified_null_TimelineItemVoiceViewUnified-Night-53_54_null,NEXUS_5,1.0,en].png rename to tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.event_TimelineItemVoiceViewUnified_null_TimelineItemVoiceViewUnified-Night-54_55_null,NEXUS_5,1.0,en].png diff --git a/tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.event_TimelineItemVoiceView_null_TimelineItemVoiceView-Day-52_52_null_0,NEXUS_5,1.0,en].png b/tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.event_TimelineItemVoiceView_null_TimelineItemVoiceView-Day-53_53_null_0,NEXUS_5,1.0,en].png similarity index 100% rename from tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.event_TimelineItemVoiceView_null_TimelineItemVoiceView-Day-52_52_null_0,NEXUS_5,1.0,en].png rename to tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.event_TimelineItemVoiceView_null_TimelineItemVoiceView-Day-53_53_null_0,NEXUS_5,1.0,en].png diff --git a/tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.event_TimelineItemVoiceView_null_TimelineItemVoiceView-Day-52_52_null_1,NEXUS_5,1.0,en].png b/tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.event_TimelineItemVoiceView_null_TimelineItemVoiceView-Day-53_53_null_1,NEXUS_5,1.0,en].png similarity index 100% rename from tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.event_TimelineItemVoiceView_null_TimelineItemVoiceView-Day-52_52_null_1,NEXUS_5,1.0,en].png rename to tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.event_TimelineItemVoiceView_null_TimelineItemVoiceView-Day-53_53_null_1,NEXUS_5,1.0,en].png diff --git a/tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.event_TimelineItemVoiceView_null_TimelineItemVoiceView-Day-52_52_null_10,NEXUS_5,1.0,en].png b/tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.event_TimelineItemVoiceView_null_TimelineItemVoiceView-Day-53_53_null_10,NEXUS_5,1.0,en].png similarity index 100% rename from tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.event_TimelineItemVoiceView_null_TimelineItemVoiceView-Day-52_52_null_10,NEXUS_5,1.0,en].png rename to tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.event_TimelineItemVoiceView_null_TimelineItemVoiceView-Day-53_53_null_10,NEXUS_5,1.0,en].png diff --git a/tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.event_TimelineItemVoiceView_null_TimelineItemVoiceView-Day-52_52_null_11,NEXUS_5,1.0,en].png b/tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.event_TimelineItemVoiceView_null_TimelineItemVoiceView-Day-53_53_null_11,NEXUS_5,1.0,en].png similarity index 100% rename from tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.event_TimelineItemVoiceView_null_TimelineItemVoiceView-Day-52_52_null_11,NEXUS_5,1.0,en].png rename to tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.event_TimelineItemVoiceView_null_TimelineItemVoiceView-Day-53_53_null_11,NEXUS_5,1.0,en].png diff --git a/tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.event_TimelineItemVoiceView_null_TimelineItemVoiceView-Day-52_52_null_12,NEXUS_5,1.0,en].png b/tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.event_TimelineItemVoiceView_null_TimelineItemVoiceView-Day-53_53_null_12,NEXUS_5,1.0,en].png similarity index 100% rename from tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.event_TimelineItemVoiceView_null_TimelineItemVoiceView-Day-52_52_null_12,NEXUS_5,1.0,en].png rename to tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.event_TimelineItemVoiceView_null_TimelineItemVoiceView-Day-53_53_null_12,NEXUS_5,1.0,en].png diff --git a/tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.event_TimelineItemVoiceView_null_TimelineItemVoiceView-Day-52_52_null_13,NEXUS_5,1.0,en].png b/tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.event_TimelineItemVoiceView_null_TimelineItemVoiceView-Day-53_53_null_13,NEXUS_5,1.0,en].png similarity index 100% rename from tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.event_TimelineItemVoiceView_null_TimelineItemVoiceView-Day-52_52_null_13,NEXUS_5,1.0,en].png rename to tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.event_TimelineItemVoiceView_null_TimelineItemVoiceView-Day-53_53_null_13,NEXUS_5,1.0,en].png diff --git a/tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.event_TimelineItemVoiceView_null_TimelineItemVoiceView-Day-52_52_null_14,NEXUS_5,1.0,en].png b/tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.event_TimelineItemVoiceView_null_TimelineItemVoiceView-Day-53_53_null_14,NEXUS_5,1.0,en].png similarity index 100% rename from tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.event_TimelineItemVoiceView_null_TimelineItemVoiceView-Day-52_52_null_14,NEXUS_5,1.0,en].png rename to tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.event_TimelineItemVoiceView_null_TimelineItemVoiceView-Day-53_53_null_14,NEXUS_5,1.0,en].png diff --git a/tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.event_TimelineItemVoiceView_null_TimelineItemVoiceView-Day-52_52_null_2,NEXUS_5,1.0,en].png b/tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.event_TimelineItemVoiceView_null_TimelineItemVoiceView-Day-53_53_null_2,NEXUS_5,1.0,en].png similarity index 100% rename from tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.event_TimelineItemVoiceView_null_TimelineItemVoiceView-Day-52_52_null_2,NEXUS_5,1.0,en].png rename to tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.event_TimelineItemVoiceView_null_TimelineItemVoiceView-Day-53_53_null_2,NEXUS_5,1.0,en].png diff --git a/tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.event_TimelineItemVoiceView_null_TimelineItemVoiceView-Day-52_52_null_3,NEXUS_5,1.0,en].png b/tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.event_TimelineItemVoiceView_null_TimelineItemVoiceView-Day-53_53_null_3,NEXUS_5,1.0,en].png similarity index 100% rename from tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.event_TimelineItemVoiceView_null_TimelineItemVoiceView-Day-52_52_null_3,NEXUS_5,1.0,en].png rename to tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.event_TimelineItemVoiceView_null_TimelineItemVoiceView-Day-53_53_null_3,NEXUS_5,1.0,en].png diff --git a/tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.event_TimelineItemVoiceView_null_TimelineItemVoiceView-Day-52_52_null_4,NEXUS_5,1.0,en].png b/tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.event_TimelineItemVoiceView_null_TimelineItemVoiceView-Day-53_53_null_4,NEXUS_5,1.0,en].png similarity index 100% rename from tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.event_TimelineItemVoiceView_null_TimelineItemVoiceView-Day-52_52_null_4,NEXUS_5,1.0,en].png rename to tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.event_TimelineItemVoiceView_null_TimelineItemVoiceView-Day-53_53_null_4,NEXUS_5,1.0,en].png diff --git a/tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.event_TimelineItemVoiceView_null_TimelineItemVoiceView-Day-52_52_null_5,NEXUS_5,1.0,en].png b/tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.event_TimelineItemVoiceView_null_TimelineItemVoiceView-Day-53_53_null_5,NEXUS_5,1.0,en].png similarity index 100% rename from tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.event_TimelineItemVoiceView_null_TimelineItemVoiceView-Day-52_52_null_5,NEXUS_5,1.0,en].png rename to tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.event_TimelineItemVoiceView_null_TimelineItemVoiceView-Day-53_53_null_5,NEXUS_5,1.0,en].png diff --git a/tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.event_TimelineItemVoiceView_null_TimelineItemVoiceView-Day-52_52_null_6,NEXUS_5,1.0,en].png b/tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.event_TimelineItemVoiceView_null_TimelineItemVoiceView-Day-53_53_null_6,NEXUS_5,1.0,en].png similarity index 100% rename from tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.event_TimelineItemVoiceView_null_TimelineItemVoiceView-Day-52_52_null_6,NEXUS_5,1.0,en].png rename to tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.event_TimelineItemVoiceView_null_TimelineItemVoiceView-Day-53_53_null_6,NEXUS_5,1.0,en].png diff --git a/tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.event_TimelineItemVoiceView_null_TimelineItemVoiceView-Day-52_52_null_7,NEXUS_5,1.0,en].png b/tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.event_TimelineItemVoiceView_null_TimelineItemVoiceView-Day-53_53_null_7,NEXUS_5,1.0,en].png similarity index 100% rename from tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.event_TimelineItemVoiceView_null_TimelineItemVoiceView-Day-52_52_null_7,NEXUS_5,1.0,en].png rename to tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.event_TimelineItemVoiceView_null_TimelineItemVoiceView-Day-53_53_null_7,NEXUS_5,1.0,en].png diff --git a/tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.event_TimelineItemVoiceView_null_TimelineItemVoiceView-Day-52_52_null_8,NEXUS_5,1.0,en].png b/tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.event_TimelineItemVoiceView_null_TimelineItemVoiceView-Day-53_53_null_8,NEXUS_5,1.0,en].png similarity index 100% rename from tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.event_TimelineItemVoiceView_null_TimelineItemVoiceView-Day-52_52_null_8,NEXUS_5,1.0,en].png rename to tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.event_TimelineItemVoiceView_null_TimelineItemVoiceView-Day-53_53_null_8,NEXUS_5,1.0,en].png diff --git a/tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.event_TimelineItemVoiceView_null_TimelineItemVoiceView-Day-52_52_null_9,NEXUS_5,1.0,en].png b/tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.event_TimelineItemVoiceView_null_TimelineItemVoiceView-Day-53_53_null_9,NEXUS_5,1.0,en].png similarity index 100% rename from tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.event_TimelineItemVoiceView_null_TimelineItemVoiceView-Day-52_52_null_9,NEXUS_5,1.0,en].png rename to tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.event_TimelineItemVoiceView_null_TimelineItemVoiceView-Day-53_53_null_9,NEXUS_5,1.0,en].png diff --git a/tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.event_TimelineItemVoiceView_null_TimelineItemVoiceView-Night-52_53_null_0,NEXUS_5,1.0,en].png b/tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.event_TimelineItemVoiceView_null_TimelineItemVoiceView-Night-53_54_null_0,NEXUS_5,1.0,en].png similarity index 100% rename from tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.event_TimelineItemVoiceView_null_TimelineItemVoiceView-Night-52_53_null_0,NEXUS_5,1.0,en].png rename to tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.event_TimelineItemVoiceView_null_TimelineItemVoiceView-Night-53_54_null_0,NEXUS_5,1.0,en].png diff --git a/tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.event_TimelineItemVoiceView_null_TimelineItemVoiceView-Night-52_53_null_1,NEXUS_5,1.0,en].png b/tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.event_TimelineItemVoiceView_null_TimelineItemVoiceView-Night-53_54_null_1,NEXUS_5,1.0,en].png similarity index 100% rename from tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.event_TimelineItemVoiceView_null_TimelineItemVoiceView-Night-52_53_null_1,NEXUS_5,1.0,en].png rename to tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.event_TimelineItemVoiceView_null_TimelineItemVoiceView-Night-53_54_null_1,NEXUS_5,1.0,en].png diff --git a/tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.event_TimelineItemVoiceView_null_TimelineItemVoiceView-Night-52_53_null_10,NEXUS_5,1.0,en].png b/tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.event_TimelineItemVoiceView_null_TimelineItemVoiceView-Night-53_54_null_10,NEXUS_5,1.0,en].png similarity index 100% rename from tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.event_TimelineItemVoiceView_null_TimelineItemVoiceView-Night-52_53_null_10,NEXUS_5,1.0,en].png rename to tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.event_TimelineItemVoiceView_null_TimelineItemVoiceView-Night-53_54_null_10,NEXUS_5,1.0,en].png diff --git a/tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.event_TimelineItemVoiceView_null_TimelineItemVoiceView-Night-52_53_null_11,NEXUS_5,1.0,en].png b/tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.event_TimelineItemVoiceView_null_TimelineItemVoiceView-Night-53_54_null_11,NEXUS_5,1.0,en].png similarity index 100% rename from tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.event_TimelineItemVoiceView_null_TimelineItemVoiceView-Night-52_53_null_11,NEXUS_5,1.0,en].png rename to tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.event_TimelineItemVoiceView_null_TimelineItemVoiceView-Night-53_54_null_11,NEXUS_5,1.0,en].png diff --git a/tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.event_TimelineItemVoiceView_null_TimelineItemVoiceView-Night-52_53_null_12,NEXUS_5,1.0,en].png b/tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.event_TimelineItemVoiceView_null_TimelineItemVoiceView-Night-53_54_null_12,NEXUS_5,1.0,en].png similarity index 100% rename from tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.event_TimelineItemVoiceView_null_TimelineItemVoiceView-Night-52_53_null_12,NEXUS_5,1.0,en].png rename to tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.event_TimelineItemVoiceView_null_TimelineItemVoiceView-Night-53_54_null_12,NEXUS_5,1.0,en].png diff --git a/tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.event_TimelineItemVoiceView_null_TimelineItemVoiceView-Night-52_53_null_13,NEXUS_5,1.0,en].png b/tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.event_TimelineItemVoiceView_null_TimelineItemVoiceView-Night-53_54_null_13,NEXUS_5,1.0,en].png similarity index 100% rename from tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.event_TimelineItemVoiceView_null_TimelineItemVoiceView-Night-52_53_null_13,NEXUS_5,1.0,en].png rename to tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.event_TimelineItemVoiceView_null_TimelineItemVoiceView-Night-53_54_null_13,NEXUS_5,1.0,en].png diff --git a/tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.event_TimelineItemVoiceView_null_TimelineItemVoiceView-Night-52_53_null_14,NEXUS_5,1.0,en].png b/tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.event_TimelineItemVoiceView_null_TimelineItemVoiceView-Night-53_54_null_14,NEXUS_5,1.0,en].png similarity index 100% rename from tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.event_TimelineItemVoiceView_null_TimelineItemVoiceView-Night-52_53_null_14,NEXUS_5,1.0,en].png rename to tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.event_TimelineItemVoiceView_null_TimelineItemVoiceView-Night-53_54_null_14,NEXUS_5,1.0,en].png diff --git a/tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.event_TimelineItemVoiceView_null_TimelineItemVoiceView-Night-52_53_null_2,NEXUS_5,1.0,en].png b/tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.event_TimelineItemVoiceView_null_TimelineItemVoiceView-Night-53_54_null_2,NEXUS_5,1.0,en].png similarity index 100% rename from tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.event_TimelineItemVoiceView_null_TimelineItemVoiceView-Night-52_53_null_2,NEXUS_5,1.0,en].png rename to tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.event_TimelineItemVoiceView_null_TimelineItemVoiceView-Night-53_54_null_2,NEXUS_5,1.0,en].png diff --git a/tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.event_TimelineItemVoiceView_null_TimelineItemVoiceView-Night-52_53_null_3,NEXUS_5,1.0,en].png b/tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.event_TimelineItemVoiceView_null_TimelineItemVoiceView-Night-53_54_null_3,NEXUS_5,1.0,en].png similarity index 100% rename from tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.event_TimelineItemVoiceView_null_TimelineItemVoiceView-Night-52_53_null_3,NEXUS_5,1.0,en].png rename to tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.event_TimelineItemVoiceView_null_TimelineItemVoiceView-Night-53_54_null_3,NEXUS_5,1.0,en].png diff --git a/tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.event_TimelineItemVoiceView_null_TimelineItemVoiceView-Night-52_53_null_4,NEXUS_5,1.0,en].png b/tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.event_TimelineItemVoiceView_null_TimelineItemVoiceView-Night-53_54_null_4,NEXUS_5,1.0,en].png similarity index 100% rename from tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.event_TimelineItemVoiceView_null_TimelineItemVoiceView-Night-52_53_null_4,NEXUS_5,1.0,en].png rename to tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.event_TimelineItemVoiceView_null_TimelineItemVoiceView-Night-53_54_null_4,NEXUS_5,1.0,en].png diff --git a/tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.event_TimelineItemVoiceView_null_TimelineItemVoiceView-Night-52_53_null_5,NEXUS_5,1.0,en].png b/tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.event_TimelineItemVoiceView_null_TimelineItemVoiceView-Night-53_54_null_5,NEXUS_5,1.0,en].png similarity index 100% rename from tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.event_TimelineItemVoiceView_null_TimelineItemVoiceView-Night-52_53_null_5,NEXUS_5,1.0,en].png rename to tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.event_TimelineItemVoiceView_null_TimelineItemVoiceView-Night-53_54_null_5,NEXUS_5,1.0,en].png diff --git a/tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.event_TimelineItemVoiceView_null_TimelineItemVoiceView-Night-52_53_null_6,NEXUS_5,1.0,en].png b/tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.event_TimelineItemVoiceView_null_TimelineItemVoiceView-Night-53_54_null_6,NEXUS_5,1.0,en].png similarity index 100% rename from tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.event_TimelineItemVoiceView_null_TimelineItemVoiceView-Night-52_53_null_6,NEXUS_5,1.0,en].png rename to tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.event_TimelineItemVoiceView_null_TimelineItemVoiceView-Night-53_54_null_6,NEXUS_5,1.0,en].png diff --git a/tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.event_TimelineItemVoiceView_null_TimelineItemVoiceView-Night-52_53_null_7,NEXUS_5,1.0,en].png b/tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.event_TimelineItemVoiceView_null_TimelineItemVoiceView-Night-53_54_null_7,NEXUS_5,1.0,en].png similarity index 100% rename from tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.event_TimelineItemVoiceView_null_TimelineItemVoiceView-Night-52_53_null_7,NEXUS_5,1.0,en].png rename to tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.event_TimelineItemVoiceView_null_TimelineItemVoiceView-Night-53_54_null_7,NEXUS_5,1.0,en].png diff --git a/tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.event_TimelineItemVoiceView_null_TimelineItemVoiceView-Night-52_53_null_8,NEXUS_5,1.0,en].png b/tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.event_TimelineItemVoiceView_null_TimelineItemVoiceView-Night-53_54_null_8,NEXUS_5,1.0,en].png similarity index 100% rename from tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.event_TimelineItemVoiceView_null_TimelineItemVoiceView-Night-52_53_null_8,NEXUS_5,1.0,en].png rename to tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.event_TimelineItemVoiceView_null_TimelineItemVoiceView-Night-53_54_null_8,NEXUS_5,1.0,en].png diff --git a/tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.event_TimelineItemVoiceView_null_TimelineItemVoiceView-Night-52_53_null_9,NEXUS_5,1.0,en].png b/tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.event_TimelineItemVoiceView_null_TimelineItemVoiceView-Night-53_54_null_9,NEXUS_5,1.0,en].png similarity index 100% rename from tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.event_TimelineItemVoiceView_null_TimelineItemVoiceView-Night-52_53_null_9,NEXUS_5,1.0,en].png rename to tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.event_TimelineItemVoiceView_null_TimelineItemVoiceView-Night-53_54_null_9,NEXUS_5,1.0,en].png diff --git a/tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.event_TimelineVideoWithCaptionRow_null_TimelineVideoWithCaptionRow-Day-51_51_null,NEXUS_5,1.0,en].png b/tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.event_TimelineVideoWithCaptionRow_null_TimelineVideoWithCaptionRow-Day-52_52_null,NEXUS_5,1.0,en].png similarity index 100% rename from tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.event_TimelineVideoWithCaptionRow_null_TimelineVideoWithCaptionRow-Day-51_51_null,NEXUS_5,1.0,en].png rename to tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.event_TimelineVideoWithCaptionRow_null_TimelineVideoWithCaptionRow-Day-52_52_null,NEXUS_5,1.0,en].png diff --git a/tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.event_TimelineVideoWithCaptionRow_null_TimelineVideoWithCaptionRow-Night-51_52_null,NEXUS_5,1.0,en].png b/tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.event_TimelineVideoWithCaptionRow_null_TimelineVideoWithCaptionRow-Night-52_53_null,NEXUS_5,1.0,en].png similarity index 100% rename from tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.event_TimelineVideoWithCaptionRow_null_TimelineVideoWithCaptionRow-Night-51_52_null,NEXUS_5,1.0,en].png rename to tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.event_TimelineVideoWithCaptionRow_null_TimelineVideoWithCaptionRow-Night-52_53_null,NEXUS_5,1.0,en].png diff --git a/tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.group_GroupHeaderView_null_GroupHeaderView-Day-55_55_null,NEXUS_5,1.0,en].png b/tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.group_GroupHeaderView_null_GroupHeaderView-Day-56_56_null,NEXUS_5,1.0,en].png similarity index 100% rename from tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.group_GroupHeaderView_null_GroupHeaderView-Day-55_55_null,NEXUS_5,1.0,en].png rename to tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.group_GroupHeaderView_null_GroupHeaderView-Day-56_56_null,NEXUS_5,1.0,en].png diff --git a/tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.group_GroupHeaderView_null_GroupHeaderView-Night-55_56_null,NEXUS_5,1.0,en].png b/tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.group_GroupHeaderView_null_GroupHeaderView-Night-56_57_null,NEXUS_5,1.0,en].png similarity index 100% rename from tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.group_GroupHeaderView_null_GroupHeaderView-Night-55_56_null,NEXUS_5,1.0,en].png rename to tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.group_GroupHeaderView_null_GroupHeaderView-Night-56_57_null,NEXUS_5,1.0,en].png diff --git a/tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.reactionsummary_SheetContent_null_SheetContent-Day-56_56_null_0,NEXUS_5,1.0,en].png b/tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.reactionsummary_SheetContent_null_SheetContent-Day-57_57_null_0,NEXUS_5,1.0,en].png similarity index 100% rename from tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.reactionsummary_SheetContent_null_SheetContent-Day-56_56_null_0,NEXUS_5,1.0,en].png rename to tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.reactionsummary_SheetContent_null_SheetContent-Day-57_57_null_0,NEXUS_5,1.0,en].png diff --git a/tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.reactionsummary_SheetContent_null_SheetContent-Night-56_57_null_0,NEXUS_5,1.0,en].png b/tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.reactionsummary_SheetContent_null_SheetContent-Night-57_58_null_0,NEXUS_5,1.0,en].png similarity index 100% rename from tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.reactionsummary_SheetContent_null_SheetContent-Night-56_57_null_0,NEXUS_5,1.0,en].png rename to tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.reactionsummary_SheetContent_null_SheetContent-Night-57_58_null_0,NEXUS_5,1.0,en].png diff --git a/tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.receipt.bottomsheet_ReadReceiptBottomSheet_null_ReadReceiptBottomSheet-Day-58_58_null_0,NEXUS_5,1.0,en].png b/tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.receipt.bottomsheet_ReadReceiptBottomSheet_null_ReadReceiptBottomSheet-Day-59_59_null_0,NEXUS_5,1.0,en].png similarity index 100% rename from tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.receipt.bottomsheet_ReadReceiptBottomSheet_null_ReadReceiptBottomSheet-Day-58_58_null_0,NEXUS_5,1.0,en].png rename to tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.receipt.bottomsheet_ReadReceiptBottomSheet_null_ReadReceiptBottomSheet-Day-59_59_null_0,NEXUS_5,1.0,en].png diff --git a/tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.receipt.bottomsheet_ReadReceiptBottomSheet_null_ReadReceiptBottomSheet-Day-58_58_null_1,NEXUS_5,1.0,en].png b/tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.receipt.bottomsheet_ReadReceiptBottomSheet_null_ReadReceiptBottomSheet-Day-59_59_null_1,NEXUS_5,1.0,en].png similarity index 100% rename from tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.receipt.bottomsheet_ReadReceiptBottomSheet_null_ReadReceiptBottomSheet-Day-58_58_null_1,NEXUS_5,1.0,en].png rename to tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.receipt.bottomsheet_ReadReceiptBottomSheet_null_ReadReceiptBottomSheet-Day-59_59_null_1,NEXUS_5,1.0,en].png diff --git a/tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.receipt.bottomsheet_ReadReceiptBottomSheet_null_ReadReceiptBottomSheet-Day-58_58_null_2,NEXUS_5,1.0,en].png b/tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.receipt.bottomsheet_ReadReceiptBottomSheet_null_ReadReceiptBottomSheet-Day-59_59_null_2,NEXUS_5,1.0,en].png similarity index 100% rename from tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.receipt.bottomsheet_ReadReceiptBottomSheet_null_ReadReceiptBottomSheet-Day-58_58_null_2,NEXUS_5,1.0,en].png rename to tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.receipt.bottomsheet_ReadReceiptBottomSheet_null_ReadReceiptBottomSheet-Day-59_59_null_2,NEXUS_5,1.0,en].png diff --git a/tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.receipt.bottomsheet_ReadReceiptBottomSheet_null_ReadReceiptBottomSheet-Day-58_58_null_3,NEXUS_5,1.0,en].png b/tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.receipt.bottomsheet_ReadReceiptBottomSheet_null_ReadReceiptBottomSheet-Day-59_59_null_3,NEXUS_5,1.0,en].png similarity index 100% rename from tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.receipt.bottomsheet_ReadReceiptBottomSheet_null_ReadReceiptBottomSheet-Day-58_58_null_3,NEXUS_5,1.0,en].png rename to tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.receipt.bottomsheet_ReadReceiptBottomSheet_null_ReadReceiptBottomSheet-Day-59_59_null_3,NEXUS_5,1.0,en].png diff --git a/tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.receipt.bottomsheet_ReadReceiptBottomSheet_null_ReadReceiptBottomSheet-Day-58_58_null_4,NEXUS_5,1.0,en].png b/tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.receipt.bottomsheet_ReadReceiptBottomSheet_null_ReadReceiptBottomSheet-Day-59_59_null_4,NEXUS_5,1.0,en].png similarity index 100% rename from tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.receipt.bottomsheet_ReadReceiptBottomSheet_null_ReadReceiptBottomSheet-Day-58_58_null_4,NEXUS_5,1.0,en].png rename to tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.receipt.bottomsheet_ReadReceiptBottomSheet_null_ReadReceiptBottomSheet-Day-59_59_null_4,NEXUS_5,1.0,en].png diff --git a/tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.receipt.bottomsheet_ReadReceiptBottomSheet_null_ReadReceiptBottomSheet-Day-58_58_null_5,NEXUS_5,1.0,en].png b/tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.receipt.bottomsheet_ReadReceiptBottomSheet_null_ReadReceiptBottomSheet-Day-59_59_null_5,NEXUS_5,1.0,en].png similarity index 100% rename from tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.receipt.bottomsheet_ReadReceiptBottomSheet_null_ReadReceiptBottomSheet-Day-58_58_null_5,NEXUS_5,1.0,en].png rename to tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.receipt.bottomsheet_ReadReceiptBottomSheet_null_ReadReceiptBottomSheet-Day-59_59_null_5,NEXUS_5,1.0,en].png diff --git a/tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.receipt.bottomsheet_ReadReceiptBottomSheet_null_ReadReceiptBottomSheet-Night-58_59_null_0,NEXUS_5,1.0,en].png b/tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.receipt.bottomsheet_ReadReceiptBottomSheet_null_ReadReceiptBottomSheet-Night-59_60_null_0,NEXUS_5,1.0,en].png similarity index 100% rename from tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.receipt.bottomsheet_ReadReceiptBottomSheet_null_ReadReceiptBottomSheet-Night-58_59_null_0,NEXUS_5,1.0,en].png rename to tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.receipt.bottomsheet_ReadReceiptBottomSheet_null_ReadReceiptBottomSheet-Night-59_60_null_0,NEXUS_5,1.0,en].png diff --git a/tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.receipt.bottomsheet_ReadReceiptBottomSheet_null_ReadReceiptBottomSheet-Night-58_59_null_1,NEXUS_5,1.0,en].png b/tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.receipt.bottomsheet_ReadReceiptBottomSheet_null_ReadReceiptBottomSheet-Night-59_60_null_1,NEXUS_5,1.0,en].png similarity index 100% rename from tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.receipt.bottomsheet_ReadReceiptBottomSheet_null_ReadReceiptBottomSheet-Night-58_59_null_1,NEXUS_5,1.0,en].png rename to tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.receipt.bottomsheet_ReadReceiptBottomSheet_null_ReadReceiptBottomSheet-Night-59_60_null_1,NEXUS_5,1.0,en].png diff --git a/tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.receipt.bottomsheet_ReadReceiptBottomSheet_null_ReadReceiptBottomSheet-Night-58_59_null_2,NEXUS_5,1.0,en].png b/tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.receipt.bottomsheet_ReadReceiptBottomSheet_null_ReadReceiptBottomSheet-Night-59_60_null_2,NEXUS_5,1.0,en].png similarity index 100% rename from tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.receipt.bottomsheet_ReadReceiptBottomSheet_null_ReadReceiptBottomSheet-Night-58_59_null_2,NEXUS_5,1.0,en].png rename to tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.receipt.bottomsheet_ReadReceiptBottomSheet_null_ReadReceiptBottomSheet-Night-59_60_null_2,NEXUS_5,1.0,en].png diff --git a/tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.receipt.bottomsheet_ReadReceiptBottomSheet_null_ReadReceiptBottomSheet-Night-58_59_null_3,NEXUS_5,1.0,en].png b/tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.receipt.bottomsheet_ReadReceiptBottomSheet_null_ReadReceiptBottomSheet-Night-59_60_null_3,NEXUS_5,1.0,en].png similarity index 100% rename from tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.receipt.bottomsheet_ReadReceiptBottomSheet_null_ReadReceiptBottomSheet-Night-58_59_null_3,NEXUS_5,1.0,en].png rename to tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.receipt.bottomsheet_ReadReceiptBottomSheet_null_ReadReceiptBottomSheet-Night-59_60_null_3,NEXUS_5,1.0,en].png diff --git a/tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.receipt.bottomsheet_ReadReceiptBottomSheet_null_ReadReceiptBottomSheet-Night-58_59_null_4,NEXUS_5,1.0,en].png b/tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.receipt.bottomsheet_ReadReceiptBottomSheet_null_ReadReceiptBottomSheet-Night-59_60_null_4,NEXUS_5,1.0,en].png similarity index 100% rename from tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.receipt.bottomsheet_ReadReceiptBottomSheet_null_ReadReceiptBottomSheet-Night-58_59_null_4,NEXUS_5,1.0,en].png rename to tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.receipt.bottomsheet_ReadReceiptBottomSheet_null_ReadReceiptBottomSheet-Night-59_60_null_4,NEXUS_5,1.0,en].png diff --git a/tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.receipt.bottomsheet_ReadReceiptBottomSheet_null_ReadReceiptBottomSheet-Night-58_59_null_5,NEXUS_5,1.0,en].png b/tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.receipt.bottomsheet_ReadReceiptBottomSheet_null_ReadReceiptBottomSheet-Night-59_60_null_5,NEXUS_5,1.0,en].png similarity index 100% rename from tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.receipt.bottomsheet_ReadReceiptBottomSheet_null_ReadReceiptBottomSheet-Night-58_59_null_5,NEXUS_5,1.0,en].png rename to tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.receipt.bottomsheet_ReadReceiptBottomSheet_null_ReadReceiptBottomSheet-Night-59_60_null_5,NEXUS_5,1.0,en].png diff --git a/tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.receipt_TimelineItemReadReceiptView_null_TimelineItemReadReceiptView-Day-57_57_null_0,NEXUS_5,1.0,en].png b/tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.receipt_TimelineItemReadReceiptView_null_TimelineItemReadReceiptView-Day-58_58_null_0,NEXUS_5,1.0,en].png similarity index 100% rename from tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.receipt_TimelineItemReadReceiptView_null_TimelineItemReadReceiptView-Day-57_57_null_0,NEXUS_5,1.0,en].png rename to tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.receipt_TimelineItemReadReceiptView_null_TimelineItemReadReceiptView-Day-58_58_null_0,NEXUS_5,1.0,en].png diff --git a/tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.receipt_TimelineItemReadReceiptView_null_TimelineItemReadReceiptView-Day-57_57_null_1,NEXUS_5,1.0,en].png b/tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.receipt_TimelineItemReadReceiptView_null_TimelineItemReadReceiptView-Day-58_58_null_1,NEXUS_5,1.0,en].png similarity index 100% rename from tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.receipt_TimelineItemReadReceiptView_null_TimelineItemReadReceiptView-Day-57_57_null_1,NEXUS_5,1.0,en].png rename to tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.receipt_TimelineItemReadReceiptView_null_TimelineItemReadReceiptView-Day-58_58_null_1,NEXUS_5,1.0,en].png diff --git a/tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.receipt_TimelineItemReadReceiptView_null_TimelineItemReadReceiptView-Day-57_57_null_2,NEXUS_5,1.0,en].png b/tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.receipt_TimelineItemReadReceiptView_null_TimelineItemReadReceiptView-Day-58_58_null_2,NEXUS_5,1.0,en].png similarity index 100% rename from tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.receipt_TimelineItemReadReceiptView_null_TimelineItemReadReceiptView-Day-57_57_null_2,NEXUS_5,1.0,en].png rename to tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.receipt_TimelineItemReadReceiptView_null_TimelineItemReadReceiptView-Day-58_58_null_2,NEXUS_5,1.0,en].png diff --git a/tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.receipt_TimelineItemReadReceiptView_null_TimelineItemReadReceiptView-Day-57_57_null_3,NEXUS_5,1.0,en].png b/tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.receipt_TimelineItemReadReceiptView_null_TimelineItemReadReceiptView-Day-58_58_null_3,NEXUS_5,1.0,en].png similarity index 100% rename from tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.receipt_TimelineItemReadReceiptView_null_TimelineItemReadReceiptView-Day-57_57_null_3,NEXUS_5,1.0,en].png rename to tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.receipt_TimelineItemReadReceiptView_null_TimelineItemReadReceiptView-Day-58_58_null_3,NEXUS_5,1.0,en].png diff --git a/tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.receipt_TimelineItemReadReceiptView_null_TimelineItemReadReceiptView-Day-57_57_null_4,NEXUS_5,1.0,en].png b/tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.receipt_TimelineItemReadReceiptView_null_TimelineItemReadReceiptView-Day-58_58_null_4,NEXUS_5,1.0,en].png similarity index 100% rename from tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.receipt_TimelineItemReadReceiptView_null_TimelineItemReadReceiptView-Day-57_57_null_4,NEXUS_5,1.0,en].png rename to tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.receipt_TimelineItemReadReceiptView_null_TimelineItemReadReceiptView-Day-58_58_null_4,NEXUS_5,1.0,en].png diff --git a/tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.receipt_TimelineItemReadReceiptView_null_TimelineItemReadReceiptView-Day-57_57_null_5,NEXUS_5,1.0,en].png b/tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.receipt_TimelineItemReadReceiptView_null_TimelineItemReadReceiptView-Day-58_58_null_5,NEXUS_5,1.0,en].png similarity index 100% rename from tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.receipt_TimelineItemReadReceiptView_null_TimelineItemReadReceiptView-Day-57_57_null_5,NEXUS_5,1.0,en].png rename to tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.receipt_TimelineItemReadReceiptView_null_TimelineItemReadReceiptView-Day-58_58_null_5,NEXUS_5,1.0,en].png diff --git a/tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.receipt_TimelineItemReadReceiptView_null_TimelineItemReadReceiptView-Day-57_57_null_6,NEXUS_5,1.0,en].png b/tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.receipt_TimelineItemReadReceiptView_null_TimelineItemReadReceiptView-Day-58_58_null_6,NEXUS_5,1.0,en].png similarity index 100% rename from tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.receipt_TimelineItemReadReceiptView_null_TimelineItemReadReceiptView-Day-57_57_null_6,NEXUS_5,1.0,en].png rename to tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.receipt_TimelineItemReadReceiptView_null_TimelineItemReadReceiptView-Day-58_58_null_6,NEXUS_5,1.0,en].png diff --git a/tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.receipt_TimelineItemReadReceiptView_null_TimelineItemReadReceiptView-Day-57_57_null_7,NEXUS_5,1.0,en].png b/tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.receipt_TimelineItemReadReceiptView_null_TimelineItemReadReceiptView-Day-58_58_null_7,NEXUS_5,1.0,en].png similarity index 100% rename from tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.receipt_TimelineItemReadReceiptView_null_TimelineItemReadReceiptView-Day-57_57_null_7,NEXUS_5,1.0,en].png rename to tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.receipt_TimelineItemReadReceiptView_null_TimelineItemReadReceiptView-Day-58_58_null_7,NEXUS_5,1.0,en].png diff --git a/tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.receipt_TimelineItemReadReceiptView_null_TimelineItemReadReceiptView-Night-57_58_null_0,NEXUS_5,1.0,en].png b/tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.receipt_TimelineItemReadReceiptView_null_TimelineItemReadReceiptView-Night-58_59_null_0,NEXUS_5,1.0,en].png similarity index 100% rename from tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.receipt_TimelineItemReadReceiptView_null_TimelineItemReadReceiptView-Night-57_58_null_0,NEXUS_5,1.0,en].png rename to tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.receipt_TimelineItemReadReceiptView_null_TimelineItemReadReceiptView-Night-58_59_null_0,NEXUS_5,1.0,en].png diff --git a/tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.receipt_TimelineItemReadReceiptView_null_TimelineItemReadReceiptView-Night-57_58_null_1,NEXUS_5,1.0,en].png b/tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.receipt_TimelineItemReadReceiptView_null_TimelineItemReadReceiptView-Night-58_59_null_1,NEXUS_5,1.0,en].png similarity index 100% rename from tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.receipt_TimelineItemReadReceiptView_null_TimelineItemReadReceiptView-Night-57_58_null_1,NEXUS_5,1.0,en].png rename to tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.receipt_TimelineItemReadReceiptView_null_TimelineItemReadReceiptView-Night-58_59_null_1,NEXUS_5,1.0,en].png diff --git a/tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.receipt_TimelineItemReadReceiptView_null_TimelineItemReadReceiptView-Night-57_58_null_2,NEXUS_5,1.0,en].png b/tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.receipt_TimelineItemReadReceiptView_null_TimelineItemReadReceiptView-Night-58_59_null_2,NEXUS_5,1.0,en].png similarity index 100% rename from tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.receipt_TimelineItemReadReceiptView_null_TimelineItemReadReceiptView-Night-57_58_null_2,NEXUS_5,1.0,en].png rename to tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.receipt_TimelineItemReadReceiptView_null_TimelineItemReadReceiptView-Night-58_59_null_2,NEXUS_5,1.0,en].png diff --git a/tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.receipt_TimelineItemReadReceiptView_null_TimelineItemReadReceiptView-Night-57_58_null_3,NEXUS_5,1.0,en].png b/tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.receipt_TimelineItemReadReceiptView_null_TimelineItemReadReceiptView-Night-58_59_null_3,NEXUS_5,1.0,en].png similarity index 100% rename from tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.receipt_TimelineItemReadReceiptView_null_TimelineItemReadReceiptView-Night-57_58_null_3,NEXUS_5,1.0,en].png rename to tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.receipt_TimelineItemReadReceiptView_null_TimelineItemReadReceiptView-Night-58_59_null_3,NEXUS_5,1.0,en].png diff --git a/tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.receipt_TimelineItemReadReceiptView_null_TimelineItemReadReceiptView-Night-57_58_null_4,NEXUS_5,1.0,en].png b/tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.receipt_TimelineItemReadReceiptView_null_TimelineItemReadReceiptView-Night-58_59_null_4,NEXUS_5,1.0,en].png similarity index 100% rename from tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.receipt_TimelineItemReadReceiptView_null_TimelineItemReadReceiptView-Night-57_58_null_4,NEXUS_5,1.0,en].png rename to tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.receipt_TimelineItemReadReceiptView_null_TimelineItemReadReceiptView-Night-58_59_null_4,NEXUS_5,1.0,en].png diff --git a/tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.receipt_TimelineItemReadReceiptView_null_TimelineItemReadReceiptView-Night-57_58_null_5,NEXUS_5,1.0,en].png b/tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.receipt_TimelineItemReadReceiptView_null_TimelineItemReadReceiptView-Night-58_59_null_5,NEXUS_5,1.0,en].png similarity index 100% rename from tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.receipt_TimelineItemReadReceiptView_null_TimelineItemReadReceiptView-Night-57_58_null_5,NEXUS_5,1.0,en].png rename to tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.receipt_TimelineItemReadReceiptView_null_TimelineItemReadReceiptView-Night-58_59_null_5,NEXUS_5,1.0,en].png diff --git a/tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.receipt_TimelineItemReadReceiptView_null_TimelineItemReadReceiptView-Night-57_58_null_6,NEXUS_5,1.0,en].png b/tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.receipt_TimelineItemReadReceiptView_null_TimelineItemReadReceiptView-Night-58_59_null_6,NEXUS_5,1.0,en].png similarity index 100% rename from tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.receipt_TimelineItemReadReceiptView_null_TimelineItemReadReceiptView-Night-57_58_null_6,NEXUS_5,1.0,en].png rename to tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.receipt_TimelineItemReadReceiptView_null_TimelineItemReadReceiptView-Night-58_59_null_6,NEXUS_5,1.0,en].png diff --git a/tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.receipt_TimelineItemReadReceiptView_null_TimelineItemReadReceiptView-Night-57_58_null_7,NEXUS_5,1.0,en].png b/tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.receipt_TimelineItemReadReceiptView_null_TimelineItemReadReceiptView-Night-58_59_null_7,NEXUS_5,1.0,en].png similarity index 100% rename from tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.receipt_TimelineItemReadReceiptView_null_TimelineItemReadReceiptView-Night-57_58_null_7,NEXUS_5,1.0,en].png rename to tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.receipt_TimelineItemReadReceiptView_null_TimelineItemReadReceiptView-Night-58_59_null_7,NEXUS_5,1.0,en].png diff --git a/tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.retrysendmenu_RetrySendMessageMenu_null_RetrySendMessageMenu-Day-59_59_null_0,NEXUS_5,1.0,en].png b/tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.retrysendmenu_RetrySendMessageMenu_null_RetrySendMessageMenu-Day-60_60_null_0,NEXUS_5,1.0,en].png similarity index 100% rename from tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.retrysendmenu_RetrySendMessageMenu_null_RetrySendMessageMenu-Day-59_59_null_0,NEXUS_5,1.0,en].png rename to tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.retrysendmenu_RetrySendMessageMenu_null_RetrySendMessageMenu-Day-60_60_null_0,NEXUS_5,1.0,en].png diff --git a/tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.retrysendmenu_RetrySendMessageMenu_null_RetrySendMessageMenu-Day-59_59_null_1,NEXUS_5,1.0,en].png b/tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.retrysendmenu_RetrySendMessageMenu_null_RetrySendMessageMenu-Day-60_60_null_1,NEXUS_5,1.0,en].png similarity index 100% rename from tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.retrysendmenu_RetrySendMessageMenu_null_RetrySendMessageMenu-Day-59_59_null_1,NEXUS_5,1.0,en].png rename to tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.retrysendmenu_RetrySendMessageMenu_null_RetrySendMessageMenu-Day-60_60_null_1,NEXUS_5,1.0,en].png diff --git a/tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.retrysendmenu_RetrySendMessageMenu_null_RetrySendMessageMenu-Night-59_60_null_0,NEXUS_5,1.0,en].png b/tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.retrysendmenu_RetrySendMessageMenu_null_RetrySendMessageMenu-Night-60_61_null_0,NEXUS_5,1.0,en].png similarity index 100% rename from tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.retrysendmenu_RetrySendMessageMenu_null_RetrySendMessageMenu-Night-59_60_null_0,NEXUS_5,1.0,en].png rename to tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.retrysendmenu_RetrySendMessageMenu_null_RetrySendMessageMenu-Night-60_61_null_0,NEXUS_5,1.0,en].png diff --git a/tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.retrysendmenu_RetrySendMessageMenu_null_RetrySendMessageMenu-Night-59_60_null_1,NEXUS_5,1.0,en].png b/tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.retrysendmenu_RetrySendMessageMenu_null_RetrySendMessageMenu-Night-60_61_null_1,NEXUS_5,1.0,en].png similarity index 100% rename from tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.retrysendmenu_RetrySendMessageMenu_null_RetrySendMessageMenu-Night-59_60_null_1,NEXUS_5,1.0,en].png rename to tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.retrysendmenu_RetrySendMessageMenu_null_RetrySendMessageMenu-Night-60_61_null_1,NEXUS_5,1.0,en].png diff --git a/tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.virtual_EncryptedHistoryBannerView_null_EncryptedHistoryBannerView-Day-60_60_null,NEXUS_5,1.0,en].png b/tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.virtual_EncryptedHistoryBannerView_null_EncryptedHistoryBannerView-Day-61_61_null,NEXUS_5,1.0,en].png similarity index 100% rename from tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.virtual_EncryptedHistoryBannerView_null_EncryptedHistoryBannerView-Day-60_60_null,NEXUS_5,1.0,en].png rename to tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.virtual_EncryptedHistoryBannerView_null_EncryptedHistoryBannerView-Day-61_61_null,NEXUS_5,1.0,en].png diff --git a/tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.virtual_EncryptedHistoryBannerView_null_EncryptedHistoryBannerView-Night-60_61_null,NEXUS_5,1.0,en].png b/tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.virtual_EncryptedHistoryBannerView_null_EncryptedHistoryBannerView-Night-61_62_null,NEXUS_5,1.0,en].png similarity index 100% rename from tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.virtual_EncryptedHistoryBannerView_null_EncryptedHistoryBannerView-Night-60_61_null,NEXUS_5,1.0,en].png rename to tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.virtual_EncryptedHistoryBannerView_null_EncryptedHistoryBannerView-Night-61_62_null,NEXUS_5,1.0,en].png diff --git a/tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.virtual_TimelineItemDaySeparatorView_null_TimelineItemDaySeparatorView-Day-61_61_null_0,NEXUS_5,1.0,en].png b/tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.virtual_TimelineItemDaySeparatorView_null_TimelineItemDaySeparatorView-Day-62_62_null_0,NEXUS_5,1.0,en].png similarity index 100% rename from tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.virtual_TimelineItemDaySeparatorView_null_TimelineItemDaySeparatorView-Day-61_61_null_0,NEXUS_5,1.0,en].png rename to tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.virtual_TimelineItemDaySeparatorView_null_TimelineItemDaySeparatorView-Day-62_62_null_0,NEXUS_5,1.0,en].png diff --git a/tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.virtual_TimelineItemDaySeparatorView_null_TimelineItemDaySeparatorView-Day-61_61_null_1,NEXUS_5,1.0,en].png b/tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.virtual_TimelineItemDaySeparatorView_null_TimelineItemDaySeparatorView-Day-62_62_null_1,NEXUS_5,1.0,en].png similarity index 100% rename from tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.virtual_TimelineItemDaySeparatorView_null_TimelineItemDaySeparatorView-Day-61_61_null_1,NEXUS_5,1.0,en].png rename to tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.virtual_TimelineItemDaySeparatorView_null_TimelineItemDaySeparatorView-Day-62_62_null_1,NEXUS_5,1.0,en].png diff --git a/tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.virtual_TimelineItemDaySeparatorView_null_TimelineItemDaySeparatorView-Night-61_62_null_0,NEXUS_5,1.0,en].png b/tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.virtual_TimelineItemDaySeparatorView_null_TimelineItemDaySeparatorView-Night-62_63_null_0,NEXUS_5,1.0,en].png similarity index 100% rename from tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.virtual_TimelineItemDaySeparatorView_null_TimelineItemDaySeparatorView-Night-61_62_null_0,NEXUS_5,1.0,en].png rename to tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.virtual_TimelineItemDaySeparatorView_null_TimelineItemDaySeparatorView-Night-62_63_null_0,NEXUS_5,1.0,en].png diff --git a/tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.virtual_TimelineItemDaySeparatorView_null_TimelineItemDaySeparatorView-Night-61_62_null_1,NEXUS_5,1.0,en].png b/tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.virtual_TimelineItemDaySeparatorView_null_TimelineItemDaySeparatorView-Night-62_63_null_1,NEXUS_5,1.0,en].png similarity index 100% rename from tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.virtual_TimelineItemDaySeparatorView_null_TimelineItemDaySeparatorView-Night-61_62_null_1,NEXUS_5,1.0,en].png rename to tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.virtual_TimelineItemDaySeparatorView_null_TimelineItemDaySeparatorView-Night-62_63_null_1,NEXUS_5,1.0,en].png diff --git a/tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.virtual_TimelineItemReadMarkerView_null_TimelineItemReadMarkerView-Day-62_62_null,NEXUS_5,1.0,en].png b/tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.virtual_TimelineItemReadMarkerView_null_TimelineItemReadMarkerView-Day-63_63_null,NEXUS_5,1.0,en].png similarity index 100% rename from tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.virtual_TimelineItemReadMarkerView_null_TimelineItemReadMarkerView-Day-62_62_null,NEXUS_5,1.0,en].png rename to tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.virtual_TimelineItemReadMarkerView_null_TimelineItemReadMarkerView-Day-63_63_null,NEXUS_5,1.0,en].png diff --git a/tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.virtual_TimelineItemReadMarkerView_null_TimelineItemReadMarkerView-Night-62_63_null,NEXUS_5,1.0,en].png b/tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.virtual_TimelineItemReadMarkerView_null_TimelineItemReadMarkerView-Night-63_64_null,NEXUS_5,1.0,en].png similarity index 100% rename from tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.virtual_TimelineItemReadMarkerView_null_TimelineItemReadMarkerView-Night-62_63_null,NEXUS_5,1.0,en].png rename to tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.virtual_TimelineItemReadMarkerView_null_TimelineItemReadMarkerView-Night-63_64_null,NEXUS_5,1.0,en].png diff --git a/tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.virtual_TimelineItemRoomBeginningView_null_TimelineItemRoomBeginningView-Day-63_63_null,NEXUS_5,1.0,en].png b/tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.virtual_TimelineItemRoomBeginningView_null_TimelineItemRoomBeginningView-Day-64_64_null,NEXUS_5,1.0,en].png similarity index 100% rename from tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.virtual_TimelineItemRoomBeginningView_null_TimelineItemRoomBeginningView-Day-63_63_null,NEXUS_5,1.0,en].png rename to tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.virtual_TimelineItemRoomBeginningView_null_TimelineItemRoomBeginningView-Day-64_64_null,NEXUS_5,1.0,en].png diff --git a/tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.virtual_TimelineItemRoomBeginningView_null_TimelineItemRoomBeginningView-Night-63_64_null,NEXUS_5,1.0,en].png b/tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.virtual_TimelineItemRoomBeginningView_null_TimelineItemRoomBeginningView-Night-64_65_null,NEXUS_5,1.0,en].png similarity index 100% rename from tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.virtual_TimelineItemRoomBeginningView_null_TimelineItemRoomBeginningView-Night-63_64_null,NEXUS_5,1.0,en].png rename to tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.virtual_TimelineItemRoomBeginningView_null_TimelineItemRoomBeginningView-Night-64_65_null,NEXUS_5,1.0,en].png diff --git a/tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.virtual_TimelineLoadingMoreIndicator_null_TimelineLoadingMoreIndicator-Day-64_64_null,NEXUS_5,1.0,en].png b/tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.virtual_TimelineLoadingMoreIndicator_null_TimelineLoadingMoreIndicator-Day-65_65_null,NEXUS_5,1.0,en].png similarity index 100% rename from tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.virtual_TimelineLoadingMoreIndicator_null_TimelineLoadingMoreIndicator-Day-64_64_null,NEXUS_5,1.0,en].png rename to tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.virtual_TimelineLoadingMoreIndicator_null_TimelineLoadingMoreIndicator-Day-65_65_null,NEXUS_5,1.0,en].png diff --git a/tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.virtual_TimelineLoadingMoreIndicator_null_TimelineLoadingMoreIndicator-Night-64_65_null,NEXUS_5,1.0,en].png b/tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.virtual_TimelineLoadingMoreIndicator_null_TimelineLoadingMoreIndicator-Night-65_66_null,NEXUS_5,1.0,en].png similarity index 100% rename from tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.virtual_TimelineLoadingMoreIndicator_null_TimelineLoadingMoreIndicator-Night-64_65_null,NEXUS_5,1.0,en].png rename to tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.virtual_TimelineLoadingMoreIndicator_null_TimelineLoadingMoreIndicator-Night-65_66_null,NEXUS_5,1.0,en].png diff --git a/tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components_TimelineItemCallNotifyView_null_TimelineItemCallNotifyView-Day-17_17_null,NEXUS_5,1.0,en].png b/tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components_TimelineItemCallNotifyView_null_TimelineItemCallNotifyView-Day-17_17_null,NEXUS_5,1.0,en].png new file mode 100644 index 0000000000..e6a112200f --- /dev/null +++ b/tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components_TimelineItemCallNotifyView_null_TimelineItemCallNotifyView-Day-17_17_null,NEXUS_5,1.0,en].png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:d58a58b2f8a77b06920d650e2bbb146271ee156f990e4136f534bb94d2ade37a +size 18629 diff --git a/tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components_TimelineItemCallNotifyView_null_TimelineItemCallNotifyView-Night-17_18_null,NEXUS_5,1.0,en].png b/tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components_TimelineItemCallNotifyView_null_TimelineItemCallNotifyView-Night-17_18_null,NEXUS_5,1.0,en].png new file mode 100644 index 0000000000..8defa9a306 --- /dev/null +++ b/tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components_TimelineItemCallNotifyView_null_TimelineItemCallNotifyView-Night-17_18_null,NEXUS_5,1.0,en].png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:1843ef93c9035460bbe0d0d02a9d77ba65c612e9b928885cd08a2d65f930eea6 +size 18494 diff --git a/tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components_TimelineItemEventRowDisambiguated_null_TimelineItemEventRowDisambiguated-Day-18_18_null_0,NEXUS_5,1.0,en].png b/tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components_TimelineItemEventRowDisambiguated_null_TimelineItemEventRowDisambiguated-Day-19_19_null_0,NEXUS_5,1.0,en].png similarity index 100% rename from tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components_TimelineItemEventRowDisambiguated_null_TimelineItemEventRowDisambiguated-Day-18_18_null_0,NEXUS_5,1.0,en].png rename to tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components_TimelineItemEventRowDisambiguated_null_TimelineItemEventRowDisambiguated-Day-19_19_null_0,NEXUS_5,1.0,en].png diff --git a/tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components_TimelineItemEventRowDisambiguated_null_TimelineItemEventRowDisambiguated-Night-18_19_null_0,NEXUS_5,1.0,en].png b/tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components_TimelineItemEventRowDisambiguated_null_TimelineItemEventRowDisambiguated-Night-19_20_null_0,NEXUS_5,1.0,en].png similarity index 100% rename from tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components_TimelineItemEventRowDisambiguated_null_TimelineItemEventRowDisambiguated-Night-18_19_null_0,NEXUS_5,1.0,en].png rename to tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components_TimelineItemEventRowDisambiguated_null_TimelineItemEventRowDisambiguated-Night-19_20_null_0,NEXUS_5,1.0,en].png diff --git a/tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components_TimelineItemEventRowForDirectRoom_null_TimelineItemEventRowForDirectRoom-Day-19_19_null,NEXUS_5,1.0,en].png b/tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components_TimelineItemEventRowForDirectRoom_null_TimelineItemEventRowForDirectRoom-Day-20_20_null,NEXUS_5,1.0,en].png similarity index 100% rename from tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components_TimelineItemEventRowForDirectRoom_null_TimelineItemEventRowForDirectRoom-Day-19_19_null,NEXUS_5,1.0,en].png rename to tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components_TimelineItemEventRowForDirectRoom_null_TimelineItemEventRowForDirectRoom-Day-20_20_null,NEXUS_5,1.0,en].png diff --git a/tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components_TimelineItemEventRowForDirectRoom_null_TimelineItemEventRowForDirectRoom-Night-19_20_null,NEXUS_5,1.0,en].png b/tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components_TimelineItemEventRowForDirectRoom_null_TimelineItemEventRowForDirectRoom-Night-20_21_null,NEXUS_5,1.0,en].png similarity index 100% rename from tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components_TimelineItemEventRowForDirectRoom_null_TimelineItemEventRowForDirectRoom-Night-19_20_null,NEXUS_5,1.0,en].png rename to tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components_TimelineItemEventRowForDirectRoom_null_TimelineItemEventRowForDirectRoom-Night-20_21_null,NEXUS_5,1.0,en].png diff --git a/tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components_TimelineItemEventRowTimestamp_null_TimelineItemEventRowTimestamp-Day-20_20_null_0,NEXUS_5,1.0,en].png b/tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components_TimelineItemEventRowTimestamp_null_TimelineItemEventRowTimestamp-Day-21_21_null_0,NEXUS_5,1.0,en].png similarity index 100% rename from tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components_TimelineItemEventRowTimestamp_null_TimelineItemEventRowTimestamp-Day-20_20_null_0,NEXUS_5,1.0,en].png rename to tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components_TimelineItemEventRowTimestamp_null_TimelineItemEventRowTimestamp-Day-21_21_null_0,NEXUS_5,1.0,en].png diff --git a/tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components_TimelineItemEventRowTimestamp_null_TimelineItemEventRowTimestamp-Day-20_20_null_1,NEXUS_5,1.0,en].png b/tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components_TimelineItemEventRowTimestamp_null_TimelineItemEventRowTimestamp-Day-21_21_null_1,NEXUS_5,1.0,en].png similarity index 100% rename from tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components_TimelineItemEventRowTimestamp_null_TimelineItemEventRowTimestamp-Day-20_20_null_1,NEXUS_5,1.0,en].png rename to tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components_TimelineItemEventRowTimestamp_null_TimelineItemEventRowTimestamp-Day-21_21_null_1,NEXUS_5,1.0,en].png diff --git a/tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components_TimelineItemEventRowTimestamp_null_TimelineItemEventRowTimestamp-Day-20_20_null_2,NEXUS_5,1.0,en].png b/tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components_TimelineItemEventRowTimestamp_null_TimelineItemEventRowTimestamp-Day-21_21_null_2,NEXUS_5,1.0,en].png similarity index 100% rename from tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components_TimelineItemEventRowTimestamp_null_TimelineItemEventRowTimestamp-Day-20_20_null_2,NEXUS_5,1.0,en].png rename to tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components_TimelineItemEventRowTimestamp_null_TimelineItemEventRowTimestamp-Day-21_21_null_2,NEXUS_5,1.0,en].png diff --git a/tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components_TimelineItemEventRowTimestamp_null_TimelineItemEventRowTimestamp-Day-20_20_null_3,NEXUS_5,1.0,en].png b/tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components_TimelineItemEventRowTimestamp_null_TimelineItemEventRowTimestamp-Day-21_21_null_3,NEXUS_5,1.0,en].png similarity index 100% rename from tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components_TimelineItemEventRowTimestamp_null_TimelineItemEventRowTimestamp-Day-20_20_null_3,NEXUS_5,1.0,en].png rename to tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components_TimelineItemEventRowTimestamp_null_TimelineItemEventRowTimestamp-Day-21_21_null_3,NEXUS_5,1.0,en].png diff --git a/tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components_TimelineItemEventRowTimestamp_null_TimelineItemEventRowTimestamp-Night-20_21_null_0,NEXUS_5,1.0,en].png b/tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components_TimelineItemEventRowTimestamp_null_TimelineItemEventRowTimestamp-Night-21_22_null_0,NEXUS_5,1.0,en].png similarity index 100% rename from tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components_TimelineItemEventRowTimestamp_null_TimelineItemEventRowTimestamp-Night-20_21_null_0,NEXUS_5,1.0,en].png rename to tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components_TimelineItemEventRowTimestamp_null_TimelineItemEventRowTimestamp-Night-21_22_null_0,NEXUS_5,1.0,en].png diff --git a/tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components_TimelineItemEventRowTimestamp_null_TimelineItemEventRowTimestamp-Night-20_21_null_1,NEXUS_5,1.0,en].png b/tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components_TimelineItemEventRowTimestamp_null_TimelineItemEventRowTimestamp-Night-21_22_null_1,NEXUS_5,1.0,en].png similarity index 100% rename from tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components_TimelineItemEventRowTimestamp_null_TimelineItemEventRowTimestamp-Night-20_21_null_1,NEXUS_5,1.0,en].png rename to tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components_TimelineItemEventRowTimestamp_null_TimelineItemEventRowTimestamp-Night-21_22_null_1,NEXUS_5,1.0,en].png diff --git a/tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components_TimelineItemEventRowTimestamp_null_TimelineItemEventRowTimestamp-Night-20_21_null_2,NEXUS_5,1.0,en].png b/tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components_TimelineItemEventRowTimestamp_null_TimelineItemEventRowTimestamp-Night-21_22_null_2,NEXUS_5,1.0,en].png similarity index 100% rename from tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components_TimelineItemEventRowTimestamp_null_TimelineItemEventRowTimestamp-Night-20_21_null_2,NEXUS_5,1.0,en].png rename to tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components_TimelineItemEventRowTimestamp_null_TimelineItemEventRowTimestamp-Night-21_22_null_2,NEXUS_5,1.0,en].png diff --git a/tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components_TimelineItemEventRowTimestamp_null_TimelineItemEventRowTimestamp-Night-20_21_null_3,NEXUS_5,1.0,en].png b/tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components_TimelineItemEventRowTimestamp_null_TimelineItemEventRowTimestamp-Night-21_22_null_3,NEXUS_5,1.0,en].png similarity index 100% rename from tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components_TimelineItemEventRowTimestamp_null_TimelineItemEventRowTimestamp-Night-20_21_null_3,NEXUS_5,1.0,en].png rename to tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components_TimelineItemEventRowTimestamp_null_TimelineItemEventRowTimestamp-Night-21_22_null_3,NEXUS_5,1.0,en].png diff --git a/tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components_TimelineItemEventRowWithManyReactions_null_TimelineItemEventRowWithManyReactions-Day-21_21_null,NEXUS_5,1.0,en].png b/tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components_TimelineItemEventRowWithManyReactions_null_TimelineItemEventRowWithManyReactions-Day-22_22_null,NEXUS_5,1.0,en].png similarity index 100% rename from tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components_TimelineItemEventRowWithManyReactions_null_TimelineItemEventRowWithManyReactions-Day-21_21_null,NEXUS_5,1.0,en].png rename to tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components_TimelineItemEventRowWithManyReactions_null_TimelineItemEventRowWithManyReactions-Day-22_22_null,NEXUS_5,1.0,en].png diff --git a/tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components_TimelineItemEventRowWithManyReactions_null_TimelineItemEventRowWithManyReactions-Night-21_22_null,NEXUS_5,1.0,en].png b/tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components_TimelineItemEventRowWithManyReactions_null_TimelineItemEventRowWithManyReactions-Night-22_23_null,NEXUS_5,1.0,en].png similarity index 100% rename from tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components_TimelineItemEventRowWithManyReactions_null_TimelineItemEventRowWithManyReactions-Night-21_22_null,NEXUS_5,1.0,en].png rename to tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components_TimelineItemEventRowWithManyReactions_null_TimelineItemEventRowWithManyReactions-Night-22_23_null,NEXUS_5,1.0,en].png diff --git a/tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components_TimelineItemEventRowWithRR_null_TimelineItemEventRowWithRR-Day-22_22_null_0,NEXUS_5,1.0,en].png b/tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components_TimelineItemEventRowWithRR_null_TimelineItemEventRowWithRR-Day-23_23_null_0,NEXUS_5,1.0,en].png similarity index 100% rename from tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components_TimelineItemEventRowWithRR_null_TimelineItemEventRowWithRR-Day-22_22_null_0,NEXUS_5,1.0,en].png rename to tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components_TimelineItemEventRowWithRR_null_TimelineItemEventRowWithRR-Day-23_23_null_0,NEXUS_5,1.0,en].png diff --git a/tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components_TimelineItemEventRowWithRR_null_TimelineItemEventRowWithRR-Day-22_22_null_1,NEXUS_5,1.0,en].png b/tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components_TimelineItemEventRowWithRR_null_TimelineItemEventRowWithRR-Day-23_23_null_1,NEXUS_5,1.0,en].png similarity index 100% rename from tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components_TimelineItemEventRowWithRR_null_TimelineItemEventRowWithRR-Day-22_22_null_1,NEXUS_5,1.0,en].png rename to tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components_TimelineItemEventRowWithRR_null_TimelineItemEventRowWithRR-Day-23_23_null_1,NEXUS_5,1.0,en].png diff --git a/tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components_TimelineItemEventRowWithRR_null_TimelineItemEventRowWithRR-Day-22_22_null_2,NEXUS_5,1.0,en].png b/tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components_TimelineItemEventRowWithRR_null_TimelineItemEventRowWithRR-Day-23_23_null_2,NEXUS_5,1.0,en].png similarity index 100% rename from tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components_TimelineItemEventRowWithRR_null_TimelineItemEventRowWithRR-Day-22_22_null_2,NEXUS_5,1.0,en].png rename to tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components_TimelineItemEventRowWithRR_null_TimelineItemEventRowWithRR-Day-23_23_null_2,NEXUS_5,1.0,en].png diff --git a/tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components_TimelineItemEventRowWithRR_null_TimelineItemEventRowWithRR-Night-22_23_null_0,NEXUS_5,1.0,en].png b/tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components_TimelineItemEventRowWithRR_null_TimelineItemEventRowWithRR-Night-23_24_null_0,NEXUS_5,1.0,en].png similarity index 100% rename from tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components_TimelineItemEventRowWithRR_null_TimelineItemEventRowWithRR-Night-22_23_null_0,NEXUS_5,1.0,en].png rename to tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components_TimelineItemEventRowWithRR_null_TimelineItemEventRowWithRR-Night-23_24_null_0,NEXUS_5,1.0,en].png diff --git a/tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components_TimelineItemEventRowWithRR_null_TimelineItemEventRowWithRR-Night-22_23_null_1,NEXUS_5,1.0,en].png b/tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components_TimelineItemEventRowWithRR_null_TimelineItemEventRowWithRR-Night-23_24_null_1,NEXUS_5,1.0,en].png similarity index 100% rename from tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components_TimelineItemEventRowWithRR_null_TimelineItemEventRowWithRR-Night-22_23_null_1,NEXUS_5,1.0,en].png rename to tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components_TimelineItemEventRowWithRR_null_TimelineItemEventRowWithRR-Night-23_24_null_1,NEXUS_5,1.0,en].png diff --git a/tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components_TimelineItemEventRowWithRR_null_TimelineItemEventRowWithRR-Night-22_23_null_2,NEXUS_5,1.0,en].png b/tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components_TimelineItemEventRowWithRR_null_TimelineItemEventRowWithRR-Night-23_24_null_2,NEXUS_5,1.0,en].png similarity index 100% rename from tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components_TimelineItemEventRowWithRR_null_TimelineItemEventRowWithRR-Night-22_23_null_2,NEXUS_5,1.0,en].png rename to tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components_TimelineItemEventRowWithRR_null_TimelineItemEventRowWithRR-Night-23_24_null_2,NEXUS_5,1.0,en].png diff --git a/tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components_TimelineItemEventRowWithReplyInformative_null_TimelineItemEventRowWithReplyInformative-Day-23_23_null_0,NEXUS_5,1.0,en].png b/tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components_TimelineItemEventRowWithReplyInformative_null_TimelineItemEventRowWithReplyInformative-Day-24_24_null_0,NEXUS_5,1.0,en].png similarity index 100% rename from tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components_TimelineItemEventRowWithReplyInformative_null_TimelineItemEventRowWithReplyInformative-Day-23_23_null_0,NEXUS_5,1.0,en].png rename to tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components_TimelineItemEventRowWithReplyInformative_null_TimelineItemEventRowWithReplyInformative-Day-24_24_null_0,NEXUS_5,1.0,en].png diff --git a/tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components_TimelineItemEventRowWithReplyInformative_null_TimelineItemEventRowWithReplyInformative-Day-23_23_null_1,NEXUS_5,1.0,en].png b/tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components_TimelineItemEventRowWithReplyInformative_null_TimelineItemEventRowWithReplyInformative-Day-24_24_null_1,NEXUS_5,1.0,en].png similarity index 100% rename from tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components_TimelineItemEventRowWithReplyInformative_null_TimelineItemEventRowWithReplyInformative-Day-23_23_null_1,NEXUS_5,1.0,en].png rename to tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components_TimelineItemEventRowWithReplyInformative_null_TimelineItemEventRowWithReplyInformative-Day-24_24_null_1,NEXUS_5,1.0,en].png diff --git a/tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components_TimelineItemEventRowWithReplyInformative_null_TimelineItemEventRowWithReplyInformative-Night-23_24_null_0,NEXUS_5,1.0,en].png b/tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components_TimelineItemEventRowWithReplyInformative_null_TimelineItemEventRowWithReplyInformative-Night-24_25_null_0,NEXUS_5,1.0,en].png similarity index 100% rename from tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components_TimelineItemEventRowWithReplyInformative_null_TimelineItemEventRowWithReplyInformative-Night-23_24_null_0,NEXUS_5,1.0,en].png rename to tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components_TimelineItemEventRowWithReplyInformative_null_TimelineItemEventRowWithReplyInformative-Night-24_25_null_0,NEXUS_5,1.0,en].png diff --git a/tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components_TimelineItemEventRowWithReplyInformative_null_TimelineItemEventRowWithReplyInformative-Night-23_24_null_1,NEXUS_5,1.0,en].png b/tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components_TimelineItemEventRowWithReplyInformative_null_TimelineItemEventRowWithReplyInformative-Night-24_25_null_1,NEXUS_5,1.0,en].png similarity index 100% rename from tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components_TimelineItemEventRowWithReplyInformative_null_TimelineItemEventRowWithReplyInformative-Night-23_24_null_1,NEXUS_5,1.0,en].png rename to tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components_TimelineItemEventRowWithReplyInformative_null_TimelineItemEventRowWithReplyInformative-Night-24_25_null_1,NEXUS_5,1.0,en].png diff --git a/tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components_TimelineItemEventRowWithReplyOther_null_TimelineItemEventRowWithReplyOther-Day-24_24_null_0,NEXUS_5,1.0,en].png b/tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components_TimelineItemEventRowWithReplyOther_null_TimelineItemEventRowWithReplyOther-Day-25_25_null_0,NEXUS_5,1.0,en].png similarity index 100% rename from tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components_TimelineItemEventRowWithReplyOther_null_TimelineItemEventRowWithReplyOther-Day-24_24_null_0,NEXUS_5,1.0,en].png rename to tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components_TimelineItemEventRowWithReplyOther_null_TimelineItemEventRowWithReplyOther-Day-25_25_null_0,NEXUS_5,1.0,en].png diff --git a/tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components_TimelineItemEventRowWithReplyOther_null_TimelineItemEventRowWithReplyOther-Day-24_24_null_1,NEXUS_5,1.0,en].png b/tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components_TimelineItemEventRowWithReplyOther_null_TimelineItemEventRowWithReplyOther-Day-25_25_null_1,NEXUS_5,1.0,en].png similarity index 100% rename from tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components_TimelineItemEventRowWithReplyOther_null_TimelineItemEventRowWithReplyOther-Day-24_24_null_1,NEXUS_5,1.0,en].png rename to tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components_TimelineItemEventRowWithReplyOther_null_TimelineItemEventRowWithReplyOther-Day-25_25_null_1,NEXUS_5,1.0,en].png diff --git a/tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components_TimelineItemEventRowWithReplyOther_null_TimelineItemEventRowWithReplyOther-Night-24_25_null_0,NEXUS_5,1.0,en].png b/tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components_TimelineItemEventRowWithReplyOther_null_TimelineItemEventRowWithReplyOther-Night-25_26_null_0,NEXUS_5,1.0,en].png similarity index 100% rename from tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components_TimelineItemEventRowWithReplyOther_null_TimelineItemEventRowWithReplyOther-Night-24_25_null_0,NEXUS_5,1.0,en].png rename to tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components_TimelineItemEventRowWithReplyOther_null_TimelineItemEventRowWithReplyOther-Night-25_26_null_0,NEXUS_5,1.0,en].png diff --git a/tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components_TimelineItemEventRowWithReplyOther_null_TimelineItemEventRowWithReplyOther-Night-24_25_null_1,NEXUS_5,1.0,en].png b/tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components_TimelineItemEventRowWithReplyOther_null_TimelineItemEventRowWithReplyOther-Night-25_26_null_1,NEXUS_5,1.0,en].png similarity index 100% rename from tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components_TimelineItemEventRowWithReplyOther_null_TimelineItemEventRowWithReplyOther-Night-24_25_null_1,NEXUS_5,1.0,en].png rename to tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components_TimelineItemEventRowWithReplyOther_null_TimelineItemEventRowWithReplyOther-Night-25_26_null_1,NEXUS_5,1.0,en].png diff --git a/tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components_TimelineItemEventRowWithReply_null_TimelineItemEventRowWithReply-Day-25_25_null_0,NEXUS_5,1.0,en].png b/tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components_TimelineItemEventRowWithReply_null_TimelineItemEventRowWithReply-Day-26_26_null_0,NEXUS_5,1.0,en].png similarity index 100% rename from tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components_TimelineItemEventRowWithReply_null_TimelineItemEventRowWithReply-Day-25_25_null_0,NEXUS_5,1.0,en].png rename to tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components_TimelineItemEventRowWithReply_null_TimelineItemEventRowWithReply-Day-26_26_null_0,NEXUS_5,1.0,en].png diff --git a/tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components_TimelineItemEventRowWithReply_null_TimelineItemEventRowWithReply-Day-25_25_null_1,NEXUS_5,1.0,en].png b/tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components_TimelineItemEventRowWithReply_null_TimelineItemEventRowWithReply-Day-26_26_null_1,NEXUS_5,1.0,en].png similarity index 100% rename from tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components_TimelineItemEventRowWithReply_null_TimelineItemEventRowWithReply-Day-25_25_null_1,NEXUS_5,1.0,en].png rename to tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components_TimelineItemEventRowWithReply_null_TimelineItemEventRowWithReply-Day-26_26_null_1,NEXUS_5,1.0,en].png diff --git a/tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components_TimelineItemEventRowWithReply_null_TimelineItemEventRowWithReply-Day-25_25_null_10,NEXUS_5,1.0,en].png b/tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components_TimelineItemEventRowWithReply_null_TimelineItemEventRowWithReply-Day-26_26_null_10,NEXUS_5,1.0,en].png similarity index 100% rename from tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components_TimelineItemEventRowWithReply_null_TimelineItemEventRowWithReply-Day-25_25_null_10,NEXUS_5,1.0,en].png rename to tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components_TimelineItemEventRowWithReply_null_TimelineItemEventRowWithReply-Day-26_26_null_10,NEXUS_5,1.0,en].png diff --git a/tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components_TimelineItemEventRowWithReply_null_TimelineItemEventRowWithReply-Day-25_25_null_11,NEXUS_5,1.0,en].png b/tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components_TimelineItemEventRowWithReply_null_TimelineItemEventRowWithReply-Day-26_26_null_11,NEXUS_5,1.0,en].png similarity index 100% rename from tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components_TimelineItemEventRowWithReply_null_TimelineItemEventRowWithReply-Day-25_25_null_11,NEXUS_5,1.0,en].png rename to tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components_TimelineItemEventRowWithReply_null_TimelineItemEventRowWithReply-Day-26_26_null_11,NEXUS_5,1.0,en].png diff --git a/tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components_TimelineItemEventRowWithReply_null_TimelineItemEventRowWithReply-Day-25_25_null_2,NEXUS_5,1.0,en].png b/tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components_TimelineItemEventRowWithReply_null_TimelineItemEventRowWithReply-Day-26_26_null_2,NEXUS_5,1.0,en].png similarity index 100% rename from tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components_TimelineItemEventRowWithReply_null_TimelineItemEventRowWithReply-Day-25_25_null_2,NEXUS_5,1.0,en].png rename to tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components_TimelineItemEventRowWithReply_null_TimelineItemEventRowWithReply-Day-26_26_null_2,NEXUS_5,1.0,en].png diff --git a/tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components_TimelineItemEventRowWithReply_null_TimelineItemEventRowWithReply-Day-25_25_null_3,NEXUS_5,1.0,en].png b/tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components_TimelineItemEventRowWithReply_null_TimelineItemEventRowWithReply-Day-26_26_null_3,NEXUS_5,1.0,en].png similarity index 100% rename from tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components_TimelineItemEventRowWithReply_null_TimelineItemEventRowWithReply-Day-25_25_null_3,NEXUS_5,1.0,en].png rename to tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components_TimelineItemEventRowWithReply_null_TimelineItemEventRowWithReply-Day-26_26_null_3,NEXUS_5,1.0,en].png diff --git a/tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components_TimelineItemEventRowWithReply_null_TimelineItemEventRowWithReply-Day-25_25_null_4,NEXUS_5,1.0,en].png b/tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components_TimelineItemEventRowWithReply_null_TimelineItemEventRowWithReply-Day-26_26_null_4,NEXUS_5,1.0,en].png similarity index 100% rename from tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components_TimelineItemEventRowWithReply_null_TimelineItemEventRowWithReply-Day-25_25_null_4,NEXUS_5,1.0,en].png rename to tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components_TimelineItemEventRowWithReply_null_TimelineItemEventRowWithReply-Day-26_26_null_4,NEXUS_5,1.0,en].png diff --git a/tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components_TimelineItemEventRowWithReply_null_TimelineItemEventRowWithReply-Day-25_25_null_5,NEXUS_5,1.0,en].png b/tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components_TimelineItemEventRowWithReply_null_TimelineItemEventRowWithReply-Day-26_26_null_5,NEXUS_5,1.0,en].png similarity index 100% rename from tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components_TimelineItemEventRowWithReply_null_TimelineItemEventRowWithReply-Day-25_25_null_5,NEXUS_5,1.0,en].png rename to tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components_TimelineItemEventRowWithReply_null_TimelineItemEventRowWithReply-Day-26_26_null_5,NEXUS_5,1.0,en].png diff --git a/tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components_TimelineItemEventRowWithReply_null_TimelineItemEventRowWithReply-Day-25_25_null_6,NEXUS_5,1.0,en].png b/tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components_TimelineItemEventRowWithReply_null_TimelineItemEventRowWithReply-Day-26_26_null_6,NEXUS_5,1.0,en].png similarity index 100% rename from tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components_TimelineItemEventRowWithReply_null_TimelineItemEventRowWithReply-Day-25_25_null_6,NEXUS_5,1.0,en].png rename to tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components_TimelineItemEventRowWithReply_null_TimelineItemEventRowWithReply-Day-26_26_null_6,NEXUS_5,1.0,en].png diff --git a/tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components_TimelineItemEventRowWithReply_null_TimelineItemEventRowWithReply-Day-25_25_null_7,NEXUS_5,1.0,en].png b/tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components_TimelineItemEventRowWithReply_null_TimelineItemEventRowWithReply-Day-26_26_null_7,NEXUS_5,1.0,en].png similarity index 100% rename from tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components_TimelineItemEventRowWithReply_null_TimelineItemEventRowWithReply-Day-25_25_null_7,NEXUS_5,1.0,en].png rename to tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components_TimelineItemEventRowWithReply_null_TimelineItemEventRowWithReply-Day-26_26_null_7,NEXUS_5,1.0,en].png diff --git a/tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components_TimelineItemEventRowWithReply_null_TimelineItemEventRowWithReply-Day-25_25_null_8,NEXUS_5,1.0,en].png b/tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components_TimelineItemEventRowWithReply_null_TimelineItemEventRowWithReply-Day-26_26_null_8,NEXUS_5,1.0,en].png similarity index 100% rename from tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components_TimelineItemEventRowWithReply_null_TimelineItemEventRowWithReply-Day-25_25_null_8,NEXUS_5,1.0,en].png rename to tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components_TimelineItemEventRowWithReply_null_TimelineItemEventRowWithReply-Day-26_26_null_8,NEXUS_5,1.0,en].png diff --git a/tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components_TimelineItemEventRowWithReply_null_TimelineItemEventRowWithReply-Day-25_25_null_9,NEXUS_5,1.0,en].png b/tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components_TimelineItemEventRowWithReply_null_TimelineItemEventRowWithReply-Day-26_26_null_9,NEXUS_5,1.0,en].png similarity index 100% rename from tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components_TimelineItemEventRowWithReply_null_TimelineItemEventRowWithReply-Day-25_25_null_9,NEXUS_5,1.0,en].png rename to tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components_TimelineItemEventRowWithReply_null_TimelineItemEventRowWithReply-Day-26_26_null_9,NEXUS_5,1.0,en].png diff --git a/tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components_TimelineItemEventRowWithReply_null_TimelineItemEventRowWithReply-Night-25_26_null_0,NEXUS_5,1.0,en].png b/tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components_TimelineItemEventRowWithReply_null_TimelineItemEventRowWithReply-Night-26_27_null_0,NEXUS_5,1.0,en].png similarity index 100% rename from tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components_TimelineItemEventRowWithReply_null_TimelineItemEventRowWithReply-Night-25_26_null_0,NEXUS_5,1.0,en].png rename to tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components_TimelineItemEventRowWithReply_null_TimelineItemEventRowWithReply-Night-26_27_null_0,NEXUS_5,1.0,en].png diff --git a/tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components_TimelineItemEventRowWithReply_null_TimelineItemEventRowWithReply-Night-25_26_null_1,NEXUS_5,1.0,en].png b/tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components_TimelineItemEventRowWithReply_null_TimelineItemEventRowWithReply-Night-26_27_null_1,NEXUS_5,1.0,en].png similarity index 100% rename from tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components_TimelineItemEventRowWithReply_null_TimelineItemEventRowWithReply-Night-25_26_null_1,NEXUS_5,1.0,en].png rename to tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components_TimelineItemEventRowWithReply_null_TimelineItemEventRowWithReply-Night-26_27_null_1,NEXUS_5,1.0,en].png diff --git a/tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components_TimelineItemEventRowWithReply_null_TimelineItemEventRowWithReply-Night-25_26_null_10,NEXUS_5,1.0,en].png b/tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components_TimelineItemEventRowWithReply_null_TimelineItemEventRowWithReply-Night-26_27_null_10,NEXUS_5,1.0,en].png similarity index 100% rename from tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components_TimelineItemEventRowWithReply_null_TimelineItemEventRowWithReply-Night-25_26_null_10,NEXUS_5,1.0,en].png rename to tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components_TimelineItemEventRowWithReply_null_TimelineItemEventRowWithReply-Night-26_27_null_10,NEXUS_5,1.0,en].png diff --git a/tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components_TimelineItemEventRowWithReply_null_TimelineItemEventRowWithReply-Night-25_26_null_11,NEXUS_5,1.0,en].png b/tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components_TimelineItemEventRowWithReply_null_TimelineItemEventRowWithReply-Night-26_27_null_11,NEXUS_5,1.0,en].png similarity index 100% rename from tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components_TimelineItemEventRowWithReply_null_TimelineItemEventRowWithReply-Night-25_26_null_11,NEXUS_5,1.0,en].png rename to tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components_TimelineItemEventRowWithReply_null_TimelineItemEventRowWithReply-Night-26_27_null_11,NEXUS_5,1.0,en].png diff --git a/tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components_TimelineItemEventRowWithReply_null_TimelineItemEventRowWithReply-Night-25_26_null_2,NEXUS_5,1.0,en].png b/tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components_TimelineItemEventRowWithReply_null_TimelineItemEventRowWithReply-Night-26_27_null_2,NEXUS_5,1.0,en].png similarity index 100% rename from tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components_TimelineItemEventRowWithReply_null_TimelineItemEventRowWithReply-Night-25_26_null_2,NEXUS_5,1.0,en].png rename to tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components_TimelineItemEventRowWithReply_null_TimelineItemEventRowWithReply-Night-26_27_null_2,NEXUS_5,1.0,en].png diff --git a/tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components_TimelineItemEventRowWithReply_null_TimelineItemEventRowWithReply-Night-25_26_null_3,NEXUS_5,1.0,en].png b/tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components_TimelineItemEventRowWithReply_null_TimelineItemEventRowWithReply-Night-26_27_null_3,NEXUS_5,1.0,en].png similarity index 100% rename from tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components_TimelineItemEventRowWithReply_null_TimelineItemEventRowWithReply-Night-25_26_null_3,NEXUS_5,1.0,en].png rename to tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components_TimelineItemEventRowWithReply_null_TimelineItemEventRowWithReply-Night-26_27_null_3,NEXUS_5,1.0,en].png diff --git a/tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components_TimelineItemEventRowWithReply_null_TimelineItemEventRowWithReply-Night-25_26_null_4,NEXUS_5,1.0,en].png b/tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components_TimelineItemEventRowWithReply_null_TimelineItemEventRowWithReply-Night-26_27_null_4,NEXUS_5,1.0,en].png similarity index 100% rename from tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components_TimelineItemEventRowWithReply_null_TimelineItemEventRowWithReply-Night-25_26_null_4,NEXUS_5,1.0,en].png rename to tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components_TimelineItemEventRowWithReply_null_TimelineItemEventRowWithReply-Night-26_27_null_4,NEXUS_5,1.0,en].png diff --git a/tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components_TimelineItemEventRowWithReply_null_TimelineItemEventRowWithReply-Night-25_26_null_5,NEXUS_5,1.0,en].png b/tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components_TimelineItemEventRowWithReply_null_TimelineItemEventRowWithReply-Night-26_27_null_5,NEXUS_5,1.0,en].png similarity index 100% rename from tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components_TimelineItemEventRowWithReply_null_TimelineItemEventRowWithReply-Night-25_26_null_5,NEXUS_5,1.0,en].png rename to tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components_TimelineItemEventRowWithReply_null_TimelineItemEventRowWithReply-Night-26_27_null_5,NEXUS_5,1.0,en].png diff --git a/tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components_TimelineItemEventRowWithReply_null_TimelineItemEventRowWithReply-Night-25_26_null_6,NEXUS_5,1.0,en].png b/tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components_TimelineItemEventRowWithReply_null_TimelineItemEventRowWithReply-Night-26_27_null_6,NEXUS_5,1.0,en].png similarity index 100% rename from tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components_TimelineItemEventRowWithReply_null_TimelineItemEventRowWithReply-Night-25_26_null_6,NEXUS_5,1.0,en].png rename to tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components_TimelineItemEventRowWithReply_null_TimelineItemEventRowWithReply-Night-26_27_null_6,NEXUS_5,1.0,en].png diff --git a/tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components_TimelineItemEventRowWithReply_null_TimelineItemEventRowWithReply-Night-25_26_null_7,NEXUS_5,1.0,en].png b/tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components_TimelineItemEventRowWithReply_null_TimelineItemEventRowWithReply-Night-26_27_null_7,NEXUS_5,1.0,en].png similarity index 100% rename from tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components_TimelineItemEventRowWithReply_null_TimelineItemEventRowWithReply-Night-25_26_null_7,NEXUS_5,1.0,en].png rename to tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components_TimelineItemEventRowWithReply_null_TimelineItemEventRowWithReply-Night-26_27_null_7,NEXUS_5,1.0,en].png diff --git a/tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components_TimelineItemEventRowWithReply_null_TimelineItemEventRowWithReply-Night-25_26_null_8,NEXUS_5,1.0,en].png b/tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components_TimelineItemEventRowWithReply_null_TimelineItemEventRowWithReply-Night-26_27_null_8,NEXUS_5,1.0,en].png similarity index 100% rename from tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components_TimelineItemEventRowWithReply_null_TimelineItemEventRowWithReply-Night-25_26_null_8,NEXUS_5,1.0,en].png rename to tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components_TimelineItemEventRowWithReply_null_TimelineItemEventRowWithReply-Night-26_27_null_8,NEXUS_5,1.0,en].png diff --git a/tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components_TimelineItemEventRowWithReply_null_TimelineItemEventRowWithReply-Night-25_26_null_9,NEXUS_5,1.0,en].png b/tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components_TimelineItemEventRowWithReply_null_TimelineItemEventRowWithReply-Night-26_27_null_9,NEXUS_5,1.0,en].png similarity index 100% rename from tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components_TimelineItemEventRowWithReply_null_TimelineItemEventRowWithReply-Night-25_26_null_9,NEXUS_5,1.0,en].png rename to tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components_TimelineItemEventRowWithReply_null_TimelineItemEventRowWithReply-Night-26_27_null_9,NEXUS_5,1.0,en].png diff --git a/tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components_TimelineItemEventRow_null_TimelineItemEventRow-Day-17_17_null,NEXUS_5,1.0,en].png b/tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components_TimelineItemEventRow_null_TimelineItemEventRow-Day-18_18_null,NEXUS_5,1.0,en].png similarity index 100% rename from tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components_TimelineItemEventRow_null_TimelineItemEventRow-Day-17_17_null,NEXUS_5,1.0,en].png rename to tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components_TimelineItemEventRow_null_TimelineItemEventRow-Day-18_18_null,NEXUS_5,1.0,en].png diff --git a/tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components_TimelineItemEventRow_null_TimelineItemEventRow-Night-17_18_null,NEXUS_5,1.0,en].png b/tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components_TimelineItemEventRow_null_TimelineItemEventRow-Night-18_19_null,NEXUS_5,1.0,en].png similarity index 100% rename from tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components_TimelineItemEventRow_null_TimelineItemEventRow-Night-17_18_null,NEXUS_5,1.0,en].png rename to tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components_TimelineItemEventRow_null_TimelineItemEventRow-Night-18_19_null,NEXUS_5,1.0,en].png diff --git a/tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components_TimelineItemGroupedEventsRowContentCollapse_null_TimelineItemGroupedEventsRowContentCollapse-Day-27_27_null,NEXUS_5,1.0,en].png b/tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components_TimelineItemGroupedEventsRowContentCollapse_null_TimelineItemGroupedEventsRowContentCollapse-Day-28_28_null,NEXUS_5,1.0,en].png similarity index 100% rename from tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components_TimelineItemGroupedEventsRowContentCollapse_null_TimelineItemGroupedEventsRowContentCollapse-Day-27_27_null,NEXUS_5,1.0,en].png rename to tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components_TimelineItemGroupedEventsRowContentCollapse_null_TimelineItemGroupedEventsRowContentCollapse-Day-28_28_null,NEXUS_5,1.0,en].png diff --git a/tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components_TimelineItemGroupedEventsRowContentCollapse_null_TimelineItemGroupedEventsRowContentCollapse-Night-27_28_null,NEXUS_5,1.0,en].png b/tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components_TimelineItemGroupedEventsRowContentCollapse_null_TimelineItemGroupedEventsRowContentCollapse-Night-28_29_null,NEXUS_5,1.0,en].png similarity index 100% rename from tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components_TimelineItemGroupedEventsRowContentCollapse_null_TimelineItemGroupedEventsRowContentCollapse-Night-27_28_null,NEXUS_5,1.0,en].png rename to tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components_TimelineItemGroupedEventsRowContentCollapse_null_TimelineItemGroupedEventsRowContentCollapse-Night-28_29_null,NEXUS_5,1.0,en].png diff --git a/tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components_TimelineItemGroupedEventsRowContentExpanded_null_TimelineItemGroupedEventsRowContentExpanded-Day-26_26_null,NEXUS_5,1.0,en].png b/tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components_TimelineItemGroupedEventsRowContentExpanded_null_TimelineItemGroupedEventsRowContentExpanded-Day-27_27_null,NEXUS_5,1.0,en].png similarity index 100% rename from tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components_TimelineItemGroupedEventsRowContentExpanded_null_TimelineItemGroupedEventsRowContentExpanded-Day-26_26_null,NEXUS_5,1.0,en].png rename to tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components_TimelineItemGroupedEventsRowContentExpanded_null_TimelineItemGroupedEventsRowContentExpanded-Day-27_27_null,NEXUS_5,1.0,en].png diff --git a/tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components_TimelineItemGroupedEventsRowContentExpanded_null_TimelineItemGroupedEventsRowContentExpanded-Night-26_27_null,NEXUS_5,1.0,en].png b/tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components_TimelineItemGroupedEventsRowContentExpanded_null_TimelineItemGroupedEventsRowContentExpanded-Night-27_28_null,NEXUS_5,1.0,en].png similarity index 100% rename from tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components_TimelineItemGroupedEventsRowContentExpanded_null_TimelineItemGroupedEventsRowContentExpanded-Night-26_27_null,NEXUS_5,1.0,en].png rename to tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components_TimelineItemGroupedEventsRowContentExpanded_null_TimelineItemGroupedEventsRowContentExpanded-Night-27_28_null,NEXUS_5,1.0,en].png diff --git a/tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components_TimelineItemReactionsLayout_null_TimelineItemReactionsLayout-Day-28_28_null,NEXUS_5,1.0,en].png b/tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components_TimelineItemReactionsLayout_null_TimelineItemReactionsLayout-Day-29_29_null,NEXUS_5,1.0,en].png similarity index 100% rename from tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components_TimelineItemReactionsLayout_null_TimelineItemReactionsLayout-Day-28_28_null,NEXUS_5,1.0,en].png rename to tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components_TimelineItemReactionsLayout_null_TimelineItemReactionsLayout-Day-29_29_null,NEXUS_5,1.0,en].png diff --git a/tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components_TimelineItemReactionsLayout_null_TimelineItemReactionsLayout-Night-28_29_null,NEXUS_5,1.0,en].png b/tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components_TimelineItemReactionsLayout_null_TimelineItemReactionsLayout-Night-29_30_null,NEXUS_5,1.0,en].png similarity index 100% rename from tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components_TimelineItemReactionsLayout_null_TimelineItemReactionsLayout-Night-28_29_null,NEXUS_5,1.0,en].png rename to tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components_TimelineItemReactionsLayout_null_TimelineItemReactionsLayout-Night-29_30_null,NEXUS_5,1.0,en].png diff --git a/tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components_TimelineItemReactionsViewFew_null_TimelineItemReactionsViewFew-Day-30_30_null,NEXUS_5,1.0,en].png b/tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components_TimelineItemReactionsViewFew_null_TimelineItemReactionsViewFew-Day-31_31_null,NEXUS_5,1.0,en].png similarity index 100% rename from tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components_TimelineItemReactionsViewFew_null_TimelineItemReactionsViewFew-Day-30_30_null,NEXUS_5,1.0,en].png rename to tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components_TimelineItemReactionsViewFew_null_TimelineItemReactionsViewFew-Day-31_31_null,NEXUS_5,1.0,en].png diff --git a/tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components_TimelineItemReactionsViewFew_null_TimelineItemReactionsViewFew-Night-30_31_null,NEXUS_5,1.0,en].png b/tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components_TimelineItemReactionsViewFew_null_TimelineItemReactionsViewFew-Night-31_32_null,NEXUS_5,1.0,en].png similarity index 100% rename from tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components_TimelineItemReactionsViewFew_null_TimelineItemReactionsViewFew-Night-30_31_null,NEXUS_5,1.0,en].png rename to tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components_TimelineItemReactionsViewFew_null_TimelineItemReactionsViewFew-Night-31_32_null,NEXUS_5,1.0,en].png diff --git a/tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components_TimelineItemReactionsViewIncoming_null_TimelineItemReactionsViewIncoming-Day-31_31_null,NEXUS_5,1.0,en].png b/tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components_TimelineItemReactionsViewIncoming_null_TimelineItemReactionsViewIncoming-Day-32_32_null,NEXUS_5,1.0,en].png similarity index 100% rename from tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components_TimelineItemReactionsViewIncoming_null_TimelineItemReactionsViewIncoming-Day-31_31_null,NEXUS_5,1.0,en].png rename to tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components_TimelineItemReactionsViewIncoming_null_TimelineItemReactionsViewIncoming-Day-32_32_null,NEXUS_5,1.0,en].png diff --git a/tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components_TimelineItemReactionsViewIncoming_null_TimelineItemReactionsViewIncoming-Night-31_32_null,NEXUS_5,1.0,en].png b/tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components_TimelineItemReactionsViewIncoming_null_TimelineItemReactionsViewIncoming-Night-32_33_null,NEXUS_5,1.0,en].png similarity index 100% rename from tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components_TimelineItemReactionsViewIncoming_null_TimelineItemReactionsViewIncoming-Night-31_32_null,NEXUS_5,1.0,en].png rename to tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components_TimelineItemReactionsViewIncoming_null_TimelineItemReactionsViewIncoming-Night-32_33_null,NEXUS_5,1.0,en].png diff --git a/tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components_TimelineItemReactionsViewOutgoing_null_TimelineItemReactionsViewOutgoing-Day-32_32_null,NEXUS_5,1.0,en].png b/tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components_TimelineItemReactionsViewOutgoing_null_TimelineItemReactionsViewOutgoing-Day-33_33_null,NEXUS_5,1.0,en].png similarity index 100% rename from tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components_TimelineItemReactionsViewOutgoing_null_TimelineItemReactionsViewOutgoing-Day-32_32_null,NEXUS_5,1.0,en].png rename to tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components_TimelineItemReactionsViewOutgoing_null_TimelineItemReactionsViewOutgoing-Day-33_33_null,NEXUS_5,1.0,en].png diff --git a/tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components_TimelineItemReactionsViewOutgoing_null_TimelineItemReactionsViewOutgoing-Night-32_33_null,NEXUS_5,1.0,en].png b/tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components_TimelineItemReactionsViewOutgoing_null_TimelineItemReactionsViewOutgoing-Night-33_34_null,NEXUS_5,1.0,en].png similarity index 100% rename from tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components_TimelineItemReactionsViewOutgoing_null_TimelineItemReactionsViewOutgoing-Night-32_33_null,NEXUS_5,1.0,en].png rename to tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components_TimelineItemReactionsViewOutgoing_null_TimelineItemReactionsViewOutgoing-Night-33_34_null,NEXUS_5,1.0,en].png diff --git a/tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components_TimelineItemReactionsView_null_TimelineItemReactionsView-Day-29_29_null,NEXUS_5,1.0,en].png b/tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components_TimelineItemReactionsView_null_TimelineItemReactionsView-Day-30_30_null,NEXUS_5,1.0,en].png similarity index 100% rename from tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components_TimelineItemReactionsView_null_TimelineItemReactionsView-Day-29_29_null,NEXUS_5,1.0,en].png rename to tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components_TimelineItemReactionsView_null_TimelineItemReactionsView-Day-30_30_null,NEXUS_5,1.0,en].png diff --git a/tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components_TimelineItemReactionsView_null_TimelineItemReactionsView-Night-29_30_null,NEXUS_5,1.0,en].png b/tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components_TimelineItemReactionsView_null_TimelineItemReactionsView-Night-30_31_null,NEXUS_5,1.0,en].png similarity index 100% rename from tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components_TimelineItemReactionsView_null_TimelineItemReactionsView-Night-29_30_null,NEXUS_5,1.0,en].png rename to tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components_TimelineItemReactionsView_null_TimelineItemReactionsView-Night-30_31_null,NEXUS_5,1.0,en].png diff --git a/tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components_TimelineItemStateEventRow_null_TimelineItemStateEventRow-Day-33_33_null,NEXUS_5,1.0,en].png b/tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components_TimelineItemStateEventRow_null_TimelineItemStateEventRow-Day-34_34_null,NEXUS_5,1.0,en].png similarity index 100% rename from tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components_TimelineItemStateEventRow_null_TimelineItemStateEventRow-Day-33_33_null,NEXUS_5,1.0,en].png rename to tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components_TimelineItemStateEventRow_null_TimelineItemStateEventRow-Day-34_34_null,NEXUS_5,1.0,en].png diff --git a/tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components_TimelineItemStateEventRow_null_TimelineItemStateEventRow-Night-33_34_null,NEXUS_5,1.0,en].png b/tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components_TimelineItemStateEventRow_null_TimelineItemStateEventRow-Night-34_35_null,NEXUS_5,1.0,en].png similarity index 100% rename from tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components_TimelineItemStateEventRow_null_TimelineItemStateEventRow-Night-33_34_null,NEXUS_5,1.0,en].png rename to tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components_TimelineItemStateEventRow_null_TimelineItemStateEventRow-Night-34_35_null,NEXUS_5,1.0,en].png diff --git a/tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.debug_EventDebugInfoView_null_EventDebugInfoView-Day-65_65_null,NEXUS_5,1.0,en].png b/tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.debug_EventDebugInfoView_null_EventDebugInfoView-Day-66_66_null,NEXUS_5,1.0,en].png similarity index 100% rename from tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.debug_EventDebugInfoView_null_EventDebugInfoView-Day-65_65_null,NEXUS_5,1.0,en].png rename to tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.debug_EventDebugInfoView_null_EventDebugInfoView-Day-66_66_null,NEXUS_5,1.0,en].png diff --git a/tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.debug_EventDebugInfoView_null_EventDebugInfoView-Night-65_66_null,NEXUS_5,1.0,en].png b/tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.debug_EventDebugInfoView_null_EventDebugInfoView-Night-66_67_null,NEXUS_5,1.0,en].png similarity index 100% rename from tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.debug_EventDebugInfoView_null_EventDebugInfoView-Night-65_66_null,NEXUS_5,1.0,en].png rename to tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.debug_EventDebugInfoView_null_EventDebugInfoView-Night-66_67_null,NEXUS_5,1.0,en].png diff --git a/tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.focus_FocusRequestStateView_null_FocusRequestStateView-Day-66_66_null_0,NEXUS_5,1.0,en].png b/tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.focus_FocusRequestStateView_null_FocusRequestStateView-Day-67_67_null_0,NEXUS_5,1.0,en].png similarity index 100% rename from tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.focus_FocusRequestStateView_null_FocusRequestStateView-Day-66_66_null_0,NEXUS_5,1.0,en].png rename to tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.focus_FocusRequestStateView_null_FocusRequestStateView-Day-67_67_null_0,NEXUS_5,1.0,en].png diff --git a/tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.focus_FocusRequestStateView_null_FocusRequestStateView-Day-66_66_null_1,NEXUS_5,1.0,en].png b/tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.focus_FocusRequestStateView_null_FocusRequestStateView-Day-67_67_null_1,NEXUS_5,1.0,en].png similarity index 100% rename from tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.focus_FocusRequestStateView_null_FocusRequestStateView-Day-66_66_null_1,NEXUS_5,1.0,en].png rename to tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.focus_FocusRequestStateView_null_FocusRequestStateView-Day-67_67_null_1,NEXUS_5,1.0,en].png diff --git a/tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.focus_FocusRequestStateView_null_FocusRequestStateView-Day-66_66_null_2,NEXUS_5,1.0,en].png b/tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.focus_FocusRequestStateView_null_FocusRequestStateView-Day-67_67_null_2,NEXUS_5,1.0,en].png similarity index 100% rename from tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.focus_FocusRequestStateView_null_FocusRequestStateView-Day-66_66_null_2,NEXUS_5,1.0,en].png rename to tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.focus_FocusRequestStateView_null_FocusRequestStateView-Day-67_67_null_2,NEXUS_5,1.0,en].png diff --git a/tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.focus_FocusRequestStateView_null_FocusRequestStateView-Day-66_66_null_3,NEXUS_5,1.0,en].png b/tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.focus_FocusRequestStateView_null_FocusRequestStateView-Day-67_67_null_3,NEXUS_5,1.0,en].png similarity index 100% rename from tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.focus_FocusRequestStateView_null_FocusRequestStateView-Day-66_66_null_3,NEXUS_5,1.0,en].png rename to tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.focus_FocusRequestStateView_null_FocusRequestStateView-Day-67_67_null_3,NEXUS_5,1.0,en].png diff --git a/tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.focus_FocusRequestStateView_null_FocusRequestStateView-Night-66_67_null_0,NEXUS_5,1.0,en].png b/tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.focus_FocusRequestStateView_null_FocusRequestStateView-Night-67_68_null_0,NEXUS_5,1.0,en].png similarity index 100% rename from tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.focus_FocusRequestStateView_null_FocusRequestStateView-Night-66_67_null_0,NEXUS_5,1.0,en].png rename to tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.focus_FocusRequestStateView_null_FocusRequestStateView-Night-67_68_null_0,NEXUS_5,1.0,en].png diff --git a/tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.focus_FocusRequestStateView_null_FocusRequestStateView-Night-66_67_null_1,NEXUS_5,1.0,en].png b/tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.focus_FocusRequestStateView_null_FocusRequestStateView-Night-67_68_null_1,NEXUS_5,1.0,en].png similarity index 100% rename from tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.focus_FocusRequestStateView_null_FocusRequestStateView-Night-66_67_null_1,NEXUS_5,1.0,en].png rename to tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.focus_FocusRequestStateView_null_FocusRequestStateView-Night-67_68_null_1,NEXUS_5,1.0,en].png diff --git a/tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.focus_FocusRequestStateView_null_FocusRequestStateView-Night-66_67_null_2,NEXUS_5,1.0,en].png b/tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.focus_FocusRequestStateView_null_FocusRequestStateView-Night-67_68_null_2,NEXUS_5,1.0,en].png similarity index 100% rename from tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.focus_FocusRequestStateView_null_FocusRequestStateView-Night-66_67_null_2,NEXUS_5,1.0,en].png rename to tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.focus_FocusRequestStateView_null_FocusRequestStateView-Night-67_68_null_2,NEXUS_5,1.0,en].png diff --git a/tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.focus_FocusRequestStateView_null_FocusRequestStateView-Night-66_67_null_3,NEXUS_5,1.0,en].png b/tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.focus_FocusRequestStateView_null_FocusRequestStateView-Night-67_68_null_3,NEXUS_5,1.0,en].png similarity index 100% rename from tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.focus_FocusRequestStateView_null_FocusRequestStateView-Night-66_67_null_3,NEXUS_5,1.0,en].png rename to tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.focus_FocusRequestStateView_null_FocusRequestStateView-Night-67_68_null_3,NEXUS_5,1.0,en].png diff --git a/tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.typing_MessagesViewWithTyping_null_MessagesViewWithTyping-Day-67_67_null_0,NEXUS_5,1.0,en].png b/tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.typing_MessagesViewWithTyping_null_MessagesViewWithTyping-Day-68_68_null_0,NEXUS_5,1.0,en].png similarity index 100% rename from tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.typing_MessagesViewWithTyping_null_MessagesViewWithTyping-Day-67_67_null_0,NEXUS_5,1.0,en].png rename to tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.typing_MessagesViewWithTyping_null_MessagesViewWithTyping-Day-68_68_null_0,NEXUS_5,1.0,en].png diff --git a/tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.typing_MessagesViewWithTyping_null_MessagesViewWithTyping-Day-67_67_null_1,NEXUS_5,1.0,en].png b/tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.typing_MessagesViewWithTyping_null_MessagesViewWithTyping-Day-68_68_null_1,NEXUS_5,1.0,en].png similarity index 100% rename from tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.typing_MessagesViewWithTyping_null_MessagesViewWithTyping-Day-67_67_null_1,NEXUS_5,1.0,en].png rename to tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.typing_MessagesViewWithTyping_null_MessagesViewWithTyping-Day-68_68_null_1,NEXUS_5,1.0,en].png diff --git a/tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.typing_MessagesViewWithTyping_null_MessagesViewWithTyping-Day-67_67_null_2,NEXUS_5,1.0,en].png b/tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.typing_MessagesViewWithTyping_null_MessagesViewWithTyping-Day-68_68_null_2,NEXUS_5,1.0,en].png similarity index 100% rename from tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.typing_MessagesViewWithTyping_null_MessagesViewWithTyping-Day-67_67_null_2,NEXUS_5,1.0,en].png rename to tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.typing_MessagesViewWithTyping_null_MessagesViewWithTyping-Day-68_68_null_2,NEXUS_5,1.0,en].png diff --git a/tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.typing_MessagesViewWithTyping_null_MessagesViewWithTyping-Night-67_68_null_0,NEXUS_5,1.0,en].png b/tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.typing_MessagesViewWithTyping_null_MessagesViewWithTyping-Night-68_69_null_0,NEXUS_5,1.0,en].png similarity index 100% rename from tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.typing_MessagesViewWithTyping_null_MessagesViewWithTyping-Night-67_68_null_0,NEXUS_5,1.0,en].png rename to tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.typing_MessagesViewWithTyping_null_MessagesViewWithTyping-Night-68_69_null_0,NEXUS_5,1.0,en].png diff --git a/tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.typing_MessagesViewWithTyping_null_MessagesViewWithTyping-Night-67_68_null_1,NEXUS_5,1.0,en].png b/tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.typing_MessagesViewWithTyping_null_MessagesViewWithTyping-Night-68_69_null_1,NEXUS_5,1.0,en].png similarity index 100% rename from tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.typing_MessagesViewWithTyping_null_MessagesViewWithTyping-Night-67_68_null_1,NEXUS_5,1.0,en].png rename to tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.typing_MessagesViewWithTyping_null_MessagesViewWithTyping-Night-68_69_null_1,NEXUS_5,1.0,en].png diff --git a/tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.typing_MessagesViewWithTyping_null_MessagesViewWithTyping-Night-67_68_null_2,NEXUS_5,1.0,en].png b/tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.typing_MessagesViewWithTyping_null_MessagesViewWithTyping-Night-68_69_null_2,NEXUS_5,1.0,en].png similarity index 100% rename from tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.typing_MessagesViewWithTyping_null_MessagesViewWithTyping-Night-67_68_null_2,NEXUS_5,1.0,en].png rename to tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.typing_MessagesViewWithTyping_null_MessagesViewWithTyping-Night-68_69_null_2,NEXUS_5,1.0,en].png diff --git a/tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.typing_TypingNotificationView_null_TypingNotificationView-Day-68_68_null_0,NEXUS_5,1.0,en].png b/tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.typing_TypingNotificationView_null_TypingNotificationView-Day-69_69_null_0,NEXUS_5,1.0,en].png similarity index 100% rename from tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.typing_TypingNotificationView_null_TypingNotificationView-Day-68_68_null_0,NEXUS_5,1.0,en].png rename to tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.typing_TypingNotificationView_null_TypingNotificationView-Day-69_69_null_0,NEXUS_5,1.0,en].png diff --git a/tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.typing_TypingNotificationView_null_TypingNotificationView-Day-68_68_null_1,NEXUS_5,1.0,en].png b/tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.typing_TypingNotificationView_null_TypingNotificationView-Day-69_69_null_1,NEXUS_5,1.0,en].png similarity index 100% rename from tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.typing_TypingNotificationView_null_TypingNotificationView-Day-68_68_null_1,NEXUS_5,1.0,en].png rename to tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.typing_TypingNotificationView_null_TypingNotificationView-Day-69_69_null_1,NEXUS_5,1.0,en].png diff --git a/tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.typing_TypingNotificationView_null_TypingNotificationView-Day-68_68_null_2,NEXUS_5,1.0,en].png b/tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.typing_TypingNotificationView_null_TypingNotificationView-Day-69_69_null_2,NEXUS_5,1.0,en].png similarity index 100% rename from tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.typing_TypingNotificationView_null_TypingNotificationView-Day-68_68_null_2,NEXUS_5,1.0,en].png rename to tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.typing_TypingNotificationView_null_TypingNotificationView-Day-69_69_null_2,NEXUS_5,1.0,en].png diff --git a/tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.typing_TypingNotificationView_null_TypingNotificationView-Day-68_68_null_3,NEXUS_5,1.0,en].png b/tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.typing_TypingNotificationView_null_TypingNotificationView-Day-69_69_null_3,NEXUS_5,1.0,en].png similarity index 100% rename from tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.typing_TypingNotificationView_null_TypingNotificationView-Day-68_68_null_3,NEXUS_5,1.0,en].png rename to tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.typing_TypingNotificationView_null_TypingNotificationView-Day-69_69_null_3,NEXUS_5,1.0,en].png diff --git a/tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.typing_TypingNotificationView_null_TypingNotificationView-Day-68_68_null_4,NEXUS_5,1.0,en].png b/tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.typing_TypingNotificationView_null_TypingNotificationView-Day-69_69_null_4,NEXUS_5,1.0,en].png similarity index 100% rename from tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.typing_TypingNotificationView_null_TypingNotificationView-Day-68_68_null_4,NEXUS_5,1.0,en].png rename to tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.typing_TypingNotificationView_null_TypingNotificationView-Day-69_69_null_4,NEXUS_5,1.0,en].png diff --git a/tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.typing_TypingNotificationView_null_TypingNotificationView-Day-68_68_null_5,NEXUS_5,1.0,en].png b/tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.typing_TypingNotificationView_null_TypingNotificationView-Day-69_69_null_5,NEXUS_5,1.0,en].png similarity index 100% rename from tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.typing_TypingNotificationView_null_TypingNotificationView-Day-68_68_null_5,NEXUS_5,1.0,en].png rename to tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.typing_TypingNotificationView_null_TypingNotificationView-Day-69_69_null_5,NEXUS_5,1.0,en].png diff --git a/tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.typing_TypingNotificationView_null_TypingNotificationView-Day-68_68_null_6,NEXUS_5,1.0,en].png b/tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.typing_TypingNotificationView_null_TypingNotificationView-Day-69_69_null_6,NEXUS_5,1.0,en].png similarity index 100% rename from tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.typing_TypingNotificationView_null_TypingNotificationView-Day-68_68_null_6,NEXUS_5,1.0,en].png rename to tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.typing_TypingNotificationView_null_TypingNotificationView-Day-69_69_null_6,NEXUS_5,1.0,en].png diff --git a/tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.typing_TypingNotificationView_null_TypingNotificationView-Day-68_68_null_7,NEXUS_5,1.0,en].png b/tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.typing_TypingNotificationView_null_TypingNotificationView-Day-69_69_null_7,NEXUS_5,1.0,en].png similarity index 100% rename from tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.typing_TypingNotificationView_null_TypingNotificationView-Day-68_68_null_7,NEXUS_5,1.0,en].png rename to tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.typing_TypingNotificationView_null_TypingNotificationView-Day-69_69_null_7,NEXUS_5,1.0,en].png diff --git a/tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.typing_TypingNotificationView_null_TypingNotificationView-Day-68_68_null_8,NEXUS_5,1.0,en].png b/tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.typing_TypingNotificationView_null_TypingNotificationView-Day-69_69_null_8,NEXUS_5,1.0,en].png similarity index 100% rename from tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.typing_TypingNotificationView_null_TypingNotificationView-Day-68_68_null_8,NEXUS_5,1.0,en].png rename to tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.typing_TypingNotificationView_null_TypingNotificationView-Day-69_69_null_8,NEXUS_5,1.0,en].png diff --git a/tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.typing_TypingNotificationView_null_TypingNotificationView-Night-68_69_null_0,NEXUS_5,1.0,en].png b/tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.typing_TypingNotificationView_null_TypingNotificationView-Night-69_70_null_0,NEXUS_5,1.0,en].png similarity index 100% rename from tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.typing_TypingNotificationView_null_TypingNotificationView-Night-68_69_null_0,NEXUS_5,1.0,en].png rename to tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.typing_TypingNotificationView_null_TypingNotificationView-Night-69_70_null_0,NEXUS_5,1.0,en].png diff --git a/tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.typing_TypingNotificationView_null_TypingNotificationView-Night-68_69_null_1,NEXUS_5,1.0,en].png b/tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.typing_TypingNotificationView_null_TypingNotificationView-Night-69_70_null_1,NEXUS_5,1.0,en].png similarity index 100% rename from tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.typing_TypingNotificationView_null_TypingNotificationView-Night-68_69_null_1,NEXUS_5,1.0,en].png rename to tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.typing_TypingNotificationView_null_TypingNotificationView-Night-69_70_null_1,NEXUS_5,1.0,en].png diff --git a/tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.typing_TypingNotificationView_null_TypingNotificationView-Night-68_69_null_2,NEXUS_5,1.0,en].png b/tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.typing_TypingNotificationView_null_TypingNotificationView-Night-69_70_null_2,NEXUS_5,1.0,en].png similarity index 100% rename from tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.typing_TypingNotificationView_null_TypingNotificationView-Night-68_69_null_2,NEXUS_5,1.0,en].png rename to tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.typing_TypingNotificationView_null_TypingNotificationView-Night-69_70_null_2,NEXUS_5,1.0,en].png diff --git a/tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.typing_TypingNotificationView_null_TypingNotificationView-Night-68_69_null_3,NEXUS_5,1.0,en].png b/tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.typing_TypingNotificationView_null_TypingNotificationView-Night-69_70_null_3,NEXUS_5,1.0,en].png similarity index 100% rename from tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.typing_TypingNotificationView_null_TypingNotificationView-Night-68_69_null_3,NEXUS_5,1.0,en].png rename to tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.typing_TypingNotificationView_null_TypingNotificationView-Night-69_70_null_3,NEXUS_5,1.0,en].png diff --git a/tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.typing_TypingNotificationView_null_TypingNotificationView-Night-68_69_null_4,NEXUS_5,1.0,en].png b/tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.typing_TypingNotificationView_null_TypingNotificationView-Night-69_70_null_4,NEXUS_5,1.0,en].png similarity index 100% rename from tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.typing_TypingNotificationView_null_TypingNotificationView-Night-68_69_null_4,NEXUS_5,1.0,en].png rename to tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.typing_TypingNotificationView_null_TypingNotificationView-Night-69_70_null_4,NEXUS_5,1.0,en].png diff --git a/tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.typing_TypingNotificationView_null_TypingNotificationView-Night-68_69_null_5,NEXUS_5,1.0,en].png b/tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.typing_TypingNotificationView_null_TypingNotificationView-Night-69_70_null_5,NEXUS_5,1.0,en].png similarity index 100% rename from tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.typing_TypingNotificationView_null_TypingNotificationView-Night-68_69_null_5,NEXUS_5,1.0,en].png rename to tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.typing_TypingNotificationView_null_TypingNotificationView-Night-69_70_null_5,NEXUS_5,1.0,en].png diff --git a/tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.typing_TypingNotificationView_null_TypingNotificationView-Night-68_69_null_6,NEXUS_5,1.0,en].png b/tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.typing_TypingNotificationView_null_TypingNotificationView-Night-69_70_null_6,NEXUS_5,1.0,en].png similarity index 100% rename from tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.typing_TypingNotificationView_null_TypingNotificationView-Night-68_69_null_6,NEXUS_5,1.0,en].png rename to tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.typing_TypingNotificationView_null_TypingNotificationView-Night-69_70_null_6,NEXUS_5,1.0,en].png diff --git a/tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.typing_TypingNotificationView_null_TypingNotificationView-Night-68_69_null_7,NEXUS_5,1.0,en].png b/tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.typing_TypingNotificationView_null_TypingNotificationView-Night-69_70_null_7,NEXUS_5,1.0,en].png similarity index 100% rename from tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.typing_TypingNotificationView_null_TypingNotificationView-Night-68_69_null_7,NEXUS_5,1.0,en].png rename to tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.typing_TypingNotificationView_null_TypingNotificationView-Night-69_70_null_7,NEXUS_5,1.0,en].png diff --git a/tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.typing_TypingNotificationView_null_TypingNotificationView-Night-68_69_null_8,NEXUS_5,1.0,en].png b/tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.typing_TypingNotificationView_null_TypingNotificationView-Night-69_70_null_8,NEXUS_5,1.0,en].png similarity index 100% rename from tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.typing_TypingNotificationView_null_TypingNotificationView-Night-68_69_null_8,NEXUS_5,1.0,en].png rename to tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.typing_TypingNotificationView_null_TypingNotificationView-Night-69_70_null_8,NEXUS_5,1.0,en].png diff --git a/tests/uitests/src/test/snapshots/images/ui_S_t[f.securebackup.impl.createkey_CreateNewRecoveryKeyView_null_CreateNewRecoveryKeyView-Day-0_1_null,NEXUS_5,1.0,en].png b/tests/uitests/src/test/snapshots/images/ui_S_t[f.securebackup.impl.createkey_CreateNewRecoveryKeyView_null_CreateNewRecoveryKeyView-Day-0_1_null,NEXUS_5,1.0,en].png index 5e56497e00..9c9bcd90e5 100644 --- a/tests/uitests/src/test/snapshots/images/ui_S_t[f.securebackup.impl.createkey_CreateNewRecoveryKeyView_null_CreateNewRecoveryKeyView-Day-0_1_null,NEXUS_5,1.0,en].png +++ b/tests/uitests/src/test/snapshots/images/ui_S_t[f.securebackup.impl.createkey_CreateNewRecoveryKeyView_null_CreateNewRecoveryKeyView-Day-0_1_null,NEXUS_5,1.0,en].png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:22b40382bcb7f296e2b944b954298692c2946693d185976a6b128ec221d1ac5b -size 59235 +oid sha256:d3d1bbc0c03ac483d0047bc4711eb63741c2071f013ee5962a1184e6112bef0c +size 60386 diff --git a/tests/uitests/src/test/snapshots/images/ui_S_t[f.securebackup.impl.createkey_CreateNewRecoveryKeyView_null_CreateNewRecoveryKeyView-Night-0_2_null,NEXUS_5,1.0,en].png b/tests/uitests/src/test/snapshots/images/ui_S_t[f.securebackup.impl.createkey_CreateNewRecoveryKeyView_null_CreateNewRecoveryKeyView-Night-0_2_null,NEXUS_5,1.0,en].png index 0e86234e07..5205d00d66 100644 --- a/tests/uitests/src/test/snapshots/images/ui_S_t[f.securebackup.impl.createkey_CreateNewRecoveryKeyView_null_CreateNewRecoveryKeyView-Night-0_2_null,NEXUS_5,1.0,en].png +++ b/tests/uitests/src/test/snapshots/images/ui_S_t[f.securebackup.impl.createkey_CreateNewRecoveryKeyView_null_CreateNewRecoveryKeyView-Night-0_2_null,NEXUS_5,1.0,en].png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:2e5e3a60c51736f2c8e293fccc01cfa969525be86f6f500ffd22ee24413cb659 -size 57864 +oid sha256:b2162a49d87b23c25251c6a8c322ec62eee2eb34e802ab5ce2ecacb637735554 +size 59189 diff --git a/tests/uitests/src/test/snapshots/images/ui_S_t[f.share.impl_ShareView_null_ShareView-Day-0_1_null_0,NEXUS_5,1.0,en].png b/tests/uitests/src/test/snapshots/images/ui_S_t[f.share.impl_ShareView_null_ShareView-Day-0_1_null_0,NEXUS_5,1.0,en].png new file mode 100644 index 0000000000..1b6fb4bab8 --- /dev/null +++ b/tests/uitests/src/test/snapshots/images/ui_S_t[f.share.impl_ShareView_null_ShareView-Day-0_1_null_0,NEXUS_5,1.0,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/ui_S_t[f.share.impl_ShareView_null_ShareView-Day-0_1_null_1,NEXUS_5,1.0,en].png b/tests/uitests/src/test/snapshots/images/ui_S_t[f.share.impl_ShareView_null_ShareView-Day-0_1_null_1,NEXUS_5,1.0,en].png new file mode 100644 index 0000000000..89c8787a83 --- /dev/null +++ b/tests/uitests/src/test/snapshots/images/ui_S_t[f.share.impl_ShareView_null_ShareView-Day-0_1_null_1,NEXUS_5,1.0,en].png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:a145061b3ac70800e68f4f7d5cb3377406c8da120e77a3c14bd0de581d32493c +size 7285 diff --git a/tests/uitests/src/test/snapshots/images/ui_S_t[f.share.impl_ShareView_null_ShareView-Day-0_1_null_2,NEXUS_5,1.0,en].png b/tests/uitests/src/test/snapshots/images/ui_S_t[f.share.impl_ShareView_null_ShareView-Day-0_1_null_2,NEXUS_5,1.0,en].png new file mode 100644 index 0000000000..1b6fb4bab8 --- /dev/null +++ b/tests/uitests/src/test/snapshots/images/ui_S_t[f.share.impl_ShareView_null_ShareView-Day-0_1_null_2,NEXUS_5,1.0,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/ui_S_t[f.share.impl_ShareView_null_ShareView-Day-0_1_null_3,NEXUS_5,1.0,en].png b/tests/uitests/src/test/snapshots/images/ui_S_t[f.share.impl_ShareView_null_ShareView-Day-0_1_null_3,NEXUS_5,1.0,en].png new file mode 100644 index 0000000000..84b1759702 --- /dev/null +++ b/tests/uitests/src/test/snapshots/images/ui_S_t[f.share.impl_ShareView_null_ShareView-Day-0_1_null_3,NEXUS_5,1.0,en].png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:c261cfb0af17b3a4dad20b2717fca5c4d98ba8ae698c0b75630969d47cefb2ca +size 8972 diff --git a/tests/uitests/src/test/snapshots/images/ui_S_t[f.share.impl_ShareView_null_ShareView-Night-0_2_null_0,NEXUS_5,1.0,en].png b/tests/uitests/src/test/snapshots/images/ui_S_t[f.share.impl_ShareView_null_ShareView-Night-0_2_null_0,NEXUS_5,1.0,en].png new file mode 100644 index 0000000000..d6fd8eeb70 --- /dev/null +++ b/tests/uitests/src/test/snapshots/images/ui_S_t[f.share.impl_ShareView_null_ShareView-Night-0_2_null_0,NEXUS_5,1.0,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/ui_S_t[f.share.impl_ShareView_null_ShareView-Night-0_2_null_1,NEXUS_5,1.0,en].png b/tests/uitests/src/test/snapshots/images/ui_S_t[f.share.impl_ShareView_null_ShareView-Night-0_2_null_1,NEXUS_5,1.0,en].png new file mode 100644 index 0000000000..35de3d6199 --- /dev/null +++ b/tests/uitests/src/test/snapshots/images/ui_S_t[f.share.impl_ShareView_null_ShareView-Night-0_2_null_1,NEXUS_5,1.0,en].png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:09afce6e3c5975c3dc4cb14f17493a8385c3b616d5b6e9b7c66786156624d3d9 +size 6205 diff --git a/tests/uitests/src/test/snapshots/images/ui_S_t[f.share.impl_ShareView_null_ShareView-Night-0_2_null_2,NEXUS_5,1.0,en].png b/tests/uitests/src/test/snapshots/images/ui_S_t[f.share.impl_ShareView_null_ShareView-Night-0_2_null_2,NEXUS_5,1.0,en].png new file mode 100644 index 0000000000..d6fd8eeb70 --- /dev/null +++ b/tests/uitests/src/test/snapshots/images/ui_S_t[f.share.impl_ShareView_null_ShareView-Night-0_2_null_2,NEXUS_5,1.0,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/ui_S_t[f.share.impl_ShareView_null_ShareView-Night-0_2_null_3,NEXUS_5,1.0,en].png b/tests/uitests/src/test/snapshots/images/ui_S_t[f.share.impl_ShareView_null_ShareView-Night-0_2_null_3,NEXUS_5,1.0,en].png new file mode 100644 index 0000000000..39888d1ecc --- /dev/null +++ b/tests/uitests/src/test/snapshots/images/ui_S_t[f.share.impl_ShareView_null_ShareView-Night-0_2_null_3,NEXUS_5,1.0,en].png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:841d5dba36d0221f0893e0f0259c8e5cab3b7fc6d6c9b0d4f6e8b96accc7446b +size 7600 diff --git a/tests/uitests/src/test/snapshots/images/ui_S_t[l.designsystem.components.avatar_Avatar_null_Avatars_Avatar_0_null_10,NEXUS_5,1.0,en].png b/tests/uitests/src/test/snapshots/images/ui_S_t[l.designsystem.components.avatar_Avatar_null_Avatars_Avatar_0_null_10,NEXUS_5,1.0,en].png index 257534fa92..4462ff8798 100644 --- a/tests/uitests/src/test/snapshots/images/ui_S_t[l.designsystem.components.avatar_Avatar_null_Avatars_Avatar_0_null_10,NEXUS_5,1.0,en].png +++ b/tests/uitests/src/test/snapshots/images/ui_S_t[l.designsystem.components.avatar_Avatar_null_Avatars_Avatar_0_null_10,NEXUS_5,1.0,en].png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:130c300ec896d60e665cd3b11b3d58dd72b54e01365053a677330a52b86314c7 -size 18532 +oid sha256:8b20a53d7a1bb9e6cdb5dbae068c1934d4716986618596b33899caa975070f41 +size 14802 diff --git a/tests/uitests/src/test/snapshots/images/ui_S_t[l.designsystem.components.avatar_Avatar_null_Avatars_Avatar_0_null_11,NEXUS_5,1.0,en].png b/tests/uitests/src/test/snapshots/images/ui_S_t[l.designsystem.components.avatar_Avatar_null_Avatars_Avatar_0_null_11,NEXUS_5,1.0,en].png index 37040e69bc..4e2e4c0254 100644 --- a/tests/uitests/src/test/snapshots/images/ui_S_t[l.designsystem.components.avatar_Avatar_null_Avatars_Avatar_0_null_11,NEXUS_5,1.0,en].png +++ b/tests/uitests/src/test/snapshots/images/ui_S_t[l.designsystem.components.avatar_Avatar_null_Avatars_Avatar_0_null_11,NEXUS_5,1.0,en].png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:498e1b23a60c563387bbe734fc4ffd3896824d128e1213b194b344091058ae8a -size 21480 +oid sha256:f0ce8e6b948f953ebfb183939e606f3faa0d73ad35c2707b9821f8229bce37e2 +size 19071 diff --git a/tests/uitests/src/test/snapshots/images/ui_S_t[l.designsystem.components.avatar_Avatar_null_Avatars_Avatar_0_null_12,NEXUS_5,1.0,en].png b/tests/uitests/src/test/snapshots/images/ui_S_t[l.designsystem.components.avatar_Avatar_null_Avatars_Avatar_0_null_12,NEXUS_5,1.0,en].png index 5aa2ad2c6f..44a9f12406 100644 --- a/tests/uitests/src/test/snapshots/images/ui_S_t[l.designsystem.components.avatar_Avatar_null_Avatars_Avatar_0_null_12,NEXUS_5,1.0,en].png +++ b/tests/uitests/src/test/snapshots/images/ui_S_t[l.designsystem.components.avatar_Avatar_null_Avatars_Avatar_0_null_12,NEXUS_5,1.0,en].png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:90fbc995b03553699a0ea3cfca65b3c0d800ad91f7405cd59d0f6110aeaa3783 -size 17591 +oid sha256:a1c284262da7cfc1af8aa583d2762084bf1693c44f83bf1cc1de2d74f57dae0e +size 19408 diff --git a/tests/uitests/src/test/snapshots/images/ui_S_t[l.designsystem.components.avatar_Avatar_null_Avatars_Avatar_0_null_13,NEXUS_5,1.0,en].png b/tests/uitests/src/test/snapshots/images/ui_S_t[l.designsystem.components.avatar_Avatar_null_Avatars_Avatar_0_null_13,NEXUS_5,1.0,en].png index 53d55e5152..257534fa92 100644 --- a/tests/uitests/src/test/snapshots/images/ui_S_t[l.designsystem.components.avatar_Avatar_null_Avatars_Avatar_0_null_13,NEXUS_5,1.0,en].png +++ b/tests/uitests/src/test/snapshots/images/ui_S_t[l.designsystem.components.avatar_Avatar_null_Avatars_Avatar_0_null_13,NEXUS_5,1.0,en].png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:f0d092bc75f8199660f9e527f2712824535ddbcde91da6cefe4b306f668dc026 -size 16279 +oid sha256:130c300ec896d60e665cd3b11b3d58dd72b54e01365053a677330a52b86314c7 +size 18532 diff --git a/tests/uitests/src/test/snapshots/images/ui_S_t[l.designsystem.components.avatar_Avatar_null_Avatars_Avatar_0_null_14,NEXUS_5,1.0,en].png b/tests/uitests/src/test/snapshots/images/ui_S_t[l.designsystem.components.avatar_Avatar_null_Avatars_Avatar_0_null_14,NEXUS_5,1.0,en].png index eab29dd2b2..37040e69bc 100644 --- a/tests/uitests/src/test/snapshots/images/ui_S_t[l.designsystem.components.avatar_Avatar_null_Avatars_Avatar_0_null_14,NEXUS_5,1.0,en].png +++ b/tests/uitests/src/test/snapshots/images/ui_S_t[l.designsystem.components.avatar_Avatar_null_Avatars_Avatar_0_null_14,NEXUS_5,1.0,en].png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:206f721ba79222702409f10e70e671e00d855e192387b2fc73dec93bc721765f -size 20933 +oid sha256:498e1b23a60c563387bbe734fc4ffd3896824d128e1213b194b344091058ae8a +size 21480 diff --git a/tests/uitests/src/test/snapshots/images/ui_S_t[l.designsystem.components.avatar_Avatar_null_Avatars_Avatar_0_null_15,NEXUS_5,1.0,en].png b/tests/uitests/src/test/snapshots/images/ui_S_t[l.designsystem.components.avatar_Avatar_null_Avatars_Avatar_0_null_15,NEXUS_5,1.0,en].png index bf6ccb2dd9..5aa2ad2c6f 100644 --- a/tests/uitests/src/test/snapshots/images/ui_S_t[l.designsystem.components.avatar_Avatar_null_Avatars_Avatar_0_null_15,NEXUS_5,1.0,en].png +++ b/tests/uitests/src/test/snapshots/images/ui_S_t[l.designsystem.components.avatar_Avatar_null_Avatars_Avatar_0_null_15,NEXUS_5,1.0,en].png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:999fc081f03ee5e80036278cd80098cabfd0b776362ac871c4324b2c1c48bf97 -size 19232 +oid sha256:90fbc995b03553699a0ea3cfca65b3c0d800ad91f7405cd59d0f6110aeaa3783 +size 17591 diff --git a/tests/uitests/src/test/snapshots/images/ui_S_t[l.designsystem.components.avatar_Avatar_null_Avatars_Avatar_0_null_16,NEXUS_5,1.0,en].png b/tests/uitests/src/test/snapshots/images/ui_S_t[l.designsystem.components.avatar_Avatar_null_Avatars_Avatar_0_null_16,NEXUS_5,1.0,en].png index 258b1f2c09..53d55e5152 100644 --- a/tests/uitests/src/test/snapshots/images/ui_S_t[l.designsystem.components.avatar_Avatar_null_Avatars_Avatar_0_null_16,NEXUS_5,1.0,en].png +++ b/tests/uitests/src/test/snapshots/images/ui_S_t[l.designsystem.components.avatar_Avatar_null_Avatars_Avatar_0_null_16,NEXUS_5,1.0,en].png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:be7d7c2ad722d9b3b3ca4f9ec4994df387c32fa28480bb8ef2b0d9b57bfcc588 -size 16994 +oid sha256:f0d092bc75f8199660f9e527f2712824535ddbcde91da6cefe4b306f668dc026 +size 16279 diff --git a/tests/uitests/src/test/snapshots/images/ui_S_t[l.designsystem.components.avatar_Avatar_null_Avatars_Avatar_0_null_17,NEXUS_5,1.0,en].png b/tests/uitests/src/test/snapshots/images/ui_S_t[l.designsystem.components.avatar_Avatar_null_Avatars_Avatar_0_null_17,NEXUS_5,1.0,en].png index 714308dfa4..eab29dd2b2 100644 --- a/tests/uitests/src/test/snapshots/images/ui_S_t[l.designsystem.components.avatar_Avatar_null_Avatars_Avatar_0_null_17,NEXUS_5,1.0,en].png +++ b/tests/uitests/src/test/snapshots/images/ui_S_t[l.designsystem.components.avatar_Avatar_null_Avatars_Avatar_0_null_17,NEXUS_5,1.0,en].png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:e48c08ee8ff50b9b03bf6af20dfce17db88865b0d1b6db9cbb210d79b8177168 -size 24574 +oid sha256:206f721ba79222702409f10e70e671e00d855e192387b2fc73dec93bc721765f +size 20933 diff --git a/tests/uitests/src/test/snapshots/images/ui_S_t[l.designsystem.components.avatar_Avatar_null_Avatars_Avatar_0_null_18,NEXUS_5,1.0,en].png b/tests/uitests/src/test/snapshots/images/ui_S_t[l.designsystem.components.avatar_Avatar_null_Avatars_Avatar_0_null_18,NEXUS_5,1.0,en].png index bde780a065..bf6ccb2dd9 100644 --- a/tests/uitests/src/test/snapshots/images/ui_S_t[l.designsystem.components.avatar_Avatar_null_Avatars_Avatar_0_null_18,NEXUS_5,1.0,en].png +++ b/tests/uitests/src/test/snapshots/images/ui_S_t[l.designsystem.components.avatar_Avatar_null_Avatars_Avatar_0_null_18,NEXUS_5,1.0,en].png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:dffbd73e81a83bec2d11604411d7153bcda8ec44b1e5edc96ad5efd347441137 -size 14509 +oid sha256:999fc081f03ee5e80036278cd80098cabfd0b776362ac871c4324b2c1c48bf97 +size 19232 diff --git a/tests/uitests/src/test/snapshots/images/ui_S_t[l.designsystem.components.avatar_Avatar_null_Avatars_Avatar_0_null_19,NEXUS_5,1.0,en].png b/tests/uitests/src/test/snapshots/images/ui_S_t[l.designsystem.components.avatar_Avatar_null_Avatars_Avatar_0_null_19,NEXUS_5,1.0,en].png index 6856025214..258b1f2c09 100644 --- a/tests/uitests/src/test/snapshots/images/ui_S_t[l.designsystem.components.avatar_Avatar_null_Avatars_Avatar_0_null_19,NEXUS_5,1.0,en].png +++ b/tests/uitests/src/test/snapshots/images/ui_S_t[l.designsystem.components.avatar_Avatar_null_Avatars_Avatar_0_null_19,NEXUS_5,1.0,en].png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:e925ecead3a108881093e83a15fa2702ece8bdb950336489def58c860960e177 -size 13651 +oid sha256:be7d7c2ad722d9b3b3ca4f9ec4994df387c32fa28480bb8ef2b0d9b57bfcc588 +size 16994 diff --git a/tests/uitests/src/test/snapshots/images/ui_S_t[l.designsystem.components.avatar_Avatar_null_Avatars_Avatar_0_null_20,NEXUS_5,1.0,en].png b/tests/uitests/src/test/snapshots/images/ui_S_t[l.designsystem.components.avatar_Avatar_null_Avatars_Avatar_0_null_20,NEXUS_5,1.0,en].png index 39197031a7..714308dfa4 100644 --- a/tests/uitests/src/test/snapshots/images/ui_S_t[l.designsystem.components.avatar_Avatar_null_Avatars_Avatar_0_null_20,NEXUS_5,1.0,en].png +++ b/tests/uitests/src/test/snapshots/images/ui_S_t[l.designsystem.components.avatar_Avatar_null_Avatars_Avatar_0_null_20,NEXUS_5,1.0,en].png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:5fd5a514986ca09fd5d59f2ef6c1061510ea22a40ff74ce3a5048464368bdbbe -size 16583 +oid sha256:e48c08ee8ff50b9b03bf6af20dfce17db88865b0d1b6db9cbb210d79b8177168 +size 24574 diff --git a/tests/uitests/src/test/snapshots/images/ui_S_t[l.designsystem.components.avatar_Avatar_null_Avatars_Avatar_0_null_21,NEXUS_5,1.0,en].png b/tests/uitests/src/test/snapshots/images/ui_S_t[l.designsystem.components.avatar_Avatar_null_Avatars_Avatar_0_null_21,NEXUS_5,1.0,en].png index d013a9b536..bde780a065 100644 --- a/tests/uitests/src/test/snapshots/images/ui_S_t[l.designsystem.components.avatar_Avatar_null_Avatars_Avatar_0_null_21,NEXUS_5,1.0,en].png +++ b/tests/uitests/src/test/snapshots/images/ui_S_t[l.designsystem.components.avatar_Avatar_null_Avatars_Avatar_0_null_21,NEXUS_5,1.0,en].png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:5424c7ac0dccbcbf2768d129ec31d2675a729ee17852f1c773afeebf9540f3a2 -size 17349 +oid sha256:dffbd73e81a83bec2d11604411d7153bcda8ec44b1e5edc96ad5efd347441137 +size 14509 diff --git a/tests/uitests/src/test/snapshots/images/ui_S_t[l.designsystem.components.avatar_Avatar_null_Avatars_Avatar_0_null_22,NEXUS_5,1.0,en].png b/tests/uitests/src/test/snapshots/images/ui_S_t[l.designsystem.components.avatar_Avatar_null_Avatars_Avatar_0_null_22,NEXUS_5,1.0,en].png index fb83908f7b..6856025214 100644 --- a/tests/uitests/src/test/snapshots/images/ui_S_t[l.designsystem.components.avatar_Avatar_null_Avatars_Avatar_0_null_22,NEXUS_5,1.0,en].png +++ b/tests/uitests/src/test/snapshots/images/ui_S_t[l.designsystem.components.avatar_Avatar_null_Avatars_Avatar_0_null_22,NEXUS_5,1.0,en].png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:ec91c4129a04a5bbd82add9216657d1ef6f61c62cdda8e7969d62a9d3d11b03a -size 16037 +oid sha256:e925ecead3a108881093e83a15fa2702ece8bdb950336489def58c860960e177 +size 13651 diff --git a/tests/uitests/src/test/snapshots/images/ui_S_t[l.designsystem.components.avatar_Avatar_null_Avatars_Avatar_0_null_23,NEXUS_5,1.0,en].png b/tests/uitests/src/test/snapshots/images/ui_S_t[l.designsystem.components.avatar_Avatar_null_Avatars_Avatar_0_null_23,NEXUS_5,1.0,en].png index 95efeca161..39197031a7 100644 --- a/tests/uitests/src/test/snapshots/images/ui_S_t[l.designsystem.components.avatar_Avatar_null_Avatars_Avatar_0_null_23,NEXUS_5,1.0,en].png +++ b/tests/uitests/src/test/snapshots/images/ui_S_t[l.designsystem.components.avatar_Avatar_null_Avatars_Avatar_0_null_23,NEXUS_5,1.0,en].png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:fbb735a2e27619514a06ebc6e1d84fb6a37d1447a46797e68302dc76655bf323 -size 20700 +oid sha256:5fd5a514986ca09fd5d59f2ef6c1061510ea22a40ff74ce3a5048464368bdbbe +size 16583 diff --git a/tests/uitests/src/test/snapshots/images/ui_S_t[l.designsystem.components.avatar_Avatar_null_Avatars_Avatar_0_null_24,NEXUS_5,1.0,en].png b/tests/uitests/src/test/snapshots/images/ui_S_t[l.designsystem.components.avatar_Avatar_null_Avatars_Avatar_0_null_24,NEXUS_5,1.0,en].png index a183374ac6..d013a9b536 100644 --- a/tests/uitests/src/test/snapshots/images/ui_S_t[l.designsystem.components.avatar_Avatar_null_Avatars_Avatar_0_null_24,NEXUS_5,1.0,en].png +++ b/tests/uitests/src/test/snapshots/images/ui_S_t[l.designsystem.components.avatar_Avatar_null_Avatars_Avatar_0_null_24,NEXUS_5,1.0,en].png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:56b2d5b052303c44434c9752a3d2fcd2c40453370a17c24c2ebf33cc777a7e7b -size 17761 +oid sha256:5424c7ac0dccbcbf2768d129ec31d2675a729ee17852f1c773afeebf9540f3a2 +size 17349 diff --git a/tests/uitests/src/test/snapshots/images/ui_S_t[l.designsystem.components.avatar_Avatar_null_Avatars_Avatar_0_null_25,NEXUS_5,1.0,en].png b/tests/uitests/src/test/snapshots/images/ui_S_t[l.designsystem.components.avatar_Avatar_null_Avatars_Avatar_0_null_25,NEXUS_5,1.0,en].png index a9bdcd2885..fb83908f7b 100644 --- a/tests/uitests/src/test/snapshots/images/ui_S_t[l.designsystem.components.avatar_Avatar_null_Avatars_Avatar_0_null_25,NEXUS_5,1.0,en].png +++ b/tests/uitests/src/test/snapshots/images/ui_S_t[l.designsystem.components.avatar_Avatar_null_Avatars_Avatar_0_null_25,NEXUS_5,1.0,en].png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:b09c2ececc08eb3caa70afd3dbd8fd6b34a8d64eb9d9dc99e5ebb1ea2d8d96ea -size 16456 +oid sha256:ec91c4129a04a5bbd82add9216657d1ef6f61c62cdda8e7969d62a9d3d11b03a +size 16037 diff --git a/tests/uitests/src/test/snapshots/images/ui_S_t[l.designsystem.components.avatar_Avatar_null_Avatars_Avatar_0_null_26,NEXUS_5,1.0,en].png b/tests/uitests/src/test/snapshots/images/ui_S_t[l.designsystem.components.avatar_Avatar_null_Avatars_Avatar_0_null_26,NEXUS_5,1.0,en].png index 261dd54d80..95efeca161 100644 --- a/tests/uitests/src/test/snapshots/images/ui_S_t[l.designsystem.components.avatar_Avatar_null_Avatars_Avatar_0_null_26,NEXUS_5,1.0,en].png +++ b/tests/uitests/src/test/snapshots/images/ui_S_t[l.designsystem.components.avatar_Avatar_null_Avatars_Avatar_0_null_26,NEXUS_5,1.0,en].png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:b84949b7a5256c5f3881b9811705eb2f6f2c7b108fb85aa45adf2d4c8afd2b7f -size 21127 +oid sha256:fbb735a2e27619514a06ebc6e1d84fb6a37d1447a46797e68302dc76655bf323 +size 20700 diff --git a/tests/uitests/src/test/snapshots/images/ui_S_t[l.designsystem.components.avatar_Avatar_null_Avatars_Avatar_0_null_27,NEXUS_5,1.0,en].png b/tests/uitests/src/test/snapshots/images/ui_S_t[l.designsystem.components.avatar_Avatar_null_Avatars_Avatar_0_null_27,NEXUS_5,1.0,en].png index fa5d08e9a2..a183374ac6 100644 --- a/tests/uitests/src/test/snapshots/images/ui_S_t[l.designsystem.components.avatar_Avatar_null_Avatars_Avatar_0_null_27,NEXUS_5,1.0,en].png +++ b/tests/uitests/src/test/snapshots/images/ui_S_t[l.designsystem.components.avatar_Avatar_null_Avatars_Avatar_0_null_27,NEXUS_5,1.0,en].png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:06310ae4063a59045b5da45b811b9cb29bd483beb86cce8262494177d3925e0f -size 14583 +oid sha256:56b2d5b052303c44434c9752a3d2fcd2c40453370a17c24c2ebf33cc777a7e7b +size 17761 diff --git a/tests/uitests/src/test/snapshots/images/ui_S_t[l.designsystem.components.avatar_Avatar_null_Avatars_Avatar_0_null_28,NEXUS_5,1.0,en].png b/tests/uitests/src/test/snapshots/images/ui_S_t[l.designsystem.components.avatar_Avatar_null_Avatars_Avatar_0_null_28,NEXUS_5,1.0,en].png index 90d3edbcb6..a9bdcd2885 100644 --- a/tests/uitests/src/test/snapshots/images/ui_S_t[l.designsystem.components.avatar_Avatar_null_Avatars_Avatar_0_null_28,NEXUS_5,1.0,en].png +++ b/tests/uitests/src/test/snapshots/images/ui_S_t[l.designsystem.components.avatar_Avatar_null_Avatars_Avatar_0_null_28,NEXUS_5,1.0,en].png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:db4f833beff2bb588fccc1294e76703ff64d427bbf141cf730538a856992d609 -size 13808 +oid sha256:b09c2ececc08eb3caa70afd3dbd8fd6b34a8d64eb9d9dc99e5ebb1ea2d8d96ea +size 16456 diff --git a/tests/uitests/src/test/snapshots/images/ui_S_t[l.designsystem.components.avatar_Avatar_null_Avatars_Avatar_0_null_29,NEXUS_5,1.0,en].png b/tests/uitests/src/test/snapshots/images/ui_S_t[l.designsystem.components.avatar_Avatar_null_Avatars_Avatar_0_null_29,NEXUS_5,1.0,en].png index 25f01d0c77..261dd54d80 100644 --- a/tests/uitests/src/test/snapshots/images/ui_S_t[l.designsystem.components.avatar_Avatar_null_Avatars_Avatar_0_null_29,NEXUS_5,1.0,en].png +++ b/tests/uitests/src/test/snapshots/images/ui_S_t[l.designsystem.components.avatar_Avatar_null_Avatars_Avatar_0_null_29,NEXUS_5,1.0,en].png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:be37247d044b78541c1da7d4e28a3906e89a369f978a486ae1c1aa70b583658f -size 16321 +oid sha256:b84949b7a5256c5f3881b9811705eb2f6f2c7b108fb85aa45adf2d4c8afd2b7f +size 21127 diff --git a/tests/uitests/src/test/snapshots/images/ui_S_t[l.designsystem.components.avatar_Avatar_null_Avatars_Avatar_0_null_3,NEXUS_5,1.0,en].png b/tests/uitests/src/test/snapshots/images/ui_S_t[l.designsystem.components.avatar_Avatar_null_Avatars_Avatar_0_null_3,NEXUS_5,1.0,en].png index 1ae28cd8b1..8f54e4f0be 100644 --- a/tests/uitests/src/test/snapshots/images/ui_S_t[l.designsystem.components.avatar_Avatar_null_Avatars_Avatar_0_null_3,NEXUS_5,1.0,en].png +++ b/tests/uitests/src/test/snapshots/images/ui_S_t[l.designsystem.components.avatar_Avatar_null_Avatars_Avatar_0_null_3,NEXUS_5,1.0,en].png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:29b4f035a161707d8c551f70478651b1c49136489f282f56c1c10af399e182b9 -size 19853 +oid sha256:134390dcc21a7131a88b8060d15ae4a830dd058b1b89518264dd58f503c8b81d +size 22547 diff --git a/tests/uitests/src/test/snapshots/images/ui_S_t[l.designsystem.components.avatar_Avatar_null_Avatars_Avatar_0_null_30,NEXUS_5,1.0,en].png b/tests/uitests/src/test/snapshots/images/ui_S_t[l.designsystem.components.avatar_Avatar_null_Avatars_Avatar_0_null_30,NEXUS_5,1.0,en].png index 7caaf879aa..fa5d08e9a2 100644 --- a/tests/uitests/src/test/snapshots/images/ui_S_t[l.designsystem.components.avatar_Avatar_null_Avatars_Avatar_0_null_30,NEXUS_5,1.0,en].png +++ b/tests/uitests/src/test/snapshots/images/ui_S_t[l.designsystem.components.avatar_Avatar_null_Avatars_Avatar_0_null_30,NEXUS_5,1.0,en].png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:85db59158254fa043e53feeddce69cfe89a308a385dde3dcd9a6ff6b94aef7c2 -size 15105 +oid sha256:06310ae4063a59045b5da45b811b9cb29bd483beb86cce8262494177d3925e0f +size 14583 diff --git a/tests/uitests/src/test/snapshots/images/ui_S_t[l.designsystem.components.avatar_Avatar_null_Avatars_Avatar_0_null_31,NEXUS_5,1.0,en].png b/tests/uitests/src/test/snapshots/images/ui_S_t[l.designsystem.components.avatar_Avatar_null_Avatars_Avatar_0_null_31,NEXUS_5,1.0,en].png index 60077980a3..90d3edbcb6 100644 --- a/tests/uitests/src/test/snapshots/images/ui_S_t[l.designsystem.components.avatar_Avatar_null_Avatars_Avatar_0_null_31,NEXUS_5,1.0,en].png +++ b/tests/uitests/src/test/snapshots/images/ui_S_t[l.designsystem.components.avatar_Avatar_null_Avatars_Avatar_0_null_31,NEXUS_5,1.0,en].png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:d22ae88ce675b24306df9d598e78600ccb31e203b30f5cfc9e94432bedc518bd -size 14324 +oid sha256:db4f833beff2bb588fccc1294e76703ff64d427bbf141cf730538a856992d609 +size 13808 diff --git a/tests/uitests/src/test/snapshots/images/ui_S_t[l.designsystem.components.avatar_Avatar_null_Avatars_Avatar_0_null_32,NEXUS_5,1.0,en].png b/tests/uitests/src/test/snapshots/images/ui_S_t[l.designsystem.components.avatar_Avatar_null_Avatars_Avatar_0_null_32,NEXUS_5,1.0,en].png index 21606b47a9..25f01d0c77 100644 --- a/tests/uitests/src/test/snapshots/images/ui_S_t[l.designsystem.components.avatar_Avatar_null_Avatars_Avatar_0_null_32,NEXUS_5,1.0,en].png +++ b/tests/uitests/src/test/snapshots/images/ui_S_t[l.designsystem.components.avatar_Avatar_null_Avatars_Avatar_0_null_32,NEXUS_5,1.0,en].png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:e3672bb10f51f674dda4d06eced8f5a6e977bd10902d4de7bf9cc4e915d83bb7 -size 16836 +oid sha256:be37247d044b78541c1da7d4e28a3906e89a369f978a486ae1c1aa70b583658f +size 16321 diff --git a/tests/uitests/src/test/snapshots/images/ui_S_t[l.designsystem.components.avatar_Avatar_null_Avatars_Avatar_0_null_33,NEXUS_5,1.0,en].png b/tests/uitests/src/test/snapshots/images/ui_S_t[l.designsystem.components.avatar_Avatar_null_Avatars_Avatar_0_null_33,NEXUS_5,1.0,en].png index eec3b821df..7caaf879aa 100644 --- a/tests/uitests/src/test/snapshots/images/ui_S_t[l.designsystem.components.avatar_Avatar_null_Avatars_Avatar_0_null_33,NEXUS_5,1.0,en].png +++ b/tests/uitests/src/test/snapshots/images/ui_S_t[l.designsystem.components.avatar_Avatar_null_Avatars_Avatar_0_null_33,NEXUS_5,1.0,en].png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:f0d524d6f2a6f0cb2b06e8a359c66819dc7e8eb03ad0c17612d35f002f2189f9 -size 15484 +oid sha256:85db59158254fa043e53feeddce69cfe89a308a385dde3dcd9a6ff6b94aef7c2 +size 15105 diff --git a/tests/uitests/src/test/snapshots/images/ui_S_t[l.designsystem.components.avatar_Avatar_null_Avatars_Avatar_0_null_34,NEXUS_5,1.0,en].png b/tests/uitests/src/test/snapshots/images/ui_S_t[l.designsystem.components.avatar_Avatar_null_Avatars_Avatar_0_null_34,NEXUS_5,1.0,en].png index cf8459e6ba..60077980a3 100644 --- a/tests/uitests/src/test/snapshots/images/ui_S_t[l.designsystem.components.avatar_Avatar_null_Avatars_Avatar_0_null_34,NEXUS_5,1.0,en].png +++ b/tests/uitests/src/test/snapshots/images/ui_S_t[l.designsystem.components.avatar_Avatar_null_Avatars_Avatar_0_null_34,NEXUS_5,1.0,en].png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:ebe050aae72443fdfb7a8cb11e7b5d89a0614907155c3bbebda656c8d44b30a1 -size 15141 +oid sha256:d22ae88ce675b24306df9d598e78600ccb31e203b30f5cfc9e94432bedc518bd +size 14324 diff --git a/tests/uitests/src/test/snapshots/images/ui_S_t[l.designsystem.components.avatar_Avatar_null_Avatars_Avatar_0_null_35,NEXUS_5,1.0,en].png b/tests/uitests/src/test/snapshots/images/ui_S_t[l.designsystem.components.avatar_Avatar_null_Avatars_Avatar_0_null_35,NEXUS_5,1.0,en].png index 881a35582b..21606b47a9 100644 --- a/tests/uitests/src/test/snapshots/images/ui_S_t[l.designsystem.components.avatar_Avatar_null_Avatars_Avatar_0_null_35,NEXUS_5,1.0,en].png +++ b/tests/uitests/src/test/snapshots/images/ui_S_t[l.designsystem.components.avatar_Avatar_null_Avatars_Avatar_0_null_35,NEXUS_5,1.0,en].png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:7e56fff6052b5c1b3b61a2aa73cad2f03881d86d465dbc59465d63c4aeac3ef4 -size 16371 +oid sha256:e3672bb10f51f674dda4d06eced8f5a6e977bd10902d4de7bf9cc4e915d83bb7 +size 16836 diff --git a/tests/uitests/src/test/snapshots/images/ui_S_t[l.designsystem.components.avatar_Avatar_null_Avatars_Avatar_0_null_36,NEXUS_5,1.0,en].png b/tests/uitests/src/test/snapshots/images/ui_S_t[l.designsystem.components.avatar_Avatar_null_Avatars_Avatar_0_null_36,NEXUS_5,1.0,en].png index e96833b111..eec3b821df 100644 --- a/tests/uitests/src/test/snapshots/images/ui_S_t[l.designsystem.components.avatar_Avatar_null_Avatars_Avatar_0_null_36,NEXUS_5,1.0,en].png +++ b/tests/uitests/src/test/snapshots/images/ui_S_t[l.designsystem.components.avatar_Avatar_null_Avatars_Avatar_0_null_36,NEXUS_5,1.0,en].png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:77d4c098189f99f7091738791218ae663d168d30a442804b8923243c8727598b -size 16145 +oid sha256:f0d524d6f2a6f0cb2b06e8a359c66819dc7e8eb03ad0c17612d35f002f2189f9 +size 15484 diff --git a/tests/uitests/src/test/snapshots/images/ui_S_t[l.designsystem.components.avatar_Avatar_null_Avatars_Avatar_0_null_37,NEXUS_5,1.0,en].png b/tests/uitests/src/test/snapshots/images/ui_S_t[l.designsystem.components.avatar_Avatar_null_Avatars_Avatar_0_null_37,NEXUS_5,1.0,en].png index 1478eba397..cf8459e6ba 100644 --- a/tests/uitests/src/test/snapshots/images/ui_S_t[l.designsystem.components.avatar_Avatar_null_Avatars_Avatar_0_null_37,NEXUS_5,1.0,en].png +++ b/tests/uitests/src/test/snapshots/images/ui_S_t[l.designsystem.components.avatar_Avatar_null_Avatars_Avatar_0_null_37,NEXUS_5,1.0,en].png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:74da4791ade57bbf0b0393143c3f40e9c8aaec36f438ecc85a872ad0f0e03da3 -size 15388 +oid sha256:ebe050aae72443fdfb7a8cb11e7b5d89a0614907155c3bbebda656c8d44b30a1 +size 15141 diff --git a/tests/uitests/src/test/snapshots/images/ui_S_t[l.designsystem.components.avatar_Avatar_null_Avatars_Avatar_0_null_38,NEXUS_5,1.0,en].png b/tests/uitests/src/test/snapshots/images/ui_S_t[l.designsystem.components.avatar_Avatar_null_Avatars_Avatar_0_null_38,NEXUS_5,1.0,en].png index ee7f8a89cc..881a35582b 100644 --- a/tests/uitests/src/test/snapshots/images/ui_S_t[l.designsystem.components.avatar_Avatar_null_Avatars_Avatar_0_null_38,NEXUS_5,1.0,en].png +++ b/tests/uitests/src/test/snapshots/images/ui_S_t[l.designsystem.components.avatar_Avatar_null_Avatars_Avatar_0_null_38,NEXUS_5,1.0,en].png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:96518c010196d80e8696ffcaea032468bb4d1edfbe6b1187286da488600363bf -size 17891 +oid sha256:7e56fff6052b5c1b3b61a2aa73cad2f03881d86d465dbc59465d63c4aeac3ef4 +size 16371 diff --git a/tests/uitests/src/test/snapshots/images/ui_S_t[l.designsystem.components.avatar_Avatar_null_Avatars_Avatar_0_null_39,NEXUS_5,1.0,en].png b/tests/uitests/src/test/snapshots/images/ui_S_t[l.designsystem.components.avatar_Avatar_null_Avatars_Avatar_0_null_39,NEXUS_5,1.0,en].png index fcaf26295f..e96833b111 100644 --- a/tests/uitests/src/test/snapshots/images/ui_S_t[l.designsystem.components.avatar_Avatar_null_Avatars_Avatar_0_null_39,NEXUS_5,1.0,en].png +++ b/tests/uitests/src/test/snapshots/images/ui_S_t[l.designsystem.components.avatar_Avatar_null_Avatars_Avatar_0_null_39,NEXUS_5,1.0,en].png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:ee072668c6161aa3e2195c2f963bb502112bf6ade57a35be44b013b30aa3d0a9 -size 19308 +oid sha256:77d4c098189f99f7091738791218ae663d168d30a442804b8923243c8727598b +size 16145 diff --git a/tests/uitests/src/test/snapshots/images/ui_S_t[l.designsystem.components.avatar_Avatar_null_Avatars_Avatar_0_null_4,NEXUS_5,1.0,en].png b/tests/uitests/src/test/snapshots/images/ui_S_t[l.designsystem.components.avatar_Avatar_null_Avatars_Avatar_0_null_4,NEXUS_5,1.0,en].png index 8a3b5ced60..99f1aa1671 100644 --- a/tests/uitests/src/test/snapshots/images/ui_S_t[l.designsystem.components.avatar_Avatar_null_Avatars_Avatar_0_null_4,NEXUS_5,1.0,en].png +++ b/tests/uitests/src/test/snapshots/images/ui_S_t[l.designsystem.components.avatar_Avatar_null_Avatars_Avatar_0_null_4,NEXUS_5,1.0,en].png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:5fd0e375d985f2e77eea87650455c7bc5b4e8f1f5f58467811f686316c5449c9 -size 17581 +oid sha256:4d8ee1ebdce2f3024b4f813afd80732afbaff74168d4d7af826e4c5dc1714d15 +size 19159 diff --git a/tests/uitests/src/test/snapshots/images/ui_S_t[l.designsystem.components.avatar_Avatar_null_Avatars_Avatar_0_null_40,NEXUS_5,1.0,en].png b/tests/uitests/src/test/snapshots/images/ui_S_t[l.designsystem.components.avatar_Avatar_null_Avatars_Avatar_0_null_40,NEXUS_5,1.0,en].png index b63064c734..1478eba397 100644 --- a/tests/uitests/src/test/snapshots/images/ui_S_t[l.designsystem.components.avatar_Avatar_null_Avatars_Avatar_0_null_40,NEXUS_5,1.0,en].png +++ b/tests/uitests/src/test/snapshots/images/ui_S_t[l.designsystem.components.avatar_Avatar_null_Avatars_Avatar_0_null_40,NEXUS_5,1.0,en].png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:06d03aa5e848872228a58b399685bc78dfdbad783cb28bfed609dcdc371a168f -size 18520 +oid sha256:74da4791ade57bbf0b0393143c3f40e9c8aaec36f438ecc85a872ad0f0e03da3 +size 15388 diff --git a/tests/uitests/src/test/snapshots/images/ui_S_t[l.designsystem.components.avatar_Avatar_null_Avatars_Avatar_0_null_41,NEXUS_5,1.0,en].png b/tests/uitests/src/test/snapshots/images/ui_S_t[l.designsystem.components.avatar_Avatar_null_Avatars_Avatar_0_null_41,NEXUS_5,1.0,en].png index 83586a0c51..ee7f8a89cc 100644 --- a/tests/uitests/src/test/snapshots/images/ui_S_t[l.designsystem.components.avatar_Avatar_null_Avatars_Avatar_0_null_41,NEXUS_5,1.0,en].png +++ b/tests/uitests/src/test/snapshots/images/ui_S_t[l.designsystem.components.avatar_Avatar_null_Avatars_Avatar_0_null_41,NEXUS_5,1.0,en].png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:9dd0232c7847d5c0bb1047cfc6be5d4d43d2cc2e9347aff70a793103b511ad98 -size 21073 +oid sha256:96518c010196d80e8696ffcaea032468bb4d1edfbe6b1187286da488600363bf +size 17891 diff --git a/tests/uitests/src/test/snapshots/images/ui_S_t[l.designsystem.components.avatar_Avatar_null_Avatars_Avatar_0_null_42,NEXUS_5,1.0,en].png b/tests/uitests/src/test/snapshots/images/ui_S_t[l.designsystem.components.avatar_Avatar_null_Avatars_Avatar_0_null_42,NEXUS_5,1.0,en].png index 598a31fd16..fcaf26295f 100644 --- a/tests/uitests/src/test/snapshots/images/ui_S_t[l.designsystem.components.avatar_Avatar_null_Avatars_Avatar_0_null_42,NEXUS_5,1.0,en].png +++ b/tests/uitests/src/test/snapshots/images/ui_S_t[l.designsystem.components.avatar_Avatar_null_Avatars_Avatar_0_null_42,NEXUS_5,1.0,en].png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:f96f83d866d29d3eb713adf9fb8e216414a1eb924a63d0458c77522ba0de0499 -size 16709 +oid sha256:ee072668c6161aa3e2195c2f963bb502112bf6ade57a35be44b013b30aa3d0a9 +size 19308 diff --git a/tests/uitests/src/test/snapshots/images/ui_S_t[l.designsystem.components.avatar_Avatar_null_Avatars_Avatar_0_null_43,NEXUS_5,1.0,en].png b/tests/uitests/src/test/snapshots/images/ui_S_t[l.designsystem.components.avatar_Avatar_null_Avatars_Avatar_0_null_43,NEXUS_5,1.0,en].png index 0e609afb69..b63064c734 100644 --- a/tests/uitests/src/test/snapshots/images/ui_S_t[l.designsystem.components.avatar_Avatar_null_Avatars_Avatar_0_null_43,NEXUS_5,1.0,en].png +++ b/tests/uitests/src/test/snapshots/images/ui_S_t[l.designsystem.components.avatar_Avatar_null_Avatars_Avatar_0_null_43,NEXUS_5,1.0,en].png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:93e866bf58f381020d9516662332a6c986bfd61acc9954723b27adb52c152d68 -size 15473 +oid sha256:06d03aa5e848872228a58b399685bc78dfdbad783cb28bfed609dcdc371a168f +size 18520 diff --git a/tests/uitests/src/test/snapshots/images/ui_S_t[l.designsystem.components.avatar_Avatar_null_Avatars_Avatar_0_null_44,NEXUS_5,1.0,en].png b/tests/uitests/src/test/snapshots/images/ui_S_t[l.designsystem.components.avatar_Avatar_null_Avatars_Avatar_0_null_44,NEXUS_5,1.0,en].png index 3bef3f861b..83586a0c51 100644 --- a/tests/uitests/src/test/snapshots/images/ui_S_t[l.designsystem.components.avatar_Avatar_null_Avatars_Avatar_0_null_44,NEXUS_5,1.0,en].png +++ b/tests/uitests/src/test/snapshots/images/ui_S_t[l.designsystem.components.avatar_Avatar_null_Avatars_Avatar_0_null_44,NEXUS_5,1.0,en].png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:f27e368c8c68032dc4eac63012fad459785c42c4063aca99eb6be9d8abe99508 -size 19751 +oid sha256:9dd0232c7847d5c0bb1047cfc6be5d4d43d2cc2e9347aff70a793103b511ad98 +size 21073 diff --git a/tests/uitests/src/test/snapshots/images/ui_S_t[l.designsystem.components.avatar_Avatar_null_Avatars_Avatar_0_null_45,NEXUS_5,1.0,en].png b/tests/uitests/src/test/snapshots/images/ui_S_t[l.designsystem.components.avatar_Avatar_null_Avatars_Avatar_0_null_45,NEXUS_5,1.0,en].png index cbc5a4ba10..598a31fd16 100644 --- a/tests/uitests/src/test/snapshots/images/ui_S_t[l.designsystem.components.avatar_Avatar_null_Avatars_Avatar_0_null_45,NEXUS_5,1.0,en].png +++ b/tests/uitests/src/test/snapshots/images/ui_S_t[l.designsystem.components.avatar_Avatar_null_Avatars_Avatar_0_null_45,NEXUS_5,1.0,en].png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:1e531de46bbc667647a29dc40e8751bad96a089d6765fcddfc69c47147602563 -size 12918 +oid sha256:f96f83d866d29d3eb713adf9fb8e216414a1eb924a63d0458c77522ba0de0499 +size 16709 diff --git a/tests/uitests/src/test/snapshots/images/ui_S_t[l.designsystem.components.avatar_Avatar_null_Avatars_Avatar_0_null_46,NEXUS_5,1.0,en].png b/tests/uitests/src/test/snapshots/images/ui_S_t[l.designsystem.components.avatar_Avatar_null_Avatars_Avatar_0_null_46,NEXUS_5,1.0,en].png index 1d1884a7ac..0e609afb69 100644 --- a/tests/uitests/src/test/snapshots/images/ui_S_t[l.designsystem.components.avatar_Avatar_null_Avatars_Avatar_0_null_46,NEXUS_5,1.0,en].png +++ b/tests/uitests/src/test/snapshots/images/ui_S_t[l.designsystem.components.avatar_Avatar_null_Avatars_Avatar_0_null_46,NEXUS_5,1.0,en].png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:bc57d1ccd6657417469d0d76de066f3a555a5296a83b1cb7168cd64680f97bcd -size 12584 +oid sha256:93e866bf58f381020d9516662332a6c986bfd61acc9954723b27adb52c152d68 +size 15473 diff --git a/tests/uitests/src/test/snapshots/images/ui_S_t[l.designsystem.components.avatar_Avatar_null_Avatars_Avatar_0_null_47,NEXUS_5,1.0,en].png b/tests/uitests/src/test/snapshots/images/ui_S_t[l.designsystem.components.avatar_Avatar_null_Avatars_Avatar_0_null_47,NEXUS_5,1.0,en].png index b42d0c123d..3bef3f861b 100644 --- a/tests/uitests/src/test/snapshots/images/ui_S_t[l.designsystem.components.avatar_Avatar_null_Avatars_Avatar_0_null_47,NEXUS_5,1.0,en].png +++ b/tests/uitests/src/test/snapshots/images/ui_S_t[l.designsystem.components.avatar_Avatar_null_Avatars_Avatar_0_null_47,NEXUS_5,1.0,en].png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:0960f771d8158f52ad925c04c3d9770f4babec0d9ce017958ccd813b4c0012bd -size 13796 +oid sha256:f27e368c8c68032dc4eac63012fad459785c42c4063aca99eb6be9d8abe99508 +size 19751 diff --git a/tests/uitests/src/test/snapshots/images/ui_S_t[l.designsystem.components.avatar_Avatar_null_Avatars_Avatar_0_null_48,NEXUS_5,1.0,en].png b/tests/uitests/src/test/snapshots/images/ui_S_t[l.designsystem.components.avatar_Avatar_null_Avatars_Avatar_0_null_48,NEXUS_5,1.0,en].png index 488c8a32d2..cbc5a4ba10 100644 --- a/tests/uitests/src/test/snapshots/images/ui_S_t[l.designsystem.components.avatar_Avatar_null_Avatars_Avatar_0_null_48,NEXUS_5,1.0,en].png +++ b/tests/uitests/src/test/snapshots/images/ui_S_t[l.designsystem.components.avatar_Avatar_null_Avatars_Avatar_0_null_48,NEXUS_5,1.0,en].png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:fe2a0b40572b28fb5934d999ce4fecdf76f7efb61caf390669054c084af594ad -size 18778 +oid sha256:1e531de46bbc667647a29dc40e8751bad96a089d6765fcddfc69c47147602563 +size 12918 diff --git a/tests/uitests/src/test/snapshots/images/ui_S_t[l.designsystem.components.avatar_Avatar_null_Avatars_Avatar_0_null_49,NEXUS_5,1.0,en].png b/tests/uitests/src/test/snapshots/images/ui_S_t[l.designsystem.components.avatar_Avatar_null_Avatars_Avatar_0_null_49,NEXUS_5,1.0,en].png index a59d5f174c..1d1884a7ac 100644 --- a/tests/uitests/src/test/snapshots/images/ui_S_t[l.designsystem.components.avatar_Avatar_null_Avatars_Avatar_0_null_49,NEXUS_5,1.0,en].png +++ b/tests/uitests/src/test/snapshots/images/ui_S_t[l.designsystem.components.avatar_Avatar_null_Avatars_Avatar_0_null_49,NEXUS_5,1.0,en].png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:57358f0990a41b7d22a42b5f06662a8549de79a50126491fa9518bc3ce33bf9a -size 17099 +oid sha256:bc57d1ccd6657417469d0d76de066f3a555a5296a83b1cb7168cd64680f97bcd +size 12584 diff --git a/tests/uitests/src/test/snapshots/images/ui_S_t[l.designsystem.components.avatar_Avatar_null_Avatars_Avatar_0_null_5,NEXUS_5,1.0,en].png b/tests/uitests/src/test/snapshots/images/ui_S_t[l.designsystem.components.avatar_Avatar_null_Avatars_Avatar_0_null_5,NEXUS_5,1.0,en].png index 18efb9a84b..8100c9c10c 100644 --- a/tests/uitests/src/test/snapshots/images/ui_S_t[l.designsystem.components.avatar_Avatar_null_Avatars_Avatar_0_null_5,NEXUS_5,1.0,en].png +++ b/tests/uitests/src/test/snapshots/images/ui_S_t[l.designsystem.components.avatar_Avatar_null_Avatars_Avatar_0_null_5,NEXUS_5,1.0,en].png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:42ac664be2f0ed05b1fc844947556b256c823c5bc1bce380cceb1fb50ecd751f -size 25028 +oid sha256:038e9a9b4ef1536e0f77d8330935a8ad6bf2c1664d8d0362fcfca29eb2b3200d +size 30081 diff --git a/tests/uitests/src/test/snapshots/images/ui_S_t[l.designsystem.components.avatar_Avatar_null_Avatars_Avatar_0_null_50,NEXUS_5,1.0,en].png b/tests/uitests/src/test/snapshots/images/ui_S_t[l.designsystem.components.avatar_Avatar_null_Avatars_Avatar_0_null_50,NEXUS_5,1.0,en].png index e941cef17e..b42d0c123d 100644 --- a/tests/uitests/src/test/snapshots/images/ui_S_t[l.designsystem.components.avatar_Avatar_null_Avatars_Avatar_0_null_50,NEXUS_5,1.0,en].png +++ b/tests/uitests/src/test/snapshots/images/ui_S_t[l.designsystem.components.avatar_Avatar_null_Avatars_Avatar_0_null_50,NEXUS_5,1.0,en].png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:5a5aab04563cc94c4a7636402def1be7d738dd182f733de390d1ad028e99e332 -size 22831 +oid sha256:0960f771d8158f52ad925c04c3d9770f4babec0d9ce017958ccd813b4c0012bd +size 13796 diff --git a/tests/uitests/src/test/snapshots/images/ui_S_t[l.designsystem.components.avatar_Avatar_null_Avatars_Avatar_0_null_51,NEXUS_5,1.0,en].png b/tests/uitests/src/test/snapshots/images/ui_S_t[l.designsystem.components.avatar_Avatar_null_Avatars_Avatar_0_null_51,NEXUS_5,1.0,en].png index 69af73d4be..488c8a32d2 100644 --- a/tests/uitests/src/test/snapshots/images/ui_S_t[l.designsystem.components.avatar_Avatar_null_Avatars_Avatar_0_null_51,NEXUS_5,1.0,en].png +++ b/tests/uitests/src/test/snapshots/images/ui_S_t[l.designsystem.components.avatar_Avatar_null_Avatars_Avatar_0_null_51,NEXUS_5,1.0,en].png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:16b2c55f72419639690b09ef46c85c1d284d1da79439adacb38775ae6352c3fb -size 21125 +oid sha256:fe2a0b40572b28fb5934d999ce4fecdf76f7efb61caf390669054c084af594ad +size 18778 diff --git a/tests/uitests/src/test/snapshots/images/ui_S_t[l.designsystem.components.avatar_Avatar_null_Avatars_Avatar_0_null_52,NEXUS_5,1.0,en].png b/tests/uitests/src/test/snapshots/images/ui_S_t[l.designsystem.components.avatar_Avatar_null_Avatars_Avatar_0_null_52,NEXUS_5,1.0,en].png index 696beb67c6..a59d5f174c 100644 --- a/tests/uitests/src/test/snapshots/images/ui_S_t[l.designsystem.components.avatar_Avatar_null_Avatars_Avatar_0_null_52,NEXUS_5,1.0,en].png +++ b/tests/uitests/src/test/snapshots/images/ui_S_t[l.designsystem.components.avatar_Avatar_null_Avatars_Avatar_0_null_52,NEXUS_5,1.0,en].png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:a86f83a07283d0c98c64d3a041a6d0b285991f64a34ad372f07d2e04e4d0eff6 -size 19455 +oid sha256:57358f0990a41b7d22a42b5f06662a8549de79a50126491fa9518bc3ce33bf9a +size 17099 diff --git a/tests/uitests/src/test/snapshots/images/ui_S_t[l.designsystem.components.avatar_Avatar_null_Avatars_Avatar_0_null_53,NEXUS_5,1.0,en].png b/tests/uitests/src/test/snapshots/images/ui_S_t[l.designsystem.components.avatar_Avatar_null_Avatars_Avatar_0_null_53,NEXUS_5,1.0,en].png index ad3bbe7088..e941cef17e 100644 --- a/tests/uitests/src/test/snapshots/images/ui_S_t[l.designsystem.components.avatar_Avatar_null_Avatars_Avatar_0_null_53,NEXUS_5,1.0,en].png +++ b/tests/uitests/src/test/snapshots/images/ui_S_t[l.designsystem.components.avatar_Avatar_null_Avatars_Avatar_0_null_53,NEXUS_5,1.0,en].png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:c6202d80bb0a938bdfca6afef92fc71a00863d2e2c119f62fc61ede3df47cf7b -size 24925 +oid sha256:5a5aab04563cc94c4a7636402def1be7d738dd182f733de390d1ad028e99e332 +size 22831 diff --git a/tests/uitests/src/test/snapshots/images/ui_S_t[l.designsystem.components.avatar_Avatar_null_Avatars_Avatar_0_null_54,NEXUS_5,1.0,en].png b/tests/uitests/src/test/snapshots/images/ui_S_t[l.designsystem.components.avatar_Avatar_null_Avatars_Avatar_0_null_54,NEXUS_5,1.0,en].png index c670583b4b..69af73d4be 100644 --- a/tests/uitests/src/test/snapshots/images/ui_S_t[l.designsystem.components.avatar_Avatar_null_Avatars_Avatar_0_null_54,NEXUS_5,1.0,en].png +++ b/tests/uitests/src/test/snapshots/images/ui_S_t[l.designsystem.components.avatar_Avatar_null_Avatars_Avatar_0_null_54,NEXUS_5,1.0,en].png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:7eb42896831203a1cd8f1ac85b96d33d1048d626f5ee4778733a28d48aeebea4 -size 16744 +oid sha256:16b2c55f72419639690b09ef46c85c1d284d1da79439adacb38775ae6352c3fb +size 21125 diff --git a/tests/uitests/src/test/snapshots/images/ui_S_t[l.designsystem.components.avatar_Avatar_null_Avatars_Avatar_0_null_55,NEXUS_5,1.0,en].png b/tests/uitests/src/test/snapshots/images/ui_S_t[l.designsystem.components.avatar_Avatar_null_Avatars_Avatar_0_null_55,NEXUS_5,1.0,en].png index 6f8e06f572..696beb67c6 100644 --- a/tests/uitests/src/test/snapshots/images/ui_S_t[l.designsystem.components.avatar_Avatar_null_Avatars_Avatar_0_null_55,NEXUS_5,1.0,en].png +++ b/tests/uitests/src/test/snapshots/images/ui_S_t[l.designsystem.components.avatar_Avatar_null_Avatars_Avatar_0_null_55,NEXUS_5,1.0,en].png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:93f23803bd0b5633615fb7c1cb40c76a7a1a755f43fb755a08cb390dfd956d75 -size 15967 +oid sha256:a86f83a07283d0c98c64d3a041a6d0b285991f64a34ad372f07d2e04e4d0eff6 +size 19455 diff --git a/tests/uitests/src/test/snapshots/images/ui_S_t[l.designsystem.components.avatar_Avatar_null_Avatars_Avatar_0_null_56,NEXUS_5,1.0,en].png b/tests/uitests/src/test/snapshots/images/ui_S_t[l.designsystem.components.avatar_Avatar_null_Avatars_Avatar_0_null_56,NEXUS_5,1.0,en].png index dd81493a76..ad3bbe7088 100644 --- a/tests/uitests/src/test/snapshots/images/ui_S_t[l.designsystem.components.avatar_Avatar_null_Avatars_Avatar_0_null_56,NEXUS_5,1.0,en].png +++ b/tests/uitests/src/test/snapshots/images/ui_S_t[l.designsystem.components.avatar_Avatar_null_Avatars_Avatar_0_null_56,NEXUS_5,1.0,en].png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:67a8223f107fa05f1c5d66efc85f68325b4bf835e371ad44553bd6d6edd4a201 -size 18491 +oid sha256:c6202d80bb0a938bdfca6afef92fc71a00863d2e2c119f62fc61ede3df47cf7b +size 24925 diff --git a/tests/uitests/src/test/snapshots/images/ui_S_t[l.designsystem.components.avatar_Avatar_null_Avatars_Avatar_0_null_57,NEXUS_5,1.0,en].png b/tests/uitests/src/test/snapshots/images/ui_S_t[l.designsystem.components.avatar_Avatar_null_Avatars_Avatar_0_null_57,NEXUS_5,1.0,en].png index 3e1cb98594..c670583b4b 100644 --- a/tests/uitests/src/test/snapshots/images/ui_S_t[l.designsystem.components.avatar_Avatar_null_Avatars_Avatar_0_null_57,NEXUS_5,1.0,en].png +++ b/tests/uitests/src/test/snapshots/images/ui_S_t[l.designsystem.components.avatar_Avatar_null_Avatars_Avatar_0_null_57,NEXUS_5,1.0,en].png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:f600185bb7a9fe6f4e425d8bf43b2743e6169f3a13c34117059aaa863c1b1de0 -size 21593 +oid sha256:7eb42896831203a1cd8f1ac85b96d33d1048d626f5ee4778733a28d48aeebea4 +size 16744 diff --git a/tests/uitests/src/test/snapshots/images/ui_S_t[l.designsystem.components.avatar_Avatar_null_Avatars_Avatar_0_null_58,NEXUS_5,1.0,en].png b/tests/uitests/src/test/snapshots/images/ui_S_t[l.designsystem.components.avatar_Avatar_null_Avatars_Avatar_0_null_58,NEXUS_5,1.0,en].png index 5a6d361d40..6f8e06f572 100644 --- a/tests/uitests/src/test/snapshots/images/ui_S_t[l.designsystem.components.avatar_Avatar_null_Avatars_Avatar_0_null_58,NEXUS_5,1.0,en].png +++ b/tests/uitests/src/test/snapshots/images/ui_S_t[l.designsystem.components.avatar_Avatar_null_Avatars_Avatar_0_null_58,NEXUS_5,1.0,en].png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:2559b3b0e5242e9867aa5c821551a17dbab723e1018476289cb91ed9b9f9ffc4 -size 20736 +oid sha256:93f23803bd0b5633615fb7c1cb40c76a7a1a755f43fb755a08cb390dfd956d75 +size 15967 diff --git a/tests/uitests/src/test/snapshots/images/ui_S_t[l.designsystem.components.avatar_Avatar_null_Avatars_Avatar_0_null_59,NEXUS_5,1.0,en].png b/tests/uitests/src/test/snapshots/images/ui_S_t[l.designsystem.components.avatar_Avatar_null_Avatars_Avatar_0_null_59,NEXUS_5,1.0,en].png index c1712835ff..dd81493a76 100644 --- a/tests/uitests/src/test/snapshots/images/ui_S_t[l.designsystem.components.avatar_Avatar_null_Avatars_Avatar_0_null_59,NEXUS_5,1.0,en].png +++ b/tests/uitests/src/test/snapshots/images/ui_S_t[l.designsystem.components.avatar_Avatar_null_Avatars_Avatar_0_null_59,NEXUS_5,1.0,en].png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:be8c830118af26d3d39a80d5dfa3a750e6e3830a30b066ca91b7ed305a2ee482 -size 23624 +oid sha256:67a8223f107fa05f1c5d66efc85f68325b4bf835e371ad44553bd6d6edd4a201 +size 18491 diff --git a/tests/uitests/src/test/snapshots/images/ui_S_t[l.designsystem.components.avatar_Avatar_null_Avatars_Avatar_0_null_6,NEXUS_5,1.0,en].png b/tests/uitests/src/test/snapshots/images/ui_S_t[l.designsystem.components.avatar_Avatar_null_Avatars_Avatar_0_null_6,NEXUS_5,1.0,en].png index 2740280540..1ae28cd8b1 100644 --- a/tests/uitests/src/test/snapshots/images/ui_S_t[l.designsystem.components.avatar_Avatar_null_Avatars_Avatar_0_null_6,NEXUS_5,1.0,en].png +++ b/tests/uitests/src/test/snapshots/images/ui_S_t[l.designsystem.components.avatar_Avatar_null_Avatars_Avatar_0_null_6,NEXUS_5,1.0,en].png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:69dcd8a997542d56ad3c327f3937f9fdc31eecebe30a07a2e6ee26e631c140e6 -size 16047 +oid sha256:29b4f035a161707d8c551f70478651b1c49136489f282f56c1c10af399e182b9 +size 19853 diff --git a/tests/uitests/src/test/snapshots/images/ui_S_t[l.designsystem.components.avatar_Avatar_null_Avatars_Avatar_0_null_60,NEXUS_5,1.0,en].png b/tests/uitests/src/test/snapshots/images/ui_S_t[l.designsystem.components.avatar_Avatar_null_Avatars_Avatar_0_null_60,NEXUS_5,1.0,en].png index 821589afc5..3e1cb98594 100644 --- a/tests/uitests/src/test/snapshots/images/ui_S_t[l.designsystem.components.avatar_Avatar_null_Avatars_Avatar_0_null_60,NEXUS_5,1.0,en].png +++ b/tests/uitests/src/test/snapshots/images/ui_S_t[l.designsystem.components.avatar_Avatar_null_Avatars_Avatar_0_null_60,NEXUS_5,1.0,en].png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:3e70ce111262f22f14ada0993a32d23e1532c6d7a24f71c38d6aba4af6610054 -size 17350 +oid sha256:f600185bb7a9fe6f4e425d8bf43b2743e6169f3a13c34117059aaa863c1b1de0 +size 21593 diff --git a/tests/uitests/src/test/snapshots/images/ui_S_t[l.designsystem.components.avatar_Avatar_null_Avatars_Avatar_0_null_61,NEXUS_5,1.0,en].png b/tests/uitests/src/test/snapshots/images/ui_S_t[l.designsystem.components.avatar_Avatar_null_Avatars_Avatar_0_null_61,NEXUS_5,1.0,en].png index d0b966d6ec..5a6d361d40 100644 --- a/tests/uitests/src/test/snapshots/images/ui_S_t[l.designsystem.components.avatar_Avatar_null_Avatars_Avatar_0_null_61,NEXUS_5,1.0,en].png +++ b/tests/uitests/src/test/snapshots/images/ui_S_t[l.designsystem.components.avatar_Avatar_null_Avatars_Avatar_0_null_61,NEXUS_5,1.0,en].png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:88fc583b69d153e9027a2df3f98b45a607dcf32838af033b82b3b94e3e03dcc2 -size 16486 +oid sha256:2559b3b0e5242e9867aa5c821551a17dbab723e1018476289cb91ed9b9f9ffc4 +size 20736 diff --git a/tests/uitests/src/test/snapshots/images/ui_S_t[l.designsystem.components.avatar_Avatar_null_Avatars_Avatar_0_null_62,NEXUS_5,1.0,en].png b/tests/uitests/src/test/snapshots/images/ui_S_t[l.designsystem.components.avatar_Avatar_null_Avatars_Avatar_0_null_62,NEXUS_5,1.0,en].png index 0b8c15e54c..c1712835ff 100644 --- a/tests/uitests/src/test/snapshots/images/ui_S_t[l.designsystem.components.avatar_Avatar_null_Avatars_Avatar_0_null_62,NEXUS_5,1.0,en].png +++ b/tests/uitests/src/test/snapshots/images/ui_S_t[l.designsystem.components.avatar_Avatar_null_Avatars_Avatar_0_null_62,NEXUS_5,1.0,en].png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:672f829a7227921b7179e91c1ee3ef58ff2b7dab7f131b687c4fe0b9862d2a2c -size 19436 +oid sha256:be8c830118af26d3d39a80d5dfa3a750e6e3830a30b066ca91b7ed305a2ee482 +size 23624 diff --git a/tests/uitests/src/test/snapshots/images/ui_S_t[l.designsystem.components.avatar_Avatar_null_Avatars_Avatar_0_null_63,NEXUS_5,1.0,en].png b/tests/uitests/src/test/snapshots/images/ui_S_t[l.designsystem.components.avatar_Avatar_null_Avatars_Avatar_0_null_63,NEXUS_5,1.0,en].png new file mode 100644 index 0000000000..821589afc5 --- /dev/null +++ b/tests/uitests/src/test/snapshots/images/ui_S_t[l.designsystem.components.avatar_Avatar_null_Avatars_Avatar_0_null_63,NEXUS_5,1.0,en].png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:3e70ce111262f22f14ada0993a32d23e1532c6d7a24f71c38d6aba4af6610054 +size 17350 diff --git a/tests/uitests/src/test/snapshots/images/ui_S_t[l.designsystem.components.avatar_Avatar_null_Avatars_Avatar_0_null_64,NEXUS_5,1.0,en].png b/tests/uitests/src/test/snapshots/images/ui_S_t[l.designsystem.components.avatar_Avatar_null_Avatars_Avatar_0_null_64,NEXUS_5,1.0,en].png new file mode 100644 index 0000000000..d0b966d6ec --- /dev/null +++ b/tests/uitests/src/test/snapshots/images/ui_S_t[l.designsystem.components.avatar_Avatar_null_Avatars_Avatar_0_null_64,NEXUS_5,1.0,en].png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:88fc583b69d153e9027a2df3f98b45a607dcf32838af033b82b3b94e3e03dcc2 +size 16486 diff --git a/tests/uitests/src/test/snapshots/images/ui_S_t[l.designsystem.components.avatar_Avatar_null_Avatars_Avatar_0_null_65,NEXUS_5,1.0,en].png b/tests/uitests/src/test/snapshots/images/ui_S_t[l.designsystem.components.avatar_Avatar_null_Avatars_Avatar_0_null_65,NEXUS_5,1.0,en].png new file mode 100644 index 0000000000..0b8c15e54c --- /dev/null +++ b/tests/uitests/src/test/snapshots/images/ui_S_t[l.designsystem.components.avatar_Avatar_null_Avatars_Avatar_0_null_65,NEXUS_5,1.0,en].png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:672f829a7227921b7179e91c1ee3ef58ff2b7dab7f131b687c4fe0b9862d2a2c +size 19436 diff --git a/tests/uitests/src/test/snapshots/images/ui_S_t[l.designsystem.components.avatar_Avatar_null_Avatars_Avatar_0_null_7,NEXUS_5,1.0,en].png b/tests/uitests/src/test/snapshots/images/ui_S_t[l.designsystem.components.avatar_Avatar_null_Avatars_Avatar_0_null_7,NEXUS_5,1.0,en].png index 4462ff8798..8a3b5ced60 100644 --- a/tests/uitests/src/test/snapshots/images/ui_S_t[l.designsystem.components.avatar_Avatar_null_Avatars_Avatar_0_null_7,NEXUS_5,1.0,en].png +++ b/tests/uitests/src/test/snapshots/images/ui_S_t[l.designsystem.components.avatar_Avatar_null_Avatars_Avatar_0_null_7,NEXUS_5,1.0,en].png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:8b20a53d7a1bb9e6cdb5dbae068c1934d4716986618596b33899caa975070f41 -size 14802 +oid sha256:5fd0e375d985f2e77eea87650455c7bc5b4e8f1f5f58467811f686316c5449c9 +size 17581 diff --git a/tests/uitests/src/test/snapshots/images/ui_S_t[l.designsystem.components.avatar_Avatar_null_Avatars_Avatar_0_null_8,NEXUS_5,1.0,en].png b/tests/uitests/src/test/snapshots/images/ui_S_t[l.designsystem.components.avatar_Avatar_null_Avatars_Avatar_0_null_8,NEXUS_5,1.0,en].png index 4e2e4c0254..18efb9a84b 100644 --- a/tests/uitests/src/test/snapshots/images/ui_S_t[l.designsystem.components.avatar_Avatar_null_Avatars_Avatar_0_null_8,NEXUS_5,1.0,en].png +++ b/tests/uitests/src/test/snapshots/images/ui_S_t[l.designsystem.components.avatar_Avatar_null_Avatars_Avatar_0_null_8,NEXUS_5,1.0,en].png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:f0ce8e6b948f953ebfb183939e606f3faa0d73ad35c2707b9821f8229bce37e2 -size 19071 +oid sha256:42ac664be2f0ed05b1fc844947556b256c823c5bc1bce380cceb1fb50ecd751f +size 25028 diff --git a/tests/uitests/src/test/snapshots/images/ui_S_t[l.designsystem.components.avatar_Avatar_null_Avatars_Avatar_0_null_9,NEXUS_5,1.0,en].png b/tests/uitests/src/test/snapshots/images/ui_S_t[l.designsystem.components.avatar_Avatar_null_Avatars_Avatar_0_null_9,NEXUS_5,1.0,en].png index 44a9f12406..2740280540 100644 --- a/tests/uitests/src/test/snapshots/images/ui_S_t[l.designsystem.components.avatar_Avatar_null_Avatars_Avatar_0_null_9,NEXUS_5,1.0,en].png +++ b/tests/uitests/src/test/snapshots/images/ui_S_t[l.designsystem.components.avatar_Avatar_null_Avatars_Avatar_0_null_9,NEXUS_5,1.0,en].png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:a1c284262da7cfc1af8aa583d2762084bf1693c44f83bf1cc1de2d74f57dae0e -size 19408 +oid sha256:69dcd8a997542d56ad3c327f3937f9fdc31eecebe30a07a2e6ee26e631c140e6 +size 16047 diff --git a/tests/uitests/src/test/snapshots/images/ui_S_t[l.roomselect.impl_RoomSelectView_null_RoomSelectView-Day-0_1_null_5,NEXUS_5,1.0,en].png b/tests/uitests/src/test/snapshots/images/ui_S_t[l.roomselect.impl_RoomSelectView_null_RoomSelectView-Day-0_1_null_5,NEXUS_5,1.0,en].png new file mode 100644 index 0000000000..720ee4d1bc --- /dev/null +++ b/tests/uitests/src/test/snapshots/images/ui_S_t[l.roomselect.impl_RoomSelectView_null_RoomSelectView-Day-0_1_null_5,NEXUS_5,1.0,en].png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:a26f6207a1509809313c381c5b0f35e72d584a1323037d1f224583f95295a2b0 +size 27896 diff --git a/tests/uitests/src/test/snapshots/images/ui_S_t[l.roomselect.impl_RoomSelectView_null_RoomSelectView-Night-0_2_null_5,NEXUS_5,1.0,en].png b/tests/uitests/src/test/snapshots/images/ui_S_t[l.roomselect.impl_RoomSelectView_null_RoomSelectView-Night-0_2_null_5,NEXUS_5,1.0,en].png new file mode 100644 index 0000000000..7b6350a3a0 --- /dev/null +++ b/tests/uitests/src/test/snapshots/images/ui_S_t[l.roomselect.impl_RoomSelectView_null_RoomSelectView-Night-0_2_null_5,NEXUS_5,1.0,en].png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:a969b67571558b1e2fe4192ac0896b72ba6f8234542fd812cb3a4e231625d6a1 +size 27120 diff --git a/tools/localazy/checkForbiddenTerms.py b/tools/localazy/checkForbiddenTerms.py index e642f32c54..89a668f246 100755 --- a/tools/localazy/checkForbiddenTerms.py +++ b/tools/localazy/checkForbiddenTerms.py @@ -16,6 +16,8 @@ forbiddenTerms = { "screen_server_confirmation_message_login_element_dot_io", # "Be in your element", will probably be changed on the forks, so we can ignore. "screen_onboarding_welcome_title", + # Contains "Element Call" + "screen_incoming_call_subtitle_android", ] } diff --git a/tools/localazy/config.json b/tools/localazy/config.json index d23a72f7a0..1e9281e8c3 100644 --- a/tools/localazy/config.json +++ b/tools/localazy/config.json @@ -236,9 +236,10 @@ ] }, { - "name" : ":features:call", + "name" : ":features:call:impl", "includeRegex" : [ - "call_.*" + "call_.*", + "screen_incoming_call.*" ] }, { diff --git a/tools/localazy/downloadStrings.sh b/tools/localazy/downloadStrings.sh index a447a5c16f..6de32527a5 100755 --- a/tools/localazy/downloadStrings.sh +++ b/tools/localazy/downloadStrings.sh @@ -51,7 +51,7 @@ fi set +e echo "Moving files from values-id to values-in..." -find . -type d -name 'values-id' -execdir mv {}/translations.xml {}/../values-in/translations.xml \; +find . -type d -name 'values-id' -execdir mv {}/translations.xml {}/../values-in/translations.xml 2> /dev/null \; echo "Deleting all the folders values-id..." find . -type d -name 'values-id' -exec rm -rf {} 2> /dev/null \;