diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index da1299b035..eaea9a841d 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -31,7 +31,7 @@ jobs: # https://github.com/actions/checkout/issues/881 ref: ${{ github.event_name == 'pull_request' && github.event.pull_request.head.sha || github.ref }} - name: Use JDK 21 - uses: actions/setup-java@v4 + uses: actions/setup-java@v5 with: distribution: 'temurin' # See 'Supported distributions' for available options java-version: '21' diff --git a/.github/workflows/build_enterprise.yml b/.github/workflows/build_enterprise.yml index bccdb84516..9c4c8cec8f 100644 --- a/.github/workflows/build_enterprise.yml +++ b/.github/workflows/build_enterprise.yml @@ -39,7 +39,7 @@ jobs: - name: Clone submodules run: git submodule update --init --recursive - name: Use JDK 21 - uses: actions/setup-java@v4 + uses: actions/setup-java@v5 with: distribution: 'temurin' # See 'Supported distributions' for available options java-version: '21' diff --git a/.github/workflows/generate_github_pages.yml b/.github/workflows/generate_github_pages.yml index 5fddd72eea..35953ba661 100644 --- a/.github/workflows/generate_github_pages.yml +++ b/.github/workflows/generate_github_pages.yml @@ -14,7 +14,7 @@ jobs: - name: ⏬ Checkout with LFS uses: nschloe/action-cached-lfs-checkout@f46300cd8952454b9f0a21a3d133d4bd5684cfc2 # v1.2.3 - name: Use JDK 21 - uses: actions/setup-java@v4 + uses: actions/setup-java@v5 with: distribution: 'temurin' # See 'Supported distributions' for available options java-version: '21' diff --git a/.github/workflows/gradle-wrapper-update.yml b/.github/workflows/gradle-wrapper-update.yml index a9cb463629..f826bb8205 100644 --- a/.github/workflows/gradle-wrapper-update.yml +++ b/.github/workflows/gradle-wrapper-update.yml @@ -12,7 +12,7 @@ jobs: if: ${{ github.event_name != 'pull_request' || github.event.pull_request.head.repo.full_name == 'element-hq/element-x-android' }} steps: - uses: actions/checkout@v5 - - uses: actions/setup-java@v4 + - uses: actions/setup-java@v5 name: Use JDK 21 if: (github.event_name == 'pull_request' && github.event.pull_request.fork == null) || github.event_name == 'workflow_dispatch' with: diff --git a/.github/workflows/maestro-local.yml b/.github/workflows/maestro-local.yml index b784514d13..64eff695d9 100644 --- a/.github/workflows/maestro-local.yml +++ b/.github/workflows/maestro-local.yml @@ -28,7 +28,7 @@ jobs: # Ensure we are building the branch and not the branch after being merged on develop # https://github.com/actions/checkout/issues/881 ref: ${{ github.ref }} - - uses: actions/setup-java@v4 + - uses: actions/setup-java@v5 name: Use JDK 21 with: distribution: 'temurin' # See 'Supported distributions' for available options diff --git a/.github/workflows/nightly.yml b/.github/workflows/nightly.yml index f09e36b785..b494d9fe8c 100644 --- a/.github/workflows/nightly.yml +++ b/.github/workflows/nightly.yml @@ -18,7 +18,7 @@ jobs: steps: - uses: actions/checkout@v5 - name: Use JDK 21 - uses: actions/setup-java@v4 + uses: actions/setup-java@v5 with: distribution: 'temurin' # See 'Supported distributions' for available options java-version: '21' diff --git a/.github/workflows/nightlyReports.yml b/.github/workflows/nightlyReports.yml index 177b429a10..f89373b44f 100644 --- a/.github/workflows/nightlyReports.yml +++ b/.github/workflows/nightlyReports.yml @@ -21,7 +21,7 @@ jobs: uses: nschloe/action-cached-lfs-checkout@f46300cd8952454b9f0a21a3d133d4bd5684cfc2 # v1.2.3 - name: Use JDK 21 - uses: actions/setup-java@v4 + uses: actions/setup-java@v5 with: distribution: 'temurin' # See 'Supported distributions' for available options java-version: '21' @@ -62,7 +62,7 @@ jobs: steps: - uses: actions/checkout@v5 - name: Use JDK 21 - uses: actions/setup-java@v4 + uses: actions/setup-java@v5 with: distribution: 'temurin' # See 'Supported distributions' for available options java-version: '21' diff --git a/.github/workflows/quality.yml b/.github/workflows/quality.yml index 1157a02eea..064da5b47e 100644 --- a/.github/workflows/quality.yml +++ b/.github/workflows/quality.yml @@ -47,7 +47,7 @@ jobs: steps: - uses: actions/checkout@v5 - name: Use JDK 21 - uses: actions/setup-java@v4 + uses: actions/setup-java@v5 with: distribution: 'temurin' # See 'Supported distributions' for available options java-version: '21' @@ -85,7 +85,7 @@ jobs: if: ${{ github.event_name != 'pull_request' || github.event.pull_request.head.repo.full_name == 'element-hq/element-x-android' }} run: git submodule update --init --recursive - name: Use JDK 21 - uses: actions/setup-java@v4 + uses: actions/setup-java@v5 with: distribution: 'temurin' # See 'Supported distributions' for available options java-version: '21' @@ -125,7 +125,7 @@ jobs: if: ${{ github.event_name != 'pull_request' || github.event.pull_request.head.repo.full_name == 'element-hq/element-x-android' }} run: git submodule update --init --recursive - name: Use JDK 21 - uses: actions/setup-java@v4 + uses: actions/setup-java@v5 with: distribution: 'temurin' # See 'Supported distributions' for available options java-version: '21' @@ -169,7 +169,7 @@ jobs: if: ${{ github.event_name != 'pull_request' || github.event.pull_request.head.repo.full_name == 'element-hq/element-x-android' }} run: git submodule update --init --recursive - name: Use JDK 21 - uses: actions/setup-java@v4 + uses: actions/setup-java@v5 with: distribution: 'temurin' # See 'Supported distributions' for available options java-version: '21' @@ -209,7 +209,7 @@ jobs: if: ${{ github.event_name != 'pull_request' || github.event.pull_request.head.repo.full_name == 'element-hq/element-x-android' }} run: git submodule update --init --recursive - name: Use JDK 21 - uses: actions/setup-java@v4 + uses: actions/setup-java@v5 with: distribution: 'temurin' # See 'Supported distributions' for available options java-version: '21' @@ -249,7 +249,7 @@ jobs: if: ${{ github.event_name != 'pull_request' || github.event.pull_request.head.repo.full_name == 'element-hq/element-x-android' }} run: git submodule update --init --recursive - name: Use JDK 21 - uses: actions/setup-java@v4 + uses: actions/setup-java@v5 with: distribution: 'temurin' # See 'Supported distributions' for available options java-version: '21' diff --git a/.github/workflows/recordScreenshots.yml b/.github/workflows/recordScreenshots.yml index a5172188ee..a4d54afeb4 100644 --- a/.github/workflows/recordScreenshots.yml +++ b/.github/workflows/recordScreenshots.yml @@ -34,7 +34,7 @@ jobs: with: persist-credentials: false - name: ☕️ Use JDK 21 - uses: actions/setup-java@v4 + uses: actions/setup-java@v5 with: distribution: 'temurin' # See 'Supported distributions' for available options java-version: '21' diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index c3f51f8ec4..661110338d 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -20,7 +20,7 @@ jobs: steps: - uses: actions/checkout@v5 - name: Use JDK 21 - uses: actions/setup-java@v4 + uses: actions/setup-java@v5 with: distribution: 'temurin' # See 'Supported distributions' for available options java-version: '21' @@ -61,7 +61,7 @@ jobs: - name: Clone submodules run: git submodule update --init --recursive - name: Use JDK 21 - uses: actions/setup-java@v4 + uses: actions/setup-java@v5 with: distribution: 'temurin' # See 'Supported distributions' for available options java-version: '21' @@ -89,7 +89,7 @@ jobs: steps: - uses: actions/checkout@v5 - name: Use JDK 21 - uses: actions/setup-java@v4 + uses: actions/setup-java@v5 with: distribution: 'temurin' # See 'Supported distributions' for available options java-version: '21' diff --git a/.github/workflows/sonar.yml b/.github/workflows/sonar.yml index d85e4edf27..080fcef0e0 100644 --- a/.github/workflows/sonar.yml +++ b/.github/workflows/sonar.yml @@ -28,7 +28,7 @@ jobs: # https://github.com/actions/checkout/issues/881 ref: ${{ github.event_name == 'pull_request' && github.event.pull_request.head.sha || github.ref }} - name: Use JDK 21 - uses: actions/setup-java@v4 + uses: actions/setup-java@v5 with: distribution: 'temurin' # See 'Supported distributions' for available options java-version: '21' diff --git a/.github/workflows/sync-localazy.yml b/.github/workflows/sync-localazy.yml index 44c3a24eb7..4d1362921f 100644 --- a/.github/workflows/sync-localazy.yml +++ b/.github/workflows/sync-localazy.yml @@ -13,7 +13,7 @@ jobs: steps: - uses: actions/checkout@v5 - name: Use JDK 21 - uses: actions/setup-java@v4 + uses: actions/setup-java@v5 with: distribution: 'temurin' # See 'Supported distributions' for available options java-version: '21' diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index a0ffe74f6f..e25e22cf60 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -47,7 +47,7 @@ jobs: if: ${{ github.event_name != 'pull_request' || github.event.pull_request.head.repo.full_name == 'element-hq/element-x-android' }} run: git submodule update --init --recursive - name: ☕️ Use JDK 21 - uses: actions/setup-java@v4 + uses: actions/setup-java@v5 with: distribution: 'temurin' # See 'Supported distributions' for available options java-version: '21' @@ -82,7 +82,7 @@ jobs: # https://github.com/codecov/codecov-action - name: ☂️ Upload coverage reports to codecov - uses: codecov/codecov-action@18283e04ce6e62d37312384ff67231eb8fd56d24 # v5.4.3 + uses: codecov/codecov-action@fdcc8476540edceab3de004e990f80d881c6cc00 # v5.5.0 with: fail_ci_if_error: true token: ${{ secrets.CODECOV_TOKEN }} diff --git a/.idea/kotlinc.xml b/.idea/kotlinc.xml index 03fcfb7bea..254a1fc3cc 100644 --- a/.idea/kotlinc.xml +++ b/.idea/kotlinc.xml @@ -1,6 +1,6 @@ - \ No newline at end of file diff --git a/.maestro/tests/roomList/createAndDeleteRoom.yaml b/.maestro/tests/roomList/createAndDeleteRoom.yaml index e957d04bdf..a72fb80075 100644 --- a/.maestro/tests/roomList/createAndDeleteRoom.yaml +++ b/.maestro/tests/roomList/createAndDeleteRoom.yaml @@ -3,18 +3,18 @@ appId: ${MAESTRO_APP_ID} # Purpose: Test the creation and deletion of a room - tapOn: "Create a new conversation or room" - tapOn: "New room" -- tapOn: "Search for someone" -- inputText: ${MAESTRO_INVITEE1_MXID} -- tapOn: - text: ${MAESTRO_INVITEE1_MXID} - index: 1 -- tapOn: "Next" - tapOn: "e.g. your project name" - inputText: "aRoomName" - tapOn: "What is this room about?" - inputText: "aRoomTopic" - tapOn: "Create" - takeScreenshot: build/maestro/320-createAndDeleteRoom +- tapOn: "Search for someone" +- inputText: ${MAESTRO_INVITEE1_MXID} +- tapOn: + text: ${MAESTRO_INVITEE1_MXID} + index: 1 +- tapOn: "Finish" - tapOn: "aRoomName" - tapOn: "Invite" # assert there's 1 member and 1 invitee diff --git a/CHANGES.md b/CHANGES.md index bed23e2dc3..3f6a82a468 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -1,3 +1,41 @@ +Changes in Element X v25.08.3 +============================= + +## What's Changed +### ✨ Features +* Add media file limit size warning and media quality selection by @jmartinesp in https://github.com/element-hq/element-x-android/pull/5131 +### 🐛 Bugfixes +* Fix cursor position in room list search by @jmartinesp in https://github.com/element-hq/element-x-android/pull/5138 +* Fix leaving the room not always dismissing the room screen by @jmartinesp in https://github.com/element-hq/element-x-android/pull/5089 +* Do not automatically initialize `DefaultVideoMetadataExtractor`'s data source by @jmartinesp in https://github.com/element-hq/element-x-android/pull/5157 +* Provide calculated server names when opening a room from another by @jmartinesp in https://github.com/element-hq/element-x-android/pull/5155 +### 🗣 Translations +* Sync Strings by @ElementBot in https://github.com/element-hq/element-x-android/pull/5146 +### 🧱 Build +* Compile and target sdk36 by @bmarty in https://github.com/element-hq/element-x-android/pull/5150 +* Fix Maestro regression when coming back from room to the search screen by @jmartinesp in https://github.com/element-hq/element-x-android/pull/5156 +### Dependency upgrades +* Update android.gradle.plugin to v8.12.0 by @renovate[bot] in https://github.com/element-hq/element-x-android/pull/5106 +* Update wysiwyg to v2.39.0 by @renovate[bot] in https://github.com/element-hq/element-x-android/pull/5080 +* Update dependency python to 3.13 by @renovate[bot] in https://github.com/element-hq/element-x-android/pull/5144 +* Update rnkdsh/action-upload-diawi action to v1.5.11 by @renovate[bot] in https://github.com/element-hq/element-x-android/pull/5141 +* Update dependency io.github.sergio-sastre.ComposablePreviewScanner:android to v0.7.0 by @renovate[bot] in https://github.com/element-hq/element-x-android/pull/5143 +* Update actions/checkout action to v5 by @renovate[bot] in https://github.com/element-hq/element-x-android/pull/5148 +* Update dependency io.sentry:sentry-android to v8.19.0 by @renovate[bot] in https://github.com/element-hq/element-x-android/pull/5149 +* Update dependency io.sentry:sentry-android to v8.19.1 by @renovate[bot] in https://github.com/element-hq/element-x-android/pull/5158 +* Update dependency androidx.browser:browser to v1.9.0 by @renovate[bot] in https://github.com/element-hq/element-x-android/pull/5096 +* Update Compose bom to 2025.07.00 by @bmarty in https://github.com/element-hq/element-x-android/pull/5164 +* Update showkase to v1.0.5 by @renovate[bot] in https://github.com/element-hq/element-x-android/pull/5117 +* Update haze to v1.6.10 by @renovate[bot] in https://github.com/element-hq/element-x-android/pull/5167 +### Others +* Let enterprise build be able to override (or disable) the bug report URL. by @bmarty in https://github.com/element-hq/element-x-android/pull/5139 +* Hide the recovery key while we are entering it by @jmartinesp in https://github.com/element-hq/element-x-android/pull/5147 +* Remove old feature flags by @bmarty in https://github.com/element-hq/element-x-android/pull/5160 +* Move push history entry point from notification settings to developer settings by @bmarty in https://github.com/element-hq/element-x-android/pull/5161 + + +**Full Changelog**: https://github.com/element-hq/element-x-android/compare/v25.08.2...v25.08.3 + Changes in Element X v25.08.2 ============================= diff --git a/anvilcodegen/src/main/kotlin/io/element/android/anvilcodegen/ContributesNodeProcessor.kt b/anvilcodegen/src/main/kotlin/io/element/android/anvilcodegen/ContributesNodeProcessor.kt index 2511e0008d..7b41c03158 100644 --- a/anvilcodegen/src/main/kotlin/io/element/android/anvilcodegen/ContributesNodeProcessor.kt +++ b/anvilcodegen/src/main/kotlin/io/element/android/anvilcodegen/ContributesNodeProcessor.kt @@ -28,6 +28,7 @@ import com.squareup.kotlinpoet.KModifier import com.squareup.kotlinpoet.ParameterizedTypeName.Companion.parameterizedBy import com.squareup.kotlinpoet.STAR import com.squareup.kotlinpoet.TypeSpec +import com.squareup.kotlinpoet.ksp.addOriginatingKSFile import com.squareup.kotlinpoet.ksp.toTypeName import com.squareup.kotlinpoet.ksp.writeTo import dagger.Binds @@ -78,6 +79,7 @@ class ContributesNodeProcessor( ) .addType( TypeSpec.classBuilder(moduleClassName) + .addOriginatingKSFile(ksClass.containingFile!!) .addModifiers(KModifier.ABSTRACT) .addAnnotation(Module::class) .addAnnotation(AnnotationSpec.builder(ContributesTo::class).addMember("%T::class", scope.toTypeName()).build()) @@ -102,10 +104,7 @@ class ContributesNodeProcessor( content.writeTo( codeGenerator = codeGenerator, - dependencies = Dependencies( - aggregating = true, - ksClass.containingFile!! - ), + dependencies = Dependencies(aggregating = false), ) } @@ -139,6 +138,7 @@ class ContributesNodeProcessor( val content = FileSpec.builder(generatedPackage, assistedFactoryClassName) .addType( TypeSpec.interfaceBuilder(assistedFactoryClassName) + .addOriginatingKSFile(ksClass.containingFile!!) .addSuperinterface(ClassName.bestGuess(assistedNodeFactoryFqName.asString()).parameterizedBy(nodeClassName)) .addAnnotation(AssistedFactory::class) .addFunction( @@ -155,10 +155,7 @@ class ContributesNodeProcessor( content.writeTo( codeGenerator = codeGenerator, - dependencies = Dependencies( - aggregating = true, - ksClass.containingFile!! - ), + dependencies = Dependencies(aggregating = false), ) } diff --git a/app/build.gradle.kts b/app/build.gradle.kts index ea45e51bf8..6131abf385 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -301,6 +301,7 @@ dependencies { testImplementation(libs.test.turbine) testImplementation(projects.libraries.matrix.test) testImplementation(projects.services.toolbox.test) + testImplementation(projects.tests.testutils) koverDependencies() } diff --git a/app/proguard-rules.pro b/app/proguard-rules.pro index 89dcab5fad..c55b1bf1c2 100644 --- a/app/proguard-rules.pro +++ b/app/proguard-rules.pro @@ -42,3 +42,12 @@ } -keep class io.element.android.x.di.** { *; } + + +# Keep LogSessionId class and related classes (https://github.com/androidx/media/issues/2535) +-keep class android.media.metrics.LogSessionId { *; } +-keep class android.media.metrics.** { *; } + +# Keep Media3 classes that use reflection (https://github.com/androidx/media/issues/2535) +-keep class androidx.media3.** { *; } +-dontwarn android.media.metrics.** diff --git a/app/src/main/kotlin/io/element/android/x/initializer/CrashInitializer.kt b/app/src/main/kotlin/io/element/android/x/initializer/CrashInitializer.kt index 72e864bbea..d2fbb1b78f 100644 --- a/app/src/main/kotlin/io/element/android/x/initializer/CrashInitializer.kt +++ b/app/src/main/kotlin/io/element/android/x/initializer/CrashInitializer.kt @@ -10,10 +10,14 @@ package io.element.android.x.initializer import android.content.Context import androidx.startup.Initializer import io.element.android.features.rageshake.impl.crash.VectorUncaughtExceptionHandler +import io.element.android.features.rageshake.impl.di.RageshakeBindings +import io.element.android.libraries.architecture.bindings class CrashInitializer : Initializer { override fun create(context: Context) { - VectorUncaughtExceptionHandler(context).activate() + VectorUncaughtExceptionHandler( + context.bindings().preferencesCrashDataStore(), + ).activate() } override fun dependencies(): List>> = emptyList() diff --git a/app/src/main/kotlin/io/element/android/x/intent/DefaultIntentProvider.kt b/app/src/main/kotlin/io/element/android/x/intent/DefaultIntentProvider.kt index fedcdf2919..cce6d76510 100644 --- a/app/src/main/kotlin/io/element/android/x/intent/DefaultIntentProvider.kt +++ b/app/src/main/kotlin/io/element/android/x/intent/DefaultIntentProvider.kt @@ -11,7 +11,7 @@ import android.content.Context import android.content.Intent import androidx.core.net.toUri import com.squareup.anvil.annotations.ContributesBinding -import io.element.android.libraries.deeplink.DeepLinkCreator +import io.element.android.libraries.deeplink.api.DeepLinkCreator import io.element.android.libraries.di.AppScope import io.element.android.libraries.di.ApplicationContext import io.element.android.libraries.matrix.api.core.RoomId @@ -33,7 +33,7 @@ class DefaultIntentProvider @Inject constructor( ): Intent { return Intent(context, MainActivity::class.java).apply { action = Intent.ACTION_VIEW - data = deepLinkCreator.room(sessionId, roomId, threadId).toUri() + data = deepLinkCreator.create(sessionId, roomId, threadId).toUri() } } } diff --git a/app/src/test/kotlin/io/element/android/x/intent/DefaultIntentProviderTest.kt b/app/src/test/kotlin/io/element/android/x/intent/DefaultIntentProviderTest.kt index 5e81d6b964..9d6d9d4320 100644 --- a/app/src/test/kotlin/io/element/android/x/intent/DefaultIntentProviderTest.kt +++ b/app/src/test/kotlin/io/element/android/x/intent/DefaultIntentProviderTest.kt @@ -5,15 +5,22 @@ * Please see LICENSE files in the repository root for full details. */ +@file:Suppress("SameParameterValue") + package io.element.android.x.intent import android.content.Context import android.content.Intent import com.google.common.truth.Truth.assertThat -import io.element.android.libraries.deeplink.DeepLinkCreator +import io.element.android.libraries.deeplink.api.DeepLinkCreator +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.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.tests.testutils.lambda.lambdaRecorder +import io.element.android.tests.testutils.lambda.value import io.element.android.x.MainActivity import org.junit.Test import org.junit.runner.RunWith @@ -23,45 +30,31 @@ import org.robolectric.RuntimeEnvironment @RunWith(RobolectricTestRunner::class) class DefaultIntentProviderTest { @Test - fun `test getViewRoomIntent with Session`() { - val sut = createDefaultIntentProvider() - val result = sut.getViewRoomIntent( - sessionId = A_SESSION_ID, - roomId = null, - threadId = null, + fun `test getViewRoomIntent with data`() { + val deepLinkCreator = lambdaRecorder { _, _, _ -> "deepLinkCreatorResult" } + val sut = createDefaultIntentProvider( + deepLinkCreator = { sessionId, roomId, threadId -> deepLinkCreator.invoke(sessionId, roomId, threadId) }, ) - result.commonAssertions() - assertThat(result.data.toString()).isEqualTo("elementx://open/@alice:server.org") - } - - @Test - fun `test getViewRoomIntent with Session and Room`() { - val sut = createDefaultIntentProvider() - val result = sut.getViewRoomIntent( - sessionId = A_SESSION_ID, - roomId = A_ROOM_ID, - threadId = null, - ) - result.commonAssertions() - assertThat(result.data.toString()).isEqualTo("elementx://open/@alice:server.org/!aRoomId:domain") - } - - @Test - fun `test getViewRoomIntent with Session, Room and Thread`() { - val sut = createDefaultIntentProvider() val result = sut.getViewRoomIntent( sessionId = A_SESSION_ID, roomId = A_ROOM_ID, threadId = A_THREAD_ID, ) result.commonAssertions() - assertThat(result.data.toString()).isEqualTo("elementx://open/@alice:server.org/!aRoomId:domain/\$aThreadId") + assertThat(result.data.toString()).isEqualTo("deepLinkCreatorResult") + deepLinkCreator.assertions().isCalledOnce().with( + value(A_SESSION_ID), + value(A_ROOM_ID), + value(A_THREAD_ID), + ) } - private fun createDefaultIntentProvider(): DefaultIntentProvider { + private fun createDefaultIntentProvider( + deepLinkCreator: DeepLinkCreator = DeepLinkCreator { _, _, _ -> "" }, + ): DefaultIntentProvider { return DefaultIntentProvider( context = RuntimeEnvironment.getApplication() as Context, - deepLinkCreator = DeepLinkCreator(), + deepLinkCreator = deepLinkCreator, ) } diff --git a/appnav/build.gradle.kts b/appnav/build.gradle.kts index e6b50eaaf6..715dd79d9b 100644 --- a/appnav/build.gradle.kts +++ b/appnav/build.gradle.kts @@ -27,7 +27,7 @@ dependencies { implementation(projects.libraries.core) implementation(projects.libraries.androidutils) implementation(projects.libraries.architecture) - implementation(projects.libraries.deeplink) + implementation(projects.libraries.deeplink.api) implementation(projects.libraries.matrix.api) implementation(projects.libraries.oidc.api) implementation(projects.libraries.preferences.api) @@ -65,6 +65,7 @@ dependencies { testImplementation(projects.features.rageshake.test) testImplementation(projects.services.appnavstate.test) testImplementation(projects.services.analytics.test) + testImplementation(projects.services.toolbox.test) testImplementation(libs.test.appyx.junit) testImplementation(libs.test.arch.core) } 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 fb9b38352c..f621c7a090 100644 --- a/appnav/src/main/kotlin/io/element/android/appnav/LoggedInFlowNode.kt +++ b/appnav/src/main/kotlin/io/element/android/appnav/LoggedInFlowNode.kt @@ -46,7 +46,6 @@ import io.element.android.appnav.loggedin.SendQueues import io.element.android.appnav.room.RoomFlowNode import io.element.android.appnav.room.RoomNavigationTarget import io.element.android.appnav.room.joined.JoinedRoomLoadedFlowNode -import io.element.android.features.createroom.api.CreateRoomEntryPoint import io.element.android.features.enterprise.api.SessionEnterpriseService import io.element.android.features.ftue.api.FtueEntryPoint import io.element.android.features.ftue.api.state.FtueService @@ -60,6 +59,7 @@ import io.element.android.features.roomdirectory.api.RoomDescription import io.element.android.features.roomdirectory.api.RoomDirectoryEntryPoint import io.element.android.features.securebackup.api.SecureBackupEntryPoint import io.element.android.features.share.api.ShareEntryPoint +import io.element.android.features.startchat.api.StartChatEntryPoint import io.element.android.features.userprofile.api.UserProfileEntryPoint import io.element.android.features.verifysession.api.IncomingVerificationEntryPoint import io.element.android.libraries.architecture.BackstackView @@ -81,6 +81,7 @@ import io.element.android.libraries.matrix.api.core.toRoomIdOrAlias import io.element.android.libraries.matrix.api.permalink.PermalinkData import io.element.android.libraries.matrix.api.verification.SessionVerificationServiceListener import io.element.android.libraries.matrix.api.verification.VerificationRequest +import io.element.android.libraries.push.api.notifications.conversations.NotificationConversationService import io.element.android.services.appnavstate.api.AppNavigationStateService import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.flow.first @@ -94,15 +95,6 @@ import java.time.Duration import java.time.Instant import java.util.Optional import java.util.UUID -import kotlin.collections.List -import kotlin.collections.any -import kotlin.collections.emptyList -import kotlin.collections.first -import kotlin.collections.forEach -import kotlin.collections.listOf -import kotlin.collections.mapNotNull -import kotlin.collections.plus -import kotlin.collections.setOf import kotlin.time.Duration.Companion.minutes import kotlin.time.Duration.Companion.seconds import kotlin.time.toKotlinDuration @@ -113,7 +105,7 @@ class LoggedInFlowNode @AssistedInject constructor( @Assisted plugins: List, private val homeEntryPoint: HomeEntryPoint, private val preferencesEntryPoint: PreferencesEntryPoint, - private val createRoomEntryPoint: CreateRoomEntryPoint, + private val startChatEntryPoint: StartChatEntryPoint, private val appNavigationStateService: AppNavigationStateService, private val secureBackupEntryPoint: SecureBackupEntryPoint, private val userProfileEntryPoint: UserProfileEntryPoint, @@ -130,6 +122,7 @@ class LoggedInFlowNode @AssistedInject constructor( private val mediaPreviewConfigMigration: MediaPreviewConfigMigration, private val sessionEnterpriseService: SessionEnterpriseService, private val networkMonitor: NetworkMonitor, + private val notificationConversationService: NotificationConversationService, snackbarDispatcher: SnackbarDispatcher, ) : BaseFlowNode( backstack = BackStack( @@ -215,6 +208,12 @@ class LoggedInFlowNode @AssistedInject constructor( } .launchIn(lifecycleScope) }, + onResume = { + lifecycleScope.launch { + val availableRoomIds = matrixClient.getJoinedRoomIds().getOrNull() ?: return@launch + notificationConversationService.onAvailableRoomsChanged(sessionId = matrixClient.sessionId, roomIds = availableRoomIds) + } + }, onDestroy = { appNavigationStateService.onLeavingSpace(id) appNavigationStateService.onLeavingSession(id) @@ -304,7 +303,7 @@ class LoggedInFlowNode @AssistedInject constructor( backstack.push(NavTarget.Settings()) } - override fun onCreateRoomClick() { + override fun onStartChatClick() { backstack.push(NavTarget.CreateRoom) } @@ -422,7 +421,7 @@ class LoggedInFlowNode @AssistedInject constructor( .build() } NavTarget.CreateRoom -> { - val callback = object : CreateRoomEntryPoint.Callback { + val callback = object : StartChatEntryPoint.Callback { override fun onOpenRoom(roomIdOrAlias: RoomIdOrAlias, serverNames: List) { backstack.replace(NavTarget.Room(roomIdOrAlias = roomIdOrAlias, serverNames = serverNames)) } @@ -432,7 +431,7 @@ class LoggedInFlowNode @AssistedInject constructor( } } - createRoomEntryPoint + startChatEntryPoint .nodeBuilder(this, buildContext) .callback(callback) .build() 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 3d02739ba6..c64288839b 100644 --- a/appnav/src/main/kotlin/io/element/android/appnav/RootFlowNode.kt +++ b/appnav/src/main/kotlin/io/element/android/appnav/RootFlowNode.kt @@ -44,7 +44,7 @@ import io.element.android.libraries.architecture.BaseFlowNode import io.element.android.libraries.architecture.createNode import io.element.android.libraries.architecture.waitForChildAttached import io.element.android.libraries.core.uri.ensureProtocol -import io.element.android.libraries.deeplink.DeeplinkData +import io.element.android.libraries.deeplink.api.DeeplinkData import io.element.android.libraries.designsystem.theme.components.CircularProgressIndicator import io.element.android.libraries.di.AppScope import io.element.android.libraries.matrix.api.auth.MatrixAuthenticationService 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 786b694c3f..0c8a7cb17f 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 @@ -10,8 +10,8 @@ package io.element.android.appnav.intent import android.content.Intent import io.element.android.features.login.api.LoginIntentResolver import io.element.android.features.login.api.LoginParams -import io.element.android.libraries.deeplink.DeeplinkData -import io.element.android.libraries.deeplink.DeeplinkParser +import io.element.android.libraries.deeplink.api.DeeplinkData +import io.element.android.libraries.deeplink.api.DeeplinkParser import io.element.android.libraries.matrix.api.permalink.PermalinkData import io.element.android.libraries.matrix.api.permalink.PermalinkParser import io.element.android.libraries.oidc.api.OidcAction diff --git a/appnav/src/main/res/values-ur/translations.xml b/appnav/src/main/res/values-ur/translations.xml new file mode 100644 index 0000000000..80d1840d9d --- /dev/null +++ b/appnav/src/main/res/values-ur/translations.xml @@ -0,0 +1,5 @@ + + + "لاگ آؤٹ اور اپ گریڈ کریں" + "آپ کا homeserver اب پرانے پروٹوکول کو سپورٹ نہیں کرتا ہے۔ براہ کرم لاگ آؤٹ کریں اور ایپ کا استعمال جاری رکھنے کے لیے دوبارہ لاگ ان کریں۔" + diff --git a/appnav/src/main/res/values-uz/translations.xml b/appnav/src/main/res/values-uz/translations.xml new file mode 100644 index 0000000000..a76aaaed92 --- /dev/null +++ b/appnav/src/main/res/values-uz/translations.xml @@ -0,0 +1,6 @@ + + + "Tizmdan chiqish va yangilash" + "%1$s endi eski protokolni qoʻllab-quvvatlamaydi. Iltimos, ilovadan foydalanishni davom ettirish uchun tizimdan chiqing va qayta kiring." + "Sizning uy serveringiz endi eski protokolni qoʻllab-quvvatlamaydi. Iltimos, ilovadan foydalanishni davom ettirish uchun tizimdan qayta chiqib-kiring." + 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 4c8b2a803d..2a343a1592 100644 --- a/appnav/src/test/kotlin/io/element/android/appnav/RootPresenterTest.kt +++ b/appnav/src/test/kotlin/io/element/android/appnav/RootPresenterTest.kt @@ -19,6 +19,7 @@ import io.element.android.services.analytics.test.FakeAnalyticsService 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.services.toolbox.test.strings.FakeStringProvider import io.element.android.tests.testutils.WarmUpRule import kotlinx.coroutines.test.runTest import org.junit.Rule @@ -42,7 +43,9 @@ class RootPresenterTest { @Test fun `present - passes app error state`() = runTest { val presenter = createRootPresenter( - appErrorService = DefaultAppErrorStateService().apply { + appErrorService = DefaultAppErrorStateService( + stringProvider = FakeStringProvider(), + ).apply { showError("Bad news", "Something bad happened") } ) @@ -61,7 +64,9 @@ class RootPresenterTest { } private fun createRootPresenter( - appErrorService: AppErrorStateService = DefaultAppErrorStateService(), + appErrorService: AppErrorStateService = DefaultAppErrorStateService( + stringProvider = FakeStringProvider(), + ), ): RootPresenter { return RootPresenter( crashDetectionPresenter = { aCrashDetectionState() }, 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 e95eb66cc3..05898c75f3 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 @@ -14,9 +14,7 @@ import androidx.core.net.toUri import com.google.common.truth.Truth.assertThat import io.element.android.features.login.api.LoginParams import io.element.android.features.login.test.FakeLoginIntentResolver -import io.element.android.libraries.deeplink.DeepLinkCreator -import io.element.android.libraries.deeplink.DeeplinkData -import io.element.android.libraries.deeplink.DeeplinkParser +import io.element.android.libraries.deeplink.api.DeeplinkData import io.element.android.libraries.matrix.api.core.UserId import io.element.android.libraries.matrix.api.permalink.PermalinkData import io.element.android.libraries.matrix.test.A_ROOM_ID @@ -46,15 +44,11 @@ class IntentResolverTest { @Test fun `test resolve navigation intent root`() { - val sut = createIntentResolver() + val sut = createIntentResolver( + deeplinkParserResult = DeeplinkData.Root(A_SESSION_ID) + ) val intent = Intent(RuntimeEnvironment.getApplication(), Activity::class.java).apply { action = Intent.ACTION_VIEW - data = DeepLinkCreator().room( - sessionId = A_SESSION_ID, - roomId = null, - threadId = null, - ) - .toUri() } val result = sut.resolve(intent) assertThat(result).isEqualTo( @@ -68,15 +62,15 @@ class IntentResolverTest { @Test fun `test resolve navigation intent room`() { - val sut = createIntentResolver() - val intent = Intent(RuntimeEnvironment.getApplication(), Activity::class.java).apply { - action = Intent.ACTION_VIEW - data = DeepLinkCreator().room( + val sut = createIntentResolver( + deeplinkParserResult = DeeplinkData.Room( sessionId = A_SESSION_ID, roomId = A_ROOM_ID, threadId = null, ) - .toUri() + ) + val intent = Intent(RuntimeEnvironment.getApplication(), Activity::class.java).apply { + action = Intent.ACTION_VIEW } val result = sut.resolve(intent) assertThat(result).isEqualTo( @@ -92,15 +86,15 @@ class IntentResolverTest { @Test fun `test resolve navigation intent thread`() { - val sut = createIntentResolver() - val intent = Intent(RuntimeEnvironment.getApplication(), Activity::class.java).apply { - action = Intent.ACTION_VIEW - data = DeepLinkCreator().room( + val sut = createIntentResolver( + deeplinkParserResult = DeeplinkData.Room( sessionId = A_SESSION_ID, roomId = A_ROOM_ID, threadId = A_THREAD_ID, ) - .toUri() + ) + val intent = Intent(RuntimeEnvironment.getApplication(), Activity::class.java).apply { + action = Intent.ACTION_VIEW } val result = sut.resolve(intent) assertThat(result).isEqualTo( @@ -240,12 +234,13 @@ class IntentResolverTest { } private fun createIntentResolver( + deeplinkParserResult: DeeplinkData? = null, permalinkParserResult: (String) -> PermalinkData = { lambdaError() }, loginIntentResolverResult: (String) -> LoginParams? = { lambdaError() }, oidcIntentResolverResult: (Intent) -> OidcAction? = { lambdaError() }, ): IntentResolver { return IntentResolver( - deeplinkParser = DeeplinkParser(), + deeplinkParser = { deeplinkParserResult }, loginIntentResolver = FakeLoginIntentResolver( parseResult = loginIntentResolverResult, ), diff --git a/fastlane/metadata/android/en-US/changelogs/202508040.txt b/fastlane/metadata/android/en-US/changelogs/202508040.txt new file mode 100644 index 0000000000..ac9a4fb45b --- /dev/null +++ b/fastlane/metadata/android/en-US/changelogs/202508040.txt @@ -0,0 +1,2 @@ +Main changes in this version: you can now create shortcuts to your recent conversations, several bug fixes related to media processing and downloading. +Full changelog: https://github.com/element-hq/element-x-android/releases \ No newline at end of file diff --git a/features/analytics/impl/src/main/kotlin/io/element/android/features/analytics/impl/AnalyticsOptInStateProvider.kt b/features/analytics/impl/src/main/kotlin/io/element/android/features/analytics/impl/AnalyticsOptInStateProvider.kt index e6917c237e..ec37542b31 100644 --- a/features/analytics/impl/src/main/kotlin/io/element/android/features/analytics/impl/AnalyticsOptInStateProvider.kt +++ b/features/analytics/impl/src/main/kotlin/io/element/android/features/analytics/impl/AnalyticsOptInStateProvider.kt @@ -8,9 +8,8 @@ package io.element.android.features.analytics.impl import androidx.compose.ui.tooling.preview.PreviewParameterProvider -import javax.inject.Inject -open class AnalyticsOptInStateProvider @Inject constructor() : PreviewParameterProvider { +open class AnalyticsOptInStateProvider : PreviewParameterProvider { override val values: Sequence get() = sequenceOf( aAnalyticsOptInState(), diff --git a/features/call/impl/src/main/res/values-uz/translations.xml b/features/call/impl/src/main/res/values-uz/translations.xml index 010695a2ef..daab8211cb 100644 --- a/features/call/impl/src/main/res/values-uz/translations.xml +++ b/features/call/impl/src/main/res/values-uz/translations.xml @@ -2,5 +2,6 @@ "Davom etayotgan qo\'ng\'iroq" "Qo\'ng\'iroqqa qaytish uchun bosing" - "☎️ Qo‘ng‘iroq davom etmoqda" + "☎️ Qoʻngʻiroq davom etmoqda" + "Element Call ushbu Android versiyasida Bluetooth audio qurilmalaridan foydalanishni qoʻllab-quvvatlamaydi. Iltimos, boshqa audio qurilmani tanlang." diff --git a/features/call/impl/src/main/res/values-zh-rTW/translations.xml b/features/call/impl/src/main/res/values-zh-rTW/translations.xml index ec01e5a6e3..d0e400dd07 100644 --- a/features/call/impl/src/main/res/values-zh-rTW/translations.xml +++ b/features/call/impl/src/main/res/values-zh-rTW/translations.xml @@ -3,5 +3,6 @@ "進行中的通話" "點擊以返回到通話頁面" "☎️ 通話中" + "Element Call 不支援在此 Android 版本中使用藍牙音訊裝置。請選取其他音訊裝置。" "Element 來電" diff --git a/features/call/impl/src/main/res/values-zh/translations.xml b/features/call/impl/src/main/res/values-zh/translations.xml index 8eda0df212..6192568a61 100644 --- a/features/call/impl/src/main/res/values-zh/translations.xml +++ b/features/call/impl/src/main/res/values-zh/translations.xml @@ -3,5 +3,6 @@ "通话进行中" "点按即可返回通话" "☎️ 通话中" + "Element Call 不支持在此 Android 版本中使用蓝牙音频设备。请选择其他音频设备。" "Element 来电" diff --git a/features/changeroommemberroles/api/build.gradle.kts b/features/changeroommemberroles/api/build.gradle.kts index 9ec13286da..c58e25cf1c 100644 --- a/features/changeroommemberroles/api/build.gradle.kts +++ b/features/changeroommemberroles/api/build.gradle.kts @@ -1,5 +1,3 @@ -import extension.setupAnvil - /* * Copyright 2025 New Vector Ltd. * @@ -16,8 +14,6 @@ android { namespace = "io.element.android.features.changeroommemberroles.api" } -setupAnvil() - dependencies { implementation(projects.anvilannotations) implementation(projects.libraries.architecture) diff --git a/features/changeroommemberroles/impl/src/main/res/values-et/translations.xml b/features/changeroommemberroles/impl/src/main/res/values-et/translations.xml index 044503f1de..a43a9a89d0 100644 --- a/features/changeroommemberroles/impl/src/main/res/values-et/translations.xml +++ b/features/changeroommemberroles/impl/src/main/res/values-et/translations.xml @@ -2,7 +2,7 @@ "Vaid peakasutajad" "Suhtluskeelu seadmine" - "Sõnumite kustutamine" + "Eemalda sõnumid" "Kõik" "Kutsu teisi osalejaid ja vasta ise liitumiskutsetele" "Jututoas osalejate modereerimine" diff --git a/features/changeroommemberroles/impl/src/main/res/values-eu/translations.xml b/features/changeroommemberroles/impl/src/main/res/values-eu/translations.xml index a6b701f0a0..47210a0ca6 100644 --- a/features/changeroommemberroles/impl/src/main/res/values-eu/translations.xml +++ b/features/changeroommemberroles/impl/src/main/res/values-eu/translations.xml @@ -16,6 +16,7 @@ "Bidali mezuak" "Editatu administratzaileak" "Administratzailea gehitu?" + "Jabetza eskualdatu?" "Jaitsi mailaz" "Ezin izango duzu hau aldatu zure burua mailaz jaisten ari zarelako, zu bazara gelan baimenak dituen azken erabiltzailea ezin izango dira baimenak berreskuratu." "Zure burua mailaz jaitsi?" @@ -23,6 +24,7 @@ "(Egiteke)" "Administratzaileek automatikoki dute moderatzaile-pribilegioak" "Editatu moderatzaileak" + "Aukeratu jabeak" "Administratzaileak" "Moderatzaileak" "Kideak" @@ -42,15 +44,18 @@ "Zain" "Kudeatzailea" "Moderatzailea" + "Jabea" "Gelako kideak" "%1$s(r)i debekua kentzen" "Administratzaileak" + "Administratzaileak eta jabeak" "Aldatu nire rola" "Jaitsi maila, kidera" "Jaitsi maila, moderatzailera" "Kideen moderazioa" "Mezuak eta edukiak" "Moderatzaileak" + "Jabeak" "Baimenak" "Berrezarri baimenak" "Baimenak berrezarritakoan, uneko ezarpenak galduko dituzu." diff --git a/features/changeroommemberroles/impl/src/main/res/values-fa/translations.xml b/features/changeroommemberroles/impl/src/main/res/values-fa/translations.xml index c9c9da0882..c5bbc9d3ff 100644 --- a/features/changeroommemberroles/impl/src/main/res/values-fa/translations.xml +++ b/features/changeroommemberroles/impl/src/main/res/values-fa/translations.xml @@ -29,6 +29,10 @@ "اعضا" "تغییراتی ذخیره نشده دارید." "ذخیرهٔ تغییرات؟" + + "%1$d نفر" + "%1$d نفر" + "برداشت و تحریم عضو" "تنها برداشتن عضو" "رفع انسداد" diff --git a/features/changeroommemberroles/impl/src/main/res/values-in/translations.xml b/features/changeroommemberroles/impl/src/main/res/values-in/translations.xml index 1f25e9ada3..3bc68c154e 100644 --- a/features/changeroommemberroles/impl/src/main/res/values-in/translations.xml +++ b/features/changeroommemberroles/impl/src/main/res/values-in/translations.xml @@ -2,7 +2,7 @@ "Hanya admin" "Cekal orang-orang" - "Hapus pesan" + "Hilangkan pesan" "Semua orang" "Undang orang-orang dan terima permintaan untuk bergabung" "Moderasi anggota" diff --git a/features/changeroommemberroles/impl/src/main/res/values-sv/translations.xml b/features/changeroommemberroles/impl/src/main/res/values-sv/translations.xml index 9153ccc89f..a94b7384fa 100644 --- a/features/changeroommemberroles/impl/src/main/res/values-sv/translations.xml +++ b/features/changeroommemberroles/impl/src/main/res/values-sv/translations.xml @@ -17,13 +17,17 @@ "Redigera administratörer" "Du kommer inte att kunna ångra den här åtgärden. Du befordrar användaren till att ha samma behörighetsnivå som du." "Lägg till Admin?" + "Du kommer inte att kunna ångra den här åtgärden. Du överför ägarskapet till de valda användarna. När du lämnar kommer detta att vara permanent." + "Överför ägarskap?" "Degradera" "Du kommer inte att kunna ångra denna ändring eftersom du degraderar dig själv, om du är den sista privilegierade användaren i rummet kommer det att vara omöjligt att återfå privilegier." "Degradera dig själv?" "%1$s (Väntar)" "(Väntar)" "Administratörer har automatiskt moderatorbehörighet" + "Ägare har automatiskt administratörsbehörighet." "Redigera moderatorer" + "Välj ägare" "Administratörer" "Moderatorer" "Medlemmar" @@ -44,15 +48,18 @@ "Väntar" "Admin" "Moderator" + "Ägare" "Rumsmedlemmar" "Avbannar %1$s" "Administratörer" + "Administratörer och ägare" "Ändra min roll" "Degradera till medlem" "Degradera till moderator" "Medlemsmoderering" "Meddelanden och innehåll" "Moderatorer" + "Ägare" "Behörigheter" "Återställ behörigheter" "När du har återställt behörigheterna kommer du att förlora de aktuella inställningarna." diff --git a/features/changeroommemberroles/impl/src/main/res/values-zh-rTW/translations.xml b/features/changeroommemberroles/impl/src/main/res/values-zh-rTW/translations.xml index 0aaee24ce2..2ec5ec64c5 100644 --- a/features/changeroommemberroles/impl/src/main/res/values-zh-rTW/translations.xml +++ b/features/changeroommemberroles/impl/src/main/res/values-zh-rTW/translations.xml @@ -17,13 +17,17 @@ "編輯管理員" "您將無法復原此動作。您正將使用者提昇至與您相同的權力等級。" "要新增管理員嗎?" + "您將無法撤銷此動作。您正在將所有權轉移給選定的使用者。一旦您離開,此動作將永久有效。" + "轉移所有權?" "降級" "當您自行降級時,您將無法復原此變更,若您是聊天室中的最後一位特權使用者,則無法重新獲得權限。" "將自己降級?" "%1$s(擱置中)" "(擱置中)" "管理員自動擁有版主權限" + "擁有者自動擁有管理員權限。" "編輯版主" + "選擇擁有者" "管理員" "版主" "成員" @@ -43,15 +47,18 @@ "待定" "管理員" "版主" + "擁有者" "聊天室成員" "正在解除黑名單 %1$s" "管理員" + "管理員與擁有者" "變更我的身份" "降級為普通成員" "降級為版主" "成員管理" "訊息與內容" "版主" + "擁有者" "權限" "重設權限" "重設之後,您會遺失當前的設定。" diff --git a/features/createroom/api/src/main/kotlin/io/element/android/features/createroom/api/CreateRoomEntryPoint.kt b/features/createroom/api/src/main/kotlin/io/element/android/features/createroom/api/CreateRoomEntryPoint.kt index 3b35d0a3e1..5fc71f2a3b 100644 --- a/features/createroom/api/src/main/kotlin/io/element/android/features/createroom/api/CreateRoomEntryPoint.kt +++ b/features/createroom/api/src/main/kotlin/io/element/android/features/createroom/api/CreateRoomEntryPoint.kt @@ -1,5 +1,5 @@ /* - * Copyright 2023, 2024 New Vector Ltd. + * Copyright 2025 New Vector Ltd. * * SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial * Please see LICENSE files in the repository root for full details. @@ -11,17 +11,17 @@ 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.matrix.api.core.RoomIdOrAlias +import io.element.android.libraries.matrix.api.core.RoomId interface CreateRoomEntryPoint : FeatureEntryPoint { fun nodeBuilder(parentNode: Node, buildContext: BuildContext): NodeBuilder + interface NodeBuilder { fun callback(callback: Callback): NodeBuilder fun build(): Node } interface Callback : Plugin { - fun onOpenRoom(roomIdOrAlias: RoomIdOrAlias, serverNames: List) - fun onOpenRoomDirectory() + fun onRoomCreated(roomId: RoomId) } } diff --git a/features/createroom/impl/build.gradle.kts b/features/createroom/impl/build.gradle.kts index 769f7b5628..d2306837d0 100644 --- a/features/createroom/impl/build.gradle.kts +++ b/features/createroom/impl/build.gradle.kts @@ -1,4 +1,3 @@ -import extension.ComponentMergingStrategy import extension.setupAnvil /* @@ -23,7 +22,7 @@ android { } } -setupAnvil(componentMergingStrategy = ComponentMergingStrategy.KSP) +setupAnvil() dependencies { implementation(projects.libraries.core) @@ -33,7 +32,7 @@ dependencies { implementation(projects.libraries.designsystem) implementation(projects.libraries.uiStrings) implementation(projects.libraries.androidutils) - implementation(projects.libraries.deeplink) + implementation(projects.libraries.deeplink.api) implementation(projects.libraries.mediapickers.api) implementation(projects.libraries.mediaupload.api) implementation(projects.libraries.permissions.api) @@ -41,6 +40,7 @@ dependencies { implementation(projects.services.analytics.api) implementation(libs.coil.compose) implementation(projects.libraries.featureflag.api) + implementation(projects.features.invitepeople.api) api(projects.features.createroom.api) testImplementation(libs.test.junit) @@ -56,7 +56,7 @@ dependencies { testImplementation(projects.libraries.mediaupload.test) testImplementation(projects.libraries.permissions.test) testImplementation(projects.libraries.usersearch.test) - testImplementation(projects.features.createroom.test) + testImplementation(projects.features.startchat.test) testImplementation(projects.libraries.featureflag.test) testImplementation(projects.tests.testutils) testImplementation(libs.androidx.compose.ui.test.junit) diff --git a/features/createroom/impl/src/main/kotlin/io/element/android/features/createroom/impl/ConfigureRoomFlowNode.kt b/features/createroom/impl/src/main/kotlin/io/element/android/features/createroom/impl/ConfigureRoomFlowNode.kt deleted file mode 100644 index a7678f130f..0000000000 --- a/features/createroom/impl/src/main/kotlin/io/element/android/features/createroom/impl/ConfigureRoomFlowNode.kt +++ /dev/null @@ -1,83 +0,0 @@ -/* - * Copyright 2023, 2024 New Vector Ltd. - * - * SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial - * Please see LICENSE files in the repository root for full details. - */ - -package io.element.android.features.createroom.impl - -import android.os.Parcelable -import androidx.compose.runtime.Composable -import androidx.compose.ui.Modifier -import com.bumble.appyx.core.modality.BuildContext -import com.bumble.appyx.core.node.Node -import com.bumble.appyx.core.plugin.Plugin -import com.bumble.appyx.core.plugin.plugins -import com.bumble.appyx.navmodel.backstack.BackStack -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.createroom.CreateRoomNavigator -import io.element.android.features.createroom.impl.addpeople.AddPeopleNode -import io.element.android.features.createroom.impl.configureroom.ConfigureRoomNode -import io.element.android.features.createroom.impl.di.CreateRoomComponent -import io.element.android.libraries.architecture.BackstackView -import io.element.android.libraries.architecture.BaseFlowNode -import io.element.android.libraries.architecture.bindings -import io.element.android.libraries.architecture.createNode -import io.element.android.libraries.di.DaggerComponentOwner -import io.element.android.libraries.di.SessionScope -import kotlinx.parcelize.Parcelize - -@ContributesNode(SessionScope::class) -class ConfigureRoomFlowNode @AssistedInject constructor( - @Assisted buildContext: BuildContext, - @Assisted plugins: List, -) : DaggerComponentOwner, - BaseFlowNode( - backstack = BackStack( - initialElement = NavTarget.Root, - savedStateMap = buildContext.savedStateMap, - ), - buildContext = buildContext, - plugins = plugins - ) { - private val component by lazy { - parent!!.bindings().createRoomComponentBuilder().build() - } - private val navigator = plugins().first() - - override val daggerComponent: Any - get() = component - - sealed interface NavTarget : Parcelable { - @Parcelize - data object Root : NavTarget - - @Parcelize - data object ConfigureRoom : NavTarget - } - - override fun resolve(navTarget: NavTarget, buildContext: BuildContext): Node { - return when (navTarget) { - NavTarget.Root -> { - val callback = object : AddPeopleNode.Callback { - override fun onContinue() { - backstack.push(NavTarget.ConfigureRoom) - } - } - createNode(buildContext = buildContext, plugins = listOf(callback)) - } - NavTarget.ConfigureRoom -> { - createNode(buildContext = buildContext, plugins = listOf(navigator)) - } - } - } - - @Composable - override fun View(modifier: Modifier) { - BackstackView() - } -} diff --git a/features/createroom/impl/src/main/kotlin/io/element/android/features/createroom/impl/CreateRoomFlowNode.kt b/features/createroom/impl/src/main/kotlin/io/element/android/features/createroom/impl/CreateRoomFlowNode.kt index b8b755a0b3..6c819edf5a 100644 --- a/features/createroom/impl/src/main/kotlin/io/element/android/features/createroom/impl/CreateRoomFlowNode.kt +++ b/features/createroom/impl/src/main/kotlin/io/element/android/features/createroom/impl/CreateRoomFlowNode.kt @@ -1,5 +1,5 @@ /* - * Copyright 2023, 2024 New Vector Ltd. + * Copyright 2025 New Vector Ltd. * * SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial * Please see LICENSE files in the repository root for full details. @@ -8,28 +8,25 @@ package io.element.android.features.createroom.impl import android.os.Parcelable -import androidx.compose.foundation.layout.Box import androidx.compose.runtime.Composable -import androidx.compose.runtime.remember import androidx.compose.ui.Modifier import com.bumble.appyx.core.modality.BuildContext -import com.bumble.appyx.core.navigation.transition.JumpToEndTransitionHandler import com.bumble.appyx.core.node.Node import com.bumble.appyx.core.plugin.Plugin import com.bumble.appyx.core.plugin.plugins import com.bumble.appyx.navmodel.backstack.BackStack +import com.bumble.appyx.navmodel.backstack.operation.replace import dagger.assisted.Assisted import dagger.assisted.AssistedInject import io.element.android.anvilannotations.ContributesNode -import io.element.android.features.createroom.DefaultCreateRoomNavigator import io.element.android.features.createroom.api.CreateRoomEntryPoint -import io.element.android.features.createroom.impl.joinbyaddress.JoinRoomByAddressNode -import io.element.android.features.createroom.impl.root.CreateRoomRootNode +import io.element.android.features.createroom.impl.addpeople.AddPeopleNode +import io.element.android.features.createroom.impl.configureroom.ConfigureRoomNode import io.element.android.libraries.architecture.BackstackView import io.element.android.libraries.architecture.BaseFlowNode -import io.element.android.libraries.architecture.OverlayView import io.element.android.libraries.architecture.createNode import io.element.android.libraries.di.SessionScope +import io.element.android.libraries.matrix.api.core.RoomId import kotlinx.parcelize.Parcelize @ContributesNode(SessionScope::class) @@ -38,53 +35,48 @@ class CreateRoomFlowNode @AssistedInject constructor( @Assisted plugins: List, ) : BaseFlowNode( backstack = BackStack( - initialElement = NavTarget.Root, + initialElement = NavTarget.ConfigureRoom, savedStateMap = buildContext.savedStateMap, ), buildContext = buildContext, plugins = plugins ) { - sealed interface NavTarget : Parcelable { - @Parcelize - data object Root : NavTarget - - @Parcelize - data object NewRoom : NavTarget - - @Parcelize - data object JoinByAddress : NavTarget + private fun onRoomCreated(roomId: RoomId) { + plugins().forEach { it.onRoomCreated(roomId) } } - private val navigator = DefaultCreateRoomNavigator( - backstack = backstack, - overlay = overlay, - openRoom = { roomIdOrAlias, viaServers -> - plugins().forEach { it.onOpenRoom(roomIdOrAlias, viaServers) } - }, - openRoomDirectory = { - plugins().forEach { it.onOpenRoomDirectory() } - } - ) - override fun resolve(navTarget: NavTarget, buildContext: BuildContext): Node { return when (navTarget) { - NavTarget.Root -> { - createNode(buildContext = buildContext, plugins = listOf(navigator)) + NavTarget.ConfigureRoom -> { + val callback = object : ConfigureRoomNode.Callback { + override fun onCreateRoomSuccess(roomId: RoomId) { + backstack.replace(NavTarget.AddPeople(roomId)) + } + } + createNode(buildContext, plugins = listOf(callback)) } - NavTarget.NewRoom -> { - createNode(buildContext = buildContext, plugins = listOf(navigator)) - } - NavTarget.JoinByAddress -> { - createNode(buildContext = buildContext, plugins = listOf(navigator)) + is NavTarget.AddPeople -> { + val inputs = AddPeopleNode.Inputs(navTarget.roomId) + val callback: AddPeopleNode.Callback = object : AddPeopleNode.Callback { + override fun onFinish() { + onRoomCreated(navTarget.roomId) + } + } + createNode(buildContext, plugins = listOf(inputs, callback)) } } } @Composable override fun View(modifier: Modifier) { - Box(modifier = modifier) { - BackstackView() - OverlayView(transitionHandler = remember { JumpToEndTransitionHandler() }) - } + BackstackView() + } + + sealed interface NavTarget : Parcelable { + @Parcelize + data object ConfigureRoom : NavTarget + + @Parcelize + data class AddPeople(val roomId: RoomId) : NavTarget } } diff --git a/features/createroom/impl/src/main/kotlin/io/element/android/features/createroom/impl/DefaultCreateRoomEntryPoint.kt b/features/createroom/impl/src/main/kotlin/io/element/android/features/createroom/impl/DefaultCreateRoomEntryPoint.kt index 161d67e817..b9dfb20960 100644 --- a/features/createroom/impl/src/main/kotlin/io/element/android/features/createroom/impl/DefaultCreateRoomEntryPoint.kt +++ b/features/createroom/impl/src/main/kotlin/io/element/android/features/createroom/impl/DefaultCreateRoomEntryPoint.kt @@ -1,5 +1,5 @@ /* - * Copyright 2023, 2024 New Vector Ltd. + * Copyright 2025 New Vector Ltd. * * SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial * Please see LICENSE files in the repository root for full details. @@ -13,10 +13,10 @@ import com.bumble.appyx.core.plugin.Plugin import com.squareup.anvil.annotations.ContributesBinding import io.element.android.features.createroom.api.CreateRoomEntryPoint import io.element.android.libraries.architecture.createNode -import io.element.android.libraries.di.AppScope +import io.element.android.libraries.di.SessionScope import javax.inject.Inject -@ContributesBinding(AppScope::class) +@ContributesBinding(SessionScope::class) class DefaultCreateRoomEntryPoint @Inject constructor() : CreateRoomEntryPoint { override fun nodeBuilder(parentNode: Node, buildContext: BuildContext): CreateRoomEntryPoint.NodeBuilder { val plugins = ArrayList() diff --git a/features/createroom/impl/src/main/kotlin/io/element/android/features/createroom/impl/addpeople/AddPeopleNode.kt b/features/createroom/impl/src/main/kotlin/io/element/android/features/createroom/impl/addpeople/AddPeopleNode.kt index ba9eb82073..3fc9cd7d81 100644 --- a/features/createroom/impl/src/main/kotlin/io/element/android/features/createroom/impl/addpeople/AddPeopleNode.kt +++ b/features/createroom/impl/src/main/kotlin/io/element/android/features/createroom/impl/addpeople/AddPeopleNode.kt @@ -1,5 +1,5 @@ /* - * Copyright 2023, 2024 New Vector Ltd. + * Copyright 2025 New Vector Ltd. * * SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial * Please see LICENSE files in the repository root for full details. @@ -16,30 +16,46 @@ import com.bumble.appyx.core.plugin.plugins import dagger.assisted.Assisted import dagger.assisted.AssistedInject import io.element.android.anvilannotations.ContributesNode -import io.element.android.features.createroom.impl.di.CreateRoomScope +import io.element.android.features.invitepeople.api.InvitePeoplePresenter +import io.element.android.features.invitepeople.api.InvitePeopleRenderer +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 -@ContributesNode(CreateRoomScope::class) +@ContributesNode(SessionScope::class) class AddPeopleNode @AssistedInject constructor( @Assisted buildContext: BuildContext, @Assisted plugins: List, - private val presenter: AddPeoplePresenter, + invitePeoplePresenterFactory: InvitePeoplePresenter.Factory, + private val invitePeopleRenderer: InvitePeopleRenderer, ) : Node(buildContext, plugins = plugins) { + data class Inputs( + val roomId: RoomId, + ) : NodeInputs + interface Callback : Plugin { - fun onContinue() + fun onFinish() } - private fun onContinue() { - plugins().forEach { it.onContinue() } + private fun onFinish() { + plugins().forEach { it.onFinish() } } + private val roomId = inputs().roomId + private val invitePeoplePresenter = invitePeoplePresenterFactory.create( + joinedRoom = null, + roomId = roomId, + ) + @Composable override fun View(modifier: Modifier) { - val state = presenter.present() + val state = invitePeoplePresenter.present() AddPeopleView( state = state, - modifier = modifier, - onBackClick = this::navigateUp, - onNextClick = this::onContinue, - ) + onFinish = ::onFinish, + ) { + invitePeopleRenderer.Render(state, Modifier) + } } } diff --git a/features/createroom/impl/src/main/kotlin/io/element/android/features/createroom/impl/addpeople/AddPeoplePresenter.kt b/features/createroom/impl/src/main/kotlin/io/element/android/features/createroom/impl/addpeople/AddPeoplePresenter.kt deleted file mode 100644 index e050a0738e..0000000000 --- a/features/createroom/impl/src/main/kotlin/io/element/android/features/createroom/impl/addpeople/AddPeoplePresenter.kt +++ /dev/null @@ -1,37 +0,0 @@ -/* - * Copyright 2023, 2024 New Vector Ltd. - * - * SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial - * Please see LICENSE files in the repository root for full details. - */ - -package io.element.android.features.createroom.impl.addpeople - -import androidx.compose.runtime.Composable -import io.element.android.features.createroom.impl.CreateRoomDataStore -import io.element.android.features.createroom.impl.userlist.SelectionMode -import io.element.android.features.createroom.impl.userlist.UserListPresenter -import io.element.android.features.createroom.impl.userlist.UserListPresenterArgs -import io.element.android.features.createroom.impl.userlist.UserListState -import io.element.android.libraries.architecture.Presenter -import io.element.android.libraries.usersearch.api.UserRepository -import javax.inject.Inject - -class AddPeoplePresenter @Inject constructor( - userListPresenterFactory: UserListPresenter.Factory, - userRepository: UserRepository, - dataStore: CreateRoomDataStore, -) : Presenter { - private val userListPresenter = userListPresenterFactory.create( - UserListPresenterArgs( - selectionMode = SelectionMode.Multiple, - ), - userRepository, - dataStore.selectedUserListDataStore, - ) - - @Composable - override fun present(): UserListState { - return userListPresenter.present() - } -} diff --git a/features/createroom/impl/src/main/kotlin/io/element/android/features/createroom/impl/addpeople/AddPeopleUserListStateProvider.kt b/features/createroom/impl/src/main/kotlin/io/element/android/features/createroom/impl/addpeople/AddPeopleUserListStateProvider.kt deleted file mode 100644 index 9e0ddd04c8..0000000000 --- a/features/createroom/impl/src/main/kotlin/io/element/android/features/createroom/impl/addpeople/AddPeopleUserListStateProvider.kt +++ /dev/null @@ -1,46 +0,0 @@ -/* - * Copyright 2023, 2024 New Vector Ltd. - * - * SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial - * Please see LICENSE files in the repository root for full details. - */ - -package io.element.android.features.createroom.impl.addpeople - -import androidx.compose.ui.tooling.preview.PreviewParameterProvider -import io.element.android.features.createroom.impl.userlist.SelectionMode -import io.element.android.features.createroom.impl.userlist.UserListState -import io.element.android.features.createroom.impl.userlist.aRecentDirectRoomList -import io.element.android.features.createroom.impl.userlist.aUserListState -import io.element.android.libraries.designsystem.theme.components.SearchBarResultState -import io.element.android.libraries.matrix.ui.components.aMatrixUserList -import io.element.android.libraries.usersearch.api.UserSearchResult -import kotlinx.collections.immutable.toImmutableList - -open class AddPeopleUserListStateProvider : PreviewParameterProvider { - override val values: Sequence - get() = sequenceOf( - aUserListState(), - aUserListState( - searchResults = SearchBarResultState.Results(aMatrixUserList().toImmutableList()), - selectedUsers = aMatrixUserList().toImmutableList(), - isSearchActive = false, - selectionMode = SelectionMode.Multiple, - ), - aUserListState( - searchResults = SearchBarResultState.Results( - aMatrixUserList() - .mapIndexed { index, matrixUser -> - UserSearchResult(matrixUser, index % 2 == 0) - } - .toImmutableList() - ), - selectedUsers = aMatrixUserList().toImmutableList(), - isSearchActive = true, - selectionMode = SelectionMode.Multiple, - ), - aUserListState( - recentDirectRooms = aRecentDirectRoomList(), - ), - ) -} diff --git a/features/createroom/impl/src/main/kotlin/io/element/android/features/createroom/impl/addpeople/AddPeopleView.kt b/features/createroom/impl/src/main/kotlin/io/element/android/features/createroom/impl/addpeople/AddPeopleView.kt index d39ac4d250..1c9a5f84d3 100644 --- a/features/createroom/impl/src/main/kotlin/io/element/android/features/createroom/impl/addpeople/AddPeopleView.kt +++ b/features/createroom/impl/src/main/kotlin/io/element/android/features/createroom/impl/addpeople/AddPeopleView.kt @@ -1,5 +1,5 @@ /* - * Copyright 2022-2024 New Vector Ltd. + * Copyright 2025 New Vector Ltd. * * SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial * Please see LICENSE files in the repository root for full details. @@ -7,77 +7,68 @@ package io.element.android.features.createroom.impl.addpeople -import androidx.compose.foundation.layout.consumeWindowInsets -import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.foundation.layout.PaddingValues +import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.padding import androidx.compose.material3.ExperimentalMaterial3Api import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier import androidx.compose.ui.res.stringResource import androidx.compose.ui.tooling.preview.PreviewParameter +import androidx.compose.ui.unit.dp import io.element.android.features.createroom.impl.R -import io.element.android.features.createroom.impl.components.UserListView -import io.element.android.features.createroom.impl.userlist.UserListEvents -import io.element.android.features.createroom.impl.userlist.UserListState -import io.element.android.libraries.designsystem.components.button.BackButton +import io.element.android.features.invitepeople.api.InvitePeopleEvents +import io.element.android.features.invitepeople.api.InvitePeopleState +import io.element.android.features.invitepeople.api.InvitePeopleStateProvider +import io.element.android.libraries.designsystem.atomic.pages.HeaderFooterPage import io.element.android.libraries.designsystem.preview.ElementPreview import io.element.android.libraries.designsystem.preview.PreviewsDayNight -import io.element.android.libraries.designsystem.theme.components.Scaffold +import io.element.android.libraries.designsystem.theme.components.Button import io.element.android.libraries.designsystem.theme.components.TextButton import io.element.android.libraries.designsystem.theme.components.TopAppBar import io.element.android.libraries.ui.strings.CommonStrings @Composable fun AddPeopleView( - state: UserListState, - onBackClick: () -> Unit, - onNextClick: () -> Unit, + state: InvitePeopleState, + onFinish: () -> Unit, modifier: Modifier = Modifier, + invitePeopleView: @Composable () -> Unit, ) { - Scaffold( + HeaderFooterPage( modifier = modifier, + contentPadding = PaddingValues(0.dp), topBar = { - AddPeopleViewTopBar( - hasSelectedUsers = state.selectedUsers.isNotEmpty(), - onBackClick = { - if (state.isSearchActive) { - state.eventSink(UserListEvents.OnSearchActiveChanged(false)) - } else { - onBackClick() - } + AddPeopleTopBar(onSkipClick = onFinish) + }, + footer = { + Button( + text = stringResource(CommonStrings.action_finish), + onClick = { + state.eventSink(InvitePeopleEvents.SendInvites) + onFinish() }, - onNextClick = onNextClick, + enabled = state.canInvite, + modifier = Modifier + .fillMaxWidth() + .padding(bottom = 16.dp) ) - } - ) { padding -> - UserListView( - modifier = Modifier - .fillMaxSize() - .padding(padding) - .consumeWindowInsets(padding), - state = state, - showBackButton = false, - onSelectUser = {}, - onDeselectUser = {}, - ) - } + }, + content = invitePeopleView + ) } @OptIn(ExperimentalMaterial3Api::class) @Composable -private fun AddPeopleViewTopBar( - hasSelectedUsers: Boolean, - onBackClick: () -> Unit, - onNextClick: () -> Unit, +private fun AddPeopleTopBar( + onSkipClick: () -> Unit, ) { TopAppBar( - titleStr = stringResource(id = R.string.screen_create_room_add_people_title), - navigationIcon = { BackButton(onClick = onBackClick) }, + titleStr = stringResource(R.string.screen_create_room_add_people_title), actions = { - val textActionResId = if (hasSelectedUsers) CommonStrings.action_next else CommonStrings.action_skip TextButton( - text = stringResource(id = textActionResId), - onClick = onNextClick, + text = stringResource(CommonStrings.action_skip), + onClick = onSkipClick, ) } ) @@ -85,10 +76,10 @@ private fun AddPeopleViewTopBar( @PreviewsDayNight @Composable -internal fun AddPeopleViewPreview(@PreviewParameter(AddPeopleUserListStateProvider::class) state: UserListState) = ElementPreview { +internal fun AddPeopleViewPreview(@PreviewParameter(InvitePeopleStateProvider::class) state: InvitePeopleState) = ElementPreview { AddPeopleView( state = state, - onBackClick = {}, - onNextClick = {}, + invitePeopleView = {}, + onFinish = {}, ) } diff --git a/features/createroom/impl/src/main/kotlin/io/element/android/features/createroom/impl/configureroom/ConfigureRoomEvents.kt b/features/createroom/impl/src/main/kotlin/io/element/android/features/createroom/impl/configureroom/ConfigureRoomEvents.kt index 6885123f63..cd5470bc24 100644 --- a/features/createroom/impl/src/main/kotlin/io/element/android/features/createroom/impl/configureroom/ConfigureRoomEvents.kt +++ b/features/createroom/impl/src/main/kotlin/io/element/android/features/createroom/impl/configureroom/ConfigureRoomEvents.kt @@ -7,7 +7,6 @@ package io.element.android.features.createroom.impl.configureroom -import io.element.android.libraries.matrix.api.user.MatrixUser import io.element.android.libraries.matrix.ui.media.AvatarAction sealed interface ConfigureRoomEvents { @@ -16,7 +15,6 @@ sealed interface ConfigureRoomEvents { data class RoomVisibilityChanged(val visibilityItem: RoomVisibilityItem) : ConfigureRoomEvents data class RoomAccessChanged(val roomAccess: RoomAccessItem) : ConfigureRoomEvents data class RoomAddressChanged(val roomAddress: String) : ConfigureRoomEvents - data class RemoveUserFromSelection(val matrixUser: MatrixUser) : ConfigureRoomEvents data object CreateRoom : ConfigureRoomEvents data class HandleAvatarAction(val action: AvatarAction) : ConfigureRoomEvents data object CancelCreateRoom : ConfigureRoomEvents diff --git a/features/createroom/impl/src/main/kotlin/io/element/android/features/createroom/impl/configureroom/ConfigureRoomNode.kt b/features/createroom/impl/src/main/kotlin/io/element/android/features/createroom/impl/configureroom/ConfigureRoomNode.kt index e718825163..6927c51366 100644 --- a/features/createroom/impl/src/main/kotlin/io/element/android/features/createroom/impl/configureroom/ConfigureRoomNode.kt +++ b/features/createroom/impl/src/main/kotlin/io/element/android/features/createroom/impl/configureroom/ConfigureRoomNode.kt @@ -18,19 +18,20 @@ import dagger.assisted.Assisted import dagger.assisted.AssistedInject import im.vector.app.features.analytics.plan.MobileScreen import io.element.android.anvilannotations.ContributesNode -import io.element.android.features.createroom.CreateRoomNavigator -import io.element.android.features.createroom.impl.di.CreateRoomScope -import io.element.android.libraries.matrix.api.core.toRoomIdOrAlias +import io.element.android.libraries.di.SessionScope +import io.element.android.libraries.matrix.api.core.RoomId import io.element.android.services.analytics.api.AnalyticsService -@ContributesNode(CreateRoomScope::class) +@ContributesNode(SessionScope::class) class ConfigureRoomNode @AssistedInject constructor( @Assisted buildContext: BuildContext, @Assisted plugins: List, private val presenter: ConfigureRoomPresenter, private val analyticsService: AnalyticsService, ) : Node(buildContext, plugins = plugins) { - private val navigator = plugins().first() + interface Callback : Plugin { + fun onCreateRoomSuccess(roomId: RoomId) + } init { lifecycle.subscribe( @@ -40,6 +41,10 @@ class ConfigureRoomNode @AssistedInject constructor( ) } + private fun onCreateRoomSuccess(roomId: RoomId) { + plugins().forEach { it.onCreateRoomSuccess(roomId) } + } + @Composable override fun View(modifier: Modifier) { val state = presenter.present() @@ -47,9 +52,7 @@ class ConfigureRoomNode @AssistedInject constructor( state = state, modifier = modifier, onBackClick = this::navigateUp, - onCreateRoomSuccess = { - navigator.onOpenRoom(roomIdOrAlias = it.toRoomIdOrAlias(), serverNames = emptyList()) - }, + onCreateRoomSuccess = ::onCreateRoomSuccess, ) } } diff --git a/features/createroom/impl/src/main/kotlin/io/element/android/features/createroom/impl/configureroom/ConfigureRoomPresenter.kt b/features/createroom/impl/src/main/kotlin/io/element/android/features/createroom/impl/configureroom/ConfigureRoomPresenter.kt index a3e8f67edf..9b2880fb6f 100644 --- a/features/createroom/impl/src/main/kotlin/io/element/android/features/createroom/impl/configureroom/ConfigureRoomPresenter.kt +++ b/features/createroom/impl/src/main/kotlin/io/element/android/features/createroom/impl/configureroom/ConfigureRoomPresenter.kt @@ -18,8 +18,6 @@ import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.remember import androidx.compose.runtime.rememberCoroutineScope import im.vector.app.features.analytics.plan.CreatedRoom -import io.element.android.features.createroom.impl.CreateRoomConfig -import io.element.android.features.createroom.impl.CreateRoomDataStore import io.element.android.libraries.architecture.AsyncAction import io.element.android.libraries.architecture.Presenter import io.element.android.libraries.architecture.runCatchingUpdatingState @@ -50,7 +48,7 @@ import javax.inject.Inject import kotlin.jvm.optionals.getOrDefault class ConfigureRoomPresenter @Inject constructor( - private val dataStore: CreateRoomDataStore, + private val dataStore: CreateRoomConfigStore, private val matrixClient: MatrixClient, private val mediaPickerProvider: PickerProvider, private val mediaPreProcessor: MediaPreProcessor, @@ -66,7 +64,7 @@ class ConfigureRoomPresenter @Inject constructor( @Composable override fun present(): ConfigureRoomState { val cameraPermissionState = cameraPermissionPresenter.present() - val createRoomConfig by dataStore.createRoomConfigWithInvites.collectAsState(CreateRoomConfig()) + val createRoomConfig by dataStore.getCreateRoomConfigFlow().collectAsState(CreateRoomConfig()) val homeserverName = remember { matrixClient.userIdServerName() } val isKnockFeatureEnabled by remember { featureFlagService.isFeatureEnabledFlow(FeatureFlags.Knock) @@ -121,7 +119,6 @@ class ConfigureRoomPresenter @Inject constructor( is ConfigureRoomEvents.RoomNameChanged -> dataStore.setRoomName(event.name) is ConfigureRoomEvents.TopicChanged -> dataStore.setTopic(event.topic) is ConfigureRoomEvents.RoomVisibilityChanged -> dataStore.setRoomVisibility(event.visibilityItem) - is ConfigureRoomEvents.RemoveUserFromSelection -> dataStore.selectedUserListDataStore.removeUserFromSelection(event.matrixUser) is ConfigureRoomEvents.RoomAccessChanged -> dataStore.setRoomAccess(event.roomAccess) is ConfigureRoomEvents.RoomAddressChanged -> dataStore.setRoomAddress(event.roomAddress) is ConfigureRoomEvents.CreateRoom -> createRoom(createRoomConfig) @@ -206,6 +203,6 @@ class ConfigureRoomPresenter @Inject constructor( mediaOptimizationConfig = mediaOptimizationConfigProvider.get(), ).getOrThrow() val byteArray = preprocessed.file.readBytes() - return matrixClient.uploadMedia(MimeTypes.Jpeg, byteArray, null).getOrThrow() + return matrixClient.uploadMedia(MimeTypes.Jpeg, byteArray).getOrThrow() } } diff --git a/features/createroom/impl/src/main/kotlin/io/element/android/features/createroom/impl/configureroom/ConfigureRoomState.kt b/features/createroom/impl/src/main/kotlin/io/element/android/features/createroom/impl/configureroom/ConfigureRoomState.kt index 6651d16604..90022a9204 100644 --- a/features/createroom/impl/src/main/kotlin/io/element/android/features/createroom/impl/configureroom/ConfigureRoomState.kt +++ b/features/createroom/impl/src/main/kotlin/io/element/android/features/createroom/impl/configureroom/ConfigureRoomState.kt @@ -7,7 +7,6 @@ package io.element.android.features.createroom.impl.configureroom -import io.element.android.features.createroom.impl.CreateRoomConfig import io.element.android.libraries.architecture.AsyncAction import io.element.android.libraries.matrix.api.core.RoomId import io.element.android.libraries.matrix.ui.media.AvatarAction diff --git a/features/createroom/impl/src/main/kotlin/io/element/android/features/createroom/impl/configureroom/ConfigureRoomStateProvider.kt b/features/createroom/impl/src/main/kotlin/io/element/android/features/createroom/impl/configureroom/ConfigureRoomStateProvider.kt index 71568dbbc7..7db8744408 100644 --- a/features/createroom/impl/src/main/kotlin/io/element/android/features/createroom/impl/configureroom/ConfigureRoomStateProvider.kt +++ b/features/createroom/impl/src/main/kotlin/io/element/android/features/createroom/impl/configureroom/ConfigureRoomStateProvider.kt @@ -8,7 +8,6 @@ package io.element.android.features.createroom.impl.configureroom import androidx.compose.ui.tooling.preview.PreviewParameterProvider -import io.element.android.features.createroom.impl.CreateRoomConfig import io.element.android.libraries.architecture.AsyncAction import io.element.android.libraries.matrix.api.core.RoomId import io.element.android.libraries.matrix.ui.components.aMatrixUserList diff --git a/features/createroom/impl/src/main/kotlin/io/element/android/features/createroom/impl/configureroom/ConfigureRoomView.kt b/features/createroom/impl/src/main/kotlin/io/element/android/features/createroom/impl/configureroom/ConfigureRoomView.kt index f639704890..8c56607a22 100644 --- a/features/createroom/impl/src/main/kotlin/io/element/android/features/createroom/impl/configureroom/ConfigureRoomView.kt +++ b/features/createroom/impl/src/main/kotlin/io/element/android/features/createroom/impl/configureroom/ConfigureRoomView.kt @@ -12,7 +12,6 @@ import androidx.compose.foundation.clickable import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.ColumnScope -import androidx.compose.foundation.layout.PaddingValues import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.Spacer import androidx.compose.foundation.layout.consumeWindowInsets @@ -58,7 +57,6 @@ import io.element.android.libraries.designsystem.theme.components.TextField import io.element.android.libraries.designsystem.theme.components.TopAppBar import io.element.android.libraries.matrix.api.core.RoomId import io.element.android.libraries.matrix.ui.components.AvatarActionBottomSheet -import io.element.android.libraries.matrix.ui.components.SelectedUsersRowList import io.element.android.libraries.matrix.ui.components.UnsavedAvatar import io.element.android.libraries.matrix.ui.room.address.RoomAddressField import io.element.android.libraries.permissions.api.PermissionsView @@ -112,16 +110,6 @@ fun ConfigureRoomView( topic = state.config.topic.orEmpty(), onTopicChange = { state.eventSink(ConfigureRoomEvents.TopicChanged(it)) }, ) - if (state.config.invites.isNotEmpty()) { - SelectedUsersRowList( - contentPadding = PaddingValues(horizontal = 24.dp), - selectedUsers = state.config.invites, - onUserRemove = { - focusManager.clearFocus() - state.eventSink(ConfigureRoomEvents.RemoveUserFromSelection(it)) - }, - ) - } RoomVisibilityOptions( selected = when (state.config.roomVisibility) { is RoomVisibilityState.Private -> RoomVisibilityItem.Private diff --git a/features/createroom/impl/src/main/kotlin/io/element/android/features/createroom/impl/CreateRoomConfig.kt b/features/createroom/impl/src/main/kotlin/io/element/android/features/createroom/impl/configureroom/CreateRoomConfig.kt similarity index 82% rename from features/createroom/impl/src/main/kotlin/io/element/android/features/createroom/impl/CreateRoomConfig.kt rename to features/createroom/impl/src/main/kotlin/io/element/android/features/createroom/impl/configureroom/CreateRoomConfig.kt index 4cfa6158b8..9ec71f5b76 100644 --- a/features/createroom/impl/src/main/kotlin/io/element/android/features/createroom/impl/CreateRoomConfig.kt +++ b/features/createroom/impl/src/main/kotlin/io/element/android/features/createroom/impl/configureroom/CreateRoomConfig.kt @@ -5,10 +5,9 @@ * Please see LICENSE files in the repository root for full details. */ -package io.element.android.features.createroom.impl +package io.element.android.features.createroom.impl.configureroom import android.net.Uri -import io.element.android.features.createroom.impl.configureroom.RoomVisibilityState import io.element.android.libraries.matrix.api.user.MatrixUser import kotlinx.collections.immutable.ImmutableList import kotlinx.collections.immutable.persistentListOf diff --git a/features/createroom/impl/src/main/kotlin/io/element/android/features/createroom/impl/CreateRoomDataStore.kt b/features/createroom/impl/src/main/kotlin/io/element/android/features/createroom/impl/configureroom/CreateRoomConfigStore.kt similarity index 78% rename from features/createroom/impl/src/main/kotlin/io/element/android/features/createroom/impl/CreateRoomDataStore.kt rename to features/createroom/impl/src/main/kotlin/io/element/android/features/createroom/impl/configureroom/CreateRoomConfigStore.kt index 29b1525f51..bee9b686d6 100644 --- a/features/createroom/impl/src/main/kotlin/io/element/android/features/createroom/impl/CreateRoomDataStore.kt +++ b/features/createroom/impl/src/main/kotlin/io/element/android/features/createroom/impl/configureroom/CreateRoomConfigStore.kt @@ -5,45 +5,29 @@ * Please see LICENSE files in the repository root for full details. */ -package io.element.android.features.createroom.impl +package io.element.android.features.createroom.impl.configureroom import android.net.Uri -import io.element.android.features.createroom.impl.configureroom.RoomAccess -import io.element.android.features.createroom.impl.configureroom.RoomAccessItem -import io.element.android.features.createroom.impl.configureroom.RoomAddress -import io.element.android.features.createroom.impl.configureroom.RoomVisibilityItem -import io.element.android.features.createroom.impl.configureroom.RoomVisibilityState -import io.element.android.features.createroom.impl.di.CreateRoomScope -import io.element.android.features.createroom.impl.userlist.UserListDataStore import io.element.android.libraries.androidutils.file.safeDelete -import io.element.android.libraries.di.SingleIn import io.element.android.libraries.matrix.api.room.alias.RoomAliasHelper -import kotlinx.collections.immutable.toImmutableList -import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.MutableStateFlow -import kotlinx.coroutines.flow.combine +import kotlinx.coroutines.flow.StateFlow import kotlinx.coroutines.flow.getAndUpdate import java.io.File import javax.inject.Inject -@SingleIn(CreateRoomScope::class) -class CreateRoomDataStore @Inject constructor( - val selectedUserListDataStore: UserListDataStore, +class CreateRoomConfigStore @Inject constructor( private val roomAliasHelper: RoomAliasHelper, ) { private val createRoomConfigFlow: MutableStateFlow = MutableStateFlow(CreateRoomConfig()) + private var cachedAvatarUri: Uri? = null set(value) { field?.path?.let { File(it) }?.safeDelete() field = value } - val createRoomConfigWithInvites: Flow = combine( - selectedUserListDataStore.selectedUsers, - createRoomConfigFlow, - ) { selectedUsers, config -> - config.copy(invites = selectedUsers.toImmutableList()) - } + fun getCreateRoomConfigFlow(): StateFlow = createRoomConfigFlow fun setRoomName(roomName: String) { createRoomConfigFlow.getAndUpdate { config -> diff --git a/features/createroom/impl/src/main/kotlin/io/element/android/features/createroom/impl/di/CreateRoomComponent.kt b/features/createroom/impl/src/main/kotlin/io/element/android/features/createroom/impl/di/CreateRoomComponent.kt deleted file mode 100644 index b47b8c30e5..0000000000 --- a/features/createroom/impl/src/main/kotlin/io/element/android/features/createroom/impl/di/CreateRoomComponent.kt +++ /dev/null @@ -1,28 +0,0 @@ -/* - * Copyright 2023, 2024 New Vector Ltd. - * - * SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial - * Please see LICENSE files in the repository root for full details. - */ - -package io.element.android.features.createroom.impl.di - -import com.squareup.anvil.annotations.ContributesTo -import com.squareup.anvil.annotations.MergeSubcomponent -import io.element.android.libraries.architecture.NodeFactoriesBindings -import io.element.android.libraries.di.SessionScope -import io.element.android.libraries.di.SingleIn - -@SingleIn(CreateRoomScope::class) -@MergeSubcomponent(CreateRoomScope::class) -interface CreateRoomComponent : NodeFactoriesBindings { - @MergeSubcomponent.Builder - interface Builder { - fun build(): CreateRoomComponent - } - - @ContributesTo(SessionScope::class) - interface ParentBindings { - fun createRoomComponentBuilder(): Builder - } -} diff --git a/features/createroom/impl/src/main/kotlin/io/element/android/features/createroom/impl/root/CreateRoomRootEvents.kt b/features/createroom/impl/src/main/kotlin/io/element/android/features/createroom/impl/root/CreateRoomRootEvents.kt deleted file mode 100644 index bc3c4a39b9..0000000000 --- a/features/createroom/impl/src/main/kotlin/io/element/android/features/createroom/impl/root/CreateRoomRootEvents.kt +++ /dev/null @@ -1,15 +0,0 @@ -/* - * Copyright 2023, 2024 New Vector Ltd. - * - * SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial - * Please see LICENSE files in the repository root for full details. - */ - -package io.element.android.features.createroom.impl.root - -import io.element.android.libraries.matrix.api.user.MatrixUser - -sealed interface CreateRoomRootEvents { - data class StartDM(val matrixUser: MatrixUser) : CreateRoomRootEvents - data object CancelStartDM : CreateRoomRootEvents -} diff --git a/features/createroom/impl/src/main/res/values-be/translations.xml b/features/createroom/impl/src/main/res/values-be/translations.xml index 8acb990b02..f5d6a234e2 100644 --- a/features/createroom/impl/src/main/res/values-be/translations.xml +++ b/features/createroom/impl/src/main/res/values-be/translations.xml @@ -14,6 +14,4 @@ "Назва пакоя" "Стварыце пакой" "Тэма (неабавязкова)" - "Каталог пакояў" - "Пры спробе пачаць чат адбылася памылка" diff --git a/features/createroom/impl/src/main/res/values-bg/translations.xml b/features/createroom/impl/src/main/res/values-bg/translations.xml index fa6dae371c..249058b7af 100644 --- a/features/createroom/impl/src/main/res/values-bg/translations.xml +++ b/features/createroom/impl/src/main/res/values-bg/translations.xml @@ -15,9 +15,4 @@ "Видимост на стаята" "Създаване на стая" "Тема за разговор (незадължително)" - "Присъединяване към стая по адрес" - "Не е валиден адрес" - "Въведете…" - "Стаята не е намерена" - "напр. #room-name:matrix.org" diff --git a/features/createroom/impl/src/main/res/values-cs/translations.xml b/features/createroom/impl/src/main/res/values-cs/translations.xml index 53592e0db0..e19cfbcf91 100644 --- a/features/createroom/impl/src/main/res/values-cs/translations.xml +++ b/features/createroom/impl/src/main/res/values-cs/translations.xml @@ -19,12 +19,4 @@ To můžete kdykoli změnit v nastavení místnosti." "Viditelnost místnosti" "Vytvořit místnost" "Téma (nepovinné)" - "Adresář místností" - "Při pokusu o zahájení chatu došlo k chybě" - "Vstoupit do místnosti pomocí adresy" - "Neplatná adresa" - "Zadejte…" - "Odpovídající místnost nalezena" - "Místnost nebyla nalezena" - "např. #room-name:matrix.org" diff --git a/features/createroom/impl/src/main/res/values-cy/translations.xml b/features/createroom/impl/src/main/res/values-cy/translations.xml index a3a9e30e35..52168014bf 100644 --- a/features/createroom/impl/src/main/res/values-cy/translations.xml +++ b/features/createroom/impl/src/main/res/values-cy/translations.xml @@ -19,12 +19,4 @@ Gallwch newid hyn unrhyw bryd yng ngosodiadau ystafell." "Gwelededd yr ystafell" "Creu ystafell" "Pwnc (dewisol)" - "Cyfeiriadur ystafelloedd" - "Digwyddodd gwall wrth geisio cychwyn sgwrs" - "Ymuno â\'r ystafell yn ôl cyfeiriad" - "Ddim yn gyfeiriad dilys" - "Ewch i mewn…" - "Cafwyd hyd i ystafell gyfatebol" - "Heb ganfod yr ystafell" - "e.e. #enw-ystafell:matrix.org" diff --git a/features/createroom/impl/src/main/res/values-da/translations.xml b/features/createroom/impl/src/main/res/values-da/translations.xml index c9c182b474..a8f66f60db 100644 --- a/features/createroom/impl/src/main/res/values-da/translations.xml +++ b/features/createroom/impl/src/main/res/values-da/translations.xml @@ -19,12 +19,4 @@ Du kan ændre dette når som helst i rummets indstillinger." "Rummets synlighed" "Opret et rum" "Emne (valgfrit)" - "Register over rum" - "Der opstod en fejl under forsøget på at starte en samtale" - "Tilslut dig rummet med adressen" - "Ikke en gyldig adresse" - "Indtast…" - "Matchende rum fundet" - "Rum ikke fundet" - "f.eks. #rummets-navn:matrix.org" diff --git a/features/createroom/impl/src/main/res/values-de/translations.xml b/features/createroom/impl/src/main/res/values-de/translations.xml index 90438aa38c..213d10ae7a 100644 --- a/features/createroom/impl/src/main/res/values-de/translations.xml +++ b/features/createroom/impl/src/main/res/values-de/translations.xml @@ -19,12 +19,4 @@ Sie können dies aber jederzeit in den Chatroomeinstellungen ändern." " Sichtbarkeit des Chatrooms" "Raum erstellen" "Thema (optional)" - "Raum-Verzeichnis" - "Beim Versuch, einen Chat zu starten, ist ein Fehler aufgetreten" - "Raum per Adresse betreten" - "Keine gültige Adresse" - "Eintreten…" - "Passender Raum gefunden" - "Raum nicht gefunden" - "z. B. #room -name:matrix.org" diff --git a/features/createroom/impl/src/main/res/values-el/translations.xml b/features/createroom/impl/src/main/res/values-el/translations.xml index c036b43a05..a3084a4e70 100644 --- a/features/createroom/impl/src/main/res/values-el/translations.xml +++ b/features/createroom/impl/src/main/res/values-el/translations.xml @@ -19,12 +19,4 @@ "Ορατότητα αίθουσας" "Δημιουργία αίθουσας" "Θέμα (προαιρετικό)" - "Κατάλογος αιθουσών" - "Παρουσιάστηκε σφάλμα κατά την προσπάθεια έναρξης μιας συνομιλίας" - "Συμμετοχή σε αίθουσα μέσω διεύθυνσης" - "Μη έγκυρη διεύθυνση" - "Εισάγετε…" - "Βρέθηκε η αντίστοιχη αίθουσα" - "Η αίθουσα δεν βρέθηκε" - "π.χ. #όνομα-αίθουσας:matrix.org" diff --git a/features/createroom/impl/src/main/res/values-es/translations.xml b/features/createroom/impl/src/main/res/values-es/translations.xml index c11f08fc14..521f761174 100644 --- a/features/createroom/impl/src/main/res/values-es/translations.xml +++ b/features/createroom/impl/src/main/res/values-es/translations.xml @@ -19,12 +19,4 @@ Puedes cambiar esto en cualquier momento en los ajustes de la sala." "Visibilidad de la sala" "Crear una sala" "Tema (opcional)" - "Directorio de salas" - "Se ha producido un error al intentar iniciar un chat" - "Unirse a una sala por su dirección" - "Dirección no válida" - "Introducir…" - "Sala encontrada" - "No se encontró la sala" - "p. ej., #nombre-de-la-sala:matrix.org" diff --git a/features/createroom/impl/src/main/res/values-et/translations.xml b/features/createroom/impl/src/main/res/values-et/translations.xml index 57a26106b3..6a1d9dc58a 100644 --- a/features/createroom/impl/src/main/res/values-et/translations.xml +++ b/features/createroom/impl/src/main/res/values-et/translations.xml @@ -19,12 +19,4 @@ Sa võid seda jututoa seadistustest alati muuta." "Jututoa nähtavus" "Loo jututuba" "Teema (kui soovid lisada)" - "Jututubade kataloog" - "Vestluse alustamisel tekkis viga" - "Liitu jututoaga aadressi alusel" - "See pole kehtiv aadress" - "Sisene…" - "Leidsime vastava jututoa" - "Jututuba ei leidu" - "nt. #jututoa-nimi:matrix.org" diff --git a/features/createroom/impl/src/main/res/values-eu/translations.xml b/features/createroom/impl/src/main/res/values-eu/translations.xml index 43f67e429c..537aa495a5 100644 --- a/features/createroom/impl/src/main/res/values-eu/translations.xml +++ b/features/createroom/impl/src/main/res/values-eu/translations.xml @@ -16,8 +16,4 @@ Gelaren ezarpenetan aldatu dezakezu hobespena." "Gelaren ikusgarritasuna" "Sortu gela" "Mintzagaia (aukerakoa)" - "Gelen direktorioa" - "Errorea gertatu da txata hasten saiatzean" - "Sartu…" - "Ez da gela aurkitu" diff --git a/features/createroom/impl/src/main/res/values-fa/translations.xml b/features/createroom/impl/src/main/res/values-fa/translations.xml index 03bc5c3f58..09869c76f6 100644 --- a/features/createroom/impl/src/main/res/values-fa/translations.xml +++ b/features/createroom/impl/src/main/res/values-fa/translations.xml @@ -17,12 +17,4 @@ "نمایانی اتاق" "ایجاد اتاق" "موضوع (اختیاری)" - "فهرست اتاق‌ها" - "هنگام تلاش برای شروع چت خطایی روی داد" - "پیوستن به اتاق با نشانی" - "نشانی معتبری نیست" - "ورود…" - "اتاق مطابق پیدا شد" - "اتاق پیدا نشد" - "نمونه: ‪#room-name:matrix.org" diff --git a/features/createroom/impl/src/main/res/values-fi/translations.xml b/features/createroom/impl/src/main/res/values-fi/translations.xml index cdb6d04d59..31589ab997 100644 --- a/features/createroom/impl/src/main/res/values-fi/translations.xml +++ b/features/createroom/impl/src/main/res/values-fi/translations.xml @@ -19,12 +19,4 @@ Voit muuttaa tämän milloin tahansa huoneen asetuksista." "Huoneen näkyvyys" "Luo huone" "Aihe (valinnainen)" - "Huoneluettelo" - "Keskustelun aloituksessa tapahtui virhe" - "Liity huoneeseen osoitteella" - "Osoite ei ole kelvollinen" - "Syötä…" - "Täsmäävä huone löytyi" - "Huonetta ei löytynyt" - "esim. #huoneen-nimi:matrix.org" diff --git a/features/createroom/impl/src/main/res/values-fr/translations.xml b/features/createroom/impl/src/main/res/values-fr/translations.xml index 3f9e01dc85..afbdc919ba 100644 --- a/features/createroom/impl/src/main/res/values-fr/translations.xml +++ b/features/createroom/impl/src/main/res/values-fr/translations.xml @@ -19,12 +19,4 @@ Vous pouvez modifier cela à tout moment dans les paramètres du salon.""Visibilité du salon" "Créer un salon" "Sujet (facultatif)" - "Annuaire des salons" - "Une erreur s’est produite lors de la tentative de création de la discussion" - "Saisir une adresse de salon" - "Ce n’est pas une adresse valide" - "Saisir…" - "Ce salon existe" - "Salon non trouvé" - "ex: #nom-du-salon:matrix.org" diff --git a/features/createroom/impl/src/main/res/values-hu/translations.xml b/features/createroom/impl/src/main/res/values-hu/translations.xml index 1e4a721279..8833afcdec 100644 --- a/features/createroom/impl/src/main/res/values-hu/translations.xml +++ b/features/createroom/impl/src/main/res/values-hu/translations.xml @@ -19,12 +19,4 @@ Ezt bármikor módosíthatja a szobabeállításokban." "Szoba láthatósága" "Szoba létrehozása" "Téma (nem kötelező)" - "Szobakatalógus" - "Hiba történt a csevegés indításakor" - "Csatlakozás a szobához cím szerint" - "Nem érvényes cím" - "Írja be…" - "Megfelelő szoba található" - "Szoba nem található" - "pl. #szoba-neve:matrix.org" diff --git a/features/createroom/impl/src/main/res/values-in/translations.xml b/features/createroom/impl/src/main/res/values-in/translations.xml index 65f135e617..219f621068 100644 --- a/features/createroom/impl/src/main/res/values-in/translations.xml +++ b/features/createroom/impl/src/main/res/values-in/translations.xml @@ -19,12 +19,4 @@ Anda dapat mengubah ini kapan pun dalam pengaturan ruangan." "Keterlihatan ruangan" "Buat ruangan" "Topik (opsional)" - "Direktori ruangan" - "Terjadi kesalahan saat mencoba memulai obrolan" - "Bergabung dalam ruangan berdasarkan alamat" - "Bukan alamat yang valid" - "Masuk…" - "Ruangan yang cocok ditemukan" - "Ruangan tidak ditemukan" - "mis. #nama-ruangan:matrix.org" diff --git a/features/createroom/impl/src/main/res/values-it/translations.xml b/features/createroom/impl/src/main/res/values-it/translations.xml index 701ebc967f..741b88b763 100644 --- a/features/createroom/impl/src/main/res/values-it/translations.xml +++ b/features/createroom/impl/src/main/res/values-it/translations.xml @@ -19,12 +19,4 @@ Puoi modificarlo in qualsiasi momento nelle impostazioni della stanza." "Visibilità della stanza" "Crea una stanza" "Argomento (facoltativo)" - "Elenco delle stanze" - "Si è verificato un errore durante il tentativo di avviare una chat" - "Accedi alla stanza tramite indirizzo" - "Indirizzo non valido" - "Inserisci…" - "Stanza trovata" - "Stanza non trovata" - "ad esempio #room -name:matrix.org" diff --git a/features/createroom/impl/src/main/res/values-ka/translations.xml b/features/createroom/impl/src/main/res/values-ka/translations.xml index bb4a430320..20c7af40de 100644 --- a/features/createroom/impl/src/main/res/values-ka/translations.xml +++ b/features/createroom/impl/src/main/res/values-ka/translations.xml @@ -10,6 +10,4 @@ "ოთახის სახელი" "ოთახის შექმნა" "თემა (სურვილისამებრ)" - "ოთახის კატალოგი" - "ჩატის დაწყების მცდელობისას შეცდომა მოხდა" diff --git a/features/createroom/impl/src/main/res/values-lt/translations.xml b/features/createroom/impl/src/main/res/values-lt/translations.xml index 2f7a4438ea..2fb7b3eb5c 100644 --- a/features/createroom/impl/src/main/res/values-lt/translations.xml +++ b/features/createroom/impl/src/main/res/values-lt/translations.xml @@ -10,5 +10,4 @@ Tai galite bet kada pakeisti kambario nustatymuose." "Kambario pavadinimas" "Kurti kambarį" "Tema (nebūtina)" - "Bandant pradėti pokalbį įvyko klaida" diff --git a/features/createroom/impl/src/main/res/values-nb/translations.xml b/features/createroom/impl/src/main/res/values-nb/translations.xml index 9266993fd4..e6021cf5ac 100644 --- a/features/createroom/impl/src/main/res/values-nb/translations.xml +++ b/features/createroom/impl/src/main/res/values-nb/translations.xml @@ -19,12 +19,4 @@ Du kan endre dette når som helst i rominnstillingene." "Romsynlighet" "Opprett et rom" "Emne (valgfritt)" - "Romkatalog" - "Det oppstod en feil når du prøvde å starte en chat" - "Bli med i rommet med adresse" - "Ikke en gyldig adresse" - "Gå inn…" - "Matchende rom funnet" - "Rom ikke funnet" - "f.eks. #rom-navn:matrix.org" diff --git a/features/createroom/impl/src/main/res/values-nl/translations.xml b/features/createroom/impl/src/main/res/values-nl/translations.xml index 29d070a263..5142148171 100644 --- a/features/createroom/impl/src/main/res/values-nl/translations.xml +++ b/features/createroom/impl/src/main/res/values-nl/translations.xml @@ -16,6 +16,4 @@ Je kunt dit op elk gewenst moment wijzigen in de kamerinstellingen." "Naam van de kamer" "Creëer een kamer" "Onderwerp (optioneel)" - "Kamergids" - "Er is een fout opgetreden bij het starten van een chat" diff --git a/features/createroom/impl/src/main/res/values-pl/translations.xml b/features/createroom/impl/src/main/res/values-pl/translations.xml index 3ed917b7bb..446644b622 100644 --- a/features/createroom/impl/src/main/res/values-pl/translations.xml +++ b/features/createroom/impl/src/main/res/values-pl/translations.xml @@ -19,12 +19,4 @@ Możesz to zmienić w ustawieniach pokoju." "Widoczność pomieszczenia" "Utwórz pokój" "Temat (opcjonalnie)" - "Katalog pokoi" - "Wystąpił błąd podczas próby rozpoczęcia czatu" - "Dołącz do pokoju za pomocą adresu" - "Nieprawidłowy adres" - "Wprowadź…" - "Znaleziono pasujący pokój" - "Nie znaleziono pokoju" - "np. #room-name:matrix.org" diff --git a/features/createroom/impl/src/main/res/values-pt-rBR/translations.xml b/features/createroom/impl/src/main/res/values-pt-rBR/translations.xml index 52c9f569af..1b1e9f2d1b 100644 --- a/features/createroom/impl/src/main/res/values-pt-rBR/translations.xml +++ b/features/createroom/impl/src/main/res/values-pt-rBR/translations.xml @@ -19,12 +19,4 @@ Você pode mudar isso a qualquer momento nas configurações da sala." "Visibilidade da sala" "Criar uma sala" "Tópico (opcional)" - "Diretório de salas" - "Ocorreu um erro ao tentar iniciar um chat" - "Entrar na sala pelo endereço" - "Não é um endereço válido" - "Entrar…" - "Foi encontrada uma sala correspondente" - "Sala não encontrada" - "Por exemplo, #nome-da-sala:matrix.org" diff --git a/features/createroom/impl/src/main/res/values-pt/translations.xml b/features/createroom/impl/src/main/res/values-pt/translations.xml index 5e5f5fc9c3..1524914bb2 100644 --- a/features/createroom/impl/src/main/res/values-pt/translations.xml +++ b/features/createroom/impl/src/main/res/values-pt/translations.xml @@ -19,12 +19,4 @@ Pode alterar esta opção nas definições da sala." "Visibilidade da sala" "Criar uma sala" "Descrição (opcional)" - "Diretório de salas" - "Ocorreu um erro ao tentar iniciar uma conversa" - "Entrar na sala pelo endereço" - "Não é um endereço válido" - "Entrar…" - "Sala correspondente encontrado" - "Sala não encontrada" - "por exemplo, #sala:matrix.org" diff --git a/features/createroom/impl/src/main/res/values-ro/translations.xml b/features/createroom/impl/src/main/res/values-ro/translations.xml index 8d9e74b530..a5ea4fbb85 100644 --- a/features/createroom/impl/src/main/res/values-ro/translations.xml +++ b/features/createroom/impl/src/main/res/values-ro/translations.xml @@ -17,6 +17,4 @@ Puteți modifica acest lucru oricând în setări." "Numele camerei" "Creați o cameră" "Subiect (opțional)" - "Director de camere" - "A apărut o eroare la încercarea începerii conversației" diff --git a/features/createroom/impl/src/main/res/values-ru/translations.xml b/features/createroom/impl/src/main/res/values-ru/translations.xml index 6344491248..e871673114 100644 --- a/features/createroom/impl/src/main/res/values-ru/translations.xml +++ b/features/createroom/impl/src/main/res/values-ru/translations.xml @@ -19,12 +19,4 @@ "Видимость комнаты" "Создать комнату" "Тема (необязательно)" - "Каталог комнат" - "Произошла ошибка при запуске чата" - "Присоединиться к комнате по адресу" - "Недействительный адрес" - "Ввести…" - "Соответствующая комната найдена" - "Комната не найдена" - "прим. #room-name:matrix.org" diff --git a/features/createroom/impl/src/main/res/values-sk/translations.xml b/features/createroom/impl/src/main/res/values-sk/translations.xml index eaf6c2f19c..7b6d89b2e1 100644 --- a/features/createroom/impl/src/main/res/values-sk/translations.xml +++ b/features/createroom/impl/src/main/res/values-sk/translations.xml @@ -19,12 +19,4 @@ Môžete to kedykoľvek zmeniť v nastaveniach miestnosti." "Viditeľnosť miestnosti" "Vytvoriť miestnosť" "Téma (voliteľné)" - "Adresár miestností" - "Pri pokuse o spustenie konverzácie sa vyskytla chyba" - "Pripojte sa do miestnosti podľa adresy" - "Neplatná adresa" - "Zadajte…" - "Nájdená zodpovedajúca miestnosť" - "Miestnosť sa nenašla" - "napr. #nazov-miestnosti:matrix.org" diff --git a/features/createroom/impl/src/main/res/values-sv/translations.xml b/features/createroom/impl/src/main/res/values-sv/translations.xml index 316c9cc32e..8cd01ebd0e 100644 --- a/features/createroom/impl/src/main/res/values-sv/translations.xml +++ b/features/createroom/impl/src/main/res/values-sv/translations.xml @@ -19,12 +19,4 @@ Du kan ändra detta när som helst i rumsinställningarna." "Rumssynlighet" "Skapa ett rum" "Ämne (valfritt)" - "Rumskatalog" - "Ett fel uppstod när du försökte starta en chatt" - "Gå med i rum med adress" - "Inte en giltig adress" - "Ange …" - "Matchande rum hittades" - "Rummet hittades inte" - "t.ex. #rumsnamn:matrix.org" diff --git a/features/createroom/impl/src/main/res/values-tr/translations.xml b/features/createroom/impl/src/main/res/values-tr/translations.xml index c8e3136517..d97139c973 100644 --- a/features/createroom/impl/src/main/res/values-tr/translations.xml +++ b/features/createroom/impl/src/main/res/values-tr/translations.xml @@ -19,6 +19,4 @@ Bunu istediğiniz zaman oda ayarlarından değiştirebilirsiniz." "Oda görünürlüğü" "Bir oda oluştur" "Konu (isteğe bağlı)" - "Oda dizini" - "Sohbet başlatmaya çalışırken bir hata oluştu" diff --git a/features/createroom/impl/src/main/res/values-uk/translations.xml b/features/createroom/impl/src/main/res/values-uk/translations.xml index a43172fb8b..047b4dd9d2 100644 --- a/features/createroom/impl/src/main/res/values-uk/translations.xml +++ b/features/createroom/impl/src/main/res/values-uk/translations.xml @@ -19,12 +19,4 @@ "Видимість кімнати" "Створити кімнату" "Тема (необов\'язково)" - "Каталог кімнат" - "Під час спроби почати бесіду сталася помилка" - "Приєднатися до кімнати за адресою" - "Недійсна адреса" - "Введіть…" - "Знайдено відповідну кімнату" - "Кімната не знайдена" - "наприклад, #room-name:matrix.org" diff --git a/features/createroom/impl/src/main/res/values-ur/translations.xml b/features/createroom/impl/src/main/res/values-ur/translations.xml index 6fe476462e..b68992085f 100644 --- a/features/createroom/impl/src/main/res/values-ur/translations.xml +++ b/features/createroom/impl/src/main/res/values-ur/translations.xml @@ -11,6 +11,4 @@ "کمرے کا نام" "ایک کمرہ بنائیں" "موضوع (اختیاری)" - "کمرے کا راہنامچہ" - "گفتگو شروع کرنے کی کوشش کرتے وقت ایک خرابی واقع ہوگئی" diff --git a/features/createroom/impl/src/main/res/values-uz/translations.xml b/features/createroom/impl/src/main/res/values-uz/translations.xml index e3bc9de528..c2591ff235 100644 --- a/features/createroom/impl/src/main/res/values-uz/translations.xml +++ b/features/createroom/impl/src/main/res/values-uz/translations.xml @@ -3,11 +3,11 @@ "Yangi xona" "Odamlarni taklif qiling" "Xonani yaratishda xatolik yuz berdi" - "Bu xonadagi xabarlar shifrlangan. Keyinchalik shifrlashni o‘chirib bo‘lmaydi." - "Shaxsiy xona (faqat taklif)" - "Xabarlar shifrlanmagan va har kim ularni o\'qiy oladi. Keyinchalik shifrlashni yoqishingiz mumkin." + "Faqat taklif etilgan shaxslargina bu xonaga kira oladi. Barcha xabarlar boshdan-oxirigacha shifrlanadi." + "Shaxsiy xona" + "Bu xonani har kim topishi mumkin. +Buni xona sozlamalaridan istalgan vaqtda oʻzgartirishingiz mumkin." "Xona nomi" "Xonani yaratish" "Mavzu (ixtiyoriy)" - "Suhbatni boshlashda xatolik yuz berdi" diff --git a/features/createroom/impl/src/main/res/values-zh-rTW/translations.xml b/features/createroom/impl/src/main/res/values-zh-rTW/translations.xml index 0d67c883c7..476f9cff7e 100644 --- a/features/createroom/impl/src/main/res/values-zh-rTW/translations.xml +++ b/features/createroom/impl/src/main/res/values-zh-rTW/translations.xml @@ -19,12 +19,4 @@ "聊天室能見度" "建立聊天室" "主題(非必填)" - "聊天室目錄" - "嘗試開始聊天時發生錯誤" - "按地址加入聊天室" - "不是有效的位址" - "輸入……" - "找到相符的聊天室" - "找不到聊天室" - "例如 #room-name:matrix.org" diff --git a/features/createroom/impl/src/main/res/values-zh/translations.xml b/features/createroom/impl/src/main/res/values-zh/translations.xml index 24d7df7f35..d20e34801d 100644 --- a/features/createroom/impl/src/main/res/values-zh/translations.xml +++ b/features/createroom/impl/src/main/res/values-zh/translations.xml @@ -19,6 +19,4 @@ "房间可见性" "创建聊天室" "主题(可选)" - "聊天室目录" - "在开始聊天时发生了错误" diff --git a/features/createroom/impl/src/main/res/values/localazy.xml b/features/createroom/impl/src/main/res/values/localazy.xml index d011a1d87b..fa9a1cb276 100644 --- a/features/createroom/impl/src/main/res/values/localazy.xml +++ b/features/createroom/impl/src/main/res/values/localazy.xml @@ -19,12 +19,4 @@ You can change this anytime in room settings." "Room visibility" "Create a room" "Topic (optional)" - "Room directory" - "An error occurred when trying to start a chat" - "Join room by address" - "Not a valid address" - "Enter…" - "Matching room found" - "Room not found" - "e.g. #room-name:matrix.org" diff --git a/features/createroom/impl/src/test/kotlin/io/element/android/features/createroom/impl/addpeople/AddPeoplePresenterTest.kt b/features/createroom/impl/src/test/kotlin/io/element/android/features/createroom/impl/addpeople/AddPeoplePresenterTest.kt deleted file mode 100644 index acb381dadc..0000000000 --- a/features/createroom/impl/src/test/kotlin/io/element/android/features/createroom/impl/addpeople/AddPeoplePresenterTest.kt +++ /dev/null @@ -1,50 +0,0 @@ -/* - * Copyright 2023, 2024 New Vector Ltd. - * - * SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial - * Please see LICENSE files in the repository root for full details. - */ - -package io.element.android.features.createroom.impl.addpeople - -import app.cash.molecule.RecompositionMode -import app.cash.molecule.moleculeFlow -import app.cash.turbine.test -import com.google.common.truth.Truth.assertThat -import io.element.android.features.createroom.impl.CreateRoomDataStore -import io.element.android.features.createroom.impl.userlist.FakeUserListPresenterFactory -import io.element.android.features.createroom.impl.userlist.UserListDataStore -import io.element.android.libraries.matrix.test.room.alias.FakeRoomAliasHelper -import io.element.android.libraries.usersearch.test.FakeUserRepository -import io.element.android.tests.testutils.WarmUpRule -import kotlinx.coroutines.test.runTest -import org.junit.Before -import org.junit.Rule -import org.junit.Test - -class AddPeoplePresenterTest { - @get:Rule - val warmUpRule = WarmUpRule() - - private lateinit var presenter: AddPeoplePresenter - - @Before - fun setup() { - presenter = AddPeoplePresenter( - FakeUserListPresenterFactory(), - FakeUserRepository(), - CreateRoomDataStore(UserListDataStore(), FakeRoomAliasHelper()) - ) - } - - @Test - fun `present - initial state`() = runTest { - moleculeFlow(RecompositionMode.Immediate) { - presenter.present() - }.test { - // TODO This doesn't actually test anything... - val initialState = awaitItem() - assertThat(initialState) - } - } -} diff --git a/features/createroom/impl/src/test/kotlin/io/element/android/features/createroom/impl/addpeople/AddPeopleViewTest.kt b/features/createroom/impl/src/test/kotlin/io/element/android/features/createroom/impl/addpeople/AddPeopleViewTest.kt deleted file mode 100644 index c18abf0daa..0000000000 --- a/features/createroom/impl/src/test/kotlin/io/element/android/features/createroom/impl/addpeople/AddPeopleViewTest.kt +++ /dev/null @@ -1,89 +0,0 @@ -/* - * Copyright 2024 New Vector Ltd. - * - * SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial - * Please see LICENSE files in the repository root for full details. - */ - -package io.element.android.features.createroom.impl.addpeople - -import androidx.activity.ComponentActivity -import androidx.compose.ui.test.junit4.AndroidComposeTestRule -import androidx.compose.ui.test.junit4.createAndroidComposeRule -import androidx.test.ext.junit.runners.AndroidJUnit4 -import io.element.android.features.createroom.impl.userlist.UserListEvents -import io.element.android.features.createroom.impl.userlist.UserListState -import io.element.android.features.createroom.impl.userlist.aUserListState -import io.element.android.libraries.ui.strings.CommonStrings -import io.element.android.tests.testutils.EnsureNeverCalled -import io.element.android.tests.testutils.EventsRecorder -import io.element.android.tests.testutils.clickOn -import io.element.android.tests.testutils.ensureCalledOnce -import io.element.android.tests.testutils.pressBack -import org.junit.Rule -import org.junit.Test -import org.junit.rules.TestRule -import org.junit.runner.RunWith - -@RunWith(AndroidJUnit4::class) -class AddPeopleViewTest { - @get:Rule - val rule = createAndroidComposeRule() - - @Test - fun `clicking on back invokes the expected callback`() { - val eventsRecorder = EventsRecorder() - ensureCalledOnce { - rule.setAddPeopleView( - aUserListState( - eventSink = eventsRecorder, - ), - onBackClick = it - ) - rule.pressBack() - } - eventsRecorder.assertSingle(UserListEvents.UpdateSearchQuery("")) - } - - @Test - fun `clicking on back during search emits the expected Event`() { - val eventsRecorder = EventsRecorder() - rule.setAddPeopleView( - aUserListState( - isSearchActive = true, - eventSink = eventsRecorder, - ), - ) - rule.pressBack() - eventsRecorder.assertSingle(UserListEvents.OnSearchActiveChanged(false)) - } - - @Test - fun `clicking on skip invokes the expected callback`() { - val eventsRecorder = EventsRecorder() - ensureCalledOnce { - rule.setAddPeopleView( - aUserListState( - eventSink = eventsRecorder, - ), - onNextClick = it - ) - rule.clickOn(CommonStrings.action_skip) - } - eventsRecorder.assertSingle(UserListEvents.UpdateSearchQuery("")) - } -} - -private fun AndroidComposeTestRule.setAddPeopleView( - state: UserListState, - onBackClick: () -> Unit = EnsureNeverCalled(), - onNextClick: () -> Unit = EnsureNeverCalled(), -) { - setContent { - AddPeopleView( - state = state, - onBackClick = onBackClick, - onNextClick = onNextClick, - ) - } -} diff --git a/features/createroom/impl/src/test/kotlin/io/element/android/features/createroom/impl/configureroom/ConfigureBaseRoomPresenterTest.kt b/features/createroom/impl/src/test/kotlin/io/element/android/features/startchat/impl/configureroom/ConfigureRoomPresenterTest.kt similarity index 90% rename from features/createroom/impl/src/test/kotlin/io/element/android/features/createroom/impl/configureroom/ConfigureBaseRoomPresenterTest.kt rename to features/createroom/impl/src/test/kotlin/io/element/android/features/startchat/impl/configureroom/ConfigureRoomPresenterTest.kt index 8c8ba7ca58..635a2b330e 100644 --- a/features/createroom/impl/src/test/kotlin/io/element/android/features/createroom/impl/configureroom/ConfigureBaseRoomPresenterTest.kt +++ b/features/createroom/impl/src/test/kotlin/io/element/android/features/startchat/impl/configureroom/ConfigureRoomPresenterTest.kt @@ -5,15 +5,21 @@ * Please see LICENSE files in the repository root for full details. */ -package io.element.android.features.createroom.impl.configureroom +package io.element.android.features.startchat.impl.configureroom import android.net.Uri import app.cash.turbine.TurbineTestContext import com.google.common.truth.Truth.assertThat import im.vector.app.features.analytics.plan.CreatedRoom -import io.element.android.features.createroom.impl.CreateRoomConfig -import io.element.android.features.createroom.impl.CreateRoomDataStore -import io.element.android.features.createroom.impl.userlist.UserListDataStore +import io.element.android.features.createroom.impl.configureroom.ConfigureRoomEvents +import io.element.android.features.createroom.impl.configureroom.ConfigureRoomPresenter +import io.element.android.features.createroom.impl.configureroom.ConfigureRoomState +import io.element.android.features.createroom.impl.configureroom.CreateRoomConfig +import io.element.android.features.createroom.impl.configureroom.CreateRoomConfigStore +import io.element.android.features.createroom.impl.configureroom.RoomAccess +import io.element.android.features.createroom.impl.configureroom.RoomAddress +import io.element.android.features.createroom.impl.configureroom.RoomVisibilityItem +import io.element.android.features.createroom.impl.configureroom.RoomVisibilityState import io.element.android.libraries.architecture.AsyncAction import io.element.android.libraries.featureflag.api.FeatureFlags import io.element.android.libraries.featureflag.test.FakeFeatureFlagService @@ -28,7 +34,6 @@ import io.element.android.libraries.matrix.test.A_ROOM_ID import io.element.android.libraries.matrix.test.A_ROOM_NAME import io.element.android.libraries.matrix.test.FakeMatrixClient import io.element.android.libraries.matrix.test.room.alias.FakeRoomAliasHelper -import io.element.android.libraries.matrix.ui.components.aMatrixUser import io.element.android.libraries.matrix.ui.media.AvatarAction import io.element.android.libraries.matrix.ui.room.address.RoomAddressValidity import io.element.android.libraries.mediapickers.api.PickerProvider @@ -48,8 +53,6 @@ import io.mockk.every import io.mockk.mockk import io.mockk.mockkStatic import io.mockk.unmockkAll -import kotlinx.collections.immutable.persistentListOf -import kotlinx.collections.immutable.toImmutableList import kotlinx.coroutines.ExperimentalCoroutinesApi import kotlinx.coroutines.test.advanceUntilIdle import kotlinx.coroutines.test.runTest @@ -67,7 +70,7 @@ private const val AN_URI_FROM_CAMERA_2 = "content://uri_from_camera_2" private const val AN_URI_FROM_GALLERY = "content://uri_from_gallery" @RunWith(RobolectricTestRunner::class) -class ConfigureBaseRoomPresenterTest { +class ConfigureRoomPresenterTest { @get:Rule val warmUpRule = WarmUpRule() @@ -124,12 +127,11 @@ class ConfigureBaseRoomPresenterTest { @Test fun `present - state is updated when fields are changed`() = runTest { - val userListDataStore = UserListDataStore() val pickerProvider = FakePickerProvider() val permissionsPresenter = FakePermissionsPresenter() val roomAliasHelper = FakeRoomAliasHelper() val presenter = createConfigureRoomPresenter( - createRoomDataStore = CreateRoomDataStore(userListDataStore, roomAliasHelper), + dataStore = CreateRoomConfigStore(roomAliasHelper), pickerProvider = pickerProvider, permissionsPresenter = permissionsPresenter, ) @@ -137,20 +139,9 @@ class ConfigureBaseRoomPresenterTest { val initialState = initialState() var expectedConfig = CreateRoomConfig() assertThat(initialState.config).isEqualTo(expectedConfig) - - // Select User - val selectedUser1 = aMatrixUser() - val selectedUser2 = aMatrixUser("@id_of_bob:server.org", "Bob") - userListDataStore.selectUser(selectedUser1) - skipItems(1) - userListDataStore.selectUser(selectedUser2) - var newState = awaitItem() - expectedConfig = expectedConfig.copy(invites = persistentListOf(selectedUser1, selectedUser2)) - assertThat(newState.config).isEqualTo(expectedConfig) - // Room name initialState.eventSink(ConfigureRoomEvents.RoomNameChanged(A_ROOM_NAME)) - newState = awaitItem() + var newState = awaitItem() expectedConfig = expectedConfig.copy(roomName = A_ROOM_NAME) assertThat(newState.config).isEqualTo(expectedConfig) @@ -206,12 +197,6 @@ class ConfigureBaseRoomPresenterTest { ) ) assertThat(newState.config).isEqualTo(expectedConfig) - - // Remove user - newState.eventSink(ConfigureRoomEvents.RemoveUserFromSelection(selectedUser1)) - newState = awaitItem() - expectedConfig = expectedConfig.copy(invites = expectedConfig.invites.minus(selectedUser1).toImmutableList()) - assertThat(newState.config).isEqualTo(expectedConfig) } } @@ -263,16 +248,16 @@ class ConfigureBaseRoomPresenterTest { val matrixClient = createMatrixClient() val analyticsService = FakeAnalyticsService() val mediaPreProcessor = FakeMediaPreProcessor() - val createRoomDataStore = CreateRoomDataStore(UserListDataStore(), FakeRoomAliasHelper()) + val dataStore = CreateRoomConfigStore(FakeRoomAliasHelper()) val presenter = createConfigureRoomPresenter( - createRoomDataStore = createRoomDataStore, + dataStore = dataStore, mediaPreProcessor = mediaPreProcessor, matrixClient = matrixClient, analyticsService = analyticsService ) presenter.test { val initialState = initialState() - createRoomDataStore.setAvatarUri(Uri.parse(AN_URI_FROM_GALLERY)) + dataStore.setAvatarUri(Uri.parse(AN_URI_FROM_GALLERY)) skipItems(1) mediaPreProcessor.givenResult(Result.success(MediaUploadInfo.Image(mockk(), mockk(), mockk()))) matrixClient.givenUploadMediaResult(Result.failure(AN_EXCEPTION)) @@ -405,7 +390,7 @@ class ConfigureBaseRoomPresenterTest { private fun createConfigureRoomPresenter( roomAliasHelper: RoomAliasHelper = FakeRoomAliasHelper(), - createRoomDataStore: CreateRoomDataStore = CreateRoomDataStore(UserListDataStore(), roomAliasHelper), + dataStore: CreateRoomConfigStore = CreateRoomConfigStore(roomAliasHelper), matrixClient: MatrixClient = createMatrixClient(), pickerProvider: PickerProvider = FakePickerProvider(), mediaPreProcessor: MediaPreProcessor = FakeMediaPreProcessor(), @@ -414,7 +399,7 @@ class ConfigureBaseRoomPresenterTest { isKnockFeatureEnabled: Boolean = true, mediaOptimizationConfigProvider: FakeMediaOptimizationConfigProvider = FakeMediaOptimizationConfigProvider(), ) = ConfigureRoomPresenter( - dataStore = createRoomDataStore, + dataStore = dataStore, matrixClient = matrixClient, mediaPickerProvider = pickerProvider, mediaPreProcessor = mediaPreProcessor, diff --git a/features/deactivation/impl/src/main/res/values-ur/translations.xml b/features/deactivation/impl/src/main/res/values-ur/translations.xml new file mode 100644 index 0000000000..297b29c519 --- /dev/null +++ b/features/deactivation/impl/src/main/res/values-ur/translations.xml @@ -0,0 +1,14 @@ + + + "براہ کرم تصدیق کریں کہ آپ اپنا اکاؤنٹ غیر فعال کرنا چاہتے ہیں۔ اس کارروائی کو کالعدم نہیں کیا جا سکتا۔" + "میرے تمام پیغامات ڈیلیٹ کریں۔" + "انتباہ: مستقبل کے صارفین نامکمل گفتگو دیکھ سکتے ہیں۔" + "اپنے اکاؤنٹ کو غیر فعال کرنا %1$s ہے، یہ کرے گا:" + "ناقابل واپسی" + "‏%1$s آپ کا اکاؤنٹ (آپ دوبارہ لاگ ان نہیں ہو سکتے، اور آپ کی ID کو دوبارہ استعمال نہیں کیا جا سکتا)۔" + "مستقل طور پر غیر فعال کریں" + "آپ کو تمام چیت رومز سے ہٹا دے گا۔" + "ہمارے شناختی سرور سے اپنے اکاؤنٹ کی معلومات کو حذف کریں۔" + "آپ کے پیغامات اب بھی رجسٹرڈ صارفین کو نظر آئیں گے لیکن اگر آپ انہیں حذف کرنے کا انتخاب کرتے ہیں تو نئے یا غیر رجسٹرڈ صارفین کے لیے دستیاب نہیں ہوں گے۔" + "اکاؤنٹ کو غیر فعال کریں" + diff --git a/features/deactivation/impl/src/main/res/values-uz/translations.xml b/features/deactivation/impl/src/main/res/values-uz/translations.xml new file mode 100644 index 0000000000..07a873d2e3 --- /dev/null +++ b/features/deactivation/impl/src/main/res/values-uz/translations.xml @@ -0,0 +1,4 @@ + + + "Hisobni faolsizlantirish" + diff --git a/features/ftue/test/build.gradle.kts b/features/ftue/test/build.gradle.kts index 396c7467b6..9c0d4ffadd 100644 --- a/features/ftue/test/build.gradle.kts +++ b/features/ftue/test/build.gradle.kts @@ -1,5 +1,3 @@ -import extension.setupAnvil - /* * Copyright 2024 New Vector Ltd. * @@ -16,8 +14,6 @@ android { namespace = "io.element.android.features.ftue.test" } -setupAnvil() - dependencies { implementation(projects.features.ftue.api) implementation(projects.tests.testutils) diff --git a/features/home/api/src/main/kotlin/io/element/android/features/home/api/HomeEntryPoint.kt b/features/home/api/src/main/kotlin/io/element/android/features/home/api/HomeEntryPoint.kt index 0f6ee581bb..88b55d4e02 100644 --- a/features/home/api/src/main/kotlin/io/element/android/features/home/api/HomeEntryPoint.kt +++ b/features/home/api/src/main/kotlin/io/element/android/features/home/api/HomeEntryPoint.kt @@ -22,7 +22,7 @@ interface HomeEntryPoint : FeatureEntryPoint { interface Callback : Plugin { fun onRoomClick(roomId: RoomId) - fun onCreateRoomClick() + fun onStartChatClick() fun onSettingsClick() fun onSetUpRecoveryClick() fun onSessionConfirmRecoveryKeyClick() diff --git a/features/home/impl/build.gradle.kts b/features/home/impl/build.gradle.kts index 972c0817e2..e3c8321cd5 100644 --- a/features/home/impl/build.gradle.kts +++ b/features/home/impl/build.gradle.kts @@ -38,7 +38,7 @@ dependencies { implementation(projects.libraries.dateformatter.api) implementation(projects.libraries.eventformatter.api) implementation(projects.libraries.indicator.api) - implementation(projects.libraries.deeplink) + implementation(projects.libraries.deeplink.api) implementation(projects.libraries.fullscreenintent.api) implementation(projects.libraries.permissions.api) implementation(projects.libraries.permissions.noop) diff --git a/features/home/impl/src/main/kotlin/io/element/android/features/home/impl/HomeFlowNode.kt b/features/home/impl/src/main/kotlin/io/element/android/features/home/impl/HomeFlowNode.kt index 54c58d7387..4265114e24 100644 --- a/features/home/impl/src/main/kotlin/io/element/android/features/home/impl/HomeFlowNode.kt +++ b/features/home/impl/src/main/kotlin/io/element/android/features/home/impl/HomeFlowNode.kt @@ -44,7 +44,7 @@ import io.element.android.features.reportroom.api.ReportRoomEntryPoint import io.element.android.libraries.architecture.BackstackView import io.element.android.libraries.architecture.BaseFlowNode import io.element.android.libraries.architecture.appyx.launchMolecule -import io.element.android.libraries.deeplink.usecase.InviteFriendsUseCase +import io.element.android.libraries.deeplink.api.usecase.InviteFriendsUseCase import io.element.android.libraries.di.SessionScope import io.element.android.libraries.matrix.api.MatrixClient import io.element.android.libraries.matrix.api.core.RoomId @@ -120,8 +120,8 @@ class HomeFlowNode @AssistedInject constructor( plugins().forEach { it.onSettingsClick() } } - private fun onCreateRoomClick() { - plugins().forEach { it.onCreateRoomClick() } + private fun onStartChatClick() { + plugins().forEach { it.onStartChatClick() } } private fun onSetUpRecoveryClick() { @@ -171,7 +171,7 @@ class HomeFlowNode @AssistedInject constructor( homeState = state, onRoomClick = this::onRoomClick, onSettingsClick = this::onOpenSettings, - onCreateRoomClick = this::onCreateRoomClick, + onStartChatClick = this::onStartChatClick, onSetUpRecoveryClick = this::onSetUpRecoveryClick, onConfirmRecoveryKeyClick = this::onSessionConfirmRecoveryKeyClick, onRoomSettingsClick = this::onRoomSettingsClick, diff --git a/features/home/impl/src/main/kotlin/io/element/android/features/home/impl/HomeView.kt b/features/home/impl/src/main/kotlin/io/element/android/features/home/impl/HomeView.kt index c2ef2e4bc5..a0468aa32d 100644 --- a/features/home/impl/src/main/kotlin/io/element/android/features/home/impl/HomeView.kt +++ b/features/home/impl/src/main/kotlin/io/element/android/features/home/impl/HomeView.kt @@ -31,6 +31,7 @@ import androidx.compose.ui.graphics.Color import androidx.compose.ui.input.nestedscroll.nestedScroll import androidx.compose.ui.platform.LocalLayoutDirection import androidx.compose.ui.res.stringResource +import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.tooling.preview.PreviewParameter import androidx.compose.ui.unit.dp import dev.chrisbanes.haze.hazeEffect @@ -72,7 +73,7 @@ fun HomeView( onSettingsClick: () -> Unit, onSetUpRecoveryClick: () -> Unit, onConfirmRecoveryKeyClick: () -> Unit, - onCreateRoomClick: () -> Unit, + onStartChatClick: () -> Unit, onRoomSettingsClick: (roomId: RoomId) -> Unit, onMenuActionClick: (RoomListMenuAction) -> Unit, onReportRoomClick: (roomId: RoomId) -> Unit, @@ -116,7 +117,7 @@ fun HomeView( onConfirmRecoveryKeyClick = onConfirmRecoveryKeyClick, onRoomClick = { if (firstThrottler.canHandle()) onRoomClick(it) }, onOpenSettings = { if (firstThrottler.canHandle()) onSettingsClick() }, - onCreateRoomClick = { if (firstThrottler.canHandle()) onCreateRoomClick() }, + onStartChatClick = { if (firstThrottler.canHandle()) onStartChatClick() }, onMenuActionClick = onMenuActionClick, modifier = Modifier.padding(top = topPadding), ) @@ -145,7 +146,7 @@ private fun HomeScaffold( onConfirmRecoveryKeyClick: () -> Unit, onRoomClick: (RoomId) -> Unit, onOpenSettings: () -> Unit, - onCreateRoomClick: () -> Unit, + onStartChatClick: () -> Unit, onMenuActionClick: (RoomListMenuAction) -> Unit, modifier: Modifier = Modifier, ) { @@ -236,7 +237,7 @@ private fun HomeScaffold( onSetUpRecoveryClick = onSetUpRecoveryClick, onConfirmRecoveryKeyClick = onConfirmRecoveryKeyClick, onRoomClick = ::onRoomClick, - onCreateRoomClick = onCreateRoomClick, + onCreateRoomClick = onStartChatClick, contentPadding = PaddingValues( // FAB height is 56dp, bottom padding is 16dp, we add 8dp as extra margin -> 56+16+8 = 80, // and include provided bottom padding @@ -280,7 +281,7 @@ private fun HomeScaffold( floatingActionButton = { if (state.displayActions) { FloatingActionButton( - onClick = onCreateRoomClick, + onClick = onStartChatClick, ) { Icon( imageVector = CompoundIcons.Plus(), @@ -304,7 +305,26 @@ internal fun HomeViewPreview(@PreviewParameter(HomeStateProvider::class) state: onSettingsClick = {}, onSetUpRecoveryClick = {}, onConfirmRecoveryKeyClick = {}, - onCreateRoomClick = {}, + onStartChatClick = {}, + onRoomSettingsClick = {}, + onReportRoomClick = {}, + onMenuActionClick = {}, + onDeclineInviteAndBlockUser = {}, + acceptDeclineInviteView = {}, + leaveRoomView = {} + ) +} + +@Preview +@Composable +internal fun HomeViewA11yPreview() = ElementPreview { + HomeView( + homeState = aHomeState(), + onRoomClick = {}, + onSettingsClick = {}, + onSetUpRecoveryClick = {}, + onConfirmRecoveryKeyClick = {}, + onStartChatClick = {}, onRoomSettingsClick = {}, onReportRoomClick = {}, onMenuActionClick = {}, diff --git a/features/home/impl/src/main/res/values-da/translations.xml b/features/home/impl/src/main/res/values-da/translations.xml index f6e94e85b2..fff8ce0b1e 100644 --- a/features/home/impl/src/main/res/values-da/translations.xml +++ b/features/home/impl/src/main/res/values-da/translations.xml @@ -13,6 +13,7 @@ "For at sikre, at du aldrig går glip af et vigtigt opkald, skal du ændre dine indstillinger til at tillade underretninger i fuld skærm, når din telefon er låst." "Gør din opkaldsoplevelse bedre" "Samtaler" + "Klynger" "Er du sikker på, at du vil afvise invitationen til at deltage i %1$s?" "Afvis invitation" "Er du sikker på, at du vil afvise denne private samtale med %1$s?" @@ -32,6 +33,7 @@ For nu kan du fravælge filtre for at se dine andre samtaler" "Invitationer" "Du har ingen afventende invitationer." "Lav prioritet" + "Du har endnu ingen chats med lav prioritet" "Du kan fravælge filtre for at se dine andre samtaler" "Du har ingen samtaler til dette valg" "Mennesker" diff --git a/features/home/impl/src/main/res/values-et/translations.xml b/features/home/impl/src/main/res/values-et/translations.xml index 39e099adba..43dd57cdfa 100644 --- a/features/home/impl/src/main/res/values-et/translations.xml +++ b/features/home/impl/src/main/res/values-et/translations.xml @@ -33,6 +33,7 @@ Aga seni… oma teiste vestluste nägemiseks pead eemaldama filtrid" "Kutsed" "Sul pole ootel kutseid." "Vähetähtis" + "Sul pole veel ühtegi olulist vestlust" "Oma teiste vestluste nägemiseks sa pead filtrid eemaldama" "Selle valiku jaoks sul veel pole vestlusi" "Inimesed" diff --git a/features/home/impl/src/main/res/values-eu/translations.xml b/features/home/impl/src/main/res/values-eu/translations.xml index 62d65d9949..b1eaf7749d 100644 --- a/features/home/impl/src/main/res/values-eu/translations.xml +++ b/features/home/impl/src/main/res/values-eu/translations.xml @@ -1,5 +1,8 @@ + "Desgaitu bateriaren optimizazioa aplikazio honentzat, ziurtatzeko jakinarazpen guztiak jasoko direla." + "Desgaitu optimizazioa" + "Jakinarazpenak ez dira iristen?" "Konfiguratu berreskurapena" "Sartu zure berreskuratze-gakoa" "Berreskuratze-gakoa ahaztu al duzu?" @@ -15,6 +18,7 @@ "Behin egin beharreko prozesua da; eskerrik asko itxaroteagatik." "Zure kontua konfiguratzen." "Sortu elkarrizketa edo gela berria" + "Garbitu iragazkiak" "Hasi norbaiti mezuak bidaltzen." "Oraindik ez dago txatik." "Gogokoak" diff --git a/features/home/impl/src/main/res/values-fr/translations.xml b/features/home/impl/src/main/res/values-fr/translations.xml index 23d621a3a4..540eb3e887 100644 --- a/features/home/impl/src/main/res/values-fr/translations.xml +++ b/features/home/impl/src/main/res/values-fr/translations.xml @@ -13,6 +13,7 @@ "Afin de ne jamais manquer un appel important, veuillez modifier vos paramètres pour autoriser les notifications en plein écran lorsque votre appareil est verrouillé." "Améliorez votre expérience d’appel" "Conversations" + "Espaces" "Êtes-vous sûr de vouloir décliner l’invitation à rejoindre %1$s ?" "Refuser l’invitation" "Êtes-vous sûr de vouloir refuser cette discussion privée avec %1$s ?" diff --git a/features/home/impl/src/main/res/values-hu/translations.xml b/features/home/impl/src/main/res/values-hu/translations.xml index 9d7ee11427..8d498d08a6 100644 --- a/features/home/impl/src/main/res/values-hu/translations.xml +++ b/features/home/impl/src/main/res/values-hu/translations.xml @@ -33,6 +33,7 @@ Egyelőre törölheti a szűrőket a többi csevegés megtekintéséhez.""Meghívások" "Nincsenek függőben lévő meghívásai." "Alacsony prioritás" + "Még nincsenek alacsony prioritású csevegései" "Kikapcsolhatja a szűrőket a többi csevegés megtekintéséhez" "Ehhez a kiválasztáshoz nem tartoznak csevegések" "Emberek" diff --git a/features/home/impl/src/main/res/values-sk/translations.xml b/features/home/impl/src/main/res/values-sk/translations.xml index 62df718bc2..f44e294432 100644 --- a/features/home/impl/src/main/res/values-sk/translations.xml +++ b/features/home/impl/src/main/res/values-sk/translations.xml @@ -33,6 +33,7 @@ Zatiaľ môžete zrušiť výber filtrov, aby ste videli ostatné konverzácie"< "Pozvánky" "Nemáte žiadne čakajúce pozvánky." "Nízka priorita" + "Zatiaľ nemáte žiadne konverzácie s nízkou prioritou." "Môžete zrušiť výber filtrov, aby ste videli svoje ostatné konverzácie" "Nemáte konverzácie pre tento výber" "Ľudia" diff --git a/features/home/impl/src/main/res/values-sv/translations.xml b/features/home/impl/src/main/res/values-sv/translations.xml index ff2d495b3a..d92b351118 100644 --- a/features/home/impl/src/main/res/values-sv/translations.xml +++ b/features/home/impl/src/main/res/values-sv/translations.xml @@ -13,6 +13,7 @@ "För att säkerställa att du aldrig missar ett viktigt samtal, ändra dina inställningar för att tillåta helskärmsmeddelanden när telefonen är låst." "Förbättra din samtalsupplevelse" "Alla chattar" + "Utrymmen" "Är du säker på att du vill tacka nej till inbjudan att gå med%1$s?" "Avböj inbjudan" "Är du säker på att du vill avböja denna privata chatt med %1$s?" @@ -32,6 +33,7 @@ För tillfället kan du avmarkera filter för att se dina andra chattar""Inbjudningar" "Du har inga väntande inbjudningar." "Låg prioritet" + "Du har inga lågprioriterade chattar ännu" "Du kan avmarkera filter för att se dina andra chattar" "Du har inga chattar för det här valet" "Personer" diff --git a/features/home/impl/src/main/res/values-uk/translations.xml b/features/home/impl/src/main/res/values-uk/translations.xml index c513aee351..f41f077df0 100644 --- a/features/home/impl/src/main/res/values-uk/translations.xml +++ b/features/home/impl/src/main/res/values-uk/translations.xml @@ -13,6 +13,7 @@ "Щоб ніколи не пропустити важливий виклик, змініть налаштування, щоб увімкнути повноекранні сповіщення, коли телефон заблоковано." "Покращуйте досвід дзвінків" "Бесіди" + "Простори" "Ви впевнені, що хочете відхилити запрошення приєднатися до %1$s?" "Відхилити запрошення" "Ви дійсно хочете відмовитися від приватної бесіди з %1$s?" @@ -32,6 +33,7 @@ "Запрошення" "У вас немає запрошень, що очікують на розгляд." "Низький пріоритет" + "У вас ще немає неважливих бесід" "Ви можете зняти фільтри, щоб побачити інші ваші бесіди" "Ви не маєте бесід для цієї категорії" "Люди" diff --git a/features/home/impl/src/main/res/values-ur/translations.xml b/features/home/impl/src/main/res/values-ur/translations.xml index cdcc9661b2..78166c34c7 100644 --- a/features/home/impl/src/main/res/values-ur/translations.xml +++ b/features/home/impl/src/main/res/values-ur/translations.xml @@ -1,6 +1,8 @@ + "اگر آپ اپنے تمام موجودہ آلات کھو چکے ہیں تو ایک recovery key کے ذریعہ اپنی کرپٹوگرافک شناخت اور پیغام کی سرگزشت کو دوبارہ حاصل کریں۔" "بازیابی مرتب کریں" + "اپنے اکاؤنٹ کی حفاظت کے لیے ریکوری طے کریں" "اپنے کلید کے ذخیرہ اور پیغام کی سرگزشت تک رسائی کو برقرار رکھنے کیلئے اپنی بازیابی کلید کی تصدیق کریں۔" "آپ کا کلید کا ذخیرہ غیر ہم وقت ساز ہے۔" "اس بات کو یقینی بنانے کے لیے کہ آپ کبھی بھی اہم مکالمہ سے محروم نہ ہوں، براہ کرم اپنی ترتیبات تبدیل کریں تاکہ آپ کا ہاتف مقفل ہونے پر مکمل پردۂ نمائش اطلاعات کی اجازت دی جا سکے۔" diff --git a/features/home/impl/src/main/res/values-uz/translations.xml b/features/home/impl/src/main/res/values-uz/translations.xml index e638e86838..c28d48da80 100644 --- a/features/home/impl/src/main/res/values-uz/translations.xml +++ b/features/home/impl/src/main/res/values-uz/translations.xml @@ -1,6 +1,10 @@ + "Ushbu ilova uchun quvvatni optimallashtirishni oʻchirib qoʻying, barcha xabarnomalar qabul qilinganligiga ishonch hosil qilish uchun." + "Optimallashtirishni o\'chiring" + "Bildirishnoma kelmayaptimi?" "Qayta tiklashni sozlang" + "Hisobingizni himoya qilish uchun tiklashni sozlang" "Suhbatlar" "Haqiqatan ham qo\'shilish taklifini rad qilmoqchimisiz%1$s ?" "Taklifni rad etish" diff --git a/features/home/impl/src/main/res/values-zh-rTW/translations.xml b/features/home/impl/src/main/res/values-zh-rTW/translations.xml index 644baf8f08..a9f1c932a0 100644 --- a/features/home/impl/src/main/res/values-zh-rTW/translations.xml +++ b/features/home/impl/src/main/res/values-zh-rTW/translations.xml @@ -1,5 +1,8 @@ + "停用此應用程式的電池最佳化,才能確保收到所有通知。" + "停用最佳化" + "沒收到通知?" "若您遺失了所有現有裝置,則請使用復原金鑰以救援您的密碼學身份與訊息歷史紀錄。" "設定復原" "設定備援以保護您的帳號" @@ -10,6 +13,7 @@ "為確保您永遠不會錯過重要通話,請變更設定以允許在手機鎖定時允許全螢幕通知。" "提升您的通話體驗" "所有聊天室" + "空間" "您確定您想要拒絕加入 %1$s 的邀請嗎?" "拒絕邀請" "您確定您要拒絕此與 %1$s 的私人聊天嗎?" @@ -19,6 +23,7 @@ "這是一次性的程序,感謝您耐心等候。" "正在設定您的帳號。" "建立新的對話或聊天室" + "清除篩選條件" "從向某人傳送訊息開始。" "尚無聊天室。" "我的最愛" @@ -41,6 +46,7 @@ "所有聊天室" "標為已讀" "標為未讀" + "此聊天室已升級" "您似乎正在使用新的裝置。請使用另一個裝置進行驗證,以存取您的加密訊息。" "驗證這是您本人" diff --git a/features/home/impl/src/main/res/values-zh/translations.xml b/features/home/impl/src/main/res/values-zh/translations.xml index 52ef5ad761..7c74d11302 100644 --- a/features/home/impl/src/main/res/values-zh/translations.xml +++ b/features/home/impl/src/main/res/values-zh/translations.xml @@ -1,5 +1,6 @@ + "请关闭本应用的电池优化设置,确保不错过任何消息通知。" "禁用优化" "通知未送达?" "生成新的恢复密钥,该密钥可用于在您无法访问设备时恢复加密的消息历史记录。" diff --git a/features/home/impl/src/main/res/values/localazy.xml b/features/home/impl/src/main/res/values/localazy.xml index 4918260281..e6e09b5e47 100644 --- a/features/home/impl/src/main/res/values/localazy.xml +++ b/features/home/impl/src/main/res/values/localazy.xml @@ -33,6 +33,7 @@ For now, you can deselect filters in order to see your other chats" "Invites" "You don\'t have any pending invites." "Low Priority" + "You don’t have any low priority chats yet" "You can deselect filters in order to see your other chats" "You don’t have chats for this selection" "People" diff --git a/features/home/impl/src/test/kotlin/io/element/android/features/home/impl/roomlist/RoomListViewTest.kt b/features/home/impl/src/test/kotlin/io/element/android/features/home/impl/roomlist/RoomListViewTest.kt index e29b2cf580..4fcbcd170b 100644 --- a/features/home/impl/src/test/kotlin/io/element/android/features/home/impl/roomlist/RoomListViewTest.kt +++ b/features/home/impl/src/test/kotlin/io/element/android/features/home/impl/roomlist/RoomListViewTest.kt @@ -284,7 +284,7 @@ private fun AndroidComposeTestRule.setRoomL onSettingsClick = onSettingsClick, onSetUpRecoveryClick = onSetUpRecoveryClick, onConfirmRecoveryKeyClick = onConfirmRecoveryKeyClick, - onCreateRoomClick = onCreateRoomClick, + onStartChatClick = onCreateRoomClick, onRoomSettingsClick = onRoomSettingsClick, onMenuActionClick = onMenuActionClick, onDeclineInviteAndBlockUser = onDeclineInviteAndBlockUser, diff --git a/features/invite/impl/src/main/res/values-eu/translations.xml b/features/invite/impl/src/main/res/values-eu/translations.xml index f99d5691d9..49a545c4c9 100644 --- a/features/invite/impl/src/main/res/values-eu/translations.xml +++ b/features/invite/impl/src/main/res/values-eu/translations.xml @@ -1,10 +1,13 @@ "Blokeatu erabiltzailea" + "Eman ezetza eta blokeatu" "Ziur %1$s(e)ra batzeko gonbidapena baztertu nahi duzula?" "Baztertu gonbidapena" "Ziur %1$s(r)en txat pribatua baztertu nahi duzula?" "Baztertu txata" "Ez dago gonbidapenik" "%1$s(e)k (%2$s) gonbidatu zaitu" + "Eman gonbidapenari ezetza eta blokeatu" + "Eman ezetza eta blokeatu" diff --git a/features/invite/impl/src/main/res/values-zh/translations.xml b/features/invite/impl/src/main/res/values-zh/translations.xml index a340e22984..e7cf39a9c3 100644 --- a/features/invite/impl/src/main/res/values-zh/translations.xml +++ b/features/invite/impl/src/main/res/values-zh/translations.xml @@ -1,10 +1,18 @@ + "您不会看到来自该用户的任何信息或房间邀请" "封禁用户" + "向您的帐户提供商举报此房间。" + "描述举报的原因…" + "拒绝并屏蔽" "您确定要拒绝加入 %1$s 的邀请吗?" "拒绝邀请" "您确定要拒绝与 %1$s 开始私聊吗?" "拒绝聊天" "没有邀请" "%1$s (%2$s)邀请了你" + "是的,拒绝并屏蔽" + "您确定要拒绝加入此房间的邀请吗?这也将阻止%1$s 与您联系或邀请您加入房间。" + "拒绝邀请并屏蔽" + "拒绝并屏蔽" diff --git a/features/invitepeople/api/build.gradle.kts b/features/invitepeople/api/build.gradle.kts new file mode 100644 index 0000000000..3cbd83724a --- /dev/null +++ b/features/invitepeople/api/build.gradle.kts @@ -0,0 +1,18 @@ +/* + * Copyright 2023, 2024 New Vector Ltd. + * + * SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial + * Please see LICENSE files in the repository root for full details. + */ +plugins { + id("io.element.android-compose-library") +} + +android { + namespace = "io.element.android.features.invitepeople.api" +} + +dependencies { + implementation(projects.libraries.architecture) + implementation(projects.libraries.matrix.api) +} diff --git a/features/invitepeople/api/src/main/kotlin/io/element/android/features/invitepeople/api/InvitePeopleEvents.kt b/features/invitepeople/api/src/main/kotlin/io/element/android/features/invitepeople/api/InvitePeopleEvents.kt new file mode 100644 index 0000000000..0ab097462b --- /dev/null +++ b/features/invitepeople/api/src/main/kotlin/io/element/android/features/invitepeople/api/InvitePeopleEvents.kt @@ -0,0 +1,13 @@ +/* + * Copyright 2025 New Vector Ltd. + * + * SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial + * Please see LICENSE files in the repository root for full details. + */ + +package io.element.android.features.invitepeople.api + +interface InvitePeopleEvents { + data object SendInvites : InvitePeopleEvents + data object CloseSearch : InvitePeopleEvents +} diff --git a/features/invitepeople/api/src/main/kotlin/io/element/android/features/invitepeople/api/InvitePeoplePresenter.kt b/features/invitepeople/api/src/main/kotlin/io/element/android/features/invitepeople/api/InvitePeoplePresenter.kt new file mode 100644 index 0000000000..46903bfb18 --- /dev/null +++ b/features/invitepeople/api/src/main/kotlin/io/element/android/features/invitepeople/api/InvitePeoplePresenter.kt @@ -0,0 +1,21 @@ +/* + * Copyright 2025 New Vector Ltd. + * + * SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial + * Please see LICENSE files in the repository root for full details. + */ + +package io.element.android.features.invitepeople.api + +import io.element.android.libraries.architecture.Presenter +import io.element.android.libraries.matrix.api.core.RoomId +import io.element.android.libraries.matrix.api.room.JoinedRoom + +interface InvitePeoplePresenter : Presenter { + interface Factory { + fun create( + joinedRoom: JoinedRoom?, + roomId: RoomId, + ): InvitePeoplePresenter + } +} diff --git a/features/invitepeople/api/src/main/kotlin/io/element/android/features/invitepeople/api/InvitePeopleRenderer.kt b/features/invitepeople/api/src/main/kotlin/io/element/android/features/invitepeople/api/InvitePeopleRenderer.kt new file mode 100644 index 0000000000..30144a11d1 --- /dev/null +++ b/features/invitepeople/api/src/main/kotlin/io/element/android/features/invitepeople/api/InvitePeopleRenderer.kt @@ -0,0 +1,19 @@ +/* + * Copyright 2025 New Vector Ltd. + * + * SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial + * Please see LICENSE files in the repository root for full details. + */ + +package io.element.android.features.invitepeople.api + +import androidx.compose.runtime.Composable +import androidx.compose.ui.Modifier + +interface InvitePeopleRenderer { + @Composable + fun Render( + state: InvitePeopleState, + modifier: Modifier, + ) +} diff --git a/features/invitepeople/api/src/main/kotlin/io/element/android/features/invitepeople/api/InvitePeopleState.kt b/features/invitepeople/api/src/main/kotlin/io/element/android/features/invitepeople/api/InvitePeopleState.kt new file mode 100644 index 0000000000..db8b9ffbd2 --- /dev/null +++ b/features/invitepeople/api/src/main/kotlin/io/element/android/features/invitepeople/api/InvitePeopleState.kt @@ -0,0 +1,14 @@ +/* + * Copyright 2025 New Vector Ltd. + * + * SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial + * Please see LICENSE files in the repository root for full details. + */ + +package io.element.android.features.invitepeople.api + +interface InvitePeopleState { + val canInvite: Boolean + val isSearchActive: Boolean + val eventSink: (InvitePeopleEvents) -> Unit +} diff --git a/features/invitepeople/api/src/main/kotlin/io/element/android/features/invitepeople/api/InvitePeopleStateProvider.kt b/features/invitepeople/api/src/main/kotlin/io/element/android/features/invitepeople/api/InvitePeopleStateProvider.kt new file mode 100644 index 0000000000..b69ad7c225 --- /dev/null +++ b/features/invitepeople/api/src/main/kotlin/io/element/android/features/invitepeople/api/InvitePeopleStateProvider.kt @@ -0,0 +1,35 @@ +/* + * Copyright 2025 New Vector Ltd. + * + * SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial + * Please see LICENSE files in the repository root for full details. + */ + +package io.element.android.features.invitepeople.api + +import androidx.compose.ui.tooling.preview.PreviewParameterProvider + +class InvitePeopleStateProvider : PreviewParameterProvider { + override val values: Sequence + get() = sequenceOf( + aPreviewInvitePeopleState(), + aPreviewInvitePeopleState(canInvite = true), + aPreviewInvitePeopleState(isSearchActive = true) + ) +} + +private data class PreviewInvitePeopleState( + override val canInvite: Boolean, + override val isSearchActive: Boolean, + override val eventSink: (InvitePeopleEvents) -> Unit, +) : InvitePeopleState + +private fun aPreviewInvitePeopleState( + canInvite: Boolean = false, + isSearchActive: Boolean = false, + eventSink: (InvitePeopleEvents) -> Unit = {}, +) = PreviewInvitePeopleState( + canInvite = canInvite, + isSearchActive = isSearchActive, + eventSink = eventSink +) diff --git a/features/invitepeople/impl/build.gradle.kts b/features/invitepeople/impl/build.gradle.kts new file mode 100644 index 0000000000..bdb1c6942e --- /dev/null +++ b/features/invitepeople/impl/build.gradle.kts @@ -0,0 +1,53 @@ +import extension.setupAnvil + +/* + * Copyright 2022-2024 New Vector Ltd. + * + * SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial + * Please see LICENSE files in the repository root for full details. + */ + +plugins { + id("io.element.android-compose-library") + id("kotlin-parcelize") +} + +android { + namespace = "io.element.android.features.invitepeople.impl" + + testOptions { + unitTests { + isIncludeAndroidResources = true + } + } +} + +setupAnvil() + +dependencies { + implementation(projects.libraries.core) + implementation(projects.libraries.architecture) + implementation(projects.libraries.matrix.api) + implementation(projects.libraries.matrixui) + implementation(projects.libraries.designsystem) + implementation(projects.libraries.uiStrings) + implementation(projects.libraries.androidutils) + implementation(projects.libraries.usersearch.impl) + implementation(libs.coil.compose) + implementation(projects.services.apperror.api) + api(projects.features.invitepeople.api) + + testImplementation(libs.test.junit) + testImplementation(libs.test.mockk) + testImplementation(libs.coroutines.test) + testImplementation(libs.molecule.runtime) + testImplementation(libs.test.truth) + testImplementation(libs.test.turbine) + testImplementation(libs.test.robolectric) + testImplementation(projects.libraries.matrix.test) + testImplementation(projects.libraries.usersearch.test) + testImplementation(projects.services.apperror.test) + testImplementation(projects.tests.testutils) + testImplementation(libs.androidx.compose.ui.test.junit) + testReleaseImplementation(libs.androidx.compose.ui.test.manifest) +} diff --git a/features/invitepeople/impl/src/main/kotlin/io/element/android/features/invitepeople/impl/DefaultInvitePeopleEvents.kt b/features/invitepeople/impl/src/main/kotlin/io/element/android/features/invitepeople/impl/DefaultInvitePeopleEvents.kt new file mode 100644 index 0000000000..984eefbc77 --- /dev/null +++ b/features/invitepeople/impl/src/main/kotlin/io/element/android/features/invitepeople/impl/DefaultInvitePeopleEvents.kt @@ -0,0 +1,17 @@ +/* + * Copyright 2023, 2024 New Vector Ltd. + * + * SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial + * Please see LICENSE files in the repository root for full details. + */ + +package io.element.android.features.invitepeople.impl + +import io.element.android.features.invitepeople.api.InvitePeopleEvents +import io.element.android.libraries.matrix.api.user.MatrixUser + +sealed interface DefaultInvitePeopleEvents : InvitePeopleEvents { + data class ToggleUser(val user: MatrixUser) : DefaultInvitePeopleEvents + data class UpdateSearchQuery(val query: String) : DefaultInvitePeopleEvents + data class OnSearchActiveChanged(val active: Boolean) : DefaultInvitePeopleEvents +} diff --git a/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/invite/RoomInviteMembersPresenter.kt b/features/invitepeople/impl/src/main/kotlin/io/element/android/features/invitepeople/impl/DefaultInvitePeoplePresenter.kt similarity index 57% rename from features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/invite/RoomInviteMembersPresenter.kt rename to features/invitepeople/impl/src/main/kotlin/io/element/android/features/invitepeople/impl/DefaultInvitePeoplePresenter.kt index ed5d13f70b..8961e1157f 100644 --- a/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/invite/RoomInviteMembersPresenter.kt +++ b/features/invitepeople/impl/src/main/kotlin/io/element/android/features/invitepeople/impl/DefaultInvitePeoplePresenter.kt @@ -5,50 +5,88 @@ * Please see LICENSE files in the repository root for full details. */ -package io.element.android.features.roomdetails.impl.invite +package io.element.android.features.invitepeople.impl import androidx.compose.runtime.Composable import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.MutableState import androidx.compose.runtime.getValue import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.produceState import androidx.compose.runtime.remember import androidx.compose.runtime.saveable.rememberSaveable import androidx.compose.runtime.setValue -import io.element.android.features.roomdetails.impl.members.RoomMemberListDataSource +import com.squareup.anvil.annotations.ContributesBinding +import dagger.assisted.Assisted +import dagger.assisted.AssistedFactory +import dagger.assisted.AssistedInject +import io.element.android.features.invitepeople.api.InvitePeopleEvents +import io.element.android.features.invitepeople.api.InvitePeoplePresenter +import io.element.android.features.invitepeople.api.InvitePeopleState import io.element.android.libraries.architecture.AsyncData -import io.element.android.libraries.architecture.Presenter +import io.element.android.libraries.architecture.map import io.element.android.libraries.architecture.runCatchingUpdatingState import io.element.android.libraries.core.coroutine.CoroutineDispatchers import io.element.android.libraries.designsystem.theme.components.SearchBarResultState +import io.element.android.libraries.di.SessionScope +import io.element.android.libraries.di.annotations.SessionCoroutineScope +import io.element.android.libraries.matrix.api.MatrixClient +import io.element.android.libraries.matrix.api.core.RoomId +import io.element.android.libraries.matrix.api.room.JoinedRoom import io.element.android.libraries.matrix.api.room.RoomMember import io.element.android.libraries.matrix.api.room.RoomMembershipState +import io.element.android.libraries.matrix.api.room.filterMembers import io.element.android.libraries.matrix.api.user.MatrixUser +import io.element.android.libraries.ui.strings.CommonStrings import io.element.android.libraries.usersearch.api.UserRepository +import io.element.android.services.apperror.api.AppErrorStateService import kotlinx.collections.immutable.ImmutableList import kotlinx.collections.immutable.persistentListOf import kotlinx.collections.immutable.toImmutableList +import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.flow.launchIn import kotlinx.coroutines.flow.onEach +import kotlinx.coroutines.launch import kotlinx.coroutines.withContext -import javax.inject.Inject -class RoomInviteMembersPresenter @Inject constructor( +class DefaultInvitePeoplePresenter @AssistedInject constructor( + @Assisted private val joinedRoom: JoinedRoom?, + @Assisted private val roomId: RoomId, private val userRepository: UserRepository, - private val roomMemberListDataSource: RoomMemberListDataSource, private val coroutineDispatchers: CoroutineDispatchers, -) : Presenter { + @SessionCoroutineScope private val sessionCoroutineScope: CoroutineScope, + private val appErrorStateService: AppErrorStateService, + private val matrixClient: MatrixClient, +) : InvitePeoplePresenter { + @AssistedFactory + @ContributesBinding(SessionScope::class) + interface Factory : InvitePeoplePresenter.Factory { + override fun create(joinedRoom: JoinedRoom?, roomId: RoomId): DefaultInvitePeoplePresenter + } + @Composable - override fun present(): RoomInviteMembersState { + override fun present(): InvitePeopleState { val roomMembers = remember { mutableStateOf>>(AsyncData.Loading()) } val selectedUsers = remember { mutableStateOf>(persistentListOf()) } val searchResults = remember { mutableStateOf>>(SearchBarResultState.Initial()) } var searchQuery by rememberSaveable { mutableStateOf("") } var searchActive by rememberSaveable { mutableStateOf(false) } val showSearchLoader = rememberSaveable { mutableStateOf(false) } + val room by produceState(if (joinedRoom != null) AsyncData.Success(joinedRoom) else AsyncData.Loading()) { + if (joinedRoom == null) { + val result = matrixClient.getJoinedRoom(roomId) + value = if (result == null) { + AsyncData.Failure(Exception("Room not found")) + } else { + AsyncData.Success(result) + } + } + } - LaunchedEffect(Unit) { - fetchMembers(roomMembers) + LaunchedEffect(room.isSuccess()) { + room.dataOrNull()?.let { + fetchMembers(it, roomMembers) + } } LaunchedEffect(searchQuery, roomMembers) { performSearch( @@ -60,33 +98,61 @@ class RoomInviteMembersPresenter @Inject constructor( ) } - return RoomInviteMembersState( + fun handleEvents(event: InvitePeopleEvents) { + when (event) { + is DefaultInvitePeopleEvents.OnSearchActiveChanged -> { + searchActive = event.active + searchQuery = "" + } + + is DefaultInvitePeopleEvents.UpdateSearchQuery -> { + searchQuery = event.query + } + + is DefaultInvitePeopleEvents.ToggleUser -> { + selectedUsers.toggleUser(event.user) + searchResults.toggleUser(event.user) + } + is InvitePeopleEvents.SendInvites -> { + room.dataOrNull()?.let { + sessionCoroutineScope.sendInvites(it, selectedUsers.value) + } + } + is InvitePeopleEvents.CloseSearch -> { + searchActive = false + searchQuery = "" + } + } + } + + return DefaultInvitePeopleState( + room = room.map { }, canInvite = selectedUsers.value.isNotEmpty(), selectedUsers = selectedUsers.value, searchQuery = searchQuery, isSearchActive = searchActive, searchResults = searchResults.value, showSearchLoader = showSearchLoader.value, - eventSink = { - when (it) { - is RoomInviteMembersEvents.OnSearchActiveChanged -> { - searchActive = it.active - searchQuery = "" - } - - is RoomInviteMembersEvents.UpdateSearchQuery -> { - searchQuery = it.query - } - - is RoomInviteMembersEvents.ToggleUser -> { - selectedUsers.toggleUser(it.user) - searchResults.toggleUser(it.user) - } - } - } + eventSink = ::handleEvents, ) } + private fun CoroutineScope.sendInvites( + room: JoinedRoom, + selectedUsers: List, + ) = launch { + val anyInviteFailed = selectedUsers + .map { room.inviteUserById(it.userId) } + .any { it.isFailure } + + if (anyInviteFailed) { + appErrorStateService.showError( + titleRes = CommonStrings.common_unable_to_invite_title, + bodyRes = CommonStrings.common_unable_to_invite_message, + ) + } + } + @JvmName("toggleUserInSelectedUsers") private fun MutableState>.toggleUser(user: MatrixUser) { value = if (value.contains(user)) { @@ -134,7 +200,7 @@ class RoomInviteMembersPresenter @Inject constructor( val isInvited = existingMembership == RoomMembershipState.INVITE InvitableUser( matrixUser = result.matrixUser, - isSelected = selectedUsers.value.contains(result.matrixUser) || isJoined || isInvited, + isSelected = selectedUsers.value.contains(result.matrixUser), isAlreadyJoined = isJoined, isAlreadyInvited = isInvited, isUnresolved = result.isUnresolved, @@ -144,11 +210,12 @@ class RoomInviteMembersPresenter @Inject constructor( }.launchIn(this) } - private suspend fun fetchMembers(roomMembers: MutableState>>) { + private suspend fun fetchMembers( + room: JoinedRoom, + roomMembers: MutableState>> + ) { suspend { - withContext(coroutineDispatchers.io) { - roomMemberListDataSource.search("").toImmutableList() - } + room.filterMembers("", coroutineDispatchers.io).toImmutableList() }.runCatchingUpdatingState(roomMembers) } } diff --git a/features/invitepeople/impl/src/main/kotlin/io/element/android/features/invitepeople/impl/DefaultInvitePeopleRenderer.kt b/features/invitepeople/impl/src/main/kotlin/io/element/android/features/invitepeople/impl/DefaultInvitePeopleRenderer.kt new file mode 100644 index 0000000000..8207e75fd5 --- /dev/null +++ b/features/invitepeople/impl/src/main/kotlin/io/element/android/features/invitepeople/impl/DefaultInvitePeopleRenderer.kt @@ -0,0 +1,31 @@ +/* + * Copyright 2025 New Vector Ltd. + * + * SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial + * Please see LICENSE files in the repository root for full details. + */ + +package io.element.android.features.invitepeople.impl + +import androidx.compose.runtime.Composable +import androidx.compose.ui.Modifier +import com.squareup.anvil.annotations.ContributesBinding +import io.element.android.features.invitepeople.api.InvitePeopleRenderer +import io.element.android.features.invitepeople.api.InvitePeopleState +import io.element.android.libraries.di.SessionScope +import javax.inject.Inject + +@ContributesBinding(SessionScope::class) +class DefaultInvitePeopleRenderer @Inject constructor() : InvitePeopleRenderer { + @Composable + override fun Render(state: InvitePeopleState, modifier: Modifier) { + if (state is DefaultInvitePeopleState) { + InvitePeopleView( + state = state, + modifier = modifier + ) + } else { + error("Unsupported state type: ${state::javaClass}") + } + } +} diff --git a/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/invite/RoomInviteMembersState.kt b/features/invitepeople/impl/src/main/kotlin/io/element/android/features/invitepeople/impl/DefaultInvitePeopleState.kt similarity index 51% rename from features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/invite/RoomInviteMembersState.kt rename to features/invitepeople/impl/src/main/kotlin/io/element/android/features/invitepeople/impl/DefaultInvitePeopleState.kt index c7927247ef..77ba8aad05 100644 --- a/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/invite/RoomInviteMembersState.kt +++ b/features/invitepeople/impl/src/main/kotlin/io/element/android/features/invitepeople/impl/DefaultInvitePeopleState.kt @@ -1,30 +1,26 @@ /* - * Copyright 2023, 2024 New Vector Ltd. + * Copyright 2025 New Vector Ltd. * * SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial * Please see LICENSE files in the repository root for full details. */ -package io.element.android.features.roomdetails.impl.invite +package io.element.android.features.invitepeople.impl +import io.element.android.features.invitepeople.api.InvitePeopleEvents +import io.element.android.features.invitepeople.api.InvitePeopleState +import io.element.android.libraries.architecture.AsyncData import io.element.android.libraries.designsystem.theme.components.SearchBarResultState import io.element.android.libraries.matrix.api.user.MatrixUser import kotlinx.collections.immutable.ImmutableList -data class RoomInviteMembersState( - val canInvite: Boolean, +data class DefaultInvitePeopleState( + val room: AsyncData, + override val canInvite: Boolean, val searchQuery: String, val showSearchLoader: Boolean, val searchResults: SearchBarResultState>, val selectedUsers: ImmutableList, - val isSearchActive: Boolean, - val eventSink: (RoomInviteMembersEvents) -> Unit, -) - -data class InvitableUser( - val matrixUser: MatrixUser, - val isSelected: Boolean = false, - val isAlreadyJoined: Boolean = false, - val isAlreadyInvited: Boolean = false, - val isUnresolved: Boolean = false, -) + override val isSearchActive: Boolean, + override val eventSink: (InvitePeopleEvents) -> Unit +) : InvitePeopleState diff --git a/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/invite/RoomInviteMembersStateProvider.kt b/features/invitepeople/impl/src/main/kotlin/io/element/android/features/invitepeople/impl/DefaultInvitePeopleStateProvider.kt similarity index 50% rename from features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/invite/RoomInviteMembersStateProvider.kt rename to features/invitepeople/impl/src/main/kotlin/io/element/android/features/invitepeople/impl/DefaultInvitePeopleStateProvider.kt index 7675880f37..980d32e7fb 100644 --- a/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/invite/RoomInviteMembersStateProvider.kt +++ b/features/invitepeople/impl/src/main/kotlin/io/element/android/features/invitepeople/impl/DefaultInvitePeopleStateProvider.kt @@ -5,9 +5,10 @@ * Please see LICENSE files in the repository root for full details. */ -package io.element.android.features.roomdetails.impl.invite +package io.element.android.features.invitepeople.impl import androidx.compose.ui.tooling.preview.PreviewParameterProvider +import io.element.android.libraries.architecture.AsyncData import io.element.android.libraries.designsystem.theme.components.SearchBarResultState import io.element.android.libraries.matrix.api.user.MatrixUser import io.element.android.libraries.matrix.ui.components.aMatrixUser @@ -16,15 +17,15 @@ import kotlinx.collections.immutable.ImmutableList import kotlinx.collections.immutable.persistentListOf import kotlinx.collections.immutable.toImmutableList -internal class RoomInviteMembersStateProvider : PreviewParameterProvider { - override val values: Sequence +internal class DefaultInvitePeopleStateProvider : PreviewParameterProvider { + override val values: Sequence get() = sequenceOf( - aRoomInviteMembersState(), - aRoomInviteMembersState(canInvite = true, selectedUsers = aMatrixUserList().toImmutableList()), - aRoomInviteMembersState(isSearchActive = true, searchQuery = "some query"), - aRoomInviteMembersState(isSearchActive = true, searchQuery = "some query", selectedUsers = aMatrixUserList().toImmutableList()), - aRoomInviteMembersState(isSearchActive = true, searchQuery = "some query", searchResults = SearchBarResultState.NoResultsFound()), - aRoomInviteMembersState( + aDefaultInvitePeopleState(), + aDefaultInvitePeopleState(canInvite = true, selectedUsers = aMatrixUserList().toImmutableList()), + aDefaultInvitePeopleState(isSearchActive = true, searchQuery = "some query"), + aDefaultInvitePeopleState(isSearchActive = true, searchQuery = "some query", selectedUsers = aMatrixUserList().toImmutableList()), + aDefaultInvitePeopleState(isSearchActive = true, searchQuery = "some query", searchResults = SearchBarResultState.NoResultsFound()), + aDefaultInvitePeopleState( isSearchActive = true, canInvite = true, searchQuery = "some query", @@ -33,15 +34,15 @@ internal class RoomInviteMembersStateProvider : PreviewParameterProvider = AsyncData.Success(Unit), canInvite: Boolean = false, searchQuery: String = "", searchResults: SearchBarResultState> = SearchBarResultState.Initial(), selectedUsers: ImmutableList = persistentListOf(), isSearchActive: Boolean = false, showSearchLoader: Boolean = false, -): RoomInviteMembersState { - return RoomInviteMembersState( +): DefaultInvitePeopleState { + return DefaultInvitePeopleState( + room = room, canInvite = canInvite, searchQuery = searchQuery, searchResults = searchResults, diff --git a/features/invitepeople/impl/src/main/kotlin/io/element/android/features/invitepeople/impl/InvitableUser.kt b/features/invitepeople/impl/src/main/kotlin/io/element/android/features/invitepeople/impl/InvitableUser.kt new file mode 100644 index 0000000000..7dfd6a0f36 --- /dev/null +++ b/features/invitepeople/impl/src/main/kotlin/io/element/android/features/invitepeople/impl/InvitableUser.kt @@ -0,0 +1,18 @@ +/* + * Copyright 2025 New Vector Ltd. + * + * SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial + * Please see LICENSE files in the repository root for full details. + */ + +package io.element.android.features.invitepeople.impl + +import io.element.android.libraries.matrix.api.user.MatrixUser + +data class InvitableUser( + val matrixUser: MatrixUser, + val isSelected: Boolean, + val isAlreadyJoined: Boolean, + val isAlreadyInvited: Boolean, + val isUnresolved: Boolean, +) diff --git a/features/invitepeople/impl/src/main/kotlin/io/element/android/features/invitepeople/impl/InvitePeopleView.kt b/features/invitepeople/impl/src/main/kotlin/io/element/android/features/invitepeople/impl/InvitePeopleView.kt new file mode 100644 index 0000000000..5363ca43f1 --- /dev/null +++ b/features/invitepeople/impl/src/main/kotlin/io/element/android/features/invitepeople/impl/InvitePeopleView.kt @@ -0,0 +1,205 @@ +/* + * Copyright 2023, 2024 New Vector Ltd. + * + * SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial + * Please see LICENSE files in the repository root for full details. + */ + +package io.element.android.features.invitepeople.impl + +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.fillMaxSize +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.lazy.LazyColumn +import androidx.compose.foundation.lazy.itemsIndexed +import androidx.compose.material3.ExperimentalMaterial3Api +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.tooling.preview.PreviewParameter +import androidx.compose.ui.unit.dp +import io.element.android.compound.theme.ElementTheme +import io.element.android.libraries.architecture.AsyncData +import io.element.android.libraries.designsystem.components.async.AsyncFailure +import io.element.android.libraries.designsystem.components.async.AsyncLoading +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.SearchBar +import io.element.android.libraries.designsystem.theme.components.SearchBarResultState +import io.element.android.libraries.designsystem.theme.components.Text +import io.element.android.libraries.matrix.api.user.MatrixUser +import io.element.android.libraries.matrix.ui.components.CheckableUserRow +import io.element.android.libraries.matrix.ui.components.CheckableUserRowData +import io.element.android.libraries.matrix.ui.components.SelectedUsersRowList +import io.element.android.libraries.matrix.ui.model.getAvatarData +import io.element.android.libraries.matrix.ui.model.getBestName +import io.element.android.libraries.ui.strings.CommonStrings +import kotlinx.collections.immutable.ImmutableList + +@Composable +fun InvitePeopleView( + state: DefaultInvitePeopleState, + modifier: Modifier = Modifier, +) { + when (state.room) { + is AsyncData.Failure -> InvitePeopleViewError(state.room.error, modifier) + AsyncData.Uninitialized, + is AsyncData.Loading, + is AsyncData.Success -> InvitePeopleContentView(state, modifier) + } +} + +@Composable +private fun InvitePeopleViewError( + error: Throwable, + modifier: Modifier = Modifier, +) { + Box( + modifier = modifier.fillMaxSize(), + contentAlignment = Alignment.Center, + ) { + AsyncFailure( + throwable = error, + onRetry = null, + modifier = Modifier.padding(horizontal = 16.dp), + ) + } +} + +@Composable +private fun InvitePeopleContentView( + state: DefaultInvitePeopleState, + modifier: Modifier = Modifier, +) { + Column( + modifier = modifier.fillMaxSize(), + verticalArrangement = Arrangement.spacedBy(16.dp), + ) { + InvitePeopleSearchBar( + modifier = Modifier.fillMaxWidth(), + query = state.searchQuery, + showLoader = state.showSearchLoader, + selectedUsers = state.selectedUsers, + state = state.searchResults, + active = state.isSearchActive, + onActiveChange = { + state.eventSink( + DefaultInvitePeopleEvents.OnSearchActiveChanged( + it + ) + ) + }, + onTextChange = { state.eventSink(DefaultInvitePeopleEvents.UpdateSearchQuery(it)) }, + onToggleUser = { state.eventSink(DefaultInvitePeopleEvents.ToggleUser(it)) }, + ) + + if (!state.isSearchActive) { + SelectedUsersRowList( + modifier = Modifier.fillMaxWidth(), + selectedUsers = state.selectedUsers, + autoScroll = true, + onUserRemove = { state.eventSink(DefaultInvitePeopleEvents.ToggleUser(it)) }, + contentPadding = PaddingValues(16.dp), + ) + } + } +} + +@OptIn(ExperimentalMaterial3Api::class) +@Composable +private fun InvitePeopleSearchBar( + query: String, + state: SearchBarResultState>, + showLoader: Boolean, + selectedUsers: ImmutableList, + active: Boolean, + onActiveChange: (Boolean) -> Unit, + onTextChange: (String) -> Unit, + onToggleUser: (MatrixUser) -> Unit, + modifier: Modifier = Modifier, + placeHolderTitle: String = stringResource(CommonStrings.common_search_for_someone), +) { + SearchBar( + query = query, + onQueryChange = onTextChange, + active = active, + onActiveChange = onActiveChange, + modifier = modifier, + placeHolderTitle = placeHolderTitle, + contentPrefix = { + if (selectedUsers.isNotEmpty()) { + SelectedUsersRowList( + modifier = Modifier.fillMaxWidth(), + selectedUsers = selectedUsers, + autoScroll = true, + onUserRemove = onToggleUser, + contentPadding = PaddingValues(16.dp), + ) + } + }, + showBackButton = false, + resultState = state, + contentSuffix = { + if (showLoader) { + AsyncLoading() + } + }, + resultHandler = { results -> + Text( + text = stringResource(id = CommonStrings.common_search_results), + style = ElementTheme.typography.fontBodyLgMedium, + modifier = Modifier + .fillMaxWidth() + .padding(start = 16.dp, top = 12.dp, end = 16.dp, bottom = 8.dp) + ) + + LazyColumn { + itemsIndexed(results) { index, invitableUser -> + val invitedOrJoined = invitableUser.isAlreadyInvited || invitableUser.isAlreadyJoined + val isUnresolved = invitableUser.isUnresolved && !invitedOrJoined + val enabled = isUnresolved || !invitedOrJoined + val data = if (isUnresolved) { + CheckableUserRowData.Unresolved( + avatarData = invitableUser.matrixUser.getAvatarData(AvatarSize.UserListItem), + id = invitableUser.matrixUser.userId.value, + ) + } else { + CheckableUserRowData.Resolved( + avatarData = invitableUser.matrixUser.getAvatarData(AvatarSize.UserListItem), + name = invitableUser.matrixUser.getBestName(), + subtext = when { + // If they're already invited or joined we show that information + invitableUser.isAlreadyJoined -> stringResource(R.string.screen_invite_users_already_a_member) + invitableUser.isAlreadyInvited -> stringResource(R.string.screen_invite_users_already_invited) + // Otherwise show the ID, unless that's already used for their name + invitableUser.matrixUser.displayName.isNullOrEmpty() + .not() -> invitableUser.matrixUser.userId.value + else -> null + } + ) + } + CheckableUserRow( + checked = invitableUser.isSelected || invitedOrJoined, + enabled = enabled, + data = data, + onCheckedChange = { onToggleUser(invitableUser.matrixUser) }, + modifier = Modifier.fillMaxWidth() + ) + } + } + }, + ) +} + +@PreviewsDayNight +@Composable +internal fun InvitePeopleViewPreview(@PreviewParameter(DefaultInvitePeopleStateProvider::class) state: DefaultInvitePeopleState) = + ElementPreview { + InvitePeopleView(state = state) + } diff --git a/features/invitepeople/impl/src/main/res/values-be/translations.xml b/features/invitepeople/impl/src/main/res/values-be/translations.xml new file mode 100644 index 0000000000..7125d8b2e6 --- /dev/null +++ b/features/invitepeople/impl/src/main/res/values-be/translations.xml @@ -0,0 +1,5 @@ + + + "Ужо ўдзельнік" + "Ужо запрасілі" + diff --git a/features/invitepeople/impl/src/main/res/values-bg/translations.xml b/features/invitepeople/impl/src/main/res/values-bg/translations.xml new file mode 100644 index 0000000000..f585980920 --- /dev/null +++ b/features/invitepeople/impl/src/main/res/values-bg/translations.xml @@ -0,0 +1,5 @@ + + + "Вече е член" + "Вече е бил поканен" + diff --git a/features/invitepeople/impl/src/main/res/values-cs/translations.xml b/features/invitepeople/impl/src/main/res/values-cs/translations.xml new file mode 100644 index 0000000000..fa5b3aa9a9 --- /dev/null +++ b/features/invitepeople/impl/src/main/res/values-cs/translations.xml @@ -0,0 +1,5 @@ + + + "Již členem" + "Již pozván(a)" + diff --git a/features/invitepeople/impl/src/main/res/values-cy/translations.xml b/features/invitepeople/impl/src/main/res/values-cy/translations.xml new file mode 100644 index 0000000000..c58df3c541 --- /dev/null +++ b/features/invitepeople/impl/src/main/res/values-cy/translations.xml @@ -0,0 +1,5 @@ + + + "Eisoes yn aelod" + "Wedi gwahodd yn barod" + diff --git a/features/invitepeople/impl/src/main/res/values-da/translations.xml b/features/invitepeople/impl/src/main/res/values-da/translations.xml new file mode 100644 index 0000000000..fbb1814e9f --- /dev/null +++ b/features/invitepeople/impl/src/main/res/values-da/translations.xml @@ -0,0 +1,5 @@ + + + "Allerede medlem" + "Allerede inviteret" + diff --git a/features/invitepeople/impl/src/main/res/values-de/translations.xml b/features/invitepeople/impl/src/main/res/values-de/translations.xml new file mode 100644 index 0000000000..182d9f289a --- /dev/null +++ b/features/invitepeople/impl/src/main/res/values-de/translations.xml @@ -0,0 +1,5 @@ + + + "Bereits Mitglied" + "Bereits eingeladen" + diff --git a/features/invitepeople/impl/src/main/res/values-el/translations.xml b/features/invitepeople/impl/src/main/res/values-el/translations.xml new file mode 100644 index 0000000000..3e3c1fd5d2 --- /dev/null +++ b/features/invitepeople/impl/src/main/res/values-el/translations.xml @@ -0,0 +1,5 @@ + + + "Ήδη μέλος" + "Ήδη προσκεκλημένος" + diff --git a/features/invitepeople/impl/src/main/res/values-es/translations.xml b/features/invitepeople/impl/src/main/res/values-es/translations.xml new file mode 100644 index 0000000000..e62bb211e5 --- /dev/null +++ b/features/invitepeople/impl/src/main/res/values-es/translations.xml @@ -0,0 +1,5 @@ + + + "Ya eres miembro" + "Ya estás invitado" + diff --git a/features/invitepeople/impl/src/main/res/values-et/translations.xml b/features/invitepeople/impl/src/main/res/values-et/translations.xml new file mode 100644 index 0000000000..44484d23c3 --- /dev/null +++ b/features/invitepeople/impl/src/main/res/values-et/translations.xml @@ -0,0 +1,5 @@ + + + "Sa juba oled jututoa liige" + "Sa juba oled kutse saanud" + diff --git a/features/invitepeople/impl/src/main/res/values-eu/translations.xml b/features/invitepeople/impl/src/main/res/values-eu/translations.xml new file mode 100644 index 0000000000..a6aedd89cd --- /dev/null +++ b/features/invitepeople/impl/src/main/res/values-eu/translations.xml @@ -0,0 +1,5 @@ + + + "Kidea da dagoeneko" + "Lehendik ere gonbidatuta" + diff --git a/features/invitepeople/impl/src/main/res/values-fa/translations.xml b/features/invitepeople/impl/src/main/res/values-fa/translations.xml new file mode 100644 index 0000000000..544f01b8c8 --- /dev/null +++ b/features/invitepeople/impl/src/main/res/values-fa/translations.xml @@ -0,0 +1,5 @@ + + + "از پیش عضو است" + "از پیش دعوت شده" + diff --git a/features/invitepeople/impl/src/main/res/values-fi/translations.xml b/features/invitepeople/impl/src/main/res/values-fi/translations.xml new file mode 100644 index 0000000000..e347919719 --- /dev/null +++ b/features/invitepeople/impl/src/main/res/values-fi/translations.xml @@ -0,0 +1,5 @@ + + + "On jo jäsen" + "On jo kutsuttu" + diff --git a/features/invitepeople/impl/src/main/res/values-fr/translations.xml b/features/invitepeople/impl/src/main/res/values-fr/translations.xml new file mode 100644 index 0000000000..dcc16f58cf --- /dev/null +++ b/features/invitepeople/impl/src/main/res/values-fr/translations.xml @@ -0,0 +1,5 @@ + + + "Déjà membre" + "Déjà invité(e)" + diff --git a/features/invitepeople/impl/src/main/res/values-hu/translations.xml b/features/invitepeople/impl/src/main/res/values-hu/translations.xml new file mode 100644 index 0000000000..16f35b018c --- /dev/null +++ b/features/invitepeople/impl/src/main/res/values-hu/translations.xml @@ -0,0 +1,5 @@ + + + "Már tag" + "Már meghívták" + diff --git a/features/invitepeople/impl/src/main/res/values-in/translations.xml b/features/invitepeople/impl/src/main/res/values-in/translations.xml new file mode 100644 index 0000000000..e112033a06 --- /dev/null +++ b/features/invitepeople/impl/src/main/res/values-in/translations.xml @@ -0,0 +1,5 @@ + + + "Sudah menjadi anggota" + "Sudah diundang" + diff --git a/features/invitepeople/impl/src/main/res/values-it/translations.xml b/features/invitepeople/impl/src/main/res/values-it/translations.xml new file mode 100644 index 0000000000..979e42de1b --- /dev/null +++ b/features/invitepeople/impl/src/main/res/values-it/translations.xml @@ -0,0 +1,5 @@ + + + "Già membro" + "Già invitato" + diff --git a/features/invitepeople/impl/src/main/res/values-ka/translations.xml b/features/invitepeople/impl/src/main/res/values-ka/translations.xml new file mode 100644 index 0000000000..3a34c2edac --- /dev/null +++ b/features/invitepeople/impl/src/main/res/values-ka/translations.xml @@ -0,0 +1,5 @@ + + + "უკვე წევრია" + "უკვე მოწვეულია" + diff --git a/features/invitepeople/impl/src/main/res/values-lt/translations.xml b/features/invitepeople/impl/src/main/res/values-lt/translations.xml new file mode 100644 index 0000000000..59c15290a1 --- /dev/null +++ b/features/invitepeople/impl/src/main/res/values-lt/translations.xml @@ -0,0 +1,5 @@ + + + "Jau narys" + "Jau pakviestas" + diff --git a/features/invitepeople/impl/src/main/res/values-nb/translations.xml b/features/invitepeople/impl/src/main/res/values-nb/translations.xml new file mode 100644 index 0000000000..617b9271d5 --- /dev/null +++ b/features/invitepeople/impl/src/main/res/values-nb/translations.xml @@ -0,0 +1,5 @@ + + + "Allerede medlem" + "Allerede invitert" + diff --git a/features/invitepeople/impl/src/main/res/values-nl/translations.xml b/features/invitepeople/impl/src/main/res/values-nl/translations.xml new file mode 100644 index 0000000000..b978dcd9cc --- /dev/null +++ b/features/invitepeople/impl/src/main/res/values-nl/translations.xml @@ -0,0 +1,5 @@ + + + "Reeds lid" + "Reeds uitgenodigd" + diff --git a/features/invitepeople/impl/src/main/res/values-pl/translations.xml b/features/invitepeople/impl/src/main/res/values-pl/translations.xml new file mode 100644 index 0000000000..bfd537bb4b --- /dev/null +++ b/features/invitepeople/impl/src/main/res/values-pl/translations.xml @@ -0,0 +1,5 @@ + + + "Jest już członkiem" + "Już zaproszony" + diff --git a/features/invitepeople/impl/src/main/res/values-pt-rBR/translations.xml b/features/invitepeople/impl/src/main/res/values-pt-rBR/translations.xml new file mode 100644 index 0000000000..7ad049843b --- /dev/null +++ b/features/invitepeople/impl/src/main/res/values-pt-rBR/translations.xml @@ -0,0 +1,5 @@ + + + "Já é membro" + "Já foi convidado" + diff --git a/features/invitepeople/impl/src/main/res/values-pt/translations.xml b/features/invitepeople/impl/src/main/res/values-pt/translations.xml new file mode 100644 index 0000000000..a953d11f67 --- /dev/null +++ b/features/invitepeople/impl/src/main/res/values-pt/translations.xml @@ -0,0 +1,5 @@ + + + "Já é participante" + "Já foi convidado" + diff --git a/features/invitepeople/impl/src/main/res/values-ro/translations.xml b/features/invitepeople/impl/src/main/res/values-ro/translations.xml new file mode 100644 index 0000000000..f03be4b263 --- /dev/null +++ b/features/invitepeople/impl/src/main/res/values-ro/translations.xml @@ -0,0 +1,5 @@ + + + "Deja membru" + "Deja invitat" + diff --git a/features/invitepeople/impl/src/main/res/values-ru/translations.xml b/features/invitepeople/impl/src/main/res/values-ru/translations.xml new file mode 100644 index 0000000000..0ae8eb792c --- /dev/null +++ b/features/invitepeople/impl/src/main/res/values-ru/translations.xml @@ -0,0 +1,5 @@ + + + "Уже зарегистрирован" + "Уже приглашены" + diff --git a/features/invitepeople/impl/src/main/res/values-sk/translations.xml b/features/invitepeople/impl/src/main/res/values-sk/translations.xml new file mode 100644 index 0000000000..68e34b0ada --- /dev/null +++ b/features/invitepeople/impl/src/main/res/values-sk/translations.xml @@ -0,0 +1,5 @@ + + + "Už ste členom" + "Už ste pozvaní" + diff --git a/features/invitepeople/impl/src/main/res/values-sv/translations.xml b/features/invitepeople/impl/src/main/res/values-sv/translations.xml new file mode 100644 index 0000000000..fd670c9c1a --- /dev/null +++ b/features/invitepeople/impl/src/main/res/values-sv/translations.xml @@ -0,0 +1,5 @@ + + + "Redan medlem" + "Redan inbjuden" + diff --git a/features/invitepeople/impl/src/main/res/values-tr/translations.xml b/features/invitepeople/impl/src/main/res/values-tr/translations.xml new file mode 100644 index 0000000000..427a7f3f10 --- /dev/null +++ b/features/invitepeople/impl/src/main/res/values-tr/translations.xml @@ -0,0 +1,5 @@ + + + "Zaten üye" + "Zaten davet edildi" + diff --git a/features/invitepeople/impl/src/main/res/values-uk/translations.xml b/features/invitepeople/impl/src/main/res/values-uk/translations.xml new file mode 100644 index 0000000000..da3ac9fe5b --- /dev/null +++ b/features/invitepeople/impl/src/main/res/values-uk/translations.xml @@ -0,0 +1,5 @@ + + + "Уже учасник" + "Уже запрошені" + diff --git a/features/invitepeople/impl/src/main/res/values-ur/translations.xml b/features/invitepeople/impl/src/main/res/values-ur/translations.xml new file mode 100644 index 0000000000..06e8cee414 --- /dev/null +++ b/features/invitepeople/impl/src/main/res/values-ur/translations.xml @@ -0,0 +1,5 @@ + + + "پہلے سے ہی رکن" + "پہلے سے مدعو شدہ" + diff --git a/features/invitepeople/impl/src/main/res/values-uz/translations.xml b/features/invitepeople/impl/src/main/res/values-uz/translations.xml new file mode 100644 index 0000000000..445a62d318 --- /dev/null +++ b/features/invitepeople/impl/src/main/res/values-uz/translations.xml @@ -0,0 +1,5 @@ + + + "Allaqachon a\'zo" + "Allaqachon taklif qilingan" + diff --git a/features/invitepeople/impl/src/main/res/values-zh-rTW/translations.xml b/features/invitepeople/impl/src/main/res/values-zh-rTW/translations.xml new file mode 100644 index 0000000000..c8117ec283 --- /dev/null +++ b/features/invitepeople/impl/src/main/res/values-zh-rTW/translations.xml @@ -0,0 +1,5 @@ + + + "已是成員" + "已邀請" + diff --git a/features/invitepeople/impl/src/main/res/values-zh/translations.xml b/features/invitepeople/impl/src/main/res/values-zh/translations.xml new file mode 100644 index 0000000000..b1e0e953f8 --- /dev/null +++ b/features/invitepeople/impl/src/main/res/values-zh/translations.xml @@ -0,0 +1,5 @@ + + + "已经是成员" + "已邀请" + diff --git a/features/invitepeople/impl/src/main/res/values/localazy.xml b/features/invitepeople/impl/src/main/res/values/localazy.xml new file mode 100644 index 0000000000..d89ae92e75 --- /dev/null +++ b/features/invitepeople/impl/src/main/res/values/localazy.xml @@ -0,0 +1,5 @@ + + + "Already a member" + "Already invited" + diff --git a/features/invitepeople/impl/src/test/kotlin/io/element/android/features/invitepeople/impl/DefaultInvitePeoplePresenterTest.kt b/features/invitepeople/impl/src/test/kotlin/io/element/android/features/invitepeople/impl/DefaultInvitePeoplePresenterTest.kt new file mode 100644 index 0000000000..1e438fab8e --- /dev/null +++ b/features/invitepeople/impl/src/test/kotlin/io/element/android/features/invitepeople/impl/DefaultInvitePeoplePresenterTest.kt @@ -0,0 +1,547 @@ +/* + * Copyright 2023, 2024 New Vector Ltd. + * + * SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial + * Please see LICENSE files in the repository root for full details. + */ + +package io.element.android.features.invitepeople.impl + +import app.cash.turbine.ReceiveTurbine +import com.google.common.truth.Truth.assertThat +import io.element.android.features.invitepeople.api.InvitePeopleEvents +import io.element.android.libraries.architecture.AsyncData +import io.element.android.libraries.core.coroutine.CoroutineDispatchers +import io.element.android.libraries.designsystem.theme.components.SearchBarResultState +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.UserId +import io.element.android.libraries.matrix.api.room.JoinedRoom +import io.element.android.libraries.matrix.api.room.RoomMembersState +import io.element.android.libraries.matrix.api.room.RoomMembershipState +import io.element.android.libraries.matrix.api.user.MatrixUser +import io.element.android.libraries.matrix.test.AN_EXCEPTION +import io.element.android.libraries.matrix.test.A_ROOM_ID +import io.element.android.libraries.matrix.test.A_USER_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.room.FakeJoinedRoom +import io.element.android.libraries.matrix.test.room.aRoomMember +import io.element.android.libraries.matrix.test.room.aRoomMemberList +import io.element.android.libraries.matrix.ui.components.aMatrixUser +import io.element.android.libraries.matrix.ui.components.aMatrixUserList +import io.element.android.libraries.ui.strings.CommonStrings +import io.element.android.libraries.usersearch.api.UserRepository +import io.element.android.libraries.usersearch.api.UserSearchResult +import io.element.android.libraries.usersearch.api.UserSearchResultState +import io.element.android.libraries.usersearch.test.FakeUserRepository +import io.element.android.services.apperror.api.AppErrorStateService +import io.element.android.services.apperror.test.FakeAppErrorStateService +import io.element.android.tests.testutils.WarmUpRule +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 io.element.android.tests.testutils.test +import io.element.android.tests.testutils.testCoroutineDispatchers +import kotlinx.collections.immutable.ImmutableList +import kotlinx.collections.immutable.persistentListOf +import kotlinx.coroutines.delay +import kotlinx.coroutines.test.TestScope +import kotlinx.coroutines.test.runTest +import org.junit.Rule +import org.junit.Test + +internal class DefaultInvitePeoplePresenterTest { + @get:Rule + val warmUpRule = WarmUpRule() + + @Test + fun `present - initial state has no results and no search`() = runTest { + val presenter = createDefaultInvitePeoplePresenter() + presenter.test { + val initialState = awaitItemAsDefault() + assertThat(initialState.room).isEqualTo(AsyncData.Success(Unit)) + assertThat(initialState.searchResults).isInstanceOf(SearchBarResultState.Initial::class.java) + assertThat(initialState.isSearchActive).isFalse() + assertThat(initialState.canInvite).isFalse() + assertThat(initialState.searchQuery).isEmpty() + + skipItems(1) + } + } + + @Test + fun `present - updates search active state`() = runTest { + val presenter = createDefaultInvitePeoplePresenter() + presenter.test { + val initialState = awaitItem() + skipItems(1) + + initialState.eventSink(DefaultInvitePeopleEvents.OnSearchActiveChanged(true)) + + val resultState = awaitItem() + assertThat(resultState.isSearchActive).isTrue() + resultState.eventSink(DefaultInvitePeopleEvents.UpdateSearchQuery("some query")) + assertThat(awaitItemAsDefault().searchQuery).isEqualTo("some query") + resultState.eventSink(InvitePeopleEvents.CloseSearch) + skipItems(1) + awaitItemAsDefault().also { + assertThat(it.isSearchActive).isFalse() + assertThat(it.searchQuery).isEmpty() + } + } + } + + @Test + fun `present - performs search and handles empty result list`() = runTest { + val repository = FakeUserRepository() + val presenter = createDefaultInvitePeoplePresenter( + userRepository = repository, + coroutineDispatchers = testCoroutineDispatchers(useUnconfinedTestDispatcher = true) + ) + presenter.test { + val initialState = awaitItem() + initialState.eventSink(DefaultInvitePeopleEvents.UpdateSearchQuery("some query")) + assertThat(repository.providedQuery).isEqualTo("some query") + repository.emitState(UserSearchResultState(results = emptyList(), isSearching = true)) + skipItems(3) + awaitItemAsDefault().also { state -> + assertThat(state.searchResults).isInstanceOf(SearchBarResultState.Initial::class.java) + assertThat(state.showSearchLoader).isTrue() + } + repository.emitState(results = emptyList(), isSearching = false) + awaitItemAsDefault().also { state -> + assertThat(state.searchResults).isInstanceOf(SearchBarResultState.NoResultsFound::class.java) + assertThat(state.showSearchLoader).isFalse() + } + } + } + + @Test + fun `present - performs search and handles user results`() = runTest { + val repository = FakeUserRepository() + val presenter = createDefaultInvitePeoplePresenter( + userRepository = repository, + coroutineDispatchers = testCoroutineDispatchers(useUnconfinedTestDispatcher = true) + ) + presenter.test { + val initialState = awaitItem() + skipItems(1) + + initialState.eventSink(DefaultInvitePeopleEvents.UpdateSearchQuery("some query")) + skipItems(1) + + assertThat(repository.providedQuery).isEqualTo("some query") + repository.emitStateWithUsers(users = aMatrixUserList()) + skipItems(1) + + val resultState = awaitItemAsDefault() + assertThat(resultState.searchResults).isInstanceOf(SearchBarResultState.Results::class.java) + + val expectedUsers = aMatrixUserList() + val users = resultState.searchResults.users() + expectedUsers.forEachIndexed { index, matrixUser -> + assertThat(users[index].matrixUser).isEqualTo(matrixUser) + // All users are joined or invited + if (users[index].isAlreadyInvited) { + assertThat(users[index].isAlreadyJoined).isFalse() + } else { + assertThat(users[index].isAlreadyJoined).isTrue() + } + assertThat(users[index].isSelected).isFalse() + } + } + } + + @Test + fun `present - performs search and handles membership state of existing users`() = runTest { + val userList = aMatrixUserList() + val joinedUser = userList[0] + val invitedUser = userList[1] + + val repository = FakeUserRepository() + val coroutineDispatchers = testCoroutineDispatchers(useUnconfinedTestDispatcher = true) + val presenter = createDefaultInvitePeoplePresenter( + userRepository = repository, + roomMembersState = RoomMembersState.Ready( + persistentListOf( + aRoomMember( + userId = joinedUser.userId, + membership = RoomMembershipState.JOIN + ), + aRoomMember( + userId = invitedUser.userId, + membership = RoomMembershipState.INVITE + ), + ) + ), + coroutineDispatchers = coroutineDispatchers, + ) + presenter.test { + val initialState = awaitItem() + skipItems(1) + + initialState.eventSink(DefaultInvitePeopleEvents.UpdateSearchQuery("some query")) + skipItems(1) + + assertThat(repository.providedQuery).isEqualTo("some query") + repository.emitStateWithUsers(users = aMatrixUserList()) + skipItems(1) + + val resultState = awaitItemAsDefault() + assertThat(resultState.searchResults).isInstanceOf(SearchBarResultState.Results::class.java) + + val users = resultState.searchResults.users() + + // The result that matches a user with JOINED membership is marked as such + val userWhoShouldBeJoined = users.find { it.matrixUser == joinedUser } + assertThat(userWhoShouldBeJoined).isNotNull() + assertThat(userWhoShouldBeJoined?.isAlreadyJoined).isTrue() + assertThat(userWhoShouldBeJoined?.isAlreadyInvited).isFalse() + + // The result that matches a user with INVITED membership is marked as such + val userWhoShouldBeInvited = users.find { it.matrixUser == invitedUser } + assertThat(userWhoShouldBeInvited).isNotNull() + assertThat(userWhoShouldBeInvited?.isAlreadyJoined).isFalse() + assertThat(userWhoShouldBeInvited?.isAlreadyInvited).isTrue() + + // All other users are neither joined nor invited + val otherUsers = users.minus(userWhoShouldBeInvited!!).minus(userWhoShouldBeJoined!!) + assertThat(otherUsers.none { it.isAlreadyInvited }).isTrue() + assertThat(otherUsers.none { it.isAlreadyJoined }).isTrue() + } + } + + @Test + fun `present - performs search and handles unresolved results`() = runTest { + val userList = aMatrixUserList() + val joinedUser = userList[0] + val invitedUser = userList[1] + + val repository = FakeUserRepository() + val presenter = createDefaultInvitePeoplePresenter( + userRepository = repository, + roomMembersState = + RoomMembersState.Ready( + persistentListOf( + aRoomMember( + userId = joinedUser.userId, + membership = RoomMembershipState.JOIN + ), + aRoomMember( + userId = invitedUser.userId, + membership = RoomMembershipState.INVITE + ), + ) + ), + coroutineDispatchers = testCoroutineDispatchers(useUnconfinedTestDispatcher = true) + ) + + presenter.test { + val initialState = awaitItem() + skipItems(1) + + initialState.eventSink(DefaultInvitePeopleEvents.UpdateSearchQuery("some query")) + skipItems(1) + + assertThat(repository.providedQuery).isEqualTo("some query") + + val unresolvedUser = + UserSearchResult(aMatrixUser(id = A_USER_ID.value), isUnresolved = true) + repository.emitState(listOf(unresolvedUser) + aMatrixUserList().map { + UserSearchResult( + it + ) + }) + skipItems(1) + + val resultState = awaitItemAsDefault() + assertThat(resultState.searchResults).isInstanceOf(SearchBarResultState.Results::class.java) + + val users = resultState.searchResults.users() + + val userWhoShouldBeUnresolved = users.first() + assertThat(userWhoShouldBeUnresolved.isUnresolved).isTrue() + + // All other users are neither joined nor invited + val otherUsers = users.minus(userWhoShouldBeUnresolved) + assertThat(otherUsers.none { it.isUnresolved }).isTrue() + } + } + + @Test + fun `present - toggle users updates selected user state`() = runTest { + val repository = FakeUserRepository() + val presenter = createDefaultInvitePeoplePresenter( + userRepository = repository, + coroutineDispatchers = testCoroutineDispatchers() + ) + presenter.test { + val initialState = awaitItem() + skipItems(1) + + // When we toggle a user not in the list, they are added + initialState.eventSink(DefaultInvitePeopleEvents.ToggleUser(aMatrixUser())) + assertThat(awaitItemAsDefault().selectedUsers).containsExactly(aMatrixUser()) + + // Toggling a different user also adds them + initialState.eventSink(DefaultInvitePeopleEvents.ToggleUser(aMatrixUser(id = A_USER_ID_2.value))) + assertThat(awaitItemAsDefault().selectedUsers).containsExactly( + aMatrixUser(), + aMatrixUser(id = A_USER_ID_2.value) + ) + + // Toggling the first user removes them + initialState.eventSink(DefaultInvitePeopleEvents.ToggleUser(aMatrixUser())) + assertThat(awaitItemAsDefault().selectedUsers).containsExactly(aMatrixUser(id = A_USER_ID_2.value)) + } + } + + @Test + fun `present - selected users appear as such in search results`() = runTest { + val repository = FakeUserRepository() + val presenter = createDefaultInvitePeoplePresenter( + userRepository = repository, + coroutineDispatchers = testCoroutineDispatchers(useUnconfinedTestDispatcher = true) + ) + presenter.test { + val initialState = awaitItem() + skipItems(1) + + val selectedUser = aMatrixUser() + + initialState.eventSink(DefaultInvitePeopleEvents.ToggleUser(selectedUser)) + + initialState.eventSink(DefaultInvitePeopleEvents.UpdateSearchQuery("some query")) + skipItems(1) + + assertThat(repository.providedQuery).isEqualTo("some query") + repository.emitStateWithUsers(users = aMatrixUserList() + selectedUser) + skipItems(2) + + val resultState = awaitItemAsDefault() + assertThat(resultState.searchResults).isInstanceOf(SearchBarResultState.Results::class.java) + + val users = resultState.searchResults.users() + + // The one user we have previously toggled is marked as selected + val shouldBeSelectedUser = users.find { it.matrixUser == selectedUser } + assertThat(shouldBeSelectedUser).isNotNull() + assertThat(shouldBeSelectedUser?.isSelected).isTrue() + + // And no others are + val allOtherUsers = users.minus(shouldBeSelectedUser!!) + assertThat(allOtherUsers.none { it.isSelected }).isTrue() + } + } + + @Test + fun `present - toggling a user updates existing search results`() = runTest { + val repository = FakeUserRepository() + val presenter = createDefaultInvitePeoplePresenter( + userRepository = repository, + coroutineDispatchers = testCoroutineDispatchers(useUnconfinedTestDispatcher = true) + ) + presenter.test { + val initialState = awaitItem() + skipItems(1) + + val selectedUser = aMatrixUser() + + // Given a query is made + initialState.eventSink(DefaultInvitePeopleEvents.UpdateSearchQuery("some query")) + skipItems(1) + + assertThat(repository.providedQuery).isEqualTo("some query") + repository.emitStateWithUsers(users = aMatrixUserList() + selectedUser) + skipItems(1) + awaitItemAsDefault().also { state -> + // selectedUser is not selected + assertThat(state.searchResults).isInstanceOf(SearchBarResultState.Results::class.java) + val users = state.searchResults.users() + val shouldNotBeSelectedUser = users.find { it.matrixUser == selectedUser } + assertThat(shouldNotBeSelectedUser).isNotNull() + assertThat(shouldNotBeSelectedUser?.isSelected).isFalse() + } + + // And then a user is toggled + initialState.eventSink(DefaultInvitePeopleEvents.ToggleUser(selectedUser)) + skipItems(1) + val resultState = awaitItemAsDefault() + + // The results are updated... + assertThat(resultState.searchResults).isInstanceOf(SearchBarResultState.Results::class.java) + val users = resultState.searchResults.users() + + // The one user we have now toggled is marked as selected + val shouldBeSelectedUser = users.find { it.matrixUser == selectedUser } + assertThat(shouldBeSelectedUser).isNotNull() + assertThat(shouldBeSelectedUser?.isSelected).isTrue() + + // And no others are + val allOtherUsers = users.minus(shouldBeSelectedUser!!) + assertThat(allOtherUsers.none { it.isSelected }).isTrue() + } + } + + @Test + fun `present - toggling a user and send invite success`() = runTest { + val repository = FakeUserRepository() + val inviteUserResult = lambdaRecorder> { userId: UserId -> + Result.success(Unit) + } + val presenter = createDefaultInvitePeoplePresenter( + userRepository = repository, + inviteUserResult = inviteUserResult, + coroutineDispatchers = testCoroutineDispatchers(useUnconfinedTestDispatcher = true) + ) + presenter.test { + val initialState = awaitItem() + skipItems(1) + val selectedUser = aMatrixUser() + repository.emitStateWithUsers(users = aMatrixUserList() + selectedUser) + skipItems(1) + // And then a user is toggled + initialState.eventSink(DefaultInvitePeopleEvents.ToggleUser(selectedUser)) + skipItems(1) + val resultState = awaitItemAsDefault() + // The results are updated... + assertThat(resultState.searchResults).isInstanceOf(SearchBarResultState.Results::class.java) + // Send invites + initialState.eventSink(InvitePeopleEvents.SendInvites) + delay(1_000) + inviteUserResult.assertions().isCalledOnce().with( + value(selectedUser.userId) + ) + } + } + + @Test + fun `present - toggling a user and send invite error`() = runTest { + val repository = FakeUserRepository() + val inviteUserResult = lambdaRecorder> { _: UserId -> + Result.failure(AN_EXCEPTION) + } + val showErrorResResult = lambdaRecorder { _, _ -> } + val presenter = createDefaultInvitePeoplePresenter( + userRepository = repository, + inviteUserResult = inviteUserResult, + coroutineDispatchers = testCoroutineDispatchers(useUnconfinedTestDispatcher = true), + appErrorStateService = FakeAppErrorStateService( + showErrorResResult = showErrorResResult, + ) + ) + presenter.test { + val initialState = awaitItem() + skipItems(1) + val selectedUser = aMatrixUser() + repository.emitStateWithUsers(users = aMatrixUserList() + selectedUser) + skipItems(1) + // And then a user is toggled + initialState.eventSink(DefaultInvitePeopleEvents.ToggleUser(selectedUser)) + skipItems(1) + val resultState = awaitItemAsDefault() + // The results are updated... + assertThat(resultState.searchResults).isInstanceOf(SearchBarResultState.Results::class.java) + // Send invites + initialState.eventSink(InvitePeopleEvents.SendInvites) + delay(1_000) + inviteUserResult.assertions().isCalledOnce().with( + value(selectedUser.userId) + ) + showErrorResResult.assertions() + .isCalledOnce() + .with( + value(CommonStrings.common_unable_to_invite_title), + value(CommonStrings.common_unable_to_invite_message) + ) + } + } + + @Test + fun `present - when joinedRoom is not provided, it is retrieved on the MatrixClient`() = runTest { + val matrixClient = FakeMatrixClient().apply { + givenGetRoomResult(A_ROOM_ID, FakeJoinedRoom()) + } + val presenter = createDefaultInvitePeoplePresenter( + joinedRoom = null, + roomId = A_ROOM_ID, + matrixClient = matrixClient, + ) + presenter.test { + val initialState = awaitItemAsDefault() + assertThat(initialState.room.isLoading()).isTrue() + val finalState = awaitItemAsDefault() + assertThat(finalState.room).isEqualTo(AsyncData.Success(Unit)) + } + } + + @Test + fun `present - when joinedRoom is not provided, it is retrieved on the MatrixClient - error case`() = runTest { + val matrixClient = FakeMatrixClient() + val presenter = createDefaultInvitePeoplePresenter( + joinedRoom = null, + roomId = A_ROOM_ID, + matrixClient = matrixClient, + ) + presenter.test { + val initialState = awaitItemAsDefault() + assertThat(initialState.room.isLoading()).isTrue() + val finalState = awaitItemAsDefault() + assertThat(finalState.room.errorOrNull()?.message).isEqualTo("Room not found") + } + } + + private suspend fun FakeUserRepository.emitStateWithUsers( + users: List, + isSearching: Boolean = false + ) { + emitState( + results = users.map { UserSearchResult(it) }, + isSearching = isSearching, + ) + } + + private suspend fun FakeUserRepository.emitState( + results: List, + isSearching: Boolean = false + ) { + val state = UserSearchResultState( + results = results, + isSearching = isSearching + ) + emitState(state) + } + + private fun SearchBarResultState>.users() = + (this as? SearchBarResultState.Results>)?.results.orEmpty() +} + +private suspend fun ReceiveTurbine.awaitItemAsDefault(): DefaultInvitePeopleState { + return awaitItem() as DefaultInvitePeopleState +} + +fun TestScope.createDefaultInvitePeoplePresenter( + roomMembersState: RoomMembersState = RoomMembersState.Ready(aRoomMemberList()), + inviteUserResult: (UserId) -> Result = { lambdaError() }, + joinedRoom: JoinedRoom? = FakeJoinedRoom( + inviteUserResult = inviteUserResult, + ).apply { + givenRoomMembersState(roomMembersState) + }, + roomId: RoomId = A_ROOM_ID, + userRepository: UserRepository = FakeUserRepository(), + coroutineDispatchers: CoroutineDispatchers = testCoroutineDispatchers(), + appErrorStateService: AppErrorStateService = FakeAppErrorStateService(), + matrixClient: MatrixClient = FakeMatrixClient(), +): DefaultInvitePeoplePresenter { + return DefaultInvitePeoplePresenter( + joinedRoom = joinedRoom, + roomId = roomId, + userRepository = userRepository, + coroutineDispatchers = coroutineDispatchers, + sessionCoroutineScope = backgroundScope, + appErrorStateService = appErrorStateService, + matrixClient = matrixClient, + ) +} diff --git a/features/joinroom/impl/src/main/kotlin/io/element/android/features/joinroom/impl/JoinRoomView.kt b/features/joinroom/impl/src/main/kotlin/io/element/android/features/joinroom/impl/JoinRoomView.kt index cdeac0afe9..d20e1fe596 100644 --- a/features/joinroom/impl/src/main/kotlin/io/element/android/features/joinroom/impl/JoinRoomView.kt +++ b/features/joinroom/impl/src/main/kotlin/io/element/android/features/joinroom/impl/JoinRoomView.kt @@ -46,7 +46,7 @@ import io.element.android.libraries.designsystem.atomic.atoms.RoomPreviewTitleAt import io.element.android.libraries.designsystem.atomic.molecules.ButtonRowMolecule import io.element.android.libraries.designsystem.atomic.molecules.IconTitlePlaceholdersRowMolecule import io.element.android.libraries.designsystem.atomic.molecules.IconTitleSubtitleMolecule -import io.element.android.libraries.designsystem.atomic.molecules.RoomPreviewMembersCountMolecule +import io.element.android.libraries.designsystem.atomic.molecules.MembersCountMolecule import io.element.android.libraries.designsystem.atomic.organisms.RoomPreviewOrganism import io.element.android.libraries.designsystem.atomic.pages.HeaderFooterPage import io.element.android.libraries.designsystem.components.Announcement @@ -546,7 +546,7 @@ private fun DefaultLoadedContent( }, memberCount = { if (contentState.showMemberCount) { - RoomPreviewMembersCountMolecule(memberCount = contentState.numberOfMembers ?: 0) + MembersCountMolecule(memberCount = contentState.numberOfMembers ?: 0) } } ) diff --git a/features/joinroom/impl/src/main/res/values-eu/translations.xml b/features/joinroom/impl/src/main/res/values-eu/translations.xml index 4d6ddd9dbd..e22c65fcb9 100644 --- a/features/joinroom/impl/src/main/res/values-eu/translations.xml +++ b/features/joinroom/impl/src/main/res/values-eu/translations.xml @@ -3,6 +3,8 @@ "Arrazoia: %1$s." "Utzi eskaera bertan behera" "Bai, utzi bertan behera" + "Eman gonbidapenari ezetza eta blokeatu" + "Eman ezetza eta blokeatu" "Gelara sartzeak huts egin du." "Ahaztu gela hau" "Sartu gelan" diff --git a/features/joinroom/impl/src/main/res/values-fi/translations.xml b/features/joinroom/impl/src/main/res/values-fi/translations.xml index 9e3c6af16f..b9d2da01ad 100644 --- a/features/joinroom/impl/src/main/res/values-fi/translations.xml +++ b/features/joinroom/impl/src/main/res/values-fi/translations.xml @@ -18,7 +18,7 @@ "Liity huoneeseen" "Saatat tarvita kutsun tai olla tilan jäsen, jotta voit liittyä." "Lähetä liittymispyyntö" - "Sallitut merkit %1$d / %2$d" + "%1$d merkkiä käytetty, %2$d merkkiä sallittu" "Viesti (valinnainen)" "Saat kutsun liittyä huoneeseen, jos pyyntösi hyväksytään." "Liittymispyyntö lähetetty" diff --git a/features/joinroom/impl/src/main/res/values-sv/translations.xml b/features/joinroom/impl/src/main/res/values-sv/translations.xml index a6aa79ebd9..78924f1cd6 100644 --- a/features/joinroom/impl/src/main/res/values-sv/translations.xml +++ b/features/joinroom/impl/src/main/res/values-sv/translations.xml @@ -18,6 +18,7 @@ "Gå med i rummet" "Du kan behöva bli inbjuden eller vara medlem i ett utrymme för att gå med." "Knacka för att gå med" + "Tillåtna tecken %1$d av %2$d" "Meddelande (valfritt)" "Du kommer att få en inbjudan att gå med i rummet om din begäran accepteras." "Begäran om att gå med skickad" diff --git a/features/joinroom/impl/src/main/res/values-zh-rTW/translations.xml b/features/joinroom/impl/src/main/res/values-zh-rTW/translations.xml index b176a76e0f..a66510111c 100644 --- a/features/joinroom/impl/src/main/res/values-zh-rTW/translations.xml +++ b/features/joinroom/impl/src/main/res/values-zh-rTW/translations.xml @@ -18,6 +18,7 @@ "加入聊天室" "您可能需要被邀請成為空間的成員才能加入。" "傳送加入請求" + "允許的字元 %1$d 中的 %2$d" "訊息(選擇性)" "若接受了您的請求,您將會收到加入聊天是的邀請。" "已傳送加入請求" diff --git a/features/joinroom/impl/src/main/res/values-zh/translations.xml b/features/joinroom/impl/src/main/res/values-zh/translations.xml index 8b6e9088c1..50a4c65028 100644 --- a/features/joinroom/impl/src/main/res/values-zh/translations.xml +++ b/features/joinroom/impl/src/main/res/values-zh/translations.xml @@ -7,6 +7,10 @@ "是的,取消" "您确定要取消加入此房间的请求吗?" "取消加入申请" + "是的,拒绝并屏蔽" + "您确定要拒绝加入此房间的邀请吗?这也将阻止%1$s 与您联系或邀请您加入房间。" + "拒绝邀请并屏蔽" + "拒绝并屏蔽" "加入房间失败。" "要么此房间仅限受邀者,要么可能在空间层级有加入限制。" "忘记这个房间" @@ -17,6 +21,8 @@ "消息(可选)" "如果您的请求被接受,您将收到加入房间的邀请。" "加入请求已发送" + "无法显示房间预览。这可能是由于网络或服务器问题造成的。" + "无法显示此房间预览" "%1$s 尚不支持空间。您可以通过 Web 端访问空间" "空间尚不支持" "点击下面的按钮,系统将通知聊天室管理员。获得批准后将能够加入对话。" diff --git a/features/joinroom/impl/src/test/kotlin/io/element/android/features/joinroom/impl/JoinRoomPresenterTest.kt b/features/joinroom/impl/src/test/kotlin/io/element/android/features/joinroom/impl/JoinRoomPresenterTest.kt index 8a475668ae..cabab56802 100644 --- a/features/joinroom/impl/src/test/kotlin/io/element/android/features/joinroom/impl/JoinRoomPresenterTest.kt +++ b/features/joinroom/impl/src/test/kotlin/io/element/android/features/joinroom/impl/JoinRoomPresenterTest.kt @@ -58,6 +58,7 @@ import io.element.android.tests.testutils.lambda.assert import io.element.android.tests.testutils.lambda.lambdaRecorder import io.element.android.tests.testutils.lambda.value import io.element.android.tests.testutils.test +import kotlinx.collections.immutable.persistentListOf import kotlinx.coroutines.flow.first import kotlinx.coroutines.flow.flowOf import kotlinx.coroutines.test.runTest @@ -913,7 +914,7 @@ class JoinRoomPresenterTest { val client = FakeMatrixClient( getNotJoinedRoomResult = { _, _ -> Result.success( - aRoomPreview(info = aRoomPreviewInfo(joinRule = JoinRule.KnockRestricted(emptyList()))) + aRoomPreview(info = aRoomPreviewInfo(joinRule = JoinRule.KnockRestricted(persistentListOf()))) ) } ) @@ -933,7 +934,7 @@ class JoinRoomPresenterTest { val client = FakeMatrixClient( getNotJoinedRoomResult = { _, _ -> Result.success( - aRoomPreview(info = aRoomPreviewInfo(joinRule = JoinRule.Restricted(emptyList()))) + aRoomPreview(info = aRoomPreviewInfo(joinRule = JoinRule.Restricted(persistentListOf()))) ) } ) diff --git a/features/knockrequests/impl/src/main/kotlin/io/element/android/features/knockrequests/impl/banner/KnockRequestsBannerView.kt b/features/knockrequests/impl/src/main/kotlin/io/element/android/features/knockrequests/impl/banner/KnockRequestsBannerView.kt index 334bb531ae..2ee070d41c 100644 --- a/features/knockrequests/impl/src/main/kotlin/io/element/android/features/knockrequests/impl/banner/KnockRequestsBannerView.kt +++ b/features/knockrequests/impl/src/main/kotlin/io/element/android/features/knockrequests/impl/banner/KnockRequestsBannerView.kt @@ -38,6 +38,7 @@ import io.element.android.libraries.designsystem.components.async.AsyncIndicator import io.element.android.libraries.designsystem.components.async.AsyncIndicatorHost import io.element.android.libraries.designsystem.components.async.rememberAsyncIndicatorState import io.element.android.libraries.designsystem.components.avatar.Avatar +import io.element.android.libraries.designsystem.components.avatar.AvatarRow import io.element.android.libraries.designsystem.components.avatar.AvatarSize import io.element.android.libraries.designsystem.components.avatar.AvatarType import io.element.android.libraries.designsystem.preview.ElementPreview diff --git a/features/leaveroom/api/src/main/res/values-eu/translations.xml b/features/leaveroom/api/src/main/res/values-eu/translations.xml index df735861b8..16fee54c82 100644 --- a/features/leaveroom/api/src/main/res/values-eu/translations.xml +++ b/features/leaveroom/api/src/main/res/values-eu/translations.xml @@ -3,5 +3,7 @@ "Ziur elkarrizketa utzi nahi duzula? Ez da publikoa eta ezingo zara berriro batu gonbidapenik gabe." "Ziur gelatik irten nahi duzula? Dagoen pertsona bakarra zara. Ateratzen bazara ezingo da inor batu etorkizunean, ezta zeu ere." "Ziur gelatik irten nahi duzula? Gela hau ez da publikoa eta ezingo zara berriro batu gonbidapenik gabe." + "Aukeratu jabeak" + "Eskualdatu jabetza" "Ziur gelatik atera nahi duzula?" diff --git a/features/leaveroom/api/src/main/res/values-sv/translations.xml b/features/leaveroom/api/src/main/res/values-sv/translations.xml index c80d716329..2d26a6ec32 100644 --- a/features/leaveroom/api/src/main/res/values-sv/translations.xml +++ b/features/leaveroom/api/src/main/res/values-sv/translations.xml @@ -3,5 +3,8 @@ "Är du säker på att du vill lämna den här konversationen? Den här konversationen är inte offentlig och du kommer inte att kunna gå med igen utan en inbjudan." "Är du säker på att du vill lämna det här rummet? Du är den enda personen här. Om du lämnar kommer ingen att kunna gå med i framtiden, inklusive du." "Är du säker på att du vill lämna det här rummet? Detta rum är inte offentligt och du kommer inte att kunna gå med igen utan en inbjudan." + "Välj ägare" + "Du är den enda ägaren av det här rummet. Du måste överföra ägarskapet till någon annan innan du lämnar rummet." + "Överför ägarskap" "Är du säker på att du vill lämna rummet?" diff --git a/features/leaveroom/api/src/main/res/values-zh-rTW/translations.xml b/features/leaveroom/api/src/main/res/values-zh-rTW/translations.xml index f561b08adc..96e3b576c4 100644 --- a/features/leaveroom/api/src/main/res/values-zh-rTW/translations.xml +++ b/features/leaveroom/api/src/main/res/values-zh-rTW/translations.xml @@ -3,5 +3,8 @@ "您確定要離開對話嗎?此對話不是公開的,如果沒有收到邀請,您無法重新加入。" "您確定要離開聊天室嗎?這裡只有您一個人。如果您離開了,包含您在內的所有人都無法再進入此聊天室。" "您確定要離開聊天室嗎?此聊天室不是公開的,如果沒有收到邀請,您無法重新加入。" + "選擇擁有者" + "您是此聊天室的唯一擁有者。離開聊天室前,您必須將所有權移轉給其他人。" + "轉移所有權" "您確定要離開聊天室嗎?" diff --git a/features/leaveroom/impl/build.gradle.kts b/features/leaveroom/impl/build.gradle.kts index 1a31023f04..ff9eb5de95 100644 --- a/features/leaveroom/impl/build.gradle.kts +++ b/features/leaveroom/impl/build.gradle.kts @@ -24,6 +24,7 @@ dependencies { implementation(projects.libraries.matrix.api) implementation(projects.libraries.designsystem) implementation(projects.libraries.uiStrings) + implementation(projects.libraries.push.api) testImplementation(libs.test.junit) testImplementation(libs.coroutines.test) @@ -32,5 +33,6 @@ dependencies { testImplementation(libs.test.truth) testImplementation(libs.test.turbine) testImplementation(projects.libraries.matrix.test) + testImplementation(projects.libraries.push.test) testImplementation(projects.tests.testutils) } diff --git a/features/leaveroom/impl/src/main/kotlin/io/element/android/features/leaveroom/impl/LeaveRoomPresenter.kt b/features/leaveroom/impl/src/main/kotlin/io/element/android/features/leaveroom/impl/LeaveRoomPresenter.kt index 2f1bab248f..d1575aac91 100644 --- a/features/leaveroom/impl/src/main/kotlin/io/element/android/features/leaveroom/impl/LeaveRoomPresenter.kt +++ b/features/leaveroom/impl/src/main/kotlin/io/element/android/features/leaveroom/impl/LeaveRoomPresenter.kt @@ -24,6 +24,7 @@ import io.element.android.libraries.matrix.api.room.BaseRoom import io.element.android.libraries.matrix.api.room.RoomMember import io.element.android.libraries.matrix.api.room.isDm import io.element.android.libraries.matrix.api.room.powerlevels.usersWithRole +import io.element.android.libraries.push.api.notifications.conversations.NotificationConversationService import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.flow.first import kotlinx.coroutines.launch @@ -33,6 +34,7 @@ import javax.inject.Inject class LeaveRoomPresenter @Inject constructor( private val client: MatrixClient, private val dispatchers: CoroutineDispatchers, + private val notificationConversationService: NotificationConversationService, ) : Presenter { @Composable override fun present(): LeaveRoomState { @@ -78,6 +80,7 @@ class LeaveRoomPresenter @Inject constructor( client.getRoom(roomId)!!.use { room -> room .leave() + .onSuccess { notificationConversationService.onLeftRoom(client.sessionId, roomId) } .onFailure { Timber.e(it, "Error while leaving room ${room.roomId}") } .getOrThrow() } diff --git a/features/leaveroom/impl/src/test/kotlin/io/element/android/features/leaveroom/impl/LeaveBaseRoomPresenterTest.kt b/features/leaveroom/impl/src/test/kotlin/io/element/android/features/leaveroom/impl/LeaveBaseRoomPresenterTest.kt index 498edc801a..9e8c4113ae 100644 --- a/features/leaveroom/impl/src/test/kotlin/io/element/android/features/leaveroom/impl/LeaveBaseRoomPresenterTest.kt +++ b/features/leaveroom/impl/src/test/kotlin/io/element/android/features/leaveroom/impl/LeaveBaseRoomPresenterTest.kt @@ -18,6 +18,7 @@ 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.FakeBaseRoom import io.element.android.libraries.matrix.test.room.aRoomInfo +import io.element.android.libraries.push.test.notifications.conversations.FakeNotificationConversationService import io.element.android.tests.testutils.WarmUpRule import io.element.android.tests.testutils.lambda.assert import io.element.android.tests.testutils.lambda.lambdaRecorder @@ -209,4 +210,5 @@ private fun TestScope.createLeaveRoomPresenter( ): LeaveRoomPresenter = LeaveRoomPresenter( client = client, dispatchers = testCoroutineDispatchers(false), + notificationConversationService = FakeNotificationConversationService(), ) diff --git a/features/location/api/build.gradle.kts b/features/location/api/build.gradle.kts index d299887165..4ce33a748a 100644 --- a/features/location/api/build.gradle.kts +++ b/features/location/api/build.gradle.kts @@ -65,6 +65,7 @@ dependencies { implementation(projects.libraries.architecture) implementation(projects.libraries.designsystem) implementation(projects.libraries.core) + implementation(projects.libraries.matrix.api) implementation(projects.libraries.matrixui) implementation(projects.libraries.uiStrings) implementation(libs.coil.compose) diff --git a/features/location/api/src/main/kotlin/io/element/android/features/location/api/SendLocationEntryPoint.kt b/features/location/api/src/main/kotlin/io/element/android/features/location/api/SendLocationEntryPoint.kt index c611340aea..1528e6cb14 100644 --- a/features/location/api/src/main/kotlin/io/element/android/features/location/api/SendLocationEntryPoint.kt +++ b/features/location/api/src/main/kotlin/io/element/android/features/location/api/SendLocationEntryPoint.kt @@ -7,11 +7,19 @@ package io.element.android.features.location.api -import io.element.android.libraries.architecture.SimpleFeatureEntryPoint +import com.bumble.appyx.core.modality.BuildContext +import com.bumble.appyx.core.node.Node +import io.element.android.libraries.architecture.FeatureEntryPoint +import io.element.android.libraries.matrix.api.timeline.Timeline /** * The "Send location" screen. * * Allows a user to share a location message within a room. */ -interface SendLocationEntryPoint : SimpleFeatureEntryPoint +interface SendLocationEntryPoint : FeatureEntryPoint { + fun builder(timelineMode: Timeline.Mode): Builder + interface Builder { + fun build(parentNode: Node, buildContext: BuildContext): Node + } +} diff --git a/features/location/impl/src/main/kotlin/io/element/android/features/location/impl/send/DefaultSendLocationEntryPoint.kt b/features/location/impl/src/main/kotlin/io/element/android/features/location/impl/send/DefaultSendLocationEntryPoint.kt index e4c7b14768..cf601a412e 100644 --- a/features/location/impl/src/main/kotlin/io/element/android/features/location/impl/send/DefaultSendLocationEntryPoint.kt +++ b/features/location/impl/src/main/kotlin/io/element/android/features/location/impl/send/DefaultSendLocationEntryPoint.kt @@ -13,12 +13,21 @@ import com.squareup.anvil.annotations.ContributesBinding import io.element.android.features.location.api.SendLocationEntryPoint import io.element.android.libraries.architecture.createNode import io.element.android.libraries.di.AppScope +import io.element.android.libraries.matrix.api.timeline.Timeline import javax.inject.Inject @ContributesBinding(AppScope::class) class DefaultSendLocationEntryPoint @Inject constructor() : SendLocationEntryPoint { - override fun createNode( - parentNode: Node, - buildContext: BuildContext - ): SendLocationNode = parentNode.createNode(buildContext) + override fun builder(timelineMode: Timeline.Mode): SendLocationEntryPoint.Builder { + return Builder(timelineMode) + } + + class Builder(private val timelineMode: Timeline.Mode) : SendLocationEntryPoint.Builder { + override fun build(parentNode: Node, buildContext: BuildContext): Node { + return parentNode.createNode( + buildContext = buildContext, + plugins = listOf(SendLocationNode.Inputs(timelineMode)) + ) + } + } } diff --git a/features/location/impl/src/main/kotlin/io/element/android/features/location/impl/send/SendLocationNode.kt b/features/location/impl/src/main/kotlin/io/element/android/features/location/impl/send/SendLocationNode.kt index 4fd438c96e..97e78fcb07 100644 --- a/features/location/impl/src/main/kotlin/io/element/android/features/location/impl/send/SendLocationNode.kt +++ b/features/location/impl/src/main/kotlin/io/element/android/features/location/impl/send/SendLocationNode.kt @@ -17,16 +17,25 @@ import dagger.assisted.Assisted import dagger.assisted.AssistedInject import im.vector.app.features.analytics.plan.MobileScreen import io.element.android.anvilannotations.ContributesNode +import io.element.android.libraries.architecture.NodeInputs +import io.element.android.libraries.architecture.inputs import io.element.android.libraries.di.RoomScope +import io.element.android.libraries.matrix.api.timeline.Timeline import io.element.android.services.analytics.api.AnalyticsService @ContributesNode(RoomScope::class) class SendLocationNode @AssistedInject constructor( @Assisted buildContext: BuildContext, @Assisted plugins: List, - private val presenter: SendLocationPresenter, + presenterFactory: SendLocationPresenter.Factory, analyticsService: AnalyticsService, ) : Node(buildContext, plugins = plugins) { + data class Inputs( + val timelineMode: Timeline.Mode, + ) : NodeInputs + + private val presenter = presenterFactory.create(inputs().timelineMode) + init { lifecycle.subscribe( onResume = { diff --git a/features/location/impl/src/main/kotlin/io/element/android/features/location/impl/send/SendLocationPresenter.kt b/features/location/impl/src/main/kotlin/io/element/android/features/location/impl/send/SendLocationPresenter.kt index e4859da08d..2619352af1 100644 --- a/features/location/impl/src/main/kotlin/io/element/android/features/location/impl/send/SendLocationPresenter.kt +++ b/features/location/impl/src/main/kotlin/io/element/android/features/location/impl/send/SendLocationPresenter.kt @@ -15,6 +15,9 @@ import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.remember import androidx.compose.runtime.rememberCoroutineScope import androidx.compose.runtime.setValue +import dagger.assisted.Assisted +import dagger.assisted.AssistedFactory +import dagger.assisted.AssistedInject import im.vector.app.features.analytics.plan.Composer import io.element.android.features.location.impl.common.MapDefaults import io.element.android.features.location.impl.common.actions.LocationActions @@ -23,22 +26,30 @@ import io.element.android.features.location.impl.common.permissions.PermissionsP import io.element.android.features.location.impl.common.permissions.PermissionsState import io.element.android.features.messages.api.MessageComposerContext import io.element.android.libraries.architecture.Presenter +import io.element.android.libraries.core.extensions.flatMap import io.element.android.libraries.core.meta.BuildMeta +import io.element.android.libraries.matrix.api.room.CreateTimelineParams import io.element.android.libraries.matrix.api.room.JoinedRoom import io.element.android.libraries.matrix.api.room.location.AssetType +import io.element.android.libraries.matrix.api.timeline.Timeline import io.element.android.libraries.textcomposer.model.MessageComposerMode import io.element.android.services.analytics.api.AnalyticsService import kotlinx.coroutines.launch -import javax.inject.Inject -class SendLocationPresenter @Inject constructor( +class SendLocationPresenter @AssistedInject constructor( permissionsPresenterFactory: PermissionsPresenter.Factory, private val room: JoinedRoom, + @Assisted private val timelineMode: Timeline.Mode, private val analyticsService: AnalyticsService, private val messageComposerContext: MessageComposerContext, private val locationActions: LocationActions, private val buildMeta: BuildMeta, ) : Presenter { + @AssistedFactory + interface Factory { + fun create(timelineMode: Timeline.Mode): SendLocationPresenter + } + private val permissionsPresenter = permissionsPresenterFactory.create(MapDefaults.permissions) @Composable @@ -104,14 +115,16 @@ class SendLocationPresenter @Inject constructor( when (mode) { SendLocationState.Mode.PinLocation -> { val geoUri = event.cameraPosition.toGeoUri() - room.liveTimeline.sendLocation( - body = generateBody(geoUri), - geoUri = geoUri, - description = null, - zoomLevel = MapDefaults.DEFAULT_ZOOM.toInt(), - assetType = AssetType.PIN, - inReplyToEventId = inReplyToEventId, - ) + getTimeline().flatMap { + it.sendLocation( + body = generateBody(geoUri), + geoUri = geoUri, + description = null, + zoomLevel = MapDefaults.DEFAULT_ZOOM.toInt(), + assetType = AssetType.PIN, + inReplyToEventId = inReplyToEventId, + ) + } analyticsService.capture( Composer( inThread = messageComposerContext.composerMode.inThread, @@ -123,14 +136,16 @@ class SendLocationPresenter @Inject constructor( } SendLocationState.Mode.SenderLocation -> { val geoUri = event.toGeoUri() - room.liveTimeline.sendLocation( - body = generateBody(geoUri), - geoUri = geoUri, - description = null, - zoomLevel = MapDefaults.DEFAULT_ZOOM.toInt(), - assetType = AssetType.SENDER, - inReplyToEventId = inReplyToEventId, - ) + getTimeline().flatMap { + it.sendLocation( + body = generateBody(geoUri), + geoUri = geoUri, + description = null, + zoomLevel = MapDefaults.DEFAULT_ZOOM.toInt(), + assetType = AssetType.SENDER, + inReplyToEventId = inReplyToEventId, + ) + } analyticsService.capture( Composer( inThread = messageComposerContext.composerMode.inThread, @@ -142,6 +157,13 @@ class SendLocationPresenter @Inject constructor( } } } + + private suspend fun getTimeline(): Result { + return when (timelineMode) { + is Timeline.Mode.Thread -> room.createTimeline(CreateTimelineParams.Threaded(timelineMode.threadRootId)) + else -> Result.success(room.liveTimeline) + } + } } private fun SendLocationEvents.SendLocation.toGeoUri(): String = location?.toGeoUri() ?: cameraPosition.toGeoUri() diff --git a/features/location/impl/src/test/kotlin/io/element/android/features/location/impl/send/SendLocationPresenterTest.kt b/features/location/impl/src/test/kotlin/io/element/android/features/location/impl/send/SendLocationPresenterTest.kt index 543d71eae1..4847942d67 100644 --- a/features/location/impl/src/test/kotlin/io/element/android/features/location/impl/send/SendLocationPresenterTest.kt +++ b/features/location/impl/src/test/kotlin/io/element/android/features/location/impl/send/SendLocationPresenterTest.kt @@ -23,6 +23,7 @@ import io.element.android.features.messages.test.FakeMessageComposerContext import io.element.android.libraries.matrix.api.core.EventId import io.element.android.libraries.matrix.api.room.JoinedRoom import io.element.android.libraries.matrix.api.room.location.AssetType +import io.element.android.libraries.matrix.api.timeline.Timeline import io.element.android.libraries.matrix.api.timeline.item.event.toEventOrTransactionId import io.element.android.libraries.matrix.test.AN_EVENT_ID import io.element.android.libraries.matrix.test.core.aBuildMeta @@ -55,6 +56,7 @@ class SendLocationPresenterTest { override fun create(permissions: List): PermissionsPresenter = fakePermissionsPresenter }, room = joinedRoom, + timelineMode = Timeline.Mode.Live, analyticsService = fakeAnalyticsService, messageComposerContext = fakeMessageComposerContext, locationActions = fakeLocationActions, diff --git a/features/lockscreen/impl/build.gradle.kts b/features/lockscreen/impl/build.gradle.kts index ad77b20e60..4260e9e792 100644 --- a/features/lockscreen/impl/build.gradle.kts +++ b/features/lockscreen/impl/build.gradle.kts @@ -27,6 +27,7 @@ dependencies { implementation(projects.appconfig) implementation(projects.features.enterprise.api) implementation(projects.libraries.core) + implementation(projects.libraries.androidutils) implementation(projects.libraries.architecture) implementation(projects.libraries.matrix.api) implementation(projects.libraries.matrixui) diff --git a/features/lockscreen/impl/src/main/kotlin/io/element/android/features/lockscreen/impl/storage/PreferencesLockScreenStore.kt b/features/lockscreen/impl/src/main/kotlin/io/element/android/features/lockscreen/impl/storage/PreferencesLockScreenStore.kt index b3086ddb9e..a2ccccf984 100644 --- a/features/lockscreen/impl/src/main/kotlin/io/element/android/features/lockscreen/impl/storage/PreferencesLockScreenStore.kt +++ b/features/lockscreen/impl/src/main/kotlin/io/element/android/features/lockscreen/impl/storage/PreferencesLockScreenStore.kt @@ -7,44 +7,39 @@ package io.element.android.features.lockscreen.impl.storage -import android.content.Context -import androidx.datastore.core.DataStore import androidx.datastore.preferences.core.Preferences import androidx.datastore.preferences.core.booleanPreferencesKey import androidx.datastore.preferences.core.edit import androidx.datastore.preferences.core.intPreferencesKey import androidx.datastore.preferences.core.stringPreferencesKey -import androidx.datastore.preferences.preferencesDataStore import com.squareup.anvil.annotations.ContributesBinding import io.element.android.features.lockscreen.impl.LockScreenConfig import io.element.android.libraries.di.AppScope -import io.element.android.libraries.di.ApplicationContext -import io.element.android.libraries.di.SingleIn +import io.element.android.libraries.preferences.api.store.PreferenceDataStoreFactory import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.first import kotlinx.coroutines.flow.map import javax.inject.Inject -private val Context.dataStore: DataStore by preferencesDataStore(name = "pin_code_store") - -@SingleIn(AppScope::class) @ContributesBinding(AppScope::class) class PreferencesLockScreenStore @Inject constructor( - @ApplicationContext private val context: Context, + preferenceDataStoreFactory: PreferenceDataStoreFactory, private val lockScreenConfig: LockScreenConfig, ) : LockScreenStore { + private val dataStore = preferenceDataStoreFactory.create("pin_code_store") + private val pinCodeKey = stringPreferencesKey("encoded_pin_code") private val remainingAttemptsKey = intPreferencesKey("remaining_pin_code_attempts") private val biometricUnlockKey = booleanPreferencesKey("biometric_unlock_enabled") override suspend fun getRemainingPinCodeAttemptsNumber(): Int { - return context.dataStore.data.map { preferences -> + return dataStore.data.map { preferences -> preferences.getRemainingPinCodeAttemptsNumber() }.first() } override suspend fun onWrongPin() { - context.dataStore.edit { preferences -> + dataStore.edit { preferences -> val current = preferences.getRemainingPinCodeAttemptsNumber() val remaining = (current - 1).coerceAtLeast(0) preferences[remainingAttemptsKey] = remaining @@ -52,43 +47,43 @@ class PreferencesLockScreenStore @Inject constructor( } override suspend fun resetCounter() { - context.dataStore.edit { preferences -> + dataStore.edit { preferences -> preferences[remainingAttemptsKey] = lockScreenConfig.maxPinCodeAttemptsBeforeLogout } } override suspend fun getEncryptedCode(): String? { - return context.dataStore.data.map { preferences -> + return dataStore.data.map { preferences -> preferences[pinCodeKey] }.first() } override suspend fun saveEncryptedPinCode(pinCode: String) { - context.dataStore.edit { preferences -> + dataStore.edit { preferences -> preferences[pinCodeKey] = pinCode } } override suspend fun deleteEncryptedPinCode() { - context.dataStore.edit { preferences -> + dataStore.edit { preferences -> preferences.remove(pinCodeKey) } } override fun hasPinCode(): Flow { - return context.dataStore.data.map { preferences -> + return dataStore.data.map { preferences -> preferences[pinCodeKey] != null } } override fun isBiometricUnlockAllowed(): Flow { - return context.dataStore.data.map { preferences -> + return dataStore.data.map { preferences -> preferences[biometricUnlockKey] ?: false } } override suspend fun setIsBiometricUnlockAllowed(isAllowed: Boolean) { - context.dataStore.edit { preferences -> + dataStore.edit { preferences -> preferences[biometricUnlockKey] = isAllowed } } diff --git a/features/lockscreen/impl/src/main/res/values-fa/translations.xml b/features/lockscreen/impl/src/main/res/values-fa/translations.xml index 8e57ec8d68..56dc91e835 100644 --- a/features/lockscreen/impl/src/main/res/values-fa/translations.xml +++ b/features/lockscreen/impl/src/main/res/values-fa/translations.xml @@ -24,6 +24,14 @@ "پین‌ها مطابق نیستند" "برای ادامه باید دوباره وارد شده و پینی جدید ایجاد کنید" "دارید خارج می‌شوید" + + "شما %1$d تلاش برای باز کردن قفل دارید" + "شما %1$d تلاش برای باز کردن قفل دارید" + + + "پین اشتباه است. شما %1$d شانس دیگر دارید" + "پین اشتباه است. شما %1$d شانس دیگر دارید" + "استفاده از زیست‌سنجی" "استفاده از پین" "خارج شدن…" diff --git a/features/lockscreen/impl/src/main/res/values-uz/translations.xml b/features/lockscreen/impl/src/main/res/values-uz/translations.xml index b9f1c4f5cb..e15d51c8bc 100644 --- a/features/lockscreen/impl/src/main/res/values-uz/translations.xml +++ b/features/lockscreen/impl/src/main/res/values-uz/translations.xml @@ -1,4 +1,33 @@ + "biometrik autentifikatsiya" + "biometrik qulf ochish" + "PIN kodni o\'zgartirish" + "Biometrik qulfni ochishga ruxsat bering" + "PIN-kodni olib tashlang" + "Haqiqatan ham PIN kodni olib tashlamoqchimisiz?" + "PIN kod olib tashlansinmi?" + "Ruxsat berish %1$s" + "Men PIN kod ishlatishni maʼqul koʻraman" + "Oʻzingizga vaqt tejang va har safar ilovani ochish uchun %1$s dan foydalaning" + "PIN kodni tanlang" + "PIN kodni tasdiqlang" + "Qulflash %1$s suhbatlaringizga qoʻshimcha xavfsizlik qoʻshish uchun. + +Esda qoladigan biror narsani tanlang. Agar ushbu PIN kodni unutib qolsangiz, dasturdan chiqib ketasiz." + "Xavfsizlik sabablari bilan buni PIN kodingiz sifatida tanlay olmaysiz" + "Boshqa PIN kod tanlang" + "Iltimos, bir xil PIN kodni ikkita marta kiriting" + "PIN kodlar bir-biriga mos kelmadi" + "Davom etish uchun qayta kirishingiz va yangi PIN yaratishingiz kerak boʻladi." + "Siz tizimdan chiqmoqdasiz" + + "Sizda %1$d ta ochishga urinish mavjud" + "Sizda %1$d ta ochishga urinish mavjud" + + + "Notoʻgʻri PIN. Sizda yana %1$d ta imkoniyat bor" + "Notoʻgʻri PIN. Sizda yana %1$d ta imkoniyat bor" + "Chiqish…" diff --git a/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/screens/onboarding/OnBoardingLogoResIdProvider.kt b/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/screens/onboarding/OnBoardingLogoResIdProvider.kt new file mode 100644 index 0000000000..03cebff188 --- /dev/null +++ b/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/screens/onboarding/OnBoardingLogoResIdProvider.kt @@ -0,0 +1,32 @@ +/* + * Copyright 2025 New Vector Ltd. + * + * SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial + * Please see LICENSE files in the repository root for full details. + */ + +package io.element.android.features.login.impl.screens.onboarding + +import android.annotation.SuppressLint +import android.content.Context +import com.squareup.anvil.annotations.ContributesBinding +import io.element.android.libraries.di.AppScope +import io.element.android.libraries.di.ApplicationContext +import javax.inject.Inject + +fun interface OnBoardingLogoResIdProvider { + fun get(): Int? +} + +@ContributesBinding(AppScope::class) +class DefaultOnBoardingLogoResIdProvider @Inject constructor( + @ApplicationContext private val context: Context, +) : OnBoardingLogoResIdProvider { + @SuppressLint("DiscouragedApi") + override fun get(): Int? { + val resId = context.resources + .getIdentifier("onboarding_logo", "drawable", context.packageName) + .takeIf { it != 0 } + return resId + } +} diff --git a/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/screens/onboarding/OnBoardingPresenter.kt b/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/screens/onboarding/OnBoardingPresenter.kt index 0e545f44e6..ba46e79b36 100644 --- a/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/screens/onboarding/OnBoardingPresenter.kt +++ b/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/screens/onboarding/OnBoardingPresenter.kt @@ -36,6 +36,7 @@ class OnBoardingPresenter @AssistedInject constructor( private val defaultAccountProviderAccessControl: DefaultAccountProviderAccessControl, private val rageshakeFeatureAvailability: RageshakeFeatureAvailability, private val loginHelper: LoginHelper, + private val onBoardingLogoResIdProvider: OnBoardingLogoResIdProvider, ) : Presenter { @AssistedFactory interface Factory { @@ -81,6 +82,9 @@ class OnBoardingPresenter @AssistedInject constructor( } val canReportBug by remember { rageshakeFeatureAvailability.isAvailable() }.collectAsState(false) var showReportBug by rememberSaveable { mutableStateOf(false) } + val onBoardingLogoResId = remember { + onBoardingLogoResIdProvider.get() + } val loginMode by loginHelper.collectLoginMode() @@ -112,6 +116,7 @@ class OnBoardingPresenter @AssistedInject constructor( canReportBug = canReportBug && showReportBug, loginMode = loginMode, version = buildMeta.versionName, + onBoardingLogoResId = onBoardingLogoResId, eventSink = ::handleEvent, ) } diff --git a/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/screens/onboarding/OnBoardingState.kt b/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/screens/onboarding/OnBoardingState.kt index 1e55c3af2d..c2896d4ea7 100644 --- a/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/screens/onboarding/OnBoardingState.kt +++ b/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/screens/onboarding/OnBoardingState.kt @@ -7,6 +7,7 @@ package io.element.android.features.login.impl.screens.onboarding +import androidx.annotation.DrawableRes import io.element.android.features.login.impl.login.LoginMode import io.element.android.libraries.architecture.AsyncData @@ -18,6 +19,8 @@ data class OnBoardingState( val canCreateAccount: Boolean, val canReportBug: Boolean, val version: String, + @DrawableRes + val onBoardingLogoResId: Int?, val loginMode: AsyncData, val eventSink: (OnBoardingEvents) -> Unit, ) { diff --git a/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/screens/onboarding/OnBoardingStateProvider.kt b/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/screens/onboarding/OnBoardingStateProvider.kt index cdf77da523..cc41e64480 100644 --- a/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/screens/onboarding/OnBoardingStateProvider.kt +++ b/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/screens/onboarding/OnBoardingStateProvider.kt @@ -7,9 +7,11 @@ package io.element.android.features.login.impl.screens.onboarding +import androidx.annotation.DrawableRes import androidx.compose.ui.tooling.preview.PreviewParameterProvider import io.element.android.features.login.impl.login.LoginMode import io.element.android.libraries.architecture.AsyncData +import io.element.android.libraries.designsystem.R open class OnBoardingStateProvider : PreviewParameterProvider { override val values: Sequence @@ -20,6 +22,7 @@ open class OnBoardingStateProvider : PreviewParameterProvider { anOnBoardingState(canLoginWithQrCode = true, canCreateAccount = true), anOnBoardingState(canLoginWithQrCode = true, canCreateAccount = true, canReportBug = true), anOnBoardingState(defaultAccountProvider = "element.io", canCreateAccount = false, canReportBug = true), + anOnBoardingState(customLogoResId = R.drawable.sample_background), ) } @@ -31,6 +34,8 @@ fun anOnBoardingState( canCreateAccount: Boolean = false, canReportBug: Boolean = false, version: String = "1.0.0", + @DrawableRes + customLogoResId: Int? = null, loginMode: AsyncData = AsyncData.Uninitialized, eventSink: (OnBoardingEvents) -> Unit = {}, ) = OnBoardingState( @@ -42,5 +47,6 @@ fun anOnBoardingState( canReportBug = canReportBug, version = version, loginMode = loginMode, + onBoardingLogoResId = customLogoResId, eventSink = eventSink, ) diff --git a/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/screens/onboarding/OnBoardingView.kt b/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/screens/onboarding/OnBoardingView.kt index 6c67e75cd1..4c44ee132a 100644 --- a/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/screens/onboarding/OnBoardingView.kt +++ b/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/screens/onboarding/OnBoardingView.kt @@ -7,6 +7,7 @@ package io.element.android.features.login.impl.screens.onboarding +import androidx.compose.foundation.Image import androidx.compose.foundation.clickable import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.Column @@ -19,9 +20,11 @@ import androidx.compose.runtime.Composable import androidx.compose.runtime.derivedStateOf import androidx.compose.runtime.getValue import androidx.compose.runtime.remember +import androidx.compose.ui.Alignment import androidx.compose.ui.Alignment.Companion.CenterHorizontally import androidx.compose.ui.BiasAlignment import androidx.compose.ui.Modifier +import androidx.compose.ui.res.painterResource import androidx.compose.ui.res.stringResource import androidx.compose.ui.text.style.TextAlign import androidx.compose.ui.tooling.preview.PreviewParameter @@ -67,8 +70,15 @@ fun OnBoardingView( ) { OnBoardingPage( modifier = modifier, + renderBackground = state.onBoardingLogoResId == null, content = { - OnBoardingContent(state = state) + if (state.onBoardingLogoResId != null) { + OnBoardingLogo( + onBoardingLogoResId = state.onBoardingLogoResId, + ) + } else { + OnBoardingContent(state = state) + } LoginModeView( loginMode = state.loginMode, onClearError = { @@ -139,6 +149,24 @@ private fun OnBoardingContent(state: OnBoardingState) { } } +@Composable +private fun OnBoardingLogo( + onBoardingLogoResId: Int, + modifier: Modifier = Modifier, +) { + Box( + modifier = modifier + .fillMaxSize() + .padding(16.dp), + contentAlignment = Alignment.Center, + ) { + Image( + painter = painterResource(id = onBoardingLogoResId), + contentDescription = null + ) + } +} + @Composable private fun OnBoardingButtons( state: OnBoardingState, diff --git a/features/login/impl/src/main/res/raw/keep.xml b/features/login/impl/src/main/res/raw/keep.xml new file mode 100644 index 0000000000..478b6d4016 --- /dev/null +++ b/features/login/impl/src/main/res/raw/keep.xml @@ -0,0 +1,12 @@ + + + diff --git a/features/login/impl/src/main/res/values-da/translations.xml b/features/login/impl/src/main/res/values-da/translations.xml index af64068d32..cffa9c7e2e 100644 --- a/features/login/impl/src/main/res/values-da/translations.xml +++ b/features/login/impl/src/main/res/values-da/translations.xml @@ -13,6 +13,7 @@ "Anden" "Brug en anden kontoudbyder, f.eks. din egen private server eller en arbejdskonto." "Skift kontoudbyder" + "Google Play" "Element Pro-appen er påkrævet på %1$s Download den venligst fra din app store." "Element Pro kræves" "Vi kunne ikke nå denne hjemmeserver. Kontroller, at du har indtastet hjemmeserverens URL korrekt. Hvis URL-adressen er korrekt, skal du kontakte administratoren på din hjemmeserver for at få yderligere hjælp." diff --git a/features/login/impl/src/main/res/values-eu/translations.xml b/features/login/impl/src/main/res/values-eu/translations.xml index ecf908f21f..6ab86a1687 100644 --- a/features/login/impl/src/main/res/values-eu/translations.xml +++ b/features/login/impl/src/main/res/values-eu/translations.xml @@ -10,6 +10,10 @@ "Beste bat" "Erabili beste kontu-hornitzaile bat, hala nola zure zerbitzari pribatua edo laneko kontu bat." "Aldatu kontu-hornitzailea" + "Google Play" + "Element Pro behar da" + "Hautatutako kontu-hornitzailea ez da bateragarria Sliding Sync-ekin. Beharrezkoa da zerbitzaria bertsio-berritzea %1$s erabiltzeko." + "Ez da %1$s kontu-hornitzailea onartzen." "Zerbitzariaren URLa" "Sartu domeinu-helbide bat." "Zein da zure zerbitzariaren helbidea?" @@ -17,10 +21,12 @@ "Sortu kontua" "Kontu hau desaktibatuta dago." "Erabiltzaile-izena edo/eta pasahitza okerrak" + "Hautatutako zerbitzaria ez da bateragarria pasahitz edo OIDC saio-hasierarekin. Jarri harremanetan administratzailearekin edo aukeratu beste zerbitzari bat." "Sartu zure datuak" "Matrix komunikazio seguru eta deszentralizaturako sare irekia da." "Ongi etorri!" "Hasi saioa %1$s(e)n" + "%1$s bertsioa" "Hasi saioa eskuz" "Hasi saioa QR kodearekin" "Sortu kontua" @@ -67,5 +73,6 @@ Saiatu saioa eskuz hasten, edo eskaneatu QR kodea beste gailu batean." "Elementeko langileentzako zerbitzari pribatua." "Matrix komunikazio seguru eta deszentralizaturako sare irekia da." "%1$s(e)n saioa hastear zaude" + "Aukeratu kontu-hornitzailea" "%1$s(e)n kontua sortzear zaude" diff --git a/features/login/impl/src/main/res/values-fr/translations.xml b/features/login/impl/src/main/res/values-fr/translations.xml index 122d8bbca1..26936afbd7 100644 --- a/features/login/impl/src/main/res/values-fr/translations.xml +++ b/features/login/impl/src/main/res/values-fr/translations.xml @@ -13,6 +13,7 @@ "Autres" "Utilisez un autre fournisseur de compte, tel que votre propre serveur privé ou un serveur professionnel." "Changer de fournisseur de compte" + "Google Play" "L’application Element Pro est requise sur %1$s. Veuillez la télécharger depuis le store." "Element Pro est requis" "Nous n’avons pas pu atteindre ce serveur d’accueil. Vérifiez que vous avez correctement saisi l’URL du serveur d’accueil. Si l’URL est correcte, contactez l’administrateur de votre serveur d’accueil pour obtenir de l’aide." diff --git a/features/login/impl/src/main/res/values-sv/translations.xml b/features/login/impl/src/main/res/values-sv/translations.xml index 7d59180093..33fb76b5bd 100644 --- a/features/login/impl/src/main/res/values-sv/translations.xml +++ b/features/login/impl/src/main/res/values-sv/translations.xml @@ -13,6 +13,9 @@ "Annan" "Använd en annan kontoleverantör, till exempel din egen privata server eller ett jobbkonto." "Byt kontoleverantör" + "Google Play" + "Element Pro-appen krävs på %1$s. Ladda ner den från butiken." + "Element Pro krävs" "Vi kunde inte nå den här hemservern. Kontrollera att du har angett hemserverns URL korrekt. Om URL:en är korrekt kontaktar du administratören för hemservern för ytterligare hjälp." "Sliding Sync är inte tillgängligt på grund av ett problem i .well-known-filen: %1$s" diff --git a/features/login/impl/src/main/res/values-uk/translations.xml b/features/login/impl/src/main/res/values-uk/translations.xml index c81a3e34f2..697c21ab8e 100644 --- a/features/login/impl/src/main/res/values-uk/translations.xml +++ b/features/login/impl/src/main/res/values-uk/translations.xml @@ -13,6 +13,7 @@ "Інше" "Використати іншого провайдера облікових записів, наприклад, власний приватний сервер або робочий обліковий запис." "Змінити провайдера облікового запису" + "Google Play" "Необхідно встановити застосунок Element Pro на %1$s. Завантажте його з магазину." "Потрібен Element Pro" "Не вдалося під\'єднатися до цього домашнього сервера. Перевірте правильність введеної URL-адреси домашнього сервера. Якщо URL-адреса правильна, зверніться по додаткову допомогу до адміністратора домашнього сервера." diff --git a/features/login/impl/src/main/res/values-uz/translations.xml b/features/login/impl/src/main/res/values-uz/translations.xml index 25fc695452..dabdf1d3ed 100644 --- a/features/login/impl/src/main/res/values-uz/translations.xml +++ b/features/login/impl/src/main/res/values-uz/translations.xml @@ -32,6 +32,7 @@ "Eng tezkor %1$sga xush kelibsiz. Tezlik va oddylik uchun super zaryadlangan." "%1$sga Xush kelibsiz. Tezlik va oddylik uchun o\'ta zaryadlangan." "Elementingizda bo\'ling" + "Qayta urinib ko\'ring" "Hisob provayderini o\'zgartiring" "Element xodimlari uchun shaxsiy server." "Matrix xavfsiz, markazlashmagan aloqa uchun ochiq tarmoqdir." diff --git a/features/login/impl/src/main/res/values-zh-rTW/translations.xml b/features/login/impl/src/main/res/values-zh-rTW/translations.xml index f23089779e..23e290d69c 100644 --- a/features/login/impl/src/main/res/values-zh-rTW/translations.xml +++ b/features/login/impl/src/main/res/values-zh-rTW/translations.xml @@ -13,10 +13,16 @@ "其他" "使用不同的帳戶提供者,例如您自己的伺服器或工作帳號。" "更改帳號提供者" + "Google Play" + "%1$s 需要 Element Pro 應用程式。請從商店下載。" + "需要 Element Pro" "我們無法連線至此家伺服器。請檢查您是否已正確輸入家伺服器 URL。若 URL 正確,請聯絡您家伺服器的管理員以取得進一步協助。" "因為 well-known 檔案的問題,伺服器不可用: %1$s" "選定的帳號提供者不支援 sliding sync。必須升級伺服器才能使用 %1$s。" + "不允許 %1$s 連線至 %2$s。" + "應用程式已設定為允許:%1$s。" + "不允許帳號提供者 %1$s。" "家伺服器 URL" "輸入網域位址。" "您的伺服器地址?" @@ -31,7 +37,9 @@ "Matrix 是一個開放網路,為了安全且去中心化的通訊而生。" "歡迎回來!" "登入 %1$s" + "版本 %1$s" "手動登入" + "登入至 %1$s" "使用 QR code 登入" "建立帳號" "歡迎使用有史以來最快的 %1$s。速度超快,操作簡便。" @@ -85,5 +93,6 @@ "Matrix 是一個開放網路,為了安全且去中心化的通訊而生。" "您的所有對話將保存於此,就如同您的電子郵件供應商會保存您的電子郵件一樣。" "您即將登入 %1$s" + "選擇帳號提供者" "您即將在 %1$s 建立帳號" 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 44d5d48574..ec6bc91ff7 100644 --- a/features/login/impl/src/main/res/values-zh/translations.xml +++ b/features/login/impl/src/main/res/values-zh/translations.xml @@ -13,10 +13,15 @@ "其他" "使用其他账户提供商,例如您自己的私人服务器或工作账户。" "更改账户提供方" + "需要 Element Pro 版" "我们无法访问此服务器。请检查您输入的服务器网址是否正确。如果 URL 正确,请联系您的服务器管理员寻求进一步帮助。" - "由于 Well Known 文件中的问题,Sliding Sync 不可用: + "由于 .well-known 文件中存在问题,服务器不可用: %1$s" + "所选账户提供商不支持跨屏同步。需要升级服务器才能使用%1$s。" + "%1$s不允许连接到%2$s。" + "账户提供商%1$s 不被允许。" "服务器网址" + "输入域名地址。" "您的服务器地址是什么?" "选择服务器" "创建账户" @@ -29,7 +34,9 @@ "Matrix 是一个用于安全、去中心化通信的开放网络。" "欢迎回来!" "登录到 %1$s" + "版本%1$s" "手动登录" + "登录到 %1$s" "使用二维码登录" "创建账户" "欢迎使用 %1$s,快而简约的消息应用。" @@ -83,5 +90,6 @@ "Matrix 是一个用于安全、去中心化通信的开放网络。" "这是您的对话将存在的地方,就像您使用电子邮件提供方来保存电子邮件一样。" "即将登录 %1$s" + "选择账户提供商" "即将在 %1$s 上创建一个账户" diff --git a/features/login/impl/src/test/kotlin/io/element/android/features/login/impl/screens/onboarding/DefaultOnBoardingLogoResIdProviderTest.kt b/features/login/impl/src/test/kotlin/io/element/android/features/login/impl/screens/onboarding/DefaultOnBoardingLogoResIdProviderTest.kt new file mode 100644 index 0000000000..7727583468 --- /dev/null +++ b/features/login/impl/src/test/kotlin/io/element/android/features/login/impl/screens/onboarding/DefaultOnBoardingLogoResIdProviderTest.kt @@ -0,0 +1,25 @@ +/* + * Copyright 2025 New Vector Ltd. + * + * SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial + * Please see LICENSE files in the repository root for full details. + */ + +package io.element.android.features.login.impl.screens.onboarding + +import androidx.test.ext.junit.runners.AndroidJUnit4 +import androidx.test.platform.app.InstrumentationRegistry +import com.google.common.truth.Truth.assertThat +import org.junit.Test +import org.junit.runner.RunWith + +@RunWith(AndroidJUnit4::class) +class DefaultOnBoardingLogoResIdProviderTest { + @Test + fun `when onboarding_logo resource does not exist, get() returns null`() { + val context = InstrumentationRegistry.getInstrumentation().context + val sut = DefaultOnBoardingLogoResIdProvider(context) + val result = sut.get() + assertThat(result).isNull() + } +} diff --git a/features/login/impl/src/test/kotlin/io/element/android/features/login/impl/screens/onboarding/OnBoardingPresenterTest.kt b/features/login/impl/src/test/kotlin/io/element/android/features/login/impl/screens/onboarding/OnBoardingPresenterTest.kt index b47adf4cd8..21b1e9316d 100644 --- a/features/login/impl/src/test/kotlin/io/element/android/features/login/impl/screens/onboarding/OnBoardingPresenterTest.kt +++ b/features/login/impl/src/test/kotlin/io/element/android/features/login/impl/screens/onboarding/OnBoardingPresenterTest.kt @@ -84,6 +84,18 @@ class OnBoardingPresenterTest { } } + @Test + fun `present - on boarding logo`() = runTest { + val presenter = createPresenter( + onBoardingLogoResIdProvider = OnBoardingLogoResIdProvider { 42 }, + ) + presenter.test { + skipItems(1) + val initialState = awaitItem() + assertThat(initialState.onBoardingLogoResId).isEqualTo(42) + } + } + @Test fun `present - clicking on version 7 times has no effect if rageshake not available`() = runTest { val presenter = createPresenter( @@ -224,6 +236,7 @@ private fun createPresenter( wellknownRetriever: WellknownRetriever = FakeWellknownRetriever(), rageshakeFeatureAvailability: () -> Flow = { flowOf(true) }, loginHelper: LoginHelper = createLoginHelper(), + onBoardingLogoResIdProvider: OnBoardingLogoResIdProvider = OnBoardingLogoResIdProvider { null }, ) = OnBoardingPresenter( params = params, buildMeta = buildMeta, @@ -234,6 +247,7 @@ private fun createPresenter( ), rageshakeFeatureAvailability = rageshakeFeatureAvailability, loginHelper = loginHelper, + onBoardingLogoResIdProvider = onBoardingLogoResIdProvider, ) fun createLoginHelper( diff --git a/features/logout/impl/src/main/res/values-uz/translations.xml b/features/logout/impl/src/main/res/values-uz/translations.xml index 4862d47399..f53c9c215b 100644 --- a/features/logout/impl/src/main/res/values-uz/translations.xml +++ b/features/logout/impl/src/main/res/values-uz/translations.xml @@ -4,6 +4,14 @@ "Tizimdan chiqish" "Tizimdan chiqish" "Chiqish…" + "Siz oxirgi sessiyangizdan chiqmoqdasiz. Agar hozir chiqib ketsangiz, shifrlangan xabarlaringizga kira olmaysiz." + "Siz zaxira nusxasini oʻchirdingiz" + "Kalitlaringiz hamon zaxiralanmoqda" + "Tizimdan chiqishdan oldin bu jarayon tugashini kuting." + "Kalitlaringiz hamon zaxiralanmoqda" "Tizimdan chiqish" + "Siz oxirgi sessiyangizdan chiqmoqdasiz. Agar hozir chiqib ketsangiz, shifrlangan xabarlaringizga kira olmaysiz." + "Qayta tiklash sozlanmagan" + "Siz oxirgi sessiyangizdan chiqmoqdasiz. Agar hozir chiqib ketsangiz, shifrlangan xabarlaringizga kira olmay qolishingiz mumkin." "Zaxira kalitingizni saqladingizmi?" diff --git a/features/messages/api/build.gradle.kts b/features/messages/api/build.gradle.kts index 7eefee11cc..a6a2edcf6d 100644 --- a/features/messages/api/build.gradle.kts +++ b/features/messages/api/build.gradle.kts @@ -16,6 +16,7 @@ android { dependencies { implementation(projects.libraries.architecture) + implementation(projects.libraries.designsystem) implementation(projects.libraries.matrix.api) implementation(projects.libraries.mediaviewer.api) implementation(projects.libraries.preferences.api) diff --git a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/voicemessages/composer/VoiceMessageComposerEvents.kt b/features/messages/api/src/main/kotlin/io/element/android/features/messages/api/timeline/voicemessages/composer/VoiceMessageComposerEvents.kt similarity index 93% rename from features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/voicemessages/composer/VoiceMessageComposerEvents.kt rename to features/messages/api/src/main/kotlin/io/element/android/features/messages/api/timeline/voicemessages/composer/VoiceMessageComposerEvents.kt index 30053ba7b9..9586fd0bf7 100644 --- a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/voicemessages/composer/VoiceMessageComposerEvents.kt +++ b/features/messages/api/src/main/kotlin/io/element/android/features/messages/api/timeline/voicemessages/composer/VoiceMessageComposerEvents.kt @@ -5,7 +5,7 @@ * Please see LICENSE files in the repository root for full details. */ -package io.element.android.features.messages.impl.voicemessages.composer +package io.element.android.features.messages.api.timeline.voicemessages.composer import androidx.lifecycle.Lifecycle import io.element.android.libraries.textcomposer.model.VoiceMessagePlayerEvent diff --git a/features/messages/api/src/main/kotlin/io/element/android/features/messages/api/timeline/voicemessages/composer/VoiceMessageComposerPresenter.kt b/features/messages/api/src/main/kotlin/io/element/android/features/messages/api/timeline/voicemessages/composer/VoiceMessageComposerPresenter.kt new file mode 100644 index 0000000000..0e464e93b8 --- /dev/null +++ b/features/messages/api/src/main/kotlin/io/element/android/features/messages/api/timeline/voicemessages/composer/VoiceMessageComposerPresenter.kt @@ -0,0 +1,17 @@ +/* + * Copyright 2025 New Vector Ltd. + * + * SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial + * Please see LICENSE files in the repository root for full details. + */ + +package io.element.android.features.messages.api.timeline.voicemessages.composer + +import io.element.android.libraries.architecture.Presenter +import io.element.android.libraries.matrix.api.timeline.Timeline + +fun interface VoiceMessageComposerPresenter : Presenter { + interface Factory { + fun create(timelineMode: Timeline.Mode): VoiceMessageComposerPresenter + } +} diff --git a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/voicemessages/composer/VoiceMessageComposerState.kt b/features/messages/api/src/main/kotlin/io/element/android/features/messages/api/timeline/voicemessages/composer/VoiceMessageComposerState.kt similarity index 87% rename from features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/voicemessages/composer/VoiceMessageComposerState.kt rename to features/messages/api/src/main/kotlin/io/element/android/features/messages/api/timeline/voicemessages/composer/VoiceMessageComposerState.kt index 2e8c4caa87..e78a2b5611 100644 --- a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/voicemessages/composer/VoiceMessageComposerState.kt +++ b/features/messages/api/src/main/kotlin/io/element/android/features/messages/api/timeline/voicemessages/composer/VoiceMessageComposerState.kt @@ -5,7 +5,7 @@ * Please see LICENSE files in the repository root for full details. */ -package io.element.android.features.messages.impl.voicemessages.composer +package io.element.android.features.messages.api.timeline.voicemessages.composer import androidx.compose.runtime.Stable import io.element.android.libraries.textcomposer.model.VoiceMessageState diff --git a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/voicemessages/composer/VoiceMessageComposerStateProvider.kt b/features/messages/api/src/main/kotlin/io/element/android/features/messages/api/timeline/voicemessages/composer/VoiceMessageComposerStateProvider.kt similarity index 80% rename from features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/voicemessages/composer/VoiceMessageComposerStateProvider.kt rename to features/messages/api/src/main/kotlin/io/element/android/features/messages/api/timeline/voicemessages/composer/VoiceMessageComposerStateProvider.kt index 534c45dade..e1bfee9a7f 100644 --- a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/voicemessages/composer/VoiceMessageComposerStateProvider.kt +++ b/features/messages/api/src/main/kotlin/io/element/android/features/messages/api/timeline/voicemessages/composer/VoiceMessageComposerStateProvider.kt @@ -1,11 +1,11 @@ /* - * Copyright 2023, 2024 New Vector Ltd. + * Copyright 2025 New Vector Ltd. * * SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial * Please see LICENSE files in the repository root for full details. */ -package io.element.android.features.messages.impl.voicemessages.composer +package io.element.android.features.messages.api.timeline.voicemessages.composer import androidx.compose.ui.tooling.preview.PreviewParameterProvider import io.element.android.libraries.designsystem.components.media.createFakeWaveform @@ -13,14 +13,14 @@ import io.element.android.libraries.textcomposer.model.VoiceMessageState import kotlinx.collections.immutable.toPersistentList import kotlin.time.Duration.Companion.seconds -internal open class VoiceMessageComposerStateProvider : PreviewParameterProvider { +open class VoiceMessageComposerStateProvider : PreviewParameterProvider { override val values: Sequence get() = sequenceOf( aVoiceMessageComposerState(voiceMessageState = VoiceMessageState.Recording(duration = 61.seconds, levels = aWaveformLevels)), ) } -internal fun aVoiceMessageComposerState( +fun aVoiceMessageComposerState( voiceMessageState: VoiceMessageState = VoiceMessageState.Idle, keepScreenOn: Boolean = false, showPermissionRationaleDialog: Boolean = false, @@ -33,7 +33,7 @@ internal fun aVoiceMessageComposerState( eventSink = {}, ) -internal fun aVoiceMessagePreviewState() = VoiceMessageState.Preview( +fun aVoiceMessagePreviewState() = VoiceMessageState.Preview( isSending = false, isPlaying = false, showCursor = false, diff --git a/features/messages/impl/build.gradle.kts b/features/messages/impl/build.gradle.kts index 00d8e3f765..1519f204f6 100644 --- a/features/messages/impl/build.gradle.kts +++ b/features/messages/impl/build.gradle.kts @@ -50,6 +50,7 @@ dependencies { implementation(projects.libraries.voiceplayer.api) implementation(projects.libraries.voicerecorder.api) implementation(projects.libraries.mediaplayer.api) + implementation(projects.libraries.push.api) implementation(projects.libraries.uiUtils) implementation(projects.libraries.testtags) implementation(projects.features.networkmonitor.api) @@ -76,6 +77,7 @@ dependencies { testImplementation(libs.test.turbine) testImplementation(projects.libraries.matrix.test) testImplementation(projects.libraries.dateformatter.test) + testImplementation(projects.libraries.push.test) testImplementation(projects.features.location.test) testImplementation(projects.features.networkmonitor.test) testImplementation(projects.features.messages.test) 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 a0df0615eb..266d2459f0 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 @@ -38,6 +38,7 @@ import io.element.android.features.messages.impl.forward.ForwardMessagesNode import io.element.android.features.messages.impl.pinned.PinnedEventsTimelineProvider import io.element.android.features.messages.impl.pinned.list.PinnedMessagesListNode import io.element.android.features.messages.impl.report.ReportMessageNode +import io.element.android.features.messages.impl.threads.ThreadedMessagesNode import io.element.android.features.messages.impl.timeline.TimelineController import io.element.android.features.messages.impl.timeline.debug.EventDebugInfoNode import io.element.android.features.messages.impl.timeline.model.TimelineItem @@ -65,6 +66,7 @@ import io.element.android.libraries.di.RoomScope 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.ThreadId import io.element.android.libraries.matrix.api.core.UserId import io.element.android.libraries.matrix.api.core.toRoomIdOrAlias import io.element.android.libraries.matrix.api.media.MediaSource @@ -139,7 +141,7 @@ class MessagesFlowNode @AssistedInject constructor( ) : NavTarget @Parcelize - data class AttachmentPreview(val attachment: Attachment) : NavTarget + data class AttachmentPreview(val timelineMode: Timeline.Mode, val attachment: Attachment) : NavTarget @Parcelize data class LocationViewer(val location: Location, val description: String?) : NavTarget @@ -154,19 +156,22 @@ class MessagesFlowNode @AssistedInject constructor( data class ReportMessage(val eventId: EventId, val senderId: UserId) : NavTarget @Parcelize - data object SendLocation : NavTarget + data class SendLocation(val timelineMode: Timeline.Mode) : NavTarget @Parcelize - data object CreatePoll : NavTarget + data class CreatePoll(val timelineMode: Timeline.Mode) : NavTarget @Parcelize - data class EditPoll(val eventId: EventId) : NavTarget + data class EditPoll(val timelineMode: Timeline.Mode, val eventId: EventId) : NavTarget @Parcelize data object PinnedMessagesList : NavTarget @Parcelize data object KnockRequestsList : NavTarget + + @Parcelize + data class OpenThread(val threadRootId: ThreadId, val focusedEventId: EventId?) : NavTarget } private val callbacks = plugins() @@ -211,15 +216,18 @@ class MessagesFlowNode @AssistedInject constructor( callbacks.forEach { it.onRoomDetailsClick() } } - override fun onEventClick(isLive: Boolean, event: TimelineItem.Event): Boolean { + override fun onEventClick(timelineMode: Timeline.Mode, event: TimelineItem.Event): Boolean { return processEventClick( - timelineMode = if (isLive) Timeline.Mode.LIVE else Timeline.Mode.FOCUSED_ON_EVENT, + timelineMode = timelineMode, event = event, ) } override fun onPreviewAttachments(attachments: ImmutableList) { - backstack.push(NavTarget.AttachmentPreview(attachments.first())) + backstack.push(NavTarget.AttachmentPreview( + attachment = attachments.first(), + timelineMode = Timeline.Mode.Live, + )) } override fun onUserDataClick(userId: UserId) { @@ -243,15 +251,15 @@ class MessagesFlowNode @AssistedInject constructor( } override fun onSendLocationClick() { - backstack.push(NavTarget.SendLocation) + backstack.push(NavTarget.SendLocation(Timeline.Mode.Live)) } override fun onCreatePollClick() { - backstack.push(NavTarget.CreatePoll) + backstack.push(NavTarget.CreatePoll(Timeline.Mode.Live)) } override fun onEditPollClick(eventId: EventId) { - backstack.push(NavTarget.EditPoll(eventId)) + backstack.push(NavTarget.EditPoll(Timeline.Mode.Live, eventId)) } override fun onJoinCallClick(roomId: RoomId) { @@ -270,6 +278,10 @@ class MessagesFlowNode @AssistedInject constructor( override fun onViewKnockRequests() { backstack.push(NavTarget.KnockRequestsList) } + + override fun onOpenThread(threadRootId: ThreadId, focusedEventId: EventId?) { + backstack.push(NavTarget.OpenThread(threadRootId, focusedEventId)) + } } val inputs = MessagesNode.Inputs(focusedEventId = navTarget.focusedEventId) createNode(buildContext, listOf(callback, inputs)) @@ -298,7 +310,10 @@ class MessagesFlowNode @AssistedInject constructor( .build() } is NavTarget.AttachmentPreview -> { - val inputs = AttachmentsPreviewNode.Inputs(navTarget.attachment) + val inputs = AttachmentsPreviewNode.Inputs( + attachment = navTarget.attachment, + timelineMode = navTarget.timelineMode, + ) createNode(buildContext, listOf(inputs)) } is NavTarget.LocationViewer -> { @@ -327,24 +342,34 @@ class MessagesFlowNode @AssistedInject constructor( val inputs = ReportMessageNode.Inputs(navTarget.eventId, navTarget.senderId) createNode(buildContext, listOf(inputs)) } - NavTarget.SendLocation -> { - sendLocationEntryPoint.createNode(this, buildContext) + is NavTarget.SendLocation -> { + sendLocationEntryPoint + .builder(navTarget.timelineMode) + .build(this, buildContext) } - NavTarget.CreatePoll -> { + is NavTarget.CreatePoll -> { createPollEntryPoint.nodeBuilder(this, buildContext) - .params(CreatePollEntryPoint.Params(mode = CreatePollMode.NewPoll)) + .params(CreatePollEntryPoint.Params( + timelineMode = navTarget.timelineMode, + mode = CreatePollMode.NewPoll + )) .build() } is NavTarget.EditPoll -> { createPollEntryPoint.nodeBuilder(this, buildContext) - .params(CreatePollEntryPoint.Params(mode = CreatePollMode.EditPoll(eventId = navTarget.eventId))) + .params( + CreatePollEntryPoint.Params( + timelineMode = navTarget.timelineMode, + mode = CreatePollMode.EditPoll(eventId = navTarget.eventId) + ) + ) .build() } NavTarget.PinnedMessagesList -> { val callback = object : PinnedMessagesListNode.Callback { override fun onEventClick(event: TimelineItem.Event) { processEventClick( - timelineMode = Timeline.Mode.PINNED_EVENTS, + timelineMode = Timeline.Mode.PinnedEvents, event = event, ) } @@ -377,6 +402,69 @@ class MessagesFlowNode @AssistedInject constructor( NavTarget.KnockRequestsList -> { knockRequestsListEntryPoint.createNode(this, buildContext) } + is NavTarget.OpenThread -> { + val inputs = ThreadedMessagesNode.Inputs( + threadRootEventId = navTarget.threadRootId, + focusedEventId = navTarget.focusedEventId, + ) + val callback = object : ThreadedMessagesNode.Callback { + override fun onEventClick(timelineMode: Timeline.Mode, event: TimelineItem.Event): Boolean { + return processEventClick( + timelineMode = timelineMode, + event = event, + ) + } + + override fun onPreviewAttachments(attachments: ImmutableList) { + backstack.push(NavTarget.AttachmentPreview( + attachment = attachments.first(), + timelineMode = Timeline.Mode.Thread(navTarget.threadRootId) + )) + } + + override fun onUserDataClick(userId: UserId) { + callbacks.forEach { it.onUserDataClick(userId) } + } + + override fun onPermalinkClick(data: PermalinkData) { + callbacks.forEach { it.onPermalinkClick(data, pushToBackstack = true) } + } + + override fun onShowEventDebugInfoClick(eventId: EventId?, debugInfo: TimelineItemDebugInfo) { + backstack.push(NavTarget.EventDebugInfo(eventId, debugInfo)) + } + + override fun onForwardEventClick(eventId: EventId) { + backstack.push(NavTarget.ForwardEvent(eventId, fromPinnedEvents = false)) + } + + override fun onReportMessage(eventId: EventId, senderId: UserId) { + backstack.push(NavTarget.ReportMessage(eventId, senderId)) + } + + override fun onSendLocationClick() { + backstack.push(NavTarget.SendLocation(Timeline.Mode.Thread(navTarget.threadRootId))) + } + + override fun onCreatePollClick() { + backstack.push(NavTarget.CreatePoll(Timeline.Mode.Thread(navTarget.threadRootId))) + } + + override fun onEditPollClick(eventId: EventId) { + backstack.push(NavTarget.EditPoll(Timeline.Mode.Thread(navTarget.threadRootId), eventId)) + } + + override fun onJoinCallClick(roomId: RoomId) { + val callType = CallType.RoomCall( + sessionId = matrixClient.sessionId, + roomId = roomId, + ) + analyticsService.captureInteraction(Interaction.Name.MobileRoomCallButton) + elementCallEntryPoint.startCall(callType) + } + } + createNode(buildContext, listOf(inputs, callback)) + } } } diff --git a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/MessagesNavigator.kt b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/MessagesNavigator.kt index d3c50bc133..ad8e6c6081 100644 --- a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/MessagesNavigator.kt +++ b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/MessagesNavigator.kt @@ -10,6 +10,7 @@ package io.element.android.features.messages.impl import io.element.android.features.messages.impl.attachments.Attachment import io.element.android.libraries.matrix.api.core.EventId import io.element.android.libraries.matrix.api.core.RoomId +import io.element.android.libraries.matrix.api.core.ThreadId import io.element.android.libraries.matrix.api.core.UserId import io.element.android.libraries.matrix.api.timeline.item.TimelineItemDebugInfo import kotlinx.collections.immutable.ImmutableList @@ -21,4 +22,5 @@ interface MessagesNavigator { fun onEditPollClick(eventId: EventId) fun onPreviewAttachment(attachments: ImmutableList) fun onNavigateToRoom(roomId: RoomId, serverNames: List) + fun onOpenThread(threadRootId: ThreadId, focusedEventId: EventId?) } diff --git a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/MessagesNode.kt b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/MessagesNode.kt index 41b88be821..d286f8a4c7 100644 --- a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/MessagesNode.kt +++ b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/MessagesNode.kt @@ -34,6 +34,7 @@ import io.element.android.features.messages.impl.actionlist.model.TimelineItemAc import io.element.android.features.messages.impl.attachments.Attachment import io.element.android.features.messages.impl.messagecomposer.MessageComposerEvents import io.element.android.features.messages.impl.messagecomposer.MessageComposerPresenter +import io.element.android.features.messages.impl.timeline.TimelineController import io.element.android.features.messages.impl.timeline.TimelineEvents import io.element.android.features.messages.impl.timeline.TimelinePresenter import io.element.android.features.messages.impl.timeline.di.LocalTimelineItemPresenterFactories @@ -55,12 +56,14 @@ import io.element.android.libraries.di.annotations.SessionCoroutineScope import io.element.android.libraries.matrix.api.analytics.toAnalyticsViewRoom import io.element.android.libraries.matrix.api.core.EventId import io.element.android.libraries.matrix.api.core.RoomId +import io.element.android.libraries.matrix.api.core.ThreadId import io.element.android.libraries.matrix.api.core.UserId import io.element.android.libraries.matrix.api.core.toRoomIdOrAlias import io.element.android.libraries.matrix.api.permalink.PermalinkData import io.element.android.libraries.matrix.api.permalink.PermalinkParser -import io.element.android.libraries.matrix.api.room.BaseRoom +import io.element.android.libraries.matrix.api.room.JoinedRoom import io.element.android.libraries.matrix.api.room.alias.matches +import io.element.android.libraries.matrix.api.timeline.Timeline import io.element.android.libraries.matrix.api.timeline.item.TimelineItemDebugInfo import io.element.android.libraries.mediaplayer.api.MediaPlayer import io.element.android.libraries.ui.strings.CommonStrings @@ -75,9 +78,8 @@ class MessagesNode @AssistedInject constructor( @Assisted buildContext: BuildContext, @Assisted plugins: List, @ApplicationContext private val context: Context, - @SessionCoroutineScope - private val sessionCoroutineScope: CoroutineScope, - private val room: BaseRoom, + @SessionCoroutineScope private val sessionCoroutineScope: CoroutineScope, + private val room: JoinedRoom, private val analyticsService: AnalyticsService, messageComposerPresenterFactory: MessageComposerPresenter.Factory, timelinePresenterFactory: TimelinePresenter.Factory, @@ -89,11 +91,16 @@ class MessagesNode @AssistedInject constructor( private val knockRequestsBannerRenderer: KnockRequestsBannerRenderer, private val roomMemberModerationRenderer: RoomMemberModerationRenderer, ) : Node(buildContext, plugins = plugins), MessagesNavigator { + private val timelineController = TimelineController(room, room.liveTimeline) private val presenter = presenterFactory.create( navigator = this, - composerPresenter = messageComposerPresenterFactory.create(this), - timelinePresenter = timelinePresenterFactory.create(this), - actionListPresenter = actionListPresenterFactory.create(TimelineItemActionPostProcessor.Default) + composerPresenter = messageComposerPresenterFactory.create(timelineController, this), + timelinePresenter = timelinePresenterFactory.create(timelineController = timelineController, this), + actionListPresenter = actionListPresenterFactory.create( + postProcessor = TimelineItemActionPostProcessor.Default, + timelineMode = timelineController.mainTimelineMode() + ), + timelineController = timelineController, ) private val callbacks = plugins() @@ -103,7 +110,7 @@ class MessagesNode @AssistedInject constructor( interface Callback : Plugin { fun onRoomDetailsClick() - fun onEventClick(isLive: Boolean, event: TimelineItem.Event): Boolean + fun onEventClick(timelineMode: Timeline.Mode, event: TimelineItem.Event): Boolean fun onPreviewAttachments(attachments: ImmutableList) fun onUserDataClick(userId: UserId) fun onPermalinkClick(data: PermalinkData) @@ -116,6 +123,7 @@ class MessagesNode @AssistedInject constructor( fun onJoinCallClick(roomId: RoomId) fun onViewAllPinnedEvents() fun onViewKnockRequests() + fun onOpenThread(threadRootId: ThreadId, focusedEventId: EventId?) } override fun onBuilt() { @@ -134,12 +142,12 @@ class MessagesNode @AssistedInject constructor( callbacks.forEach { it.onRoomDetailsClick() } } - private fun onEventClick(isLive: Boolean, event: TimelineItem.Event): Boolean { + private fun onEventClick(timelineMode: Timeline.Mode, event: TimelineItem.Event): Boolean { // Note: cannot use `callbacks.all { it.onEventClick(event) }` because: // - if callbacks is empty, it will return true and we want to return false. // - if a callback returns false, the other callback will not be invoked. return callbacks.takeIf { it.isNotEmpty() } - ?.map { it.onEventClick(isLive, event) } + ?.map { it.onEventClick(timelineMode, event) } ?.all { it } .orFalse() } @@ -223,6 +231,10 @@ class MessagesNode @AssistedInject constructor( } } + override fun onOpenThread(threadRootId: ThreadId, focusedEventId: EventId?) { + callbacks.forEach { it.onOpenThread(threadRootId, focusedEventId) } + } + private fun onViewAllPinnedMessagesClick() { callbacks.forEach { it.onViewAllPinnedEvents() } } @@ -265,7 +277,18 @@ class MessagesNode @AssistedInject constructor( state = state, onBackClick = this::navigateUp, onRoomDetailsClick = this::onRoomDetailsClick, - onEventContentClick = this::onEventClick, + onEventContentClick = { isLive, event -> + if (isLive) { + onEventClick(timelineController.mainTimelineMode(), event) + } else { + val detachedTimelineMode = timelineController.detachedTimelineMode() + if (detachedTimelineMode != null) { + onEventClick(detachedTimelineMode, event) + } else { + false + } + } + }, onUserDataClick = this::onUserDataClick, onLinkClick = { url, customTab -> onLinkClick(activity, isDark, url, state.timelineState.eventSink, customTab) }, onSendLocationClick = this::onSendLocationClick, 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 434f6643d4..40a8de1276 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,7 +48,7 @@ import io.element.android.features.messages.impl.timeline.model.event.TimelineIt import io.element.android.features.messages.impl.timeline.model.event.TimelineItemStateContent import io.element.android.features.messages.impl.timeline.model.event.TimelineItemTextBasedContent import io.element.android.features.messages.impl.timeline.protection.TimelineProtectionState -import io.element.android.features.messages.impl.voicemessages.composer.VoiceMessageComposerState +import io.element.android.features.messages.impl.voicemessages.composer.DefaultVoiceMessageComposerPresenter import io.element.android.features.roomcall.api.RoomCallState import io.element.android.features.roommembermoderation.api.RoomMemberModerationEvents import io.element.android.features.roommembermoderation.api.RoomMemberModerationState @@ -63,6 +63,9 @@ import io.element.android.libraries.designsystem.components.avatar.AvatarSize import io.element.android.libraries.designsystem.utils.snackbar.SnackbarDispatcher import io.element.android.libraries.designsystem.utils.snackbar.SnackbarMessage import io.element.android.libraries.designsystem.utils.snackbar.collectSnackbarMessageAsState +import io.element.android.libraries.featureflag.api.FeatureFlagService +import io.element.android.libraries.featureflag.api.FeatureFlags +import io.element.android.libraries.matrix.api.core.toThreadId import io.element.android.libraries.matrix.api.encryption.EncryptionService import io.element.android.libraries.matrix.api.encryption.identity.IdentityState import io.element.android.libraries.matrix.api.permalink.PermalinkParser @@ -93,7 +96,7 @@ class MessagesPresenter @AssistedInject constructor( @Assisted private val navigator: MessagesNavigator, private val room: JoinedRoom, @Assisted private val composerPresenter: Presenter, - private val voiceMessageComposerPresenter: Presenter, + voiceMessageComposerPresenterFactory: DefaultVoiceMessageComposerPresenter.Factory, @Assisted private val timelinePresenter: Presenter, private val timelineProtectionPresenter: Presenter, private val identityChangeStatePresenter: Presenter, @@ -111,10 +114,11 @@ class MessagesPresenter @AssistedInject constructor( private val clipboardHelper: ClipboardHelper, private val htmlConverterProvider: HtmlConverterProvider, private val buildMeta: BuildMeta, - private val timelineController: TimelineController, + @Assisted private val timelineController: TimelineController, private val permalinkParser: PermalinkParser, private val analyticsService: AnalyticsService, private val encryptionService: EncryptionService, + private val featureFlagService: FeatureFlagService, ) : Presenter { @AssistedFactory interface Factory { @@ -123,9 +127,14 @@ class MessagesPresenter @AssistedInject constructor( composerPresenter: Presenter, timelinePresenter: Presenter, actionListPresenter: Presenter, + timelineController: TimelineController, ): MessagesPresenter } + private val voiceMessageComposerPresenter = voiceMessageComposerPresenterFactory.create( + timelineMode = timelineController.mainTimelineMode() + ) + @Composable override fun present(): MessagesState { htmlConverterProvider.Update() @@ -145,9 +154,8 @@ class MessagesPresenter @AssistedInject constructor( val pinnedMessagesBannerState = pinnedMessagesBannerPresenter.present() val roomCallState = roomCallStatePresenter.present() val roomMemberModerationState = roomMemberModerationPresenter.present() - val syncUpdateFlow = room.syncUpdateFlow.collectAsState() - val userEventPermissions by userEventPermissions(syncUpdateFlow.value) + val userEventPermissions by userEventPermissions(roomInfo) val roomAvatar by remember { derivedStateOf { roomInfo.avatarData() } @@ -264,8 +272,13 @@ class MessagesPresenter @AssistedInject constructor( } @Composable - private fun userEventPermissions(updateKey: Long): State { - return produceState(UserEventPermissions.DEFAULT, key1 = updateKey) { + private fun userEventPermissions(roomInfo: RoomInfo): State { + val key = if (roomInfo.privilegedCreatorRole && roomInfo.creators.contains(room.sessionId)) { + Long.MAX_VALUE + } else { + roomInfo.roomPowerLevels?.hashCode() ?: 0L + } + return produceState(UserEventPermissions.DEFAULT, key1 = key) { value = UserEventPermissions( canSendMessage = room.canSendMessage(type = MessageEventType.ROOM_MESSAGE).getOrElse { true }, canSendReaction = room.canSendMessage(type = MessageEventType.REACTION).getOrElse { true }, @@ -309,8 +322,17 @@ class MessagesPresenter @AssistedInject constructor( TimelineItemAction.AddCaption -> handleActionAddCaption(targetEvent, composerState) TimelineItemAction.EditCaption -> handleActionEditCaption(targetEvent, composerState) TimelineItemAction.RemoveCaption -> handleRemoveCaption(targetEvent) - TimelineItemAction.Reply, - TimelineItemAction.ReplyInThread -> handleActionReply(targetEvent, composerState, timelineProtectionState) + TimelineItemAction.Reply -> handleActionReply(targetEvent, composerState, timelineProtectionState) + TimelineItemAction.ReplyInThread -> { + val displayThreads = featureFlagService.isFeatureEnabled(FeatureFlags.Threads) + if (displayThreads) { + // Get either the thread id this event is in, or the event id if it's not in a thread so we can start one + val threadId = targetEvent.threadInfo.threadRootId ?: targetEvent.eventId!!.toThreadId() + navigator.onOpenThread(threadId, null) + } else { + handleActionReply(targetEvent, composerState, timelineProtectionState) + } + } TimelineItemAction.ViewSource -> handleShowDebugInfoAction(targetEvent) TimelineItemAction.Forward -> handleForwardAction(targetEvent) TimelineItemAction.ReportContent -> handleReportAction(targetEvent) diff --git a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/MessagesState.kt b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/MessagesState.kt index ddeff51b7e..3d05da5a3c 100644 --- a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/MessagesState.kt +++ b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/MessagesState.kt @@ -8,6 +8,7 @@ package io.element.android.features.messages.impl import androidx.compose.runtime.Immutable +import io.element.android.features.messages.api.timeline.voicemessages.composer.VoiceMessageComposerState import io.element.android.features.messages.impl.actionlist.ActionListState import io.element.android.features.messages.impl.crypto.identity.IdentityChangeState import io.element.android.features.messages.impl.link.LinkState @@ -18,7 +19,6 @@ import io.element.android.features.messages.impl.timeline.components.customreact import io.element.android.features.messages.impl.timeline.components.reactionsummary.ReactionSummaryState import io.element.android.features.messages.impl.timeline.components.receipt.bottomsheet.ReadReceiptBottomSheetState import io.element.android.features.messages.impl.timeline.protection.TimelineProtectionState -import io.element.android.features.messages.impl.voicemessages.composer.VoiceMessageComposerState import io.element.android.features.roomcall.api.RoomCallState import io.element.android.features.roommembermoderation.api.RoomMemberModerationState import io.element.android.libraries.architecture.AsyncData diff --git a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/MessagesStateProvider.kt b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/MessagesStateProvider.kt index b45bb781c5..8217cb977c 100644 --- a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/MessagesStateProvider.kt +++ b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/MessagesStateProvider.kt @@ -8,6 +8,9 @@ package io.element.android.features.messages.impl import androidx.compose.ui.tooling.preview.PreviewParameterProvider +import io.element.android.features.messages.api.timeline.voicemessages.composer.VoiceMessageComposerState +import io.element.android.features.messages.api.timeline.voicemessages.composer.aVoiceMessageComposerState +import io.element.android.features.messages.api.timeline.voicemessages.composer.aVoiceMessagePreviewState import io.element.android.features.messages.impl.actionlist.ActionListState import io.element.android.features.messages.impl.actionlist.anActionListState import io.element.android.features.messages.impl.crypto.identity.IdentityChangeState @@ -31,9 +34,6 @@ import io.element.android.features.messages.impl.timeline.model.TimelineItem import io.element.android.features.messages.impl.timeline.model.event.aTimelineItemTextContent import io.element.android.features.messages.impl.timeline.protection.TimelineProtectionState import io.element.android.features.messages.impl.timeline.protection.aTimelineProtectionState -import io.element.android.features.messages.impl.voicemessages.composer.VoiceMessageComposerState -import io.element.android.features.messages.impl.voicemessages.composer.aVoiceMessageComposerState -import io.element.android.features.messages.impl.voicemessages.composer.aVoiceMessagePreviewState import io.element.android.features.roomcall.api.RoomCallState import io.element.android.features.roomcall.api.aStandByCallState import io.element.android.features.roomcall.api.anOngoingCallState @@ -43,8 +43,10 @@ import io.element.android.libraries.architecture.AsyncData import io.element.android.libraries.designsystem.components.avatar.AvatarData import io.element.android.libraries.designsystem.components.avatar.AvatarSize import io.element.android.libraries.matrix.api.core.RoomId +import io.element.android.libraries.matrix.api.core.ThreadId import io.element.android.libraries.matrix.api.encryption.identity.IdentityState import io.element.android.libraries.matrix.api.room.tombstone.SuccessorRoom +import io.element.android.libraries.matrix.api.timeline.Timeline import io.element.android.libraries.textcomposer.model.MessageComposerMode import io.element.android.libraries.textcomposer.model.aTextEditorStateRich import kotlinx.collections.immutable.persistentListOf @@ -84,6 +86,10 @@ open class MessagesStateProvider : PreviewParameterProvider { aMessagesState(roomName = "A DM with a very looong name", dmUserVerificationState = IdentityState.Verified), aMessagesState(roomName = "A DM with a very looong name", dmUserVerificationState = IdentityState.VerificationViolation), aMessagesState(successorRoom = SuccessorRoom(RoomId("!id:domain"), null)), + aMessagesState(timelineState = aTimelineState( + timelineMode = Timeline.Mode.Thread(threadRootId = ThreadId("\$a-thread-id")), + timelineItems = aTimelineItemList(aTimelineItemTextContent()), + )), ) } 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 74f2fb18a5..ccbebbbc6d 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 @@ -48,6 +48,7 @@ import androidx.compose.ui.tooling.preview.PreviewParameter import androidx.compose.ui.unit.dp import io.element.android.compound.theme.ElementTheme import io.element.android.compound.tokens.generated.CompoundIcons +import io.element.android.features.messages.api.timeline.voicemessages.composer.VoiceMessageComposerEvents import io.element.android.features.messages.impl.actionlist.ActionListEvents import io.element.android.features.messages.impl.actionlist.ActionListView import io.element.android.features.messages.impl.actionlist.model.TimelineItemAction @@ -73,7 +74,6 @@ import io.element.android.features.messages.impl.timeline.components.reactionsum import io.element.android.features.messages.impl.timeline.components.receipt.bottomsheet.ReadReceiptBottomSheet import io.element.android.features.messages.impl.timeline.components.receipt.bottomsheet.ReadReceiptBottomSheetEvents import io.element.android.features.messages.impl.timeline.model.TimelineItem -import io.element.android.features.messages.impl.voicemessages.composer.VoiceMessageComposerEvents import io.element.android.features.messages.impl.voicemessages.composer.VoiceMessagePermissionRationaleDialog import io.element.android.features.messages.impl.voicemessages.composer.VoiceMessageSendingFailedDialog import io.element.android.features.networkmonitor.api.ui.ConnectivityIndicatorView @@ -105,6 +105,7 @@ import io.element.android.libraries.matrix.api.core.RoomId import io.element.android.libraries.matrix.api.core.UserId import io.element.android.libraries.matrix.api.encryption.identity.IdentityState import io.element.android.libraries.matrix.api.room.tombstone.SuccessorRoom +import io.element.android.libraries.matrix.api.timeline.Timeline import io.element.android.libraries.matrix.api.user.MatrixUser import io.element.android.libraries.textcomposer.model.TextEditorState import io.element.android.libraries.ui.strings.CommonStrings @@ -196,17 +197,21 @@ fun MessagesView( topBar = { Column { ConnectivityIndicatorView(isOnline = state.hasNetworkConnection) - MessagesViewTopBar( - roomName = state.roomName, - roomAvatar = state.roomAvatar, - isTombstoned = state.isTombstoned, - heroes = state.heroes, - roomCallState = state.roomCallState, - dmUserIdentityState = state.dmUserVerificationState, - onBackClick = { hidingKeyboard { onBackClick() } }, - onRoomDetailsClick = { hidingKeyboard { onRoomDetailsClick() } }, - onJoinCallClick = onJoinCallClick, - ) + if (state.timelineState.timelineMode is Timeline.Mode.Thread) { + ThreadTopBar(onBackClick = onBackClick) + } else { + MessagesViewTopBar( + roomName = state.roomName, + roomAvatar = state.roomAvatar, + isTombstoned = state.isTombstoned, + heroes = state.heroes, + roomCallState = state.roomCallState, + dmUserIdentityState = state.dmUserVerificationState, + onBackClick = { hidingKeyboard { onBackClick() } }, + onRoomDetailsClick = { hidingKeyboard { onRoomDetailsClick() } }, + onJoinCallClick = onJoinCallClick, + ) + } } }, content = { padding -> @@ -414,23 +419,26 @@ private fun MessagesViewContent( onJoinCallClick = onJoinCallClick, nestedScrollConnection = scrollBehavior.nestedScrollConnection, ) - AnimatedVisibility( - visible = state.pinnedMessagesBannerState is PinnedMessagesBannerState.Visible && scrollBehavior.isVisible, - enter = expandVertically(), - exit = shrinkVertically(), - ) { - fun focusOnPinnedEvent(eventId: EventId) { - state.timelineState.eventSink( - TimelineEvents.FocusOnEvent(eventId = eventId, debounce = FOCUS_ON_PINNED_EVENT_DEBOUNCE_DURATION_IN_MILLIS.milliseconds) + + if (state.timelineState.timelineMode !is Timeline.Mode.Thread) { + AnimatedVisibility( + visible = state.pinnedMessagesBannerState is PinnedMessagesBannerState.Visible && scrollBehavior.isVisible, + enter = expandVertically(), + exit = shrinkVertically(), + ) { + fun focusOnPinnedEvent(eventId: EventId) { + state.timelineState.eventSink( + TimelineEvents.FocusOnEvent(eventId = eventId, debounce = FOCUS_ON_PINNED_EVENT_DEBOUNCE_DURATION_IN_MILLIS.milliseconds) + ) + } + PinnedMessagesBannerView( + state = state.pinnedMessagesBannerState, + onClick = ::focusOnPinnedEvent, + onViewAllClick = onViewAllPinnedMessagesClick, ) } - PinnedMessagesBannerView( - state = state.pinnedMessagesBannerState, - onClick = ::focusOnPinnedEvent, - onViewAllClick = onViewAllPinnedMessagesClick, - ) + knockRequestsBannerView() } - knockRequestsBannerView() } } } @@ -540,6 +548,21 @@ private fun MessagesViewTopBar( ) } +@OptIn(ExperimentalMaterial3Api::class) +@Composable +private fun ThreadTopBar( + onBackClick: () -> Unit, +) { + TopAppBar( + navigationIcon = { + BackButton(onClick = onBackClick) + }, + title = { + Text(stringResource(CommonStrings.common_thread)) + } + ) +} + @Composable private fun RoomAvatarAndNameRow( roomName: String?, 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 375e2bdefe..ca7a6fa4a3 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 @@ -39,8 +39,11 @@ import io.element.android.libraries.architecture.Presenter import io.element.android.libraries.dateformatter.api.DateFormatter import io.element.android.libraries.dateformatter.api.DateFormatterMode import io.element.android.libraries.di.RoomScope +import io.element.android.libraries.featureflag.api.FeatureFlagService +import io.element.android.libraries.featureflag.api.FeatureFlags import io.element.android.libraries.matrix.api.core.EventId import io.element.android.libraries.matrix.api.room.BaseRoom +import io.element.android.libraries.matrix.api.timeline.Timeline import io.element.android.libraries.preferences.api.store.AppPreferencesStore import kotlinx.collections.immutable.ImmutableList import kotlinx.collections.immutable.persistentListOf @@ -51,22 +54,31 @@ import kotlinx.coroutines.launch interface ActionListPresenter : Presenter { interface Factory { - fun create(postProcessor: TimelineItemActionPostProcessor): ActionListPresenter + fun create( + postProcessor: TimelineItemActionPostProcessor, + timelineMode: Timeline.Mode, + ): ActionListPresenter } } class DefaultActionListPresenter @AssistedInject constructor( @Assisted private val postProcessor: TimelineItemActionPostProcessor, + @Assisted + private val timelineMode: Timeline.Mode, private val appPreferencesStore: AppPreferencesStore, private val room: BaseRoom, private val userSendFailureFactory: VerifiedUserSendFailureFactory, private val dateFormatter: DateFormatter, + private val featureFlagService: FeatureFlagService, ) : ActionListPresenter { @AssistedFactory @ContributesBinding(RoomScope::class) interface Factory : ActionListPresenter.Factory { - override fun create(postProcessor: TimelineItemActionPostProcessor): DefaultActionListPresenter + override fun create( + postProcessor: TimelineItemActionPostProcessor, + timelineMode: Timeline.Mode, + ): DefaultActionListPresenter } private val comparator = TimelineItemActionComparator() @@ -86,6 +98,8 @@ class DefaultActionListPresenter @AssistedInject constructor( room.roomInfoFlow.map { it.pinnedEventIds } }.collectAsState(initial = persistentListOf()) + val isThreadsEnabled = featureFlagService.isFeatureEnabledFlow(FeatureFlags.Threads).collectAsState(false) + fun handleEvents(event: ActionListEvents) { when (event) { ActionListEvents.Clear -> target.value = ActionListState.Target.None @@ -95,6 +109,7 @@ class DefaultActionListPresenter @AssistedInject constructor( isDeveloperModeEnabled = isDeveloperModeEnabled, pinnedEventIds = pinnedEventIds, target = target, + isThreadsEnabled = isThreadsEnabled.value, ) } } @@ -110,7 +125,8 @@ class DefaultActionListPresenter @AssistedInject constructor( usersEventPermissions: UserEventPermissions, isDeveloperModeEnabled: Boolean, pinnedEventIds: ImmutableList, - target: MutableState + target: MutableState, + isThreadsEnabled: Boolean, ) = launch { target.value = ActionListState.Target.Loading(timelineItem) @@ -119,6 +135,7 @@ class DefaultActionListPresenter @AssistedInject constructor( usersEventPermissions = usersEventPermissions, isDeveloperModeEnabled = isDeveloperModeEnabled, isEventPinned = pinnedEventIds.contains(timelineItem.eventId), + isThreadsEnabled = isThreadsEnabled, ) val verifiedUserSendFailure = userSendFailureFactory.create(timelineItem.localSendState) @@ -146,14 +163,23 @@ class DefaultActionListPresenter @AssistedInject constructor( usersEventPermissions: UserEventPermissions, isDeveloperModeEnabled: Boolean, isEventPinned: Boolean, + isThreadsEnabled: Boolean, ): List { val canRedact = timelineItem.isMine && usersEventPermissions.canRedactOwn || !timelineItem.isMine && usersEventPermissions.canRedactOther return buildSet { if (timelineItem.canBeRepliedTo && usersEventPermissions.canSendMessage) { - if (timelineItem.isThreaded) { + if (isThreadsEnabled && timelineMode !is Timeline.Mode.Thread && timelineItem.isRemote) { + // If threads are enabled, we can reply in thread if the item is remote add(TimelineItemAction.ReplyInThread) - } else { add(TimelineItemAction.Reply) + } else { + if (!isThreadsEnabled && timelineItem.threadInfo.threadRootId != null) { + // If threads are not enabled, we can reply in a thread if the item is already in the thread + add(TimelineItemAction.ReplyInThread) + } else { + // Otherwise, we can only reply in the room + add(TimelineItemAction.Reply) + } } } if (timelineItem.isRemote && timelineItem.content.canBeForwarded()) { diff --git a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/attachments/preview/AttachmentsPreviewNode.kt b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/attachments/preview/AttachmentsPreviewNode.kt index 720cfacfb5..735d5548e8 100644 --- a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/attachments/preview/AttachmentsPreviewNode.kt +++ b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/attachments/preview/AttachmentsPreviewNode.kt @@ -20,6 +20,7 @@ import io.element.android.features.messages.impl.attachments.Attachment import io.element.android.libraries.architecture.NodeInputs import io.element.android.libraries.architecture.inputs import io.element.android.libraries.di.RoomScope +import io.element.android.libraries.matrix.api.timeline.Timeline import io.element.android.libraries.mediaviewer.api.local.LocalMediaRenderer @ContributesNode(RoomScope::class) @@ -29,7 +30,10 @@ class AttachmentsPreviewNode @AssistedInject constructor( presenterFactory: AttachmentsPreviewPresenter.Factory, private val localMediaRenderer: LocalMediaRenderer, ) : Node(buildContext, plugins = plugins) { - data class Inputs(val attachment: Attachment) : NodeInputs + data class Inputs( + val attachment: Attachment, + val timelineMode: Timeline.Mode, + ) : NodeInputs private val inputs: Inputs = inputs() @@ -39,6 +43,7 @@ class AttachmentsPreviewNode @AssistedInject constructor( private val presenter = presenterFactory.create( attachment = inputs.attachment, + timelineMode = inputs.timelineMode, onDoneListener = onDoneListener, ) diff --git a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/attachments/preview/AttachmentsPreviewPresenter.kt b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/attachments/preview/AttachmentsPreviewPresenter.kt index 45c5c33e11..d01b11a026 100644 --- a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/attachments/preview/AttachmentsPreviewPresenter.kt +++ b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/attachments/preview/AttachmentsPreviewPresenter.kt @@ -24,6 +24,7 @@ import io.element.android.features.messages.impl.attachments.Attachment import io.element.android.features.messages.impl.attachments.video.MediaOptimizationSelectorPresenter import io.element.android.libraries.androidutils.file.TemporaryUriDeleter import io.element.android.libraries.androidutils.file.safeDelete +import io.element.android.libraries.androidutils.hash.hash import io.element.android.libraries.architecture.Presenter import io.element.android.libraries.core.coroutine.CoroutineDispatchers import io.element.android.libraries.core.coroutine.firstInstanceOf @@ -32,8 +33,8 @@ import io.element.android.libraries.core.mimetype.MimeTypes.isMimeTypeImage import io.element.android.libraries.core.mimetype.MimeTypes.isMimeTypeVideo import io.element.android.libraries.di.annotations.SessionCoroutineScope import io.element.android.libraries.matrix.api.core.EventId -import io.element.android.libraries.matrix.api.core.ProgressCallback import io.element.android.libraries.matrix.api.permalink.PermalinkBuilder +import io.element.android.libraries.matrix.api.timeline.Timeline import io.element.android.libraries.mediaupload.api.MediaOptimizationConfig import io.element.android.libraries.mediaupload.api.MediaSender import io.element.android.libraries.mediaupload.api.MediaUploadInfo @@ -47,12 +48,12 @@ import kotlinx.coroutines.Job import kotlinx.coroutines.isActive import kotlinx.coroutines.launch import timber.log.Timber -import kotlin.coroutines.coroutineContext class AttachmentsPreviewPresenter @AssistedInject constructor( @Assisted private val attachment: Attachment, @Assisted private val onDoneListener: OnDoneListener, - private val mediaSender: MediaSender, + @Assisted private val timelineMode: Timeline.Mode, + mediaSenderFactory: MediaSender.Factory, private val permalinkBuilder: PermalinkBuilder, private val temporaryUriDeleter: TemporaryUriDeleter, private val mediaOptimizationSelectorPresenterFactory: MediaOptimizationSelectorPresenter.Factory, @@ -63,10 +64,13 @@ class AttachmentsPreviewPresenter @AssistedInject constructor( interface Factory { fun create( attachment: Attachment, + timelineMode: Timeline.Mode, onDoneListener: OnDoneListener, ): AttachmentsPreviewPresenter } + private val mediaSender = mediaSenderFactory.create(timelineMode) + @Composable override fun present(): AttachmentsPreviewState { val coroutineScope = rememberCoroutineScope() @@ -258,6 +262,7 @@ class AttachmentsPreviewPresenter @AssistedInject constructor( mediaOptimizationConfig = mediaOptimizationConfig, ).fold( onSuccess = { mediaUploadInfo -> + Timber.d("Media ${mediaUploadInfo.file.path.orEmpty().hash()} finished processing, it's now ready to upload") sendActionState.value = SendActionState.Sending.ReadyToUpload(mediaUploadInfo) }, onFailure = { @@ -304,20 +309,11 @@ class AttachmentsPreviewPresenter @AssistedInject constructor( dismissAfterSend: Boolean, inReplyToEventId: EventId?, ) = runCatchingExceptions { - val context = coroutineContext - val progressCallback = object : ProgressCallback { - override fun onProgress(current: Long, total: Long) { - // Note will not happen if useSendQueue is true - if (context.isActive) { - sendActionState.value = SendActionState.Sending.Uploading(current.toFloat() / total.toFloat(), mediaUploadInfo) - } - } - } + sendActionState.value = SendActionState.Sending.Uploading(mediaUploadInfo) mediaSender.sendPreProcessedMedia( mediaUploadInfo = mediaUploadInfo, caption = caption, formattedCaption = null, - progressCallback = progressCallback, inReplyToEventId = inReplyToEventId, ).getOrThrow() }.fold( diff --git a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/attachments/preview/AttachmentsPreviewState.kt b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/attachments/preview/AttachmentsPreviewState.kt index 71d29cbfb6..96ff83a8a7 100644 --- a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/attachments/preview/AttachmentsPreviewState.kt +++ b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/attachments/preview/AttachmentsPreviewState.kt @@ -30,7 +30,7 @@ sealed interface SendActionState { sealed interface Sending : SendActionState { data class Processing(val displayProgress: Boolean) : Sending data class ReadyToUpload(val mediaInfo: MediaUploadInfo) : Sending - data class Uploading(val progress: Float, val mediaUploadInfo: MediaUploadInfo) : Sending + data class Uploading(val mediaUploadInfo: MediaUploadInfo) : Sending } data class Failure(val error: Throwable, val mediaUploadInfo: MediaUploadInfo?) : SendActionState diff --git a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/attachments/preview/AttachmentsPreviewStateProvider.kt b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/attachments/preview/AttachmentsPreviewStateProvider.kt index 43410efa46..ac7034efe7 100644 --- a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/attachments/preview/AttachmentsPreviewStateProvider.kt +++ b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/attachments/preview/AttachmentsPreviewStateProvider.kt @@ -39,7 +39,7 @@ open class AttachmentsPreviewStateProvider : PreviewParameterProvider { ProgressDialog( - type = ProgressDialogType.Determinate(sendActionState.progress), + type = ProgressDialogType.Indeterminate, text = stringResource(id = CommonStrings.common_sending), showCancelButton = true, onDismissRequest = onDismissClick, diff --git a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/attachments/video/DefaultMediaOptimizationSelectorPresenter.kt b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/attachments/video/DefaultMediaOptimizationSelectorPresenter.kt index b14b17dc01..ea9c3dcc0c 100644 --- a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/attachments/video/DefaultMediaOptimizationSelectorPresenter.kt +++ b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/attachments/video/DefaultMediaOptimizationSelectorPresenter.kt @@ -101,8 +101,9 @@ class DefaultMediaOptimizationSelectorPresenter @AssistedInject constructor( val sizeEstimations = VideoCompressionPreset.entries .map { preset -> - val bitRate = preset.compressorHelper().calculateOptimalBitrate(videoDimensions, 30) - val calculatedSize = (bitRate * duration / 8 * 1.1).roundToLong() // Adding 10% overhead for safety + val bitRateAsBytes = preset.compressorHelper().calculateOptimalBitrate(videoDimensions, 30) / 8f + val durationInSeconds = duration.inWholeSeconds.toFloat() + val calculatedSize = (bitRateAsBytes * durationInSeconds * 1.1f).roundToLong() // Adding 10% overhead for safety VideoUploadEstimation( preset = preset, sizeInBytes = calculatedSize, diff --git a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/attachments/video/VideoMetadataExtractor.kt b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/attachments/video/VideoMetadataExtractor.kt index e8f30043ef..0567bfeffc 100644 --- a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/attachments/video/VideoMetadataExtractor.kt +++ b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/attachments/video/VideoMetadataExtractor.kt @@ -18,10 +18,12 @@ import dagger.assisted.AssistedInject import io.element.android.libraries.core.extensions.runCatchingExceptions import io.element.android.libraries.di.AppScope import io.element.android.libraries.di.ApplicationContext +import kotlin.time.Duration +import kotlin.time.Duration.Companion.milliseconds interface VideoMetadataExtractor : AutoCloseable { fun getSize(): Result - fun getDuration(): Result + fun getDuration(): Result interface Factory { fun create(uri: Uri): VideoMetadataExtractor } @@ -57,9 +59,10 @@ class DefaultVideoMetadataExtractor @AssistedInject constructor( } } - override fun getDuration(): Result = runCatchingExceptions { + override fun getDuration(): Result = runCatchingExceptions { mediaMetadataRetriever.value.extractMetadata(MediaMetadataRetriever.METADATA_KEY_DURATION)?.toLong() ?.takeIf { it > 0L } + ?.milliseconds ?: error("Could not retrieve video duration from metadata") } diff --git a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/di/MessagesModule.kt b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/di/MessagesBindsModule.kt similarity index 90% rename from features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/di/MessagesModule.kt rename to features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/di/MessagesBindsModule.kt index ed84ef9df0..5148ea0216 100644 --- a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/di/MessagesModule.kt +++ b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/di/MessagesBindsModule.kt @@ -28,14 +28,12 @@ import io.element.android.features.messages.impl.timeline.protection.TimelinePro import io.element.android.features.messages.impl.timeline.protection.TimelineProtectionState import io.element.android.features.messages.impl.typing.TypingNotificationPresenter import io.element.android.features.messages.impl.typing.TypingNotificationState -import io.element.android.features.messages.impl.voicemessages.composer.VoiceMessageComposerPresenter -import io.element.android.features.messages.impl.voicemessages.composer.VoiceMessageComposerState import io.element.android.libraries.architecture.Presenter import io.element.android.libraries.di.RoomScope @ContributesTo(RoomScope::class) @Module -interface MessagesModule { +interface MessagesBindsModule { @Binds fun bindPinnedMessagesBannerPresenter(presenter: PinnedMessagesBannerPresenter): Presenter @@ -51,9 +49,6 @@ interface MessagesModule { @Binds fun bindLinkPresenter(presenter: LinkPresenter): Presenter - @Binds - fun bindVoiceMessageComposerPresenter(presenter: VoiceMessageComposerPresenter): Presenter - @Binds fun bindCustomReactionPresenter(presenter: CustomReactionPresenter): Presenter diff --git a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/di/MessagesProvidesModule.kt b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/di/MessagesProvidesModule.kt new file mode 100644 index 0000000000..970aa63b75 --- /dev/null +++ b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/di/MessagesProvidesModule.kt @@ -0,0 +1,24 @@ +/* + * Copyright 2025 New Vector Ltd. + * + * SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial + * Please see LICENSE files in the repository root for full details. + */ + +package io.element.android.features.messages.impl.di + +import com.squareup.anvil.annotations.ContributesTo +import dagger.Module +import dagger.Provides +import io.element.android.features.messages.impl.timeline.di.LiveTimeline +import io.element.android.libraries.di.RoomScope +import io.element.android.libraries.matrix.api.room.JoinedRoom +import io.element.android.libraries.matrix.api.timeline.Timeline + +@ContributesTo(RoomScope::class) +@Module +object MessagesProvidesModule { + @Provides + @LiveTimeline + fun provideLiveTimeline(joinedRoom: JoinedRoom): Timeline = joinedRoom.liveTimeline +} diff --git a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/messagecomposer/MessageComposerPresenter.kt b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/messagecomposer/MessageComposerPresenter.kt index 8e0cce0e9b..2da723746c 100644 --- a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/messagecomposer/MessageComposerPresenter.kt +++ b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/messagecomposer/MessageComposerPresenter.kt @@ -52,11 +52,14 @@ import io.element.android.libraries.matrix.api.room.IntentionalMention import io.element.android.libraries.matrix.api.room.JoinedRoom import io.element.android.libraries.matrix.api.room.draft.ComposerDraft import io.element.android.libraries.matrix.api.room.draft.ComposerDraftType +import io.element.android.libraries.matrix.api.room.getDirectRoomMember import io.element.android.libraries.matrix.api.room.isDm +import io.element.android.libraries.matrix.api.room.roomMembers import io.element.android.libraries.matrix.api.timeline.TimelineException import io.element.android.libraries.matrix.api.timeline.item.event.toEventOrTransactionId import io.element.android.libraries.matrix.ui.messages.reply.InReplyToDetails import io.element.android.libraries.matrix.ui.messages.reply.map +import io.element.android.libraries.matrix.ui.room.getDirectRoomMember import io.element.android.libraries.mediapickers.api.PickerProvider import io.element.android.libraries.mediaupload.api.MediaOptimizationConfigProvider import io.element.android.libraries.mediaupload.api.MediaSender @@ -64,6 +67,7 @@ import io.element.android.libraries.mediaviewer.api.local.LocalMediaFactory import io.element.android.libraries.permissions.api.PermissionsEvents import io.element.android.libraries.permissions.api.PermissionsPresenter import io.element.android.libraries.preferences.api.store.SessionPreferencesStore +import io.element.android.libraries.push.api.notifications.conversations.NotificationConversationService import io.element.android.libraries.textcomposer.mentions.MentionSpanProvider import io.element.android.libraries.textcomposer.mentions.ResolvedSuggestion import io.element.android.libraries.textcomposer.model.MarkdownTextEditorState @@ -97,13 +101,13 @@ import io.element.android.libraries.core.mimetype.MimeTypes.Any as AnyMimeTypes class MessageComposerPresenter @AssistedInject constructor( @Assisted private val navigator: MessagesNavigator, - @SessionCoroutineScope - private val sessionCoroutineScope: CoroutineScope, + @Assisted private val timelineController: TimelineController, + @SessionCoroutineScope private val sessionCoroutineScope: CoroutineScope, private val room: JoinedRoom, private val mediaPickerProvider: PickerProvider, private val sessionPreferencesStore: SessionPreferencesStore, private val localMediaFactory: LocalMediaFactory, - private val mediaSender: MediaSender, + private val mediaSenderFactory: MediaSender.Factory, private val snackbarDispatcher: SnackbarDispatcher, private val analyticsService: AnalyticsService, private val locationService: LocationService, @@ -113,18 +117,20 @@ class MessageComposerPresenter @AssistedInject constructor( private val permalinkParser: PermalinkParser, private val permalinkBuilder: PermalinkBuilder, permissionsPresenterFactory: PermissionsPresenter.Factory, - private val timelineController: TimelineController, private val draftService: ComposerDraftService, private val mentionSpanProvider: MentionSpanProvider, private val pillificationHelper: TextPillificationHelper, private val suggestionsProcessor: SuggestionsProcessor, private val mediaOptimizationConfigProvider: MediaOptimizationConfigProvider, + private val notificationConversationService: NotificationConversationService, ) : Presenter { @AssistedFactory interface Factory { - fun create(navigator: MessagesNavigator): MessageComposerPresenter + fun create(timelineController: TimelineController, navigator: MessagesNavigator): MessageComposerPresenter } + private val mediaSender = mediaSenderFactory.create(timelineMode = timelineController.mainTimelineMode()) + private val cameraPermissionPresenter = permissionsPresenterFactory.create(Manifest.permission.CAMERA) private var pendingEvent: MessageComposerEvents? = null private val suggestionSearchTrigger = MutableStateFlow(null) @@ -423,11 +429,13 @@ class MessageComposerPresenter @AssistedInject constructor( resetComposer(markdownTextEditorState, richTextEditorState, fromEdit = capturedMode is MessageComposerMode.Edit) when (capturedMode) { is MessageComposerMode.Attachment, - is MessageComposerMode.Normal -> room.liveTimeline.sendMessage( - body = message.markdown, - htmlBody = message.html, - intentionalMentions = message.intentionalMentions - ) + is MessageComposerMode.Normal -> timelineController.invokeOnCurrentTimeline { + sendMessage( + body = message.markdown, + htmlBody = message.html, + intentionalMentions = message.intentionalMentions + ) + } is MessageComposerMode.Edit -> { timelineController.invokeOnCurrentTimeline { // First try to edit the message in the current timeline @@ -463,6 +471,18 @@ class MessageComposerPresenter @AssistedInject constructor( } } } + + val roomInfo = room.info() + val roomMembers = room.membersStateFlow.value + + notificationConversationService.onSendMessage( + sessionId = room.sessionId, + roomId = roomInfo.id, + roomName = roomInfo.name ?: roomInfo.id.value, + roomIsDirect = roomInfo.isDm, + roomAvatarUrl = roomInfo.avatarUrl ?: roomMembers.getDirectRoomMember(roomInfo = roomInfo, sessionId = room.sessionId)?.avatarUrl, + ) + analyticsService.capture( Composer( inThread = capturedMode.inThread, @@ -510,7 +530,6 @@ class MessageComposerPresenter @AssistedInject constructor( mediaSender.sendMedia( uri = uri, mimeType = mimeType, - progressCallback = null, mediaOptimizationConfig = mediaOptimizationConfigProvider.get(), ).getOrThrow() } diff --git a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/messagecomposer/MessageComposerView.kt b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/messagecomposer/MessageComposerView.kt index 0cc5bd93ec..7206d2571b 100644 --- a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/messagecomposer/MessageComposerView.kt +++ b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/messagecomposer/MessageComposerView.kt @@ -17,10 +17,10 @@ import androidx.compose.ui.Modifier import androidx.compose.ui.platform.LocalView import androidx.compose.ui.tooling.preview.PreviewParameter import androidx.compose.ui.unit.dp -import io.element.android.features.messages.impl.voicemessages.composer.VoiceMessageComposerEvents -import io.element.android.features.messages.impl.voicemessages.composer.VoiceMessageComposerState -import io.element.android.features.messages.impl.voicemessages.composer.VoiceMessageComposerStateProvider -import io.element.android.features.messages.impl.voicemessages.composer.aVoiceMessageComposerState +import io.element.android.features.messages.api.timeline.voicemessages.composer.VoiceMessageComposerEvents +import io.element.android.features.messages.api.timeline.voicemessages.composer.VoiceMessageComposerState +import io.element.android.features.messages.api.timeline.voicemessages.composer.VoiceMessageComposerStateProvider +import io.element.android.features.messages.api.timeline.voicemessages.composer.aVoiceMessageComposerState import io.element.android.libraries.designsystem.preview.ElementPreview import io.element.android.libraries.designsystem.preview.PreviewsDayNight import io.element.android.libraries.textcomposer.TextComposer diff --git a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/pinned/list/PinnedMessagesListNode.kt b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/pinned/list/PinnedMessagesListNode.kt index 2dbf76bc8d..45bed2cc20 100644 --- a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/pinned/list/PinnedMessagesListNode.kt +++ b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/pinned/list/PinnedMessagesListNode.kt @@ -32,6 +32,7 @@ import io.element.android.libraries.matrix.api.core.EventId import io.element.android.libraries.matrix.api.core.UserId import io.element.android.libraries.matrix.api.permalink.PermalinkData import io.element.android.libraries.matrix.api.permalink.PermalinkParser +import io.element.android.libraries.matrix.api.timeline.Timeline import io.element.android.libraries.matrix.api.timeline.item.TimelineItemDebugInfo import io.element.android.libraries.matrix.api.user.MatrixUser import io.element.android.libraries.ui.strings.CommonStrings @@ -56,7 +57,10 @@ class PinnedMessagesListNode @AssistedInject constructor( private val presenter = presenterFactory.create( navigator = this, - actionListPresenter = actionListPresenterFactory.create(PinnedMessagesListTimelineActionPostProcessor()) + actionListPresenter = actionListPresenterFactory.create( + postProcessor = PinnedMessagesListTimelineActionPostProcessor(), + timelineMode = Timeline.Mode.PinnedEvents, + ) ) private val callbacks = plugins() diff --git a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/pinned/list/PinnedMessagesListPresenter.kt b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/pinned/list/PinnedMessagesListPresenter.kt index 1c9e18c9e6..523c371747 100644 --- a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/pinned/list/PinnedMessagesListPresenter.kt +++ b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/pinned/list/PinnedMessagesListPresenter.kt @@ -39,6 +39,8 @@ import io.element.android.libraries.architecture.Presenter import io.element.android.libraries.designsystem.utils.snackbar.SnackbarDispatcher import io.element.android.libraries.designsystem.utils.snackbar.SnackbarMessage import io.element.android.libraries.di.annotations.SessionCoroutineScope +import io.element.android.libraries.featureflag.api.FeatureFlagService +import io.element.android.libraries.featureflag.api.FeatureFlags import io.element.android.libraries.matrix.api.room.JoinedRoom import io.element.android.libraries.matrix.api.room.powerlevels.canPinUnpin import io.element.android.libraries.matrix.api.room.powerlevels.canRedactOther @@ -71,6 +73,7 @@ class PinnedMessagesListPresenter @AssistedInject constructor( @SessionCoroutineScope private val sessionCoroutineScope: CoroutineScope, private val analyticsService: AnalyticsService, + private val featureFlagService: FeatureFlagService, ) : Presenter { @AssistedFactory interface Factory { @@ -115,6 +118,8 @@ class PinnedMessagesListPresenter @AssistedInject constructor( val syncUpdateFlow = room.syncUpdateFlow.collectAsState() val userEventPermissions by userEventPermissions(syncUpdateFlow.value) + val displayThreadSummaries by featureFlagService.isFeatureEnabledFlow(FeatureFlags.Threads).collectAsState(false) + var pinnedMessageItems by remember { mutableStateOf>>(AsyncData.Uninitialized) } @@ -134,6 +139,7 @@ class PinnedMessagesListPresenter @AssistedInject constructor( timelineRoomInfo = timelineRoomInfo, timelineProtectionState = timelineProtectionState, linkState = linkState, + displayThreadSummaries = displayThreadSummaries, userEventPermissions = userEventPermissions, timelineItems = pinnedMessageItems, eventSink = ::handleEvents @@ -230,6 +236,7 @@ class PinnedMessagesListPresenter @AssistedInject constructor( private fun pinnedMessagesListState( timelineRoomInfo: TimelineRoomInfo, timelineProtectionState: TimelineProtectionState, + displayThreadSummaries: Boolean, linkState: LinkState, userEventPermissions: UserEventPermissions, timelineItems: AsyncData>, @@ -246,6 +253,7 @@ class PinnedMessagesListPresenter @AssistedInject constructor( PinnedMessagesListState.Filled( timelineRoomInfo = timelineRoomInfo, timelineProtectionState = timelineProtectionState, + displayThreadSummaries = displayThreadSummaries, linkState = linkState, userEventPermissions = userEventPermissions, timelineItems = timelineItems.data, diff --git a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/pinned/list/PinnedMessagesListState.kt b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/pinned/list/PinnedMessagesListState.kt index d702e2d40f..8d71899134 100644 --- a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/pinned/list/PinnedMessagesListState.kt +++ b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/pinned/list/PinnedMessagesListState.kt @@ -33,6 +33,7 @@ sealed interface PinnedMessagesListState { val timelineItems: ImmutableList, val actionListState: ActionListState, val linkState: LinkState, + val displayThreadSummaries: Boolean, val eventSink: (PinnedMessagesListEvents) -> Unit, ) : PinnedMessagesListState { val loadedPinnedMessagesCount = timelineItems.count { timelineItem -> timelineItem is TimelineItem.Event } diff --git a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/pinned/list/PinnedMessagesListStateProvider.kt b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/pinned/list/PinnedMessagesListStateProvider.kt index 2a9b7a085c..70b457b90c 100644 --- a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/pinned/list/PinnedMessagesListStateProvider.kt +++ b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/pinned/list/PinnedMessagesListStateProvider.kt @@ -92,6 +92,7 @@ fun aLoadedPinnedMessagesListState( timelineItems: List = emptyList(), actionListState: ActionListState = anActionListState(), aUserEventPermissions: UserEventPermissions = UserEventPermissions.DEFAULT, + displayThreadSummaries: Boolean = false, eventSink: (PinnedMessagesListEvents) -> Unit = {} ) = PinnedMessagesListState.Filled( timelineRoomInfo = timelineRoomInfo, @@ -100,5 +101,6 @@ fun aLoadedPinnedMessagesListState( timelineItems = timelineItems.toImmutableList(), actionListState = actionListState, userEventPermissions = aUserEventPermissions, + displayThreadSummaries = displayThreadSummaries, eventSink = eventSink, ) diff --git a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/pinned/list/PinnedMessagesListView.kt b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/pinned/list/PinnedMessagesListView.kt index 86cd8c740f..0abfc4d75a 100644 --- a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/pinned/list/PinnedMessagesListView.kt +++ b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/pinned/list/PinnedMessagesListView.kt @@ -46,6 +46,7 @@ import io.element.android.libraries.designsystem.preview.PreviewsDayNight import io.element.android.libraries.designsystem.theme.components.CircularProgressIndicator import io.element.android.libraries.designsystem.theme.components.Scaffold import io.element.android.libraries.designsystem.theme.components.TopAppBar +import io.element.android.libraries.matrix.api.timeline.Timeline import io.element.android.libraries.matrix.api.user.MatrixUser import io.element.android.libraries.ui.strings.CommonStrings import io.element.android.services.analytics.compose.LocalAnalyticsService @@ -126,6 +127,7 @@ private fun PinnedMessagesListContent( PinnedMessagesListState.Empty -> PinnedMessagesListEmpty() is PinnedMessagesListState.Filled -> PinnedMessagesListLoaded( state = state, + displayThreadSummaries = state.displayThreadSummaries, onEventClick = onEventClick, onUserDataClick = onUserDataClick, onLinkClick = onLinkClick, @@ -163,6 +165,7 @@ private fun PinnedMessagesListEmpty( @Composable private fun PinnedMessagesListLoaded( state: PinnedMessagesListState.Filled, + displayThreadSummaries: Boolean, onEventClick: (event: TimelineItem.Event) -> Unit, onUserDataClick: (MatrixUser) -> Unit, onLinkClick: (Link) -> Unit, @@ -210,6 +213,7 @@ private fun PinnedMessagesListLoaded( ) { timelineItem -> TimelineItemRow( timelineItem = timelineItem, + timelineMode = Timeline.Mode.PinnedEvents, timelineRoomInfo = state.timelineRoomInfo, renderReadReceipts = false, timelineProtectionState = state.timelineProtectionState, @@ -222,6 +226,7 @@ private fun PinnedMessagesListLoaded( onLinkLongClick = onLinkLongClick, onContentClick = onEventClick, onLongClick = ::onMessageLongClick, + displayThreadSummaries = displayThreadSummaries, inReplyToClick = {}, onReactionClick = { _, _ -> }, onReactionLongClick = { _, _ -> }, diff --git a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/threads/ThreadedMessagesNode.kt b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/threads/ThreadedMessagesNode.kt new file mode 100644 index 0000000000..cde141dcd6 --- /dev/null +++ b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/threads/ThreadedMessagesNode.kt @@ -0,0 +1,302 @@ +/* + * Copyright 2023, 2024 New Vector Ltd. + * + * SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial + * Please see LICENSE files in the repository root for full details. + */ + +package io.element.android.features.messages.impl.threads + +import android.app.Activity +import android.content.Context +import androidx.activity.compose.LocalActivity +import androidx.compose.runtime.Composable +import androidx.compose.runtime.CompositionLocalProvider +import androidx.compose.runtime.LaunchedEffect +import androidx.compose.runtime.getValue +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.saveable.rememberSaveable +import androidx.compose.runtime.setValue +import androidx.compose.ui.Modifier +import androidx.lifecycle.Lifecycle +import com.bumble.appyx.core.lifecycle.subscribe +import com.bumble.appyx.core.modality.BuildContext +import com.bumble.appyx.core.node.Node +import com.bumble.appyx.core.plugin.Plugin +import com.bumble.appyx.core.plugin.plugins +import dagger.assisted.Assisted +import dagger.assisted.AssistedInject +import io.element.android.anvilannotations.ContributesNode +import io.element.android.compound.theme.ElementTheme +import io.element.android.features.messages.impl.MessagesNavigator +import io.element.android.features.messages.impl.MessagesPresenter +import io.element.android.features.messages.impl.MessagesView +import io.element.android.features.messages.impl.actionlist.ActionListPresenter +import io.element.android.features.messages.impl.actionlist.model.TimelineItemActionPostProcessor +import io.element.android.features.messages.impl.attachments.Attachment +import io.element.android.features.messages.impl.messagecomposer.MessageComposerEvents +import io.element.android.features.messages.impl.messagecomposer.MessageComposerPresenter +import io.element.android.features.messages.impl.timeline.TimelineController +import io.element.android.features.messages.impl.timeline.TimelineEvents +import io.element.android.features.messages.impl.timeline.TimelinePresenter +import io.element.android.features.messages.impl.timeline.di.LocalTimelineItemPresenterFactories +import io.element.android.features.messages.impl.timeline.di.TimelineItemPresenterFactories +import io.element.android.features.messages.impl.timeline.model.TimelineItem +import io.element.android.libraries.androidutils.browser.openUrlInChromeCustomTab +import io.element.android.libraries.androidutils.system.openUrlInExternalApp +import io.element.android.libraries.androidutils.system.toast +import io.element.android.libraries.architecture.NodeInputs +import io.element.android.libraries.architecture.inputs +import io.element.android.libraries.core.bool.orFalse +import io.element.android.libraries.designsystem.utils.OnLifecycleEvent +import io.element.android.libraries.di.ApplicationContext +import io.element.android.libraries.di.RoomScope +import io.element.android.libraries.di.annotations.SessionCoroutineScope +import io.element.android.libraries.matrix.api.analytics.toAnalyticsViewRoom +import io.element.android.libraries.matrix.api.core.EventId +import io.element.android.libraries.matrix.api.core.RoomId +import io.element.android.libraries.matrix.api.core.ThreadId +import io.element.android.libraries.matrix.api.core.UserId +import io.element.android.libraries.matrix.api.permalink.PermalinkData +import io.element.android.libraries.matrix.api.permalink.PermalinkParser +import io.element.android.libraries.matrix.api.room.CreateTimelineParams +import io.element.android.libraries.matrix.api.room.JoinedRoom +import io.element.android.libraries.matrix.api.room.alias.matches +import io.element.android.libraries.matrix.api.timeline.Timeline +import io.element.android.libraries.matrix.api.timeline.item.TimelineItemDebugInfo +import io.element.android.libraries.mediaplayer.api.MediaPlayer +import io.element.android.libraries.ui.strings.CommonStrings +import io.element.android.services.analytics.api.AnalyticsService +import kotlinx.collections.immutable.ImmutableList +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.launch +import kotlinx.coroutines.runBlocking + +@ContributesNode(RoomScope::class) +class ThreadedMessagesNode @AssistedInject constructor( + @Assisted buildContext: BuildContext, + @Assisted plugins: List, + @ApplicationContext private val context: Context, + @SessionCoroutineScope private val sessionCoroutineScope: CoroutineScope, + private val room: JoinedRoom, + private val analyticsService: AnalyticsService, + messageComposerPresenterFactory: MessageComposerPresenter.Factory, + timelinePresenterFactory: TimelinePresenter.Factory, + presenterFactory: MessagesPresenter.Factory, + actionListPresenterFactory: ActionListPresenter.Factory, + private val timelineItemPresenterFactories: TimelineItemPresenterFactories, + private val mediaPlayer: MediaPlayer, + private val permalinkParser: PermalinkParser, +) : Node(buildContext, plugins = plugins), MessagesNavigator { + private val callbacks = plugins() + + data class Inputs( + val threadRootEventId: ThreadId, + val focusedEventId: EventId?, + ) : NodeInputs + + private val inputs = inputs() + + // TODO use a loading state node to preload this instead of using `runBlocking` + private val threadedTimeline = runBlocking { room.createTimeline(CreateTimelineParams.Threaded(threadRootEventId = inputs.threadRootEventId)).getOrThrow() } + private val timelineController = TimelineController(room, threadedTimeline) + private val presenter = presenterFactory.create( + navigator = this, + composerPresenter = messageComposerPresenterFactory.create(timelineController, this), + timelinePresenter = timelinePresenterFactory.create(timelineController = timelineController, this), + // TODO add special processor for threaded timeline + actionListPresenter = actionListPresenterFactory.create( + postProcessor = TimelineItemActionPostProcessor.Default, + timelineMode = timelineController.mainTimelineMode(), + ), + timelineController = timelineController, + ) + + interface Callback : Plugin { + fun onEventClick(timelineMode: Timeline.Mode, event: TimelineItem.Event): Boolean + fun onPreviewAttachments(attachments: ImmutableList) + fun onUserDataClick(userId: UserId) + fun onPermalinkClick(data: PermalinkData) + fun onShowEventDebugInfoClick(eventId: EventId?, debugInfo: TimelineItemDebugInfo) + fun onForwardEventClick(eventId: EventId) + fun onReportMessage(eventId: EventId, senderId: UserId) + fun onSendLocationClick() + fun onCreatePollClick() + fun onEditPollClick(eventId: EventId) + fun onJoinCallClick(roomId: RoomId) + } + + override fun onBuilt() { + super.onBuilt() + lifecycle.subscribe( + onCreate = { + sessionCoroutineScope.launch { analyticsService.capture(room.toAnalyticsViewRoom()) } + }, + onDestroy = { + mediaPlayer.close() + } + ) + } + + private fun onEventClick(timelineMode: Timeline.Mode, event: TimelineItem.Event): Boolean { + // Note: cannot use `callbacks.all { it.onEventClick(event) }` because: + // - if callbacks is empty, it will return true and we want to return false. + // - if a callback returns false, the other callback will not be invoked. + return callbacks.takeIf { it.isNotEmpty() } + ?.map { it.onEventClick(timelineMode, event) } + ?.all { it } + .orFalse() + } + + private fun onUserDataClick(userId: UserId) { + callbacks.forEach { it.onUserDataClick(userId) } + } + + private fun onLinkClick( + activity: Activity, + darkTheme: Boolean, + url: String, + eventSink: (TimelineEvents) -> Unit, + customTab: Boolean + ) { + when (val permalink = permalinkParser.parse(url)) { + is PermalinkData.UserLink -> { + // Open the room member profile, it will fallback to + // the user profile if the user is not in the room + callbacks.forEach { it.onUserDataClick(permalink.userId) } + } + is PermalinkData.RoomLink -> { + handleRoomLinkClick(permalink, eventSink) + } + is PermalinkData.FallbackLink -> { + if (customTab) { + activity.openUrlInChromeCustomTab(null, darkTheme, url) + } else { + activity.openUrlInExternalApp(url) + } + } + is PermalinkData.RoomEmailInviteLink -> { + activity.openUrlInChromeCustomTab(null, darkTheme, url) + } + } + } + + private fun handleRoomLinkClick( + roomLink: PermalinkData.RoomLink, + eventSink: (TimelineEvents) -> Unit, + ) { + if (room.matches(roomLink.roomIdOrAlias)) { + val eventId = roomLink.eventId + if (eventId != null) { + eventSink(TimelineEvents.FocusOnEvent(eventId)) + } else { + // Click on the same room, ignore + displaySameRoomToast() + } + } else { + callbacks.forEach { it.onPermalinkClick(roomLink) } + } + } + + override fun onShowEventDebugInfoClick(eventId: EventId?, debugInfo: TimelineItemDebugInfo) { + callbacks.forEach { it.onShowEventDebugInfoClick(eventId, debugInfo) } + } + + override fun onForwardEventClick(eventId: EventId) { + callbacks.forEach { it.onForwardEventClick(eventId) } + } + + override fun onReportContentClick(eventId: EventId, senderId: UserId) { + callbacks.forEach { it.onReportMessage(eventId, senderId) } + } + + override fun onEditPollClick(eventId: EventId) { + callbacks.forEach { it.onEditPollClick(eventId) } + } + + override fun onPreviewAttachment(attachments: ImmutableList) { + callbacks.forEach { it.onPreviewAttachments(attachments) } + } + + override fun onNavigateToRoom(roomId: RoomId, serverNames: List) = Unit + + private fun onSendLocationClick() { + callbacks.forEach { it.onSendLocationClick() } + } + + private fun onCreatePollClick() { + callbacks.forEach { it.onCreatePollClick() } + } + + private fun onJoinCallClick() { + callbacks.forEach { it.onJoinCallClick(room.roomId) } + } + + private fun displaySameRoomToast() { + context.toast(CommonStrings.screen_room_permalink_same_room_android) + } + + override fun onOpenThread(threadRootId: ThreadId, focusedEventId: EventId?) { + } + + @Composable + override fun View(modifier: Modifier) { + val activity = requireNotNull(LocalActivity.current) + val isDark = ElementTheme.isLightTheme.not() + CompositionLocalProvider( + LocalTimelineItemPresenterFactories provides timelineItemPresenterFactories, + ) { + val state = presenter.present() + OnLifecycleEvent { _, event -> + when (event) { + Lifecycle.Event.ON_PAUSE -> state.composerState.eventSink(MessageComposerEvents.SaveDraft) + else -> Unit + } + } + MessagesView( + state = state, + onBackClick = this::navigateUp, + onRoomDetailsClick = {}, + onEventContentClick = { isLive, event -> + if (isLive) { + onEventClick(timelineController.mainTimelineMode(), event) + } else { + val detachedTimelineMode = timelineController.detachedTimelineMode() + if (detachedTimelineMode != null) { + onEventClick(detachedTimelineMode, event) + } else { + false + } + } + }, + onUserDataClick = this::onUserDataClick, + onLinkClick = { url, customTab -> + onLinkClick( + activity, + isDark, + url, + state.timelineState.eventSink, + customTab + ) + }, + onSendLocationClick = this::onSendLocationClick, + onCreatePollClick = this::onCreatePollClick, + onJoinCallClick = this::onJoinCallClick, + onViewAllPinnedMessagesClick = {}, + modifier = modifier, + knockRequestsBannerView = {}, + ) + + var focusedEventId by rememberSaveable { + mutableStateOf(inputs.focusedEventId) + } + LaunchedEffect(Unit) { + focusedEventId?.also { eventId -> + state.timelineState.eventSink(TimelineEvents.FocusOnEvent(eventId)) + } + // Reset the focused event id to null to avoid refocusing when restoring node. + focusedEventId = null + } + } + } +} diff --git a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/TimelineController.kt b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/TimelineController.kt index 4800d64c9b..6289feecfd 100644 --- a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/TimelineController.kt +++ b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/TimelineController.kt @@ -8,6 +8,7 @@ package io.element.android.features.messages.impl.timeline import com.squareup.anvil.annotations.ContributesBinding +import io.element.android.features.messages.impl.timeline.di.LiveTimeline import io.element.android.libraries.di.RoomScope import io.element.android.libraries.di.SingleIn import io.element.android.libraries.matrix.api.core.EventId @@ -43,11 +44,12 @@ import javax.inject.Inject @ContributesBinding(RoomScope::class, boundType = TimelineProvider::class) class TimelineController @Inject constructor( private val room: JoinedRoom, + @LiveTimeline private val liveTimeline: Timeline, ) : Closeable, TimelineProvider { private val coroutineScope = CoroutineScope(SupervisorJob()) - private val liveTimeline = flowOf(room.liveTimeline) - private val detachedTimeline = MutableStateFlow>(Optional.empty()) + private val liveTimelineFlow = flowOf(liveTimeline) + private val detachedTimelineFlow = MutableStateFlow>(Optional.empty()) @OptIn(ExperimentalCoroutinesApi::class) fun timelineItems(): Flow> { @@ -55,7 +57,13 @@ class TimelineController @Inject constructor( } fun isLive(): Flow { - return detachedTimeline.map { !it.isPresent } + return detachedTimelineFlow.map { !it.isPresent } + } + + fun mainTimelineMode(): Timeline.Mode = liveTimeline.mode + + fun detachedTimelineMode(): Timeline.Mode? { + return detachedTimelineFlow.value.orElse(null)?.mode } suspend fun invokeOnCurrentTimeline(block: suspend (Timeline.() -> Unit)) { @@ -72,7 +80,7 @@ class TimelineController @Inject constructor( } } .map { newDetachedTimeline -> - detachedTimeline.getAndUpdate { current -> + detachedTimelineFlow.getAndUpdate { current -> if (current.isPresent) { current.get().close() } @@ -90,7 +98,7 @@ class TimelineController @Inject constructor( } private fun closeDetachedTimeline() { - detachedTimeline.getAndUpdate { + detachedTimelineFlow.getAndUpdate { when { it.isPresent -> { it.get().close() @@ -115,7 +123,7 @@ class TimelineController @Inject constructor( } } - private val currentTimelineFlow = combine(liveTimeline, detachedTimeline) { live, detached -> + private val currentTimelineFlow = combine(liveTimelineFlow, detachedTimelineFlow) { live, detached -> when { detached.isPresent -> detached.get() else -> live diff --git a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/TimelineEvents.kt b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/TimelineEvents.kt index 66d8da771b..0fe4394fa6 100644 --- a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/TimelineEvents.kt +++ b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/TimelineEvents.kt @@ -10,6 +10,7 @@ package io.element.android.features.messages.impl.timeline import io.element.android.features.messages.impl.timeline.model.TimelineItem import io.element.android.libraries.matrix.api.core.EventId import io.element.android.libraries.matrix.api.core.RoomId +import io.element.android.libraries.matrix.api.core.ThreadId import io.element.android.libraries.matrix.api.timeline.Timeline import io.element.android.libraries.matrix.api.timeline.item.event.MessageShield import kotlin.time.Duration @@ -31,6 +32,7 @@ sealed interface TimelineEvents { data class ComputeVerifiedUserSendFailure(val event: TimelineItem.Event) : EventFromTimelineItem data class ShowShieldDialog(val messageShield: MessageShield) : EventFromTimelineItem data class LoadMore(val direction: Timeline.PaginationDirection) : EventFromTimelineItem + data class OpenThread(val threadRootEventId: ThreadId, val focusedEvent: EventId?) : EventFromTimelineItem /** * Navigate to the predecessor or successor room of the current room. 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 86dc1dfb1e..ef740e3a8b 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 @@ -15,6 +15,7 @@ import androidx.compose.runtime.collectAsState import androidx.compose.runtime.derivedStateOf import androidx.compose.runtime.getValue import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.produceState import androidx.compose.runtime.remember import androidx.compose.runtime.rememberCoroutineScope import androidx.compose.runtime.saveable.rememberSaveable @@ -39,6 +40,8 @@ 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.di.annotations.SessionCoroutineScope +import io.element.android.libraries.featureflag.api.FeatureFlagService +import io.element.android.libraries.featureflag.api.FeatureFlags import io.element.android.libraries.matrix.api.core.EventId import io.element.android.libraries.matrix.api.core.UniqueId import io.element.android.libraries.matrix.api.room.JoinedRoom @@ -46,6 +49,7 @@ import io.element.android.libraries.matrix.api.room.MessageEventType import io.element.android.libraries.matrix.api.room.isDm import io.element.android.libraries.matrix.api.room.roomMembers import io.element.android.libraries.matrix.api.timeline.ReceiptType +import io.element.android.libraries.matrix.api.timeline.Timeline import io.element.android.libraries.matrix.api.timeline.item.event.MessageShield import io.element.android.libraries.matrix.api.timeline.item.event.TimelineItemEventOrigin import io.element.android.libraries.matrix.ui.room.canSendMessageAsState @@ -74,16 +78,20 @@ class TimelinePresenter @AssistedInject constructor( private val sendPollResponseAction: SendPollResponseAction, private val endPollAction: EndPollAction, private val sessionPreferencesStore: SessionPreferencesStore, - private val timelineController: TimelineController, + @Assisted private val timelineController: TimelineController, private val timelineItemIndexer: TimelineItemIndexer = TimelineItemIndexer(), private val resolveVerifiedUserSendFailurePresenter: Presenter, private val typingNotificationPresenter: Presenter, private val roomCallStatePresenter: Presenter, private val markAsFullyRead: MarkAsFullyRead, + private val featureFlagService: FeatureFlagService, ) : Presenter { @AssistedFactory interface Factory { - fun create(navigator: MessagesNavigator): TimelinePresenter + fun create( + timelineController: TimelineController, + navigator: MessagesNavigator + ): TimelinePresenter } private val timelineItemsFactory: TimelineItemsFactory = timelineItemsFactoryCreator.create( @@ -97,6 +105,9 @@ class TimelinePresenter @AssistedInject constructor( @Composable override fun present(): TimelineState { val localScope = rememberCoroutineScope() + + val timelineMode = remember { timelineController.mainTimelineMode() } + var focusRequestState: FocusRequestState by remember { mutableStateOf(FocusRequestState.None) } val lastReadReceiptId = rememberSaveable { mutableStateOf(null) } @@ -124,9 +135,17 @@ class TimelinePresenter @AssistedInject constructor( timelineController.isLive() }.collectAsState(initial = true) + val displayThreadSummaries by produceState(false) { + value = featureFlagService.isFeatureEnabled(FeatureFlags.Threads) + } + fun handleEvents(event: TimelineEvents) { when (event) { is TimelineEvents.LoadMore -> { + if (event.direction == Timeline.PaginationDirection.FORWARDS && timelineMode is Timeline.Mode.Thread) { + // Do not paginate forwards in thread mode, as it's not supported + return + } localScope.launch { timelineController.paginate(direction = event.direction) } @@ -148,15 +167,21 @@ class TimelinePresenter @AssistedInject constructor( } } is TimelineEvents.SelectPollAnswer -> sessionCoroutineScope.launch { - sendPollResponseAction.execute( - pollStartId = event.pollStartId, - answerId = event.answerId - ) + timelineController.invokeOnCurrentTimeline { + sendPollResponseAction.execute( + timeline = this, + pollStartId = event.pollStartId, + answerId = event.answerId + ) + } } is TimelineEvents.EndPoll -> sessionCoroutineScope.launch { - endPollAction.execute( - pollStartId = event.pollStartId, - ) + timelineController.invokeOnCurrentTimeline { + endPollAction.execute( + timeline = this, + pollStartId = event.pollStartId, + ) + } } is TimelineEvents.EditPoll -> { navigator.onEditPollClick(event.pollStartId) @@ -183,6 +208,12 @@ class TimelinePresenter @AssistedInject constructor( val serverNames = calculateServerNamesForRoom(room) navigator.onNavigateToRoom(event.roomId, serverNames) } + is TimelineEvents.OpenThread -> { + navigator.onOpenThread( + threadRootId = event.threadRootEventId, + focusedEventId = event.focusedEvent, + ) + } } } @@ -270,6 +301,7 @@ class TimelinePresenter @AssistedInject constructor( } return TimelineState( timelineItems = timelineItems, + timelineMode = timelineMode, timelineRoomInfo = timelineRoomInfo, renderReadReceipts = renderReadReceipts, newEventState = newEventState.value, @@ -277,6 +309,7 @@ class TimelinePresenter @AssistedInject constructor( focusRequestState = focusRequestState, messageShield = messageShield.value, resolveVerifiedUserSendFailureState = resolveVerifiedUserSendFailureState, + displayThreadSummaries = displayThreadSummaries, eventSink = { handleEvents(it) } ) } 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 a3cdb34c94..bd1c58c9d7 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 @@ -16,6 +16,7 @@ import io.element.android.features.roomcall.api.RoomCallState import io.element.android.libraries.matrix.api.core.EventId import io.element.android.libraries.matrix.api.core.UniqueId import io.element.android.libraries.matrix.api.room.tombstone.PredecessorRoom +import io.element.android.libraries.matrix.api.timeline.Timeline import io.element.android.libraries.matrix.api.timeline.item.event.MessageShield import kotlinx.collections.immutable.ImmutableList import kotlin.time.Duration @@ -24,6 +25,7 @@ import kotlin.time.Duration data class TimelineState( val timelineItems: ImmutableList, val timelineRoomInfo: TimelineRoomInfo, + val timelineMode: Timeline.Mode, val renderReadReceipts: Boolean, val newEventState: NewEventState, val isLive: Boolean, @@ -31,6 +33,7 @@ data class TimelineState( // If not null, info will be rendered in a dialog val messageShield: MessageShield?, val resolveVerifiedUserSendFailureState: ResolveVerifiedUserSendFailureState, + val displayThreadSummaries: Boolean, val eventSink: (TimelineEvents) -> Unit, ) { private val lastTimelineEvent = timelineItems.firstOrNull { it is TimelineItem.Event } as? TimelineItem.Event 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 8bb66b4f60..3c03f4a7b0 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 @@ -31,6 +31,8 @@ import io.element.android.libraries.matrix.api.core.TransactionId import io.element.android.libraries.matrix.api.core.UniqueId import io.element.android.libraries.matrix.api.core.UserId import io.element.android.libraries.matrix.api.room.tombstone.PredecessorRoom +import io.element.android.libraries.matrix.api.timeline.Timeline +import io.element.android.libraries.matrix.api.timeline.item.EventThreadInfo import io.element.android.libraries.matrix.api.timeline.item.TimelineItemDebugInfo import io.element.android.libraries.matrix.api.timeline.item.event.LocalEventSendState import io.element.android.libraries.matrix.api.timeline.item.event.MessageShield @@ -45,12 +47,14 @@ import kotlin.random.Random fun aTimelineState( timelineItems: ImmutableList = persistentListOf(), + timelineMode: Timeline.Mode = Timeline.Mode.Live, renderReadReceipts: Boolean = false, timelineRoomInfo: TimelineRoomInfo = aTimelineRoomInfo(), focusedEventIndex: Int = -1, isLive: Boolean = true, messageShield: MessageShield? = null, resolveVerifiedUserSendFailureState: ResolveVerifiedUserSendFailureState = aResolveVerifiedUserSendFailureState(), + displayThreadSummaries: Boolean = false, eventSink: (TimelineEvents) -> Unit = {}, ): TimelineState { val focusedEventId = timelineItems.filterIsInstance().getOrNull(focusedEventIndex)?.eventId @@ -61,6 +65,7 @@ fun aTimelineState( } return TimelineState( timelineItems = timelineItems, + timelineMode = timelineMode, timelineRoomInfo = timelineRoomInfo, renderReadReceipts = renderReadReceipts, newEventState = NewEventState.None, @@ -68,6 +73,7 @@ fun aTimelineState( focusRequestState = focusRequestState, messageShield = messageShield, resolveVerifiedUserSendFailureState = resolveVerifiedUserSendFailureState, + displayThreadSummaries = displayThreadSummaries, eventSink = eventSink, ) } @@ -140,7 +146,7 @@ internal fun aTimelineItemEvent( groupPosition: TimelineItemGroupPosition = TimelineItemGroupPosition.None, sendState: LocalEventSendState? = null, inReplyTo: InReplyToDetails? = null, - isThreaded: Boolean = false, + threadInfo: EventThreadInfo = EventThreadInfo(threadRootId = null, threadSummary = null), debugInfo: TimelineItemDebugInfo = aTimelineItemDebugInfo(), timelineItemReactions: TimelineItemReactions = aTimelineItemReactions(), readReceiptState: TimelineItemReadReceipts = aTimelineItemReadReceipts(), @@ -166,7 +172,7 @@ internal fun aTimelineItemEvent( groupPosition = groupPosition, localSendState = sendState, inReplyTo = inReplyTo, - isThreaded = isThreaded, + threadInfo = threadInfo, origin = null, timelineItemDebugInfoProvider = { debugInfo }, messageShieldProvider = { messageShield }, 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 68bbc9c8b9..0d729020dd 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 @@ -163,11 +163,13 @@ fun TimelineView( ) { timelineItem -> TimelineItemRow( timelineItem = timelineItem, + timelineMode = state.timelineMode, timelineRoomInfo = state.timelineRoomInfo, timelineProtectionState = timelineProtectionState, renderReadReceipts = state.renderReadReceipts, isLastOutgoingMessage = state.isLastOutgoingMessage(timelineItem.identifier()), focusedEventId = state.focusedEventId, + displayThreadSummaries = state.displayThreadSummaries, onUserDataClick = onUserDataClick, onLinkClick = onLinkClick, onLinkLongClick = ::onLinkLongClick, diff --git a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/components/ATimelineItemEventRow.kt b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/components/ATimelineItemEventRow.kt index 8434242abd..0ac882a95f 100644 --- a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/components/ATimelineItemEventRow.kt +++ b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/components/ATimelineItemEventRow.kt @@ -13,21 +13,26 @@ import io.element.android.features.messages.impl.timeline.aTimelineRoomInfo import io.element.android.features.messages.impl.timeline.model.TimelineItem import io.element.android.features.messages.impl.timeline.protection.TimelineProtectionState import io.element.android.features.messages.impl.timeline.protection.aTimelineProtectionState +import io.element.android.libraries.matrix.api.timeline.Timeline // For previews @Composable internal fun ATimelineItemEventRow( event: TimelineItem.Event, + timelineMode: Timeline.Mode = Timeline.Mode.Live, timelineRoomInfo: TimelineRoomInfo = aTimelineRoomInfo(), renderReadReceipts: Boolean = false, isLastOutgoingMessage: Boolean = false, timelineProtectionState: TimelineProtectionState = aTimelineProtectionState(), + displayThreadSummaries: Boolean = false, ) = TimelineItemEventRow( event = event, + timelineMode = timelineMode, timelineRoomInfo = timelineRoomInfo, renderReadReceipts = renderReadReceipts, timelineProtectionState = timelineProtectionState, isLastOutgoingMessage = isLastOutgoingMessage, + displayThreadSummaries = displayThreadSummaries, onEventClick = {}, onLongClick = {}, onLinkClick = {}, diff --git a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/components/TimelineItemEventForTimestampViewProvider.kt b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/components/TimelineItemEventForTimestampViewProvider.kt index 568df86295..96d139bfba 100644 --- a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/components/TimelineItemEventForTimestampViewProvider.kt +++ b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/components/TimelineItemEventForTimestampViewProvider.kt @@ -19,7 +19,7 @@ class TimelineItemEventForTimestampViewProvider : PreviewParameterProvider get() = sequenceOf( aTimelineItemEvent(), - aTimelineItemEvent().copy(localSendState = LocalEventSendState.Sending), + aTimelineItemEvent().copy(localSendState = LocalEventSendState.Sending.Event), aTimelineItemEvent().copy(localSendState = LocalEventSendState.Failed.Unknown("AN_ERROR")), // Edited aTimelineItemEvent().copy(content = aTimelineItemTextContent().copy(isEdited = true)), diff --git a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/components/TimelineItemEventRow.kt b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/components/TimelineItemEventRow.kt index 1b798de14f..de4cfe2c2a 100644 --- a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/components/TimelineItemEventRow.kt +++ b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/components/TimelineItemEventRow.kt @@ -36,6 +36,7 @@ import androidx.compose.ui.Modifier import androidx.compose.ui.draw.clip import androidx.compose.ui.platform.LocalViewConfiguration import androidx.compose.ui.platform.ViewConfiguration +import androidx.compose.ui.res.pluralStringResource import androidx.compose.ui.res.stringResource import androidx.compose.ui.semantics.clearAndSetSemantics import androidx.compose.ui.semantics.hideFromAccessibility @@ -72,6 +73,7 @@ import io.element.android.features.messages.impl.timeline.model.event.aTimelineI import io.element.android.features.messages.impl.timeline.protection.TimelineProtectionEvent import io.element.android.features.messages.impl.timeline.protection.TimelineProtectionState import io.element.android.features.messages.impl.timeline.protection.mustBeProtected +import io.element.android.libraries.architecture.AsyncData import io.element.android.libraries.designsystem.colors.AvatarColorsProvider import io.element.android.libraries.designsystem.components.EqualWidthColumn import io.element.android.libraries.designsystem.components.avatar.Avatar @@ -82,10 +84,17 @@ import io.element.android.libraries.designsystem.preview.PreviewsDayNight import io.element.android.libraries.designsystem.swipe.SwipeableActionsState import io.element.android.libraries.designsystem.swipe.rememberSwipeableActionsState import io.element.android.libraries.designsystem.text.toPx +import io.element.android.libraries.designsystem.theme.components.Button +import io.element.android.libraries.designsystem.theme.components.ButtonSize import io.element.android.libraries.designsystem.theme.components.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.ThreadId import io.element.android.libraries.matrix.api.core.UserId +import io.element.android.libraries.matrix.api.core.toThreadId +import io.element.android.libraries.matrix.api.timeline.Timeline +import io.element.android.libraries.matrix.api.timeline.item.EventThreadInfo +import io.element.android.libraries.matrix.api.timeline.item.ThreadSummary import io.element.android.libraries.matrix.api.timeline.item.event.ProfileTimelineDetails import io.element.android.libraries.matrix.api.timeline.item.event.getAvatarUrl import io.element.android.libraries.matrix.api.timeline.item.event.getDisplayName @@ -97,6 +106,7 @@ import io.element.android.libraries.matrix.ui.messages.sender.SenderName import io.element.android.libraries.matrix.ui.messages.sender.SenderNameMode import io.element.android.libraries.testtags.TestTags import io.element.android.libraries.testtags.testTag +import io.element.android.libraries.ui.strings.CommonPlurals import io.element.android.libraries.ui.strings.CommonStrings import io.element.android.libraries.ui.utils.time.isTalkbackActive import io.element.android.wysiwyg.link.Link @@ -116,10 +126,12 @@ private val BUBBLE_INCOMING_OFFSET = 16.dp @Composable fun TimelineItemEventRow( event: TimelineItem.Event, + timelineMode: Timeline.Mode, timelineRoomInfo: TimelineRoomInfo, timelineProtectionState: TimelineProtectionState, renderReadReceipts: Boolean, isLastOutgoingMessage: Boolean, + displayThreadSummaries: Boolean, onEventClick: () -> Unit, onLongClick: () -> Unit, onLinkClick: (Link) -> Unit, @@ -194,6 +206,7 @@ fun TimelineItemEventRow( } TimelineItemEventRowContent( event = event, + timelineMode = timelineMode, timelineProtectionState = timelineProtectionState, timelineRoomInfo = timelineRoomInfo, interactionSource = interactionSource, @@ -227,6 +240,7 @@ fun TimelineItemEventRow( } else { TimelineItemEventRowContent( event = event, + timelineMode = timelineMode, timelineProtectionState = timelineProtectionState, timelineRoomInfo = timelineRoomInfo, interactionSource = interactionSource, @@ -241,6 +255,25 @@ fun TimelineItemEventRow( eventContentView = eventContentView, ) } + + if (displayThreadSummaries && timelineMode !is Timeline.Mode.Thread) { + event.threadInfo.threadSummary?.let { threadSummary -> + val threadPart = stringResource(CommonStrings.common_thread) + val numberOfReplies = threadSummary.numberOfReplies.toInt().let { replies -> + pluralStringResource(CommonPlurals.common_replies, replies, replies) + } + Button( + modifier = Modifier.padding(horizontal = 24.dp, vertical = 2.dp) + .align(if (event.isMine) Alignment.End else Alignment.Start), + text = "$threadPart - $numberOfReplies", + size = ButtonSize.Small, + onClick = { + eventSink(TimelineEvents.OpenThread(event.eventId!!.toThreadId(), null)) + }, + ) + } + } + // Read receipts / Send state TimelineItemReadReceiptView( state = ReadReceiptViewState( @@ -281,6 +314,7 @@ private fun SwipeSensitivity( @Composable private fun TimelineItemEventRowContent( event: TimelineItem.Event, + timelineMode: Timeline.Mode, timelineProtectionState: TimelineProtectionState, timelineRoomInfo: TimelineRoomInfo, interactionSource: MutableInteractionSource, @@ -360,6 +394,7 @@ private fun TimelineItemEventRowContent( ) { MessageEventBubbleContent( event = event, + timelineMode = timelineMode, timelineProtectionState = timelineProtectionState, onMessageLongClick = onLongClick, inReplyToClick = inReplyToClick, @@ -461,6 +496,7 @@ private fun MessageSenderInformation( @Composable private fun MessageEventBubbleContent( event: TimelineItem.Event, + timelineMode: Timeline.Mode, timelineProtectionState: TimelineProtectionState, onMessageLongClick: () -> Unit, inReplyToClick: () -> Unit, @@ -658,7 +694,7 @@ private fun MessageEventBubbleContent( else -> ContentPadding.Textual } CommonLayout( - showThreadDecoration = event.isThreaded, + showThreadDecoration = timelineMode !is Timeline.Mode.Thread && event.threadInfo.threadRootId != null, timestampPosition = timestampPosition, paddingBehaviour = paddingBehaviour, inReplyToDetails = event.inReplyTo, @@ -695,3 +731,28 @@ internal fun TimelineItemEventRowPreview() = ElementPreview { } } } + +@PreviewsDayNight +@Composable +internal fun TimelineItemEventRowWithThreadSummaryPreview() = ElementPreview { + Column { + sequenceOf(false, true).forEach { isMine -> + ATimelineItemEventRow( + event = aTimelineItemEvent( + senderDisplayName = "Sender with a super long name that should ellipsize", + isMine = isMine, + content = aTimelineItemTextContent( + body = "A long text which will be displayed on several lines and" + + " hopefully can be manually adjusted to test different behaviors." + ), + groupPosition = TimelineItemGroupPosition.First, + threadInfo = EventThreadInfo( + threadRootId = ThreadId("\$thread-root-id"), + threadSummary = ThreadSummary(AsyncData.Uninitialized, numberOfReplies = 20L) + ) + ), + displayThreadSummaries = true, + ) + } + } +} diff --git a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/components/TimelineItemEventRowWithReplyPreview.kt b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/components/TimelineItemEventRowWithReplyPreview.kt index 3de3e2456b..61e86a8d59 100644 --- a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/components/TimelineItemEventRowWithReplyPreview.kt +++ b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/components/TimelineItemEventRowWithReplyPreview.kt @@ -17,6 +17,8 @@ import io.element.android.features.messages.impl.timeline.model.event.aTimelineI import io.element.android.features.messages.impl.timeline.model.event.aTimelineItemTextContent import io.element.android.libraries.designsystem.preview.ElementPreview import io.element.android.libraries.designsystem.preview.PreviewsDayNight +import io.element.android.libraries.matrix.api.core.ThreadId +import io.element.android.libraries.matrix.api.timeline.item.EventThreadInfo import io.element.android.libraries.matrix.ui.messages.reply.InReplyToDetails import io.element.android.libraries.matrix.ui.messages.reply.InReplyToDetailsProvider @@ -56,7 +58,10 @@ internal fun TimelineItemEventRowWithReplyContentToPreview( ), inReplyTo = inReplyToDetails, displayNameAmbiguous = displayNameAmbiguous, - isThreaded = true, + threadInfo = EventThreadInfo( + threadRootId = ThreadId("\$thread-root-id"), + threadSummary = null, + ), groupPosition = TimelineItemGroupPosition.Last, ), ) 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 a32f36ced6..0ce8e02ecc 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 @@ -31,6 +31,7 @@ import io.element.android.features.messages.impl.timeline.protection.aTimelinePr import io.element.android.libraries.designsystem.preview.ElementPreview import io.element.android.libraries.designsystem.preview.PreviewsDayNight import io.element.android.libraries.matrix.api.core.EventId +import io.element.android.libraries.matrix.api.timeline.Timeline import io.element.android.libraries.matrix.api.user.MatrixUser import io.element.android.libraries.ui.utils.time.isTalkbackActive import io.element.android.wysiwyg.link.Link @@ -38,11 +39,13 @@ import io.element.android.wysiwyg.link.Link @Composable fun TimelineItemGroupedEventsRow( timelineItem: TimelineItem.GroupedEvents, + timelineMode: Timeline.Mode, timelineRoomInfo: TimelineRoomInfo, timelineProtectionState: TimelineProtectionState, renderReadReceipts: Boolean, isLastOutgoingMessage: Boolean, focusedEventId: EventId?, + displayThreadSummaries: Boolean, onClick: (TimelineItem.Event) -> Unit, onLongClick: (TimelineItem.Event) -> Unit, inReplyToClick: (EventId) -> Unit, @@ -81,11 +84,13 @@ fun TimelineItemGroupedEventsRow( isExpanded = isExpanded.value, onExpandGroupClick = ::onExpandGroupClick, timelineItem = timelineItem, + timelineMode = timelineMode, timelineRoomInfo = timelineRoomInfo, timelineProtectionState = timelineProtectionState, focusedEventId = focusedEventId, renderReadReceipts = renderReadReceipts, isLastOutgoingMessage = isLastOutgoingMessage, + displayThreadSummaries = displayThreadSummaries, onClick = onClick, onLongClick = onLongClick, inReplyToClick = inReplyToClick, @@ -107,11 +112,13 @@ private fun TimelineItemGroupedEventsRowContent( isExpanded: Boolean, onExpandGroupClick: () -> Unit, timelineItem: TimelineItem.GroupedEvents, + timelineMode: Timeline.Mode, timelineRoomInfo: TimelineRoomInfo, timelineProtectionState: TimelineProtectionState, focusedEventId: EventId?, renderReadReceipts: Boolean, isLastOutgoingMessage: Boolean, + displayThreadSummaries: Boolean, onClick: (TimelineItem.Event) -> Unit, onLongClick: (TimelineItem.Event) -> Unit, inReplyToClick: (EventId) -> Unit, @@ -161,12 +168,14 @@ private fun TimelineItemGroupedEventsRowContent( } }.forEach { subGroupEvent -> TimelineItemRow( + timelineMode = timelineMode, timelineItem = subGroupEvent, timelineRoomInfo = timelineRoomInfo, timelineProtectionState = timelineProtectionState, renderReadReceipts = renderReadReceipts, isLastOutgoingMessage = isLastOutgoingMessage, focusedEventId = focusedEventId, + displayThreadSummaries = displayThreadSummaries, onUserDataClick = onUserDataClick, onLinkClick = onLinkClick, onLinkLongClick = onLinkLongClick, @@ -206,11 +215,13 @@ internal fun TimelineItemGroupedEventsRowContentExpandedPreview() = ElementPrevi isExpanded = true, onExpandGroupClick = {}, timelineItem = events, + timelineMode = Timeline.Mode.Live, timelineRoomInfo = aTimelineRoomInfo(), timelineProtectionState = aTimelineProtectionState(), focusedEventId = events.events.first().eventId, renderReadReceipts = true, isLastOutgoingMessage = false, + displayThreadSummaries = false, onClick = {}, onLongClick = {}, onLinkLongClick = {}, @@ -232,11 +243,13 @@ internal fun TimelineItemGroupedEventsRowContentCollapsePreview() = ElementPrevi isExpanded = false, onExpandGroupClick = {}, timelineItem = aGroupedEvents(withReadReceipts = true), + timelineMode = Timeline.Mode.Live, timelineRoomInfo = aTimelineRoomInfo(), timelineProtectionState = aTimelineProtectionState(), focusedEventId = null, renderReadReceipts = true, isLastOutgoingMessage = false, + displayThreadSummaries = false, onClick = {}, onLongClick = {}, onLinkLongClick = {}, 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 ff318b3f7e..11d7b91e1e 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 @@ -44,6 +44,7 @@ import io.element.android.libraries.designsystem.preview.PreviewsDayNight import io.element.android.libraries.designsystem.text.toPx import io.element.android.libraries.designsystem.theme.LocalBuildMeta import io.element.android.libraries.matrix.api.core.EventId +import io.element.android.libraries.matrix.api.timeline.Timeline import io.element.android.libraries.matrix.api.user.MatrixUser import io.element.android.libraries.ui.strings.CommonStrings import io.element.android.libraries.ui.utils.time.isTalkbackActive @@ -53,11 +54,13 @@ import kotlin.time.DurationUnit @Composable internal fun TimelineItemRow( timelineItem: TimelineItem, + timelineMode: Timeline.Mode, timelineRoomInfo: TimelineRoomInfo, renderReadReceipts: Boolean, isLastOutgoingMessage: Boolean, timelineProtectionState: TimelineProtectionState, focusedEventId: EventId?, + displayThreadSummaries: Boolean, onUserDataClick: (MatrixUser) -> Unit, onLinkClick: (Link) -> Unit, onLinkLongClick: (Link) -> Unit, @@ -161,10 +164,12 @@ internal fun TimelineItemRow( } ), event = timelineItem, + timelineMode = timelineMode, timelineRoomInfo = timelineRoomInfo, renderReadReceipts = renderReadReceipts, timelineProtectionState = timelineProtectionState, isLastOutgoingMessage = isLastOutgoingMessage, + displayThreadSummaries = displayThreadSummaries, onEventClick = { onContentClick(timelineItem) }, onLongClick = { onLongClick(timelineItem) }, onLinkClick = onLinkClick, @@ -187,11 +192,13 @@ internal fun TimelineItemRow( is TimelineItem.GroupedEvents -> { TimelineItemGroupedEventsRow( timelineItem = timelineItem, + timelineMode = timelineMode, timelineRoomInfo = timelineRoomInfo, timelineProtectionState = timelineProtectionState, renderReadReceipts = renderReadReceipts, isLastOutgoingMessage = isLastOutgoingMessage, focusedEventId = focusedEventId, + displayThreadSummaries = displayThreadSummaries, onClick = onContentClick, onLongClick = onLongClick, inReplyToClick = inReplyToClick, diff --git a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/components/receipt/ReadReceiptViewStateForTimelineItemEventRowProvider.kt b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/components/receipt/ReadReceiptViewStateForTimelineItemEventRowProvider.kt index 22440fd634..d32de08178 100644 --- a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/components/receipt/ReadReceiptViewStateForTimelineItemEventRowProvider.kt +++ b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/components/receipt/ReadReceiptViewStateForTimelineItemEventRowProvider.kt @@ -17,7 +17,7 @@ class ReadReceiptViewStateForTimelineItemEventRowProvider : override val values: Sequence get() = sequenceOf( aReadReceiptViewState( - sendState = LocalEventSendState.Sending, + sendState = LocalEventSendState.Sending.Event, ), aReadReceiptViewState( sendState = LocalEventSendState.Sent(EventId("\$eventId")), diff --git a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/components/receipt/ReadReceiptViewStateProvider.kt b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/components/receipt/ReadReceiptViewStateProvider.kt index 770ffe6721..1295abdacc 100644 --- a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/components/receipt/ReadReceiptViewStateProvider.kt +++ b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/components/receipt/ReadReceiptViewStateProvider.kt @@ -20,7 +20,7 @@ class ReadReceiptViewStateProvider : PreviewParameterProvider get() = sequenceOf( aReadReceiptViewState(), - aReadReceiptViewState(sendState = LocalEventSendState.Sending), + aReadReceiptViewState(sendState = LocalEventSendState.Sending.Event), aReadReceiptViewState(sendState = LocalEventSendState.Sent(EventId("\$eventId"))), aReadReceiptViewState( sendState = LocalEventSendState.Sent(EventId("\$eventId")), diff --git a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/components/receipt/TimelineItemReadReceiptView.kt b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/components/receipt/TimelineItemReadReceiptView.kt index fd6e5cea53..2d783c394c 100644 --- a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/components/receipt/TimelineItemReadReceiptView.kt +++ b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/components/receipt/TimelineItemReadReceiptView.kt @@ -76,7 +76,7 @@ fun TimelineItemReadReceiptView( } } else { when (state.sendState) { - LocalEventSendState.Sending -> { + is LocalEventSendState.Sending -> { ReadReceiptsRow(modifier) { Icon( modifier = Modifier.padding(2.dp), diff --git a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/di/LiveTimeline.kt b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/di/LiveTimeline.kt new file mode 100644 index 0000000000..40624c9911 --- /dev/null +++ b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/di/LiveTimeline.kt @@ -0,0 +1,15 @@ +/* + * Copyright 2025 New Vector Ltd. + * + * SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial + * Please see LICENSE files in the repository root for full details. + */ + +package io.element.android.features.messages.impl.timeline.di + +import javax.inject.Qualifier + +@Retention(AnnotationRetention.RUNTIME) +@MustBeDocumented +@Qualifier +annotation class LiveTimeline diff --git a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/factories/event/TimelineItemEventFactory.kt b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/factories/event/TimelineItemEventFactory.kt index f80c4f85cb..eda3f2a3f6 100644 --- a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/factories/event/TimelineItemEventFactory.kt +++ b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/factories/event/TimelineItemEventFactory.kt @@ -28,6 +28,7 @@ import io.element.android.libraries.matrix.api.MatrixClient import io.element.android.libraries.matrix.api.permalink.PermalinkParser import io.element.android.libraries.matrix.api.room.RoomMember import io.element.android.libraries.matrix.api.timeline.MatrixTimelineItem +import io.element.android.libraries.matrix.api.timeline.item.EventThreadInfo import io.element.android.libraries.matrix.api.timeline.item.event.getAvatarUrl import io.element.android.libraries.matrix.api.timeline.item.event.getDisambiguatedDisplayName import io.element.android.libraries.matrix.ui.messages.reply.map @@ -67,7 +68,6 @@ class TimelineItemEventFactory @AssistedInject constructor( url = senderProfile.getAvatarUrl(), size = AvatarSize.TimelineSender ) - currentTimelineItem.event return TimelineItem.Event( id = currentTimelineItem.uniqueId, eventId = currentTimelineItem.eventId, @@ -86,7 +86,7 @@ class TimelineItemEventFactory @AssistedInject constructor( readReceiptState = currentTimelineItem.computeReadReceiptState(roomMembers), localSendState = currentTimelineItem.event.localSendState, inReplyTo = currentTimelineItem.event.inReplyTo()?.map(permalinkParser = permalinkParser), - isThreaded = currentTimelineItem.event.isThreaded(), + threadInfo = currentTimelineItem.event.threadInfo() ?: EventThreadInfo(threadRootId = null, threadSummary = null), origin = currentTimelineItem.event.origin, timelineItemDebugInfoProvider = currentTimelineItem.event.timelineItemDebugInfoProvider, messageShieldProvider = currentTimelineItem.event.messageShieldProvider, diff --git a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/model/TimelineItem.kt b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/model/TimelineItem.kt index d753acae0d..94e04dd1d8 100644 --- a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/model/TimelineItem.kt +++ b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/model/TimelineItem.kt @@ -20,6 +20,7 @@ import io.element.android.libraries.matrix.api.core.SendHandle import io.element.android.libraries.matrix.api.core.TransactionId import io.element.android.libraries.matrix.api.core.UniqueId import io.element.android.libraries.matrix.api.core.UserId +import io.element.android.libraries.matrix.api.timeline.item.EventThreadInfo import io.element.android.libraries.matrix.api.timeline.item.TimelineItemDebugInfo import io.element.android.libraries.matrix.api.timeline.item.event.EventOrTransactionId import io.element.android.libraries.matrix.api.timeline.item.event.LocalEventSendState @@ -81,7 +82,7 @@ sealed interface TimelineItem { val readReceiptState: TimelineItemReadReceipts, val localSendState: LocalEventSendState?, val inReplyTo: InReplyToDetails?, - val isThreaded: Boolean, + val threadInfo: EventThreadInfo, val origin: TimelineItemEventOrigin?, val timelineItemDebugInfoProvider: TimelineItemDebugInfoProvider, val messageShieldProvider: MessageShieldProvider, diff --git a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/voicemessages/composer/VoiceMessageComposerPresenter.kt b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/voicemessages/composer/DefaultVoiceMessageComposerPresenter.kt similarity index 90% rename from features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/voicemessages/composer/VoiceMessageComposerPresenter.kt rename to features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/voicemessages/composer/DefaultVoiceMessageComposerPresenter.kt index 9b723ff72a..b8ecab747a 100644 --- a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/voicemessages/composer/VoiceMessageComposerPresenter.kt +++ b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/voicemessages/composer/DefaultVoiceMessageComposerPresenter.kt @@ -19,10 +19,18 @@ import androidx.compose.runtime.rememberCoroutineScope import androidx.compose.runtime.setValue import androidx.core.net.toUri import androidx.lifecycle.Lifecycle +import com.squareup.anvil.annotations.ContributesBinding +import dagger.assisted.Assisted +import dagger.assisted.AssistedFactory +import dagger.assisted.AssistedInject import im.vector.app.features.analytics.plan.Composer import io.element.android.features.messages.api.MessageComposerContext -import io.element.android.libraries.architecture.Presenter +import io.element.android.features.messages.api.timeline.voicemessages.composer.VoiceMessageComposerEvents +import io.element.android.features.messages.api.timeline.voicemessages.composer.VoiceMessageComposerPresenter +import io.element.android.features.messages.api.timeline.voicemessages.composer.VoiceMessageComposerState +import io.element.android.libraries.di.RoomScope import io.element.android.libraries.di.annotations.SessionCoroutineScope +import io.element.android.libraries.matrix.api.timeline.Timeline import io.element.android.libraries.mediaupload.api.MediaSender import io.element.android.libraries.permissions.api.PermissionsEvents import io.element.android.libraries.permissions.api.PermissionsPresenter @@ -40,22 +48,29 @@ import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.launch import timber.log.Timber import java.io.File -import javax.inject.Inject import kotlin.time.Duration import kotlin.time.Duration.Companion.milliseconds -class VoiceMessageComposerPresenter @Inject constructor( - @SessionCoroutineScope - private val sessionCoroutineScope: CoroutineScope, +class DefaultVoiceMessageComposerPresenter @AssistedInject constructor( + @SessionCoroutineScope private val sessionCoroutineScope: CoroutineScope, + @Assisted private val timelineMode: Timeline.Mode, private val voiceRecorder: VoiceRecorder, private val analyticsService: AnalyticsService, - private val mediaSender: MediaSender, + mediaSenderFactory: MediaSender.Factory, private val player: VoiceMessageComposerPlayer, private val messageComposerContext: MessageComposerContext, permissionsPresenterFactory: PermissionsPresenter.Factory -) : Presenter { +) : VoiceMessageComposerPresenter { + @ContributesBinding(RoomScope::class) + @AssistedFactory + interface Factory : VoiceMessageComposerPresenter.Factory { + override fun create(timelineMode: Timeline.Mode): DefaultVoiceMessageComposerPresenter + } + private val permissionsPresenter = permissionsPresenterFactory.create(Manifest.permission.RECORD_AUDIO) + private val mediaSender = mediaSenderFactory.create(timelineMode) + @Composable override fun present(): VoiceMessageComposerState { val localCoroutineScope = rememberCoroutineScope() diff --git a/features/messages/impl/src/main/res/values-da/translations.xml b/features/messages/impl/src/main/res/values-da/translations.xml index bd5fc09b9e..5aba4e77c5 100644 --- a/features/messages/impl/src/main/res/values-da/translations.xml +++ b/features/messages/impl/src/main/res/values-da/translations.xml @@ -9,11 +9,14 @@ "Rejser og steder" "Symboler" "Billedtekster er muligvis ikke synlige for personer, der bruger ældre apps." + "Tryk for at ændre videokvaliteten i uploadet" "Filen kunne ikke uploades." "Det lykkedes ikke at behandle medier til upload. Prøv venligst igen." "Upload af medier mislykkedes. Prøv igen." "Den maksimalt tilladte filstørrelse er %1$s ." "Filen er for stor til at kunne uploades." + "Optimér billedkvaliteten" + "Behandler…" "Bloker bruger" "Marker, hvis du vil skjule alle nuværende og fremtidige beskeder fra denne bruger" "Denne meddelelse vil blive indberettet til administratoren af din hjemmeserver. De vil ikke være i stand til at læse nogen krypterede meddelelser." diff --git a/features/messages/impl/src/main/res/values-en-rUS/translations.xml b/features/messages/impl/src/main/res/values-en-rUS/translations.xml new file mode 100644 index 0000000000..d19cc82f2c --- /dev/null +++ b/features/messages/impl/src/main/res/values-en-rUS/translations.xml @@ -0,0 +1,4 @@ + + + "Optimize image quality" + diff --git a/features/messages/impl/src/main/res/values-et/translations.xml b/features/messages/impl/src/main/res/values-et/translations.xml index f6ed132375..3e07759a68 100644 --- a/features/messages/impl/src/main/res/values-et/translations.xml +++ b/features/messages/impl/src/main/res/values-et/translations.xml @@ -9,11 +9,14 @@ "Reisimine ja kohad" "Sümbolid" "Selgitused ja alapealkirjad ei pruugi olla nähtavad vanemate rakenduste kasutajatele." + "Klõpsa üleslaaditava video kvaliteedi muutmiseks" "Faili üleslaadimine ei õnnestunud." "Meediafaili töötlemine enne üleslaadimist ei õnnestunud. Palun proovi uuesti." "Meediafaili üleslaadimine ei õnnestunud. Palun proovi uuesti." "Maksimaalne lubatud failisuurus on %1$s." "Fail on üleslaadimiseks liiga suur" + "Optimeeri pildikvaliteeti" + "Töötlen…" "Blokeeri kasutaja" "Vali see eelistus, kui sa soovid peita selle kasutaja kõik senised ja tulevased sõnumid" "Teade selle sõnumi kohta edastatakse sinu koduserveri haldajale. Haldajal ei ole võimalik lugeda krüptitud sõnumite sisu." diff --git a/features/messages/impl/src/main/res/values-fa/translations.xml b/features/messages/impl/src/main/res/values-fa/translations.xml index 205907a3b0..1446c3d389 100644 --- a/features/messages/impl/src/main/res/values-fa/translations.xml +++ b/features/messages/impl/src/main/res/values-fa/translations.xml @@ -38,5 +38,9 @@ "نمایش کم‌تر" "نمایش بیش‌تر" "جدید" + + "%1$dتغییر اتاق" + "%1$dتغییر اتاق" + "%1$s و %2$s" diff --git a/features/messages/impl/src/main/res/values-fr/translations.xml b/features/messages/impl/src/main/res/values-fr/translations.xml index c5b80c02f6..76b9ae22ee 100644 --- a/features/messages/impl/src/main/res/values-fr/translations.xml +++ b/features/messages/impl/src/main/res/values-fr/translations.xml @@ -9,11 +9,14 @@ "Voyages & lieux" "Symboles" "Les légendes peuvent ne pas être visibles pour les utilisateurs d’anciennes applications." + "Cliquez pour modifier la qualité d’envoi de la vidéo" "Le fichier n’a pas pu être envoyé." "Échec du traitement des médias à télécharger, veuillez réessayer." "Échec du téléchargement du média, veuillez réessayer." "La taille maximale autorisée pour les fichiers est de %1$s." "Le fichier est trop volumineux pour être envoyé." + "Optimiser la qualité de l’image" + "Traitement en cours…" "Bloquer l’utilisateur" "Cochez si vous souhaitez masquer tous les messages actuels et futurs de cet utilisateur." "Ce message sera signalé à l’administrateur de votre serveur d’accueil. Il ne pourra lire aucun message chiffré." diff --git a/features/messages/impl/src/main/res/values-hu/translations.xml b/features/messages/impl/src/main/res/values-hu/translations.xml index a37858681d..d72afc0078 100644 --- a/features/messages/impl/src/main/res/values-hu/translations.xml +++ b/features/messages/impl/src/main/res/values-hu/translations.xml @@ -9,11 +9,14 @@ "Utazás és helyek" "Szimbólumok" "Előfordulhat, hogy a feliratok nem láthatók a régebbi alkalmazásokat használók számára." + "Koppintson a feltöltött videók minőségének módosításához" "A fájl nem tölthető fel." "Nem sikerült feldolgozni a feltöltendő médiát, próbálja újra." "Nem sikerült a média feltöltése, próbálja újra." "A maximálisan megengedett fájlméret: %1$s ." "A fájl túl nagy a feltöltéshez" + "Képminőség optimalizációja" + "Feldolgozás…" "Felhasználó letiltása" "Jelölje be, ha el akarja rejteni az összes jelenlegi és jövőbeli üzenetet ettől a felhasználótól" "Ez az üzenet jelentve lesz a Matrix-kiszolgáló adminisztrátorának. Nem fogja tudni elolvasni a titkosított üzeneteket." diff --git a/features/messages/impl/src/main/res/values-sk/translations.xml b/features/messages/impl/src/main/res/values-sk/translations.xml index 834ad4111a..6fe6ec73ec 100644 --- a/features/messages/impl/src/main/res/values-sk/translations.xml +++ b/features/messages/impl/src/main/res/values-sk/translations.xml @@ -9,11 +9,14 @@ "Cestovanie a miesta" "Symboly" "Titulky nemusia byť viditeľné pre ľudí používajúcich staršie aplikácie." + "Ťuknutím zmeníte kvalitu nahratého videa" "Súbor sa nepodarilo nahrať." "Nepodarilo sa spracovať médiá na odoslanie, skúste to prosím znova." "Nepodarilo sa nahrať médiá, skúste to prosím znova." "Maximálna povolená veľkosť súboru je %1$s." "Súbor je príliš veľký na nahratie" + "Optimalizovať kvalitu obrázku" + "Prebieha spracovanie…" "Zablokovať používateľa" "Označte, či chcete skryť všetky aktuálne a budúce správy od tohto používateľa" "Táto správa bude nahlásená správcovi vášho domovského servera. Nebude môcť prečítať žiadne šifrované správy." diff --git a/features/messages/impl/src/main/res/values-sv/translations.xml b/features/messages/impl/src/main/res/values-sv/translations.xml index 5ecb88af84..cd5423b64a 100644 --- a/features/messages/impl/src/main/res/values-sv/translations.xml +++ b/features/messages/impl/src/main/res/values-sv/translations.xml @@ -9,8 +9,14 @@ "Resor & platser" "Symboler" "Bildtexter kanske inte är synliga för personer som använder äldre appar." + "Tryck för att ändra videouppladdningskvaliteten" + "Filen kunde inte laddas upp." "Misslyckades att bearbeta media för uppladdning, vänligen pröva igen." "Misslyckades att ladda upp media, vänligen pröva igen." + "Den maximala tillåtna filstorleken är %1$s." + "Filen är för stor för att laddas upp" + "Optimera bildkvalitet" + "Bearbetar …" "Blockera användare" "Markera om du vill dölja alla nuvarande och framtida meddelanden från denna användare" "Det här meddelandet kommer att rapporteras till din hemservers administratör. Denne kommer inte att kunna läsa några krypterade meddelanden." diff --git a/features/messages/impl/src/main/res/values-uk/translations.xml b/features/messages/impl/src/main/res/values-uk/translations.xml index f9a5fc6652..90ef76e0f6 100644 --- a/features/messages/impl/src/main/res/values-uk/translations.xml +++ b/features/messages/impl/src/main/res/values-uk/translations.xml @@ -9,11 +9,14 @@ "Подорожі та місця" "Символи" "Користувачі старих застосунків можуть не бачити підписи." + "Натисніть, щоб змінити якість вивантажуваного відео" "Файл не може бути вивантажено." "Не вдалося обробити медіафайл для завантаження, спробуйте ще раз." "Не вдалося завантажити медіафайл, спробуйте ще раз." "Максимально дозволений розмір файлу — %1$s." "Файл завеликий для вивантаження" + "Оптимізувати якість зображення" + "Обробка…" "Заблокувати користувача" "Перевірте, чи хочете ви приховати всі поточні та майбутні повідомлення від цього користувача" "Це повідомлення буде надіслано адміністраторам вашого домашнього сервера. Вони не зможуть прочитати зашифровані повідомлення." diff --git a/features/messages/impl/src/main/res/values-uz/translations.xml b/features/messages/impl/src/main/res/values-uz/translations.xml index 9c1b9e0df7..5e740ee6c1 100644 --- a/features/messages/impl/src/main/res/values-uz/translations.xml +++ b/features/messages/impl/src/main/res/values-uz/translations.xml @@ -23,6 +23,7 @@ "So\'ro\'vnoma" "Matnni formatlash" "Xabarlar tarixi hozirda mavjud emas." + "Xabar tarixi ushbu xonada mavjud emas. Xabar tarixini koʻrish uchun ushbu qurilmani tasdiqlang." "Ularni yana taklif qilmoqchimisiz?" "Siz bu chatda yolg\'izsiz" "Har kim" diff --git a/features/messages/impl/src/main/res/values-zh-rTW/translations.xml b/features/messages/impl/src/main/res/values-zh-rTW/translations.xml index 5e4caa1cc6..7854d5a0f3 100644 --- a/features/messages/impl/src/main/res/values-zh-rTW/translations.xml +++ b/features/messages/impl/src/main/res/values-zh-rTW/translations.xml @@ -9,8 +9,11 @@ "旅行與景點" "標誌" "使用舊應用程式的使用者可能看不到標題。" + "無法上傳檔案。" "無法處理要上傳的媒體,請再試一次。" "無法上傳媒體檔案,請稍後再試。" + "允許的最大檔案大小為 %1$s。" + "檔案太大,無法上傳" "封鎖使用者" "檢查您是否要隱藏所有來自此使用者的目前及未來的訊息" "此訊息將會回報給您的家伺服器管理員。他們將無法讀取任何已加密的訊息。" @@ -38,12 +41,24 @@ "較少" "訊息已複製" "您沒有權限在此聊天室傳送訊息" + + "%1$d 個成員有 %2$s 個反應" + + + "您與 %1$d 個成員有 %2$s 的反應" + + "您反應了 %1$s" "較少" "更多" + "顯示反應摘要" "新訊息" "%1$d 個聊天室變更" + "跳到新聊天室" + "此聊天室已被取代,不再活躍" + "檢視舊訊息" + "此聊天室為另一個聊天是的延續" "%1$s、%2$s 和其他 %3$d 個人" diff --git a/features/messages/impl/src/main/res/values-zh/translations.xml b/features/messages/impl/src/main/res/values-zh/translations.xml index 74902e353c..2e9710ac84 100644 --- a/features/messages/impl/src/main/res/values-zh/translations.xml +++ b/features/messages/impl/src/main/res/values-zh/translations.xml @@ -44,6 +44,7 @@ "%1$d 个聊天室变化" + "该聊天室是其他聊天室的延续" "%1$s,%2$s 和其他 %3$d 个人" diff --git a/features/messages/impl/src/test/kotlin/io/element/android/features/messages/impl/FakeMessagesNavigator.kt b/features/messages/impl/src/test/kotlin/io/element/android/features/messages/impl/FakeMessagesNavigator.kt index f6e6fedbc5..c90ee16e47 100644 --- a/features/messages/impl/src/test/kotlin/io/element/android/features/messages/impl/FakeMessagesNavigator.kt +++ b/features/messages/impl/src/test/kotlin/io/element/android/features/messages/impl/FakeMessagesNavigator.kt @@ -10,6 +10,7 @@ package io.element.android.features.messages.impl import io.element.android.features.messages.impl.attachments.Attachment import io.element.android.libraries.matrix.api.core.EventId import io.element.android.libraries.matrix.api.core.RoomId +import io.element.android.libraries.matrix.api.core.ThreadId import io.element.android.libraries.matrix.api.core.UserId import io.element.android.libraries.matrix.api.timeline.item.TimelineItemDebugInfo import io.element.android.tests.testutils.lambda.lambdaError @@ -21,7 +22,8 @@ class FakeMessagesNavigator( private val onReportContentClickLambda: (eventId: EventId, senderId: UserId) -> Unit = { _, _ -> lambdaError() }, private val onEditPollClickLambda: (eventId: EventId) -> Unit = { _ -> lambdaError() }, private val onPreviewAttachmentLambda: (attachments: ImmutableList) -> Unit = { _ -> lambdaError() }, - private val onNavigateToRoomLambda: (roomId: RoomId, serverNames: List) -> Unit = { _, _ -> lambdaError() } + private val onNavigateToRoomLambda: (roomId: RoomId, serverNames: List) -> Unit = { _, _ -> lambdaError() }, + private val onOpenThreadLambda: (threadRootId: ThreadId, focusedEventId: EventId?) -> Unit = { _, _ -> lambdaError() }, ) : MessagesNavigator { override fun onShowEventDebugInfoClick(eventId: EventId?, debugInfo: TimelineItemDebugInfo) { onShowEventDebugInfoClickLambda(eventId, debugInfo) @@ -46,4 +48,8 @@ class FakeMessagesNavigator( override fun onNavigateToRoom(roomId: RoomId, serverNames: List) { onNavigateToRoomLambda(roomId, serverNames) } + + override fun onOpenThread(threadRootId: ThreadId, focusedEventId: EventId?) { + onOpenThreadLambda(threadRootId, focusedEventId) + } } diff --git a/features/messages/impl/src/test/kotlin/io/element/android/features/messages/impl/MessagesPresenterTest.kt b/features/messages/impl/src/test/kotlin/io/element/android/features/messages/impl/MessagesPresenterTest.kt index a64fa03e2b..6a1abd4b3f 100644 --- a/features/messages/impl/src/test/kotlin/io/element/android/features/messages/impl/MessagesPresenterTest.kt +++ b/features/messages/impl/src/test/kotlin/io/element/android/features/messages/impl/MessagesPresenterTest.kt @@ -34,8 +34,8 @@ import io.element.android.features.messages.impl.timeline.model.event.aTimelineI import io.element.android.features.messages.impl.timeline.model.event.aTimelineItemPollContent import io.element.android.features.messages.impl.timeline.model.event.aTimelineItemTextContent import io.element.android.features.messages.impl.timeline.protection.aTimelineProtectionState -import io.element.android.features.messages.impl.voicemessages.composer.aVoiceMessageComposerState import io.element.android.features.messages.test.timeline.FakeHtmlConverterProvider +import io.element.android.features.messages.test.timeline.voicemessages.composer.FakeDefaultVoiceMessageComposerPresenterFactory import io.element.android.features.roomcall.api.aStandByCallState import io.element.android.features.roommembermoderation.api.RoomMemberModerationState import io.element.android.libraries.androidutils.clipboard.FakeClipboardHelper @@ -46,9 +46,13 @@ import io.element.android.libraries.core.mimetype.MimeTypes import io.element.android.libraries.designsystem.components.avatar.AvatarData import io.element.android.libraries.designsystem.components.avatar.AvatarSize import io.element.android.libraries.designsystem.utils.snackbar.SnackbarDispatcher +import io.element.android.libraries.featureflag.api.FeatureFlags +import io.element.android.libraries.featureflag.test.FakeFeatureFlagService import io.element.android.libraries.matrix.api.core.EventId import io.element.android.libraries.matrix.api.core.RoomId +import io.element.android.libraries.matrix.api.core.ThreadId import io.element.android.libraries.matrix.api.core.UserId +import io.element.android.libraries.matrix.api.core.toThreadId import io.element.android.libraries.matrix.api.encryption.identity.IdentityState import io.element.android.libraries.matrix.api.media.MediaSource import io.element.android.libraries.matrix.api.permalink.PermalinkParser @@ -56,6 +60,8 @@ import io.element.android.libraries.matrix.api.room.MessageEventType import io.element.android.libraries.matrix.api.room.RoomMembersState import io.element.android.libraries.matrix.api.room.RoomMembershipState import io.element.android.libraries.matrix.api.room.tombstone.SuccessorRoom +import io.element.android.libraries.matrix.api.timeline.Timeline +import io.element.android.libraries.matrix.api.timeline.item.EventThreadInfo import io.element.android.libraries.matrix.api.timeline.item.TimelineItemDebugInfo import io.element.android.libraries.matrix.api.timeline.item.event.EventOrTransactionId import io.element.android.libraries.matrix.api.timeline.item.event.toEventOrTransactionId @@ -66,6 +72,7 @@ import io.element.android.libraries.matrix.test.A_CAPTION 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_SESSION_ID_2 +import io.element.android.libraries.matrix.test.A_THREAD_ID import io.element.android.libraries.matrix.test.A_USER_ID import io.element.android.libraries.matrix.test.A_USER_ID_2 import io.element.android.libraries.matrix.test.core.aBuildMeta @@ -908,7 +915,10 @@ class MessagesPresenterTest { liveTimeline = timeline, typingNoticeResult = { Result.success(Unit) }, ) - val presenter = createMessagesPresenter(joinedRoom = room, analyticsService = analyticsService) + val presenter = createMessagesPresenter( + joinedRoom = room, + analyticsService = analyticsService, + ) presenter.testWithLifecycleOwner { val messageEvent = aMessageEvent( content = aTimelineItemTextContent() @@ -1047,6 +1057,7 @@ class MessagesPresenterTest { ) val presenter = createMessagesPresenter( joinedRoom = room, + timeline = timeline, ) presenter.testWithLifecycleOwner { skipItems(1) @@ -1153,6 +1164,74 @@ class MessagesPresenterTest { } } + @Test + fun `present - handle action reply in thread for an event in a thread`() = runTest { + val openThreadLambda = lambdaRecorder { _: ThreadId, _: EventId? -> } + val presenter = createMessagesPresenter( + navigator = FakeMessagesNavigator(onOpenThreadLambda = openThreadLambda), + featureFlagService = FakeFeatureFlagService( + initialState = mapOf(FeatureFlags.Threads.key to true) + ), + ) + presenter.testWithLifecycleOwner { + val initialState = awaitItem() + initialState.eventSink(MessagesEvents.HandleAction( + action = TimelineItemAction.ReplyInThread, + event = aMessageEvent(threadInfo = EventThreadInfo(A_THREAD_ID, null)) + )) + awaitItem() + openThreadLambda.assertions().isCalledOnce().with(value(A_THREAD_ID), value(null)) + } + } + + @Test + fun `present - handle action reply in thread to start a new thread`() = runTest { + val openThreadLambda = lambdaRecorder { _: ThreadId, _: EventId? -> } + val presenter = createMessagesPresenter( + navigator = FakeMessagesNavigator(onOpenThreadLambda = openThreadLambda), + featureFlagService = FakeFeatureFlagService( + initialState = mapOf(FeatureFlags.Threads.key to true) + ), + ) + presenter.testWithLifecycleOwner { + val initialState = awaitItem() + initialState.eventSink(MessagesEvents.HandleAction( + action = TimelineItemAction.ReplyInThread, + event = aMessageEvent( + // The event id will be used as the thread id instead + eventId = AN_EVENT_ID, + threadInfo = EventThreadInfo(null, null), + ) + )) + awaitItem() + openThreadLambda.assertions().isCalledOnce().with(value(AN_EVENT_ID.toThreadId()), value(null)) + } + } + + @Test + fun `present - handle action reply in a thread with threads disabled`() = runTest { + val composerRecorder = EventsRecorder() + val presenter = createMessagesPresenter( + featureFlagService = FakeFeatureFlagService( + initialState = mapOf(FeatureFlags.Threads.key to false) + ), + messageComposerPresenter = { aMessageComposerState(eventSink = composerRecorder) }, + ) + presenter.testWithLifecycleOwner { + val initialState = awaitItem() + initialState.eventSink(MessagesEvents.HandleAction(TimelineItemAction.ReplyInThread, aMessageEvent())) + awaitItem() + composerRecorder.assertSingle( + MessageComposerEvents.SetMode( + composerMode = MessageComposerMode.Reply( + replyToDetails = InReplyToDetails.Loading(AN_EVENT_ID), + hideImage = false, + ) + ) + ) + } + } + private fun TestScope.createMessagesPresenter( coroutineDispatchers: CoroutineDispatchers = testCoroutineDispatchers(), joinedRoom: FakeJoinedRoom = FakeJoinedRoom( @@ -1168,6 +1247,7 @@ class MessagesPresenterTest { liveTimeline = FakeTimeline(), typingNoticeResult = { Result.success(Unit) }, ), + timeline: Timeline = joinedRoom.liveTimeline, navigator: FakeMessagesNavigator = FakeMessagesNavigator(), clipboardHelper: FakeClipboardHelper = FakeClipboardHelper(), analyticsService: FakeAnalyticsService = FakeAnalyticsService(), @@ -1183,12 +1263,13 @@ class MessagesPresenterTest { aRoomMemberModerationState() }, encryptionService: FakeEncryptionService = FakeEncryptionService(), + featureFlagService: FakeFeatureFlagService = FakeFeatureFlagService(), actionListEventSink: (ActionListEvents) -> Unit = {}, ): MessagesPresenter { return MessagesPresenter( room = joinedRoom, composerPresenter = messageComposerPresenter, - voiceMessageComposerPresenter = { aVoiceMessageComposerState() }, + voiceMessageComposerPresenterFactory = FakeDefaultVoiceMessageComposerPresenterFactory(backgroundScope), timelinePresenter = { aTimelineState(eventSink = timelineEventSink) }, timelineProtectionPresenter = { aTimelineProtectionState() }, actionListPresenter = { anActionListState(eventSink = actionListEventSink) }, @@ -1207,10 +1288,11 @@ class MessagesPresenterTest { buildMeta = aBuildMeta(), dispatchers = coroutineDispatchers, htmlConverterProvider = FakeHtmlConverterProvider(), - timelineController = TimelineController(joinedRoom), + timelineController = TimelineController(joinedRoom, timeline), permalinkParser = permalinkParser, encryptionService = encryptionService, analyticsService = analyticsService, + featureFlagService = featureFlagService, ) } } 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 50dbb2b7ca..964143ac78 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 @@ -27,11 +27,17 @@ import io.element.android.features.messages.impl.timeline.model.event.aTimelineI import io.element.android.features.messages.impl.timeline.model.event.aTimelineItemVoiceContent import io.element.android.features.poll.api.pollcontent.aPollAnswerItemList import io.element.android.libraries.dateformatter.test.FakeDateFormatter +import io.element.android.libraries.featureflag.api.FeatureFlags +import io.element.android.libraries.featureflag.test.FakeFeatureFlagService import io.element.android.libraries.matrix.api.room.BaseRoom +import io.element.android.libraries.matrix.api.timeline.Timeline +import io.element.android.libraries.matrix.api.timeline.item.EventThreadInfo import io.element.android.libraries.matrix.api.timeline.item.event.LocalEventSendState import io.element.android.libraries.matrix.test.AN_EVENT_ID import io.element.android.libraries.matrix.test.A_CAPTION import io.element.android.libraries.matrix.test.A_MESSAGE +import io.element.android.libraries.matrix.test.A_THREAD_ID +import io.element.android.libraries.matrix.test.A_TRANSACTION_ID import io.element.android.libraries.matrix.test.A_USER_ID import io.element.android.libraries.matrix.test.room.FakeBaseRoom import io.element.android.libraries.matrix.test.room.aRoomInfo @@ -192,7 +198,7 @@ class ActionListPresenterTest { val messageEvent = aMessageEvent( isMine = false, isEditable = false, - isThreaded = true, + threadInfo = EventThreadInfo(threadRootId = A_THREAD_ID, threadSummary = null), content = TimelineItemTextContent(body = A_MESSAGE, htmlDocument = null, isEdited = false, formattedBody = A_MESSAGE) ) initialState.eventSink.invoke( @@ -426,7 +432,7 @@ class ActionListPresenterTest { val initialState = awaitItem() val messageEvent = aMessageEvent( isMine = true, - isThreaded = true, + threadInfo = EventThreadInfo(threadRootId = A_THREAD_ID, threadSummary = null), content = TimelineItemTextContent(body = A_MESSAGE, htmlDocument = null, isEdited = false, formattedBody = A_MESSAGE) ) initialState.eventSink.invoke( @@ -1240,11 +1246,222 @@ class ActionListPresenterTest { assertThat(target.verifiedUserSendFailure).isEqualTo(VerifiedUserSendFailure.ChangedIdentity(userDisplayName = "Alice")) } } + + @Test + fun `present - compute for threaded timeline with threads enabled`() = runTest { + val presenter = createActionListPresenter( + isDeveloperModeEnabled = false, + timelineMode = Timeline.Mode.Thread(A_THREAD_ID), + featureFlagService = FakeFeatureFlagService(initialState = mapOf(FeatureFlags.Threads.key to true)), + ) + moleculeFlow(RecompositionMode.Immediate) { + presenter.present() + }.test { + val initialState = awaitItem() + val messageEvent = aMessageEvent( + isMine = true, + isEditable = false, + content = aTimelineItemVoiceContent( + caption = null, + ), + threadInfo = EventThreadInfo(A_THREAD_ID, null) + ) + initialState.eventSink.invoke( + ActionListEvents.ComputeForMessage( + event = messageEvent, + userEventPermissions = aUserEventPermissions( + canRedactOwn = true, + canRedactOther = false, + canSendMessage = true, + canSendReaction = true, + canPinUnpin = true + ) + ) + ) + val successState = awaitItem() + assertThat(successState.target).isEqualTo( + ActionListState.Target.Success( + event = messageEvent, + sentTimeFull = "0 Full true", + displayEmojiReactions = true, + verifiedUserSendFailure = VerifiedUserSendFailure.None, + actions = persistentListOf( + // This is Reply, not ReplyInThread + TimelineItemAction.Reply, + TimelineItemAction.Forward, + TimelineItemAction.CopyLink, + TimelineItemAction.Pin, + TimelineItemAction.Redact, + ) + ) + ) + } + } + + @Test + fun `present - compute for remote timeline item with threads enabled`() = runTest { + val presenter = createActionListPresenter( + isDeveloperModeEnabled = false, + featureFlagService = FakeFeatureFlagService(initialState = mapOf(FeatureFlags.Threads.key to true)), + ) + moleculeFlow(RecompositionMode.Immediate) { + presenter.present() + }.test { + val initialState = awaitItem() + val messageEvent = aMessageEvent( + eventId = AN_EVENT_ID, + isMine = true, + isEditable = false, + content = aTimelineItemVoiceContent( + caption = null, + ), + ) + + assertThat(messageEvent.isRemote).isTrue() + + initialState.eventSink.invoke( + ActionListEvents.ComputeForMessage( + event = messageEvent, + userEventPermissions = aUserEventPermissions( + canRedactOwn = true, + canRedactOther = false, + canSendMessage = true, + canSendReaction = true, + canPinUnpin = true + ) + ) + ) + val successState = awaitItem() + assertThat(successState.target).isEqualTo( + ActionListState.Target.Success( + event = messageEvent, + sentTimeFull = "0 Full true", + displayEmojiReactions = true, + verifiedUserSendFailure = VerifiedUserSendFailure.None, + actions = persistentListOf( + TimelineItemAction.Reply, + TimelineItemAction.ReplyInThread, + TimelineItemAction.Forward, + TimelineItemAction.CopyLink, + TimelineItemAction.Pin, + TimelineItemAction.Redact, + ) + ) + ) + } + } + + @Test + fun `present - compute for remote timeline item already in thread with threads enabled`() = runTest { + val presenter = createActionListPresenter( + isDeveloperModeEnabled = false, + featureFlagService = FakeFeatureFlagService(initialState = mapOf(FeatureFlags.Threads.key to true)), + ) + moleculeFlow(RecompositionMode.Immediate) { + presenter.present() + }.test { + val initialState = awaitItem() + val messageEvent = aMessageEvent( + eventId = AN_EVENT_ID, + isMine = true, + isEditable = false, + content = aTimelineItemVoiceContent( + caption = null, + ), + threadInfo = EventThreadInfo(A_THREAD_ID, null), + ) + + assertThat(messageEvent.isRemote).isTrue() + + initialState.eventSink.invoke( + ActionListEvents.ComputeForMessage( + event = messageEvent, + userEventPermissions = aUserEventPermissions( + canRedactOwn = true, + canRedactOther = false, + canSendMessage = true, + canSendReaction = true, + canPinUnpin = true + ) + ) + ) + val successState = awaitItem() + assertThat(successState.target).isEqualTo( + ActionListState.Target.Success( + event = messageEvent, + sentTimeFull = "0 Full true", + displayEmojiReactions = true, + verifiedUserSendFailure = VerifiedUserSendFailure.None, + actions = persistentListOf( + TimelineItemAction.Reply, + TimelineItemAction.ReplyInThread, + TimelineItemAction.Forward, + TimelineItemAction.CopyLink, + TimelineItemAction.Pin, + TimelineItemAction.Redact, + ) + ) + ) + } + } + + @Test + fun `present - compute for local timeline item with threads enabled`() = runTest { + val presenter = createActionListPresenter( + isDeveloperModeEnabled = false, + featureFlagService = FakeFeatureFlagService(initialState = mapOf(FeatureFlags.Threads.key to true)), + ) + moleculeFlow(RecompositionMode.Immediate) { + presenter.present() + }.test { + val initialState = awaitItem() + val messageEvent = aMessageEvent( + eventId = null, + transactionId = A_TRANSACTION_ID, + isMine = true, + isEditable = false, + content = aTimelineItemVoiceContent( + caption = null, + ), + ) + + assertThat(messageEvent.isRemote).isFalse() + + initialState.eventSink.invoke( + ActionListEvents.ComputeForMessage( + event = messageEvent, + userEventPermissions = aUserEventPermissions( + canRedactOwn = true, + canRedactOther = false, + canSendMessage = true, + canSendReaction = true, + canPinUnpin = true + ) + ) + ) + val successState = awaitItem() + assertThat(successState.target).isEqualTo( + ActionListState.Target.Success( + event = messageEvent, + sentTimeFull = "0 Full true", + displayEmojiReactions = true, + verifiedUserSendFailure = VerifiedUserSendFailure.None, + actions = persistentListOf( + // Can't reply in thread for local events + TimelineItemAction.Reply, + TimelineItemAction.Redact, + ) + ) + ) + } + } } private fun createActionListPresenter( isDeveloperModeEnabled: Boolean, room: BaseRoom = FakeBaseRoom(), + timelineMode: Timeline.Mode = Timeline.Mode.Live, + featureFlagService: FakeFeatureFlagService = FakeFeatureFlagService(), ): ActionListPresenter { val preferencesStore = InMemoryAppPreferencesStore(isDeveloperModeEnabled = isDeveloperModeEnabled) return DefaultActionListPresenter( @@ -1253,5 +1470,7 @@ private fun createActionListPresenter( room = room, userSendFailureFactory = VerifiedUserSendFailureFactory(room), dateFormatter = FakeDateFormatter(), + timelineMode = timelineMode, + featureFlagService = featureFlagService, ) } diff --git a/features/messages/impl/src/test/kotlin/io/element/android/features/messages/impl/attachments/AttachmentsPreviewPresenterTest.kt b/features/messages/impl/src/test/kotlin/io/element/android/features/messages/impl/attachments/AttachmentsPreviewPresenterTest.kt index 7f8e10c5b1..0f1da066bd 100644 --- a/features/messages/impl/src/test/kotlin/io/element/android/features/messages/impl/attachments/AttachmentsPreviewPresenterTest.kt +++ b/features/messages/impl/src/test/kotlin/io/element/android/features/messages/impl/attachments/AttachmentsPreviewPresenterTest.kt @@ -26,13 +26,13 @@ import io.element.android.libraries.androidutils.file.TemporaryUriDeleter import io.element.android.libraries.architecture.AsyncData import io.element.android.libraries.core.mimetype.MimeTypes import io.element.android.libraries.matrix.api.core.EventId -import io.element.android.libraries.matrix.api.core.ProgressCallback import io.element.android.libraries.matrix.api.media.AudioInfo import io.element.android.libraries.matrix.api.media.FileInfo import io.element.android.libraries.matrix.api.media.ImageInfo import io.element.android.libraries.matrix.api.media.VideoInfo import io.element.android.libraries.matrix.api.permalink.PermalinkBuilder import io.element.android.libraries.matrix.api.room.JoinedRoom +import io.element.android.libraries.matrix.api.timeline.Timeline import io.element.android.libraries.matrix.test.A_CAPTION import io.element.android.libraries.matrix.test.media.FakeMediaUploadHandler import io.element.android.libraries.matrix.test.permalink.FakePermalinkBuilder @@ -58,6 +58,7 @@ import io.element.android.tests.testutils.lambda.lambdaRecorder import io.element.android.tests.testutils.lambda.value import io.element.android.tests.testutils.test import io.element.android.tests.testutils.testCoroutineDispatchers +import io.mockk.every import io.mockk.mockk import kotlinx.collections.immutable.persistentListOf import kotlinx.coroutines.CompletableDeferred @@ -77,7 +78,9 @@ class AttachmentsPreviewPresenterTest { @get:Rule val warmUpRule = WarmUpRule() - private val mockMediaUrl: Uri = mockk("localMediaUri") + private val mockMediaUrl: Uri = mockk("localMediaUri") { + every { path } returns "/path/to/media" + } @Test fun `present - initial state`() = runTest { @@ -90,17 +93,11 @@ class AttachmentsPreviewPresenterTest { @Test fun `present - send media success scenario`() = runTest { val sendFileResult = - lambdaRecorder> { _, _, _, _, _, _ -> + lambdaRecorder> { _, _, _, _, _ -> Result.success(FakeMediaUploadHandler()) } val room = FakeJoinedRoom( - liveTimeline = FakeTimeline( - progressCallbackValues = listOf( - Pair(0, 10), - Pair(5, 10), - Pair(10, 10) - ), - ).apply { + liveTimeline = FakeTimeline().apply { sendFileLambda = sendFileResult }, ) @@ -120,9 +117,7 @@ class AttachmentsPreviewPresenterTest { initialState.eventSink(AttachmentsPreviewEvents.SendAttachment) assertThat(awaitItem().sendActionState).isEqualTo(SendActionState.Sending.Processing(displayProgress = true)) assertThat(awaitItem().sendActionState).isEqualTo(SendActionState.Sending.ReadyToUpload(mediaUploadInfo)) - assertThat(awaitItem().sendActionState).isEqualTo(SendActionState.Sending.Uploading(0f, mediaUploadInfo)) - assertThat(awaitItem().sendActionState).isEqualTo(SendActionState.Sending.Uploading(0.5f, mediaUploadInfo)) - assertThat(awaitItem().sendActionState).isEqualTo(SendActionState.Sending.Uploading(1f, mediaUploadInfo)) + assertThat(awaitItem().sendActionState).isEqualTo(SendActionState.Sending.Uploading(mediaUploadInfo)) assertThat(awaitItem().sendActionState).isEqualTo(SendActionState.Done) sendFileResult.assertions().isCalledOnce() onDoneListener.assertions().isCalledOnce() @@ -133,7 +128,7 @@ class AttachmentsPreviewPresenterTest { @Test fun `present - send media after pre-processing success scenario`() = runTest { val sendFileResult = - lambdaRecorder> { _, _, _, _, _, _ -> + lambdaRecorder> { _, _, _, _, _ -> Result.success(FakeMediaUploadHandler()) } val room = FakeJoinedRoom( @@ -160,6 +155,7 @@ class AttachmentsPreviewPresenterTest { assertThat(awaitItem().sendActionState).isEqualTo(SendActionState.Sending.Processing(displayProgress = false)) initialState.eventSink(AttachmentsPreviewEvents.SendAttachment) assertThat(awaitItem().sendActionState).isEqualTo(SendActionState.Sending.ReadyToUpload(mediaUploadInfo)) + assertThat(awaitItem().sendActionState).isEqualTo(SendActionState.Sending.Uploading(mediaUploadInfo)) assertThat(awaitItem().sendActionState).isEqualTo(SendActionState.Done) sendFileResult.assertions().isCalledOnce() onDoneListener.assertions().isCalledOnce() @@ -170,7 +166,7 @@ class AttachmentsPreviewPresenterTest { @Test fun `present - send media before pre-processing success scenario`() = runTest { val sendFileResult = - lambdaRecorder> { _, _, _, _, _, _ -> + lambdaRecorder> { _, _, _, _, _ -> Result.success(FakeMediaUploadHandler()) } val room = FakeJoinedRoom( @@ -197,6 +193,7 @@ class AttachmentsPreviewPresenterTest { processLatch.complete(Unit) assertThat(awaitItem().sendActionState).isEqualTo(SendActionState.Sending.Processing(displayProgress = true)) assertThat(awaitItem().sendActionState).isEqualTo(SendActionState.Sending.ReadyToUpload(mediaUploadInfo)) + assertThat(awaitItem().sendActionState).isEqualTo(SendActionState.Sending.Uploading(mediaUploadInfo)) assertThat(awaitItem().sendActionState).isEqualTo(SendActionState.Done) sendFileResult.assertions().isCalledOnce() onDoneListener.assertions().isCalledOnce() @@ -281,7 +278,7 @@ class AttachmentsPreviewPresenterTest { @Test fun `present - send image with caption success scenario`() = runTest { val sendImageResult = - lambdaRecorder { _: File, _: File?, _: ImageInfo, _: String?, _: String?, _: ProgressCallback?, _: EventId? -> + lambdaRecorder { _: File, _: File?, _: ImageInfo, _: String?, _: String?, _: EventId? -> Result.success(FakeMediaUploadHandler()) } val mediaPreProcessor = FakeMediaPreProcessor().apply { @@ -307,6 +304,7 @@ class AttachmentsPreviewPresenterTest { initialState.eventSink(AttachmentsPreviewEvents.SendAttachment) assertThat(awaitItem().sendActionState).isEqualTo(SendActionState.Sending.Processing(displayProgress = false)) assertThat(awaitItem().sendActionState).isInstanceOf(SendActionState.Sending.ReadyToUpload::class.java) + assertThat(awaitItem().sendActionState).isInstanceOf(SendActionState.Sending.Uploading::class.java) assertThat(awaitItem().sendActionState).isEqualTo(SendActionState.Done) sendImageResult.assertions().isCalledOnce().with( any(), @@ -315,7 +313,6 @@ class AttachmentsPreviewPresenterTest { value(A_CAPTION), any(), any(), - any(), ) onDoneListener.assertions().isCalledOnce() } @@ -324,7 +321,7 @@ class AttachmentsPreviewPresenterTest { @Test fun `present - send video with caption success scenario`() = runTest { val sendVideoResult = - lambdaRecorder { _: File, _: File?, _: VideoInfo, _: String?, _: String?, _: ProgressCallback?, _: EventId? -> + lambdaRecorder { _: File, _: File?, _: VideoInfo, _: String?, _: String?, _: EventId? -> Result.success(FakeMediaUploadHandler()) } val mediaPreProcessor = FakeMediaPreProcessor().apply { @@ -350,6 +347,7 @@ class AttachmentsPreviewPresenterTest { initialState.eventSink(AttachmentsPreviewEvents.SendAttachment) assertThat(awaitItem().sendActionState).isEqualTo(SendActionState.Sending.Processing(displayProgress = false)) assertThat(awaitItem().sendActionState).isInstanceOf(SendActionState.Sending.ReadyToUpload::class.java) + assertThat(awaitItem().sendActionState).isInstanceOf(SendActionState.Sending.Uploading::class.java) assertThat(awaitItem().sendActionState).isEqualTo(SendActionState.Done) sendVideoResult.assertions().isCalledOnce().with( any(), @@ -358,7 +356,6 @@ class AttachmentsPreviewPresenterTest { value(A_CAPTION), any(), any(), - any(), ) onDoneListener.assertions().isCalledOnce() } @@ -367,7 +364,7 @@ class AttachmentsPreviewPresenterTest { @Test fun `present - send audio with caption success scenario`() = runTest { val sendAudioResult = - lambdaRecorder> { _, _, _, _, _, _ -> + lambdaRecorder> { _, _, _, _, _ -> Result.success(FakeMediaUploadHandler()) } val mediaPreProcessor = FakeMediaPreProcessor().apply { @@ -391,6 +388,7 @@ class AttachmentsPreviewPresenterTest { initialState.eventSink(AttachmentsPreviewEvents.SendAttachment) assertThat(awaitItem().sendActionState).isEqualTo(SendActionState.Sending.Processing(displayProgress = false)) assertThat(awaitItem().sendActionState).isInstanceOf(SendActionState.Sending.ReadyToUpload::class.java) + assertThat(awaitItem().sendActionState).isInstanceOf(SendActionState.Sending.Uploading::class.java) assertThat(awaitItem().sendActionState).isEqualTo(SendActionState.Done) sendAudioResult.assertions().isCalledOnce().with( any(), @@ -398,7 +396,6 @@ class AttachmentsPreviewPresenterTest { value(A_CAPTION), any(), any(), - any(), ) onDoneListener.assertions().isCalledOnce() } @@ -408,7 +405,7 @@ class AttachmentsPreviewPresenterTest { fun `present - send media failure scenario`() = runTest { val failure = MediaPreProcessor.Failure(null) val sendFileResult = - lambdaRecorder> { _, _, _, _, _, _ -> + lambdaRecorder> { _, _, _, _, _ -> Result.failure(failure) } val onDoneListenerResult = lambdaRecorder {} @@ -426,6 +423,7 @@ class AttachmentsPreviewPresenterTest { initialState.eventSink(AttachmentsPreviewEvents.SendAttachment) assertThat(awaitItem().sendActionState).isEqualTo(SendActionState.Sending.Processing(displayProgress = false)) assertThat(awaitItem().sendActionState).isEqualTo(SendActionState.Sending.ReadyToUpload(mediaUploadInfo)) + assertThat(awaitItem().sendActionState).isEqualTo(SendActionState.Sending.Uploading(mediaUploadInfo)) // Check that the onDoneListener is called so the screen would be dismissed onDoneListenerResult.assertions().isCalledOnce() @@ -445,7 +443,7 @@ class AttachmentsPreviewPresenterTest { val presenter = createAttachmentsPreviewPresenter( room = FakeJoinedRoom( liveTimeline = FakeTimeline().apply { - sendFileLambda = { _, _, _, _, _, _ -> + sendFileLambda = { _, _, _, _, _ -> Result.success(FakeMediaUploadHandler()) } } @@ -460,7 +458,9 @@ class AttachmentsPreviewPresenterTest { initialState.eventSink(AttachmentsPreviewEvents.SendAttachment) assertThat(awaitItem().sendActionState).isEqualTo(SendActionState.Sending.Processing(displayProgress = false)) assertThat(awaitItem().sendActionState).isEqualTo(SendActionState.Sending.ReadyToUpload(mediaUploadInfo)) + assertThat(awaitItem().sendActionState).isEqualTo(SendActionState.Sending.Uploading(mediaUploadInfo)) initialState.eventSink(AttachmentsPreviewEvents.CancelAndClearSendState) + assertThat(awaitItem().sendActionState).isEqualTo(SendActionState.Sending.ReadyToUpload(mediaUploadInfo)) // The sending is cancelled and the state is kept at ReadyToUpload ensureAllEventsConsumed() @@ -480,7 +480,7 @@ class AttachmentsPreviewPresenterTest { localMedia = localMedia, room = FakeJoinedRoom( liveTimeline = FakeTimeline().apply { - sendFileLambda = { _, _, _, _, _, _ -> + sendFileLambda = { _, _, _, _, _ -> Result.success(FakeMediaUploadHandler()) } } @@ -521,7 +521,7 @@ class AttachmentsPreviewPresenterTest { localMedia = localMedia, room = FakeJoinedRoom( liveTimeline = FakeTimeline().apply { - sendFileLambda = { _, _, _, _, _, _ -> + sendFileLambda = { _, _, _, _, _ -> Result.success(FakeMediaUploadHandler()) } } @@ -577,6 +577,7 @@ class AttachmentsPreviewPresenterTest { uri = mockMediaUrl, ), room: JoinedRoom = FakeJoinedRoom(), + timelineMode: Timeline.Mode = Timeline.Mode.Live, permalinkBuilder: PermalinkBuilder = FakePermalinkBuilder(), mediaPreProcessor: MediaPreProcessor = FakeMediaPreProcessor(), temporaryUriDeleter: TemporaryUriDeleter = FakeTemporaryUriDeleter(), @@ -599,14 +600,24 @@ class AttachmentsPreviewPresenterTest { return AttachmentsPreviewPresenter( attachment = aMediaAttachment(localMedia), onDoneListener = onDoneListener, - mediaSender = MediaSender(mediaPreProcessor, room, { - MediaOptimizationConfig(compressImages = true, videoCompressionPreset = VideoCompressionPreset.STANDARD) - }), + mediaSenderFactory = object : MediaSender.Factory { + override fun create(timelineMode: Timeline.Mode): MediaSender { + return MediaSender( + preProcessor = mediaPreProcessor, + room = room, + timelineMode = timelineMode, + mediaOptimizationConfigProvider = { + MediaOptimizationConfig(compressImages = true, videoCompressionPreset = VideoCompressionPreset.STANDARD) + } + ) + } + }, permalinkBuilder = permalinkBuilder, temporaryUriDeleter = temporaryUriDeleter, sessionCoroutineScope = this, dispatchers = testCoroutineDispatchers(), mediaOptimizationSelectorPresenterFactory = mediaOptimizationSelectorPresenterFactory, + timelineMode = timelineMode, ) } diff --git a/features/messages/impl/src/test/kotlin/io/element/android/features/messages/impl/attachments/SendActionStateTest.kt b/features/messages/impl/src/test/kotlin/io/element/android/features/messages/impl/attachments/SendActionStateTest.kt index 10290610dc..7a6dc988a4 100644 --- a/features/messages/impl/src/test/kotlin/io/element/android/features/messages/impl/attachments/SendActionStateTest.kt +++ b/features/messages/impl/src/test/kotlin/io/element/android/features/messages/impl/attachments/SendActionStateTest.kt @@ -17,10 +17,21 @@ class SendActionStateTest { @Test fun `mediaUploadInfo() should return the value from Uploading class`() { val mediaUploadInfo: MediaUploadInfo = aMediaUploadInfo() - val state: SendActionState = SendActionState.Sending.Uploading( - progress = 0.5f, - mediaUploadInfo = aMediaUploadInfo() - ) + val state: SendActionState = SendActionState.Sending.Uploading(mediaUploadInfo = aMediaUploadInfo()) + assertThat(state.mediaUploadInfo()).isEqualTo(mediaUploadInfo) + } + + @Test + fun `mediaUploadInfo() should return the value from ReadyToUpload class`() { + val mediaUploadInfo: MediaUploadInfo = aMediaUploadInfo() + val state: SendActionState = SendActionState.Sending.ReadyToUpload(mediaInfo = aMediaUploadInfo()) + assertThat(state.mediaUploadInfo()).isEqualTo(mediaUploadInfo) + } + + @Test + fun `mediaUploadInfo() should return the value from Failure class`() { + val mediaUploadInfo: MediaUploadInfo = aMediaUploadInfo() + val state: SendActionState = SendActionState.Failure(error = IllegalStateException("An error"), mediaUploadInfo = aMediaUploadInfo()) assertThat(state.mediaUploadInfo()).isEqualTo(mediaUploadInfo) } } diff --git a/features/messages/impl/src/test/kotlin/io/element/android/features/messages/impl/attachments/video/DefaultMediaOptimizationSelectorPresenterTest.kt b/features/messages/impl/src/test/kotlin/io/element/android/features/messages/impl/attachments/video/DefaultMediaOptimizationSelectorPresenterTest.kt index b529918ddc..d095f0d58a 100644 --- a/features/messages/impl/src/test/kotlin/io/element/android/features/messages/impl/attachments/video/DefaultMediaOptimizationSelectorPresenterTest.kt +++ b/features/messages/impl/src/test/kotlin/io/element/android/features/messages/impl/attachments/video/DefaultMediaOptimizationSelectorPresenterTest.kt @@ -34,6 +34,7 @@ import kotlinx.coroutines.test.runTest import org.junit.Rule import org.junit.Test import org.junit.runner.RunWith +import kotlin.time.Duration.Companion.minutes @RunWith(AndroidJUnit4::class) class DefaultMediaOptimizationSelectorPresenterTest { @@ -158,7 +159,7 @@ class DefaultMediaOptimizationSelectorPresenterTest { mediaExtractorFactory = FakeVideoMetadataExtractorFactory( FakeVideoMetadataExtractor( sizeResult = Result.success(Size(10_000, 10_000)), - duration = Result.success(600L) + duration = Result.success(10.minutes) ) ), ) diff --git a/features/messages/impl/src/test/kotlin/io/element/android/features/messages/impl/fixtures/MessageEventFixtures.kt b/features/messages/impl/src/test/kotlin/io/element/android/features/messages/impl/fixtures/MessageEventFixtures.kt index a8dbab2cf2..a9f2e075ac 100644 --- a/features/messages/impl/src/test/kotlin/io/element/android/features/messages/impl/fixtures/MessageEventFixtures.kt +++ b/features/messages/impl/src/test/kotlin/io/element/android/features/messages/impl/fixtures/MessageEventFixtures.kt @@ -19,6 +19,7 @@ import io.element.android.libraries.designsystem.components.avatar.AvatarSize import io.element.android.libraries.matrix.api.core.EventId import io.element.android.libraries.matrix.api.core.TransactionId import io.element.android.libraries.matrix.api.core.UniqueId +import io.element.android.libraries.matrix.api.timeline.item.EventThreadInfo import io.element.android.libraries.matrix.api.timeline.item.event.LocalEventSendState import io.element.android.libraries.matrix.api.timeline.item.event.MessageShieldProvider import io.element.android.libraries.matrix.api.timeline.item.event.SendHandleProvider @@ -40,7 +41,7 @@ internal fun aMessageEvent( canBeRepliedTo: Boolean = true, content: TimelineItemEventContent = TimelineItemTextContent(body = A_MESSAGE, htmlDocument = null, formattedBody = A_MESSAGE, isEdited = false), inReplyTo: InReplyToDetails? = null, - isThreaded: Boolean = false, + threadInfo: EventThreadInfo = EventThreadInfo(threadRootId = null, threadSummary = null), sendState: LocalEventSendState = LocalEventSendState.Sent(AN_EVENT_ID), debugInfoProvider: TimelineItemDebugInfoProvider = TimelineItemDebugInfoProvider { aTimelineItemDebugInfo() }, messageShieldProvider: MessageShieldProvider = MessageShieldProvider { null }, @@ -61,7 +62,7 @@ internal fun aMessageEvent( readReceiptState = TimelineItemReadReceipts(emptyList().toImmutableList()), localSendState = sendState, inReplyTo = inReplyTo, - isThreaded = isThreaded, + threadInfo = threadInfo, origin = null, timelineItemDebugInfoProvider = debugInfoProvider, messageShieldProvider = messageShieldProvider, diff --git a/features/messages/impl/src/test/kotlin/io/element/android/features/messages/impl/messagecomposer/MessageComposerPresenterTest.kt b/features/messages/impl/src/test/kotlin/io/element/android/features/messages/impl/messagecomposer/MessageComposerPresenterTest.kt index c0df1a2b19..84aeb2ce28 100644 --- a/features/messages/impl/src/test/kotlin/io/element/android/features/messages/impl/messagecomposer/MessageComposerPresenterTest.kt +++ b/features/messages/impl/src/test/kotlin/io/element/android/features/messages/impl/messagecomposer/MessageComposerPresenterTest.kt @@ -45,6 +45,7 @@ import io.element.android.libraries.matrix.api.room.RoomMembersState import io.element.android.libraries.matrix.api.room.RoomMembershipState import io.element.android.libraries.matrix.api.room.draft.ComposerDraft import io.element.android.libraries.matrix.api.room.draft.ComposerDraftType +import io.element.android.libraries.matrix.api.timeline.Timeline import io.element.android.libraries.matrix.api.timeline.TimelineException import io.element.android.libraries.matrix.api.timeline.item.event.EventOrTransactionId import io.element.android.libraries.matrix.api.timeline.item.event.InReplyTo @@ -84,6 +85,7 @@ import io.element.android.libraries.permissions.test.FakePermissionsPresenterFac import io.element.android.libraries.preferences.api.store.SessionPreferencesStore import io.element.android.libraries.preferences.api.store.VideoCompressionPreset import io.element.android.libraries.preferences.test.InMemorySessionPreferencesStore +import io.element.android.libraries.push.test.notifications.conversations.FakeNotificationConversationService import io.element.android.libraries.textcomposer.mentions.MentionSpanProvider import io.element.android.libraries.textcomposer.mentions.MentionSpanTheme import io.element.android.libraries.textcomposer.mentions.ResolvedSuggestion @@ -127,6 +129,7 @@ class MessageComposerPresenterTest { private val mockMediaUrl: Uri = mockk("localMediaUri") private val localMediaFactory = FakeLocalMediaFactory(mockMediaUrl) private val analyticsService = FakeAnalyticsService() + private val notificationConversationService = FakeNotificationConversationService() @Test fun `present - initial state`() = runTest { @@ -1181,7 +1184,7 @@ class MessageComposerPresenterTest { room = FakeJoinedRoom( typingNoticeResult = { Result.success(Unit) }, liveTimeline = FakeTimeline().apply { - sendFileLambda = { _, _, _, _, _, _ -> + sendFileLambda = { _, _, _, _, _ -> Result.success(FakeMediaUploadHandler()) } } @@ -1521,6 +1524,7 @@ class MessageComposerPresenterTest { room: JoinedRoom = FakeJoinedRoom( typingNoticeResult = { Result.success(Unit) } ), + timeline: Timeline = room.liveTimeline, navigator: MessagesNavigator = FakeMessagesNavigator(), pickerProvider: PickerProvider = this@MessageComposerPresenterTest.pickerProvider, locationService: LocationService = FakeLocationService(true), @@ -1546,11 +1550,21 @@ class MessageComposerPresenterTest { mediaPickerProvider = pickerProvider, sessionPreferencesStore = sessionPreferencesStore, localMediaFactory = localMediaFactory, - mediaSender = MediaSender( - preProcessor = mediaPreProcessor, - room = room, - mediaOptimizationConfigProvider = { MediaOptimizationConfig(compressImages = true, videoCompressionPreset = VideoCompressionPreset.STANDARD) } - ), + mediaSenderFactory = object : MediaSender.Factory { + override fun create(timelineMode: Timeline.Mode): MediaSender { + return MediaSender( + preProcessor = mediaPreProcessor, + room = room, + timelineMode = timelineMode, + mediaOptimizationConfigProvider = { + MediaOptimizationConfig( + compressImages = true, + videoCompressionPreset = VideoCompressionPreset.STANDARD + ) + } + ) + } + }, snackbarDispatcher = snackbarDispatcher, analyticsService = analyticsService, locationService = locationService, @@ -1560,12 +1574,13 @@ class MessageComposerPresenterTest { permissionsPresenterFactory = FakePermissionsPresenterFactory(permissionPresenter), permalinkParser = permalinkParser, permalinkBuilder = permalinkBuilder, - timelineController = TimelineController(room), + timelineController = TimelineController(room, timeline), draftService = draftService, mentionSpanProvider = mentionSpanProvider, pillificationHelper = textPillificationHelper, suggestionsProcessor = SuggestionsProcessor(), mediaOptimizationConfigProvider = mediaOptimizationConfigProvider, + notificationConversationService = notificationConversationService, ).apply { isTesting = true showTextFormatting = isRichTextEditorEnabled diff --git a/features/messages/impl/src/test/kotlin/io/element/android/features/messages/impl/pinned/list/PinnedMessagesListPresenterTest.kt b/features/messages/impl/src/test/kotlin/io/element/android/features/messages/impl/pinned/list/PinnedMessagesListPresenterTest.kt index 507edf9d9a..07778ab381 100644 --- a/features/messages/impl/src/test/kotlin/io/element/android/features/messages/impl/pinned/list/PinnedMessagesListPresenterTest.kt +++ b/features/messages/impl/src/test/kotlin/io/element/android/features/messages/impl/pinned/list/PinnedMessagesListPresenterTest.kt @@ -17,6 +17,7 @@ import io.element.android.features.messages.impl.pinned.PinnedEventsTimelineProv import io.element.android.features.messages.impl.timeline.model.TimelineItem import io.element.android.features.messages.impl.timeline.protection.aTimelineProtectionState import io.element.android.libraries.designsystem.utils.snackbar.SnackbarDispatcher +import io.element.android.libraries.featureflag.test.FakeFeatureFlagService import io.element.android.libraries.matrix.api.core.EventId import io.element.android.libraries.matrix.api.room.JoinedRoom import io.element.android.libraries.matrix.api.sync.SyncService @@ -297,6 +298,7 @@ class PinnedMessagesListPresenterTest { room: JoinedRoom = FakeJoinedRoom(), syncService: SyncService = FakeSyncService(), analyticsService: AnalyticsService = FakeAnalyticsService(), + featureFlagService: FakeFeatureFlagService = FakeFeatureFlagService(), ): PinnedMessagesListPresenter { val timelineProvider = PinnedEventsTimelineProvider( room = room, @@ -314,6 +316,7 @@ class PinnedMessagesListPresenterTest { actionListPresenter = { anActionListState() }, linkPresenter = { aLinkState() }, analyticsService = analyticsService, + featureFlagService = featureFlagService, sessionCoroutineScope = this, ) } 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 ab183442f2..a2005b7a39 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 @@ -33,7 +33,7 @@ class TimelineControllerTest { liveTimeline = liveTimeline, createTimelineResult = { Result.success(detachedTimeline) } ) - val sut = TimelineController(joinedRoom) + val sut = TimelineController(room = joinedRoom, liveTimeline = liveTimeline) sut.activeTimelineFlow().test { awaitItem().also { state -> @@ -72,7 +72,7 @@ class TimelineControllerTest { } } ) - val sut = TimelineController(joinedRoom) + val sut = TimelineController(joinedRoom, liveTimeline) sut.activeTimelineFlow().test { awaitItem().also { state -> @@ -100,7 +100,7 @@ class TimelineControllerTest { val joinedRoom = FakeJoinedRoom( liveTimeline = liveTimeline ) - val sut = TimelineController(joinedRoom) + val sut = TimelineController(room = joinedRoom, liveTimeline = liveTimeline) sut.activeTimelineFlow().test { awaitItem().also { state -> assertThat(state).isEqualTo(liveTimeline) @@ -119,7 +119,7 @@ class TimelineControllerTest { liveTimeline = liveTimeline, createTimelineResult = { Result.success(detachedTimeline) } ) - val sut = TimelineController(joinedRoom) + val sut = TimelineController(room = joinedRoom, liveTimeline = liveTimeline) sut.activeTimelineFlow().test { awaitItem().also { state -> assertThat(state).isEqualTo(liveTimeline) @@ -147,7 +147,7 @@ class TimelineControllerTest { val joinedRoom = FakeJoinedRoom( liveTimeline = liveTimeline ) - val sut = TimelineController(joinedRoom) + val sut = TimelineController(room = joinedRoom, liveTimeline = liveTimeline) assertThat(sut.timelineItems().first()).hasSize(1) } @@ -169,7 +169,7 @@ class TimelineControllerTest { liveTimeline = liveTimeline, createTimelineResult = { Result.success(detachedTimeline) } ) - val sut = TimelineController(joinedRoom) + val sut = TimelineController(room = joinedRoom, liveTimeline = liveTimeline) sut.activeTimelineFlow().test { sut.focusOnEvent(AN_EVENT_ID) awaitItem().also { state -> @@ -194,7 +194,7 @@ class TimelineControllerTest { liveTimeline = liveTimeline, createTimelineResult = { Result.success(detachedTimeline) } ) - val sut = TimelineController(joinedRoom) + val sut = TimelineController(room = joinedRoom, liveTimeline = liveTimeline) sut.activeTimelineFlow().test { awaitItem().also { state -> diff --git a/features/messages/impl/src/test/kotlin/io/element/android/features/messages/impl/timeline/TimelinePresenterTest.kt b/features/messages/impl/src/test/kotlin/io/element/android/features/messages/impl/timeline/TimelinePresenterTest.kt index 9ba2688d45..8710af8bda 100644 --- a/features/messages/impl/src/test/kotlin/io/element/android/features/messages/impl/timeline/TimelinePresenterTest.kt +++ b/features/messages/impl/src/test/kotlin/io/element/android/features/messages/impl/timeline/TimelinePresenterTest.kt @@ -28,6 +28,7 @@ import io.element.android.features.poll.api.actions.SendPollResponseAction import io.element.android.features.poll.test.actions.FakeEndPollAction import io.element.android.features.poll.test.actions.FakeSendPollResponseAction import io.element.android.features.roomcall.api.aStandByCallState +import io.element.android.libraries.featureflag.test.FakeFeatureFlagService import io.element.android.libraries.matrix.api.core.EventId import io.element.android.libraries.matrix.api.core.RoomId import io.element.android.libraries.matrix.api.core.UniqueId @@ -787,6 +788,7 @@ class TimelinePresenterTest { sessionPreferencesStore: InMemorySessionPreferencesStore = InMemorySessionPreferencesStore(), timelineItemIndexer: TimelineItemIndexer = TimelineItemIndexer(), markAsFullyRead: MarkAsFullyRead = FakeMarkAsFullyRead(), + featureFlagService: FakeFeatureFlagService = FakeFeatureFlagService(), ): TimelinePresenter { return TimelinePresenter( timelineItemsFactoryCreator = aTimelineItemsFactoryCreator(), @@ -799,11 +801,12 @@ class TimelinePresenterTest { sendPollResponseAction = sendPollResponseAction, sessionPreferencesStore = sessionPreferencesStore, timelineItemIndexer = timelineItemIndexer, - timelineController = TimelineController(room), + timelineController = TimelineController(room, timeline), resolveVerifiedUserSendFailurePresenter = { aResolveVerifiedUserSendFailureState() }, typingNotificationPresenter = { aTypingNotificationState() }, roomCallStatePresenter = { aStandByCallState() }, markAsFullyRead = markAsFullyRead, + featureFlagService = featureFlagService, ) } } 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 10efc72e71..917683220e 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 @@ -40,6 +40,7 @@ import io.element.android.libraries.matrix.api.media.MediaSource import io.element.android.libraries.matrix.api.media.ThumbnailInfo import io.element.android.libraries.matrix.api.media.VideoInfo import io.element.android.libraries.matrix.api.permalink.PermalinkData +import io.element.android.libraries.matrix.api.timeline.item.EventThreadInfo 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.FileMessageType @@ -749,14 +750,14 @@ class TimelineItemContentMessageFactoryTest { body: String = "Body", inReplyTo: InReplyTo? = null, isEdited: Boolean = false, - isThreaded: Boolean = false, + threadInfo: EventThreadInfo = EventThreadInfo(threadRootId = null, threadSummary = null), type: MessageType, ): MessageContent { return MessageContent( body = body, inReplyTo = inReplyTo, isEdited = isEdited, - isThreaded = isThreaded, + threadInfo = threadInfo, type = type, ) } diff --git a/features/messages/impl/src/test/kotlin/io/element/android/features/messages/impl/timeline/groups/TimelineItemGrouperTest.kt b/features/messages/impl/src/test/kotlin/io/element/android/features/messages/impl/timeline/groups/TimelineItemGrouperTest.kt index 0bcd6b8091..188c5f0bcd 100644 --- a/features/messages/impl/src/test/kotlin/io/element/android/features/messages/impl/timeline/groups/TimelineItemGrouperTest.kt +++ b/features/messages/impl/src/test/kotlin/io/element/android/features/messages/impl/timeline/groups/TimelineItemGrouperTest.kt @@ -18,6 +18,7 @@ import io.element.android.features.messages.impl.timeline.model.event.TimelineIt import io.element.android.features.messages.impl.timeline.model.virtual.aTimelineItemDaySeparatorModel import io.element.android.libraries.designsystem.components.avatar.anAvatarData import io.element.android.libraries.matrix.api.core.UniqueId +import io.element.android.libraries.matrix.api.timeline.item.EventThreadInfo import io.element.android.libraries.matrix.api.timeline.item.event.LocalEventSendState import io.element.android.libraries.matrix.test.AN_EVENT_ID import io.element.android.libraries.matrix.test.A_USER_ID @@ -41,7 +42,7 @@ class TimelineItemGrouperTest { isEditable = false, canBeRepliedTo = false, inReplyTo = null, - isThreaded = false, + threadInfo = EventThreadInfo(threadRootId = null, threadSummary = null), origin = null, timelineItemDebugInfoProvider = { aTimelineItemDebugInfo() }, messageShieldProvider = { null }, diff --git a/features/messages/impl/src/test/kotlin/io/element/android/features/messages/impl/voicemessages/composer/VoiceMessageComposerPresenterTest.kt b/features/messages/impl/src/test/kotlin/io/element/android/features/messages/impl/voicemessages/composer/VoiceMessageComposerPresenterTest.kt index 9f9b8526a1..6040032ebc 100644 --- a/features/messages/impl/src/test/kotlin/io/element/android/features/messages/impl/voicemessages/composer/VoiceMessageComposerPresenterTest.kt +++ b/features/messages/impl/src/test/kotlin/io/element/android/features/messages/impl/voicemessages/composer/VoiceMessageComposerPresenterTest.kt @@ -17,11 +17,13 @@ import app.cash.turbine.TurbineTestContext import app.cash.turbine.test import com.google.common.truth.Truth.assertThat import im.vector.app.features.analytics.plan.Composer +import io.element.android.features.messages.api.timeline.voicemessages.composer.VoiceMessageComposerEvents +import io.element.android.features.messages.api.timeline.voicemessages.composer.VoiceMessageComposerState import io.element.android.features.messages.impl.messagecomposer.aReplyMode import io.element.android.features.messages.test.FakeMessageComposerContext import io.element.android.libraries.matrix.api.core.EventId -import io.element.android.libraries.matrix.api.core.ProgressCallback import io.element.android.libraries.matrix.api.media.AudioInfo +import io.element.android.libraries.matrix.api.timeline.Timeline import io.element.android.libraries.matrix.test.media.FakeMediaUploadHandler import io.element.android.libraries.matrix.test.room.FakeJoinedRoom import io.element.android.libraries.matrix.test.timeline.FakeTimeline @@ -64,7 +66,7 @@ class VoiceMessageComposerPresenterTest { ) private val analyticsService = FakeAnalyticsService() private val sendVoiceMessageResult = - lambdaRecorder, ProgressCallback?, EventId?, Result> { _, _, _, _, _ -> + lambdaRecorder, EventId?, Result> { _, _, _, _ -> Result.success(FakeMediaUploadHandler()) } private val joinedRoom = FakeJoinedRoom( @@ -76,6 +78,7 @@ class VoiceMessageComposerPresenterTest { private val mediaSender = MediaSender( preProcessor = mediaPreProcessor, room = joinedRoom, + timelineMode = Timeline.Mode.Live, mediaOptimizationConfigProvider = { MediaOptimizationConfig(compressImages = true, videoCompressionPreset = VideoCompressionPreset.STANDARD) }, ) private val messageComposerContext = FakeMessageComposerContext() @@ -87,7 +90,7 @@ class VoiceMessageComposerPresenterTest { @Test fun `present - initial state`() = runTest { - val presenter = createVoiceMessageComposerPresenter() + val presenter = createDefaultVoiceMessageComposerPresenter() moleculeFlow(RecompositionMode.Immediate) { presenter.present() }.test { @@ -101,7 +104,7 @@ class VoiceMessageComposerPresenterTest { @Test fun `present - recording state`() = runTest { - val presenter = createVoiceMessageComposerPresenter() + val presenter = createDefaultVoiceMessageComposerPresenter() moleculeFlow(RecompositionMode.Immediate) { presenter.present() }.test { @@ -117,7 +120,7 @@ class VoiceMessageComposerPresenterTest { @Test fun `present - recording keeps screen on`() = runTest { - val presenter = createVoiceMessageComposerPresenter() + val presenter = createDefaultVoiceMessageComposerPresenter() moleculeFlow(RecompositionMode.Immediate) { presenter.present() }.test { @@ -141,7 +144,7 @@ class VoiceMessageComposerPresenterTest { @Test fun `present - abort recording`() = runTest { - val presenter = createVoiceMessageComposerPresenter() + val presenter = createDefaultVoiceMessageComposerPresenter() moleculeFlow(RecompositionMode.Immediate) { presenter.present() }.test { @@ -156,7 +159,7 @@ class VoiceMessageComposerPresenterTest { @Test fun `present - finish recording`() = runTest { - val presenter = createVoiceMessageComposerPresenter() + val presenter = createDefaultVoiceMessageComposerPresenter() moleculeFlow(RecompositionMode.Immediate) { presenter.present() }.test { @@ -173,7 +176,7 @@ class VoiceMessageComposerPresenterTest { @Test fun `present - play recording before it is ready`() = runTest { - val presenter = createVoiceMessageComposerPresenter() + val presenter = createDefaultVoiceMessageComposerPresenter() moleculeFlow(RecompositionMode.Immediate) { presenter.present() }.test { @@ -192,7 +195,7 @@ class VoiceMessageComposerPresenterTest { @Test fun `present - play recording`() = runTest { - val presenter = createVoiceMessageComposerPresenter() + val presenter = createDefaultVoiceMessageComposerPresenter() moleculeFlow(RecompositionMode.Immediate) { presenter.present() }.test { @@ -210,7 +213,7 @@ class VoiceMessageComposerPresenterTest { @Test fun `present - pause recording`() = runTest { - val presenter = createVoiceMessageComposerPresenter() + val presenter = createDefaultVoiceMessageComposerPresenter() moleculeFlow(RecompositionMode.Immediate) { presenter.present() }.test { @@ -229,7 +232,7 @@ class VoiceMessageComposerPresenterTest { @Test fun `present - seek recording`() = runTest { - val presenter = createVoiceMessageComposerPresenter() + val presenter = createDefaultVoiceMessageComposerPresenter() moleculeFlow(RecompositionMode.Immediate) { presenter.present() }.test { @@ -256,7 +259,7 @@ class VoiceMessageComposerPresenterTest { @Test fun `present - delete recording`() = runTest { - val presenter = createVoiceMessageComposerPresenter() + val presenter = createDefaultVoiceMessageComposerPresenter() moleculeFlow(RecompositionMode.Immediate) { presenter.present() }.test { @@ -274,7 +277,7 @@ class VoiceMessageComposerPresenterTest { @Test fun `present - delete while playing`() = runTest { - val presenter = createVoiceMessageComposerPresenter() + val presenter = createDefaultVoiceMessageComposerPresenter() moleculeFlow(RecompositionMode.Immediate) { presenter.present() }.test { @@ -296,7 +299,7 @@ class VoiceMessageComposerPresenterTest { @Test fun `present - send recording`() = runTest { - val presenter = createVoiceMessageComposerPresenter() + val presenter = createDefaultVoiceMessageComposerPresenter() moleculeFlow(RecompositionMode.Immediate) { presenter.present() }.test { @@ -315,7 +318,7 @@ class VoiceMessageComposerPresenterTest { @Test fun `present - sending is tracked`() = runTest { - val presenter = createVoiceMessageComposerPresenter() + val presenter = createDefaultVoiceMessageComposerPresenter() moleculeFlow(RecompositionMode.Immediate) { presenter.present() }.test { @@ -344,7 +347,7 @@ class VoiceMessageComposerPresenterTest { @Test fun `present - send while playing`() = runTest { - val presenter = createVoiceMessageComposerPresenter() + val presenter = createDefaultVoiceMessageComposerPresenter() moleculeFlow(RecompositionMode.Immediate) { presenter.present() }.test { @@ -366,7 +369,7 @@ class VoiceMessageComposerPresenterTest { @Test fun `present - send recording before previous completed, waits`() = runTest { - val presenter = createVoiceMessageComposerPresenter() + val presenter = createDefaultVoiceMessageComposerPresenter() moleculeFlow(RecompositionMode.Immediate) { presenter.present() }.test { @@ -391,7 +394,7 @@ class VoiceMessageComposerPresenterTest { fun `present - send failures aren't tracked`() = runTest { // Let sending fail due to media preprocessing error mediaPreProcessor.givenResult(Result.failure(Exception())) - val presenter = createVoiceMessageComposerPresenter() + val presenter = createDefaultVoiceMessageComposerPresenter() moleculeFlow(RecompositionMode.Immediate) { presenter.present() }.test { @@ -415,7 +418,7 @@ class VoiceMessageComposerPresenterTest { @Test fun `present - send failures can be retried`() = runTest { // Let sending fail due to media preprocessing error - val presenter = createVoiceMessageComposerPresenter() + val presenter = createDefaultVoiceMessageComposerPresenter() moleculeFlow(RecompositionMode.Immediate) { presenter.present() }.test { @@ -444,7 +447,7 @@ class VoiceMessageComposerPresenterTest { @Test fun `present - send failures are displayed as an error dialog`() = runTest { - val presenter = createVoiceMessageComposerPresenter() + val presenter = createDefaultVoiceMessageComposerPresenter() moleculeFlow(RecompositionMode.Immediate) { presenter.present() }.test { @@ -479,7 +482,7 @@ class VoiceMessageComposerPresenterTest { @Test fun `present - send error - missing recording is tracked`() = runTest { - val presenter = createVoiceMessageComposerPresenter() + val presenter = createDefaultVoiceMessageComposerPresenter() moleculeFlow(RecompositionMode.Immediate) { presenter.present() }.test { @@ -500,7 +503,7 @@ class VoiceMessageComposerPresenterTest { fun `present - record error - security exceptions are tracked`() = runTest { val exception = SecurityException("") voiceRecorder.givenThrowsSecurityException(exception) - val presenter = createVoiceMessageComposerPresenter() + val presenter = createDefaultVoiceMessageComposerPresenter() moleculeFlow(RecompositionMode.Immediate) { presenter.present() }.test { @@ -522,7 +525,7 @@ class VoiceMessageComposerPresenterTest { val permissionsPresenter = createFakePermissionsPresenter( recordPermissionGranted = false, ) - val presenter = createVoiceMessageComposerPresenter( + val presenter = createDefaultVoiceMessageComposerPresenter( permissionsPresenter = permissionsPresenter, ) moleculeFlow(RecompositionMode.Immediate) { @@ -551,7 +554,7 @@ class VoiceMessageComposerPresenterTest { val permissionsPresenter = createFakePermissionsPresenter( recordPermissionGranted = false, ) - val presenter = createVoiceMessageComposerPresenter( + val presenter = createDefaultVoiceMessageComposerPresenter( permissionsPresenter = permissionsPresenter, ) moleculeFlow(RecompositionMode.Immediate) { @@ -585,7 +588,7 @@ class VoiceMessageComposerPresenterTest { val permissionsPresenter = createFakePermissionsPresenter( recordPermissionGranted = false, ) - val presenter = createVoiceMessageComposerPresenter( + val presenter = createDefaultVoiceMessageComposerPresenter( permissionsPresenter = permissionsPresenter, ) moleculeFlow(RecompositionMode.Immediate) { @@ -657,17 +660,22 @@ class VoiceMessageComposerPresenterTest { } } - private fun TestScope.createVoiceMessageComposerPresenter( + private fun TestScope.createDefaultVoiceMessageComposerPresenter( permissionsPresenter: PermissionsPresenter = createFakePermissionsPresenter(), - ): VoiceMessageComposerPresenter { - return VoiceMessageComposerPresenter( - backgroundScope, - voiceRecorder, - analyticsService, - mediaSender, + ): DefaultVoiceMessageComposerPresenter { + return DefaultVoiceMessageComposerPresenter( + sessionCoroutineScope = backgroundScope, + timelineMode = Timeline.Mode.Live, + voiceRecorder = voiceRecorder, + analyticsService = analyticsService, + mediaSenderFactory = object : MediaSender.Factory { + override fun create(timelineMode: Timeline.Mode): MediaSender { + return mediaSender + } + }, player = VoiceMessageComposerPlayer(FakeMediaPlayer(), this), messageComposerContext = messageComposerContext, - FakePermissionsPresenterFactory(permissionsPresenter), + permissionsPresenterFactory = FakePermissionsPresenterFactory(permissionsPresenter), ) } diff --git a/features/messages/test/build.gradle.kts b/features/messages/test/build.gradle.kts index 5e98674f4e..93f5166f29 100644 --- a/features/messages/test/build.gradle.kts +++ b/features/messages/test/build.gradle.kts @@ -15,7 +15,12 @@ android { dependencies { api(projects.features.messages.impl) - implementation(projects.libraries.matrix.api) + implementation(projects.libraries.matrix.test) + implementation(projects.libraries.mediaplayer.test) + implementation(projects.libraries.mediaupload.test) implementation(projects.libraries.mediaviewer.api) + implementation(projects.libraries.permissions.test) implementation(projects.libraries.preferences.api) + implementation(projects.libraries.voicerecorder.test) + implementation(projects.services.analytics.test) } diff --git a/features/messages/test/src/main/kotlin/io/element/android/features/messages/test/attachments/video/FakeVideoMetadataExtractor.kt b/features/messages/test/src/main/kotlin/io/element/android/features/messages/test/attachments/video/FakeVideoMetadataExtractor.kt index 54b27ac675..45d3e31dfb 100644 --- a/features/messages/test/src/main/kotlin/io/element/android/features/messages/test/attachments/video/FakeVideoMetadataExtractor.kt +++ b/features/messages/test/src/main/kotlin/io/element/android/features/messages/test/attachments/video/FakeVideoMetadataExtractor.kt @@ -10,14 +10,16 @@ package io.element.android.features.messages.test.attachments.video import android.net.Uri import android.util.Size import io.element.android.features.messages.impl.attachments.video.VideoMetadataExtractor +import kotlin.time.Duration +import kotlin.time.Duration.Companion.milliseconds class FakeVideoMetadataExtractor( private val sizeResult: Result = Result.success(Size(1, 1)), - private val duration: Result = Result.success(1L), + private val duration: Result = Result.success(1.milliseconds), ) : VideoMetadataExtractor { override fun getSize(): Result = sizeResult - override fun getDuration(): Result = duration + override fun getDuration(): Result = duration override fun close() = Unit } diff --git a/features/messages/test/src/main/kotlin/io/element/android/features/messages/test/timeline/voicemessages/composer/FakeDefaultVoiceMessageComposerPresenterFactory.kt b/features/messages/test/src/main/kotlin/io/element/android/features/messages/test/timeline/voicemessages/composer/FakeDefaultVoiceMessageComposerPresenterFactory.kt new file mode 100644 index 0000000000..da83fa69e2 --- /dev/null +++ b/features/messages/test/src/main/kotlin/io/element/android/features/messages/test/timeline/voicemessages/composer/FakeDefaultVoiceMessageComposerPresenterFactory.kt @@ -0,0 +1,52 @@ +/* + * Copyright 2025 New Vector Ltd. + * + * SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial + * Please see LICENSE files in the repository root for full details. + */ + +package io.element.android.features.messages.test.timeline.voicemessages.composer + +import io.element.android.features.messages.impl.voicemessages.composer.DefaultVoiceMessageComposerPresenter +import io.element.android.features.messages.impl.voicemessages.composer.VoiceMessageComposerPlayer +import io.element.android.features.messages.test.FakeMessageComposerContext +import io.element.android.libraries.matrix.api.timeline.Timeline +import io.element.android.libraries.matrix.test.room.FakeJoinedRoom +import io.element.android.libraries.mediaplayer.test.FakeMediaPlayer +import io.element.android.libraries.mediaupload.api.MediaSender +import io.element.android.libraries.mediaupload.test.FakeMediaOptimizationConfigProvider +import io.element.android.libraries.mediaupload.test.FakeMediaPreProcessor +import io.element.android.libraries.permissions.test.FakePermissionsPresenterFactory +import io.element.android.libraries.voicerecorder.test.FakeVoiceRecorder +import io.element.android.services.analytics.test.FakeAnalyticsService +import kotlinx.coroutines.CoroutineScope + +class FakeDefaultVoiceMessageComposerPresenterFactory( + private val sessionCoroutineScope: CoroutineScope, + private val mediaSender: MediaSender = MediaSender( + preProcessor = FakeMediaPreProcessor(), + room = FakeJoinedRoom(), + timelineMode = Timeline.Mode.Live, + mediaOptimizationConfigProvider = FakeMediaOptimizationConfigProvider(), + ), +) : DefaultVoiceMessageComposerPresenter.Factory { + override fun create(timelineMode: Timeline.Mode): DefaultVoiceMessageComposerPresenter { + return DefaultVoiceMessageComposerPresenter( + sessionCoroutineScope = sessionCoroutineScope, + timelineMode = timelineMode, + voiceRecorder = FakeVoiceRecorder(), + analyticsService = FakeAnalyticsService(), + mediaSenderFactory = object : MediaSender.Factory { + override fun create(timelineMode: Timeline.Mode): MediaSender { + return mediaSender + } + }, + player = VoiceMessageComposerPlayer( + mediaPlayer = FakeMediaPlayer(), + sessionCoroutineScope = sessionCoroutineScope, + ), + messageComposerContext = FakeMessageComposerContext(), + permissionsPresenterFactory = FakePermissionsPresenterFactory(), + ) + } +} diff --git a/features/migration/impl/build.gradle.kts b/features/migration/impl/build.gradle.kts index 878cf40d3a..12bf396e74 100644 --- a/features/migration/impl/build.gradle.kts +++ b/features/migration/impl/build.gradle.kts @@ -20,6 +20,7 @@ setupAnvil() dependencies { implementation(projects.features.migration.api) implementation(projects.libraries.architecture) + implementation(projects.libraries.androidutils) implementation(projects.libraries.preferences.impl) implementation(libs.androidx.datastore.preferences) implementation(projects.features.rageshake.api) diff --git a/features/migration/impl/src/main/kotlin/io/element/android/features/migration/impl/DefaultMigrationStore.kt b/features/migration/impl/src/main/kotlin/io/element/android/features/migration/impl/DefaultMigrationStore.kt index a79a073022..61a9ba69a4 100644 --- a/features/migration/impl/src/main/kotlin/io/element/android/features/migration/impl/DefaultMigrationStore.kt +++ b/features/migration/impl/src/main/kotlin/io/element/android/features/migration/impl/DefaultMigrationStore.kt @@ -7,27 +7,22 @@ package io.element.android.features.migration.impl -import android.content.Context -import androidx.datastore.core.DataStore -import androidx.datastore.preferences.core.Preferences import androidx.datastore.preferences.core.edit import androidx.datastore.preferences.core.intPreferencesKey -import androidx.datastore.preferences.preferencesDataStore 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.preferences.api.store.PreferenceDataStoreFactory import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.map import javax.inject.Inject -private val Context.dataStore: DataStore by preferencesDataStore(name = "elementx_migration") private val applicationMigrationVersion = intPreferencesKey("applicationMigrationVersion") @ContributesBinding(AppScope::class) class DefaultMigrationStore @Inject constructor( - @ApplicationContext context: Context, + preferenceDataStoreFactory: PreferenceDataStoreFactory, ) : MigrationStore { - private val store = context.dataStore + private val store = preferenceDataStoreFactory.create("elementx_migration") override suspend fun setApplicationMigrationVersion(version: Int) { store.edit { prefs -> diff --git a/features/poll/api/src/main/kotlin/io/element/android/features/poll/api/actions/EndPollAction.kt b/features/poll/api/src/main/kotlin/io/element/android/features/poll/api/actions/EndPollAction.kt index 127719bf27..8e5b5c6ba3 100644 --- a/features/poll/api/src/main/kotlin/io/element/android/features/poll/api/actions/EndPollAction.kt +++ b/features/poll/api/src/main/kotlin/io/element/android/features/poll/api/actions/EndPollAction.kt @@ -8,7 +8,8 @@ package io.element.android.features.poll.api.actions import io.element.android.libraries.matrix.api.core.EventId +import io.element.android.libraries.matrix.api.timeline.Timeline interface EndPollAction { - suspend fun execute(pollStartId: EventId): Result + suspend fun execute(timeline: Timeline, pollStartId: EventId): Result } diff --git a/features/poll/api/src/main/kotlin/io/element/android/features/poll/api/actions/SendPollResponseAction.kt b/features/poll/api/src/main/kotlin/io/element/android/features/poll/api/actions/SendPollResponseAction.kt index 9b1e403e7f..49da04829b 100644 --- a/features/poll/api/src/main/kotlin/io/element/android/features/poll/api/actions/SendPollResponseAction.kt +++ b/features/poll/api/src/main/kotlin/io/element/android/features/poll/api/actions/SendPollResponseAction.kt @@ -8,7 +8,12 @@ package io.element.android.features.poll.api.actions import io.element.android.libraries.matrix.api.core.EventId +import io.element.android.libraries.matrix.api.timeline.Timeline interface SendPollResponseAction { - suspend fun execute(pollStartId: EventId, answerId: String): Result + suspend fun execute( + timeline: Timeline, + pollStartId: EventId, + answerId: String + ): Result } diff --git a/features/poll/api/src/main/kotlin/io/element/android/features/poll/api/create/CreatePollEntryPoint.kt b/features/poll/api/src/main/kotlin/io/element/android/features/poll/api/create/CreatePollEntryPoint.kt index 7b508511ed..348f2f6c60 100644 --- a/features/poll/api/src/main/kotlin/io/element/android/features/poll/api/create/CreatePollEntryPoint.kt +++ b/features/poll/api/src/main/kotlin/io/element/android/features/poll/api/create/CreatePollEntryPoint.kt @@ -10,9 +10,11 @@ package io.element.android.features.poll.api.create import com.bumble.appyx.core.modality.BuildContext import com.bumble.appyx.core.node.Node import io.element.android.libraries.architecture.FeatureEntryPoint +import io.element.android.libraries.matrix.api.timeline.Timeline interface CreatePollEntryPoint : FeatureEntryPoint { data class Params( + val timelineMode: Timeline.Mode, val mode: CreatePollMode, ) diff --git a/features/poll/api/src/main/res/values-eu/translations.xml b/features/poll/api/src/main/res/values-eu/translations.xml new file mode 100644 index 0000000000..07f2180cc2 --- /dev/null +++ b/features/poll/api/src/main/res/values-eu/translations.xml @@ -0,0 +1,5 @@ + + + "Aurreko hautaketa kenduko du" + "Erantzun hau gailendu da" + diff --git a/features/poll/api/src/main/res/values-nb/translations.xml b/features/poll/api/src/main/res/values-nb/translations.xml index 332f319e7c..8b81fd3586 100644 --- a/features/poll/api/src/main/res/values-nb/translations.xml +++ b/features/poll/api/src/main/res/values-nb/translations.xml @@ -4,5 +4,6 @@ "%1$d prosent av totalt antall stemmer" "%1$d prosent av totalt antall stemmer" + "Vil fjerne forrige valg" "Dette er vinnersvaret" diff --git a/features/poll/api/src/main/res/values-nl/translations.xml b/features/poll/api/src/main/res/values-nl/translations.xml new file mode 100644 index 0000000000..0bc6a6ebf2 --- /dev/null +++ b/features/poll/api/src/main/res/values-nl/translations.xml @@ -0,0 +1,4 @@ + + + "Verwijdert de vorige selectie" + diff --git a/features/poll/api/src/main/res/values-sv/translations.xml b/features/poll/api/src/main/res/values-sv/translations.xml index 54b7f62d01..e04a499624 100644 --- a/features/poll/api/src/main/res/values-sv/translations.xml +++ b/features/poll/api/src/main/res/values-sv/translations.xml @@ -4,5 +4,6 @@ "%1$d procent av totala röster" "%1$d procent av totala röster" + "Kommer att ta bort föregående val" "Detta är det vinnande svaret" diff --git a/features/poll/api/src/main/res/values-uz/translations.xml b/features/poll/api/src/main/res/values-uz/translations.xml new file mode 100644 index 0000000000..6e1a16a013 --- /dev/null +++ b/features/poll/api/src/main/res/values-uz/translations.xml @@ -0,0 +1,5 @@ + + + "Oldingi tanlov olib tashlanadi" + "Bu g\'alaba qozongan javob" + diff --git a/features/poll/api/src/main/res/values-zh-rTW/translations.xml b/features/poll/api/src/main/res/values-zh-rTW/translations.xml new file mode 100644 index 0000000000..da6b7eb524 --- /dev/null +++ b/features/poll/api/src/main/res/values-zh-rTW/translations.xml @@ -0,0 +1,8 @@ + + + + "總票數的百分之 %1$d" + + "將會移除先前的選擇" + "這是得票數最高的選項" + diff --git a/features/poll/impl/src/main/kotlin/io/element/android/features/poll/impl/actions/DefaultEndPollAction.kt b/features/poll/impl/src/main/kotlin/io/element/android/features/poll/impl/actions/DefaultEndPollAction.kt index ea11ef918e..1bb0d87405 100644 --- a/features/poll/impl/src/main/kotlin/io/element/android/features/poll/impl/actions/DefaultEndPollAction.kt +++ b/features/poll/impl/src/main/kotlin/io/element/android/features/poll/impl/actions/DefaultEndPollAction.kt @@ -12,17 +12,16 @@ import im.vector.app.features.analytics.plan.PollEnd import io.element.android.features.poll.api.actions.EndPollAction import io.element.android.libraries.di.RoomScope import io.element.android.libraries.matrix.api.core.EventId -import io.element.android.libraries.matrix.api.room.JoinedRoom +import io.element.android.libraries.matrix.api.timeline.Timeline import io.element.android.services.analytics.api.AnalyticsService import javax.inject.Inject @ContributesBinding(RoomScope::class) class DefaultEndPollAction @Inject constructor( - private val room: JoinedRoom, private val analyticsService: AnalyticsService, ) : EndPollAction { - override suspend fun execute(pollStartId: EventId): Result { - return room.liveTimeline.endPoll( + override suspend fun execute(timeline: Timeline, pollStartId: EventId): Result { + return timeline.endPoll( pollStartId = pollStartId, text = "The poll with event id: $pollStartId has ended." ).onSuccess { diff --git a/features/poll/impl/src/main/kotlin/io/element/android/features/poll/impl/actions/DefaultSendPollResponseAction.kt b/features/poll/impl/src/main/kotlin/io/element/android/features/poll/impl/actions/DefaultSendPollResponseAction.kt index 4f1f29df46..757fe1803e 100644 --- a/features/poll/impl/src/main/kotlin/io/element/android/features/poll/impl/actions/DefaultSendPollResponseAction.kt +++ b/features/poll/impl/src/main/kotlin/io/element/android/features/poll/impl/actions/DefaultSendPollResponseAction.kt @@ -12,17 +12,16 @@ import im.vector.app.features.analytics.plan.PollVote import io.element.android.features.poll.api.actions.SendPollResponseAction import io.element.android.libraries.di.RoomScope import io.element.android.libraries.matrix.api.core.EventId -import io.element.android.libraries.matrix.api.room.JoinedRoom +import io.element.android.libraries.matrix.api.timeline.Timeline import io.element.android.services.analytics.api.AnalyticsService import javax.inject.Inject @ContributesBinding(RoomScope::class) class DefaultSendPollResponseAction @Inject constructor( - private val room: JoinedRoom, private val analyticsService: AnalyticsService, ) : SendPollResponseAction { - override suspend fun execute(pollStartId: EventId, answerId: String): Result { - return room.liveTimeline.sendPollResponse( + override suspend fun execute(timeline: Timeline, pollStartId: EventId, answerId: String): Result { + return timeline.sendPollResponse( pollStartId = pollStartId, answers = listOf(answerId), ).onSuccess { diff --git a/features/poll/impl/src/main/kotlin/io/element/android/features/poll/impl/create/CreatePollNode.kt b/features/poll/impl/src/main/kotlin/io/element/android/features/poll/impl/create/CreatePollNode.kt index 5a86e476a9..1a397b96e6 100644 --- a/features/poll/impl/src/main/kotlin/io/element/android/features/poll/impl/create/CreatePollNode.kt +++ b/features/poll/impl/src/main/kotlin/io/element/android/features/poll/impl/create/CreatePollNode.kt @@ -21,6 +21,7 @@ import io.element.android.features.poll.api.create.CreatePollMode import io.element.android.libraries.architecture.NodeInputs import io.element.android.libraries.architecture.inputs import io.element.android.libraries.di.RoomScope +import io.element.android.libraries.matrix.api.timeline.Timeline import io.element.android.services.analytics.api.AnalyticsService import java.util.concurrent.atomic.AtomicBoolean @@ -31,7 +32,7 @@ class CreatePollNode @AssistedInject constructor( presenterFactory: CreatePollPresenter.Factory, analyticsService: AnalyticsService, ) : Node(buildContext, plugins = plugins) { - data class Inputs(val mode: CreatePollMode) : NodeInputs + data class Inputs(val mode: CreatePollMode, val timelineMode: Timeline.Mode) : NodeInputs private val inputs: Inputs = inputs() @@ -44,6 +45,7 @@ class CreatePollNode @AssistedInject constructor( } }, mode = inputs.mode, + timelineMode = inputs.timelineMode, ) init { diff --git a/features/poll/impl/src/main/kotlin/io/element/android/features/poll/impl/create/CreatePollPresenter.kt b/features/poll/impl/src/main/kotlin/io/element/android/features/poll/impl/create/CreatePollPresenter.kt index f1d9b780ee..f9f8e59ea8 100644 --- a/features/poll/impl/src/main/kotlin/io/element/android/features/poll/impl/create/CreatePollPresenter.kt +++ b/features/poll/impl/src/main/kotlin/io/element/android/features/poll/impl/create/CreatePollPresenter.kt @@ -29,6 +29,7 @@ import io.element.android.libraries.architecture.Presenter import io.element.android.libraries.matrix.api.poll.PollAnswer import io.element.android.libraries.matrix.api.poll.PollKind import io.element.android.libraries.matrix.api.poll.isDisclosed +import io.element.android.libraries.matrix.api.timeline.Timeline import io.element.android.services.analytics.api.AnalyticsService import kotlinx.collections.immutable.ImmutableList import kotlinx.collections.immutable.toImmutableList @@ -37,17 +38,24 @@ import kotlinx.coroutines.launch import timber.log.Timber class CreatePollPresenter @AssistedInject constructor( - private val repository: PollRepository, + repositoryFactory: PollRepository.Factory, private val analyticsService: AnalyticsService, private val messageComposerContext: MessageComposerContext, @Assisted private val navigateUp: () -> Unit, @Assisted private val mode: CreatePollMode, + @Assisted private val timelineMode: Timeline.Mode, ) : Presenter { @AssistedFactory interface Factory { - fun create(backNavigator: () -> Unit, mode: CreatePollMode): CreatePollPresenter + fun create( + timelineMode: Timeline.Mode, + backNavigator: () -> Unit, + mode: CreatePollMode + ): CreatePollPresenter } + private val repository = repositoryFactory.create(timelineMode) + @Composable override fun present(): CreatePollState { // The initial state of the form. In edit mode this will be populated with the poll being edited. diff --git a/features/poll/impl/src/main/kotlin/io/element/android/features/poll/impl/create/DefaultCreatePollEntryPoint.kt b/features/poll/impl/src/main/kotlin/io/element/android/features/poll/impl/create/DefaultCreatePollEntryPoint.kt index fd0e670fc3..019da10de9 100644 --- a/features/poll/impl/src/main/kotlin/io/element/android/features/poll/impl/create/DefaultCreatePollEntryPoint.kt +++ b/features/poll/impl/src/main/kotlin/io/element/android/features/poll/impl/create/DefaultCreatePollEntryPoint.kt @@ -23,7 +23,7 @@ class DefaultCreatePollEntryPoint @Inject constructor() : CreatePollEntryPoint { return object : CreatePollEntryPoint.NodeBuilder { override fun params(params: CreatePollEntryPoint.Params): CreatePollEntryPoint.NodeBuilder { - plugins += CreatePollNode.Inputs(mode = params.mode) + plugins += CreatePollNode.Inputs(timelineMode = params.timelineMode, mode = params.mode) return this } diff --git a/features/poll/impl/src/main/kotlin/io/element/android/features/poll/impl/data/PollRepository.kt b/features/poll/impl/src/main/kotlin/io/element/android/features/poll/impl/data/PollRepository.kt index 0fbdcdee36..ad73b0583f 100644 --- a/features/poll/impl/src/main/kotlin/io/element/android/features/poll/impl/data/PollRepository.kt +++ b/features/poll/impl/src/main/kotlin/io/element/android/features/poll/impl/data/PollRepository.kt @@ -7,24 +7,40 @@ package io.element.android.features.poll.impl.data +import dagger.assisted.Assisted +import dagger.assisted.AssistedFactory +import dagger.assisted.AssistedInject +import io.element.android.libraries.core.extensions.flatMap import io.element.android.libraries.core.extensions.runCatchingExceptions import io.element.android.libraries.matrix.api.core.EventId import io.element.android.libraries.matrix.api.poll.PollKind +import io.element.android.libraries.matrix.api.room.CreateTimelineParams import io.element.android.libraries.matrix.api.room.JoinedRoom import io.element.android.libraries.matrix.api.timeline.MatrixTimelineItem +import io.element.android.libraries.matrix.api.timeline.Timeline import io.element.android.libraries.matrix.api.timeline.TimelineProvider import io.element.android.libraries.matrix.api.timeline.getActiveTimeline import io.element.android.libraries.matrix.api.timeline.item.event.PollContent import io.element.android.libraries.matrix.api.timeline.item.event.toEventOrTransactionId +import kotlinx.coroutines.flow.MutableStateFlow +import kotlinx.coroutines.flow.StateFlow import kotlinx.coroutines.flow.first -import javax.inject.Inject -class PollRepository @Inject constructor( +class PollRepository @AssistedInject constructor( private val room: JoinedRoom, - private val timelineProvider: TimelineProvider, + private val defaultTimelineProvider: TimelineProvider, + @Assisted private val timelineMode: Timeline.Mode, ) { + @AssistedFactory + interface Factory { + fun create( + timelineMode: Timeline.Mode, + ): PollRepository + } + suspend fun getPoll(eventId: EventId): Result = runCatchingExceptions { - timelineProvider + getTimelineProvider() + .getOrThrow() .getActiveTimeline() .timelineItems .first() @@ -42,30 +58,51 @@ class PollRepository @Inject constructor( pollKind: PollKind, maxSelections: Int, ): Result = when (existingPollId) { - null -> room.liveTimeline.createPoll( - question = question, - answers = answers, - maxSelections = maxSelections, - pollKind = pollKind, - ) - else -> timelineProvider - .getActiveTimeline() - .editPoll( - pollStartId = existingPollId, - question = question, - answers = answers, - maxSelections = maxSelections, - pollKind = pollKind, - ) + null -> getTimelineProvider().flatMap { timelineProvider -> + timelineProvider + .getActiveTimeline() + .createPoll( + question = question, + answers = answers, + maxSelections = maxSelections, + pollKind = pollKind, + ) + } + else -> getTimelineProvider().flatMap { timelineProvider -> + timelineProvider.getActiveTimeline() + .editPoll( + pollStartId = existingPollId, + question = question, + answers = answers, + maxSelections = maxSelections, + pollKind = pollKind, + ) + } } suspend fun deletePoll( pollStartId: EventId, ): Result = - timelineProvider - .getActiveTimeline() - .redactEvent( - eventOrTransactionId = pollStartId.toEventOrTransactionId(), - reason = null, - ) + getTimelineProvider().flatMap { timelineProvider -> + timelineProvider.getActiveTimeline() + .redactEvent( + eventOrTransactionId = pollStartId.toEventOrTransactionId(), + reason = null, + ) + } + + private suspend fun getTimelineProvider(): Result { + return when (timelineMode) { + is Timeline.Mode.Thread -> { + val threadedTimelineResult = room.createTimeline(CreateTimelineParams.Threaded(timelineMode.threadRootId)) + threadedTimelineResult.map { threadedTimeline -> + object : TimelineProvider { + private val flow = MutableStateFlow(threadedTimeline) + override fun activeTimelineFlow(): StateFlow = flow + } + } + } + else -> Result.success(defaultTimelineProvider) + } + } } diff --git a/features/poll/impl/src/main/kotlin/io/element/android/features/poll/impl/history/PollHistoryFlowNode.kt b/features/poll/impl/src/main/kotlin/io/element/android/features/poll/impl/history/PollHistoryFlowNode.kt index 0f8cc5dc8f..48a222e0e7 100644 --- a/features/poll/impl/src/main/kotlin/io/element/android/features/poll/impl/history/PollHistoryFlowNode.kt +++ b/features/poll/impl/src/main/kotlin/io/element/android/features/poll/impl/history/PollHistoryFlowNode.kt @@ -25,6 +25,7 @@ import io.element.android.libraries.architecture.BaseFlowNode import io.element.android.libraries.architecture.createNode import io.element.android.libraries.di.RoomScope import io.element.android.libraries.matrix.api.core.EventId +import io.element.android.libraries.matrix.api.timeline.Timeline import kotlinx.parcelize.Parcelize @ContributesNode(RoomScope::class) @@ -52,7 +53,12 @@ class PollHistoryFlowNode @AssistedInject constructor( return when (navTarget) { is NavTarget.EditPoll -> { createPollEntryPoint.nodeBuilder(this, buildContext) - .params(CreatePollEntryPoint.Params(mode = CreatePollMode.EditPoll(eventId = navTarget.pollStartEventId))) + .params( + CreatePollEntryPoint.Params( + timelineMode = Timeline.Mode.Live, + mode = CreatePollMode.EditPoll(eventId = navTarget.pollStartEventId) + ) + ) .build() } NavTarget.Root -> { diff --git a/features/poll/impl/src/main/kotlin/io/element/android/features/poll/impl/history/PollHistoryPresenter.kt b/features/poll/impl/src/main/kotlin/io/element/android/features/poll/impl/history/PollHistoryPresenter.kt index e3d7632265..b144f31609 100644 --- a/features/poll/impl/src/main/kotlin/io/element/android/features/poll/impl/history/PollHistoryPresenter.kt +++ b/features/poll/impl/src/main/kotlin/io/element/android/features/poll/impl/history/PollHistoryPresenter.kt @@ -67,10 +67,14 @@ class PollHistoryPresenter @Inject constructor( coroutineScope.loadMore(timeline) } is PollHistoryEvents.SelectPollAnswer -> sessionCoroutineScope.launch { - sendPollResponseAction.execute(pollStartId = event.pollStartId, answerId = event.answerId) + sendPollResponseAction.execute( + timeline = timeline, + pollStartId = event.pollStartId, + answerId = event.answerId + ) } is PollHistoryEvents.EndPoll -> sessionCoroutineScope.launch { - endPollAction.execute(pollStartId = event.pollStartId) + endPollAction.execute(timeline = timeline, pollStartId = event.pollStartId) } is PollHistoryEvents.SelectFilter -> { activeFilter = event.filter diff --git a/features/poll/impl/src/main/res/values-zh-rTW/translations.xml b/features/poll/impl/src/main/res/values-zh-rTW/translations.xml index dd5b8eaf0f..5aa1693ef7 100644 --- a/features/poll/impl/src/main/res/values-zh-rTW/translations.xml +++ b/features/poll/impl/src/main/res/values-zh-rTW/translations.xml @@ -5,6 +5,7 @@ "隱藏票數" "選項 %1$d" "變更尚未儲存,您確定要返回嗎?" + "刪除選項 %1$s" "問題或主題" "投什麼?" "建立投票" diff --git a/features/poll/impl/src/test/kotlin/io/element/android/features/poll/impl/create/CreatePollPresenterTest.kt b/features/poll/impl/src/test/kotlin/io/element/android/features/poll/impl/create/CreatePollPresenterTest.kt index 67556886bc..6bec98f1b9 100644 --- a/features/poll/impl/src/test/kotlin/io/element/android/features/poll/impl/create/CreatePollPresenterTest.kt +++ b/features/poll/impl/src/test/kotlin/io/element/android/features/poll/impl/create/CreatePollPresenterTest.kt @@ -21,6 +21,7 @@ import io.element.android.features.poll.impl.anOngoingPollContent import io.element.android.features.poll.impl.data.PollRepository import io.element.android.libraries.matrix.api.core.EventId import io.element.android.libraries.matrix.api.poll.PollKind +import io.element.android.libraries.matrix.api.timeline.Timeline import io.element.android.libraries.matrix.api.timeline.item.event.EventOrTransactionId import io.element.android.libraries.matrix.api.timeline.item.event.PollContent import io.element.android.libraries.matrix.api.timeline.item.event.toEventOrTransactionId @@ -551,12 +552,18 @@ class CreatePollPresenterTest { private fun createCreatePollPresenter( mode: CreatePollMode = CreatePollMode.NewPoll, room: FakeJoinedRoom = fakeJoinedRoom, + timelineMode: Timeline.Mode = Timeline.Mode.Live, ): CreatePollPresenter = CreatePollPresenter( - repository = PollRepository(room, LiveTimelineProvider(room)), + repositoryFactory = object : PollRepository.Factory { + override fun create(timelineMode: Timeline.Mode): PollRepository { + return PollRepository(room, LiveTimelineProvider(room), timelineMode) + } + }, analyticsService = fakeAnalyticsService, messageComposerContext = fakeMessageComposerContext, navigateUp = { navUpInvocationsCount++ }, mode = mode, + timelineMode = timelineMode, ) } diff --git a/features/poll/test/src/main/kotlin/io/element/android/features/poll/test/actions/FakeEndPollAction.kt b/features/poll/test/src/main/kotlin/io/element/android/features/poll/test/actions/FakeEndPollAction.kt index 6da99ad3d8..872110d0b6 100644 --- a/features/poll/test/src/main/kotlin/io/element/android/features/poll/test/actions/FakeEndPollAction.kt +++ b/features/poll/test/src/main/kotlin/io/element/android/features/poll/test/actions/FakeEndPollAction.kt @@ -9,6 +9,7 @@ package io.element.android.features.poll.test.actions import io.element.android.features.poll.api.actions.EndPollAction import io.element.android.libraries.matrix.api.core.EventId +import io.element.android.libraries.matrix.api.timeline.Timeline class FakeEndPollAction : EndPollAction { private var executionCount = 0 @@ -17,7 +18,7 @@ class FakeEndPollAction : EndPollAction { assert(executionCount == count) } - override suspend fun execute(pollStartId: EventId): Result { + override suspend fun execute(timeline: Timeline, pollStartId: EventId): Result { executionCount++ return Result.success(Unit) } diff --git a/features/poll/test/src/main/kotlin/io/element/android/features/poll/test/actions/FakeSendPollResponseAction.kt b/features/poll/test/src/main/kotlin/io/element/android/features/poll/test/actions/FakeSendPollResponseAction.kt index 859083a05c..f77d974178 100644 --- a/features/poll/test/src/main/kotlin/io/element/android/features/poll/test/actions/FakeSendPollResponseAction.kt +++ b/features/poll/test/src/main/kotlin/io/element/android/features/poll/test/actions/FakeSendPollResponseAction.kt @@ -9,6 +9,7 @@ package io.element.android.features.poll.test.actions import io.element.android.features.poll.api.actions.SendPollResponseAction import io.element.android.libraries.matrix.api.core.EventId +import io.element.android.libraries.matrix.api.timeline.Timeline class FakeSendPollResponseAction : SendPollResponseAction { private var executionCount = 0 @@ -17,7 +18,7 @@ class FakeSendPollResponseAction : SendPollResponseAction { assert(executionCount == count) } - override suspend fun execute(pollStartId: EventId, answerId: String): Result { + override suspend fun execute(timeline: Timeline, pollStartId: EventId, answerId: String): Result { executionCount++ return Result.success(Unit) } diff --git a/features/preferences/impl/src/main/res/values-da/translations.xml b/features/preferences/impl/src/main/res/values-da/translations.xml index c2edfc3d44..4a29222be7 100644 --- a/features/preferences/impl/src/main/res/values-da/translations.xml +++ b/features/preferences/impl/src/main/res/values-da/translations.xml @@ -13,6 +13,13 @@ "Upload fotos og videoer hurtigere, og reducér dataforbrug" "Optimér mediekvaliteten" "Moderation og sikkerhed" + "Optimér automatisk billeder for hurtigere uploads og mindre filstørrelser." + "Optimér kvaliteten på overførte billeder" + "%1$s. Tryk her for at ændre." + "Høj (1080p)" + "Lav (480p)" + "Standard (720p)" + "Kvalitet på overførte videoer" "Udbyder af push-notifikationer" "Deaktiver rich text-editoren for at skrive Markdown manuelt." "Kvitteringer​•​for​•​læsning" diff --git a/features/preferences/impl/src/main/res/values-en-rUS/translations.xml b/features/preferences/impl/src/main/res/values-en-rUS/translations.xml index 796472c124..b1f615e697 100644 --- a/features/preferences/impl/src/main/res/values-en-rUS/translations.xml +++ b/features/preferences/impl/src/main/res/values-en-rUS/translations.xml @@ -1,4 +1,6 @@ "Optimize media quality" + "Automatically optimize images for faster uploads and smaller file sizes." + "Optimize image upload quality" diff --git a/features/preferences/impl/src/main/res/values-et/translations.xml b/features/preferences/impl/src/main/res/values-et/translations.xml index e9ee78f429..9b2f04a9f7 100644 --- a/features/preferences/impl/src/main/res/values-et/translations.xml +++ b/features/preferences/impl/src/main/res/values-et/translations.xml @@ -13,6 +13,13 @@ "Sellega laadid fotosid ja videoid kiiremini üles ning vähendad andmemahtu" "Optimeeri meedia kvaliteeti" "Modereerimine ja ohutus" + "Kiirema üleslaadimise ja väiksemate failide nimel optimeeri pilte automaatselt." + "Optimeeri üleslaaditavate piltide kvaliteeti." + "%1$s. Muutmiseks klõpsi siin." + "Kõrge (1080p)" + "Madal (480p)" + "Standard (720p)" + "Üleslaaditavate videote kvaliteet" "Tõuketeavituste pakkuja" "Kui soovid Markdown-vormingut käsitsi lisada, siis lülita vormindatud teksti toimeti välja." "Lugemisteatised" diff --git a/features/preferences/impl/src/main/res/values-eu/translations.xml b/features/preferences/impl/src/main/res/values-eu/translations.xml index b624cd87f0..42a90e0328 100644 --- a/features/preferences/impl/src/main/res/values-eu/translations.xml +++ b/features/preferences/impl/src/main/res/values-eu/translations.xml @@ -6,12 +6,20 @@ "Garatzaile modua" "Gaitu garatzaileentzako ezaugarrietarako eta funtzionalitateetarako sarbidea izateko." "Igo argazkiak eta bideoak azkarrago eta murriztu datuen erabilera" + "Optimizatu multimediaren kalitatea" "Moderazioa eta Segurtasuna" + "Optimizatu irudien igoera-kalitatea" + "Handia (1080p)" + "Txikia (480p)" + "Ertaina (720p)" + "Bideoen igoera-kalitatea" "Push jakinarazpen hornitzailea" "Desgaitu testu aberatseko editorea Markdown eskuz idazteko." "Irakurketa-agiriak" "Desaktibatutaz gero, ez zaizkio inori bidaliko mezuak irakurri izanaren agiriak. Beste erabiltzaile batzuen irakurketa-agiriak jasoko dituzu oraindik ere." "Partekatu presentzia" + "Ezkutatu beti" + "Erakutsi beti" "Gaitu aukera mezuaren iturria denbora-lerroan ikusteko." "Ez duzu erabiltzailerik blokeatu" "Desblokeatu" diff --git a/features/preferences/impl/src/main/res/values-fr/translations.xml b/features/preferences/impl/src/main/res/values-fr/translations.xml index 1180454d03..dbb0b13326 100644 --- a/features/preferences/impl/src/main/res/values-fr/translations.xml +++ b/features/preferences/impl/src/main/res/values-fr/translations.xml @@ -13,6 +13,13 @@ "Téléchargez des photos et des vidéos plus rapidement et réduisez la consommation de données" "Optimisez la qualité des médias" "Modération et sécurité" + "Optimiser automatiquement les images pour des envois plus rapides et des tailles de fichiers plus petites." + "Optimiser la qualité des images envoyées" + "%1$s. Appuyez ici pour changer." + "Haute définition (1080p)" + "Basse résolution (480p)" + "Résolution standard (720p)" + "Qualité des vidéos envoyées" "Fournisseur de Push" "Désactivez l’éditeur de texte enrichi pour saisir manuellement du Markdown." "Accusés de lecture" diff --git a/features/preferences/impl/src/main/res/values-sv/translations.xml b/features/preferences/impl/src/main/res/values-sv/translations.xml index 831280255c..e25e36a44f 100644 --- a/features/preferences/impl/src/main/res/values-sv/translations.xml +++ b/features/preferences/impl/src/main/res/values-sv/translations.xml @@ -13,6 +13,13 @@ "Ladda upp foton och videor snabbare och minska dataanvändningen" "Optimera mediekvaliteten" "Moderering och säkerhet" + "Optimera bilder automatiskt för snabbare uppladdningar och mindre filstorlekar." + "Optimera bilduppladdningskvalitet" + "%1$s. Tryck här för att ändra." + "Hög (1080p)" + "Låg (480p)" + "Standard (720p)" + "Videouppladdningskvalitet" "Pushnotisleverantör" "Inaktivera rik-text-redigeraren för att skriva Markdown manuellt." "Läskvitton" diff --git a/features/preferences/impl/src/main/res/values-uk/translations.xml b/features/preferences/impl/src/main/res/values-uk/translations.xml index 22ca6bbc22..ba246e61f3 100644 --- a/features/preferences/impl/src/main/res/values-uk/translations.xml +++ b/features/preferences/impl/src/main/res/values-uk/translations.xml @@ -13,6 +13,10 @@ "Швидше завантажуйте фотографії та відео та зменшуйте використання даних" "Оптимізуйте медіаякість" "Модерування й безпека" + "Висока (1080p)" + "Низька (480p)" + "Стандартна (720p)" + "Якість вивантаження відео" "Постачальник push-сповіщень" "Вимкніть редактор розширеного тексту, щоб вводити Markdown вручну." "Читати журнали" diff --git a/features/preferences/impl/src/main/res/values-uz/translations.xml b/features/preferences/impl/src/main/res/values-uz/translations.xml index e626620468..d8b27d0b5c 100644 --- a/features/preferences/impl/src/main/res/values-uz/translations.xml +++ b/features/preferences/impl/src/main/res/values-uz/translations.xml @@ -5,6 +5,7 @@ "Ishlab chiquvchilar uchun xususiyatlar va funksiyalarga kirishni yoqing." "Maxsus element qo‘ng‘iroqlar bazasi URL manzili" "Element qo\'ng\'irog\'iga maxsus asosiy url or\'natish" + "URL noto‘g‘ri, iltimos, protokol (http/https) va to‘g‘ri manzilni kiritganingizga ishonch hosil qiling." "Boy matn muharriri o\'chiring Markdown bilan qo\'lda yozish uchun" "Blokdan chiqarish" "Ulardan kelgan barcha xabarlarni yana koʻrishingiz mumkin boʻladi." 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 b332624f13..668202a193 100644 --- a/features/preferences/impl/src/main/res/values-zh/translations.xml +++ b/features/preferences/impl/src/main/res/values-zh/translations.xml @@ -8,6 +8,8 @@ "自定义 Element Call URL" "为 Element 通话设置根 URL。" "URL 无效,请确保包含协议(http/https)和正确的地址。" + "在房间邀请请求中隐藏头像" + "在时间轴中隐藏媒体预览" "针对上传进行优化" "媒体" "通知推送提供者" @@ -16,6 +18,11 @@ "关闭后已读回执将不会发送给他人,但仍能收到他人的已读回执。" "分享在线状态" "关闭后将无法发送或接收已读回执、输入通知" + "始终隐藏" + "始终显示" + "在私人房间" + "随时可以通过点击隐藏的媒体来显示它" + "在时间轴中显示媒体" "启用在时间轴中查看消息源码的选项。" "您没有屏蔽用户" "解封" @@ -55,6 +62,7 @@ "系统设置" "系统通知已关闭" "通知" + "推送历史记录" "排查问题" "排查通知问题" diff --git a/features/rageshake/impl/build.gradle.kts b/features/rageshake/impl/build.gradle.kts index addfe3d794..0a3b4577f0 100644 --- a/features/rageshake/impl/build.gradle.kts +++ b/features/rageshake/impl/build.gradle.kts @@ -33,6 +33,7 @@ dependencies { implementation(projects.libraries.network) implementation(projects.libraries.architecture) implementation(projects.libraries.designsystem) + implementation(projects.libraries.preferences.api) implementation(projects.libraries.uiStrings) implementation(projects.libraries.sessionStorage.api) implementation(projects.libraries.matrix.api) @@ -56,6 +57,7 @@ dependencies { testImplementation(projects.libraries.sessionStorage.implMemory) testImplementation(projects.libraries.sessionStorage.test) testImplementation(projects.features.rageshake.test) + testImplementation(projects.libraries.preferences.test) testImplementation(projects.tests.testutils) testImplementation(projects.services.toolbox.test) testImplementation(libs.network.mockwebserver) diff --git a/features/rageshake/impl/src/main/kotlin/io/element/android/features/rageshake/impl/crash/PreferencesCrashDataStore.kt b/features/rageshake/impl/src/main/kotlin/io/element/android/features/rageshake/impl/crash/PreferencesCrashDataStore.kt index 0b86bb4ef0..88f3b5ce0e 100644 --- a/features/rageshake/impl/src/main/kotlin/io/element/android/features/rageshake/impl/crash/PreferencesCrashDataStore.kt +++ b/features/rageshake/impl/src/main/kotlin/io/element/android/features/rageshake/impl/crash/PreferencesCrashDataStore.kt @@ -7,32 +7,26 @@ package io.element.android.features.rageshake.impl.crash -import android.content.Context -import androidx.datastore.core.DataStore -import androidx.datastore.preferences.core.Preferences import androidx.datastore.preferences.core.booleanPreferencesKey import androidx.datastore.preferences.core.edit import androidx.datastore.preferences.core.stringPreferencesKey -import androidx.datastore.preferences.preferencesDataStore import com.squareup.anvil.annotations.ContributesBinding import io.element.android.libraries.core.bool.orFalse import io.element.android.libraries.di.AppScope -import io.element.android.libraries.di.ApplicationContext +import io.element.android.libraries.preferences.api.store.PreferenceDataStoreFactory import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.map import kotlinx.coroutines.runBlocking import javax.inject.Inject -private val Context.dataStore: DataStore by preferencesDataStore(name = "elementx_crash") - private val appHasCrashedKey = booleanPreferencesKey("appHasCrashed") private val crashDataKey = stringPreferencesKey("crashData") @ContributesBinding(AppScope::class) class PreferencesCrashDataStore @Inject constructor( - @ApplicationContext context: Context + preferenceDataStoreFactory: PreferenceDataStoreFactory, ) : CrashDataStore { - private val store = context.dataStore + private val store = preferenceDataStoreFactory.create("elementx_crash") override fun setCrashData(crashData: String) { // Must block diff --git a/features/rageshake/impl/src/main/kotlin/io/element/android/features/rageshake/impl/crash/VectorUncaughtExceptionHandler.kt b/features/rageshake/impl/src/main/kotlin/io/element/android/features/rageshake/impl/crash/VectorUncaughtExceptionHandler.kt index ca310cedad..e41583b61c 100644 --- a/features/rageshake/impl/src/main/kotlin/io/element/android/features/rageshake/impl/crash/VectorUncaughtExceptionHandler.kt +++ b/features/rageshake/impl/src/main/kotlin/io/element/android/features/rageshake/impl/crash/VectorUncaughtExceptionHandler.kt @@ -7,7 +7,6 @@ package io.element.android.features.rageshake.impl.crash -import android.content.Context import android.os.Build import io.element.android.libraries.core.data.tryOrNull import timber.log.Timber @@ -15,9 +14,8 @@ import java.io.PrintWriter import java.io.StringWriter class VectorUncaughtExceptionHandler( - context: Context + private val preferencesCrashDataStore: PreferencesCrashDataStore, ) : Thread.UncaughtExceptionHandler { - private val crashDataStore = PreferencesCrashDataStore(context) private var previousHandler: Thread.UncaughtExceptionHandler? = null /** @@ -65,7 +63,7 @@ class VectorUncaughtExceptionHandler( append(sw.buffer.toString()) } Timber.e("FATAL EXCEPTION $bugDescription") - crashDataStore.setCrashData(bugDescription) + preferencesCrashDataStore.setCrashData(bugDescription) // Show the classical system popup previousHandler?.uncaughtException(thread, throwable) } diff --git a/features/rageshake/impl/src/main/kotlin/io/element/android/features/rageshake/impl/di/RageshakeBindings.kt b/features/rageshake/impl/src/main/kotlin/io/element/android/features/rageshake/impl/di/RageshakeBindings.kt new file mode 100644 index 0000000000..dc603f7b8f --- /dev/null +++ b/features/rageshake/impl/src/main/kotlin/io/element/android/features/rageshake/impl/di/RageshakeBindings.kt @@ -0,0 +1,17 @@ +/* + * Copyright 2025 New Vector Ltd. + * + * SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial + * Please see LICENSE files in the repository root for full details. + */ + +package io.element.android.features.rageshake.impl.di + +import com.squareup.anvil.annotations.ContributesTo +import io.element.android.features.rageshake.impl.crash.PreferencesCrashDataStore +import io.element.android.libraries.di.AppScope + +@ContributesTo(AppScope::class) +interface RageshakeBindings { + fun preferencesCrashDataStore(): PreferencesCrashDataStore +} diff --git a/features/rageshake/impl/src/main/kotlin/io/element/android/features/rageshake/impl/rageshake/PreferencesRageshakeDataStore.kt b/features/rageshake/impl/src/main/kotlin/io/element/android/features/rageshake/impl/rageshake/PreferencesRageshakeDataStore.kt index 9d7171b8a0..0642f20e12 100644 --- a/features/rageshake/impl/src/main/kotlin/io/element/android/features/rageshake/impl/rageshake/PreferencesRageshakeDataStore.kt +++ b/features/rageshake/impl/src/main/kotlin/io/element/android/features/rageshake/impl/rageshake/PreferencesRageshakeDataStore.kt @@ -7,31 +7,25 @@ package io.element.android.features.rageshake.impl.rageshake -import android.content.Context -import androidx.datastore.core.DataStore -import androidx.datastore.preferences.core.Preferences import androidx.datastore.preferences.core.booleanPreferencesKey import androidx.datastore.preferences.core.edit import androidx.datastore.preferences.core.floatPreferencesKey -import androidx.datastore.preferences.preferencesDataStore import com.squareup.anvil.annotations.ContributesBinding import io.element.android.libraries.core.bool.orFalse import io.element.android.libraries.di.AppScope -import io.element.android.libraries.di.ApplicationContext +import io.element.android.libraries.preferences.api.store.PreferenceDataStoreFactory import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.map import javax.inject.Inject -private val Context.dataStore: DataStore by preferencesDataStore(name = "elementx_rageshake") - private val enabledKey = booleanPreferencesKey("enabled") private val sensitivityKey = floatPreferencesKey("sensitivity") @ContributesBinding(AppScope::class) class PreferencesRageshakeDataStore @Inject constructor( - @ApplicationContext context: Context + preferenceDataStoreFactory: PreferenceDataStoreFactory, ) : RageshakeDataStore { - private val store = context.dataStore + private val store = preferenceDataStoreFactory.create("elementx_rageshake") override fun isEnabled(): Flow { return store.data.map { prefs -> diff --git a/features/rageshake/impl/src/main/res/values-zh-rTW/translations.xml b/features/rageshake/impl/src/main/res/values-zh-rTW/translations.xml index cc2c14d907..2105ab1697 100644 --- a/features/rageshake/impl/src/main/res/values-zh-rTW/translations.xml +++ b/features/rageshake/impl/src/main/res/values-zh-rTW/translations.xml @@ -10,6 +10,7 @@ "您的描述太短了,請提供更多細節。謝謝!" "傳送當機紀錄" "提供日誌" + "您的紀錄檔太大了,無法包含在此報告中,請透過其他方式傳送給我們。" "傳送螢幕截圖" "紀錄檔將包含在您的訊息中以確保一切運作正常。要在不包含紀錄檔的情況下傳送訊息,請關閉此設定。" "%1$s 上次使用時當機了。您想要與我們分享當機報告嗎?" diff --git a/features/rageshake/impl/src/main/res/values-zh/translations.xml b/features/rageshake/impl/src/main/res/values-zh/translations.xml index 59da17e82d..80125d638a 100644 --- a/features/rageshake/impl/src/main/res/values-zh/translations.xml +++ b/features/rageshake/impl/src/main/res/values-zh/translations.xml @@ -10,6 +10,7 @@ "描述太短,请提供详细情况。谢谢!" "发送崩溃日志" "允许日志" + "日志文件过大,无法包含在本报告中,请通过其他方式发送给我们。" "发送屏幕截图" "为确认一切正常运行,您的消息中将包含日志。如要发送不带日志的消息,请关闭此设置。" "%1$s 上次使用时崩溃了。想和我们分享崩溃报告吗?" diff --git a/features/rageshake/impl/src/test/kotlin/io/element/android/features/rageshake/impl/crash/VectorUncaughtExceptionHandlerTest.kt b/features/rageshake/impl/src/test/kotlin/io/element/android/features/rageshake/impl/crash/VectorUncaughtExceptionHandlerTest.kt index f9f1aa72e4..f19362f99c 100644 --- a/features/rageshake/impl/src/test/kotlin/io/element/android/features/rageshake/impl/crash/VectorUncaughtExceptionHandlerTest.kt +++ b/features/rageshake/impl/src/test/kotlin/io/element/android/features/rageshake/impl/crash/VectorUncaughtExceptionHandlerTest.kt @@ -9,28 +9,28 @@ package io.element.android.features.rageshake.impl.crash import com.google.common.truth.Truth.assertThat import io.element.android.libraries.matrix.test.AN_EXCEPTION +import io.element.android.libraries.preferences.test.FakePreferenceDataStoreFactory import kotlinx.coroutines.flow.first import kotlinx.coroutines.test.runTest import org.junit.Test import org.junit.runner.RunWith import org.robolectric.RobolectricTestRunner -import org.robolectric.RuntimeEnvironment @RunWith(RobolectricTestRunner::class) class VectorUncaughtExceptionHandlerTest { @Test fun `activate should change the default handler`() { - val sut = VectorUncaughtExceptionHandler(RuntimeEnvironment.getApplication()) + val sut = VectorUncaughtExceptionHandler(PreferencesCrashDataStore(FakePreferenceDataStoreFactory())) sut.activate() assertThat(Thread.getDefaultUncaughtExceptionHandler()).isInstanceOf(VectorUncaughtExceptionHandler::class.java) } @Test fun `uncaught exception`() = runTest { - val crashDataStore = PreferencesCrashDataStore(RuntimeEnvironment.getApplication()) + val crashDataStore = PreferencesCrashDataStore(FakePreferenceDataStoreFactory()) assertThat(crashDataStore.appHasCrashed().first()).isFalse() assertThat(crashDataStore.crashInfo().first()).isEmpty() - val sut = VectorUncaughtExceptionHandler(RuntimeEnvironment.getApplication()) + val sut = VectorUncaughtExceptionHandler(crashDataStore) sut.uncaughtException(Thread(), AN_EXCEPTION) assertThat(crashDataStore.appHasCrashed().first()).isTrue() val crashInfo = crashDataStore.crashInfo().first() diff --git a/features/reportroom/impl/src/main/res/values-zh/translations.xml b/features/reportroom/impl/src/main/res/values-zh/translations.xml new file mode 100644 index 0000000000..40a0b5f1b0 --- /dev/null +++ b/features/reportroom/impl/src/main/res/values-zh/translations.xml @@ -0,0 +1,8 @@ + + + "您的报告已成功提交,但在尝试离开房间时遇到了问题。请重试。" + "无法离开房间" + "向管理员举报此房间。如果信息已加密,管理员将无法读取。" + "描述举报的原因…" + "举报房间" + diff --git a/features/roomaliasresolver/impl/src/main/res/values-zh/translations.xml b/features/roomaliasresolver/impl/src/main/res/values-zh/translations.xml index 633d2131c2..52934b6a08 100644 --- a/features/roomaliasresolver/impl/src/main/res/values-zh/translations.xml +++ b/features/roomaliasresolver/impl/src/main/res/values-zh/translations.xml @@ -1,4 +1,5 @@ + "无法显示此房间预览" "无法解析聊天室别名。" diff --git a/features/roomdetails/impl/build.gradle.kts b/features/roomdetails/impl/build.gradle.kts index ad45eda8fc..302ae7d8c6 100644 --- a/features/roomdetails/impl/build.gradle.kts +++ b/features/roomdetails/impl/build.gradle.kts @@ -44,7 +44,7 @@ dependencies { api(projects.services.apperror.api) implementation(libs.coil.compose) implementation(projects.features.call.api) - implementation(projects.features.createroom.api) + implementation(projects.features.startchat.api) implementation(projects.features.leaveroom.api) implementation(projects.features.userprofile.shared) implementation(projects.services.analytics.compose) @@ -56,6 +56,7 @@ dependencies { implementation(projects.features.reportroom.api) implementation(projects.features.roommembermoderation.api) implementation(projects.features.changeroommemberroles.api) + implementation(projects.features.invitepeople.api) testImplementation(libs.test.junit) testImplementation(libs.coroutines.test) @@ -72,7 +73,7 @@ dependencies { testImplementation(projects.libraries.usersearch.test) testImplementation(projects.libraries.featureflag.test) testImplementation(projects.tests.testutils) - testImplementation(projects.features.createroom.test) + testImplementation(projects.features.startchat.test) testImplementation(projects.services.analytics.test) testImplementation(libs.androidx.compose.ui.test.junit) testReleaseImplementation(libs.androidx.compose.ui.test.manifest) diff --git a/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/invite/RoomInviteMembersEvents.kt b/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/invite/RoomInviteMembersEvents.kt deleted file mode 100644 index a06ae82c49..0000000000 --- a/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/invite/RoomInviteMembersEvents.kt +++ /dev/null @@ -1,16 +0,0 @@ -/* - * Copyright 2023, 2024 New Vector Ltd. - * - * SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial - * Please see LICENSE files in the repository root for full details. - */ - -package io.element.android.features.roomdetails.impl.invite - -import io.element.android.libraries.matrix.api.user.MatrixUser - -sealed interface RoomInviteMembersEvents { - data class ToggleUser(val user: MatrixUser) : RoomInviteMembersEvents - data class UpdateSearchQuery(val query: String) : RoomInviteMembersEvents - data class OnSearchActiveChanged(val active: Boolean) : RoomInviteMembersEvents -} diff --git a/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/invite/RoomInviteMembersNode.kt b/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/invite/RoomInviteMembersNode.kt index ebfa3dcab8..dc269e7322 100644 --- a/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/invite/RoomInviteMembersNode.kt +++ b/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/invite/RoomInviteMembersNode.kt @@ -9,7 +9,6 @@ package io.element.android.features.roomdetails.impl.invite import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier -import androidx.compose.ui.platform.LocalContext import com.bumble.appyx.core.lifecycle.subscribe import com.bumble.appyx.core.modality.BuildContext import com.bumble.appyx.core.node.Node @@ -18,28 +17,21 @@ import dagger.assisted.Assisted import dagger.assisted.AssistedInject import im.vector.app.features.analytics.plan.MobileScreen import io.element.android.anvilannotations.ContributesNode -import io.element.android.libraries.core.coroutine.CoroutineDispatchers +import io.element.android.features.invitepeople.api.InvitePeoplePresenter +import io.element.android.features.invitepeople.api.InvitePeopleRenderer import io.element.android.libraries.di.RoomScope import io.element.android.libraries.matrix.api.room.JoinedRoom -import io.element.android.libraries.ui.strings.CommonStrings import io.element.android.services.analytics.api.AnalyticsService -import io.element.android.services.apperror.api.AppErrorStateService -import kotlinx.coroutines.CoroutineScope -import kotlinx.coroutines.SupervisorJob -import kotlinx.coroutines.launch @ContributesNode(RoomScope::class) class RoomInviteMembersNode @AssistedInject constructor( @Assisted buildContext: BuildContext, @Assisted plugins: List, - coroutineDispatchers: CoroutineDispatchers, - private val room: JoinedRoom, - private val presenter: RoomInviteMembersPresenter, - private val appErrorStateService: AppErrorStateService, private val analyticsService: AnalyticsService, + private val invitePeopleRenderer: InvitePeopleRenderer, + room: JoinedRoom, + invitePeoplePresenterFactory: InvitePeoplePresenter.Factory, ) : Node(buildContext, plugins = plugins) { - private val coroutineScope = CoroutineScope(SupervisorJob() + coroutineDispatchers.io) - init { lifecycle.subscribe( onResume = { @@ -48,31 +40,21 @@ class RoomInviteMembersNode @AssistedInject constructor( ) } + private val invitePeoplePresenter = invitePeoplePresenterFactory.create( + joinedRoom = room, + roomId = room.roomId, + ) + @Composable override fun View(modifier: Modifier) { - val state = presenter.present() - val context = LocalContext.current.applicationContext - + val state = invitePeoplePresenter.present() RoomInviteMembersView( state = state, modifier = modifier, onBackClick = { navigateUp() }, - onSubmitClick = { users -> - navigateUp() - - coroutineScope.launch { - val anyInviteFailed = users - .map { room.inviteUserById(it.userId) } - .any { it.isFailure } - - if (anyInviteFailed) { - appErrorStateService.showError( - title = context.getString(CommonStrings.common_unable_to_invite_title), - body = context.getString(CommonStrings.common_unable_to_invite_message), - ) - } - } - } - ) + onDone = { navigateUp() } + ) { + invitePeopleRenderer.Render(state, Modifier) + } } } diff --git a/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/invite/RoomInviteMembersView.kt b/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/invite/RoomInviteMembersView.kt index caae6ff16d..8bec90707f 100644 --- a/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/invite/RoomInviteMembersView.kt +++ b/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/invite/RoomInviteMembersView.kt @@ -7,49 +7,34 @@ package io.element.android.features.roomdetails.impl.invite -import androidx.compose.foundation.layout.Arrangement -import androidx.compose.foundation.layout.Column -import androidx.compose.foundation.layout.PaddingValues +import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.consumeWindowInsets import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.padding -import androidx.compose.foundation.lazy.LazyColumn -import androidx.compose.foundation.lazy.itemsIndexed import androidx.compose.material3.ExperimentalMaterial3Api import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier import androidx.compose.ui.res.stringResource import androidx.compose.ui.tooling.preview.PreviewParameter -import androidx.compose.ui.unit.dp -import io.element.android.compound.theme.ElementTheme +import io.element.android.features.invitepeople.api.InvitePeopleEvents +import io.element.android.features.invitepeople.api.InvitePeopleState +import io.element.android.features.invitepeople.api.InvitePeopleStateProvider import io.element.android.features.roomdetails.impl.R -import io.element.android.libraries.designsystem.components.async.AsyncLoading -import io.element.android.libraries.designsystem.components.avatar.AvatarSize import io.element.android.libraries.designsystem.components.button.BackButton import io.element.android.libraries.designsystem.preview.ElementPreview import io.element.android.libraries.designsystem.preview.PreviewsDayNight -import io.element.android.libraries.designsystem.theme.components.HorizontalDivider import io.element.android.libraries.designsystem.theme.components.Scaffold -import io.element.android.libraries.designsystem.theme.components.SearchBar -import io.element.android.libraries.designsystem.theme.components.SearchBarResultState -import io.element.android.libraries.designsystem.theme.components.Text import io.element.android.libraries.designsystem.theme.components.TextButton import io.element.android.libraries.designsystem.theme.components.TopAppBar -import io.element.android.libraries.matrix.api.user.MatrixUser -import io.element.android.libraries.matrix.ui.components.CheckableUserRow -import io.element.android.libraries.matrix.ui.components.CheckableUserRowData -import io.element.android.libraries.matrix.ui.components.SelectedUsersRowList -import io.element.android.libraries.matrix.ui.model.getAvatarData -import io.element.android.libraries.matrix.ui.model.getBestName import io.element.android.libraries.ui.strings.CommonStrings -import kotlinx.collections.immutable.ImmutableList @Composable fun RoomInviteMembersView( - state: RoomInviteMembersState, + state: InvitePeopleState, onBackClick: () -> Unit, - onSubmitClick: (List) -> Unit, + onDone: () -> Unit, modifier: Modifier = Modifier, + invitePeopleView: @Composable () -> Unit, ) { Scaffold( modifier = modifier, @@ -57,44 +42,26 @@ fun RoomInviteMembersView( RoomInviteMembersTopBar( onBackClick = { if (state.isSearchActive) { - state.eventSink(RoomInviteMembersEvents.OnSearchActiveChanged(false)) + state.eventSink(InvitePeopleEvents.CloseSearch) } else { onBackClick() } }, - onSubmitClick = { onSubmitClick(state.selectedUsers) }, + onSubmitClick = { + state.eventSink(InvitePeopleEvents.SendInvites) + onDone() + }, canSend = state.canInvite, ) } ) { padding -> - Column( + Box( modifier = Modifier .fillMaxWidth() .padding(padding) .consumeWindowInsets(padding), - verticalArrangement = Arrangement.spacedBy(16.dp), ) { - RoomInviteMembersSearchBar( - modifier = Modifier.fillMaxWidth(), - query = state.searchQuery, - showLoader = state.showSearchLoader, - selectedUsers = state.selectedUsers, - state = state.searchResults, - active = state.isSearchActive, - onActiveChange = { state.eventSink(RoomInviteMembersEvents.OnSearchActiveChanged(it)) }, - onTextChange = { state.eventSink(RoomInviteMembersEvents.UpdateSearchQuery(it)) }, - onToggleUser = { state.eventSink(RoomInviteMembersEvents.ToggleUser(it)) }, - ) - - if (!state.isSearchActive) { - SelectedUsersRowList( - modifier = Modifier.fillMaxWidth(), - selectedUsers = state.selectedUsers, - autoScroll = true, - onUserRemove = { state.eventSink(RoomInviteMembersEvents.ToggleUser(it)) }, - contentPadding = PaddingValues(16.dp), - ) - } + invitePeopleView() } } } @@ -119,101 +86,13 @@ private fun RoomInviteMembersTopBar( ) } -@OptIn(ExperimentalMaterial3Api::class) -@Composable -private fun RoomInviteMembersSearchBar( - query: String, - state: SearchBarResultState>, - showLoader: Boolean, - selectedUsers: ImmutableList, - active: Boolean, - onActiveChange: (Boolean) -> Unit, - onTextChange: (String) -> Unit, - onToggleUser: (MatrixUser) -> Unit, - modifier: Modifier = Modifier, - placeHolderTitle: String = stringResource(CommonStrings.common_search_for_someone), -) { - SearchBar( - query = query, - onQueryChange = onTextChange, - active = active, - onActiveChange = onActiveChange, - modifier = modifier, - placeHolderTitle = placeHolderTitle, - contentPrefix = { - if (selectedUsers.isNotEmpty()) { - SelectedUsersRowList( - modifier = Modifier.fillMaxWidth(), - selectedUsers = selectedUsers, - autoScroll = true, - onUserRemove = onToggleUser, - contentPadding = PaddingValues(16.dp), - ) - } - }, - showBackButton = false, - resultState = state, - contentSuffix = { - if (showLoader) { - AsyncLoading() - } - }, - resultHandler = { results -> - Text( - text = stringResource(id = CommonStrings.common_search_results), - style = ElementTheme.typography.fontBodyLgMedium, - modifier = Modifier - .fillMaxWidth() - .padding(start = 16.dp, top = 12.dp, end = 16.dp, bottom = 8.dp) - ) - - LazyColumn { - itemsIndexed(results) { index, invitableUser -> - val notInvitedOrJoined = !(invitableUser.isAlreadyInvited || invitableUser.isAlreadyJoined) - val isUnresolved = invitableUser.isUnresolved && notInvitedOrJoined - val enabled = isUnresolved || notInvitedOrJoined - val data = if (isUnresolved) { - CheckableUserRowData.Unresolved( - avatarData = invitableUser.matrixUser.getAvatarData(AvatarSize.UserListItem), - id = invitableUser.matrixUser.userId.value, - ) - } else { - CheckableUserRowData.Resolved( - avatarData = invitableUser.matrixUser.getAvatarData(AvatarSize.UserListItem), - name = invitableUser.matrixUser.getBestName(), - subtext = when { - // If they're already invited or joined we show that information - invitableUser.isAlreadyJoined -> stringResource(R.string.screen_room_details_already_a_member) - invitableUser.isAlreadyInvited -> stringResource(R.string.screen_room_details_already_invited) - // Otherwise show the ID, unless that's already used for their name - invitableUser.matrixUser.displayName.isNullOrEmpty().not() -> invitableUser.matrixUser.userId.value - else -> null - } - ) - } - CheckableUserRow( - checked = invitableUser.isSelected, - enabled = enabled, - data = data, - onCheckedChange = { onToggleUser(invitableUser.matrixUser) }, - modifier = Modifier.fillMaxWidth() - ) - - if (index < results.lastIndex) { - HorizontalDivider() - } - } - } - }, - ) -} - @PreviewsDayNight @Composable -internal fun RoomInviteMembersViewPreview(@PreviewParameter(RoomInviteMembersStateProvider::class) state: RoomInviteMembersState) = ElementPreview { +internal fun RoomInviteMembersViewPreview(@PreviewParameter(InvitePeopleStateProvider::class) state: InvitePeopleState) = ElementPreview { RoomInviteMembersView( state = state, + invitePeopleView = {}, onBackClick = {}, - onSubmitClick = {}, + onDone = {}, ) } 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 d50b3c5f6e..01c076fdb5 100644 --- a/features/roomdetails/impl/src/main/res/values-be/translations.xml +++ b/features/roomdetails/impl/src/main/res/values-be/translations.xml @@ -33,8 +33,6 @@ "У вас ёсць незахаваныя змены." "Захаваць змены?" "Дадаць тэму" - "Ужо ўдзельнік" - "Ужо запрасілі" "Зашыфраваны" "Не зашыфраваны" "Публічны пакой" diff --git a/features/roomdetails/impl/src/main/res/values-bg/translations.xml b/features/roomdetails/impl/src/main/res/values-bg/translations.xml index 6f9c256742..fb01acb4fb 100644 --- a/features/roomdetails/impl/src/main/res/values-bg/translations.xml +++ b/features/roomdetails/impl/src/main/res/values-bg/translations.xml @@ -22,8 +22,6 @@ "Модератори" "Членове" "Добавяне на тема" - "Вече е член" - "Вече е бил поканен" "С шифроване" "Без шифроване" "Общодостъпна стая" diff --git a/features/roomdetails/impl/src/main/res/values-cs/translations.xml b/features/roomdetails/impl/src/main/res/values-cs/translations.xml index 3bd037b1c0..d484486940 100644 --- a/features/roomdetails/impl/src/main/res/values-cs/translations.xml +++ b/features/roomdetails/impl/src/main/res/values-cs/translations.xml @@ -35,8 +35,6 @@ "Máte neuložené změny." "Uložit změny?" "Přidat téma" - "Již členem" - "Již pozván(a)" "Šifrováno" "Není šifrováno" "Veřejná místnost" diff --git a/features/roomdetails/impl/src/main/res/values-cy/translations.xml b/features/roomdetails/impl/src/main/res/values-cy/translations.xml index ab0a8fa95d..80726aa1f8 100644 --- a/features/roomdetails/impl/src/main/res/values-cy/translations.xml +++ b/features/roomdetails/impl/src/main/res/values-cy/translations.xml @@ -35,8 +35,6 @@ "Mae gennych newidiadau heb eu cadw." "Cadw\'r newidiadau?" "Ychwanegu pwnc" - "Eisoes yn aelod" - "Wedi gwahodd yn barod" "Wedi\'i amgryptio" "Heb ei amgryptio" "Ystafell gyhoeddus" diff --git a/features/roomdetails/impl/src/main/res/values-da/translations.xml b/features/roomdetails/impl/src/main/res/values-da/translations.xml index e989977145..a07d86be77 100644 --- a/features/roomdetails/impl/src/main/res/values-da/translations.xml +++ b/features/roomdetails/impl/src/main/res/values-da/translations.xml @@ -39,8 +39,6 @@ "Du har ændringer, der ikke er gemt." "Gem ændringer?" "Tilføj emne" - "Allerede medlem" - "Allerede inviteret" "Krypteret" "Ikke krypteret" "Offentligt rum" diff --git a/features/roomdetails/impl/src/main/res/values-de/translations.xml b/features/roomdetails/impl/src/main/res/values-de/translations.xml index 2a2673beb1..714d36c38a 100644 --- a/features/roomdetails/impl/src/main/res/values-de/translations.xml +++ b/features/roomdetails/impl/src/main/res/values-de/translations.xml @@ -35,8 +35,6 @@ "Sie haben ungespeicherte Änderungen." "Änderungen speichern?" "Thema hinzufügen" - "Bereits Mitglied" - "Bereits eingeladen" "Verschlüsselt" "Nicht verschlüsselt" "Öffentlicher Raum" diff --git a/features/roomdetails/impl/src/main/res/values-el/translations.xml b/features/roomdetails/impl/src/main/res/values-el/translations.xml index aed10ce24f..678dad15c9 100644 --- a/features/roomdetails/impl/src/main/res/values-el/translations.xml +++ b/features/roomdetails/impl/src/main/res/values-el/translations.xml @@ -35,8 +35,6 @@ "Έχεις μη αποθηκευμένες αλλαγές." "Αποθήκευση αλλαγών;" "Προσθήκη θέματος" - "Ήδη μέλος" - "Ήδη προσκεκλημένος" "Κρυπτογραφημένο" "Μη κρυπτογραφημένο" "Δημόσια αίθουσα" diff --git a/features/roomdetails/impl/src/main/res/values-es/translations.xml b/features/roomdetails/impl/src/main/res/values-es/translations.xml index ffce0a6b76..96e31eb5c5 100644 --- a/features/roomdetails/impl/src/main/res/values-es/translations.xml +++ b/features/roomdetails/impl/src/main/res/values-es/translations.xml @@ -35,8 +35,6 @@ "Tienes cambios sin guardar." "¿Guardar cambios?" "Añadir tema" - "Ya eres miembro" - "Ya estás invitado" "Cifrada" "No cifrada" "Sala pública" diff --git a/features/roomdetails/impl/src/main/res/values-et/translations.xml b/features/roomdetails/impl/src/main/res/values-et/translations.xml index efc6ee8e6d..4426ca1e77 100644 --- a/features/roomdetails/impl/src/main/res/values-et/translations.xml +++ b/features/roomdetails/impl/src/main/res/values-et/translations.xml @@ -7,7 +7,7 @@ "Küsitlused" "Vaid peakasutajad" "Suhtluskeelu seadmine" - "Sõnumite kustutamine" + "Eemalda sõnumid" "Kõik" "Kutsu teisi osalejaid ja vasta ise liitumiskutsetele" "Jututoas osalejate modereerimine" @@ -39,8 +39,6 @@ "Sul on salvestamata muudatusi" "Kas salvestame muudatused?" "Lisa teema" - "Sa juba oled jututoa liige" - "Sa juba oled kutse saanud" "Krüptitud jututuba" "Krüptimata jututuba" "Avalik jututuba" diff --git a/features/roomdetails/impl/src/main/res/values-eu/translations.xml b/features/roomdetails/impl/src/main/res/values-eu/translations.xml index bd2a370942..64ec4ad928 100644 --- a/features/roomdetails/impl/src/main/res/values-eu/translations.xml +++ b/features/roomdetails/impl/src/main/res/values-eu/translations.xml @@ -20,6 +20,7 @@ "Bidali mezuak" "Editatu administratzaileak" "Administratzailea gehitu?" + "Jabetza eskualdatu?" "Jaitsi mailaz" "Ezin izango duzu hau aldatu zure burua mailaz jaisten ari zarelako, zu bazara gelan baimenak dituen azken erabiltzailea ezin izango dira baimenak berreskuratu." "Zure burua mailaz jaitsi?" @@ -27,14 +28,13 @@ "(Egiteke)" "Administratzaileek automatikoki dute moderatzaile-pribilegioak" "Editatu moderatzaileak" + "Aukeratu jabeak" "Administratzaileak" "Moderatzaileak" "Kideak" "Gorde gabeko aldaketak dituzu." "Aldaketak gorde?" "Gehitu hizketagaia" - "Kidea da dagoeneko" - "Lehendik ere gonbidatuta" "Zifratuta" "Zifratu gabe" "Gela publikoa" @@ -76,6 +76,7 @@ "Zain" "Kudeatzailea" "Moderatzailea" + "Jabea" "Gelako kideak" "%1$s(r)i debekua kentzen" "Aktibatuz gero, defektuzko ezarpena gainidatziko du" @@ -89,12 +90,14 @@ "Aipamenak eta hitz gakoak soilik" "Gela honetan, jakinarazi" "Administratzaileak" + "Administratzaileak eta jabeak" "Aldatu nire rola" "Jaitsi maila, kidera" "Jaitsi maila, moderatzailera" "Kideen moderazioa" "Mezuak eta edukiak" "Moderatzaileak" + "Jabeak" "Baimenak" "Berrezarri baimenak" "Baimenak berrezarritakoan, uneko ezarpenak galduko dituzu." diff --git a/features/roomdetails/impl/src/main/res/values-fa/translations.xml b/features/roomdetails/impl/src/main/res/values-fa/translations.xml index 7941f60609..2de731b612 100644 --- a/features/roomdetails/impl/src/main/res/values-fa/translations.xml +++ b/features/roomdetails/impl/src/main/res/values-fa/translations.xml @@ -34,8 +34,6 @@ "تغییراتی ذخیره نشده دارید." "ذخیرهٔ تغییرات؟" "افزودن موضوع" - "از پیش عضو است" - "از پیش دعوت شده" "رمز شده" "رمزنگاری نشده" "اتاق عمومی" @@ -65,6 +63,10 @@ "اطّلاعات اتاق" "موضوع" "به‌روز کردن اتاق…" + + "%1$d نفر" + "%1$d نفر" + "برداشت و تحریم عضو" "تنها برداشتن عضو" "رفع انسداد" diff --git a/features/roomdetails/impl/src/main/res/values-fi/translations.xml b/features/roomdetails/impl/src/main/res/values-fi/translations.xml index 5906bd5986..04c1411e50 100644 --- a/features/roomdetails/impl/src/main/res/values-fi/translations.xml +++ b/features/roomdetails/impl/src/main/res/values-fi/translations.xml @@ -39,8 +39,6 @@ "Sinulla on tallentamattomia muutoksia" "Tallenna muutokset?" "Lisää aihe" - "On jo jäsen" - "On jo kutsuttu" "Salattu" "Ei salattu" "Julkinen huone" diff --git a/features/roomdetails/impl/src/main/res/values-fr/translations.xml b/features/roomdetails/impl/src/main/res/values-fr/translations.xml index f5b876c9f7..066ce1ee0f 100644 --- a/features/roomdetails/impl/src/main/res/values-fr/translations.xml +++ b/features/roomdetails/impl/src/main/res/values-fr/translations.xml @@ -39,8 +39,6 @@ "Vous avez des modifications non-enregistrées." "Enregistrer les changements ?" "Ajouter un sujet" - "Déjà membre" - "Déjà invité(e)" "Chiffré" "Non chiffré" "Salon public" diff --git a/features/roomdetails/impl/src/main/res/values-hu/translations.xml b/features/roomdetails/impl/src/main/res/values-hu/translations.xml index dfe25cf712..6e2484fc68 100644 --- a/features/roomdetails/impl/src/main/res/values-hu/translations.xml +++ b/features/roomdetails/impl/src/main/res/values-hu/translations.xml @@ -39,8 +39,6 @@ "Mentetlen módosításai vannak." "Menti a módosításokat?" "Téma hozzáadása" - "Már tag" - "Már meghívták" "Titkosított" "Nem titkosított" "Nyilvános szoba" diff --git a/features/roomdetails/impl/src/main/res/values-in/translations.xml b/features/roomdetails/impl/src/main/res/values-in/translations.xml index 2143418fb0..c78485bc4d 100644 --- a/features/roomdetails/impl/src/main/res/values-in/translations.xml +++ b/features/roomdetails/impl/src/main/res/values-in/translations.xml @@ -7,7 +7,7 @@ "Pemungutan suara" "Hanya admin" "Cekal orang-orang" - "Hapus pesan" + "Hilangkan pesan" "Semua orang" "Undang orang-orang dan terima permintaan untuk bergabung" "Moderasi anggota" @@ -35,8 +35,6 @@ "Anda memiliki perubahan yang belum disimpan." "Simpan perubahan?" "Tambahkan topik" - "Sudah menjadi anggota" - "Sudah diundang" "Terenkripsi" "Tidak terenkripsi" "Ruangan publik" diff --git a/features/roomdetails/impl/src/main/res/values-it/translations.xml b/features/roomdetails/impl/src/main/res/values-it/translations.xml index 54de5f5407..988a2edafd 100644 --- a/features/roomdetails/impl/src/main/res/values-it/translations.xml +++ b/features/roomdetails/impl/src/main/res/values-it/translations.xml @@ -35,8 +35,6 @@ "Hai delle modifiche non salvate." "Salvare le modifiche?" "Aggiungi argomento" - "Già membro" - "Già invitato" "Cifrata" "Non cifrata" "Stanza pubblica" diff --git a/features/roomdetails/impl/src/main/res/values-ka/translations.xml b/features/roomdetails/impl/src/main/res/values-ka/translations.xml index 6a68985d87..1beb70d4dd 100644 --- a/features/roomdetails/impl/src/main/res/values-ka/translations.xml +++ b/features/roomdetails/impl/src/main/res/values-ka/translations.xml @@ -32,8 +32,6 @@ "თქვენ გაქვთ შეუნახავი ცვლილებები" "შენახვა?" "თემის დამატება" - "უკვე წევრია" - "უკვე მოწვეულია" "ოთახის რედაქტირება" "უცნობი შეცდომა მოხდა. ინფორმაციის შეცვლა ვერ მოხერხდა." "ოთახის განახლება შეუძლებელია" diff --git a/features/roomdetails/impl/src/main/res/values-lt/translations.xml b/features/roomdetails/impl/src/main/res/values-lt/translations.xml index 18a908b2c0..1b3b44fdf2 100644 --- a/features/roomdetails/impl/src/main/res/values-lt/translations.xml +++ b/features/roomdetails/impl/src/main/res/values-lt/translations.xml @@ -1,8 +1,6 @@ "Pridėti temą" - "Jau narys" - "Jau pakviestas" "Redaguoti kambarį" "Įvyko nežinoma klaida ir informacijos pakeisti nepavyko." "Nepavyko atnaujinti kambario" diff --git a/features/roomdetails/impl/src/main/res/values-nb/translations.xml b/features/roomdetails/impl/src/main/res/values-nb/translations.xml index a8f5d8d123..f964f142b5 100644 --- a/features/roomdetails/impl/src/main/res/values-nb/translations.xml +++ b/features/roomdetails/impl/src/main/res/values-nb/translations.xml @@ -35,8 +35,6 @@ "Du har endringer som ikke er lagret." "Lagre endringer?" "Legg til emne" - "Allerede medlem" - "Allerede invitert" "Kryptert" "Ikke kryptert" "Offentlig rom" diff --git a/features/roomdetails/impl/src/main/res/values-nl/translations.xml b/features/roomdetails/impl/src/main/res/values-nl/translations.xml index 2b190fc4db..9b932f60fe 100644 --- a/features/roomdetails/impl/src/main/res/values-nl/translations.xml +++ b/features/roomdetails/impl/src/main/res/values-nl/translations.xml @@ -33,8 +33,6 @@ "Je hebt niet-opgeslagen wijzigingen" "Wijzigingen opslaan?" "Onderwerp toevoegen" - "Reeds lid" - "Reeds uitgenodigd" "Versleuteld" "Niet versleuteld" "Openbare kamer" diff --git a/features/roomdetails/impl/src/main/res/values-pl/translations.xml b/features/roomdetails/impl/src/main/res/values-pl/translations.xml index c708ac220a..b9847c6cfd 100644 --- a/features/roomdetails/impl/src/main/res/values-pl/translations.xml +++ b/features/roomdetails/impl/src/main/res/values-pl/translations.xml @@ -39,8 +39,6 @@ "Masz niezapisane zmiany." "Zapisać zmiany?" "Dodaj temat" - "Jest już członkiem" - "Już zaproszony" "Szyfrowany" "Nieszyfrowany" "Pokój publiczny" diff --git a/features/roomdetails/impl/src/main/res/values-pt-rBR/translations.xml b/features/roomdetails/impl/src/main/res/values-pt-rBR/translations.xml index 5561005e9b..bfe0b44af2 100644 --- a/features/roomdetails/impl/src/main/res/values-pt-rBR/translations.xml +++ b/features/roomdetails/impl/src/main/res/values-pt-rBR/translations.xml @@ -35,8 +35,6 @@ "Você tem alterações não salvas." "Salvar alterações?" "Adicionar tópico" - "Já é membro" - "Já foi convidado" "Criptografado" "Não criptografado" "Sala pública" diff --git a/features/roomdetails/impl/src/main/res/values-pt/translations.xml b/features/roomdetails/impl/src/main/res/values-pt/translations.xml index 32d1bb8fc8..cba9ab5ac1 100644 --- a/features/roomdetails/impl/src/main/res/values-pt/translations.xml +++ b/features/roomdetails/impl/src/main/res/values-pt/translations.xml @@ -39,8 +39,6 @@ "Tens alterações por guardar." "Guardar alterações?" "Adicionar descrição" - "Já é participante" - "Já foi convidado" "Cifrada" "Não cifrada" "Sala pública" diff --git a/features/roomdetails/impl/src/main/res/values-ro/translations.xml b/features/roomdetails/impl/src/main/res/values-ro/translations.xml index 622278dc64..b901be078e 100644 --- a/features/roomdetails/impl/src/main/res/values-ro/translations.xml +++ b/features/roomdetails/impl/src/main/res/values-ro/translations.xml @@ -33,8 +33,6 @@ "Aveți modificări nesalvate." "Salvați modificările?" "Adăugare subiect" - "Deja membru" - "Deja invitat" "Criptat" "Necriptat" "Cameră publică" diff --git a/features/roomdetails/impl/src/main/res/values-ru/translations.xml b/features/roomdetails/impl/src/main/res/values-ru/translations.xml index 77d0b94eb3..e4c53ff30d 100644 --- a/features/roomdetails/impl/src/main/res/values-ru/translations.xml +++ b/features/roomdetails/impl/src/main/res/values-ru/translations.xml @@ -35,8 +35,6 @@ "У вас есть несохраненные изменения." "Сохранить изменения?" "Добавить тему" - "Уже зарегистрирован" - "Уже приглашены" "Зашифровано" "Шифрования нет" "Общедоступная комната" diff --git a/features/roomdetails/impl/src/main/res/values-sk/translations.xml b/features/roomdetails/impl/src/main/res/values-sk/translations.xml index b8e9e0c30a..530455cbf2 100644 --- a/features/roomdetails/impl/src/main/res/values-sk/translations.xml +++ b/features/roomdetails/impl/src/main/res/values-sk/translations.xml @@ -39,8 +39,6 @@ "Máte neuložené zmeny." "Uložiť zmeny?" "Pridať tému" - "Už ste členom" - "Už ste pozvaní" "Zašifrované" "Nešifrované" "Verejná miestnosť" diff --git a/features/roomdetails/impl/src/main/res/values-sv/translations.xml b/features/roomdetails/impl/src/main/res/values-sv/translations.xml index 12cec6d6ee..1cc11933ab 100644 --- a/features/roomdetails/impl/src/main/res/values-sv/translations.xml +++ b/features/roomdetails/impl/src/main/res/values-sv/translations.xml @@ -22,21 +22,23 @@ "Redigera administratörer" "Du kommer inte att kunna ångra den här åtgärden. Du befordrar användaren till att ha samma behörighetsnivå som du." "Lägg till Admin?" + "Du kommer inte att kunna ångra den här åtgärden. Du överför ägarskapet till de valda användarna. När du lämnar kommer detta att vara permanent." + "Överför ägarskap?" "Degradera" "Du kommer inte att kunna ångra denna ändring eftersom du degraderar dig själv, om du är den sista privilegierade användaren i rummet kommer det att vara omöjligt att återfå privilegier." "Degradera dig själv?" "%1$s (Väntar)" "(Väntar)" "Administratörer har automatiskt moderatorbehörighet" + "Ägare har automatiskt administratörsbehörighet." "Redigera moderatorer" + "Välj ägare" "Administratörer" "Moderatorer" "Medlemmar" "Du har osparade ändringar." "Spara ändringar?" "Lägg till ämne" - "Redan medlem" - "Redan inbjuden" "Krypterat" "Inte krypterat" "Offentligt rum" @@ -81,6 +83,7 @@ "Väntar" "Admin" "Moderator" + "Ägare" "Rumsmedlemmar" "Avbannar %1$s" "Tillåt anpassad inställning" @@ -98,12 +101,14 @@ "Endast omnämnanden och nyckelord" "I det här rummet, meddela mig för" "Administratörer" + "Administratörer och ägare" "Ändra min roll" "Degradera till medlem" "Degradera till moderator" "Medlemsmoderering" "Meddelanden och innehåll" "Moderatorer" + "Ägare" "Behörigheter" "Återställ behörigheter" "När du har återställt behörigheterna kommer du att förlora de aktuella inställningarna." diff --git a/features/roomdetails/impl/src/main/res/values-tr/translations.xml b/features/roomdetails/impl/src/main/res/values-tr/translations.xml index 67a8845821..92caaaf5eb 100644 --- a/features/roomdetails/impl/src/main/res/values-tr/translations.xml +++ b/features/roomdetails/impl/src/main/res/values-tr/translations.xml @@ -35,8 +35,6 @@ "Kaydedilmemiş değişiklikleriniz var." "Değişiklikleri Kaydet?" "Konu ekle" - "Zaten üye" - "Zaten davet edildi" "Şifrelenmiş" "Şifrelenmemiş" "Herkese açık oda" diff --git a/features/roomdetails/impl/src/main/res/values-uk/translations.xml b/features/roomdetails/impl/src/main/res/values-uk/translations.xml index b3cac2e00a..7ef99d8430 100644 --- a/features/roomdetails/impl/src/main/res/values-uk/translations.xml +++ b/features/roomdetails/impl/src/main/res/values-uk/translations.xml @@ -39,8 +39,6 @@ "У вас є не збережені зміни." "Зберегти зміни?" "Додати тему" - "Уже учасник" - "Уже запрошені" "Зашифровано" "Не зашифровано" "Загальнодоступна кімната" diff --git a/features/roomdetails/impl/src/main/res/values-ur/translations.xml b/features/roomdetails/impl/src/main/res/values-ur/translations.xml index 00c90107ac..12a8d964cb 100644 --- a/features/roomdetails/impl/src/main/res/values-ur/translations.xml +++ b/features/roomdetails/impl/src/main/res/values-ur/translations.xml @@ -33,8 +33,6 @@ "آپکے پاس غیر محفوظ تبدیلیاں ہیں" "تبدیلیاں محفوظ کریں؟" "موضوع شامل کریں" - "پہلے سے ہی رکن" - "پہلے سے مدعو شدہ" "مرموز کردہ" "رموز کردہ نہیں" "عوامی کمرہ" diff --git a/features/roomdetails/impl/src/main/res/values-uz/translations.xml b/features/roomdetails/impl/src/main/res/values-uz/translations.xml index 030e0a91bd..229b201926 100644 --- a/features/roomdetails/impl/src/main/res/values-uz/translations.xml +++ b/features/roomdetails/impl/src/main/res/values-uz/translations.xml @@ -3,8 +3,6 @@ "Bildirishnoma sozlamalarini yangilashda xatolik yuz berdi." "Har kim" "Mavzu qo\'shish" - "Allaqachon a\'zo" - "Allaqachon taklif qilingan" "Xonani tahrirlash" "Nomaʼlum xatolik yuz berdi va maʼlumotni oʻzgartirib boʻlmadi." "Xonani yangilab bo‘lmadi" @@ -14,6 +12,7 @@ "Bu xona ovozini o‘chirib bo‘lmadi, qayta urinib ko‘ring." "Bu xonaning ovozi yoqilmadi, qayta urinib ko‘ring." "Odamlarni taklif qiling" + "Suhbatni tark etish" "Xonani tark etish" "Maxsus" "Standart" @@ -42,4 +41,5 @@ "Barcha xabarlar" "Faqat eslatmalar va kalit so\'zlar" "Bu xonada menga xabar bering" + "Shifrlash" diff --git a/features/roomdetails/impl/src/main/res/values-zh-rTW/translations.xml b/features/roomdetails/impl/src/main/res/values-zh-rTW/translations.xml index ac32c3597b..d2d6d0ef90 100644 --- a/features/roomdetails/impl/src/main/res/values-zh-rTW/translations.xml +++ b/features/roomdetails/impl/src/main/res/values-zh-rTW/translations.xml @@ -22,21 +22,23 @@ "編輯管理員" "您將無法復原此動作。您正將使用者提昇至與您相同的權力等級。" "要新增管理員嗎?" + "您將無法撤銷此動作。您正在將所有權轉移給選定的使用者。一旦您離開,此動作將永久有效。" + "轉移所有權?" "降級" "當您自行降級時,您將無法復原此變更,若您是聊天室中的最後一位特權使用者,則無法重新獲得權限。" "將自己降級?" "%1$s(擱置中)" "(擱置中)" "管理員自動擁有版主權限" + "擁有者自動擁有管理員權限。" "編輯版主" + "選擇擁有者" "管理員" "版主" "成員" "您有尚未儲存的變更" "是否儲存變更?" "新增主題" - "已是成員" - "已邀請" "已加密" "未加密" "公開的聊天室" @@ -80,6 +82,7 @@ "待定" "管理員" "版主" + "擁有者" "聊天室成員" "正在解除黑名單 %1$s" "允許自訂設定" @@ -97,12 +100,14 @@ "僅限提及與關鍵字" "在此聊天適中,通知我" "管理員" + "管理員與擁有者" "變更我的身份" "降級為普通成員" "降級為版主" "成員管理" "訊息與內容" "版主" + "擁有者" "權限" "重設權限" "重設之後,您會遺失當前的設定。" 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 367741e4ef..7d5a9e330c 100644 --- a/features/roomdetails/impl/src/main/res/values-zh/translations.xml +++ b/features/roomdetails/impl/src/main/res/values-zh/translations.xml @@ -35,8 +35,6 @@ "您有未保存的更改。" "保存更改?" "添加主题" - "已经是成员" - "已邀请" "加密的" "未加密的" "公共聊天室" diff --git a/features/roomdetails/impl/src/main/res/values/localazy.xml b/features/roomdetails/impl/src/main/res/values/localazy.xml index d0c389ded5..5dd185ec13 100644 --- a/features/roomdetails/impl/src/main/res/values/localazy.xml +++ b/features/roomdetails/impl/src/main/res/values/localazy.xml @@ -39,8 +39,6 @@ "You have unsaved changes." "Save changes?" "Add topic" - "Already a member" - "Already invited" "Encrypted" "Not encrypted" "Public room" diff --git a/features/roomdetails/impl/src/test/kotlin/io/element/android/features/roomdetails/impl/invite/RoomInviteMembersPresenterTest.kt b/features/roomdetails/impl/src/test/kotlin/io/element/android/features/roomdetails/impl/invite/RoomInviteMembersPresenterTest.kt deleted file mode 100644 index 5aae0f5d3b..0000000000 --- a/features/roomdetails/impl/src/test/kotlin/io/element/android/features/roomdetails/impl/invite/RoomInviteMembersPresenterTest.kt +++ /dev/null @@ -1,408 +0,0 @@ -/* - * Copyright 2023, 2024 New Vector Ltd. - * - * SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial - * Please see LICENSE files in the repository root for full details. - */ - -package io.element.android.features.roomdetails.impl.invite - -import app.cash.molecule.RecompositionMode -import app.cash.molecule.moleculeFlow -import app.cash.turbine.test -import com.google.common.truth.Truth.assertThat -import io.element.android.features.roomdetails.impl.aRoom -import io.element.android.features.roomdetails.impl.members.RoomMemberListDataSource -import io.element.android.features.roomdetails.impl.members.aRoomMember -import io.element.android.features.roomdetails.impl.members.aRoomMemberList -import io.element.android.libraries.core.coroutine.CoroutineDispatchers -import io.element.android.libraries.designsystem.theme.components.SearchBarResultState -import io.element.android.libraries.matrix.api.room.BaseRoom -import io.element.android.libraries.matrix.api.room.RoomMembersState -import io.element.android.libraries.matrix.api.room.RoomMembershipState -import io.element.android.libraries.matrix.api.user.MatrixUser -import io.element.android.libraries.matrix.test.A_USER_ID -import io.element.android.libraries.matrix.test.A_USER_ID_2 -import io.element.android.libraries.matrix.test.room.FakeBaseRoom -import io.element.android.libraries.matrix.ui.components.aMatrixUser -import io.element.android.libraries.matrix.ui.components.aMatrixUserList -import io.element.android.libraries.usersearch.api.UserSearchResult -import io.element.android.libraries.usersearch.api.UserSearchResultState -import io.element.android.libraries.usersearch.test.FakeUserRepository -import io.element.android.tests.testutils.WarmUpRule -import io.element.android.tests.testutils.consumeItemsUntilPredicate -import io.element.android.tests.testutils.testCoroutineDispatchers -import kotlinx.collections.immutable.ImmutableList -import kotlinx.collections.immutable.persistentListOf -import kotlinx.coroutines.test.TestScope -import kotlinx.coroutines.test.runTest -import org.junit.Rule -import org.junit.Test - -internal class RoomInviteMembersPresenterTest { - @get:Rule - val warmUpRule = WarmUpRule() - - @Test - fun `present - initial state has no results and no search`() = runTest { - val presenter = RoomInviteMembersPresenter( - userRepository = FakeUserRepository(), - roomMemberListDataSource = createDataSource(FakeBaseRoom()), - coroutineDispatchers = testCoroutineDispatchers() - ) - - moleculeFlow(RecompositionMode.Immediate) { - presenter.present() - }.test { - val initialState = awaitItem() - - assertThat(initialState.searchResults).isInstanceOf(SearchBarResultState.Initial::class.java) - assertThat(initialState.isSearchActive).isFalse() - assertThat(initialState.canInvite).isFalse() - assertThat(initialState.searchQuery).isEmpty() - - skipItems(1) - } - } - - @Test - fun `present - updates search active state`() = runTest { - val presenter = RoomInviteMembersPresenter( - userRepository = FakeUserRepository(), - roomMemberListDataSource = createDataSource(FakeBaseRoom()), - coroutineDispatchers = testCoroutineDispatchers() - ) - - moleculeFlow(RecompositionMode.Immediate) { - presenter.present() - }.test { - val initialState = awaitItem() - skipItems(1) - - initialState.eventSink(RoomInviteMembersEvents.OnSearchActiveChanged(true)) - - val resultState = awaitItem() - assertThat(resultState.isSearchActive).isTrue() - } - } - - @Test - fun `present - performs search and handles empty result list`() = runTest { - val repository = FakeUserRepository() - val presenter = RoomInviteMembersPresenter( - userRepository = repository, - roomMemberListDataSource = createDataSource(FakeBaseRoom()), - coroutineDispatchers = testCoroutineDispatchers(useUnconfinedTestDispatcher = true) - ) - moleculeFlow(RecompositionMode.Immediate) { - presenter.present() - }.test { - val initialState = awaitItem() - initialState.eventSink(RoomInviteMembersEvents.UpdateSearchQuery("some query")) - assertThat(repository.providedQuery).isEqualTo("some query") - repository.emitState(UserSearchResultState(results = emptyList(), isSearching = true)) - consumeItemsUntilPredicate { it.showSearchLoader }.last().also { state -> - assertThat(state.searchResults).isInstanceOf(SearchBarResultState.Initial::class.java) - assertThat(state.showSearchLoader).isTrue() - } - repository.emitState(results = emptyList(), isSearching = false) - consumeItemsUntilPredicate { !it.showSearchLoader }.last().also { state -> - assertThat(state.searchResults).isInstanceOf(SearchBarResultState.NoResultsFound::class.java) - assertThat(state.showSearchLoader).isFalse() - } - } - } - - @Test - fun `present - performs search and handles user results`() = runTest { - val repository = FakeUserRepository() - val presenter = RoomInviteMembersPresenter( - userRepository = repository, - roomMemberListDataSource = createDataSource(FakeBaseRoom()), - coroutineDispatchers = testCoroutineDispatchers(useUnconfinedTestDispatcher = true) - ) - moleculeFlow(RecompositionMode.Immediate) { - presenter.present() - }.test { - val initialState = awaitItem() - skipItems(1) - - initialState.eventSink(RoomInviteMembersEvents.UpdateSearchQuery("some query")) - skipItems(1) - - assertThat(repository.providedQuery).isEqualTo("some query") - repository.emitStateWithUsers(users = aMatrixUserList()) - skipItems(1) - - val resultState = awaitItem() - assertThat(resultState.searchResults).isInstanceOf(SearchBarResultState.Results::class.java) - - val expectedUsers = aMatrixUserList() - val users = resultState.searchResults.users() - expectedUsers.forEachIndexed { index, matrixUser -> - assertThat(users[index].matrixUser).isEqualTo(matrixUser) - assertThat(users[index].isAlreadyInvited).isFalse() - assertThat(users[index].isAlreadyJoined).isFalse() - assertThat(users[index].isSelected).isFalse() - } - } - } - - @Test - fun `present - performs search and handles membership state of existing users`() = runTest { - val userList = aMatrixUserList() - val joinedUser = userList[0] - val invitedUser = userList[1] - - val repository = FakeUserRepository() - val coroutineDispatchers = testCoroutineDispatchers(useUnconfinedTestDispatcher = true) - val presenter = RoomInviteMembersPresenter( - userRepository = repository, - roomMemberListDataSource = createDataSource( - room = FakeBaseRoom().apply { - givenRoomMembersState( - RoomMembersState.Ready( - persistentListOf( - aRoomMember(userId = joinedUser.userId, membership = RoomMembershipState.JOIN), - aRoomMember(userId = invitedUser.userId, membership = RoomMembershipState.INVITE), - ) - ) - ) - }, - coroutineDispatchers = coroutineDispatchers, - ), - coroutineDispatchers = coroutineDispatchers - ) - moleculeFlow(RecompositionMode.Immediate) { - presenter.present() - }.test { - val initialState = awaitItem() - skipItems(1) - - initialState.eventSink(RoomInviteMembersEvents.UpdateSearchQuery("some query")) - skipItems(1) - - assertThat(repository.providedQuery).isEqualTo("some query") - repository.emitStateWithUsers(users = aMatrixUserList()) - skipItems(1) - - val resultState = awaitItem() - assertThat(resultState.searchResults).isInstanceOf(SearchBarResultState.Results::class.java) - - val users = resultState.searchResults.users() - - // The result that matches a user with JOINED membership is marked as such - val userWhoShouldBeJoined = users.find { it.matrixUser == joinedUser } - assertThat(userWhoShouldBeJoined).isNotNull() - assertThat(userWhoShouldBeJoined?.isAlreadyJoined).isTrue() - assertThat(userWhoShouldBeJoined?.isAlreadyInvited).isFalse() - - // The result that matches a user with INVITED membership is marked as such - val userWhoShouldBeInvited = users.find { it.matrixUser == invitedUser } - assertThat(userWhoShouldBeInvited).isNotNull() - assertThat(userWhoShouldBeInvited?.isAlreadyJoined).isFalse() - assertThat(userWhoShouldBeInvited?.isAlreadyInvited).isTrue() - - // All other users are neither joined nor invited - val otherUsers = users.minus(userWhoShouldBeInvited!!).minus(userWhoShouldBeJoined!!) - assertThat(otherUsers.none { it.isAlreadyInvited }).isTrue() - assertThat(otherUsers.none { it.isAlreadyJoined }).isTrue() - } - } - - @Test - fun `present - performs search and handles unresolved results`() = runTest { - val userList = aMatrixUserList() - val joinedUser = userList[0] - val invitedUser = userList[1] - - val repository = FakeUserRepository() - val presenter = RoomInviteMembersPresenter( - userRepository = repository, - roomMemberListDataSource = createDataSource(FakeBaseRoom().apply { - givenRoomMembersState( - RoomMembersState.Ready( - persistentListOf( - aRoomMember(userId = joinedUser.userId, membership = RoomMembershipState.JOIN), - aRoomMember(userId = invitedUser.userId, membership = RoomMembershipState.INVITE), - ) - ) - ) - }), - coroutineDispatchers = testCoroutineDispatchers(useUnconfinedTestDispatcher = true) - ) - - moleculeFlow(RecompositionMode.Immediate) { - presenter.present() - }.test { - val initialState = awaitItem() - skipItems(1) - - initialState.eventSink(RoomInviteMembersEvents.UpdateSearchQuery("some query")) - skipItems(1) - - assertThat(repository.providedQuery).isEqualTo("some query") - - val unresolvedUser = UserSearchResult(aMatrixUser(id = A_USER_ID.value), isUnresolved = true) - repository.emitState(listOf(unresolvedUser) + aMatrixUserList().map { UserSearchResult(it) }) - skipItems(1) - - val resultState = awaitItem() - assertThat(resultState.searchResults).isInstanceOf(SearchBarResultState.Results::class.java) - - val users = resultState.searchResults.users() - - val userWhoShouldBeUnresolved = users.first() - assertThat(userWhoShouldBeUnresolved.isUnresolved).isTrue() - - // All other users are neither joined nor invited - val otherUsers = users.minus(userWhoShouldBeUnresolved) - assertThat(otherUsers.none { it.isUnresolved }).isTrue() - } - } - - @Test - fun `present - toggle users updates selected user state`() = runTest { - val repository = FakeUserRepository() - val presenter = RoomInviteMembersPresenter( - userRepository = repository, - roomMemberListDataSource = createDataSource(), - coroutineDispatchers = testCoroutineDispatchers() - ) - - moleculeFlow(RecompositionMode.Immediate) { - presenter.present() - }.test { - val initialState = awaitItem() - skipItems(1) - - // When we toggle a user not in the list, they are added - initialState.eventSink(RoomInviteMembersEvents.ToggleUser(aMatrixUser())) - assertThat(awaitItem().selectedUsers).containsExactly(aMatrixUser()) - - // Toggling a different user also adds them - initialState.eventSink(RoomInviteMembersEvents.ToggleUser(aMatrixUser(id = A_USER_ID_2.value))) - assertThat(awaitItem().selectedUsers).containsExactly(aMatrixUser(), aMatrixUser(id = A_USER_ID_2.value)) - - // Toggling the first user removes them - initialState.eventSink(RoomInviteMembersEvents.ToggleUser(aMatrixUser())) - assertThat(awaitItem().selectedUsers).containsExactly(aMatrixUser(id = A_USER_ID_2.value)) - } - } - - @Test - fun `present - selected users appear as such in search results`() = runTest { - val repository = FakeUserRepository() - val presenter = RoomInviteMembersPresenter( - userRepository = repository, - roomMemberListDataSource = createDataSource(FakeBaseRoom()), - coroutineDispatchers = testCoroutineDispatchers(useUnconfinedTestDispatcher = true) - ) - moleculeFlow(RecompositionMode.Immediate) { - presenter.present() - }.test { - val initialState = awaitItem() - skipItems(1) - - val selectedUser = aMatrixUser() - - initialState.eventSink(RoomInviteMembersEvents.ToggleUser(selectedUser)) - - initialState.eventSink(RoomInviteMembersEvents.UpdateSearchQuery("some query")) - skipItems(1) - - assertThat(repository.providedQuery).isEqualTo("some query") - repository.emitStateWithUsers(users = aMatrixUserList() + selectedUser) - skipItems(2) - - val resultState = awaitItem() - assertThat(resultState.searchResults).isInstanceOf(SearchBarResultState.Results::class.java) - - val users = resultState.searchResults.users() - - // The one user we have previously toggled is marked as selected - val shouldBeSelectedUser = users.find { it.matrixUser == selectedUser } - assertThat(shouldBeSelectedUser).isNotNull() - assertThat(shouldBeSelectedUser?.isSelected).isTrue() - - // And no others are - val allOtherUsers = users.minus(shouldBeSelectedUser!!) - assertThat(allOtherUsers.none { it.isSelected }).isTrue() - } - } - - @Test - fun `present - toggling a user updates existing search results`() = runTest { - val repository = FakeUserRepository() - val presenter = RoomInviteMembersPresenter( - userRepository = repository, - roomMemberListDataSource = createDataSource(FakeBaseRoom()), - coroutineDispatchers = testCoroutineDispatchers(useUnconfinedTestDispatcher = true) - ) - moleculeFlow(RecompositionMode.Immediate) { - presenter.present() - }.test { - val initialState = awaitItem() - skipItems(1) - - val selectedUser = aMatrixUser() - - // Given a query is made - initialState.eventSink(RoomInviteMembersEvents.UpdateSearchQuery("some query")) - skipItems(1) - - assertThat(repository.providedQuery).isEqualTo("some query") - repository.emitStateWithUsers(users = aMatrixUserList() + selectedUser) - skipItems(2) - - // And then a user is toggled - initialState.eventSink(RoomInviteMembersEvents.ToggleUser(selectedUser)) - skipItems(1) - val resultState = awaitItem() - - // The results are updated... - assertThat(resultState.searchResults).isInstanceOf(SearchBarResultState.Results::class.java) - val users = resultState.searchResults.users() - - // The one user we have now toggled is marked as selected - val shouldBeSelectedUser = users.find { it.matrixUser == selectedUser } - assertThat(shouldBeSelectedUser).isNotNull() - assertThat(shouldBeSelectedUser?.isSelected).isTrue() - - // And no others are - val allOtherUsers = users.minus(shouldBeSelectedUser!!) - assertThat(allOtherUsers.none { it.isSelected }).isTrue() - } - } - - private suspend fun FakeUserRepository.emitStateWithUsers( - users: List, - isSearching: Boolean = false - ) { - emitState( - results = users.map { UserSearchResult(it) }, - isSearching = isSearching, - ) - } - - private suspend fun FakeUserRepository.emitState( - results: List, - isSearching: Boolean = false - ) { - val state = UserSearchResultState( - results = results, - isSearching = isSearching - ) - emitState(state) - } - - private fun TestScope.createDataSource( - room: BaseRoom = aRoom().apply { - givenRoomMembersState(RoomMembersState.Ready(aRoomMemberList())) - }, - coroutineDispatchers: CoroutineDispatchers = testCoroutineDispatchers() - ) = RoomMemberListDataSource(room, coroutineDispatchers) - - private fun SearchBarResultState>.users() = - (this as? SearchBarResultState.Results>)?.results.orEmpty() -} diff --git a/features/roommembermoderation/impl/src/main/res/values-eu/translations.xml b/features/roommembermoderation/impl/src/main/res/values-eu/translations.xml index c49ae2d4d5..a7f61e1a55 100644 --- a/features/roommembermoderation/impl/src/main/res/values-eu/translations.xml +++ b/features/roommembermoderation/impl/src/main/res/values-eu/translations.xml @@ -4,6 +4,7 @@ "Ezarri debekua" "Ziur kide honi debekua ezarri nahi diozula?" "%1$s(r)i debekua ezartzen" + "Kendu" "Ikusi profila" "Kendu gelatik" "Kidea kendu eta etorkizunean sartzea debekatu?" diff --git a/features/roommembermoderation/impl/src/main/res/values-zh-rTW/translations.xml b/features/roommembermoderation/impl/src/main/res/values-zh-rTW/translations.xml index 152e2d3a8f..1f2e372b8c 100644 --- a/features/roommembermoderation/impl/src/main/res/values-zh-rTW/translations.xml +++ b/features/roommembermoderation/impl/src/main/res/values-zh-rTW/translations.xml @@ -12,4 +12,9 @@ "踢出聊天室" "移除成員並禁止未來再度加入?" "正在踢出 %1$s…" + "從聊天室解除封鎖" + "解除封鎖" + "若受到邀請,他們仍可再次加入聊天室" + "您確定您想要取消封鎖此成員嗎?" + "解除封鎖 %1$s" diff --git a/features/roommembermoderation/impl/src/main/res/values-zh/translations.xml b/features/roommembermoderation/impl/src/main/res/values-zh/translations.xml index 20c002aa76..3eb55ef12b 100644 --- a/features/roommembermoderation/impl/src/main/res/values-zh/translations.xml +++ b/features/roommembermoderation/impl/src/main/res/values-zh/translations.xml @@ -12,4 +12,7 @@ "从聊天室移除" "删除成员并禁止重新加入?" "正在移除 %1$s……" + "解除封禁" + "如果再次收到邀请,他们可以重新加入该聊天室" + "确定要解除该成员的封禁吗?" diff --git a/features/securebackup/impl/src/main/res/values-eu/translations.xml b/features/securebackup/impl/src/main/res/values-eu/translations.xml index 3cb643a04c..139127f8c7 100644 --- a/features/securebackup/impl/src/main/res/values-eu/translations.xml +++ b/features/securebackup/impl/src/main/res/values-eu/translations.xml @@ -16,6 +16,7 @@ "Gorde berreskuratze-gako berria pasahitz-kudeatzaile batean edo enkriptatutako ohar batean" "Berrezarri zure kontuaren enkriptazioa beste gailu bat erabiliz" "Jarraitu berrezarpenarekin" + "Zure kontuaren xehetasunak, kontaktuak, hobespenak eta txat-zerrenda gordeko dira" "Ezin duzu baieztatu? Zure identitatea berrezarri beharko duzu." "Desaktibatu" "Enkriptatutako mezuak galduko dituzu gailu guztietan saioa amaitzen baduzu." diff --git a/features/securebackup/impl/src/main/res/values-ur/translations.xml b/features/securebackup/impl/src/main/res/values-ur/translations.xml index 80b55d8878..f1098de9dc 100644 --- a/features/securebackup/impl/src/main/res/values-ur/translations.xml +++ b/features/securebackup/impl/src/main/res/values-ur/translations.xml @@ -16,6 +16,7 @@ "نئی بازیابی کلید بنانے کیلئے ہدایات پر عمل کریں" "اپنی نئی بازیابی کلید کو لفظ عبور منتظم یا مرکوز کردہ ملحوظہ میں محفوظ کریں" "کسی دوسرے آلے کا استعمال کرتے ہوئے اپنے کھاتہ کیلئے مرموز کاری کو بحال کریں" + "ری سیٹ جاری رکھیں" "آپ کے کھاتہ کی تفصیلات، رابطے، ترجیحات اور گفتگو کی فہرست رکھی جائے گی۔" "آپ کسی بھی پیغام کی سرگزشت کو کھو دیں گے جو صرف خادم پر محفوظ ہے۔" "آپ کو اپنے تمام موجودہ آلات اور رابطوں کی دوبارہ توثیق کرنی ہوگی۔" @@ -57,6 +58,7 @@ "ہاں، اب بحال کر دیں" "یہ عملیہ ناقابل تلافی ہے۔" "کیا آپ کو یقین ہے کہ آپ اپنی شناخت بحال کر دینا چاہتے ہیں؟" + "ایک نامعلوم غلطی ہو گئی۔ براہ کرم چیک کریں کہ آپ کے اکاؤنٹ کا پاسورڈ درست ہے اور دوبارہ کوشش کریں۔" "درج کریں…" "تصدیق کریں کہ آپ اپنی شناخت بحال کر دینا چاہتے ہیں۔" "جاری رکھنے کے لیے اپنے کھاتہ کا لفظ عبور درج کریں۔" diff --git a/features/securebackup/impl/src/main/res/values-uz/translations.xml b/features/securebackup/impl/src/main/res/values-uz/translations.xml index c3bec705ad..9f2cb7f163 100644 --- a/features/securebackup/impl/src/main/res/values-uz/translations.xml +++ b/features/securebackup/impl/src/main/res/values-uz/translations.xml @@ -2,7 +2,7 @@ "Zaxiralashni o\'chirib qo\'ying" "Zaxiralashni yoqing" - "Zaxiralash xabarlar tarixini yo\'qotmaslikni ta\'minlaydi.%1$s." + "Kryptografik shaxsiyatingizni va xabar kalitlaringizni serverda xavfsiz saqlang. Bu sizga har qanday yangi qurilmalarda xabar tarixingizni ko\'rish imkonini beradi. %1$s." "Zaxira" "Qayta tiklash kalitini o\'zgartiring" "Sizning chat zaxirangiz hozirda sinxronlashtirilmagan." @@ -17,13 +17,15 @@ "Haqiqatan ham zaxiralashni o‘chirib qo‘ymoqchimisiz?" "Mavjud kalitingizni yo\'qotgan bo\'lsangiz, yangi tiklash kalitini oling. Qayta tiklash kalitini almashtirganingizdan so\'ng, eski kalitingiz ishlamaydi." "Yangi tiklash kalitini yarating" - "Qayta tiklash kalitingizni xavfsiz joyda saqlashingiz mumkinligiga ishonch hosil qiling" + "Buni hech kimga ulashmang!" "Qayta tiklash kaliti oʻzgartirildi" "Qayta tiklash kaliti almashtirilsinmi?" "Hech kim bu ekranni kora olmasligiga ishonch hosil qiling!" "Agar sizda xavfsizlik kaliti yoki xavfsizlik iborasi bolsa, bu ham ishlaydi." "Kirish…" "Qayta tiklash kaliti tasdiqlandi" + "Qayta tiklash kaliti nusxalandi" + "Yaratilmoqda…" "Qayta tiklash kalitini saqlang" "Qayta tiklash kalitingizni xavfsiz joyga yozing yoki parol menejerida saqlang." "Qayta tiklash kalitidan nusxa olish uchun bosing" @@ -32,7 +34,7 @@ "Zaxira kalitingizni saqladingizmi?" "Suhbatingiz zaxira nusxasi tiklash kaliti bilan himoyalangan. Agar sozlashdan keyin sizga yangi tiklash kaliti kerak boʻlsa, “Qayta tiklash kalitini oʻzgartirish”ni tanlash orqali qayta yaratishingiz mumkin." "Qayta tiklash kalitini yarating" - "Qayta tiklash kalitingizni xavfsiz joyda saqlashingiz mumkinligiga ishonch hosil qiling" + "Buni hech kimga ulashmang!" "Qayta tiklash muvaffaqiyatli sozlandi" "Qayta tiklashni sozlang" "Kirish…" 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 index ea38b0bc70..b66765f472 100644 --- 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 @@ -22,6 +22,7 @@ import io.element.android.libraries.di.annotations.SessionCoroutineScope import io.element.android.libraries.matrix.api.MatrixClient import io.element.android.libraries.matrix.api.core.RoomId import io.element.android.libraries.matrix.api.room.JoinedRoom +import io.element.android.libraries.matrix.api.timeline.Timeline import io.element.android.libraries.mediaupload.api.MediaOptimizationConfigProvider import io.element.android.libraries.mediaupload.api.MediaPreProcessor import io.element.android.libraries.mediaupload.api.MediaSender @@ -88,6 +89,7 @@ class SharePresenter @AssistedInject constructor( val mediaSender = MediaSender( preProcessor = mediaPreProcessor, room = room, + timelineMode = Timeline.Mode.Live, mediaOptimizationConfigProvider = mediaOptimizationConfigProvider, ) filesToShare diff --git a/features/share/impl/src/test/kotlin/io/element/android/features/share/impl/SharePresenterTest.kt b/features/share/impl/src/test/kotlin/io/element/android/features/share/impl/SharePresenterTest.kt index a9346fbf6e..7ddb7d0ae4 100644 --- a/features/share/impl/src/test/kotlin/io/element/android/features/share/impl/SharePresenterTest.kt +++ b/features/share/impl/src/test/kotlin/io/element/android/features/share/impl/SharePresenterTest.kt @@ -17,7 +17,6 @@ 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.api.core.EventId -import io.element.android.libraries.matrix.api.core.ProgressCallback import io.element.android.libraries.matrix.api.media.FileInfo import io.element.android.libraries.matrix.test.A_MESSAGE import io.element.android.libraries.matrix.test.A_ROOM_ID @@ -122,7 +121,7 @@ class SharePresenterTest { @Test fun `present - send media ok`() = runTest { val sendFileResult = - lambdaRecorder> { _, _, _, _, _, _ -> + lambdaRecorder> { _, _, _, _, _ -> Result.success(FakeMediaUploadHandler()) } val joinedRoom = FakeJoinedRoom( diff --git a/features/startchat/api/build.gradle.kts b/features/startchat/api/build.gradle.kts new file mode 100644 index 0000000000..77822f1a15 --- /dev/null +++ b/features/startchat/api/build.gradle.kts @@ -0,0 +1,18 @@ +/* + * Copyright 2023, 2024 New Vector Ltd. + * + * SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial + * Please see LICENSE files in the repository root for full details. + */ +plugins { + id("io.element.android-library") +} + +android { + namespace = "io.element.android.features.startchat.api" +} + +dependencies { + implementation(projects.libraries.architecture) + implementation(projects.libraries.matrix.api) +} diff --git a/features/createroom/api/src/main/kotlin/io/element/android/features/createroom/api/ConfirmingStartDmWithMatrixUser.kt b/features/startchat/api/src/main/kotlin/io/element/android/features/startchat/api/ConfirmingStartDmWithMatrixUser.kt similarity index 89% rename from features/createroom/api/src/main/kotlin/io/element/android/features/createroom/api/ConfirmingStartDmWithMatrixUser.kt rename to features/startchat/api/src/main/kotlin/io/element/android/features/startchat/api/ConfirmingStartDmWithMatrixUser.kt index af19408324..192c32fee7 100644 --- a/features/createroom/api/src/main/kotlin/io/element/android/features/createroom/api/ConfirmingStartDmWithMatrixUser.kt +++ b/features/startchat/api/src/main/kotlin/io/element/android/features/startchat/api/ConfirmingStartDmWithMatrixUser.kt @@ -5,7 +5,7 @@ * Please see LICENSE files in the repository root for full details. */ -package io.element.android.features.createroom.api +package io.element.android.features.startchat.api import io.element.android.libraries.architecture.AsyncAction import io.element.android.libraries.matrix.api.user.MatrixUser diff --git a/features/startchat/api/src/main/kotlin/io/element/android/features/startchat/api/StartChatEntryPoint.kt b/features/startchat/api/src/main/kotlin/io/element/android/features/startchat/api/StartChatEntryPoint.kt new file mode 100644 index 0000000000..17b9b902e2 --- /dev/null +++ b/features/startchat/api/src/main/kotlin/io/element/android/features/startchat/api/StartChatEntryPoint.kt @@ -0,0 +1,27 @@ +/* + * Copyright 2023, 2024 New Vector Ltd. + * + * SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial + * Please see LICENSE files in the repository root for full details. + */ + +package io.element.android.features.startchat.api + +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.matrix.api.core.RoomIdOrAlias + +interface StartChatEntryPoint : FeatureEntryPoint { + fun nodeBuilder(parentNode: Node, buildContext: BuildContext): NodeBuilder + interface NodeBuilder { + fun callback(callback: Callback): NodeBuilder + fun build(): Node + } + + interface Callback : Plugin { + fun onOpenRoom(roomIdOrAlias: RoomIdOrAlias, serverNames: List) + fun onOpenRoomDirectory() + } +} diff --git a/features/createroom/api/src/main/kotlin/io/element/android/features/createroom/api/StartDMAction.kt b/features/startchat/api/src/main/kotlin/io/element/android/features/startchat/api/StartDMAction.kt similarity index 95% rename from features/createroom/api/src/main/kotlin/io/element/android/features/createroom/api/StartDMAction.kt rename to features/startchat/api/src/main/kotlin/io/element/android/features/startchat/api/StartDMAction.kt index e64be9f923..b49a9fbdfd 100644 --- a/features/createroom/api/src/main/kotlin/io/element/android/features/createroom/api/StartDMAction.kt +++ b/features/startchat/api/src/main/kotlin/io/element/android/features/startchat/api/StartDMAction.kt @@ -5,7 +5,7 @@ * Please see LICENSE files in the repository root for full details. */ -package io.element.android.features.createroom.api +package io.element.android.features.startchat.api import androidx.compose.runtime.MutableState import io.element.android.libraries.architecture.AsyncAction diff --git a/features/startchat/impl/build.gradle.kts b/features/startchat/impl/build.gradle.kts new file mode 100644 index 0000000000..ddc8a271ef --- /dev/null +++ b/features/startchat/impl/build.gradle.kts @@ -0,0 +1,65 @@ +import extension.ComponentMergingStrategy +import extension.setupAnvil + +/* + * Copyright 2022-2024 New Vector Ltd. + * + * SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial + * Please see LICENSE files in the repository root for full details. + */ + +plugins { + id("io.element.android-compose-library") + id("kotlin-parcelize") +} + +android { + namespace = "io.element.android.features.startchat.impl" + + testOptions { + unitTests { + isIncludeAndroidResources = true + } + } +} + +setupAnvil(componentMergingStrategy = ComponentMergingStrategy.KSP) + +dependencies { + implementation(projects.libraries.core) + implementation(projects.libraries.architecture) + implementation(projects.libraries.matrix.api) + implementation(projects.libraries.matrixui) + implementation(projects.libraries.designsystem) + implementation(projects.libraries.uiStrings) + implementation(projects.libraries.androidutils) + implementation(projects.libraries.deeplink.api) + implementation(projects.libraries.mediapickers.api) + implementation(projects.libraries.mediaupload.api) + implementation(projects.libraries.permissions.api) + implementation(projects.libraries.usersearch.impl) + implementation(projects.services.analytics.api) + implementation(libs.coil.compose) + implementation(projects.libraries.featureflag.api) + implementation(projects.features.createroom.api) + api(projects.features.startchat.api) + + testImplementation(libs.test.junit) + testImplementation(libs.test.mockk) + testImplementation(libs.coroutines.test) + testImplementation(libs.molecule.runtime) + testImplementation(libs.test.truth) + testImplementation(libs.test.turbine) + testImplementation(libs.test.robolectric) + testImplementation(projects.services.analytics.test) + testImplementation(projects.libraries.matrix.test) + testImplementation(projects.libraries.mediapickers.test) + testImplementation(projects.libraries.mediaupload.test) + testImplementation(projects.libraries.permissions.test) + testImplementation(projects.libraries.usersearch.test) + testImplementation(projects.features.startchat.test) + testImplementation(projects.libraries.featureflag.test) + testImplementation(projects.tests.testutils) + testImplementation(libs.androidx.compose.ui.test.junit) + testReleaseImplementation(libs.androidx.compose.ui.test.manifest) +} diff --git a/features/createroom/impl/src/main/kotlin/io/element/android/features/createroom/CreateRoomNavigator.kt b/features/startchat/impl/src/main/kotlin/io/element/android/features/startchat/StartChatNavigator.kt similarity index 86% rename from features/createroom/impl/src/main/kotlin/io/element/android/features/createroom/CreateRoomNavigator.kt rename to features/startchat/impl/src/main/kotlin/io/element/android/features/startchat/StartChatNavigator.kt index 69eac7d369..a45b4dddab 100644 --- a/features/createroom/impl/src/main/kotlin/io/element/android/features/createroom/CreateRoomNavigator.kt +++ b/features/startchat/impl/src/main/kotlin/io/element/android/features/startchat/StartChatNavigator.kt @@ -5,18 +5,18 @@ * Please see LICENSE files in the repository root for full details. */ -package io.element.android.features.createroom +package io.element.android.features.startchat import com.bumble.appyx.core.plugin.Plugin import com.bumble.appyx.navmodel.backstack.BackStack import com.bumble.appyx.navmodel.backstack.operation.push -import io.element.android.features.createroom.impl.CreateRoomFlowNode.NavTarget +import io.element.android.features.startchat.impl.StartChatFlowNode.NavTarget import io.element.android.libraries.architecture.overlay.Overlay import io.element.android.libraries.architecture.overlay.operation.hide import io.element.android.libraries.architecture.overlay.operation.show import io.element.android.libraries.matrix.api.core.RoomIdOrAlias -interface CreateRoomNavigator : Plugin { +interface StartChatNavigator : Plugin { fun onOpenRoom(roomIdOrAlias: RoomIdOrAlias, serverNames: List) fun onCreateNewRoom() fun onShowJoinRoomByAddress() @@ -24,12 +24,12 @@ interface CreateRoomNavigator : Plugin { fun onOpenRoomDirectory() } -class DefaultCreateRoomNavigator( +class DefaultStartChatNavigator( private val backstack: BackStack, private val overlay: Overlay, private val openRoom: (RoomIdOrAlias, List) -> Unit, private val openRoomDirectory: () -> Unit, -) : CreateRoomNavigator { +) : StartChatNavigator { override fun onOpenRoom(roomIdOrAlias: RoomIdOrAlias, serverNames: List) = openRoom(roomIdOrAlias, serverNames) override fun onOpenRoomDirectory() = openRoomDirectory() diff --git a/features/startchat/impl/src/main/kotlin/io/element/android/features/startchat/impl/DefaultStartChatEntryPoint.kt b/features/startchat/impl/src/main/kotlin/io/element/android/features/startchat/impl/DefaultStartChatEntryPoint.kt new file mode 100644 index 0000000000..9f9073f1d7 --- /dev/null +++ b/features/startchat/impl/src/main/kotlin/io/element/android/features/startchat/impl/DefaultStartChatEntryPoint.kt @@ -0,0 +1,35 @@ +/* + * Copyright 2025 New Vector Ltd. + * + * SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial + * Please see LICENSE files in the repository root for full details. + */ + +package io.element.android.features.startchat.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.startchat.api.StartChatEntryPoint +import io.element.android.libraries.architecture.createNode +import io.element.android.libraries.di.AppScope +import javax.inject.Inject + +@ContributesBinding(AppScope::class) +class DefaultStartChatEntryPoint @Inject constructor() : StartChatEntryPoint { + override fun nodeBuilder(parentNode: Node, buildContext: BuildContext): StartChatEntryPoint.NodeBuilder { + val plugins = ArrayList() + + return object : StartChatEntryPoint.NodeBuilder { + override fun callback(callback: StartChatEntryPoint.Callback): StartChatEntryPoint.NodeBuilder { + plugins += callback + return this + } + + override fun build(): Node { + return parentNode.createNode(buildContext, plugins) + } + } + } +} diff --git a/features/createroom/impl/src/main/kotlin/io/element/android/features/createroom/impl/DefaultStartDMAction.kt b/features/startchat/impl/src/main/kotlin/io/element/android/features/startchat/impl/DefaultStartDMAction.kt similarity index 90% rename from features/createroom/impl/src/main/kotlin/io/element/android/features/createroom/impl/DefaultStartDMAction.kt rename to features/startchat/impl/src/main/kotlin/io/element/android/features/startchat/impl/DefaultStartDMAction.kt index c9b60786bd..b09c5ea174 100644 --- a/features/createroom/impl/src/main/kotlin/io/element/android/features/createroom/impl/DefaultStartDMAction.kt +++ b/features/startchat/impl/src/main/kotlin/io/element/android/features/startchat/impl/DefaultStartDMAction.kt @@ -5,13 +5,13 @@ * Please see LICENSE files in the repository root for full details. */ -package io.element.android.features.createroom.impl +package io.element.android.features.startchat.impl import androidx.compose.runtime.MutableState import com.squareup.anvil.annotations.ContributesBinding import im.vector.app.features.analytics.plan.CreatedRoom -import io.element.android.features.createroom.api.ConfirmingStartDmWithMatrixUser -import io.element.android.features.createroom.api.StartDMAction +import io.element.android.features.startchat.api.ConfirmingStartDmWithMatrixUser +import io.element.android.features.startchat.api.StartDMAction import io.element.android.libraries.architecture.AsyncAction import io.element.android.libraries.di.SessionScope import io.element.android.libraries.matrix.api.MatrixClient diff --git a/features/startchat/impl/src/main/kotlin/io/element/android/features/startchat/impl/StartChatFlowNode.kt b/features/startchat/impl/src/main/kotlin/io/element/android/features/startchat/impl/StartChatFlowNode.kt new file mode 100644 index 0000000000..a312b6fa84 --- /dev/null +++ b/features/startchat/impl/src/main/kotlin/io/element/android/features/startchat/impl/StartChatFlowNode.kt @@ -0,0 +1,101 @@ +/* + * Copyright 2025 New Vector Ltd. + * + * SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial + * Please see LICENSE files in the repository root for full details. + */ + +package io.element.android.features.startchat.impl + +import android.os.Parcelable +import androidx.compose.foundation.layout.Box +import androidx.compose.runtime.Composable +import androidx.compose.runtime.remember +import androidx.compose.ui.Modifier +import com.bumble.appyx.core.modality.BuildContext +import com.bumble.appyx.core.navigation.transition.JumpToEndTransitionHandler +import com.bumble.appyx.core.node.Node +import com.bumble.appyx.core.plugin.Plugin +import com.bumble.appyx.core.plugin.plugins +import com.bumble.appyx.navmodel.backstack.BackStack +import dagger.assisted.Assisted +import dagger.assisted.AssistedInject +import io.element.android.anvilannotations.ContributesNode +import io.element.android.features.createroom.api.CreateRoomEntryPoint +import io.element.android.features.startchat.DefaultStartChatNavigator +import io.element.android.features.startchat.api.StartChatEntryPoint +import io.element.android.features.startchat.impl.joinbyaddress.JoinRoomByAddressNode +import io.element.android.features.startchat.impl.root.StartChatNode +import io.element.android.libraries.architecture.BackstackView +import io.element.android.libraries.architecture.BaseFlowNode +import io.element.android.libraries.architecture.OverlayView +import io.element.android.libraries.architecture.createNode +import io.element.android.libraries.di.SessionScope +import io.element.android.libraries.matrix.api.core.RoomId +import io.element.android.libraries.matrix.api.core.toRoomIdOrAlias +import kotlinx.parcelize.Parcelize + +@ContributesNode(SessionScope::class) +class StartChatFlowNode @AssistedInject constructor( + @Assisted buildContext: BuildContext, + @Assisted plugins: List, + private val createRoomEntryPoint: CreateRoomEntryPoint, +) : BaseFlowNode( + backstack = BackStack( + initialElement = NavTarget.Root, + savedStateMap = buildContext.savedStateMap, + ), + buildContext = buildContext, + plugins = plugins +) { + sealed interface NavTarget : Parcelable { + @Parcelize + data object Root : NavTarget + + @Parcelize + data object NewRoom : NavTarget + + @Parcelize + data object JoinByAddress : NavTarget + } + + private val navigator = DefaultStartChatNavigator( + backstack = backstack, + overlay = overlay, + openRoom = { roomIdOrAlias, viaServers -> + plugins().forEach { it.onOpenRoom(roomIdOrAlias, viaServers) } + }, + openRoomDirectory = { + plugins().forEach { it.onOpenRoomDirectory() } + } + ) + + override fun resolve(navTarget: NavTarget, buildContext: BuildContext): Node { + return when (navTarget) { + NavTarget.Root -> { + createNode(buildContext = buildContext, plugins = listOf(navigator)) + } + NavTarget.NewRoom -> { + val callback = object : CreateRoomEntryPoint.Callback { + override fun onRoomCreated(roomId: RoomId) { + navigator.onOpenRoom(roomId.toRoomIdOrAlias(), emptyList()) + } + } + createRoomEntryPoint.nodeBuilder(parentNode = this, buildContext = buildContext) + .callback(callback) + .build() + } + NavTarget.JoinByAddress -> { + createNode(buildContext = buildContext, plugins = listOf(navigator)) + } + } + } + + @Composable + override fun View(modifier: Modifier) { + Box(modifier = modifier) { + BackstackView() + OverlayView(transitionHandler = remember { JumpToEndTransitionHandler() }) + } + } +} diff --git a/features/createroom/impl/src/main/kotlin/io/element/android/features/createroom/impl/components/SearchMultipleUsersResultItem.kt b/features/startchat/impl/src/main/kotlin/io/element/android/features/startchat/impl/components/SearchMultipleUsersResultItem.kt similarity index 98% rename from features/createroom/impl/src/main/kotlin/io/element/android/features/createroom/impl/components/SearchMultipleUsersResultItem.kt rename to features/startchat/impl/src/main/kotlin/io/element/android/features/startchat/impl/components/SearchMultipleUsersResultItem.kt index af12895fff..867ac9d918 100644 --- a/features/createroom/impl/src/main/kotlin/io/element/android/features/createroom/impl/components/SearchMultipleUsersResultItem.kt +++ b/features/startchat/impl/src/main/kotlin/io/element/android/features/startchat/impl/components/SearchMultipleUsersResultItem.kt @@ -5,7 +5,7 @@ * Please see LICENSE files in the repository root for full details. */ -package io.element.android.features.createroom.impl.components +package io.element.android.features.startchat.impl.components import androidx.compose.foundation.layout.Column import androidx.compose.runtime.Composable diff --git a/features/createroom/impl/src/main/kotlin/io/element/android/features/createroom/impl/components/SearchSingleUserResultItem.kt b/features/startchat/impl/src/main/kotlin/io/element/android/features/startchat/impl/components/SearchSingleUserResultItem.kt similarity index 97% rename from features/createroom/impl/src/main/kotlin/io/element/android/features/createroom/impl/components/SearchSingleUserResultItem.kt rename to features/startchat/impl/src/main/kotlin/io/element/android/features/startchat/impl/components/SearchSingleUserResultItem.kt index eb922f1ae3..bd94d136af 100644 --- a/features/createroom/impl/src/main/kotlin/io/element/android/features/createroom/impl/components/SearchSingleUserResultItem.kt +++ b/features/startchat/impl/src/main/kotlin/io/element/android/features/startchat/impl/components/SearchSingleUserResultItem.kt @@ -5,7 +5,7 @@ * Please see LICENSE files in the repository root for full details. */ -package io.element.android.features.createroom.impl.components +package io.element.android.features.startchat.impl.components import androidx.compose.foundation.clickable import androidx.compose.foundation.layout.Column diff --git a/features/createroom/impl/src/main/kotlin/io/element/android/features/createroom/impl/components/SearchUserBar.kt b/features/startchat/impl/src/main/kotlin/io/element/android/features/startchat/impl/components/SearchUserBar.kt similarity index 98% rename from features/createroom/impl/src/main/kotlin/io/element/android/features/createroom/impl/components/SearchUserBar.kt rename to features/startchat/impl/src/main/kotlin/io/element/android/features/startchat/impl/components/SearchUserBar.kt index 290c1aff0c..3d42c40067 100644 --- a/features/createroom/impl/src/main/kotlin/io/element/android/features/createroom/impl/components/SearchUserBar.kt +++ b/features/startchat/impl/src/main/kotlin/io/element/android/features/startchat/impl/components/SearchUserBar.kt @@ -5,7 +5,7 @@ * Please see LICENSE files in the repository root for full details. */ -package io.element.android.features.createroom.impl.components +package io.element.android.features.startchat.impl.components import androidx.compose.animation.animateColorAsState import androidx.compose.animation.core.Spring diff --git a/features/createroom/impl/src/main/kotlin/io/element/android/features/createroom/impl/components/UserListView.kt b/features/startchat/impl/src/main/kotlin/io/element/android/features/startchat/impl/components/UserListView.kt similarity index 94% rename from features/createroom/impl/src/main/kotlin/io/element/android/features/createroom/impl/components/UserListView.kt rename to features/startchat/impl/src/main/kotlin/io/element/android/features/startchat/impl/components/UserListView.kt index a660480258..753bebec83 100644 --- a/features/createroom/impl/src/main/kotlin/io/element/android/features/createroom/impl/components/UserListView.kt +++ b/features/startchat/impl/src/main/kotlin/io/element/android/features/startchat/impl/components/UserListView.kt @@ -1,11 +1,11 @@ /* - * Copyright 2023, 2024 New Vector Ltd. + * Copyright 2025 New Vector Ltd. * * SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial * Please see LICENSE files in the repository root for full details. */ -package io.element.android.features.createroom.impl.components +package io.element.android.features.startchat.impl.components import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.PaddingValues @@ -16,9 +16,9 @@ import androidx.compose.ui.Modifier import androidx.compose.ui.res.stringResource import androidx.compose.ui.tooling.preview.PreviewParameter import androidx.compose.ui.unit.dp -import io.element.android.features.createroom.impl.userlist.UserListEvents -import io.element.android.features.createroom.impl.userlist.UserListState -import io.element.android.features.createroom.impl.userlist.UserListStateProvider +import io.element.android.features.startchat.impl.userlist.UserListEvents +import io.element.android.features.startchat.impl.userlist.UserListState +import io.element.android.features.startchat.impl.userlist.UserListStateProvider 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 diff --git a/features/createroom/impl/src/main/kotlin/io/element/android/features/createroom/impl/joinbyaddress/JoinRoomByAddressEvents.kt b/features/startchat/impl/src/main/kotlin/io/element/android/features/startchat/impl/joinbyaddress/JoinRoomByAddressEvents.kt similarity index 86% rename from features/createroom/impl/src/main/kotlin/io/element/android/features/createroom/impl/joinbyaddress/JoinRoomByAddressEvents.kt rename to features/startchat/impl/src/main/kotlin/io/element/android/features/startchat/impl/joinbyaddress/JoinRoomByAddressEvents.kt index dbbcef56fa..648146fbd7 100644 --- a/features/createroom/impl/src/main/kotlin/io/element/android/features/createroom/impl/joinbyaddress/JoinRoomByAddressEvents.kt +++ b/features/startchat/impl/src/main/kotlin/io/element/android/features/startchat/impl/joinbyaddress/JoinRoomByAddressEvents.kt @@ -5,7 +5,7 @@ * Please see LICENSE files in the repository root for full details. */ -package io.element.android.features.createroom.impl.joinbyaddress +package io.element.android.features.startchat.impl.joinbyaddress sealed interface JoinRoomByAddressEvents { data object Dismiss : JoinRoomByAddressEvents diff --git a/features/createroom/impl/src/main/kotlin/io/element/android/features/createroom/impl/joinbyaddress/JoinRoomByAddressNode.kt b/features/startchat/impl/src/main/kotlin/io/element/android/features/startchat/impl/joinbyaddress/JoinRoomByAddressNode.kt similarity index 85% rename from features/createroom/impl/src/main/kotlin/io/element/android/features/createroom/impl/joinbyaddress/JoinRoomByAddressNode.kt rename to features/startchat/impl/src/main/kotlin/io/element/android/features/startchat/impl/joinbyaddress/JoinRoomByAddressNode.kt index d6338ab43c..67dba8b46e 100644 --- a/features/createroom/impl/src/main/kotlin/io/element/android/features/createroom/impl/joinbyaddress/JoinRoomByAddressNode.kt +++ b/features/startchat/impl/src/main/kotlin/io/element/android/features/startchat/impl/joinbyaddress/JoinRoomByAddressNode.kt @@ -5,7 +5,7 @@ * Please see LICENSE files in the repository root for full details. */ -package io.element.android.features.createroom.impl.joinbyaddress +package io.element.android.features.startchat.impl.joinbyaddress import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier @@ -16,7 +16,7 @@ import com.bumble.appyx.core.plugin.plugins import dagger.assisted.Assisted import dagger.assisted.AssistedInject import io.element.android.anvilannotations.ContributesNode -import io.element.android.features.createroom.CreateRoomNavigator +import io.element.android.features.startchat.StartChatNavigator import io.element.android.libraries.di.SessionScope @ContributesNode(SessionScope::class) @@ -25,7 +25,7 @@ class JoinRoomByAddressNode @AssistedInject constructor( @Assisted plugins: List, presenterFactory: JoinRoomByAddressPresenter.Factory, ) : Node(buildContext, plugins = plugins) { - private val navigator = plugins().first() + private val navigator = plugins().first() private val presenter = presenterFactory.create(navigator) @Composable diff --git a/features/createroom/impl/src/main/kotlin/io/element/android/features/createroom/impl/joinbyaddress/JoinRoomByAddressPresenter.kt b/features/startchat/impl/src/main/kotlin/io/element/android/features/startchat/impl/joinbyaddress/JoinRoomByAddressPresenter.kt similarity index 95% rename from features/createroom/impl/src/main/kotlin/io/element/android/features/createroom/impl/joinbyaddress/JoinRoomByAddressPresenter.kt rename to features/startchat/impl/src/main/kotlin/io/element/android/features/startchat/impl/joinbyaddress/JoinRoomByAddressPresenter.kt index cf4788cbbf..4e1f9f9ab0 100644 --- a/features/createroom/impl/src/main/kotlin/io/element/android/features/createroom/impl/joinbyaddress/JoinRoomByAddressPresenter.kt +++ b/features/startchat/impl/src/main/kotlin/io/element/android/features/startchat/impl/joinbyaddress/JoinRoomByAddressPresenter.kt @@ -5,7 +5,7 @@ * Please see LICENSE files in the repository root for full details. */ -package io.element.android.features.createroom.impl.joinbyaddress +package io.element.android.features.startchat.impl.joinbyaddress import androidx.compose.runtime.Composable import androidx.compose.runtime.LaunchedEffect @@ -18,7 +18,7 @@ import androidx.compose.runtime.setValue import dagger.assisted.Assisted import dagger.assisted.AssistedFactory import dagger.assisted.AssistedInject -import io.element.android.features.createroom.CreateRoomNavigator +import io.element.android.features.startchat.StartChatNavigator import io.element.android.libraries.architecture.Presenter import io.element.android.libraries.core.data.tryOrNull import io.element.android.libraries.matrix.api.MatrixClient @@ -32,13 +32,13 @@ import kotlin.time.Duration.Companion.seconds private const val ADDRESS_RESOLVE_TIMEOUT_IN_SECONDS = 10 class JoinRoomByAddressPresenter @AssistedInject constructor( - @Assisted private val navigator: CreateRoomNavigator, + @Assisted private val navigator: StartChatNavigator, private val client: MatrixClient, private val roomAliasHelper: RoomAliasHelper, ) : Presenter { @AssistedFactory interface Factory { - fun create(navigator: CreateRoomNavigator): JoinRoomByAddressPresenter + fun create(navigator: StartChatNavigator): JoinRoomByAddressPresenter } @Composable diff --git a/features/createroom/impl/src/main/kotlin/io/element/android/features/createroom/impl/joinbyaddress/JoinRoomByAddressState.kt b/features/startchat/impl/src/main/kotlin/io/element/android/features/startchat/impl/joinbyaddress/JoinRoomByAddressState.kt similarity index 92% rename from features/createroom/impl/src/main/kotlin/io/element/android/features/createroom/impl/joinbyaddress/JoinRoomByAddressState.kt rename to features/startchat/impl/src/main/kotlin/io/element/android/features/startchat/impl/joinbyaddress/JoinRoomByAddressState.kt index 11791181e1..84b01ac263 100644 --- a/features/createroom/impl/src/main/kotlin/io/element/android/features/createroom/impl/joinbyaddress/JoinRoomByAddressState.kt +++ b/features/startchat/impl/src/main/kotlin/io/element/android/features/startchat/impl/joinbyaddress/JoinRoomByAddressState.kt @@ -5,7 +5,7 @@ * Please see LICENSE files in the repository root for full details. */ -package io.element.android.features.createroom.impl.joinbyaddress +package io.element.android.features.startchat.impl.joinbyaddress import androidx.compose.runtime.Immutable import io.element.android.libraries.matrix.api.room.alias.ResolvedRoomAlias diff --git a/features/createroom/impl/src/main/kotlin/io/element/android/features/createroom/impl/joinbyaddress/JoinRoomByAddressStateProvider.kt b/features/startchat/impl/src/main/kotlin/io/element/android/features/startchat/impl/joinbyaddress/JoinRoomByAddressStateProvider.kt similarity index 95% rename from features/createroom/impl/src/main/kotlin/io/element/android/features/createroom/impl/joinbyaddress/JoinRoomByAddressStateProvider.kt rename to features/startchat/impl/src/main/kotlin/io/element/android/features/startchat/impl/joinbyaddress/JoinRoomByAddressStateProvider.kt index 6281a8e8e3..847ca78837 100644 --- a/features/createroom/impl/src/main/kotlin/io/element/android/features/createroom/impl/joinbyaddress/JoinRoomByAddressStateProvider.kt +++ b/features/startchat/impl/src/main/kotlin/io/element/android/features/startchat/impl/joinbyaddress/JoinRoomByAddressStateProvider.kt @@ -5,7 +5,7 @@ * Please see LICENSE files in the repository root for full details. */ -package io.element.android.features.createroom.impl.joinbyaddress +package io.element.android.features.startchat.impl.joinbyaddress import androidx.compose.ui.tooling.preview.PreviewParameterProvider import io.element.android.libraries.matrix.api.core.RoomId diff --git a/features/createroom/impl/src/main/kotlin/io/element/android/features/createroom/impl/joinbyaddress/JoinRoomByAddressView.kt b/features/startchat/impl/src/main/kotlin/io/element/android/features/startchat/impl/joinbyaddress/JoinRoomByAddressView.kt similarity index 97% rename from features/createroom/impl/src/main/kotlin/io/element/android/features/createroom/impl/joinbyaddress/JoinRoomByAddressView.kt rename to features/startchat/impl/src/main/kotlin/io/element/android/features/startchat/impl/joinbyaddress/JoinRoomByAddressView.kt index c256f5140c..2d34dcc1cf 100644 --- a/features/createroom/impl/src/main/kotlin/io/element/android/features/createroom/impl/joinbyaddress/JoinRoomByAddressView.kt +++ b/features/startchat/impl/src/main/kotlin/io/element/android/features/startchat/impl/joinbyaddress/JoinRoomByAddressView.kt @@ -5,7 +5,7 @@ * Please see LICENSE files in the repository root for full details. */ -package io.element.android.features.createroom.impl.joinbyaddress +package io.element.android.features.startchat.impl.joinbyaddress import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.Spacer @@ -29,7 +29,7 @@ import androidx.compose.ui.text.input.KeyboardCapitalization import androidx.compose.ui.text.input.KeyboardType import androidx.compose.ui.tooling.preview.PreviewParameter import androidx.compose.ui.unit.dp -import io.element.android.features.createroom.impl.R +import io.element.android.features.startchat.impl.R import io.element.android.libraries.designsystem.preview.ElementPreview import io.element.android.libraries.designsystem.preview.PreviewsDayNight import io.element.android.libraries.designsystem.theme.components.Button diff --git a/features/startchat/impl/src/main/kotlin/io/element/android/features/startchat/impl/root/StartChatEvents.kt b/features/startchat/impl/src/main/kotlin/io/element/android/features/startchat/impl/root/StartChatEvents.kt new file mode 100644 index 0000000000..6ea72d8b05 --- /dev/null +++ b/features/startchat/impl/src/main/kotlin/io/element/android/features/startchat/impl/root/StartChatEvents.kt @@ -0,0 +1,15 @@ +/* + * Copyright 2025 New Vector Ltd. + * + * SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial + * Please see LICENSE files in the repository root for full details. + */ + +package io.element.android.features.startchat.impl.root + +import io.element.android.libraries.matrix.api.user.MatrixUser + +sealed interface StartChatEvents { + data class StartDM(val matrixUser: MatrixUser) : StartChatEvents + data object CancelStartDM : StartChatEvents +} diff --git a/features/createroom/impl/src/main/kotlin/io/element/android/features/createroom/impl/root/CreateRoomRootNode.kt b/features/startchat/impl/src/main/kotlin/io/element/android/features/startchat/impl/root/StartChatNode.kt similarity index 83% rename from features/createroom/impl/src/main/kotlin/io/element/android/features/createroom/impl/root/CreateRoomRootNode.kt rename to features/startchat/impl/src/main/kotlin/io/element/android/features/startchat/impl/root/StartChatNode.kt index f76a5d5c61..9b9a1ec0dc 100644 --- a/features/createroom/impl/src/main/kotlin/io/element/android/features/createroom/impl/root/CreateRoomRootNode.kt +++ b/features/startchat/impl/src/main/kotlin/io/element/android/features/startchat/impl/root/StartChatNode.kt @@ -1,11 +1,11 @@ /* - * Copyright 2023, 2024 New Vector Ltd. + * Copyright 2025 New Vector Ltd. * * SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial * Please see LICENSE files in the repository root for full details. */ -package io.element.android.features.createroom.impl.root +package io.element.android.features.startchat.impl.root import android.app.Activity import androidx.activity.compose.LocalActivity @@ -20,21 +20,21 @@ import dagger.assisted.Assisted import dagger.assisted.AssistedInject import im.vector.app.features.analytics.plan.MobileScreen import io.element.android.anvilannotations.ContributesNode -import io.element.android.features.createroom.CreateRoomNavigator -import io.element.android.libraries.deeplink.usecase.InviteFriendsUseCase +import io.element.android.features.startchat.StartChatNavigator +import io.element.android.libraries.deeplink.api.usecase.InviteFriendsUseCase import io.element.android.libraries.di.SessionScope import io.element.android.libraries.matrix.api.core.toRoomIdOrAlias import io.element.android.services.analytics.api.AnalyticsService @ContributesNode(SessionScope::class) -class CreateRoomRootNode @AssistedInject constructor( +class StartChatNode @AssistedInject constructor( @Assisted buildContext: BuildContext, @Assisted plugins: List, - private val presenter: CreateRoomRootPresenter, + private val presenter: StartChatPresenter, private val analyticsService: AnalyticsService, private val inviteFriendsUseCase: InviteFriendsUseCase, ) : Node(buildContext, plugins = plugins) { - private val navigator = plugins().first() + private val navigator = plugins().first() init { lifecycle.subscribe( @@ -46,7 +46,7 @@ class CreateRoomRootNode @AssistedInject constructor( override fun View(modifier: Modifier) { val state = presenter.present() val activity = requireNotNull(LocalActivity.current) - CreateRoomRootView( + StartChatView( state = state, modifier = modifier, onCloseClick = this::navigateUp, diff --git a/features/createroom/impl/src/main/kotlin/io/element/android/features/createroom/impl/root/CreateRoomRootPresenter.kt b/features/startchat/impl/src/main/kotlin/io/element/android/features/startchat/impl/root/StartChatPresenter.kt similarity index 73% rename from features/createroom/impl/src/main/kotlin/io/element/android/features/createroom/impl/root/CreateRoomRootPresenter.kt rename to features/startchat/impl/src/main/kotlin/io/element/android/features/startchat/impl/root/StartChatPresenter.kt index ea8be45e6b..9f7bea5c68 100644 --- a/features/createroom/impl/src/main/kotlin/io/element/android/features/createroom/impl/root/CreateRoomRootPresenter.kt +++ b/features/startchat/impl/src/main/kotlin/io/element/android/features/startchat/impl/root/StartChatPresenter.kt @@ -1,11 +1,11 @@ /* - * Copyright 2023, 2024 New Vector Ltd. + * Copyright 2025 New Vector Ltd. * * SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial * Please see LICENSE files in the repository root for full details. */ -package io.element.android.features.createroom.impl.root +package io.element.android.features.startchat.impl.root import androidx.compose.runtime.Composable import androidx.compose.runtime.MutableState @@ -14,11 +14,11 @@ import androidx.compose.runtime.getValue import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.remember import androidx.compose.runtime.rememberCoroutineScope -import io.element.android.features.createroom.api.StartDMAction -import io.element.android.features.createroom.impl.userlist.SelectionMode -import io.element.android.features.createroom.impl.userlist.UserListDataStore -import io.element.android.features.createroom.impl.userlist.UserListPresenter -import io.element.android.features.createroom.impl.userlist.UserListPresenterArgs +import io.element.android.features.startchat.api.StartDMAction +import io.element.android.features.startchat.impl.userlist.SelectionMode +import io.element.android.features.startchat.impl.userlist.UserListDataStore +import io.element.android.features.startchat.impl.userlist.UserListPresenter +import io.element.android.features.startchat.impl.userlist.UserListPresenterArgs import io.element.android.libraries.architecture.AsyncAction import io.element.android.libraries.architecture.Presenter import io.element.android.libraries.core.meta.BuildMeta @@ -29,14 +29,14 @@ import io.element.android.libraries.usersearch.api.UserRepository import kotlinx.coroutines.launch import javax.inject.Inject -class CreateRoomRootPresenter @Inject constructor( +class StartChatPresenter @Inject constructor( presenterFactory: UserListPresenter.Factory, userRepository: UserRepository, userListDataStore: UserListDataStore, private val startDMAction: StartDMAction, private val buildMeta: BuildMeta, private val featureFlagService: FeatureFlagService, -) : Presenter { +) : Presenter { private val presenter = presenterFactory.create( UserListPresenterArgs( selectionMode = SelectionMode.Single, @@ -46,7 +46,7 @@ class CreateRoomRootPresenter @Inject constructor( ) @Composable - override fun present(): CreateRoomRootState { + override fun present(): StartChatState { val userListState = presenter.present() val localCoroutineScope = rememberCoroutineScope() @@ -56,20 +56,20 @@ class CreateRoomRootPresenter @Inject constructor( featureFlagService.isFeatureEnabledFlow(FeatureFlags.RoomDirectorySearch) }.collectAsState(initial = false) - fun handleEvents(event: CreateRoomRootEvents) { + fun handleEvents(event: StartChatEvents) { when (event) { - is CreateRoomRootEvents.StartDM -> localCoroutineScope.launch { + is StartChatEvents.StartDM -> localCoroutineScope.launch { startDMAction.execute( matrixUser = event.matrixUser, createIfDmDoesNotExist = startDmActionState.value is AsyncAction.Confirming, actionState = startDmActionState, ) } - CreateRoomRootEvents.CancelStartDM -> startDmActionState.value = AsyncAction.Uninitialized + StartChatEvents.CancelStartDM -> startDmActionState.value = AsyncAction.Uninitialized } } - return CreateRoomRootState( + return StartChatState( applicationName = buildMeta.applicationName, userListState = userListState, startDmAction = startDmActionState.value, diff --git a/features/createroom/impl/src/main/kotlin/io/element/android/features/createroom/impl/root/CreateRoomRootState.kt b/features/startchat/impl/src/main/kotlin/io/element/android/features/startchat/impl/root/StartChatState.kt similarity index 63% rename from features/createroom/impl/src/main/kotlin/io/element/android/features/createroom/impl/root/CreateRoomRootState.kt rename to features/startchat/impl/src/main/kotlin/io/element/android/features/startchat/impl/root/StartChatState.kt index 7a6d651db3..724d6e5e88 100644 --- a/features/createroom/impl/src/main/kotlin/io/element/android/features/createroom/impl/root/CreateRoomRootState.kt +++ b/features/startchat/impl/src/main/kotlin/io/element/android/features/startchat/impl/root/StartChatState.kt @@ -1,20 +1,20 @@ /* - * Copyright 2023, 2024 New Vector Ltd. + * Copyright 2025 New Vector Ltd. * * SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial * Please see LICENSE files in the repository root for full details. */ -package io.element.android.features.createroom.impl.root +package io.element.android.features.startchat.impl.root -import io.element.android.features.createroom.impl.userlist.UserListState +import io.element.android.features.startchat.impl.userlist.UserListState import io.element.android.libraries.architecture.AsyncAction import io.element.android.libraries.matrix.api.core.RoomId -data class CreateRoomRootState( +data class StartChatState( val applicationName: String, val userListState: UserListState, val startDmAction: AsyncAction, val isRoomDirectorySearchEnabled: Boolean, - val eventSink: (CreateRoomRootEvents) -> Unit, + val eventSink: (StartChatEvents) -> Unit, ) diff --git a/features/createroom/impl/src/main/kotlin/io/element/android/features/createroom/impl/root/CreateRoomRootStateProvider.kt b/features/startchat/impl/src/main/kotlin/io/element/android/features/startchat/impl/root/StartChatStateProvider.kt similarity index 80% rename from features/createroom/impl/src/main/kotlin/io/element/android/features/createroom/impl/root/CreateRoomRootStateProvider.kt rename to features/startchat/impl/src/main/kotlin/io/element/android/features/startchat/impl/root/StartChatStateProvider.kt index 9f2d59e3b6..6b5113cc94 100644 --- a/features/createroom/impl/src/main/kotlin/io/element/android/features/createroom/impl/root/CreateRoomRootStateProvider.kt +++ b/features/startchat/impl/src/main/kotlin/io/element/android/features/startchat/impl/root/StartChatStateProvider.kt @@ -1,17 +1,17 @@ /* - * Copyright 2023, 2024 New Vector Ltd. + * Copyright 2025 New Vector Ltd. * * SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial * Please see LICENSE files in the repository root for full details. */ -package io.element.android.features.createroom.impl.root +package io.element.android.features.startchat.impl.root import androidx.compose.ui.tooling.preview.PreviewParameterProvider -import io.element.android.features.createroom.api.ConfirmingStartDmWithMatrixUser -import io.element.android.features.createroom.impl.userlist.UserListState -import io.element.android.features.createroom.impl.userlist.aRecentDirectRoomList -import io.element.android.features.createroom.impl.userlist.aUserListState +import io.element.android.features.startchat.api.ConfirmingStartDmWithMatrixUser +import io.element.android.features.startchat.impl.userlist.UserListState +import io.element.android.features.startchat.impl.userlist.aRecentDirectRoomList +import io.element.android.features.startchat.impl.userlist.aUserListState import io.element.android.libraries.architecture.AsyncAction import io.element.android.libraries.designsystem.theme.components.SearchBarResultState import io.element.android.libraries.matrix.api.core.RoomId @@ -19,8 +19,8 @@ import io.element.android.libraries.matrix.ui.components.aMatrixUser import io.element.android.libraries.usersearch.api.UserSearchResult import kotlinx.collections.immutable.persistentListOf -open class CreateRoomRootStateProvider : PreviewParameterProvider { - override val values: Sequence +open class StartChatStateProvider : PreviewParameterProvider { + override val values: Sequence get() = sequenceOf( aCreateRoomRootState(), aCreateRoomRootState( @@ -64,8 +64,8 @@ fun aCreateRoomRootState( userListState: UserListState = aUserListState(), startDmAction: AsyncAction = AsyncAction.Uninitialized, isRoomDirectorySearchEnabled: Boolean = false, - eventSink: (CreateRoomRootEvents) -> Unit = {}, -) = CreateRoomRootState( + eventSink: (StartChatEvents) -> Unit = {}, +) = StartChatState( applicationName = applicationName, userListState = userListState, startDmAction = startDmAction, diff --git a/features/createroom/impl/src/main/kotlin/io/element/android/features/createroom/impl/root/CreateRoomRootView.kt b/features/startchat/impl/src/main/kotlin/io/element/android/features/startchat/impl/root/StartChatView.kt similarity index 89% rename from features/createroom/impl/src/main/kotlin/io/element/android/features/createroom/impl/root/CreateRoomRootView.kt rename to features/startchat/impl/src/main/kotlin/io/element/android/features/startchat/impl/root/StartChatView.kt index 248d331985..ebde080f75 100644 --- a/features/createroom/impl/src/main/kotlin/io/element/android/features/createroom/impl/root/CreateRoomRootView.kt +++ b/features/startchat/impl/src/main/kotlin/io/element/android/features/startchat/impl/root/StartChatView.kt @@ -1,11 +1,11 @@ /* - * Copyright 2023, 2024 New Vector Ltd. + * Copyright 2025 New Vector Ltd. * * SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial * Please see LICENSE files in the repository root for full details. */ -package io.element.android.features.createroom.impl.root +package io.element.android.features.startchat.impl.root import androidx.annotation.DrawableRes import androidx.compose.foundation.clickable @@ -27,9 +27,9 @@ import androidx.compose.ui.tooling.preview.PreviewParameter import androidx.compose.ui.unit.dp import io.element.android.compound.theme.ElementTheme import io.element.android.compound.tokens.generated.CompoundIcons -import io.element.android.features.createroom.api.ConfirmingStartDmWithMatrixUser -import io.element.android.features.createroom.impl.R -import io.element.android.features.createroom.impl.components.UserListView +import io.element.android.features.startchat.api.ConfirmingStartDmWithMatrixUser +import io.element.android.features.startchat.impl.R +import io.element.android.features.startchat.impl.components.UserListView import io.element.android.libraries.designsystem.components.async.AsyncActionView import io.element.android.libraries.designsystem.components.async.AsyncActionViewDefaults import io.element.android.libraries.designsystem.components.button.BackButton @@ -48,8 +48,8 @@ import io.element.android.libraries.ui.strings.CommonStrings import kotlinx.collections.immutable.persistentListOf @Composable -fun CreateRoomRootView( - state: CreateRoomRootState, +fun StartChatView( + state: StartChatState, onCloseClick: () -> Unit, onNewRoomClick: () -> Unit, onOpenDM: (RoomId) -> Unit, @@ -80,7 +80,7 @@ fun CreateRoomRootView( recentDirectRooms = persistentListOf(), ), onSelectUser = { - state.eventSink(CreateRoomRootEvents.StartDM(it)) + state.eventSink(StartChatEvents.StartDM(it)) }, onDeselectUser = { }, ) @@ -109,20 +109,20 @@ fun CreateRoomRootView( errorMessage = { stringResource(R.string.screen_start_chat_error_starting_chat) }, onRetry = { state.userListState.selectedUsers.firstOrNull() - ?.let { state.eventSink(CreateRoomRootEvents.StartDM(it)) } + ?.let { state.eventSink(StartChatEvents.StartDM(it)) } // Cancel start DM if there is no more selected user (should not happen) - ?: state.eventSink(CreateRoomRootEvents.CancelStartDM) + ?: state.eventSink(StartChatEvents.CancelStartDM) }, - onErrorDismiss = { state.eventSink(CreateRoomRootEvents.CancelStartDM) }, + onErrorDismiss = { state.eventSink(StartChatEvents.CancelStartDM) }, confirmationDialog = { data -> if (data is ConfirmingStartDmWithMatrixUser) { CreateDmConfirmationBottomSheet( matrixUser = data.matrixUser, onSendInvite = { - state.eventSink(CreateRoomRootEvents.StartDM(data.matrixUser)) + state.eventSink(StartChatEvents.StartDM(data.matrixUser)) }, onDismiss = { - state.eventSink(CreateRoomRootEvents.CancelStartDM) + state.eventSink(StartChatEvents.CancelStartDM) }, ) } @@ -148,7 +148,7 @@ private fun CreateRoomRootViewTopBar( @Composable private fun CreateRoomActionButtonsList( - state: CreateRoomRootState, + state: StartChatState, onNewRoomClick: () -> Unit, onInvitePeopleClick: () -> Unit, onJoinByAddressClick: () -> Unit, @@ -239,9 +239,9 @@ private fun CreateRoomActionButton( @PreviewsDayNight @Composable -internal fun CreateRoomRootViewPreview(@PreviewParameter(CreateRoomRootStateProvider::class) state: CreateRoomRootState) = +internal fun StartChatViewPreview(@PreviewParameter(StartChatStateProvider::class) state: StartChatState) = ElementPreview { - CreateRoomRootView( + StartChatView( state = state, onCloseClick = {}, onNewRoomClick = {}, diff --git a/features/createroom/impl/src/main/kotlin/io/element/android/features/createroom/impl/userlist/DefaultUserListPresenter.kt b/features/startchat/impl/src/main/kotlin/io/element/android/features/startchat/impl/userlist/DefaultUserListPresenter.kt similarity index 98% rename from features/createroom/impl/src/main/kotlin/io/element/android/features/createroom/impl/userlist/DefaultUserListPresenter.kt rename to features/startchat/impl/src/main/kotlin/io/element/android/features/startchat/impl/userlist/DefaultUserListPresenter.kt index 32d5767cc6..c964b18441 100644 --- a/features/createroom/impl/src/main/kotlin/io/element/android/features/createroom/impl/userlist/DefaultUserListPresenter.kt +++ b/features/startchat/impl/src/main/kotlin/io/element/android/features/startchat/impl/userlist/DefaultUserListPresenter.kt @@ -5,7 +5,7 @@ * Please see LICENSE files in the repository root for full details. */ -package io.element.android.features.createroom.impl.userlist +package io.element.android.features.startchat.impl.userlist import androidx.compose.runtime.Composable import androidx.compose.runtime.LaunchedEffect diff --git a/features/createroom/impl/src/main/kotlin/io/element/android/features/createroom/impl/userlist/UserListDataStore.kt b/features/startchat/impl/src/main/kotlin/io/element/android/features/startchat/impl/userlist/UserListDataStore.kt similarity index 93% rename from features/createroom/impl/src/main/kotlin/io/element/android/features/createroom/impl/userlist/UserListDataStore.kt rename to features/startchat/impl/src/main/kotlin/io/element/android/features/startchat/impl/userlist/UserListDataStore.kt index a500e3a05f..64048d7e86 100644 --- a/features/createroom/impl/src/main/kotlin/io/element/android/features/createroom/impl/userlist/UserListDataStore.kt +++ b/features/startchat/impl/src/main/kotlin/io/element/android/features/startchat/impl/userlist/UserListDataStore.kt @@ -5,7 +5,7 @@ * Please see LICENSE files in the repository root for full details. */ -package io.element.android.features.createroom.impl.userlist +package io.element.android.features.startchat.impl.userlist import io.element.android.libraries.matrix.api.user.MatrixUser import kotlinx.coroutines.flow.MutableStateFlow diff --git a/features/createroom/impl/src/main/kotlin/io/element/android/features/createroom/impl/userlist/UserListEvents.kt b/features/startchat/impl/src/main/kotlin/io/element/android/features/startchat/impl/userlist/UserListEvents.kt similarity index 90% rename from features/createroom/impl/src/main/kotlin/io/element/android/features/createroom/impl/userlist/UserListEvents.kt rename to features/startchat/impl/src/main/kotlin/io/element/android/features/startchat/impl/userlist/UserListEvents.kt index 45b40597da..794b2c18af 100644 --- a/features/createroom/impl/src/main/kotlin/io/element/android/features/createroom/impl/userlist/UserListEvents.kt +++ b/features/startchat/impl/src/main/kotlin/io/element/android/features/startchat/impl/userlist/UserListEvents.kt @@ -5,7 +5,7 @@ * Please see LICENSE files in the repository root for full details. */ -package io.element.android.features.createroom.impl.userlist +package io.element.android.features.startchat.impl.userlist import io.element.android.libraries.matrix.api.user.MatrixUser diff --git a/features/createroom/impl/src/main/kotlin/io/element/android/features/createroom/impl/userlist/UserListPresenter.kt b/features/startchat/impl/src/main/kotlin/io/element/android/features/startchat/impl/userlist/UserListPresenter.kt similarity index 90% rename from features/createroom/impl/src/main/kotlin/io/element/android/features/createroom/impl/userlist/UserListPresenter.kt rename to features/startchat/impl/src/main/kotlin/io/element/android/features/startchat/impl/userlist/UserListPresenter.kt index 38f45d202f..a07b39a1e7 100644 --- a/features/createroom/impl/src/main/kotlin/io/element/android/features/createroom/impl/userlist/UserListPresenter.kt +++ b/features/startchat/impl/src/main/kotlin/io/element/android/features/startchat/impl/userlist/UserListPresenter.kt @@ -5,7 +5,7 @@ * Please see LICENSE files in the repository root for full details. */ -package io.element.android.features.createroom.impl.userlist +package io.element.android.features.startchat.impl.userlist import io.element.android.libraries.architecture.Presenter import io.element.android.libraries.usersearch.api.UserRepository diff --git a/features/createroom/impl/src/main/kotlin/io/element/android/features/createroom/impl/userlist/UserListPresenterArgs.kt b/features/startchat/impl/src/main/kotlin/io/element/android/features/startchat/impl/userlist/UserListPresenterArgs.kt similarity index 84% rename from features/createroom/impl/src/main/kotlin/io/element/android/features/createroom/impl/userlist/UserListPresenterArgs.kt rename to features/startchat/impl/src/main/kotlin/io/element/android/features/startchat/impl/userlist/UserListPresenterArgs.kt index 85cc58e995..d7e6a727f8 100644 --- a/features/createroom/impl/src/main/kotlin/io/element/android/features/createroom/impl/userlist/UserListPresenterArgs.kt +++ b/features/startchat/impl/src/main/kotlin/io/element/android/features/startchat/impl/userlist/UserListPresenterArgs.kt @@ -5,7 +5,7 @@ * Please see LICENSE files in the repository root for full details. */ -package io.element.android.features.createroom.impl.userlist +package io.element.android.features.startchat.impl.userlist data class UserListPresenterArgs( val selectionMode: SelectionMode, diff --git a/features/createroom/impl/src/main/kotlin/io/element/android/features/createroom/impl/userlist/UserListState.kt b/features/startchat/impl/src/main/kotlin/io/element/android/features/startchat/impl/userlist/UserListState.kt similarity index 94% rename from features/createroom/impl/src/main/kotlin/io/element/android/features/createroom/impl/userlist/UserListState.kt rename to features/startchat/impl/src/main/kotlin/io/element/android/features/startchat/impl/userlist/UserListState.kt index bed3ac7f63..2186bcb57a 100644 --- a/features/createroom/impl/src/main/kotlin/io/element/android/features/createroom/impl/userlist/UserListState.kt +++ b/features/startchat/impl/src/main/kotlin/io/element/android/features/startchat/impl/userlist/UserListState.kt @@ -5,7 +5,7 @@ * Please see LICENSE files in the repository root for full details. */ -package io.element.android.features.createroom.impl.userlist +package io.element.android.features.startchat.impl.userlist import io.element.android.libraries.designsystem.theme.components.SearchBarResultState import io.element.android.libraries.matrix.api.room.recent.RecentDirectRoom diff --git a/features/createroom/impl/src/main/kotlin/io/element/android/features/createroom/impl/userlist/UserListStateProvider.kt b/features/startchat/impl/src/main/kotlin/io/element/android/features/startchat/impl/userlist/UserListStateProvider.kt similarity index 98% rename from features/createroom/impl/src/main/kotlin/io/element/android/features/createroom/impl/userlist/UserListStateProvider.kt rename to features/startchat/impl/src/main/kotlin/io/element/android/features/startchat/impl/userlist/UserListStateProvider.kt index 3b5918abc5..65b4efdadb 100644 --- a/features/createroom/impl/src/main/kotlin/io/element/android/features/createroom/impl/userlist/UserListStateProvider.kt +++ b/features/startchat/impl/src/main/kotlin/io/element/android/features/startchat/impl/userlist/UserListStateProvider.kt @@ -5,7 +5,7 @@ * Please see LICENSE files in the repository root for full details. */ -package io.element.android.features.createroom.impl.userlist +package io.element.android.features.startchat.impl.userlist import androidx.compose.ui.tooling.preview.PreviewParameterProvider import io.element.android.libraries.designsystem.theme.components.SearchBarResultState diff --git a/features/startchat/impl/src/main/res/values-be/translations.xml b/features/startchat/impl/src/main/res/values-be/translations.xml new file mode 100644 index 0000000000..106159a00d --- /dev/null +++ b/features/startchat/impl/src/main/res/values-be/translations.xml @@ -0,0 +1,6 @@ + + + "Новы пакой" + "Каталог пакояў" + "Пры спробе пачаць чат адбылася памылка" + diff --git a/features/startchat/impl/src/main/res/values-bg/translations.xml b/features/startchat/impl/src/main/res/values-bg/translations.xml new file mode 100644 index 0000000000..21ad117fb6 --- /dev/null +++ b/features/startchat/impl/src/main/res/values-bg/translations.xml @@ -0,0 +1,9 @@ + + + "Нова стая" + "Присъединяване към стая по адрес" + "Не е валиден адрес" + "Въведете…" + "Стаята не е намерена" + "напр. #room-name:matrix.org" + diff --git a/features/startchat/impl/src/main/res/values-cs/translations.xml b/features/startchat/impl/src/main/res/values-cs/translations.xml new file mode 100644 index 0000000000..b89f27fb9e --- /dev/null +++ b/features/startchat/impl/src/main/res/values-cs/translations.xml @@ -0,0 +1,12 @@ + + + "Nová místnost" + "Adresář místností" + "Při pokusu o zahájení chatu došlo k chybě" + "Vstoupit do místnosti pomocí adresy" + "Neplatná adresa" + "Zadejte…" + "Odpovídající místnost nalezena" + "Místnost nebyla nalezena" + "např. #room-name:matrix.org" + diff --git a/features/startchat/impl/src/main/res/values-cy/translations.xml b/features/startchat/impl/src/main/res/values-cy/translations.xml new file mode 100644 index 0000000000..47faa4c5c9 --- /dev/null +++ b/features/startchat/impl/src/main/res/values-cy/translations.xml @@ -0,0 +1,12 @@ + + + "Ystafell newydd" + "Cyfeiriadur ystafelloedd" + "Digwyddodd gwall wrth geisio cychwyn sgwrs" + "Ymuno â\'r ystafell yn ôl cyfeiriad" + "Ddim yn gyfeiriad dilys" + "Ewch i mewn…" + "Cafwyd hyd i ystafell gyfatebol" + "Heb ganfod yr ystafell" + "e.e. #enw-ystafell:matrix.org" + diff --git a/features/startchat/impl/src/main/res/values-da/translations.xml b/features/startchat/impl/src/main/res/values-da/translations.xml new file mode 100644 index 0000000000..89092045f5 --- /dev/null +++ b/features/startchat/impl/src/main/res/values-da/translations.xml @@ -0,0 +1,12 @@ + + + "Nyt rum" + "Register over rum" + "Der opstod en fejl under forsøget på at starte en samtale" + "Tilslut dig rummet med adressen" + "Ikke en gyldig adresse" + "Indtast…" + "Matchende rum fundet" + "Rum ikke fundet" + "f.eks. #rummets-navn:matrix.org" + diff --git a/features/startchat/impl/src/main/res/values-de/translations.xml b/features/startchat/impl/src/main/res/values-de/translations.xml new file mode 100644 index 0000000000..dff0a6fdea --- /dev/null +++ b/features/startchat/impl/src/main/res/values-de/translations.xml @@ -0,0 +1,12 @@ + + + "Neuer Raum" + "Raum-Verzeichnis" + "Beim Versuch, einen Chat zu starten, ist ein Fehler aufgetreten" + "Raum per Adresse betreten" + "Keine gültige Adresse" + "Eintreten…" + "Passender Raum gefunden" + "Raum nicht gefunden" + "z. B. #room -name:matrix.org" + diff --git a/features/startchat/impl/src/main/res/values-el/translations.xml b/features/startchat/impl/src/main/res/values-el/translations.xml new file mode 100644 index 0000000000..19e6250d12 --- /dev/null +++ b/features/startchat/impl/src/main/res/values-el/translations.xml @@ -0,0 +1,12 @@ + + + "Νέα αίθουσα" + "Κατάλογος αιθουσών" + "Παρουσιάστηκε σφάλμα κατά την προσπάθεια έναρξης μιας συνομιλίας" + "Συμμετοχή σε αίθουσα μέσω διεύθυνσης" + "Μη έγκυρη διεύθυνση" + "Εισάγετε…" + "Βρέθηκε η αντίστοιχη αίθουσα" + "Η αίθουσα δεν βρέθηκε" + "π.χ. #όνομα-αίθουσας:matrix.org" + diff --git a/features/startchat/impl/src/main/res/values-es/translations.xml b/features/startchat/impl/src/main/res/values-es/translations.xml new file mode 100644 index 0000000000..64a9f02a17 --- /dev/null +++ b/features/startchat/impl/src/main/res/values-es/translations.xml @@ -0,0 +1,12 @@ + + + "Nueva sala" + "Directorio de salas" + "Se ha producido un error al intentar iniciar un chat" + "Unirse a una sala por su dirección" + "Dirección no válida" + "Introducir…" + "Sala encontrada" + "No se encontró la sala" + "p. ej., #nombre-de-la-sala:matrix.org" + diff --git a/features/startchat/impl/src/main/res/values-et/translations.xml b/features/startchat/impl/src/main/res/values-et/translations.xml new file mode 100644 index 0000000000..65459475a8 --- /dev/null +++ b/features/startchat/impl/src/main/res/values-et/translations.xml @@ -0,0 +1,12 @@ + + + "Uus jututuba" + "Jututubade kataloog" + "Vestluse alustamisel tekkis viga" + "Liitu jututoaga aadressi alusel" + "See pole kehtiv aadress" + "Sisene…" + "Leidsime vastava jututoa" + "Jututuba ei leidu" + "nt. #jututoa-nimi:matrix.org" + diff --git a/features/startchat/impl/src/main/res/values-eu/translations.xml b/features/startchat/impl/src/main/res/values-eu/translations.xml new file mode 100644 index 0000000000..403db09c9d --- /dev/null +++ b/features/startchat/impl/src/main/res/values-eu/translations.xml @@ -0,0 +1,9 @@ + + + "Gela berria" + "Gelen direktorioa" + "Errorea gertatu da txata hasten saiatzean" + "Ez da baliozko helbidea" + "Sartu…" + "Ez da gela aurkitu" + diff --git a/features/startchat/impl/src/main/res/values-fa/translations.xml b/features/startchat/impl/src/main/res/values-fa/translations.xml new file mode 100644 index 0000000000..7cb1e1baee --- /dev/null +++ b/features/startchat/impl/src/main/res/values-fa/translations.xml @@ -0,0 +1,12 @@ + + + "اتاق جدید" + "فهرست اتاق‌ها" + "هنگام تلاش برای شروع چت خطایی روی داد" + "پیوستن به اتاق با نشانی" + "نشانی معتبری نیست" + "ورود…" + "اتاق مطابق پیدا شد" + "اتاق پیدا نشد" + "نمونه: ‪#room-name:matrix.org" + diff --git a/features/startchat/impl/src/main/res/values-fi/translations.xml b/features/startchat/impl/src/main/res/values-fi/translations.xml new file mode 100644 index 0000000000..13659571c8 --- /dev/null +++ b/features/startchat/impl/src/main/res/values-fi/translations.xml @@ -0,0 +1,12 @@ + + + "Uusi huone" + "Huoneluettelo" + "Keskustelun aloituksessa tapahtui virhe" + "Liity huoneeseen osoitteella" + "Osoite ei ole kelvollinen" + "Syötä…" + "Täsmäävä huone löytyi" + "Huonetta ei löytynyt" + "esim. #huoneen-nimi:matrix.org" + diff --git a/features/startchat/impl/src/main/res/values-fr/translations.xml b/features/startchat/impl/src/main/res/values-fr/translations.xml new file mode 100644 index 0000000000..9aaebd018f --- /dev/null +++ b/features/startchat/impl/src/main/res/values-fr/translations.xml @@ -0,0 +1,12 @@ + + + "Nouveau salon" + "Annuaire des salons" + "Une erreur s’est produite lors de la tentative de création de la discussion" + "Saisir une adresse de salon" + "Ce n’est pas une adresse valide" + "Saisir…" + "Ce salon existe" + "Salon non trouvé" + "ex: #nom-du-salon:matrix.org" + diff --git a/features/startchat/impl/src/main/res/values-hu/translations.xml b/features/startchat/impl/src/main/res/values-hu/translations.xml new file mode 100644 index 0000000000..014f7baaac --- /dev/null +++ b/features/startchat/impl/src/main/res/values-hu/translations.xml @@ -0,0 +1,12 @@ + + + "Új szoba" + "Szobakatalógus" + "Hiba történt a csevegés indításakor" + "Csatlakozás a szobához cím szerint" + "Nem érvényes cím" + "Írja be…" + "Megfelelő szoba található" + "Szoba nem található" + "pl. #szoba-neve:matrix.org" + diff --git a/features/startchat/impl/src/main/res/values-in/translations.xml b/features/startchat/impl/src/main/res/values-in/translations.xml new file mode 100644 index 0000000000..5f796bb8da --- /dev/null +++ b/features/startchat/impl/src/main/res/values-in/translations.xml @@ -0,0 +1,12 @@ + + + "Ruangan baru" + "Direktori ruangan" + "Terjadi kesalahan saat mencoba memulai obrolan" + "Bergabung dalam ruangan berdasarkan alamat" + "Bukan alamat yang valid" + "Masuk…" + "Ruangan yang cocok ditemukan" + "Ruangan tidak ditemukan" + "mis. #nama-ruangan:matrix.org" + diff --git a/features/startchat/impl/src/main/res/values-it/translations.xml b/features/startchat/impl/src/main/res/values-it/translations.xml new file mode 100644 index 0000000000..94818d7ab1 --- /dev/null +++ b/features/startchat/impl/src/main/res/values-it/translations.xml @@ -0,0 +1,12 @@ + + + "Nuova stanza" + "Elenco delle stanze" + "Si è verificato un errore durante il tentativo di avviare una chat" + "Accedi alla stanza tramite indirizzo" + "Indirizzo non valido" + "Inserisci…" + "Stanza trovata" + "Stanza non trovata" + "ad esempio #room -name:matrix.org" + diff --git a/features/startchat/impl/src/main/res/values-ka/translations.xml b/features/startchat/impl/src/main/res/values-ka/translations.xml new file mode 100644 index 0000000000..c5ccd79305 --- /dev/null +++ b/features/startchat/impl/src/main/res/values-ka/translations.xml @@ -0,0 +1,6 @@ + + + "ახალი ოთახი" + "ოთახის კატალოგი" + "ჩატის დაწყების მცდელობისას შეცდომა მოხდა" + diff --git a/features/startchat/impl/src/main/res/values-lt/translations.xml b/features/startchat/impl/src/main/res/values-lt/translations.xml new file mode 100644 index 0000000000..699e0703f1 --- /dev/null +++ b/features/startchat/impl/src/main/res/values-lt/translations.xml @@ -0,0 +1,5 @@ + + + "Naujas kambarys" + "Bandant pradėti pokalbį įvyko klaida" + diff --git a/features/startchat/impl/src/main/res/values-nb/translations.xml b/features/startchat/impl/src/main/res/values-nb/translations.xml new file mode 100644 index 0000000000..ffd8fe9cfc --- /dev/null +++ b/features/startchat/impl/src/main/res/values-nb/translations.xml @@ -0,0 +1,12 @@ + + + "Nytt rom" + "Romkatalog" + "Det oppstod en feil når du prøvde å starte en chat" + "Bli med i rommet med adresse" + "Ikke en gyldig adresse" + "Gå inn…" + "Matchende rom funnet" + "Rom ikke funnet" + "f.eks. #rom-navn:matrix.org" + diff --git a/features/startchat/impl/src/main/res/values-nl/translations.xml b/features/startchat/impl/src/main/res/values-nl/translations.xml new file mode 100644 index 0000000000..244ffddba3 --- /dev/null +++ b/features/startchat/impl/src/main/res/values-nl/translations.xml @@ -0,0 +1,6 @@ + + + "Nieuwe kamer" + "Kamergids" + "Er is een fout opgetreden bij het starten van een chat" + diff --git a/features/startchat/impl/src/main/res/values-pl/translations.xml b/features/startchat/impl/src/main/res/values-pl/translations.xml new file mode 100644 index 0000000000..fe6b4a2c8d --- /dev/null +++ b/features/startchat/impl/src/main/res/values-pl/translations.xml @@ -0,0 +1,12 @@ + + + "Nowy pokój" + "Katalog pokoi" + "Wystąpił błąd podczas próby rozpoczęcia czatu" + "Dołącz do pokoju za pomocą adresu" + "Nieprawidłowy adres" + "Wprowadź…" + "Znaleziono pasujący pokój" + "Nie znaleziono pokoju" + "np. #room-name:matrix.org" + diff --git a/features/startchat/impl/src/main/res/values-pt-rBR/translations.xml b/features/startchat/impl/src/main/res/values-pt-rBR/translations.xml new file mode 100644 index 0000000000..f17991c56b --- /dev/null +++ b/features/startchat/impl/src/main/res/values-pt-rBR/translations.xml @@ -0,0 +1,12 @@ + + + "Nova sala" + "Diretório de salas" + "Ocorreu um erro ao tentar iniciar um chat" + "Entrar na sala pelo endereço" + "Não é um endereço válido" + "Entrar…" + "Foi encontrada uma sala correspondente" + "Sala não encontrada" + "Por exemplo, #nome-da-sala:matrix.org" + diff --git a/features/startchat/impl/src/main/res/values-pt/translations.xml b/features/startchat/impl/src/main/res/values-pt/translations.xml new file mode 100644 index 0000000000..3efcbf7640 --- /dev/null +++ b/features/startchat/impl/src/main/res/values-pt/translations.xml @@ -0,0 +1,12 @@ + + + "Nova sala" + "Diretório de salas" + "Ocorreu um erro ao tentar iniciar uma conversa" + "Entrar na sala pelo endereço" + "Não é um endereço válido" + "Entrar…" + "Sala correspondente encontrado" + "Sala não encontrada" + "por exemplo, #sala:matrix.org" + diff --git a/features/startchat/impl/src/main/res/values-ro/translations.xml b/features/startchat/impl/src/main/res/values-ro/translations.xml new file mode 100644 index 0000000000..d306d83aab --- /dev/null +++ b/features/startchat/impl/src/main/res/values-ro/translations.xml @@ -0,0 +1,6 @@ + + + "Cameră nouă" + "Director de camere" + "A apărut o eroare la încercarea începerii conversației" + diff --git a/features/startchat/impl/src/main/res/values-ru/translations.xml b/features/startchat/impl/src/main/res/values-ru/translations.xml new file mode 100644 index 0000000000..6d676d3c76 --- /dev/null +++ b/features/startchat/impl/src/main/res/values-ru/translations.xml @@ -0,0 +1,12 @@ + + + "Создать новую комнату" + "Каталог комнат" + "Произошла ошибка при запуске чата" + "Присоединиться к комнате по адресу" + "Недействительный адрес" + "Ввести…" + "Соответствующая комната найдена" + "Комната не найдена" + "прим. #room-name:matrix.org" + diff --git a/features/startchat/impl/src/main/res/values-sk/translations.xml b/features/startchat/impl/src/main/res/values-sk/translations.xml new file mode 100644 index 0000000000..16a1548765 --- /dev/null +++ b/features/startchat/impl/src/main/res/values-sk/translations.xml @@ -0,0 +1,12 @@ + + + "Nová miestnosť" + "Adresár miestností" + "Pri pokuse o spustenie konverzácie sa vyskytla chyba" + "Pripojte sa do miestnosti podľa adresy" + "Neplatná adresa" + "Zadajte…" + "Nájdená zodpovedajúca miestnosť" + "Miestnosť sa nenašla" + "napr. #nazov-miestnosti:matrix.org" + diff --git a/features/startchat/impl/src/main/res/values-sv/translations.xml b/features/startchat/impl/src/main/res/values-sv/translations.xml new file mode 100644 index 0000000000..21cfb470b1 --- /dev/null +++ b/features/startchat/impl/src/main/res/values-sv/translations.xml @@ -0,0 +1,12 @@ + + + "Nytt rum" + "Rumskatalog" + "Ett fel uppstod när du försökte starta en chatt" + "Gå med i rum med adress" + "Inte en giltig adress" + "Ange …" + "Matchande rum hittades" + "Rummet hittades inte" + "t.ex. #rumsnamn:matrix.org" + diff --git a/features/startchat/impl/src/main/res/values-tr/translations.xml b/features/startchat/impl/src/main/res/values-tr/translations.xml new file mode 100644 index 0000000000..581996500d --- /dev/null +++ b/features/startchat/impl/src/main/res/values-tr/translations.xml @@ -0,0 +1,6 @@ + + + "Yeni oda" + "Oda dizini" + "Sohbet başlatmaya çalışırken bir hata oluştu" + diff --git a/features/startchat/impl/src/main/res/values-uk/translations.xml b/features/startchat/impl/src/main/res/values-uk/translations.xml new file mode 100644 index 0000000000..3c2b09939c --- /dev/null +++ b/features/startchat/impl/src/main/res/values-uk/translations.xml @@ -0,0 +1,12 @@ + + + "Нова кімната" + "Каталог кімнат" + "Під час спроби почати бесіду сталася помилка" + "Приєднатися до кімнати за адресою" + "Недійсна адреса" + "Введіть…" + "Знайдено відповідну кімнату" + "Кімната не знайдена" + "наприклад, #room-name:matrix.org" + diff --git a/features/startchat/impl/src/main/res/values-ur/translations.xml b/features/startchat/impl/src/main/res/values-ur/translations.xml new file mode 100644 index 0000000000..394f6aa817 --- /dev/null +++ b/features/startchat/impl/src/main/res/values-ur/translations.xml @@ -0,0 +1,6 @@ + + + "نیا کمرہ" + "کمرے کا راہنامچہ" + "گفتگو شروع کرنے کی کوشش کرتے وقت ایک خرابی واقع ہوگئی" + diff --git a/features/startchat/impl/src/main/res/values-uz/translations.xml b/features/startchat/impl/src/main/res/values-uz/translations.xml new file mode 100644 index 0000000000..6f68899a3b --- /dev/null +++ b/features/startchat/impl/src/main/res/values-uz/translations.xml @@ -0,0 +1,5 @@ + + + "Yangi xona" + "Suhbatni boshlashda xatolik yuz berdi" + diff --git a/features/startchat/impl/src/main/res/values-zh-rTW/translations.xml b/features/startchat/impl/src/main/res/values-zh-rTW/translations.xml new file mode 100644 index 0000000000..c6dcd50008 --- /dev/null +++ b/features/startchat/impl/src/main/res/values-zh-rTW/translations.xml @@ -0,0 +1,12 @@ + + + "建立聊天室" + "聊天室目錄" + "嘗試開始聊天時發生錯誤" + "按地址加入聊天室" + "不是有效的位址" + "輸入……" + "找到相符的聊天室" + "找不到聊天室" + "例如 #room-name:matrix.org" + diff --git a/features/startchat/impl/src/main/res/values-zh/translations.xml b/features/startchat/impl/src/main/res/values-zh/translations.xml new file mode 100644 index 0000000000..2f80b65973 --- /dev/null +++ b/features/startchat/impl/src/main/res/values-zh/translations.xml @@ -0,0 +1,11 @@ + + + "新聊天室" + "聊天室目录" + "在开始聊天时发生了错误" + "输入地址加入房间" + "地址无效" + "输入…" + "未找到房间" + "例如 #room-name:matrix.org" + diff --git a/features/startchat/impl/src/main/res/values/localazy.xml b/features/startchat/impl/src/main/res/values/localazy.xml new file mode 100644 index 0000000000..48b6449263 --- /dev/null +++ b/features/startchat/impl/src/main/res/values/localazy.xml @@ -0,0 +1,12 @@ + + + "New room" + "Room directory" + "An error occurred when trying to start a chat" + "Join room by address" + "Not a valid address" + "Enter…" + "Matching room found" + "Room not found" + "e.g. #room-name:matrix.org" + diff --git a/features/createroom/impl/src/test/kotlin/io/element/android/features/createroom/impl/DefaultStartDMActionTest.kt b/features/startchat/impl/src/test/kotlin/io/element/android/features/startchat/impl/DefaultStartDMActionTest.kt similarity index 97% rename from features/createroom/impl/src/test/kotlin/io/element/android/features/createroom/impl/DefaultStartDMActionTest.kt rename to features/startchat/impl/src/test/kotlin/io/element/android/features/startchat/impl/DefaultStartDMActionTest.kt index ef6b3b9517..fa6e140c3a 100644 --- a/features/createroom/impl/src/test/kotlin/io/element/android/features/createroom/impl/DefaultStartDMActionTest.kt +++ b/features/startchat/impl/src/test/kotlin/io/element/android/features/startchat/impl/DefaultStartDMActionTest.kt @@ -5,12 +5,12 @@ * Please see LICENSE files in the repository root for full details. */ -package io.element.android.features.createroom.impl +package io.element.android.features.startchat.impl import androidx.compose.runtime.mutableStateOf import com.google.common.truth.Truth.assertThat import im.vector.app.features.analytics.plan.CreatedRoom -import io.element.android.features.createroom.api.ConfirmingStartDmWithMatrixUser +import io.element.android.features.startchat.api.ConfirmingStartDmWithMatrixUser import io.element.android.libraries.architecture.AsyncAction import io.element.android.libraries.matrix.api.MatrixClient import io.element.android.libraries.matrix.api.core.RoomId diff --git a/features/createroom/impl/src/test/kotlin/io/element/android/features/createroom/impl/FakeCreateRoomNavigator.kt b/features/startchat/impl/src/test/kotlin/io/element/android/features/startchat/impl/FakeStartChatNavigator.kt similarity index 86% rename from features/createroom/impl/src/test/kotlin/io/element/android/features/createroom/impl/FakeCreateRoomNavigator.kt rename to features/startchat/impl/src/test/kotlin/io/element/android/features/startchat/impl/FakeStartChatNavigator.kt index 28dcdd409d..9de00e0a4c 100644 --- a/features/createroom/impl/src/test/kotlin/io/element/android/features/createroom/impl/FakeCreateRoomNavigator.kt +++ b/features/startchat/impl/src/test/kotlin/io/element/android/features/startchat/impl/FakeStartChatNavigator.kt @@ -5,18 +5,18 @@ * Please see LICENSE files in the repository root for full details. */ -package io.element.android.features.createroom.impl +package io.element.android.features.startchat.impl -import io.element.android.features.createroom.CreateRoomNavigator +import io.element.android.features.startchat.StartChatNavigator import io.element.android.libraries.matrix.api.core.RoomIdOrAlias -class FakeCreateRoomNavigator( +class FakeStartChatNavigator( private val openRoomLambda: (roomIdOrAlias: RoomIdOrAlias, serverNames: List) -> Unit = { _, _ -> }, private val createNewRoomLambda: () -> Unit = {}, private val showJoinRoomByAddressLambda: () -> Unit = {}, private val dismissJoinRoomByAddressLambda: () -> Unit = {}, private val openRoomDirectoryLambda: () -> Unit = {}, -) : CreateRoomNavigator { +) : StartChatNavigator { override fun onOpenRoom(roomIdOrAlias: RoomIdOrAlias, serverNames: List) { openRoomLambda(roomIdOrAlias, serverNames) } diff --git a/features/createroom/impl/src/test/kotlin/io/element/android/features/createroom/impl/joinbyaddress/JoinBaseRoomByAddressPresenterTest.kt b/features/startchat/impl/src/test/kotlin/io/element/android/features/startchat/impl/joinbyaddress/JoinBaseRoomByAddressPresenterTest.kt similarity index 93% rename from features/createroom/impl/src/test/kotlin/io/element/android/features/createroom/impl/joinbyaddress/JoinBaseRoomByAddressPresenterTest.kt rename to features/startchat/impl/src/test/kotlin/io/element/android/features/startchat/impl/joinbyaddress/JoinBaseRoomByAddressPresenterTest.kt index 10cca20fa3..bd40b92d57 100644 --- a/features/createroom/impl/src/test/kotlin/io/element/android/features/createroom/impl/joinbyaddress/JoinBaseRoomByAddressPresenterTest.kt +++ b/features/startchat/impl/src/test/kotlin/io/element/android/features/startchat/impl/joinbyaddress/JoinBaseRoomByAddressPresenterTest.kt @@ -5,11 +5,11 @@ * Please see LICENSE files in the repository root for full details. */ -package io.element.android.features.createroom.impl.joinbyaddress +package io.element.android.features.startchat.impl.joinbyaddress import com.google.common.truth.Truth.assertThat -import io.element.android.features.createroom.CreateRoomNavigator -import io.element.android.features.createroom.impl.FakeCreateRoomNavigator +import io.element.android.features.startchat.StartChatNavigator +import io.element.android.features.startchat.impl.FakeStartChatNavigator import io.element.android.libraries.matrix.api.MatrixClient import io.element.android.libraries.matrix.api.core.RoomIdOrAlias import io.element.android.libraries.matrix.api.room.alias.RoomAliasHelper @@ -61,7 +61,7 @@ class JoinBaseRoomByAddressPresenterTest { fun `present - room found`() = runTest { val openRoomLambda = lambdaRecorder, Unit> { _, _ -> } val dismissJoinRoomByAddressLambda = lambdaRecorder { } - val navigator = FakeCreateRoomNavigator( + val navigator = FakeStartChatNavigator( openRoomLambda = openRoomLambda, dismissJoinRoomByAddressLambda = dismissJoinRoomByAddressLambda ) @@ -114,7 +114,7 @@ class JoinBaseRoomByAddressPresenterTest { @Test fun `present - dismiss`() = runTest { val dismissJoinRoomByAddressLambda = lambdaRecorder { } - val navigator = FakeCreateRoomNavigator( + val navigator = FakeStartChatNavigator( dismissJoinRoomByAddressLambda = dismissJoinRoomByAddressLambda ) val presenter = createJoinRoomByAddressPresenter(navigator = navigator) @@ -127,7 +127,7 @@ class JoinBaseRoomByAddressPresenterTest { } private fun createJoinRoomByAddressPresenter( - navigator: CreateRoomNavigator = FakeCreateRoomNavigator(), + navigator: StartChatNavigator = FakeStartChatNavigator(), matrixClient: MatrixClient = FakeMatrixClient(), roomAliasHelper: RoomAliasHelper = FakeRoomAliasHelper(), ): JoinRoomByAddressPresenter { diff --git a/features/createroom/impl/src/test/kotlin/io/element/android/features/createroom/impl/joinbyaddress/JoinBaseRoomByAddressViewTest.kt b/features/startchat/impl/src/test/kotlin/io/element/android/features/startchat/impl/joinbyaddress/JoinBaseRoomByAddressViewTest.kt similarity index 94% rename from features/createroom/impl/src/test/kotlin/io/element/android/features/createroom/impl/joinbyaddress/JoinBaseRoomByAddressViewTest.kt rename to features/startchat/impl/src/test/kotlin/io/element/android/features/startchat/impl/joinbyaddress/JoinBaseRoomByAddressViewTest.kt index b2e75c9f5a..4de9bd1470 100644 --- a/features/createroom/impl/src/test/kotlin/io/element/android/features/createroom/impl/joinbyaddress/JoinBaseRoomByAddressViewTest.kt +++ b/features/startchat/impl/src/test/kotlin/io/element/android/features/startchat/impl/joinbyaddress/JoinBaseRoomByAddressViewTest.kt @@ -5,7 +5,7 @@ * Please see LICENSE files in the repository root for full details. */ -package io.element.android.features.createroom.impl.joinbyaddress +package io.element.android.features.startchat.impl.joinbyaddress import androidx.activity.ComponentActivity import androidx.compose.ui.test.junit4.AndroidComposeTestRule @@ -13,7 +13,7 @@ import androidx.compose.ui.test.junit4.createAndroidComposeRule import androidx.compose.ui.test.onNodeWithText import androidx.compose.ui.test.performTextInput import androidx.test.ext.junit.runners.AndroidJUnit4 -import io.element.android.features.createroom.impl.R +import io.element.android.features.startchat.impl.R import io.element.android.libraries.ui.strings.CommonStrings import io.element.android.tests.testutils.EventsRecorder import io.element.android.tests.testutils.clickOn diff --git a/features/createroom/impl/src/test/kotlin/io/element/android/features/createroom/impl/root/CreateBaseRoomRootPresenterTest.kt b/features/startchat/impl/src/test/kotlin/io/element/android/features/startchat/impl/root/StartChatPresenterTest.kt similarity index 83% rename from features/createroom/impl/src/test/kotlin/io/element/android/features/createroom/impl/root/CreateBaseRoomRootPresenterTest.kt rename to features/startchat/impl/src/test/kotlin/io/element/android/features/startchat/impl/root/StartChatPresenterTest.kt index d2d9959e2a..59a8838c6b 100644 --- a/features/createroom/impl/src/test/kotlin/io/element/android/features/createroom/impl/root/CreateBaseRoomRootPresenterTest.kt +++ b/features/startchat/impl/src/test/kotlin/io/element/android/features/startchat/impl/root/StartChatPresenterTest.kt @@ -1,23 +1,23 @@ /* - * Copyright 2023, 2024 New Vector Ltd. + * Copyright 2025 New Vector Ltd. * * SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial * Please see LICENSE files in the repository root for full details. */ -package io.element.android.features.createroom.impl.root +package io.element.android.features.startchat.impl.root import androidx.compose.runtime.MutableState import app.cash.molecule.RecompositionMode import app.cash.molecule.moleculeFlow import app.cash.turbine.test import com.google.common.truth.Truth.assertThat -import io.element.android.features.createroom.api.ConfirmingStartDmWithMatrixUser -import io.element.android.features.createroom.api.StartDMAction -import io.element.android.features.createroom.impl.userlist.FakeUserListPresenter -import io.element.android.features.createroom.impl.userlist.FakeUserListPresenterFactory -import io.element.android.features.createroom.impl.userlist.UserListDataStore -import io.element.android.features.createroom.test.FakeStartDMAction +import io.element.android.features.invitepeople.test.FakeStartDMAction +import io.element.android.features.startchat.api.ConfirmingStartDmWithMatrixUser +import io.element.android.features.startchat.api.StartDMAction +import io.element.android.features.startchat.impl.userlist.FakeUserListPresenter +import io.element.android.features.startchat.impl.userlist.FakeUserListPresenterFactory +import io.element.android.features.startchat.impl.userlist.UserListDataStore import io.element.android.libraries.architecture.AsyncAction import io.element.android.libraries.featureflag.api.FeatureFlags import io.element.android.libraries.featureflag.test.FakeFeatureFlagService @@ -36,7 +36,7 @@ import kotlinx.coroutines.test.runTest import org.junit.Rule import org.junit.Test -class CreateBaseRoomRootPresenterTest { +class StartChatPresenterTest { @get:Rule val warmUpRule = WarmUpRule() @@ -47,7 +47,7 @@ class CreateBaseRoomRootPresenterTest { actionState.value = startDMFailureResult } val startDMAction = FakeStartDMAction(executeResult = executeResult) - val presenter = createCreateRoomRootPresenter(startDMAction) + val presenter = createStartChatPresenter(startDMAction) moleculeFlow(RecompositionMode.Immediate) { presenter.present() }.test { @@ -58,7 +58,7 @@ class CreateBaseRoomRootPresenterTest { assertThat(initialState.userListState.isSearchActive).isFalse() assertThat(initialState.userListState.isMultiSelectionEnabled).isFalse() val matrixUser = MatrixUser(UserId("@name:domain")) - initialState.eventSink(CreateRoomRootEvents.StartDM(matrixUser)) + initialState.eventSink(StartChatEvents.StartDM(matrixUser)) awaitItem().also { state -> assertThat(state.startDmAction).isEqualTo(startDMFailureResult) executeResult.assertions().isCalledOnce().with( @@ -66,7 +66,7 @@ class CreateBaseRoomRootPresenterTest { value(false), any(), ) - state.eventSink(CreateRoomRootEvents.CancelStartDM) + state.eventSink(StartChatEvents.CancelStartDM) } awaitItem().also { state -> assertThat(state.startDmAction.isUninitialized()).isTrue() @@ -81,7 +81,7 @@ class CreateBaseRoomRootPresenterTest { actionState.value = startDMSuccessResult } val startDMAction = FakeStartDMAction(executeResult = executeResult) - val presenter = createCreateRoomRootPresenter(startDMAction) + val presenter = createStartChatPresenter(startDMAction) moleculeFlow(RecompositionMode.Immediate) { presenter.present() }.test { @@ -92,7 +92,7 @@ class CreateBaseRoomRootPresenterTest { assertThat(initialState.userListState.isSearchActive).isFalse() assertThat(initialState.userListState.isMultiSelectionEnabled).isFalse() val matrixUser = MatrixUser(UserId("@name:domain")) - initialState.eventSink(CreateRoomRootEvents.StartDM(matrixUser)) + initialState.eventSink(StartChatEvents.StartDM(matrixUser)) awaitItem().also { state -> assertThat(state.startDmAction).isEqualTo(startDMSuccessResult) executeResult.assertions().isCalledOnce().with( @@ -112,13 +112,13 @@ class CreateBaseRoomRootPresenterTest { actionState.value = startDMConfirmationResult } val startDMAction = FakeStartDMAction(executeResult = executeResult) - val presenter = createCreateRoomRootPresenter(startDMAction) + val presenter = createStartChatPresenter(startDMAction) moleculeFlow(RecompositionMode.Immediate) { presenter.present() }.test { val initialState = awaitItem() assertThat(initialState.startDmAction).isInstanceOf(AsyncAction.Uninitialized::class.java) - initialState.eventSink(CreateRoomRootEvents.StartDM(matrixUser)) + initialState.eventSink(StartChatEvents.StartDM(matrixUser)) val confirmingState = awaitItem() assertThat(confirmingState.startDmAction).isEqualTo(startDMConfirmationResult) executeResult.assertions().isCalledOnce().with( @@ -127,7 +127,7 @@ class CreateBaseRoomRootPresenterTest { any(), ) // Cancelling should not create the DM - confirmingState.eventSink(CreateRoomRootEvents.CancelStartDM) + confirmingState.eventSink(StartChatEvents.CancelStartDM) val finalState = awaitItem() assertThat(finalState.startDmAction.isUninitialized()).isTrue() executeResult.assertions().isCalledExactly(1) @@ -142,13 +142,13 @@ class CreateBaseRoomRootPresenterTest { actionState.value = startDMConfirmationResult } val startDMAction = FakeStartDMAction(executeResult = executeResult) - val presenter = createCreateRoomRootPresenter(startDMAction) + val presenter = createStartChatPresenter(startDMAction) moleculeFlow(RecompositionMode.Immediate) { presenter.present() }.test { val initialState = awaitItem() assertThat(initialState.startDmAction).isInstanceOf(AsyncAction.Uninitialized::class.java) - initialState.eventSink(CreateRoomRootEvents.StartDM(matrixUser)) + initialState.eventSink(StartChatEvents.StartDM(matrixUser)) val confirmingState = awaitItem() assertThat(confirmingState.startDmAction).isEqualTo(startDMConfirmationResult) executeResult.assertions().isCalledOnce().with( @@ -157,7 +157,7 @@ class CreateBaseRoomRootPresenterTest { any(), ) // Start DM again should invoke the action with createIfDmDoesNotExist = true - confirmingState.eventSink(CreateRoomRootEvents.StartDM(matrixUser)) + confirmingState.eventSink(StartChatEvents.StartDM(matrixUser)) executeResult.assertions().isCalledExactly(2).withSequence( listOf(value(matrixUser), value(false), any()), listOf(value(matrixUser), value(true), any()), @@ -167,7 +167,7 @@ class CreateBaseRoomRootPresenterTest { @Test fun `present - room directory search`() = runTest { - val presenter = createCreateRoomRootPresenter(isRoomDirectorySearchEnabled = true) + val presenter = createStartChatPresenter(isRoomDirectorySearchEnabled = true) moleculeFlow(RecompositionMode.Immediate) { presenter.present() }.test { @@ -178,16 +178,16 @@ class CreateBaseRoomRootPresenterTest { } } - private fun createCreateRoomRootPresenter( + private fun createStartChatPresenter( startDMAction: StartDMAction = FakeStartDMAction(), isRoomDirectorySearchEnabled: Boolean = false, - ): CreateRoomRootPresenter { + ): StartChatPresenter { val featureFlagService = FakeFeatureFlagService( initialState = mapOf( FeatureFlags.RoomDirectorySearch.key to isRoomDirectorySearchEnabled, ), ) - return CreateRoomRootPresenter( + return StartChatPresenter( presenterFactory = FakeUserListPresenterFactory(FakeUserListPresenter()), userRepository = FakeUserRepository(), userListDataStore = UserListDataStore(), diff --git a/features/createroom/impl/src/test/kotlin/io/element/android/features/createroom/impl/root/CreateBaseRoomRootViewTest.kt b/features/startchat/impl/src/test/kotlin/io/element/android/features/startchat/impl/root/StartChatViewTest.kt similarity index 80% rename from features/createroom/impl/src/test/kotlin/io/element/android/features/createroom/impl/root/CreateBaseRoomRootViewTest.kt rename to features/startchat/impl/src/test/kotlin/io/element/android/features/startchat/impl/root/StartChatViewTest.kt index 9104b2dfb2..dc213446a0 100644 --- a/features/createroom/impl/src/test/kotlin/io/element/android/features/createroom/impl/root/CreateBaseRoomRootViewTest.kt +++ b/features/startchat/impl/src/test/kotlin/io/element/android/features/startchat/impl/root/StartChatViewTest.kt @@ -1,11 +1,11 @@ /* - * Copyright 2024 New Vector Ltd. + * Copyright 2025 New Vector Ltd. * * SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial * Please see LICENSE files in the repository root for full details. */ -package io.element.android.features.createroom.impl.root +package io.element.android.features.startchat.impl.root import androidx.activity.ComponentActivity import androidx.compose.ui.test.junit4.AndroidComposeTestRule @@ -13,9 +13,9 @@ import androidx.compose.ui.test.junit4.createAndroidComposeRule import androidx.compose.ui.test.onNodeWithText import androidx.compose.ui.test.performClick import androidx.test.ext.junit.runners.AndroidJUnit4 -import io.element.android.features.createroom.impl.R -import io.element.android.features.createroom.impl.userlist.aRecentDirectRoomList -import io.element.android.features.createroom.impl.userlist.aUserListState +import io.element.android.features.startchat.impl.R +import io.element.android.features.startchat.impl.userlist.aRecentDirectRoomList +import io.element.android.features.startchat.impl.userlist.aUserListState import io.element.android.libraries.matrix.api.core.RoomId import io.element.android.libraries.matrix.ui.model.getBestName import io.element.android.libraries.ui.strings.CommonStrings @@ -33,15 +33,15 @@ import org.junit.runner.RunWith import org.robolectric.annotation.Config @RunWith(AndroidJUnit4::class) -class CreateBaseRoomRootViewTest { +class StartChatViewTest { @get:Rule val rule = createAndroidComposeRule() @Test fun `clicking on back invokes the expected callback`() { - val eventsRecorder = EventsRecorder(expectEvents = false) + val eventsRecorder = EventsRecorder(expectEvents = false) ensureCalledOnce { - rule.setCreateRoomRootView( + rule.setStartChatView( aCreateRoomRootState( eventSink = eventsRecorder, ), @@ -53,9 +53,9 @@ class CreateBaseRoomRootViewTest { @Test fun `clicking on New room invokes the expected callback`() { - val eventsRecorder = EventsRecorder(expectEvents = false) + val eventsRecorder = EventsRecorder(expectEvents = false) ensureCalledOnce { - rule.setCreateRoomRootView( + rule.setStartChatView( aCreateRoomRootState( eventSink = eventsRecorder, ), @@ -68,9 +68,9 @@ class CreateBaseRoomRootViewTest { @Config(qualifiers = "h1024dp") @Test fun `clicking on Invite people invokes the expected callback`() { - val eventsRecorder = EventsRecorder(expectEvents = false) + val eventsRecorder = EventsRecorder(expectEvents = false) ensureCalledOnce { - rule.setCreateRoomRootView( + rule.setStartChatView( aCreateRoomRootState( applicationName = "test", eventSink = eventsRecorder, @@ -87,9 +87,9 @@ class CreateBaseRoomRootViewTest { fun `clicking on a user suggestion invokes the expected callback`() { val recentDirectRoomList = aRecentDirectRoomList() val firstRoom = recentDirectRoomList[0] - val eventsRecorder = EventsRecorder(expectEvents = false) + val eventsRecorder = EventsRecorder(expectEvents = false) ensureCalledOnceWithParam(firstRoom.roomId) { - rule.setCreateRoomRootView( + rule.setStartChatView( aCreateRoomRootState( userListState = aUserListState( recentDirectRooms = recentDirectRoomList @@ -105,9 +105,9 @@ class CreateBaseRoomRootViewTest { @Config(qualifiers = "h1024dp") @Test fun `clicking on Join room by address invokes the expected callback`() { - val eventsRecorder = EventsRecorder(expectEvents = false) + val eventsRecorder = EventsRecorder(expectEvents = false) ensureCalledOnce { - rule.setCreateRoomRootView( + rule.setStartChatView( aCreateRoomRootState( eventSink = eventsRecorder, ), @@ -119,9 +119,9 @@ class CreateBaseRoomRootViewTest { @Test fun `clicking on room directory invokes the expected callback`() { - val eventsRecorder = EventsRecorder(expectEvents = false) + val eventsRecorder = EventsRecorder(expectEvents = false) ensureCalledOnce { - rule.setCreateRoomRootView( + rule.setStartChatView( aCreateRoomRootState( eventSink = eventsRecorder, isRoomDirectorySearchEnabled = true @@ -133,8 +133,8 @@ class CreateBaseRoomRootViewTest { } } -private fun AndroidComposeTestRule.setCreateRoomRootView( - state: CreateRoomRootState, +private fun AndroidComposeTestRule.setStartChatView( + state: StartChatState, onCloseClick: () -> Unit = EnsureNeverCalled(), onNewRoomClick: () -> Unit = EnsureNeverCalled(), onOpenDM: (RoomId) -> Unit = EnsureNeverCalledWithParam(), @@ -143,7 +143,7 @@ private fun AndroidComposeTestRule.setCreat onRoomDirectorySearchClick: () -> Unit = EnsureNeverCalled(), ) { setContent { - CreateRoomRootView( + StartChatView( state = state, onCloseClick = onCloseClick, onNewRoomClick = onNewRoomClick, diff --git a/features/createroom/impl/src/test/kotlin/io/element/android/features/createroom/impl/userlist/DefaultUserListPresenterTest.kt b/features/startchat/impl/src/test/kotlin/io/element/android/features/startchat/impl/userlist/DefaultUserListPresenterTest.kt similarity index 99% rename from features/createroom/impl/src/test/kotlin/io/element/android/features/createroom/impl/userlist/DefaultUserListPresenterTest.kt rename to features/startchat/impl/src/test/kotlin/io/element/android/features/startchat/impl/userlist/DefaultUserListPresenterTest.kt index ac793a247f..50bbc425c2 100644 --- a/features/createroom/impl/src/test/kotlin/io/element/android/features/createroom/impl/userlist/DefaultUserListPresenterTest.kt +++ b/features/startchat/impl/src/test/kotlin/io/element/android/features/startchat/impl/userlist/DefaultUserListPresenterTest.kt @@ -5,7 +5,7 @@ * Please see LICENSE files in the repository root for full details. */ -package io.element.android.features.createroom.impl.userlist +package io.element.android.features.startchat.impl.userlist import app.cash.molecule.RecompositionMode import app.cash.molecule.moleculeFlow diff --git a/features/createroom/impl/src/test/kotlin/io/element/android/features/createroom/impl/userlist/FakeUserListPresenter.kt b/features/startchat/impl/src/test/kotlin/io/element/android/features/startchat/impl/userlist/FakeUserListPresenter.kt similarity index 89% rename from features/createroom/impl/src/test/kotlin/io/element/android/features/createroom/impl/userlist/FakeUserListPresenter.kt rename to features/startchat/impl/src/test/kotlin/io/element/android/features/startchat/impl/userlist/FakeUserListPresenter.kt index a0768ffda8..84c4fd9d67 100644 --- a/features/createroom/impl/src/test/kotlin/io/element/android/features/createroom/impl/userlist/FakeUserListPresenter.kt +++ b/features/startchat/impl/src/test/kotlin/io/element/android/features/startchat/impl/userlist/FakeUserListPresenter.kt @@ -5,7 +5,7 @@ * Please see LICENSE files in the repository root for full details. */ -package io.element.android.features.createroom.impl.userlist +package io.element.android.features.startchat.impl.userlist import androidx.compose.runtime.Composable diff --git a/features/createroom/impl/src/test/kotlin/io/element/android/features/createroom/impl/userlist/FakeUserListPresenterFactory.kt b/features/startchat/impl/src/test/kotlin/io/element/android/features/startchat/impl/userlist/FakeUserListPresenterFactory.kt similarity index 91% rename from features/createroom/impl/src/test/kotlin/io/element/android/features/createroom/impl/userlist/FakeUserListPresenterFactory.kt rename to features/startchat/impl/src/test/kotlin/io/element/android/features/startchat/impl/userlist/FakeUserListPresenterFactory.kt index 123a013670..8e80626e86 100644 --- a/features/createroom/impl/src/test/kotlin/io/element/android/features/createroom/impl/userlist/FakeUserListPresenterFactory.kt +++ b/features/startchat/impl/src/test/kotlin/io/element/android/features/startchat/impl/userlist/FakeUserListPresenterFactory.kt @@ -5,7 +5,7 @@ * Please see LICENSE files in the repository root for full details. */ -package io.element.android.features.createroom.impl.userlist +package io.element.android.features.startchat.impl.userlist import io.element.android.libraries.usersearch.api.UserRepository diff --git a/features/createroom/test/build.gradle.kts b/features/startchat/test/build.gradle.kts similarity index 83% rename from features/createroom/test/build.gradle.kts rename to features/startchat/test/build.gradle.kts index b7df0caab6..96b05a80fa 100644 --- a/features/createroom/test/build.gradle.kts +++ b/features/startchat/test/build.gradle.kts @@ -10,7 +10,7 @@ plugins { } android { - namespace = "io.element.android.features.createroom.test" + namespace = "io.element.android.features.invitepeople.test" } dependencies { @@ -19,5 +19,5 @@ dependencies { implementation(projects.libraries.matrix.test) implementation(projects.libraries.architecture) implementation(projects.tests.testutils) - api(projects.features.createroom.api) + api(projects.features.startchat.api) } diff --git a/features/createroom/test/src/main/kotlin/io/element/android/features/createroom/test/FakeStartDMAction.kt b/features/startchat/test/src/main/kotlin/io/element/android/features/invitepeople/test/FakeStartDMAction.kt similarity index 88% rename from features/createroom/test/src/main/kotlin/io/element/android/features/createroom/test/FakeStartDMAction.kt rename to features/startchat/test/src/main/kotlin/io/element/android/features/invitepeople/test/FakeStartDMAction.kt index 90e2ecf1c1..d7ab63d0e3 100644 --- a/features/createroom/test/src/main/kotlin/io/element/android/features/createroom/test/FakeStartDMAction.kt +++ b/features/startchat/test/src/main/kotlin/io/element/android/features/invitepeople/test/FakeStartDMAction.kt @@ -5,10 +5,10 @@ * Please see LICENSE files in the repository root for full details. */ -package io.element.android.features.createroom.test +package io.element.android.features.invitepeople.test import androidx.compose.runtime.MutableState -import io.element.android.features.createroom.api.StartDMAction +import io.element.android.features.startchat.api.StartDMAction import io.element.android.libraries.architecture.AsyncAction import io.element.android.libraries.matrix.api.core.RoomId import io.element.android.libraries.matrix.api.user.MatrixUser diff --git a/features/userprofile/impl/build.gradle.kts b/features/userprofile/impl/build.gradle.kts index 4242efcb98..7bcebae565 100644 --- a/features/userprofile/impl/build.gradle.kts +++ b/features/userprofile/impl/build.gradle.kts @@ -38,7 +38,7 @@ dependencies { api(projects.features.userprofile.api) api(projects.features.userprofile.shared) implementation(libs.coil.compose) - implementation(projects.features.createroom.api) + implementation(projects.features.startchat.api) implementation(projects.services.analytics.api) testImplementation(libs.test.junit) @@ -49,7 +49,7 @@ dependencies { testImplementation(libs.test.mockk) testImplementation(libs.test.robolectric) testImplementation(projects.libraries.matrix.test) - testImplementation(projects.features.createroom.test) + testImplementation(projects.features.startchat.test) testImplementation(projects.features.enterprise.test) testImplementation(projects.tests.testutils) testImplementation(libs.androidx.compose.ui.test.junit) diff --git a/features/userprofile/impl/src/main/kotlin/io/element/android/features/userprofile/impl/root/UserProfilePresenter.kt b/features/userprofile/impl/src/main/kotlin/io/element/android/features/userprofile/impl/root/UserProfilePresenter.kt index 4de79b8375..b7fae6082b 100644 --- a/features/userprofile/impl/src/main/kotlin/io/element/android/features/userprofile/impl/root/UserProfilePresenter.kt +++ b/features/userprofile/impl/src/main/kotlin/io/element/android/features/userprofile/impl/root/UserProfilePresenter.kt @@ -20,8 +20,8 @@ import androidx.compose.runtime.setValue import dagger.assisted.Assisted import dagger.assisted.AssistedFactory import dagger.assisted.AssistedInject -import io.element.android.features.createroom.api.StartDMAction import io.element.android.features.enterprise.api.SessionEnterpriseService +import io.element.android.features.startchat.api.StartDMAction import io.element.android.features.userprofile.api.UserProfileEvents import io.element.android.features.userprofile.api.UserProfileState import io.element.android.features.userprofile.api.UserProfileState.ConfirmationDialog diff --git a/features/userprofile/impl/src/test/kotlin/io/element/android/features/userprofile/impl/UserProfilePresenterTest.kt b/features/userprofile/impl/src/test/kotlin/io/element/android/features/userprofile/impl/UserProfilePresenterTest.kt index 2ce7f99c2c..dd937b067a 100644 --- a/features/userprofile/impl/src/test/kotlin/io/element/android/features/userprofile/impl/UserProfilePresenterTest.kt +++ b/features/userprofile/impl/src/test/kotlin/io/element/android/features/userprofile/impl/UserProfilePresenterTest.kt @@ -13,10 +13,10 @@ import app.cash.molecule.moleculeFlow import app.cash.turbine.ReceiveTurbine import app.cash.turbine.test import com.google.common.truth.Truth.assertThat -import io.element.android.features.createroom.api.ConfirmingStartDmWithMatrixUser -import io.element.android.features.createroom.api.StartDMAction -import io.element.android.features.createroom.test.FakeStartDMAction import io.element.android.features.enterprise.test.FakeSessionEnterpriseService +import io.element.android.features.invitepeople.test.FakeStartDMAction +import io.element.android.features.startchat.api.ConfirmingStartDmWithMatrixUser +import io.element.android.features.startchat.api.StartDMAction import io.element.android.features.userprofile.api.UserProfileEvents import io.element.android.features.userprofile.api.UserProfileState import io.element.android.features.userprofile.api.UserProfileVerificationState diff --git a/features/userprofile/shared/build.gradle.kts b/features/userprofile/shared/build.gradle.kts index 0b14ce63f2..c49b78866f 100644 --- a/features/userprofile/shared/build.gradle.kts +++ b/features/userprofile/shared/build.gradle.kts @@ -1,5 +1,3 @@ -import extension.setupAnvil - /* * Copyright 2024 New Vector Ltd. * @@ -21,8 +19,6 @@ android { } } -setupAnvil() - dependencies { implementation(projects.libraries.core) implementation(projects.libraries.architecture) @@ -39,7 +35,7 @@ dependencies { api(projects.features.userprofile.api) api(projects.services.apperror.api) implementation(libs.coil.compose) - implementation(projects.features.createroom.api) + implementation(projects.features.startchat.api) implementation(projects.services.analytics.api) testImplementation(libs.test.junit) diff --git a/features/userprofile/shared/src/main/kotlin/io/element/android/features/userprofile/shared/UserProfileStateProvider.kt b/features/userprofile/shared/src/main/kotlin/io/element/android/features/userprofile/shared/UserProfileStateProvider.kt index 7a5cc53239..25cb8a5df6 100644 --- a/features/userprofile/shared/src/main/kotlin/io/element/android/features/userprofile/shared/UserProfileStateProvider.kt +++ b/features/userprofile/shared/src/main/kotlin/io/element/android/features/userprofile/shared/UserProfileStateProvider.kt @@ -8,7 +8,7 @@ package io.element.android.features.userprofile.shared import androidx.compose.ui.tooling.preview.PreviewParameterProvider -import io.element.android.features.createroom.api.ConfirmingStartDmWithMatrixUser +import io.element.android.features.startchat.api.ConfirmingStartDmWithMatrixUser import io.element.android.features.userprofile.api.UserProfileEvents import io.element.android.features.userprofile.api.UserProfileState import io.element.android.features.userprofile.api.UserProfileVerificationState diff --git a/features/userprofile/shared/src/main/kotlin/io/element/android/features/userprofile/shared/UserProfileView.kt b/features/userprofile/shared/src/main/kotlin/io/element/android/features/userprofile/shared/UserProfileView.kt index a43478e466..f39cbfaf73 100644 --- a/features/userprofile/shared/src/main/kotlin/io/element/android/features/userprofile/shared/UserProfileView.kt +++ b/features/userprofile/shared/src/main/kotlin/io/element/android/features/userprofile/shared/UserProfileView.kt @@ -21,7 +21,7 @@ import androidx.compose.ui.res.stringResource import androidx.compose.ui.tooling.preview.PreviewParameter import androidx.compose.ui.unit.dp import io.element.android.compound.tokens.generated.CompoundIcons -import io.element.android.features.createroom.api.ConfirmingStartDmWithMatrixUser +import io.element.android.features.startchat.api.ConfirmingStartDmWithMatrixUser import io.element.android.features.userprofile.api.UserProfileEvents import io.element.android.features.userprofile.api.UserProfileState import io.element.android.features.userprofile.api.UserProfileVerificationState diff --git a/features/verifysession/impl/src/main/res/values-zh/translations.xml b/features/verifysession/impl/src/main/res/values-zh/translations.xml index fceaef0572..922cc8e193 100644 --- a/features/verifysession/impl/src/main/res/values-zh/translations.xml +++ b/features/verifysession/impl/src/main/res/values-zh/translations.xml @@ -39,9 +39,13 @@ "匹配" "从此处开始验证之前,请确保您已在其他设备上打开了该应用程序。" "在另一台验证的设备上打开应用" + "为了提高安全性,请通过比较设备上的一组表情符号来验证此用户。通过使用安全方式来做到这一点,如面对面。" + "验证此用户?" + "为了提高安全性,另一位用户想要验证您的身份。您将看到一组表情符号供您比较。" "您应该会在另一台设备上看到一个弹出窗口。现在从那里开始验证。" "在另一台设备上开始验证" "正在等待其他设备" + "等待其他用户" "请在其他会话中接受验证请求。" "等待接受请求" "正在登出…" diff --git a/gradle.properties b/gradle.properties index 74dc7941d2..38cf7488a4 100644 --- a/gradle.properties +++ b/gradle.properties @@ -41,7 +41,7 @@ signing.element.nightly.keyPassword=Secret # Customise the Lint version to use a more recent version than the one bundled with AGP # https://googlesamples.github.io/android-custom-lint-rules/usage/newer-lint.md.html -android.experimental.lint.version=8.12.0 +android.experimental.lint.version=8.12.1 # Enable test fixture for all modules by default android.experimental.enableTestFixtures=true @@ -54,3 +54,6 @@ com.squareup.anvil.kspContributingAnnotations=io.element.android.anvilannotation # Only apply KSP to main sources ksp.allow.all.target.configuration=false + +# Used to prevent detekt from reusing invalid cached rules +detekt.use.worker.api=true diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index ae05a0cd2e..f9cc0c07cc 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -3,14 +3,15 @@ [versions] # Project -android_gradle_plugin = "8.12.0" -kotlin = "2.2.0" +android_gradle_plugin = "8.12.1" +# When updateing this, please also update the version in the file ./idea/kotlinc.xml +kotlin = "2.2.10" kotlinpoet = "2.2.0" -ksp = "2.2.0-2.0.2" +ksp = "2.2.10-2.0.2" firebaseAppDistribution = "5.1.1" # AndroidX -core = "1.16.0" +core = "1.17.0" datastore = "1.1.7" constraintlayout = "2.2.1" constraintlayout_compose = "1.1.1" @@ -49,7 +50,7 @@ haze = "1.6.10" dependencyAnalysis = "2.19.0" # DI -dagger = "2.57" +dagger = "2.57.1" anvil = "0.4.1" # Auto service @@ -171,11 +172,11 @@ serialization_json = { module = "org.jetbrains.kotlinx:kotlinx-serialization-jso kotlinx_collections_immutable = "org.jetbrains.kotlinx:kotlinx-collections-immutable:0.4.0" showkase = { module = "com.airbnb.android:showkase", version.ref = "showkase" } showkase_processor = { module = "com.airbnb.android:showkase-processor", version.ref = "showkase" } -jsoup = "org.jsoup:jsoup:1.21.1" +jsoup = "org.jsoup:jsoup:1.21.2" appyx_core = { module = "com.bumble.appyx:core", version.ref = "appyx" } molecule-runtime = "app.cash.molecule:molecule-runtime:2.1.0" timber = "com.jakewharton.timber:timber:5.0.1" -matrix_sdk = "org.matrix.rustcomponents:sdk-android:25.8.5" +matrix_sdk = "org.matrix.rustcomponents:sdk-android:25.8.25" matrix_richtexteditor = { module = "io.element.android:wysiwyg", version.ref = "wysiwyg" } matrix_richtexteditor_compose = { module = "io.element.android:wysiwyg-compose", version.ref = "wysiwyg" } sqldelight-driver-android = { module = "app.cash.sqldelight:android-driver", version.ref = "sqldelight" } @@ -197,8 +198,8 @@ haze = { module = "dev.chrisbanes.haze:haze", version.ref = "haze" } haze_materials = { module = "dev.chrisbanes.haze:haze-materials", version.ref = "haze" } # Analytics -posthog = "com.posthog:posthog-android:3.20.2" -sentry = "io.sentry:sentry-android:8.19.1" +posthog = "com.posthog:posthog-android:3.20.4" +sentry = "io.sentry:sentry-android:8.20.0" # main branch can be tested replacing the version with main-SNAPSHOT matrix_analytics_events = "com.github.matrix-org:matrix-analytics-events:0.28.0" @@ -235,7 +236,7 @@ kapt = { id = "org.jetbrains.kotlin.kapt", version.ref = "kotlin" } ksp = { id = "com.google.devtools.ksp", version.ref = "ksp" } anvil = { id = "dev.zacsweers.anvil", version.ref = "anvil" } detekt = { id = "io.gitlab.arturbosch.detekt", version.ref = "detekt" } -ktlint = "org.jlleitschuh.gradle.ktlint:13.0.0" +ktlint = "org.jlleitschuh.gradle.ktlint:13.1.0" dependencygraph = "com.savvasdalkitsis.module-dependency-graph:0.12" dependencycheck = "org.owasp.dependencycheck:12.1.3" dependencyanalysis = { id = "com.autonomousapps.dependency-analysis", version.ref = "dependencyAnalysis" } @@ -243,6 +244,6 @@ paparazzi = "app.cash.paparazzi:2.0.0-alpha02" sqldelight = { id = "app.cash.sqldelight", version.ref = "sqldelight" } firebaseAppDistribution = { id = "com.google.firebase.appdistribution", version.ref = "firebaseAppDistribution" } knit = { id = "org.jetbrains.kotlinx.knit", version = "0.5.0" } -sonarqube = "org.sonarqube:6.2.0.5505" +sonarqube = "org.sonarqube:6.3.0.5676" licensee = "app.cash.licensee:1.13.0" compose-compiler = { id = "org.jetbrains.kotlin.plugin.compose", version.ref = "kotlin" } diff --git a/libraries/androidutils/build.gradle.kts b/libraries/androidutils/build.gradle.kts index 1aa23a09e8..62cef138d2 100644 --- a/libraries/androidutils/build.gradle.kts +++ b/libraries/androidutils/build.gradle.kts @@ -31,12 +31,14 @@ dependencies { implementation(libs.androidx.activity.activity) implementation(libs.androidx.recyclerview) implementation(libs.androidx.exifinterface) + implementation(libs.androidx.datastore.preferences) api(libs.androidx.browser) testImplementation(projects.tests.testutils) testImplementation(libs.test.junit) testImplementation(libs.test.truth) testImplementation(libs.test.robolectric) + testImplementation(libs.androidx.test.ext.junit) testImplementation(libs.coroutines.core) testImplementation(libs.coroutines.test) testImplementation(projects.services.toolbox.test) diff --git a/libraries/androidutils/src/main/kotlin/io/element/android/libraries/androidutils/media/VideoCompressorHelper.kt b/libraries/androidutils/src/main/kotlin/io/element/android/libraries/androidutils/media/VideoCompressorHelper.kt index a9aa8cf378..3ac32fd3a9 100644 --- a/libraries/androidutils/src/main/kotlin/io/element/android/libraries/androidutils/media/VideoCompressorHelper.kt +++ b/libraries/androidutils/src/main/kotlin/io/element/android/libraries/androidutils/media/VideoCompressorHelper.kt @@ -27,7 +27,11 @@ class VideoCompressorHelper( fun getOutputSize(inputSize: Size): Size { val resultMajor = min(inputSize.major(), maxSize) val aspectRatio = inputSize.major().toFloat() / inputSize.minor().toFloat() - return Size(resultMajor, (resultMajor / aspectRatio).roundToInt()) + return if (inputSize.isLandscape()) { + Size(resultMajor, (resultMajor / aspectRatio).roundToInt()) + } else { + Size((resultMajor / aspectRatio).roundToInt(), resultMajor) + } } /** @@ -38,9 +42,10 @@ class VideoCompressorHelper( val pixelsPerFrame = outputSize.width * outputSize.height // Apparently, 0.1 bits per pixel is a sweet spot for video compression val bitsPerPixel = 0.1f - return (pixelsPerFrame * bitsPerPixel * frameRate).toLong() / 1000 + return (pixelsPerFrame * bitsPerPixel * frameRate).toLong() } } -internal fun Size.major(): Int = if (width > height) width else height -internal fun Size.minor(): Int = if (width < height) width else height +private fun Size.isLandscape(): Boolean = width > height +private fun Size.major(): Int = if (isLandscape()) width else height +private fun Size.minor(): Int = if (isLandscape()) height else width diff --git a/libraries/androidutils/src/main/kotlin/io/element/android/libraries/androidutils/preferences/DefaultPreferencesCorruptionHandlerFactory.kt b/libraries/androidutils/src/main/kotlin/io/element/android/libraries/androidutils/preferences/DefaultPreferencesCorruptionHandlerFactory.kt new file mode 100644 index 0000000000..e6270f4af3 --- /dev/null +++ b/libraries/androidutils/src/main/kotlin/io/element/android/libraries/androidutils/preferences/DefaultPreferencesCorruptionHandlerFactory.kt @@ -0,0 +1,26 @@ +/* + * Copyright 2025 New Vector Ltd. + * + * SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial + * Please see LICENSE files in the repository root for full details. + */ + +package io.element.android.libraries.androidutils.preferences + +import androidx.datastore.core.handlers.ReplaceFileCorruptionHandler +import androidx.datastore.preferences.core.Preferences +import androidx.datastore.preferences.core.emptyPreferences + +object DefaultPreferencesCorruptionHandlerFactory { + /** + * Creates a [ReplaceFileCorruptionHandler] that will replace the corrupted preferences file with an empty preferences object. + */ + fun replaceWithEmpty(): ReplaceFileCorruptionHandler { + return ReplaceFileCorruptionHandler( + produceNewData = { + // If the preferences file is corrupted, we return an empty preferences object + emptyPreferences() + }, + ) + } +} diff --git a/libraries/androidutils/src/test/kotlin/io/element/android/libraries/androidutils/media/VideoCompressorHelperTest.kt b/libraries/androidutils/src/test/kotlin/io/element/android/libraries/androidutils/media/VideoCompressorHelperTest.kt new file mode 100644 index 0000000000..96d15d6bfa --- /dev/null +++ b/libraries/androidutils/src/test/kotlin/io/element/android/libraries/androidutils/media/VideoCompressorHelperTest.kt @@ -0,0 +1,79 @@ +/* + * Copyright 2025 New Vector Ltd. + * + * SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial + * Please see LICENSE files in the repository root for full details. + */ + +package io.element.android.libraries.androidutils.media + +import android.util.Size +import androidx.test.ext.junit.runners.AndroidJUnit4 +import com.google.common.truth.Truth.assertThat +import org.junit.Test +import org.junit.runner.RunWith + +@RunWith(AndroidJUnit4::class) +class VideoCompressorHelperTest { + @Test + fun `test getOutputSize`() { + val helper = VideoCompressorHelper(maxSize = 720) + + // Landscape input + var inputSize = Size(1920, 1080) + var outputSize = helper.getOutputSize(inputSize) + assertThat(outputSize).isEqualTo(Size(720, 405)) + + // Landscape input small height + inputSize = Size(1920, 200) + outputSize = helper.getOutputSize(inputSize) + assertThat(outputSize).isEqualTo(Size(720, 75)) + + // Portrait input + inputSize = Size(1080, 1920) + outputSize = helper.getOutputSize(inputSize) + assertThat(outputSize).isEqualTo(Size(405, 720)) + + // Portrait input small width + inputSize = Size(200, 1920) + outputSize = helper.getOutputSize(inputSize) + assertThat(outputSize).isEqualTo(Size(75, 720)) + + // Square input + inputSize = Size(1000, 1000) + outputSize = helper.getOutputSize(inputSize) + assertThat(outputSize).isEqualTo(Size(720, 720)) + + // Square input same size + inputSize = Size(720, 720) + outputSize = helper.getOutputSize(inputSize) + assertThat(outputSize).isEqualTo(Size(720, 720)) + + // Square input no downscaling + inputSize = Size(240, 240) + outputSize = helper.getOutputSize(inputSize) + assertThat(outputSize).isEqualTo(Size(240, 240)) + + // Small input landscape (no downscaling) + inputSize = Size(640, 480) + outputSize = helper.getOutputSize(inputSize) + assertThat(outputSize).isEqualTo(Size(640, 480)) + + // Small input portrait (no downscaling) + inputSize = Size(480, 640) + outputSize = helper.getOutputSize(inputSize) + assertThat(outputSize).isEqualTo(Size(480, 640)) + } + + @Test + fun `test calculateOptimalBitrate`() { + val helper = VideoCompressorHelper(maxSize = 720) + val inputSize = Size(1920, 1080) + var bitrate = helper.calculateOptimalBitrate(inputSize, frameRate = 30) + // Output size will be 720x405, so bitrate = 720*405*0.1*30 = 874800 + assertThat(bitrate).isEqualTo(874_800L) + // Half frame rate, half bitrate + bitrate = helper.calculateOptimalBitrate(inputSize, frameRate = 15) + assertThat(bitrate).isEqualTo(437_400L) + } +} diff --git a/libraries/architecture/src/main/kotlin/io/element/android/libraries/architecture/AsyncData.kt b/libraries/architecture/src/main/kotlin/io/element/android/libraries/architecture/AsyncData.kt index b7f22cbe23..7085db62f3 100644 --- a/libraries/architecture/src/main/kotlin/io/element/android/libraries/architecture/AsyncData.kt +++ b/libraries/architecture/src/main/kotlin/io/element/android/libraries/architecture/AsyncData.kt @@ -160,3 +160,17 @@ suspend inline fun runUpdatingState( } ) } + +inline fun AsyncData.map( + transform: (T?) -> R, +): AsyncData { + return when (this) { + is AsyncData.Failure -> AsyncData.Failure( + error = error, + prevData = transform(prevData) + ) + is AsyncData.Loading -> AsyncData.Loading(transform(prevData)) + is AsyncData.Success -> AsyncData.Success(transform(data)) + AsyncData.Uninitialized -> AsyncData.Uninitialized + } +} diff --git a/libraries/dateformatter/impl/src/main/res/values-uz/translations.xml b/libraries/dateformatter/impl/src/main/res/values-uz/translations.xml new file mode 100644 index 0000000000..204e29be71 --- /dev/null +++ b/libraries/dateformatter/impl/src/main/res/values-uz/translations.xml @@ -0,0 +1,5 @@ + + + "%1$sda %2$s" + "Bu oy" + diff --git a/libraries/deeplink/api/build.gradle.kts b/libraries/deeplink/api/build.gradle.kts new file mode 100644 index 0000000000..01d568df52 --- /dev/null +++ b/libraries/deeplink/api/build.gradle.kts @@ -0,0 +1,17 @@ +/* + * Copyright 2022-2024 New Vector Ltd. + * + * SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial + * Please see LICENSE files in the repository root for full details. + */ +plugins { + id("io.element.android-library") +} + +android { + namespace = "io.element.android.libraries.deeplink.api" +} + +dependencies { + implementation(projects.libraries.matrix.api) +} diff --git a/libraries/deeplink/api/src/main/kotlin/io/element/android/libraries/deeplink/api/DeepLinkCreator.kt b/libraries/deeplink/api/src/main/kotlin/io/element/android/libraries/deeplink/api/DeepLinkCreator.kt new file mode 100644 index 0000000000..2a29d70bd4 --- /dev/null +++ b/libraries/deeplink/api/src/main/kotlin/io/element/android/libraries/deeplink/api/DeepLinkCreator.kt @@ -0,0 +1,16 @@ +/* + * Copyright 2023, 2024 New Vector Ltd. + * + * SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial + * Please see LICENSE files in the repository root for full details. + */ + +package io.element.android.libraries.deeplink.api + +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 + +fun interface DeepLinkCreator { + fun create(sessionId: SessionId, roomId: RoomId?, threadId: ThreadId?): String +} diff --git a/libraries/deeplink/src/main/kotlin/io/element/android/libraries/deeplink/DeeplinkData.kt b/libraries/deeplink/api/src/main/kotlin/io/element/android/libraries/deeplink/api/DeeplinkData.kt similarity index 94% rename from libraries/deeplink/src/main/kotlin/io/element/android/libraries/deeplink/DeeplinkData.kt rename to libraries/deeplink/api/src/main/kotlin/io/element/android/libraries/deeplink/api/DeeplinkData.kt index 9dc8a90509..d15652b3ee 100644 --- a/libraries/deeplink/src/main/kotlin/io/element/android/libraries/deeplink/DeeplinkData.kt +++ b/libraries/deeplink/api/src/main/kotlin/io/element/android/libraries/deeplink/api/DeeplinkData.kt @@ -5,7 +5,7 @@ * Please see LICENSE files in the repository root for full details. */ -package io.element.android.libraries.deeplink +package io.element.android.libraries.deeplink.api import io.element.android.libraries.matrix.api.core.RoomId import io.element.android.libraries.matrix.api.core.SessionId diff --git a/libraries/deeplink/api/src/main/kotlin/io/element/android/libraries/deeplink/api/DeeplinkParser.kt b/libraries/deeplink/api/src/main/kotlin/io/element/android/libraries/deeplink/api/DeeplinkParser.kt new file mode 100644 index 0000000000..d101bbc2ec --- /dev/null +++ b/libraries/deeplink/api/src/main/kotlin/io/element/android/libraries/deeplink/api/DeeplinkParser.kt @@ -0,0 +1,14 @@ +/* + * Copyright 2023, 2024 New Vector Ltd. + * + * SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial + * Please see LICENSE files in the repository root for full details. + */ + +package io.element.android.libraries.deeplink.api + +import android.content.Intent + +fun interface DeeplinkParser { + fun getFromIntent(intent: Intent): DeeplinkData? +} diff --git a/features/createroom/impl/src/main/kotlin/io/element/android/features/createroom/impl/di/CreateRoomScope.kt b/libraries/deeplink/api/src/main/kotlin/io/element/android/libraries/deeplink/api/usecase/InviteFriendsUseCase.kt similarity index 55% rename from features/createroom/impl/src/main/kotlin/io/element/android/features/createroom/impl/di/CreateRoomScope.kt rename to libraries/deeplink/api/src/main/kotlin/io/element/android/libraries/deeplink/api/usecase/InviteFriendsUseCase.kt index b0a011424a..5c5bcf5043 100644 --- a/features/createroom/impl/src/main/kotlin/io/element/android/features/createroom/impl/di/CreateRoomScope.kt +++ b/libraries/deeplink/api/src/main/kotlin/io/element/android/libraries/deeplink/api/usecase/InviteFriendsUseCase.kt @@ -5,6 +5,10 @@ * Please see LICENSE files in the repository root for full details. */ -package io.element.android.features.createroom.impl.di +package io.element.android.libraries.deeplink.api.usecase -abstract class CreateRoomScope private constructor() +import android.app.Activity + +interface InviteFriendsUseCase { + fun execute(activity: Activity) +} diff --git a/libraries/deeplink/build.gradle.kts b/libraries/deeplink/impl/build.gradle.kts similarity index 90% rename from libraries/deeplink/build.gradle.kts rename to libraries/deeplink/impl/build.gradle.kts index 5e1a06bee0..412c162299 100644 --- a/libraries/deeplink/build.gradle.kts +++ b/libraries/deeplink/impl/build.gradle.kts @@ -6,17 +6,19 @@ import extension.setupAnvil * SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial * Please see LICENSE files in the repository root for full details. */ + plugins { id("io.element.android-library") } android { - namespace = "io.element.android.libraries.deeplink" + namespace = "io.element.android.libraries.deeplink.impl" } setupAnvil() dependencies { + api(projects.libraries.deeplink.api) implementation(projects.libraries.di) implementation(libs.dagger) implementation(libs.androidx.corektx) diff --git a/libraries/deeplink/src/main/kotlin/io/element/android/libraries/deeplink/Constants.kt b/libraries/deeplink/impl/src/main/kotlin/io/element/android/libraries/deeplink/impl/Constants.kt similarity index 84% rename from libraries/deeplink/src/main/kotlin/io/element/android/libraries/deeplink/Constants.kt rename to libraries/deeplink/impl/src/main/kotlin/io/element/android/libraries/deeplink/impl/Constants.kt index b39a1c97d8..1cd98a70d3 100644 --- a/libraries/deeplink/src/main/kotlin/io/element/android/libraries/deeplink/Constants.kt +++ b/libraries/deeplink/impl/src/main/kotlin/io/element/android/libraries/deeplink/impl/Constants.kt @@ -5,7 +5,7 @@ * Please see LICENSE files in the repository root for full details. */ -package io.element.android.libraries.deeplink +package io.element.android.libraries.deeplink.impl internal const val SCHEME = "elementx" internal const val HOST = "open" diff --git a/libraries/deeplink/src/main/kotlin/io/element/android/libraries/deeplink/DeepLinkCreator.kt b/libraries/deeplink/impl/src/main/kotlin/io/element/android/libraries/deeplink/impl/DefaultDeepLinkCreator.kt similarity index 61% rename from libraries/deeplink/src/main/kotlin/io/element/android/libraries/deeplink/DeepLinkCreator.kt rename to libraries/deeplink/impl/src/main/kotlin/io/element/android/libraries/deeplink/impl/DefaultDeepLinkCreator.kt index 25058e1812..371a0d21fb 100644 --- a/libraries/deeplink/src/main/kotlin/io/element/android/libraries/deeplink/DeepLinkCreator.kt +++ b/libraries/deeplink/impl/src/main/kotlin/io/element/android/libraries/deeplink/impl/DefaultDeepLinkCreator.kt @@ -1,19 +1,23 @@ /* - * Copyright 2023, 2024 New Vector Ltd. + * Copyright 2025 New Vector Ltd. * * SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial * Please see LICENSE files in the repository root for full details. */ -package io.element.android.libraries.deeplink +package io.element.android.libraries.deeplink.impl +import com.squareup.anvil.annotations.ContributesBinding +import io.element.android.libraries.deeplink.api.DeepLinkCreator +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.matrix.api.core.ThreadId import javax.inject.Inject -class DeepLinkCreator @Inject constructor() { - fun room(sessionId: SessionId, roomId: RoomId?, threadId: ThreadId?): String { +@ContributesBinding(AppScope::class) +class DefaultDeepLinkCreator @Inject constructor() : DeepLinkCreator { + override fun create(sessionId: SessionId, roomId: RoomId?, threadId: ThreadId?): String { return buildString { append("$SCHEME://$HOST/") append(sessionId.value) diff --git a/libraries/deeplink/src/main/kotlin/io/element/android/libraries/deeplink/DeeplinkParser.kt b/libraries/deeplink/impl/src/main/kotlin/io/element/android/libraries/deeplink/impl/DefaultDeeplinkParser.kt similarity index 71% rename from libraries/deeplink/src/main/kotlin/io/element/android/libraries/deeplink/DeeplinkParser.kt rename to libraries/deeplink/impl/src/main/kotlin/io/element/android/libraries/deeplink/impl/DefaultDeeplinkParser.kt index cdb249b7b9..84b17fc9aa 100644 --- a/libraries/deeplink/src/main/kotlin/io/element/android/libraries/deeplink/DeeplinkParser.kt +++ b/libraries/deeplink/impl/src/main/kotlin/io/element/android/libraries/deeplink/impl/DefaultDeeplinkParser.kt @@ -1,21 +1,26 @@ /* - * Copyright 2023, 2024 New Vector Ltd. + * Copyright 2025 New Vector Ltd. * * SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial * Please see LICENSE files in the repository root for full details. */ -package io.element.android.libraries.deeplink +package io.element.android.libraries.deeplink.impl import android.content.Intent import android.net.Uri +import com.squareup.anvil.annotations.ContributesBinding +import io.element.android.libraries.deeplink.api.DeeplinkData +import io.element.android.libraries.deeplink.api.DeeplinkParser +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.matrix.api.core.ThreadId import javax.inject.Inject -class DeeplinkParser @Inject constructor() { - fun getFromIntent(intent: Intent): DeeplinkData? { +@ContributesBinding(AppScope::class) +class DefaultDeeplinkParser @Inject constructor() : DeeplinkParser { + override fun getFromIntent(intent: Intent): DeeplinkData? { return intent .takeIf { it.action == Intent.ACTION_VIEW } ?.data diff --git a/libraries/deeplink/src/main/kotlin/io/element/android/libraries/deeplink/usecase/InviteFriendsUseCase.kt b/libraries/deeplink/impl/src/main/kotlin/io/element/android/libraries/deeplink/impl/usecase/DefaultInviteFriendsUseCase.kt similarity index 79% rename from libraries/deeplink/src/main/kotlin/io/element/android/libraries/deeplink/usecase/InviteFriendsUseCase.kt rename to libraries/deeplink/impl/src/main/kotlin/io/element/android/libraries/deeplink/impl/usecase/DefaultInviteFriendsUseCase.kt index dc072fc9bc..8c24234cd8 100644 --- a/libraries/deeplink/src/main/kotlin/io/element/android/libraries/deeplink/usecase/InviteFriendsUseCase.kt +++ b/libraries/deeplink/impl/src/main/kotlin/io/element/android/libraries/deeplink/impl/usecase/DefaultInviteFriendsUseCase.kt @@ -1,15 +1,18 @@ /* - * Copyright 2023, 2024 New Vector Ltd. + * Copyright 2025 New Vector Ltd. * * SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial * Please see LICENSE files in the repository root for full details. */ -package io.element.android.libraries.deeplink.usecase +package io.element.android.libraries.deeplink.impl.usecase import android.app.Activity +import com.squareup.anvil.annotations.ContributesBinding import io.element.android.libraries.androidutils.system.startSharePlainTextIntent import io.element.android.libraries.core.meta.BuildMeta +import io.element.android.libraries.deeplink.api.usecase.InviteFriendsUseCase +import io.element.android.libraries.di.SessionScope import io.element.android.libraries.matrix.api.MatrixClient import io.element.android.libraries.matrix.api.permalink.PermalinkBuilder import io.element.android.libraries.ui.strings.CommonStrings @@ -18,13 +21,14 @@ import timber.log.Timber import javax.inject.Inject import io.element.android.libraries.androidutils.R as AndroidUtilsR -class InviteFriendsUseCase @Inject constructor( +@ContributesBinding(SessionScope::class) +class DefaultInviteFriendsUseCase @Inject constructor( private val stringProvider: StringProvider, private val matrixClient: MatrixClient, private val buildMeta: BuildMeta, private val permalinkBuilder: PermalinkBuilder, -) { - fun execute(activity: Activity) { +) : InviteFriendsUseCase { + override fun execute(activity: Activity) { val permalinkResult = permalinkBuilder.permalinkForUser(matrixClient.sessionId) permalinkResult.fold( onSuccess = { permalink -> diff --git a/libraries/deeplink/src/test/kotlin/io/element/android/libraries/deeplink/DeepLinkCreatorTest.kt b/libraries/deeplink/impl/src/test/kotlin/io/element/android/libraries/deeplink/impl/DefaultDeepLinkCreatorTest.kt similarity index 67% rename from libraries/deeplink/src/test/kotlin/io/element/android/libraries/deeplink/DeepLinkCreatorTest.kt rename to libraries/deeplink/impl/src/test/kotlin/io/element/android/libraries/deeplink/impl/DefaultDeepLinkCreatorTest.kt index f6114fabb2..a5c943c525 100644 --- a/libraries/deeplink/src/test/kotlin/io/element/android/libraries/deeplink/DeepLinkCreatorTest.kt +++ b/libraries/deeplink/impl/src/test/kotlin/io/element/android/libraries/deeplink/impl/DefaultDeepLinkCreatorTest.kt @@ -5,7 +5,7 @@ * Please see LICENSE files in the repository root for full details. */ -package io.element.android.libraries.deeplink +package io.element.android.libraries.deeplink.impl import com.google.common.truth.Truth.assertThat import io.element.android.libraries.matrix.test.A_ROOM_ID @@ -13,15 +13,15 @@ import io.element.android.libraries.matrix.test.A_SESSION_ID import io.element.android.libraries.matrix.test.A_THREAD_ID import org.junit.Test -class DeepLinkCreatorTest { +class DefaultDeepLinkCreatorTest { @Test - fun room() { - val sut = DeepLinkCreator() - assertThat(sut.room(A_SESSION_ID, null, null)) + fun create() { + val sut = DefaultDeepLinkCreator() + assertThat(sut.create(A_SESSION_ID, null, null)) .isEqualTo("elementx://open/@alice:server.org") - assertThat(sut.room(A_SESSION_ID, A_ROOM_ID, null)) + assertThat(sut.create(A_SESSION_ID, A_ROOM_ID, null)) .isEqualTo("elementx://open/@alice:server.org/!aRoomId:domain") - assertThat(sut.room(A_SESSION_ID, A_ROOM_ID, A_THREAD_ID)) + assertThat(sut.create(A_SESSION_ID, A_ROOM_ID, A_THREAD_ID)) .isEqualTo("elementx://open/@alice:server.org/!aRoomId:domain/\$aThreadId") } } diff --git a/libraries/deeplink/src/test/kotlin/io/element/android/libraries/deeplink/DeeplinkParserTest.kt b/libraries/deeplink/impl/src/test/kotlin/io/element/android/libraries/deeplink/impl/DefaultDeeplinkParserTest.kt similarity index 90% rename from libraries/deeplink/src/test/kotlin/io/element/android/libraries/deeplink/DeeplinkParserTest.kt rename to libraries/deeplink/impl/src/test/kotlin/io/element/android/libraries/deeplink/impl/DefaultDeeplinkParserTest.kt index 48e3bab9db..787c721092 100644 --- a/libraries/deeplink/src/test/kotlin/io/element/android/libraries/deeplink/DeeplinkParserTest.kt +++ b/libraries/deeplink/impl/src/test/kotlin/io/element/android/libraries/deeplink/impl/DefaultDeeplinkParserTest.kt @@ -5,11 +5,12 @@ * Please see LICENSE files in the repository root for full details. */ -package io.element.android.libraries.deeplink +package io.element.android.libraries.deeplink.impl import android.content.Intent import androidx.core.net.toUri import com.google.common.truth.Truth.assertThat +import io.element.android.libraries.deeplink.api.DeeplinkData 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 @@ -19,7 +20,7 @@ import org.junit.runner.RunWith import org.robolectric.RobolectricTestRunner @RunWith(RobolectricTestRunner::class) -class DeeplinkParserTest { +class DefaultDeeplinkParserTest { companion object { const val A_URI = "elementx://open/@alice:server.org" @@ -29,10 +30,9 @@ class DeeplinkParserTest { "elementx://open/@alice:server.org/!aRoomId:domain/\$aThreadId" } - private val sut = DeeplinkParser() - @Test fun `nominal cases`() { + val sut = DefaultDeeplinkParser() assertThat(sut.getFromIntent(createIntent(A_URI))) .isEqualTo(DeeplinkData.Root(A_SESSION_ID)) assertThat(sut.getFromIntent(createIntent(A_URI_WITH_ROOM))) @@ -43,7 +43,7 @@ class DeeplinkParserTest { @Test fun `error cases`() { - val sut = DeeplinkParser() + val sut = DefaultDeeplinkParser() // Bad scheme assertThat(sut.getFromIntent(createIntent("x://open/@alice:server.org"))).isNull() // Bad host diff --git a/libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/atomic/atoms/SelectedIndicatorAtom.kt b/libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/atomic/atoms/SelectedIndicatorAtom.kt new file mode 100644 index 0000000000..4f30ac6d9b --- /dev/null +++ b/libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/atomic/atoms/SelectedIndicatorAtom.kt @@ -0,0 +1,81 @@ +/* + * Copyright 2025 New Vector Ltd. + * + * SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial + * Please see LICENSE files in the repository root for full details. + */ + +package io.element.android.libraries.designsystem.atomic.atoms + +import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.layout.Box +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.size +import androidx.compose.foundation.selection.toggleable +import androidx.compose.runtime.Composable +import androidx.compose.ui.Modifier +import androidx.compose.ui.semantics.Role +import androidx.compose.ui.unit.dp +import io.element.android.compound.theme.ElementTheme +import io.element.android.compound.tokens.generated.CompoundIcons +import io.element.android.libraries.designsystem.preview.ElementPreview +import io.element.android.libraries.designsystem.preview.PreviewsDayNight +import io.element.android.libraries.designsystem.theme.components.Icon + +@Composable +fun SelectedIndicatorAtom( + checked: Boolean, + enabled: Boolean, + modifier: Modifier = Modifier, +) { + if (checked) { + Icon( + modifier = modifier.toggleable( + value = true, + role = Role.Companion.Checkbox, + enabled = enabled, + onValueChange = {}, + ), + imageVector = CompoundIcons.CheckCircleSolid(), + contentDescription = null, + tint = if (enabled) { + ElementTheme.colors.iconAccentPrimary + } else { + ElementTheme.colors.iconDisabled + }, + ) + } else { + Box(modifier) + } +} + +@Composable +@PreviewsDayNight +internal fun SelectedIndicatorAtomPreview() = ElementPreview { + Column( + modifier = Modifier.padding(8.dp), + verticalArrangement = Arrangement.spacedBy(8.dp), + ) { + SelectedIndicatorAtom( + modifier = Modifier.size(24.dp), + checked = false, + enabled = false, + ) + SelectedIndicatorAtom( + modifier = Modifier.size(24.dp), + checked = true, + enabled = false, + ) + SelectedIndicatorAtom( + modifier = Modifier.size(24.dp), + checked = false, + enabled = true, + ) + SelectedIndicatorAtom( + modifier = Modifier.size(24.dp), + checked = true, + enabled = true, + ) + } +} diff --git a/libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/atomic/molecules/RoomPreviewMembersCountMolecule.kt b/libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/atomic/molecules/MembersCountMolecule.kt similarity index 87% rename from libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/atomic/molecules/RoomPreviewMembersCountMolecule.kt rename to libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/atomic/molecules/MembersCountMolecule.kt index 07c57d2fac..844376af85 100644 --- a/libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/atomic/molecules/RoomPreviewMembersCountMolecule.kt +++ b/libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/atomic/molecules/MembersCountMolecule.kt @@ -25,7 +25,7 @@ import io.element.android.libraries.designsystem.theme.components.Icon import io.element.android.libraries.designsystem.theme.components.Text @Composable -fun RoomPreviewMembersCountMolecule( +fun MembersCountMolecule( memberCount: Long, modifier: Modifier = Modifier, ) { @@ -51,13 +51,13 @@ fun RoomPreviewMembersCountMolecule( @PreviewsDayNight @Composable -internal fun RoomPreviewMembersCountMoleculePreview() = ElementPreview { +internal fun MembersCountMoleculePreview() = ElementPreview { Column( modifier = Modifier.padding(8.dp), verticalArrangement = Arrangement.spacedBy(8.dp), ) { - RoomPreviewMembersCountMolecule(memberCount = 1) - RoomPreviewMembersCountMolecule(memberCount = 888) - RoomPreviewMembersCountMolecule(memberCount = 123_456) + MembersCountMolecule(memberCount = 1) + MembersCountMolecule(memberCount = 888) + MembersCountMolecule(memberCount = 123_456) } } diff --git a/libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/atomic/pages/OnBoardingPage.kt b/libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/atomic/pages/OnBoardingPage.kt index 716d4a46ce..810ff7b493 100644 --- a/libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/atomic/pages/OnBoardingPage.kt +++ b/libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/atomic/pages/OnBoardingPage.kt @@ -31,6 +31,7 @@ import io.element.android.libraries.designsystem.theme.components.Text * * Ref: https://www.figma.com/file/o9p34zmiuEpZRyvZXJZAYL/FTUE?type=design&node-id=133-5427&t=5SHVppfYzjvkEywR-0 * @param modifier Classical modifier. + * @param renderBackground whether to render the background image or not. * @param contentAlignment horizontal alignment of the contents. * @param footer optional footer. * @param content main content. @@ -38,6 +39,7 @@ import io.element.android.libraries.designsystem.theme.components.Text @Composable fun OnBoardingPage( modifier: Modifier = Modifier, + renderBackground: Boolean = true, contentAlignment: Alignment.Horizontal = Alignment.CenterHorizontally, footer: @Composable () -> Unit = {}, content: @Composable () -> Unit = {}, @@ -47,13 +49,15 @@ fun OnBoardingPage( .fillMaxSize() ) { // BG - Image( - modifier = Modifier - .fillMaxSize(), - painter = painterResource(id = R.drawable.onboarding_bg), - contentScale = ContentScale.Crop, - contentDescription = null, - ) + if (renderBackground) { + Image( + modifier = Modifier + .fillMaxSize(), + painter = painterResource(id = R.drawable.onboarding_bg), + contentScale = ContentScale.Crop, + contentDescription = null, + ) + } Column( modifier = Modifier .fillMaxSize() diff --git a/libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/components/avatar/AvatarDataProvider.kt b/libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/components/avatar/AvatarDataProvider.kt index 3c209df2cf..7ccebd2082 100644 --- a/libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/components/avatar/AvatarDataProvider.kt +++ b/libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/components/avatar/AvatarDataProvider.kt @@ -16,8 +16,8 @@ open class AvatarDataProvider : PreviewParameterProvider { .map { sequenceOf( anAvatarData(size = it), - anAvatarData(size = it).copy(name = null), - anAvatarData(size = it).copy(url = "aUrl"), + anAvatarData(size = it, name = null), + anAvatarData(size = it, url = "aUrl"), ) } .flatten() @@ -26,10 +26,12 @@ open class AvatarDataProvider : PreviewParameterProvider { fun anAvatarData( // Let's the id not start with a 'a'. id: String = "@id_of_alice:server.org", - name: String = "Alice", + name: String? = "Alice", + url: String? = null, size: AvatarSize = AvatarSize.RoomListItem, ) = AvatarData( id = id, name = name, + url = url, size = size, ) diff --git a/features/knockrequests/impl/src/main/kotlin/io/element/android/features/knockrequests/impl/banner/AvatarRow.kt b/libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/components/avatar/AvatarRow.kt similarity index 70% rename from features/knockrequests/impl/src/main/kotlin/io/element/android/features/knockrequests/impl/banner/AvatarRow.kt rename to libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/components/avatar/AvatarRow.kt index 992098dc91..8c3ae3aac9 100644 --- a/features/knockrequests/impl/src/main/kotlin/io/element/android/features/knockrequests/impl/banner/AvatarRow.kt +++ b/libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/components/avatar/AvatarRow.kt @@ -5,7 +5,7 @@ * Please see LICENSE files in the repository root for full details. */ -package io.element.android.features.knockrequests.impl.banner +package io.element.android.libraries.designsystem.components.avatar import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.padding @@ -23,10 +23,7 @@ import androidx.compose.ui.platform.LocalLayoutDirection import androidx.compose.ui.tooling.preview.PreviewParameter import androidx.compose.ui.unit.LayoutDirection import androidx.compose.ui.unit.dp -import io.element.android.libraries.designsystem.components.avatar.Avatar -import io.element.android.libraries.designsystem.components.avatar.AvatarData -import io.element.android.libraries.designsystem.components.avatar.AvatarSize -import io.element.android.libraries.designsystem.components.avatar.AvatarType +import io.element.android.libraries.designsystem.components.avatar.internal.OverlapRatioProvider import io.element.android.libraries.designsystem.preview.ElementPreview import io.element.android.libraries.designsystem.preview.PreviewsDayNight import io.element.android.libraries.designsystem.text.toPx @@ -41,6 +38,7 @@ import kotlinx.collections.immutable.toImmutableList * @param modifier Jetpack Compose modifier * @param overlapRatio the overlap ration. When 0f, avatars will render without overlap, when 1f * only the first avatar will be visible + * @param lastOnTop if true, the last visible avatar will be rendered on top. */ @Composable fun AvatarRow( @@ -48,6 +46,7 @@ fun AvatarRow( avatarType: AvatarType, modifier: Modifier = Modifier, overlapRatio: Float = 0.5f, + lastOnTop: Boolean = false, ) { val isRtl = LocalLayoutDirection.current == LayoutDirection.Rtl Box( @@ -57,23 +56,35 @@ fun AvatarRow( val avatarSize = avatarDataList.firstOrNull()?.size?.dp ?: return val avatarSizePx = avatarSize.toPx() avatarDataList - .reversed() + .let { + if (lastOnTop) { + it + } else { + it.reversed() + } + } .forEachIndexed { index, avatarData -> + val startPadding = if (lastOnTop) { + avatarSize * (1 - overlapRatio) * index + } else { + avatarSize * (1 - overlapRatio) * (lastItemIndex - index) + } Avatar( modifier = Modifier - .padding(start = avatarSize * (1 - overlapRatio) * (lastItemIndex - index)) + .padding(start = startPadding) .graphicsLayer { compositingStrategy = CompositingStrategy.Offscreen } .drawWithContent { - // Draw content and clear the pixels for the avatar on the left (right in RTL). + // Draw content and clear the pixels for the avatar on the left (right in RTL) or when lastOnTop is true on + // the right (left in RTL). drawContent() - val xOffset = if (isRtl) { - size.width - avatarSizePx * (overlapRatio - 0.5f) - } else { - 0f + avatarSizePx * (overlapRatio - 0.5f) - } if (index < lastItemIndex) { + val xOffset = if (isRtl == lastOnTop) { + avatarSizePx * (overlapRatio - 0.5f) + } else { + size.width - avatarSizePx * (overlapRatio - 0.5f) + } drawCircle( color = Color.Black, center = Offset( @@ -104,6 +115,17 @@ internal fun AvatarRowPreview(@PreviewParameter(OverlapRatioProvider::class) ove } } +@Composable +@PreviewsDayNight +internal fun AvatarRowLastOnTopPreview(@PreviewParameter(OverlapRatioProvider::class) overlapRatio: Float) { + ElementPreview { + ContentToPreview( + overlapRatio = overlapRatio, + lastOnTop = true, + ) + } +} + @Composable @PreviewsDayNight internal fun AvatarRowRtlPreview(@PreviewParameter(OverlapRatioProvider::class) overlapRatio: Float) { @@ -117,7 +139,25 @@ internal fun AvatarRowRtlPreview(@PreviewParameter(OverlapRatioProvider::class) } @Composable -private fun ContentToPreview(overlapRatio: Float) { +@PreviewsDayNight +internal fun AvatarRowLastOnTopRtlPreview(@PreviewParameter(OverlapRatioProvider::class) overlapRatio: Float) { + CompositionLocalProvider( + LocalLayoutDirection provides LayoutDirection.Rtl, + ) { + ElementPreview { + ContentToPreview( + overlapRatio = overlapRatio, + lastOnTop = true, + ) + } + } +} + +@Composable +private fun ContentToPreview( + overlapRatio: Float, + lastOnTop: Boolean = false, +) { AvatarRow( avatarDataList = listOf("A", "B", "C").map { AvatarData( @@ -128,5 +168,6 @@ private fun ContentToPreview(overlapRatio: Float) { }.toImmutableList(), avatarType = AvatarType.User, overlapRatio = overlapRatio, + lastOnTop = lastOnTop, ) } 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 0f84b82fd1..91d52cfc84 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 @@ -24,7 +24,7 @@ enum class AvatarSize(val dp: Dp) { UserHeader(96.dp), UserListItem(36.dp), - SelectedUser(56.dp), + SelectedUser(52.dp), SelectedRoom(56.dp), DmCluster(75.dp), @@ -63,4 +63,8 @@ enum class AvatarSize(val dp: Dp) { DmCreationConfirmation(64.dp), UserVerification(52.dp), + + OrganizationHeader(64.dp), + SpaceHeader(64.dp), + SpaceMember(24.dp), } diff --git a/features/knockrequests/impl/src/main/kotlin/io/element/android/features/knockrequests/impl/banner/OverlapRatioProvider.kt b/libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/components/avatar/internal/OverlapRatioProvider.kt similarity index 85% rename from features/knockrequests/impl/src/main/kotlin/io/element/android/features/knockrequests/impl/banner/OverlapRatioProvider.kt rename to libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/components/avatar/internal/OverlapRatioProvider.kt index f9ff9ee82e..9a1abcee58 100644 --- a/features/knockrequests/impl/src/main/kotlin/io/element/android/features/knockrequests/impl/banner/OverlapRatioProvider.kt +++ b/libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/components/avatar/internal/OverlapRatioProvider.kt @@ -5,7 +5,7 @@ * Please see LICENSE files in the repository root for full details. */ -package io.element.android.features.knockrequests.impl.banner +package io.element.android.libraries.designsystem.components.avatar.internal import androidx.compose.ui.tooling.preview.PreviewParameterProvider diff --git a/libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/utils/StringProvider.kt b/libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/utils/StringProvider.kt deleted file mode 100644 index 74c11e58c0..0000000000 --- a/libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/utils/StringProvider.kt +++ /dev/null @@ -1,15 +0,0 @@ -/* - * Copyright 2023, 2024 New Vector Ltd. - * - * SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial - * Please see LICENSE files in the repository root for full details. - */ - -package io.element.android.libraries.designsystem.utils - -import androidx.compose.ui.tooling.preview.PreviewParameterProvider - -open class StringProvider(val strings: List) : PreviewParameterProvider { - override val values: Sequence - get() = strings.asSequence() -} diff --git a/libraries/eventformatter/impl/src/main/res/values-zh/translations.xml b/libraries/eventformatter/impl/src/main/res/values-zh/translations.xml index 342af5d761..9776510d6f 100644 --- a/libraries/eventformatter/impl/src/main/res/values-zh/translations.xml +++ b/libraries/eventformatter/impl/src/main/res/values-zh/translations.xml @@ -19,6 +19,8 @@ "你移除了聊天室头像" "%1$s 封禁了 %2$s" "你封禁了 %1$s" + "你封禁了%1$s:%2$s" + "%1$s封禁了%2$s:%3$s" "%1$s 创建了聊天室" "你创建了聊天室" "%1$s 邀请了 %2$s" @@ -55,6 +57,8 @@ "你拒绝了邀请" "%1$s 移除了 %2$s" "你移除了 %1$s" + "您已删除%1$s :%2$s" + "%1$s已移除%2$s:%3$s" "%1$s 向 %2$s 发送了加入聊天室的邀请" "你邀请 %1$s 加入聊天室" "%1$s 撤销了 %2$s 加入聊天室的邀请" diff --git a/libraries/eventformatter/impl/src/test/kotlin/io/element/android/libraries/eventformatter/impl/DefaultBaseRoomLastMessageFormatterTest.kt b/libraries/eventformatter/impl/src/test/kotlin/io/element/android/libraries/eventformatter/impl/DefaultBaseRoomLastMessageFormatterTest.kt index 6d0ad1aa49..ee56fcf2c5 100644 --- a/libraries/eventformatter/impl/src/test/kotlin/io/element/android/libraries/eventformatter/impl/DefaultBaseRoomLastMessageFormatterTest.kt +++ b/libraries/eventformatter/impl/src/test/kotlin/io/element/android/libraries/eventformatter/impl/DefaultBaseRoomLastMessageFormatterTest.kt @@ -14,6 +14,7 @@ import com.google.common.truth.Truth.assertWithMessage 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.timeline.item.EventThreadInfo 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.EventContent @@ -174,7 +175,7 @@ class DefaultBaseRoomLastMessageFormatterTest { ) { val body = "Shared body" fun createMessageContent(type: MessageType): MessageContent { - return MessageContent(body, null, false, false, type) + return MessageContent(body, null, false, EventThreadInfo(null, null), type) } val sharedContentMessagesTypes = arrayOf( diff --git a/libraries/eventformatter/impl/src/test/kotlin/io/element/android/libraries/eventformatter/impl/DefaultPinnedMessagesBannerFormatterTest.kt b/libraries/eventformatter/impl/src/test/kotlin/io/element/android/libraries/eventformatter/impl/DefaultPinnedMessagesBannerFormatterTest.kt index 4ff71608f8..349cd2585f 100644 --- a/libraries/eventformatter/impl/src/test/kotlin/io/element/android/libraries/eventformatter/impl/DefaultPinnedMessagesBannerFormatterTest.kt +++ b/libraries/eventformatter/impl/src/test/kotlin/io/element/android/libraries/eventformatter/impl/DefaultPinnedMessagesBannerFormatterTest.kt @@ -14,6 +14,7 @@ import com.google.common.truth.Truth.assertWithMessage 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.timeline.item.EventThreadInfo 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.EventContent @@ -129,7 +130,7 @@ class DefaultPinnedMessagesBannerFormatterTest { fun `Message contents`() { val body = "Shared body" fun createMessageContent(type: MessageType): MessageContent { - return MessageContent(body, null, false, false, type) + return MessageContent(body, null, false, EventThreadInfo(null, null), type) } val sharedContentMessagesTypes = arrayOf( 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 9d34c03a93..f420e6179f 100644 --- a/libraries/featureflag/api/src/main/kotlin/io/element/android/libraries/featureflag/api/FeatureFlags.kt +++ b/libraries/featureflag/api/src/main/kotlin/io/element/android/libraries/featureflag/api/FeatureFlags.kt @@ -93,4 +93,11 @@ enum class FeatureFlags( // False so it's displayed in the developer options screen isFinished = false, ), + Threads( + key = "feature.thread_timeline", + title = "Threads", + description = "Renders thread messages as a dedicated timeline. Restarting the app is required for this setting to fully take effect.", + defaultValue = { false }, + isFinished = false, + ) } diff --git a/libraries/featureflag/impl/build.gradle.kts b/libraries/featureflag/impl/build.gradle.kts index c1da63dba3..bd702fafac 100644 --- a/libraries/featureflag/impl/build.gradle.kts +++ b/libraries/featureflag/impl/build.gradle.kts @@ -24,7 +24,9 @@ dependencies { implementation(libs.androidx.datastore.preferences) implementation(projects.appconfig) implementation(projects.libraries.di) + implementation(projects.libraries.androidutils) implementation(projects.libraries.core) + implementation(projects.libraries.preferences.api) implementation(libs.coroutines.core) testImplementation(libs.test.junit) testImplementation(libs.coroutines.test) diff --git a/libraries/featureflag/impl/src/main/kotlin/io/element/android/libraries/featureflag/impl/PreferencesFeatureFlagProvider.kt b/libraries/featureflag/impl/src/main/kotlin/io/element/android/libraries/featureflag/impl/PreferencesFeatureFlagProvider.kt index 0c1f1a45e8..357bf3c548 100644 --- a/libraries/featureflag/impl/src/main/kotlin/io/element/android/libraries/featureflag/impl/PreferencesFeatureFlagProvider.kt +++ b/libraries/featureflag/impl/src/main/kotlin/io/element/android/libraries/featureflag/impl/PreferencesFeatureFlagProvider.kt @@ -7,30 +7,24 @@ package io.element.android.libraries.featureflag.impl -import android.content.Context -import androidx.datastore.core.DataStore -import androidx.datastore.preferences.core.Preferences import androidx.datastore.preferences.core.booleanPreferencesKey import androidx.datastore.preferences.core.edit -import androidx.datastore.preferences.preferencesDataStore import io.element.android.libraries.core.meta.BuildMeta -import io.element.android.libraries.di.ApplicationContext import io.element.android.libraries.featureflag.api.Feature +import io.element.android.libraries.preferences.api.store.PreferenceDataStoreFactory import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.distinctUntilChanged import kotlinx.coroutines.flow.map import javax.inject.Inject -private val Context.dataStore: DataStore by preferencesDataStore(name = "elementx_featureflag") - /** * Note: this will be used only in the nightly and in the debug build. */ class PreferencesFeatureFlagProvider @Inject constructor( - @ApplicationContext context: Context, private val buildMeta: BuildMeta, + preferenceDataStoreFactory: PreferenceDataStoreFactory, ) : MutableFeatureFlagProvider { - private val store = context.dataStore + private val store = preferenceDataStoreFactory.create("elementx_featureflag") override val priority = MEDIUM_PRIORITY diff --git a/libraries/featureflag/ui/build.gradle.kts b/libraries/featureflag/ui/build.gradle.kts index 9d53b5fe07..32fd4f6eab 100644 --- a/libraries/featureflag/ui/build.gradle.kts +++ b/libraries/featureflag/ui/build.gradle.kts @@ -1,5 +1,3 @@ -import extension.setupAnvil - /* * Copyright 2023, 2024 New Vector Ltd. * @@ -16,8 +14,6 @@ android { namespace = "io.element.android.libraries.featureflag.ui" } -setupAnvil() - dependencies { implementation(projects.libraries.designsystem) } diff --git a/libraries/fullscreenintent/impl/src/main/kotlin/io/element/android/libraries/fullscreenintent/impl/FullScreenIntentPermissionsPresenter.kt b/libraries/fullscreenintent/impl/src/main/kotlin/io/element/android/libraries/fullscreenintent/impl/FullScreenIntentPermissionsPresenter.kt index 14cc438f41..ca9810c41d 100644 --- a/libraries/fullscreenintent/impl/src/main/kotlin/io/element/android/libraries/fullscreenintent/impl/FullScreenIntentPermissionsPresenter.kt +++ b/libraries/fullscreenintent/impl/src/main/kotlin/io/element/android/libraries/fullscreenintent/impl/FullScreenIntentPermissionsPresenter.kt @@ -21,8 +21,6 @@ import androidx.datastore.preferences.core.booleanPreferencesKey import androidx.datastore.preferences.core.edit import io.element.android.libraries.architecture.Presenter import io.element.android.libraries.core.meta.BuildMeta -import io.element.android.libraries.di.AppScope -import io.element.android.libraries.di.SingleIn import io.element.android.libraries.fullscreenintent.api.FullScreenIntentPermissionsEvents import io.element.android.libraries.fullscreenintent.api.FullScreenIntentPermissionsState import io.element.android.libraries.preferences.api.store.PreferenceDataStoreFactory @@ -32,7 +30,6 @@ import kotlinx.coroutines.flow.map import kotlinx.coroutines.launch import javax.inject.Inject -@SingleIn(AppScope::class) class FullScreenIntentPermissionsPresenter @Inject constructor( private val buildVersionSdkIntProvider: BuildVersionSdkIntProvider, private val externalIntentLauncher: ExternalIntentLauncher, diff --git a/libraries/matrix/api/build.gradle.kts b/libraries/matrix/api/build.gradle.kts index 9cd7e6ac7f..09f22f97cf 100644 --- a/libraries/matrix/api/build.gradle.kts +++ b/libraries/matrix/api/build.gradle.kts @@ -1,6 +1,5 @@ import config.BuildTimeConfig import extension.buildConfigFieldStr -import extension.setupAnvil /* * Copyright 2022-2024 New Vector Ltd. @@ -42,8 +41,6 @@ android { } } -setupAnvil() - dependencies { implementation(projects.libraries.di) implementation(libs.dagger) diff --git a/libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/MatrixClient.kt b/libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/MatrixClient.kt index e8c346cf9e..3c0f95745e 100644 --- a/libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/MatrixClient.kt +++ b/libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/MatrixClient.kt @@ -10,7 +10,6 @@ package io.element.android.libraries.matrix.api import io.element.android.libraries.core.data.tryOrNull import io.element.android.libraries.matrix.api.core.DeviceId import io.element.android.libraries.matrix.api.core.MatrixPatterns -import io.element.android.libraries.matrix.api.core.ProgressCallback import io.element.android.libraries.matrix.api.core.RoomAlias import io.element.android.libraries.matrix.api.core.RoomId import io.element.android.libraries.matrix.api.core.RoomIdOrAlias @@ -54,6 +53,7 @@ interface MatrixClient { suspend fun getJoinedRoom(roomId: RoomId): JoinedRoom? suspend fun getRoom(roomId: RoomId): BaseRoom? suspend fun findDM(userId: UserId): Result + suspend fun getJoinedRoomIds(): Result> suspend fun ignoreUser(userId: UserId): Result suspend fun unignoreUser(userId: UserId): Result suspend fun createRoom(createRoomParams: CreateRoomParameters): Result @@ -94,7 +94,7 @@ interface MatrixClient { */ suspend fun getUserProfile(): Result suspend fun getAccountManagementUrl(action: AccountManagementAction?): Result - suspend fun uploadMedia(mimeType: String, data: ByteArray, progressCallback: ProgressCallback?): Result + suspend fun uploadMedia(mimeType: String, data: ByteArray): Result fun roomMembershipObserver(): RoomMembershipObserver /** diff --git a/libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/core/EventId.kt b/libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/core/EventId.kt index 3dc5801d6b..08a9c2eeaa 100644 --- a/libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/core/EventId.kt +++ b/libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/core/EventId.kt @@ -20,3 +20,5 @@ value class EventId(val value: String) : Serializable { override fun toString(): String = value } + +fun EventId.toThreadId(): ThreadId = ThreadId(value) diff --git a/libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/room/CreateTimelineParams.kt b/libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/room/CreateTimelineParams.kt index 0bcfb0bf54..7d7b3a379a 100644 --- a/libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/room/CreateTimelineParams.kt +++ b/libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/room/CreateTimelineParams.kt @@ -8,10 +8,12 @@ package io.element.android.libraries.matrix.api.room import io.element.android.libraries.matrix.api.core.EventId +import io.element.android.libraries.matrix.api.core.ThreadId sealed interface CreateTimelineParams { data class Focused(val focusedEventId: EventId) : CreateTimelineParams data object MediaOnly : CreateTimelineParams data class MediaOnlyFocused(val focusedEventId: EventId) : CreateTimelineParams data object PinnedOnly : CreateTimelineParams + data class Threaded(val threadRootEventId: ThreadId) : CreateTimelineParams } diff --git a/libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/room/FilterRoomMembers.kt b/libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/room/FilterRoomMembers.kt new file mode 100644 index 0000000000..a1c4f0bf01 --- /dev/null +++ b/libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/room/FilterRoomMembers.kt @@ -0,0 +1,32 @@ +/* + * Copyright 2025 New Vector Ltd. + * + * SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial + * Please see LICENSE files in the repository root for full details. + */ + +package io.element.android.libraries.matrix.api.room + +import io.element.android.libraries.core.bool.orFalse +import kotlinx.coroutines.withContext +import kotlin.coroutines.CoroutineContext + +/** + * Method to filter members by userId or displayName. + * It does filter through the already known members, it doesn't perform additional requests. + */ +suspend fun BaseRoom.filterMembers(query: String, coroutineContext: CoroutineContext): List = withContext(coroutineContext) { + val roomMembersState = membersStateFlow.value + val activeRoomMembers = roomMembersState.roomMembers() + ?.filter { it.membership.isActive() } + .orEmpty() + val filteredMembers = if (query.isBlank()) { + activeRoomMembers + } else { + activeRoomMembers.filter { member -> + member.userId.value.contains(query, ignoreCase = true) || + member.displayName?.contains(query, ignoreCase = true).orFalse() + } + } + filteredMembers +} diff --git a/libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/room/RoomMembersState.kt b/libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/room/RoomMembersState.kt index ab857e5d63..c83b74ac70 100644 --- a/libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/room/RoomMembersState.kt +++ b/libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/room/RoomMembersState.kt @@ -8,6 +8,7 @@ package io.element.android.libraries.matrix.api.room import androidx.compose.runtime.Immutable +import io.element.android.libraries.matrix.api.core.SessionId import kotlinx.collections.immutable.ImmutableList @Immutable @@ -34,3 +35,9 @@ fun RoomMembersState.joinedRoomMembers(): List { fun RoomMembersState.activeRoomMembers(): List { return roomMembers().orEmpty().filter { it.membership.isActive() } } + +fun RoomMembersState.getDirectRoomMember(roomInfo: RoomInfo, sessionId: SessionId): RoomMember? { + return roomMembers() + ?.takeIf { roomInfo.isDm } + ?.find { it.userId != sessionId && it.membership.isActive() } +} diff --git a/libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/room/join/AllowRule.kt b/libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/room/join/AllowRule.kt index 6fe33d242a..4dfc3ac565 100644 --- a/libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/room/join/AllowRule.kt +++ b/libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/room/join/AllowRule.kt @@ -7,8 +7,10 @@ package io.element.android.libraries.matrix.api.room.join +import androidx.compose.runtime.Immutable import io.element.android.libraries.matrix.api.core.RoomId +@Immutable sealed interface AllowRule { data class RoomMembership(val roomId: RoomId) : AllowRule data class Custom(val json: String) : AllowRule diff --git a/libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/room/join/JoinRule.kt b/libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/room/join/JoinRule.kt index f733cb56ac..0eada82e29 100644 --- a/libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/room/join/JoinRule.kt +++ b/libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/room/join/JoinRule.kt @@ -7,12 +7,16 @@ package io.element.android.libraries.matrix.api.room.join +import androidx.compose.runtime.Immutable +import kotlinx.collections.immutable.ImmutableList + +@Immutable sealed interface JoinRule { data object Public : JoinRule data object Private : JoinRule data object Knock : JoinRule data object Invite : JoinRule - data class Restricted(val rules: List) : JoinRule - data class KnockRestricted(val rules: List) : JoinRule + data class Restricted(val rules: ImmutableList) : JoinRule + data class KnockRestricted(val rules: ImmutableList) : JoinRule data class Custom(val value: String) : JoinRule } 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 9bcdafb913..4eceeac4da 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 @@ -7,9 +7,10 @@ package io.element.android.libraries.matrix.api.timeline +import android.os.Parcelable import io.element.android.libraries.matrix.api.core.EventId -import io.element.android.libraries.matrix.api.core.ProgressCallback import io.element.android.libraries.matrix.api.core.RoomId +import io.element.android.libraries.matrix.api.core.ThreadId import io.element.android.libraries.matrix.api.core.TransactionId import io.element.android.libraries.matrix.api.media.AudioInfo import io.element.android.libraries.matrix.api.media.FileInfo @@ -24,6 +25,7 @@ import io.element.android.libraries.matrix.api.timeline.item.event.InReplyTo import io.element.android.libraries.matrix.api.timeline.item.event.toEventOrTransactionId import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.StateFlow +import kotlinx.parcelize.Parcelize import java.io.File interface Timeline : AutoCloseable { @@ -39,13 +41,16 @@ interface Timeline : AutoCloseable { FORWARDS } - enum class Mode { - LIVE, - FOCUSED_ON_EVENT, - PINNED_EVENTS, - MEDIA, + @Parcelize + sealed interface Mode : Parcelable { + data object Live : Mode + data class FocusedOnEvent(val eventId: EventId) : Mode + data object PinnedEvents : Mode + data object Media : Mode + data class Thread(val threadRootId: ThreadId) : Mode } + val mode: Mode val membershipChangeEventReceived: Flow suspend fun sendReadReceipt(eventId: EventId, receiptType: ReceiptType): Result suspend fun paginate(direction: PaginationDirection): Result @@ -88,7 +93,6 @@ interface Timeline : AutoCloseable { imageInfo: ImageInfo, caption: String?, formattedCaption: String?, - progressCallback: ProgressCallback?, inReplyToEventId: EventId?, ): Result @@ -98,7 +102,6 @@ interface Timeline : AutoCloseable { videoInfo: VideoInfo, caption: String?, formattedCaption: String?, - progressCallback: ProgressCallback?, inReplyToEventId: EventId?, ): Result @@ -107,7 +110,6 @@ interface Timeline : AutoCloseable { audioInfo: AudioInfo, caption: String?, formattedCaption: String?, - progressCallback: ProgressCallback?, inReplyToEventId: EventId?, ): Result @@ -116,7 +118,6 @@ interface Timeline : AutoCloseable { fileInfo: FileInfo, caption: String?, formattedCaption: String?, - progressCallback: ProgressCallback?, inReplyToEventId: EventId?, ): Result @@ -145,7 +146,6 @@ interface Timeline : AutoCloseable { file: File, audioInfo: AudioInfo, waveform: List, - progressCallback: ProgressCallback?, inReplyToEventId: EventId?, ): Result diff --git a/libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/timeline/item/ThreadSummary.kt b/libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/timeline/item/ThreadSummary.kt new file mode 100644 index 0000000000..4960330448 --- /dev/null +++ b/libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/timeline/item/ThreadSummary.kt @@ -0,0 +1,33 @@ +/* + * Copyright 2025 New Vector Ltd. + * + * SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial + * Please see LICENSE files in the repository root for full details. + */ + +package io.element.android.libraries.matrix.api.timeline.item + +import io.element.android.libraries.architecture.AsyncData +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.timeline.item.event.EventContent +import io.element.android.libraries.matrix.api.timeline.item.event.EventOrTransactionId +import io.element.android.libraries.matrix.api.timeline.item.event.ProfileTimelineDetails + +data class EventThreadInfo( + val threadRootId: ThreadId?, + val threadSummary: ThreadSummary?, +) + +data class ThreadSummary( + val latestEvent: AsyncData, + val numberOfReplies: Long, +) + +data class EmbeddedEventInfo( + val eventOrTransactionId: EventOrTransactionId, + val content: EventContent, + val senderId: UserId, + val senderProfile: ProfileTimelineDetails, + val timestamp: Long, +) 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 bf062b76e0..a6bea83565 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 @@ -13,6 +13,7 @@ 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 io.element.android.libraries.matrix.api.timeline.item.EventThreadInfo import kotlinx.collections.immutable.ImmutableList import kotlinx.collections.immutable.ImmutableMap @@ -23,7 +24,7 @@ data class MessageContent( val body: String, val inReplyTo: InReplyTo?, val isEdited: Boolean, - val isThreaded: Boolean, + val threadInfo: EventThreadInfo, val type: MessageType ) : EventContent diff --git a/libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/timeline/item/event/EventTimelineItem.kt b/libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/timeline/item/event/EventTimelineItem.kt index 0438df4032..fc08c1cee1 100644 --- a/libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/timeline/item/event/EventTimelineItem.kt +++ b/libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/timeline/item/event/EventTimelineItem.kt @@ -11,6 +11,7 @@ import io.element.android.libraries.matrix.api.core.EventId import io.element.android.libraries.matrix.api.core.SendHandle import io.element.android.libraries.matrix.api.core.TransactionId import io.element.android.libraries.matrix.api.core.UserId +import io.element.android.libraries.matrix.api.timeline.item.EventThreadInfo import io.element.android.libraries.matrix.api.timeline.item.TimelineItemDebugInfo import kotlinx.collections.immutable.ImmutableList @@ -37,9 +38,7 @@ data class EventTimelineItem( return (content as? MessageContent)?.inReplyTo } - fun isThreaded(): Boolean { - return (content as? MessageContent)?.isThreaded ?: false - } + fun threadInfo(): EventThreadInfo? = (content as? MessageContent)?.threadInfo fun hasNotLoadedInReplyTo(): Boolean { val details = inReplyTo() diff --git a/libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/timeline/item/event/LocalEventSendState.kt b/libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/timeline/item/event/LocalEventSendState.kt index d43ec0b8ce..f28ef46c66 100644 --- a/libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/timeline/item/event/LocalEventSendState.kt +++ b/libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/timeline/item/event/LocalEventSendState.kt @@ -14,7 +14,14 @@ import io.element.android.libraries.matrix.api.core.UserId @Immutable sealed interface LocalEventSendState { - data object Sending : LocalEventSendState + sealed interface Sending : LocalEventSendState { + data object Event : Sending + data class MediaWithProgress( + val index: Long, + val progress: Long, + val total: Long + ) : Sending + } sealed interface Failed : LocalEventSendState { data class Unknown(val error: String) : Failed data object SendingFromUnverifiedDevice : Failed diff --git a/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/RustMatrixClient.kt b/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/RustMatrixClient.kt index bb5ff45e15..85c1dde7e2 100644 --- a/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/RustMatrixClient.kt +++ b/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/RustMatrixClient.kt @@ -14,9 +14,9 @@ import io.element.android.libraries.core.coroutine.childScope import io.element.android.libraries.core.data.tryOrNull import io.element.android.libraries.core.extensions.mapFailure import io.element.android.libraries.core.extensions.runCatchingExceptions +import io.element.android.libraries.featureflag.api.FeatureFlagService import io.element.android.libraries.matrix.api.MatrixClient import io.element.android.libraries.matrix.api.core.DeviceId -import io.element.android.libraries.matrix.api.core.ProgressCallback import io.element.android.libraries.matrix.api.core.RoomAlias import io.element.android.libraries.matrix.api.core.RoomId import io.element.android.libraries.matrix.api.core.RoomIdOrAlias @@ -48,7 +48,6 @@ import io.element.android.libraries.matrix.api.sync.SyncState import io.element.android.libraries.matrix.api.user.MatrixSearchUserResults import io.element.android.libraries.matrix.api.user.MatrixUser import io.element.android.libraries.matrix.api.verification.SessionVerificationService -import io.element.android.libraries.matrix.impl.core.toProgressWatcher import io.element.android.libraries.matrix.impl.encryption.RustEncryptionService import io.element.android.libraries.matrix.impl.exception.mapClientException import io.element.android.libraries.matrix.impl.media.RustMediaLoader @@ -108,6 +107,7 @@ import org.matrix.rustcomponents.sdk.AuthDataPasswordDetails import org.matrix.rustcomponents.sdk.Client import org.matrix.rustcomponents.sdk.ClientException import org.matrix.rustcomponents.sdk.IgnoredUsersListener +import org.matrix.rustcomponents.sdk.Membership import org.matrix.rustcomponents.sdk.NotificationProcessSetup import org.matrix.rustcomponents.sdk.PowerLevels import org.matrix.rustcomponents.sdk.RoomInfoListener @@ -135,6 +135,7 @@ class RustMatrixClient( baseCacheDirectory: File, clock: SystemClock, timelineEventTypeFilterFactory: TimelineEventTypeFilterFactory, + private val featureFlagService: FeatureFlagService, ) : MatrixClient { override val sessionId: UserId = UserId(innerClient.userId()) override val deviceId: DeviceId = DeviceId(innerClient.deviceId()) @@ -205,6 +206,7 @@ class RustMatrixClient( timelineEventTypeFilterFactory = timelineEventTypeFilterFactory, roomMembershipObserver = roomMembershipObserver, roomInfoMapper = roomInfoMapper, + featureFlagService = featureFlagService, ) override val mediaLoader: MatrixMediaLoader = RustMediaLoader( @@ -276,6 +278,7 @@ class RustMatrixClient( } override suspend fun getRoom(roomId: RoomId): BaseRoom? = withContext(sessionDispatcher) { + innerClient.rooms() roomFactory.getBaseRoom(roomId) } @@ -310,6 +313,15 @@ class RustMatrixClient( } } + override suspend fun getJoinedRoomIds(): Result> = withContext(sessionDispatcher) { + runCatchingExceptions { + innerClient.rooms() + .filter { it.membership() == Membership.JOINED } + .map { RoomId(it.id()) } + .toSet() + } + } + override suspend fun ignoreUser(userId: UserId): Result = withContext(sessionDispatcher) { runCatchingExceptions { innerClient.ignoreUser(userId.value) @@ -627,9 +639,9 @@ class RustMatrixClient( } } - override suspend fun uploadMedia(mimeType: String, data: ByteArray, progressCallback: ProgressCallback?): Result = withContext(sessionDispatcher) { + override suspend fun uploadMedia(mimeType: String, data: ByteArray): Result = withContext(sessionDispatcher) { runCatchingExceptions { - innerClient.uploadMedia(mimeType, data, progressCallback?.toProgressWatcher()) + innerClient.uploadMedia(mimeType, data, progressWatcher = null) } } diff --git a/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/RustMatrixClientFactory.kt b/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/RustMatrixClientFactory.kt index 2a4abe6dc2..08ef1a9f4b 100644 --- a/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/RustMatrixClientFactory.kt +++ b/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/RustMatrixClientFactory.kt @@ -93,6 +93,7 @@ class RustMatrixClientFactory @Inject constructor( baseCacheDirectory = cacheDirectory, clock = clock, timelineEventTypeFilterFactory = timelineEventTypeFilterFactory, + featureFlagService = featureFlagService, ).also { Timber.tag(it.toString()).d("Creating Client with access token '$anonymizedAccessToken' and refresh token '$anonymizedRefreshToken'") } @@ -131,6 +132,7 @@ class RustMatrixClientFactory @Inject constructor( ) ) .enableShareHistoryOnInvite(featureFlagService.isFeatureEnabled(FeatureFlags.EnableKeyShareOnInvite)) + .threadsEnabled(featureFlagService.isFeatureEnabled(FeatureFlags.Threads), threadSubscriptions = false) .run { // Apply sliding sync version settings when (slidingSyncType) { diff --git a/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/room/JoinedRustRoom.kt b/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/room/JoinedRustRoom.kt index 5edff19d84..baa9f85906 100644 --- a/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/room/JoinedRustRoom.kt +++ b/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/room/JoinedRustRoom.kt @@ -11,6 +11,8 @@ import io.element.android.libraries.core.coroutine.CoroutineDispatchers import io.element.android.libraries.core.coroutine.childScope import io.element.android.libraries.core.extensions.mapFailure import io.element.android.libraries.core.extensions.runCatchingExceptions +import io.element.android.libraries.featureflag.api.FeatureFlagService +import io.element.android.libraries.featureflag.api.FeatureFlags import io.element.android.libraries.matrix.api.core.DeviceId import io.element.android.libraries.matrix.api.core.EventId import io.element.android.libraries.matrix.api.core.RoomAlias @@ -83,6 +85,7 @@ class JoinedRustRoom( private val coroutineDispatchers: CoroutineDispatchers, private val systemClock: SystemClock, private val roomContentForwarder: RoomContentForwarder, + private val featureFlagService: FeatureFlagService, ) : JoinedRoom, BaseRoom by baseRoom { // Create a dispatcher for all room methods... private val roomDispatcher = coroutineDispatchers.io.limitedParallelism(32) @@ -132,7 +135,7 @@ class JoinedRustRoom( override val roomNotificationSettingsStateFlow = MutableStateFlow(RoomNotificationSettingsState.Unknown) - override val liveTimeline = liveInnerTimeline.map(mode = Timeline.Mode.LIVE) { + override val liveTimeline = liveInnerTimeline.map(mode = Timeline.Mode.Live) { syncUpdateFlow.value = systemClock.epochMillis() } @@ -153,22 +156,27 @@ class JoinedRustRoom( override suspend fun createTimeline( createTimelineParams: CreateTimelineParams, ): Result = withContext(roomDispatcher) { + val hideThreadedEvents = featureFlagService.isFeatureEnabled(FeatureFlags.Threads) val focus = when (createTimelineParams) { is CreateTimelineParams.PinnedOnly -> TimelineFocus.PinnedEvents( maxEventsToLoad = 100u, maxConcurrentRequests = 10u, ) - is CreateTimelineParams.MediaOnly -> TimelineFocus.Live(hideThreadedEvents = false) + is CreateTimelineParams.MediaOnly -> TimelineFocus.Live(hideThreadedEvents = hideThreadedEvents) is CreateTimelineParams.Focused -> TimelineFocus.Event( eventId = createTimelineParams.focusedEventId.value, numContextEvents = 50u, - hideThreadedEvents = false, + hideThreadedEvents = hideThreadedEvents, ) is CreateTimelineParams.MediaOnlyFocused -> TimelineFocus.Event( eventId = createTimelineParams.focusedEventId.value, numContextEvents = 50u, + // Never hide threaded events in media focused timeline hideThreadedEvents = false, ) + is CreateTimelineParams.Threaded -> TimelineFocus.Thread( + rootEventId = createTimelineParams.threadRootEventId.value, + ) } val filter = when (createTimelineParams) { @@ -182,7 +190,8 @@ class JoinedRustRoom( ) ) is CreateTimelineParams.Focused, - CreateTimelineParams.PinnedOnly -> TimelineFilter.All + CreateTimelineParams.PinnedOnly, + is CreateTimelineParams.Threaded -> TimelineFilter.All } val internalIdPrefix = when (createTimelineParams) { @@ -190,6 +199,7 @@ class JoinedRustRoom( is CreateTimelineParams.Focused -> "focus_${createTimelineParams.focusedEventId}" is CreateTimelineParams.MediaOnly -> "MediaGallery_" is CreateTimelineParams.MediaOnlyFocused -> "MediaGallery_${createTimelineParams.focusedEventId}" + is CreateTimelineParams.Threaded -> "Thread_${createTimelineParams.threadRootEventId}" } // Note that for TimelineFilter.MediaOnlyFocused, the date separator will be filtered out, @@ -198,7 +208,8 @@ class JoinedRustRoom( is CreateTimelineParams.MediaOnly, is CreateTimelineParams.MediaOnlyFocused -> DateDividerMode.MONTHLY is CreateTimelineParams.Focused, - CreateTimelineParams.PinnedOnly -> DateDividerMode.DAILY + CreateTimelineParams.PinnedOnly, + is CreateTimelineParams.Threaded -> DateDividerMode.DAILY } // Track read receipts only for focused timeline for performance optimization @@ -216,17 +227,19 @@ class JoinedRustRoom( ) ).let { innerTimeline -> val mode = when (createTimelineParams) { - is CreateTimelineParams.Focused -> Timeline.Mode.FOCUSED_ON_EVENT - is CreateTimelineParams.MediaOnly -> Timeline.Mode.MEDIA - is CreateTimelineParams.MediaOnlyFocused -> Timeline.Mode.FOCUSED_ON_EVENT - CreateTimelineParams.PinnedOnly -> Timeline.Mode.PINNED_EVENTS + is CreateTimelineParams.Focused -> Timeline.Mode.FocusedOnEvent(createTimelineParams.focusedEventId) + is CreateTimelineParams.MediaOnly -> Timeline.Mode.Media + is CreateTimelineParams.MediaOnlyFocused -> Timeline.Mode.FocusedOnEvent(createTimelineParams.focusedEventId) + CreateTimelineParams.PinnedOnly -> Timeline.Mode.PinnedEvents + is CreateTimelineParams.Threaded -> Timeline.Mode.Thread(createTimelineParams.threadRootEventId) } innerTimeline.map(mode = mode) } }.mapFailure { when (createTimelineParams) { is CreateTimelineParams.Focused, - is CreateTimelineParams.MediaOnlyFocused -> it.toFocusEventException() + is CreateTimelineParams.MediaOnlyFocused, + is CreateTimelineParams.Threaded -> it.toFocusEventException() CreateTimelineParams.MediaOnly, CreateTimelineParams.PinnedOnly -> it } diff --git a/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/room/RustRoomFactory.kt b/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/room/RustRoomFactory.kt index e53ac5c478..ee9e7bfe52 100644 --- a/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/room/RustRoomFactory.kt +++ b/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/room/RustRoomFactory.kt @@ -9,6 +9,8 @@ package io.element.android.libraries.matrix.impl.room import io.element.android.appconfig.TimelineConfig import io.element.android.libraries.core.coroutine.CoroutineDispatchers +import io.element.android.libraries.featureflag.api.FeatureFlagService +import io.element.android.libraries.featureflag.api.FeatureFlags import io.element.android.libraries.matrix.api.core.DeviceId import io.element.android.libraries.matrix.api.core.RoomId import io.element.android.libraries.matrix.api.core.SessionId @@ -48,6 +50,7 @@ class RustRoomFactory( private val innerRoomListService: InnerRoomListService, private val roomSyncSubscriber: RoomSyncSubscriber, private val timelineEventTypeFilterFactory: TimelineEventTypeFilterFactory, + private val featureFlagService: FeatureFlagService, private val roomMembershipObserver: RoomMembershipObserver, private val roomInfoMapper: RoomInfoMapper, ) { @@ -105,10 +108,11 @@ class RustRoomFactory( val sdkRoom = awaitRoomInRoomList(roomId) ?: return@withContext null if (sdkRoom.membership() == Membership.JOINED) { + val hideThreadedEvents = featureFlagService.isFeatureEnabled(FeatureFlags.Threads) // Init the live timeline in the SDK from the Room val timeline = sdkRoom.timelineWithConfiguration( TimelineConfiguration( - focus = TimelineFocus.Live(hideThreadedEvents = false), + focus = TimelineFocus.Live(hideThreadedEvents = hideThreadedEvents), filter = eventFilters?.let(TimelineFilter::EventTypeFilter) ?: TimelineFilter.All, internalIdPrefix = "live", dateDividerMode = DateDividerMode.DAILY, @@ -125,6 +129,7 @@ class RustRoomFactory( liveInnerTimeline = timeline, coroutineDispatchers = dispatchers, systemClock = systemClock, + featureFlagService = featureFlagService, ) ) } else { diff --git a/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/room/join/JoinRule.kt b/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/room/join/JoinRule.kt index bc10a369a4..51422787e2 100644 --- a/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/room/join/JoinRule.kt +++ b/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/room/join/JoinRule.kt @@ -8,6 +8,7 @@ package io.element.android.libraries.matrix.impl.room.join import io.element.android.libraries.matrix.api.room.join.JoinRule +import kotlinx.collections.immutable.toPersistentList import org.matrix.rustcomponents.sdk.JoinRule as RustJoinRule fun RustJoinRule.map(): JoinRule { @@ -16,9 +17,9 @@ fun RustJoinRule.map(): JoinRule { RustJoinRule.Private -> JoinRule.Private RustJoinRule.Knock -> JoinRule.Knock RustJoinRule.Invite -> JoinRule.Invite - is RustJoinRule.Restricted -> JoinRule.Restricted(rules.map { it.map() }) + is RustJoinRule.Restricted -> JoinRule.Restricted(rules.map { it.map() }.toPersistentList()) is RustJoinRule.Custom -> JoinRule.Custom(repr) - is RustJoinRule.KnockRestricted -> JoinRule.KnockRestricted(rules.map { it.map() }) + is RustJoinRule.KnockRestricted -> JoinRule.KnockRestricted(rules.map { it.map() }.toPersistentList()) } } 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 b1540d353d..97d9ef68c1 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 @@ -7,9 +7,9 @@ package io.element.android.libraries.matrix.impl.timeline +import io.element.android.libraries.androidutils.hash.hash import io.element.android.libraries.core.extensions.runCatchingExceptions import io.element.android.libraries.matrix.api.core.EventId -import io.element.android.libraries.matrix.api.core.ProgressCallback import io.element.android.libraries.matrix.api.core.RoomId import io.element.android.libraries.matrix.api.media.AudioInfo import io.element.android.libraries.matrix.api.media.FileInfo @@ -27,7 +27,6 @@ import io.element.android.libraries.matrix.api.timeline.Timeline import io.element.android.libraries.matrix.api.timeline.TimelineException import io.element.android.libraries.matrix.api.timeline.item.event.EventOrTransactionId import io.element.android.libraries.matrix.api.timeline.item.event.InReplyTo -import io.element.android.libraries.matrix.impl.core.toProgressWatcher import io.element.android.libraries.matrix.impl.media.MediaUploadHandlerImpl import io.element.android.libraries.matrix.impl.media.map import io.element.android.libraries.matrix.impl.media.toMSC3246range @@ -81,7 +80,7 @@ private const val PAGINATION_SIZE = 50 class RustTimeline( private val inner: InnerTimeline, - mode: Timeline.Mode, + override val mode: Timeline.Mode, systemClock: SystemClock, private val joinedRoom: JoinedRoom, private val coroutineScope: CoroutineScope, @@ -120,19 +119,20 @@ class RustTimeline( private val typingNotificationPostProcessor = TypingNotificationPostProcessor(mode) override val backwardPaginationStatus = MutableStateFlow( - Timeline.PaginationStatus(isPaginating = false, hasMoreToLoad = mode != Timeline.Mode.PINNED_EVENTS) + Timeline.PaginationStatus(isPaginating = false, hasMoreToLoad = mode != Timeline.Mode.PinnedEvents) ) override val forwardPaginationStatus = MutableStateFlow( - Timeline.PaginationStatus(isPaginating = false, hasMoreToLoad = mode == Timeline.Mode.FOCUSED_ON_EVENT) + Timeline.PaginationStatus(isPaginating = false, hasMoreToLoad = mode !is Timeline.Mode.FocusedOnEvent) ) init { - if (mode != Timeline.Mode.PINNED_EVENTS) { - coroutineScope.fetchMembers() + when (mode) { + is Timeline.Mode.Live, is Timeline.Mode.FocusedOnEvent -> coroutineScope.fetchMembers() + else -> Unit } - if (mode == Timeline.Mode.LIVE) { + if (mode == Timeline.Mode.Live) { // When timeline is live, we need to listen to the back pagination status as // sdk can automatically paginate backwards. coroutineScope.registerBackPaginationStatusListener() @@ -221,6 +221,7 @@ class RustTimeline( items = items, hasMoreToLoadBackward = backwardPaginationStatus.hasMoreToLoad, hasMoreToLoadForward = forwardPaginationStatus.hasMoreToLoad, + timelineMode = mode, ) } .let { items -> @@ -336,9 +337,9 @@ class RustTimeline( imageInfo: ImageInfo, caption: String?, formattedCaption: String?, - progressCallback: ProgressCallback?, inReplyToEventId: EventId?, ): Result { + Timber.d("Sending image ${file.path.hash()}") return sendAttachment(listOfNotNull(file, thumbnailFile)) { inner.sendImage( params = UploadParameters( @@ -347,13 +348,11 @@ class RustTimeline( formattedCaption = formattedCaption?.let { FormattedBody(body = it, format = MessageFormat.Html) }, - useSendQueue = true, mentions = null, inReplyTo = inReplyToEventId?.value, ), - thumbnailPath = thumbnailFile?.path, + thumbnailSource = thumbnailFile?.path?.let(UploadSource::File), imageInfo = imageInfo.map(), - progressWatcher = progressCallback?.toProgressWatcher() ) } } @@ -364,9 +363,9 @@ class RustTimeline( videoInfo: VideoInfo, caption: String?, formattedCaption: String?, - progressCallback: ProgressCallback?, inReplyToEventId: EventId?, ): Result { + Timber.d("Sending video ${file.path.hash()}") return sendAttachment(listOfNotNull(file, thumbnailFile)) { inner.sendVideo( params = UploadParameters( @@ -375,13 +374,11 @@ class RustTimeline( formattedCaption = formattedCaption?.let { FormattedBody(body = it, format = MessageFormat.Html) }, - useSendQueue = true, mentions = null, inReplyTo = inReplyToEventId?.value, ), - thumbnailPath = thumbnailFile?.path, + thumbnailSource = thumbnailFile?.path?.let(UploadSource::File), videoInfo = videoInfo.map(), - progressWatcher = progressCallback?.toProgressWatcher() ) } } @@ -391,9 +388,9 @@ class RustTimeline( audioInfo: AudioInfo, caption: String?, formattedCaption: String?, - progressCallback: ProgressCallback?, inReplyToEventId: EventId?, ): Result { + Timber.d("Sending audio ${file.path.hash()}") return sendAttachment(listOf(file)) { inner.sendAudio( params = UploadParameters( @@ -402,12 +399,10 @@ class RustTimeline( formattedCaption = formattedCaption?.let { FormattedBody(body = it, format = MessageFormat.Html) }, - useSendQueue = true, mentions = null, inReplyTo = inReplyToEventId?.value, ), audioInfo = audioInfo.map(), - progressWatcher = progressCallback?.toProgressWatcher() ) } } @@ -417,9 +412,9 @@ class RustTimeline( fileInfo: FileInfo, caption: String?, formattedCaption: String?, - progressCallback: ProgressCallback?, inReplyToEventId: EventId?, ): Result { + Timber.d("Sending file ${file.path.hash()}") return sendAttachment(listOf(file)) { inner.sendFile( params = UploadParameters( @@ -428,12 +423,10 @@ class RustTimeline( formattedCaption = formattedCaption?.let { FormattedBody(body = it, format = MessageFormat.Html) }, - useSendQueue = true, mentions = null, inReplyTo = inReplyToEventId?.value, ), fileInfo = fileInfo.map(), - progressWatcher = progressCallback?.toProgressWatcher(), ) } } @@ -479,7 +472,6 @@ class RustTimeline( file: File, audioInfo: AudioInfo, waveform: List, - progressCallback: ProgressCallback?, inReplyToEventId: EventId?, ): Result { return sendAttachment(listOf(file)) { @@ -489,13 +481,11 @@ class RustTimeline( // Maybe allow a caption in the future? caption = null, formattedCaption = null, - useSendQueue = true, mentions = null, inReplyTo = inReplyToEventId?.value, ), audioInfo = audioInfo.map(), waveform = waveform.toMSC3246range(), - progressWatcher = progressCallback?.toProgressWatcher(), ) } } diff --git a/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/timeline/item/event/EventMessageMapper.kt b/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/timeline/item/event/EventMessageMapper.kt index d806c9492f..aa20ffd267 100644 --- a/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/timeline/item/event/EventMessageMapper.kt +++ b/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/timeline/item/event/EventMessageMapper.kt @@ -7,6 +7,7 @@ package io.element.android.libraries.matrix.impl.timeline.item.event +import io.element.android.libraries.matrix.api.timeline.item.EventThreadInfo 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.FileMessageType @@ -37,14 +38,14 @@ private const val MSG_TYPE_GALLERY_UNSTABLE = "dm.filament.gallery" class EventMessageMapper { private val inReplyToMapper by lazy { InReplyToMapper(TimelineEventContentMapper()) } - fun map(message: MsgLikeKind.Message, inReplyTo: InReplyToDetails?, isThreaded: Boolean): MessageContent = message.use { + fun map(message: MsgLikeKind.Message, inReplyTo: InReplyToDetails?, threadInfo: EventThreadInfo): MessageContent = message.use { val type = it.content.msgType.use(this::mapMessageType) val inReplyToEvent: InReplyTo? = inReplyTo?.use(inReplyToMapper::map) MessageContent( body = it.content.body, inReplyTo = inReplyToEvent, isEdited = it.content.isEdited, - isThreaded = isThreaded, + threadInfo = threadInfo, type = type ) } diff --git a/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/timeline/item/event/EventOrTransactionIdExtension.kt b/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/timeline/item/event/EventOrTransactionIdExtension.kt new file mode 100644 index 0000000000..d247bb72d0 --- /dev/null +++ b/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/timeline/item/event/EventOrTransactionIdExtension.kt @@ -0,0 +1,18 @@ +/* + * Copyright 2025 New Vector Ltd. + * + * SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial + * Please see LICENSE files in the repository root for full details. + */ + +package io.element.android.libraries.matrix.impl.timeline.item.event + +import io.element.android.libraries.matrix.api.core.EventId +import io.element.android.libraries.matrix.api.core.TransactionId +import io.element.android.libraries.matrix.api.timeline.item.event.EventOrTransactionId +import org.matrix.rustcomponents.sdk.EventOrTransactionId as RustEventOrTransactionId + +fun RustEventOrTransactionId.map(): EventOrTransactionId = when (this) { + is RustEventOrTransactionId.EventId -> EventOrTransactionId.Event(EventId(eventId)) + is RustEventOrTransactionId.TransactionId -> EventOrTransactionId.Transaction(TransactionId(transactionId)) +} diff --git a/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/timeline/item/event/EventTimelineItemMapper.kt b/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/timeline/item/event/EventTimelineItemMapper.kt index 7cea0e29f4..d923cd420c 100644 --- a/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/timeline/item/event/EventTimelineItemMapper.kt +++ b/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/timeline/item/event/EventTimelineItemMapper.kt @@ -79,7 +79,18 @@ fun RustProfileDetails.map(): ProfileTimelineDetails { fun RustEventSendState?.map(): LocalEventSendState? { return when (this) { null -> null - RustEventSendState.NotSentYet -> LocalEventSendState.Sending + is RustEventSendState.NotSentYet -> { + val mediaUploadProgress = this.progress + if (mediaUploadProgress != null) { + LocalEventSendState.Sending.MediaWithProgress( + index = mediaUploadProgress.index.toLong(), + progress = mediaUploadProgress.progress.current.toLong(), + total = mediaUploadProgress.progress.total.toLong(), + ) + } else { + LocalEventSendState.Sending.Event + } + } is RustEventSendState.SendingFailed -> { when (val queueWedgeError = error) { QueueWedgeError.CrossVerificationRequired -> { @@ -98,7 +109,7 @@ fun RustEventSendState?.map(): LocalEventSendState? { } is QueueWedgeError.GenericApiError -> { if (isRecoverable) { - LocalEventSendState.Sending + LocalEventSendState.Sending.Event } else { LocalEventSendState.Failed.Unknown(queueWedgeError.msg) } 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 a62f18ddd1..eeb063b28a 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 @@ -7,7 +7,12 @@ package io.element.android.libraries.matrix.impl.timeline.item.event +import io.element.android.libraries.architecture.AsyncData +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.timeline.item.EmbeddedEventInfo +import io.element.android.libraries.matrix.api.timeline.item.EventThreadInfo +import io.element.android.libraries.matrix.api.timeline.item.ThreadSummary 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 @@ -27,6 +32,7 @@ import io.element.android.libraries.matrix.impl.media.map import io.element.android.libraries.matrix.impl.poll.map import kotlinx.collections.immutable.toImmutableList import kotlinx.collections.immutable.toImmutableMap +import org.matrix.rustcomponents.sdk.EmbeddedEventDetails import org.matrix.rustcomponents.sdk.MsgLikeKind import org.matrix.rustcomponents.sdk.TimelineItemContent import org.matrix.rustcomponents.sdk.use @@ -59,8 +65,35 @@ class TimelineEventContentMapper( when (val kind = it.content.kind) { is MsgLikeKind.Message -> { val inReplyTo = it.content.inReplyTo - val isThreaded = it.content.threadRoot != null - eventMessageMapper.map(kind, inReplyTo, isThreaded) + val threadSummary = it.content.threadSummary?.use { summary -> + val numberOfReplies = summary.numReplies().toLong() + val latestEvent = summary.latestEvent() + val details = when (latestEvent) { + is EmbeddedEventDetails.Unavailable -> AsyncData.Uninitialized + is EmbeddedEventDetails.Pending -> AsyncData.Loading() + is EmbeddedEventDetails.Error -> AsyncData.Failure(IllegalStateException(latestEvent.message)) + is EmbeddedEventDetails.Ready -> { + AsyncData.Success( + EmbeddedEventInfo( + eventOrTransactionId = latestEvent.eventOrTransactionId.map(), + content = map(latestEvent.content), + senderId = UserId(latestEvent.sender), + senderProfile = latestEvent.senderProfile.map(), + timestamp = latestEvent.timestamp.toLong() + ) + ) + } + } + ThreadSummary( + latestEvent = details, + numberOfReplies = numberOfReplies, + ) + } + val threadInfo = EventThreadInfo( + threadRootId = it.content.threadRoot?.let(::ThreadId), + threadSummary = threadSummary, + ) + eventMessageMapper.map(kind, inReplyTo, threadInfo) } is MsgLikeKind.Redacted -> { RedactedContent diff --git a/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/timeline/postprocessor/LastForwardIndicatorsPostProcessor.kt b/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/timeline/postprocessor/LastForwardIndicatorsPostProcessor.kt index 9be7dddddb..c3e8237b72 100644 --- a/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/timeline/postprocessor/LastForwardIndicatorsPostProcessor.kt +++ b/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/timeline/postprocessor/LastForwardIndicatorsPostProcessor.kt @@ -24,7 +24,7 @@ class LastForwardIndicatorsPostProcessor( items: List, ): List { // We don't need to add the last forward indicator if we are not in the FOCUSED_ON_EVENT mode - if (mode != Timeline.Mode.FOCUSED_ON_EVENT) { + if (mode !is Timeline.Mode.FocusedOnEvent) { return items } else { return buildList { diff --git a/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/timeline/postprocessor/LoadingIndicatorsPostProcessor.kt b/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/timeline/postprocessor/LoadingIndicatorsPostProcessor.kt index 6d42af54b5..22b70b1d35 100644 --- a/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/timeline/postprocessor/LoadingIndicatorsPostProcessor.kt +++ b/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/timeline/postprocessor/LoadingIndicatorsPostProcessor.kt @@ -18,8 +18,9 @@ class LoadingIndicatorsPostProcessor(private val systemClock: SystemClock) { items: List, hasMoreToLoadBackward: Boolean, hasMoreToLoadForward: Boolean, + timelineMode: Timeline.Mode, ): List { - val shouldAddForwardLoadingIndicator = hasMoreToLoadForward && items.isNotEmpty() + val shouldAddForwardLoadingIndicator = timelineMode is Timeline.Mode.Live && hasMoreToLoadForward && items.isNotEmpty() val currentTimestamp = systemClock.epochMillis() return buildList { if (hasMoreToLoadBackward) { diff --git a/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/timeline/postprocessor/RoomBeginningPostProcessor.kt b/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/timeline/postprocessor/RoomBeginningPostProcessor.kt index 8403f63188..639f1b879f 100644 --- a/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/timeline/postprocessor/RoomBeginningPostProcessor.kt +++ b/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/timeline/postprocessor/RoomBeginningPostProcessor.kt @@ -28,7 +28,7 @@ class RoomBeginningPostProcessor(private val mode: Timeline.Mode) { ): List { return when { items.isEmpty() -> items - mode == Timeline.Mode.PINNED_EVENTS -> items + mode == Timeline.Mode.PinnedEvents -> items isDm -> processForDM(items, roomCreator) hasMoreToLoadBackwards -> items else -> processForRoom(items) diff --git a/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/timeline/postprocessor/TypingNotificationPostProcessor.kt b/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/timeline/postprocessor/TypingNotificationPostProcessor.kt index b244aa229c..4c888fa7f2 100644 --- a/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/timeline/postprocessor/TypingNotificationPostProcessor.kt +++ b/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/timeline/postprocessor/TypingNotificationPostProcessor.kt @@ -17,7 +17,7 @@ import io.element.android.libraries.matrix.api.timeline.item.virtual.VirtualTime */ class TypingNotificationPostProcessor(private val mode: Timeline.Mode) { fun process(items: List): List { - return if (mode == Timeline.Mode.LIVE) { + return if (mode is Timeline.Mode.Live) { buildList { addAll(items) add( diff --git a/libraries/matrix/impl/src/test/kotlin/io/element/android/libraries/matrix/impl/RustMatrixClientTest.kt b/libraries/matrix/impl/src/test/kotlin/io/element/android/libraries/matrix/impl/RustMatrixClientTest.kt index cb316452c5..91d0f06d1c 100644 --- a/libraries/matrix/impl/src/test/kotlin/io/element/android/libraries/matrix/impl/RustMatrixClientTest.kt +++ b/libraries/matrix/impl/src/test/kotlin/io/element/android/libraries/matrix/impl/RustMatrixClientTest.kt @@ -8,6 +8,7 @@ package io.element.android.libraries.matrix.impl import com.google.common.truth.Truth.assertThat +import io.element.android.libraries.featureflag.test.FakeFeatureFlagService import io.element.android.libraries.matrix.impl.fixtures.fakes.FakeFfiClient import io.element.android.libraries.matrix.impl.fixtures.fakes.FakeFfiSyncService import io.element.android.libraries.matrix.impl.room.FakeTimelineEventTypeFilterFactory @@ -66,5 +67,6 @@ class RustMatrixClientTest { baseCacheDirectory = File(""), clock = FakeSystemClock(), timelineEventTypeFilterFactory = FakeTimelineEventTypeFilterFactory(), + featureFlagService = FakeFeatureFlagService(), ) } diff --git a/libraries/matrix/impl/src/test/kotlin/io/element/android/libraries/matrix/impl/fixtures/fakes/FakeFfiClientBuilder.kt b/libraries/matrix/impl/src/test/kotlin/io/element/android/libraries/matrix/impl/fixtures/fakes/FakeFfiClientBuilder.kt index 911219cac3..6e0c73b350 100644 --- a/libraries/matrix/impl/src/test/kotlin/io/element/android/libraries/matrix/impl/fixtures/fakes/FakeFfiClientBuilder.kt +++ b/libraries/matrix/impl/src/test/kotlin/io/element/android/libraries/matrix/impl/fixtures/fakes/FakeFfiClientBuilder.kt @@ -39,6 +39,7 @@ class FakeFfiClientBuilder : ClientBuilder(NoPointer) { override fun userAgent(userAgent: String) = this override fun username(username: String) = this override fun enableShareHistoryOnInvite(enableShareHistoryOnInvite: Boolean): ClientBuilder = this + override fun threadsEnabled(enabled: Boolean, threadSubscriptions: Boolean): ClientBuilder = this override suspend fun build(): Client { return FakeFfiClient(withUtdHook = {}) diff --git a/libraries/matrix/impl/src/test/kotlin/io/element/android/libraries/matrix/impl/timeline/RustTimelineTest.kt b/libraries/matrix/impl/src/test/kotlin/io/element/android/libraries/matrix/impl/timeline/RustTimelineTest.kt index 2819dd6ac7..8bcd56978e 100644 --- a/libraries/matrix/impl/src/test/kotlin/io/element/android/libraries/matrix/impl/timeline/RustTimelineTest.kt +++ b/libraries/matrix/impl/src/test/kotlin/io/element/android/libraries/matrix/impl/timeline/RustTimelineTest.kt @@ -90,7 +90,7 @@ class RustTimelineTest { private fun TestScope.createRustTimeline( inner: InnerTimeline, - mode: Timeline.Mode = Timeline.Mode.LIVE, + mode: Timeline.Mode = Timeline.Mode.Live, systemClock: SystemClock = FakeSystemClock(), joinedRoom: JoinedRoom = FakeJoinedRoom().apply { givenRoomInfo(aRoomInfo()) }, coroutineScope: CoroutineScope = backgroundScope, diff --git a/libraries/matrix/impl/src/test/kotlin/io/element/android/libraries/matrix/impl/timeline/postprocessor/LastForwardIndicatorsPostProcessorTest.kt b/libraries/matrix/impl/src/test/kotlin/io/element/android/libraries/matrix/impl/timeline/postprocessor/LastForwardIndicatorsPostProcessorTest.kt index c5b1c3edb7..0d2dd743f5 100644 --- a/libraries/matrix/impl/src/test/kotlin/io/element/android/libraries/matrix/impl/timeline/postprocessor/LastForwardIndicatorsPostProcessorTest.kt +++ b/libraries/matrix/impl/src/test/kotlin/io/element/android/libraries/matrix/impl/timeline/postprocessor/LastForwardIndicatorsPostProcessorTest.kt @@ -12,19 +12,20 @@ import io.element.android.libraries.matrix.api.core.UniqueId import io.element.android.libraries.matrix.api.timeline.MatrixTimelineItem import io.element.android.libraries.matrix.api.timeline.Timeline import io.element.android.libraries.matrix.api.timeline.item.virtual.VirtualTimelineItem +import io.element.android.libraries.matrix.test.AN_EVENT_ID import org.junit.Test class LastForwardIndicatorsPostProcessorTest { @Test fun `LastForwardIndicatorsPostProcessor does not alter the items with mode not FOCUSED_ON_EVENT`() { - val sut = LastForwardIndicatorsPostProcessor(Timeline.Mode.LIVE) + val sut = LastForwardIndicatorsPostProcessor(Timeline.Mode.Live) val result = sut.process(listOf(messageEvent)) assertThat(result).containsExactly(messageEvent) } @Test fun `LastForwardIndicatorsPostProcessor add virtual items`() { - val sut = LastForwardIndicatorsPostProcessor(Timeline.Mode.FOCUSED_ON_EVENT) + val sut = LastForwardIndicatorsPostProcessor(Timeline.Mode.FocusedOnEvent(AN_EVENT_ID)) val result = sut.process(listOf(messageEvent)) assertThat(result).containsExactly( messageEvent, @@ -37,7 +38,7 @@ class LastForwardIndicatorsPostProcessorTest { @Test fun `LastForwardIndicatorsPostProcessor add virtual items on empty list`() { - val sut = LastForwardIndicatorsPostProcessor(Timeline.Mode.FOCUSED_ON_EVENT) + val sut = LastForwardIndicatorsPostProcessor(Timeline.Mode.FocusedOnEvent(AN_EVENT_ID)) val result = sut.process(listOf()) assertThat(result).containsExactly( MatrixTimelineItem.Virtual( @@ -49,7 +50,7 @@ class LastForwardIndicatorsPostProcessorTest { @Test fun `LastForwardIndicatorsPostProcessor add virtual items but does not alter the list if called a second time`() { - val sut = LastForwardIndicatorsPostProcessor(Timeline.Mode.FOCUSED_ON_EVENT) + val sut = LastForwardIndicatorsPostProcessor(Timeline.Mode.FocusedOnEvent(AN_EVENT_ID)) // Process a first time sut.process(listOf(messageEvent)) // Process a second time with the same Event @@ -65,7 +66,7 @@ class LastForwardIndicatorsPostProcessorTest { @Test fun `LastForwardIndicatorsPostProcessor add virtual items each time it is called with new Events`() { - val sut = LastForwardIndicatorsPostProcessor(Timeline.Mode.FOCUSED_ON_EVENT) + val sut = LastForwardIndicatorsPostProcessor(Timeline.Mode.FocusedOnEvent(AN_EVENT_ID)) // Process a first time sut.process(listOf(dayEvent, messageEvent)) // Process a second time with the same Event diff --git a/libraries/matrix/impl/src/test/kotlin/io/element/android/libraries/matrix/impl/timeline/postprocessor/LoadingIndicatorsPostProcessorTest.kt b/libraries/matrix/impl/src/test/kotlin/io/element/android/libraries/matrix/impl/timeline/postprocessor/LoadingIndicatorsPostProcessorTest.kt index 881d718392..c92fb9776b 100644 --- a/libraries/matrix/impl/src/test/kotlin/io/element/android/libraries/matrix/impl/timeline/postprocessor/LoadingIndicatorsPostProcessorTest.kt +++ b/libraries/matrix/impl/src/test/kotlin/io/element/android/libraries/matrix/impl/timeline/postprocessor/LoadingIndicatorsPostProcessorTest.kt @@ -24,6 +24,7 @@ class LoadingIndicatorsPostProcessorTest { items = listOf(messageEvent, messageEvent2), hasMoreToLoadBackward = true, hasMoreToLoadForward = false, + timelineMode = Timeline.Mode.Live, ) assertThat(result).containsExactly( MatrixTimelineItem.Virtual( @@ -46,6 +47,7 @@ class LoadingIndicatorsPostProcessorTest { items = listOf(messageEvent, messageEvent2), hasMoreToLoadBackward = false, hasMoreToLoadForward = true, + timelineMode = Timeline.Mode.Live, ) assertThat(result).containsExactly( messageEvent, @@ -68,6 +70,7 @@ class LoadingIndicatorsPostProcessorTest { items = listOf(messageEvent, messageEvent2), hasMoreToLoadBackward = true, hasMoreToLoadForward = true, + timelineMode = Timeline.Mode.Live, ) assertThat(result).containsExactly( MatrixTimelineItem.Virtual( @@ -97,6 +100,7 @@ class LoadingIndicatorsPostProcessorTest { items = listOf(), hasMoreToLoadBackward = true, hasMoreToLoadForward = true, + timelineMode = Timeline.Mode.Live, ) assertThat(result).containsExactly( MatrixTimelineItem.Virtual( diff --git a/libraries/matrix/impl/src/test/kotlin/io/element/android/libraries/matrix/impl/timeline/postprocessor/RoomBeginningPostProcessorTest.kt b/libraries/matrix/impl/src/test/kotlin/io/element/android/libraries/matrix/impl/timeline/postprocessor/RoomBeginningPostProcessorTest.kt index ba0bef4266..bfb3660fc6 100644 --- a/libraries/matrix/impl/src/test/kotlin/io/element/android/libraries/matrix/impl/timeline/postprocessor/RoomBeginningPostProcessorTest.kt +++ b/libraries/matrix/impl/src/test/kotlin/io/element/android/libraries/matrix/impl/timeline/postprocessor/RoomBeginningPostProcessorTest.kt @@ -15,7 +15,7 @@ import org.junit.Test class RoomBeginningPostProcessorTest { @Test fun `processor returns empty list when empty list is provided`() { - val processor = RoomBeginningPostProcessor(Timeline.Mode.LIVE) + val processor = RoomBeginningPostProcessor(Timeline.Mode.Live) val processedItems = processor.process( items = emptyList(), isDm = true, @@ -27,7 +27,7 @@ class RoomBeginningPostProcessorTest { @Test fun `processor returns the provided list when it only contains a message`() { - val processor = RoomBeginningPostProcessor(Timeline.Mode.LIVE) + val processor = RoomBeginningPostProcessor(Timeline.Mode.Live) val processedItems = processor.process( items = listOf(messageEvent), isDm = true, @@ -39,7 +39,7 @@ class RoomBeginningPostProcessorTest { @Test fun `processor returns the provided list when it only contains a message and the roomCreator is not provided`() { - val processor = RoomBeginningPostProcessor(Timeline.Mode.LIVE) + val processor = RoomBeginningPostProcessor(Timeline.Mode.Live) val processedItems = processor.process( items = listOf(messageEvent), isDm = true, @@ -56,7 +56,7 @@ class RoomBeginningPostProcessorTest { roomCreateEvent, roomCreatorJoinEvent, ) - val processor = RoomBeginningPostProcessor(Timeline.Mode.LIVE) + val processor = RoomBeginningPostProcessor(Timeline.Mode.Live) val processedItems = processor.process( items = timelineItems, isDm = true, @@ -72,7 +72,7 @@ class RoomBeginningPostProcessorTest { roomCreateEvent, roomCreatorJoinEvent, ) - val processor = RoomBeginningPostProcessor(Timeline.Mode.PINNED_EVENTS) + val processor = RoomBeginningPostProcessor(Timeline.Mode.PinnedEvents) val processedItems = processor.process( items = timelineItems, isDm = true, @@ -94,7 +94,7 @@ class RoomBeginningPostProcessorTest { otherMemberJoinEvent, messageEvent, ) - val processor = RoomBeginningPostProcessor(Timeline.Mode.LIVE) + val processor = RoomBeginningPostProcessor(Timeline.Mode.Live) val processedItems = processor.process(timelineItems, isDm = true, roomCreator = A_USER_ID, hasMoreToLoadBackwards = false) assertThat(processedItems).isEqualTo(expected) } @@ -105,7 +105,7 @@ class RoomBeginningPostProcessorTest { roomCreateEvent, roomCreatorJoinEvent, ) - val processor = RoomBeginningPostProcessor(Timeline.Mode.LIVE) + val processor = RoomBeginningPostProcessor(Timeline.Mode.Live) val processedItems = processor.process(timelineItems, isDm = true, roomCreator = A_USER_ID, hasMoreToLoadBackwards = true) assertThat(processedItems).isEmpty() } @@ -115,7 +115,7 @@ class RoomBeginningPostProcessorTest { val timelineItems = listOf( roomCreatorJoinEvent, ) - val processor = RoomBeginningPostProcessor(Timeline.Mode.LIVE) + val processor = RoomBeginningPostProcessor(Timeline.Mode.Live) val processedItems = processor.process(timelineItems, isDm = true, roomCreator = A_USER_ID, hasMoreToLoadBackwards = true) assertThat(processedItems).isEmpty() } @@ -126,7 +126,7 @@ class RoomBeginningPostProcessorTest { roomCreateEvent, otherMemberJoinEvent, ) - val processor = RoomBeginningPostProcessor(Timeline.Mode.LIVE) + val processor = RoomBeginningPostProcessor(Timeline.Mode.Live) val processedItems = processor.process(timelineItems, isDm = true, roomCreator = A_USER_ID, hasMoreToLoadBackwards = true) assertThat(processedItems).isEqualTo(listOf(otherMemberJoinEvent)) } diff --git a/libraries/matrix/test/src/main/kotlin/io/element/android/libraries/matrix/test/FakeMatrixClient.kt b/libraries/matrix/test/src/main/kotlin/io/element/android/libraries/matrix/test/FakeMatrixClient.kt index 41ceb72200..dfc82e132d 100644 --- a/libraries/matrix/test/src/main/kotlin/io/element/android/libraries/matrix/test/FakeMatrixClient.kt +++ b/libraries/matrix/test/src/main/kotlin/io/element/android/libraries/matrix/test/FakeMatrixClient.kt @@ -9,7 +9,6 @@ package io.element.android.libraries.matrix.test import io.element.android.libraries.matrix.api.MatrixClient import io.element.android.libraries.matrix.api.core.DeviceId -import io.element.android.libraries.matrix.api.core.ProgressCallback import io.element.android.libraries.matrix.api.core.RoomAlias import io.element.android.libraries.matrix.api.core.RoomId import io.element.android.libraries.matrix.api.core.RoomIdOrAlias @@ -95,6 +94,7 @@ class FakeMatrixClient( private val isLivekitRtcSupportedLambda: () -> Boolean = { false }, override val ignoredUsersFlow: StateFlow> = MutableStateFlow(persistentListOf()), private val getMaxUploadSizeResult: () -> Result = { lambdaError() }, + private val getJoinedRoomIdsResult: () -> Result> = { Result.success(emptySet()) }, ) : MatrixClient { var setDisplayNameCalled: Boolean = false private set @@ -142,6 +142,10 @@ class FakeMatrixClient( return findDmResult } + override suspend fun getJoinedRoomIds(): Result> { + return getJoinedRoomIdsResult() + } + override suspend fun ignoreUser(userId: UserId): Result = simulateLongTask { return ignoreUserResult(userId) } @@ -201,7 +205,6 @@ class FakeMatrixClient( override suspend fun uploadMedia( mimeType: String, data: ByteArray, - progressCallback: ProgressCallback? ): Result { return uploadMediaResult } 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 dd0bf02d4d..42a0ecbcb6 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 @@ -8,7 +8,6 @@ package io.element.android.libraries.matrix.test.timeline import io.element.android.libraries.matrix.api.core.EventId -import io.element.android.libraries.matrix.api.core.ProgressCallback import io.element.android.libraries.matrix.api.core.RoomId import io.element.android.libraries.matrix.api.core.TransactionId import io.element.android.libraries.matrix.api.media.AudioInfo @@ -27,7 +26,6 @@ import io.element.android.libraries.matrix.api.timeline.item.event.InReplyTo import io.element.android.libraries.matrix.test.media.FakeMediaUploadHandler import io.element.android.tests.testutils.lambda.lambdaError import io.element.android.tests.testutils.simulateLongTask -import kotlinx.coroutines.delay import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.MutableSharedFlow import kotlinx.coroutines.flow.MutableStateFlow @@ -49,8 +47,8 @@ class FakeTimeline( ) ), override val membershipChangeEventReceived: Flow = MutableSharedFlow(), - private val progressCallbackValues: List> = emptyList(), private val cancelSendResult: (TransactionId) -> Result = { lambdaError() }, + override val mode: Timeline.Mode = Timeline.Mode.Live, ) : Timeline { var sendMessageLambda: ( body: String, @@ -150,9 +148,8 @@ class FakeTimeline( imageInfo: ImageInfo, body: String?, formattedBody: String?, - progressCallback: ProgressCallback?, inReplyToEventId: EventId??, - ) -> Result = { _, _, _, _, _, _, _ -> + ) -> Result = { _, _, _, _, _, _ -> Result.success(FakeMediaUploadHandler()) } @@ -162,17 +159,14 @@ class FakeTimeline( imageInfo: ImageInfo, caption: String?, formattedCaption: String?, - progressCallback: ProgressCallback?, inReplyToEventId: EventId??, ): Result = simulateLongTask { - simulateSendMediaProgress(progressCallback) sendImageLambda( file, thumbnailFile, imageInfo, caption, formattedCaption, - progressCallback, inReplyToEventId, ) } @@ -183,9 +177,8 @@ class FakeTimeline( videoInfo: VideoInfo, body: String?, formattedBody: String?, - progressCallback: ProgressCallback?, inReplyToEventId: EventId??, - ) -> Result = { _, _, _, _, _, _, _ -> + ) -> Result = { _, _, _, _, _, _ -> Result.success(FakeMediaUploadHandler()) } @@ -195,17 +188,14 @@ class FakeTimeline( videoInfo: VideoInfo, caption: String?, formattedCaption: String?, - progressCallback: ProgressCallback?, inReplyToEventId: EventId??, ): Result = simulateLongTask { - simulateSendMediaProgress(progressCallback) sendVideoLambda( file, thumbnailFile, videoInfo, caption, formattedCaption, - progressCallback, inReplyToEventId, ) } @@ -215,9 +205,8 @@ class FakeTimeline( audioInfo: AudioInfo, caption: String?, formattedCaption: String?, - progressCallback: ProgressCallback?, inReplyToEventId: EventId??, - ) -> Result = { _, _, _, _, _, _ -> + ) -> Result = { _, _, _, _, _ -> Result.success(FakeMediaUploadHandler()) } @@ -226,16 +215,13 @@ class FakeTimeline( audioInfo: AudioInfo, caption: String?, formattedCaption: String?, - progressCallback: ProgressCallback?, inReplyToEventId: EventId??, ): Result = simulateLongTask { - simulateSendMediaProgress(progressCallback) sendAudioLambda( file, audioInfo, caption, formattedCaption, - progressCallback, inReplyToEventId, ) } @@ -245,9 +231,8 @@ class FakeTimeline( fileInfo: FileInfo, caption: String?, formattedCaption: String?, - progressCallback: ProgressCallback?, inReplyToEventId: EventId??, - ) -> Result = { _, _, _, _, _, _ -> + ) -> Result = { _, _, _, _, _ -> Result.success(FakeMediaUploadHandler()) } @@ -256,16 +241,13 @@ class FakeTimeline( fileInfo: FileInfo, caption: String?, formattedCaption: String?, - progressCallback: ProgressCallback?, inReplyToEventId: EventId??, ): Result = simulateLongTask { - simulateSendMediaProgress(progressCallback) sendFileLambda( file, fileInfo, caption, formattedCaption, - progressCallback, inReplyToEventId, ) } @@ -274,9 +256,8 @@ class FakeTimeline( file: File, audioInfo: AudioInfo, waveform: List, - progressCallback: ProgressCallback?, inReplyToEventId: EventId??, - ) -> Result = { _, _, _, _, _ -> + ) -> Result = { _, _, _, _ -> Result.success(FakeMediaUploadHandler()) } @@ -284,15 +265,12 @@ class FakeTimeline( file: File, audioInfo: AudioInfo, waveform: List, - progressCallback: ProgressCallback?, inReplyToEventId: EventId??, ): Result = simulateLongTask { - simulateSendMediaProgress(progressCallback) sendVoiceMessageLambda( file, audioInfo, waveform, - progressCallback, inReplyToEventId, ) } @@ -460,12 +438,5 @@ class FakeTimeline( closeCounter++ } - private suspend fun simulateSendMediaProgress(progressCallback: ProgressCallback?) { - progressCallbackValues.forEach { (current, total) -> - progressCallback?.onProgress(current, total) - delay(1) - } - } - override fun toString() = "FakeTimeline: $name" } diff --git a/libraries/matrix/test/src/main/kotlin/io/element/android/libraries/matrix/test/timeline/TimelineFixture.kt b/libraries/matrix/test/src/main/kotlin/io/element/android/libraries/matrix/test/timeline/TimelineFixture.kt index 0aa324eea6..a082f6c3e1 100644 --- a/libraries/matrix/test/src/main/kotlin/io/element/android/libraries/matrix/test/timeline/TimelineFixture.kt +++ b/libraries/matrix/test/src/main/kotlin/io/element/android/libraries/matrix/test/timeline/TimelineFixture.kt @@ -14,6 +14,7 @@ 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 io.element.android.libraries.matrix.api.timeline.item.EventThreadInfo import io.element.android.libraries.matrix.api.timeline.item.TimelineItemDebugInfo import io.element.android.libraries.matrix.api.timeline.item.event.EventContent import io.element.android.libraries.matrix.api.timeline.item.event.EventReaction @@ -103,7 +104,7 @@ fun aMessageContent( body: String = "body", inReplyTo: InReplyTo? = null, isEdited: Boolean = false, - isThreaded: Boolean = false, + threadInfo: EventThreadInfo = EventThreadInfo(threadRootId = null, threadSummary = null), messageType: MessageType = TextMessageType( body = body, formatted = null @@ -112,7 +113,7 @@ fun aMessageContent( body = body, inReplyTo = inReplyTo, isEdited = isEdited, - isThreaded = isThreaded, + threadInfo = threadInfo, type = messageType ) diff --git a/libraries/matrixui/src/main/kotlin/io/element/android/libraries/matrix/ui/components/CheckableUserRow.kt b/libraries/matrixui/src/main/kotlin/io/element/android/libraries/matrix/ui/components/CheckableUserRow.kt index f21d4ecee5..17d5243972 100644 --- a/libraries/matrixui/src/main/kotlin/io/element/android/libraries/matrix/ui/components/CheckableUserRow.kt +++ b/libraries/matrixui/src/main/kotlin/io/element/android/libraries/matrix/ui/components/CheckableUserRow.kt @@ -19,10 +19,10 @@ import androidx.compose.ui.Modifier import androidx.compose.ui.semantics.Role import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp +import io.element.android.libraries.designsystem.atomic.atoms.SelectedIndicatorAtom 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.ElementThemedPreview -import io.element.android.libraries.designsystem.theme.components.Checkbox import io.element.android.libraries.designsystem.theme.components.HorizontalDivider import io.element.android.libraries.matrix.ui.model.getAvatarData @@ -50,6 +50,7 @@ fun CheckableUserRow( avatarData = data.avatarData, name = data.name, subtext = data.subtext, + enabled = enabled, ) } is CheckableUserRowData.Unresolved -> { @@ -57,14 +58,13 @@ fun CheckableUserRow( modifier = rowModifier, avatarData = data.avatarData, id = data.id, + enabled = enabled, ) } } - - Checkbox( - modifier = Modifier.padding(end = 4.dp), + SelectedIndicatorAtom( + modifier = Modifier.padding(end = 24.dp), checked = checked, - onCheckedChange = null, enabled = enabled, ) } diff --git a/libraries/matrixui/src/main/kotlin/io/element/android/libraries/matrix/ui/components/EditableOrgAvatar.kt b/libraries/matrixui/src/main/kotlin/io/element/android/libraries/matrix/ui/components/EditableOrgAvatar.kt new file mode 100644 index 0000000000..433e036d97 --- /dev/null +++ b/libraries/matrixui/src/main/kotlin/io/element/android/libraries/matrix/ui/components/EditableOrgAvatar.kt @@ -0,0 +1,160 @@ +/* + * Copyright 2025 New Vector Ltd. + * + * SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial + * Please see LICENSE files in the repository root for full details. + */ + +package io.element.android.libraries.matrix.ui.components + +import androidx.compose.foundation.BorderStroke +import androidx.compose.foundation.clickable +import androidx.compose.foundation.interaction.MutableInteractionSource +import androidx.compose.foundation.layout.Box +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.ripple +import androidx.compose.runtime.Composable +import androidx.compose.runtime.CompositionLocalProvider +import androidx.compose.runtime.remember +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.draw.clip +import androidx.compose.ui.draw.drawWithContent +import androidx.compose.ui.geometry.Offset +import androidx.compose.ui.graphics.BlendMode +import androidx.compose.ui.graphics.Color +import androidx.compose.ui.graphics.CompositingStrategy +import androidx.compose.ui.graphics.graphicsLayer +import androidx.compose.ui.platform.LocalLayoutDirection +import androidx.compose.ui.res.stringResource +import androidx.compose.ui.semantics.clearAndSetSemantics +import androidx.compose.ui.semantics.contentDescription +import androidx.compose.ui.semantics.onClick +import androidx.compose.ui.unit.LayoutDirection +import androidx.compose.ui.unit.dp +import io.element.android.compound.theme.ElementTheme +import io.element.android.compound.tokens.generated.CompoundIcons +import io.element.android.libraries.designsystem.components.avatar.Avatar +import io.element.android.libraries.designsystem.components.avatar.AvatarData +import io.element.android.libraries.designsystem.components.avatar.AvatarSize +import io.element.android.libraries.designsystem.components.avatar.AvatarType +import io.element.android.libraries.designsystem.components.avatar.anAvatarData +import io.element.android.libraries.designsystem.preview.ElementPreview +import io.element.android.libraries.designsystem.preview.PreviewsDayNight +import io.element.android.libraries.designsystem.text.toPx +import io.element.android.libraries.designsystem.theme.components.Icon +import io.element.android.libraries.designsystem.theme.components.Surface +import io.element.android.libraries.ui.strings.CommonStrings + +/** + * Ref: https://www.figma.com/design/G1xy0HDZKJf5TCRFmKb5d5/Compound-Android-Components?node-id=3643-2678&m=dev + */ +@Composable +fun EditableOrgAvatar( + avatarData: AvatarData, + onEdit: () -> Unit, + modifier: Modifier = Modifier, +) { + val actionEdit = stringResource(id = CommonStrings.action_edit) + val description = stringResource(CommonStrings.a11y_avatar) + Box( + modifier = modifier + .width(avatarData.size.dp + 16.dp) + .clearAndSetSemantics { + contentDescription = description + // Note: this does not set the click effect to the whole Box + // when talkback is not enabled + onClick( + label = actionEdit, + action = { + onEdit() + true + } + ) + } + ) { + val isRtl = LocalLayoutDirection.current == LayoutDirection.Rtl + val editIconRadius = 17.dp.toPx() + val editIconXOffset = 7.dp.toPx() + val editIconYOffset = 15.dp.toPx() + Avatar( + avatarData = avatarData, + avatarType = AvatarType.Space(false), + modifier = Modifier + .align(Alignment.Center) + .graphicsLayer { + compositingStrategy = CompositingStrategy.Offscreen + } + .drawWithContent { + drawContent() + val xOffset = if (isRtl) { + editIconXOffset + } else { + size.width - editIconXOffset + } + drawCircle( + color = Color.Black, + center = Offset( + x = xOffset, + y = size.height - editIconYOffset, + ), + radius = editIconRadius, + blendMode = BlendMode.Clear, + ) + }, + ) + Surface( + color = ElementTheme.colors.bgCanvasDefault, + shape = CircleShape, + border = BorderStroke(1.dp, color = ElementTheme.colors.borderInteractiveSecondary), + modifier = Modifier + .clip(CircleShape) + .size(30.dp) + .align(Alignment.BottomEnd) + .clickable( + indication = ripple(), + interactionSource = remember { MutableInteractionSource() }, + onClick = onEdit, + ), + ) { + Icon( + imageVector = CompoundIcons.Edit(), + // Note: keep the context description for the test + contentDescription = stringResource(id = CommonStrings.action_edit), + tint = ElementTheme.colors.iconPrimary, + modifier = Modifier.padding(6.dp) + ) + } + } +} + +@PreviewsDayNight +@Composable +internal fun EditableOrgAvatarPreview() = ElementPreview { + EditableOrgAvatar( + avatarData = anAvatarData( + url = "anUrl", + size = AvatarSize.OrganizationHeader, + ), + onEdit = {}, + ) +} + +@PreviewsDayNight +@Composable +internal fun EditableOrgAvatarRtlPreview() = CompositionLocalProvider( + LocalLayoutDirection provides LayoutDirection.Rtl, +) { + ElementPreview { + EditableOrgAvatar( + avatarData = anAvatarData( + url = "anUrl", + size = AvatarSize.OrganizationHeader, + ), + onEdit = {}, + ) + } +} diff --git a/libraries/matrixui/src/main/kotlin/io/element/android/libraries/matrix/ui/components/MatrixUserProvider.kt b/libraries/matrixui/src/main/kotlin/io/element/android/libraries/matrix/ui/components/MatrixUserProvider.kt index d10f428f1c..ce0d8b2eec 100644 --- a/libraries/matrixui/src/main/kotlin/io/element/android/libraries/matrix/ui/components/MatrixUserProvider.kt +++ b/libraries/matrixui/src/main/kotlin/io/element/android/libraries/matrix/ui/components/MatrixUserProvider.kt @@ -15,7 +15,24 @@ open class MatrixUserProvider : PreviewParameterProvider { override val values: Sequence get() = sequenceOf( aMatrixUser(), - aMatrixUser().copy(displayName = null), + aMatrixUser(displayName = null), + ) +} + +open class MatrixUserWithNullProvider : PreviewParameterProvider { + override val values: Sequence + get() = sequenceOf( + aMatrixUser(), + aMatrixUser(displayName = null), + null, + ) +} + +open class MatrixUserWithAvatarProvider : PreviewParameterProvider { + override val values: Sequence + get() = sequenceOf( + aMatrixUser(displayName = "John Doe"), + aMatrixUser(displayName = "John Doe", avatarUrl = "anUrl"), ) } @@ -41,12 +58,3 @@ fun aMatrixUserList() = listOf( aMatrixUser("@victor:server.org", "Victor"), aMatrixUser("@walter:server.org", "Walter"), ) - -open class MatrixUserWithNullProvider : PreviewParameterProvider { - override val values: Sequence - get() = sequenceOf( - aMatrixUser(), - aMatrixUser().copy(displayName = null), - null, - ) -} diff --git a/libraries/matrixui/src/main/kotlin/io/element/android/libraries/matrix/ui/components/MatrixUserRow.kt b/libraries/matrixui/src/main/kotlin/io/element/android/libraries/matrix/ui/components/MatrixUserRow.kt index bfa0599bf7..70d22bc644 100644 --- a/libraries/matrixui/src/main/kotlin/io/element/android/libraries/matrix/ui/components/MatrixUserRow.kt +++ b/libraries/matrixui/src/main/kotlin/io/element/android/libraries/matrix/ui/components/MatrixUserRow.kt @@ -28,7 +28,7 @@ fun MatrixUserRow( name = matrixUser.getBestName(), subtext = if (matrixUser.displayName.isNullOrEmpty()) null else matrixUser.userId.value, modifier = modifier, - trailingContent, + trailingContent = trailingContent, ) @PreviewsDayNight diff --git a/libraries/matrixui/src/main/kotlin/io/element/android/libraries/matrix/ui/components/OrganizationHeader.kt b/libraries/matrixui/src/main/kotlin/io/element/android/libraries/matrix/ui/components/OrganizationHeader.kt new file mode 100644 index 0000000000..ebd5b5969c --- /dev/null +++ b/libraries/matrixui/src/main/kotlin/io/element/android/libraries/matrix/ui/components/OrganizationHeader.kt @@ -0,0 +1,78 @@ +/* + * Copyright 2025 New Vector Ltd. + * + * SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial + * Please see LICENSE files in the repository root for full details. + */ + +package io.element.android.libraries.matrix.ui.components + +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.Spacer +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.height +import androidx.compose.foundation.layout.padding +import androidx.compose.material3.Text +import androidx.compose.runtime.Composable +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.text.style.TextAlign +import androidx.compose.ui.unit.dp +import io.element.android.compound.theme.ElementTheme +import io.element.android.libraries.designsystem.components.avatar.Avatar +import io.element.android.libraries.designsystem.components.avatar.AvatarData +import io.element.android.libraries.designsystem.components.avatar.AvatarSize +import io.element.android.libraries.designsystem.components.avatar.AvatarType +import io.element.android.libraries.designsystem.components.avatar.anAvatarData +import io.element.android.libraries.designsystem.preview.ElementPreview +import io.element.android.libraries.designsystem.preview.PreviewsDayNight + +/** + * Ref: https://www.figma.com/design/G1xy0HDZKJf5TCRFmKb5d5/Compound-Android-Components?node-id=3643-2048&m=dev + */ +@Composable +fun OrganizationHeader( + avatarData: AvatarData, + name: String, + numberOfSpaces: Int, + numberOfRooms: Int, + modifier: Modifier = Modifier, +) { + Column( + modifier = modifier + .fillMaxWidth() + .padding(top = 16.dp, bottom = 24.dp, start = 16.dp, end = 16.dp), + horizontalAlignment = Alignment.CenterHorizontally, + ) { + Avatar( + avatarData = avatarData, + avatarType = AvatarType.Space(false), + ) + Spacer(modifier = Modifier.height(16.dp)) + Text( + text = name, + style = ElementTheme.typography.fontHeadingLgBold, + color = ElementTheme.colors.textPrimary, + textAlign = TextAlign.Center, + ) + Spacer(modifier = Modifier.height(12.dp)) + SpaceInfoRow( + leftText = numberOfSpaces(numberOfSpaces), + rightText = numberOfRooms(numberOfRooms), + ) + } +} + +@PreviewsDayNight +@Composable +internal fun OrganizationHeaderPreview() = ElementPreview { + OrganizationHeader( + avatarData = anAvatarData( + url = "anUrl", + size = AvatarSize.OrganizationHeader, + ), + name = "Space name", + numberOfSpaces = 9, + numberOfRooms = 88, + ) +} diff --git a/libraries/matrixui/src/main/kotlin/io/element/android/libraries/matrix/ui/components/SelectRoomInfoProvider.kt b/libraries/matrixui/src/main/kotlin/io/element/android/libraries/matrix/ui/components/SelectRoomInfoProvider.kt index f6ad30fae1..04562eb13c 100644 --- a/libraries/matrixui/src/main/kotlin/io/element/android/libraries/matrix/ui/components/SelectRoomInfoProvider.kt +++ b/libraries/matrixui/src/main/kotlin/io/element/android/libraries/matrix/ui/components/SelectRoomInfoProvider.kt @@ -20,7 +20,7 @@ class SelectRoomInfoProvider : PreviewParameterProvider { get() = sequenceOf( aSelectRoomInfo(roomId = RoomId("!room1:domain")), aSelectRoomInfo(roomId = RoomId("!room2:domain"), name = "Room with a name"), - aSelectRoomInfo(roomId = RoomId("!room3:domain"), name = "Room with a name and alias", canonicalAlias = RoomAlias("#alias:domain")), + aSelectRoomInfo(roomId = RoomId("!room3:domain"), name = "Room with a name and avatar", avatarUrl = "anUrl"), ) } diff --git a/libraries/matrixui/src/main/kotlin/io/element/android/libraries/matrix/ui/components/SelectedItem.kt b/libraries/matrixui/src/main/kotlin/io/element/android/libraries/matrix/ui/components/SelectedItem.kt new file mode 100644 index 0000000000..d72d786b8d --- /dev/null +++ b/libraries/matrixui/src/main/kotlin/io/element/android/libraries/matrix/ui/components/SelectedItem.kt @@ -0,0 +1,148 @@ +/* + * Copyright 2025 New Vector Ltd. + * + * SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial + * Please see LICENSE files in the repository root for full details. + */ + +package io.element.android.libraries.matrix.ui.components + +import androidx.compose.foundation.clickable +import androidx.compose.foundation.interaction.MutableInteractionSource +import androidx.compose.foundation.layout.Box +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.size +import androidx.compose.foundation.layout.width +import androidx.compose.foundation.shape.CircleShape +import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.ripple +import androidx.compose.runtime.Composable +import androidx.compose.runtime.remember +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.draw.clip +import androidx.compose.ui.draw.clipToBounds +import androidx.compose.ui.draw.drawWithContent +import androidx.compose.ui.geometry.Offset +import androidx.compose.ui.graphics.BlendMode +import androidx.compose.ui.graphics.Color +import androidx.compose.ui.graphics.CompositingStrategy +import androidx.compose.ui.graphics.graphicsLayer +import androidx.compose.ui.platform.LocalLayoutDirection +import androidx.compose.ui.res.stringResource +import androidx.compose.ui.semantics.clearAndSetSemantics +import androidx.compose.ui.semantics.contentDescription +import androidx.compose.ui.semantics.onClick +import androidx.compose.ui.text.style.TextAlign +import androidx.compose.ui.text.style.TextOverflow +import androidx.compose.ui.unit.LayoutDirection +import androidx.compose.ui.unit.dp +import io.element.android.compound.theme.ElementTheme +import io.element.android.compound.tokens.generated.CompoundIcons +import io.element.android.libraries.designsystem.components.avatar.Avatar +import io.element.android.libraries.designsystem.components.avatar.AvatarData +import io.element.android.libraries.designsystem.components.avatar.AvatarType +import io.element.android.libraries.designsystem.text.toPx +import io.element.android.libraries.designsystem.theme.components.Icon +import io.element.android.libraries.designsystem.theme.components.Surface +import io.element.android.libraries.designsystem.theme.components.Text +import io.element.android.libraries.ui.strings.CommonStrings + +@Composable +fun SelectedItem( + avatarData: AvatarData, + avatarType: AvatarType, + text: String, + maxLines: Int, + a11yContentDescription: String, + canRemove: Boolean, + onRemoveClick: () -> Unit, + modifier: Modifier = Modifier, +) { + val actionRemove = stringResource(id = CommonStrings.action_remove) + Box( + modifier = modifier + .width(avatarData.size.dp) + .clearAndSetSemantics { + contentDescription = a11yContentDescription + if (canRemove) { + // Note: this does not set the click effect to the whole Box + // when talkback is not enabled + onClick( + label = actionRemove, + action = { + onRemoveClick() + true + } + ) + } + } + ) { + Column( + horizontalAlignment = Alignment.CenterHorizontally, + ) { + val isRtl = LocalLayoutDirection.current == LayoutDirection.Rtl + val closeIconRadius = 12.dp.toPx() + val closeIconOffset = 10.dp.toPx() + Avatar( + avatarData = avatarData, + avatarType = avatarType, + modifier = Modifier + .graphicsLayer { + compositingStrategy = CompositingStrategy.Offscreen + } + .drawWithContent { + drawContent() + if (canRemove) { + val xOffset = if (isRtl) { + closeIconOffset + } else { + size.width - closeIconOffset + } + drawCircle( + color = Color.Black, + center = Offset( + x = xOffset, + y = closeIconOffset, + ), + radius = closeIconRadius, + blendMode = BlendMode.Clear, + ) + } + }, + ) + Text( + modifier = Modifier.clipToBounds(), + text = text, + overflow = TextOverflow.Ellipsis, + maxLines = maxLines, + style = MaterialTheme.typography.bodyMedium, + color = ElementTheme.colors.textSecondary, + textAlign = TextAlign.Center, + ) + } + if (canRemove) { + Surface( + color = ElementTheme.colors.bgActionPrimaryRest, + modifier = Modifier + .clip(CircleShape) + .size(20.dp) + .align(Alignment.TopEnd) + .clickable( + indication = ripple(), + interactionSource = remember { MutableInteractionSource() }, + onClick = onRemoveClick, + ), + ) { + Icon( + imageVector = CompoundIcons.Close(), + // Note: keep the context description for the test + contentDescription = stringResource(id = CommonStrings.action_remove), + tint = ElementTheme.colors.iconOnSolidPrimary, + modifier = Modifier.padding(2.dp) + ) + } + } + } +} diff --git a/libraries/matrixui/src/main/kotlin/io/element/android/libraries/matrix/ui/components/SelectedRoom.kt b/libraries/matrixui/src/main/kotlin/io/element/android/libraries/matrix/ui/components/SelectedRoom.kt index 4a672624ab..59542a5338 100644 --- a/libraries/matrixui/src/main/kotlin/io/element/android/libraries/matrix/ui/components/SelectedRoom.kt +++ b/libraries/matrixui/src/main/kotlin/io/element/android/libraries/matrix/ui/components/SelectedRoom.kt @@ -7,35 +7,17 @@ package io.element.android.libraries.matrix.ui.components -import androidx.compose.foundation.clickable -import androidx.compose.foundation.interaction.MutableInteractionSource -import androidx.compose.foundation.layout.Box -import androidx.compose.foundation.layout.Column -import androidx.compose.foundation.layout.padding -import androidx.compose.foundation.layout.size -import androidx.compose.foundation.layout.width -import androidx.compose.foundation.shape.CircleShape -import androidx.compose.material3.MaterialTheme -import androidx.compose.material3.ripple import androidx.compose.runtime.Composable -import androidx.compose.runtime.remember -import androidx.compose.ui.Alignment +import androidx.compose.runtime.CompositionLocalProvider import androidx.compose.ui.Modifier -import androidx.compose.ui.draw.clip +import androidx.compose.ui.platform.LocalLayoutDirection import androidx.compose.ui.res.stringResource -import androidx.compose.ui.text.style.TextOverflow import androidx.compose.ui.tooling.preview.PreviewParameter -import androidx.compose.ui.unit.dp -import io.element.android.compound.theme.ElementTheme -import io.element.android.compound.tokens.generated.CompoundIcons -import io.element.android.libraries.designsystem.components.avatar.Avatar +import androidx.compose.ui.unit.LayoutDirection import io.element.android.libraries.designsystem.components.avatar.AvatarSize import io.element.android.libraries.designsystem.components.avatar.AvatarType import io.element.android.libraries.designsystem.preview.ElementPreview import io.element.android.libraries.designsystem.preview.PreviewsDayNight -import io.element.android.libraries.designsystem.theme.components.Icon -import io.element.android.libraries.designsystem.theme.components.Surface -import io.element.android.libraries.designsystem.theme.components.Text import io.element.android.libraries.matrix.ui.model.SelectRoomInfo import io.element.android.libraries.matrix.ui.model.getAvatarData import io.element.android.libraries.ui.strings.CommonStrings @@ -47,48 +29,22 @@ fun SelectedRoom( onRemoveRoom: (SelectRoomInfo) -> Unit, modifier: Modifier = Modifier, ) { - Box( - modifier = modifier - .width(56.dp) - ) { - Column( - horizontalAlignment = Alignment.CenterHorizontally, - ) { - Avatar( - avatarData = roomInfo.getAvatarData(AvatarSize.SelectedRoom), - avatarType = AvatarType.Room( - heroes = roomInfo.heroes.map { it.getAvatarData(AvatarSize.SelectedRoom) }.toImmutableList(), - isTombstoned = roomInfo.isTombstoned, - ), - ) - Text( - // If name is null, we do not have space to render "No room name", so just use `#` here. - text = roomInfo.name ?: "#", - overflow = TextOverflow.Ellipsis, - maxLines = 1, - style = MaterialTheme.typography.bodyLarge, - ) - } - Surface( - color = ElementTheme.colors.iconPrimary, - modifier = Modifier - .clip(CircleShape) - .size(20.dp) - .align(Alignment.TopEnd) - .clickable( - indication = ripple(), - interactionSource = remember { MutableInteractionSource() }, - onClick = { onRemoveRoom(roomInfo) } - ), - ) { - Icon( - imageVector = CompoundIcons.Close(), - contentDescription = stringResource(id = CommonStrings.action_remove), - tint = ElementTheme.colors.iconOnSolidPrimary, - modifier = Modifier.padding(2.dp) - ) - } - } + SelectedItem( + avatarData = roomInfo.getAvatarData(AvatarSize.SelectedRoom), + avatarType = AvatarType.Room( + heroes = roomInfo.heroes.map { it.getAvatarData(AvatarSize.SelectedRoom) }.toImmutableList(), + isTombstoned = roomInfo.isTombstoned, + ), + // If name is null, we do not have space to render "No room name", so just use `#` here. + text = roomInfo.name ?: "#", + maxLines = 1, + a11yContentDescription = roomInfo.name + ?: roomInfo.canonicalAlias?.value + ?: stringResource(id = CommonStrings.common_room_name), + canRemove = true, + onRemoveClick = { onRemoveRoom(roomInfo) }, + modifier = modifier, + ) } @PreviewsDayNight @@ -101,3 +57,18 @@ internal fun SelectedRoomPreview( onRemoveRoom = {}, ) } + +@PreviewsDayNight +@Composable +internal fun SelectedRoomRtlPreview( + @PreviewParameter(SelectRoomInfoProvider::class) roomInfo: SelectRoomInfo +) = CompositionLocalProvider( + LocalLayoutDirection provides LayoutDirection.Rtl, +) { + ElementPreview { + SelectedRoom( + roomInfo = roomInfo, + onRemoveRoom = {}, + ) + } +} diff --git a/libraries/matrixui/src/main/kotlin/io/element/android/libraries/matrix/ui/components/SelectedUser.kt b/libraries/matrixui/src/main/kotlin/io/element/android/libraries/matrix/ui/components/SelectedUser.kt index f3c3c634e6..d8648c903e 100644 --- a/libraries/matrixui/src/main/kotlin/io/element/android/libraries/matrix/ui/components/SelectedUser.kt +++ b/libraries/matrixui/src/main/kotlin/io/element/android/libraries/matrix/ui/components/SelectedUser.kt @@ -7,42 +7,19 @@ package io.element.android.libraries.matrix.ui.components -import androidx.compose.foundation.clickable -import androidx.compose.foundation.interaction.MutableInteractionSource -import androidx.compose.foundation.layout.Box -import androidx.compose.foundation.layout.Column -import androidx.compose.foundation.layout.padding -import androidx.compose.foundation.layout.size -import androidx.compose.foundation.layout.width -import androidx.compose.foundation.shape.CircleShape -import androidx.compose.material3.ripple import androidx.compose.runtime.Composable -import androidx.compose.runtime.remember -import androidx.compose.ui.Alignment +import androidx.compose.runtime.CompositionLocalProvider import androidx.compose.ui.Modifier -import androidx.compose.ui.draw.clip -import androidx.compose.ui.draw.clipToBounds -import androidx.compose.ui.res.stringResource -import androidx.compose.ui.semantics.clearAndSetSemantics -import androidx.compose.ui.semantics.contentDescription -import androidx.compose.ui.semantics.onClick -import androidx.compose.ui.text.style.TextAlign -import androidx.compose.ui.text.style.TextOverflow -import androidx.compose.ui.unit.dp -import io.element.android.compound.theme.ElementTheme -import io.element.android.compound.tokens.generated.CompoundIcons -import io.element.android.libraries.designsystem.components.avatar.Avatar +import androidx.compose.ui.platform.LocalLayoutDirection +import androidx.compose.ui.tooling.preview.PreviewParameter +import androidx.compose.ui.unit.LayoutDirection import io.element.android.libraries.designsystem.components.avatar.AvatarSize import io.element.android.libraries.designsystem.components.avatar.AvatarType import io.element.android.libraries.designsystem.preview.ElementPreview import io.element.android.libraries.designsystem.preview.PreviewsDayNight -import io.element.android.libraries.designsystem.theme.components.Icon -import io.element.android.libraries.designsystem.theme.components.Surface -import io.element.android.libraries.designsystem.theme.components.Text import io.element.android.libraries.matrix.api.user.MatrixUser import io.element.android.libraries.matrix.ui.model.getAvatarData import io.element.android.libraries.matrix.ui.model.getBestName -import io.element.android.libraries.ui.strings.CommonStrings @Composable fun SelectedUser( @@ -51,81 +28,47 @@ fun SelectedUser( onUserRemove: (MatrixUser) -> Unit, modifier: Modifier = Modifier, ) { - val actionRemove = stringResource(id = CommonStrings.action_remove) - Box( - modifier = modifier - .width(AvatarSize.SelectedUser.dp) - .clearAndSetSemantics { - contentDescription = matrixUser.getBestName() - if (canRemove) { - // Note: this does not set the click effect to the whole Box - // when talkback is not enabled - onClick( - label = actionRemove, - action = { - onUserRemove(matrixUser) - true - } - ) - } - } - ) { - Column( - horizontalAlignment = Alignment.CenterHorizontally, - ) { - Avatar( - avatarData = matrixUser.getAvatarData(size = AvatarSize.SelectedUser), - avatarType = AvatarType.User, - ) - Text( - modifier = Modifier.clipToBounds(), - text = matrixUser.getBestName(), - overflow = TextOverflow.Ellipsis, - maxLines = 2, - style = ElementTheme.typography.fontBodyMdRegular, - textAlign = TextAlign.Center, - ) - } - if (canRemove) { - Surface( - color = ElementTheme.colors.textPrimary, - modifier = Modifier - .clip(CircleShape) - .size(20.dp) - .align(Alignment.TopEnd) - .clickable( - indication = ripple(), - interactionSource = remember { MutableInteractionSource() }, - onClick = { onUserRemove(matrixUser) } - ), - ) { - Icon( - imageVector = CompoundIcons.Close(), - // Note: keep the context description for the test - contentDescription = stringResource(id = CommonStrings.action_remove), - tint = ElementTheme.colors.iconOnSolidPrimary, - modifier = Modifier.padding(2.dp) - ) - } - } - } + SelectedItem( + avatarData = matrixUser.getAvatarData(size = AvatarSize.SelectedUser), + avatarType = AvatarType.User, + text = matrixUser.getBestName(), + maxLines = 2, + a11yContentDescription = matrixUser.getBestName(), + canRemove = canRemove, + onRemoveClick = { onUserRemove(matrixUser) }, + modifier = modifier, + ) } @PreviewsDayNight @Composable -internal fun SelectedUserPreview() = ElementPreview { +internal fun SelectedUserPreview(@PreviewParameter(MatrixUserWithAvatarProvider::class) user: MatrixUser) = ElementPreview { SelectedUser( - aMatrixUser(displayName = "John Doe"), + matrixUser = user, canRemove = true, onUserRemove = {}, ) } +@PreviewsDayNight +@Composable +internal fun SelectedUserRtlPreview() = CompositionLocalProvider( + LocalLayoutDirection provides LayoutDirection.Rtl, +) { + ElementPreview { + SelectedUser( + matrixUser = aMatrixUser(displayName = "John Doe"), + canRemove = true, + onUserRemove = {}, + ) + } +} + @PreviewsDayNight @Composable internal fun SelectedUserCannotRemovePreview() = ElementPreview { SelectedUser( - aMatrixUser(), + matrixUser = aMatrixUser(), canRemove = false, onUserRemove = {}, ) diff --git a/libraries/matrixui/src/main/kotlin/io/element/android/libraries/matrix/ui/components/SpaceHeaderView.kt b/libraries/matrixui/src/main/kotlin/io/element/android/libraries/matrix/ui/components/SpaceHeaderView.kt new file mode 100644 index 0000000000..ab33b6f637 --- /dev/null +++ b/libraries/matrixui/src/main/kotlin/io/element/android/libraries/matrix/ui/components/SpaceHeaderView.kt @@ -0,0 +1,108 @@ +/* + * Copyright 2025 New Vector Ltd. + * + * SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial + * Please see LICENSE files in the repository root for full details. + */ + +package io.element.android.libraries.matrix.ui.components + +import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.padding +import androidx.compose.material3.Text +import androidx.compose.runtime.Composable +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.text.style.TextAlign +import androidx.compose.ui.text.style.TextOverflow +import androidx.compose.ui.tooling.preview.datasource.LoremIpsum +import androidx.compose.ui.unit.dp +import io.element.android.compound.theme.ElementTheme +import io.element.android.libraries.designsystem.components.avatar.Avatar +import io.element.android.libraries.designsystem.components.avatar.AvatarData +import io.element.android.libraries.designsystem.components.avatar.AvatarSize +import io.element.android.libraries.designsystem.components.avatar.AvatarType +import io.element.android.libraries.designsystem.components.avatar.anAvatarData +import io.element.android.libraries.designsystem.preview.ElementPreview +import io.element.android.libraries.designsystem.preview.PreviewsDayNight +import io.element.android.libraries.matrix.api.room.join.JoinRule +import io.element.android.libraries.matrix.api.user.MatrixUser +import kotlinx.collections.immutable.ImmutableList +import kotlinx.collections.immutable.persistentListOf + +/** + * Ref: https://www.figma.com/design/G1xy0HDZKJf5TCRFmKb5d5/Compound-Android-Components?node-id=3643-2429&m=dev + */ +@Composable +fun SpaceHeaderView( + avatarData: AvatarData, + name: String, + topic: String, + joinRule: JoinRule, + heroes: ImmutableList, + numberOfMembers: Long, + numberOfRooms: Int, + modifier: Modifier = Modifier, + topicMaxLines: Int = Int.MAX_VALUE, +) { + Column( + modifier = modifier + .fillMaxWidth() + .padding(top = 32.dp, bottom = 24.dp, start = 16.dp, end = 16.dp), + horizontalAlignment = Alignment.CenterHorizontally, + verticalArrangement = Arrangement.spacedBy(16.dp) + ) { + Avatar( + avatarData = avatarData, + avatarType = AvatarType.Space(false), + ) + Text( + text = name, + style = ElementTheme.typography.fontHeadingLgBold, + color = ElementTheme.colors.textPrimary, + textAlign = TextAlign.Center, + ) + SpaceInfoRow( + joinRule = joinRule, + numberOfRooms = numberOfRooms, + ) + SpaceMembersView( + heroes = heroes, + numberOfMembers = numberOfMembers, + modifier = Modifier.padding(horizontal = 32.dp), + ) + Text( + text = topic, + style = ElementTheme.typography.fontBodyMdRegular, + color = ElementTheme.colors.textPrimary, + textAlign = TextAlign.Center, + maxLines = topicMaxLines, + overflow = TextOverflow.Ellipsis, + ) + } +} + +@PreviewsDayNight +@Composable +internal fun SpaceHeaderViewPreview() = ElementPreview { + SpaceHeaderView( + avatarData = anAvatarData( + url = "anUrl", + size = AvatarSize.SpaceHeader, + ), + name = "Space name", + topic = "Space topic: " + LoremIpsum(40).values.first(), + topicMaxLines = 2, + joinRule = JoinRule.Public, + heroes = persistentListOf( + aMatrixUser(id = "@1:d", displayName = "Alice", avatarUrl = "aUrl"), + aMatrixUser(id = "@2:d", displayName = "Bob"), + aMatrixUser(id = "@3:d", displayName = "Charlie", avatarUrl = "aUrl"), + aMatrixUser(id = "@4:d", displayName = "Dave"), + ), + numberOfMembers = 999, + numberOfRooms = 10, + ) +} diff --git a/libraries/matrixui/src/main/kotlin/io/element/android/libraries/matrix/ui/components/SpaceInfoRow.kt b/libraries/matrixui/src/main/kotlin/io/element/android/libraries/matrix/ui/components/SpaceInfoRow.kt new file mode 100644 index 0000000000..3d973d97ae --- /dev/null +++ b/libraries/matrixui/src/main/kotlin/io/element/android/libraries/matrix/ui/components/SpaceInfoRow.kt @@ -0,0 +1,135 @@ +/* + * Copyright 2025 New Vector Ltd. + * + * SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial + * Please see LICENSE files in the repository root for full details. + */ + +package io.element.android.libraries.matrix.ui.components + +import androidx.compose.foundation.layout.Arrangement.spacedBy +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.size +import androidx.compose.material3.Text +import androidx.compose.runtime.Composable +import androidx.compose.runtime.ReadOnlyComposable +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.graphics.vector.ImageVector +import androidx.compose.ui.res.pluralStringResource +import androidx.compose.ui.res.stringResource +import androidx.compose.ui.text.style.TextAlign +import androidx.compose.ui.unit.dp +import io.element.android.compound.theme.ElementTheme +import io.element.android.compound.tokens.generated.CompoundIcons +import io.element.android.libraries.designsystem.preview.ElementPreview +import io.element.android.libraries.designsystem.preview.PreviewsDayNight +import io.element.android.libraries.designsystem.theme.components.Icon +import io.element.android.libraries.matrix.api.room.join.JoinRule +import io.element.android.libraries.ui.strings.CommonPlurals +import io.element.android.libraries.ui.strings.CommonStrings + +@Composable +fun SpaceInfoRow( + leftText: String, + rightText: String, + modifier: Modifier = Modifier, + iconVector: ImageVector? = null, +) { + Row( + modifier = modifier, + horizontalArrangement = spacedBy(4.dp), + verticalAlignment = Alignment.CenterVertically, + ) { + if (iconVector != null) { + Icon( + modifier = Modifier.size(20.dp), + imageVector = iconVector, + contentDescription = null, + tint = ElementTheme.colors.iconTertiary, + ) + } + val text = stringResource(id = CommonStrings.screen_space_list_details, leftText, rightText) + Text( + text = text, + style = ElementTheme.typography.fontBodyLgRegular, + color = ElementTheme.colors.textSecondary, + textAlign = TextAlign.Center, + ) + } +} + +@Composable +fun SpaceInfoRow( + joinRule: JoinRule, + numberOfRooms: Int, + modifier: Modifier = Modifier, +) { + val (leftText, rightText, icon) = when (joinRule) { + JoinRule.Public -> Triple( + stringResource(id = CommonStrings.common_public_space), + numberOfRooms(numberOfRooms), + CompoundIcons.Public(), + ) + // TODO External space + // JoinRule.Private -> Triple( + // stringResource(id = CommonStrings.common_external_space), + // numberOfRooms(numberOfRooms), + // CompoundIcons.Guest(), + // ) + // JoinRule.Private, + else -> Triple( + stringResource(id = CommonStrings.common_private_space), + numberOfRooms(numberOfRooms), + CompoundIcons.Lock(), + ) + } + SpaceInfoRow( + leftText = leftText, + rightText = rightText, + modifier = modifier, + iconVector = icon, + ) +} + +@Composable +@ReadOnlyComposable +fun numberOfRooms(numberOfRooms: Int): String { + return pluralStringResource(CommonPlurals.common_rooms, numberOfRooms, numberOfRooms) +} + +@Composable +@ReadOnlyComposable +fun numberOfSpaces(numberOfSpaces: Int): String { + return pluralStringResource(CommonPlurals.common_spaces, numberOfSpaces, numberOfSpaces) +} + +@PreviewsDayNight +@Composable +internal fun SpaceInfoRowPreview() = ElementPreview { + Column( + modifier = Modifier.fillMaxWidth(), + verticalArrangement = spacedBy(4.dp), + horizontalAlignment = Alignment.CenterHorizontally, + ) { + SpaceInfoRow( + leftText = numberOfSpaces(5), + rightText = numberOfRooms(10), + ) + SpaceInfoRow( + leftText = "Element space", + rightText = numberOfRooms(16), + iconVector = CompoundIcons.Workspace(), + ) + SpaceInfoRow( + joinRule = JoinRule.Private, + numberOfRooms = 4, + ) + SpaceInfoRow( + joinRule = JoinRule.Public, + numberOfRooms = 10, + ) + } +} diff --git a/libraries/matrixui/src/main/kotlin/io/element/android/libraries/matrix/ui/components/SpaceMembersView.kt b/libraries/matrixui/src/main/kotlin/io/element/android/libraries/matrix/ui/components/SpaceMembersView.kt new file mode 100644 index 0000000000..c63743c51e --- /dev/null +++ b/libraries/matrixui/src/main/kotlin/io/element/android/libraries/matrix/ui/components/SpaceMembersView.kt @@ -0,0 +1,107 @@ +/* + * Copyright 2025 New Vector Ltd. + * + * SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial + * Please see LICENSE files in the repository root for full details. + */ + +package io.element.android.libraries.matrix.ui.components + +import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.layout.Row +import androidx.compose.runtime.Composable +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.unit.dp +import io.element.android.compound.theme.ElementTheme +import io.element.android.libraries.designsystem.atomic.molecules.MembersCountMolecule +import io.element.android.libraries.designsystem.components.avatar.AvatarData +import io.element.android.libraries.designsystem.components.avatar.AvatarRow +import io.element.android.libraries.designsystem.components.avatar.AvatarSize +import io.element.android.libraries.designsystem.components.avatar.AvatarType +import io.element.android.libraries.designsystem.preview.ElementPreview +import io.element.android.libraries.designsystem.preview.PreviewsDayNight +import io.element.android.libraries.designsystem.theme.components.Text +import io.element.android.libraries.designsystem.utils.CommonDrawables +import io.element.android.libraries.matrix.api.user.MatrixUser +import io.element.android.libraries.matrix.ui.model.getAvatarData +import kotlinx.collections.immutable.ImmutableList +import kotlinx.collections.immutable.persistentListOf +import kotlinx.collections.immutable.toImmutableList + +/** + * Ref: https://www.figma.com/design/G1xy0HDZKJf5TCRFmKb5d5/Compound-Android-Components?node-id=3729-605&m=dev + */ +@Composable +fun SpaceMembersView( + heroes: ImmutableList, + numberOfMembers: Long, + modifier: Modifier = Modifier, +) { + if (heroes.isEmpty()) { + MembersCountMolecule( + memberCount = numberOfMembers, + modifier = modifier, + ) + } else { + SpaceMembersWithAvatar( + heroes = heroes + .take(3) + .map { + it.getAvatarData(AvatarSize.SpaceMember) + } + .toImmutableList(), + numberOfMembers = numberOfMembers, + modifier = modifier, + ) + } +} + +@Composable +private fun SpaceMembersWithAvatar( + heroes: ImmutableList, + numberOfMembers: Long, + modifier: Modifier = Modifier, +) { + Row( + modifier = modifier, + verticalAlignment = Alignment.CenterVertically, + horizontalArrangement = Arrangement.spacedBy(4.dp), + ) { + AvatarRow( + avatarDataList = heroes, + avatarType = AvatarType.User, + lastOnTop = true, + ) + Text( + text = "$numberOfMembers", + style = ElementTheme.typography.fontBodyMdRegular, + color = ElementTheme.colors.textSecondary, + ) + } +} + +@Composable +@PreviewsDayNight +internal fun SpaceMembersViewNoHeroesPreview() = ElementPreview { + SpaceMembersView( + heroes = persistentListOf(), + numberOfMembers = 123, + ) +} + +@Composable +@PreviewsDayNight +internal fun SpaceMembersViewPreview() = ElementPreview( + drawableFallbackForImages = CommonDrawables.sample_avatar, +) { + SpaceMembersView( + heroes = persistentListOf( + aMatrixUser(id = "@1:d", displayName = "Alice", avatarUrl = "aUrl"), + aMatrixUser(id = "@2:d", displayName = "Bob"), + aMatrixUser(id = "@3:d", displayName = "Charlie", avatarUrl = "aUrl"), + aMatrixUser(id = "@4:d", displayName = "Dave"), + ), + numberOfMembers = 123, + ) +} diff --git a/libraries/matrixui/src/main/kotlin/io/element/android/libraries/matrix/ui/components/UnresolvedUserRow.kt b/libraries/matrixui/src/main/kotlin/io/element/android/libraries/matrix/ui/components/UnresolvedUserRow.kt index 4c1c4d5f3c..c36c188165 100644 --- a/libraries/matrixui/src/main/kotlin/io/element/android/libraries/matrix/ui/components/UnresolvedUserRow.kt +++ b/libraries/matrixui/src/main/kotlin/io/element/android/libraries/matrix/ui/components/UnresolvedUserRow.kt @@ -39,6 +39,7 @@ fun UnresolvedUserRow( avatarData: AvatarData, id: String, modifier: Modifier = Modifier, + enabled: Boolean = true, ) { Row( modifier = modifier @@ -61,7 +62,7 @@ fun UnresolvedUserRow( text = id, maxLines = 1, overflow = TextOverflow.Ellipsis, - color = ElementTheme.colors.textPrimary, + color = if (enabled) ElementTheme.colors.textPrimary else ElementTheme.colors.textDisabled, style = ElementTheme.typography.fontBodyLgMedium, ) @@ -78,11 +79,11 @@ fun UnresolvedUserRow( .size(18.dp) .align(Alignment.Top) .padding(2.dp), - tint = ElementTheme.colors.iconCriticalPrimary, + tint = if (enabled) ElementTheme.colors.iconCriticalPrimary else ElementTheme.colors.iconDisabled, ) Text( text = stringResource(CommonStrings.common_invite_unknown_profile), - color = ElementTheme.colors.textSecondary, + color = if (enabled) ElementTheme.colors.textSecondary else ElementTheme.colors.textDisabled, style = ElementTheme.typography.fontBodySmRegular.copy(lineHeight = 16.sp), ) } @@ -94,5 +95,8 @@ fun UnresolvedUserRow( @Composable internal fun UnresolvedUserRowPreview() = ElementThemedPreview { val matrixUser = aMatrixUser() - UnresolvedUserRow(matrixUser.getAvatarData(size = AvatarSize.UserListItem), matrixUser.userId.value) + Column { + UnresolvedUserRow(matrixUser.getAvatarData(size = AvatarSize.UserListItem), matrixUser.userId.value) + UnresolvedUserRow(matrixUser.getAvatarData(size = AvatarSize.UserListItem), matrixUser.userId.value, enabled = false) + } } diff --git a/libraries/matrixui/src/main/kotlin/io/element/android/libraries/matrix/ui/components/UserRow.kt b/libraries/matrixui/src/main/kotlin/io/element/android/libraries/matrix/ui/components/UserRow.kt index 2ee234bd43..628fee7cb2 100644 --- a/libraries/matrixui/src/main/kotlin/io/element/android/libraries/matrix/ui/components/UserRow.kt +++ b/libraries/matrixui/src/main/kotlin/io/element/android/libraries/matrix/ui/components/UserRow.kt @@ -30,6 +30,7 @@ internal fun UserRow( name: String, subtext: String?, modifier: Modifier = Modifier, + enabled: Boolean = true, trailingContent: @Composable (() -> Unit)? = null, ) { Row( @@ -54,14 +55,14 @@ internal fun UserRow( text = name, maxLines = 1, overflow = TextOverflow.Ellipsis, - color = ElementTheme.colors.textPrimary, + color = if (enabled) ElementTheme.colors.textPrimary else ElementTheme.colors.textDisabled, style = ElementTheme.typography.fontBodyLgRegular, ) // Id subtext?.let { Text( text = subtext, - color = ElementTheme.colors.textSecondary, + color = if (enabled) ElementTheme.colors.textSecondary else ElementTheme.colors.textDisabled, maxLines = 1, overflow = TextOverflow.Ellipsis, style = ElementTheme.typography.fontBodySmRegular, diff --git a/libraries/matrixui/src/main/kotlin/io/element/android/libraries/matrix/ui/media/InitialsAvatarBitmapGenerator.kt b/libraries/matrixui/src/main/kotlin/io/element/android/libraries/matrix/ui/media/InitialsAvatarBitmapGenerator.kt new file mode 100644 index 0000000000..e0e09a07e7 --- /dev/null +++ b/libraries/matrixui/src/main/kotlin/io/element/android/libraries/matrix/ui/media/InitialsAvatarBitmapGenerator.kt @@ -0,0 +1,137 @@ +/* + * Copyright 2025 New Vector Ltd. + * + * SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial + * Please see LICENSE files in the repository root for full details. + */ + +package io.element.android.libraries.matrix.ui.media + +import android.graphics.Canvas +import android.graphics.Paint +import android.graphics.Rect +import android.graphics.Typeface +import androidx.compose.foundation.Image +import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.size +import androidx.compose.runtime.Composable +import androidx.compose.runtime.remember +import androidx.compose.ui.Modifier +import androidx.compose.ui.graphics.asImageBitmap +import androidx.compose.ui.graphics.toArgb +import androidx.compose.ui.unit.dp +import androidx.core.graphics.createBitmap +import coil3.Bitmap +import io.element.android.compound.theme.AvatarColors +import io.element.android.compound.theme.ElementTheme +import io.element.android.compound.tokens.generated.SemanticColors +import io.element.android.compound.tokens.generated.compoundColorsDark +import io.element.android.compound.tokens.generated.compoundColorsLight +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.Text + +/** + * Generates a bitmap for an initials avatar based on the provided [AvatarData]. + */ +class InitialsAvatarBitmapGenerator( + useDarkTheme: Boolean = false, + private val fontSizePercentage: Float = 0.5f, +) { + private val compoundColors: SemanticColors = if (useDarkTheme) { + compoundColorsDark + } else { + compoundColorsLight + } + + // List of predefined avatar colors to use for initials avatars, in light mode + private val allAvatarColors: List = listOf( + AvatarColors( + background = compoundColors.bgDecorative1, + foreground = compoundColors.textDecorative1, + ), + AvatarColors( + background = compoundColors.bgDecorative2, + foreground = compoundColors.textDecorative2, + ), + AvatarColors( + background = compoundColors.bgDecorative3, + foreground = compoundColors.textDecorative3, + ), + AvatarColors( + background = compoundColors.bgDecorative4, + foreground = compoundColors.textDecorative4, + ), + AvatarColors( + background = compoundColors.bgDecorative5, + foreground = compoundColors.textDecorative5, + ), + AvatarColors( + background = compoundColors.bgDecorative6, + foreground = compoundColors.textDecorative6, + ), + ) + + /** + * Generates a bitmap for an avatar with no URL, using the initials from the [AvatarData]. + * @param size The size of the bitmap to generate, in pixels. + * @param avatarData The [AvatarData] containing the initials and other information. + */ + fun generateBitmap(size: Int, avatarData: AvatarData): Bitmap? { + if (avatarData.url != null) { + // This generator is only for initials avatars, not for avatars with URLs + return null + } + + // Get the color pair to use for the initials avatar + val avatarColors = allAvatarColors[avatarData.id.sumOf { it.code } % allAvatarColors.size] + + val bitmap = createBitmap(size, size) + Canvas(bitmap).run { + drawColor(avatarColors.background.toArgb()) + val letter = avatarData.initialLetter + + val textPaint = Paint().apply { + color = avatarColors.foreground.toArgb() + textSize = size * fontSizePercentage // Adjust text size relative to the avatar size + isAntiAlias = true + textAlign = Paint.Align.CENTER + typeface = Typeface.create(Typeface.SANS_SERIF, Typeface.BOLD) + } + val bounds = Rect() + textPaint.getTextBounds(letter, 0, letter.length, bounds) + drawText( + letter, + size / 2f, + size.toFloat() / 2 - (textPaint.descent() + textPaint.ascent()) / 2, + textPaint + ) + } + + return bitmap + } +} + +@Composable +@PreviewsDayNight +internal fun InitialsAvatarBitmapGeneratorPreview() = ElementPreview { + Column( + verticalArrangement = Arrangement.spacedBy(4.dp) + ) { + repeat(6) { index -> + val avatarData = remember { AvatarData(id = index.toString(), name = Char('0'.code + index).toString(), size = AvatarSize.IncomingCall) } + val isLightTheme = ElementTheme.isLightTheme + val bitmap = remember(isLightTheme) { + val generator = InitialsAvatarBitmapGenerator(useDarkTheme = !isLightTheme) + generator.generateBitmap(512, avatarData)?.asImageBitmap() + } + + bitmap?.let { + Image(bitmap = it, contentDescription = null, modifier = Modifier.size(48.dp)) + } ?: Text("No avatar generated") + } + } +} diff --git a/libraries/matrixui/src/main/kotlin/io/element/android/libraries/matrix/ui/messages/reply/InReplyToDetailsProvider.kt b/libraries/matrixui/src/main/kotlin/io/element/android/libraries/matrix/ui/messages/reply/InReplyToDetailsProvider.kt index be68cd920f..70803c5653 100644 --- a/libraries/matrixui/src/main/kotlin/io/element/android/libraries/matrix/ui/messages/reply/InReplyToDetailsProvider.kt +++ b/libraries/matrixui/src/main/kotlin/io/element/android/libraries/matrix/ui/messages/reply/InReplyToDetailsProvider.kt @@ -12,6 +12,7 @@ import io.element.android.libraries.matrix.api.core.EventId 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.poll.PollKind +import io.element.android.libraries.matrix.api.timeline.item.EventThreadInfo 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.EventContent @@ -133,11 +134,15 @@ class InReplyToDetailsOtherProvider : InReplyToDetailsProvider() { private fun aMessageContent( body: String, type: MessageType, + threadInfo: EventThreadInfo = EventThreadInfo( + threadRootId = null, + threadSummary = null, + ), ) = MessageContent( body = body, inReplyTo = null, isEdited = false, - isThreaded = false, + threadInfo = threadInfo, type = type, ) diff --git a/libraries/matrixui/src/main/kotlin/io/element/android/libraries/matrix/ui/room/MatrixRoomMembers.kt b/libraries/matrixui/src/main/kotlin/io/element/android/libraries/matrix/ui/room/MatrixRoomMembers.kt index 8631066482..445fa156a1 100644 --- a/libraries/matrixui/src/main/kotlin/io/element/android/libraries/matrix/ui/room/MatrixRoomMembers.kt +++ b/libraries/matrixui/src/main/kotlin/io/element/android/libraries/matrix/ui/room/MatrixRoomMembers.kt @@ -17,6 +17,7 @@ import io.element.android.libraries.matrix.api.core.UserId import io.element.android.libraries.matrix.api.room.BaseRoom import io.element.android.libraries.matrix.api.room.RoomMember import io.element.android.libraries.matrix.api.room.RoomMembersState +import io.element.android.libraries.matrix.api.room.getDirectRoomMember import io.element.android.libraries.matrix.api.room.roomMembers @Composable @@ -39,14 +40,10 @@ fun getRoomMemberAsState(roomMembersState: RoomMembersState, userId: UserId): St @Composable fun BaseRoom.getDirectRoomMember(roomMembersState: RoomMembersState): State { - val roomMembers = roomMembersState.roomMembers() val roomInfo by roomInfoFlow.collectAsState() - return remember(roomMembersState, roomInfo.isDirect) { + return remember { derivedStateOf { - roomMembers - ?.filter { it.membership.isActive() } - ?.takeIf { it.size == 2 && roomInfo.isDirect == true } - ?.find { it.userId != sessionId } + roomMembersState.getDirectRoomMember(roomInfo, sessionId) } } } diff --git a/libraries/matrixui/src/main/res/values-zh/translations.xml b/libraries/matrixui/src/main/res/values-zh/translations.xml index 6b0d478317..aa8479fea0 100644 --- a/libraries/matrixui/src/main/res/values-zh/translations.xml +++ b/libraries/matrixui/src/main/res/values-zh/translations.xml @@ -1,4 +1,7 @@ + "发送邀请" + "您想与%1$s 开始聊天吗?" + "发送邀请?" "%1$s (%2$s)邀请了你" diff --git a/libraries/matrixui/src/test/kotlin/io/element/android/libraries/matrix/ui/messages/reply/InReplyToDetailTest.kt b/libraries/matrixui/src/test/kotlin/io/element/android/libraries/matrix/ui/messages/reply/InReplyToDetailTest.kt index 6fdff3ad1c..5b5df0e9b7 100644 --- a/libraries/matrixui/src/test/kotlin/io/element/android/libraries/matrix/ui/messages/reply/InReplyToDetailTest.kt +++ b/libraries/matrixui/src/test/kotlin/io/element/android/libraries/matrix/ui/messages/reply/InReplyToDetailTest.kt @@ -8,6 +8,7 @@ package io.element.android.libraries.matrix.ui.messages.reply import com.google.common.truth.Truth.assertThat +import io.element.android.libraries.matrix.api.timeline.item.EventThreadInfo import io.element.android.libraries.matrix.api.timeline.item.event.FormattedBody import io.element.android.libraries.matrix.api.timeline.item.event.InReplyTo import io.element.android.libraries.matrix.api.timeline.item.event.MembershipChange @@ -69,7 +70,7 @@ class InReplyToDetailTest { body = "**Hello!**", inReplyTo = null, isEdited = false, - isThreaded = false, + threadInfo = EventThreadInfo(threadRootId = null, threadSummary = null), type = TextMessageType( body = "**Hello!**", formatted = FormattedBody( @@ -94,7 +95,7 @@ class InReplyToDetailTest { body = "**Hello!**", inReplyTo = null, isEdited = false, - isThreaded = false, + threadInfo = EventThreadInfo(threadRootId = null, threadSummary = null), type = TextMessageType( body = "**Hello!**", formatted = null, diff --git a/libraries/matrixui/src/test/kotlin/io/element/android/libraries/matrix/ui/room/RoomMembersTest.kt b/libraries/matrixui/src/test/kotlin/io/element/android/libraries/matrix/ui/room/RoomMembersTest.kt index 87deb9c323..6bf081cf1f 100644 --- a/libraries/matrixui/src/test/kotlin/io/element/android/libraries/matrix/ui/room/RoomMembersTest.kt +++ b/libraries/matrixui/src/test/kotlin/io/element/android/libraries/matrix/ui/room/RoomMembersTest.kt @@ -99,7 +99,7 @@ class RoomMembersTest { val joinedRoom = FakeBaseRoom( sessionId = A_USER_ID, ).apply { - givenRoomInfo(aRoomInfo(isDirect = true)) + givenRoomInfo(aRoomInfo(isDirect = true, activeMembersCount = 3L)) } moleculeFlow(RecompositionMode.Immediate) { joinedRoom.getDirectRoomMember( diff --git a/libraries/mediapickers/api/build.gradle.kts b/libraries/mediapickers/api/build.gradle.kts index f82a09b37a..d02c94dd4c 100644 --- a/libraries/mediapickers/api/build.gradle.kts +++ b/libraries/mediapickers/api/build.gradle.kts @@ -1,5 +1,3 @@ -import extension.setupAnvil - /* * Copyright 2023, 2024 New Vector Ltd. * @@ -11,8 +9,6 @@ plugins { id("io.element.android-compose-library") } -setupAnvil() - android { namespace = "io.element.android.libraries.mediapickers.api" diff --git a/libraries/mediaplayer/api/build.gradle.kts b/libraries/mediaplayer/api/build.gradle.kts index 0e47c1be25..f096738c6f 100644 --- a/libraries/mediaplayer/api/build.gradle.kts +++ b/libraries/mediaplayer/api/build.gradle.kts @@ -1,5 +1,3 @@ -import extension.setupAnvil - /* * Copyright 2023, 2024 New Vector Ltd. * @@ -14,8 +12,6 @@ android { namespace = "io.element.android.libraries.mediaplayer.api" } -setupAnvil() - dependencies { implementation(projects.libraries.matrix.api) implementation(libs.coroutines.core) diff --git a/libraries/mediaupload/api/src/main/kotlin/io/element/android/libraries/mediaupload/api/MediaSender.kt b/libraries/mediaupload/api/src/main/kotlin/io/element/android/libraries/mediaupload/api/MediaSender.kt index a010b892a8..2de5b84284 100644 --- a/libraries/mediaupload/api/src/main/kotlin/io/element/android/libraries/mediaupload/api/MediaSender.kt +++ b/libraries/mediaupload/api/src/main/kotlin/io/element/android/libraries/mediaupload/api/MediaSender.kt @@ -8,22 +8,36 @@ package io.element.android.libraries.mediaupload.api import android.net.Uri +import dagger.assisted.Assisted +import dagger.assisted.AssistedFactory +import dagger.assisted.AssistedInject +import io.element.android.libraries.androidutils.hash.hash +import io.element.android.libraries.core.extensions.flatMap import io.element.android.libraries.core.extensions.flatMapCatching import io.element.android.libraries.matrix.api.core.EventId -import io.element.android.libraries.matrix.api.core.ProgressCallback import io.element.android.libraries.matrix.api.media.MediaUploadHandler +import io.element.android.libraries.matrix.api.room.CreateTimelineParams import io.element.android.libraries.matrix.api.room.JoinedRoom import io.element.android.libraries.matrix.api.timeline.Timeline import kotlinx.coroutines.CancellationException import kotlinx.coroutines.Job +import timber.log.Timber +import java.io.File import java.util.concurrent.ConcurrentHashMap -import javax.inject.Inject -class MediaSender @Inject constructor( +class MediaSender @AssistedInject constructor( private val preProcessor: MediaPreProcessor, private val room: JoinedRoom, + @Assisted private val timelineMode: Timeline.Mode, private val mediaOptimizationConfigProvider: MediaOptimizationConfigProvider, ) { + @AssistedFactory + interface Factory { + fun create( + timelineMode: Timeline.Mode, + ): MediaSender + } + private val ongoingUploadJobs = ConcurrentHashMap() val hasOngoingMediaUploads get() = ongoingUploadJobs.isNotEmpty() @@ -32,6 +46,7 @@ class MediaSender @Inject constructor( mimeType: String, mediaOptimizationConfig: MediaOptimizationConfig, ): Result { + Timber.d("Pre-processing media | uri: ${mediaId(uri)} | mimeType: $mimeType") return preProcessor .process( uri = uri, @@ -45,17 +60,19 @@ class MediaSender @Inject constructor( mediaUploadInfo: MediaUploadInfo, caption: String?, formattedCaption: String?, - progressCallback: ProgressCallback?, inReplyToEventId: EventId?, ): Result { - return room.liveTimeline.sendMedia( - uploadInfo = mediaUploadInfo, - progressCallback = progressCallback, - caption = caption, - formattedCaption = formattedCaption, - inReplyToEventId = inReplyToEventId, - ) - .handleSendResult() + val mediaLogId = mediaId(mediaUploadInfo.file) + return getTimeline().flatMap { + Timber.d("Started sending media $mediaLogId using timeline: ${it.mode}") + it.sendMedia( + uploadInfo = mediaUploadInfo, + caption = caption, + formattedCaption = formattedCaption, + inReplyToEventId = inReplyToEventId, + ) + } + .handleSendResult(mediaLogId) } suspend fun sendMedia( @@ -63,7 +80,6 @@ class MediaSender @Inject constructor( mimeType: String, caption: String? = null, formattedCaption: String? = null, - progressCallback: ProgressCallback? = null, inReplyToEventId: EventId? = null, mediaOptimizationConfig: MediaOptimizationConfig, ): Result { @@ -75,22 +91,20 @@ class MediaSender @Inject constructor( mediaOptimizationConfig = mediaOptimizationConfig, ) .flatMapCatching { info -> - room.liveTimeline.sendMedia( + getTimeline().getOrThrow().sendMedia( uploadInfo = info, - progressCallback = progressCallback, caption = caption, formattedCaption = formattedCaption, inReplyToEventId = inReplyToEventId, ) } - .handleSendResult() + .handleSendResult(mediaId(uri)) } suspend fun sendVoiceMessage( uri: Uri, mimeType: String, waveForm: List, - progressCallback: ProgressCallback? = null, inReplyToEventId: EventId? = null, ): Result { return preProcessor @@ -107,31 +121,31 @@ class MediaSender @Inject constructor( audioInfo = audioInfo, waveform = waveForm, ) - room.liveTimeline.sendMedia( + getTimeline().getOrThrow().sendMedia( uploadInfo = newInfo, - progressCallback = progressCallback, caption = null, formattedCaption = null, inReplyToEventId = inReplyToEventId, ) } - .handleSendResult() + .handleSendResult(mediaId(uri)) } - private fun Result.handleSendResult() = this + private fun Result.handleSendResult(mediaId: String) = this .onFailure { error -> val job = ongoingUploadJobs.remove(Job) + Timber.e(error, "Sending media $mediaId failed. Removing ongoing upload job. Total: ${ongoingUploadJobs.size}") if (error !is CancellationException) { job?.cancel() } } .onSuccess { + Timber.d("Sent media $mediaId successfully. Removing ongoing upload job. Total: ${ongoingUploadJobs.size}") ongoingUploadJobs.remove(Job) } private suspend fun Timeline.sendMedia( uploadInfo: MediaUploadInfo, - progressCallback: ProgressCallback?, caption: String?, formattedCaption: String?, inReplyToEventId: EventId?, @@ -144,7 +158,6 @@ class MediaSender @Inject constructor( imageInfo = uploadInfo.imageInfo, caption = caption, formattedCaption = formattedCaption, - progressCallback = progressCallback, inReplyToEventId = inReplyToEventId, ) } @@ -155,7 +168,6 @@ class MediaSender @Inject constructor( videoInfo = uploadInfo.videoInfo, caption = caption, formattedCaption = formattedCaption, - progressCallback = progressCallback, inReplyToEventId = inReplyToEventId, ) } @@ -165,7 +177,6 @@ class MediaSender @Inject constructor( audioInfo = uploadInfo.audioInfo, caption = caption, formattedCaption = formattedCaption, - progressCallback = progressCallback, inReplyToEventId = inReplyToEventId, ) } @@ -174,7 +185,6 @@ class MediaSender @Inject constructor( file = uploadInfo.file, audioInfo = uploadInfo.audioInfo, waveform = uploadInfo.waveform, - progressCallback = progressCallback, inReplyToEventId = inReplyToEventId, ) } @@ -184,7 +194,6 @@ class MediaSender @Inject constructor( fileInfo = uploadInfo.fileInfo, caption = caption, formattedCaption = formattedCaption, - progressCallback = progressCallback, inReplyToEventId = inReplyToEventId, ) } @@ -194,13 +203,26 @@ class MediaSender @Inject constructor( @Suppress("RunCatchingNotAllowed") return handler .mapCatching { uploadHandler -> + Timber.d("Added ongoing upload job, total: ${ongoingUploadJobs.size + 1}") ongoingUploadJobs[Job] = uploadHandler uploadHandler.await() } } + private suspend fun getTimeline(): Result { + return when (timelineMode) { + is Timeline.Mode.Thread -> { + room.createTimeline(CreateTimelineParams.Threaded(threadRootEventId = timelineMode.threadRootId)) + } + else -> Result.success(room.liveTimeline) + } + } + /** * Clean up any temporary files or resources used during the media processing. */ fun cleanUp() = preProcessor.cleanUp() } + +private fun mediaId(uri: Uri?): String = uri?.path.orEmpty().hash() +private fun mediaId(file: File): String = file.path.orEmpty().hash() diff --git a/libraries/mediaupload/api/src/test/kotlin/io/element/android/libraries/mediaupload/api/MediaSenderTest.kt b/libraries/mediaupload/api/src/test/kotlin/io/element/android/libraries/mediaupload/api/MediaSenderTest.kt index 7ed36ce492..e73bff4d7f 100644 --- a/libraries/mediaupload/api/src/test/kotlin/io/element/android/libraries/mediaupload/api/MediaSenderTest.kt +++ b/libraries/mediaupload/api/src/test/kotlin/io/element/android/libraries/mediaupload/api/MediaSenderTest.kt @@ -11,10 +11,10 @@ import android.net.Uri import com.google.common.truth.Truth.assertThat import io.element.android.libraries.core.mimetype.MimeTypes import io.element.android.libraries.matrix.api.core.EventId -import io.element.android.libraries.matrix.api.core.ProgressCallback import io.element.android.libraries.matrix.api.media.FileInfo import io.element.android.libraries.matrix.api.media.ImageInfo import io.element.android.libraries.matrix.api.room.JoinedRoom +import io.element.android.libraries.matrix.api.timeline.Timeline import io.element.android.libraries.matrix.test.media.FakeMediaUploadHandler import io.element.android.libraries.matrix.test.room.FakeJoinedRoom import io.element.android.libraries.matrix.test.timeline.FakeTimeline @@ -50,10 +50,9 @@ class MediaSenderTest { FileInfo, String?, String?, - ProgressCallback?, EventId?, Result, - > { _, _, _, _, _, _ -> + > { _, _, _, _, _ -> Result.success(FakeMediaUploadHandler()) } }, @@ -69,7 +68,7 @@ class MediaSenderTest { @Test fun `given an attachment when sending it the Room will call sendMedia`() = runTest { val sendImageResult = - lambdaRecorder { _: File, _: File?, _: ImageInfo, _: String?, _: String?, _: ProgressCallback?, _: EventId? -> + lambdaRecorder { _: File, _: File?, _: ImageInfo, _: String?, _: String?, _: EventId? -> Result.success(FakeMediaUploadHandler()) } val room = FakeJoinedRoom( @@ -102,7 +101,7 @@ class MediaSenderTest { givenImageResult() } val sendImageResult = - lambdaRecorder { _: File, _: File?, _: ImageInfo, _: String?, _: String?, _: ProgressCallback?, _: EventId? -> + lambdaRecorder { _: File, _: File?, _: ImageInfo, _: String?, _: String?, _: EventId? -> Result.failure(Exception()) } val room = FakeJoinedRoom( @@ -125,7 +124,7 @@ class MediaSenderTest { @Test fun `given a cancellation in the media upload when sending the job is cancelled`() = runTest(StandardTestDispatcher()) { val sendFileResult = - lambdaRecorder> { _, _, _, _, _, _ -> + lambdaRecorder> { _, _, _, _, _ -> Result.success(FakeMediaUploadHandler()) } val room = FakeJoinedRoom( @@ -162,6 +161,7 @@ class MediaSenderTest { ) = MediaSender( preProcessor = preProcessor, room = room, + timelineMode = Timeline.Mode.Live, mediaOptimizationConfigProvider = mediaOptimizationConfigProvider, ) } diff --git a/libraries/mediaupload/impl/src/main/kotlin/io/element/android/libraries/mediaupload/impl/AndroidMediaPreProcessor.kt b/libraries/mediaupload/impl/src/main/kotlin/io/element/android/libraries/mediaupload/impl/AndroidMediaPreProcessor.kt index e1758e9429..cbca90f940 100644 --- a/libraries/mediaupload/impl/src/main/kotlin/io/element/android/libraries/mediaupload/impl/AndroidMediaPreProcessor.kt +++ b/libraries/mediaupload/impl/src/main/kotlin/io/element/android/libraries/mediaupload/impl/AndroidMediaPreProcessor.kt @@ -17,6 +17,7 @@ import io.element.android.libraries.androidutils.file.TemporaryUriDeleter import io.element.android.libraries.androidutils.file.createTmpFile import io.element.android.libraries.androidutils.file.getFileName import io.element.android.libraries.androidutils.file.safeRenameTo +import io.element.android.libraries.androidutils.hash.hash import io.element.android.libraries.androidutils.media.runAndRelease import io.element.android.libraries.core.coroutine.CoroutineDispatchers import io.element.android.libraries.core.data.tryOrNull @@ -107,6 +108,8 @@ class AndroidMediaPreProcessor @Inject constructor( }.mapFailure { MediaPreProcessor.Failure(it) } override fun cleanUp() { + Timber.d("Cleaning up temporary media files") + // Clear temporary files created in older versions of the app cacheDir.listFiles()?.onEach { file -> if (file.isFile) { @@ -129,6 +132,7 @@ class AndroidMediaPreProcessor @Inject constructor( } private suspend fun processFile(uri: Uri, mimeType: String): MediaUploadInfo { + Timber.d("Processing file ${uri.path.orEmpty().hash()}") val file = copyToTmpFile(uri) val info = FileInfo( mimetype = mimeType, @@ -140,6 +144,7 @@ class AndroidMediaPreProcessor @Inject constructor( } private fun MediaUploadInfo.postProcess(uri: Uri): MediaUploadInfo { + Timber.d("Finished processing, post-processing ${uri.path.orEmpty().hash()}") val name = context.getFileName(uri) ?: return this val renamedFile = File(context.cacheDir, name).also { file.safeRenameTo(it) @@ -154,6 +159,7 @@ class AndroidMediaPreProcessor @Inject constructor( } private suspend fun processImage(uri: Uri, mimeType: String, shouldBeCompressed: Boolean): MediaUploadInfo { + Timber.d("Processing image ${uri.path.orEmpty().hash()}") suspend fun processImageWithCompression(): MediaUploadInfo { // Read the orientation metadata from its own stream. Trying to reuse this stream for compression will fail. val orientation = contentResolver.openInputStream(uri).use { input -> @@ -217,6 +223,7 @@ class AndroidMediaPreProcessor @Inject constructor( } private suspend fun processVideo(uri: Uri, mimeType: String?, videoCompressionPreset: VideoCompressionPreset): MediaUploadInfo { + Timber.d("Processing video ${uri.path.orEmpty().hash()}") val resultFile = runCatchingExceptions { videoCompressor.compress(uri, videoCompressionPreset) .onEach { @@ -244,12 +251,14 @@ class AndroidMediaPreProcessor @Inject constructor( thumbnailFile = thumbnailInfo?.file ) } else { + Timber.d("Could not transcode video ${uri.path.orEmpty().hash()}, sending original file as plain file") // If the video could not be compressed, just use the original one, but send it as a file return processFile(uri, MimeTypes.OctetStream) } } private suspend fun processAudio(uri: Uri, mimeType: String?): MediaUploadInfo { + Timber.d("Processing audio ${uri.path.orEmpty().hash()}") val file = copyToTmpFile(uri) return MediaMetadataRetriever().runAndRelease { setDataSource(context, Uri.fromFile(file)) diff --git a/libraries/mediaupload/impl/src/main/kotlin/io/element/android/libraries/mediaupload/impl/ThumbnailFactory.kt b/libraries/mediaupload/impl/src/main/kotlin/io/element/android/libraries/mediaupload/impl/ThumbnailFactory.kt index 7151836f17..123d59b029 100644 --- a/libraries/mediaupload/impl/src/main/kotlin/io/element/android/libraries/mediaupload/impl/ThumbnailFactory.kt +++ b/libraries/mediaupload/impl/src/main/kotlin/io/element/android/libraries/mediaupload/impl/ThumbnailFactory.kt @@ -123,8 +123,8 @@ class ThumbnailFactory @Inject constructor( val thumbnailResult = ThumbnailResult( file = thumbnailFile, info = ThumbnailInfo( - height = bitmapThumbnail.height.toLong(), width = bitmapThumbnail.width.toLong(), + height = bitmapThumbnail.height.toLong(), mimetype = mimeTypeToThumbnailMimeType(mimeType), size = thumbnailFile.length() ), diff --git a/libraries/mediaupload/impl/src/main/kotlin/io/element/android/libraries/mediaupload/impl/VideoCompressor.kt b/libraries/mediaupload/impl/src/main/kotlin/io/element/android/libraries/mediaupload/impl/VideoCompressor.kt index c21bd301ef..04bffd6c94 100644 --- a/libraries/mediaupload/impl/src/main/kotlin/io/element/android/libraries/mediaupload/impl/VideoCompressor.kt +++ b/libraries/mediaupload/impl/src/main/kotlin/io/element/android/libraries/mediaupload/impl/VideoCompressor.kt @@ -61,8 +61,8 @@ class VideoCompressor @Inject constructor( val width = metadata?.width ?: Int.MAX_VALUE val height = metadata?.height ?: Int.MAX_VALUE - val videoResizeEffect = videoCompressorConfig.videoCompressorHelper?.let { - val outputSize = it.getOutputSize(Size(width, height)) + val videoResizeEffect = run { + val outputSize = videoCompressorConfig.videoCompressorHelper.getOutputSize(Size(width, height)) if (metadata?.rotation == 90 || metadata?.rotation == 270) { // If the video is rotated, we need to swap width and height Presentation.createForWidthAndHeight( @@ -89,19 +89,14 @@ class VideoCompressor @Inject constructor( val inputMediaItem = MediaItem.fromUri(uri) val outputMediaItem = EditedMediaItem.Builder(inputMediaItem) .setFrameRate(newFrameRate) - .run { - if (videoResizeEffect != null) { - setEffects(Effects(emptyList(), listOf(videoResizeEffect))) - } else { - this - } - } + .setEffects(Effects(emptyList(), listOf(videoResizeEffect))) .build() val encoderFactory = DefaultEncoderFactory.Builder(context) .setRequestedVideoEncoderSettings( VideoEncoderSettings.Builder() - .setBitrateMode(MediaCodecInfo.EncoderCapabilities.BITRATE_MODE_CBR) + // Use VBR which is generally better for quality and compatibility, although slightly worse for file size + .setBitrateMode(MediaCodecInfo.EncoderCapabilities.BITRATE_MODE_VBR) .setBitrate(newBitrate) .build() ) diff --git a/libraries/mediaviewer/api/build.gradle.kts b/libraries/mediaviewer/api/build.gradle.kts index 1a0ce019c7..0f8aad9561 100644 --- a/libraries/mediaviewer/api/build.gradle.kts +++ b/libraries/mediaviewer/api/build.gradle.kts @@ -1,5 +1,3 @@ -import extension.setupAnvil - /* * Copyright 2023, 2024 New Vector Ltd. * @@ -15,8 +13,6 @@ android { namespace = "io.element.android.libraries.mediaviewer.api" } -setupAnvil() - dependencies { implementation(projects.libraries.core) implementation(projects.libraries.architecture) diff --git a/libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/gallery/root/MediaGalleryRootNode.kt b/libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/gallery/root/MediaGalleryRootNode.kt index f862788c30..5088616a18 100644 --- a/libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/gallery/root/MediaGalleryRootNode.kt +++ b/libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/gallery/root/MediaGalleryRootNode.kt @@ -97,9 +97,9 @@ class MediaGalleryRootNode @AssistedInject constructor( val mode = when (item) { is MediaItem.Audio, is MediaItem.Voice, - is MediaItem.File -> MediaViewerEntryPoint.MediaViewerMode.TimelineFilesAndAudios(Timeline.Mode.MEDIA) + is MediaItem.File -> MediaViewerEntryPoint.MediaViewerMode.TimelineFilesAndAudios(Timeline.Mode.Media) is MediaItem.Image, - is MediaItem.Video -> MediaViewerEntryPoint.MediaViewerMode.TimelineImagesAndVideos(Timeline.Mode.MEDIA) + is MediaItem.Video -> MediaViewerEntryPoint.MediaViewerMode.TimelineImagesAndVideos(Timeline.Mode.Media) } overlay.show( NavTarget.MediaViewer( diff --git a/libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/viewer/MediaViewerNode.kt b/libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/viewer/MediaViewerNode.kt index 2da3e1c3f2..c5bca59db7 100644 --- a/libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/viewer/MediaViewerNode.kt +++ b/libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/viewer/MediaViewerNode.kt @@ -82,8 +82,9 @@ class MediaViewerNode @AssistedInject constructor( } when (timelineMode) { null -> timelineMediaGalleryDataSource - Timeline.Mode.LIVE, - Timeline.Mode.FOCUSED_ON_EVENT -> { + Timeline.Mode.Live, + is Timeline.Mode.FocusedOnEvent, + is Timeline.Mode.Thread -> { // Does timelineMediaGalleryDataSource knows the eventId? val lastData = timelineMediaGalleryDataSource.getLastData().dataOrNull() val isEventKnown = lastData?.hasEvent(eventId) == true @@ -97,14 +98,14 @@ class MediaViewerNode @AssistedInject constructor( ) } } - Timeline.Mode.PINNED_EVENTS -> { + Timeline.Mode.PinnedEvents -> { focusedTimelineMediaGalleryDataSourceFactory.createFor( eventId = eventId, mediaItem = inputs.toMediaItem(), onlyPinnedEvents = true, ) } - Timeline.Mode.MEDIA -> timelineMediaGalleryDataSource + Timeline.Mode.Media -> timelineMediaGalleryDataSource } } } diff --git a/libraries/mediaviewer/impl/src/test/kotlin/io/element/android/libraries/mediaviewer/impl/viewer/MediaViewerDataSourceTest.kt b/libraries/mediaviewer/impl/src/test/kotlin/io/element/android/libraries/mediaviewer/impl/viewer/MediaViewerDataSourceTest.kt index 6eced261b1..43a37e8c4c 100644 --- a/libraries/mediaviewer/impl/src/test/kotlin/io/element/android/libraries/mediaviewer/impl/viewer/MediaViewerDataSourceTest.kt +++ b/libraries/mediaviewer/impl/src/test/kotlin/io/element/android/libraries/mediaviewer/impl/viewer/MediaViewerDataSourceTest.kt @@ -137,7 +137,7 @@ class MediaViewerDataSourceTest { fun `test dataFlow with data galleryMode image`() = runTest { val galleryDataSource = FakeMediaGalleryDataSource() val sut = createMediaViewerDataSource( - mode = MediaViewerMode.TimelineImagesAndVideos(timelineMode = Timeline.Mode.MEDIA), + mode = MediaViewerMode.TimelineImagesAndVideos(timelineMode = Timeline.Mode.Media), galleryDataSource = galleryDataSource, ) sut.dataFlow().test { @@ -159,7 +159,7 @@ class MediaViewerDataSourceTest { fun `test dataFlow with data galleryMode files`() = runTest { val galleryDataSource = FakeMediaGalleryDataSource() val sut = createMediaViewerDataSource( - mode = MediaViewerMode.TimelineFilesAndAudios(timelineMode = Timeline.Mode.MEDIA), + mode = MediaViewerMode.TimelineFilesAndAudios(timelineMode = Timeline.Mode.Media), galleryDataSource = galleryDataSource, ) sut.dataFlow().test { @@ -265,7 +265,7 @@ class MediaViewerDataSourceTest { } private fun TestScope.createMediaViewerDataSource( - mode: MediaViewerMode = MediaViewerMode.TimelineImagesAndVideos(timelineMode = Timeline.Mode.MEDIA), + mode: MediaViewerMode = MediaViewerMode.TimelineImagesAndVideos(timelineMode = Timeline.Mode.Media), galleryDataSource: MediaGalleryDataSource = FakeMediaGalleryDataSource(), mediaLoader: MatrixMediaLoader = FakeMatrixMediaLoader(), localMediaFactory: LocalMediaFactory = FakeLocalMediaFactory(mockMediaUrl), diff --git a/libraries/mediaviewer/impl/src/test/kotlin/io/element/android/libraries/mediaviewer/impl/viewer/MediaViewerPresenterTest.kt b/libraries/mediaviewer/impl/src/test/kotlin/io/element/android/libraries/mediaviewer/impl/viewer/MediaViewerPresenterTest.kt index a4f72aa474..e01eb53efb 100644 --- a/libraries/mediaviewer/impl/src/test/kotlin/io/element/android/libraries/mediaviewer/impl/viewer/MediaViewerPresenterTest.kt +++ b/libraries/mediaviewer/impl/src/test/kotlin/io/element/android/libraries/mediaviewer/impl/viewer/MediaViewerPresenterTest.kt @@ -528,7 +528,7 @@ class MediaViewerPresenterTest { @Test fun `present - snackbar displayed when there is no more items forward images and videos`() { `present - snackbar displayed when there is no more items forward`( - mode = MediaViewerEntryPoint.MediaViewerMode.TimelineImagesAndVideos(timelineMode = Timeline.Mode.MEDIA), + mode = MediaViewerEntryPoint.MediaViewerMode.TimelineImagesAndVideos(timelineMode = Timeline.Mode.Media), expectedSnackbarResId = R.string.screen_media_details_no_more_media_to_show, ) } @@ -536,7 +536,7 @@ class MediaViewerPresenterTest { @Test fun `present - snackbar displayed when there is no more items forward files and audio`() { `present - snackbar displayed when there is no more items forward`( - mode = MediaViewerEntryPoint.MediaViewerMode.TimelineFilesAndAudios(timelineMode = Timeline.Mode.MEDIA), + mode = MediaViewerEntryPoint.MediaViewerMode.TimelineFilesAndAudios(timelineMode = Timeline.Mode.Media), expectedSnackbarResId = R.string.screen_media_details_no_more_files_to_show, ) } @@ -599,7 +599,7 @@ class MediaViewerPresenterTest { @Test fun `present - snackbar displayed when there is no more items backward images and videos`() { `present - snackbar displayed when there is no more items backward`( - mode = MediaViewerEntryPoint.MediaViewerMode.TimelineImagesAndVideos(timelineMode = Timeline.Mode.MEDIA), + mode = MediaViewerEntryPoint.MediaViewerMode.TimelineImagesAndVideos(timelineMode = Timeline.Mode.Media), expectedSnackbarResId = R.string.screen_media_details_no_more_media_to_show, ) } @@ -607,7 +607,7 @@ class MediaViewerPresenterTest { @Test fun `present - snackbar displayed when there is no more items backward files and audio`() { `present - snackbar displayed when there is no more items backward`( - mode = MediaViewerEntryPoint.MediaViewerMode.TimelineFilesAndAudios(timelineMode = Timeline.Mode.MEDIA), + mode = MediaViewerEntryPoint.MediaViewerMode.TimelineFilesAndAudios(timelineMode = Timeline.Mode.Media), expectedSnackbarResId = R.string.screen_media_details_no_more_files_to_show, ) } diff --git a/libraries/permissions/impl/build.gradle.kts b/libraries/permissions/impl/build.gradle.kts index 2b38e54ef8..347032c65e 100644 --- a/libraries/permissions/impl/build.gradle.kts +++ b/libraries/permissions/impl/build.gradle.kts @@ -35,6 +35,7 @@ dependencies { implementation(projects.libraries.troubleshoot.api) implementation(projects.libraries.designsystem) implementation(projects.libraries.uiStrings) + implementation(projects.libraries.preferences.api) implementation(projects.services.toolbox.api) api(projects.libraries.permissions.api) diff --git a/libraries/permissions/impl/src/main/kotlin/io/element/android/libraries/permissions/impl/DefaultPermissionsStore.kt b/libraries/permissions/impl/src/main/kotlin/io/element/android/libraries/permissions/impl/DefaultPermissionsStore.kt index ae9eee76e9..4d55e6b9f9 100644 --- a/libraries/permissions/impl/src/main/kotlin/io/element/android/libraries/permissions/impl/DefaultPermissionsStore.kt +++ b/libraries/permissions/impl/src/main/kotlin/io/element/android/libraries/permissions/impl/DefaultPermissionsStore.kt @@ -7,28 +7,22 @@ package io.element.android.libraries.permissions.impl -import android.content.Context -import androidx.datastore.core.DataStore -import androidx.datastore.preferences.core.Preferences import androidx.datastore.preferences.core.booleanPreferencesKey import androidx.datastore.preferences.core.edit -import androidx.datastore.preferences.preferencesDataStore import com.squareup.anvil.annotations.ContributesBinding import io.element.android.libraries.core.bool.orFalse import io.element.android.libraries.di.AppScope -import io.element.android.libraries.di.ApplicationContext import io.element.android.libraries.permissions.api.PermissionsStore +import io.element.android.libraries.preferences.api.store.PreferenceDataStoreFactory import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.map import javax.inject.Inject -private val Context.dataStore: DataStore by preferencesDataStore(name = "permissions_store") - @ContributesBinding(AppScope::class) class DefaultPermissionsStore @Inject constructor( - @ApplicationContext private val context: Context, + preferenceDataStoreFactory: PreferenceDataStoreFactory, ) : PermissionsStore { - private val store = context.dataStore + private val store = preferenceDataStoreFactory.create("permissions_store") override suspend fun setPermissionDenied(permission: String, value: Boolean) { store.edit { prefs -> diff --git a/libraries/preferences/impl/src/main/kotlin/io/element/android/libraries/preferences/impl/store/DefaultAppPreferencesStore.kt b/libraries/preferences/impl/src/main/kotlin/io/element/android/libraries/preferences/impl/store/DefaultAppPreferencesStore.kt index 0dff16ff98..453b1304f3 100644 --- a/libraries/preferences/impl/src/main/kotlin/io/element/android/libraries/preferences/impl/store/DefaultAppPreferencesStore.kt +++ b/libraries/preferences/impl/src/main/kotlin/io/element/android/libraries/preferences/impl/store/DefaultAppPreferencesStore.kt @@ -7,28 +7,22 @@ package io.element.android.libraries.preferences.impl.store -import android.content.Context -import androidx.datastore.core.DataStore -import androidx.datastore.preferences.core.Preferences import androidx.datastore.preferences.core.booleanPreferencesKey import androidx.datastore.preferences.core.edit import androidx.datastore.preferences.core.stringPreferencesKey -import androidx.datastore.preferences.preferencesDataStore import com.squareup.anvil.annotations.ContributesBinding import io.element.android.libraries.core.meta.BuildMeta import io.element.android.libraries.core.meta.BuildType import io.element.android.libraries.di.AppScope -import io.element.android.libraries.di.ApplicationContext import io.element.android.libraries.matrix.api.media.MediaPreviewValue import io.element.android.libraries.matrix.api.tracing.LogLevel import io.element.android.libraries.matrix.api.tracing.TraceLogPack import io.element.android.libraries.preferences.api.store.AppPreferencesStore +import io.element.android.libraries.preferences.api.store.PreferenceDataStoreFactory import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.map import javax.inject.Inject -private val Context.dataStore: DataStore by preferencesDataStore(name = "elementx_preferences") - private val developerModeKey = booleanPreferencesKey("developerMode") private val customElementCallBaseUrlKey = stringPreferencesKey("elementCallBaseUrl") private val themeKey = stringPreferencesKey("theme") @@ -39,10 +33,10 @@ private val traceLogPacksKey = stringPreferencesKey("traceLogPacks") @ContributesBinding(AppScope::class) class DefaultAppPreferencesStore @Inject constructor( - @ApplicationContext context: Context, private val buildMeta: BuildMeta, + preferenceDataStoreFactory: PreferenceDataStoreFactory, ) : AppPreferencesStore { - private val store = context.dataStore + private val store = preferenceDataStoreFactory.create("elementx_preferences") override suspend fun setDeveloperModeEnabled(enabled: Boolean) { store.edit { prefs -> diff --git a/libraries/preferences/impl/src/main/kotlin/io/element/android/libraries/preferences/impl/store/DefaultPreferencesDataStoreFactory.kt b/libraries/preferences/impl/src/main/kotlin/io/element/android/libraries/preferences/impl/store/DefaultPreferencesDataStoreFactory.kt index 648f82b9bd..f2631e4a3a 100644 --- a/libraries/preferences/impl/src/main/kotlin/io/element/android/libraries/preferences/impl/store/DefaultPreferencesDataStoreFactory.kt +++ b/libraries/preferences/impl/src/main/kotlin/io/element/android/libraries/preferences/impl/store/DefaultPreferencesDataStoreFactory.kt @@ -12,20 +12,33 @@ import androidx.datastore.core.DataStore import androidx.datastore.preferences.core.Preferences import androidx.datastore.preferences.preferencesDataStore import com.squareup.anvil.annotations.ContributesBinding +import io.element.android.libraries.androidutils.preferences.DefaultPreferencesCorruptionHandlerFactory import io.element.android.libraries.di.AppScope import io.element.android.libraries.di.ApplicationContext +import io.element.android.libraries.di.SingleIn import io.element.android.libraries.preferences.api.store.PreferenceDataStoreFactory +import java.util.concurrent.ConcurrentHashMap import javax.inject.Inject +@SingleIn(AppScope::class) @ContributesBinding(AppScope::class) class DefaultPreferencesDataStoreFactory @Inject constructor( @ApplicationContext private val context: Context, ) : PreferenceDataStoreFactory { + private val dataStoreHolders = ConcurrentHashMap() + private class DataStoreHolder(name: String) { - val Context.dataStore: DataStore by preferencesDataStore(name = name) + val Context.dataStore: DataStore by preferencesDataStore( + name = name, + corruptionHandler = DefaultPreferencesCorruptionHandlerFactory.replaceWithEmpty(), + ) } + override fun create(name: String): DataStore { - return with(DataStoreHolder(name)) { + val holder = dataStoreHolders.getOrPut(name) { + DataStoreHolder(name) + } + return with(holder) { context.dataStore } } diff --git a/libraries/push/api/build.gradle.kts b/libraries/push/api/build.gradle.kts index 481b9e1d2b..48df34053a 100644 --- a/libraries/push/api/build.gradle.kts +++ b/libraries/push/api/build.gradle.kts @@ -17,5 +17,6 @@ dependencies { implementation(libs.coroutines.core) implementation(libs.coil.compose) implementation(projects.libraries.matrix.api) + implementation(projects.libraries.matrixui) 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 index 541e7ae2e7..d0fa4c418a 100644 --- 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 @@ -10,14 +10,20 @@ package io.element.android.libraries.push.api.notifications import android.graphics.Bitmap import androidx.core.graphics.drawable.IconCompat import coil3.ImageLoader +import io.element.android.libraries.matrix.ui.media.AVATAR_THUMBNAIL_SIZE_IN_PIXEL interface NotificationBitmapLoader { /** * Get icon of a room. * @param path mxc url * @param imageLoader Coil image loader + * @param targetSize The size we want the bitmap to be resized to */ - suspend fun getRoomBitmap(path: String?, imageLoader: ImageLoader): Bitmap? + suspend fun getRoomBitmap( + path: String?, + imageLoader: ImageLoader, + targetSize: Long = AVATAR_THUMBNAIL_SIZE_IN_PIXEL, + ): Bitmap? /** * Get icon of a user. diff --git a/libraries/push/api/src/main/kotlin/io/element/android/libraries/push/api/notifications/conversations/NotificationConversationService.kt b/libraries/push/api/src/main/kotlin/io/element/android/libraries/push/api/notifications/conversations/NotificationConversationService.kt new file mode 100644 index 0000000000..586aea0fae --- /dev/null +++ b/libraries/push/api/src/main/kotlin/io/element/android/libraries/push/api/notifications/conversations/NotificationConversationService.kt @@ -0,0 +1,40 @@ +/* + * Copyright 2025 New Vector Ltd. + * + * SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial + * Please see LICENSE files in the repository root for full details. + */ + +package io.element.android.libraries.push.api.notifications.conversations + +import io.element.android.libraries.matrix.api.core.RoomId +import io.element.android.libraries.matrix.api.core.SessionId + +/** + * Service to handle conversation-related notifications. + */ +interface NotificationConversationService { + /** + * Called when a new message is received in a room. + * It should create a new conversation shortcut for this room. + */ + suspend fun onSendMessage( + sessionId: SessionId, + roomId: RoomId, + roomName: String, + roomIsDirect: Boolean, + roomAvatarUrl: String?, + ) + + /** + * Called when a room is left. + * It should remove the conversation shortcut for this room. + */ + suspend fun onLeftRoom(sessionId: SessionId, roomId: RoomId) + + /** + * Called when the list of available rooms changes. + * It should update the conversation shortcuts accordingly, removing shortcuts for no longer joined rooms. + */ + suspend fun onAvailableRoomsChanged(sessionId: SessionId, roomIds: Set) +} diff --git a/libraries/push/impl/build.gradle.kts b/libraries/push/impl/build.gradle.kts index dbf3bbcf5a..d256666156 100644 --- a/libraries/push/impl/build.gradle.kts +++ b/libraries/push/impl/build.gradle.kts @@ -54,6 +54,7 @@ dependencies { implementation(projects.libraries.uiStrings) implementation(projects.libraries.troubleshoot.api) implementation(projects.features.call.api) + implementation(projects.features.lockscreen.api) implementation(projects.libraries.featureflag.api) api(projects.libraries.pushproviders.api) api(projects.libraries.pushstore.api) @@ -78,6 +79,7 @@ dependencies { testImplementation(projects.libraries.pushstore.test) testImplementation(projects.tests.testutils) testImplementation(projects.features.call.test) + testImplementation(projects.features.lockscreen.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/DefaultNotificationBitmapLoader.kt b/libraries/push/impl/src/main/kotlin/io/element/android/libraries/push/impl/notifications/DefaultNotificationBitmapLoader.kt index 7aef28df67..d7d02f765c 100644 --- a/libraries/push/impl/src/main/kotlin/io/element/android/libraries/push/impl/notifications/DefaultNotificationBitmapLoader.kt +++ b/libraries/push/impl/src/main/kotlin/io/element/android/libraries/push/impl/notifications/DefaultNotificationBitmapLoader.kt @@ -32,22 +32,17 @@ 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 - */ - override suspend fun getRoomBitmap(path: String?, imageLoader: ImageLoader): Bitmap? { + override suspend fun getRoomBitmap(path: String?, imageLoader: ImageLoader, targetSize: Long): Bitmap? { if (path == null) { return null } - return loadRoomBitmap(path, imageLoader) + return loadRoomBitmap(path, imageLoader, targetSize) } - private suspend fun loadRoomBitmap(path: String, imageLoader: ImageLoader): Bitmap? { + private suspend fun loadRoomBitmap(path: String, imageLoader: ImageLoader, targetSize: Long): Bitmap? { return try { val imageRequest = ImageRequest.Builder(context) - .data(MediaRequestData(MediaSource(path), MediaRequestData.Kind.Thumbnail(AVATAR_THUMBNAIL_SIZE_IN_PIXEL))) + .data(MediaRequestData(MediaSource(path), MediaRequestData.Kind.Thumbnail(targetSize))) .transformations(CircleCropTransformation()) .build() val result = imageLoader.execute(imageRequest) @@ -58,12 +53,6 @@ class DefaultNotificationBitmapLoader @Inject constructor( } } - /** - * 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 - */ 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/conversations/DefaultNotificationConversationService.kt b/libraries/push/impl/src/main/kotlin/io/element/android/libraries/push/impl/notifications/conversations/DefaultNotificationConversationService.kt new file mode 100644 index 0000000000..9fbb67c08c --- /dev/null +++ b/libraries/push/impl/src/main/kotlin/io/element/android/libraries/push/impl/notifications/conversations/DefaultNotificationConversationService.kt @@ -0,0 +1,197 @@ +/* + * Copyright 2025 New Vector Ltd. + * + * SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial + * Please see LICENSE files in the repository root for full details. + */ + +package io.element.android.libraries.push.impl.notifications.conversations + +import android.content.Context +import android.content.pm.ShortcutInfo +import android.content.res.Configuration +import android.os.Build +import androidx.core.content.pm.ShortcutInfoCompat +import androidx.core.content.pm.ShortcutManagerCompat +import androidx.core.graphics.drawable.IconCompat +import com.squareup.anvil.annotations.ContributesBinding +import io.element.android.features.lockscreen.api.LockScreenService +import io.element.android.libraries.core.coroutine.withPreviousValue +import io.element.android.libraries.core.extensions.runCatchingExceptions +import io.element.android.libraries.designsystem.components.avatar.AvatarData +import io.element.android.libraries.designsystem.components.avatar.AvatarSize +import io.element.android.libraries.di.AppScope +import io.element.android.libraries.di.ApplicationContext +import io.element.android.libraries.di.SingleIn +import io.element.android.libraries.di.annotations.AppCoroutineScope +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.matrix.ui.media.ImageLoaderHolder +import io.element.android.libraries.matrix.ui.media.InitialsAvatarBitmapGenerator +import io.element.android.libraries.push.api.notifications.NotificationBitmapLoader +import io.element.android.libraries.push.api.notifications.conversations.NotificationConversationService +import io.element.android.libraries.push.impl.intent.IntentProvider +import io.element.android.libraries.sessionstorage.api.observer.SessionListener +import io.element.android.libraries.sessionstorage.api.observer.SessionObserver +import io.element.android.libraries.ui.strings.CommonStrings +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.flow.first +import kotlinx.coroutines.flow.launchIn +import kotlinx.coroutines.flow.onEach +import timber.log.Timber +import javax.inject.Inject + +@SingleIn(AppScope::class) +@ContributesBinding(AppScope::class) +class DefaultNotificationConversationService @Inject constructor( + @ApplicationContext private val context: Context, + private val intentProvider: IntentProvider, + private val bitmapLoader: NotificationBitmapLoader, + private val matrixClientProvider: MatrixClientProvider, + private val imageLoaderHolder: ImageLoaderHolder, + private val lockScreenService: LockScreenService, + sessionObserver: SessionObserver, + @AppCoroutineScope private val coroutineScope: CoroutineScope, +) : NotificationConversationService { + private val isRequestPinShortcutSupported = ShortcutManagerCompat.isRequestPinShortcutSupported(context) + + init { + sessionObserver.addListener(object : SessionListener { + override suspend fun onSessionCreated(userId: String) = Unit + + override suspend fun onSessionDeleted(userId: String) { + onSessionLogOut(SessionId(userId)) + } + }) + + lockScreenService.isPinSetup() + .withPreviousValue() + .onEach { (hadPinCode, hasPinCode) -> + if (hadPinCode == false && hasPinCode) { + clearShortcuts() + } + } + .launchIn(coroutineScope) + } + + override suspend fun onSendMessage( + sessionId: SessionId, + roomId: RoomId, + roomName: String, + roomIsDirect: Boolean, + roomAvatarUrl: String?, + ) { + if (lockScreenService.isPinSetup().first()) { + // We don't create shortcuts when a pin code is set for privacy reasons + return + } + + val categories = setOfNotNull( + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N_MR1) ShortcutInfo.SHORTCUT_CATEGORY_CONVERSATION else null + ) + + val client = matrixClientProvider.getOrRestore(sessionId).getOrNull() ?: return + val imageLoader = imageLoaderHolder.get(client) + + val defaultShortcutIconSize = ShortcutManagerCompat.getIconMaxWidth(context) + val useDarkTheme = context.resources.configuration.uiMode and Configuration.UI_MODE_NIGHT_MASK == Configuration.UI_MODE_NIGHT_YES + val icon = bitmapLoader.getRoomBitmap( + path = roomAvatarUrl, + imageLoader = imageLoader, + targetSize = defaultShortcutIconSize.toLong() + )?.let(IconCompat::createWithBitmap) + ?: InitialsAvatarBitmapGenerator(useDarkTheme = useDarkTheme) + .generateBitmap(defaultShortcutIconSize, AvatarData(id = roomId.value, name = roomName, size = AvatarSize.RoomHeader)) + ?.let(IconCompat::createWithAdaptiveBitmap) + + val shortcutInfo = ShortcutInfoCompat.Builder(context, "$sessionId-$roomId") + .setShortLabel(roomName) + .setIcon(icon) + .setIntent(intentProvider.getViewRoomIntent(sessionId, roomId, threadId = null)) + .setCategories(categories) + .setLongLived(true) + .let { + when (roomIsDirect) { + true -> it.addCapabilityBinding("actions.intent.SEND_MESSAGE") + false -> it.addCapabilityBinding("actions.intent.SEND_MESSAGE", "message.recipient.@type", listOf("Audience")) + } + } + .build() + + runCatchingExceptions { ShortcutManagerCompat.pushDynamicShortcut(context, shortcutInfo) } + .onFailure { + Timber.e(it, "Failed to create shortcut for room $roomId in session $sessionId") + } + } + + override suspend fun onLeftRoom(sessionId: SessionId, roomId: RoomId) { + val shortcutsToRemove = listOf("$sessionId-$roomId") + runCatchingExceptions { + ShortcutManagerCompat.removeDynamicShortcuts(context, shortcutsToRemove) + if (isRequestPinShortcutSupported) { + ShortcutManagerCompat.disableShortcuts( + context, + shortcutsToRemove, + context.getString(CommonStrings.common_android_shortcuts_remove_reason_left_room) + ) + } + }.onFailure { + Timber.e(it, "Failed to remove shortcut for room $roomId in session $sessionId") + } + } + + override suspend fun onAvailableRoomsChanged(sessionId: SessionId, roomIds: Set) { + runCatchingExceptions { + val shortcuts = ShortcutManagerCompat.getDynamicShortcuts(context) + + val shortcutsToRemove = mutableListOf() + shortcuts.filter { it.id.startsWith(sessionId.value) } + .forEach { shortcut -> + val roomId = RoomId(shortcut.id.removePrefix("$sessionId-")) + if (!roomIds.contains(roomId)) { + shortcutsToRemove.add(shortcut.id) + } + } + + if (shortcutsToRemove.isNotEmpty()) { + ShortcutManagerCompat.removeDynamicShortcuts(context, shortcutsToRemove) + if (isRequestPinShortcutSupported) { + ShortcutManagerCompat.disableShortcuts( + context, + shortcutsToRemove, + context.getString(CommonStrings.common_android_shortcuts_remove_reason_left_room) + ) + } + } + }.onFailure { + Timber.e(it, "Failed to remove shortcuts for session $sessionId") + } + } + + private fun clearShortcuts() { + runCatchingExceptions { + ShortcutManagerCompat.removeAllDynamicShortcuts(context) + }.onFailure { + Timber.e(it, "Failed to clear all shortcuts") + } + } + + private fun onSessionLogOut(sessionId: SessionId) { + runCatchingExceptions { + val shortcuts = ShortcutManagerCompat.getDynamicShortcuts(context) + val shortcutIdsToRemove = shortcuts.filter { it.id.startsWith(sessionId.value) }.map { it.id } + ShortcutManagerCompat.removeDynamicShortcuts(context, shortcutIdsToRemove) + + if (isRequestPinShortcutSupported) { + ShortcutManagerCompat.disableShortcuts( + context, + shortcutIdsToRemove, + context.getString(CommonStrings.common_android_shortcuts_remove_reason_session_logged_out) + ) + } + }.onFailure { + Timber.e(it, "Failed to remove shortcuts for session $sessionId after logout") + } + } +} diff --git a/libraries/push/impl/src/main/kotlin/io/element/android/libraries/push/impl/store/DefaultPushDataStore.kt b/libraries/push/impl/src/main/kotlin/io/element/android/libraries/push/impl/store/DefaultPushDataStore.kt index a4d9413cb1..2f67e04b3d 100644 --- a/libraries/push/impl/src/main/kotlin/io/element/android/libraries/push/impl/store/DefaultPushDataStore.kt +++ b/libraries/push/impl/src/main/kotlin/io/element/android/libraries/push/impl/store/DefaultPushDataStore.kt @@ -7,12 +7,8 @@ package io.element.android.libraries.push.impl.store -import android.content.Context -import androidx.datastore.core.DataStore -import androidx.datastore.preferences.core.Preferences import androidx.datastore.preferences.core.edit import androidx.datastore.preferences.core.intPreferencesKey -import androidx.datastore.preferences.preferencesDataStore import app.cash.sqldelight.coroutines.asFlow import app.cash.sqldelight.coroutines.mapToList import com.squareup.anvil.annotations.ContributesBinding @@ -20,29 +16,30 @@ import io.element.android.libraries.core.coroutine.CoroutineDispatchers import io.element.android.libraries.dateformatter.api.DateFormatter import io.element.android.libraries.dateformatter.api.DateFormatterMode import io.element.android.libraries.di.AppScope -import io.element.android.libraries.di.ApplicationContext -import io.element.android.libraries.di.SingleIn 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.preferences.api.store.PreferenceDataStoreFactory import io.element.android.libraries.push.api.history.PushHistoryItem import io.element.android.libraries.push.impl.PushDatabase +import io.element.android.libraries.push.impl.store.DefaultPushDataStore.Companion.BATTERY_OPTIMIZATION_BANNER_STATE_DISMISSED +import io.element.android.libraries.push.impl.store.DefaultPushDataStore.Companion.BATTERY_OPTIMIZATION_BANNER_STATE_INIT +import io.element.android.libraries.push.impl.store.DefaultPushDataStore.Companion.BATTERY_OPTIMIZATION_BANNER_STATE_SHOW import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.map import javax.inject.Inject -private val Context.dataStore: DataStore by preferencesDataStore(name = "push_store") - -@SingleIn(AppScope::class) @ContributesBinding(AppScope::class) class DefaultPushDataStore @Inject constructor( - @ApplicationContext private val context: Context, private val pushDatabase: PushDatabase, private val dateFormatter: DateFormatter, private val dispatchers: CoroutineDispatchers, + preferencesFactory: PreferenceDataStoreFactory, ) : PushDataStore { private val pushCounter = intPreferencesKey("push_counter") + private val dataStore = preferencesFactory.create("push_store") + /** * Integer preference to track the state of the battery optimization banner. * Possible values: @@ -52,24 +49,24 @@ class DefaultPushDataStore @Inject constructor( */ private val batteryOptimizationBannerState = intPreferencesKey("battery_optimization_banner_state") - override val pushCounterFlow: Flow = context.dataStore.data.map { preferences -> + override val pushCounterFlow: Flow = dataStore.data.map { preferences -> preferences[pushCounter] ?: 0 } @Suppress("UnnecessaryParentheses") - override val shouldDisplayBatteryOptimizationBannerFlow: Flow = context.dataStore.data.map { preferences -> + override val shouldDisplayBatteryOptimizationBannerFlow: Flow = dataStore.data.map { preferences -> (preferences[batteryOptimizationBannerState] ?: BATTERY_OPTIMIZATION_BANNER_STATE_INIT) == BATTERY_OPTIMIZATION_BANNER_STATE_SHOW } suspend fun incrementPushCounter() { - context.dataStore.edit { settings -> + dataStore.edit { settings -> val currentCounterValue = settings[pushCounter] ?: 0 settings[pushCounter] = currentCounterValue + 1 } } suspend fun setBatteryOptimizationBannerState(newState: Int) { - context.dataStore.edit { settings -> + dataStore.edit { settings -> val currentValue = settings[batteryOptimizationBannerState] ?: BATTERY_OPTIMIZATION_BANNER_STATE_INIT settings[batteryOptimizationBannerState] = when (currentValue) { BATTERY_OPTIMIZATION_BANNER_STATE_INIT, @@ -106,7 +103,7 @@ class DefaultPushDataStore @Inject constructor( override suspend fun reset() { pushDatabase.pushHistoryQueries.removeAll() - context.dataStore.edit { + dataStore.edit { it.clear() } } diff --git a/libraries/push/impl/src/main/res/values-fa/translations.xml b/libraries/push/impl/src/main/res/values-fa/translations.xml index fd1a064ba6..f36ff36e98 100644 --- a/libraries/push/impl/src/main/res/values-fa/translations.xml +++ b/libraries/push/impl/src/main/res/values-fa/translations.xml @@ -5,15 +5,31 @@ "اعلان‌های پرصدا" "زنگ خوردن تماس" "اعلان‌های صامت" + + "%1$s:%2$d پیام" + "%1$s:%2$d پیام‌" + + + "%dاعلان" + "%dاعلان‌" + "پیام‌های جدیدی دارید." "📹 تماس ورودی" "**‌شکست در فرستادن - لطفاً اتاق را بگشایید" "پیوستن" "رد کردن" + + "%d دعوت" + "%d دعوت" + "به گپ دعوتتان کرد" "%1$s به گپ دعوتتان کرد" "به شما اشاره کرد: %1$s" "پیام جدید" + + "%d پیام جدید" + "%d پیام جدید" + "با %1$s واکنش داد" "علامت‌گذاری به عنوان خوانده شده" "پاسخ سریع" @@ -24,9 +40,17 @@ "دارید آگاهی را مشاهده می‌کنید! کلیک کنید!" "%1$s: %2$s" "%1$s: %2$s %3$s" + + "%d پیام اعلان نشده" + "%d پیام اعلان نشده" + "%1$s و %2$s" "%1$s در %2$s" "%1$s در %2$s و %3$s" + + "%d اتاق" + "%d اتاق" + "همگام سازی پس‌زمینه" "خدمات گوگل" "خدمت پلی گوگل معتبری پیدا نشد. ممکن است آگاهی‌ها به درستی کار نکنند." diff --git a/libraries/push/impl/src/main/res/values-ur/translations.xml b/libraries/push/impl/src/main/res/values-ur/translations.xml index adcf03099b..40a54ab313 100644 --- a/libraries/push/impl/src/main/res/values-ur/translations.xml +++ b/libraries/push/impl/src/main/res/values-ur/translations.xml @@ -13,6 +13,7 @@ "%d اطلاع" "%d اطلاعات" + "آپ کے لیے نئے پیغامات ہیں۔" "📹 آنے والا مکالمہ" "** بھیجنے میں ناکام - براہ کرم کمرہ کھولیں" "شامل ہوں" @@ -22,6 +23,7 @@ "%d دعوت نامے" "آپ کو گفتگو کیلئے مدعو کیا" + "%1$s نے آپ کو چیٹ کے لیے مدعو کیا" "آپ کا تذکرہ کیا: %1$s" "نئے پیغامات" @@ -32,7 +34,9 @@ "بطور مقروءہ نشانزد کریں" "فوری جواب" "آپ کو کمرے میں شامل ہونے کی دعوت دی" + "%1$s نے آپ کو روم میں شامل ہونے کی دعوت دی" "میں" + "%1$s نے ذکر کیا یا جواب دیا" "آپ اطلاع دیکھ رہے ہیں! مجھے دبائیں!" "%1$s: %2$s" "%1$s: %2$s %3$s" diff --git a/libraries/push/impl/src/main/res/values-uz/translations.xml b/libraries/push/impl/src/main/res/values-uz/translations.xml index 486b668b3e..dd6797660d 100644 --- a/libraries/push/impl/src/main/res/values-uz/translations.xml +++ b/libraries/push/impl/src/main/res/values-uz/translations.xml @@ -12,8 +12,10 @@ "%dbildirishnoma" "%dbildirishnomalar" + "Sizda yangi xabarlar bor." "** Yuborilmadi - iltimos, xonani oching" "Qo\'shilish" + "Rad etish" "%dtaklifnoma" "%dtaklifnomalar" diff --git a/libraries/push/impl/src/main/res/values-zh-rTW/translations.xml b/libraries/push/impl/src/main/res/values-zh-rTW/translations.xml index 61178f6112..91a73c678f 100644 --- a/libraries/push/impl/src/main/res/values-zh-rTW/translations.xml +++ b/libraries/push/impl/src/main/res/values-zh-rTW/translations.xml @@ -11,6 +11,7 @@ "%d 個通知" + "您有新訊息。" "📹 來電" "** 無法傳送,請開啟聊天室" "加入" diff --git a/libraries/push/impl/src/main/res/values-zh/translations.xml b/libraries/push/impl/src/main/res/values-zh/translations.xml index 94d156396a..677551bb0c 100644 --- a/libraries/push/impl/src/main/res/values-zh/translations.xml +++ b/libraries/push/impl/src/main/res/values-zh/translations.xml @@ -56,6 +56,7 @@ "找到了 %1$d 个推送提供者:%2$s" + "该应用程序支持:%1$s" "检测推送提供者" "检查应用程序是否可以显示通知。" "通知未被点击。" diff --git a/libraries/push/impl/src/test/kotlin/io/element/android/libraries/push/impl/notifications/conversations/DefaultNotificationConversationServiceTest.kt b/libraries/push/impl/src/test/kotlin/io/element/android/libraries/push/impl/notifications/conversations/DefaultNotificationConversationServiceTest.kt new file mode 100644 index 0000000000..92adfd7812 --- /dev/null +++ b/libraries/push/impl/src/test/kotlin/io/element/android/libraries/push/impl/notifications/conversations/DefaultNotificationConversationServiceTest.kt @@ -0,0 +1,190 @@ +/* + * Copyright 2025 New Vector Ltd. + * + * SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial + * Please see LICENSE files in the repository root for full details. + */ + +package io.element.android.libraries.push.impl.notifications.conversations + +import android.content.Context +import android.content.Intent +import android.os.Build +import androidx.core.content.pm.ShortcutInfoCompat +import androidx.core.content.pm.ShortcutManagerCompat +import androidx.test.platform.app.InstrumentationRegistry +import com.google.common.truth.Truth.assertThat +import io.element.android.features.lockscreen.test.FakeLockScreenService +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.matrix.test.FakeMatrixClientProvider +import io.element.android.libraries.push.impl.notifications.factories.FakeIntentProvider +import io.element.android.libraries.push.test.notifications.FakeImageLoaderHolder +import io.element.android.libraries.push.test.notifications.push.FakeNotificationBitmapLoader +import io.element.android.libraries.sessionstorage.test.observer.FakeSessionObserver +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 +import org.robolectric.annotation.Config + +@RunWith(RobolectricTestRunner::class) +@Config(sdk = [Build.VERSION_CODES.TIRAMISU]) +class DefaultNotificationConversationServiceTest { + @Test + fun `onSendMessage adds a shortcut`() = runTest { + val context = InstrumentationRegistry.getInstrumentation().context + val service = createService(context) + + service.onSendMessage( + sessionId = A_SESSION_ID, + roomId = A_ROOM_ID, + roomName = "Room title", + roomIsDirect = false, + roomAvatarUrl = null, + ) + + val shortcuts = ShortcutManagerCompat.getDynamicShortcuts(context) + assertThat(shortcuts).isNotEmpty() + } + + @Test + fun `onLeftRoom removes a shortcut`() = runTest { + val context = InstrumentationRegistry.getInstrumentation().context + val service = createService(context) + + val shortcutId = "$A_SESSION_ID-$A_ROOM_ID" + val shortcutInfo = ShortcutInfoCompat.Builder(context, shortcutId) + .setShortLabel("Room title") + .setIntent(Intent(Intent.ACTION_VIEW)) + .build() + + // First we add the shortcut + ShortcutManagerCompat.pushDynamicShortcut(context, shortcutInfo) + + assertThat(ShortcutManagerCompat.getDynamicShortcuts(context).firstOrNull()?.id).isEqualTo(shortcutId) + + service.onLeftRoom( + sessionId = A_SESSION_ID, + roomId = A_ROOM_ID, + ) + + // Then we check it's removed + val shortcuts = ShortcutManagerCompat.getDynamicShortcuts(context) + assertThat(shortcuts).isEmpty() + } + + @Test + fun `onAvailableRoomsChanged keeps only the available rooms as shortcuts`() = runTest { + val context = InstrumentationRegistry.getInstrumentation().context + val service = createService(context) + + // We add a couple of shortcuts + val shortcutInfoA = ShortcutInfoCompat.Builder(context, "$A_SESSION_ID-$A_ROOM_ID") + .setShortLabel("Room title") + .setIntent(Intent(Intent.ACTION_VIEW)) + .build() + val shortcutInfoB = ShortcutInfoCompat.Builder(context, "$A_SESSION_ID-$A_ROOM_ID_2") + .setShortLabel("Room title") + .setIntent(Intent(Intent.ACTION_VIEW)) + .build() + ShortcutManagerCompat.setDynamicShortcuts(context, listOf(shortcutInfoA, shortcutInfoB)) + + assertThat(ShortcutManagerCompat.getDynamicShortcuts(context)).hasSize(2) + + service.onAvailableRoomsChanged( + sessionId = A_SESSION_ID, + roomIds = setOf(A_ROOM_ID), + ) + + // Then we check only the shortcuts for the matching rooms remain + val shortcuts = ShortcutManagerCompat.getDynamicShortcuts(context) + assertThat(shortcuts).hasSize(1) + assertThat(shortcuts.first().id).isEqualTo("$A_SESSION_ID-$A_ROOM_ID") + } + + @OptIn(ExperimentalCoroutinesApi::class) + @Test + fun `on pin code enabled, all shortcuts are cleared`() = runTest { + val context = InstrumentationRegistry.getInstrumentation().context + val lockScreenService = FakeLockScreenService() + createService(context, lockScreenService = lockScreenService) + + // Make sure the pin is disabled + lockScreenService.setIsPinSetup(false) + // Give the test some time to save the pin setup value + runCurrent() + + // We add a couple of shortcuts from different sessions + val shortcutInfoA = ShortcutInfoCompat.Builder(context, "$A_SESSION_ID-$A_ROOM_ID") + .setShortLabel("Room title") + .setIntent(Intent(Intent.ACTION_VIEW)) + .build() + val shortcutInfoB = ShortcutInfoCompat.Builder(context, "$A_SESSION_ID_2-$A_ROOM_ID_2") + .setShortLabel("Room title") + .setIntent(Intent(Intent.ACTION_VIEW)) + .build() + ShortcutManagerCompat.setDynamicShortcuts(context, listOf(shortcutInfoA, shortcutInfoB)) + assertThat(ShortcutManagerCompat.getDynamicShortcuts(context)).hasSize(2) + + // Enable the pin code + lockScreenService.setIsPinSetup(true) + // Give the test some time to save the new pin setup value + runCurrent() + + // Then we check there are no shortcuts left from any session + val shortcuts = ShortcutManagerCompat.getDynamicShortcuts(context) + assertThat(shortcuts).isEmpty() + } + + @Test + fun `on session logged out, all shortcuts for the session are cleared`() = runTest { + val context = InstrumentationRegistry.getInstrumentation().context + val sessionObserver = FakeSessionObserver() + createService(context, sessionObserver = sessionObserver) + + // Set the initial session state + sessionObserver.onSessionCreated(A_SESSION_ID.value) + sessionObserver.onSessionCreated(A_SESSION_ID_2.value) + + // We add a couple of shortcuts from different sessions + val shortcutInfoA = ShortcutInfoCompat.Builder(context, "$A_SESSION_ID-$A_ROOM_ID") + .setShortLabel("Room title") + .setIntent(Intent(Intent.ACTION_VIEW)) + .build() + val shortcutInfoB = ShortcutInfoCompat.Builder(context, "$A_SESSION_ID_2-$A_ROOM_ID_2") + .setShortLabel("Room title") + .setIntent(Intent(Intent.ACTION_VIEW)) + .build() + ShortcutManagerCompat.setDynamicShortcuts(context, listOf(shortcutInfoA, shortcutInfoB)) + assertThat(ShortcutManagerCompat.getDynamicShortcuts(context)).hasSize(2) + + // A session is logged out + sessionObserver.onSessionDeleted(A_SESSION_ID.value) + + // Then we check the shortcuts for the logged out session are removed, but the rest remain + val shortcuts = ShortcutManagerCompat.getDynamicShortcuts(context) + assertThat(shortcuts).hasSize(1) + assertThat(shortcuts.first().id).startsWith(A_SESSION_ID_2.value) + } + + private fun TestScope.createService( + context: Context = InstrumentationRegistry.getInstrumentation().context, + sessionObserver: FakeSessionObserver = FakeSessionObserver(), + lockScreenService: FakeLockScreenService = FakeLockScreenService(), + ) = DefaultNotificationConversationService( + context = context, + intentProvider = FakeIntentProvider(), + bitmapLoader = FakeNotificationBitmapLoader(), + matrixClientProvider = FakeMatrixClientProvider(), + imageLoaderHolder = FakeImageLoaderHolder(), + sessionObserver = sessionObserver, + lockScreenService = lockScreenService, + coroutineScope = backgroundScope, + ) +} diff --git a/libraries/push/impl/src/test/kotlin/io/element/android/libraries/push/impl/notifications/factories/FakeIntentProvider.kt b/libraries/push/impl/src/test/kotlin/io/element/android/libraries/push/impl/notifications/factories/FakeIntentProvider.kt index 2d2fea78d4..29aade1753 100644 --- a/libraries/push/impl/src/test/kotlin/io/element/android/libraries/push/impl/notifications/factories/FakeIntentProvider.kt +++ b/libraries/push/impl/src/test/kotlin/io/element/android/libraries/push/impl/notifications/factories/FakeIntentProvider.kt @@ -14,5 +14,5 @@ import io.element.android.libraries.matrix.api.core.ThreadId import io.element.android.libraries.push.impl.intent.IntentProvider class FakeIntentProvider : IntentProvider { - override fun getViewRoomIntent(sessionId: SessionId, roomId: RoomId?, threadId: ThreadId?) = Intent() + override fun getViewRoomIntent(sessionId: SessionId, roomId: RoomId?, threadId: ThreadId?) = Intent(Intent.ACTION_VIEW) } diff --git a/libraries/push/test/src/main/kotlin/io/element/android/libraries/push/test/notifications/conversations/FakeNotificationConversationService.kt b/libraries/push/test/src/main/kotlin/io/element/android/libraries/push/test/notifications/conversations/FakeNotificationConversationService.kt new file mode 100644 index 0000000000..4076171ca6 --- /dev/null +++ b/libraries/push/test/src/main/kotlin/io/element/android/libraries/push/test/notifications/conversations/FakeNotificationConversationService.kt @@ -0,0 +1,26 @@ +/* + * Copyright 2025 New Vector Ltd. + * + * SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial + * Please see LICENSE files in the repository root for full details. + */ + +package io.element.android.libraries.push.test.notifications.conversations + +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.conversations.NotificationConversationService + +class FakeNotificationConversationService : NotificationConversationService { + override suspend fun onSendMessage( + sessionId: SessionId, + roomId: RoomId, + roomName: String, + roomIsDirect: Boolean, + roomAvatarUrl: String?, + ) = Unit + + override suspend fun onLeftRoom(sessionId: SessionId, roomId: RoomId) = Unit + + override suspend fun onAvailableRoomsChanged(sessionId: SessionId, roomIds: Set) = Unit +} 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 index d8551dd1e1..c44837b230 100644 --- 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 @@ -13,11 +13,11 @@ import coil3.ImageLoader import io.element.android.libraries.push.api.notifications.NotificationBitmapLoader class FakeNotificationBitmapLoader( - var getRoomBitmapResult: (String?, ImageLoader) -> Bitmap? = { _, _ -> null }, + var getRoomBitmapResult: (String?, ImageLoader, Long) -> 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 getRoomBitmap(path: String?, imageLoader: ImageLoader, targetSize: Long): Bitmap? { + return getRoomBitmapResult(path, imageLoader, targetSize) } override suspend fun getUserIcon(path: String?, imageLoader: ImageLoader): IconCompat? { diff --git a/libraries/pushstore/impl/build.gradle.kts b/libraries/pushstore/impl/build.gradle.kts index ec81643cfd..3bda0aaaed 100644 --- a/libraries/pushstore/impl/build.gradle.kts +++ b/libraries/pushstore/impl/build.gradle.kts @@ -27,6 +27,7 @@ dependencies { implementation(projects.libraries.androidutils) implementation(projects.libraries.core) implementation(projects.libraries.matrix.api) + implementation(projects.libraries.preferences.api) implementation(projects.libraries.pushstore.api) implementation(libs.androidx.corektx) implementation(libs.androidx.datastore.preferences) @@ -38,6 +39,7 @@ dependencies { testImplementation(libs.test.turbine) testImplementation(libs.coroutines.test) testImplementation(projects.libraries.matrix.test) + testImplementation(projects.libraries.preferences.test) testImplementation(projects.services.appnavstate.test) testImplementation(projects.libraries.pushstore.test) diff --git a/libraries/pushstore/impl/src/main/kotlin/io/element/android/libraries/pushstore/impl/DefaultUserPushStoreFactory.kt b/libraries/pushstore/impl/src/main/kotlin/io/element/android/libraries/pushstore/impl/DefaultUserPushStoreFactory.kt index 8003449c95..aef5c94da2 100644 --- a/libraries/pushstore/impl/src/main/kotlin/io/element/android/libraries/pushstore/impl/DefaultUserPushStoreFactory.kt +++ b/libraries/pushstore/impl/src/main/kotlin/io/element/android/libraries/pushstore/impl/DefaultUserPushStoreFactory.kt @@ -13,6 +13,7 @@ import io.element.android.libraries.di.AppScope import io.element.android.libraries.di.ApplicationContext import io.element.android.libraries.di.SingleIn import io.element.android.libraries.matrix.api.core.SessionId +import io.element.android.libraries.preferences.api.store.PreferenceDataStoreFactory import io.element.android.libraries.pushstore.api.UserPushStore import io.element.android.libraries.pushstore.api.UserPushStoreFactory import java.util.concurrent.ConcurrentHashMap @@ -22,6 +23,7 @@ import javax.inject.Inject @ContributesBinding(AppScope::class) class DefaultUserPushStoreFactory @Inject constructor( @ApplicationContext private val context: Context, + private val preferenceDataStoreFactory: PreferenceDataStoreFactory, ) : UserPushStoreFactory { // We can have only one class accessing a single data store, so keep a cache of them. private val cache = ConcurrentHashMap() @@ -29,7 +31,8 @@ class DefaultUserPushStoreFactory @Inject constructor( return cache.getOrPut(userId) { UserPushStoreDataStore( context = context, - userId = userId + userId = userId, + factory = preferenceDataStoreFactory, ) } } diff --git a/libraries/pushstore/impl/src/main/kotlin/io/element/android/libraries/pushstore/impl/UserPushStoreDataStore.kt b/libraries/pushstore/impl/src/main/kotlin/io/element/android/libraries/pushstore/impl/UserPushStoreDataStore.kt index 1ab555bba3..399b9648f4 100644 --- a/libraries/pushstore/impl/src/main/kotlin/io/element/android/libraries/pushstore/impl/UserPushStoreDataStore.kt +++ b/libraries/pushstore/impl/src/main/kotlin/io/element/android/libraries/pushstore/impl/UserPushStoreDataStore.kt @@ -13,12 +13,12 @@ import androidx.datastore.preferences.core.Preferences import androidx.datastore.preferences.core.booleanPreferencesKey import androidx.datastore.preferences.core.edit import androidx.datastore.preferences.core.stringPreferencesKey -import androidx.datastore.preferences.preferencesDataStore import androidx.datastore.preferences.preferencesDataStoreFile import io.element.android.libraries.androidutils.hash.hash import io.element.android.libraries.core.bool.orFalse import io.element.android.libraries.core.bool.orTrue import io.element.android.libraries.matrix.api.core.SessionId +import io.element.android.libraries.preferences.api.store.PreferenceDataStoreFactory import io.element.android.libraries.pushstore.api.UserPushStore import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.first @@ -31,6 +31,7 @@ import timber.log.Timber class UserPushStoreDataStore( private val context: Context, userId: SessionId, + factory: PreferenceDataStoreFactory, ) : UserPushStore { // Hash the sessionId to get rid of exotic chars and take only the first 16 chars. // The risk of collision is not high. @@ -49,28 +50,28 @@ class UserPushStoreDataStore( } } - private val Context.dataStore: DataStore by preferencesDataStore(name = preferenceName) + private val store: DataStore = factory.create(preferenceName) private val pushProviderName = stringPreferencesKey("pushProviderName") private val currentPushKey = stringPreferencesKey("currentPushKey") private val notificationEnabled = booleanPreferencesKey("notificationEnabled") private val ignoreRegistrationError = booleanPreferencesKey("ignoreRegistrationError") override suspend fun getPushProviderName(): String? { - return context.dataStore.data.first()[pushProviderName] + return store.data.first()[pushProviderName] } override suspend fun setPushProviderName(value: String) { - context.dataStore.edit { + store.edit { it[pushProviderName] = value } } override suspend fun getCurrentRegisteredPushKey(): String? { - return context.dataStore.data.first()[currentPushKey] + return store.data.first()[currentPushKey] } override suspend fun setCurrentRegisteredPushKey(value: String?) { - context.dataStore.edit { + store.edit { if (value == null) { it.remove(currentPushKey) } else { @@ -80,11 +81,11 @@ class UserPushStoreDataStore( } override fun getNotificationEnabledForDevice(): Flow { - return context.dataStore.data.map { it[notificationEnabled].orTrue() } + return store.data.map { it[notificationEnabled].orTrue() } } override suspend fun setNotificationEnabledForDevice(enabled: Boolean) { - context.dataStore.edit { + store.edit { it[notificationEnabled] = enabled } } @@ -94,17 +95,17 @@ class UserPushStoreDataStore( } override fun ignoreRegistrationError(): Flow { - return context.dataStore.data.map { it[ignoreRegistrationError].orFalse() } + return store.data.map { it[ignoreRegistrationError].orFalse() } } override suspend fun setIgnoreRegistrationError(ignore: Boolean) { - context.dataStore.edit { + store.edit { it[ignoreRegistrationError] = ignore } } override suspend fun reset() { - context.dataStore.edit { + store.edit { it.clear() } // Also delete the file diff --git a/libraries/pushstore/impl/src/main/kotlin/io/element/android/libraries/pushstore/impl/clientsecret/DataStorePushClientSecretStore.kt b/libraries/pushstore/impl/src/main/kotlin/io/element/android/libraries/pushstore/impl/clientsecret/DataStorePushClientSecretStore.kt index 6a8cbd543a..7728b0847a 100644 --- a/libraries/pushstore/impl/src/main/kotlin/io/element/android/libraries/pushstore/impl/clientsecret/DataStorePushClientSecretStore.kt +++ b/libraries/pushstore/impl/src/main/kotlin/io/element/android/libraries/pushstore/impl/clientsecret/DataStorePushClientSecretStore.kt @@ -7,44 +7,40 @@ package io.element.android.libraries.pushstore.impl.clientsecret -import android.content.Context -import androidx.datastore.core.DataStore -import androidx.datastore.preferences.core.Preferences import androidx.datastore.preferences.core.edit import androidx.datastore.preferences.core.stringPreferencesKey -import androidx.datastore.preferences.preferencesDataStore import com.squareup.anvil.annotations.ContributesBinding import io.element.android.libraries.di.AppScope -import io.element.android.libraries.di.ApplicationContext import io.element.android.libraries.matrix.api.core.SessionId +import io.element.android.libraries.preferences.api.store.PreferenceDataStoreFactory import io.element.android.libraries.pushstore.api.clientsecret.PushClientSecretStore import kotlinx.coroutines.flow.first import javax.inject.Inject -private val Context.dataStore: DataStore by preferencesDataStore(name = "push_client_secret_store") - @ContributesBinding(AppScope::class) class DataStorePushClientSecretStore @Inject constructor( - @ApplicationContext private val context: Context, + preferenceDataStoreFactory: PreferenceDataStoreFactory, ) : PushClientSecretStore { + private val dataStore = preferenceDataStoreFactory.create("push_client_secret_store") + override suspend fun storeSecret(userId: SessionId, clientSecret: String) { - context.dataStore.edit { settings -> + dataStore.edit { settings -> settings[getPreferenceKeyForUser(userId)] = clientSecret } } override suspend fun getSecret(userId: SessionId): String? { - return context.dataStore.data.first()[getPreferenceKeyForUser(userId)] + return dataStore.data.first()[getPreferenceKeyForUser(userId)] } override suspend fun resetSecret(userId: SessionId) { - context.dataStore.edit { settings -> + dataStore.edit { settings -> settings.remove(getPreferenceKeyForUser(userId)) } } override suspend fun getUserIdFromSecret(clientSecret: String): SessionId? { - val keyValues = context.dataStore.data.first().asMap() + val keyValues = dataStore.data.first().asMap() val matchingKey = keyValues.keys.find { keyValues[it] == clientSecret } diff --git a/libraries/pushstore/impl/src/test/kotlin/io/element/android/libraries/pushstore/impl/UserPushStoreDataStoreTest.kt b/libraries/pushstore/impl/src/test/kotlin/io/element/android/libraries/pushstore/impl/UserPushStoreDataStoreTest.kt index 1ba668073a..2c1a10a333 100644 --- a/libraries/pushstore/impl/src/test/kotlin/io/element/android/libraries/pushstore/impl/UserPushStoreDataStoreTest.kt +++ b/libraries/pushstore/impl/src/test/kotlin/io/element/android/libraries/pushstore/impl/UserPushStoreDataStoreTest.kt @@ -12,6 +12,7 @@ import com.google.common.truth.Truth.assertThat import io.element.android.libraries.matrix.api.core.SessionId 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.preferences.test.FakePreferenceDataStoreFactory import kotlinx.coroutines.flow.first import kotlinx.coroutines.test.runTest import org.junit.Test @@ -92,5 +93,6 @@ class UserPushStoreDataStoreTest { ) = UserPushStoreDataStore( context = InstrumentationRegistry.getInstrumentation().context, userId = sessionId, + factory = FakePreferenceDataStoreFactory(), ) } diff --git a/libraries/textcomposer/impl/src/main/kotlin/io/element/android/libraries/textcomposer/model/MessageComposerMode.kt b/libraries/textcomposer/impl/src/main/kotlin/io/element/android/libraries/textcomposer/model/MessageComposerMode.kt index 002fefec62..bb9670de39 100644 --- a/libraries/textcomposer/impl/src/main/kotlin/io/element/android/libraries/textcomposer/model/MessageComposerMode.kt +++ b/libraries/textcomposer/impl/src/main/kotlin/io/element/android/libraries/textcomposer/model/MessageComposerMode.kt @@ -49,7 +49,7 @@ sealed interface MessageComposerMode { get() = this is Reply && replyToDetails is InReplyToDetails.Ready && replyToDetails.eventContent is MessageContent && - (replyToDetails.eventContent as MessageContent).isThreaded + (replyToDetails.eventContent as MessageContent).threadInfo.threadRootId != null } fun MessageComposerMode.showCaptionCompatibilityWarning(): Boolean { diff --git a/libraries/textcomposer/impl/src/main/res/values-cs/translations.xml b/libraries/textcomposer/impl/src/main/res/values-cs/translations.xml index 4bcacafeb7..bdb92ed71d 100644 --- a/libraries/textcomposer/impl/src/main/res/values-cs/translations.xml +++ b/libraries/textcomposer/impl/src/main/res/values-cs/translations.xml @@ -28,5 +28,6 @@ "Odstranit odkaz" "Zrušit odsazení" "Odkaz" + "Titulky nemusí být viditelné pro lidi, kteří používají starší aplikace." "Držte pro nahrávání" diff --git a/libraries/textcomposer/impl/src/main/res/values-cy/translations.xml b/libraries/textcomposer/impl/src/main/res/values-cy/translations.xml index 497766cc1e..abc847ac99 100644 --- a/libraries/textcomposer/impl/src/main/res/values-cy/translations.xml +++ b/libraries/textcomposer/impl/src/main/res/values-cy/translations.xml @@ -28,5 +28,6 @@ "Dileu dolen" "Dadmewnoli" "Dolen" + "Efallai na fydd capsiynau yn weladwy i bobl sy\'n defnyddio apiau hŷn." "Daliwch i recordio" diff --git a/libraries/textcomposer/impl/src/main/res/values-da/translations.xml b/libraries/textcomposer/impl/src/main/res/values-da/translations.xml index dca3d5d11e..b9e792393a 100644 --- a/libraries/textcomposer/impl/src/main/res/values-da/translations.xml +++ b/libraries/textcomposer/impl/src/main/res/values-da/translations.xml @@ -28,5 +28,6 @@ "Fjern link" "Fjern indrykning" "Link" + "Billedtekster er muligvis ikke synlige for personer, der bruger ældre apps." "Hold nede for at optage" diff --git a/libraries/textcomposer/impl/src/main/res/values-de/translations.xml b/libraries/textcomposer/impl/src/main/res/values-de/translations.xml index b12e7e6080..1520699314 100644 --- a/libraries/textcomposer/impl/src/main/res/values-de/translations.xml +++ b/libraries/textcomposer/impl/src/main/res/values-de/translations.xml @@ -28,5 +28,6 @@ "Link entfernen" "Ohne Einrückung" "Link" + "Bildunterschriften sind für Nutzer älterer Apps möglicherweise nicht sichtbar." "Zum Aufnehmen gedrückt halten" diff --git a/libraries/textcomposer/impl/src/main/res/values-el/translations.xml b/libraries/textcomposer/impl/src/main/res/values-el/translations.xml index 1c8f6c8b65..a054182993 100644 --- a/libraries/textcomposer/impl/src/main/res/values-el/translations.xml +++ b/libraries/textcomposer/impl/src/main/res/values-el/translations.xml @@ -28,5 +28,6 @@ "Κατάργηση συνδέσμου" "Χωρίς εσοχή" "Σύνδεσμος" + "Οι λεζάντες ενδέχεται να μην είναι ορατές σε άτομα που χρησιμοποιούν παλαιότερες εφαρμογές." "Κράτα για εγγραφή" diff --git a/libraries/textcomposer/impl/src/main/res/values-es/translations.xml b/libraries/textcomposer/impl/src/main/res/values-es/translations.xml index 2685733c3e..2c7031a6d5 100644 --- a/libraries/textcomposer/impl/src/main/res/values-es/translations.xml +++ b/libraries/textcomposer/impl/src/main/res/values-es/translations.xml @@ -24,5 +24,6 @@ "Eliminar enlace" "Quitar sangría" "Enlace" + "Es posible que las leyendas no sean visibles para las personas que usan aplicaciones más antiguas." "Mantén pulsado para grabar" diff --git a/libraries/textcomposer/impl/src/main/res/values-et/translations.xml b/libraries/textcomposer/impl/src/main/res/values-et/translations.xml index 05c09aa335..035ac435c1 100644 --- a/libraries/textcomposer/impl/src/main/res/values-et/translations.xml +++ b/libraries/textcomposer/impl/src/main/res/values-et/translations.xml @@ -28,5 +28,6 @@ "Eemalda link" "Eemalda taandrida" "Link" + "Selgitused ja alapealkirjad ei pruugi olla nähtavad vanemate rakenduste kasutajatele." "Salvestamiseks hoia nuppu all" diff --git a/libraries/textcomposer/impl/src/main/res/values-eu/translations.xml b/libraries/textcomposer/impl/src/main/res/values-eu/translations.xml index ee029ac038..8e8571e527 100644 --- a/libraries/textcomposer/impl/src/main/res/values-eu/translations.xml +++ b/libraries/textcomposer/impl/src/main/res/values-eu/translations.xml @@ -11,6 +11,9 @@ "Editatu esteka" "Aplikatu formatu lodia" "Aplikatu formatu etzana" + "desgaituta" + "itzalita" + "piztuta" "Aplikatu ezabaketa formatua" "Aplikatu azpimarra formatua" "Pantaila osoa bai/ez" diff --git a/libraries/textcomposer/impl/src/main/res/values-fi/translations.xml b/libraries/textcomposer/impl/src/main/res/values-fi/translations.xml index b47cda2c63..fd030dc7d2 100644 --- a/libraries/textcomposer/impl/src/main/res/values-fi/translations.xml +++ b/libraries/textcomposer/impl/src/main/res/values-fi/translations.xml @@ -13,6 +13,7 @@ "%1$s, tila: %2$s" "Käytä lihavoitua muotoa" "Käytä kursiivimuotoa" + "poissa käytöstä" "pois päältä" "päällä" "Käytä yliviivausmuotoa" @@ -27,5 +28,6 @@ "Poista linkki" "Poista sisennys" "Linkki" + "Kuvatekstit eivät välttämättä näy ihmisille, jotka käyttävät vanhempia sovelluksia." "Pidä pohjassa nauhoittaaksesi" diff --git a/libraries/textcomposer/impl/src/main/res/values-fr/translations.xml b/libraries/textcomposer/impl/src/main/res/values-fr/translations.xml index f21e9f90ba..1f2c356c58 100644 --- a/libraries/textcomposer/impl/src/main/res/values-fr/translations.xml +++ b/libraries/textcomposer/impl/src/main/res/values-fr/translations.xml @@ -28,5 +28,6 @@ "Supprimer le lien" "Décaler vers la gauche" "Lien" + "Les légendes peuvent ne pas être visibles pour les utilisateurs d’anciennes applications." "Maintenir pour enregistrer" diff --git a/libraries/textcomposer/impl/src/main/res/values-hu/translations.xml b/libraries/textcomposer/impl/src/main/res/values-hu/translations.xml index 462b18aa9f..4b7c09ef1d 100644 --- a/libraries/textcomposer/impl/src/main/res/values-hu/translations.xml +++ b/libraries/textcomposer/impl/src/main/res/values-hu/translations.xml @@ -28,5 +28,6 @@ "Hivatkozás eltávolítása" "Behúzás nélkül" "Hivatkozás" + "Előfordulhat, hogy a feliratok nem láthatók a régebbi alkalmazásokat használók számára." "Tartsa a rögzítéshez" diff --git a/libraries/textcomposer/impl/src/main/res/values-in/translations.xml b/libraries/textcomposer/impl/src/main/res/values-in/translations.xml index 8646be898b..64f032ca0a 100644 --- a/libraries/textcomposer/impl/src/main/res/values-in/translations.xml +++ b/libraries/textcomposer/impl/src/main/res/values-in/translations.xml @@ -28,5 +28,6 @@ "Hapus tautan" "Hapus indentasi" "Tautan" + "Keterangan mungkin tidak terlihat oleh orang yang menggunakan aplikasi lama." "Tahan untuk merekam" diff --git a/libraries/textcomposer/impl/src/main/res/values-it/translations.xml b/libraries/textcomposer/impl/src/main/res/values-it/translations.xml index 79d0bebc54..92c0883d61 100644 --- a/libraries/textcomposer/impl/src/main/res/values-it/translations.xml +++ b/libraries/textcomposer/impl/src/main/res/values-it/translations.xml @@ -28,5 +28,6 @@ "Rimuovi collegamento" "Rientro a sinistra" "Collegamento" + "Le didascalie potrebbero non essere visibili agli utenti di app meno recenti." "Tieni premuto per registrare" diff --git a/libraries/textcomposer/impl/src/main/res/values-nb/translations.xml b/libraries/textcomposer/impl/src/main/res/values-nb/translations.xml index c7b4581eab..bd424cb679 100644 --- a/libraries/textcomposer/impl/src/main/res/values-nb/translations.xml +++ b/libraries/textcomposer/impl/src/main/res/values-nb/translations.xml @@ -28,5 +28,6 @@ "Fjern lenke" "Fjern innrykk" "Lenke" + "Teksting er kanskje ikke synlig for personer som bruker eldre apper." "Hold for å ta opp" diff --git a/libraries/textcomposer/impl/src/main/res/values-pl/translations.xml b/libraries/textcomposer/impl/src/main/res/values-pl/translations.xml index b5dd4478b5..2e0864985a 100644 --- a/libraries/textcomposer/impl/src/main/res/values-pl/translations.xml +++ b/libraries/textcomposer/impl/src/main/res/values-pl/translations.xml @@ -28,5 +28,6 @@ "Usuń link" "Bez wcięcia" "Link" + "Opis może być niedostępny dla osób korzystających ze starszej wersji aplikacji." "Przytrzymaj, aby nagrywać" diff --git a/libraries/textcomposer/impl/src/main/res/values-pt-rBR/translations.xml b/libraries/textcomposer/impl/src/main/res/values-pt-rBR/translations.xml index 81fc469301..5f43f66370 100644 --- a/libraries/textcomposer/impl/src/main/res/values-pt-rBR/translations.xml +++ b/libraries/textcomposer/impl/src/main/res/values-pt-rBR/translations.xml @@ -28,5 +28,6 @@ "Remover link" "Desidentar" "Link" + "As legendas podem não ser visíveis para pessoas que usam aplicativos mais antigos." "Segure para gravar" diff --git a/libraries/textcomposer/impl/src/main/res/values-pt/translations.xml b/libraries/textcomposer/impl/src/main/res/values-pt/translations.xml index 2eb61ac739..d11cbfe00d 100644 --- a/libraries/textcomposer/impl/src/main/res/values-pt/translations.xml +++ b/libraries/textcomposer/impl/src/main/res/values-pt/translations.xml @@ -28,5 +28,6 @@ "Remover ligação" "Desindentar" "Ligação" + "As legendas poderão não ser visíveis em versões mais antigas da aplicação." "Segurar para gravar" diff --git a/libraries/textcomposer/impl/src/main/res/values-ru/translations.xml b/libraries/textcomposer/impl/src/main/res/values-ru/translations.xml index b49a7670ff..3bb14884ac 100644 --- a/libraries/textcomposer/impl/src/main/res/values-ru/translations.xml +++ b/libraries/textcomposer/impl/src/main/res/values-ru/translations.xml @@ -24,5 +24,6 @@ "Удалить ссылку" "Без отступа" "Ссылка" + "Подпись может быть не видна пользователям старых приложений." "Удерживайте для записи" diff --git a/libraries/textcomposer/impl/src/main/res/values-sk/translations.xml b/libraries/textcomposer/impl/src/main/res/values-sk/translations.xml index 7b46624011..428f65b941 100644 --- a/libraries/textcomposer/impl/src/main/res/values-sk/translations.xml +++ b/libraries/textcomposer/impl/src/main/res/values-sk/translations.xml @@ -28,5 +28,6 @@ "Odstrániť odkaz" "Zrušiť odsadenie" "Odkaz" + "Titulky nemusia byť viditeľné pre ľudí používajúcich staršie aplikácie." "Podržaním nahrajte" diff --git a/libraries/textcomposer/impl/src/main/res/values-sv/translations.xml b/libraries/textcomposer/impl/src/main/res/values-sv/translations.xml index 6c83c6e513..bc5e09d45d 100644 --- a/libraries/textcomposer/impl/src/main/res/values-sv/translations.xml +++ b/libraries/textcomposer/impl/src/main/res/values-sv/translations.xml @@ -28,5 +28,6 @@ "Ta bort länk" "Ta bort indrag" "Länk" + "Bildtexter kanske inte är synliga för personer som använder äldre appar." "Håll för att spela in" diff --git a/libraries/textcomposer/impl/src/main/res/values-tr/translations.xml b/libraries/textcomposer/impl/src/main/res/values-tr/translations.xml index 95796c5174..4d1fadb3cd 100644 --- a/libraries/textcomposer/impl/src/main/res/values-tr/translations.xml +++ b/libraries/textcomposer/impl/src/main/res/values-tr/translations.xml @@ -22,5 +22,6 @@ "Bağlantıyı kaldır" "Girintiyi kaldır" "Bağlantı" + "Açıklamalar, eski uygulamaları kullanan kişiler tarafından görülemeyebilir." "Kaydetmek için basılı tut" diff --git a/libraries/textcomposer/impl/src/main/res/values-uk/translations.xml b/libraries/textcomposer/impl/src/main/res/values-uk/translations.xml index fda32c8ce1..cef6f065c2 100644 --- a/libraries/textcomposer/impl/src/main/res/values-uk/translations.xml +++ b/libraries/textcomposer/impl/src/main/res/values-uk/translations.xml @@ -26,5 +26,6 @@ "Видалити посилання" "Без відступу" "Посилання" + "Користувачі старих застосунків можуть не бачити підписи." "Затисніть, щоб записати" diff --git a/libraries/textcomposer/impl/src/main/res/values-ur/translations.xml b/libraries/textcomposer/impl/src/main/res/values-ur/translations.xml index 9ed333b924..74d43f143c 100644 --- a/libraries/textcomposer/impl/src/main/res/values-ur/translations.xml +++ b/libraries/textcomposer/impl/src/main/res/values-ur/translations.xml @@ -2,7 +2,7 @@ "منسلکہ شامل کریں" "گولئی فہرست تبدیل کریں" - "تنسیق کے اختیارات بند کریں" + "ٹیکسٹ فارمیٹنگ کو منسوخ اور بند کریں۔" "رمز بلاک تبدیل کریں" "پیغام…" "ایک ربط بنائیں" diff --git a/libraries/textcomposer/impl/src/main/res/values-zh-rTW/translations.xml b/libraries/textcomposer/impl/src/main/res/values-zh-rTW/translations.xml index f9cdfe25d7..d27e86a7ad 100644 --- a/libraries/textcomposer/impl/src/main/res/values-zh-rTW/translations.xml +++ b/libraries/textcomposer/impl/src/main/res/values-zh-rTW/translations.xml @@ -2,7 +2,7 @@ "新增附件" "切換項目編號" - "關閉格式化選項" + "取消並關閉關閉文字格式化" "切換程式碼區塊" "新增標題" "已加密的訊息……" @@ -10,8 +10,12 @@ "未加密的訊息……" "建立連結" "編輯連結" + "%1$s,狀態:%2$s" "套用粗體" "套用斜體" + "已停用" + "關閉" + "開啟" "套用刪除線" "套用底線" "切換全螢幕模式" @@ -24,5 +28,6 @@ "移除連結" "減少縮排" "連結" + "使用舊應用程式的使用者可能看不到標題。" "按住錄音" diff --git a/libraries/textcomposer/impl/src/main/res/values-zh/translations.xml b/libraries/textcomposer/impl/src/main/res/values-zh/translations.xml index 7fbdc32c2e..b8c6ba98bd 100644 --- a/libraries/textcomposer/impl/src/main/res/values-zh/translations.xml +++ b/libraries/textcomposer/impl/src/main/res/values-zh/translations.xml @@ -28,5 +28,6 @@ "删除链接" "取消缩进" "链接" + "使用旧版应用程序的用户可能无法看到字幕。" "按住录制" diff --git a/libraries/troubleshoot/impl/src/main/res/values-zh/translations.xml b/libraries/troubleshoot/impl/src/main/res/values-zh/translations.xml index 74b759f622..2375580f2c 100644 --- a/libraries/troubleshoot/impl/src/main/res/values-zh/translations.xml +++ b/libraries/troubleshoot/impl/src/main/res/values-zh/translations.xml @@ -1,5 +1,6 @@ + "推送历史记录" "运行测试" "再次运行测试" "一些测试失败了。请查看详情。" diff --git a/libraries/ui-strings/src/main/res/values-da/translations.xml b/libraries/ui-strings/src/main/res/values-da/translations.xml index 7a9270ff4a..517d2530ad 100644 --- a/libraries/ui-strings/src/main/res/values-da/translations.xml +++ b/libraries/ui-strings/src/main/res/values-da/translations.xml @@ -88,6 +88,7 @@ "Slå til" "Afslut afstemning" "Indtast PIN-kode" + "Afslut" "Har du glemt din adgangskode?" "Videresend" "Gå tilbage" @@ -166,6 +167,8 @@ "Avancerede indstillinger" "et billede" "Analyse-værktøj" + "Du forlod rummet" + "Du blev logget ud af sessionen" "Udseende" "Lyd" "Blokerede brugere" @@ -258,7 +261,9 @@ "Forbereder…" "Privatlivspolitik" "Privat rum" + "Privat klynge" "Offentligt rum" + "Offentlig klynge" "Reaktion" "Reaktioner" "Årsag" @@ -275,6 +280,10 @@ "Rum" "Navn på rum" "f.eks. navnet på dit projekt" + + "%1$d Rum" + "%1$d Rum" + "Gemte ændringer" "Gemmer" "Skærmlås" @@ -294,6 +303,11 @@ "Logger ud" "Noget gik galt" "Vi stødte på et problem. Prøv venligst igen." + "Klynge" + + "%1$d Klynge" + "%1$d Klynger" + "Starter samtale…" "Klistermærke" "Succes" @@ -324,6 +338,12 @@ "Verificér identitet" "Verificér bruger" "Video" + "Høj kvalitet" + "Bedste kvalitet, men større filstørrelse" + "Lav kvalitet" + "Hurtigste uploadhastighed og mindste filstørrelse" + "Standardkvalitet" + "Balance mellem kvalitet og uploadhastighed" "Talebesked" "Venter…" "Venter på denne besked" @@ -338,6 +358,10 @@ Er du sikker på, at du vil fortsætte?" "Dobbelttjek dette link" + "Vælg standardkvaliteten for de videoer, du uploader." + "Kvalitet på overførte videoer" + "Den maksimalt tilladte filstørrelse er: %1$s" + "Filen er for stor til at kunne uploades." "Rummet er anmeldt" "Anmeldte og forlod rummet" "Bekræftelse" @@ -346,6 +370,9 @@ Er du sikker på, at du vil fortsætte?" "Advarsel" "Dine ændringer er ikke blevet gemt. Er du sikker på, at du vil gå tilbage?" "Gem ændringer?" + "Den maksimalt tilladte filstørrelse er: %1$s" + "Vælg den kvalitet, du ønsker at uploade videoen i." + "Vælg kvalitet for video-overførsel" "Din hjemmeserver skal opgraderes for at understøtte Matrix Authentication Service og kontooprettelse." "Oprettelse af permalink mislykkedes" "%1$s kunne ikke indlæse kortet. Prøv igen senere." @@ -396,6 +423,7 @@ Er du sikker på, at du vil fortsætte?" "Din besked blev ikke sendt, fordi %1$s ikke har bekræftet alle enheder" "En eller flere af dine enheder er ikke verificeret. Du kan sende beskeden alligevel, eller du kan annullere for nu og prøve igen senere, når du har verificeret alle dine enheder." "Din besked blev ikke sendt, fordi du ikke har verificeret en eller flere af dine enheder" + "Rediger administratorer eller ejere" "Det lykkedes ikke at behandle medier til upload. Prøv venligst igen." "Kunne ikke hente brugeroplysninger" "Besked i %1$s" @@ -413,6 +441,9 @@ Er du sikker på, at du vil fortsætte?" "Åbn i Google Maps" "Åbn i OpenStreetMap" "Del denne lokation" + "Klynger, du har oprettet eller deltager i" + "%1$s•%2$s" + "Klynger" "Beskeden blev ikke sendt fordi %1$s s bekræftede identitet blev nulstillet." "Meddelelsen er ikke sendt, fordi %1$s ikke har bekræftet alle enheder." "Beskeden er ikke sendt, fordi du ikke har verificeret en eller flere af dine enheder." diff --git a/libraries/ui-strings/src/main/res/values-et/translations.xml b/libraries/ui-strings/src/main/res/values-et/translations.xml index 8c3a72156e..24a83656ee 100644 --- a/libraries/ui-strings/src/main/res/values-et/translations.xml +++ b/libraries/ui-strings/src/main/res/values-et/translations.xml @@ -88,6 +88,7 @@ "Võta kasutusele" "Lõpeta küsitlus" "Sisesta PIN-kood" + "Lõpeta" "Kas unustasid salasõna?" "Edasta" "Tagasi eelmisesse vaatesse" @@ -301,6 +302,7 @@ Põhjus: %1$s." "Logime välja" "Midagi läks valesti" "Tekkis viga. Palun proovi uuesti." + "Kogukond" "%1$d kogukond" "%1$d kogukonda" @@ -335,6 +337,12 @@ Põhjus: %1$s." "Verifitseeri võrguidentiteet" "Verifitseeri kasutaja" "Video" + "Kõrge kvaliteet" + "Parim kvaliteet, aga suuremad failid" + "Madal kvaliteet" + "Parim üleslaadimiskiirus ja väikseim failisuurus" + "Tavakvaliteet" + "Kvaliteedi ja üleslaadimise kiiruse optimaalne proportsioon" "Häälsõnum" "Ootame…" "Ootame selle sõnumi dekrüptimisvõtit" @@ -349,6 +357,10 @@ Põhjus: %1$s." Kas sa oled kindel, et soovid jätkata?" "Palun kontrolli seda linki mõttega" + "Vali üleslaaditavate videote kvaliteeditase" + "Videote kvaliteeditase" + "Suurim lubatud failisuurus on: %1$s" + "See fail on üleslaadimiseks liiga suur" "Teatasid jututoast" "Teatasid jututoast ja lahkusid sealt" "Kinnitus" @@ -357,6 +369,9 @@ Kas sa oled kindel, et soovid jätkata?" "Hoiatus" "Sinu tehtud muudatused pole veel salvestatud. Kas sa oled kindel, et soovid minna tagasi?" "Kas salvestame muudatused?" + "Suurim lubatud failisuurus on: %1$s" + "Vali üleslaaditava video kvaliteet." + "Vali video kvaliteet." "Selleks et koos kasutajakonto loomisega toimiks Matrix Authentication Service\'i tugi, vajab sinu koduserver uuendamist." "Püsilingi loomine ei õnnestumud" "%1$s kaardi laadimine ei õnnestunud. Palun proovi hiljem uuesti." @@ -407,6 +422,7 @@ Kas sa oled kindel, et soovid jätkata?" "Sinu sõnum on saatmata, kuna %1$s pole verifitseerinud kõiki oma seadmeid" "Üks või enam sinu seadet on verifitseerimata. Sa võid sõnumi ikkagi ära saata või katkestad saatmise ning proovid uuesti, kui oled kõik oma seadmed verifitseerinud." "Kuna sul on üks või enam verifitseerimata seadet, siis sinu sõnum jäi saatmata" + "Muuda peakasutajaid või omanikke" "Meediafaili töötlemine enne üleslaadimist ei õnnestunud. Palun proovi uuesti." "Kasutaja andmete laadimine ei õnnestunud" "Sõnum jututoas %1$s" diff --git a/libraries/ui-strings/src/main/res/values-eu/translations.xml b/libraries/ui-strings/src/main/res/values-eu/translations.xml index 03f2459129..d726761ccf 100644 --- a/libraries/ui-strings/src/main/res/values-eu/translations.xml +++ b/libraries/ui-strings/src/main/res/values-eu/translations.xml @@ -2,11 +2,17 @@ "Abatarra" "Ezabatu" + "Editatu abatarra" + "Zifraketaren xehetasunak" "Ezkutatu pasahitza" "Batu deira" "Joan behera" + "Mugitu mapa nire kokapenera" "Aipamenak soilik" "Mutututa" + "Aipamen berriak" + "Mezu berriak" + "Beste erabiltzailearen abatarra" "%1$d. orria" "Eten" "Ahots-mezua, iraupena: %1$s, uneko posizioa: %2$s" @@ -24,14 +30,18 @@ "%1$s(e)k irakurri du" "Egin tap guztiak ikusteko" "Kendu %1$s erreakzioa" + "Gelaren abatarra" "Bidali fitxategiak" "Erakutsi pasahitza" "Hasi dei bat" + "Erabiltzailearen abatarra" "Erabiltzailea-menua" + "Ikusi abatarra" "Ikusi xehetasunak" "Ahots-mezua, iraupena: %1$s" "Grabatu ahots-mezua." "Utzi grabatzeari" + "Zure abatarra" "Onartu" "Gehitu testua" "Gehitu denbora-lerrora" @@ -68,6 +78,7 @@ "Gaitu" "Amaitu inkesta" "Sartu PINa" + "Amaitu" "Pasahitza ahaztu duzu?" "Birbidali" "Joan atzera" @@ -114,7 +125,9 @@ "Gorde" "Bilatu" "Bidali" + "Bidali editatutako mezua" "Bidali mezua" + "Bidali ahots-mezua" "Partekatu" "Partekatu esteka" "Erakutsi" @@ -130,6 +143,7 @@ "Sakatu aukerak ikusteko" "Saiatu berriro" "Utzi finkatzeari" + "Ikusi" "Ikusi denbora-lerroan" "Ikusi iturburua" "Bai" @@ -139,6 +153,7 @@ "Honi buruz" "Testua gehitzen" "Ezarpen aurreratuak" + "irudia" "Estatistikak" "Itxura" "Audioa" @@ -227,9 +242,12 @@ Arrazoia: %1$s." "Boto %d" "%d boto" + "Prestatzen…" "Pribatutasun-politika" "Gela pribatua" + "Gune pribatua" "Gela publikoa" + "Gune publikoa" "Erreakzioa" "Erreakzioak" "Arrazoia" @@ -260,6 +278,8 @@ Arrazoia: %1$s." "Partekatutako kokapena" "Saioa amaitzen" "Arazoren bat egon da" + "Arazo bat topatu dugu. Saiatu berriro." + "Gunea" "Txata hasten…" "Pegatina" "Arrakasta" @@ -289,6 +309,12 @@ Arrazoia: %1$s." "Egiaztatu identitatea" "Egiaztatu erabiltzailea" "Bideoa" + "Kalitate handia" + "Kalitate handiena baina fitxategi-tamaina handiagoa" + "Kalitate txikia" + "Igoera abiadura azkarrena eta fitxategi-tamaina txikiena" + "Erdiko kalitatea" + "Kalitate eta igoera-abiaduraren arteko oreka" "Ahots-mezua" "Zain…" "Mezu honen zain" @@ -298,6 +324,7 @@ Arrazoia: %1$s." "%1$s(r)en identitatea berrezarri da." "%1$s(r)en %2$s identitatea berrezarri da. %3$s" "Egiaztatu honako esteka" + "Bideoaren igoera-kalitatea" "Gela salatu da" "Gela salatu eta utzi da" "Baieztapena" @@ -306,6 +333,7 @@ Arrazoia: %1$s." "Abisua" "Zure aldaketak ez dira gorde. Ziur itzuli nahi duzula?" "Aldaketak gorde?" + "Hautatu bideoaren igoera-kalitatea" "Huts egin du esteka iraunkorra sortzeak" "%1$s ezin izan da mapa kargatu. Saiatu berriro geroago." "Huts egin du mezuak kargatzeak" @@ -324,6 +352,7 @@ Arrazoia: %1$s." "🔐️ Zatoz nirekin %1$s(e)ra" "%1$s Android" "Astindu erroreen berri emateko" + "Aukerak" "Huts egin du multimedia aukeratzeak, saiatu berriro." "Finkatutako mezuak" "Bidali mezua hala ere" diff --git a/libraries/ui-strings/src/main/res/values-fa/translations.xml b/libraries/ui-strings/src/main/res/values-fa/translations.xml index 16a95e9f78..d09b945bad 100644 --- a/libraries/ui-strings/src/main/res/values-fa/translations.xml +++ b/libraries/ui-strings/src/main/res/values-fa/translations.xml @@ -3,6 +3,10 @@ "افزودن واکنش: %1$s" "چهرک" "حذف" + + "%1$d رقم وارد شده" + "%1$d رقم وارد شده" + "ویرایش چهرک" "نشانی کامل %1$s خواهد بود" "جزییات رمزنگاری" @@ -205,6 +209,10 @@ "پیوند در تخته‌گیره رونوشت شد" "بار کردن…" "بار کردن بیش‌تر…" + + "%1$d عضو" + "%1$d عضو" + "پیام" "کنش‌های پیام" "جینش پیام" @@ -229,6 +237,10 @@ "نظرسنجی: %1$s" "مجموع آرا: %1$s" "نتیجه‌ها پس از پایان نظرسنجی نشان داده خواهند شد" + + "%d رأی" + "%d رأی" + "آماده سازی…" "سیاست محرمانگی" "اتاق خصوصی" 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 bde9f7500f..564431362b 100644 --- a/libraries/ui-strings/src/main/res/values-fr/translations.xml +++ b/libraries/ui-strings/src/main/res/values-fr/translations.xml @@ -224,8 +224,8 @@ Raison : %1$s." "%d autres" - "%1$d membre" - "%1$d membres" + "%1$d Membre" + "%1$d Membres" "Message" "Actions sur le message" @@ -258,7 +258,9 @@ Raison : %1$s." "Préparation…" "Politique de confidentialité" "Salon privé" + "Espace privé" "Salon public" + "Espace public" "Réaction" "Réactions" "Raison" @@ -276,6 +278,10 @@ Raison : %1$s." "Salon" "Nom du salon" "par exemple, le nom de votre projet" + + "%1$d Salon" + "%1$d Salons" + "Modifications enregistrées" "Enregistrement" "Verrouillage d’écran" @@ -295,6 +301,10 @@ Raison : %1$s." "Déconnexion" "Une erreur s’est produite" "Nous avons rencontré un problème. Veuillez réessayer." + + "%1$d Espace" + "%1$d Espaces" + "Création de la discussion…" "Autocollant" "Succès" @@ -325,6 +335,12 @@ Raison : %1$s." "Vérifier l’identité" "Vérifier l’utilisateur" "Vidéo" + "Haute qualité" + "Meilleure qualité mais plus gros fichier" + "Basse qualité" + "Fichier plus petit et vitesse de téléchargement plus rapide" + "Qualité standard" + "Équilibre entre qualité et vitesse de téléchargement" "Message vocal" "En attente…" "En attente de la clé de déchiffrement" @@ -339,6 +355,10 @@ Raison : %1$s." Êtes-vous sûr de vouloir continuer ?" "Veuillez vérifier ce lien" + "Sélectionnez la qualité par défaut des vidéos que vous envoyez." + "Qualité des vidéos envoyées" + "La taille maximale de fichier autorisée est: %1$s" + "Le fichier est trop gros pour être envoyé" "Salon signalé" "Salon quitté et signalé" "Confirmation" @@ -347,6 +367,9 @@ Raison : %1$s." "Attention" "Vos modifications n’ont pas été enregistrées. Êtes-vous certain de vouloir quitter ?" "Enregistrer les changements ?" + "La taille maximale de fichier autorisée est: %1$s" + "Sélectionnez la qualité des vidéos que vous souhaitez envoyer." + "Sélectionnez la qualité d’envoi des vidéos" "Votre serveur d’accueil doit être mis à jour pour prendre en charge le protocole MAS (Matrix Authentication Service) et la création de compte." "Échec de la création du permalien" "%1$s n’a pas pu charger la carte. Veuillez réessayer ultérieurement." @@ -397,6 +420,7 @@ Raison : %1$s." "Votre message n’a pas été envoyé car %1$s n’a pas vérifié tous ses appareils" "Un ou plusieurs de vos appareils ne sont pas vérifiés. Vous pouvez quand même envoyer le message, ou vous pouvez annuler et réessayer plus tard après avoir vérifié tous vos appareils." "Votre message n’a pas été envoyé car vous n’avez pas vérifié tous vos appareils" + "Modifier les administrateurs ou les propriétaires" "Échec du traitement des médias à télécharger, veuillez réessayer." "Impossible de récupérer les détails de l’utilisateur" "Message dans %1$s" @@ -414,6 +438,9 @@ Raison : %1$s." "Ouvrir dans Google Maps" "Ouvrir dans OpenStreetMap" "Partager cette position" + "Espaces que vous avez créés ou rejoints." + "%1$s • %2$s" + "Espaces" "Le message n’a pas été envoyé car l’identité vérifiée de %1$s a été réinitialisée." "Le message n’a pas été envoyé car %1$s n’a pas vérifié tous ses appareils." "Message non envoyé car vous n’avez pas vérifié tous vos appareils." diff --git a/libraries/ui-strings/src/main/res/values-hu/translations.xml b/libraries/ui-strings/src/main/res/values-hu/translations.xml index e68ffe8939..62b0373451 100644 --- a/libraries/ui-strings/src/main/res/values-hu/translations.xml +++ b/libraries/ui-strings/src/main/res/values-hu/translations.xml @@ -88,6 +88,7 @@ "Engedélyezés" "Szavazás lezárása" "Adja meg a PIN-kódot" + "Befejezés" "Elfelejtette a jelszót?" "Tovább" "Visszalépés" @@ -300,6 +301,7 @@ Ok: %1$s." "Kijelentkezés" "Valamilyen hiba történt" "Problémába ütköztünk. Próbálja újra." + "Tér" "%1$d tér" "%1$d tér" diff --git a/libraries/ui-strings/src/main/res/values-in/translations.xml b/libraries/ui-strings/src/main/res/values-in/translations.xml index 294ab5fd27..bd7739d5ba 100644 --- a/libraries/ui-strings/src/main/res/values-in/translations.xml +++ b/libraries/ui-strings/src/main/res/values-in/translations.xml @@ -11,6 +11,9 @@ "Lompat ke bawah" "Hanya sebutan" "Dibisukan" + "Sebutan baru" + "Pesan baru" + "Panggilan berlangsung" "Avatar pengguna lain" "Halaman %1$d" "Jeda" @@ -99,6 +102,7 @@ "Tidak" "Jangan sekarang" "Oke" + "Buka menu konteks" "Pengaturan" "Buka dengan" "Sematkan" @@ -106,9 +110,9 @@ "Kutip" "Bereaksi" "Tolak" - "Hapus" - "Hapus keterangan" - "Hapus pesan" + "Hilangkan" + "Hilangkan keterangan" + "Hilangkan pesan" "Balas" "Balas dalam utas" "Laporkan" @@ -123,7 +127,9 @@ "Simpan" "Cari" "Kirim" + "Kirim pesan tersunting" "Kirim pesan" + "Kirim pesan suara" "Bagikan" "Bagikan tautan" "Tampilkan" @@ -209,7 +215,7 @@ Alasan: %1$s." "%d lainnya" - "%1$d anggota" + "%1$d Anggota" "Pesan" "Tindakan pesan" diff --git a/libraries/ui-strings/src/main/res/values-nb/translations.xml b/libraries/ui-strings/src/main/res/values-nb/translations.xml index 253db15e4d..84bfe86610 100644 --- a/libraries/ui-strings/src/main/res/values-nb/translations.xml +++ b/libraries/ui-strings/src/main/res/values-nb/translations.xml @@ -7,11 +7,17 @@ "%1$d siffer angitt" "%1$d sifre angitt" + "Rediger avatar" + "Krypteringsdetaljer" "Skjul passord" "Bli med i samtale" "Hopp til bunnen" "Bare omtaler" "Dempet" + "Nye omtaler" + "Nye meldinger" + "Pågående samtale" + "En annen brukers avatar" "Side %1$d" "Setter på pause" "Talemelding, lengde: %1$s, nåværende posisjon: %2$s" @@ -34,6 +40,7 @@ "Sende filer" "Vis passord" "Start en samtale" + "Tidsbegrenset handling kreves" "Brukeravatar" "Brukermeny" "Vis avatar" @@ -41,6 +48,7 @@ "Talemelding, lengde: %1$s" "Ta opp talemelding." "Stopp opptaket" + "Din avatar" "Godta" "Legg til bildetekst" "Legg til i tidslinjen" @@ -99,6 +107,7 @@ "Nei" "Ikke nå" "OK" + "Åpne kontekstmenyen" "Innstillinger" "Åpne med" "Fest" @@ -123,7 +132,9 @@ "Lagre" "Søke" "Sende" + "Send redigert melding" "Send melding" + "Send talemelding" "Dele" "Dele lenke" "Vis" diff --git a/libraries/ui-strings/src/main/res/values-nl/translations.xml b/libraries/ui-strings/src/main/res/values-nl/translations.xml index ffd68b2010..56d01c9727 100644 --- a/libraries/ui-strings/src/main/res/values-nl/translations.xml +++ b/libraries/ui-strings/src/main/res/values-nl/translations.xml @@ -1,16 +1,24 @@ + "Reactie toevoegen: %1$s" "Afbeelding" "Verwijderen" "%1$d cijfer ingevoerd" "%1$d cijfers ingevoerd" + "Afbeelding bewerken" + "Het volledige adres wordt %1$s" "Wachtwoord verbergen" "Deelnemen aan gesprek" "Spring naar einde" + "Ga naar mijn locatie op de kaart" "Alleen vermeldingen" "Gedempt" + "Nieuwe vermeldingen" + "Nieuwe berichten" + "Actieve oproep" + "Afbeelding van andere gebruiker" "Pagina %1$d" "Pauzeren" "Spraakbericht, duur: %1$s, huidige positie: %2$s" @@ -28,14 +36,19 @@ "Gelezen door %1$s" "Tik om alles weer te geven" "Verwijder reactie met %1$s" + "Reactie met %1$s verwijderen" + "Kamerafbeelding" "Bestanden verzenden" "Wachtwoord weergeven" "Begin een oproep" + "Gebruikersafbeelding" "Gebruikersmenu" + "Bekijk afbeelding" "Details bekijken" "Spraakbericht, duur: %1$s" "Spraakbericht opnemen." "Opnemen stoppen" + "Jouw afbeelding" "Accepteren" "Beschrijving toevoegen" "Toevoegen aan tijdlijn" @@ -133,6 +146,7 @@ "Tik voor opties" "Probeer het opnieuw" "Losmaken" + "Bekijken" "Bekijk in tijdlijn" "Bron weergeven" "Ja" 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 70b55a2252..ff06c09efb 100644 --- a/libraries/ui-strings/src/main/res/values-ru/translations.xml +++ b/libraries/ui-strings/src/main/res/values-ru/translations.xml @@ -1,5 +1,6 @@ + "Добавить реакцию:%1$s" "Аватар" "Удалить" @@ -7,11 +8,15 @@ "Ведено %1$d цифры" "Введено много цифр" + "Сведения о шифровании" "Скрыть пароль" "Присоединиться к звонку" "Перейти вниз" "Только упоминания" "Звук отключен" + "Новые упоминания" + "Новые сообшения" + "Текущий вызов" "Страница %1$d" "Приостановить" "Голосовое сообщение, длительность: %1$s, текущая позиция: %2$s" @@ -325,6 +330,7 @@ "Предупреждение" "Изменения не сохранены. Вы действительно хотите вернуться?" "Сохранить изменения?" + "Выберите качество загружаемого видео" "Ваш домашний сервер необходимо обновить, чтобы он поддерживал Matrix Authentication Service и создание учётных записей." "Не удалось создать постоянную ссылку" "Не удалось загрузить карту %1$s. Пожалуйста, повторите попытку позже." 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 4c542069be..5288bc3f79 100644 --- a/libraries/ui-strings/src/main/res/values-sk/translations.xml +++ b/libraries/ui-strings/src/main/res/values-sk/translations.xml @@ -90,6 +90,7 @@ "Povoliť" "Ukončiť anketu" "Zadajte PIN" + "Dokončiť" "Zabudnuté heslo?" "Preposlať" "Ísť späť" @@ -168,6 +169,8 @@ "Pokročilé nastavenia" "obrázok" "Analytika" + "Opustili ste miestnosť" + "Boli ste odhlásení zo relácie." "Vzhľad" "Zvuk" "Blokovaní používatelia" @@ -308,6 +311,7 @@ Dôvod: %1$s." "Odhlasovanie" "Niečo sa pokazilo" "Vyskytol sa problém. Skúste to prosím znova." + "Priestor" "%1$d priestor" "%1$d priestory" diff --git a/libraries/ui-strings/src/main/res/values-sv/translations.xml b/libraries/ui-strings/src/main/res/values-sv/translations.xml index 8187c4b3a5..ca6dbb8bae 100644 --- a/libraries/ui-strings/src/main/res/values-sv/translations.xml +++ b/libraries/ui-strings/src/main/res/values-sv/translations.xml @@ -8,9 +8,12 @@ "%1$d siffror angivna" "Redigera avatar" + "Den fullständiga adressen kommer att vara %1$s" + "Krypteringsdetaljer" "Dölj lösenord" "Anslut till samtal" "Hoppa till botten" + "Flytta kartan till min plats" "Endast omnämningar" "Tystad" "Nya omnämnanden" @@ -39,6 +42,8 @@ "Skicka filer" "Visa lösenord" "Starta ett samtal" + "Tidsbegränsad åtgärd krävs" + "Gravstensmärkt rum" "Användaravatar" "Användarmeny" "Visa avatar" @@ -83,6 +88,7 @@ "Aktivera" "Avsluta omröstning" "Ange PIN-kod" + "Slutför" "Glömt lösenordet?" "Vidarebefordra" "Gå tillbaka" @@ -161,6 +167,8 @@ "Avancerade inställningar" "en bild" "Analysdata" + "Du lämnade rummet" + "Du loggades ut ur sessionen" "Utseende" "Ljud" "Blockerade användare" @@ -250,9 +258,12 @@ Anledning:%1$s." "%d röst" "%d röster" + "Förbereder …" "Integritetspolicy" "Privat rum" + "Privat utrymme" "Offentligt rum" + "Offentligt utrymme" "Reaktion" "Reaktioner" "Orsak" @@ -270,6 +281,10 @@ Anledning:%1$s." "Rum" "Rumsnamn" "t.ex. ditt projektnamn" + + "%1$d Rum" + "%1$d Rum" + "Sparade ändringar" "Sparar" "Skärmlås" @@ -289,6 +304,11 @@ Anledning:%1$s." "Loggar ut" "Något gick fel" "Vi stötte på ett problem. Vänligen försök igen." + "Utrymme" + + "%1$d Utrymme" + "%1$d Utrymmen" + "Startar chatt …" "Dekal" "Lyckades" @@ -319,6 +339,12 @@ Anledning:%1$s." "Verifiera identitet" "Verifiera användare" "Video" + "Hög kvalitet" + "Bästa kvalitet men större filstorlek" + "Låg kvalitet" + "Snabbast uppladdningshastighet och minsta filstorlek" + "Standardkvalitet" + "Balans mellan kvalitet och uppladdningshastighet" "Röstmeddelande" "Väntar …" "Väntar på detta meddelande" @@ -333,6 +359,10 @@ Anledning:%1$s." Är du säker på att du vill fortsätta?" "Dubbelkolla den här länken" + "Välj standardkvalitet för videor du laddar upp." + "Videouppladdningskvalitet" + "Maximal tillåten filstorlek är: %1$s" + "Filen är för stor för att laddas upp." "Rum anmält" "Anmälde och lämnade rummet" "Bekräftelse" @@ -341,6 +371,9 @@ Anledning:%1$s." "Varning" "Dina ändringar har inte sparats. Är du säker på att du vill gå tillbaka?" "Spara ändringar?" + "Den maximala tillåtna filstorleken är: %1$s" + "Välj kvaliteten på videon du vill ladda upp." + "Välj videouppladdningskvalitet" "Din hemserver måste uppgraderas för att stödja Matrix Authentication Service och skapande av konto." "Misslyckades att skapa permalänken" "%1$s kunde inte ladda kartan. Vänligen försök igen senare." @@ -368,6 +401,7 @@ Anledning:%1$s." "Hallå, prata med mig på %1$s: %2$s" "%1$s Android" "Raseriskaka för att rapportera bugg" + "Skärmdump" "%1$s: %2$s" "Alternativ" "Ta bort %1$s" @@ -390,6 +424,7 @@ Anledning:%1$s." "Ditt meddelande skickades inte eftersom %1$s inte har verifierat alla enheter" "En eller flera av dina enheter är overifierade. Du kan skicka meddelandet ändå, eller så kan du avbryta nu och försöka igen senare efter att du har verifierat alla dina enheter." "Ditt meddelande skickades inte eftersom du inte har verifierat en eller flera av dina enheter" + "Redigera administratörer eller ägare" "Misslyckades att bearbeta media för uppladdning, vänligen pröva igen." "Kunde inte hämta användarinformation" "Meddelande i %1$s" @@ -407,6 +442,9 @@ Anledning:%1$s." "Öppna i Google Maps" "Öppna i OpenStreetMap" "Dela den här platsen" + "Utrymmen som du har skapat eller gått med i." + "%1$s • %2$s" + "Utrymmen" "Meddelandet skickades inte eftersom verifierad identitet för %1$s återställdes." "Meddelandet skickades inte eftersom %1$s inte har verifierat alla enheter." "Meddelandet skickades inte eftersom du inte har verifierat en eller flera av dina enheter." diff --git a/libraries/ui-strings/src/main/res/values-uk/translations.xml b/libraries/ui-strings/src/main/res/values-uk/translations.xml index c2bc2a895e..83067641be 100644 --- a/libraries/ui-strings/src/main/res/values-uk/translations.xml +++ b/libraries/ui-strings/src/main/res/values-uk/translations.xml @@ -89,6 +89,7 @@ "Увімкнути" "Завершити опитування" "Введіть PIN-код" + "Завершити" "Забули пароль?" "Переслати" "Повернутися" @@ -262,7 +263,9 @@ "Приготування…" "Політика конфіденційності" "Приватна кімната (тільки за запрошенням)" + "Приватний простір" "Загальнодоступна кімната" + "Загальнодоступний простір" "Реакція" "Реакції" "Причина" @@ -281,6 +284,11 @@ "Кімната" "Назва кімнати" "напр., назва вашого проєкту" + + "%1$d кімната" + "%1$d кімнати" + "%1$d кімнат" + "Збережені зміни" "Збереження" "Блокування екрану" @@ -300,6 +308,12 @@ "Вихід" "Щось пішло не так" "Ми зіткнулися з проблемою. Будь ласка, повторіть спробу." + "Простір" + + "%1$d простір" + "%1$d простори" + "%1$d просторів" + "Початок бесіди…" "Наліпка" "Успіх" @@ -330,6 +344,12 @@ "Підтвердити особу" "Верифікувати користувача" "Відео" + "Висока якість" + "Найкраща якість, але більший розмір файлу" + "Низька якість" + "Найшвидша швидкість вивантаження та найменший розмір файлу" + "Стандартна якість" + "Баланс якості та швидкості вивантаження" "Голосове повідомлення" "Очікування…" "Чекаємо на це повідомлення" @@ -344,6 +364,7 @@ Ви впевнені, що хочете продовжити?" "Уважно перевірте це посилання" + "Якість вивантаження відео" "Скаргу на кімнату надіслано" "Поскаржитися та вийти з кімнати" "Підтвердження" @@ -403,6 +424,7 @@ "Ваше повідомлення не було надіслано, тому що %1$s не перевірив усі пристрої" "Один або кілька ваших пристроїв не підтверджено. Ви можете відправити повідомлення в будь-якому випадку, або ж скасувати відправку і спробувати пізніше, коли перевірите всі свої пристрої." "Ваше повідомлення не було надіслано, оскільки ви не підтвердили один або декілька своїх пристроїв" + "Змінити адміністраторів або власників" "Не вдалося обробити медіафайл для завантаження, спробуйте ще раз." "Не вдалося отримати дані користувача" "Повідомлення в %1$s" @@ -420,6 +442,9 @@ "Відкрити в Картах Google" "Відкрити в OpenStreetMap" "Поділитися цим місцем перебування" + "Простори, які ви створили або до яких приєдналися." + "%1$s • %2$s" + "Простори" "Повідомлення не надіслано, оскільки підтверджену особистість %1$s скинуто." "Повідомлення не надіслано, оскільки %1$s перевірив не всі пристрої." "Повідомлення не надіслано, оскільки ви не підтвердили один або кілька своїх пристроїв." diff --git a/libraries/ui-strings/src/main/res/values-ur/translations.xml b/libraries/ui-strings/src/main/res/values-ur/translations.xml index 1df9fd99aa..0262a99bf1 100644 --- a/libraries/ui-strings/src/main/res/values-ur/translations.xml +++ b/libraries/ui-strings/src/main/res/values-ur/translations.xml @@ -1,10 +1,14 @@ + "ایک رد عمل کا اضافہ کریں: %1$s" + "اوتار" "حذف کریں" "%1$d ہندسہ درج" "%1$d ہندسے درج" + "اووتار میں ترمیم کریں" + "مکمل پتہ ہو گا %1$s" "لفظ عبور چھپائیں" "نیچے چھلانگ لگائیں" "صرف تذکرے" @@ -36,17 +40,21 @@ "واپس" "مکالمہ کریں" "منسوخ کریں" + "ابھی کے لیے منسوخ کریں" "تصویر چنیں" "صاف کریں" "بند کریں" "توثیق مکمل کریں" "تصدیق کریں" + "پاس ورڈ کی تصدیق" "جاری رکھیں" "نقل" "ربط نقل کریں" "پیغام کا ربط نقل کریں" "تخلیق کریں" "ایک کمرہ بنائیں" + "غیر فعال کریں" + "اکاؤنٹ کو غیر فعال کریں" "مسترد کریں" "رائے شماری حذف کریں" "غیر فعال کریں" @@ -112,8 +120,11 @@ "اختیارات کے لیے تھپتھپائیں" "دوبارہ کوشش کریں" "غیر تثبیت کریں" + "ٹائم لائن میں دیکھیں" "ماخذ دیکھیں" "ہاں" + "آپ کا سرور اب ایک نئے، تیز تر پروٹوکول کو سپورٹ کرتا ہے۔ لاگ آؤٹ کریں اور ابھی اپ گریڈ کے لیے دوبارہ لاگ ان کریں۔ ابھی ایسا کرنے سے آپ کو زبردستی لاگ آؤٹ سے بچنے میں مدد ملے گی جب پرانا پروٹوکول بعد میں ہٹا دیا جائے گا۔" + "اپ گریڈ دستیاب ہے۔" "بمتعلق" "قابل قبول استعمال کی سیاست" "اعلیٰ ترتیبات" @@ -124,6 +135,7 @@ "بلبلے" "مکالمہ شروع" "گفتگو کا پشتارہ" + "کلپ بورڈ میں کاپى کیا گیا" "حقوقِ طبع و نشر" "کمرہ تخلیق کررہاہے…" "کمرہ چھوڑ لیا" @@ -180,6 +192,7 @@ "لوگ" "مستقل ربط" "اجازت" + "پن کردہ" "براہ کرم انتظار کریں…" "کیا آپ واقعی اس رائے شماری کو ختم کرنا چاہتے ہیں؟" "رائے شماری: %1$s" @@ -247,12 +260,14 @@ "صوتی پیغام" "منتظر…" "اس پیغام کا منتظر" + "آپ" "تصدیق" "خرابی" "کامیابی" "انتباہ" "آپ کی تبدیلیاں محفوظ نہیں کی گئیں۔ کیا آپ کو یقین ہے کہ آپ واپس جانا چاہتے ہیں؟" "تبدیلیاں محفوظ کریں؟" + "‏Matrix Authentication Service اور اکاؤنٹ بنانے میں معاونت کے لیے آپ کے ہوم سرور کو اپ گریڈ کرنے کی ضرورت ہے۔" "مستقل ربط تخلیق کرنا ناکام" "%1$s نقشہ لاد نہیں سکا۔ برائے مہربانی بعد میں دوبارہ کوشش کریں۔" "پیغامات لادنا ناکام" @@ -265,6 +280,7 @@ "کچھ پیغامات ارسال نہیں ہوئے" "معذرت، ایک خرابی واقع ہوگئی" "اس آلہ پر اس مرموز کردہ پیغام کی صداقت کی ضمانت نہیں دی جا سکتی۔" + "پہلے سے تصدیق شدہ صارف کے ذریعہ خفیہ کردہ۔" "مرموز کردہ نہیں۔" "کسی نامعلوم یا حذف شدہ آلے کے ذریعے مرموز کردہ۔" "کسی ایسے آلے کے ذریعے مرموز کردہ جس کی توثیق اسکے مالک سے نہیں ہوئی۔" @@ -274,11 +290,23 @@ "%1$s Android" "خطاء کی اطلاع دینے کیلئے غصے سے ہلائیں" "وسائط منتخب کرنا ناکام، برائے مہربانی دوبارہ کوشش کریں۔" + "ایک پیغام پر دبائیں اور یہاں شامل کرنے کے لیے %1$s منتخب کریں۔" + "اہم پیغامات کو پن کریں تاکہ انہیں آسانی سے دریافت کیا جا سکے۔" "%1$d مثبوتہ پیغام" "%1$d مثبوتہ پیغامات" "مثبوتہ پیغامات" + "آپ اپنی شناخت کو دوبارہ ترتیب دینے کے لیے اپنی %1$s اکاؤنٹ میں جانے والے ہیں۔ اس عمل کے بعد آپ کو ایپ پر واپس لے جایا جائے گا۔" + "تصدیق نہیں کر سکتے؟ اپنی شناخت کو دوبارہ ترتیب دینے کے لیے اپنے اکاؤنٹ پر جائیں۔" + "تصدیق واپس لیں اور پیغام بھیجیں" + "آپ اپنی ویریفیکیشن ختم کر سکتے ہیں اور یہ پیغام بہرحال بھیج سکتے ہیں، یا آپ ابھی کے لیے منسوخ کر سکتے ہیں اور %1$s کے دوبارہ ویریفیکیشن کے بعد پھر سے کوشش کر سکتے ہیں." + "آپ کا پیغام نہیں بھیجا گیا کیوں کہ %1$s کی تصدیق شدہ شناخت کو دوبارہ ترتیب دے دیا گیا ہے" + "بہرحال پیغام بھیجیں" + "%1$s ایک یا زائد غیر تصدیق شدہ آلات استعمال کر رہے ہیں۔ آپ پھر بھی پیغام بھیج سکتے ہیں، یا آپ ابھی کے لیے منسوخ کر سکتے ہیں اور بعد میں دوبارہ کوشش کر سکتے ہیں، جب %2$s اپنے تمام آلات کی تصدیق کر چکے ہوں۔" + "آپ کا پیغام نہیں بھیجا گیا کیونکہ%1$s نے تمام آلات کی تصدیق نہیں کی ہے" + "آپ کے ایک یا زائد آلات غیر تصدیق شدہ ہیں۔ آپ بہر حال پیغام بھیج سکتے ہیں، یا آپ ابھی کے لیے منسوخ کر سکتے ہیں اور اپنے تمام آلات کی تصدیق کرنے کے بعد دوبارہ کوشش کر سکتے ہیں۔" + "آپ کا پیغام نہیں بھیجا گیا کیوں کہ آپ نے اپنے ایک یا زیادہ آلات کی تصدیق نہیں کی ہے۔" "وسائط کا معالجہ برائے ترفیع ناکام، برائے مہربانی دوبارہ کوشش کریں۔" "صارف کی تفصیلات بازیافت نہیں ہوسکیں" "%1$s از %2$s" @@ -292,6 +320,9 @@ "گوگل میپس میں کھولیں۔ل" "اوپن اسٹریٹ میپ میں کھولیں" "اس مقام کا اشتراک کریں" + "پیغام نہیں بھیجا گیا کیونکہ %1$s کی تصدیق شدہ شناخت کو دوبارہ ترتیب دے دیا گیا ہے۔" + "پیغام نہیں بھیجا گیا کیونکہ%1$s نے تمام آلات کی تصدیق نہیں کی ہے۔" + "پیغام نہیں بھیجا گیا کیونکہ آپ نے اپنے ایک یا زیادہ آلات کی تصدیق نہیں کی ہے۔" "مقام" "نسخہ %1$s (%2$s)" "ur" diff --git a/libraries/ui-strings/src/main/res/values-uz/translations.xml b/libraries/ui-strings/src/main/res/values-uz/translations.xml index 888ab594d6..62d216c239 100644 --- a/libraries/ui-strings/src/main/res/values-uz/translations.xml +++ b/libraries/ui-strings/src/main/res/values-uz/translations.xml @@ -1,42 +1,84 @@ + "Reaksiya qoʻyish: %1$s" "Avatar" "Oʻchirish" + + "%1$d ta raqam kiritildi" + "%1$d ta raqam kiritildi" + + "Avatarni tahrirlash" + "Shifrlash tafsilotlari" "Parolni yashirish" + "Qoʻngʻiroqga qoʻshilish" + "Pastga o\'tish" + "Xaritani mening joylashuvimga o\'tkazish" "Faqat eslatmalar" "Ovozsiz" + "Yangi xabarlar" + "Davom etayotgan qo\'ng\'iroq" + "Boshqa foydalanuvchining avatari" + "Sahifa %1$d" "Pauza" + "Ovoz xabar, davomiyligi: %1$s, joriy holati: %2$s" + "PIN-kod maydoni" "O\'ynang" "So\'ro\'vnoma" "So‘rovnoma yakunlandi" + "Boshqa hisbelgilar bilan munosabat bildiring" + "Hammasini ko\'rsatish uchun bosing" + "Reaktsiyani olib tashlang: %1$s" + "%1$s bilan reaktsiyani olib tashlang" + "Xona avatari" "Fayllarni yuborish" "Parolni ko\'rsatish" + "Qoʻngʻiroqni boshlash" + "Vaqt cheklangan harakat talab qilinadi" + "Arxivlangan xona" + "Foydalanuvchi avatari" "Foydalanuvchi menyusi" + "Avatarni koʻrish" + "Tafsilotlarni ko\'rish" + "Ovozli xabar, davomiyligi: %1$s" "Ovoz yozishni amalga oshiring" + "Yozishni to\'xtatish" + "Sizning avataringiz" "Qabul qiling" "Vaqt jadvaliga qo\'shing" "Orqaga" + "Qoʻngʻiroq" "Bekor qilish" + "Hozircha bekor qilish" "Fotosuratni tanlang" "Tozalash" "Yopish" "To\'liq tekshirish" "Tasdiqlash" + "Parolni tasdiqlang" "Davom etish" "Nusxa" "Havolani nusxalash" "Havolani xabaraga nusxalash" + "Matnni nusxalash" "Yaratmoq" "Xonani yaratish" + "Faolsizlantirish" + "Hisobni faolsizlantirish" "Rad etish" + "Rad etish va bloklash" "Oʻchirish" + "Bekor qilish" + "Bekor qilish" "Bajarildi" "Tahrirlash" "So‘rovnomani tahrirlash" "Yoqish" "So‘rovnomani tugatish" + "PIN kodni kiriting" "Parolni unutdingizmi?" "Oldinga" + "Ortga qaytish" + "E’tiborsiz qoldirish" "Taklif qilish" "Odamlarni taklif qiling" "Odamlarni taklif qilish%1$s" @@ -45,31 +87,42 @@ "Qo\'shilish" "Batafsil malumot" "Tark etish" + "Suhbatni tark etish" "Xonani tark etish" + "Ko\'proq yuklash" "Hisobni boshqarish" "Qurilmalarni boshqarish" + "Xabar" "Keyingisi" "Yo\'q" "Hozir emas" "Ok" + "Kontekst menyusini oching" "Sozlamalar" "Bilan oching" "Tez javob" "Iqtibos" "Reaksiya qilish" + "Rad etish" "Ochirish" - "Javob bering" - "Mavzuda javob bering" + "Xabarni olib tashlash" + "Javob berish" + "Mavzuda javob berish" "Xato haqida xabar berish" "Tarkib haqida xabar berish" + "Suhbat haqida shikoyat bering" + "Boshlangʻich holatiga qaytarish" "Qayta urinish" "Shifrni ochishni qayta urinish" "Saqlash" "Qidirmoq" "Yuborish" + "Tahrirlangan xabarni yuboring" "Xabar yuborish" + "Ovozli xabar yuborish" "Ulashish" "Havolani ulashing" + "Koʻrsatish" "Qaytadan kiring" "Tizimdan chiqish" "Baribir tizimdan chiqing" @@ -79,52 +132,95 @@ "Tasdiqlashni boshlang" "Xaritani yuklash uchun bosing" "Rasmga olmoq" + "Variantlar uchun bosing" + "Qayta urinib ko\'ring" + "Ko\'rish" + "Vaqt jadvalida koʻrish" "Manbani korish" "Ha" + "Ha, qayta urinish" + "Sizning serveringiz endi yangi, tezroq protokolni qoʻllab-quvvatlaydi. Hozir yangilash uchun tizimdan chiqing va qayta kiring. Buni hozir qilish eski protokol bilan kirib, keyin olib tashlanganda majburiy chiqib-kirishni oldini olishga yordam beradi." + "Yangilash mavjud" "Haqida" "Qabul qilinadigan foydalanish siyosati" "Kengaytirilgan sozlamalar" + "rasm" "Analitika" + "Ko\'rinish" "Audio" + "Bloklangan foydalanuvchilar" "Pufakchalar" + "Qoʻngʻiroq boshlandi" "Chatning zaxira nusxasi" + "Buferga nusxa koʻchirildi" "Mualliflik huquqi" "Xona yaratilmoqda…" + "So\'rov bekor qilindi" "Xonani tark etdi" + "Taklif rad etildi" + "Tungi" "Shifrni ochish xatosi" "Dasturchi variantlari" + "Qurilma ID" + "Shaxsiy suhbat" + "Bu boshqa ko\'rsatilmasin" + "Yuklab olish amalga oshmadi" + "Yuklab olinmoqda" "(tahrirlangan)" "Tahrirlash" "*%1$s%2$s" + "Bo\'sh fayl" + "Shifrlash" "Shifrlash yoqilgan" + "PIN kodini kiriting" "Xato" + "Xato yuz berdi, siz yangi xabarlar uchun bildirishnomalarni olmasligingiz mumkin. Iltimos, sozlamalardan bildirishnomalarni bartaraf eting. + +Sababi:%1$s." "Har kim" + "Xatolikka uchradi" + "Sevimli" + "Sevimli" "Fayl" + "Fayl o\'chirildi" + "Fayl saqlandi" "Fayl “Yuklashlar”ga saqlandi" "Xabarni yo\'naltirish" + "Tez-tez ishlatiladigan" "GIF" "Surat" "%1$sga Javob bering" "APK-ni o\'rnating" "Ushbu Matrix identifikatori topilmadi, shuning uchun taklif qabul qilinmasligi mumkin." "Xonadan chiqish" + "Nur" + "Satr vaqtinchalik xotiraga nusxalandi" "Havola vaqtinchalik xotiraga nusxalandi" "Yuklanmoqda…" + "Batafsil yuklanmoqda…" "%1$d a\'zo" "%1$d ishtirokchilar" "Xabar" + "Xabar harakatlari" "Xabar tartibi" "Xabar ochirib tashlandi" "Zamonaviy" "Ovozsiz qilish" + "%1$s(%2$s )" "Natijalar yoʻq" + "Xona nomi yoʻq" + "Shifrlanmagan" "Oflayn" + "Ochiq kodli litsenziyalar" + "yoki" "Parol" "Odamlar" "Doimiy havola" "Ruxsat" + "Internet ulanishingizni tekshiring" + "Iltimos kuting…" "Haqiqatan ham bu soʻrovnomani tugatmoqchimisiz?" "So‘rov:%1$s" "Jami ovozlar:%1$s" @@ -133,39 +229,57 @@ "%dovoz berish" "%dovozlar" + "Tayyorlanmoqda…" "Maxfiylik siyosati" - "Shaxsiy xona (faqat taklif)" + "Shaxsiy xona" "Reaktsiya" "reaksiyalar" + "Sabab" "Qayta tiklash kaliti" "Yangilanmoqda…" "%1$sga Javob berilmoqda" "Xato haqida xabar bering" + "Muammo haqida xabar bering" "Hisobot topshirildi" "Boy matn muharriri" + "Xona" "Xona nomi" "masalan, loyihangiz nomi" + "Saqlangan oʻzgarishlar" + "Saqlash" + "Ekran qulfi" "Kimnidir qidiring" "Qidiruv natijalari" "Xavfsizlik" + "Tomonidan koʻrilgan" + "Yubirish" "Yuborilmoqda…" + "Yuborilmadi" + "Yuborilgan" + ". " "Server qo\'llab-quvvatlanmaydi" "Server URL manzili" "Sozlamalar" "Joylashuvi ulashildi" + "Nimadir xato ketdi" + "Muammoga duch keldik. Iltimos, qayta urinib koʻring." "Chat boshlanmoqda…" "Stiker" "Muvaffaqiyat" "Tavsiyalar" "Sinxronlash" + "Tizim" "Matn" "Uchinchi tomon bildirishnomalari" "Ip" "Mavzu" "Bu xona nima haqida?" "Shifrni ochish imkonsiz" + "Xavfsiz boʻlmagan qurilmadan yuborilgan" + "Sizni ushbu xabarga ruxsatingiz yoʻq" "Takliflarni bir yoki bir nechta foydalanuvchiga yuborib bo‘lmadi." "Taklif(lar)ni yuborib bo‘lmadi" + "Qulfni ochish" "Ovozni yoqish" "Qo\'llab-quvvatlanmagan hodisa" "Foydalanuvchi nomi" @@ -174,6 +288,7 @@ "Video" "Ovozli xabar" "Kutilmoqda…" + "Ushbu xabarni kutilmoqda" "Tasdiqlash" "Xato" "Muvaffaqiyat" @@ -184,6 +299,7 @@ "%1$sjoylashuvingizga kira olmadi. Iltimos keyinroq qayta urinib ko\'ring." "%1$sjoylashuvingizga kirishga ruxsati yo\'q. Sozlamalar orqali kirishni yoqishingiz mumkin." "%1$sjoylashuvingizga kirishga ruxsati yo\'q. Quyida kirishni yoqing." + "%1$smikrofoningizga kirish ruxsatiga ega emas. Ovozli xabar yozish uchun ruxsatni yoqing." "Bazi xabarlar yuborilmagan" "Kechirasiz, xatolik yuz berdi" "🔐️ Menga qo\'shiling%1$s" diff --git a/libraries/ui-strings/src/main/res/values-zh-rTW/translations.xml b/libraries/ui-strings/src/main/res/values-zh-rTW/translations.xml index 4f3fb4b963..5e513419d3 100644 --- a/libraries/ui-strings/src/main/res/values-zh-rTW/translations.xml +++ b/libraries/ui-strings/src/main/res/values-zh-rTW/translations.xml @@ -1,15 +1,24 @@ + "新增反應:%1$s" "大頭貼" "刪除" "已輸入 %1$d 個位數" + "編輯大頭照" + "完整地址為 %1$s" + "加密詳細資訊" "隱藏密碼" "加入通話" "跳至底部" + "將地圖移動到我的位置" "僅限提及" "已關閉通知" + "新提及" + "新訊息" + "進行中的通話" + "其他使用者的大頭照" "第 %1$d 頁" "暫停" "語音訊息,時長:%1$s,目前位置:%2$s" @@ -26,14 +35,21 @@ "%1$s 已讀" "點擊以顯示全部" "移除 %1$s 的反應" + "移除反應 %1$s" + "聊天室大頭照" "傳送檔案" "顯示密碼" "開始通話" + "需要限時動作" + "墓碑聊天室" + "使用者大頭照" "使用者選單" + "檢視大頭照" "檢視詳細資訊" "語音訊息,時長:%1$s" "錄製語音訊息。" "停止錄音" + "您的大頭照" "接受" "新增標題" "新增至時間軸" @@ -92,6 +108,7 @@ "否" "以後再說" "OK" + "開啟情境選單" "開啟設定" "用其他方式開啟" "釘選" @@ -116,7 +133,9 @@ "儲存" "搜尋" "傳送" + "傳送已編輯的訊息" "傳送訊息" + "傳送語音訊息" "分享" "分享連結" "顯示" @@ -132,6 +151,7 @@ "點擊以查看選項" "再試一次" "取消釘選" + "檢視" "在時間軸中檢視" "檢視來源" "是" @@ -142,6 +162,7 @@ "可接受使用政策" "新增標題" "進階設定" + "影像" "分析" "外觀" "音訊" @@ -229,14 +250,20 @@ "%d 票" + "正在準備……" "隱私權政策" "私密聊天室" + "私人空間" "公開的聊天室" + "公開空間" "回應" "回應" "理由" "復原金鑰" "重新整理中…" + + "%1$d 個回覆" + "正在回覆%1$s" "回報程式錯誤" "回報問題" @@ -245,6 +272,9 @@ "聊天室" "聊天室名稱" "範例:您的計畫名稱" + + "%1$d 個聊天室" + "變更已儲存" "儲存中" "螢幕鎖定" @@ -256,6 +286,7 @@ "傳送中…" "傳送失敗" "已傳送" + ". " "伺服器不支援" "伺服器 URL" "設定" @@ -263,6 +294,9 @@ "正在登出" "有錯誤發生" "我們了遇到了問題。請再試一次。" + + "%1$d 個空間" + "開始聊天…" "貼圖" "成功" @@ -321,6 +355,7 @@ "無法載入訊息" "%1$s 無法取得您的位置。請稍後再試。" "無法上傳語音訊息。" + "此聊天室不再存在或邀請不再有效。" "找不到訊息" "%1$s 沒有權限存取您的位置。您可以到設定中開啟權限。" "%1$s 沒有權限存取您的位置。請在下方開啟權限。" @@ -330,6 +365,7 @@ "不允許使用部份字元。僅支援字母、數字與以下符號 ! $ & ‘ ( ) * + / ; = ? @ [ ] - . _" "有些訊息尚未傳送" "抱歉,發生錯誤" + "事件的傳送者與傳送該事件的裝置擁有者不相符。" "無法在此裝置上保證此加密訊息的真實性。" "由先前驗證的使用者加密。" "未加密。" @@ -340,6 +376,11 @@ "嘿,來 %1$s 和我聊天:%2$s" "%1$s Android" "憤怒搖晃以回報臭蟲" + "螢幕截圖" + "%1$s:%2$s" + "選項" + "移除 %1$s" + "設定" "選取媒體失敗,請再試一次。" "按一下訊息,然後選擇「%1$s」以加入至此。" "釘選重要訊息,如此才能輕鬆發現" @@ -360,6 +401,9 @@ "無法處理要上傳的媒體,請再試一次。" "無法擷取使用者詳細資訊" "%1$s 中的訊息" + "展開" + "減少" + "已檢視此聊天室!" "第 %1$s 個,共 %2$s 個" "%1$s 個釘選訊息" "正在載入訊息……" @@ -371,6 +415,9 @@ "在 Google Maps 中開啟" "在開放街圖(OpenStreetMap) 中開啟" "分享這個位置" + "您建立或加入的空間" + "%1$s • %2$s" + "空間" "因為 %1$s 的驗證身份已重設,因此未傳送訊息。" "訊息未傳送,因為 %1$s 尚未驗證所有裝置。" "因為您尚未驗證一個或多個裝置,因此未傳送訊息" diff --git a/libraries/ui-strings/src/main/res/values-zh/translations.xml b/libraries/ui-strings/src/main/res/values-zh/translations.xml index 0363ae9405..748eb11254 100644 --- a/libraries/ui-strings/src/main/res/values-zh/translations.xml +++ b/libraries/ui-strings/src/main/res/values-zh/translations.xml @@ -5,11 +5,16 @@ "已输入 %1$d 个数字" + "编辑头像" + "加密详情" "隐藏密码" "加入通话" "跳转到底部" + "将地图移动到我的位置" "仅提及" "通知已关闭" + "正在进行的通话" + "其他用户的头像" "第 %1$d 页" "暂停" "语音消息,时长:%1$s,当前位置:%2$s" @@ -26,14 +31,18 @@ "%1$s 已读" "点击以显示全部" "撤回反应 %1$s" + "房间头像" "发送文件" "显示密码" "开始通话" + "用户头像" "用户菜单" + "查看头像" "查看详情" "语音消息,时长:%1$s" "录制语音消息" "停止录制" + "您的头像" "接受" "添加标题" "添加到时间线" @@ -132,6 +141,7 @@ "点按查看选项" "再试一次" "取消置顶" + "查看" "在时间轴中查看" "查看源码" "是" @@ -324,6 +334,7 @@ "加载消息失败" "%1$s 无法访问您的位置,请稍后再试。" "无法上传语音消息。" + "该房间已不存在或邀请已失效。" "找不到消息" "%1$s 没有权限访问您的位置。您可以在设置中启用位置权限。" "%1$s 没有权限访问您的位置。在下方启用位置权限。" @@ -343,6 +354,7 @@ "嗨!请通过 %1$s 与我联系:%2$s" "%1$s Android" "摇一摇以报错" + "设置" "选择媒体失败,请重试。" "按下消息并选择 “%1$s” 将其包含在此处。" "固定重要消息,以便轻松发现它们" diff --git a/libraries/ui-strings/src/main/res/values/localazy.xml b/libraries/ui-strings/src/main/res/values/localazy.xml index ec29d79f19..70531b5a27 100644 --- a/libraries/ui-strings/src/main/res/values/localazy.xml +++ b/libraries/ui-strings/src/main/res/values/localazy.xml @@ -88,6 +88,7 @@ "Enable" "End poll" "Enter PIN" + "Finish" "Forgot password?" "Forward" "Go back" @@ -166,6 +167,8 @@ "Advanced settings" "an image" "Analytics" + "You left the room" + "You were logged out of the session" "Appearance" "Audio" "Blocked users" @@ -301,6 +304,7 @@ Reason: %1$s." "Signing out" "Something went wrong" "We encountered an issue. Please try again." + "Space" "%1$d Space" "%1$d Spaces" diff --git a/libraries/voiceplayer/api/build.gradle.kts b/libraries/voiceplayer/api/build.gradle.kts index 82876b4734..4490dbbe11 100644 --- a/libraries/voiceplayer/api/build.gradle.kts +++ b/libraries/voiceplayer/api/build.gradle.kts @@ -1,5 +1,3 @@ -import extension.setupAnvil - /* * Copyright 2024 New Vector Ltd. * @@ -14,8 +12,6 @@ android { namespace = "io.element.android.libraries.voiceplayer.api" } -setupAnvil() - dependencies { implementation(libs.androidx.annotationjvm) implementation(libs.coroutines.core) diff --git a/libraries/voicerecorder/api/build.gradle.kts b/libraries/voicerecorder/api/build.gradle.kts index eb296a52bf..b2be9d5aba 100644 --- a/libraries/voicerecorder/api/build.gradle.kts +++ b/libraries/voicerecorder/api/build.gradle.kts @@ -1,5 +1,3 @@ -import extension.setupAnvil - /* * Copyright 2023, 2024 New Vector Ltd. * @@ -14,8 +12,6 @@ android { namespace = "io.element.android.libraries.voicerecorder.api" } -setupAnvil() - dependencies { implementation(libs.androidx.annotationjvm) implementation(libs.coroutines.core) diff --git a/plugins/src/main/kotlin/Versions.kt b/plugins/src/main/kotlin/Versions.kt index 03ce6b6d82..faa9bac02c 100644 --- a/plugins/src/main/kotlin/Versions.kt +++ b/plugins/src/main/kotlin/Versions.kt @@ -32,12 +32,14 @@ private const val versionYear = 25 private const val versionMonth = 8 // Note: must be in [0,99] -private const val versionReleaseNumber = 3 +private const val versionReleaseNumber = 4 object Versions { const val VERSION_CODE = (2000 + versionYear) * 10_000 + versionMonth * 100 + versionReleaseNumber val VERSION_NAME = "$versionYear.${versionMonth.toString().padStart(2, '0')}.$versionReleaseNumber" + // When updating COMPILE_SDK, please do not forget to update the value for `buildToolsVersion` + // in the file `tools/release/release.sh` const val COMPILE_SDK = 36 const val TARGET_SDK = 36 diff --git a/plugins/src/main/kotlin/extension/DependencyHandleScope.kt b/plugins/src/main/kotlin/extension/DependencyHandleScope.kt index 0f5afb9690..440f9d338b 100644 --- a/plugins/src/main/kotlin/extension/DependencyHandleScope.kt +++ b/plugins/src/main/kotlin/extension/DependencyHandleScope.kt @@ -59,7 +59,7 @@ fun DependencyHandlerScope.composeDependencies(libs: LibrariesForLibs) { fun DependencyHandlerScope.allLibrariesImpl() { implementation(project(":libraries:androidutils")) - implementation(project(":libraries:deeplink")) + implementation(project(":libraries:deeplink:impl")) implementation(project(":libraries:designsystem")) implementation(project(":libraries:matrix:impl")) implementation(project(":libraries:matrixui")) diff --git a/screenshots/de/appnav.loggedin_LoggedInView_Day_1_de.png b/screenshots/de/appnav.loggedin_LoggedInView_Day_1_de.png index e9dc7a593f..65218d0553 100644 --- a/screenshots/de/appnav.loggedin_LoggedInView_Day_1_de.png +++ b/screenshots/de/appnav.loggedin_LoggedInView_Day_1_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:a66053fd8eb2da06267c468188f9a1ddc2a217cfcf22ea66e3885e2f904a28ca -size 9433 +oid sha256:da60f3bf796da1da92bc74751d688b40f34c9f4e89ab684d36e6f60942f8b5cc +size 9410 diff --git a/screenshots/de/appnav.loggedin_LoggedInView_Day_2_de.png b/screenshots/de/appnav.loggedin_LoggedInView_Day_2_de.png index ce6fe49129..357f34244f 100644 --- a/screenshots/de/appnav.loggedin_LoggedInView_Day_2_de.png +++ b/screenshots/de/appnav.loggedin_LoggedInView_Day_2_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:99724a37f99aa3a1e89a4ece346c4f9dd6851535315de913ff7cb2d19e382444 -size 43216 +oid sha256:382aa5e1c79c5d9426b0cda73d0f003959622f3c59c8135949c5aeed9f8e1bd2 +size 43300 diff --git a/screenshots/de/appnav.loggedin_LoggedInView_Day_3_de.png b/screenshots/de/appnav.loggedin_LoggedInView_Day_3_de.png index d8c4713dda..39da6c2866 100644 --- a/screenshots/de/appnav.loggedin_LoggedInView_Day_3_de.png +++ b/screenshots/de/appnav.loggedin_LoggedInView_Day_3_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:357e03b3d791ba37acc706b1857c774194d3f5a56f94921135bbb5744229cedb -size 27594 +oid sha256:edcca49ae428332a771ecb4f2f546061bae5781e292dee68ec8a147dc75099eb +size 27583 diff --git a/screenshots/de/appnav.loggedin_SyncStateView_Day_0_de.png b/screenshots/de/appnav.loggedin_SyncStateView_Day_0_de.png index c0461bc3f2..cffaecce09 100644 --- a/screenshots/de/appnav.loggedin_SyncStateView_Day_0_de.png +++ b/screenshots/de/appnav.loggedin_SyncStateView_Day_0_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:2b263d3a927605d3002973cea5ee0b8183e18bd9d6914bf159504438a3588c3e -size 9565 +oid sha256:45e28203a3be51ece7ccd33926a5005559adec8551d55ee805ee2d0c5039e24b +size 9911 diff --git a/screenshots/de/appnav.room.joined_LoadingRoomNodeView_Day_1_de.png b/screenshots/de/appnav.room.joined_LoadingRoomNodeView_Day_1_de.png index d3bdd13cb3..ec1170a517 100644 --- a/screenshots/de/appnav.room.joined_LoadingRoomNodeView_Day_1_de.png +++ b/screenshots/de/appnav.room.joined_LoadingRoomNodeView_Day_1_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:e6ec5c2ed06463e7642443c89500e3e4864e439382f5358d78db0b53cddfe2d5 -size 13019 +oid sha256:ced98c61dd5c65e3ea9037dd6f5989fb9fa3626744ffe02afe7ed21c75645717 +size 13009 diff --git a/screenshots/de/appnav.root_RootView_Day_0_de.png b/screenshots/de/appnav.root_RootView_Day_0_de.png index a744d9fe8a..b4960cb90f 100644 --- a/screenshots/de/appnav.root_RootView_Day_0_de.png +++ b/screenshots/de/appnav.root_RootView_Day_0_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:d78407b5a9f4ff3fc9579ca734436fb9096fab35a1edcefd117c6a366a9640a7 -size 26395 +oid sha256:6c007c2f9fbf109b7516ce98b50cf586959c262e4c947302fb5daed88674d21c +size 26357 diff --git a/screenshots/de/appnav.root_RootView_Day_1_de.png b/screenshots/de/appnav.root_RootView_Day_1_de.png index 02cbca77b6..062f6ae240 100644 --- a/screenshots/de/appnav.root_RootView_Day_1_de.png +++ b/screenshots/de/appnav.root_RootView_Day_1_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:4419206d6e95d6de97c7594d19157e93791aee7826fb881d889e1552d10989f5 -size 30785 +oid sha256:74176ca9eaefcbf784912ff7acf8d9cc0fa35fd17e26f13f1fe5cb0ab3dac620 +size 30773 diff --git a/screenshots/de/appnav.root_RootView_Day_2_de.png b/screenshots/de/appnav.root_RootView_Day_2_de.png index 1cf267728a..456fea227e 100644 --- a/screenshots/de/appnav.root_RootView_Day_2_de.png +++ b/screenshots/de/appnav.root_RootView_Day_2_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:72dac0352bf40d582727598040a4a23352e9a91467bfa4f32f5f4a4a53617195 -size 21778 +oid sha256:5c6b161fcc127ce493ad38d8e7b54ae7c4c588a2fba7c06cbf9a6b8f6a404921 +size 21806 diff --git a/screenshots/de/features.analytics.api.preferences_AnalyticsPreferencesView_Day_0_de.png b/screenshots/de/features.analytics.api.preferences_AnalyticsPreferencesView_Day_0_de.png index d082e89bfc..6a94289a2e 100644 --- a/screenshots/de/features.analytics.api.preferences_AnalyticsPreferencesView_Day_0_de.png +++ b/screenshots/de/features.analytics.api.preferences_AnalyticsPreferencesView_Day_0_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:8725accabc4de494b460b769686787c8e16801ff4249d32e74cde7be013e339e -size 25505 +oid sha256:c43719372429a34f27d2e33203598c515b2cd6b5e0fd44957018ac9ab4e1496c +size 25888 diff --git a/screenshots/de/features.analytics.api.preferences_AnalyticsPreferencesView_Day_1_de.png b/screenshots/de/features.analytics.api.preferences_AnalyticsPreferencesView_Day_1_de.png index 1b639af6f1..db2c2cdc9a 100644 --- a/screenshots/de/features.analytics.api.preferences_AnalyticsPreferencesView_Day_1_de.png +++ b/screenshots/de/features.analytics.api.preferences_AnalyticsPreferencesView_Day_1_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:f94d7539ded3cd2494371dd8e7df89036946157c31c7cdbf5d646ea901942733 -size 20796 +oid sha256:189ffb530ca3c5d7272504d5990e2a2b582edd5b2c195019fd1c64520c7ee3d3 +size 21247 diff --git a/screenshots/de/features.analytics.impl_AnalyticsOptInView_Day_0_de.png b/screenshots/de/features.analytics.impl_AnalyticsOptInView_Day_0_de.png index 222d7385b2..035c7b8146 100644 --- a/screenshots/de/features.analytics.impl_AnalyticsOptInView_Day_0_de.png +++ b/screenshots/de/features.analytics.impl_AnalyticsOptInView_Day_0_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:b6b99f8f732aacb6a77bf856bbb5e23fb1478bf7ce90eafef9e7ba7b67da215f -size 86774 +oid sha256:2b0b3de4622987eba0daf2221a2029cf2f1a872065f7c26bc27b067413d806d8 +size 86873 diff --git a/screenshots/de/features.analytics.impl_AnalyticsOptInView_Day_1_de.png b/screenshots/de/features.analytics.impl_AnalyticsOptInView_Day_1_de.png index 9aff4b7a4a..dd5402556e 100644 --- a/screenshots/de/features.analytics.impl_AnalyticsOptInView_Day_1_de.png +++ b/screenshots/de/features.analytics.impl_AnalyticsOptInView_Day_1_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:11155727ceed9e3c6f22b149d90dd92b58af5e4be729e6920e7071d9f9734530 -size 84388 +oid sha256:3c533e6dd121969ca966e7d084649750c701b4e7e09ba7276095ce5859a39070 +size 84571 diff --git a/screenshots/de/features.call.impl.ui_CallScreenView_Day_1_de.png b/screenshots/de/features.call.impl.ui_CallScreenView_Day_1_de.png index 0a83b12192..6818d87c61 100644 --- a/screenshots/de/features.call.impl.ui_CallScreenView_Day_1_de.png +++ b/screenshots/de/features.call.impl.ui_CallScreenView_Day_1_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:b06d5375521caae14aa0621493a93e562e0ec655b9e83e19d05f9c1d9ffbb628 -size 11571 +oid sha256:54e25a035250a27e2fc17bbd3727f2fa0c4f8362cc51c4f6aa7d893db53ad233 +size 11545 diff --git a/screenshots/de/features.call.impl.ui_CallScreenView_Day_2_de.png b/screenshots/de/features.call.impl.ui_CallScreenView_Day_2_de.png index 9367c10d95..7cac8ad21d 100644 --- a/screenshots/de/features.call.impl.ui_CallScreenView_Day_2_de.png +++ b/screenshots/de/features.call.impl.ui_CallScreenView_Day_2_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:6011ceb2ef963b0410fd0bc3c01906c56a7f1b2a73f36c95f0951469c98f77dd -size 11128 +oid sha256:3703e9876fcbf94befc13f8f7fc91c266fc0dea558f84288c612623d3a1cf63f +size 11101 diff --git a/screenshots/de/features.call.impl.ui_CallScreenView_Day_3_de.png b/screenshots/de/features.call.impl.ui_CallScreenView_Day_3_de.png index 15ebcffdd4..82ac489296 100644 --- a/screenshots/de/features.call.impl.ui_CallScreenView_Day_3_de.png +++ b/screenshots/de/features.call.impl.ui_CallScreenView_Day_3_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:e3f09b0342378a82bbe394877fd03662f8d6554a1f91c9304e7118d171754f6d -size 19159 +oid sha256:486f72ab9be5c85ec5710f2b463801066b57225dc3e707416d067385ea7bb31d +size 19033 diff --git a/screenshots/de/features.call.impl.ui_IncomingCallScreen_Day_0_de.png b/screenshots/de/features.call.impl.ui_IncomingCallScreen_Day_0_de.png index f8ca7bb279..b7aad0695a 100644 --- a/screenshots/de/features.call.impl.ui_IncomingCallScreen_Day_0_de.png +++ b/screenshots/de/features.call.impl.ui_IncomingCallScreen_Day_0_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:99f8cabcb8d5d9301b3f9a35ea9f7220ed806046e7ed643a1261b62805f8f2fe -size 68307 +oid sha256:4589bdb8f0a2e14cc1588acb0f914f50b459bc4395f22d4a9303447773c59cfe +size 68453 diff --git a/screenshots/de/features.call.impl.ui_InvalidAudioDeviceDialog_Day_0_de.png b/screenshots/de/features.call.impl.ui_InvalidAudioDeviceDialog_Day_0_de.png index d19731fd42..3b27bbcfed 100644 --- a/screenshots/de/features.call.impl.ui_InvalidAudioDeviceDialog_Day_0_de.png +++ b/screenshots/de/features.call.impl.ui_InvalidAudioDeviceDialog_Day_0_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:e2a0bc5c60dd6014333ca545806986bf01dcae29939b6740993a3f3482ebbd72 -size 26953 +oid sha256:7223973e6d10b19d26354c55a5e627fae38db59e979cca13c0bbcde0d00d996a +size 26526 diff --git a/screenshots/de/features.changeroommemberroles.impl_ChangeRolesView_Day_0_de.png b/screenshots/de/features.changeroommemberroles.impl_ChangeRolesView_Day_0_de.png new file mode 100644 index 0000000000..60e591d166 --- /dev/null +++ b/screenshots/de/features.changeroommemberroles.impl_ChangeRolesView_Day_0_de.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:0b45f2dd9fa60e7f72b138e7e82d5a8cdc30467cdc5ea9c0afe09aa54c1686a7 +size 16120 diff --git a/screenshots/de/features.changeroommemberroles.impl_ChangeRolesView_Day_10_de.png b/screenshots/de/features.changeroommemberroles.impl_ChangeRolesView_Day_10_de.png new file mode 100644 index 0000000000..5ea694a14c --- /dev/null +++ b/screenshots/de/features.changeroommemberroles.impl_ChangeRolesView_Day_10_de.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:48daacb9a588911cfde9968b837d9bd0a658b0004a0202b5b8b15a7a2394ce31 +size 53128 diff --git a/screenshots/de/features.changeroommemberroles.impl_ChangeRolesView_Day_11_de.png b/screenshots/de/features.changeroommemberroles.impl_ChangeRolesView_Day_11_de.png new file mode 100644 index 0000000000..b0b35a18d1 --- /dev/null +++ b/screenshots/de/features.changeroommemberroles.impl_ChangeRolesView_Day_11_de.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:c8512a0da527276caefb7691fa0b05d9bb818516ee41bf54f5b7e6cc108ac06a +size 56795 diff --git a/screenshots/de/features.changeroommemberroles.impl_ChangeRolesView_Day_12_de.png b/screenshots/de/features.changeroommemberroles.impl_ChangeRolesView_Day_12_de.png new file mode 100644 index 0000000000..fa97527213 --- /dev/null +++ b/screenshots/de/features.changeroommemberroles.impl_ChangeRolesView_Day_12_de.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:125f7623db053fd931fe130e322ec7c6fc2d23048d44af99f2be0adb6ae2f989 +size 56732 diff --git a/screenshots/de/features.changeroommemberroles.impl_ChangeRolesView_Day_1_de.png b/screenshots/de/features.changeroommemberroles.impl_ChangeRolesView_Day_1_de.png new file mode 100644 index 0000000000..5e9bcc4bd8 --- /dev/null +++ b/screenshots/de/features.changeroommemberroles.impl_ChangeRolesView_Day_1_de.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:af47ab281e865ba673d68a8c420a82a2946002218914167d322bf2d9022b353e +size 74152 diff --git a/screenshots/de/features.changeroommemberroles.impl_ChangeRolesView_Day_2_de.png b/screenshots/de/features.changeroommemberroles.impl_ChangeRolesView_Day_2_de.png new file mode 100644 index 0000000000..4733d51574 --- /dev/null +++ b/screenshots/de/features.changeroommemberroles.impl_ChangeRolesView_Day_2_de.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:45f6978231b40811f7519eb5f44a53a6d5f26cc3b97866a855c63945110e579b +size 66862 diff --git a/screenshots/de/features.changeroommemberroles.impl_ChangeRolesView_Day_3_de.png b/screenshots/de/features.changeroommemberroles.impl_ChangeRolesView_Day_3_de.png new file mode 100644 index 0000000000..aec356916f --- /dev/null +++ b/screenshots/de/features.changeroommemberroles.impl_ChangeRolesView_Day_3_de.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:818f982c201854bf68c15400f7ae402264485907547bb05f385878fd5087e649 +size 66703 diff --git a/screenshots/de/features.changeroommemberroles.impl_ChangeRolesView_Day_4_de.png b/screenshots/de/features.changeroommemberroles.impl_ChangeRolesView_Day_4_de.png new file mode 100644 index 0000000000..0c61e423e3 --- /dev/null +++ b/screenshots/de/features.changeroommemberroles.impl_ChangeRolesView_Day_4_de.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:2ddcbbb8835843994915164859ca0eca0f21a7f3903cb79c1883942763353a02 +size 60619 diff --git a/screenshots/de/features.changeroommemberroles.impl_ChangeRolesView_Day_5_de.png b/screenshots/de/features.changeroommemberroles.impl_ChangeRolesView_Day_5_de.png new file mode 100644 index 0000000000..26582e0da8 --- /dev/null +++ b/screenshots/de/features.changeroommemberroles.impl_ChangeRolesView_Day_5_de.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:d045a9a6d4a1ba06d708e9875d1246646fed01c811ad61309cda5a994ecc53a7 +size 13955 diff --git a/screenshots/de/features.changeroommemberroles.impl_ChangeRolesView_Day_6_de.png b/screenshots/de/features.changeroommemberroles.impl_ChangeRolesView_Day_6_de.png new file mode 100644 index 0000000000..0ae98c6ff3 --- /dev/null +++ b/screenshots/de/features.changeroommemberroles.impl_ChangeRolesView_Day_6_de.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:38fc548ffe2045359013c41f84b2e88b9de96281d720a7284e905dee55b2225b +size 66251 diff --git a/screenshots/de/features.changeroommemberroles.impl_ChangeRolesView_Day_7_de.png b/screenshots/de/features.changeroommemberroles.impl_ChangeRolesView_Day_7_de.png new file mode 100644 index 0000000000..8238cfbd6f --- /dev/null +++ b/screenshots/de/features.changeroommemberroles.impl_ChangeRolesView_Day_7_de.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:67ef21cdd8a600a1ca924f86857cd9ce4187d9d09d6437c9480905d8af5a0913 +size 68580 diff --git a/screenshots/de/features.changeroommemberroles.impl_ChangeRolesView_Day_8_de.png b/screenshots/de/features.changeroommemberroles.impl_ChangeRolesView_Day_8_de.png new file mode 100644 index 0000000000..f93a97ba50 --- /dev/null +++ b/screenshots/de/features.changeroommemberroles.impl_ChangeRolesView_Day_8_de.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:21fa0b2a043f83012c4283359e8184a41874105fa83bbb4536e666ca7725f7cf +size 56879 diff --git a/screenshots/de/features.changeroommemberroles.impl_ChangeRolesView_Day_9_de.png b/screenshots/de/features.changeroommemberroles.impl_ChangeRolesView_Day_9_de.png new file mode 100644 index 0000000000..5ad31254df --- /dev/null +++ b/screenshots/de/features.changeroommemberroles.impl_ChangeRolesView_Day_9_de.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:1a25f1dca56b56b9351b8ac2a1363199243aaaab1658a3850958b3d814fa1e68 +size 69161 diff --git a/screenshots/de/features.changeroommemberroles.impl_PendingMemberRowWithLongName_Day_0_de.png b/screenshots/de/features.changeroommemberroles.impl_PendingMemberRowWithLongName_Day_0_de.png new file mode 100644 index 0000000000..fc9c3e2365 --- /dev/null +++ b/screenshots/de/features.changeroommemberroles.impl_PendingMemberRowWithLongName_Day_0_de.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:353deccaf44203d369a40c95032787afd5946b12b76c8fecde6a8b8028df7631 +size 15419 diff --git a/screenshots/de/features.createroom.impl.addpeople_AddPeopleView_Day_0_de.png b/screenshots/de/features.createroom.impl.addpeople_AddPeopleView_Day_0_de.png index 4d45624b4a..740e98aeee 100644 --- a/screenshots/de/features.createroom.impl.addpeople_AddPeopleView_Day_0_de.png +++ b/screenshots/de/features.createroom.impl.addpeople_AddPeopleView_Day_0_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:c0aaddb6b3cfb442b17c0b2b494ee65127bb0cb7c864849c0c25652f8822f344 -size 15631 +oid sha256:7fdbc90badc8e97594eea8768680d596b70885dfd0d3c0f337c23a29b907333d +size 11730 diff --git a/screenshots/de/features.createroom.impl.addpeople_AddPeopleView_Day_1_de.png b/screenshots/de/features.createroom.impl.addpeople_AddPeopleView_Day_1_de.png index 14f820e342..aa2f33a059 100644 --- a/screenshots/de/features.createroom.impl.addpeople_AddPeopleView_Day_1_de.png +++ b/screenshots/de/features.createroom.impl.addpeople_AddPeopleView_Day_1_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:d5d4134ba0b967c7639134044c64251687a44a6066b35f32c1f9f2b64611fc5e -size 25480 +oid sha256:15f307e09074490ae9cdf58ac0007ad746820c10fb31a85eb297b2de4f5d79f6 +size 12031 diff --git a/screenshots/de/features.createroom.impl.addpeople_AddPeopleView_Day_2_de.png b/screenshots/de/features.createroom.impl.addpeople_AddPeopleView_Day_2_de.png index 57134784b8..740e98aeee 100644 --- a/screenshots/de/features.createroom.impl.addpeople_AddPeopleView_Day_2_de.png +++ b/screenshots/de/features.createroom.impl.addpeople_AddPeopleView_Day_2_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:0236538a54605f6ebf22a2e13140d0b2c2531f857310ea52ee2dbfc1af83a48c -size 87006 +oid sha256:7fdbc90badc8e97594eea8768680d596b70885dfd0d3c0f337c23a29b907333d +size 11730 diff --git a/screenshots/de/features.createroom.impl.addpeople_AddPeopleView_Day_3_de.png b/screenshots/de/features.createroom.impl.addpeople_AddPeopleView_Day_3_de.png deleted file mode 100644 index 7c7700d4e3..0000000000 --- a/screenshots/de/features.createroom.impl.addpeople_AddPeopleView_Day_3_de.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:beebb1791d4b326ecab5f90c9a1d1acee6af667687438bf8510f804197848d33 -size 43490 diff --git a/screenshots/de/features.createroom.impl.components_SearchMultipleUsersResultItem_de.png b/screenshots/de/features.createroom.impl.components_SearchMultipleUsersResultItem_de.png deleted file mode 100644 index 47311f0649..0000000000 --- a/screenshots/de/features.createroom.impl.components_SearchMultipleUsersResultItem_de.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:36c2612774a37b20202d2f6e9132f9fa8aaa65567def256f072dcaa532233659 -size 100794 diff --git a/screenshots/de/features.createroom.impl.components_SearchSingleUserResultItem_de.png b/screenshots/de/features.createroom.impl.components_SearchSingleUserResultItem_de.png deleted file mode 100644 index 2b2b08eefe..0000000000 --- a/screenshots/de/features.createroom.impl.components_SearchSingleUserResultItem_de.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:742bbbcf30ae502a2d13475fc1f2b045bb239cb04995c74deadef630dacfae7d -size 51494 diff --git a/screenshots/de/features.createroom.impl.components_UserListView_Day_0_de.png b/screenshots/de/features.createroom.impl.components_UserListView_Day_0_de.png deleted file mode 100644 index b01e8f3daa..0000000000 --- a/screenshots/de/features.createroom.impl.components_UserListView_Day_0_de.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:1f3d3e011b7b2fd9f0732e9632333d65c6f22ddb4df448128ad18bce05fdea19 -size 9392 diff --git a/screenshots/de/features.createroom.impl.components_UserListView_Day_1_de.png b/screenshots/de/features.createroom.impl.components_UserListView_Day_1_de.png deleted file mode 100644 index 71d58d0eb7..0000000000 --- a/screenshots/de/features.createroom.impl.components_UserListView_Day_1_de.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:0678bcfff323a0fa3991d45c36d45d9d16e97e6c670be714d6de612440b22bef -size 20710 diff --git a/screenshots/de/features.createroom.impl.components_UserListView_Day_2_de.png b/screenshots/de/features.createroom.impl.components_UserListView_Day_2_de.png deleted file mode 100644 index d96220d923..0000000000 --- a/screenshots/de/features.createroom.impl.components_UserListView_Day_2_de.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:646f754dc9a02989008e469b2fbc8928bd12492c3de4b108c8a64508aae16ad2 -size 7970 diff --git a/screenshots/de/features.createroom.impl.components_UserListView_Day_7_de.png b/screenshots/de/features.createroom.impl.components_UserListView_Day_7_de.png deleted file mode 100644 index 5e8d68e7ac..0000000000 --- a/screenshots/de/features.createroom.impl.components_UserListView_Day_7_de.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:8342dae1c9b3769d867d856ecdc3b3302fa5cd94e80c6ad9ceddf482968305f1 -size 12343 diff --git a/screenshots/de/features.createroom.impl.components_UserListView_Day_9_de.png b/screenshots/de/features.createroom.impl.components_UserListView_Day_9_de.png deleted file mode 100644 index 821662ba5f..0000000000 --- a/screenshots/de/features.createroom.impl.components_UserListView_Day_9_de.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:95148a84c9a1d4574bfbf995a15d2711f59a26015fa6b928207b5e1266b72adb -size 37540 diff --git a/screenshots/de/features.createroom.impl.configureroom_ConfigureRoomViewDark_0_de.png b/screenshots/de/features.createroom.impl.configureroom_ConfigureRoomViewDark_0_de.png index 4afc5c3f0c..f0be139f19 100644 --- a/screenshots/de/features.createroom.impl.configureroom_ConfigureRoomViewDark_0_de.png +++ b/screenshots/de/features.createroom.impl.configureroom_ConfigureRoomViewDark_0_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:c86133bc1055fb12fc5648f19d7e9681aec831a6adae6fe1a6c3f4cfd36b3bf7 -size 36334 +oid sha256:bcca6c2f8aaa76470689e28a6fd500ea953c04ca6ef6db6b3303681bcb4a2f43 +size 37279 diff --git a/screenshots/de/features.createroom.impl.configureroom_ConfigureRoomViewDark_1_de.png b/screenshots/de/features.createroom.impl.configureroom_ConfigureRoomViewDark_1_de.png index 86cdff977b..6051c305cf 100644 --- a/screenshots/de/features.createroom.impl.configureroom_ConfigureRoomViewDark_1_de.png +++ b/screenshots/de/features.createroom.impl.configureroom_ConfigureRoomViewDark_1_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:d373d4113ea7005d53cfce5e37e81583173d06cc07026b6e06de48d770eba322 -size 49190 +oid sha256:8708ef75fadcee2a3c8fe2eb194a47320ea82595060772ebf58781a73a653880 +size 43183 diff --git a/screenshots/de/features.createroom.impl.configureroom_ConfigureRoomViewDark_2_de.png b/screenshots/de/features.createroom.impl.configureroom_ConfigureRoomViewDark_2_de.png index ce4ace450f..f5da20f574 100644 --- a/screenshots/de/features.createroom.impl.configureroom_ConfigureRoomViewDark_2_de.png +++ b/screenshots/de/features.createroom.impl.configureroom_ConfigureRoomViewDark_2_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:95b4f1c1931cda1075740a4d85ec65144494195e866dd9f6731180e7901313ce -size 63156 +oid sha256:6e581f11c0ebaecb0832ce32223a337a2343355b65520149d9af8688d083ae03 +size 64745 diff --git a/screenshots/de/features.createroom.impl.configureroom_ConfigureRoomViewDark_3_de.png b/screenshots/de/features.createroom.impl.configureroom_ConfigureRoomViewDark_3_de.png index 3d9d868013..7d3b090309 100644 --- a/screenshots/de/features.createroom.impl.configureroom_ConfigureRoomViewDark_3_de.png +++ b/screenshots/de/features.createroom.impl.configureroom_ConfigureRoomViewDark_3_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:1ea98f6f83764fba04aeb2027da015c18c3a9a3061ddba81d0851960ce2c35de -size 63713 +oid sha256:b25c9cf19aaa201209aa036cf9f6d7e6b628c3a116396f331e57ec201ddc616c +size 64950 diff --git a/screenshots/de/features.createroom.impl.configureroom_ConfigureRoomViewDark_4_de.png b/screenshots/de/features.createroom.impl.configureroom_ConfigureRoomViewDark_4_de.png index 090247cb6c..1207ed4e6c 100644 --- a/screenshots/de/features.createroom.impl.configureroom_ConfigureRoomViewDark_4_de.png +++ b/screenshots/de/features.createroom.impl.configureroom_ConfigureRoomViewDark_4_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:57df40244063bf4e0f7055a32ffcedc1dded8501f35da9fd22f531a475c32c4c -size 63897 +oid sha256:52112d1039e9e8666edc9cd2a0e69dc0f72731de4f53af62628e76b1d17b26d0 +size 65167 diff --git a/screenshots/de/features.createroom.impl.configureroom_ConfigureRoomViewDark_5_de.png b/screenshots/de/features.createroom.impl.configureroom_ConfigureRoomViewDark_5_de.png index ffd478c101..f5da20f574 100644 --- a/screenshots/de/features.createroom.impl.configureroom_ConfigureRoomViewDark_5_de.png +++ b/screenshots/de/features.createroom.impl.configureroom_ConfigureRoomViewDark_5_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:6cae2c64edc738f54d41c96131a7c2a64f7c53f1bad4ed73672b921ce9eddfbb -size 63128 +oid sha256:6e581f11c0ebaecb0832ce32223a337a2343355b65520149d9af8688d083ae03 +size 64745 diff --git a/screenshots/de/features.createroom.impl.configureroom_ConfigureRoomViewLight_0_de.png b/screenshots/de/features.createroom.impl.configureroom_ConfigureRoomViewLight_0_de.png index 938c21b352..ae3408792b 100644 --- a/screenshots/de/features.createroom.impl.configureroom_ConfigureRoomViewLight_0_de.png +++ b/screenshots/de/features.createroom.impl.configureroom_ConfigureRoomViewLight_0_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:5d7a4d0453da7a91bcaabc426379b996648469114468f5b153c1f0fee699ae42 -size 37321 +oid sha256:fe0c1edf4a574ca1704ef5796c5176eea878bcd83e1c6add00f663313ede6071 +size 38378 diff --git a/screenshots/de/features.createroom.impl.configureroom_ConfigureRoomViewLight_1_de.png b/screenshots/de/features.createroom.impl.configureroom_ConfigureRoomViewLight_1_de.png index 1b24f9bb3e..36200802af 100644 --- a/screenshots/de/features.createroom.impl.configureroom_ConfigureRoomViewLight_1_de.png +++ b/screenshots/de/features.createroom.impl.configureroom_ConfigureRoomViewLight_1_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:8dbb04991ea8e60de9abc3251400c65fa9a2cc43d52d4d8117dbbf1ee9d56bd8 -size 50146 +oid sha256:b5367e6e4986442e85fe0dc39f458a287ccddc7a1bf27c4b10c4d33b3a1acbde +size 44663 diff --git a/screenshots/de/features.createroom.impl.configureroom_ConfigureRoomViewLight_2_de.png b/screenshots/de/features.createroom.impl.configureroom_ConfigureRoomViewLight_2_de.png index bbb18fc8fb..d496c5203c 100644 --- a/screenshots/de/features.createroom.impl.configureroom_ConfigureRoomViewLight_2_de.png +++ b/screenshots/de/features.createroom.impl.configureroom_ConfigureRoomViewLight_2_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:57ddf4a6fcb6586e9d7e43574f7b832542bf43e7337355d1a1653f05b98fe130 -size 64657 +oid sha256:1d85d1fc7eafff74f8ae66a8eb429a68c3c36c62a6b7239926c345bcea48f8e4 +size 66929 diff --git a/screenshots/de/features.createroom.impl.configureroom_ConfigureRoomViewLight_3_de.png b/screenshots/de/features.createroom.impl.configureroom_ConfigureRoomViewLight_3_de.png index 3b9d09cd88..c37a4cf693 100644 --- a/screenshots/de/features.createroom.impl.configureroom_ConfigureRoomViewLight_3_de.png +++ b/screenshots/de/features.createroom.impl.configureroom_ConfigureRoomViewLight_3_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:dff63fd5eeda1bcc89432edecaf0c0b446a88b0acae7851a079c44d4f1f8d340 -size 66009 +oid sha256:28a7945f030c534c8c903d0396f646cd2344fc250bb16fc5568c15eaf856f311 +size 67222 diff --git a/screenshots/de/features.createroom.impl.configureroom_ConfigureRoomViewLight_4_de.png b/screenshots/de/features.createroom.impl.configureroom_ConfigureRoomViewLight_4_de.png index 80d285c5eb..7c1abd3c5c 100644 --- a/screenshots/de/features.createroom.impl.configureroom_ConfigureRoomViewLight_4_de.png +++ b/screenshots/de/features.createroom.impl.configureroom_ConfigureRoomViewLight_4_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:4dca087949a1b4374be7464b97f200addee8633d4aaa769a523a193aa5536932 -size 66176 +oid sha256:fc16a8c496e99a3c06860eecb55af7537bac2e9f3ac7321463e717cbdf0fb1dd +size 67459 diff --git a/screenshots/de/features.createroom.impl.configureroom_ConfigureRoomViewLight_5_de.png b/screenshots/de/features.createroom.impl.configureroom_ConfigureRoomViewLight_5_de.png index 0c6ee311c5..d496c5203c 100644 --- a/screenshots/de/features.createroom.impl.configureroom_ConfigureRoomViewLight_5_de.png +++ b/screenshots/de/features.createroom.impl.configureroom_ConfigureRoomViewLight_5_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:453f0f19a42aaf92e11f9f0a3fe18a8f63371d3c4f816c6a7c81af094523fd7e -size 65264 +oid sha256:1d85d1fc7eafff74f8ae66a8eb429a68c3c36c62a6b7239926c345bcea48f8e4 +size 66929 diff --git a/screenshots/de/features.createroom.impl.joinbyaddress_JoinRoomByAddressView_Day_0_de.png b/screenshots/de/features.createroom.impl.joinbyaddress_JoinRoomByAddressView_Day_0_de.png deleted file mode 100644 index 17246e6487..0000000000 --- a/screenshots/de/features.createroom.impl.joinbyaddress_JoinRoomByAddressView_Day_0_de.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:b48ef870871bbdc901721b1e25caec609b4a2b4e96dd442344d87307cd15b166 -size 18236 diff --git a/screenshots/de/features.createroom.impl.joinbyaddress_JoinRoomByAddressView_Day_1_de.png b/screenshots/de/features.createroom.impl.joinbyaddress_JoinRoomByAddressView_Day_1_de.png deleted file mode 100644 index 77e03e96c5..0000000000 --- a/screenshots/de/features.createroom.impl.joinbyaddress_JoinRoomByAddressView_Day_1_de.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:d39af29b567ef13015fe236e982a571ab3b19ebeac0ae94d09b3987423ab41e6 -size 18259 diff --git a/screenshots/de/features.createroom.impl.joinbyaddress_JoinRoomByAddressView_Day_2_de.png b/screenshots/de/features.createroom.impl.joinbyaddress_JoinRoomByAddressView_Day_2_de.png deleted file mode 100644 index a380d66caf..0000000000 --- a/screenshots/de/features.createroom.impl.joinbyaddress_JoinRoomByAddressView_Day_2_de.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:0202c0c34ea077bf521161582ce081493dba6cc806375a1b1cd7173470ea3b07 -size 18463 diff --git a/screenshots/de/features.createroom.impl.joinbyaddress_JoinRoomByAddressView_Day_3_de.png b/screenshots/de/features.createroom.impl.joinbyaddress_JoinRoomByAddressView_Day_3_de.png deleted file mode 100644 index df56872657..0000000000 --- a/screenshots/de/features.createroom.impl.joinbyaddress_JoinRoomByAddressView_Day_3_de.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:1530c35953f8ca11c70f2c372d8309d5a76a23b5967c9d5542b4703910c6369b -size 21701 diff --git a/screenshots/de/features.createroom.impl.joinbyaddress_JoinRoomByAddressView_Day_4_de.png b/screenshots/de/features.createroom.impl.joinbyaddress_JoinRoomByAddressView_Day_4_de.png deleted file mode 100644 index 669efaedcb..0000000000 --- a/screenshots/de/features.createroom.impl.joinbyaddress_JoinRoomByAddressView_Day_4_de.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:e7901747c698bd155d36eb7de49e05b2cfed2d522d2548991cf66da34a3d7c9d -size 21504 diff --git a/screenshots/de/features.createroom.impl.joinbyaddress_JoinRoomByAddressView_Day_5_de.png b/screenshots/de/features.createroom.impl.joinbyaddress_JoinRoomByAddressView_Day_5_de.png deleted file mode 100644 index ea6d55e56f..0000000000 --- a/screenshots/de/features.createroom.impl.joinbyaddress_JoinRoomByAddressView_Day_5_de.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:ab50dfb6f6c49c113ec3ad0d169f917989f8663e83910c375554670379ff60da -size 21709 diff --git a/screenshots/de/features.createroom.impl.root_CreateRoomRootView_Day_0_de.png b/screenshots/de/features.createroom.impl.root_CreateRoomRootView_Day_0_de.png deleted file mode 100644 index 73d157ad29..0000000000 --- a/screenshots/de/features.createroom.impl.root_CreateRoomRootView_Day_0_de.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:9bc8290faf20b4ea95bf0e7a86c2306b6f9d15b5bc764a48b78051b4d7c02655 -size 28052 diff --git a/screenshots/de/features.createroom.impl.root_CreateRoomRootView_Day_1_de.png b/screenshots/de/features.createroom.impl.root_CreateRoomRootView_Day_1_de.png deleted file mode 100644 index cbf5a5f9ba..0000000000 --- a/screenshots/de/features.createroom.impl.root_CreateRoomRootView_Day_1_de.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:7faeafca006a15ed6fd89f94f737841e59c46f035b02f5d7e3dee24e0a879890 -size 21014 diff --git a/screenshots/de/features.createroom.impl.root_CreateRoomRootView_Day_2_de.png b/screenshots/de/features.createroom.impl.root_CreateRoomRootView_Day_2_de.png deleted file mode 100644 index 965335c696..0000000000 --- a/screenshots/de/features.createroom.impl.root_CreateRoomRootView_Day_2_de.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:0280c825cece016b8f569cb8ca469d4870817b2b3500138170112479afe69be9 -size 31659 diff --git a/screenshots/de/features.createroom.impl.root_CreateRoomRootView_Day_3_de.png b/screenshots/de/features.createroom.impl.root_CreateRoomRootView_Day_3_de.png deleted file mode 100644 index 8d399c2c6a..0000000000 --- a/screenshots/de/features.createroom.impl.root_CreateRoomRootView_Day_3_de.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:922537688cdeb949b116e699358f886314a87242b0bdfb970c04143d9df0de9d -size 55087 diff --git a/screenshots/de/features.createroom.impl.root_CreateRoomRootView_Day_4_de.png b/screenshots/de/features.createroom.impl.root_CreateRoomRootView_Day_4_de.png deleted file mode 100644 index b380c1f5e2..0000000000 --- a/screenshots/de/features.createroom.impl.root_CreateRoomRootView_Day_4_de.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:96f00525ce15b20bda129396fb74c40168513e3e3010056908187a53b01c7b0d -size 45678 diff --git a/screenshots/de/features.createroom.impl.root_CreateRoomRootView_Day_5_de.png b/screenshots/de/features.createroom.impl.root_CreateRoomRootView_Day_5_de.png deleted file mode 100644 index 92c28ceeb8..0000000000 --- a/screenshots/de/features.createroom.impl.root_CreateRoomRootView_Day_5_de.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:1fa4bc20f0199ac31acf1d9d93d1457004769bfe89957a769fb06a97435becbb -size 32125 diff --git a/screenshots/de/features.ftue.impl.notifications_NotificationsOptInView_Day_0_de.png b/screenshots/de/features.ftue.impl.notifications_NotificationsOptInView_Day_0_de.png index 6b0618101f..f4634fe25d 100644 --- a/screenshots/de/features.ftue.impl.notifications_NotificationsOptInView_Day_0_de.png +++ b/screenshots/de/features.ftue.impl.notifications_NotificationsOptInView_Day_0_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:bea6b7dc353227e8954d60ac072e29cc3321883f4a59fff6d1506a810232726e -size 71375 +oid sha256:54c0fd7cda1214762bf98d8e2bd133e5b2c64f20435bc7eb9cc4782fc0c3d303 +size 71310 diff --git a/screenshots/de/features.ftue.impl.sessionverification.choosemode_ChooseSelfVerificationModeView_Day_0_de.png b/screenshots/de/features.ftue.impl.sessionverification.choosemode_ChooseSelfVerificationModeView_Day_0_de.png index 0eaaf469bb..05319060ae 100644 --- a/screenshots/de/features.ftue.impl.sessionverification.choosemode_ChooseSelfVerificationModeView_Day_0_de.png +++ b/screenshots/de/features.ftue.impl.sessionverification.choosemode_ChooseSelfVerificationModeView_Day_0_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:7f504c27591945241b3ed522cdb73701ee06d1f270e20812fe0c1cc7ca34befa -size 38341 +oid sha256:6fb3bc6fa868fda1dd50dc47f6e25a54ef36fc298fba54458ff22782594c5ae8 +size 38429 diff --git a/screenshots/de/features.ftue.impl.sessionverification.choosemode_ChooseSelfVerificationModeView_Day_1_de.png b/screenshots/de/features.ftue.impl.sessionverification.choosemode_ChooseSelfVerificationModeView_Day_1_de.png index 1e5e3b3760..91a16a1c4b 100644 --- a/screenshots/de/features.ftue.impl.sessionverification.choosemode_ChooseSelfVerificationModeView_Day_1_de.png +++ b/screenshots/de/features.ftue.impl.sessionverification.choosemode_ChooseSelfVerificationModeView_Day_1_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:e1383b923b65dbf64e06b2ba8b4f6b342cc955000813b2131e8d0afedde891c1 -size 31598 +oid sha256:7cdc5833d44b2b7d461795f58d21f4684fe1d6530dd6a8d439dce059089a50b8 +size 31647 diff --git a/screenshots/de/features.ftue.impl.sessionverification.choosemode_ChooseSelfVerificationModeView_Day_2_de.png b/screenshots/de/features.ftue.impl.sessionverification.choosemode_ChooseSelfVerificationModeView_Day_2_de.png index 4d97b8f26f..218966bb11 100644 --- a/screenshots/de/features.ftue.impl.sessionverification.choosemode_ChooseSelfVerificationModeView_Day_2_de.png +++ b/screenshots/de/features.ftue.impl.sessionverification.choosemode_ChooseSelfVerificationModeView_Day_2_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:2f90840c466e9fab81a98b03fe603ce3c660bdf8321f5cb7df358035ba9fce79 -size 44419 +oid sha256:a50de980e1452b445d06abe59a39315b164eb588836ed9d893ede04dc5e1c1c6 +size 44537 diff --git a/screenshots/de/features.ftue.impl.sessionverification.choosemode_ChooseSelfVerificationModeView_Day_3_de.png b/screenshots/de/features.ftue.impl.sessionverification.choosemode_ChooseSelfVerificationModeView_Day_3_de.png index 350221a32f..06de10e475 100644 --- a/screenshots/de/features.ftue.impl.sessionverification.choosemode_ChooseSelfVerificationModeView_Day_3_de.png +++ b/screenshots/de/features.ftue.impl.sessionverification.choosemode_ChooseSelfVerificationModeView_Day_3_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:7496ae74e51150486e96a50c30cb143af89d2944f6ef86aa95193703a4889e9d -size 38034 +oid sha256:6754c86f81bbb3938a24ff1651896ea8184b55727e855c92f364385ba3a527a5 +size 38097 diff --git a/screenshots/de/features.ftue.impl.welcome_WelcomeView_Day_0_de.png b/screenshots/de/features.ftue.impl.welcome_WelcomeView_Day_0_de.png deleted file mode 100644 index 5c1df9612d..0000000000 --- a/screenshots/de/features.ftue.impl.welcome_WelcomeView_Day_0_de.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:e750cc6220b601f5709c5e8f8d365145e269b5f904f3b5d08ada6a8a58047b11 -size 273704 diff --git a/screenshots/de/features.home.impl.components_BatteryOptimizationBanner_Day_0_de.png b/screenshots/de/features.home.impl.components_BatteryOptimizationBanner_Day_0_de.png index 9efcd392aa..03a5750716 100644 --- a/screenshots/de/features.home.impl.components_BatteryOptimizationBanner_Day_0_de.png +++ b/screenshots/de/features.home.impl.components_BatteryOptimizationBanner_Day_0_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:2aaec4eae3539e484846ed564bd3ed53d0f93e4f17c25f1fe3fc7983f6b2c96d -size 33379 +oid sha256:670d308317209e4a8e64a34d0529ae96f313a7e18fbb3aad6ca85e68b3ed2eb6 +size 33325 diff --git a/screenshots/de/features.home.impl.components_ConfirmRecoveryKeyBanner_Day_0_de.png b/screenshots/de/features.home.impl.components_ConfirmRecoveryKeyBanner_Day_0_de.png index d704ee055c..42b749f8a1 100644 --- a/screenshots/de/features.home.impl.components_ConfirmRecoveryKeyBanner_Day_0_de.png +++ b/screenshots/de/features.home.impl.components_ConfirmRecoveryKeyBanner_Day_0_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:10966472205af0682a0eba8b00f0e48d64f1c25f708807145168decd6407d570 -size 36174 +oid sha256:cfd51ec0fa293718e576ba0467980f53cf6691979eadab2fc22078e5fddea5a3 +size 35856 diff --git a/screenshots/de/features.home.impl.components_DefaultRoomListTopBarWithIndicator_Day_0_de.png b/screenshots/de/features.home.impl.components_DefaultRoomListTopBarWithIndicator_Day_0_de.png index a8a4cccb3e..5bdf640197 100644 --- a/screenshots/de/features.home.impl.components_DefaultRoomListTopBarWithIndicator_Day_0_de.png +++ b/screenshots/de/features.home.impl.components_DefaultRoomListTopBarWithIndicator_Day_0_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:c8e604938b500e4c1b015d4e67ea711a0307360544e95f001a82505d8fb9c307 -size 26838 +oid sha256:e5cfc23d6301501da676ba6e8ef22a37ba69b20a7e55f39fbdf1cfbde1615f72 +size 26650 diff --git a/screenshots/de/features.home.impl.components_DefaultRoomListTopBar_Day_0_de.png b/screenshots/de/features.home.impl.components_DefaultRoomListTopBar_Day_0_de.png index f4dff34d5d..a8a8fc2fd1 100644 --- a/screenshots/de/features.home.impl.components_DefaultRoomListTopBar_Day_0_de.png +++ b/screenshots/de/features.home.impl.components_DefaultRoomListTopBar_Day_0_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:813e89ed98813f77b3ba5d0594049ced77c052dd074eb334f3df4567157d58e1 -size 26578 +oid sha256:85fc956fdf2566d8ae24022c78ce74d8e2afa3f1a08e4af15913c83c48d0e0c5 +size 26400 diff --git a/screenshots/de/features.home.impl.components_FullScreenIntentPermissionBanner_Day_0_de.png b/screenshots/de/features.home.impl.components_FullScreenIntentPermissionBanner_Day_0_de.png index 73694f2f01..16aed9b5c3 100644 --- a/screenshots/de/features.home.impl.components_FullScreenIntentPermissionBanner_Day_0_de.png +++ b/screenshots/de/features.home.impl.components_FullScreenIntentPermissionBanner_Day_0_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:49d968d7cc5c20e3db5e8917d8ce6322278ed7c2cf71bf27067d51a1ab0f6e78 -size 35146 +oid sha256:4fe8f4056e05d8f27b44afe139548a489b2aefc7abfbe1ef3afa4de5a2f826af +size 34919 diff --git a/screenshots/de/features.home.impl.components_RoomListContentView_Day_0_de.png b/screenshots/de/features.home.impl.components_RoomListContentView_Day_0_de.png index d96bdbf297..718868cb85 100644 --- a/screenshots/de/features.home.impl.components_RoomListContentView_Day_0_de.png +++ b/screenshots/de/features.home.impl.components_RoomListContentView_Day_0_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:1d8e4f4c2657115b56b1948f068932aefb7672587b0e3ca8bbf6519f81f7e56f -size 43814 +oid sha256:dc274e63a8428f432ae8ddb7d91cfabffef8d43f130c91c8927427194defb40b +size 43970 diff --git a/screenshots/de/features.home.impl.components_RoomListContentView_Day_1_de.png b/screenshots/de/features.home.impl.components_RoomListContentView_Day_1_de.png index 30415e01e0..7aab9954e6 100644 --- a/screenshots/de/features.home.impl.components_RoomListContentView_Day_1_de.png +++ b/screenshots/de/features.home.impl.components_RoomListContentView_Day_1_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:2edd2e77def7a88f30e1e835e5a3700f80cb6a91c0b854a83b61c67a20c6d29c -size 22234 +oid sha256:d92a066157b7651cab7148162a53365425235c1201e00c2c33e53cd98c492a4a +size 22219 diff --git a/screenshots/de/features.home.impl.components_RoomListContentView_Day_3_de.png b/screenshots/de/features.home.impl.components_RoomListContentView_Day_3_de.png index 971888c147..99e720cb6e 100644 --- a/screenshots/de/features.home.impl.components_RoomListContentView_Day_3_de.png +++ b/screenshots/de/features.home.impl.components_RoomListContentView_Day_3_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:a8de94c413f4dae795c37e7ec2c0790cccb007ffa24f1877d0ae20d3b141574e -size 22646 +oid sha256:2d85df717cbc8380b8e162d6cece486798b3b236f5aaa1ef4df7877cf4bf1d4f +size 22507 diff --git a/screenshots/de/features.home.impl.components_RoomListContentView_Day_4_de.png b/screenshots/de/features.home.impl.components_RoomListContentView_Day_4_de.png index c482ab3628..d1e7265ca5 100644 --- a/screenshots/de/features.home.impl.components_RoomListContentView_Day_4_de.png +++ b/screenshots/de/features.home.impl.components_RoomListContentView_Day_4_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:67e5572f219d8b84c6c652aefc6a07fa056a66c688610939cdeb601974ae04aa -size 55975 +oid sha256:439b75d4e217d0aa90b2e1e8aed5e09819ca6b5f156e59bd4c41aad104791c99 +size 55904 diff --git a/screenshots/de/features.home.impl.components_RoomSummaryRow_Day_29_de.png b/screenshots/de/features.home.impl.components_RoomSummaryRow_Day_29_de.png index 8cf571f814..c8c819d2d0 100644 --- a/screenshots/de/features.home.impl.components_RoomSummaryRow_Day_29_de.png +++ b/screenshots/de/features.home.impl.components_RoomSummaryRow_Day_29_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:5a8f4b3792370cc2a11d236d3d8a2b31fd326369a1682db0708428c37c1d2575 -size 22729 +oid sha256:e2feece749ff18f870707d330f86697335315029fde4447674fd5a45433c0570 +size 23246 diff --git a/screenshots/de/features.home.impl.components_RoomSummaryRow_Day_2_de.png b/screenshots/de/features.home.impl.components_RoomSummaryRow_Day_2_de.png index e88acc2020..2f28c7b1f7 100644 --- a/screenshots/de/features.home.impl.components_RoomSummaryRow_Day_2_de.png +++ b/screenshots/de/features.home.impl.components_RoomSummaryRow_Day_2_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:6d91c3e72dde59161788561644b9d84d218d85b250fa144dac3a3928d5006abb -size 13042 +oid sha256:24d6a8ebb5283c02d919262f80b66e64f0dd5aa58ac10ce818a9541a048d9d99 +size 13326 diff --git a/screenshots/de/features.home.impl.components_RoomSummaryRow_Day_30_de.png b/screenshots/de/features.home.impl.components_RoomSummaryRow_Day_30_de.png index 2f32a78319..00b0c86731 100644 --- a/screenshots/de/features.home.impl.components_RoomSummaryRow_Day_30_de.png +++ b/screenshots/de/features.home.impl.components_RoomSummaryRow_Day_30_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:dd5f51e5d8f363aefa9d77c893d371a29d5d6a53eae2ccc69e432fded1b95c9c -size 16441 +oid sha256:9cf2c28a367372a63314913ebf3e3aeacc3463a368511b5bb1830ea0a0d65fe1 +size 16743 diff --git a/screenshots/de/features.home.impl.components_RoomSummaryRow_Day_31_de.png b/screenshots/de/features.home.impl.components_RoomSummaryRow_Day_31_de.png index 5de9234401..0b72afcd4f 100644 --- a/screenshots/de/features.home.impl.components_RoomSummaryRow_Day_31_de.png +++ b/screenshots/de/features.home.impl.components_RoomSummaryRow_Day_31_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:90a18fa675f6b568d49e7c42e81a3a41f09083667d98ccc1530c1cc50c49c4ba -size 24218 +oid sha256:1c95d45fbe203be354552e9393fa6deef641e945b2f6b65bb4198d059ef5f5ea +size 24655 diff --git a/screenshots/de/features.home.impl.components_RoomSummaryRow_Day_32_de.png b/screenshots/de/features.home.impl.components_RoomSummaryRow_Day_32_de.png index 8c19f4b18e..707e02b860 100644 --- a/screenshots/de/features.home.impl.components_RoomSummaryRow_Day_32_de.png +++ b/screenshots/de/features.home.impl.components_RoomSummaryRow_Day_32_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:2b19b09aca863e75b0bfbc404274f6ce3a2349fdbf2bf0c20c9b6bacdac79f08 -size 12682 +oid sha256:d51f365f53e6d513995ff06dd428b2093bd3410e50ccd0f140f9b187ed72932b +size 13055 diff --git a/screenshots/de/features.home.impl.components_RoomSummaryRow_Day_33_de.png b/screenshots/de/features.home.impl.components_RoomSummaryRow_Day_33_de.png index 08644eb138..86e74552cf 100644 --- a/screenshots/de/features.home.impl.components_RoomSummaryRow_Day_33_de.png +++ b/screenshots/de/features.home.impl.components_RoomSummaryRow_Day_33_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:9817f47746af25e3815f8038de109e13641c5ef1c8d18f55585dff1c796ee92a -size 18023 +oid sha256:be3903803196a109c756058a33f278a268013e953073427afe1469992c921e8f +size 18424 diff --git a/screenshots/de/features.home.impl.components_RoomSummaryRow_Day_34_de.png b/screenshots/de/features.home.impl.components_RoomSummaryRow_Day_34_de.png index 466eac13db..d8950ece22 100644 --- a/screenshots/de/features.home.impl.components_RoomSummaryRow_Day_34_de.png +++ b/screenshots/de/features.home.impl.components_RoomSummaryRow_Day_34_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:49516bd37dbeee3f00a6cff3f595018e4e779cbb6b4e6dfbcae525e00f78d1a9 -size 14911 +oid sha256:5d8a6ea0197fe52bf5ee0519ef0ce99ef43adaf319acf88babd3b0812d324bb9 +size 15242 diff --git a/screenshots/de/features.home.impl.components_SetUpRecoveryKeyBanner_Day_0_de.png b/screenshots/de/features.home.impl.components_SetUpRecoveryKeyBanner_Day_0_de.png index 944e83e717..390ea764a7 100644 --- a/screenshots/de/features.home.impl.components_SetUpRecoveryKeyBanner_Day_0_de.png +++ b/screenshots/de/features.home.impl.components_SetUpRecoveryKeyBanner_Day_0_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:a6a67cf2cff22301277baa89c2d03e23668aa085768c062219db5bfca5f93f6c -size 38111 +oid sha256:f265cdea4cf1f88dbf0e3e717cc51be3c88d65e117f0ad6134b2d693fba88783 +size 38027 diff --git a/screenshots/de/features.home.impl.filters_RoomListFiltersView_Day_0_de.png b/screenshots/de/features.home.impl.filters_RoomListFiltersView_Day_0_de.png index ee13295042..7618e1ba16 100644 --- a/screenshots/de/features.home.impl.filters_RoomListFiltersView_Day_0_de.png +++ b/screenshots/de/features.home.impl.filters_RoomListFiltersView_Day_0_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:c302a8b79f894fa47ceef03d3c9095276a8581a3278ec066f0468a2781d1580b -size 14269 +oid sha256:3dbee0352a4aa54c00ef91dd05fd5b6e8848881317ac1b1e920c297f02b8363b +size 14178 diff --git a/screenshots/de/features.home.impl.filters_RoomListFiltersView_Day_1_de.png b/screenshots/de/features.home.impl.filters_RoomListFiltersView_Day_1_de.png index 7680e331e1..c118900b7f 100644 --- a/screenshots/de/features.home.impl.filters_RoomListFiltersView_Day_1_de.png +++ b/screenshots/de/features.home.impl.filters_RoomListFiltersView_Day_1_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:50b3c0496222aa78d444da6d3446fb3aeb159cf820c7b6e03f4bd5b7f70b6dc1 -size 12301 +oid sha256:1e40bcdd26ad8faa2b1d05e37ca94fe6b23977322faf778bb0ac412f4f7b054b +size 12312 diff --git a/screenshots/de/features.home.impl.roomlist_RoomListDeclineInviteMenuContent_Day_0_de.png b/screenshots/de/features.home.impl.roomlist_RoomListDeclineInviteMenuContent_Day_0_de.png index 0b9bf1ebba..e0a8383222 100644 --- a/screenshots/de/features.home.impl.roomlist_RoomListDeclineInviteMenuContent_Day_0_de.png +++ b/screenshots/de/features.home.impl.roomlist_RoomListDeclineInviteMenuContent_Day_0_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:ccf1dfef74f6e7d7237f65d51e8beccb332e562a90b736f8fb6abf5f2a2780c8 -size 29514 +oid sha256:d4a7c9af13762a4be6384dad5fef5bf482916dcc880cf43292f75e1db90cb063 +size 29654 diff --git a/screenshots/de/features.home.impl.roomlist_RoomListModalBottomSheetContent_Day_0_de.png b/screenshots/de/features.home.impl.roomlist_RoomListModalBottomSheetContent_Day_0_de.png index b0a8b71423..f9166d8d6c 100644 --- a/screenshots/de/features.home.impl.roomlist_RoomListModalBottomSheetContent_Day_0_de.png +++ b/screenshots/de/features.home.impl.roomlist_RoomListModalBottomSheetContent_Day_0_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:5f928fff19a317e056a08bbc39f28d7f44241fb1bc1a41fb36236e5e9986a240 -size 24192 +oid sha256:f78d019130637a513eccdd9d71e81f313cbd8ca163a83f4d80ccacc134a8156b +size 24277 diff --git a/screenshots/de/features.home.impl.roomlist_RoomListModalBottomSheetContent_Day_1_de.png b/screenshots/de/features.home.impl.roomlist_RoomListModalBottomSheetContent_Day_1_de.png index ac5a253bfa..374c18e764 100644 --- a/screenshots/de/features.home.impl.roomlist_RoomListModalBottomSheetContent_Day_1_de.png +++ b/screenshots/de/features.home.impl.roomlist_RoomListModalBottomSheetContent_Day_1_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:a19c853a8c36128d3df9ecfff8acdebfccc37ff1bab1b1cdaf3336cb67a0390d -size 24468 +oid sha256:c92e260805afdc368c89590e1a69ce53800495318d4ef76d3c4864eadb3bfe37 +size 24515 diff --git a/screenshots/de/features.home.impl.roomlist_RoomListModalBottomSheetContent_Day_2_de.png b/screenshots/de/features.home.impl.roomlist_RoomListModalBottomSheetContent_Day_2_de.png index 52ed3cc77a..6a160d6e76 100644 --- a/screenshots/de/features.home.impl.roomlist_RoomListModalBottomSheetContent_Day_2_de.png +++ b/screenshots/de/features.home.impl.roomlist_RoomListModalBottomSheetContent_Day_2_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:21dc02fd3f71b1a8949c8c4b5ea1beaf030b62cc3a162bb161b5dadbe2fbc029 -size 26690 +oid sha256:232e03982572af7052e1921bf740f7c7acd78490dcf26929eaee8ec5f4b5f636 +size 26817 diff --git a/screenshots/de/features.home.impl.search_RoomListSearchContent_Day_1_de.png b/screenshots/de/features.home.impl.search_RoomListSearchContent_Day_1_de.png index 43ab5961d1..9edf04bc2a 100644 --- a/screenshots/de/features.home.impl.search_RoomListSearchContent_Day_1_de.png +++ b/screenshots/de/features.home.impl.search_RoomListSearchContent_Day_1_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:7f129db2d81936d77fb680a989bd32a43281b3fb44e2e98e636f40796373b1e4 -size 46016 +oid sha256:3c028b77f53da31957dcb04ba9201c2a9f7345994f628081569bbd0601cd689f +size 46029 diff --git a/screenshots/de/features.home.impl_HomeView_Day_0_de.png b/screenshots/de/features.home.impl_HomeView_Day_0_de.png index 8863bb54d5..23f6dfb6ac 100644 --- a/screenshots/de/features.home.impl_HomeView_Day_0_de.png +++ b/screenshots/de/features.home.impl_HomeView_Day_0_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:3d927be100fd87aa527c7cb6800e8fb8840c380db80158abc1cc7680fb9404f1 -size 68356 +oid sha256:ac64312f55c4cf68abacbcd7e4d88b3287ba93428e4cb1ba2812c9e2f77ef2d9 +size 68179 diff --git a/screenshots/de/features.home.impl_HomeView_Day_10_de.png b/screenshots/de/features.home.impl_HomeView_Day_10_de.png index 2b4d34d487..7bedf1c0d7 100644 --- a/screenshots/de/features.home.impl_HomeView_Day_10_de.png +++ b/screenshots/de/features.home.impl_HomeView_Day_10_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:8905fc13c8292a1549b1f8e8b7da31eb11f194ef33eec8a58ef40de7bb702b4d -size 37952 +oid sha256:934b726566ba2fcf64402ba08889594289a7863b1679ca64ad582b77c2065eb3 +size 37780 diff --git a/screenshots/de/features.home.impl_HomeView_Day_13_de.png b/screenshots/de/features.home.impl_HomeView_Day_13_de.png index 7f0903bebb..3eba4d46f8 100644 --- a/screenshots/de/features.home.impl_HomeView_Day_13_de.png +++ b/screenshots/de/features.home.impl_HomeView_Day_13_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:8a30d9260d6b58b015c0e0329b8c1cda77c3fff7fb2daf8199917d269b540178 -size 91609 +oid sha256:6e6151975c800745287d4a22a029e175cc1a5e88ba955d69309a7ec49d0dadd0 +size 91385 diff --git a/screenshots/de/features.home.impl_HomeView_Day_14_de.png b/screenshots/de/features.home.impl_HomeView_Day_14_de.png index c33ef6c4d0..ea0733cf4e 100644 --- a/screenshots/de/features.home.impl_HomeView_Day_14_de.png +++ b/screenshots/de/features.home.impl_HomeView_Day_14_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:9dfe8684f7210b0b34a4fa0318d0e39bdcabf439f57b0c4ad4ee4a0c27d71597 -size 90314 +oid sha256:eb7948f3c3cd2b600604350a0a7aefd45c2f43db3fe501aaff516e6951d54b23 +size 90206 diff --git a/screenshots/de/features.home.impl_HomeView_Day_15_de.png b/screenshots/de/features.home.impl_HomeView_Day_15_de.png index 8c62a7fa5a..3ec1b3bc0f 100644 --- a/screenshots/de/features.home.impl_HomeView_Day_15_de.png +++ b/screenshots/de/features.home.impl_HomeView_Day_15_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:b39b859bd3df147b341468e6e021b74bb1edcf37c3eda4781c68609f088eaf4c -size 56749 +oid sha256:e912cfdb4d5fe7a70348ec8946cc3fa2642d1346dfce59aee77fdcebda8f3428 +size 56492 diff --git a/screenshots/de/features.home.impl_HomeView_Day_1_de.png b/screenshots/de/features.home.impl_HomeView_Day_1_de.png index 62c3a00509..3f08abe17e 100644 --- a/screenshots/de/features.home.impl_HomeView_Day_1_de.png +++ b/screenshots/de/features.home.impl_HomeView_Day_1_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:a7fe483bbbbd2de674f34e8c85b046f3018316196d65a277011e0687aca30425 -size 69537 +oid sha256:517fe29f7013d077f5eab2b49414d22ab22389f506ee955f5d1322a87c9aca83 +size 69487 diff --git a/screenshots/de/features.home.impl_HomeView_Day_2_de.png b/screenshots/de/features.home.impl_HomeView_Day_2_de.png index 8863bb54d5..23f6dfb6ac 100644 --- a/screenshots/de/features.home.impl_HomeView_Day_2_de.png +++ b/screenshots/de/features.home.impl_HomeView_Day_2_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:3d927be100fd87aa527c7cb6800e8fb8840c380db80158abc1cc7680fb9404f1 -size 68356 +oid sha256:ac64312f55c4cf68abacbcd7e4d88b3287ba93428e4cb1ba2812c9e2f77ef2d9 +size 68179 diff --git a/screenshots/de/features.home.impl_HomeView_Day_3_de.png b/screenshots/de/features.home.impl_HomeView_Day_3_de.png index f2ff4c080c..e4c377b129 100644 --- a/screenshots/de/features.home.impl_HomeView_Day_3_de.png +++ b/screenshots/de/features.home.impl_HomeView_Day_3_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:c104a38ccb21d74b42f03e183ab130b594caa7a3f230c68f5fb82c03a1670325 -size 68127 +oid sha256:f31bf3e458c2b2f7dbc4bb5a05787f6ec6c3d7f6f2291ddaef0105b93c84cf02 +size 62895 diff --git a/screenshots/de/features.home.impl_HomeView_Day_5_de.png b/screenshots/de/features.home.impl_HomeView_Day_5_de.png index 8863bb54d5..23f6dfb6ac 100644 --- a/screenshots/de/features.home.impl_HomeView_Day_5_de.png +++ b/screenshots/de/features.home.impl_HomeView_Day_5_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:3d927be100fd87aa527c7cb6800e8fb8840c380db80158abc1cc7680fb9404f1 -size 68356 +oid sha256:ac64312f55c4cf68abacbcd7e4d88b3287ba93428e4cb1ba2812c9e2f77ef2d9 +size 68179 diff --git a/screenshots/de/features.home.impl_HomeView_Day_6_de.png b/screenshots/de/features.home.impl_HomeView_Day_6_de.png index dbc4315b1f..3fc6309668 100644 --- a/screenshots/de/features.home.impl_HomeView_Day_6_de.png +++ b/screenshots/de/features.home.impl_HomeView_Day_6_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:4c72693c4cb45ff53c2e5a9c8a4f04d13009d5b30f4e7921bf164d3c2ace71c3 -size 56543 +oid sha256:f02c675f1c604d7bc8c8e6aef925b39aa848136c671e5b40587f006941f7ed12 +size 56531 diff --git a/screenshots/de/features.home.impl_HomeView_Day_7_de.png b/screenshots/de/features.home.impl_HomeView_Day_7_de.png index b94499e1ec..9cb9163d01 100644 --- a/screenshots/de/features.home.impl_HomeView_Day_7_de.png +++ b/screenshots/de/features.home.impl_HomeView_Day_7_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:39e127b2810b5ee65a433c18bc9a202b5860a4d8ae8822b98dd425b00b673ce8 -size 55882 +oid sha256:35a307b8d77e932ef23a1b9c9fd2ddd6af16133abe8087c83ee674dcc0599f8d +size 55837 diff --git a/screenshots/de/features.home.impl_HomeView_Day_8_de.png b/screenshots/de/features.home.impl_HomeView_Day_8_de.png index 90b16a4a0c..7e05236426 100644 --- a/screenshots/de/features.home.impl_HomeView_Day_8_de.png +++ b/screenshots/de/features.home.impl_HomeView_Day_8_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:d6e61ce42b7ba418dc65995225298ddff01ab3e7a3916576d454e15901189fa6 -size 54112 +oid sha256:d3fc9e4635e3480448831afc02df965b08e4af95f199f54921c2da7979f2395f +size 54056 diff --git a/screenshots/de/features.home.impl_HomeView_Day_9_de.png b/screenshots/de/features.home.impl_HomeView_Day_9_de.png index 6d25b51717..64a622c81b 100644 --- a/screenshots/de/features.home.impl_HomeView_Day_9_de.png +++ b/screenshots/de/features.home.impl_HomeView_Day_9_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:2eb28d4f61518822f40f966dbc5aceb8a75f949be5cc352dcdd429cdd23311bc -size 89794 +oid sha256:3b8a3b78d861603d7c1011b60a04805ffc3047794a7162000c90a50ce1b9852a +size 89368 diff --git a/screenshots/de/features.invite.impl.acceptdecline_AcceptDeclineInviteView_Day_1_de.png b/screenshots/de/features.invite.impl.acceptdecline_AcceptDeclineInviteView_Day_1_de.png index 41b1a9cc8e..db83d49f68 100644 --- a/screenshots/de/features.invite.impl.acceptdecline_AcceptDeclineInviteView_Day_1_de.png +++ b/screenshots/de/features.invite.impl.acceptdecline_AcceptDeclineInviteView_Day_1_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:1d0de166a7eaa29c991807b4f6052b75e34c504add3f58eb5e686df3013fc050 -size 24716 +oid sha256:a74340374c80fe92336288cfa44b543bb743736c49494acb7e2ca24ecbccb99c +size 24184 diff --git a/screenshots/de/features.invite.impl.acceptdecline_AcceptDeclineInviteView_Day_2_de.png b/screenshots/de/features.invite.impl.acceptdecline_AcceptDeclineInviteView_Day_2_de.png index 397d0bbf4e..9f44b23ac1 100644 --- a/screenshots/de/features.invite.impl.acceptdecline_AcceptDeclineInviteView_Day_2_de.png +++ b/screenshots/de/features.invite.impl.acceptdecline_AcceptDeclineInviteView_Day_2_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:71125b91c537735f22e804c152024adf23cb5b662ac9a7bd39f8ab609df0cf8c -size 32102 +oid sha256:623c165b9e861733ce2322d4a0830b7067a69b56e66fc9b359d023233eedec66 +size 31667 diff --git a/screenshots/de/features.invite.impl.acceptdecline_AcceptDeclineInviteView_Day_3_de.png b/screenshots/de/features.invite.impl.acceptdecline_AcceptDeclineInviteView_Day_3_de.png index b944e9a7b2..9e8bac9b42 100644 --- a/screenshots/de/features.invite.impl.acceptdecline_AcceptDeclineInviteView_Day_3_de.png +++ b/screenshots/de/features.invite.impl.acceptdecline_AcceptDeclineInviteView_Day_3_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:ee8997d0c539dca790728f8b2227f6a8620c814f69656a209dcfc5fe12aa9f34 -size 22395 +oid sha256:3d8908bd206288902d0f5cc27a75c921e7c890c065856630ee67124ee84037d0 +size 21800 diff --git a/screenshots/de/features.invite.impl.acceptdecline_AcceptDeclineInviteView_Day_4_de.png b/screenshots/de/features.invite.impl.acceptdecline_AcceptDeclineInviteView_Day_4_de.png index 2ec809e0f1..7aee53451d 100644 --- a/screenshots/de/features.invite.impl.acceptdecline_AcceptDeclineInviteView_Day_4_de.png +++ b/screenshots/de/features.invite.impl.acceptdecline_AcceptDeclineInviteView_Day_4_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:97b6da2622c7491563081068c1cbe673b468d8306642c0abfc8f9a8d995c489f -size 22162 +oid sha256:31ceae603343197facb478bf434d0b24beedd53de383b959ce0291679569b8dc +size 21552 diff --git a/screenshots/de/features.invite.impl.acceptdecline_AcceptDeclineInviteView_Day_5_de.png b/screenshots/de/features.invite.impl.acceptdecline_AcceptDeclineInviteView_Day_5_de.png index b944e9a7b2..9e8bac9b42 100644 --- a/screenshots/de/features.invite.impl.acceptdecline_AcceptDeclineInviteView_Day_5_de.png +++ b/screenshots/de/features.invite.impl.acceptdecline_AcceptDeclineInviteView_Day_5_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:ee8997d0c539dca790728f8b2227f6a8620c814f69656a209dcfc5fe12aa9f34 -size 22395 +oid sha256:3d8908bd206288902d0f5cc27a75c921e7c890c065856630ee67124ee84037d0 +size 21800 diff --git a/screenshots/de/features.invite.impl.declineandblock_DeclineAndBlockView_Day_0_de.png b/screenshots/de/features.invite.impl.declineandblock_DeclineAndBlockView_Day_0_de.png index faaf39b56b..2db96167ec 100644 --- a/screenshots/de/features.invite.impl.declineandblock_DeclineAndBlockView_Day_0_de.png +++ b/screenshots/de/features.invite.impl.declineandblock_DeclineAndBlockView_Day_0_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:1b23a9bdf58c4de0fff1e1bcca7639bfdd923672840e690799bb2cb234d400cc -size 40149 +oid sha256:e82bc731dc57594070ba9f50f8c2652b3182ebff17048a0a280583090f287eb6 +size 39534 diff --git a/screenshots/de/features.invite.impl.declineandblock_DeclineAndBlockView_Day_1_de.png b/screenshots/de/features.invite.impl.declineandblock_DeclineAndBlockView_Day_1_de.png index 3fdf7c1e23..7cf58fca3e 100644 --- a/screenshots/de/features.invite.impl.declineandblock_DeclineAndBlockView_Day_1_de.png +++ b/screenshots/de/features.invite.impl.declineandblock_DeclineAndBlockView_Day_1_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:872b1e7f7cd959aea66e6cdbe22619f612f0459b4f2b5e5aa7c396fbd640aa45 -size 44987 +oid sha256:0fa8e55b7d34c2a74d8a9c9c9c4cbe100f58c21b624227bb8537ce68d36ab39a +size 44394 diff --git a/screenshots/de/features.invite.impl.declineandblock_DeclineAndBlockView_Day_2_de.png b/screenshots/de/features.invite.impl.declineandblock_DeclineAndBlockView_Day_2_de.png index 27e4e2dfb9..a157cf0d16 100644 --- a/screenshots/de/features.invite.impl.declineandblock_DeclineAndBlockView_Day_2_de.png +++ b/screenshots/de/features.invite.impl.declineandblock_DeclineAndBlockView_Day_2_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:a377a17d91956a645b96e426f0c5220ea39c28b1e62bb45a32451e6bdedbd343 -size 40344 +oid sha256:428a787d1a32b90034a33d24be724952177fa588939f092fdd0e4bab7437befd +size 39737 diff --git a/screenshots/de/features.invite.impl.declineandblock_DeclineAndBlockView_Day_3_de.png b/screenshots/de/features.invite.impl.declineandblock_DeclineAndBlockView_Day_3_de.png index dff5220be7..fd915108ea 100644 --- a/screenshots/de/features.invite.impl.declineandblock_DeclineAndBlockView_Day_3_de.png +++ b/screenshots/de/features.invite.impl.declineandblock_DeclineAndBlockView_Day_3_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:96f8d48a72eda29ac87b3aabdb92fa6d620520ce2e1df42b428aed9984df33c7 -size 35141 +oid sha256:89c93db9db74dd51b49b387db2a73a60e6426887e767fe41a8f86874014862b6 +size 34735 diff --git a/screenshots/de/features.invite.impl.declineandblock_DeclineAndBlockView_Day_4_de.png b/screenshots/de/features.invite.impl.declineandblock_DeclineAndBlockView_Day_4_de.png index f1ad659d15..7017d7b5db 100644 --- a/screenshots/de/features.invite.impl.declineandblock_DeclineAndBlockView_Day_4_de.png +++ b/screenshots/de/features.invite.impl.declineandblock_DeclineAndBlockView_Day_4_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:9662120fe0a7596d0804df8d585311c55ba13eb2be0e37baecbe872c20274039 -size 39273 +oid sha256:acb23fd141e991fa6468c987dac47287c72c052aaf323f5dd87177bffb57e4b7 +size 39154 diff --git a/screenshots/de/features.invitepeople.impl_InvitePeopleView_Day_0_de.png b/screenshots/de/features.invitepeople.impl_InvitePeopleView_Day_0_de.png new file mode 100644 index 0000000000..9f56a2e6a3 --- /dev/null +++ b/screenshots/de/features.invitepeople.impl_InvitePeopleView_Day_0_de.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:32511b8f5a32774defea03b7c9765ff08322a2a59083c14f3a8d9b8e5807340c +size 9405 diff --git a/screenshots/de/features.invitepeople.impl_InvitePeopleView_Day_1_de.png b/screenshots/de/features.invitepeople.impl_InvitePeopleView_Day_1_de.png new file mode 100644 index 0000000000..15bfd49357 --- /dev/null +++ b/screenshots/de/features.invitepeople.impl_InvitePeopleView_Day_1_de.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:8590b5fd61453580add2dc93262f621b1dbefcff45ed9ef1004d0c5606c35dad +size 21730 diff --git a/screenshots/de/features.invitepeople.impl_InvitePeopleView_Day_4_de.png b/screenshots/de/features.invitepeople.impl_InvitePeopleView_Day_4_de.png new file mode 100644 index 0000000000..89363fb05e --- /dev/null +++ b/screenshots/de/features.invitepeople.impl_InvitePeopleView_Day_4_de.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:656f746cc9dc58566372c0a958d13307d2dc8b5a3c28da0c66f84acbb64489fd +size 9953 diff --git a/screenshots/de/features.invitepeople.impl_InvitePeopleView_Day_5_de.png b/screenshots/de/features.invitepeople.impl_InvitePeopleView_Day_5_de.png new file mode 100644 index 0000000000..37e477d72d --- /dev/null +++ b/screenshots/de/features.invitepeople.impl_InvitePeopleView_Day_5_de.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:f289590cc23cf31013b55d95245d076bb37e6907a8b4409b57e0798847522859 +size 39288 diff --git a/screenshots/de/features.invitepeople.impl_InvitePeopleView_Day_6_de.png b/screenshots/de/features.invitepeople.impl_InvitePeopleView_Day_6_de.png new file mode 100644 index 0000000000..472cd1d139 --- /dev/null +++ b/screenshots/de/features.invitepeople.impl_InvitePeopleView_Day_6_de.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:d531da522778d5692a2f15f05aa4d75e412c8afe8e64aadeacd34b53517d4f8f +size 38254 diff --git a/screenshots/de/features.invitepeople.impl_InvitePeopleView_Day_7_de.png b/screenshots/de/features.invitepeople.impl_InvitePeopleView_Day_7_de.png new file mode 100644 index 0000000000..eea89a228e --- /dev/null +++ b/screenshots/de/features.invitepeople.impl_InvitePeopleView_Day_7_de.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:361ffdc21a6bbe6d1e4d460c74e9fd8a2058d489f5d0e716a71a6dd970d7d8fa +size 30254 diff --git a/screenshots/de/features.joinroom.impl_JoinRoomView_Day_10_de.png b/screenshots/de/features.joinroom.impl_JoinRoomView_Day_10_de.png index 079fb2f4a7..0d3f5f4674 100644 --- a/screenshots/de/features.joinroom.impl_JoinRoomView_Day_10_de.png +++ b/screenshots/de/features.joinroom.impl_JoinRoomView_Day_10_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:b4246083880369a95a033b407fa25cb28a38475e026c8414f286bc515ec7b223 -size 45734 +oid sha256:e0053378b8eae0749b247b8e72de053419adc66fb0eeefc4bb3314befcb43cfe +size 45682 diff --git a/screenshots/de/features.joinroom.impl_JoinRoomView_Day_11_de.png b/screenshots/de/features.joinroom.impl_JoinRoomView_Day_11_de.png index 24b9ae246d..5a8020b57f 100644 --- a/screenshots/de/features.joinroom.impl_JoinRoomView_Day_11_de.png +++ b/screenshots/de/features.joinroom.impl_JoinRoomView_Day_11_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:097dc8f1c616aeb6f0ca2b43d83c5828414dec4338b661a23e74bcc461662ef9 -size 43184 +oid sha256:d2ae8aadc032491f8be5abbc838a17d6277e723c5a8c3863155b9f1aadb7f7a4 +size 43215 diff --git a/screenshots/de/features.joinroom.impl_JoinRoomView_Day_12_de.png b/screenshots/de/features.joinroom.impl_JoinRoomView_Day_12_de.png index 677965249a..d02438d136 100644 --- a/screenshots/de/features.joinroom.impl_JoinRoomView_Day_12_de.png +++ b/screenshots/de/features.joinroom.impl_JoinRoomView_Day_12_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:4016ef3b3562403e6e5de04d274e0c434d47e1cfccf4d71b61e0765334793cd7 -size 44439 +oid sha256:5c769a2008a85b425ca02f43fb3b7440ff0decb203379916152b306e7742d326 +size 44438 diff --git a/screenshots/de/features.joinroom.impl_JoinRoomView_Day_13_de.png b/screenshots/de/features.joinroom.impl_JoinRoomView_Day_13_de.png index ddd6ccd07a..2617dc2887 100644 --- a/screenshots/de/features.joinroom.impl_JoinRoomView_Day_13_de.png +++ b/screenshots/de/features.joinroom.impl_JoinRoomView_Day_13_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:7502335594b906de16b65eab01e5b53ddb88cedd6429ae9b60355552041a1893 -size 33348 +oid sha256:6995ce4264efab67f0e80d53070e5fffb0995cf3c3d3a807be2595dc2dddb136 +size 33354 diff --git a/screenshots/de/features.joinroom.impl_JoinRoomView_Day_14_de.png b/screenshots/de/features.joinroom.impl_JoinRoomView_Day_14_de.png index b9f0cf17e6..13534335fc 100644 --- a/screenshots/de/features.joinroom.impl_JoinRoomView_Day_14_de.png +++ b/screenshots/de/features.joinroom.impl_JoinRoomView_Day_14_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:ee45f1cac90a7f5004cbe5763cef5c6760c4a2f95524ed4a0b2b925369dbe40e -size 33050 +oid sha256:94d357054411ef2988f4626d7d179c24b68429ef3d9de4faada4e4d14ae791d2 +size 33088 diff --git a/screenshots/de/features.joinroom.impl_JoinRoomView_Day_15_de.png b/screenshots/de/features.joinroom.impl_JoinRoomView_Day_15_de.png index de0a6b5b2f..b19b711631 100644 --- a/screenshots/de/features.joinroom.impl_JoinRoomView_Day_15_de.png +++ b/screenshots/de/features.joinroom.impl_JoinRoomView_Day_15_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:0789f3a8606aaac930c111f060bf55d1e1fbe96831013e4e57614d41a07f8f17 -size 39940 +oid sha256:9fce73cfcdb2968e43eb4e01d6a29d9d30e408c1982504e32c599f3209bbdd19 +size 40049 diff --git a/screenshots/de/features.joinroom.impl_JoinRoomView_Day_16_de.png b/screenshots/de/features.joinroom.impl_JoinRoomView_Day_16_de.png index 39befed50a..876c6c1ef4 100644 --- a/screenshots/de/features.joinroom.impl_JoinRoomView_Day_16_de.png +++ b/screenshots/de/features.joinroom.impl_JoinRoomView_Day_16_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:13f9c8734c808ab5211c9fa5a245f62007514f69c8df1fd8ef03db402e6a616e -size 48168 +oid sha256:04f60f947235f1c55a772a285ff5b5ee048504decaaa290253fad07abb4562ac +size 48110 diff --git a/screenshots/de/features.joinroom.impl_JoinRoomView_Day_1_de.png b/screenshots/de/features.joinroom.impl_JoinRoomView_Day_1_de.png index ef68b18dc8..d27c6c8212 100644 --- a/screenshots/de/features.joinroom.impl_JoinRoomView_Day_1_de.png +++ b/screenshots/de/features.joinroom.impl_JoinRoomView_Day_1_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:ba34a04c2eb5eae936579ca7ad4c5832b3fae72edf7f82cbcc5076ff6e3ca1c9 -size 37802 +oid sha256:48b16fdde979709df69d7536e6ca7143a9193c1fbcc1fc67e722e343800ee520 +size 37756 diff --git a/screenshots/de/features.joinroom.impl_JoinRoomView_Day_2_de.png b/screenshots/de/features.joinroom.impl_JoinRoomView_Day_2_de.png index 2fec6d8df0..872f83fbd4 100644 --- a/screenshots/de/features.joinroom.impl_JoinRoomView_Day_2_de.png +++ b/screenshots/de/features.joinroom.impl_JoinRoomView_Day_2_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:16353cc0c4f11e431bf19701fc10f773e29c40b196cf99a6fed5fd3d33e720ce -size 39581 +oid sha256:1b9ca0d8f15e669716d7f903321ea6d53efdb5a688d82cf8d87ee7c44e9b9e63 +size 39537 diff --git a/screenshots/de/features.joinroom.impl_JoinRoomView_Day_3_de.png b/screenshots/de/features.joinroom.impl_JoinRoomView_Day_3_de.png index 5e1bdab9a7..61c2b5fee4 100644 --- a/screenshots/de/features.joinroom.impl_JoinRoomView_Day_3_de.png +++ b/screenshots/de/features.joinroom.impl_JoinRoomView_Day_3_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:31f384e8b63e9c7de6e9c4dc35d90bf7dc0241bd57cdadf564e197ca024c3464 -size 27918 +oid sha256:24aa1cbaa4b23cac156caa59a1427a3587a162b0431b1a1e12795cb26084f291 +size 27834 diff --git a/screenshots/de/features.joinroom.impl_JoinRoomView_Day_4_de.png b/screenshots/de/features.joinroom.impl_JoinRoomView_Day_4_de.png index bbcd6ae81a..6662f386b9 100644 --- a/screenshots/de/features.joinroom.impl_JoinRoomView_Day_4_de.png +++ b/screenshots/de/features.joinroom.impl_JoinRoomView_Day_4_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:bf9f8daa72408ea1a859c3baf4a1c83c765822f24d5527c390c186c9f5465613 -size 47625 +oid sha256:14f5d812c858fbd055b9bc478c883557f6f2246336693aa4545ffc7416fd36bd +size 47731 diff --git a/screenshots/de/features.joinroom.impl_JoinRoomView_Day_5_de.png b/screenshots/de/features.joinroom.impl_JoinRoomView_Day_5_de.png index fe5a338787..ae8855ddaf 100644 --- a/screenshots/de/features.joinroom.impl_JoinRoomView_Day_5_de.png +++ b/screenshots/de/features.joinroom.impl_JoinRoomView_Day_5_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:b3c6175a0eda5634429977d464b4cc7894271cc868cc5f60239d12641f3366a3 -size 32008 +oid sha256:42afee461a148eff01e1cbac6c5ea43864ad411e2951c956e20713d63e071cba +size 31962 diff --git a/screenshots/de/features.joinroom.impl_JoinRoomView_Day_6_de.png b/screenshots/de/features.joinroom.impl_JoinRoomView_Day_6_de.png index e7bf765400..db8fec3c75 100644 --- a/screenshots/de/features.joinroom.impl_JoinRoomView_Day_6_de.png +++ b/screenshots/de/features.joinroom.impl_JoinRoomView_Day_6_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:5cb20afb3c9e97728469a9f791ac2b937daaeaab00b3304b626f02f3f3689fef -size 31608 +oid sha256:7cdbd64bf415dd7c35f59387f6fc3660c692af704c9dfd8d3cd96c814b3079f4 +size 31656 diff --git a/screenshots/de/features.joinroom.impl_JoinRoomView_Day_7_de.png b/screenshots/de/features.joinroom.impl_JoinRoomView_Day_7_de.png index 094b56a1a8..68c0f56eac 100644 --- a/screenshots/de/features.joinroom.impl_JoinRoomView_Day_7_de.png +++ b/screenshots/de/features.joinroom.impl_JoinRoomView_Day_7_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:0e0551255bd0278b01196c2c5386df8f000dd46e0eaa577bec9ce2cf59544d82 -size 40468 +oid sha256:30b3eafeb3167a792b9543d7cb1ea033b8add88435b7c7721dd840e8dbc9537d +size 40476 diff --git a/screenshots/de/features.joinroom.impl_JoinRoomView_Day_8_de.png b/screenshots/de/features.joinroom.impl_JoinRoomView_Day_8_de.png index e3c6c5bff3..4e83319d93 100644 --- a/screenshots/de/features.joinroom.impl_JoinRoomView_Day_8_de.png +++ b/screenshots/de/features.joinroom.impl_JoinRoomView_Day_8_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:787f2a7755a4675f3ca3e897553fdf83bc11dcb0357d0bd2615dfc8e52c47cb3 -size 34939 +oid sha256:27398dbb52e4966b6e83838bb6316d62244419988e7b322dc36b3b1a1d821b96 +size 35003 diff --git a/screenshots/de/features.joinroom.impl_JoinRoomView_Day_9_de.png b/screenshots/de/features.joinroom.impl_JoinRoomView_Day_9_de.png index 13c700e638..50a105a8e6 100644 --- a/screenshots/de/features.joinroom.impl_JoinRoomView_Day_9_de.png +++ b/screenshots/de/features.joinroom.impl_JoinRoomView_Day_9_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:ff7b93b639ed41344553337bdae929c7d60e6150a899e62ec9b0c2eff5ddbc1a -size 35962 +oid sha256:d281e3b9c1c7c3892a051c2d9b3b11e330555ca3da82bb1976c47f89f5006426 +size 35925 diff --git a/screenshots/de/features.knockrequests.impl.banner_KnockRequestsBannerView_Day_0_de.png b/screenshots/de/features.knockrequests.impl.banner_KnockRequestsBannerView_Day_0_de.png index d25b222128..7406053cf5 100644 --- a/screenshots/de/features.knockrequests.impl.banner_KnockRequestsBannerView_Day_0_de.png +++ b/screenshots/de/features.knockrequests.impl.banner_KnockRequestsBannerView_Day_0_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:96031229f97b8ad370c172991177525ea205ad1d4951b50a5be7f1376067920e -size 32893 +oid sha256:a600a47c1b8b81066d3dcddb4243890319695588e852ab859ea5f90b77e35bcd +size 32915 diff --git a/screenshots/de/features.knockrequests.impl.banner_KnockRequestsBannerView_Day_1_de.png b/screenshots/de/features.knockrequests.impl.banner_KnockRequestsBannerView_Day_1_de.png index 164731d9d3..adf9432b0b 100644 --- a/screenshots/de/features.knockrequests.impl.banner_KnockRequestsBannerView_Day_1_de.png +++ b/screenshots/de/features.knockrequests.impl.banner_KnockRequestsBannerView_Day_1_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:94107fe2b7f511409300f163587f73148e5c81bbe33f1cab2f68beda2e1c33ea -size 38459 +oid sha256:3b86fdc4768404633fc1399a0e5eee8a9a900b8320ada7f7d80a30379c146122 +size 38379 diff --git a/screenshots/de/features.knockrequests.impl.banner_KnockRequestsBannerView_Day_2_de.png b/screenshots/de/features.knockrequests.impl.banner_KnockRequestsBannerView_Day_2_de.png index e8637fe4b0..7fe13a5a03 100644 --- a/screenshots/de/features.knockrequests.impl.banner_KnockRequestsBannerView_Day_2_de.png +++ b/screenshots/de/features.knockrequests.impl.banner_KnockRequestsBannerView_Day_2_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:5a65ae28c9756a10bcf8ed7775c7339a8c58c2286d979b47422d80c38246b07c -size 21411 +oid sha256:dda327a7a03b3f06f3a128179ae055c9217d9c3c8c21aa42f299aa72091eb91c +size 21651 diff --git a/screenshots/de/features.knockrequests.impl.banner_KnockRequestsBannerView_Day_3_de.png b/screenshots/de/features.knockrequests.impl.banner_KnockRequestsBannerView_Day_3_de.png index cec4b78900..f46c3a743d 100644 --- a/screenshots/de/features.knockrequests.impl.banner_KnockRequestsBannerView_Day_3_de.png +++ b/screenshots/de/features.knockrequests.impl.banner_KnockRequestsBannerView_Day_3_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:c65b5d4a1827d54e053aa9bdc3f45b479ff97f8e0d32a321e66b068a5df8e110 -size 22116 +oid sha256:f453b9a19524d101e3a0948cf1ef8eb4d6c0919829816377537b5657203130c3 +size 22258 diff --git a/screenshots/de/features.knockrequests.impl.banner_KnockRequestsBannerView_Day_4_de.png b/screenshots/de/features.knockrequests.impl.banner_KnockRequestsBannerView_Day_4_de.png index b607788070..c3d7da1541 100644 --- a/screenshots/de/features.knockrequests.impl.banner_KnockRequestsBannerView_Day_4_de.png +++ b/screenshots/de/features.knockrequests.impl.banner_KnockRequestsBannerView_Day_4_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:6fd3802fef91a5e636878cb9bb9e8ecfd5cc22aaee37c8e00d69424ce827a550 -size 29524 +oid sha256:64b70351e7ee1203210f328b436ed6a8770aa888a2bc4afa83690b4834f03b00 +size 29468 diff --git a/screenshots/de/features.knockrequests.impl.banner_KnockRequestsBannerView_Day_5_de.png b/screenshots/de/features.knockrequests.impl.banner_KnockRequestsBannerView_Day_5_de.png index abd04bc1d7..77ea53cb32 100644 --- a/screenshots/de/features.knockrequests.impl.banner_KnockRequestsBannerView_Day_5_de.png +++ b/screenshots/de/features.knockrequests.impl.banner_KnockRequestsBannerView_Day_5_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:7ccfd30040006bd62b94dd96b923b1e01dc372c13cd2c79bca5d34492f0c0a7f -size 36293 +oid sha256:75725ca2af99a1cbecd387644a669c28b23628abb01d9c36d3b417f032e5dfe3 +size 36501 diff --git a/screenshots/de/features.knockrequests.impl.banner_KnockRequestsBannerView_Day_6_de.png b/screenshots/de/features.knockrequests.impl.banner_KnockRequestsBannerView_Day_6_de.png index 7b57dd0895..0161fce927 100644 --- a/screenshots/de/features.knockrequests.impl.banner_KnockRequestsBannerView_Day_6_de.png +++ b/screenshots/de/features.knockrequests.impl.banner_KnockRequestsBannerView_Day_6_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:aa06993480adbdc317035e096413ba7cf11ac388c3fbd2d805ec968296c4f85b -size 42651 +oid sha256:03e6f8014e4b06cda4e6eab8248ab1c331def3e719662e3d795c4f2a8d3a852d +size 42940 diff --git a/screenshots/de/features.knockrequests.impl.list_KnockRequestsListView_Day_0_de.png b/screenshots/de/features.knockrequests.impl.list_KnockRequestsListView_Day_0_de.png index 0246bc0704..37057b18f4 100644 --- a/screenshots/de/features.knockrequests.impl.list_KnockRequestsListView_Day_0_de.png +++ b/screenshots/de/features.knockrequests.impl.list_KnockRequestsListView_Day_0_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:09f10cd4840c1f418b41ee56ebca4f332adc818482d10b92139c72819c0c324a -size 16305 +oid sha256:fbf0fa64351f2710f026b438753f426e4473bcdd3a71e8438013a1a1ee970699 +size 16357 diff --git a/screenshots/de/features.knockrequests.impl.list_KnockRequestsListView_Day_10_de.png b/screenshots/de/features.knockrequests.impl.list_KnockRequestsListView_Day_10_de.png index 848893f2f4..90deee1a55 100644 --- a/screenshots/de/features.knockrequests.impl.list_KnockRequestsListView_Day_10_de.png +++ b/screenshots/de/features.knockrequests.impl.list_KnockRequestsListView_Day_10_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:1077146e51bcf9e1092882f2e86e0aec59a7611b0b809aca43c1cb3a68d4d60b -size 32137 +oid sha256:208cca1b73135011b969b6b1c7ef30497a4f645fb531f7d666f223233d766791 +size 32066 diff --git a/screenshots/de/features.knockrequests.impl.list_KnockRequestsListView_Day_1_de.png b/screenshots/de/features.knockrequests.impl.list_KnockRequestsListView_Day_1_de.png index 8ba25e0429..0aa4b6ff42 100644 --- a/screenshots/de/features.knockrequests.impl.list_KnockRequestsListView_Day_1_de.png +++ b/screenshots/de/features.knockrequests.impl.list_KnockRequestsListView_Day_1_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:11bb28eb92749758f1e585b82702beae921bf658d8aca9ab86cab0f0475011c7 -size 29321 +oid sha256:86e5ed8130170b72b5ceb469971c7557bdc3699f432a201500a0a09e07ee9a21 +size 29413 diff --git a/screenshots/de/features.knockrequests.impl.list_KnockRequestsListView_Day_2_de.png b/screenshots/de/features.knockrequests.impl.list_KnockRequestsListView_Day_2_de.png index 130c00ef23..b5e2221a4b 100644 --- a/screenshots/de/features.knockrequests.impl.list_KnockRequestsListView_Day_2_de.png +++ b/screenshots/de/features.knockrequests.impl.list_KnockRequestsListView_Day_2_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:0c597c004d249dd1498b74b6e6073db4467ab65bcb267f51b2d29cbb4ab00e49 -size 35722 +oid sha256:2265efa921451e40b9959e4fa2724978eb118eba074e0d039c6a1c66aee97a41 +size 35666 diff --git a/screenshots/de/features.knockrequests.impl.list_KnockRequestsListView_Day_3_de.png b/screenshots/de/features.knockrequests.impl.list_KnockRequestsListView_Day_3_de.png index ec5ebea7f1..1dee560633 100644 --- a/screenshots/de/features.knockrequests.impl.list_KnockRequestsListView_Day_3_de.png +++ b/screenshots/de/features.knockrequests.impl.list_KnockRequestsListView_Day_3_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:84c9a2104a9640cbb22ece5a98fdf923c9e6bba070f221cf296354f9d91874c9 -size 44238 +oid sha256:7a3f77248ac32c2a6a86f47b8b5d40a57d205949e4d8f673c4735d0af833c47a +size 44390 diff --git a/screenshots/de/features.knockrequests.impl.list_KnockRequestsListView_Day_4_de.png b/screenshots/de/features.knockrequests.impl.list_KnockRequestsListView_Day_4_de.png index 1accfd1556..f3891ed3d4 100644 --- a/screenshots/de/features.knockrequests.impl.list_KnockRequestsListView_Day_4_de.png +++ b/screenshots/de/features.knockrequests.impl.list_KnockRequestsListView_Day_4_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:a691ed456b7e7cc2a86efc5e4bc1858807462fd9c8404a279f93d07f38a78ec2 -size 57908 +oid sha256:77e42fe00de27f72afd6b7d2670f4dc72293eabfa800153052351d7cda20bbbf +size 57917 diff --git a/screenshots/de/features.knockrequests.impl.list_KnockRequestsListView_Day_5_de.png b/screenshots/de/features.knockrequests.impl.list_KnockRequestsListView_Day_5_de.png index 22d6c234f5..ff9833e766 100644 --- a/screenshots/de/features.knockrequests.impl.list_KnockRequestsListView_Day_5_de.png +++ b/screenshots/de/features.knockrequests.impl.list_KnockRequestsListView_Day_5_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:f52c5d8697743b477a9a992e823f8af54627856b95fe6fc946b90e905316efd4 -size 47071 +oid sha256:5dcaa75e8efe68c35e2ab72e381926284bb10f0cf0e0e64efbe1775043fd21b9 +size 47158 diff --git a/screenshots/de/features.knockrequests.impl.list_KnockRequestsListView_Day_6_de.png b/screenshots/de/features.knockrequests.impl.list_KnockRequestsListView_Day_6_de.png index f10d0ee884..fb5adf5e5f 100644 --- a/screenshots/de/features.knockrequests.impl.list_KnockRequestsListView_Day_6_de.png +++ b/screenshots/de/features.knockrequests.impl.list_KnockRequestsListView_Day_6_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:b7fbe18587c2e65ffcc7d0ce12a16b738b3bc4a6b1d7fa30f70528946c445eb1 -size 38075 +oid sha256:0948a04ca82c9826163898b5998e2a1e7e19a3e212a7718f4888b618aff0fad2 +size 37931 diff --git a/screenshots/de/features.knockrequests.impl.list_KnockRequestsListView_Day_7_de.png b/screenshots/de/features.knockrequests.impl.list_KnockRequestsListView_Day_7_de.png index 44eb4b8306..454c30ad4f 100644 --- a/screenshots/de/features.knockrequests.impl.list_KnockRequestsListView_Day_7_de.png +++ b/screenshots/de/features.knockrequests.impl.list_KnockRequestsListView_Day_7_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:f59a2679a06a15bb06bfbbe13fb335a6add23537ded890f1c94d78ffdd24bd52 -size 43879 +oid sha256:6aa1d1412f5f0ebbd3dcca0b364ca87f0170596b1d7cf7dbd57675bce104d9af +size 43808 diff --git a/screenshots/de/features.knockrequests.impl.list_KnockRequestsListView_Day_8_de.png b/screenshots/de/features.knockrequests.impl.list_KnockRequestsListView_Day_8_de.png index 50c98f9d91..87ad6ef300 100644 --- a/screenshots/de/features.knockrequests.impl.list_KnockRequestsListView_Day_8_de.png +++ b/screenshots/de/features.knockrequests.impl.list_KnockRequestsListView_Day_8_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:d5b7c05b6e2c670dcddc5711c68b18b609cb8f9baebaf65604539b855eb650fa -size 32507 +oid sha256:e961c29fe0c5fc1bb0fa8b15645f5ab4a48769b36a263261b1fff8ccbb141bba +size 32506 diff --git a/screenshots/de/features.knockrequests.impl.list_KnockRequestsListView_Day_9_de.png b/screenshots/de/features.knockrequests.impl.list_KnockRequestsListView_Day_9_de.png index 683a194473..0f2f3b1442 100644 --- a/screenshots/de/features.knockrequests.impl.list_KnockRequestsListView_Day_9_de.png +++ b/screenshots/de/features.knockrequests.impl.list_KnockRequestsListView_Day_9_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:e7381e950f42e484b7a6499a7cdd2c5538f2ac6a848af2624fa73e653115bc55 -size 28684 +oid sha256:3271c2b087197cecd7efa3cf8b5f4c4a2190a1b41551004d2a9466d3b5b8cc1c +size 28676 diff --git a/screenshots/de/features.leaveroom.api_LeaveRoomView_Day_1_de.png b/screenshots/de/features.leaveroom.api_LeaveRoomView_Day_1_de.png deleted file mode 100644 index 361f000322..0000000000 --- a/screenshots/de/features.leaveroom.api_LeaveRoomView_Day_1_de.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:68918b40c4e738d943f2f9fb94736b820303282d0eb9e0520f3d1c6b77169eae -size 22879 diff --git a/screenshots/de/features.leaveroom.api_LeaveRoomView_Day_2_de.png b/screenshots/de/features.leaveroom.api_LeaveRoomView_Day_2_de.png deleted file mode 100644 index 0c7f70d4a9..0000000000 --- a/screenshots/de/features.leaveroom.api_LeaveRoomView_Day_2_de.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:07645650921e92047a02fc99c5a3ad0f117bb7f3da27f41434e55867970b6e27 -size 35414 diff --git a/screenshots/de/features.leaveroom.api_LeaveRoomView_Day_3_de.png b/screenshots/de/features.leaveroom.api_LeaveRoomView_Day_3_de.png deleted file mode 100644 index 248060117a..0000000000 --- a/screenshots/de/features.leaveroom.api_LeaveRoomView_Day_3_de.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:22a2d91e9cbecf7903e70f885e3fc7807345c770ad73c1dd81487bc0655f8413 -size 39957 diff --git a/screenshots/de/features.leaveroom.api_LeaveRoomView_Day_4_de.png b/screenshots/de/features.leaveroom.api_LeaveRoomView_Day_4_de.png deleted file mode 100644 index 6207c21422..0000000000 --- a/screenshots/de/features.leaveroom.api_LeaveRoomView_Day_4_de.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:946af9704b2127f17407188d525689130f937abf7928225e3a61705ece0eb8df -size 10686 diff --git a/screenshots/de/features.leaveroom.api_LeaveRoomView_Day_5_de.png b/screenshots/de/features.leaveroom.api_LeaveRoomView_Day_5_de.png deleted file mode 100644 index 26f9933feb..0000000000 --- a/screenshots/de/features.leaveroom.api_LeaveRoomView_Day_5_de.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:3e83a28c5e7ab79fd671a0c98aa6f5bc0adaa0072ead81db602cd4d0939d510e -size 14991 diff --git a/screenshots/de/features.leaveroom.api_LeaveRoomView_Day_6_de.png b/screenshots/de/features.leaveroom.api_LeaveRoomView_Day_6_de.png deleted file mode 100644 index 0c7f70d4a9..0000000000 --- a/screenshots/de/features.leaveroom.api_LeaveRoomView_Day_6_de.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:07645650921e92047a02fc99c5a3ad0f117bb7f3da27f41434e55867970b6e27 -size 35414 diff --git a/screenshots/de/features.leaveroom.impl_LeaveRoomView_Day_1_de.png b/screenshots/de/features.leaveroom.impl_LeaveRoomView_Day_1_de.png new file mode 100644 index 0000000000..9b034722e9 --- /dev/null +++ b/screenshots/de/features.leaveroom.impl_LeaveRoomView_Day_1_de.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:37f0d170c4c8a30e0571e4d89cc4654e5292bbb3cb5e1b677038da1e17dcf7ae +size 23056 diff --git a/screenshots/de/features.leaveroom.impl_LeaveRoomView_Day_2_de.png b/screenshots/de/features.leaveroom.impl_LeaveRoomView_Day_2_de.png new file mode 100644 index 0000000000..06998c4f2b --- /dev/null +++ b/screenshots/de/features.leaveroom.impl_LeaveRoomView_Day_2_de.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:c4db1f3840aa3a4492f9bbb1f4c6995fe1b49588077bfe605900b3ac5ae23f28 +size 35635 diff --git a/screenshots/de/features.leaveroom.impl_LeaveRoomView_Day_3_de.png b/screenshots/de/features.leaveroom.impl_LeaveRoomView_Day_3_de.png new file mode 100644 index 0000000000..1f3ef82896 --- /dev/null +++ b/screenshots/de/features.leaveroom.impl_LeaveRoomView_Day_3_de.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:e0370de5bde85f87e81b05e26d34debc1c35e5e5df7975a96cd3f33d5a639c07 +size 40173 diff --git a/screenshots/de/features.leaveroom.impl_LeaveRoomView_Day_4_de.png b/screenshots/de/features.leaveroom.impl_LeaveRoomView_Day_4_de.png new file mode 100644 index 0000000000..06998c4f2b --- /dev/null +++ b/screenshots/de/features.leaveroom.impl_LeaveRoomView_Day_4_de.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:c4db1f3840aa3a4492f9bbb1f4c6995fe1b49588077bfe605900b3ac5ae23f28 +size 35635 diff --git a/screenshots/de/features.leaveroom.impl_LeaveRoomView_Day_5_de.png b/screenshots/de/features.leaveroom.impl_LeaveRoomView_Day_5_de.png new file mode 100644 index 0000000000..971c82fef3 --- /dev/null +++ b/screenshots/de/features.leaveroom.impl_LeaveRoomView_Day_5_de.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:d2fd207b37ad64e6a5e63d55a2b0bbe9ab618bb0ccf1e909550562c8c0b04319 +size 32635 diff --git a/screenshots/de/features.leaveroom.impl_LeaveRoomView_Day_6_de.png b/screenshots/de/features.leaveroom.impl_LeaveRoomView_Day_6_de.png new file mode 100644 index 0000000000..974c12499e --- /dev/null +++ b/screenshots/de/features.leaveroom.impl_LeaveRoomView_Day_6_de.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:d26e3865c632af1ab3fc8ee97b95ff2db78be0c4961cd36e006f2112db14978e +size 10925 diff --git a/screenshots/de/features.leaveroom.impl_LeaveRoomView_Day_7_de.png b/screenshots/de/features.leaveroom.impl_LeaveRoomView_Day_7_de.png new file mode 100644 index 0000000000..b8336ca68b --- /dev/null +++ b/screenshots/de/features.leaveroom.impl_LeaveRoomView_Day_7_de.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:907d69d593f9939decf8fcb6a6b1fa8652ef511c2dc086b2e3a816c155562a2f +size 22569 diff --git a/screenshots/de/features.licenses.impl.list_DependencyLicensesListView_Day_0_de.png b/screenshots/de/features.licenses.impl.list_DependencyLicensesListView_Day_0_de.png index 2387269686..7b4740fadf 100644 --- a/screenshots/de/features.licenses.impl.list_DependencyLicensesListView_Day_0_de.png +++ b/screenshots/de/features.licenses.impl.list_DependencyLicensesListView_Day_0_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:03d9396d033f227408e8acdb424f187e2c0bf7c5493c13faee5eef51b01e4c93 -size 10726 +oid sha256:70176fa3a368a15308a8c22bcdda99b1670260b2ca7e6a5ffcc0595ae62178eb +size 10737 diff --git a/screenshots/de/features.licenses.impl.list_DependencyLicensesListView_Day_1_de.png b/screenshots/de/features.licenses.impl.list_DependencyLicensesListView_Day_1_de.png index a07a28ce03..4764b6c076 100644 --- a/screenshots/de/features.licenses.impl.list_DependencyLicensesListView_Day_1_de.png +++ b/screenshots/de/features.licenses.impl.list_DependencyLicensesListView_Day_1_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:1b719ebe0ef05845daa58e6e1e0c72b9c30da66e639fc6bed9edeb483ed3d1d0 -size 10206 +oid sha256:12761bf881ecc1787f48834d36f950d38d8dddbcb8fef8f21553cb695ba57e8c +size 10222 diff --git a/screenshots/de/features.licenses.impl.list_DependencyLicensesListView_Day_2_de.png b/screenshots/de/features.licenses.impl.list_DependencyLicensesListView_Day_2_de.png index 377751198f..4d332c73df 100644 --- a/screenshots/de/features.licenses.impl.list_DependencyLicensesListView_Day_2_de.png +++ b/screenshots/de/features.licenses.impl.list_DependencyLicensesListView_Day_2_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:78267cc22ef57370eb378a19d37be1826a7da737903ab38f1db984bfaac71014 -size 29368 +oid sha256:04ad3a3f5f6e09d7f0e22509a22cbe0b7d252be9ec8bfcfc7208a6d7df1c76f5 +size 29235 diff --git a/screenshots/de/features.licenses.impl.list_DependencyLicensesListView_Day_3_de.png b/screenshots/de/features.licenses.impl.list_DependencyLicensesListView_Day_3_de.png index 7f32725a95..efff44f56e 100644 --- a/screenshots/de/features.licenses.impl.list_DependencyLicensesListView_Day_3_de.png +++ b/screenshots/de/features.licenses.impl.list_DependencyLicensesListView_Day_3_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:368438eee2c58b62920c4568d4f727fc760f9e858841015c0fc053a7c1794f34 -size 30633 +oid sha256:2230c0dc8f812a9eb06e54fa08e3f3299090a8f2073b8b589a641b7eccca54fb +size 30494 diff --git a/screenshots/de/features.location.api.internal_StaticMapPlaceholder_Day_0_de.png b/screenshots/de/features.location.api.internal_StaticMapPlaceholder_Day_0_de.png index dfe7bd79eb..2bea7fe6e7 100644 --- a/screenshots/de/features.location.api.internal_StaticMapPlaceholder_Day_0_de.png +++ b/screenshots/de/features.location.api.internal_StaticMapPlaceholder_Day_0_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:91454ab70e3fd8a412a89ba7dba8d8e9e9009dd024b180fcb78e26c419e0b8e6 -size 440161 +oid sha256:8096f14cd637ca3042c54d17c6201b633e3f631e637fa5f4060b5c4e56d4faaf +size 440276 diff --git a/screenshots/de/features.location.impl.send_SendLocationView_Day_0_de.png b/screenshots/de/features.location.impl.send_SendLocationView_Day_0_de.png index 7f17e1bce0..e3b1a4d8f6 100644 --- a/screenshots/de/features.location.impl.send_SendLocationView_Day_0_de.png +++ b/screenshots/de/features.location.impl.send_SendLocationView_Day_0_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:07871bad0b4fff7c26d2b7ae5caad3adcc10b94db3d20957b04ac4f4a9beb480 -size 19248 +oid sha256:afd961db19f26c40b6811193b0f97130fd83cb7b06a4073666394c8d272c3d6c +size 19312 diff --git a/screenshots/de/features.location.impl.send_SendLocationView_Day_1_de.png b/screenshots/de/features.location.impl.send_SendLocationView_Day_1_de.png index 4f451bc766..427d1dc7fa 100644 --- a/screenshots/de/features.location.impl.send_SendLocationView_Day_1_de.png +++ b/screenshots/de/features.location.impl.send_SendLocationView_Day_1_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:7fd93653089fa51c42f5fc75d4733461a4cfb47853a677bd035789596b8586b3 -size 37713 +oid sha256:1620bf8172a3149fecd3c2d1d4dadd4e47583f7a526439aebbb214d63006bb5d +size 37678 diff --git a/screenshots/de/features.location.impl.send_SendLocationView_Day_2_de.png b/screenshots/de/features.location.impl.send_SendLocationView_Day_2_de.png index bb4ce9be93..f4cd907ff0 100644 --- a/screenshots/de/features.location.impl.send_SendLocationView_Day_2_de.png +++ b/screenshots/de/features.location.impl.send_SendLocationView_Day_2_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:74d324f86d614041f49b6ef019a0141d57ad0c7a62ae71921ff7e4ee662b94e7 -size 34268 +oid sha256:7924fd960811c92797a8928557182269af37906971e177a170a0e6a28045c0f8 +size 34303 diff --git a/screenshots/de/features.location.impl.send_SendLocationView_Day_3_de.png b/screenshots/de/features.location.impl.send_SendLocationView_Day_3_de.png index 7f17e1bce0..e3b1a4d8f6 100644 --- a/screenshots/de/features.location.impl.send_SendLocationView_Day_3_de.png +++ b/screenshots/de/features.location.impl.send_SendLocationView_Day_3_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:07871bad0b4fff7c26d2b7ae5caad3adcc10b94db3d20957b04ac4f4a9beb480 -size 19248 +oid sha256:afd961db19f26c40b6811193b0f97130fd83cb7b06a4073666394c8d272c3d6c +size 19312 diff --git a/screenshots/de/features.location.impl.send_SendLocationView_Day_4_de.png b/screenshots/de/features.location.impl.send_SendLocationView_Day_4_de.png index f607bde75d..d2f67e9133 100644 --- a/screenshots/de/features.location.impl.send_SendLocationView_Day_4_de.png +++ b/screenshots/de/features.location.impl.send_SendLocationView_Day_4_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:89aec8891a8519adc8d1f3b7302da5f61acf6c47eefa763fb011d12ef5eab6e2 -size 19337 +oid sha256:104c572c42f9a3c02939446d74202f04fa7fe7f1319b906381051090b450ca35 +size 19509 diff --git a/screenshots/de/features.location.impl.show_ShowLocationView_Day_0_de.png b/screenshots/de/features.location.impl.show_ShowLocationView_Day_0_de.png index 889f33bc8e..d2b37fa62d 100644 --- a/screenshots/de/features.location.impl.show_ShowLocationView_Day_0_de.png +++ b/screenshots/de/features.location.impl.show_ShowLocationView_Day_0_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:7ccfec55b0d28d23a152e9dd2c7f59af77064d7267793ebe1b30c645e34a2c97 -size 11120 +oid sha256:a74ec7c80ca76d340b5677a43b54eb2f37366fb5fedbdb0309200f85817a46f0 +size 11185 diff --git a/screenshots/de/features.location.impl.show_ShowLocationView_Day_1_de.png b/screenshots/de/features.location.impl.show_ShowLocationView_Day_1_de.png index 9bebed6b6a..f6cbe83e40 100644 --- a/screenshots/de/features.location.impl.show_ShowLocationView_Day_1_de.png +++ b/screenshots/de/features.location.impl.show_ShowLocationView_Day_1_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:b980c8e7aadb7f44e07557682b461030febd1adef91fa4d22b06371d673da141 -size 32226 +oid sha256:f70500e3e8371bb007bb5cb73636ef9a29fe2f70c66e6073bac9a6eb84515f7f +size 32231 diff --git a/screenshots/de/features.location.impl.show_ShowLocationView_Day_2_de.png b/screenshots/de/features.location.impl.show_ShowLocationView_Day_2_de.png index 3d03494191..84c16a9d1c 100644 --- a/screenshots/de/features.location.impl.show_ShowLocationView_Day_2_de.png +++ b/screenshots/de/features.location.impl.show_ShowLocationView_Day_2_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:4c3b087fc80d35e8fab46bb86563ed419f78d4dbde91a88f9110da7ae61b1d87 -size 28830 +oid sha256:f59dbc9fc2848dcfca04fff3e8739554f8dade43f0f4e189699480ee3073fc92 +size 28901 diff --git a/screenshots/de/features.location.impl.show_ShowLocationView_Day_3_de.png b/screenshots/de/features.location.impl.show_ShowLocationView_Day_3_de.png index 889f33bc8e..d2b37fa62d 100644 --- a/screenshots/de/features.location.impl.show_ShowLocationView_Day_3_de.png +++ b/screenshots/de/features.location.impl.show_ShowLocationView_Day_3_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:7ccfec55b0d28d23a152e9dd2c7f59af77064d7267793ebe1b30c645e34a2c97 -size 11120 +oid sha256:a74ec7c80ca76d340b5677a43b54eb2f37366fb5fedbdb0309200f85817a46f0 +size 11185 diff --git a/screenshots/de/features.location.impl.show_ShowLocationView_Day_4_de.png b/screenshots/de/features.location.impl.show_ShowLocationView_Day_4_de.png index 833f71e2c2..0fb5a74d8f 100644 --- a/screenshots/de/features.location.impl.show_ShowLocationView_Day_4_de.png +++ b/screenshots/de/features.location.impl.show_ShowLocationView_Day_4_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:8438791dee20a45ff5831b5aa9986ae06ef72a6a3f6e8eee20579271ff951a84 -size 11172 +oid sha256:5ba7c229b92eff8bfb53cf729a8dfef6ea5287e83cd6037d1f66fbd9bcf0ad76 +size 11319 diff --git a/screenshots/de/features.location.impl.show_ShowLocationView_Day_5_de.png b/screenshots/de/features.location.impl.show_ShowLocationView_Day_5_de.png index 49d96b5747..067f9b76a8 100644 --- a/screenshots/de/features.location.impl.show_ShowLocationView_Day_5_de.png +++ b/screenshots/de/features.location.impl.show_ShowLocationView_Day_5_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:2f3895ad80e688827b51db4cfd1bce133d47e17041256dd37d4d70384e91a92f -size 14880 +oid sha256:fdc4c2ee2bcb430249a629cb53f0685c0aba380cc32e127bd2fc3c48bdf69d2e +size 14918 diff --git a/screenshots/de/features.location.impl.show_ShowLocationView_Day_6_de.png b/screenshots/de/features.location.impl.show_ShowLocationView_Day_6_de.png index a0366c5f0c..246df83592 100644 --- a/screenshots/de/features.location.impl.show_ShowLocationView_Day_6_de.png +++ b/screenshots/de/features.location.impl.show_ShowLocationView_Day_6_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:8d7fffab84bef74ee80169ee2d208aec3f784edb3b2be5dbf1dfb3382e4a865c -size 23567 +oid sha256:6dc9fe8e6ce13b5752b36507c583f75069eabbd8c27e06e53bee1579cb0cf2b9 +size 23540 diff --git a/screenshots/de/features.location.impl.show_ShowLocationView_Day_7_de.png b/screenshots/de/features.location.impl.show_ShowLocationView_Day_7_de.png index 32ce8cb936..bee47c76cd 100644 --- a/screenshots/de/features.location.impl.show_ShowLocationView_Day_7_de.png +++ b/screenshots/de/features.location.impl.show_ShowLocationView_Day_7_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:dd1db52f3fa34e6b3c137be100cb34ed5ea917ca8645d5382da0b8d8b0acdfdf -size 25889 +oid sha256:ff97bdc5defa5188b66fec26e4693aacae40d05c7a0f50b829a187383bce8cf1 +size 26315 diff --git a/screenshots/de/features.lockscreen.impl.settings_LockScreenSettingsView_Day_0_de.png b/screenshots/de/features.lockscreen.impl.settings_LockScreenSettingsView_Day_0_de.png index a47b3ddd50..b00e3db6b2 100644 --- a/screenshots/de/features.lockscreen.impl.settings_LockScreenSettingsView_Day_0_de.png +++ b/screenshots/de/features.lockscreen.impl.settings_LockScreenSettingsView_Day_0_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:123c08a9491af5d5aaa18c7732ed9d6aaf924a098796fc83905a5ee9e51664c7 -size 19336 +oid sha256:6ed749c9e3b21e56071e611fb75aed1292a9b35e36e52fd86d2798b8d4271924 +size 19294 diff --git a/screenshots/de/features.lockscreen.impl.settings_LockScreenSettingsView_Day_1_de.png b/screenshots/de/features.lockscreen.impl.settings_LockScreenSettingsView_Day_1_de.png index e60f7a9f71..1e7f9e3026 100644 --- a/screenshots/de/features.lockscreen.impl.settings_LockScreenSettingsView_Day_1_de.png +++ b/screenshots/de/features.lockscreen.impl.settings_LockScreenSettingsView_Day_1_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:6deb7e216831bbccad421995627d8f33fd2ce0fa5c6ec96b23d65b040f16abc4 -size 21608 +oid sha256:2fad10b820bfc20ea81d2c33c756d8acebbf2b2e44f952145bbd21ba24dce633 +size 21629 diff --git a/screenshots/de/features.lockscreen.impl.settings_LockScreenSettingsView_Day_2_de.png b/screenshots/de/features.lockscreen.impl.settings_LockScreenSettingsView_Day_2_de.png index 86013cc1b1..b44b5bcbec 100644 --- a/screenshots/de/features.lockscreen.impl.settings_LockScreenSettingsView_Day_2_de.png +++ b/screenshots/de/features.lockscreen.impl.settings_LockScreenSettingsView_Day_2_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:21cb68b954f19d773ce54e6be85b4edb7dc286dfb058b202affcb0b501d12a2b -size 33398 +oid sha256:0a9c5e6c1d2650e281ef1ab985ed02ff8ed4fbeff4b2a7f0c2ea8316a407d228 +size 33481 diff --git a/screenshots/de/features.lockscreen.impl.setup.biometric_SetupBiometricView_Day_0_de.png b/screenshots/de/features.lockscreen.impl.setup.biometric_SetupBiometricView_Day_0_de.png index bb851a6a63..87b843ddb0 100644 --- a/screenshots/de/features.lockscreen.impl.setup.biometric_SetupBiometricView_Day_0_de.png +++ b/screenshots/de/features.lockscreen.impl.setup.biometric_SetupBiometricView_Day_0_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:8266bbd97e6263a0ed56dc83aadb5e78bdc610b9618cf4055051aeca1184cf39 -size 38802 +oid sha256:4b2e1fa8627ca40e46b087a7aa1e192fc7a9779a8fa02d4ee4ca908a01c8860f +size 38756 diff --git a/screenshots/de/features.lockscreen.impl.setup.pin_SetupPinView_Day_0_de.png b/screenshots/de/features.lockscreen.impl.setup.pin_SetupPinView_Day_0_de.png index 88b37ebb3c..b1f125fff7 100644 --- a/screenshots/de/features.lockscreen.impl.setup.pin_SetupPinView_Day_0_de.png +++ b/screenshots/de/features.lockscreen.impl.setup.pin_SetupPinView_Day_0_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:ef1ac61e5c921218a27ef5811c926de59fecda7c8db4be1dca9aee7bf73c6f44 -size 33754 +oid sha256:4e50acc00c8e2a9be8300cc98a048c01cb07820e2950cf361e052d1544e6b0e6 +size 33711 diff --git a/screenshots/de/features.lockscreen.impl.setup.pin_SetupPinView_Day_1_de.png b/screenshots/de/features.lockscreen.impl.setup.pin_SetupPinView_Day_1_de.png index 8a261e3320..3bf59255c2 100644 --- a/screenshots/de/features.lockscreen.impl.setup.pin_SetupPinView_Day_1_de.png +++ b/screenshots/de/features.lockscreen.impl.setup.pin_SetupPinView_Day_1_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:99905c6fdf1d85d5af348176c85bf143f226e3d61f09f96d0a199679d338dbc7 -size 33352 +oid sha256:d35cf53b0fea5d4fe958d2939935be1f8f75b0f915b9d5fb1388b012919266df +size 33300 diff --git a/screenshots/de/features.lockscreen.impl.setup.pin_SetupPinView_Day_2_de.png b/screenshots/de/features.lockscreen.impl.setup.pin_SetupPinView_Day_2_de.png index 533bb69adc..309b68f153 100644 --- a/screenshots/de/features.lockscreen.impl.setup.pin_SetupPinView_Day_2_de.png +++ b/screenshots/de/features.lockscreen.impl.setup.pin_SetupPinView_Day_2_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:fdcacf07d6d8b6c89739354bd1f7b231dae39ce238a6099833dc08b4780e2ee2 -size 35018 +oid sha256:7362739ba837f7b6f8900f765cf839609ad8c2602b4edf804d34161056b7e6dc +size 35020 diff --git a/screenshots/de/features.lockscreen.impl.setup.pin_SetupPinView_Day_3_de.png b/screenshots/de/features.lockscreen.impl.setup.pin_SetupPinView_Day_3_de.png index 24f6c63bf7..b2bb465cc8 100644 --- a/screenshots/de/features.lockscreen.impl.setup.pin_SetupPinView_Day_3_de.png +++ b/screenshots/de/features.lockscreen.impl.setup.pin_SetupPinView_Day_3_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:ace58903f69fef8c157d0ea8f864bbec297ea14aaaa090be1e75e1bf4aa58ea0 -size 28125 +oid sha256:47a40fe775a83ff3e72e0b96d4abdfbef45a89f93bda4daa4e33b59a7728c153 +size 28269 diff --git a/screenshots/de/features.lockscreen.impl.setup.pin_SetupPinView_Day_4_de.png b/screenshots/de/features.lockscreen.impl.setup.pin_SetupPinView_Day_4_de.png index df1d692960..33e9a935e6 100644 --- a/screenshots/de/features.lockscreen.impl.setup.pin_SetupPinView_Day_4_de.png +++ b/screenshots/de/features.lockscreen.impl.setup.pin_SetupPinView_Day_4_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:ae21ad8437c46eef19986104ccc950bb04dad44b6f22b95739932ea7c03a8772 -size 33104 +oid sha256:9a4ed9ad5e6b6cd9bf529ca2778f78a1b6f32211742427d40a7954c26e6191c0 +size 33099 diff --git a/screenshots/de/features.lockscreen.impl.unlock_PinUnlockViewInApp_Day_0_de.png b/screenshots/de/features.lockscreen.impl.unlock_PinUnlockViewInApp_Day_0_de.png index 56aefe6c4e..6b274e0be9 100644 --- a/screenshots/de/features.lockscreen.impl.unlock_PinUnlockViewInApp_Day_0_de.png +++ b/screenshots/de/features.lockscreen.impl.unlock_PinUnlockViewInApp_Day_0_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:638a472779c1c5db8cd668c8a7b73374d5c2b182f6396bb0287b0c72ecfa86df -size 21995 +oid sha256:ad807e91edf13a0b07a432cef0ec4051270fe6d0665a9da9d81ed3e03d1f4464 +size 22033 diff --git a/screenshots/de/features.lockscreen.impl.unlock_PinUnlockViewInApp_Day_1_de.png b/screenshots/de/features.lockscreen.impl.unlock_PinUnlockViewInApp_Day_1_de.png index c11765e301..20af24a209 100644 --- a/screenshots/de/features.lockscreen.impl.unlock_PinUnlockViewInApp_Day_1_de.png +++ b/screenshots/de/features.lockscreen.impl.unlock_PinUnlockViewInApp_Day_1_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:aadb48568349f7b4d500fc47ca5ab3cac0e1742c9a2c1b43b51f77a2750b77c6 -size 21616 +oid sha256:7bd0da7fa58aff069a75e5b68be1fcc81005d4bc2a088496037bb35672501b45 +size 21645 diff --git a/screenshots/de/features.lockscreen.impl.unlock_PinUnlockViewInApp_Day_2_de.png b/screenshots/de/features.lockscreen.impl.unlock_PinUnlockViewInApp_Day_2_de.png index 666330431d..30958d8388 100644 --- a/screenshots/de/features.lockscreen.impl.unlock_PinUnlockViewInApp_Day_2_de.png +++ b/screenshots/de/features.lockscreen.impl.unlock_PinUnlockViewInApp_Day_2_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:152deb117714059b4d7140f0e9b2b07bf1b632f5bcae34b25ec3dda8d82dfc9a -size 23604 +oid sha256:5734722a11f4f3648989f5662748253a7b9c94813d02b024e977d937e326a07e +size 23664 diff --git a/screenshots/de/features.lockscreen.impl.unlock_PinUnlockViewInApp_Day_3_de.png b/screenshots/de/features.lockscreen.impl.unlock_PinUnlockViewInApp_Day_3_de.png index 017224d6fc..41ba5aa710 100644 --- a/screenshots/de/features.lockscreen.impl.unlock_PinUnlockViewInApp_Day_3_de.png +++ b/screenshots/de/features.lockscreen.impl.unlock_PinUnlockViewInApp_Day_3_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:86f1e725b3142ba5ad5fdbe7bb136b4ec34cf9d1c3ce8f6dac92c9590b521f6b -size 38246 +oid sha256:4bcbccabd59ee16a298777fa7862c86d30a94ced3845f2d9177cfad69b09f42a +size 38281 diff --git a/screenshots/de/features.lockscreen.impl.unlock_PinUnlockViewInApp_Day_4_de.png b/screenshots/de/features.lockscreen.impl.unlock_PinUnlockViewInApp_Day_4_de.png index 2c19d79818..7b4db5cf46 100644 --- a/screenshots/de/features.lockscreen.impl.unlock_PinUnlockViewInApp_Day_4_de.png +++ b/screenshots/de/features.lockscreen.impl.unlock_PinUnlockViewInApp_Day_4_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:3e5740e9892cbf9bf28fa49d75825c7559dcfca7bceda7766242cbc37afc8a0d -size 19334 +oid sha256:caa012799d02c55ef4a764909fde43ef20d999d9c624ab05e1796169e8c31d9a +size 19372 diff --git a/screenshots/de/features.lockscreen.impl.unlock_PinUnlockViewInApp_Day_5_de.png b/screenshots/de/features.lockscreen.impl.unlock_PinUnlockViewInApp_Day_5_de.png index 52cd0908cb..b65d13fbef 100644 --- a/screenshots/de/features.lockscreen.impl.unlock_PinUnlockViewInApp_Day_5_de.png +++ b/screenshots/de/features.lockscreen.impl.unlock_PinUnlockViewInApp_Day_5_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:126a58f5b49fd171b25d0f734183a3fb11767e63156d9de91b31d49a69f3d7c8 -size 35055 +oid sha256:a77b4959da69c013db537d82c1e36a74e40927c0c904014a5dbe21893171bdf4 +size 35100 diff --git a/screenshots/de/features.lockscreen.impl.unlock_PinUnlockViewInApp_Day_6_de.png b/screenshots/de/features.lockscreen.impl.unlock_PinUnlockViewInApp_Day_6_de.png index e5f57d529e..29555d4337 100644 --- a/screenshots/de/features.lockscreen.impl.unlock_PinUnlockViewInApp_Day_6_de.png +++ b/screenshots/de/features.lockscreen.impl.unlock_PinUnlockViewInApp_Day_6_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:e1ad29d369b685fca84f7f3ab30cee1dfbb45c90112eaaaa3be71cdd98d13f74 -size 23073 +oid sha256:b78c16e8889662fcb7ada84d8208144249674654ae1f8e15eefd0ad39e1aa2b7 +size 23076 diff --git a/screenshots/de/features.lockscreen.impl.unlock_PinUnlockViewInApp_Day_7_de.png b/screenshots/de/features.lockscreen.impl.unlock_PinUnlockViewInApp_Day_7_de.png index 4dd8a7ccec..e2b59b3335 100644 --- a/screenshots/de/features.lockscreen.impl.unlock_PinUnlockViewInApp_Day_7_de.png +++ b/screenshots/de/features.lockscreen.impl.unlock_PinUnlockViewInApp_Day_7_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:582e7c3c8832c71c035680d6e1e8b7a4491e752af572a9b5b5f83f03a894016c -size 24694 +oid sha256:0cb9b62d66e1d72ac3aae57354b68bd002c52c9fa892552d4e6bc0f6acb7393d +size 24619 diff --git a/screenshots/de/features.lockscreen.impl.unlock_PinUnlockView_Day_0_de.png b/screenshots/de/features.lockscreen.impl.unlock_PinUnlockView_Day_0_de.png index 239643f929..493d6a2ecf 100644 --- a/screenshots/de/features.lockscreen.impl.unlock_PinUnlockView_Day_0_de.png +++ b/screenshots/de/features.lockscreen.impl.unlock_PinUnlockView_Day_0_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:17429dd340f2acc19b924fa4637de7ba5ff7e02b19a37227f9b9dedf90a156d7 -size 37703 +oid sha256:d19160c5b25fd1964119e0d4d1480f9486d906005413a54d812672b637032fe4 +size 37729 diff --git a/screenshots/de/features.lockscreen.impl.unlock_PinUnlockView_Day_1_de.png b/screenshots/de/features.lockscreen.impl.unlock_PinUnlockView_Day_1_de.png index 3eaf876542..d1b06b3c80 100644 --- a/screenshots/de/features.lockscreen.impl.unlock_PinUnlockView_Day_1_de.png +++ b/screenshots/de/features.lockscreen.impl.unlock_PinUnlockView_Day_1_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:8533efa18842ebaa91dbbc17b1f5f7d3abc30348c851104ad7ee26ee34a88685 -size 38091 +oid sha256:117ee32c2088660a7d38bf7fe18856e820bdce9b2c12e472d130da2aa2f08a12 +size 38116 diff --git a/screenshots/de/features.lockscreen.impl.unlock_PinUnlockView_Day_2_de.png b/screenshots/de/features.lockscreen.impl.unlock_PinUnlockView_Day_2_de.png index 7537132f40..530704c821 100644 --- a/screenshots/de/features.lockscreen.impl.unlock_PinUnlockView_Day_2_de.png +++ b/screenshots/de/features.lockscreen.impl.unlock_PinUnlockView_Day_2_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:fdd6f6a7f9b880efaf632f8f2e96e94d7e35568059645f0e2cdb0fb4a8f0894f -size 39320 +oid sha256:04eaf5012571ac2b87d5ae77ff153e4f22cbdea9a538771eccc958808b8c23f9 +size 39376 diff --git a/screenshots/de/features.lockscreen.impl.unlock_PinUnlockView_Day_3_de.png b/screenshots/de/features.lockscreen.impl.unlock_PinUnlockView_Day_3_de.png index 03b949a7ab..a8ea99167c 100644 --- a/screenshots/de/features.lockscreen.impl.unlock_PinUnlockView_Day_3_de.png +++ b/screenshots/de/features.lockscreen.impl.unlock_PinUnlockView_Day_3_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:5cf69aa0aa4f04cd19454f100f09387977d5704aff611f5efad171f43df35514 -size 45047 +oid sha256:178a66853d9c0606b5ae959ff7df1c9da8f914f631db4beb88a905f54a2a2a4b +size 45119 diff --git a/screenshots/de/features.lockscreen.impl.unlock_PinUnlockView_Day_4_de.png b/screenshots/de/features.lockscreen.impl.unlock_PinUnlockView_Day_4_de.png index 0c068f8b39..9b92cfeca4 100644 --- a/screenshots/de/features.lockscreen.impl.unlock_PinUnlockView_Day_4_de.png +++ b/screenshots/de/features.lockscreen.impl.unlock_PinUnlockView_Day_4_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:0b7006d31bd4e7bcf2341d6f75588bcc67cd71066805e1cd438d0438ffbdedf8 -size 35084 +oid sha256:374d74c059a126f395282ca1d481c722587733f67c67774d412e94c7e5541080 +size 35126 diff --git a/screenshots/de/features.lockscreen.impl.unlock_PinUnlockView_Day_5_de.png b/screenshots/de/features.lockscreen.impl.unlock_PinUnlockView_Day_5_de.png index 595d513201..129550c238 100644 --- a/screenshots/de/features.lockscreen.impl.unlock_PinUnlockView_Day_5_de.png +++ b/screenshots/de/features.lockscreen.impl.unlock_PinUnlockView_Day_5_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:2780f174c627ba4db56116de788f7ddcfcd4d54032eb64a480813b593ee53499 -size 42000 +oid sha256:46b6a1dec955811a5b56b925517d104ee86a46888a93390109d65e1a73795963 +size 42083 diff --git a/screenshots/de/features.lockscreen.impl.unlock_PinUnlockView_Day_6_de.png b/screenshots/de/features.lockscreen.impl.unlock_PinUnlockView_Day_6_de.png index 47e6cef2dd..70d252ad75 100644 --- a/screenshots/de/features.lockscreen.impl.unlock_PinUnlockView_Day_6_de.png +++ b/screenshots/de/features.lockscreen.impl.unlock_PinUnlockView_Day_6_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:1fcc0eef9284384f7cf5308d8dc029951e1b5b76e036cb1606cb8e77918e7c7a -size 31448 +oid sha256:253882639345fccf69b7265bb5baaf766937f0225d8ca874a624dd486f89b654 +size 31608 diff --git a/screenshots/de/features.lockscreen.impl.unlock_PinUnlockView_Day_7_de.png b/screenshots/de/features.lockscreen.impl.unlock_PinUnlockView_Day_7_de.png index cdd24d6dc0..59a29f5f6e 100644 --- a/screenshots/de/features.lockscreen.impl.unlock_PinUnlockView_Day_7_de.png +++ b/screenshots/de/features.lockscreen.impl.unlock_PinUnlockView_Day_7_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:8820f3eb78e9a96ca92dc2628645ac1eb3608323fdf09eaf21eeb13a4b08afc1 -size 31841 +oid sha256:4ba258eb84a9f198d7639c05449ce6b89fdd1c1e7537477bfa5b64ff3c669209 +size 31808 diff --git a/screenshots/de/features.login.impl.accountprovider_AccountProviderOtherView_Day_0_de.png b/screenshots/de/features.login.impl.accountprovider_AccountProviderOtherView_Day_0_de.png index be38e64a2d..c1f8569265 100644 --- a/screenshots/de/features.login.impl.accountprovider_AccountProviderOtherView_Day_0_de.png +++ b/screenshots/de/features.login.impl.accountprovider_AccountProviderOtherView_Day_0_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:cf1d3c46c9e8d5e68052bbc741dc987f6b005dfc5bba8eb80976895a790d953e -size 6856 +oid sha256:90228e7dcbd071862d9a57bf5b2701630327fc93303587b61abe61b55fde86fb +size 6965 diff --git a/screenshots/de/features.login.impl.changeserver_ChangeServerView_Day_1_de.png b/screenshots/de/features.login.impl.changeserver_ChangeServerView_Day_1_de.png index 26f9933feb..b23fe05d44 100644 --- a/screenshots/de/features.login.impl.changeserver_ChangeServerView_Day_1_de.png +++ b/screenshots/de/features.login.impl.changeserver_ChangeServerView_Day_1_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:3e83a28c5e7ab79fd671a0c98aa6f5bc0adaa0072ead81db602cd4d0939d510e -size 14991 +oid sha256:628cc87a2c18dd8416ddfca2a7bde83f9254e79031bbfdbbb41663f3ebc6d0b4 +size 14401 diff --git a/screenshots/de/features.login.impl.changeserver_ChangeServerView_Day_2_de.png b/screenshots/de/features.login.impl.changeserver_ChangeServerView_Day_2_de.png index c7b2937587..4e54e0d542 100644 --- a/screenshots/de/features.login.impl.changeserver_ChangeServerView_Day_2_de.png +++ b/screenshots/de/features.login.impl.changeserver_ChangeServerView_Day_2_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:018cedfb6449364a9b01acbdaf9320e00092accb4e2f35c5d0480cfbcc07e2c3 -size 31804 +oid sha256:6f28525d2760ca6b70e8e61d64a43f84f59c709ca3a5fa05fbfafb6a10edc754 +size 31373 diff --git a/screenshots/de/features.login.impl.changeserver_ChangeServerView_Day_3_de.png b/screenshots/de/features.login.impl.changeserver_ChangeServerView_Day_3_de.png index bfdff4d875..3f09465793 100644 --- a/screenshots/de/features.login.impl.changeserver_ChangeServerView_Day_3_de.png +++ b/screenshots/de/features.login.impl.changeserver_ChangeServerView_Day_3_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:b8111853ec8798d779d367564b87b8002939d592d8b91e7c49acb33411e0079e -size 16935 +oid sha256:9b5104c3f7bcb024b7ae93fa0da6c4f310ed791805fe276cf140028d84843bab +size 16339 diff --git a/screenshots/de/features.login.impl.changeserver_ChangeServerView_Day_4_de.png b/screenshots/de/features.login.impl.changeserver_ChangeServerView_Day_4_de.png new file mode 100644 index 0000000000..b6e6100dc2 --- /dev/null +++ b/screenshots/de/features.login.impl.changeserver_ChangeServerView_Day_4_de.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:407dc6d0ccd17f88ab433ec1e6b722b1ab10b86124e96e7e58b05dac679dcd91 +size 26710 diff --git a/screenshots/de/features.login.impl.dialogs_SlidingSyncNotSupportedDialog_Day_0_de.png b/screenshots/de/features.login.impl.dialogs_SlidingSyncNotSupportedDialog_Day_0_de.png index c7b2937587..4e54e0d542 100644 --- a/screenshots/de/features.login.impl.dialogs_SlidingSyncNotSupportedDialog_Day_0_de.png +++ b/screenshots/de/features.login.impl.dialogs_SlidingSyncNotSupportedDialog_Day_0_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:018cedfb6449364a9b01acbdaf9320e00092accb4e2f35c5d0480cfbcc07e2c3 -size 31804 +oid sha256:6f28525d2760ca6b70e8e61d64a43f84f59c709ca3a5fa05fbfafb6a10edc754 +size 31373 diff --git a/screenshots/de/features.login.impl.login_LoginModeView_Day_0_de.png b/screenshots/de/features.login.impl.login_LoginModeView_Day_0_de.png new file mode 100644 index 0000000000..7d6baeb92a --- /dev/null +++ b/screenshots/de/features.login.impl.login_LoginModeView_Day_0_de.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:ddd215ba236b8f5a72953770a7fa5f1603b72d0ad0a48058994584f4fcb9b29a +size 38598 diff --git a/screenshots/de/features.login.impl.login_LoginModeView_Day_1_de.png b/screenshots/de/features.login.impl.login_LoginModeView_Day_1_de.png new file mode 100644 index 0000000000..09833de090 --- /dev/null +++ b/screenshots/de/features.login.impl.login_LoginModeView_Day_1_de.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:c7ab2dc5a541481eb5e348772064a23668a481073ae7b97fb069df9b11f9597e +size 10937 diff --git a/screenshots/de/features.login.impl.login_LoginModeView_Day_2_de.png b/screenshots/de/features.login.impl.login_LoginModeView_Day_2_de.png new file mode 100644 index 0000000000..c020d43208 --- /dev/null +++ b/screenshots/de/features.login.impl.login_LoginModeView_Day_2_de.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:c3b3e3747fe6f49e003b8cf195f1c363c0bacf2cd1588651193a249007bcdf56 +size 26310 diff --git a/screenshots/de/features.login.impl.login_LoginModeView_Day_3_de.png b/screenshots/de/features.login.impl.login_LoginModeView_Day_3_de.png new file mode 100644 index 0000000000..7617196945 --- /dev/null +++ b/screenshots/de/features.login.impl.login_LoginModeView_Day_3_de.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:21dbf7e2c3c9fef115de119b26ac00872336d402e0680ba951f89f8b0555e2ef +size 15807 diff --git a/screenshots/de/features.login.impl.login_LoginModeView_Day_4_de.png b/screenshots/de/features.login.impl.login_LoginModeView_Day_4_de.png new file mode 100644 index 0000000000..4e54e0d542 --- /dev/null +++ b/screenshots/de/features.login.impl.login_LoginModeView_Day_4_de.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:6f28525d2760ca6b70e8e61d64a43f84f59c709ca3a5fa05fbfafb6a10edc754 +size 31373 diff --git a/screenshots/de/features.login.impl.screens.changeaccountprovider_ChangeAccountProviderView_Day_0_de.png b/screenshots/de/features.login.impl.screens.changeaccountprovider_ChangeAccountProviderView_Day_0_de.png index de8230291f..1c90dfe136 100644 --- a/screenshots/de/features.login.impl.screens.changeaccountprovider_ChangeAccountProviderView_Day_0_de.png +++ b/screenshots/de/features.login.impl.screens.changeaccountprovider_ChangeAccountProviderView_Day_0_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:791f83c78afb4cd33f82c9fa7480b9d986ca38fdae7140e0ab66d191023e6ce4 -size 55516 +oid sha256:ce9f67bc654d9248b1aa456ec2593c59b6a310ed946a665bce70b8b637004054 +size 55679 diff --git a/screenshots/de/features.login.impl.screens.changeaccountprovider_ChangeAccountProviderView_Day_1_de.png b/screenshots/de/features.login.impl.screens.changeaccountprovider_ChangeAccountProviderView_Day_1_de.png index a30ec54681..e85c13a22f 100644 --- a/screenshots/de/features.login.impl.screens.changeaccountprovider_ChangeAccountProviderView_Day_1_de.png +++ b/screenshots/de/features.login.impl.screens.changeaccountprovider_ChangeAccountProviderView_Day_1_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:65711d9881cd4a62e7cb9b0c8f4624480adf42cd79d9207e76c2c64212a164b5 -size 52641 +oid sha256:cd69df898ead13a5db4c057bbdbf27ceaaea8666952f464ae75bd4c98e9f036e +size 52760 diff --git a/screenshots/de/features.login.impl.screens.chooseaccountprovider_ChooseAccountProviderView_Day_0_de.png b/screenshots/de/features.login.impl.screens.chooseaccountprovider_ChooseAccountProviderView_Day_0_de.png index 9f8da6438e..1d0be7b05e 100644 --- a/screenshots/de/features.login.impl.screens.chooseaccountprovider_ChooseAccountProviderView_Day_0_de.png +++ b/screenshots/de/features.login.impl.screens.chooseaccountprovider_ChooseAccountProviderView_Day_0_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:b09b12dfa2cfbd159197cabd487c85cd7c3cf6905323f4b12b741181a69485a3 -size 22359 +oid sha256:02959fe7fd9afda6b339165eae70971bd007b9b3c5f3fb5a042c6a03b28b5571 +size 22391 diff --git a/screenshots/de/features.login.impl.screens.chooseaccountprovider_ChooseAccountProviderView_Day_1_de.png b/screenshots/de/features.login.impl.screens.chooseaccountprovider_ChooseAccountProviderView_Day_1_de.png index 78fef3d846..c4f94e01a0 100644 --- a/screenshots/de/features.login.impl.screens.chooseaccountprovider_ChooseAccountProviderView_Day_1_de.png +++ b/screenshots/de/features.login.impl.screens.chooseaccountprovider_ChooseAccountProviderView_Day_1_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:38679151a42d89b6b414be876a9801ac3ad024dde1f8c0a5b7d8dfb158c609f6 -size 23275 +oid sha256:89323d975ec3f4962317bb1763cc58e4e548f38538b6869cdd14b26f55b0698d +size 23293 diff --git a/screenshots/de/features.login.impl.screens.chooseaccountprovider_ChooseAccountProviderView_Day_2_de.png b/screenshots/de/features.login.impl.screens.chooseaccountprovider_ChooseAccountProviderView_Day_2_de.png index b04bbdedba..8b3a874a51 100644 --- a/screenshots/de/features.login.impl.screens.chooseaccountprovider_ChooseAccountProviderView_Day_2_de.png +++ b/screenshots/de/features.login.impl.screens.chooseaccountprovider_ChooseAccountProviderView_Day_2_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:165fdefa29f1cc198be80d2badf174b4d355a3e10260440409052e06c74a4733 -size 23878 +oid sha256:5f267018e1a5eb31f728a724b46a086b1117d28e71792364b2a9e90d5093c421 +size 23947 diff --git a/screenshots/de/features.login.impl.screens.confirmaccountprovider_ConfirmAccountProviderView_Day_0_de.png b/screenshots/de/features.login.impl.screens.confirmaccountprovider_ConfirmAccountProviderView_Day_0_de.png index 08907f39ca..1c47aa2444 100644 --- a/screenshots/de/features.login.impl.screens.confirmaccountprovider_ConfirmAccountProviderView_Day_0_de.png +++ b/screenshots/de/features.login.impl.screens.confirmaccountprovider_ConfirmAccountProviderView_Day_0_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:3cebf81ebd8a9a4d0576b20d56dc83c393c72e89f4a9bed0cf6e79d9c7c57494 -size 39562 +oid sha256:5e02948e18d4cd3d3ad75e8d8862cc334e9ea227c113fdafb2f25896697ee330 +size 39594 diff --git a/screenshots/de/features.login.impl.screens.confirmaccountprovider_ConfirmAccountProviderView_Day_1_de.png b/screenshots/de/features.login.impl.screens.confirmaccountprovider_ConfirmAccountProviderView_Day_1_de.png index 371127dc50..99347d61f8 100644 --- a/screenshots/de/features.login.impl.screens.confirmaccountprovider_ConfirmAccountProviderView_Day_1_de.png +++ b/screenshots/de/features.login.impl.screens.confirmaccountprovider_ConfirmAccountProviderView_Day_1_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:2a282b7412ac64e5b209f00d6a70b2da1d9b717a973003f679dc37ed9694e348 -size 40411 +oid sha256:5671d06509aa17fd22b7935c3e695f79432ffe85d276f31d603b99007aa98407 +size 40425 diff --git a/screenshots/de/features.login.impl.screens.confirmaccountprovider_ConfirmAccountProviderView_Day_2_de.png b/screenshots/de/features.login.impl.screens.confirmaccountprovider_ConfirmAccountProviderView_Day_2_de.png index 23e64810c4..f3402b6b87 100644 --- a/screenshots/de/features.login.impl.screens.confirmaccountprovider_ConfirmAccountProviderView_Day_2_de.png +++ b/screenshots/de/features.login.impl.screens.confirmaccountprovider_ConfirmAccountProviderView_Day_2_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:784f55a9e6780fffa237a1e55f3033ee0a59f4c1066e385a81f075cac58172a0 -size 41609 +oid sha256:6dc56e3163d7f90fe07a95d44d42e4e88881fa1a4234bbb601b6c34629bde463 +size 41682 diff --git a/screenshots/de/features.login.impl.screens.createaccount_CreateAccountView_Day_0_de.png b/screenshots/de/features.login.impl.screens.createaccount_CreateAccountView_Day_0_de.png index 1de44959ed..ecce48b330 100644 --- a/screenshots/de/features.login.impl.screens.createaccount_CreateAccountView_Day_0_de.png +++ b/screenshots/de/features.login.impl.screens.createaccount_CreateAccountView_Day_0_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:fc44751070bfec3956fcd02393cbdf62436a1f065cb00f5407cf46b4b0eb3101 -size 13406 +oid sha256:9c60958307eff3de5780e439eb7cc4251b3995629253a94fae00bd8a4c444fcc +size 13398 diff --git a/screenshots/de/features.login.impl.screens.createaccount_CreateAccountView_Day_1_de.png b/screenshots/de/features.login.impl.screens.createaccount_CreateAccountView_Day_1_de.png index 70489f387d..fa83d7cd5f 100644 --- a/screenshots/de/features.login.impl.screens.createaccount_CreateAccountView_Day_1_de.png +++ b/screenshots/de/features.login.impl.screens.createaccount_CreateAccountView_Day_1_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:3c802402e805a79ff4c313120a2c371155835f78e50195e921c3df879794272c -size 13525 +oid sha256:8904cd72552ae43c390aa8d488398aa6c5d5df6e3b4420bf10b217d0587ecb4f +size 13513 diff --git a/screenshots/de/features.login.impl.screens.createaccount_CreateAccountView_Day_2_de.png b/screenshots/de/features.login.impl.screens.createaccount_CreateAccountView_Day_2_de.png index c582ea70c5..640b102480 100644 --- a/screenshots/de/features.login.impl.screens.createaccount_CreateAccountView_Day_2_de.png +++ b/screenshots/de/features.login.impl.screens.createaccount_CreateAccountView_Day_2_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:d5775e29d0b0051a2f91a349d92e288ce7866361867242fc0b9f420a04a7db76 -size 13463 +oid sha256:5cbd1f46ac606ff3608b805c86651a676a8ebff6a74e946c6d6912417c572f69 +size 13484 diff --git a/screenshots/de/features.login.impl.screens.createaccount_CreateAccountView_Day_3_de.png b/screenshots/de/features.login.impl.screens.createaccount_CreateAccountView_Day_3_de.png index 712b381397..e8d43eb741 100644 --- a/screenshots/de/features.login.impl.screens.createaccount_CreateAccountView_Day_3_de.png +++ b/screenshots/de/features.login.impl.screens.createaccount_CreateAccountView_Day_3_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:755e8699743b3c8c8c29ecb25cedd8165237f5cc6392eb3f2db1924b88547bb2 -size 15616 +oid sha256:bfbe1b69a417a3a08dd9864e1bc4f150538b36906bd06e0c571575f64fc7a058 +size 15585 diff --git a/screenshots/de/features.login.impl.screens.loginpassword_LoginPasswordView_Day_0_de.png b/screenshots/de/features.login.impl.screens.loginpassword_LoginPasswordView_Day_0_de.png index 6874f9dba4..8dbad73482 100644 --- a/screenshots/de/features.login.impl.screens.loginpassword_LoginPasswordView_Day_0_de.png +++ b/screenshots/de/features.login.impl.screens.loginpassword_LoginPasswordView_Day_0_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:696f9587a2ef0f7d017062dab6348cfddf5e82169673530b10241dced459f728 -size 39341 +oid sha256:ff82d0516a960eb67c20c37ccbd0507488fd1c97ce5aad62f5ad31ae3e9fb79a +size 39527 diff --git a/screenshots/de/features.login.impl.screens.loginpassword_LoginPasswordView_Day_1_de.png b/screenshots/de/features.login.impl.screens.loginpassword_LoginPasswordView_Day_1_de.png index 4b1c3e1bfc..3bd38cbef7 100644 --- a/screenshots/de/features.login.impl.screens.loginpassword_LoginPasswordView_Day_1_de.png +++ b/screenshots/de/features.login.impl.screens.loginpassword_LoginPasswordView_Day_1_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:f4a8645df197255a5fa44a7ae582aa1d1126a5d00f4db56777b26e7b7321c5a8 -size 40523 +oid sha256:4891560f5fb86acd97d3cce4a2c93c98afabffeb4a9bb958fd381ee2e05a6b66 +size 40733 diff --git a/screenshots/de/features.login.impl.screens.loginpassword_LoginPasswordView_Day_2_de.png b/screenshots/de/features.login.impl.screens.loginpassword_LoginPasswordView_Day_2_de.png index c3b56e7978..851c928a23 100644 --- a/screenshots/de/features.login.impl.screens.loginpassword_LoginPasswordView_Day_2_de.png +++ b/screenshots/de/features.login.impl.screens.loginpassword_LoginPasswordView_Day_2_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:3ccf8db965c240d06ade404cca64607ebd7392660f091c0a71c875e937045222 -size 30675 +oid sha256:52959d654fd557c72d2d617f6cbd5d99b9db3c2b1b96435a6484603c61951910 +size 30866 diff --git a/screenshots/de/features.login.impl.screens.onboarding_OnBoardingView_Day_0_de.png b/screenshots/de/features.login.impl.screens.onboarding_OnBoardingView_Day_0_de.png index 99407b4dc5..aba79a7e3b 100644 --- a/screenshots/de/features.login.impl.screens.onboarding_OnBoardingView_Day_0_de.png +++ b/screenshots/de/features.login.impl.screens.onboarding_OnBoardingView_Day_0_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:4dfbe8da67e61d4681d24f119ba1d9e9d72582d2fb08f5da02b0e885866f800c -size 314617 +oid sha256:d46a7e692614d28b12ba4af072c307f41fac166d8e73ca2122422d8e2d5824f7 +size 314678 diff --git a/screenshots/de/features.login.impl.screens.onboarding_OnBoardingView_Day_1_de.png b/screenshots/de/features.login.impl.screens.onboarding_OnBoardingView_Day_1_de.png index 08b5217d10..79032b78b5 100644 --- a/screenshots/de/features.login.impl.screens.onboarding_OnBoardingView_Day_1_de.png +++ b/screenshots/de/features.login.impl.screens.onboarding_OnBoardingView_Day_1_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:8beef56d2ec9c0939e594a20dae2aa9d4910fbd0398a71e2fe3798041f2c2508 -size 310229 +oid sha256:dc8d0c33fc3eea42477782d35450e5152f93bd2c3ce4358c964541eed507bf73 +size 310442 diff --git a/screenshots/de/features.login.impl.screens.onboarding_OnBoardingView_Day_2_de.png b/screenshots/de/features.login.impl.screens.onboarding_OnBoardingView_Day_2_de.png index 50a5fabbb1..db7c5a294c 100644 --- a/screenshots/de/features.login.impl.screens.onboarding_OnBoardingView_Day_2_de.png +++ b/screenshots/de/features.login.impl.screens.onboarding_OnBoardingView_Day_2_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:bc307a1c888ba4238ee113eb62d06303e1a66ba9198bccddcac06a348f8294d5 -size 313215 +oid sha256:6b59363cb11402eed86a0f0357f8d318f59670e9dc32268b898044128abc5ecf +size 313417 diff --git a/screenshots/de/features.login.impl.screens.onboarding_OnBoardingView_Day_3_de.png b/screenshots/de/features.login.impl.screens.onboarding_OnBoardingView_Day_3_de.png index 7717deabda..cdf57b5169 100644 --- a/screenshots/de/features.login.impl.screens.onboarding_OnBoardingView_Day_3_de.png +++ b/screenshots/de/features.login.impl.screens.onboarding_OnBoardingView_Day_3_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:1b619aa43723f2b0acefe6a8b06ad0b1c32bcab142dbdd7f2a6df89036b92323 -size 307425 +oid sha256:264813a252693ed9ebf075c87bfa25b6f059fea04b7afa414e1cd89a474394fe +size 307562 diff --git a/screenshots/de/features.login.impl.screens.onboarding_OnBoardingView_Day_4_de.png b/screenshots/de/features.login.impl.screens.onboarding_OnBoardingView_Day_4_de.png index 4261a03f76..83337abfba 100644 --- a/screenshots/de/features.login.impl.screens.onboarding_OnBoardingView_Day_4_de.png +++ b/screenshots/de/features.login.impl.screens.onboarding_OnBoardingView_Day_4_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:bb661c897842a0eedb95e2460205eafe34038eca930a6096a6efdd3125cdbca6 -size 307939 +oid sha256:3f33ad19dc1cbfcca11c49f1ea70b35dcef1cb9de8f9a8cf094150f65ea19bec +size 308030 diff --git a/screenshots/de/features.login.impl.screens.onboarding_OnBoardingView_Day_5_de.png b/screenshots/de/features.login.impl.screens.onboarding_OnBoardingView_Day_5_de.png index 2a81bcf949..50eb5ade2c 100644 --- a/screenshots/de/features.login.impl.screens.onboarding_OnBoardingView_Day_5_de.png +++ b/screenshots/de/features.login.impl.screens.onboarding_OnBoardingView_Day_5_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:b48da126979d45bb8ee9cf1dfba84e6db4069ff81f1a8f60a8cda76a4669a8ad -size 317509 +oid sha256:dcceab75e6d5fa22a9f306f1ac7f164b2d69432e36af29bcfb89684725e31dc5 +size 317545 diff --git a/screenshots/de/features.login.impl.screens.qrcode.confirmation_QrCodeConfirmationView_Day_0_de.png b/screenshots/de/features.login.impl.screens.qrcode.confirmation_QrCodeConfirmationView_Day_0_de.png index 0f192907ae..4350b9debc 100644 --- a/screenshots/de/features.login.impl.screens.qrcode.confirmation_QrCodeConfirmationView_Day_0_de.png +++ b/screenshots/de/features.login.impl.screens.qrcode.confirmation_QrCodeConfirmationView_Day_0_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:9e14cd38e873e0dc15fcd63d27a6a5616b784ad66ac19586ccb18dfe5e090689 -size 40013 +oid sha256:e092244b6bca0a8157c22356d623f8da4bce3bcce6178ffb418ccc5594219641 +size 39846 diff --git a/screenshots/de/features.login.impl.screens.qrcode.confirmation_QrCodeConfirmationView_Day_1_de.png b/screenshots/de/features.login.impl.screens.qrcode.confirmation_QrCodeConfirmationView_Day_1_de.png index d286dfcb24..ef7e16ba7b 100644 --- a/screenshots/de/features.login.impl.screens.qrcode.confirmation_QrCodeConfirmationView_Day_1_de.png +++ b/screenshots/de/features.login.impl.screens.qrcode.confirmation_QrCodeConfirmationView_Day_1_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:421c5e4c22c85409658bba9981cd37a8bc7f31a389fa48893206f84be8df6c2b -size 35896 +oid sha256:270a32e09d104baba159aa7e7af0b653b3692fbfb07364c004746c1a815899f0 +size 35655 diff --git a/screenshots/de/features.login.impl.screens.qrcode.confirmation_QrCodeConfirmationView_Day_2_de.png b/screenshots/de/features.login.impl.screens.qrcode.confirmation_QrCodeConfirmationView_Day_2_de.png index 68b280e002..bbbe636e32 100644 --- a/screenshots/de/features.login.impl.screens.qrcode.confirmation_QrCodeConfirmationView_Day_2_de.png +++ b/screenshots/de/features.login.impl.screens.qrcode.confirmation_QrCodeConfirmationView_Day_2_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:c37c1baf52fed09e29a08174d160aea56fee38297dd54fe390779b38f7ed0e76 -size 37727 +oid sha256:774dadd9504e60d48f77f62fd486354ebf7c2a0cdb8b686c905c1f3f5d8398d3 +size 37682 diff --git a/screenshots/de/features.login.impl.screens.qrcode.error_QrCodeErrorView_Day_0_de.png b/screenshots/de/features.login.impl.screens.qrcode.error_QrCodeErrorView_Day_0_de.png index 9341b9cad1..8ae128b8bf 100644 --- a/screenshots/de/features.login.impl.screens.qrcode.error_QrCodeErrorView_Day_0_de.png +++ b/screenshots/de/features.login.impl.screens.qrcode.error_QrCodeErrorView_Day_0_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:722e5d349ced53f20ba10ecad28783f4f81ae79ae8b7af241e63cb3d8a587f24 -size 24899 +oid sha256:de48b52dabae33b439d732cd6ffa5eda5013ff5118cdf12392565cbbe1d7b469 +size 24998 diff --git a/screenshots/de/features.login.impl.screens.qrcode.error_QrCodeErrorView_Day_1_de.png b/screenshots/de/features.login.impl.screens.qrcode.error_QrCodeErrorView_Day_1_de.png index 953b0ee025..f3855d5d23 100644 --- a/screenshots/de/features.login.impl.screens.qrcode.error_QrCodeErrorView_Day_1_de.png +++ b/screenshots/de/features.login.impl.screens.qrcode.error_QrCodeErrorView_Day_1_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:94e58071466c9adb0f526d24d8f26868020ad7f24bea2712ae7399fd3e7d0a7d -size 21960 +oid sha256:93a0d0551046745aa02e1529fe4f27fade32853e3ec7f8ed7573b0bde864feb5 +size 22041 diff --git a/screenshots/de/features.login.impl.screens.qrcode.error_QrCodeErrorView_Day_2_de.png b/screenshots/de/features.login.impl.screens.qrcode.error_QrCodeErrorView_Day_2_de.png index 5385873264..3eb9827d49 100644 --- a/screenshots/de/features.login.impl.screens.qrcode.error_QrCodeErrorView_Day_2_de.png +++ b/screenshots/de/features.login.impl.screens.qrcode.error_QrCodeErrorView_Day_2_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:4e54d5003578a3805e4bdebb59dfea85ad2adaba277c13aa9456eee47763e6b9 -size 30040 +oid sha256:42d34f62b65e43a1bf68e9294c635ab9bccceb6105032ed219e7777ee0003d9f +size 30067 diff --git a/screenshots/de/features.login.impl.screens.qrcode.error_QrCodeErrorView_Day_3_de.png b/screenshots/de/features.login.impl.screens.qrcode.error_QrCodeErrorView_Day_3_de.png index 17b94bd272..ec0f4bbe6e 100644 --- a/screenshots/de/features.login.impl.screens.qrcode.error_QrCodeErrorView_Day_3_de.png +++ b/screenshots/de/features.login.impl.screens.qrcode.error_QrCodeErrorView_Day_3_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:dc8c81b8e42a4bcee2f113ee686c423d2aa2b9f9700234ba0990ec038211c216 -size 38610 +oid sha256:b5e20cccecd67e059b0f685f1716ac5f575b7d392ddb1fc752a61a04133565c7 +size 38714 diff --git a/screenshots/de/features.login.impl.screens.qrcode.error_QrCodeErrorView_Day_4_de.png b/screenshots/de/features.login.impl.screens.qrcode.error_QrCodeErrorView_Day_4_de.png index fa8511a02c..6cf5423d67 100644 --- a/screenshots/de/features.login.impl.screens.qrcode.error_QrCodeErrorView_Day_4_de.png +++ b/screenshots/de/features.login.impl.screens.qrcode.error_QrCodeErrorView_Day_4_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:94ac6ab3ae4e6f7061477d3766c96b9bfcdd701d054ca5797f9d3536d22ad7e7 -size 69257 +oid sha256:a2b7da8d3fca41ce7908dcca66bc8ed5b4a00865e5999698267fcaa15f72ab41 +size 68949 diff --git a/screenshots/de/features.login.impl.screens.qrcode.error_QrCodeErrorView_Day_5_de.png b/screenshots/de/features.login.impl.screens.qrcode.error_QrCodeErrorView_Day_5_de.png index a4c239ac54..4e4171eeb3 100644 --- a/screenshots/de/features.login.impl.screens.qrcode.error_QrCodeErrorView_Day_5_de.png +++ b/screenshots/de/features.login.impl.screens.qrcode.error_QrCodeErrorView_Day_5_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:0c0bbda9f47701130a97bae5afb38049d27334500bb1aae888d65fdc8e7607d5 -size 21347 +oid sha256:8915153e9db3f7b5d83cfb460524d50254f53ec1626f5d3ce9ff19e917cc04b7 +size 21434 diff --git a/screenshots/de/features.login.impl.screens.qrcode.error_QrCodeErrorView_Day_6_de.png b/screenshots/de/features.login.impl.screens.qrcode.error_QrCodeErrorView_Day_6_de.png index a0e9e5b36c..4cba75915b 100644 --- a/screenshots/de/features.login.impl.screens.qrcode.error_QrCodeErrorView_Day_6_de.png +++ b/screenshots/de/features.login.impl.screens.qrcode.error_QrCodeErrorView_Day_6_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:9d0955a11bfbfb8be3178c766efc1733fdf1e306a6cf1a222d97703453cc8b99 -size 24084 +oid sha256:df30cbbc9165d7b181d8b436a3922a63ded70642ea9e83a2027bd6425496d28d +size 23972 diff --git a/screenshots/de/features.login.impl.screens.qrcode.intro_QrCodeIntroView_Day_0_de.png b/screenshots/de/features.login.impl.screens.qrcode.intro_QrCodeIntroView_Day_0_de.png index d47a26620d..3c0a555d06 100644 --- a/screenshots/de/features.login.impl.screens.qrcode.intro_QrCodeIntroView_Day_0_de.png +++ b/screenshots/de/features.login.impl.screens.qrcode.intro_QrCodeIntroView_Day_0_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:de8729263671180d22c79d922add85b71d24082c66d7dc1df7638bd38d34d56d -size 58536 +oid sha256:7b1a89b76ca7ee74776e650a45605f2b78780c67d50dc93f84addf2693c9ec86 +size 58514 diff --git a/screenshots/de/features.login.impl.screens.qrcode.intro_QrCodeIntroView_Day_1_de.png b/screenshots/de/features.login.impl.screens.qrcode.intro_QrCodeIntroView_Day_1_de.png index 09e8c7b0e4..b0c7ca3133 100644 --- a/screenshots/de/features.login.impl.screens.qrcode.intro_QrCodeIntroView_Day_1_de.png +++ b/screenshots/de/features.login.impl.screens.qrcode.intro_QrCodeIntroView_Day_1_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:94c7b1e0a1b12767c51845ac3173b9b15b07e5cdc81921bd85f2588a7c48f372 -size 50420 +oid sha256:a2a2cde841dcba8af9d039808b76cdd904a077b6a42ac417333acf6aad61cac1 +size 50494 diff --git a/screenshots/de/features.login.impl.screens.qrcode.scan_QrCodeScanView_Day_0_de.png b/screenshots/de/features.login.impl.screens.qrcode.scan_QrCodeScanView_Day_0_de.png index 1acc22f4aa..1aaea102cf 100644 --- a/screenshots/de/features.login.impl.screens.qrcode.scan_QrCodeScanView_Day_0_de.png +++ b/screenshots/de/features.login.impl.screens.qrcode.scan_QrCodeScanView_Day_0_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:1551c365ef7522b0ee850f2064585b86c047cce8a28337739d09e71b2458852a -size 14502 +oid sha256:23c87cc1e2c91d5fc1795006e59930beec147ae40a63a93431f3910ef09cf58c +size 14509 diff --git a/screenshots/de/features.login.impl.screens.qrcode.scan_QrCodeScanView_Day_1_de.png b/screenshots/de/features.login.impl.screens.qrcode.scan_QrCodeScanView_Day_1_de.png index f3cccea8c7..9ad95d1102 100644 --- a/screenshots/de/features.login.impl.screens.qrcode.scan_QrCodeScanView_Day_1_de.png +++ b/screenshots/de/features.login.impl.screens.qrcode.scan_QrCodeScanView_Day_1_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:7c18bb43dea68bded70fe2fe21f2f14140b49106ccbbf988c06506a84e1aa6ba -size 19265 +oid sha256:62ea7144b8df68b9af8671c96d8d726e7fdcf00a6187911bdc4d092dfc80534a +size 19385 diff --git a/screenshots/de/features.login.impl.screens.qrcode.scan_QrCodeScanView_Day_2_de.png b/screenshots/de/features.login.impl.screens.qrcode.scan_QrCodeScanView_Day_2_de.png index 2abaefddfb..03b1051f57 100644 --- a/screenshots/de/features.login.impl.screens.qrcode.scan_QrCodeScanView_Day_2_de.png +++ b/screenshots/de/features.login.impl.screens.qrcode.scan_QrCodeScanView_Day_2_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:25b5b715c1fc4cc67152c6b29e90fbf718eea81c1b75550292a5a4297d8a9449 -size 30479 +oid sha256:1fd74994f9ea6cf24a6e05ebf2e11b5b0bf3c13d33d43b4c923d428cf5761230 +size 30477 diff --git a/screenshots/de/features.login.impl.screens.qrcode.scan_QrCodeScanView_Day_3_de.png b/screenshots/de/features.login.impl.screens.qrcode.scan_QrCodeScanView_Day_3_de.png index 65d6ddcfa6..b81d99193a 100644 --- a/screenshots/de/features.login.impl.screens.qrcode.scan_QrCodeScanView_Day_3_de.png +++ b/screenshots/de/features.login.impl.screens.qrcode.scan_QrCodeScanView_Day_3_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:2ef41a8c3b3e672299f77eb236f2dd335d26399bb58842788813b90824d6860a -size 39081 +oid sha256:e724cbb9eef1073e6dbbe542da5455cf1991f2520f85516ad5294d2ee2eb9e27 +size 38989 diff --git a/screenshots/de/features.login.impl.screens.qrcode.scan_QrCodeScanView_Day_4_de.png b/screenshots/de/features.login.impl.screens.qrcode.scan_QrCodeScanView_Day_4_de.png index b2d0ff9590..561f54894e 100644 --- a/screenshots/de/features.login.impl.screens.qrcode.scan_QrCodeScanView_Day_4_de.png +++ b/screenshots/de/features.login.impl.screens.qrcode.scan_QrCodeScanView_Day_4_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:22df7ef05574f86e7090b91fa2b74103a778aed7029f262f57d54e9d6a886647 -size 34350 +oid sha256:d13d28d9c18e3942c5a9260ea341eac5d01e3c129c0004cc6633bd9d5c857f08 +size 34376 diff --git a/screenshots/de/features.login.impl.screens.qrcode.scan_QrCodeScanView_Day_5_de.png b/screenshots/de/features.login.impl.screens.qrcode.scan_QrCodeScanView_Day_5_de.png new file mode 100644 index 0000000000..3adae4bd6b --- /dev/null +++ b/screenshots/de/features.login.impl.screens.qrcode.scan_QrCodeScanView_Day_5_de.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:fb79545cf57d8c8fbff8fb6dc298e85ac543d7f3c7bd3c06360e570a98e0fcc0 +size 31445 diff --git a/screenshots/de/features.login.impl.screens.searchaccountprovider_SearchAccountProviderView_Day_0_de.png b/screenshots/de/features.login.impl.screens.searchaccountprovider_SearchAccountProviderView_Day_0_de.png index d63e78541b..e720188b16 100644 --- a/screenshots/de/features.login.impl.screens.searchaccountprovider_SearchAccountProviderView_Day_0_de.png +++ b/screenshots/de/features.login.impl.screens.searchaccountprovider_SearchAccountProviderView_Day_0_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:7b38422fa3271d84a2199325752471176820485f4c13832125fd44ed90fe8ece -size 27236 +oid sha256:340b8755836b80fa0a0e19c01b1c454f0b5d3252deab7a21bac7426b94d041cf +size 27400 diff --git a/screenshots/de/features.login.impl.screens.searchaccountprovider_SearchAccountProviderView_Day_1_de.png b/screenshots/de/features.login.impl.screens.searchaccountprovider_SearchAccountProviderView_Day_1_de.png index caec7cbaf6..22192e8b92 100644 --- a/screenshots/de/features.login.impl.screens.searchaccountprovider_SearchAccountProviderView_Day_1_de.png +++ b/screenshots/de/features.login.impl.screens.searchaccountprovider_SearchAccountProviderView_Day_1_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:21d17c76d225999c8358d4a22b17f137b8dc9a5536dda9299eae43f36d41fd4e -size 59773 +oid sha256:49001b1985590e67ee3db2fae8c221b4f11016d9a7806ed68eb48ce04c30ee75 +size 59981 diff --git a/screenshots/de/features.logout.impl.direct_DefaultDirectLogoutView_Day_1_de.png b/screenshots/de/features.logout.impl.direct_DefaultDirectLogoutView_Day_1_de.png index 3b4a617600..a68f0ee529 100644 --- a/screenshots/de/features.logout.impl.direct_DefaultDirectLogoutView_Day_1_de.png +++ b/screenshots/de/features.logout.impl.direct_DefaultDirectLogoutView_Day_1_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:0fbcdc832a671f2e55b39b4c6d14860e320c9dd5e5f0087c6ac58832424d21d5 -size 19314 +oid sha256:cf4bb287246f1d13009dcd1d46c25f51bbd03dbf8926d0ff60eef4c06c3efabd +size 18843 diff --git a/screenshots/de/features.logout.impl.direct_DefaultDirectLogoutView_Day_2_de.png b/screenshots/de/features.logout.impl.direct_DefaultDirectLogoutView_Day_2_de.png index 9ca145736a..529ce1ee73 100644 --- a/screenshots/de/features.logout.impl.direct_DefaultDirectLogoutView_Day_2_de.png +++ b/screenshots/de/features.logout.impl.direct_DefaultDirectLogoutView_Day_2_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:9ced1e12c94cc4e237998a9b2851d8ddbeb08925704c59bb03cbaf49665a146c -size 9792 +oid sha256:07bac166fd1f953f14f66c7f11be6e5d2a7361e45cb0512dd32946dad1f6fb43 +size 9040 diff --git a/screenshots/de/features.logout.impl.direct_DefaultDirectLogoutView_Day_3_de.png b/screenshots/de/features.logout.impl.direct_DefaultDirectLogoutView_Day_3_de.png index cfec346eb0..460eb8cad4 100644 --- a/screenshots/de/features.logout.impl.direct_DefaultDirectLogoutView_Day_3_de.png +++ b/screenshots/de/features.logout.impl.direct_DefaultDirectLogoutView_Day_3_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:d6517261357072a4da2ccb602363835eec96f1118b07a5680dcaa1b4bdab6327 -size 21195 +oid sha256:0f87747043f62847839dc9eb80a4011d555d230a1310edeaa2c8bf6395213313 +size 20660 diff --git a/screenshots/de/features.logout.impl_AccountDeactivationView_Day_0_de.png b/screenshots/de/features.logout.impl_AccountDeactivationView_Day_0_de.png index 90b11b4f58..71b05c5f09 100644 --- a/screenshots/de/features.logout.impl_AccountDeactivationView_Day_0_de.png +++ b/screenshots/de/features.logout.impl_AccountDeactivationView_Day_0_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:4bc16e4e009ae97d00af6f4be052d8cdfe8386ba4ab4a21514f678790efacb54 -size 88891 +oid sha256:5dab04b4916a5ed318c4c9e2216e2cbc070cad0df0d30ae29aa93f13efdff3a3 +size 89168 diff --git a/screenshots/de/features.logout.impl_AccountDeactivationView_Day_1_de.png b/screenshots/de/features.logout.impl_AccountDeactivationView_Day_1_de.png index 77419df88f..e34159f7c7 100644 --- a/screenshots/de/features.logout.impl_AccountDeactivationView_Day_1_de.png +++ b/screenshots/de/features.logout.impl_AccountDeactivationView_Day_1_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:64acf68b27f73fd5e1cf6e597d45e01a3dec2310b2fcd95763e3cfecd95a8a9c -size 88583 +oid sha256:b49af3c29426ac2e39f137bd4ff577250a86ec7b3c34c923d289928b48f68ab8 +size 88867 diff --git a/screenshots/de/features.logout.impl_AccountDeactivationView_Day_2_de.png b/screenshots/de/features.logout.impl_AccountDeactivationView_Day_2_de.png index aca5c3130d..b6a793d530 100644 --- a/screenshots/de/features.logout.impl_AccountDeactivationView_Day_2_de.png +++ b/screenshots/de/features.logout.impl_AccountDeactivationView_Day_2_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:bcbc25ce921a6af6472554a224ba954b362aa44ff90bbdaf8d63abef9ea6b97a -size 81406 +oid sha256:8ef738643ddf9769f360f02a3f6230e6d474317319bb8b9491d7a08118cb6ba1 +size 81604 diff --git a/screenshots/de/features.logout.impl_AccountDeactivationView_Day_3_de.png b/screenshots/de/features.logout.impl_AccountDeactivationView_Day_3_de.png index 2f573dc6c5..1b0a77c24f 100644 --- a/screenshots/de/features.logout.impl_AccountDeactivationView_Day_3_de.png +++ b/screenshots/de/features.logout.impl_AccountDeactivationView_Day_3_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:44a343cd67650e5ae933e61585d72ac0ce9ce31c9e6e7e8e2928ed4971f978fe -size 69612 +oid sha256:3f3a49ebf327c5695ca978181d72608eedee6dfb9bcbf82c45d74d7eb983bca5 +size 69627 diff --git a/screenshots/de/features.logout.impl_AccountDeactivationView_Day_4_de.png b/screenshots/de/features.logout.impl_AccountDeactivationView_Day_4_de.png index f5fe67ab9e..40e967d51d 100644 --- a/screenshots/de/features.logout.impl_AccountDeactivationView_Day_4_de.png +++ b/screenshots/de/features.logout.impl_AccountDeactivationView_Day_4_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:3077ab213a99896eae4d603cb794d67af213d8020def029beed780d5a3cb9e3c -size 61811 +oid sha256:5e74dd4977b7f6d5741859db8cb894c82e657cd6864e058ce0ade0330462374e +size 62074 diff --git a/screenshots/de/features.logout.impl_LogoutView_Day_0_de.png b/screenshots/de/features.logout.impl_LogoutView_Day_0_de.png index 6045a6eb1e..f881738b4d 100644 --- a/screenshots/de/features.logout.impl_LogoutView_Day_0_de.png +++ b/screenshots/de/features.logout.impl_LogoutView_Day_0_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:f4d04d8e6efd372b7d0539f009febab926b1ff34aff132ba4f3ef7b12795c5e6 -size 11534 +oid sha256:3cff9a788308620d142f7feda91903d256520c7b86a8ff30e52fdb08454b2787 +size 11483 diff --git a/screenshots/de/features.logout.impl_LogoutView_Day_10_de.png b/screenshots/de/features.logout.impl_LogoutView_Day_10_de.png index ec0dc76659..f1fd7005bf 100644 --- a/screenshots/de/features.logout.impl_LogoutView_Day_10_de.png +++ b/screenshots/de/features.logout.impl_LogoutView_Day_10_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:26a9e3186147de9067b74b6bce4381a5ac5104e96176a7ba8aaa532811b0d9e2 -size 31565 +oid sha256:30315e868c1e50d290885930eccf724c5d95e5c263dd9566d235a2b1d6afc9f9 +size 31558 diff --git a/screenshots/de/features.logout.impl_LogoutView_Day_11_de.png b/screenshots/de/features.logout.impl_LogoutView_Day_11_de.png index be526c4fa7..474df112c4 100644 --- a/screenshots/de/features.logout.impl_LogoutView_Day_11_de.png +++ b/screenshots/de/features.logout.impl_LogoutView_Day_11_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:bc234d4ad6e3bc60da2716334e00045be60e277e3cef077b4cdc70ef1b193f0f -size 37188 +oid sha256:f829a007b0b39c35a36d066455b5df1763331a4d57753a1e79ff56aa194f51e9 +size 37223 diff --git a/screenshots/de/features.logout.impl_LogoutView_Day_1_de.png b/screenshots/de/features.logout.impl_LogoutView_Day_1_de.png index 0e27dd3f68..968a7c0a0c 100644 --- a/screenshots/de/features.logout.impl_LogoutView_Day_1_de.png +++ b/screenshots/de/features.logout.impl_LogoutView_Day_1_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:260f4c11c53e15524747a40df3d828ba92c6273758da13e6f4d6f63ce000ea5d -size 47947 +oid sha256:59d17d6f30689416288f99905374e5f9ac2a4faa2adcf07e052883ae350d4e97 +size 47851 diff --git a/screenshots/de/features.logout.impl_LogoutView_Day_2_de.png b/screenshots/de/features.logout.impl_LogoutView_Day_2_de.png index 2b1bcf46fa..43a627823c 100644 --- a/screenshots/de/features.logout.impl_LogoutView_Day_2_de.png +++ b/screenshots/de/features.logout.impl_LogoutView_Day_2_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:4d4a3c53907ff8e38894c173db674369b5f3910431a48e65e5ed94f271feced9 -size 33181 +oid sha256:fe4a5fceb03be181279b067e578a5d3ffe20d1b2ba746295611ae2cfbe1742e0 +size 33180 diff --git a/screenshots/de/features.logout.impl_LogoutView_Day_3_de.png b/screenshots/de/features.logout.impl_LogoutView_Day_3_de.png index 0e27dd3f68..968a7c0a0c 100644 --- a/screenshots/de/features.logout.impl_LogoutView_Day_3_de.png +++ b/screenshots/de/features.logout.impl_LogoutView_Day_3_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:260f4c11c53e15524747a40df3d828ba92c6273758da13e6f4d6f63ce000ea5d -size 47947 +oid sha256:59d17d6f30689416288f99905374e5f9ac2a4faa2adcf07e052883ae350d4e97 +size 47851 diff --git a/screenshots/de/features.logout.impl_LogoutView_Day_4_de.png b/screenshots/de/features.logout.impl_LogoutView_Day_4_de.png index 1c7f3f566a..9f959fb4c6 100644 --- a/screenshots/de/features.logout.impl_LogoutView_Day_4_de.png +++ b/screenshots/de/features.logout.impl_LogoutView_Day_4_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:89431cdede17d672f5c6b5f4218c006a1392b1e2f9faaecc368ed99ad87b55b9 -size 25878 +oid sha256:a45bd22cef9dc653069d081cdefc89e98f5d4a6abd57ea015095a19360c06006 +size 26014 diff --git a/screenshots/de/features.logout.impl_LogoutView_Day_5_de.png b/screenshots/de/features.logout.impl_LogoutView_Day_5_de.png index 9163d50c86..3fa995c42c 100644 --- a/screenshots/de/features.logout.impl_LogoutView_Day_5_de.png +++ b/screenshots/de/features.logout.impl_LogoutView_Day_5_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:edfc727732ca9fafcbef1c65ba633c5d5ea76951b504946a2a4e6fdab1b23dc1 -size 16952 +oid sha256:06e895ab0f6e19dfca98efdc6f2c32f8bba1b7c71f57b44eae9e5970528172cb +size 17009 diff --git a/screenshots/de/features.logout.impl_LogoutView_Day_6_de.png b/screenshots/de/features.logout.impl_LogoutView_Day_6_de.png index 60986115cd..a63166bdd8 100644 --- a/screenshots/de/features.logout.impl_LogoutView_Day_6_de.png +++ b/screenshots/de/features.logout.impl_LogoutView_Day_6_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:761f9d37116e247c6279e2fa7300ff523180d6c50b190f35872efb939fc24f56 -size 27468 +oid sha256:befa9251f01f28dd09063171f7c3dad4a3f1ed58026d5c1dbe718e39edf6982c +size 27434 diff --git a/screenshots/de/features.logout.impl_LogoutView_Day_7_de.png b/screenshots/de/features.logout.impl_LogoutView_Day_7_de.png index 18fa34fee6..c0d6c96985 100644 --- a/screenshots/de/features.logout.impl_LogoutView_Day_7_de.png +++ b/screenshots/de/features.logout.impl_LogoutView_Day_7_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:647c94e0029ec0a98b9daae7a890281561a401bf66c9ead776afe852fe731b07 -size 44024 +oid sha256:edd961dbf86f407c76386e7e94050984c4f20a49ccda732e44df78755663e357 +size 44041 diff --git a/screenshots/de/features.logout.impl_LogoutView_Day_8_de.png b/screenshots/de/features.logout.impl_LogoutView_Day_8_de.png index 611026e8c6..cdc5549da2 100644 --- a/screenshots/de/features.logout.impl_LogoutView_Day_8_de.png +++ b/screenshots/de/features.logout.impl_LogoutView_Day_8_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:84721d8b72792d917253a09d94e704268c9f83f4a2d538d282f109227e72c5af -size 42250 +oid sha256:32cbd05a6020ae08b1bc92dfd736734bfbb16a08e281db525f8ddf010ec86c4f +size 42137 diff --git a/screenshots/de/features.logout.impl_LogoutView_Day_9_de.png b/screenshots/de/features.logout.impl_LogoutView_Day_9_de.png index 2c482f08e5..05655e3b21 100644 --- a/screenshots/de/features.logout.impl_LogoutView_Day_9_de.png +++ b/screenshots/de/features.logout.impl_LogoutView_Day_9_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:c0eea7215dddad22a8f1244ccef589625e26df3f97f9f68c00c3d8823b084913 -size 42019 +oid sha256:bd9a0acb232b616300cca31be5c619297a098bc1414a673fb0c00ba29ff6af6b +size 41912 diff --git a/screenshots/de/features.messages.impl.actionlist_ActionListViewContent_Day_10_de.png b/screenshots/de/features.messages.impl.actionlist_ActionListViewContent_Day_10_de.png index 3cae6a2dd7..8881e29e2b 100644 --- a/screenshots/de/features.messages.impl.actionlist_ActionListViewContent_Day_10_de.png +++ b/screenshots/de/features.messages.impl.actionlist_ActionListViewContent_Day_10_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:4f6f9840e4c7d5ffec60904a380bc0686eb9b4b65a52c6d5ff15742f336deca1 -size 34987 +oid sha256:16d6e109bee5e1e9aa989191d95ace9d9142ead6f529e7bdb02ad8d180bd6435 +size 35399 diff --git a/screenshots/de/features.messages.impl.actionlist_ActionListViewContent_Day_11_de.png b/screenshots/de/features.messages.impl.actionlist_ActionListViewContent_Day_11_de.png index d58b9fd0f6..b7d0a5b6c3 100644 --- a/screenshots/de/features.messages.impl.actionlist_ActionListViewContent_Day_11_de.png +++ b/screenshots/de/features.messages.impl.actionlist_ActionListViewContent_Day_11_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:bd18fcf4780fa4a1af25023c60aa24fe14754fdfa45786bc59842cc5f90f96fb -size 54250 +oid sha256:3bd314ce626efbc0bb31a86012972434a1a7f4e828cfc83c3622303550a0293d +size 55044 diff --git a/screenshots/de/features.messages.impl.actionlist_ActionListViewContent_Day_12_de.png b/screenshots/de/features.messages.impl.actionlist_ActionListViewContent_Day_12_de.png index 627e53bdbc..2c63482830 100644 --- a/screenshots/de/features.messages.impl.actionlist_ActionListViewContent_Day_12_de.png +++ b/screenshots/de/features.messages.impl.actionlist_ActionListViewContent_Day_12_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:5b2dd0277d3168107fbc66f13a83b8b1775e949916f995eab620982fdbc28f8d -size 54850 +oid sha256:507e3abe31d7360c16962484136c69a41e9b8ff36354d442da59ac90865e7a47 +size 55542 diff --git a/screenshots/de/features.messages.impl.actionlist_ActionListViewContent_Day_2_de.png b/screenshots/de/features.messages.impl.actionlist_ActionListViewContent_Day_2_de.png index 563eb1bbfe..b440fc9ec1 100644 --- a/screenshots/de/features.messages.impl.actionlist_ActionListViewContent_Day_2_de.png +++ b/screenshots/de/features.messages.impl.actionlist_ActionListViewContent_Day_2_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:9f51ed97c6dd2f2200724d107580c488b37393eb7a7e47c73dcfea57f2af3f19 -size 46312 +oid sha256:1f62483754a8ecf20740d5bc37a00b0aa3b810c005998f22bf8ce5ee7e3cf6cb +size 46877 diff --git a/screenshots/de/features.messages.impl.actionlist_ActionListViewContent_Day_3_de.png b/screenshots/de/features.messages.impl.actionlist_ActionListViewContent_Day_3_de.png index 9873251bbe..ba0b44793e 100644 --- a/screenshots/de/features.messages.impl.actionlist_ActionListViewContent_Day_3_de.png +++ b/screenshots/de/features.messages.impl.actionlist_ActionListViewContent_Day_3_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:3a9bd8ac8760c1a42e864bdf53d6e14a75e3c2e3f40d234299c7beffbc8f5d65 -size 50547 +oid sha256:e63e08e5d9a32dde4f18f4fbcb74744c0e41d012f3d8e68559c9a72555ad661d +size 51201 diff --git a/screenshots/de/features.messages.impl.actionlist_ActionListViewContent_Day_4_de.png b/screenshots/de/features.messages.impl.actionlist_ActionListViewContent_Day_4_de.png index b66d4d9fcc..93921db5b2 100644 --- a/screenshots/de/features.messages.impl.actionlist_ActionListViewContent_Day_4_de.png +++ b/screenshots/de/features.messages.impl.actionlist_ActionListViewContent_Day_4_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:c39e96bc859a653ec9c0e8111812af791f810e54e125f537eba4bf302986d040 -size 48978 +oid sha256:d3314f45bc6d2301753aceadd481a35f82399f2a36855e17fe68e33b07132d91 +size 49587 diff --git a/screenshots/de/features.messages.impl.actionlist_ActionListViewContent_Day_5_de.png b/screenshots/de/features.messages.impl.actionlist_ActionListViewContent_Day_5_de.png index 19dba56069..0d54979924 100644 --- a/screenshots/de/features.messages.impl.actionlist_ActionListViewContent_Day_5_de.png +++ b/screenshots/de/features.messages.impl.actionlist_ActionListViewContent_Day_5_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:e3d9a9b2524a8d9a558b0599d0c2a04bcf2185818e5ce2f1d31cd6e54132cafb -size 44305 +oid sha256:d2ce1310b330f6191cd3490881b0b3272e296414b492a957a7a2c0fa9f356fdc +size 45284 diff --git a/screenshots/de/features.messages.impl.actionlist_ActionListViewContent_Day_6_de.png b/screenshots/de/features.messages.impl.actionlist_ActionListViewContent_Day_6_de.png index 56a51be48e..8cee3597e3 100644 --- a/screenshots/de/features.messages.impl.actionlist_ActionListViewContent_Day_6_de.png +++ b/screenshots/de/features.messages.impl.actionlist_ActionListViewContent_Day_6_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:97e8757d1843852f843627ca84f454761c6313b989b34f3526bb7c7e77ecd895 -size 49249 +oid sha256:66cea759a333ac35a55a6ff09ef35f5754ac615ec7430b9a56fe36c9f4e14262 +size 49854 diff --git a/screenshots/de/features.messages.impl.actionlist_ActionListViewContent_Day_7_de.png b/screenshots/de/features.messages.impl.actionlist_ActionListViewContent_Day_7_de.png index 43f18f85c5..26bee2425d 100644 --- a/screenshots/de/features.messages.impl.actionlist_ActionListViewContent_Day_7_de.png +++ b/screenshots/de/features.messages.impl.actionlist_ActionListViewContent_Day_7_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:db596bcdbdf5f88f327f553df085f3f241564b640b6b2697293779de9fd492c0 -size 45471 +oid sha256:c13ef69c250f617da35ce7e2872afdf427e5b3a5427b3a25d3221950eca33119 +size 46166 diff --git a/screenshots/de/features.messages.impl.actionlist_ActionListViewContent_Day_8_de.png b/screenshots/de/features.messages.impl.actionlist_ActionListViewContent_Day_8_de.png index 0d8aed3fd4..03ae9bffac 100644 --- a/screenshots/de/features.messages.impl.actionlist_ActionListViewContent_Day_8_de.png +++ b/screenshots/de/features.messages.impl.actionlist_ActionListViewContent_Day_8_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:ae7924d514d862187cd092850659fb5352dae0f2d102936dec2472f86360b11d -size 48479 +oid sha256:a13eea9ce58656559442de31c8323fabb7e9aee23b247e6a6b9d3b6e5680851e +size 49020 diff --git a/screenshots/de/features.messages.impl.actionlist_ActionListViewContent_Day_9_de.png b/screenshots/de/features.messages.impl.actionlist_ActionListViewContent_Day_9_de.png index 204376c051..bb55ab2e0b 100644 --- a/screenshots/de/features.messages.impl.actionlist_ActionListViewContent_Day_9_de.png +++ b/screenshots/de/features.messages.impl.actionlist_ActionListViewContent_Day_9_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:66cab8345e9abedcf15435ce8713a4acb2e08e9a0f20754a9ea65c4fad7111e1 -size 38096 +oid sha256:ed45f00f99eecca857ff85f235362b92a23a7aefcab2a3de5f9ee87bd4dfbc0c +size 38619 diff --git a/screenshots/de/features.messages.impl.attachments.preview_AttachmentsView_0_de.png b/screenshots/de/features.messages.impl.attachments.preview_AttachmentsView_0_de.png index 67c478c5e0..c65a66aaaf 100644 --- a/screenshots/de/features.messages.impl.attachments.preview_AttachmentsView_0_de.png +++ b/screenshots/de/features.messages.impl.attachments.preview_AttachmentsView_0_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:839fcd52dba467845f12490b2bbb32bbc17cea9e0e9fe1e6d0e4bf16e514c3bf -size 396270 +oid sha256:30e913f9226353fee09bd1f6da517494f93cb45ab75247030c3138e1f3ced744 +size 401612 diff --git a/screenshots/de/features.messages.impl.attachments.preview_AttachmentsView_1_de.png b/screenshots/de/features.messages.impl.attachments.preview_AttachmentsView_1_de.png new file mode 100644 index 0000000000..ca848e247e --- /dev/null +++ b/screenshots/de/features.messages.impl.attachments.preview_AttachmentsView_1_de.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:f092a9b9a3cb8fd1c958015194341e118deafd2589bd34c673747f7383a9ca87 +size 399962 diff --git a/screenshots/de/features.messages.impl.attachments.preview_AttachmentsView_2_de.png b/screenshots/de/features.messages.impl.attachments.preview_AttachmentsView_2_de.png index 8f398a5b89..7fdfe64d31 100644 --- a/screenshots/de/features.messages.impl.attachments.preview_AttachmentsView_2_de.png +++ b/screenshots/de/features.messages.impl.attachments.preview_AttachmentsView_2_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:4057bbb814e3ab6fa945e2d67e6b728d606cf8ee97966e33624b03301cede08a -size 54395 +oid sha256:f46a69b6a468f8eb0c556858bc2d6cb3176aedb8ce3888d40582e68e2dfd7ba8 +size 61347 diff --git a/screenshots/de/features.messages.impl.attachments.preview_AttachmentsView_3_de.png b/screenshots/de/features.messages.impl.attachments.preview_AttachmentsView_3_de.png index 67c478c5e0..c65a66aaaf 100644 --- a/screenshots/de/features.messages.impl.attachments.preview_AttachmentsView_3_de.png +++ b/screenshots/de/features.messages.impl.attachments.preview_AttachmentsView_3_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:839fcd52dba467845f12490b2bbb32bbc17cea9e0e9fe1e6d0e4bf16e514c3bf -size 396270 +oid sha256:30e913f9226353fee09bd1f6da517494f93cb45ab75247030c3138e1f3ced744 +size 401612 diff --git a/screenshots/de/features.messages.impl.attachments.preview_AttachmentsView_4_de.png b/screenshots/de/features.messages.impl.attachments.preview_AttachmentsView_4_de.png index 889afd4d50..acb622ce01 100644 --- a/screenshots/de/features.messages.impl.attachments.preview_AttachmentsView_4_de.png +++ b/screenshots/de/features.messages.impl.attachments.preview_AttachmentsView_4_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:08b134ef2b6f1dd6b09eec35eb9a21b087c4c044dc79c0d7866576dcf3b03708 -size 54365 +oid sha256:5c95776b3b50ea30c22beb212d1d2b8d76d8007dcba02e43c42bf6026dae0c56 +size 62584 diff --git a/screenshots/de/features.messages.impl.attachments.preview_AttachmentsView_5_de.png b/screenshots/de/features.messages.impl.attachments.preview_AttachmentsView_5_de.png index e6d72de882..8095a482cc 100644 --- a/screenshots/de/features.messages.impl.attachments.preview_AttachmentsView_5_de.png +++ b/screenshots/de/features.messages.impl.attachments.preview_AttachmentsView_5_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:1751a5050c3af40abde06f49f3812ec6cd69e2d69b020156d3497cb5d4c86448 -size 55544 +oid sha256:0cf927b792142d25ff50446ca73b0e27b42c686fb2d067289e79cc684e13509b +size 67982 diff --git a/screenshots/de/features.messages.impl.attachments.preview_AttachmentsView_6_de.png b/screenshots/de/features.messages.impl.attachments.preview_AttachmentsView_6_de.png new file mode 100644 index 0000000000..ee6402016e --- /dev/null +++ b/screenshots/de/features.messages.impl.attachments.preview_AttachmentsView_6_de.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:0ccbd55eb8a28c638f200aa64b5174b4bee470e1a6fe1ab04bd59857b2bdf896 +size 74025 diff --git a/screenshots/de/features.messages.impl.attachments.preview_AttachmentsView_7_de.png b/screenshots/de/features.messages.impl.attachments.preview_AttachmentsView_7_de.png index 67c478c5e0..25a96b081c 100644 --- a/screenshots/de/features.messages.impl.attachments.preview_AttachmentsView_7_de.png +++ b/screenshots/de/features.messages.impl.attachments.preview_AttachmentsView_7_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:839fcd52dba467845f12490b2bbb32bbc17cea9e0e9fe1e6d0e4bf16e514c3bf -size 396270 +oid sha256:338a4dd2d2ad1087197e0bc52d108a51c0405b1e6dd2e4b7c5a5a01386d7fc8f +size 407481 diff --git a/screenshots/de/features.messages.impl.attachments.preview_AttachmentsView_8_de.png b/screenshots/de/features.messages.impl.attachments.preview_AttachmentsView_8_de.png new file mode 100644 index 0000000000..1fc637dbe9 --- /dev/null +++ b/screenshots/de/features.messages.impl.attachments.preview_AttachmentsView_8_de.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:dd86e863f066b81bbfbbcf7b2d7a0f178461e0d2b741361afdaca1f1515a8064 +size 85197 diff --git a/screenshots/de/features.messages.impl.attachments.preview_VideoQualitySelectorDialog_Day_0_de.png b/screenshots/de/features.messages.impl.attachments.preview_VideoQualitySelectorDialog_Day_0_de.png new file mode 100644 index 0000000000..4a9addbf76 --- /dev/null +++ b/screenshots/de/features.messages.impl.attachments.preview_VideoQualitySelectorDialog_Day_0_de.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:e04cb4c5d37083a0fb0452dc18f8ed82bddc86136b1fb04aa79d8b7ea2c6cbce +size 57379 diff --git a/screenshots/de/features.messages.impl.crypto.identity_IdentityChangeStateView_Day_1_de.png b/screenshots/de/features.messages.impl.crypto.identity_IdentityChangeStateView_Day_1_de.png index c9aeb2f674..a805d7fad0 100644 --- a/screenshots/de/features.messages.impl.crypto.identity_IdentityChangeStateView_Day_1_de.png +++ b/screenshots/de/features.messages.impl.crypto.identity_IdentityChangeStateView_Day_1_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:676c512eb43f3784c98e8344abc1c76a3950d3765eb888d79e8b3b7a03178fe8 -size 25844 +oid sha256:ceb1b20a39934c02017a80509032396042f7b9aa26e0721a006a0f45dba03e96 +size 25449 diff --git a/screenshots/de/features.messages.impl.crypto.identity_IdentityChangeStateView_Day_2_de.png b/screenshots/de/features.messages.impl.crypto.identity_IdentityChangeStateView_Day_2_de.png index 8a2a525f26..08cc7ec741 100644 --- a/screenshots/de/features.messages.impl.crypto.identity_IdentityChangeStateView_Day_2_de.png +++ b/screenshots/de/features.messages.impl.crypto.identity_IdentityChangeStateView_Day_2_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:59eb255368d39bf029237c84977c84a616994193b5c1d1ed43db403bb63e289b -size 29959 +oid sha256:4e793c73663cc035493c49b43dbc65dc5aa14d5baa90708e83b783bbbeb4c007 +size 29683 diff --git a/screenshots/de/features.messages.impl.crypto.identity_MessagesViewWithIdentityChange_Day_0_de.png b/screenshots/de/features.messages.impl.crypto.identity_MessagesViewWithIdentityChange_Day_0_de.png index b5b6c0f9d3..dca73ab6a1 100644 --- a/screenshots/de/features.messages.impl.crypto.identity_MessagesViewWithIdentityChange_Day_0_de.png +++ b/screenshots/de/features.messages.impl.crypto.identity_MessagesViewWithIdentityChange_Day_0_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:db5d7e1a25e726e26825d478b2a207765231f9f760ae7de4a0933f769d286f0a -size 55303 +oid sha256:cddbda7a38afd3ba433487c88955402a6c69cff0ce04cb1be397ded7b0eb712e +size 56147 diff --git a/screenshots/de/features.messages.impl.crypto.identity_MessagesViewWithIdentityChange_Day_1_de.png b/screenshots/de/features.messages.impl.crypto.identity_MessagesViewWithIdentityChange_Day_1_de.png index ed62c54da8..d533e50925 100644 --- a/screenshots/de/features.messages.impl.crypto.identity_MessagesViewWithIdentityChange_Day_1_de.png +++ b/screenshots/de/features.messages.impl.crypto.identity_MessagesViewWithIdentityChange_Day_1_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:8f308b2c77832c7a0524708c0d252acfb25534f5717fcaa5c7ec74c6ce97a957 -size 65932 +oid sha256:3757f005f6a53a56d76d73fd0f93050c8d8e7832ae1d79877a1ebfaa4c26263b +size 66511 diff --git a/screenshots/de/features.messages.impl.crypto.identity_MessagesViewWithIdentityChange_Day_2_de.png b/screenshots/de/features.messages.impl.crypto.identity_MessagesViewWithIdentityChange_Day_2_de.png index 2304ec677f..9c480b595c 100644 --- a/screenshots/de/features.messages.impl.crypto.identity_MessagesViewWithIdentityChange_Day_2_de.png +++ b/screenshots/de/features.messages.impl.crypto.identity_MessagesViewWithIdentityChange_Day_2_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:5c372fe6127c540d2272f857008224a552a633ad83c18934edb33b639d857381 -size 67598 +oid sha256:28e84336963ef72fea96d5ddcb63534016af8ed918362b102323670c3c008166 +size 68121 diff --git a/screenshots/de/features.messages.impl.crypto.sendfailure.resolve_ResolveVerifiedUserSendFailureView_Day_1_de.png b/screenshots/de/features.messages.impl.crypto.sendfailure.resolve_ResolveVerifiedUserSendFailureView_Day_1_de.png index eb9c71a724..bf6614f481 100644 --- a/screenshots/de/features.messages.impl.crypto.sendfailure.resolve_ResolveVerifiedUserSendFailureView_Day_1_de.png +++ b/screenshots/de/features.messages.impl.crypto.sendfailure.resolve_ResolveVerifiedUserSendFailureView_Day_1_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:439fcd91d80e7621cb4ab67596d37349f8de9ef40f2362933eaeb4de8e50d473 -size 65849 +oid sha256:40e5a2393bda1703b749b26d323642cf8aff70337c949a6d543d1b8424af612c +size 65840 diff --git a/screenshots/de/features.messages.impl.crypto.sendfailure.resolve_ResolveVerifiedUserSendFailureView_Day_2_de.png b/screenshots/de/features.messages.impl.crypto.sendfailure.resolve_ResolveVerifiedUserSendFailureView_Day_2_de.png index 4fd955ab0e..975db3ac6c 100644 --- a/screenshots/de/features.messages.impl.crypto.sendfailure.resolve_ResolveVerifiedUserSendFailureView_Day_2_de.png +++ b/screenshots/de/features.messages.impl.crypto.sendfailure.resolve_ResolveVerifiedUserSendFailureView_Day_2_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:52a994b5aebddd00efeeca7d0add567445cbf881cd19d13f7c608645fe0d4b86 -size 65834 +oid sha256:daf09d948b288af931532ac3efac99eeeafd026ff57a11da034ba31950d85345 +size 65930 diff --git a/screenshots/de/features.messages.impl.forward_ForwardMessagesView_Day_3_de.png b/screenshots/de/features.messages.impl.forward_ForwardMessagesView_Day_3_de.png index e56fc99ed1..415bf08603 100644 --- a/screenshots/de/features.messages.impl.forward_ForwardMessagesView_Day_3_de.png +++ b/screenshots/de/features.messages.impl.forward_ForwardMessagesView_Day_3_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:346ce8a3b2353353d3b97a5a20c773a74b534fd0ab7f1d14d3d32bfeb5490f74 -size 9297 +oid sha256:a8077b421a93fb66d11503d75b558acda35947f5886c0f11d6b81dcf1c5e7653 +size 8681 diff --git a/screenshots/de/features.messages.impl.link_LinkView_Day_1_de.png b/screenshots/de/features.messages.impl.link_LinkView_Day_1_de.png index ac0cb24cc0..13d0247d42 100644 --- a/screenshots/de/features.messages.impl.link_LinkView_Day_1_de.png +++ b/screenshots/de/features.messages.impl.link_LinkView_Day_1_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:bd7ba46af8c9846828dcd4711915044038201591853c714ed707266e51f19a92 -size 33770 +oid sha256:205385948204ce81658a86e94c344edb347f495c1a31afe997744cbe0be9c24b +size 33354 diff --git a/screenshots/de/features.messages.impl.messagecomposer.suggestions_SuggestionsPickerView_Day_0_de.png b/screenshots/de/features.messages.impl.messagecomposer.suggestions_SuggestionsPickerView_Day_0_de.png index 8c05ba9cdc..d22c1a0875 100644 --- a/screenshots/de/features.messages.impl.messagecomposer.suggestions_SuggestionsPickerView_Day_0_de.png +++ b/screenshots/de/features.messages.impl.messagecomposer.suggestions_SuggestionsPickerView_Day_0_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:982e1555cf3dc1a9e954ad5894ff695612daa54352125f905b033e462787df9a -size 21314 +oid sha256:a36c48b6d5574e405f0b06503468c6e2d585049eb82a9519882fa62ffbb2b2dc +size 21811 diff --git a/screenshots/de/features.messages.impl.messagecomposer_AttachmentSourcePickerMenu_Day_0_de.png b/screenshots/de/features.messages.impl.messagecomposer_AttachmentSourcePickerMenu_Day_0_de.png index 0a8e9ef088..46e364b59f 100644 --- a/screenshots/de/features.messages.impl.messagecomposer_AttachmentSourcePickerMenu_Day_0_de.png +++ b/screenshots/de/features.messages.impl.messagecomposer_AttachmentSourcePickerMenu_Day_0_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:5f6c1d589f99a2f5722253f0e868eda2c60c464955d29828a3e8bca0b3db1a20 -size 26566 +oid sha256:24c8da1cdf528b8ffde0ed71e8931233e6553d0e7331db4dfb318d52e987efc4 +size 26809 diff --git a/screenshots/de/features.messages.impl.messagecomposer_MessageComposerView_Day_0_de.png b/screenshots/de/features.messages.impl.messagecomposer_MessageComposerView_Day_0_de.png index 6643ce9eff..b35ec70009 100644 --- a/screenshots/de/features.messages.impl.messagecomposer_MessageComposerView_Day_0_de.png +++ b/screenshots/de/features.messages.impl.messagecomposer_MessageComposerView_Day_0_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:e4e58b90fc0168991058340c2e29f3a2146c57598ea471aa7ba0b68b950c5574 -size 18507 +oid sha256:1c2fe9f97097034e54463d868244747f6970fbb739715330f147341dcaecb6a9 +size 18215 diff --git a/screenshots/de/features.messages.impl.pinned.banner_PinnedMessagesBannerView_Day_10_de.png b/screenshots/de/features.messages.impl.pinned.banner_PinnedMessagesBannerView_Day_10_de.png index c070c8defe..3b6ee0c996 100644 --- a/screenshots/de/features.messages.impl.pinned.banner_PinnedMessagesBannerView_Day_10_de.png +++ b/screenshots/de/features.messages.impl.pinned.banner_PinnedMessagesBannerView_Day_10_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:6bc84472e40a6bd8fdaf271e3156ab7df66013979a7140b121e2ab8ff840dc05 -size 13756 +oid sha256:592e40bcc8ccf065df367c77aab9d6258f20546beada70c6ba5f59e7abd4b314 +size 14033 diff --git a/screenshots/de/features.messages.impl.pinned.banner_PinnedMessagesBannerView_Day_1_de.png b/screenshots/de/features.messages.impl.pinned.banner_PinnedMessagesBannerView_Day_1_de.png index 84ccf39539..1771035472 100644 --- a/screenshots/de/features.messages.impl.pinned.banner_PinnedMessagesBannerView_Day_1_de.png +++ b/screenshots/de/features.messages.impl.pinned.banner_PinnedMessagesBannerView_Day_1_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:c5787b15e0c6e2f7f8351dee103a15a7c17f3464902a73c091990a0fd6ab66d0 -size 8566 +oid sha256:57345af5973db3b10b9e8c4eb7eedd1de5b11e858143d72ced0822113d5ca7d6 +size 8883 diff --git a/screenshots/de/features.messages.impl.pinned.banner_PinnedMessagesBannerView_Day_2_de.png b/screenshots/de/features.messages.impl.pinned.banner_PinnedMessagesBannerView_Day_2_de.png index b5087f8a07..48c6436147 100644 --- a/screenshots/de/features.messages.impl.pinned.banner_PinnedMessagesBannerView_Day_2_de.png +++ b/screenshots/de/features.messages.impl.pinned.banner_PinnedMessagesBannerView_Day_2_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:80407eb4836cd5a0c7a8ed2be66018069cb9a6f1d9d3ea51264f9562d088149a -size 12264 +oid sha256:e7ef2eae6e34590eaa70662d4a412b6e1888d10ecc310d84337f96e146496705 +size 12637 diff --git a/screenshots/de/features.messages.impl.pinned.banner_PinnedMessagesBannerView_Day_3_de.png b/screenshots/de/features.messages.impl.pinned.banner_PinnedMessagesBannerView_Day_3_de.png index ec7b5b583c..508a8b4339 100644 --- a/screenshots/de/features.messages.impl.pinned.banner_PinnedMessagesBannerView_Day_3_de.png +++ b/screenshots/de/features.messages.impl.pinned.banner_PinnedMessagesBannerView_Day_3_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:a6a864350329c6c83fcf07d6021754a07d0c33c231cbe336327435413b220ef7 -size 9934 +oid sha256:59c4f0f62a333643618873db052c84247b256206b218845be7f219cb1ad7f749 +size 10185 diff --git a/screenshots/de/features.messages.impl.pinned.banner_PinnedMessagesBannerView_Day_4_de.png b/screenshots/de/features.messages.impl.pinned.banner_PinnedMessagesBannerView_Day_4_de.png index c74ee9e599..607a883cf0 100644 --- a/screenshots/de/features.messages.impl.pinned.banner_PinnedMessagesBannerView_Day_4_de.png +++ b/screenshots/de/features.messages.impl.pinned.banner_PinnedMessagesBannerView_Day_4_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:93c60d5656f3b0d84849e327119e2c1de270a5c5cb49e7dde7dc0bff73327bab -size 13438 +oid sha256:63d84fe1e0721f5d3fe32c00a23b891ee688426024600a2dc47cd44165d6a75f +size 13702 diff --git a/screenshots/de/features.messages.impl.pinned.banner_PinnedMessagesBannerView_Day_5_de.png b/screenshots/de/features.messages.impl.pinned.banner_PinnedMessagesBannerView_Day_5_de.png index 56d4f4d26c..9b5b16aa90 100644 --- a/screenshots/de/features.messages.impl.pinned.banner_PinnedMessagesBannerView_Day_5_de.png +++ b/screenshots/de/features.messages.impl.pinned.banner_PinnedMessagesBannerView_Day_5_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:d35c9e124fd1168e368d55ce67276442b7d691e986f438384a74a542d2bc9afa -size 13652 +oid sha256:c8e16633b53b8f9b9079ac7eb3b2786f6ad4cd4aeba1a578c193b08967f04a2c +size 13935 diff --git a/screenshots/de/features.messages.impl.pinned.banner_PinnedMessagesBannerView_Day_6_de.png b/screenshots/de/features.messages.impl.pinned.banner_PinnedMessagesBannerView_Day_6_de.png index b71c20dd39..ceffd723ad 100644 --- a/screenshots/de/features.messages.impl.pinned.banner_PinnedMessagesBannerView_Day_6_de.png +++ b/screenshots/de/features.messages.impl.pinned.banner_PinnedMessagesBannerView_Day_6_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:e328ce60f8a4fee3850e1f8f1cbc66413a99119b56b4745169f6fb2b17e7e423 -size 13636 +oid sha256:5eb7fec84ac9a55756dd0b3caa8615bd5310ad5c0fa3b4ed9e6f96e1c3eca5b5 +size 13918 diff --git a/screenshots/de/features.messages.impl.pinned.banner_PinnedMessagesBannerView_Day_7_de.png b/screenshots/de/features.messages.impl.pinned.banner_PinnedMessagesBannerView_Day_7_de.png index e580c6802c..d6e43766f7 100644 --- a/screenshots/de/features.messages.impl.pinned.banner_PinnedMessagesBannerView_Day_7_de.png +++ b/screenshots/de/features.messages.impl.pinned.banner_PinnedMessagesBannerView_Day_7_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:eefcd85d7d2ddfed2f9aa5d6d67f3e6dcdffab29f2b0afb965055cdfe354318e -size 13767 +oid sha256:858c2ebbf8b7432f963b78f6d3b26a115c52c029284bc66f1729be89e3b3236d +size 14039 diff --git a/screenshots/de/features.messages.impl.pinned.banner_PinnedMessagesBannerView_Day_8_de.png b/screenshots/de/features.messages.impl.pinned.banner_PinnedMessagesBannerView_Day_8_de.png index 72cad09f0d..236e69a0b6 100644 --- a/screenshots/de/features.messages.impl.pinned.banner_PinnedMessagesBannerView_Day_8_de.png +++ b/screenshots/de/features.messages.impl.pinned.banner_PinnedMessagesBannerView_Day_8_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:8ff32821bf323cc02a913cf89f8a2c6fbed7180f86dd5676a54596a12e6a5f85 -size 13769 +oid sha256:cc522b4de75025ddb1f73cef4b3f8c9f1292937e579209c497c94e1581225493 +size 14074 diff --git a/screenshots/de/features.messages.impl.pinned.banner_PinnedMessagesBannerView_Day_9_de.png b/screenshots/de/features.messages.impl.pinned.banner_PinnedMessagesBannerView_Day_9_de.png index 5072e0b008..9d378e8d9f 100644 --- a/screenshots/de/features.messages.impl.pinned.banner_PinnedMessagesBannerView_Day_9_de.png +++ b/screenshots/de/features.messages.impl.pinned.banner_PinnedMessagesBannerView_Day_9_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:1a16bb5d6587162d8b59399f75c728c68965978ff7cf3439f2c3a906cb4500fe -size 13682 +oid sha256:6f3adf04f3c2f4a15a6d4abbde529a7564dbeb3dce626f382a4d533de96e60d4 +size 13989 diff --git a/screenshots/de/features.messages.impl.pinned.list_PinnedMessagesListView_Day_0_de.png b/screenshots/de/features.messages.impl.pinned.list_PinnedMessagesListView_Day_0_de.png index 59a4323d4d..859a4b74f3 100644 --- a/screenshots/de/features.messages.impl.pinned.list_PinnedMessagesListView_Day_0_de.png +++ b/screenshots/de/features.messages.impl.pinned.list_PinnedMessagesListView_Day_0_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:b6927e063867986095e5e95026fcbb2bdc04977cee5fd80bbf89c5c331909acf -size 25047 +oid sha256:8cb6fbaa752a13e34a7d049b9cfd1048fa499d35cb99dca78ec3ea25f01a4251 +size 25033 diff --git a/screenshots/de/features.messages.impl.pinned.list_PinnedMessagesListView_Day_1_de.png b/screenshots/de/features.messages.impl.pinned.list_PinnedMessagesListView_Day_1_de.png index b86184cccf..6b3c204ffe 100644 --- a/screenshots/de/features.messages.impl.pinned.list_PinnedMessagesListView_Day_1_de.png +++ b/screenshots/de/features.messages.impl.pinned.list_PinnedMessagesListView_Day_1_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:b33738bbd3ec0a20eefacac4bd5fc4f03c71ac0dbce772d914801b316c91625c -size 10018 +oid sha256:25cd5cb052d0a1c5ce508f03cb9617972850fdf07750c4b28c5409bbf56bb721 +size 10017 diff --git a/screenshots/de/features.messages.impl.pinned.list_PinnedMessagesListView_Day_2_de.png b/screenshots/de/features.messages.impl.pinned.list_PinnedMessagesListView_Day_2_de.png index 857ac66312..1347f254a1 100644 --- a/screenshots/de/features.messages.impl.pinned.list_PinnedMessagesListView_Day_2_de.png +++ b/screenshots/de/features.messages.impl.pinned.list_PinnedMessagesListView_Day_2_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:f2e6774496aa545174428999235b4ba4825b1255706dcb829c92b9dfb1c1fa09 -size 35290 +oid sha256:3cd170e61a8802132a308d4e255bc0604c43dd0968c4cca47c850b691b05a704 +size 35327 diff --git a/screenshots/de/features.messages.impl.pinned.list_PinnedMessagesListView_Day_3_de.png b/screenshots/de/features.messages.impl.pinned.list_PinnedMessagesListView_Day_3_de.png index 3ab47b8103..8163d35770 100644 --- a/screenshots/de/features.messages.impl.pinned.list_PinnedMessagesListView_Day_3_de.png +++ b/screenshots/de/features.messages.impl.pinned.list_PinnedMessagesListView_Day_3_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:2f9d82dd9f47d136f1816276ecb77b1f01588cb5d075e655c7d83822a0354f7f -size 43881 +oid sha256:d375fc47b82ea9d857b3600957e5253ee67821f38a7f73b5a61fc1d94caf9993 +size 43879 diff --git a/screenshots/de/features.messages.impl.report_ReportMessageView_Day_0_de.png b/screenshots/de/features.messages.impl.report_ReportMessageView_Day_0_de.png index cadfe7fde5..908d46d31b 100644 --- a/screenshots/de/features.messages.impl.report_ReportMessageView_Day_0_de.png +++ b/screenshots/de/features.messages.impl.report_ReportMessageView_Day_0_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:ee0e18147ee167f32a39fa7dc04ff121982e920a3c8e1a754bbae5d789128d33 -size 48962 +oid sha256:8794e0e1ea62f3019b4b75a28530fd4d109603ce8b2b1fc8b3e7df7cda24e7f6 +size 48986 diff --git a/screenshots/de/features.messages.impl.report_ReportMessageView_Day_1_de.png b/screenshots/de/features.messages.impl.report_ReportMessageView_Day_1_de.png index b39f00cdd4..761354ce2e 100644 --- a/screenshots/de/features.messages.impl.report_ReportMessageView_Day_1_de.png +++ b/screenshots/de/features.messages.impl.report_ReportMessageView_Day_1_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:bab8b0cde9ef83f61261f25f8174b6a3129c3a542590e1bc74a056521082a014 -size 49952 +oid sha256:942749be238af7eafb70406a670ef5deca9a9bf3d2a87995a918874b1e66ddd5 +size 49881 diff --git a/screenshots/de/features.messages.impl.report_ReportMessageView_Day_2_de.png b/screenshots/de/features.messages.impl.report_ReportMessageView_Day_2_de.png index 99fc4fe6b9..3da8dff40c 100644 --- a/screenshots/de/features.messages.impl.report_ReportMessageView_Day_2_de.png +++ b/screenshots/de/features.messages.impl.report_ReportMessageView_Day_2_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:3075a505cd110ab7657830878dea94f4fba92261fb492685bdd5ee37686252dc -size 49458 +oid sha256:403f210ee397ffa1d6ec8c848609d3af1bdf6ea03b0d3916a96b3e380add7a7c +size 49370 diff --git a/screenshots/de/features.messages.impl.report_ReportMessageView_Day_3_de.png b/screenshots/de/features.messages.impl.report_ReportMessageView_Day_3_de.png index 692de9f3a2..46692e98ab 100644 --- a/screenshots/de/features.messages.impl.report_ReportMessageView_Day_3_de.png +++ b/screenshots/de/features.messages.impl.report_ReportMessageView_Day_3_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:623e8bfd20bddcd57b8b24d2077b3c3b8f7d6ac393b02c89ed0fe7af7970543a -size 49046 +oid sha256:d1f2e659b9155998589008bc48e1fe7241112b0d7f85ed2a88338f168a248ba5 +size 49038 diff --git a/screenshots/de/features.messages.impl.report_ReportMessageView_Day_4_de.png b/screenshots/de/features.messages.impl.report_ReportMessageView_Day_4_de.png index e8a2ae3d59..1ca514798f 100644 --- a/screenshots/de/features.messages.impl.report_ReportMessageView_Day_4_de.png +++ b/screenshots/de/features.messages.impl.report_ReportMessageView_Day_4_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:7740aa5ce68ea8f5408e9463bd367a985d91570bbef40829eb7b15bab3f14d47 -size 28865 +oid sha256:efb39a10694cfbb835d171b8cb2687ee20f610d9e614e67ee19de0bfc50b8a2f +size 28929 diff --git a/screenshots/de/features.messages.impl.report_ReportMessageView_Day_5_de.png b/screenshots/de/features.messages.impl.report_ReportMessageView_Day_5_de.png index 99fc4fe6b9..3da8dff40c 100644 --- a/screenshots/de/features.messages.impl.report_ReportMessageView_Day_5_de.png +++ b/screenshots/de/features.messages.impl.report_ReportMessageView_Day_5_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:3075a505cd110ab7657830878dea94f4fba92261fb492685bdd5ee37686252dc -size 49458 +oid sha256:403f210ee397ffa1d6ec8c848609d3af1bdf6ea03b0d3916a96b3e380add7a7c +size 49370 diff --git a/screenshots/de/features.messages.impl.timeline.components.event_TimelineItemEncryptedView_Day_0_de.png b/screenshots/de/features.messages.impl.timeline.components.event_TimelineItemEncryptedView_Day_0_de.png index 60ae5aae0c..bbb46320a2 100644 --- a/screenshots/de/features.messages.impl.timeline.components.event_TimelineItemEncryptedView_Day_0_de.png +++ b/screenshots/de/features.messages.impl.timeline.components.event_TimelineItemEncryptedView_Day_0_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:d4d1d4a86d53c785d75b559a581dfb5191c740e71f781339e25b14ede5d0b3cc -size 8950 +oid sha256:08cd52b175bc76ea6e51571e24cc5287c14bd1b29128b83dba6b1e6c132b4944 +size 9112 diff --git a/screenshots/de/features.messages.impl.timeline.components.event_TimelineItemEncryptedView_Day_1_de.png b/screenshots/de/features.messages.impl.timeline.components.event_TimelineItemEncryptedView_Day_1_de.png index 3210c0c98f..5cecc78bdf 100644 --- a/screenshots/de/features.messages.impl.timeline.components.event_TimelineItemEncryptedView_Day_1_de.png +++ b/screenshots/de/features.messages.impl.timeline.components.event_TimelineItemEncryptedView_Day_1_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:089c2cc89b7606a71c178d330294603b98c754ae95c5c0e1a167ef1450e353ce -size 11620 +oid sha256:57acf877ff90191f5cea16ce40af84b5838f342fc401878668fe2742ee22fd64 +size 11747 diff --git a/screenshots/de/features.messages.impl.timeline.components.event_TimelineItemEncryptedView_Day_2_de.png b/screenshots/de/features.messages.impl.timeline.components.event_TimelineItemEncryptedView_Day_2_de.png index a4f5226235..6926d126b0 100644 --- a/screenshots/de/features.messages.impl.timeline.components.event_TimelineItemEncryptedView_Day_2_de.png +++ b/screenshots/de/features.messages.impl.timeline.components.event_TimelineItemEncryptedView_Day_2_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:71feb6e54801136ba27235cd4ac059439ae8a53ecc4f21dafa4fabaa054b9457 -size 13673 +oid sha256:9da344db7e22f80be0ae181e92804d053fe1c120ce4cae2bbbad4f8700ee6746 +size 13097 diff --git a/screenshots/de/features.messages.impl.timeline.components.event_TimelineItemEncryptedView_Day_3_de.png b/screenshots/de/features.messages.impl.timeline.components.event_TimelineItemEncryptedView_Day_3_de.png index 9095074efc..293ccdf251 100644 --- a/screenshots/de/features.messages.impl.timeline.components.event_TimelineItemEncryptedView_Day_3_de.png +++ b/screenshots/de/features.messages.impl.timeline.components.event_TimelineItemEncryptedView_Day_3_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:97eb49d7750c53156c35e17a3df7e63f7aa988d82348f0e3365e155cb19b1af1 -size 11073 +oid sha256:c3838c4a01a76b2eab8004332f31f71409b9667f72aa84535565f39895a72e03 +size 11242 diff --git a/screenshots/de/features.messages.impl.timeline.components.event_TimelineItemEncryptedView_Day_4_de.png b/screenshots/de/features.messages.impl.timeline.components.event_TimelineItemEncryptedView_Day_4_de.png index e595b4ee2c..66ba06d334 100644 --- a/screenshots/de/features.messages.impl.timeline.components.event_TimelineItemEncryptedView_Day_4_de.png +++ b/screenshots/de/features.messages.impl.timeline.components.event_TimelineItemEncryptedView_Day_4_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:dffd8fbb09aeb23b8eee2e3b8d670c0ef17c2972aa6d6f176e7567ce90dcb037 -size 14425 +oid sha256:346573be091144ec677f2bd3e26a19dbc0cac48b0b76c4509f0cf2644c7f5dcc +size 14611 diff --git a/screenshots/de/features.messages.impl.timeline.components.event_TimelineItemEncryptedView_Day_5_de.png b/screenshots/de/features.messages.impl.timeline.components.event_TimelineItemEncryptedView_Day_5_de.png index 89843596f7..f97f8f7e1d 100644 --- a/screenshots/de/features.messages.impl.timeline.components.event_TimelineItemEncryptedView_Day_5_de.png +++ b/screenshots/de/features.messages.impl.timeline.components.event_TimelineItemEncryptedView_Day_5_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:6ccd7ec64520729366305c2daf46056027757bdf9b581873fd6e1c765d27c721 -size 19784 +oid sha256:225a74373cbaeba3b2c7e801d37c5575be3c18987e3167bd75e43d35148c0fd0 +size 20107 diff --git a/screenshots/de/features.messages.impl.timeline.components.event_TimelineItemEncryptedView_Day_6_de.png b/screenshots/de/features.messages.impl.timeline.components.event_TimelineItemEncryptedView_Day_6_de.png index f55ae6b423..a90a1363e7 100644 --- a/screenshots/de/features.messages.impl.timeline.components.event_TimelineItemEncryptedView_Day_6_de.png +++ b/screenshots/de/features.messages.impl.timeline.components.event_TimelineItemEncryptedView_Day_6_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:8136b3009216ac85839cec2cba2156dc5edb8b7557f75677793234a0ce7be34e -size 24994 +oid sha256:d0f8d342ef5e3507a0cf0c7ef8fd78a035c529c66085d8949c8f4cdbd5dde984 +size 25349 diff --git a/screenshots/de/features.messages.impl.timeline.components.event_TimelineItemEncryptedView_Day_7_de.png b/screenshots/de/features.messages.impl.timeline.components.event_TimelineItemEncryptedView_Day_7_de.png index 092e7b6161..4f74c87565 100644 --- a/screenshots/de/features.messages.impl.timeline.components.event_TimelineItemEncryptedView_Day_7_de.png +++ b/screenshots/de/features.messages.impl.timeline.components.event_TimelineItemEncryptedView_Day_7_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:832b41afeabe29ea4e9c699806cd9c1cf79a1ede47ad6ea8140cdae5e4602ff0 -size 11299 +oid sha256:3ef0cbaf695486ec46a9d451e2620557e6e9c536307e7e65e2298e4b053bb98b +size 11464 diff --git a/screenshots/de/features.messages.impl.timeline.components.event_TimelineItemEncryptedView_Day_8_de.png b/screenshots/de/features.messages.impl.timeline.components.event_TimelineItemEncryptedView_Day_8_de.png index 60ae5aae0c..bbb46320a2 100644 --- a/screenshots/de/features.messages.impl.timeline.components.event_TimelineItemEncryptedView_Day_8_de.png +++ b/screenshots/de/features.messages.impl.timeline.components.event_TimelineItemEncryptedView_Day_8_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:d4d1d4a86d53c785d75b559a581dfb5191c740e71f781339e25b14ede5d0b3cc -size 8950 +oid sha256:08cd52b175bc76ea6e51571e24cc5287c14bd1b29128b83dba6b1e6c132b4944 +size 9112 diff --git a/screenshots/de/features.messages.impl.timeline.components.event_TimelineItemImageViewHideMediaContent_Day_0_de.png b/screenshots/de/features.messages.impl.timeline.components.event_TimelineItemImageViewHideMediaContent_Day_0_de.png index beeff0d4cd..c89a21a7b8 100644 --- a/screenshots/de/features.messages.impl.timeline.components.event_TimelineItemImageViewHideMediaContent_Day_0_de.png +++ b/screenshots/de/features.messages.impl.timeline.components.event_TimelineItemImageViewHideMediaContent_Day_0_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:0a7259349f4b813a21692d498734342a7f038ec437026b96c21599f9470b10c7 -size 56353 +oid sha256:9f3190a761916fb16599936acdfe54b925c6e1d614159354ebf74c685a6a9c50 +size 56220 diff --git a/screenshots/de/features.messages.impl.timeline.components.event_TimelineItemLegacyCallInviteView_Day_0_de.png b/screenshots/de/features.messages.impl.timeline.components.event_TimelineItemLegacyCallInviteView_Day_0_de.png index e591e216c6..2e8febbab1 100644 --- a/screenshots/de/features.messages.impl.timeline.components.event_TimelineItemLegacyCallInviteView_Day_0_de.png +++ b/screenshots/de/features.messages.impl.timeline.components.event_TimelineItemLegacyCallInviteView_Day_0_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:b8a373459c04470f1febd57120fc5c14a7de39aeada3d96dffbacc9ef91ad301 -size 17525 +oid sha256:ed229f3db2609923e4f38435dcbf6f3615f6451216f9ac599fd42034414a0107 +size 17933 diff --git a/screenshots/de/features.messages.impl.timeline.components.event_TimelineItemPollView_Day_0_de.png b/screenshots/de/features.messages.impl.timeline.components.event_TimelineItemPollView_Day_0_de.png index 3995a91a26..7e3c3f8843 100644 --- a/screenshots/de/features.messages.impl.timeline.components.event_TimelineItemPollView_Day_0_de.png +++ b/screenshots/de/features.messages.impl.timeline.components.event_TimelineItemPollView_Day_0_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:da326c358b6e63c56997c91331fcb577194625d146c1f19e3140126bc87c97c4 -size 48356 +oid sha256:6f822ac721fa7c0e129c787852e5d085713d4fdbc93d8475b48c50436fe58410 +size 48798 diff --git a/screenshots/de/features.messages.impl.timeline.components.event_TimelineItemPollView_Day_1_de.png b/screenshots/de/features.messages.impl.timeline.components.event_TimelineItemPollView_Day_1_de.png index 7cfd51b4b7..f8ad513f05 100644 --- a/screenshots/de/features.messages.impl.timeline.components.event_TimelineItemPollView_Day_1_de.png +++ b/screenshots/de/features.messages.impl.timeline.components.event_TimelineItemPollView_Day_1_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:8e806543ceb3c25c58562785cec74d2f5064d2c94e6ae558811ce0fd76ebfe76 -size 50774 +oid sha256:4276d64e4e150ef04080d1d7c2bbe372ccdd9a50cf67118163f9df630e5dad14 +size 51015 diff --git a/screenshots/de/features.messages.impl.timeline.components.event_TimelineItemPollView_Day_2_de.png b/screenshots/de/features.messages.impl.timeline.components.event_TimelineItemPollView_Day_2_de.png index a4573547e6..7b454e20eb 100644 --- a/screenshots/de/features.messages.impl.timeline.components.event_TimelineItemPollView_Day_2_de.png +++ b/screenshots/de/features.messages.impl.timeline.components.event_TimelineItemPollView_Day_2_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:c579ccb8997881839455946315be561cedf55c2beffc7b4162b6a354792f66a4 -size 52470 +oid sha256:9de2142007e9b29f4418b2cd2e109ad696d397553dbe8ee720ab9e32fee21f05 +size 52612 diff --git a/screenshots/de/features.messages.impl.timeline.components.event_TimelineItemPollView_Day_3_de.png b/screenshots/de/features.messages.impl.timeline.components.event_TimelineItemPollView_Day_3_de.png index 21ec0741cb..f152e3821d 100644 --- a/screenshots/de/features.messages.impl.timeline.components.event_TimelineItemPollView_Day_3_de.png +++ b/screenshots/de/features.messages.impl.timeline.components.event_TimelineItemPollView_Day_3_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:38e53aa9cbff5725b93945ecd93d7b35d7e3fccbee9e14acf4732a6dc635a06c -size 52831 +oid sha256:dd43b12b36a6a4e3e467ca8455316e347290e1b03b3f760877bd90d18c366ebc +size 52991 diff --git a/screenshots/de/features.messages.impl.timeline.components.event_TimelineItemRedactedView_Day_0_de.png b/screenshots/de/features.messages.impl.timeline.components.event_TimelineItemRedactedView_Day_0_de.png index 29050424d4..d215d43fdf 100644 --- a/screenshots/de/features.messages.impl.timeline.components.event_TimelineItemRedactedView_Day_0_de.png +++ b/screenshots/de/features.messages.impl.timeline.components.event_TimelineItemRedactedView_Day_0_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:941c6fde084447131f8af4281079b89698e575948690c5c2ac35064765852ccc -size 7410 +oid sha256:ff5f2498323c6f0cb2c068ca23bff4e5af0b3bbde57c3cb8982284e2b8503fa9 +size 7553 diff --git a/screenshots/de/features.messages.impl.timeline.components.event_TimelineItemUnknownView_Day_0_de.png b/screenshots/de/features.messages.impl.timeline.components.event_TimelineItemUnknownView_Day_0_de.png index 0dc692ba52..0ce0c3f3aa 100644 --- a/screenshots/de/features.messages.impl.timeline.components.event_TimelineItemUnknownView_Day_0_de.png +++ b/screenshots/de/features.messages.impl.timeline.components.event_TimelineItemUnknownView_Day_0_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:dbd1750148dbab35e364e87653d209f7d7061dd8c566e9f38f780d02907f6e95 -size 9011 +oid sha256:826b030fbbaa23b05cd36ca3b072204f7b2cce6af0e2ef1398074d53e5bc6a6f +size 9188 diff --git a/screenshots/de/features.messages.impl.timeline.components.event_TimelineItemVideoViewHideMediaContent_Day_0_de.png b/screenshots/de/features.messages.impl.timeline.components.event_TimelineItemVideoViewHideMediaContent_Day_0_de.png index beeff0d4cd..c89a21a7b8 100644 --- a/screenshots/de/features.messages.impl.timeline.components.event_TimelineItemVideoViewHideMediaContent_Day_0_de.png +++ b/screenshots/de/features.messages.impl.timeline.components.event_TimelineItemVideoViewHideMediaContent_Day_0_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:0a7259349f4b813a21692d498734342a7f038ec437026b96c21599f9470b10c7 -size 56353 +oid sha256:9f3190a761916fb16599936acdfe54b925c6e1d614159354ebf74c685a6a9c50 +size 56220 diff --git a/screenshots/de/features.messages.impl.timeline.components.receipt.bottomsheet_ReadReceiptBottomSheet_Day_0_de.png b/screenshots/de/features.messages.impl.timeline.components.receipt.bottomsheet_ReadReceiptBottomSheet_Day_0_de.png index d4b609e167..0cb285908a 100644 --- a/screenshots/de/features.messages.impl.timeline.components.receipt.bottomsheet_ReadReceiptBottomSheet_Day_0_de.png +++ b/screenshots/de/features.messages.impl.timeline.components.receipt.bottomsheet_ReadReceiptBottomSheet_Day_0_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:a796f972fc802aa15700850629f52155dd173ae8703b07ed55217b6b2af05c2e -size 6427 +oid sha256:f61bf90b73a18b90c8003e3ed52676646c2f31d16fae9b140f00a6398f266834 +size 6689 diff --git a/screenshots/de/features.messages.impl.timeline.components.receipt.bottomsheet_ReadReceiptBottomSheet_Day_1_de.png b/screenshots/de/features.messages.impl.timeline.components.receipt.bottomsheet_ReadReceiptBottomSheet_Day_1_de.png index 50e4ad26d5..2e4b967586 100644 --- a/screenshots/de/features.messages.impl.timeline.components.receipt.bottomsheet_ReadReceiptBottomSheet_Day_1_de.png +++ b/screenshots/de/features.messages.impl.timeline.components.receipt.bottomsheet_ReadReceiptBottomSheet_Day_1_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:662c22ead79f4beb2d4983d6d7a23b7fb58d2943bd8233df21bd47b81cff4b4d -size 11703 +oid sha256:1a07d10aba2d12a4e664b4ff122f10434b5af4bb90fdaf57fc05a52c67bd47ff +size 12207 diff --git a/screenshots/de/features.messages.impl.timeline.components.receipt.bottomsheet_ReadReceiptBottomSheet_Day_2_de.png b/screenshots/de/features.messages.impl.timeline.components.receipt.bottomsheet_ReadReceiptBottomSheet_Day_2_de.png index 64af09da5f..d1d9065005 100644 --- a/screenshots/de/features.messages.impl.timeline.components.receipt.bottomsheet_ReadReceiptBottomSheet_Day_2_de.png +++ b/screenshots/de/features.messages.impl.timeline.components.receipt.bottomsheet_ReadReceiptBottomSheet_Day_2_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:c97f056c73ecd15d0e22809061414a87a014e8c372a3f983decf66ec373e8acb -size 16982 +oid sha256:212650482a277d51efb218af0485aa0e5d7c72a33bd5e8c482dd704299c975c6 +size 17684 diff --git a/screenshots/de/features.messages.impl.timeline.components.receipt.bottomsheet_ReadReceiptBottomSheet_Day_3_de.png b/screenshots/de/features.messages.impl.timeline.components.receipt.bottomsheet_ReadReceiptBottomSheet_Day_3_de.png index 287a380caf..3a19f3bf86 100644 --- a/screenshots/de/features.messages.impl.timeline.components.receipt.bottomsheet_ReadReceiptBottomSheet_Day_3_de.png +++ b/screenshots/de/features.messages.impl.timeline.components.receipt.bottomsheet_ReadReceiptBottomSheet_Day_3_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:0c843a5165466d537abfa85d948dcc27fb8a01eb61d4559db308bcb303b64d41 -size 22010 +oid sha256:240798176e52148a905fb4beecd34e9ae962c5da9ba03324d3f3cf48ef9544ad +size 22605 diff --git a/screenshots/de/features.messages.impl.timeline.components.receipt.bottomsheet_ReadReceiptBottomSheet_Day_4_de.png b/screenshots/de/features.messages.impl.timeline.components.receipt.bottomsheet_ReadReceiptBottomSheet_Day_4_de.png index a88ec1c855..828befb6d1 100644 --- a/screenshots/de/features.messages.impl.timeline.components.receipt.bottomsheet_ReadReceiptBottomSheet_Day_4_de.png +++ b/screenshots/de/features.messages.impl.timeline.components.receipt.bottomsheet_ReadReceiptBottomSheet_Day_4_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:6eb89bfefd3ba933a0ce542142d35ce69a2f1369edb71dd96d2d7710c90a8634 -size 26774 +oid sha256:f875b3189dd12e945dd7128e1c826e4b17463d098d790f52a4932cf27b878b5b +size 27015 diff --git a/screenshots/de/features.messages.impl.timeline.components.receipt.bottomsheet_ReadReceiptBottomSheet_Day_5_de.png b/screenshots/de/features.messages.impl.timeline.components.receipt.bottomsheet_ReadReceiptBottomSheet_Day_5_de.png index 6e562238fa..edbda381af 100644 --- a/screenshots/de/features.messages.impl.timeline.components.receipt.bottomsheet_ReadReceiptBottomSheet_Day_5_de.png +++ b/screenshots/de/features.messages.impl.timeline.components.receipt.bottomsheet_ReadReceiptBottomSheet_Day_5_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:6355f5871c23d785d79b3969ceaa0d37ab0c95a8b07caa4e98f52432ae4390a9 -size 31885 +oid sha256:1cd78cd18060a2799221b3e6f3eb517bf6d597927fe4900d8c49349ca3a545d1 +size 32333 diff --git a/screenshots/de/features.messages.impl.timeline.components.virtual_TimelineItemReadMarkerView_Day_0_de.png b/screenshots/de/features.messages.impl.timeline.components.virtual_TimelineItemReadMarkerView_Day_0_de.png index 634b60cfcc..605ef9732f 100644 --- a/screenshots/de/features.messages.impl.timeline.components.virtual_TimelineItemReadMarkerView_Day_0_de.png +++ b/screenshots/de/features.messages.impl.timeline.components.virtual_TimelineItemReadMarkerView_Day_0_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:c14787c550def03ba6823107856be7df3531e3db0578bfded1196fbe1d4c1360 -size 4223 +oid sha256:c56441719efcd23f87ad764be0a8f363cb409ab7192dc0d1c5314503fa32ae13 +size 4379 diff --git a/screenshots/de/features.messages.impl.timeline.components.virtual_TimelineItemRoomBeginningView_Day_0_de.png b/screenshots/de/features.messages.impl.timeline.components.virtual_TimelineItemRoomBeginningView_Day_0_de.png index 9cd944d9a9..0ec9e19801 100644 --- a/screenshots/de/features.messages.impl.timeline.components.virtual_TimelineItemRoomBeginningView_Day_0_de.png +++ b/screenshots/de/features.messages.impl.timeline.components.virtual_TimelineItemRoomBeginningView_Day_0_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:5f3da666595fb927aad97e0f50762534d49e587122a304062baf1322b23b7d48 -size 56367 +oid sha256:99a208301ad2252b61448a3fbfce6e3252b592c3b04e36617b2207532d982fcc +size 56626 diff --git a/screenshots/de/features.messages.impl.timeline.components_CallMenuItem_Day_2_de.png b/screenshots/de/features.messages.impl.timeline.components_CallMenuItem_Day_2_de.png index eec0d14f41..58d6f9bc01 100644 --- a/screenshots/de/features.messages.impl.timeline.components_CallMenuItem_Day_2_de.png +++ b/screenshots/de/features.messages.impl.timeline.components_CallMenuItem_Day_2_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:30a67ddcd95c4a387cd9abe35d0b93f0303a6ceba5a6b73f9dfc5fdfe80c6b27 -size 6619 +oid sha256:0578cfc7d5459104f4c1027cd95f0155e8ddcd93d1436a748167a6bf3db02c64 +size 6746 diff --git a/screenshots/de/features.messages.impl.timeline.components_CallMenuItem_Day_3_de.png b/screenshots/de/features.messages.impl.timeline.components_CallMenuItem_Day_3_de.png index b93eafce77..c1df5aed64 100644 --- a/screenshots/de/features.messages.impl.timeline.components_CallMenuItem_Day_3_de.png +++ b/screenshots/de/features.messages.impl.timeline.components_CallMenuItem_Day_3_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:1b62eb64c91e55846eeb393ff4d32ce904917da8c03e4cc98d65cbd7eddc2011 -size 6179 +oid sha256:533d2603d3b0c01a3960d575ef5cf551423e78364946f569549734afd8d5ee6a +size 6275 diff --git a/screenshots/de/features.messages.impl.timeline.components_MessageShieldView_Day_0_de.png b/screenshots/de/features.messages.impl.timeline.components_MessageShieldView_Day_0_de.png index c89a3fc130..9e8ad7c3fb 100644 --- a/screenshots/de/features.messages.impl.timeline.components_MessageShieldView_Day_0_de.png +++ b/screenshots/de/features.messages.impl.timeline.components_MessageShieldView_Day_0_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:b7095fe731139c16b1f56bab2d7314e6df0bb56778d900bc611d3ddbaa6f4298 -size 58692 +oid sha256:27ab4da95563af4f7063105b172abcca812dc20702eb76817fc8656466ed4989 +size 58576 diff --git a/screenshots/de/features.messages.impl.timeline.components_TimelineEventTimestampView_Day_3_de.png b/screenshots/de/features.messages.impl.timeline.components_TimelineEventTimestampView_Day_3_de.png index 910d7ae982..0433046540 100644 --- a/screenshots/de/features.messages.impl.timeline.components_TimelineEventTimestampView_Day_3_de.png +++ b/screenshots/de/features.messages.impl.timeline.components_TimelineEventTimestampView_Day_3_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:32b998cea2b45d557a27027e75dda192f06022a8ede6a2407245b884ed62ab04 -size 6157 +oid sha256:3dc7468e718b4179c1676010e3b04e1e7981e6ba78507b2ef1735a109c5b6eed +size 6232 diff --git a/screenshots/de/features.messages.impl.timeline.components_TimelineEventTimestampView_Day_4_de.png b/screenshots/de/features.messages.impl.timeline.components_TimelineEventTimestampView_Day_4_de.png index a7ba0f04ec..92b543d8d7 100644 --- a/screenshots/de/features.messages.impl.timeline.components_TimelineEventTimestampView_Day_4_de.png +++ b/screenshots/de/features.messages.impl.timeline.components_TimelineEventTimestampView_Day_4_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:3ff70ab2e23f935cbc277c89d0a7f4dad7520ee6cd57ce5be1f12230fc69f383 -size 6711 +oid sha256:891730a3f18f34234fd27619c0a9bb711806ca4387c4280d4e43dfed343c8be9 +size 6788 diff --git a/screenshots/de/features.messages.impl.timeline.components_TimelineItemCallNotifyView_Day_0_de.png b/screenshots/de/features.messages.impl.timeline.components_TimelineItemCallNotifyView_Day_0_de.png index 98acc146d7..14a0ecd842 100644 --- a/screenshots/de/features.messages.impl.timeline.components_TimelineItemCallNotifyView_Day_0_de.png +++ b/screenshots/de/features.messages.impl.timeline.components_TimelineItemCallNotifyView_Day_0_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:f81a93d139c6904f85395b7bab5576bc6686b8057d18af7d698fd41cc041df1f -size 41829 +oid sha256:2fdad68b06bdb7af5da9f94561b5f5e3bff45bd3d8737d1404665951f7cbfb34 +size 42170 diff --git a/screenshots/de/features.messages.impl.timeline.components_TimelineItemEventRowTimestamp_Day_3_de.png b/screenshots/de/features.messages.impl.timeline.components_TimelineItemEventRowTimestamp_Day_3_de.png index ac2baa4b52..35a9d3774f 100644 --- a/screenshots/de/features.messages.impl.timeline.components_TimelineItemEventRowTimestamp_Day_3_de.png +++ b/screenshots/de/features.messages.impl.timeline.components_TimelineItemEventRowTimestamp_Day_3_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:6f4e60f8e098b2c28e92932de91aaf3d362a9d02232e0043d12c554cdba69f77 -size 34077 +oid sha256:9719163c78080ac0597065ab78b3e2d7cc4560be7cbb8223b8f4085a2bb1a844 +size 33960 diff --git a/screenshots/de/features.messages.impl.timeline.components_TimelineItemEventRowTimestamp_Day_4_de.png b/screenshots/de/features.messages.impl.timeline.components_TimelineItemEventRowTimestamp_Day_4_de.png index 3f6c958046..347dfa0fb6 100644 --- a/screenshots/de/features.messages.impl.timeline.components_TimelineItemEventRowTimestamp_Day_4_de.png +++ b/screenshots/de/features.messages.impl.timeline.components_TimelineItemEventRowTimestamp_Day_4_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:7664c4f77b92388577600d325f09500c05b8db69ec74dc8fda88a3fa0dcc9507 -size 35442 +oid sha256:43b2ba805b9f810bdbb19b42f7a441a4b4e153013acdad2074bfbd4d3c832806 +size 35276 diff --git a/screenshots/de/features.messages.impl.timeline.components_TimelineItemEventRowTimestamp_Day_7_de.png b/screenshots/de/features.messages.impl.timeline.components_TimelineItemEventRowTimestamp_Day_7_de.png index 5750748419..45e3897765 100644 --- a/screenshots/de/features.messages.impl.timeline.components_TimelineItemEventRowTimestamp_Day_7_de.png +++ b/screenshots/de/features.messages.impl.timeline.components_TimelineItemEventRowTimestamp_Day_7_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:8bdf62b2b66d60143ce42f430d2fdcf213c189a518859c47dd0b0cbd5f742e5f -size 11196 +oid sha256:c69ef0b37148981bac622f3b5f0c7a6d19d8fc3ab25d0434921829e7ea47f129 +size 11436 diff --git a/screenshots/de/features.messages.impl.timeline.components_TimelineItemEventRowUtd_Day_0_de.png b/screenshots/de/features.messages.impl.timeline.components_TimelineItemEventRowUtd_Day_0_de.png index 0598471522..5b1ac87129 100644 --- a/screenshots/de/features.messages.impl.timeline.components_TimelineItemEventRowUtd_Day_0_de.png +++ b/screenshots/de/features.messages.impl.timeline.components_TimelineItemEventRowUtd_Day_0_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:707b9f0f6ba77da8963e83a93667f25df3bdef1c3bff803bb80ed47ad769b5e6 -size 38564 +oid sha256:dfe87b6e8a57b8f0a72c28acd409df6be0be296f265fd9dffc767c3643a22fbf +size 38400 diff --git a/screenshots/de/features.messages.impl.timeline.components_TimelineItemEventRowWithManyReactions_Day_0_de.png b/screenshots/de/features.messages.impl.timeline.components_TimelineItemEventRowWithManyReactions_Day_0_de.png index d397a933db..674871a9f9 100644 --- a/screenshots/de/features.messages.impl.timeline.components_TimelineItemEventRowWithManyReactions_Day_0_de.png +++ b/screenshots/de/features.messages.impl.timeline.components_TimelineItemEventRowWithManyReactions_Day_0_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:e94250cb7c239d3906a580d793474cea2d5a85667e50467530cc194b97a30ff8 -size 79354 +oid sha256:0465a9b4861a1d6e1f720089ebb975e7a01f112bad28ed5ebc2e3738d10ce7fc +size 81087 diff --git a/screenshots/de/features.messages.impl.timeline.components_TimelineItemEventRowWithReplyInformative_Day_0_de.png b/screenshots/de/features.messages.impl.timeline.components_TimelineItemEventRowWithReplyInformative_Day_0_de.png index 6f8c3e3535..9950e567cd 100644 --- a/screenshots/de/features.messages.impl.timeline.components_TimelineItemEventRowWithReplyInformative_Day_0_de.png +++ b/screenshots/de/features.messages.impl.timeline.components_TimelineItemEventRowWithReplyInformative_Day_0_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:a41330d3b56718be43ef7f560f1af92b77f5d849fba55a8af4a80386ad99f55e -size 364769 +oid sha256:a65dbd7a45d6304f6445060d2aeeb767791211f8a1eaaf86bb6f5079d1001663 +size 364885 diff --git a/screenshots/de/features.messages.impl.timeline.components_TimelineItemEventRowWithReplyInformative_Day_1_de.png b/screenshots/de/features.messages.impl.timeline.components_TimelineItemEventRowWithReplyInformative_Day_1_de.png index e1be0a06ea..fc6e96c29d 100644 --- a/screenshots/de/features.messages.impl.timeline.components_TimelineItemEventRowWithReplyInformative_Day_1_de.png +++ b/screenshots/de/features.messages.impl.timeline.components_TimelineItemEventRowWithReplyInformative_Day_1_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:c35bd350c2c575dab4dae94be3211c035e757cca8b71bc75cccc68b7a5ac691b -size 370223 +oid sha256:18543bb2230f1e603be2a07eae29ab632698b8aa8d328b1363542a89ec5b15ed +size 370534 diff --git a/screenshots/de/features.messages.impl.timeline.components_TimelineItemEventRowWithReply_Day_4_de.png b/screenshots/de/features.messages.impl.timeline.components_TimelineItemEventRowWithReply_Day_4_de.png index c95c73f0ad..120e53f129 100644 --- a/screenshots/de/features.messages.impl.timeline.components_TimelineItemEventRowWithReply_Day_4_de.png +++ b/screenshots/de/features.messages.impl.timeline.components_TimelineItemEventRowWithReply_Day_4_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:6d3d008ea29f090a6b0fd8b93f91c6f75f1e0be62ded58baf5ad2a6c773ff49d -size 363977 +oid sha256:5803e8615839f09e341de9cf167057cfcf26e5fc1e51e14b3da0e5024b741214 +size 364076 diff --git a/screenshots/de/features.messages.impl.timeline.components_TimelineItemEventRowWithReply_Day_8_de.png b/screenshots/de/features.messages.impl.timeline.components_TimelineItemEventRowWithReply_Day_8_de.png index a114103f7a..15b5693fed 100644 --- a/screenshots/de/features.messages.impl.timeline.components_TimelineItemEventRowWithReply_Day_8_de.png +++ b/screenshots/de/features.messages.impl.timeline.components_TimelineItemEventRowWithReply_Day_8_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:c83e0abe2471c68101b336f325a25cd98740d3e13bd6a0fb0b306840729aca3b -size 365975 +oid sha256:985b04b170d3e13dabc86ab4ab0f496974403f84d4a550c971634da59756633a +size 366116 diff --git a/screenshots/de/features.messages.impl.timeline.components_TimelineItemEventRowWithThreadSummary_Day_0_de.png b/screenshots/de/features.messages.impl.timeline.components_TimelineItemEventRowWithThreadSummary_Day_0_de.png new file mode 100644 index 0000000000..b77d099522 --- /dev/null +++ b/screenshots/de/features.messages.impl.timeline.components_TimelineItemEventRowWithThreadSummary_Day_0_de.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:d49ca428a5b9780d2d6aea785b2187853675c607fd50c09422179c911ee47c34 +size 70557 diff --git a/screenshots/de/features.messages.impl.timeline.components_TimelineItemEventTimestampBelow_de.png b/screenshots/de/features.messages.impl.timeline.components_TimelineItemEventTimestampBelow_de.png index 916593d3a7..c2458bec09 100644 --- a/screenshots/de/features.messages.impl.timeline.components_TimelineItemEventTimestampBelow_de.png +++ b/screenshots/de/features.messages.impl.timeline.components_TimelineItemEventTimestampBelow_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:594a457f5d601dcfdedcd8311335e54d4ddf9857b0860a642717bf08465c784d -size 56965 +oid sha256:d67fdbb9f411c1d4edf572a4cc9b10601081265adb69471fbfbf931cbade68f3 +size 57213 diff --git a/screenshots/de/features.messages.impl.timeline.components_TimelineItemGroupedEventsRowContentCollapse_Day_0_de.png b/screenshots/de/features.messages.impl.timeline.components_TimelineItemGroupedEventsRowContentCollapse_Day_0_de.png index 85c4f1d8b7..63e4d2887d 100644 --- a/screenshots/de/features.messages.impl.timeline.components_TimelineItemGroupedEventsRowContentCollapse_Day_0_de.png +++ b/screenshots/de/features.messages.impl.timeline.components_TimelineItemGroupedEventsRowContentCollapse_Day_0_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:baa8a8f2240cc62e68dd9442e1d08c58a2a56af25aaf098f0ed04477a415a140 -size 8088 +oid sha256:f8014023ac0a265d62a0cc00ec70c2c2445d932980a1a046c0bcd8be4c640090 +size 8354 diff --git a/screenshots/de/features.messages.impl.timeline.components_TimelineItemGroupedEventsRowContentExpanded_Day_0_de.png b/screenshots/de/features.messages.impl.timeline.components_TimelineItemGroupedEventsRowContentExpanded_Day_0_de.png index 90682b818d..fa4bdef179 100644 --- a/screenshots/de/features.messages.impl.timeline.components_TimelineItemGroupedEventsRowContentExpanded_Day_0_de.png +++ b/screenshots/de/features.messages.impl.timeline.components_TimelineItemGroupedEventsRowContentExpanded_Day_0_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:ba8821f123b75b46a8f7415da1ec3a70366b771d62410edd867dc9e9f096263a -size 17314 +oid sha256:514b9acbabfe44a7c884de2ccc2ff381bf20a9730a5a003e1ac8d3281bc6d642 +size 17803 diff --git a/screenshots/de/features.messages.impl.timeline.components_TimelineItemReactionsLayout_Day_0_de.png b/screenshots/de/features.messages.impl.timeline.components_TimelineItemReactionsLayout_Day_0_de.png index b313d3d9da..dd8dbc3529 100644 --- a/screenshots/de/features.messages.impl.timeline.components_TimelineItemReactionsLayout_Day_0_de.png +++ b/screenshots/de/features.messages.impl.timeline.components_TimelineItemReactionsLayout_Day_0_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:ddcbafff84fb68f49f6b379b60f877b837eec22a3bb3ffa8067c5643d41afd6b -size 25885 +oid sha256:34e1ee1ae196702f6ab9c500b9b110a32fc84445a0bc42c8e8f92bb6e73ff952 +size 26047 diff --git a/screenshots/de/features.messages.impl.timeline.components_TimelineItemReactionsViewIncoming_Day_0_de.png b/screenshots/de/features.messages.impl.timeline.components_TimelineItemReactionsViewIncoming_Day_0_de.png index 388583a46c..9e22bb90f2 100644 --- a/screenshots/de/features.messages.impl.timeline.components_TimelineItemReactionsViewIncoming_Day_0_de.png +++ b/screenshots/de/features.messages.impl.timeline.components_TimelineItemReactionsViewIncoming_Day_0_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:ed0ea1d7b8803af4aff5d495fd9987e77f040d1ec77cd3cc6a93ab22fc70c66e -size 24502 +oid sha256:69eae7faacbdce88f13844359884f24bc8159c13752ca1ff65aa8aaf2c7f6e70 +size 25643 diff --git a/screenshots/de/features.messages.impl.timeline.components_TimelineItemReactionsViewOutgoing_Day_0_de.png b/screenshots/de/features.messages.impl.timeline.components_TimelineItemReactionsViewOutgoing_Day_0_de.png index a0ef01c2d3..9c833955ca 100644 --- a/screenshots/de/features.messages.impl.timeline.components_TimelineItemReactionsViewOutgoing_Day_0_de.png +++ b/screenshots/de/features.messages.impl.timeline.components_TimelineItemReactionsViewOutgoing_Day_0_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:81fee4f5c0227b65420ee1b78f2e2c4b20ea2f8997a1e3df5d5a5cb22a5828d3 -size 24417 +oid sha256:7cf5c1518dbaf6952348815535c23e5291684857fab10314de23330d13c8c781 +size 25661 diff --git a/screenshots/de/features.messages.impl.timeline.focus_FocusRequestStateView_Day_1_de.png b/screenshots/de/features.messages.impl.timeline.focus_FocusRequestStateView_Day_1_de.png index 3c7124cd56..1cb1173b12 100644 --- a/screenshots/de/features.messages.impl.timeline.focus_FocusRequestStateView_Day_1_de.png +++ b/screenshots/de/features.messages.impl.timeline.focus_FocusRequestStateView_Day_1_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:d5eae268b073e8b02440678fab3721cb73b215089e78f311a4f7b0c829507609 -size 12140 +oid sha256:a83be835af4ba5220bc17d56e430b53b363df5a53e7f4a05fb34cb0e7e9487ff +size 11513 diff --git a/screenshots/de/features.messages.impl.timeline.focus_FocusRequestStateView_Day_2_de.png b/screenshots/de/features.messages.impl.timeline.focus_FocusRequestStateView_Day_2_de.png index 3c7124cd56..1cb1173b12 100644 --- a/screenshots/de/features.messages.impl.timeline.focus_FocusRequestStateView_Day_2_de.png +++ b/screenshots/de/features.messages.impl.timeline.focus_FocusRequestStateView_Day_2_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:d5eae268b073e8b02440678fab3721cb73b215089e78f311a4f7b0c829507609 -size 12140 +oid sha256:a83be835af4ba5220bc17d56e430b53b363df5a53e7f4a05fb34cb0e7e9487ff +size 11513 diff --git a/screenshots/de/features.messages.impl.timeline.focus_FocusRequestStateView_Day_3_de.png b/screenshots/de/features.messages.impl.timeline.focus_FocusRequestStateView_Day_3_de.png index 26f9933feb..b23fe05d44 100644 --- a/screenshots/de/features.messages.impl.timeline.focus_FocusRequestStateView_Day_3_de.png +++ b/screenshots/de/features.messages.impl.timeline.focus_FocusRequestStateView_Day_3_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:3e83a28c5e7ab79fd671a0c98aa6f5bc0adaa0072ead81db602cd4d0939d510e -size 14991 +oid sha256:628cc87a2c18dd8416ddfca2a7bde83f9254e79031bbfdbbb41663f3ebc6d0b4 +size 14401 diff --git a/screenshots/de/features.messages.impl.timeline.protection_ProtectedView_Day_0_de.png b/screenshots/de/features.messages.impl.timeline.protection_ProtectedView_Day_0_de.png index 727c365114..f52fef66c7 100644 --- a/screenshots/de/features.messages.impl.timeline.protection_ProtectedView_Day_0_de.png +++ b/screenshots/de/features.messages.impl.timeline.protection_ProtectedView_Day_0_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:9f6c85c85a632763d077912c3a1a42d4c0096ff11df6a21fbcb2cabf91626d1b -size 64566 +oid sha256:24184c32427d84a8542f92094424d894333147dff4a4c1735225308b8b1875bd +size 64386 diff --git a/screenshots/de/features.messages.impl.timeline.protection_ProtectedView_Day_1_de.png b/screenshots/de/features.messages.impl.timeline.protection_ProtectedView_Day_1_de.png index beeff0d4cd..c89a21a7b8 100644 --- a/screenshots/de/features.messages.impl.timeline.protection_ProtectedView_Day_1_de.png +++ b/screenshots/de/features.messages.impl.timeline.protection_ProtectedView_Day_1_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:0a7259349f4b813a21692d498734342a7f038ec437026b96c21599f9470b10c7 -size 56353 +oid sha256:9f3190a761916fb16599936acdfe54b925c6e1d614159354ebf74c685a6a9c50 +size 56220 diff --git a/screenshots/de/features.messages.impl.timeline.protection_ProtectedView_Day_2_de.png b/screenshots/de/features.messages.impl.timeline.protection_ProtectedView_Day_2_de.png index 9c7f261915..b2721e2215 100644 --- a/screenshots/de/features.messages.impl.timeline.protection_ProtectedView_Day_2_de.png +++ b/screenshots/de/features.messages.impl.timeline.protection_ProtectedView_Day_2_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:36f05e56560d77a49610d8945e6e71734ae34ffda72e794ec10af5aea0f4fdd3 -size 79861 +oid sha256:8d7d5b729322592275e03260b0a2ee8cedd15c743dc5228a2548180d0fb9caad +size 79566 diff --git a/screenshots/de/features.messages.impl.timeline.protection_ProtectedView_Day_3_de.png b/screenshots/de/features.messages.impl.timeline.protection_ProtectedView_Day_3_de.png index 31329afbb5..8e31354196 100644 --- a/screenshots/de/features.messages.impl.timeline.protection_ProtectedView_Day_3_de.png +++ b/screenshots/de/features.messages.impl.timeline.protection_ProtectedView_Day_3_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:31e4b9cbd0dd59ec269b9965ac9ec202b6443aa2a2621f479ec90fda8c8032a1 -size 37360 +oid sha256:080f5a1f54778cec3ae34b1bab013f13f5c611d9cdf8dfd4fe011f5a83a0fe93 +size 37175 diff --git a/screenshots/de/features.messages.impl.timeline_TimelineViewMessageShield_Day_0_de.png b/screenshots/de/features.messages.impl.timeline_TimelineViewMessageShield_Day_0_de.png index 3f57585bb3..148934c81c 100644 --- a/screenshots/de/features.messages.impl.timeline_TimelineViewMessageShield_Day_0_de.png +++ b/screenshots/de/features.messages.impl.timeline_TimelineViewMessageShield_Day_0_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:20c14be9d765e7dedf3cb27837b7489604a234ea35094a842cbd79238854e193 -size 37563 +oid sha256:160988f65f378e1fbaa91b135310cd9ff2f88ccd9975da711e408000c0a6e2b9 +size 38064 diff --git a/screenshots/de/features.messages.impl.timeline_TimelineView_Day_0_de.png b/screenshots/de/features.messages.impl.timeline_TimelineView_Day_0_de.png index af9e11b8bc..85d6aa3afe 100644 --- a/screenshots/de/features.messages.impl.timeline_TimelineView_Day_0_de.png +++ b/screenshots/de/features.messages.impl.timeline_TimelineView_Day_0_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:578cafe0d68fa6c507987d6fc6f0148c49b9147183c9284741d756e277520a81 -size 50655 +oid sha256:653272113d51da0d44aed06b3c3a276ab802b5760f29958d4a61067be7a98433 +size 51466 diff --git a/screenshots/de/features.messages.impl.timeline_TimelineView_Day_11_de.png b/screenshots/de/features.messages.impl.timeline_TimelineView_Day_11_de.png index c40cd12c7b..649ee1b9a3 100644 --- a/screenshots/de/features.messages.impl.timeline_TimelineView_Day_11_de.png +++ b/screenshots/de/features.messages.impl.timeline_TimelineView_Day_11_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:a6c8684c72d94f8a3c258f93c945864794ad628ac97e4b252d686b6248c94be3 -size 87890 +oid sha256:ab3d9d6fb1f4a97372ab83bb075c0c139a8beab3b41974f4e0435dc620b12ab5 +size 88411 diff --git a/screenshots/de/features.messages.impl.timeline_TimelineView_Day_12_de.png b/screenshots/de/features.messages.impl.timeline_TimelineView_Day_12_de.png index 442b339881..d6b0448647 100644 --- a/screenshots/de/features.messages.impl.timeline_TimelineView_Day_12_de.png +++ b/screenshots/de/features.messages.impl.timeline_TimelineView_Day_12_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:47dde4d054b41dcffd1f53ec23e176dfb7ae63b0d23da77c2c853e2b7297ee0d -size 52107 +oid sha256:4e8d184f12cd88cfdea5513735b17280160a4f91dc9151734f62646e26dae0d7 +size 52913 diff --git a/screenshots/de/features.messages.impl.timeline_TimelineView_Day_13_de.png b/screenshots/de/features.messages.impl.timeline_TimelineView_Day_13_de.png index 849c141fa2..222897cf1d 100644 --- a/screenshots/de/features.messages.impl.timeline_TimelineView_Day_13_de.png +++ b/screenshots/de/features.messages.impl.timeline_TimelineView_Day_13_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:52f8e97d6e147072d3baea0cd6053dd3b7a3f52e20af63a5bad78936e04600c0 -size 63608 +oid sha256:6974e77921a6529c5318a96139b29e7e1c4424854b7c96720709157608464427 +size 64786 diff --git a/screenshots/de/features.messages.impl.timeline_TimelineView_Day_14_de.png b/screenshots/de/features.messages.impl.timeline_TimelineView_Day_14_de.png index 46eacf6560..bbab1f75cc 100644 --- a/screenshots/de/features.messages.impl.timeline_TimelineView_Day_14_de.png +++ b/screenshots/de/features.messages.impl.timeline_TimelineView_Day_14_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:30d9eeebe3bcabcaee6549996f6cf2211100003eb6cde001aed44a4b7fa45c13 -size 48504 +oid sha256:085820af2be18893fdc550e8bee1659adb47c98cac6db4811384ad616d6f4dd7 +size 49406 diff --git a/screenshots/de/features.messages.impl.timeline_TimelineView_Day_15_de.png b/screenshots/de/features.messages.impl.timeline_TimelineView_Day_15_de.png index aa7c6e70e9..da8481a4e2 100644 --- a/screenshots/de/features.messages.impl.timeline_TimelineView_Day_15_de.png +++ b/screenshots/de/features.messages.impl.timeline_TimelineView_Day_15_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:7b69de010f5b6de83ab8aed5e4639d6726e955a80b621d52800a41032b65e793 -size 72249 +oid sha256:5314a0a7f5fd861cc5506667f55a77015a1d4e05daa8de62e8cbc2d45a3a84eb +size 73361 diff --git a/screenshots/de/features.messages.impl.timeline_TimelineView_Day_16_de.png b/screenshots/de/features.messages.impl.timeline_TimelineView_Day_16_de.png index bf44a09967..68d8d7bc29 100644 --- a/screenshots/de/features.messages.impl.timeline_TimelineView_Day_16_de.png +++ b/screenshots/de/features.messages.impl.timeline_TimelineView_Day_16_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:63bd7132d64813a4e338fe6b75c957319f693109b3f8329062108a0e1a53f2c9 -size 58267 +oid sha256:9d24241330856354903a289dc2d592c022e5255e49559a01ab9dfd8bb346302d +size 59055 diff --git a/screenshots/de/features.messages.impl.timeline_TimelineView_Day_17_de.png b/screenshots/de/features.messages.impl.timeline_TimelineView_Day_17_de.png index c1f70c7090..af245b2b63 100644 --- a/screenshots/de/features.messages.impl.timeline_TimelineView_Day_17_de.png +++ b/screenshots/de/features.messages.impl.timeline_TimelineView_Day_17_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:2470810d05aa4a473416a5ccaa8e029034910fe215887287bb4b1b5a6c2d216b -size 64654 +oid sha256:5a8a0d272b21e744e8daccc75ac3a992b2f741700b33207dac74ed2636e96af0 +size 65803 diff --git a/screenshots/de/features.messages.impl.timeline_TimelineView_Day_1_de.png b/screenshots/de/features.messages.impl.timeline_TimelineView_Day_1_de.png index 10539a0b6b..9eae6a8719 100644 --- a/screenshots/de/features.messages.impl.timeline_TimelineView_Day_1_de.png +++ b/screenshots/de/features.messages.impl.timeline_TimelineView_Day_1_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:fd03e93818de76d1d4d5f8e2d489c5e38e3daf6bc314c8474a7404f3fe4e0de8 -size 71997 +oid sha256:e1db818b5351ec948425304320c2e7777b9df0c2b562fb44ad3ca153b5df6701 +size 73321 diff --git a/screenshots/de/features.messages.impl.timeline_TimelineView_Day_4_de.png b/screenshots/de/features.messages.impl.timeline_TimelineView_Day_4_de.png index 1b79c45499..b980c00c49 100644 --- a/screenshots/de/features.messages.impl.timeline_TimelineView_Day_4_de.png +++ b/screenshots/de/features.messages.impl.timeline_TimelineView_Day_4_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:e26eed5a96d8585576e458cd946411d08a67affdb331e6bb58f42e7e4151e2c4 -size 70623 +oid sha256:75ef083e6587fe9b34cb432b60fecf7f00f67bd8785b1de65a35d8cc823e1595 +size 71726 diff --git a/screenshots/de/features.messages.impl.timeline_TimelineView_Day_6_de.png b/screenshots/de/features.messages.impl.timeline_TimelineView_Day_6_de.png index aa4feed632..f33553fe93 100644 --- a/screenshots/de/features.messages.impl.timeline_TimelineView_Day_6_de.png +++ b/screenshots/de/features.messages.impl.timeline_TimelineView_Day_6_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:76bdb6c1c61b332bc9138532f33f00a26979815de969413a01f0a22d4f00d8c9 -size 73737 +oid sha256:e766fdeec8ebfe8896a5860abb793cf51f6f8233eb251bd353f25f073cc18d18 +size 74824 diff --git a/screenshots/de/features.messages.impl.timeline_TimelineView_Day_8_de.png b/screenshots/de/features.messages.impl.timeline_TimelineView_Day_8_de.png index bc2fbd1871..986d5b788d 100644 --- a/screenshots/de/features.messages.impl.timeline_TimelineView_Day_8_de.png +++ b/screenshots/de/features.messages.impl.timeline_TimelineView_Day_8_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:f21cf03b880afcdde46858c862fbbbf6ddbdb6b070ef328f27567a42fb328bf3 -size 53848 +oid sha256:77a0f8c082360c16e18f7fb0ccd88b7ed5f9eda0c71fd7428376ac6964f39f60 +size 55067 diff --git a/screenshots/de/features.messages.impl.typing_TypingNotificationView_Day_1_de.png b/screenshots/de/features.messages.impl.typing_TypingNotificationView_Day_1_de.png index e38c4b423d..c7a9171b0e 100644 --- a/screenshots/de/features.messages.impl.typing_TypingNotificationView_Day_1_de.png +++ b/screenshots/de/features.messages.impl.typing_TypingNotificationView_Day_1_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:de2cb237d01473611ef6b2d3bc2e8693ebcc84bf3caa00a3a99aaa8aee96e1ae -size 7861 +oid sha256:dad431cbe99939884455f93faa97043a623eebded61d3eb7cb2e6810234c9fc5 +size 7958 diff --git a/screenshots/de/features.messages.impl.typing_TypingNotificationView_Day_2_de.png b/screenshots/de/features.messages.impl.typing_TypingNotificationView_Day_2_de.png index c34413c826..0e5f514f2d 100644 --- a/screenshots/de/features.messages.impl.typing_TypingNotificationView_Day_2_de.png +++ b/screenshots/de/features.messages.impl.typing_TypingNotificationView_Day_2_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:c91314d774ab6d17007fda0db8138b423d129447657d867749d6d808fb2e1f01 -size 5773 +oid sha256:3375aaedc57f36a6f5ae1f274111f0f31cf1b04d9bea2d9434e15c68c7cb80c8 +size 5874 diff --git a/screenshots/de/features.messages.impl.typing_TypingNotificationView_Day_3_de.png b/screenshots/de/features.messages.impl.typing_TypingNotificationView_Day_3_de.png index f6f14e176d..8695668ab1 100644 --- a/screenshots/de/features.messages.impl.typing_TypingNotificationView_Day_3_de.png +++ b/screenshots/de/features.messages.impl.typing_TypingNotificationView_Day_3_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:9c69b046297c5d8afc08187e60a7e70f725dc5c405211a77056b4e6b8fde39ea -size 8750 +oid sha256:72793ba46dca10fb1dc34de85fb8eebdc882ea8ca10b314f5f4cce937518fb40 +size 8949 diff --git a/screenshots/de/features.messages.impl.typing_TypingNotificationView_Day_4_de.png b/screenshots/de/features.messages.impl.typing_TypingNotificationView_Day_4_de.png index bf97cecc86..d886a7ffab 100644 --- a/screenshots/de/features.messages.impl.typing_TypingNotificationView_Day_4_de.png +++ b/screenshots/de/features.messages.impl.typing_TypingNotificationView_Day_4_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:3723495854a09951a055e3401e9910134d09af4ff5301b5870412bc1a3cee158 -size 6900 +oid sha256:529b00bc2aa27655f5102b9e5f22186f85bd839f5ece1b1630742c10fedf8124 +size 7012 diff --git a/screenshots/de/features.messages.impl.typing_TypingNotificationView_Day_5_de.png b/screenshots/de/features.messages.impl.typing_TypingNotificationView_Day_5_de.png index cfced765d3..d2a2afa93c 100644 --- a/screenshots/de/features.messages.impl.typing_TypingNotificationView_Day_5_de.png +++ b/screenshots/de/features.messages.impl.typing_TypingNotificationView_Day_5_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:88476e5844fdb70de8f5094f030d012323fc75da71d19ab3d11e8e31be980601 -size 8806 +oid sha256:d54b1bf1270b588ef1cf10da4a8bfc9fe56402ed0dc820ddf0b434e34a2e641f +size 8924 diff --git a/screenshots/de/features.messages.impl.typing_TypingNotificationView_Day_6_de.png b/screenshots/de/features.messages.impl.typing_TypingNotificationView_Day_6_de.png index f3eb64f849..3a83852960 100644 --- a/screenshots/de/features.messages.impl.typing_TypingNotificationView_Day_6_de.png +++ b/screenshots/de/features.messages.impl.typing_TypingNotificationView_Day_6_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:4c58c2a71c3e4e2ae0ccd6641f41ff104d7cf469f85a2a17f7e10ec72c84231e -size 8935 +oid sha256:42d68874f44991ddb71bc497d8f8a12e221a0b82206908d9ab30e56975ec3573 +size 9057 diff --git a/screenshots/de/features.messages.impl_MessagesView_Day_0_de.png b/screenshots/de/features.messages.impl_MessagesView_Day_0_de.png index 7fedcf0d6f..86bb6e2223 100644 --- a/screenshots/de/features.messages.impl_MessagesView_Day_0_de.png +++ b/screenshots/de/features.messages.impl_MessagesView_Day_0_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:f040348f28a6ff3ff6eb6964b9f3c6a3e034e251c29c967745f99aef9cc53a8b -size 58061 +oid sha256:b8448b68bda8acd2582a076872af17625276a7d76fd81ae0a55886621f4251a6 +size 58941 diff --git a/screenshots/de/features.messages.impl_MessagesView_Day_10_de.png b/screenshots/de/features.messages.impl_MessagesView_Day_10_de.png index 4689814a90..e4e0f50f76 100644 --- a/screenshots/de/features.messages.impl_MessagesView_Day_10_de.png +++ b/screenshots/de/features.messages.impl_MessagesView_Day_10_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:45d3ddcfaaceca77abdd26a56b4bba0c6785538755d9a220b6c77037feb13e92 -size 58091 +oid sha256:2e1c039c775e3b3ace5c4f6b21b91ea027383f007a9c8c4743c3485c05aca2c8 +size 58976 diff --git a/screenshots/de/features.messages.impl_MessagesView_Day_11_de.png b/screenshots/de/features.messages.impl_MessagesView_Day_11_de.png index d8c2bdf8cf..d0b40bab37 100644 --- a/screenshots/de/features.messages.impl_MessagesView_Day_11_de.png +++ b/screenshots/de/features.messages.impl_MessagesView_Day_11_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:fb7891823f54defdeb571976833ebd5912435aa714af2949ad8178afa6ecabcd -size 61402 +oid sha256:12e6c4fa5f0fffd03a9ef247a41d64e3ac579b6a5b803fcf0fb89fcc71bee9c7 +size 62309 diff --git a/screenshots/de/features.messages.impl_MessagesView_Day_12_de.png b/screenshots/de/features.messages.impl_MessagesView_Day_12_de.png index a475482774..f7cba2d2ec 100644 --- a/screenshots/de/features.messages.impl_MessagesView_Day_12_de.png +++ b/screenshots/de/features.messages.impl_MessagesView_Day_12_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:a6290168b8d44dbcaa2b10ed27a948c80ab3f2844b9c26748f34462252d99761 -size 60370 +oid sha256:d8d3649c61ee7d08f83426fc766819663302051149ada8e4cbf612be9557991c +size 61237 diff --git a/screenshots/de/features.messages.impl_MessagesView_Day_13_de.png b/screenshots/de/features.messages.impl_MessagesView_Day_13_de.png index 3b810f625e..f64dcd2e47 100644 --- a/screenshots/de/features.messages.impl_MessagesView_Day_13_de.png +++ b/screenshots/de/features.messages.impl_MessagesView_Day_13_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:4c200ee6c5fd2cb744bfce4adb019388ac839ab20fd79460c9555d48079418b5 -size 60288 +oid sha256:3d699f41550104cd5c8cb5744fffd2f966b60f5cf8a8472e17efc15c2df25346 +size 61165 diff --git a/screenshots/de/features.messages.impl_MessagesView_Day_14_de.png b/screenshots/de/features.messages.impl_MessagesView_Day_14_de.png index e89832b6de..af9bdd9412 100644 --- a/screenshots/de/features.messages.impl_MessagesView_Day_14_de.png +++ b/screenshots/de/features.messages.impl_MessagesView_Day_14_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:5ffc2bb37883894dc3c0bbc1e69c9af7b24862056d002cd171848d91ae017568 -size 64935 +oid sha256:e90b5cda886ab4fad45b65abfdcc909c9aac0304ade76ce95e114a381a9fdef4 +size 65750 diff --git a/screenshots/de/features.messages.impl_MessagesView_Day_15_de.png b/screenshots/de/features.messages.impl_MessagesView_Day_15_de.png new file mode 100644 index 0000000000..ce91f57d05 --- /dev/null +++ b/screenshots/de/features.messages.impl_MessagesView_Day_15_de.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:5a4abc4949743d377cd5087a496e2953714d6cf15ff3ff53569826080bdb4d81 +size 51569 diff --git a/screenshots/de/features.messages.impl_MessagesView_Day_1_de.png b/screenshots/de/features.messages.impl_MessagesView_Day_1_de.png index 0dc716fb9e..ad4ccaf62a 100644 --- a/screenshots/de/features.messages.impl_MessagesView_Day_1_de.png +++ b/screenshots/de/features.messages.impl_MessagesView_Day_1_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:2512e1e21aa4ee0b9dbbed2a87ae44066d6785b8ce3848c6feeda617aec9c1d0 -size 57260 +oid sha256:af28ff85e055081974c119833e5ee32d2ebc1728ff687b341cb686af3aa83d6b +size 58000 diff --git a/screenshots/de/features.messages.impl_MessagesView_Day_2_de.png b/screenshots/de/features.messages.impl_MessagesView_Day_2_de.png index b2df1f049a..d2f2902674 100644 --- a/screenshots/de/features.messages.impl_MessagesView_Day_2_de.png +++ b/screenshots/de/features.messages.impl_MessagesView_Day_2_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:8cc102ed3992b2d0af56cde9baf60dca7c432b41ea11634f3900346a4de678eb -size 42000 +oid sha256:303369a96f59235a88cad88bd022cbaab8063f865d78e3f96ab5e91699e76156 +size 42112 diff --git a/screenshots/de/features.messages.impl_MessagesView_Day_3_de.png b/screenshots/de/features.messages.impl_MessagesView_Day_3_de.png index 6c787b294d..1c266e7548 100644 --- a/screenshots/de/features.messages.impl_MessagesView_Day_3_de.png +++ b/screenshots/de/features.messages.impl_MessagesView_Day_3_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:c72315cb456c2634a6fd15335e7596cdb686bdc0a37b9743f833fd825e5bfe79 -size 60466 +oid sha256:0a94ddec52651815c17d8855369d87d7fe1fcd0f4c5de53d52dc7f083a6fea3a +size 61238 diff --git a/screenshots/de/features.messages.impl_MessagesView_Day_4_de.png b/screenshots/de/features.messages.impl_MessagesView_Day_4_de.png index b31b08e400..4e2639e982 100644 --- a/screenshots/de/features.messages.impl_MessagesView_Day_4_de.png +++ b/screenshots/de/features.messages.impl_MessagesView_Day_4_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:364fb7f3a2d8b1c55da697a3a7229640ed0f540fcc09295915ba20c6790d45fd -size 56516 +oid sha256:ef763e848edb197e68535250e4bd14a073446d681156107f7ce5998d93b16cfb +size 57312 diff --git a/screenshots/de/features.messages.impl_MessagesView_Day_5_de.png b/screenshots/de/features.messages.impl_MessagesView_Day_5_de.png index f5e62d8158..cdd1236c77 100644 --- a/screenshots/de/features.messages.impl_MessagesView_Day_5_de.png +++ b/screenshots/de/features.messages.impl_MessagesView_Day_5_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:609b9256d547f484a1b1c351a201f6a6abd314f278368d3d4d27b5e38aee4cb5 -size 59519 +oid sha256:8e117ec0cca4db612187634af65fa06a66f2c42b4ae4f85129c6b1e1c8d26bc8 +size 60432 diff --git a/screenshots/de/features.messages.impl_MessagesView_Day_6_de.png b/screenshots/de/features.messages.impl_MessagesView_Day_6_de.png index cf6ca3448a..7c1807d837 100644 --- a/screenshots/de/features.messages.impl_MessagesView_Day_6_de.png +++ b/screenshots/de/features.messages.impl_MessagesView_Day_6_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:4987841ba51faf1eeca18027c155c943b99093cc64e6a12867f981899fa8efb3 -size 54505 +oid sha256:9803a08e9c42e821941c85f596e909755723680f75534104f297a6f2bcb37a7d +size 55309 diff --git a/screenshots/de/features.messages.impl_MessagesView_Day_7_de.png b/screenshots/de/features.messages.impl_MessagesView_Day_7_de.png index 378ec92255..74ea65abd3 100644 --- a/screenshots/de/features.messages.impl_MessagesView_Day_7_de.png +++ b/screenshots/de/features.messages.impl_MessagesView_Day_7_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:e4a271a615bf287ffb25c71cab70420ab35d6617f6156a2836c392fbfb630156 -size 60616 +oid sha256:c3610695c30f6dff010cac696623af946afc1e847a54af48dd71cbeab83be033 +size 61433 diff --git a/screenshots/de/features.messages.impl_MessagesView_Day_8_de.png b/screenshots/de/features.messages.impl_MessagesView_Day_8_de.png index 291f192b4e..0bd6113fae 100644 --- a/screenshots/de/features.messages.impl_MessagesView_Day_8_de.png +++ b/screenshots/de/features.messages.impl_MessagesView_Day_8_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:af2679bf3aff0e4ece4eec51971407410bea0ad93c8dac210db88534d7f83349 -size 60514 +oid sha256:b206dd36fff869ebbff8a63c783cab6f24998458cd6bfe8af397a28209cc7894 +size 61425 diff --git a/screenshots/de/features.messages.impl_MessagesView_Day_9_de.png b/screenshots/de/features.messages.impl_MessagesView_Day_9_de.png index 9af91d6aae..66f1d91843 100644 --- a/screenshots/de/features.messages.impl_MessagesView_Day_9_de.png +++ b/screenshots/de/features.messages.impl_MessagesView_Day_9_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:0d5b302a08359835725e7ccb2b0279254b9d45f303c8d06c2533a9e3dd71e6e1 -size 48790 +oid sha256:d22db7b845a7fe310bcc6d8c57e95f32b1edfb9841f9785fd9f3dc261ad7f48c +size 49579 diff --git a/screenshots/de/features.migration.impl_MigrationView_Day_1_de.png b/screenshots/de/features.migration.impl_MigrationView_Day_1_de.png index 5fcd3f8216..1ef907e916 100644 --- a/screenshots/de/features.migration.impl_MigrationView_Day_1_de.png +++ b/screenshots/de/features.migration.impl_MigrationView_Day_1_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:247ab4981812b290f010be44eee2d7c72b08ef650ad844dbf1e973da3b100833 -size 7913 +oid sha256:d8c4237b1ec4f25e79f4eecf4d8ec35efea3f2d91ba7f7ac64ee7a14cd25db74 +size 7932 diff --git a/screenshots/de/features.poll.api.pollcontent_PollAnswerViewDisclosedNotSelected_Day_0_de.png b/screenshots/de/features.poll.api.pollcontent_PollAnswerViewDisclosedNotSelected_Day_0_de.png index 7b854cc7d8..503edd0f00 100644 --- a/screenshots/de/features.poll.api.pollcontent_PollAnswerViewDisclosedNotSelected_Day_0_de.png +++ b/screenshots/de/features.poll.api.pollcontent_PollAnswerViewDisclosedNotSelected_Day_0_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:1806e21e6eeb04d301bf1700be683eabd546694561a4cd5930fd8d0b3217da9d -size 21948 +oid sha256:e4579f387dd478cd9f87c889e4594bd39ecee596a31c1a8059df711302932028 +size 22414 diff --git a/screenshots/de/features.poll.api.pollcontent_PollAnswerViewDisclosedSelected_Day_0_de.png b/screenshots/de/features.poll.api.pollcontent_PollAnswerViewDisclosedSelected_Day_0_de.png index 3a974eaf9b..d43cbef044 100644 --- a/screenshots/de/features.poll.api.pollcontent_PollAnswerViewDisclosedSelected_Day_0_de.png +++ b/screenshots/de/features.poll.api.pollcontent_PollAnswerViewDisclosedSelected_Day_0_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:05ddf0870ca90ef4ebc51639821d740d173ad2ae4de38faed40280dd2cac8efc -size 21686 +oid sha256:6796633c10fd0c8e78ca0467533ff80adbfc55188583a7d48631eff075a2be40 +size 22166 diff --git a/screenshots/de/features.poll.api.pollcontent_PollAnswerViewEndedSelected_Day_0_de.png b/screenshots/de/features.poll.api.pollcontent_PollAnswerViewEndedSelected_Day_0_de.png index 0695cb177b..109bbb1c2d 100644 --- a/screenshots/de/features.poll.api.pollcontent_PollAnswerViewEndedSelected_Day_0_de.png +++ b/screenshots/de/features.poll.api.pollcontent_PollAnswerViewEndedSelected_Day_0_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:e6235052e32413babb1563da8c29bd9543d221b23844b9d77d854017dc9ac7a7 -size 21782 +oid sha256:0ea0b250b3ca6e36366eb59af5fe7dcaedcaef3a9135c0946a6fe93519101576 +size 22239 diff --git a/screenshots/de/features.poll.api.pollcontent_PollAnswerViewEndedWinnerNotSelected_Day_0_de.png b/screenshots/de/features.poll.api.pollcontent_PollAnswerViewEndedWinnerNotSelected_Day_0_de.png index 8e58d01b1f..1507ee7439 100644 --- a/screenshots/de/features.poll.api.pollcontent_PollAnswerViewEndedWinnerNotSelected_Day_0_de.png +++ b/screenshots/de/features.poll.api.pollcontent_PollAnswerViewEndedWinnerNotSelected_Day_0_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:a871ba2d6889369304a18e050c5a20a6e244821a6d0ca7eb5e12257a522937bf -size 22079 +oid sha256:745abd2a67bb00bdf70082c4a8d42375e5d9b53b86558c187269e9bbd07aa237 +size 22294 diff --git a/screenshots/de/features.poll.api.pollcontent_PollAnswerViewEndedWinnerSelected_Day_0_de.png b/screenshots/de/features.poll.api.pollcontent_PollAnswerViewEndedWinnerSelected_Day_0_de.png index 6e30354e30..c5861c340d 100644 --- a/screenshots/de/features.poll.api.pollcontent_PollAnswerViewEndedWinnerSelected_Day_0_de.png +++ b/screenshots/de/features.poll.api.pollcontent_PollAnswerViewEndedWinnerSelected_Day_0_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:4ce476e748ac3aa87081c67751a4690371fb6e560885bdb64abc6a54ba333252 -size 21959 +oid sha256:c38febc28cbb78ff8091c53c1b6ac5612c33292b01f6915b5cca6fb211ea0971 +size 22159 diff --git a/screenshots/de/features.poll.api.pollcontent_PollContentViewCreatorEditable_Day_0_de.png b/screenshots/de/features.poll.api.pollcontent_PollContentViewCreatorEditable_Day_0_de.png index fab607df18..12abdc7b74 100644 --- a/screenshots/de/features.poll.api.pollcontent_PollContentViewCreatorEditable_Day_0_de.png +++ b/screenshots/de/features.poll.api.pollcontent_PollContentViewCreatorEditable_Day_0_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:b8e1534e7031a85120422d6cf55ec7f201d31b5f4fb41f1cd4149c08775e4593 -size 52765 +oid sha256:bc51ea75419925320bdf8a5bf02b7d20df56731bc50872fae3d1e69511ee4227 +size 52931 diff --git a/screenshots/de/features.poll.api.pollcontent_PollContentViewCreatorEnded_Day_0_de.png b/screenshots/de/features.poll.api.pollcontent_PollContentViewCreatorEnded_Day_0_de.png index 7f401479bf..edaaa84f5d 100644 --- a/screenshots/de/features.poll.api.pollcontent_PollContentViewCreatorEnded_Day_0_de.png +++ b/screenshots/de/features.poll.api.pollcontent_PollContentViewCreatorEnded_Day_0_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:ddc44dabe3e41569d1e13932f0d93cf3735c658880c9b3c1a917e238189e9777 -size 48713 +oid sha256:c052f644f55628cd3e0f3b485df7da367741ce978a16867df60f50640ed95ac9 +size 49177 diff --git a/screenshots/de/features.poll.api.pollcontent_PollContentViewCreator_Day_0_de.png b/screenshots/de/features.poll.api.pollcontent_PollContentViewCreator_Day_0_de.png index a4573547e6..7b454e20eb 100644 --- a/screenshots/de/features.poll.api.pollcontent_PollContentViewCreator_Day_0_de.png +++ b/screenshots/de/features.poll.api.pollcontent_PollContentViewCreator_Day_0_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:c579ccb8997881839455946315be561cedf55c2beffc7b4162b6a354792f66a4 -size 52470 +oid sha256:9de2142007e9b29f4418b2cd2e109ad696d397553dbe8ee720ab9e32fee21f05 +size 52612 diff --git a/screenshots/de/features.poll.api.pollcontent_PollContentViewDisclosed_Day_0_de.png b/screenshots/de/features.poll.api.pollcontent_PollContentViewDisclosed_Day_0_de.png index 3995a91a26..7e3c3f8843 100644 --- a/screenshots/de/features.poll.api.pollcontent_PollContentViewDisclosed_Day_0_de.png +++ b/screenshots/de/features.poll.api.pollcontent_PollContentViewDisclosed_Day_0_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:da326c358b6e63c56997c91331fcb577194625d146c1f19e3140126bc87c97c4 -size 48356 +oid sha256:6f822ac721fa7c0e129c787852e5d085713d4fdbc93d8475b48c50436fe58410 +size 48798 diff --git a/screenshots/de/features.poll.api.pollcontent_PollContentViewEnded_Day_0_de.png b/screenshots/de/features.poll.api.pollcontent_PollContentViewEnded_Day_0_de.png index 7f401479bf..edaaa84f5d 100644 --- a/screenshots/de/features.poll.api.pollcontent_PollContentViewEnded_Day_0_de.png +++ b/screenshots/de/features.poll.api.pollcontent_PollContentViewEnded_Day_0_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:ddc44dabe3e41569d1e13932f0d93cf3735c658880c9b3c1a917e238189e9777 -size 48713 +oid sha256:c052f644f55628cd3e0f3b485df7da367741ce978a16867df60f50640ed95ac9 +size 49177 diff --git a/screenshots/de/features.poll.api.pollcontent_PollContentViewUndisclosed_Day_0_de.png b/screenshots/de/features.poll.api.pollcontent_PollContentViewUndisclosed_Day_0_de.png index 174016671b..4aebb5687f 100644 --- a/screenshots/de/features.poll.api.pollcontent_PollContentViewUndisclosed_Day_0_de.png +++ b/screenshots/de/features.poll.api.pollcontent_PollContentViewUndisclosed_Day_0_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:e0b487a828e25112c2c60a2bec570c4965a5c30de8bea785da32d75af4b807a6 -size 46071 +oid sha256:64f208428eef599454b3a95986a921958020a9802957229c3ba06ae74ed541e7 +size 46575 diff --git a/screenshots/de/features.poll.impl.create_CreatePollView_Day_0_de.png b/screenshots/de/features.poll.impl.create_CreatePollView_Day_0_de.png index bbe187127e..2258235f56 100644 --- a/screenshots/de/features.poll.impl.create_CreatePollView_Day_0_de.png +++ b/screenshots/de/features.poll.impl.create_CreatePollView_Day_0_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:400fa3effebadae2a8ec24a177a6d497cf8f363fe6caecac90dfccaf67de31c6 -size 39525 +oid sha256:c0c95659736547acb752eab919dc78c1a8f29ff048e85118dc52c1ad6eb5ea60 +size 39531 diff --git a/screenshots/de/features.poll.impl.create_CreatePollView_Day_1_de.png b/screenshots/de/features.poll.impl.create_CreatePollView_Day_1_de.png index 2ae47a638e..c826880b23 100644 --- a/screenshots/de/features.poll.impl.create_CreatePollView_Day_1_de.png +++ b/screenshots/de/features.poll.impl.create_CreatePollView_Day_1_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:e0f985f494027e1d6c34e09762cdec83d8878dcaf9b57d44717cd6a38447f8bd -size 42247 +oid sha256:b47e907d51ff73ad68129233cea46102360a3f4ec246a7961583ac0be58d481b +size 42357 diff --git a/screenshots/de/features.poll.impl.create_CreatePollView_Day_2_de.png b/screenshots/de/features.poll.impl.create_CreatePollView_Day_2_de.png index c065190f2c..490bba6331 100644 --- a/screenshots/de/features.poll.impl.create_CreatePollView_Day_2_de.png +++ b/screenshots/de/features.poll.impl.create_CreatePollView_Day_2_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:6661c38abe342c607c2d848185a9e005420f91b55b8f0276c99d787a348d2444 -size 42622 +oid sha256:83902b85de7faaf3f1e98ea1969d69c39543b37b59afb1bf394acb02992a2b9a +size 42892 diff --git a/screenshots/de/features.poll.impl.create_CreatePollView_Day_3_de.png b/screenshots/de/features.poll.impl.create_CreatePollView_Day_3_de.png index 10887ccef1..9c94ee1ef1 100644 --- a/screenshots/de/features.poll.impl.create_CreatePollView_Day_3_de.png +++ b/screenshots/de/features.poll.impl.create_CreatePollView_Day_3_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:b79f1ddb00cfd72f16bbda98724bc6d43c1e2b7ebf9e8792ec7efdb18256c649 -size 49828 +oid sha256:a4a6fb11ea03e64872c258bd25f304bb955c3ff779e190cc7495de2e8d0cdf71 +size 50031 diff --git a/screenshots/de/features.poll.impl.create_CreatePollView_Day_4_de.png b/screenshots/de/features.poll.impl.create_CreatePollView_Day_4_de.png index dab4688b5c..7a0b301a20 100644 --- a/screenshots/de/features.poll.impl.create_CreatePollView_Day_4_de.png +++ b/screenshots/de/features.poll.impl.create_CreatePollView_Day_4_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:2c829dc25e54af1fa2d0db02e1acf3a6f561ee06633c27efd8b0354d9a8c4567 -size 27835 +oid sha256:d5d9dd5feb7bda399c539ac68d9f57d4c4ac4a070245b121e1cda186c2774d41 +size 27942 diff --git a/screenshots/de/features.poll.impl.create_CreatePollView_Day_5_de.png b/screenshots/de/features.poll.impl.create_CreatePollView_Day_5_de.png index 7ffb3dcd7a..e7ad0cf1f1 100644 --- a/screenshots/de/features.poll.impl.create_CreatePollView_Day_5_de.png +++ b/screenshots/de/features.poll.impl.create_CreatePollView_Day_5_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:ec4720ea8139527df60cb28b482c773e1af96555df87bcc8a96ea34dd42502bc -size 118487 +oid sha256:65f83f62ae167d7794c5d049b4459d4d4ef2572185adbdd1ff929f9561cf1a0f +size 118571 diff --git a/screenshots/de/features.poll.impl.create_CreatePollView_Day_6_de.png b/screenshots/de/features.poll.impl.create_CreatePollView_Day_6_de.png index 3383e2faff..ba48f2d1dd 100644 --- a/screenshots/de/features.poll.impl.create_CreatePollView_Day_6_de.png +++ b/screenshots/de/features.poll.impl.create_CreatePollView_Day_6_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:8f3dd51cb2a0fca30e4864f777262cc8b6a2f3e0f7295c3fe9ece67275d8ad4f -size 43270 +oid sha256:ee2e8c1cf237f2c4b0ae6ccd9dcef280c0d4c83b788e140b38a47ac099e69336 +size 43253 diff --git a/screenshots/de/features.poll.impl.create_CreatePollView_Day_7_de.png b/screenshots/de/features.poll.impl.create_CreatePollView_Day_7_de.png index f0da4ef493..6819864e77 100644 --- a/screenshots/de/features.poll.impl.create_CreatePollView_Day_7_de.png +++ b/screenshots/de/features.poll.impl.create_CreatePollView_Day_7_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:fe62e13e9f9ebd24d2f930158fa0985e11f4ebaf974a96d334e26f89afda8e5f -size 40791 +oid sha256:b8ef9c9d0ac7c653b0ea36fd56148c00bcf9780ba848e9cd71a54608610d9ca9 +size 40881 diff --git a/screenshots/de/features.poll.impl.history_PollHistoryView_Day_0_de.png b/screenshots/de/features.poll.impl.history_PollHistoryView_Day_0_de.png index dd992779f3..676bebbc66 100644 --- a/screenshots/de/features.poll.impl.history_PollHistoryView_Day_0_de.png +++ b/screenshots/de/features.poll.impl.history_PollHistoryView_Day_0_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:1f7cd75461e1aa9716bd458b171c9cda3f8155b74af2a9b308b8a29a3d934f39 -size 60854 +oid sha256:a0c7748f8e99a26d100b1d0c93ce08bcee64e588aec20e797003c17eb7133b70 +size 60980 diff --git a/screenshots/de/features.poll.impl.history_PollHistoryView_Day_1_de.png b/screenshots/de/features.poll.impl.history_PollHistoryView_Day_1_de.png index 3cf570131d..7385e44a27 100644 --- a/screenshots/de/features.poll.impl.history_PollHistoryView_Day_1_de.png +++ b/screenshots/de/features.poll.impl.history_PollHistoryView_Day_1_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:c8aa53b03ecc65005e9fd96e690af55a39ee6f94f18ca5ab7fbf99b9caf5ac7d -size 65016 +oid sha256:2ec053c179d6a7399f9392bf5a0c45bc90d6e99bd36c857f7a47a87f14ee3eb8 +size 65160 diff --git a/screenshots/de/features.poll.impl.history_PollHistoryView_Day_2_de.png b/screenshots/de/features.poll.impl.history_PollHistoryView_Day_2_de.png index b8c08d67c9..26d501491f 100644 --- a/screenshots/de/features.poll.impl.history_PollHistoryView_Day_2_de.png +++ b/screenshots/de/features.poll.impl.history_PollHistoryView_Day_2_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:79bacc1b730cbcc9ebe3431a142d336018308cbcbd1857c79ee7152151d59523 -size 18209 +oid sha256:7807ed8de2cd2d555dfc53caa6bc8424cb66c666f862741a877aa542e66c4e62 +size 18143 diff --git a/screenshots/de/features.poll.impl.history_PollHistoryView_Day_3_de.png b/screenshots/de/features.poll.impl.history_PollHistoryView_Day_3_de.png index 38499891ee..e91b767ef1 100644 --- a/screenshots/de/features.poll.impl.history_PollHistoryView_Day_3_de.png +++ b/screenshots/de/features.poll.impl.history_PollHistoryView_Day_3_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:5c7f4d33b8b309e98a06c151ffb125dfd5983f51778a9a310023d312dc136b0e -size 18469 +oid sha256:c1f233f820bf61eb6afc0e5945ebeaac78bd5710195d1b85e2ca60de49a86cd4 +size 18304 diff --git a/screenshots/de/features.poll.impl.history_PollHistoryView_Day_4_de.png b/screenshots/de/features.poll.impl.history_PollHistoryView_Day_4_de.png index 985fbc86a3..43463016d1 100644 --- a/screenshots/de/features.poll.impl.history_PollHistoryView_Day_4_de.png +++ b/screenshots/de/features.poll.impl.history_PollHistoryView_Day_4_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:d05a3a87854480e5a15ca99e70d5cac728c2dedb736ee790961324f54c355dd2 -size 22164 +oid sha256:f31983cbdbdba5806948867d6a81290ee254c0d45e9b146bdf109b49c8b850fe +size 22017 diff --git a/screenshots/de/features.preferences.impl.about_AboutView_Day_0_de.png b/screenshots/de/features.preferences.impl.about_AboutView_Day_0_de.png index 4fed080382..57b718d6e0 100644 --- a/screenshots/de/features.preferences.impl.about_AboutView_Day_0_de.png +++ b/screenshots/de/features.preferences.impl.about_AboutView_Day_0_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:91088ecb93c69c3749b3e7cc5fa6692cfe209c4bf178e043aca86025331f377b -size 19226 +oid sha256:225e200388d0797309c165c7b92d2a6e63fb45314a9d98948d25076fbbb258ad +size 19145 diff --git a/screenshots/de/features.preferences.impl.advanced_AdvancedSettingsViewDark_0_de.png b/screenshots/de/features.preferences.impl.advanced_AdvancedSettingsViewDark_0_de.png index 62c9543ea0..1075303134 100644 --- a/screenshots/de/features.preferences.impl.advanced_AdvancedSettingsViewDark_0_de.png +++ b/screenshots/de/features.preferences.impl.advanced_AdvancedSettingsViewDark_0_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:13606b63d8495af917a26c321ed76d71abdde374b6805d425b87b7d1ec6fca09 -size 53413 +oid sha256:c7d95381466fcdbf56b1d8d71d6723b85ef38588162073ff1864be2b42b54e41 +size 53199 diff --git a/screenshots/de/features.preferences.impl.advanced_AdvancedSettingsViewDark_1_de.png b/screenshots/de/features.preferences.impl.advanced_AdvancedSettingsViewDark_1_de.png index 1439a1b05a..88211b5725 100644 --- a/screenshots/de/features.preferences.impl.advanced_AdvancedSettingsViewDark_1_de.png +++ b/screenshots/de/features.preferences.impl.advanced_AdvancedSettingsViewDark_1_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:31dd452f0fdeeca9c967233c311e89a2f1f9ad971f4491627bfb2dc71cf6e50b -size 53280 +oid sha256:d3e42100b18224448f38dbd0b38af7836f452af76f21dcf70b9c7453aacc1f1a +size 53061 diff --git a/screenshots/de/features.preferences.impl.advanced_AdvancedSettingsViewDark_2_de.png b/screenshots/de/features.preferences.impl.advanced_AdvancedSettingsViewDark_2_de.png index 45bd10225b..ea17a271f7 100644 --- a/screenshots/de/features.preferences.impl.advanced_AdvancedSettingsViewDark_2_de.png +++ b/screenshots/de/features.preferences.impl.advanced_AdvancedSettingsViewDark_2_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:c49e44437d70878a7a556d5c9ffa97d3f05e8087c06adbfb67b5cbd8daa16b0b -size 53260 +oid sha256:4a8cab799f06a939e3dffed6aa8219f8404f855b4ca4346ebe31341df928e68b +size 53042 diff --git a/screenshots/de/features.preferences.impl.advanced_AdvancedSettingsViewDark_3_de.png b/screenshots/de/features.preferences.impl.advanced_AdvancedSettingsViewDark_3_de.png index ca9163797f..e5fbb99e20 100644 --- a/screenshots/de/features.preferences.impl.advanced_AdvancedSettingsViewDark_3_de.png +++ b/screenshots/de/features.preferences.impl.advanced_AdvancedSettingsViewDark_3_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:6ceef44f0b46b4421da80a40af5d2143fe28c886ceb10561f6b5788d93e8d56c -size 53271 +oid sha256:232f67796b725b1e3c304ae990537c44170ea8c652fc16a23d08ea7fa4fd90ac +size 53044 diff --git a/screenshots/de/features.preferences.impl.advanced_AdvancedSettingsViewDark_4_de.png b/screenshots/de/features.preferences.impl.advanced_AdvancedSettingsViewDark_4_de.png index c8efa957f1..0ccf3d412e 100644 --- a/screenshots/de/features.preferences.impl.advanced_AdvancedSettingsViewDark_4_de.png +++ b/screenshots/de/features.preferences.impl.advanced_AdvancedSettingsViewDark_4_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:d015747828affb18a881a5aa5e386ae6093f1dd1412abec72a3d3f8559b75213 -size 53219 +oid sha256:9ea723bb7ad080e674267fd126beeaa60eb9b6701a0b994b2e5f37015dbd5f38 +size 53000 diff --git a/screenshots/de/features.preferences.impl.advanced_AdvancedSettingsViewDark_5_de.png b/screenshots/de/features.preferences.impl.advanced_AdvancedSettingsViewDark_5_de.png index a8934515c7..91a8a4c501 100644 --- a/screenshots/de/features.preferences.impl.advanced_AdvancedSettingsViewDark_5_de.png +++ b/screenshots/de/features.preferences.impl.advanced_AdvancedSettingsViewDark_5_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:d0342fc12f6b773a74bc3cb7ba0cb1315b855f4c8a8cb7a6173030f3cc82c1d7 -size 53401 +oid sha256:a6be0734e9ffc6742dd9f7419a1fb431ec86bf88d8aa1688140cfc18ce5cb26d +size 53193 diff --git a/screenshots/de/features.preferences.impl.advanced_AdvancedSettingsViewDark_6_de.png b/screenshots/de/features.preferences.impl.advanced_AdvancedSettingsViewDark_6_de.png index 33bb12fde2..b3c5ace2d3 100644 --- a/screenshots/de/features.preferences.impl.advanced_AdvancedSettingsViewDark_6_de.png +++ b/screenshots/de/features.preferences.impl.advanced_AdvancedSettingsViewDark_6_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:6ff242493b28a6e8ae6847a5674ad05a8752cf35d890430acbc31b366a3ceb7f -size 53227 +oid sha256:a6f0a98e9447e7df39009b636f6a30c7b4c9159e9266da1e6e429d3eed469729 +size 53013 diff --git a/screenshots/de/features.preferences.impl.advanced_AdvancedSettingsViewDark_7_de.png b/screenshots/de/features.preferences.impl.advanced_AdvancedSettingsViewDark_7_de.png index 0d4a2fc84d..87042b6690 100644 --- a/screenshots/de/features.preferences.impl.advanced_AdvancedSettingsViewDark_7_de.png +++ b/screenshots/de/features.preferences.impl.advanced_AdvancedSettingsViewDark_7_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:22e7284a93253845d513f8f1205b19c87a98c8d78ef3192be9f91900204e6999 -size 52935 +oid sha256:3a056f00d26ccce970f5f07792e098131d14c280d475f075d2430a13db234002 +size 52626 diff --git a/screenshots/de/features.preferences.impl.advanced_AdvancedSettingsViewDark_8_de.png b/screenshots/de/features.preferences.impl.advanced_AdvancedSettingsViewDark_8_de.png new file mode 100644 index 0000000000..742fb71866 --- /dev/null +++ b/screenshots/de/features.preferences.impl.advanced_AdvancedSettingsViewDark_8_de.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:7b738736bba6f447f53b98801bde3dbc0eb1636299ed5c2d840e236ce0ccfed3 +size 58457 diff --git a/screenshots/de/features.preferences.impl.advanced_AdvancedSettingsViewLight_0_de.png b/screenshots/de/features.preferences.impl.advanced_AdvancedSettingsViewLight_0_de.png index f8b4c8797c..2f2b6bbe81 100644 --- a/screenshots/de/features.preferences.impl.advanced_AdvancedSettingsViewLight_0_de.png +++ b/screenshots/de/features.preferences.impl.advanced_AdvancedSettingsViewLight_0_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:66202c3504557cb9849aa3a9e766d4ed7a040191b99db0aec25f198384b9e64b -size 55597 +oid sha256:704edee77c98a75ed521f632762f8527472c9ce3948bd30cf11b507ae97de95a +size 55569 diff --git a/screenshots/de/features.preferences.impl.advanced_AdvancedSettingsViewLight_1_de.png b/screenshots/de/features.preferences.impl.advanced_AdvancedSettingsViewLight_1_de.png index 518024d78d..a2099c78c8 100644 --- a/screenshots/de/features.preferences.impl.advanced_AdvancedSettingsViewLight_1_de.png +++ b/screenshots/de/features.preferences.impl.advanced_AdvancedSettingsViewLight_1_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:43b0d62d8560186efae35ebf5231a7b874c229cac972153fd207037e623a32e3 -size 55477 +oid sha256:de47269ff2b05c16d8dd52300093836450a530685e316790db2ed3e78a9b91fe +size 55445 diff --git a/screenshots/de/features.preferences.impl.advanced_AdvancedSettingsViewLight_2_de.png b/screenshots/de/features.preferences.impl.advanced_AdvancedSettingsViewLight_2_de.png index 1d1ace7a39..0469dbb456 100644 --- a/screenshots/de/features.preferences.impl.advanced_AdvancedSettingsViewLight_2_de.png +++ b/screenshots/de/features.preferences.impl.advanced_AdvancedSettingsViewLight_2_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:39d8b2935db860e023fa26883ff792de65497852ca7cadc8375548be5822cde3 -size 55486 +oid sha256:0e728c95140407d0514ef8326b6acb6cf5c08d9c30eac7eee5a0a0a505cf5330 +size 55450 diff --git a/screenshots/de/features.preferences.impl.advanced_AdvancedSettingsViewLight_3_de.png b/screenshots/de/features.preferences.impl.advanced_AdvancedSettingsViewLight_3_de.png index 6b882d18b2..ea4287cb52 100644 --- a/screenshots/de/features.preferences.impl.advanced_AdvancedSettingsViewLight_3_de.png +++ b/screenshots/de/features.preferences.impl.advanced_AdvancedSettingsViewLight_3_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:b5bb3c9f74ec80f53921d7212d7835cd8707b9563be76aa35a56f52d5c0a503d -size 55489 +oid sha256:9b115346137a49980aa7dc348ff7bef124039c23aa1f696c3bfe819fa5b55674 +size 55451 diff --git a/screenshots/de/features.preferences.impl.advanced_AdvancedSettingsViewLight_4_de.png b/screenshots/de/features.preferences.impl.advanced_AdvancedSettingsViewLight_4_de.png index d04ce0e88c..80f3b0d3e8 100644 --- a/screenshots/de/features.preferences.impl.advanced_AdvancedSettingsViewLight_4_de.png +++ b/screenshots/de/features.preferences.impl.advanced_AdvancedSettingsViewLight_4_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:dfb18049747451794530cb1a85a3a374ccd034ffdd44ffb3ac063049106eabc6 -size 55372 +oid sha256:53eb86b0d2255e7133d85dcf3a00ea257a3b3d3d383928172dd6f9f84ae3cfe9 +size 55334 diff --git a/screenshots/de/features.preferences.impl.advanced_AdvancedSettingsViewLight_5_de.png b/screenshots/de/features.preferences.impl.advanced_AdvancedSettingsViewLight_5_de.png index 04f2c24088..180e0494b0 100644 --- a/screenshots/de/features.preferences.impl.advanced_AdvancedSettingsViewLight_5_de.png +++ b/screenshots/de/features.preferences.impl.advanced_AdvancedSettingsViewLight_5_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:857cb3fbadd27fe715a3e430d273565a6e36504fd3fbef077b896e880b0f21ca -size 55604 +oid sha256:0ab683461ca76303745a51f7f8028e8daf44408f9140fd5ff28917022c55f69c +size 55595 diff --git a/screenshots/de/features.preferences.impl.advanced_AdvancedSettingsViewLight_6_de.png b/screenshots/de/features.preferences.impl.advanced_AdvancedSettingsViewLight_6_de.png index cac1549c90..c6ccd21905 100644 --- a/screenshots/de/features.preferences.impl.advanced_AdvancedSettingsViewLight_6_de.png +++ b/screenshots/de/features.preferences.impl.advanced_AdvancedSettingsViewLight_6_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:6daa75017ffff81889d2640179c2608a74f8fbea7c22fb0a5ef76a716db24a80 -size 55225 +oid sha256:46f0e21703c90c36ec78f4b3f5291f52eb5202f3c8715b99e48375f1cf38fe4e +size 55196 diff --git a/screenshots/de/features.preferences.impl.advanced_AdvancedSettingsViewLight_7_de.png b/screenshots/de/features.preferences.impl.advanced_AdvancedSettingsViewLight_7_de.png index b53f27674a..49c234382c 100644 --- a/screenshots/de/features.preferences.impl.advanced_AdvancedSettingsViewLight_7_de.png +++ b/screenshots/de/features.preferences.impl.advanced_AdvancedSettingsViewLight_7_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:aee7d2d131c88fd9f98a4b2793d6b24e568d962015470788639572ec4824a782 -size 54790 +oid sha256:7cfb2fcf2f2a923d7cfaea769d81bc3f6ff43f2d34c57b15a44f3f8f431801cc +size 54663 diff --git a/screenshots/de/features.preferences.impl.advanced_AdvancedSettingsViewLight_8_de.png b/screenshots/de/features.preferences.impl.advanced_AdvancedSettingsViewLight_8_de.png new file mode 100644 index 0000000000..acaba03f33 --- /dev/null +++ b/screenshots/de/features.preferences.impl.advanced_AdvancedSettingsViewLight_8_de.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:21a1dd8fee9fe830054738eb7d02ab047f11e6223510bf11eb37d552d746109a +size 60846 diff --git a/screenshots/de/features.preferences.impl.advanced_VideoQualitySelectorDialog_Day_0_de.png b/screenshots/de/features.preferences.impl.advanced_VideoQualitySelectorDialog_Day_0_de.png new file mode 100644 index 0000000000..d092ec4d04 --- /dev/null +++ b/screenshots/de/features.preferences.impl.advanced_VideoQualitySelectorDialog_Day_0_de.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:793ed7064eb52ddec72ba21e506882f55493390a11548df5203c0ea328a32d3e +size 50111 diff --git a/screenshots/de/features.preferences.impl.analytics_AnalyticsSettingsView_Day_0_de.png b/screenshots/de/features.preferences.impl.analytics_AnalyticsSettingsView_Day_0_de.png index 0da6e2bf8a..72ea2b6774 100644 --- a/screenshots/de/features.preferences.impl.analytics_AnalyticsSettingsView_Day_0_de.png +++ b/screenshots/de/features.preferences.impl.analytics_AnalyticsSettingsView_Day_0_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:1c86db28bbcb1da58f4dc0c4accb81689590af1dbaf1e78da76fff173cb1d0a6 -size 28915 +oid sha256:6eed0e936eb7b81494473d9cdf5d737b4bbd4d92ab067b2b8881b8d3dfff4685 +size 28910 diff --git a/screenshots/de/features.preferences.impl.blockedusers_BlockedUsersView_Day_0_de.png b/screenshots/de/features.preferences.impl.blockedusers_BlockedUsersView_Day_0_de.png index a197fb329a..13d36736ba 100644 --- a/screenshots/de/features.preferences.impl.blockedusers_BlockedUsersView_Day_0_de.png +++ b/screenshots/de/features.preferences.impl.blockedusers_BlockedUsersView_Day_0_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:b3914fffb6e9be4ab720ddc769dda6b0a2d79adef670ddc41935fe2ec4cd28a2 -size 59066 +oid sha256:bc34cfac791c18b8bd35d080e3b79a6e172362b79f9ef416ab62bc00a95594dc +size 59214 diff --git a/screenshots/de/features.preferences.impl.blockedusers_BlockedUsersView_Day_1_de.png b/screenshots/de/features.preferences.impl.blockedusers_BlockedUsersView_Day_1_de.png index 96de29e433..d295317c9c 100644 --- a/screenshots/de/features.preferences.impl.blockedusers_BlockedUsersView_Day_1_de.png +++ b/screenshots/de/features.preferences.impl.blockedusers_BlockedUsersView_Day_1_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:03d786f3c8fe235d168c4a322b1168174fed0f6f9a08eb4ba3e09c020ca89317 -size 58921 +oid sha256:5080309ae298b821d0460d64d93bb5aa924f474d3acb6d890d632f0ff91261bd +size 58917 diff --git a/screenshots/de/features.preferences.impl.blockedusers_BlockedUsersView_Day_2_de.png b/screenshots/de/features.preferences.impl.blockedusers_BlockedUsersView_Day_2_de.png index 5340d90cc3..63d0550a0f 100644 --- a/screenshots/de/features.preferences.impl.blockedusers_BlockedUsersView_Day_2_de.png +++ b/screenshots/de/features.preferences.impl.blockedusers_BlockedUsersView_Day_2_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:597c1ee930901e23779c29a31515232279f21dc19fc0d0aa3af6e8715425a216 -size 7987 +oid sha256:9d88f009ac745a10ac86b4c0cbf4bfe319709e4c6af9cdfcb74bab3c2a7820c6 +size 7996 diff --git a/screenshots/de/features.preferences.impl.blockedusers_BlockedUsersView_Day_3_de.png b/screenshots/de/features.preferences.impl.blockedusers_BlockedUsersView_Day_3_de.png index 9e09184cc2..4c195668f4 100644 --- a/screenshots/de/features.preferences.impl.blockedusers_BlockedUsersView_Day_3_de.png +++ b/screenshots/de/features.preferences.impl.blockedusers_BlockedUsersView_Day_3_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:cc08b9b1ead7e482c3e111ee0e8f778bc5b0591c5c3de8898eeafbd514559598 -size 58812 +oid sha256:57af5d4ae6c2c278808a14a9d47f11d8e393d6c378ccfc37ee5dbccb29335668 +size 58752 diff --git a/screenshots/de/features.preferences.impl.blockedusers_BlockedUsersView_Day_4_de.png b/screenshots/de/features.preferences.impl.blockedusers_BlockedUsersView_Day_4_de.png index 7e1c58bcad..51f3c6ac32 100644 --- a/screenshots/de/features.preferences.impl.blockedusers_BlockedUsersView_Day_4_de.png +++ b/screenshots/de/features.preferences.impl.blockedusers_BlockedUsersView_Day_4_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:ce7c8dc17cc79d0cdac24211ec74222fb2dbac3b8bcbf030cf7b51ee98d5d0e9 -size 62653 +oid sha256:ac0473003635a3020b0834b6464f61ad1546ca8e4416415d3cd228bdfa8fdae2 +size 62788 diff --git a/screenshots/de/features.preferences.impl.blockedusers_BlockedUsersView_Day_5_de.png b/screenshots/de/features.preferences.impl.blockedusers_BlockedUsersView_Day_5_de.png index 87e1c644a5..bd5eba6e6b 100644 --- a/screenshots/de/features.preferences.impl.blockedusers_BlockedUsersView_Day_5_de.png +++ b/screenshots/de/features.preferences.impl.blockedusers_BlockedUsersView_Day_5_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:3a42b95e58b01e6e787e4fd763ccc359d39194f90af697dbd6189814ebcd63bf -size 61736 +oid sha256:e83d8f329fc02c4e1d82dcf37e3ddaafccd61449ebb3a70fe54a54a07760645b +size 61926 diff --git a/screenshots/de/features.preferences.impl.blockedusers_BlockedUsersView_Day_6_de.png b/screenshots/de/features.preferences.impl.blockedusers_BlockedUsersView_Day_6_de.png index a197fb329a..13d36736ba 100644 --- a/screenshots/de/features.preferences.impl.blockedusers_BlockedUsersView_Day_6_de.png +++ b/screenshots/de/features.preferences.impl.blockedusers_BlockedUsersView_Day_6_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:b3914fffb6e9be4ab720ddc769dda6b0a2d79adef670ddc41935fe2ec4cd28a2 -size 59066 +oid sha256:bc34cfac791c18b8bd35d080e3b79a6e172362b79f9ef416ab62bc00a95594dc +size 59214 diff --git a/screenshots/de/features.preferences.impl.developer_DeveloperSettingsView_Day_0_de.png b/screenshots/de/features.preferences.impl.developer_DeveloperSettingsView_Day_0_de.png index b3592059e9..91da509ee5 100644 --- a/screenshots/de/features.preferences.impl.developer_DeveloperSettingsView_Day_0_de.png +++ b/screenshots/de/features.preferences.impl.developer_DeveloperSettingsView_Day_0_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:4261bab9dc77c85a8c379831cc35c72348a06d5caca8a9a6ca2d2754dc18dbe1 -size 56393 +oid sha256:bea9c1167e5a43a86c8183d97ff97b8f99aa063799b1b127aa24f44e375eb31f +size 50157 diff --git a/screenshots/de/features.preferences.impl.developer_DeveloperSettingsView_Day_1_de.png b/screenshots/de/features.preferences.impl.developer_DeveloperSettingsView_Day_1_de.png index b3592059e9..91da509ee5 100644 --- a/screenshots/de/features.preferences.impl.developer_DeveloperSettingsView_Day_1_de.png +++ b/screenshots/de/features.preferences.impl.developer_DeveloperSettingsView_Day_1_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:4261bab9dc77c85a8c379831cc35c72348a06d5caca8a9a6ca2d2754dc18dbe1 -size 56393 +oid sha256:bea9c1167e5a43a86c8183d97ff97b8f99aa063799b1b127aa24f44e375eb31f +size 50157 diff --git a/screenshots/de/features.preferences.impl.developer_DeveloperSettingsView_Day_2_de.png b/screenshots/de/features.preferences.impl.developer_DeveloperSettingsView_Day_2_de.png index e77301bcd1..27aeb2fde1 100644 --- a/screenshots/de/features.preferences.impl.developer_DeveloperSettingsView_Day_2_de.png +++ b/screenshots/de/features.preferences.impl.developer_DeveloperSettingsView_Day_2_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:b8991543cf3bfd4e9fbde2a4c217c2980fb4fc4e751f0755d0abf14faea70058 -size 54130 +oid sha256:daac79a6d57fdb849ae8ec8cf8dd404b13d0eb954ec2a5507423305da301c27c +size 47867 diff --git a/screenshots/de/features.preferences.impl.notifications.edit_DefaultNotificationSettingOption_Day_0_de.png b/screenshots/de/features.preferences.impl.notifications.edit_DefaultNotificationSettingOption_Day_0_de.png index 645d300be8..b70b75eaf1 100644 --- a/screenshots/de/features.preferences.impl.notifications.edit_DefaultNotificationSettingOption_Day_0_de.png +++ b/screenshots/de/features.preferences.impl.notifications.edit_DefaultNotificationSettingOption_Day_0_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:7954629e2be92fb6cb230a772c4e8043566ef2e172038e6df6e1df2aed843717 -size 42099 +oid sha256:cbd5c2113a241469a7108d3370838b96e6644f9edc60dad53c9cc9eefe231f24 +size 42820 diff --git a/screenshots/de/features.preferences.impl.notifications.edit_EditDefaultNotificationSettingView_Day_0_de.png b/screenshots/de/features.preferences.impl.notifications.edit_EditDefaultNotificationSettingView_Day_0_de.png index 447b2da868..c120e1bbf5 100644 --- a/screenshots/de/features.preferences.impl.notifications.edit_EditDefaultNotificationSettingView_Day_0_de.png +++ b/screenshots/de/features.preferences.impl.notifications.edit_EditDefaultNotificationSettingView_Day_0_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:e4c514cb287c4d7657ffad6e1fca1482a75f9a5a1bc7787dd8395825ab838b05 -size 50531 +oid sha256:c3d871fa1ee1eebb9f2edac3a75f4a0b06dbc6ec04569e07697d49d603a813a8 +size 50540 diff --git a/screenshots/de/features.preferences.impl.notifications.edit_EditDefaultNotificationSettingView_Day_1_de.png b/screenshots/de/features.preferences.impl.notifications.edit_EditDefaultNotificationSettingView_Day_1_de.png index e5c8d72569..b4cf3e1ad4 100644 --- a/screenshots/de/features.preferences.impl.notifications.edit_EditDefaultNotificationSettingView_Day_1_de.png +++ b/screenshots/de/features.preferences.impl.notifications.edit_EditDefaultNotificationSettingView_Day_1_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:4bcef1537ae1e2158d7af3ed3cd989572d163be743cc0553f95b72fe73ff26d2 -size 51385 +oid sha256:0fe36c7707f907e7d3e8cf7507e536c745fb43725f6d250f3818034f1bfc0411 +size 51263 diff --git a/screenshots/de/features.preferences.impl.notifications.edit_EditDefaultNotificationSettingView_Day_2_de.png b/screenshots/de/features.preferences.impl.notifications.edit_EditDefaultNotificationSettingView_Day_2_de.png index 305a927fd0..186458f2f3 100644 --- a/screenshots/de/features.preferences.impl.notifications.edit_EditDefaultNotificationSettingView_Day_2_de.png +++ b/screenshots/de/features.preferences.impl.notifications.edit_EditDefaultNotificationSettingView_Day_2_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:e53d77389388732c401f9051fdc1d4de5a37f273bb1c3b675d410e49ae74de36 -size 42182 +oid sha256:c2e69cc6fa03bee4c3075257662dd6eb2ee2e6ae2b1e4f1b8fecb66b2654814e +size 42247 diff --git a/screenshots/de/features.preferences.impl.notifications.edit_EditDefaultNotificationSettingView_Day_3_de.png b/screenshots/de/features.preferences.impl.notifications.edit_EditDefaultNotificationSettingView_Day_3_de.png index 1af7afacc4..c91f3101bc 100644 --- a/screenshots/de/features.preferences.impl.notifications.edit_EditDefaultNotificationSettingView_Day_3_de.png +++ b/screenshots/de/features.preferences.impl.notifications.edit_EditDefaultNotificationSettingView_Day_3_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:1e77773635cb55354c3d7d4f9ce35bc3d9f0b5dcc03a6daff19a25195cfb9234 -size 41236 +oid sha256:a856144e5645d4624b888be7b7a0b2d7be3f40b86e01893347f700dc0e1f0acb +size 41411 diff --git a/screenshots/de/features.preferences.impl.notifications.edit_EditDefaultNotificationSettingView_Day_4_de.png b/screenshots/de/features.preferences.impl.notifications.edit_EditDefaultNotificationSettingView_Day_4_de.png index e5de53bbc4..dde4d0b9df 100644 --- a/screenshots/de/features.preferences.impl.notifications.edit_EditDefaultNotificationSettingView_Day_4_de.png +++ b/screenshots/de/features.preferences.impl.notifications.edit_EditDefaultNotificationSettingView_Day_4_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:3cb10e8db83dfa6a36b3f5e23efe98904135f1b1d043f1244749214a548c4806 -size 68493 +oid sha256:1a9373efa48e8989e89972a7b4ce78d63ba4fcab3e6d1f89e999b383dd148ce7 +size 68481 diff --git a/screenshots/de/features.preferences.impl.notifications_NotificationSettingsView_Day_0_de.png b/screenshots/de/features.preferences.impl.notifications_NotificationSettingsView_Day_0_de.png index ffbcdef523..1a072ef681 100644 --- a/screenshots/de/features.preferences.impl.notifications_NotificationSettingsView_Day_0_de.png +++ b/screenshots/de/features.preferences.impl.notifications_NotificationSettingsView_Day_0_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:2e662f3e36c691fcd4ef1f1ae78a8fefd312c1d93ec0b7aadca12dee9ed07219 -size 68020 +oid sha256:8cbb924d55793c11e6d67fe80f447f354ec216a9b5684504342c51f65c5daa55 +size 68022 diff --git a/screenshots/de/features.preferences.impl.notifications_NotificationSettingsView_Day_10_de.png b/screenshots/de/features.preferences.impl.notifications_NotificationSettingsView_Day_10_de.png index 83bee2bfdb..f38589684b 100644 --- a/screenshots/de/features.preferences.impl.notifications_NotificationSettingsView_Day_10_de.png +++ b/screenshots/de/features.preferences.impl.notifications_NotificationSettingsView_Day_10_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:9c23f266c573db33bd933d563f290d915d0e759e371c9e0180035f8c1ca9a30e -size 48610 +oid sha256:f717fc891e9c7f5c5ec7a1ae5025242e4fca4c697c1e1d7a092da2c30b1180dc +size 48666 diff --git a/screenshots/de/features.preferences.impl.notifications_NotificationSettingsView_Day_11_de.png b/screenshots/de/features.preferences.impl.notifications_NotificationSettingsView_Day_11_de.png index 096f418e16..ae4eae6136 100644 --- a/screenshots/de/features.preferences.impl.notifications_NotificationSettingsView_Day_11_de.png +++ b/screenshots/de/features.preferences.impl.notifications_NotificationSettingsView_Day_11_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:3d30ce90a44498f585fa8616b4ef1af3ae71d505dce8dffb7b043dfdfedc0fd2 -size 42758 +oid sha256:33e046c38a374200a1cd8143d2d8ecb9b28fab08d58a9207df5f48d26bc6a61c +size 42847 diff --git a/screenshots/de/features.preferences.impl.notifications_NotificationSettingsView_Day_12_de.png b/screenshots/de/features.preferences.impl.notifications_NotificationSettingsView_Day_12_de.png index 829ef3f49f..e0c8aebf51 100644 --- a/screenshots/de/features.preferences.impl.notifications_NotificationSettingsView_Day_12_de.png +++ b/screenshots/de/features.preferences.impl.notifications_NotificationSettingsView_Day_12_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:69b9f48d4a7eeea156f23172be4796c2e695cf237b09351b68574d537c1981f8 -size 74321 +oid sha256:4143e4ab5b6ed230ce2c7eb87947a9d45415f5bb412d22994921a0e3a0ad45b3 +size 74280 diff --git a/screenshots/de/features.preferences.impl.notifications_NotificationSettingsView_Day_13_de.png b/screenshots/de/features.preferences.impl.notifications_NotificationSettingsView_Day_13_de.png index b212c7f186..9c871496e8 100644 --- a/screenshots/de/features.preferences.impl.notifications_NotificationSettingsView_Day_13_de.png +++ b/screenshots/de/features.preferences.impl.notifications_NotificationSettingsView_Day_13_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:e5ffdb0bd0677cc532acdd67d2d08a74d1dfdf85924ddbd2ff0ecb2a6d1d225b -size 19602 +oid sha256:2f5a50190d6b249f9eb0d8346f69a6492ae10d56fc24bfd5ae78458a753b65a5 +size 19617 diff --git a/screenshots/de/features.preferences.impl.notifications_NotificationSettingsView_Day_1_de.png b/screenshots/de/features.preferences.impl.notifications_NotificationSettingsView_Day_1_de.png index c8ae2f4209..606644fbd2 100644 --- a/screenshots/de/features.preferences.impl.notifications_NotificationSettingsView_Day_1_de.png +++ b/screenshots/de/features.preferences.impl.notifications_NotificationSettingsView_Day_1_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:691154991e241304d8e2f48da468e4b0ed43090bac56e1f2c9f26e0fe900cdbc -size 54663 +oid sha256:40b1622c11a7de63f2585946e6b066ff0dc482d69de3692a257c31374999090d +size 54576 diff --git a/screenshots/de/features.preferences.impl.notifications_NotificationSettingsView_Day_2_de.png b/screenshots/de/features.preferences.impl.notifications_NotificationSettingsView_Day_2_de.png index 4e2b12a1fb..097a820851 100644 --- a/screenshots/de/features.preferences.impl.notifications_NotificationSettingsView_Day_2_de.png +++ b/screenshots/de/features.preferences.impl.notifications_NotificationSettingsView_Day_2_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:5323254db5be8bb61139a8c69ae4fc39c360303aab335043027ca32353c88459 -size 48772 +oid sha256:ddad47b9086ce793d7085eda8aa7847b120e7a8fcd58c45f803ea0549f202790 +size 48853 diff --git a/screenshots/de/features.preferences.impl.notifications_NotificationSettingsView_Day_3_de.png b/screenshots/de/features.preferences.impl.notifications_NotificationSettingsView_Day_3_de.png index 1fa826279e..caeba08e69 100644 --- a/screenshots/de/features.preferences.impl.notifications_NotificationSettingsView_Day_3_de.png +++ b/screenshots/de/features.preferences.impl.notifications_NotificationSettingsView_Day_3_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:33a6bcf39e5c98392ef76a6b179f1cc737096622bc1aa249e2954f3463ccdd47 -size 49917 +oid sha256:bab5d7148aa93d93279ba04125814702664ffc272d29e5c7288661a2fe45d4b7 +size 50021 diff --git a/screenshots/de/features.preferences.impl.notifications_NotificationSettingsView_Day_4_de.png b/screenshots/de/features.preferences.impl.notifications_NotificationSettingsView_Day_4_de.png index 1fa826279e..caeba08e69 100644 --- a/screenshots/de/features.preferences.impl.notifications_NotificationSettingsView_Day_4_de.png +++ b/screenshots/de/features.preferences.impl.notifications_NotificationSettingsView_Day_4_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:33a6bcf39e5c98392ef76a6b179f1cc737096622bc1aa249e2954f3463ccdd47 -size 49917 +oid sha256:bab5d7148aa93d93279ba04125814702664ffc272d29e5c7288661a2fe45d4b7 +size 50021 diff --git a/screenshots/de/features.preferences.impl.notifications_NotificationSettingsView_Day_5_de.png b/screenshots/de/features.preferences.impl.notifications_NotificationSettingsView_Day_5_de.png index c8ae2f4209..606644fbd2 100644 --- a/screenshots/de/features.preferences.impl.notifications_NotificationSettingsView_Day_5_de.png +++ b/screenshots/de/features.preferences.impl.notifications_NotificationSettingsView_Day_5_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:691154991e241304d8e2f48da468e4b0ed43090bac56e1f2c9f26e0fe900cdbc -size 54663 +oid sha256:40b1622c11a7de63f2585946e6b066ff0dc482d69de3692a257c31374999090d +size 54576 diff --git a/screenshots/de/features.preferences.impl.notifications_NotificationSettingsView_Day_6_de.png b/screenshots/de/features.preferences.impl.notifications_NotificationSettingsView_Day_6_de.png index 602c12990d..9bc0942c37 100644 --- a/screenshots/de/features.preferences.impl.notifications_NotificationSettingsView_Day_6_de.png +++ b/screenshots/de/features.preferences.impl.notifications_NotificationSettingsView_Day_6_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:7c10adfcd02d9fb59ab9bf631f79b075b60d643e668a589597a8c700d612ef38 -size 47153 +oid sha256:937d957f5ae3a1eac0255c6b49d66fcef7faf6abcd2454959a6b5d94c526d154 +size 47305 diff --git a/screenshots/de/features.preferences.impl.notifications_NotificationSettingsView_Day_7_de.png b/screenshots/de/features.preferences.impl.notifications_NotificationSettingsView_Day_7_de.png index 66896dc9ed..93dde7fdb7 100644 --- a/screenshots/de/features.preferences.impl.notifications_NotificationSettingsView_Day_7_de.png +++ b/screenshots/de/features.preferences.impl.notifications_NotificationSettingsView_Day_7_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:484b957e2f6299574b5718266584e58b4af3e0c3a64414b9da40bd4a979e62f0 -size 52251 +oid sha256:69ab4f821f3fce81137c6ef4ef73f28402003bd5ef5d89598f91e0c24d47ccb2 +size 52423 diff --git a/screenshots/de/features.preferences.impl.notifications_NotificationSettingsView_Day_8_de.png b/screenshots/de/features.preferences.impl.notifications_NotificationSettingsView_Day_8_de.png index c8ae2f4209..606644fbd2 100644 --- a/screenshots/de/features.preferences.impl.notifications_NotificationSettingsView_Day_8_de.png +++ b/screenshots/de/features.preferences.impl.notifications_NotificationSettingsView_Day_8_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:691154991e241304d8e2f48da468e4b0ed43090bac56e1f2c9f26e0fe900cdbc -size 54663 +oid sha256:40b1622c11a7de63f2585946e6b066ff0dc482d69de3692a257c31374999090d +size 54576 diff --git a/screenshots/de/features.preferences.impl.notifications_NotificationSettingsView_Day_9_de.png b/screenshots/de/features.preferences.impl.notifications_NotificationSettingsView_Day_9_de.png index c8ae2f4209..606644fbd2 100644 --- a/screenshots/de/features.preferences.impl.notifications_NotificationSettingsView_Day_9_de.png +++ b/screenshots/de/features.preferences.impl.notifications_NotificationSettingsView_Day_9_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:691154991e241304d8e2f48da468e4b0ed43090bac56e1f2c9f26e0fe900cdbc -size 54663 +oid sha256:40b1622c11a7de63f2585946e6b066ff0dc482d69de3692a257c31374999090d +size 54576 diff --git a/screenshots/de/features.preferences.impl.root_PreferencesRootViewDark_0_de.png b/screenshots/de/features.preferences.impl.root_PreferencesRootViewDark_0_de.png index 56ab3254da..008fe3e36b 100644 --- a/screenshots/de/features.preferences.impl.root_PreferencesRootViewDark_0_de.png +++ b/screenshots/de/features.preferences.impl.root_PreferencesRootViewDark_0_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:fa9a8c5b045119e98440ab781caad2112298d3c9f415a812da02e6da5e4d7a79 -size 39042 +oid sha256:6d88d7dbbe66c64573df0e237e613be676533628bea149fe69d5631a098f4d18 +size 40286 diff --git a/screenshots/de/features.preferences.impl.root_PreferencesRootViewDark_1_de.png b/screenshots/de/features.preferences.impl.root_PreferencesRootViewDark_1_de.png index 0a0e1fa6e3..096c9d3ada 100644 --- a/screenshots/de/features.preferences.impl.root_PreferencesRootViewDark_1_de.png +++ b/screenshots/de/features.preferences.impl.root_PreferencesRootViewDark_1_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:6ac064c6ad092caad1035b4d028cdca8f9d74cabe523a46a58746f135fb56cc8 -size 38779 +oid sha256:7010114695842036c447c44a91d194fcdb6423d8e6f50a0fe82237e8c896b877 +size 40136 diff --git a/screenshots/de/features.preferences.impl.root_PreferencesRootViewLight_0_de.png b/screenshots/de/features.preferences.impl.root_PreferencesRootViewLight_0_de.png index 3170d71794..94d0c20377 100644 --- a/screenshots/de/features.preferences.impl.root_PreferencesRootViewLight_0_de.png +++ b/screenshots/de/features.preferences.impl.root_PreferencesRootViewLight_0_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:ef2e214a067224f7a7d5381f264e8bdf4fda921add8aa9f2871e773728b19c5c -size 40096 +oid sha256:3236e2feff08195a5c02daca103aa6619132ddaa9f0b7ae0daa7fd048319f91c +size 41311 diff --git a/screenshots/de/features.preferences.impl.root_PreferencesRootViewLight_1_de.png b/screenshots/de/features.preferences.impl.root_PreferencesRootViewLight_1_de.png index 80dee42a6d..925834be9c 100644 --- a/screenshots/de/features.preferences.impl.root_PreferencesRootViewLight_1_de.png +++ b/screenshots/de/features.preferences.impl.root_PreferencesRootViewLight_1_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:ca1dfbd176b0d820d5b43d3b3af662ffd2c87985a4b018815c7c76baf43c5021 -size 40099 +oid sha256:58eabf09ccf68f7d2157a4ce629a2ec5cd3f07ee596712adf5d5eaba0b7d028e +size 41361 diff --git a/screenshots/de/features.preferences.impl.user.editprofile_EditUserProfileView_Day_0_de.png b/screenshots/de/features.preferences.impl.user.editprofile_EditUserProfileView_Day_0_de.png index 085682696f..8563770fd5 100644 --- a/screenshots/de/features.preferences.impl.user.editprofile_EditUserProfileView_Day_0_de.png +++ b/screenshots/de/features.preferences.impl.user.editprofile_EditUserProfileView_Day_0_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:5a6855a2444515fbb98c1a3d01fb6cc0c5a938b9ab032e81d090490a3b1968a2 -size 22254 +oid sha256:1d0db62c839925a48b4487b2b7fa7b597dc8d57aedd81d2f5ea64593f8b66532 +size 22153 diff --git a/screenshots/de/features.preferences.impl.user.editprofile_EditUserProfileView_Day_1_de.png b/screenshots/de/features.preferences.impl.user.editprofile_EditUserProfileView_Day_1_de.png index 9418d19104..6f0ea07dd6 100644 --- a/screenshots/de/features.preferences.impl.user.editprofile_EditUserProfileView_Day_1_de.png +++ b/screenshots/de/features.preferences.impl.user.editprofile_EditUserProfileView_Day_1_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:dd9721a15aaf20c0b1dbcf4a10dc8041cc07ec09f268a9408cc2cdf501ba6f5f -size 70638 +oid sha256:f6707f3df5000f8ee5150b1c6655a4c6ba36746547306435dffbe0e786ec18e1 +size 70520 diff --git a/screenshots/de/features.rageshake.api.crash_CrashDetectionView_Day_0_de.png b/screenshots/de/features.rageshake.api.crash_CrashDetectionView_Day_0_de.png index 11c218360b..68425c4a68 100644 --- a/screenshots/de/features.rageshake.api.crash_CrashDetectionView_Day_0_de.png +++ b/screenshots/de/features.rageshake.api.crash_CrashDetectionView_Day_0_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:2c063991616a5bdee93cf1cc121a4959a225053592a5c0cc3a0bda7416072226 -size 24943 +oid sha256:8eaaeddb4da0676da125e39d15ee60c37ba37e46add4b2c4fd16015a74450ec0 +size 24397 diff --git a/screenshots/de/features.rageshake.api.detection_RageshakeDialogContent_Day_0_de.png b/screenshots/de/features.rageshake.api.detection_RageshakeDialogContent_Day_0_de.png index 348ee35044..d0f89b8d0d 100644 --- a/screenshots/de/features.rageshake.api.detection_RageshakeDialogContent_Day_0_de.png +++ b/screenshots/de/features.rageshake.api.detection_RageshakeDialogContent_Day_0_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:120d0f6f4d2221e405544688c16688523a0a5fb5fa2ff789758482cc2a3aefbf -size 29117 +oid sha256:99659666c78a2c1e29d73cef4996f3bf6fee971673d8e495b8ad9b0033df153c +size 28573 diff --git a/screenshots/de/features.rageshake.api.preferences_RageshakePreferencesView_Day_0_de.png b/screenshots/de/features.rageshake.api.preferences_RageshakePreferencesView_Day_0_de.png index 93dd4377fb..6161fc6377 100644 --- a/screenshots/de/features.rageshake.api.preferences_RageshakePreferencesView_Day_0_de.png +++ b/screenshots/de/features.rageshake.api.preferences_RageshakePreferencesView_Day_0_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:4be722c2311312e50f319c0d38422846b4dcfd72791462a7d24ec152eb476afa -size 19689 +oid sha256:abdf9963b18ab4012ef0ac5cca08f63c9c786ba5ec1076a970af5e350f50bdb7 +size 20382 diff --git a/screenshots/de/features.rageshake.impl.bugreport_BugReportView_Day_0_de.png b/screenshots/de/features.rageshake.impl.bugreport_BugReportView_Day_0_de.png index f9336cfa38..d557be2089 100644 --- a/screenshots/de/features.rageshake.impl.bugreport_BugReportView_Day_0_de.png +++ b/screenshots/de/features.rageshake.impl.bugreport_BugReportView_Day_0_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:26bd919aa064af2fd0b66120a7a18b1d942e629343ea73789c23d8b96eff581c -size 82179 +oid sha256:31b5fcb9819032953044a7d89a0152e9b3aaefcfd228d56c89c56aa87f6bcdfe +size 82237 diff --git a/screenshots/de/features.rageshake.impl.bugreport_BugReportView_Day_1_de.png b/screenshots/de/features.rageshake.impl.bugreport_BugReportView_Day_1_de.png index f418041a36..32e0d7c717 100644 --- a/screenshots/de/features.rageshake.impl.bugreport_BugReportView_Day_1_de.png +++ b/screenshots/de/features.rageshake.impl.bugreport_BugReportView_Day_1_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:28baf0d6180bf3fa723152612499098c5489d746c419be445d7954c72c4623d5 -size 88463 +oid sha256:4d07389f215f10d17ed91a28dff47fdf463b74229ab6b923f634161c0366d973 +size 88478 diff --git a/screenshots/de/features.rageshake.impl.bugreport_BugReportView_Day_2_de.png b/screenshots/de/features.rageshake.impl.bugreport_BugReportView_Day_2_de.png index 1e9d761258..b52a5c9119 100644 --- a/screenshots/de/features.rageshake.impl.bugreport_BugReportView_Day_2_de.png +++ b/screenshots/de/features.rageshake.impl.bugreport_BugReportView_Day_2_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:00c70fff807ae67d65b909a98dd270108ffa92a6c5ba5351353e276db6547b18 -size 77891 +oid sha256:b02411da769b90c38aea5f270971a98bdbddf3656da171cda7d1f82bd210c33a +size 78011 diff --git a/screenshots/de/features.rageshake.impl.bugreport_BugReportView_Day_3_de.png b/screenshots/de/features.rageshake.impl.bugreport_BugReportView_Day_3_de.png index f9336cfa38..d557be2089 100644 --- a/screenshots/de/features.rageshake.impl.bugreport_BugReportView_Day_3_de.png +++ b/screenshots/de/features.rageshake.impl.bugreport_BugReportView_Day_3_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:26bd919aa064af2fd0b66120a7a18b1d942e629343ea73789c23d8b96eff581c -size 82179 +oid sha256:31b5fcb9819032953044a7d89a0152e9b3aaefcfd228d56c89c56aa87f6bcdfe +size 82237 diff --git a/screenshots/de/features.rageshake.impl.bugreport_BugReportView_Day_4_de.png b/screenshots/de/features.rageshake.impl.bugreport_BugReportView_Day_4_de.png index 249198d34c..ae6dd1c6c2 100644 --- a/screenshots/de/features.rageshake.impl.bugreport_BugReportView_Day_4_de.png +++ b/screenshots/de/features.rageshake.impl.bugreport_BugReportView_Day_4_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:fe9dea15ec1c9b8f00d5acfb7ea96d49a8e74c02abd538d1d7461a8ccb20721f -size 59337 +oid sha256:ef30e0a39c96edf396e21260fbe9f733dd40c9bc81ceb1d4c9cfcaed5ff03b61 +size 59262 diff --git a/screenshots/de/features.reportroom.impl_ReportRoomView_Day_0_de.png b/screenshots/de/features.reportroom.impl_ReportRoomView_Day_0_de.png index 739d14a5e9..d58ffa1db9 100644 --- a/screenshots/de/features.reportroom.impl_ReportRoomView_Day_0_de.png +++ b/screenshots/de/features.reportroom.impl_ReportRoomView_Day_0_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:f3b1e80e6d7e3cd377883da370017cc959d0b8d7fff3894ccff3cbe79fdb1b54 -size 34374 +oid sha256:04ad845cd8bacebd68b245d597d0f25da92998b938b1fd4d7cf5e13e8d5e3dc3 +size 34184 diff --git a/screenshots/de/features.reportroom.impl_ReportRoomView_Day_1_de.png b/screenshots/de/features.reportroom.impl_ReportRoomView_Day_1_de.png index 49568a385f..488c17c778 100644 --- a/screenshots/de/features.reportroom.impl_ReportRoomView_Day_1_de.png +++ b/screenshots/de/features.reportroom.impl_ReportRoomView_Day_1_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:497fc391210a0cd4dfe3e2573316e08af9472dd7cc8e93dc0dd9bbd1894b27e7 -size 34179 +oid sha256:30a8a1ceda098da2ae406dce8cb0df6158f9311fd6a0b88967b992cee5e02b14 +size 33931 diff --git a/screenshots/de/features.reportroom.impl_ReportRoomView_Day_2_de.png b/screenshots/de/features.reportroom.impl_ReportRoomView_Day_2_de.png index 872123f509..f258693f01 100644 --- a/screenshots/de/features.reportroom.impl_ReportRoomView_Day_2_de.png +++ b/screenshots/de/features.reportroom.impl_ReportRoomView_Day_2_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:fb7ebd6e806d621083e651ba4158d55e9ffd05dbbcba85acb1e5d46196e1926f -size 33971 +oid sha256:3e63383829659057c7e7d776b2cecdef1d401b89bd733597ccf287eb019407a4 +size 33800 diff --git a/screenshots/de/features.reportroom.impl_ReportRoomView_Day_3_de.png b/screenshots/de/features.reportroom.impl_ReportRoomView_Day_3_de.png index 708590ec5b..ea59eff8c5 100644 --- a/screenshots/de/features.reportroom.impl_ReportRoomView_Day_3_de.png +++ b/screenshots/de/features.reportroom.impl_ReportRoomView_Day_3_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:4f371558881fb39504af28ab5633c1458df2c1352c2cc89710220b3601a4a6e5 -size 30634 +oid sha256:005913de31e6b631050bc62349ec032ec2483e8e60e318356b9a733e3360e132 +size 30514 diff --git a/screenshots/de/features.reportroom.impl_ReportRoomView_Day_4_de.png b/screenshots/de/features.reportroom.impl_ReportRoomView_Day_4_de.png index 0ff8944f45..d47f6cf4e1 100644 --- a/screenshots/de/features.reportroom.impl_ReportRoomView_Day_4_de.png +++ b/screenshots/de/features.reportroom.impl_ReportRoomView_Day_4_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:67645229b7efbe53411ebaf1e5fe662d9204630a6fa9edd6b5a3d2f565d2c690 -size 33315 +oid sha256:d75898aa8d869e3fe094347fa113b9a4c6d048b27a7a438d1a53dc77b6c528a2 +size 33382 diff --git a/screenshots/de/features.roomaliasresolver.impl_RoomAliasResolverView_Day_1_de.png b/screenshots/de/features.roomaliasresolver.impl_RoomAliasResolverView_Day_1_de.png index e3c6c5bff3..4e83319d93 100644 --- a/screenshots/de/features.roomaliasresolver.impl_RoomAliasResolverView_Day_1_de.png +++ b/screenshots/de/features.roomaliasresolver.impl_RoomAliasResolverView_Day_1_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:787f2a7755a4675f3ca3e897553fdf83bc11dcb0357d0bd2615dfc8e52c47cb3 -size 34939 +oid sha256:27398dbb52e4966b6e83838bb6316d62244419988e7b322dc36b3b1a1d821b96 +size 35003 diff --git a/screenshots/de/features.roomaliasresolver.impl_RoomAliasResolverView_Day_2_de.png b/screenshots/de/features.roomaliasresolver.impl_RoomAliasResolverView_Day_2_de.png index 5a362ae534..10383102b4 100644 --- a/screenshots/de/features.roomaliasresolver.impl_RoomAliasResolverView_Day_2_de.png +++ b/screenshots/de/features.roomaliasresolver.impl_RoomAliasResolverView_Day_2_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:1a35596ef35cd3fac5b9deb82df89b7066949c8c272bcb484c6ca52434b61a06 -size 27031 +oid sha256:ed6d3b982c3a7c7b50127e5abce50fdbfcf5e83b65384a78a37589ad02347b59 +size 27025 diff --git a/screenshots/de/features.roomdetails.impl.edit_RoomDetailsEditView_Day_0_de.png b/screenshots/de/features.roomdetails.impl.edit_RoomDetailsEditView_Day_0_de.png index 7b417a4ff2..8d8cb08feb 100644 --- a/screenshots/de/features.roomdetails.impl.edit_RoomDetailsEditView_Day_0_de.png +++ b/screenshots/de/features.roomdetails.impl.edit_RoomDetailsEditView_Day_0_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:177a5d2d49d1c7bc27be8a03371b074e98cb163c3fb2bd996ef34d58a58e142d -size 29787 +oid sha256:440c8ac518d9f29d4090c7a8a3760c7e9f5b2701b7fd8e7644a8bd5b605b6cdf +size 29874 diff --git a/screenshots/de/features.roomdetails.impl.edit_RoomDetailsEditView_Day_1_de.png b/screenshots/de/features.roomdetails.impl.edit_RoomDetailsEditView_Day_1_de.png index e7c17897a3..ecafe48b38 100644 --- a/screenshots/de/features.roomdetails.impl.edit_RoomDetailsEditView_Day_1_de.png +++ b/screenshots/de/features.roomdetails.impl.edit_RoomDetailsEditView_Day_1_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:98f07fe6746bc81551919c3924deb04f61f999f640371c35ac10fd3a9957c678 -size 24101 +oid sha256:6a97b8867c2fcf6857bf1dc1eb6666a6ea3f44b0b25bed421c68c4b5bd251424 +size 24340 diff --git a/screenshots/de/features.roomdetails.impl.edit_RoomDetailsEditView_Day_2_de.png b/screenshots/de/features.roomdetails.impl.edit_RoomDetailsEditView_Day_2_de.png index d9179dd17e..b39299ae36 100644 --- a/screenshots/de/features.roomdetails.impl.edit_RoomDetailsEditView_Day_2_de.png +++ b/screenshots/de/features.roomdetails.impl.edit_RoomDetailsEditView_Day_2_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:12bb9ce3e39f0734d79f9c877545ca9eeccab4c720ff21152b350bedf2194992 -size 30951 +oid sha256:fa77df2826f0ca4652bb8350015d7b0a4415987dd8c04c3eee9b990ff8d10787 +size 31005 diff --git a/screenshots/de/features.roomdetails.impl.edit_RoomDetailsEditView_Day_3_de.png b/screenshots/de/features.roomdetails.impl.edit_RoomDetailsEditView_Day_3_de.png index f46e14fb7b..92428ea447 100644 --- a/screenshots/de/features.roomdetails.impl.edit_RoomDetailsEditView_Day_3_de.png +++ b/screenshots/de/features.roomdetails.impl.edit_RoomDetailsEditView_Day_3_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:1b73e62309cae93bc83abd6f5015cf44f9b0c18eff266da9bc36be85576477c6 -size 55416 +oid sha256:baca20b567aba156274713fcb2cb2c8d1b8c8dbe2a601307cb50406a8f283432 +size 55453 diff --git a/screenshots/de/features.roomdetails.impl.edit_RoomDetailsEditView_Day_4_de.png b/screenshots/de/features.roomdetails.impl.edit_RoomDetailsEditView_Day_4_de.png index d95d3929e6..1d1883cfef 100644 --- a/screenshots/de/features.roomdetails.impl.edit_RoomDetailsEditView_Day_4_de.png +++ b/screenshots/de/features.roomdetails.impl.edit_RoomDetailsEditView_Day_4_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:36e919bf716639ddd32464d3b864891e4bc18fcc5a504f405d44a811b9961fa3 -size 29896 +oid sha256:0cf6507a7e1faf2810d78975cd1a57c60f26947756c15092f710f97d46ac900b +size 29903 diff --git a/screenshots/de/features.roomdetails.impl.edit_RoomDetailsEditView_Day_5_de.png b/screenshots/de/features.roomdetails.impl.edit_RoomDetailsEditView_Day_5_de.png index c9d1e579c0..958f7fa7b5 100644 --- a/screenshots/de/features.roomdetails.impl.edit_RoomDetailsEditView_Day_5_de.png +++ b/screenshots/de/features.roomdetails.impl.edit_RoomDetailsEditView_Day_5_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:a8f5d2ee21ff6279f35a2772f5696db3fde1b7a14719002e70b6a0560a5ba324 -size 29940 +oid sha256:7bac438b9ad8ecdd3e7564b789b60be0ed10f2457bbdd4cf6dbe08a3694e5dca +size 29996 diff --git a/screenshots/de/features.roomdetails.impl.edit_RoomDetailsEditView_Day_6_de.png b/screenshots/de/features.roomdetails.impl.edit_RoomDetailsEditView_Day_6_de.png index c4da5a2374..96d844b747 100644 --- a/screenshots/de/features.roomdetails.impl.edit_RoomDetailsEditView_Day_6_de.png +++ b/screenshots/de/features.roomdetails.impl.edit_RoomDetailsEditView_Day_6_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:f3f43373818117ea406135038b04e4529a1f343286e5d7bacab08b9e69e5204f -size 27098 +oid sha256:9058425823abd5abadaafc1a56029bb875c908d2934595fd989e8ce33c1692c9 +size 27067 diff --git a/screenshots/de/features.roomdetails.impl.edit_RoomDetailsEditView_Day_7_de.png b/screenshots/de/features.roomdetails.impl.edit_RoomDetailsEditView_Day_7_de.png index 1a351e7e80..5894ef3456 100644 --- a/screenshots/de/features.roomdetails.impl.edit_RoomDetailsEditView_Day_7_de.png +++ b/screenshots/de/features.roomdetails.impl.edit_RoomDetailsEditView_Day_7_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:3c89cc3b86ddea6373e4bf0ca8021a03faac3f40104029cf3118755d75c8ad0e -size 29676 +oid sha256:9c5d85fbb65cdfb9737b610b42f3577c0897a7e30b4a13c3251c7e54545f7252 +size 29662 diff --git a/screenshots/de/features.roomdetails.impl.invite_RoomInviteMembersView_Day_0_de.png b/screenshots/de/features.roomdetails.impl.invite_RoomInviteMembersView_Day_0_de.png index af77b3d916..d47cbc1543 100644 --- a/screenshots/de/features.roomdetails.impl.invite_RoomInviteMembersView_Day_0_de.png +++ b/screenshots/de/features.roomdetails.impl.invite_RoomInviteMembersView_Day_0_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:016833cdfd1d7dc4b50766a611fb90c1389edb634139d13f5aba456f0eddcb8e -size 14698 +oid sha256:93b580abe330752636e76451fa670ac637b6d365537a478c9ef9c8994d81550b +size 8886 diff --git a/screenshots/de/features.roomdetails.impl.invite_RoomInviteMembersView_Day_1_de.png b/screenshots/de/features.roomdetails.impl.invite_RoomInviteMembersView_Day_1_de.png index ea306c4dc7..e202093b7b 100644 --- a/screenshots/de/features.roomdetails.impl.invite_RoomInviteMembersView_Day_1_de.png +++ b/screenshots/de/features.roomdetails.impl.invite_RoomInviteMembersView_Day_1_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:3368acb55a193d98ff2208c9d2e3bb1b1214c61ba4468a88a3f9049ac5db2fc6 -size 25458 +oid sha256:52aaf6c726ae33832da29cac4f301a682f1716fd0c4c5959bcf738eb4f6c5c3f +size 8747 diff --git a/screenshots/de/features.roomdetails.impl.invite_RoomInviteMembersView_Day_2_de.png b/screenshots/de/features.roomdetails.impl.invite_RoomInviteMembersView_Day_2_de.png index 317117e793..d47cbc1543 100644 --- a/screenshots/de/features.roomdetails.impl.invite_RoomInviteMembersView_Day_2_de.png +++ b/screenshots/de/features.roomdetails.impl.invite_RoomInviteMembersView_Day_2_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:266041ac236302fef0f1f6b40f0271574bbe8a34d4f56a156c1af00e54ed58be -size 11816 +oid sha256:93b580abe330752636e76451fa670ac637b6d365537a478c9ef9c8994d81550b +size 8886 diff --git a/screenshots/de/features.roomdetails.impl.invite_RoomInviteMembersView_Day_3_de.png b/screenshots/de/features.roomdetails.impl.invite_RoomInviteMembersView_Day_3_de.png deleted file mode 100644 index faf1062c3b..0000000000 --- a/screenshots/de/features.roomdetails.impl.invite_RoomInviteMembersView_Day_3_de.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:22c5455db75e82a22e2af5a5a420abe8e8c622cfa42a92a920620ae2c8f20ee7 -size 23020 diff --git a/screenshots/de/features.roomdetails.impl.invite_RoomInviteMembersView_Day_4_de.png b/screenshots/de/features.roomdetails.impl.invite_RoomInviteMembersView_Day_4_de.png deleted file mode 100644 index e08d86610c..0000000000 --- a/screenshots/de/features.roomdetails.impl.invite_RoomInviteMembersView_Day_4_de.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:fa968b2e0d72f9c66be0dd39b5b2ca33148bcd60b9bf9f6987b1a867c8d9d579 -size 15082 diff --git a/screenshots/de/features.roomdetails.impl.invite_RoomInviteMembersView_Day_5_de.png b/screenshots/de/features.roomdetails.impl.invite_RoomInviteMembersView_Day_5_de.png deleted file mode 100644 index 19d8f833f4..0000000000 --- a/screenshots/de/features.roomdetails.impl.invite_RoomInviteMembersView_Day_5_de.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:d00b52b81391dc4770e6850dc30a20702081b4db3fa39a38d6a33d5ad7d914c6 -size 44038 diff --git a/screenshots/de/features.roomdetails.impl.invite_RoomInviteMembersView_Day_6_de.png b/screenshots/de/features.roomdetails.impl.invite_RoomInviteMembersView_Day_6_de.png deleted file mode 100644 index cd416194a7..0000000000 --- a/screenshots/de/features.roomdetails.impl.invite_RoomInviteMembersView_Day_6_de.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:45804afdb362b238baf689feabf6aee00e5c0cf766ab41941097df48114cabaa -size 43381 diff --git a/screenshots/de/features.roomdetails.impl.invite_RoomInviteMembersView_Day_7_de.png b/screenshots/de/features.roomdetails.impl.invite_RoomInviteMembersView_Day_7_de.png deleted file mode 100644 index 9149bb8ac9..0000000000 --- a/screenshots/de/features.roomdetails.impl.invite_RoomInviteMembersView_Day_7_de.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:8d946653a9a52e8a92b0c88dce6fb0cf52950fb54fc5ea8687044426b8df0833 -size 35729 diff --git a/screenshots/de/features.roomdetails.impl.members_RoomMemberListViewBanned_Day_0_de.png b/screenshots/de/features.roomdetails.impl.members_RoomMemberListViewBanned_Day_0_de.png index 2b58644d33..1818e969cd 100644 --- a/screenshots/de/features.roomdetails.impl.members_RoomMemberListViewBanned_Day_0_de.png +++ b/screenshots/de/features.roomdetails.impl.members_RoomMemberListViewBanned_Day_0_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:6e1b139382c574ef78bcedd2107378ee3e4e395a07bc888e11192bac270aafee -size 12284 +oid sha256:3a1c48e7b690b44d5e2fea3a6a0538899269a663497fd4247196fda09582c426 +size 12289 diff --git a/screenshots/de/features.roomdetails.impl.members_RoomMemberListViewBanned_Day_1_de.png b/screenshots/de/features.roomdetails.impl.members_RoomMemberListViewBanned_Day_1_de.png index c7ee196df8..e288ea7c25 100644 --- a/screenshots/de/features.roomdetails.impl.members_RoomMemberListViewBanned_Day_1_de.png +++ b/screenshots/de/features.roomdetails.impl.members_RoomMemberListViewBanned_Day_1_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:c263b0b8fd4c6bdf53118aa5ed06ef919ae5973ed370580cd3d6290c455f9c39 -size 12524 +oid sha256:44edbf94083aff6c3e43d58315ed1909fa826f779194b00dcf6174de781e1343 +size 12528 diff --git a/screenshots/de/features.roomdetails.impl.members_RoomMemberListViewBanned_Day_2_de.png b/screenshots/de/features.roomdetails.impl.members_RoomMemberListViewBanned_Day_2_de.png index 2b58644d33..1818e969cd 100644 --- a/screenshots/de/features.roomdetails.impl.members_RoomMemberListViewBanned_Day_2_de.png +++ b/screenshots/de/features.roomdetails.impl.members_RoomMemberListViewBanned_Day_2_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:6e1b139382c574ef78bcedd2107378ee3e4e395a07bc888e11192bac270aafee -size 12284 +oid sha256:3a1c48e7b690b44d5e2fea3a6a0538899269a663497fd4247196fda09582c426 +size 12289 diff --git a/screenshots/de/features.roomdetails.impl.members_RoomMemberListView_Day_0_de.png b/screenshots/de/features.roomdetails.impl.members_RoomMemberListView_Day_0_de.png index f007819735..694525911a 100644 --- a/screenshots/de/features.roomdetails.impl.members_RoomMemberListView_Day_0_de.png +++ b/screenshots/de/features.roomdetails.impl.members_RoomMemberListView_Day_0_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:0b8333deb905a5e1431597f59fe58b14591cb2fc424c80804fbb1ce340ce8bb8 -size 46941 +oid sha256:9f46825e26cc45cbad2bf8ac0e7fd6bd9b2673d3f4501fc207ec7615177d38f6 +size 46967 diff --git a/screenshots/de/features.roomdetails.impl.members_RoomMemberListView_Day_1_de.png b/screenshots/de/features.roomdetails.impl.members_RoomMemberListView_Day_1_de.png index c2342b8b0b..5e8894adeb 100644 --- a/screenshots/de/features.roomdetails.impl.members_RoomMemberListView_Day_1_de.png +++ b/screenshots/de/features.roomdetails.impl.members_RoomMemberListView_Day_1_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:dbedf5fc4141f6aa00097a41da7ce5becde0f005b2424fd7f9eeba566da4e846 -size 47986 +oid sha256:b33c58b81a6d8f0211676b39174f27b8c01e174e4e542ce6399b56a0badfafa5 +size 48117 diff --git a/screenshots/de/features.roomdetails.impl.members_RoomMemberListView_Day_2_de.png b/screenshots/de/features.roomdetails.impl.members_RoomMemberListView_Day_2_de.png index c7ee196df8..e288ea7c25 100644 --- a/screenshots/de/features.roomdetails.impl.members_RoomMemberListView_Day_2_de.png +++ b/screenshots/de/features.roomdetails.impl.members_RoomMemberListView_Day_2_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:c263b0b8fd4c6bdf53118aa5ed06ef919ae5973ed370580cd3d6290c455f9c39 -size 12524 +oid sha256:44edbf94083aff6c3e43d58315ed1909fa826f779194b00dcf6174de781e1343 +size 12528 diff --git a/screenshots/de/features.roomdetails.impl.members_RoomMemberListView_Day_3_de.png b/screenshots/de/features.roomdetails.impl.members_RoomMemberListView_Day_3_de.png index 4bdd05fb18..918c13da80 100644 --- a/screenshots/de/features.roomdetails.impl.members_RoomMemberListView_Day_3_de.png +++ b/screenshots/de/features.roomdetails.impl.members_RoomMemberListView_Day_3_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:1fc655569ee74f678cf7355bc2cd69349d119c5bee233604f4c11815766371e8 -size 13876 +oid sha256:b3ac0f974d8d56b3ecc34ac6fbb0f033975c0ed513cb6e05f610d4a95ebccd8f +size 13860 diff --git a/screenshots/de/features.roomdetails.impl.members_RoomMemberListView_Day_4_de.png b/screenshots/de/features.roomdetails.impl.members_RoomMemberListView_Day_4_de.png index c7ee196df8..e288ea7c25 100644 --- a/screenshots/de/features.roomdetails.impl.members_RoomMemberListView_Day_4_de.png +++ b/screenshots/de/features.roomdetails.impl.members_RoomMemberListView_Day_4_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:c263b0b8fd4c6bdf53118aa5ed06ef919ae5973ed370580cd3d6290c455f9c39 -size 12524 +oid sha256:44edbf94083aff6c3e43d58315ed1909fa826f779194b00dcf6174de781e1343 +size 12528 diff --git a/screenshots/de/features.roomdetails.impl.members_RoomMemberListView_Day_5_de.png b/screenshots/de/features.roomdetails.impl.members_RoomMemberListView_Day_5_de.png index d96220d923..6a4ec71b9a 100644 --- a/screenshots/de/features.roomdetails.impl.members_RoomMemberListView_Day_5_de.png +++ b/screenshots/de/features.roomdetails.impl.members_RoomMemberListView_Day_5_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:646f754dc9a02989008e469b2fbc8928bd12492c3de4b108c8a64508aae16ad2 -size 7970 +oid sha256:2297fbeb63dbbf5281266f90015e047528e3287c923e2207af061458fd12897e +size 7929 diff --git a/screenshots/de/features.roomdetails.impl.members_RoomMemberListView_Day_7_de.png b/screenshots/de/features.roomdetails.impl.members_RoomMemberListView_Day_7_de.png index 52c1896d28..898cc21361 100644 --- a/screenshots/de/features.roomdetails.impl.members_RoomMemberListView_Day_7_de.png +++ b/screenshots/de/features.roomdetails.impl.members_RoomMemberListView_Day_7_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:59a0d786c26f707d3db071f2845fd95b6762e33b37ebe9b9ab1b696d6c3b5452 -size 25504 +oid sha256:22cc7a6b738474421771493f9dc9384b0e9724218abcfb6a6a3456cd69def558 +size 25533 diff --git a/screenshots/de/features.roomdetails.impl.members_RoomMemberListView_Day_8_de.png b/screenshots/de/features.roomdetails.impl.members_RoomMemberListView_Day_8_de.png index 5e8d68e7ac..8397efd92e 100644 --- a/screenshots/de/features.roomdetails.impl.members_RoomMemberListView_Day_8_de.png +++ b/screenshots/de/features.roomdetails.impl.members_RoomMemberListView_Day_8_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:8342dae1c9b3769d867d856ecdc3b3302fa5cd94e80c6ad9ceddf482968305f1 -size 12343 +oid sha256:31de17fb1f44c06ffd9ce5d7e59c91b7da986720f90074802b1b566b55859186 +size 12303 diff --git a/screenshots/de/features.roomdetails.impl.members_RoomMemberListView_Day_9_de.png b/screenshots/de/features.roomdetails.impl.members_RoomMemberListView_Day_9_de.png index 9886eb1f07..425107966e 100644 --- a/screenshots/de/features.roomdetails.impl.members_RoomMemberListView_Day_9_de.png +++ b/screenshots/de/features.roomdetails.impl.members_RoomMemberListView_Day_9_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:7f29deb95619350659f5c1932c72d06edb952c06bb894d2afec87282503ce266 -size 21647 +oid sha256:736b973e4177726e15beee8377efc9e61db4e08198aef5d9c41873e653959f51 +size 21663 diff --git a/screenshots/de/features.roomdetails.impl.notificationsettings_RoomNotificationSettingsOption_Day_0_de.png b/screenshots/de/features.roomdetails.impl.notificationsettings_RoomNotificationSettingsOption_Day_0_de.png index f7863fc9cb..ee700f5a30 100644 --- a/screenshots/de/features.roomdetails.impl.notificationsettings_RoomNotificationSettingsOption_Day_0_de.png +++ b/screenshots/de/features.roomdetails.impl.notificationsettings_RoomNotificationSettingsOption_Day_0_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:bff8a7beb2b60b0cd089a84c514757d99bdc3eabd672d02fa47aabcb9260a4d6 -size 36108 +oid sha256:298d97f3ad8fc474954ddbd9bc729ef1c0c3d5ecd57eba99be07d12ffa509d9b +size 36770 diff --git a/screenshots/de/features.roomdetails.impl.notificationsettings_RoomNotificationSettingsView_Day_0_de.png b/screenshots/de/features.roomdetails.impl.notificationsettings_RoomNotificationSettingsView_Day_0_de.png index 4a21c88bd0..9d04c2dadc 100644 --- a/screenshots/de/features.roomdetails.impl.notificationsettings_RoomNotificationSettingsView_Day_0_de.png +++ b/screenshots/de/features.roomdetails.impl.notificationsettings_RoomNotificationSettingsView_Day_0_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:348e60ce0a5e1f0ae233ccd31e7737c383d8982726972c90f9f5bcf576b9dfde -size 44126 +oid sha256:0e5a70c38ed47672d570d9afdd3b8e4b188a9ab90cd2983299c10c7f765a3582 +size 44232 diff --git a/screenshots/de/features.roomdetails.impl.notificationsettings_RoomNotificationSettingsView_Day_1_de.png b/screenshots/de/features.roomdetails.impl.notificationsettings_RoomNotificationSettingsView_Day_1_de.png index 4bdd14e23b..66f42d4061 100644 --- a/screenshots/de/features.roomdetails.impl.notificationsettings_RoomNotificationSettingsView_Day_1_de.png +++ b/screenshots/de/features.roomdetails.impl.notificationsettings_RoomNotificationSettingsView_Day_1_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:9691b46c25e47bf856aa3c6aff42746c732c2e74af40348d5904c32c07dbb2aa -size 46429 +oid sha256:5ce17afad842d4a3a2177c646a686ddbdfaf8d4013f65f74610b30acb7865079 +size 46465 diff --git a/screenshots/de/features.roomdetails.impl.notificationsettings_RoomNotificationSettingsView_Day_2_de.png b/screenshots/de/features.roomdetails.impl.notificationsettings_RoomNotificationSettingsView_Day_2_de.png index 20037ff02f..5c4bbbb0f3 100644 --- a/screenshots/de/features.roomdetails.impl.notificationsettings_RoomNotificationSettingsView_Day_2_de.png +++ b/screenshots/de/features.roomdetails.impl.notificationsettings_RoomNotificationSettingsView_Day_2_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:596170a7b2c00ac6eb404480a1759a1906922684c04bc7c2f43792c7bb05ae53 -size 37312 +oid sha256:b4a23bbb8fcac3c6a76ca3c4d9d966d49d07d3822a6a35706ea2a6d4bf47f78c +size 37527 diff --git a/screenshots/de/features.roomdetails.impl.notificationsettings_RoomNotificationSettingsView_Day_3_de.png b/screenshots/de/features.roomdetails.impl.notificationsettings_RoomNotificationSettingsView_Day_3_de.png index 0179ead8fb..72e63d1005 100644 --- a/screenshots/de/features.roomdetails.impl.notificationsettings_RoomNotificationSettingsView_Day_3_de.png +++ b/screenshots/de/features.roomdetails.impl.notificationsettings_RoomNotificationSettingsView_Day_3_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:f749d6fa0d163cf7375a7b541ce19972ab53d66d4c85e0aa19fd9ca74ecb6cf4 -size 39354 +oid sha256:e06a1b371ea46d2c496c3a6bf792a41f4d4d01cc27cda204574020b483d2b94d +size 39676 diff --git a/screenshots/de/features.roomdetails.impl.notificationsettings_RoomNotificationSettingsView_Day_4_de.png b/screenshots/de/features.roomdetails.impl.notificationsettings_RoomNotificationSettingsView_Day_4_de.png index 20037ff02f..5c4bbbb0f3 100644 --- a/screenshots/de/features.roomdetails.impl.notificationsettings_RoomNotificationSettingsView_Day_4_de.png +++ b/screenshots/de/features.roomdetails.impl.notificationsettings_RoomNotificationSettingsView_Day_4_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:596170a7b2c00ac6eb404480a1759a1906922684c04bc7c2f43792c7bb05ae53 -size 37312 +oid sha256:b4a23bbb8fcac3c6a76ca3c4d9d966d49d07d3822a6a35706ea2a6d4bf47f78c +size 37527 diff --git a/screenshots/de/features.roomdetails.impl.notificationsettings_RoomNotificationSettingsView_Day_5_de.png b/screenshots/de/features.roomdetails.impl.notificationsettings_RoomNotificationSettingsView_Day_5_de.png index 0179ead8fb..72e63d1005 100644 --- a/screenshots/de/features.roomdetails.impl.notificationsettings_RoomNotificationSettingsView_Day_5_de.png +++ b/screenshots/de/features.roomdetails.impl.notificationsettings_RoomNotificationSettingsView_Day_5_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:f749d6fa0d163cf7375a7b541ce19972ab53d66d4c85e0aa19fd9ca74ecb6cf4 -size 39354 +oid sha256:e06a1b371ea46d2c496c3a6bf792a41f4d4d01cc27cda204574020b483d2b94d +size 39676 diff --git a/screenshots/de/features.roomdetails.impl.notificationsettings_RoomNotificationSettingsView_Day_6_de.png b/screenshots/de/features.roomdetails.impl.notificationsettings_RoomNotificationSettingsView_Day_6_de.png index 4a21c88bd0..9d04c2dadc 100644 --- a/screenshots/de/features.roomdetails.impl.notificationsettings_RoomNotificationSettingsView_Day_6_de.png +++ b/screenshots/de/features.roomdetails.impl.notificationsettings_RoomNotificationSettingsView_Day_6_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:348e60ce0a5e1f0ae233ccd31e7737c383d8982726972c90f9f5bcf576b9dfde -size 44126 +oid sha256:0e5a70c38ed47672d570d9afdd3b8e4b188a9ab90cd2983299c10c7f765a3582 +size 44232 diff --git a/screenshots/de/features.roomdetails.impl.notificationsettings_UserDefinedRoomNotificationSettingsView_Day_0_de.png b/screenshots/de/features.roomdetails.impl.notificationsettings_UserDefinedRoomNotificationSettingsView_Day_0_de.png index 19ab9d5d5f..b3fd6da7c2 100644 --- a/screenshots/de/features.roomdetails.impl.notificationsettings_UserDefinedRoomNotificationSettingsView_Day_0_de.png +++ b/screenshots/de/features.roomdetails.impl.notificationsettings_UserDefinedRoomNotificationSettingsView_Day_0_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:62831e4322a6b712389809f630176b18641a05bc3ca73b93aaf7b0ebd0de521e -size 25958 +oid sha256:02ee83247e54bb39de7b3bc5e69e3bec21f4b45e374c7e5002a4612104e34025 +size 26304 diff --git a/screenshots/de/features.roomdetails.impl.rolesandpermissions.changeroles_ChangeRolesView_Day_0_de.png b/screenshots/de/features.roomdetails.impl.rolesandpermissions.changeroles_ChangeRolesView_Day_0_de.png deleted file mode 100644 index ed7482c50a..0000000000 --- a/screenshots/de/features.roomdetails.impl.rolesandpermissions.changeroles_ChangeRolesView_Day_0_de.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:5a2c8c098a7d8f23342f561de6ab7f6edacdbe4fe5eeec53428e19a2ff2dd078 -size 16089 diff --git a/screenshots/de/features.roomdetails.impl.rolesandpermissions.changeroles_ChangeRolesView_Day_10_de.png b/screenshots/de/features.roomdetails.impl.rolesandpermissions.changeroles_ChangeRolesView_Day_10_de.png deleted file mode 100644 index 550769deab..0000000000 --- a/screenshots/de/features.roomdetails.impl.rolesandpermissions.changeroles_ChangeRolesView_Day_10_de.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:a9dc162681fffcb8acdad591c04d4e71a9ab76d0373d9047d637cc8e1633dfe8 -size 52172 diff --git a/screenshots/de/features.roomdetails.impl.rolesandpermissions.changeroles_ChangeRolesView_Day_11_de.png b/screenshots/de/features.roomdetails.impl.rolesandpermissions.changeroles_ChangeRolesView_Day_11_de.png deleted file mode 100644 index bce052dec9..0000000000 --- a/screenshots/de/features.roomdetails.impl.rolesandpermissions.changeroles_ChangeRolesView_Day_11_de.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:d676c3f24c3457f09bad1b2ba0442a98cc8b41a268727d96f3c62f04e15a6aea -size 57449 diff --git a/screenshots/de/features.roomdetails.impl.rolesandpermissions.changeroles_ChangeRolesView_Day_1_de.png b/screenshots/de/features.roomdetails.impl.rolesandpermissions.changeroles_ChangeRolesView_Day_1_de.png deleted file mode 100644 index 9736fd1a91..0000000000 --- a/screenshots/de/features.roomdetails.impl.rolesandpermissions.changeroles_ChangeRolesView_Day_1_de.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:91ee5d1af8e7ff0b15d56c3e6cbbba7fbe47a9a271a5609ceab8d2377189c138 -size 72116 diff --git a/screenshots/de/features.roomdetails.impl.rolesandpermissions.changeroles_ChangeRolesView_Day_2_de.png b/screenshots/de/features.roomdetails.impl.rolesandpermissions.changeroles_ChangeRolesView_Day_2_de.png deleted file mode 100644 index ba90cbf85a..0000000000 --- a/screenshots/de/features.roomdetails.impl.rolesandpermissions.changeroles_ChangeRolesView_Day_2_de.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:9308d5b35262bcef841f4968c86d820f58c1dbcd75853bb5cc7070d0ceea26c2 -size 65943 diff --git a/screenshots/de/features.roomdetails.impl.rolesandpermissions.changeroles_ChangeRolesView_Day_3_de.png b/screenshots/de/features.roomdetails.impl.rolesandpermissions.changeroles_ChangeRolesView_Day_3_de.png deleted file mode 100644 index af28b6eaee..0000000000 --- a/screenshots/de/features.roomdetails.impl.rolesandpermissions.changeroles_ChangeRolesView_Day_3_de.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:ffedb45ae4152bf49a8afe3a6f82054dac31fc20d5be89c39b484310578ed4cc -size 65751 diff --git a/screenshots/de/features.roomdetails.impl.rolesandpermissions.changeroles_ChangeRolesView_Day_4_de.png b/screenshots/de/features.roomdetails.impl.rolesandpermissions.changeroles_ChangeRolesView_Day_4_de.png deleted file mode 100644 index 521ba2e414..0000000000 --- a/screenshots/de/features.roomdetails.impl.rolesandpermissions.changeroles_ChangeRolesView_Day_4_de.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:2d048eaeaf5f23e85ba8ad5b56ce09daa49b3cbb0cfca69c22820734b5fde31e -size 60742 diff --git a/screenshots/de/features.roomdetails.impl.rolesandpermissions.changeroles_ChangeRolesView_Day_5_de.png b/screenshots/de/features.roomdetails.impl.rolesandpermissions.changeroles_ChangeRolesView_Day_5_de.png deleted file mode 100644 index 8c5975e3be..0000000000 --- a/screenshots/de/features.roomdetails.impl.rolesandpermissions.changeroles_ChangeRolesView_Day_5_de.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:56d1fb8f10302d1f68bd6633c79f4352b7cfb754d872d703461a9e79524804e7 -size 13999 diff --git a/screenshots/de/features.roomdetails.impl.rolesandpermissions.changeroles_ChangeRolesView_Day_6_de.png b/screenshots/de/features.roomdetails.impl.rolesandpermissions.changeroles_ChangeRolesView_Day_6_de.png deleted file mode 100644 index 5ca90734a9..0000000000 --- a/screenshots/de/features.roomdetails.impl.rolesandpermissions.changeroles_ChangeRolesView_Day_6_de.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:c058bb492b8131ff0639a28a93c56eb8807136b550b9bd2631f6f8b132d7f199 -size 65013 diff --git a/screenshots/de/features.roomdetails.impl.rolesandpermissions.changeroles_ChangeRolesView_Day_7_de.png b/screenshots/de/features.roomdetails.impl.rolesandpermissions.changeroles_ChangeRolesView_Day_7_de.png deleted file mode 100644 index 569c387c11..0000000000 --- a/screenshots/de/features.roomdetails.impl.rolesandpermissions.changeroles_ChangeRolesView_Day_7_de.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:150ed81c7f76f6549b97430331f96d1051293ccdd435aed63214e91214c17d43 -size 67513 diff --git a/screenshots/de/features.roomdetails.impl.rolesandpermissions.changeroles_ChangeRolesView_Day_8_de.png b/screenshots/de/features.roomdetails.impl.rolesandpermissions.changeroles_ChangeRolesView_Day_8_de.png deleted file mode 100644 index fa045dd963..0000000000 --- a/screenshots/de/features.roomdetails.impl.rolesandpermissions.changeroles_ChangeRolesView_Day_8_de.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:0c11b8fc7f3b659ddebe450f7a3c6614daf5e5481602724a9fbfe1233c28304d -size 55993 diff --git a/screenshots/de/features.roomdetails.impl.rolesandpermissions.changeroles_ChangeRolesView_Day_9_de.png b/screenshots/de/features.roomdetails.impl.rolesandpermissions.changeroles_ChangeRolesView_Day_9_de.png deleted file mode 100644 index 9f650ab357..0000000000 --- a/screenshots/de/features.roomdetails.impl.rolesandpermissions.changeroles_ChangeRolesView_Day_9_de.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:db37883f66461d91ad41ee96a717daf17104d594697f6d8addc9bc015fe5e82f -size 68270 diff --git a/screenshots/de/features.roomdetails.impl.rolesandpermissions.changeroles_PendingMemberRowWithLongName_Day_0_de.png b/screenshots/de/features.roomdetails.impl.rolesandpermissions.changeroles_PendingMemberRowWithLongName_Day_0_de.png deleted file mode 100644 index 191c360673..0000000000 --- a/screenshots/de/features.roomdetails.impl.rolesandpermissions.changeroles_PendingMemberRowWithLongName_Day_0_de.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:dda7469b3c6a9940d7dc9e6c29a52707788af32ca4c17960eb0a29aab0eff4c7 -size 15134 diff --git a/screenshots/de/features.roomdetails.impl.rolesandpermissions.permissions_ChangeRoomPermissionsView_Day_0_de.png b/screenshots/de/features.roomdetails.impl.rolesandpermissions.permissions_ChangeRoomPermissionsView_Day_0_de.png index 37eecc0061..f0fd0f9911 100644 --- a/screenshots/de/features.roomdetails.impl.rolesandpermissions.permissions_ChangeRoomPermissionsView_Day_0_de.png +++ b/screenshots/de/features.roomdetails.impl.rolesandpermissions.permissions_ChangeRoomPermissionsView_Day_0_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:9715ce2c7051cb20ce078291357043c0f635fee1f9c814bf7e1b2a0ce92525f5 -size 45213 +oid sha256:1a98b68616d52611d2e2a83d004e8ba3a7d4d015fcd872368963d37c560b3e69 +size 45325 diff --git a/screenshots/de/features.roomdetails.impl.rolesandpermissions.permissions_ChangeRoomPermissionsView_Day_1_de.png b/screenshots/de/features.roomdetails.impl.rolesandpermissions.permissions_ChangeRoomPermissionsView_Day_1_de.png index 3b475feec8..84de6ed493 100644 --- a/screenshots/de/features.roomdetails.impl.rolesandpermissions.permissions_ChangeRoomPermissionsView_Day_1_de.png +++ b/screenshots/de/features.roomdetails.impl.rolesandpermissions.permissions_ChangeRoomPermissionsView_Day_1_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:b9a3d19e2c1b9fa0c7589a2c6125b9c46342392381b2f08303131397562908d0 -size 43954 +oid sha256:1c58e3c2bd157daa0f678e2d17f83c790497167ddae8409c4b3d38a41f25cf7a +size 44036 diff --git a/screenshots/de/features.roomdetails.impl.rolesandpermissions.permissions_ChangeRoomPermissionsView_Day_2_de.png b/screenshots/de/features.roomdetails.impl.rolesandpermissions.permissions_ChangeRoomPermissionsView_Day_2_de.png index 73fcdc3138..e4c5681b75 100644 --- a/screenshots/de/features.roomdetails.impl.rolesandpermissions.permissions_ChangeRoomPermissionsView_Day_2_de.png +++ b/screenshots/de/features.roomdetails.impl.rolesandpermissions.permissions_ChangeRoomPermissionsView_Day_2_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:a43eb0c9fce4145c42028e1bbf6e77961fb3a70afae22d28863abd2b6060a2fc -size 51952 +oid sha256:612c429945aa9aed4eedf0607c920887e4971d1a278dda03ace42ceff38f5b3b +size 52022 diff --git a/screenshots/de/features.roomdetails.impl.rolesandpermissions.permissions_ChangeRoomPermissionsView_Day_3_de.png b/screenshots/de/features.roomdetails.impl.rolesandpermissions.permissions_ChangeRoomPermissionsView_Day_3_de.png index 9b6a15a073..167985143b 100644 --- a/screenshots/de/features.roomdetails.impl.rolesandpermissions.permissions_ChangeRoomPermissionsView_Day_3_de.png +++ b/screenshots/de/features.roomdetails.impl.rolesandpermissions.permissions_ChangeRoomPermissionsView_Day_3_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:bc3b429ac5a2903871041f19b7328bdf9d4aa3ee40f2f3bf67e9aed5ef4bf623 -size 45117 +oid sha256:7853b6076610c5812c08cc4a615a7baa74b2ce379d8eef255bfb7e9f1fda58c4 +size 45253 diff --git a/screenshots/de/features.roomdetails.impl.rolesandpermissions.permissions_ChangeRoomPermissionsView_Day_4_de.png b/screenshots/de/features.roomdetails.impl.rolesandpermissions.permissions_ChangeRoomPermissionsView_Day_4_de.png index 33fdf47319..165d6cd269 100644 --- a/screenshots/de/features.roomdetails.impl.rolesandpermissions.permissions_ChangeRoomPermissionsView_Day_4_de.png +++ b/screenshots/de/features.roomdetails.impl.rolesandpermissions.permissions_ChangeRoomPermissionsView_Day_4_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:7da1d43fddbe35a0d6717bdd502bcb77cf565bdf65a41c7b74d0785168a93e10 -size 41771 +oid sha256:079e6ed6cb2a69087501636ef9fd881e075a2ee49d177da749856afaacf82b38 +size 41730 diff --git a/screenshots/de/features.roomdetails.impl.rolesandpermissions.permissions_ChangeRoomPermissionsView_Day_5_de.png b/screenshots/de/features.roomdetails.impl.rolesandpermissions.permissions_ChangeRoomPermissionsView_Day_5_de.png index bd8f239463..55530ba18d 100644 --- a/screenshots/de/features.roomdetails.impl.rolesandpermissions.permissions_ChangeRoomPermissionsView_Day_5_de.png +++ b/screenshots/de/features.roomdetails.impl.rolesandpermissions.permissions_ChangeRoomPermissionsView_Day_5_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:19ee0f3ea570cfe8788d01f2708d1a1105c3c53fbd502c6d195aa2a4070a657d -size 42989 +oid sha256:de2f0279925a81865c79599b1e4f8677357a28c9b3612098f0be5d84c5fc5051 +size 43003 diff --git a/screenshots/de/features.roomdetails.impl.rolesandpermissions.permissions_ChangeRoomPermissionsView_Day_6_de.png b/screenshots/de/features.roomdetails.impl.rolesandpermissions.permissions_ChangeRoomPermissionsView_Day_6_de.png index 2815f86a89..d9130c5ebc 100644 --- a/screenshots/de/features.roomdetails.impl.rolesandpermissions.permissions_ChangeRoomPermissionsView_Day_6_de.png +++ b/screenshots/de/features.roomdetails.impl.rolesandpermissions.permissions_ChangeRoomPermissionsView_Day_6_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:4330932d8f3fdf2f5a7d078b3c64c496305fb7e64448b987fb7a6d5330ee6ec8 -size 52487 +oid sha256:5709475d9bbcb55d7db83d856d74c4b1141f4f4904ee228652475afa43d67009 +size 52505 diff --git a/screenshots/de/features.roomdetails.impl.rolesandpermissions_RolesAndPermissionsView_Day_0_de.png b/screenshots/de/features.roomdetails.impl.rolesandpermissions_RolesAndPermissionsView_Day_0_de.png index caafaf7ca6..bdeceec6ae 100644 --- a/screenshots/de/features.roomdetails.impl.rolesandpermissions_RolesAndPermissionsView_Day_0_de.png +++ b/screenshots/de/features.roomdetails.impl.rolesandpermissions_RolesAndPermissionsView_Day_0_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:d28585e9ea9181479d9663f363f37fd0c13a9f9f588f2b0b6db7d719aef458a4 -size 49684 +oid sha256:82e8e9e219eb8360e8ae8b9a15a92a78898be0594321d92845da39557bb81074 +size 49990 diff --git a/screenshots/de/features.roomdetails.impl.rolesandpermissions_RolesAndPermissionsView_Day_1_de.png b/screenshots/de/features.roomdetails.impl.rolesandpermissions_RolesAndPermissionsView_Day_1_de.png index 43bd5660b8..212a5ddf32 100644 --- a/screenshots/de/features.roomdetails.impl.rolesandpermissions_RolesAndPermissionsView_Day_1_de.png +++ b/screenshots/de/features.roomdetails.impl.rolesandpermissions_RolesAndPermissionsView_Day_1_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:41a637d33c49ee30f2d76983b3187feec65fbe59b5b324d23435236982a83598 -size 50056 +oid sha256:26471123c92b279454a8c1654f52625344a1ab67e83e9eeb92640009f1047a0b +size 50338 diff --git a/screenshots/de/features.roomdetails.impl.rolesandpermissions_RolesAndPermissionsView_Day_2_de.png b/screenshots/de/features.roomdetails.impl.rolesandpermissions_RolesAndPermissionsView_Day_2_de.png index c241959997..8ac217ea46 100644 --- a/screenshots/de/features.roomdetails.impl.rolesandpermissions_RolesAndPermissionsView_Day_2_de.png +++ b/screenshots/de/features.roomdetails.impl.rolesandpermissions_RolesAndPermissionsView_Day_2_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:6ce1d91ec695c250b8f4109de0f7cafd41c7355514d7c94ca94ee0ea7d2ab34c -size 64047 +oid sha256:c99235e9537f161d0581d91ea5d081ffdf7321a3b5a5f73a3c146db66ef3fe12 +size 64150 diff --git a/screenshots/de/features.roomdetails.impl.rolesandpermissions_RolesAndPermissionsView_Day_3_de.png b/screenshots/de/features.roomdetails.impl.rolesandpermissions_RolesAndPermissionsView_Day_3_de.png index 881793b35b..36672b51dc 100644 --- a/screenshots/de/features.roomdetails.impl.rolesandpermissions_RolesAndPermissionsView_Day_3_de.png +++ b/screenshots/de/features.roomdetails.impl.rolesandpermissions_RolesAndPermissionsView_Day_3_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:17bba51386fd62e070e4b863c0a3bff763c5d2fd92d9bd94fde77c120ffd7d2d -size 45301 +oid sha256:b64c6ec76e434f18348f9f8cf9166bac55b3a222cb987d1315dab415cd4b3605 +size 45725 diff --git a/screenshots/de/features.roomdetails.impl.rolesandpermissions_RolesAndPermissionsView_Day_4_de.png b/screenshots/de/features.roomdetails.impl.rolesandpermissions_RolesAndPermissionsView_Day_4_de.png index d88563563b..b7a1cbf269 100644 --- a/screenshots/de/features.roomdetails.impl.rolesandpermissions_RolesAndPermissionsView_Day_4_de.png +++ b/screenshots/de/features.roomdetails.impl.rolesandpermissions_RolesAndPermissionsView_Day_4_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:45ff3e48e93d9ab2ca546582aeb30ff449baf6cb5c5be67d7281760a329d8b1e -size 43576 +oid sha256:a23784d588e4ef38ff320b8c1c79181488bba247510f7941f7ec0469a0b6ba66 +size 43790 diff --git a/screenshots/de/features.roomdetails.impl.rolesandpermissions_RolesAndPermissionsView_Day_5_de.png b/screenshots/de/features.roomdetails.impl.rolesandpermissions_RolesAndPermissionsView_Day_5_de.png index 326ffcc363..7379c8d351 100644 --- a/screenshots/de/features.roomdetails.impl.rolesandpermissions_RolesAndPermissionsView_Day_5_de.png +++ b/screenshots/de/features.roomdetails.impl.rolesandpermissions_RolesAndPermissionsView_Day_5_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:9f92c8b403684ce2068d385714d63bf7706041349363f81aa01dde118a131610 -size 56680 +oid sha256:4edb9c0fd6de708bf802c7deab1204738eb73e832cee8d76c7298bc55bf9e2b5 +size 56883 diff --git a/screenshots/de/features.roomdetails.impl.rolesandpermissions_RolesAndPermissionsView_Day_6_de.png b/screenshots/de/features.roomdetails.impl.rolesandpermissions_RolesAndPermissionsView_Day_6_de.png index 881793b35b..36672b51dc 100644 --- a/screenshots/de/features.roomdetails.impl.rolesandpermissions_RolesAndPermissionsView_Day_6_de.png +++ b/screenshots/de/features.roomdetails.impl.rolesandpermissions_RolesAndPermissionsView_Day_6_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:17bba51386fd62e070e4b863c0a3bff763c5d2fd92d9bd94fde77c120ffd7d2d -size 45301 +oid sha256:b64c6ec76e434f18348f9f8cf9166bac55b3a222cb987d1315dab415cd4b3605 +size 45725 diff --git a/screenshots/de/features.roomdetails.impl.rolesandpermissions_RolesAndPermissionsView_Day_7_de.png b/screenshots/de/features.roomdetails.impl.rolesandpermissions_RolesAndPermissionsView_Day_7_de.png index 84ce8f6f73..a8c2c353c4 100644 --- a/screenshots/de/features.roomdetails.impl.rolesandpermissions_RolesAndPermissionsView_Day_7_de.png +++ b/screenshots/de/features.roomdetails.impl.rolesandpermissions_RolesAndPermissionsView_Day_7_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:6d5769fefa19306cb0d61d10e9c67a5cf79bba3548d01ed4618f430c4a675dab -size 43028 +oid sha256:57ed78f6e03fc4ad8301943c45a1c16c51186c7d7b24d41070565cfaaedb58dd +size 43223 diff --git a/screenshots/de/features.roomdetails.impl.rolesandpermissions_RolesAndPermissionsView_Day_8_de.png b/screenshots/de/features.roomdetails.impl.rolesandpermissions_RolesAndPermissionsView_Day_8_de.png index f4a1c0c35e..3b870e4110 100644 --- a/screenshots/de/features.roomdetails.impl.rolesandpermissions_RolesAndPermissionsView_Day_8_de.png +++ b/screenshots/de/features.roomdetails.impl.rolesandpermissions_RolesAndPermissionsView_Day_8_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:e3bea7097c2488741c5e616656fcf4d6ce04dd21f2338cc9b88fff4e3c91c06c -size 46393 +oid sha256:42c4e166849a1699d265bfecefdcf3bf171c3d76632739e6976c60298722ae8f +size 46557 diff --git a/screenshots/de/features.roomdetails.impl.securityandprivacy.editroomaddress_EditRoomAddressView_Day_0_de.png b/screenshots/de/features.roomdetails.impl.securityandprivacy.editroomaddress_EditRoomAddressView_Day_0_de.png index 155e06b5ad..9fac418c7a 100644 --- a/screenshots/de/features.roomdetails.impl.securityandprivacy.editroomaddress_EditRoomAddressView_Day_0_de.png +++ b/screenshots/de/features.roomdetails.impl.securityandprivacy.editroomaddress_EditRoomAddressView_Day_0_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:89a7c69efaf80e21ac391b7f798833c863f5b2ff33d23b4330b97d4dbc016dff -size 29386 +oid sha256:ac72afa607a14632318eb34a88adbd46c5417d55f86cd3e87f11f121063590db +size 29434 diff --git a/screenshots/de/features.roomdetails.impl.securityandprivacy.editroomaddress_EditRoomAddressView_Day_1_de.png b/screenshots/de/features.roomdetails.impl.securityandprivacy.editroomaddress_EditRoomAddressView_Day_1_de.png index 2de39ff24c..9ed5e15b37 100644 --- a/screenshots/de/features.roomdetails.impl.securityandprivacy.editroomaddress_EditRoomAddressView_Day_1_de.png +++ b/screenshots/de/features.roomdetails.impl.securityandprivacy.editroomaddress_EditRoomAddressView_Day_1_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:1cb55e863d132250aae622e906dbf1662e8d2295984d251b7eb4aab79efddc39 -size 38001 +oid sha256:edbe32291aa1db0858a5b681fc8f8c14263c1702f1fd734d8dfa67a8c25555ab +size 38174 diff --git a/screenshots/de/features.roomdetails.impl.securityandprivacy.editroomaddress_EditRoomAddressView_Day_2_de.png b/screenshots/de/features.roomdetails.impl.securityandprivacy.editroomaddress_EditRoomAddressView_Day_2_de.png index 27a2ad65ed..e83690b0be 100644 --- a/screenshots/de/features.roomdetails.impl.securityandprivacy.editroomaddress_EditRoomAddressView_Day_2_de.png +++ b/screenshots/de/features.roomdetails.impl.securityandprivacy.editroomaddress_EditRoomAddressView_Day_2_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:25c40c64b98657618e88308472602574ab9c9290d8b2ae65bf193b424eacfaf0 -size 34145 +oid sha256:62a4c11f1d9678ccda6ea3526836aeebc50500f5284010af2bf463feaf738838 +size 34034 diff --git a/screenshots/de/features.roomdetails.impl.securityandprivacy.editroomaddress_EditRoomAddressView_Day_3_de.png b/screenshots/de/features.roomdetails.impl.securityandprivacy.editroomaddress_EditRoomAddressView_Day_3_de.png index 444a35c041..9a956782b2 100644 --- a/screenshots/de/features.roomdetails.impl.securityandprivacy.editroomaddress_EditRoomAddressView_Day_3_de.png +++ b/screenshots/de/features.roomdetails.impl.securityandprivacy.editroomaddress_EditRoomAddressView_Day_3_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:d08f0abb51b684ff95002e0d345fc7e6d07394b18f732cc88cf0ef54d5abcbe0 -size 29090 +oid sha256:15ce268f3519e116352386721e3e822a363da3068655642d776696df443f45b9 +size 29154 diff --git a/screenshots/de/features.roomdetails.impl.securityandprivacy.editroomaddress_EditRoomAddressView_Day_4_de.png b/screenshots/de/features.roomdetails.impl.securityandprivacy.editroomaddress_EditRoomAddressView_Day_4_de.png index 31ad12e392..eda09521fb 100644 --- a/screenshots/de/features.roomdetails.impl.securityandprivacy.editroomaddress_EditRoomAddressView_Day_4_de.png +++ b/screenshots/de/features.roomdetails.impl.securityandprivacy.editroomaddress_EditRoomAddressView_Day_4_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:2146e10e516a833b631f0bf60528a22d01e4599435a4a64040dda5c176f3a9d8 -size 30964 +oid sha256:7c1678e1b006539b426fa43ed1727726aaf5eff762161740e162d6a9838a86c5 +size 31033 diff --git a/screenshots/de/features.roomdetails.impl.securityandprivacy_SecurityAndPrivacyViewDark_0_de.png b/screenshots/de/features.roomdetails.impl.securityandprivacy_SecurityAndPrivacyViewDark_0_de.png index bff2553eb9..f9cd2a3c19 100644 --- a/screenshots/de/features.roomdetails.impl.securityandprivacy_SecurityAndPrivacyViewDark_0_de.png +++ b/screenshots/de/features.roomdetails.impl.securityandprivacy_SecurityAndPrivacyViewDark_0_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:4a28c191aabe13caaa2e86577c97f87280b31e9b94d1887308d5e72880235464 -size 51431 +oid sha256:899f3eded3c1635771414862c1f8331e66c5bbf7d3ea28feef98962e5a41d382 +size 52659 diff --git a/screenshots/de/features.roomdetails.impl.securityandprivacy_SecurityAndPrivacyViewDark_1_de.png b/screenshots/de/features.roomdetails.impl.securityandprivacy_SecurityAndPrivacyViewDark_1_de.png index cac4a440b5..77714be81b 100644 --- a/screenshots/de/features.roomdetails.impl.securityandprivacy_SecurityAndPrivacyViewDark_1_de.png +++ b/screenshots/de/features.roomdetails.impl.securityandprivacy_SecurityAndPrivacyViewDark_1_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:727ba0ef7abe78aae4f299ebbc9a706c8a0a153ef21d2c15b76a7b434353176b -size 68510 +oid sha256:a2f90e632555ce3997552928c34e2cc3b0d56cef010cbc18b47eadfb3a5e191b +size 69783 diff --git a/screenshots/de/features.roomdetails.impl.securityandprivacy_SecurityAndPrivacyViewDark_2_de.png b/screenshots/de/features.roomdetails.impl.securityandprivacy_SecurityAndPrivacyViewDark_2_de.png index ca7b50f258..0d9a692f2a 100644 --- a/screenshots/de/features.roomdetails.impl.securityandprivacy_SecurityAndPrivacyViewDark_2_de.png +++ b/screenshots/de/features.roomdetails.impl.securityandprivacy_SecurityAndPrivacyViewDark_2_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:3b257faefa1abd9dd521bc70d7539cd9d0837a317e3eb06f6f6a85147b12abf9 -size 68643 +oid sha256:a7aacc61e3c37564d3f32df8c8128e4ab448ca49b16d6e9cc25f5c95a963cd02 +size 69902 diff --git a/screenshots/de/features.roomdetails.impl.securityandprivacy_SecurityAndPrivacyViewDark_3_de.png b/screenshots/de/features.roomdetails.impl.securityandprivacy_SecurityAndPrivacyViewDark_3_de.png index 663d04ad98..d97706fbd3 100644 --- a/screenshots/de/features.roomdetails.impl.securityandprivacy_SecurityAndPrivacyViewDark_3_de.png +++ b/screenshots/de/features.roomdetails.impl.securityandprivacy_SecurityAndPrivacyViewDark_3_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:d35254b92a44dfab6d16d7eea12dc5cd88eafc47d90c285d3cc17fc7c99ac2f5 -size 67940 +oid sha256:d2ab8002721017aefc3e9e254d643cb80b380d14098b73bcf3cc764b4091290b +size 69281 diff --git a/screenshots/de/features.roomdetails.impl.securityandprivacy_SecurityAndPrivacyViewDark_4_de.png b/screenshots/de/features.roomdetails.impl.securityandprivacy_SecurityAndPrivacyViewDark_4_de.png index 22aaa59401..1b8c7098d9 100644 --- a/screenshots/de/features.roomdetails.impl.securityandprivacy_SecurityAndPrivacyViewDark_4_de.png +++ b/screenshots/de/features.roomdetails.impl.securityandprivacy_SecurityAndPrivacyViewDark_4_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:a9acb42aab5048e790bcb2041e0f2cdb18a721b706282b090b5432f7f32e4c51 -size 68168 +oid sha256:fbd977aa083cd3fe3c39abd79f7966aadb20f6de2324207d6ec19c2904ebe23e +size 69079 diff --git a/screenshots/de/features.roomdetails.impl.securityandprivacy_SecurityAndPrivacyViewDark_5_de.png b/screenshots/de/features.roomdetails.impl.securityandprivacy_SecurityAndPrivacyViewDark_5_de.png index 1597d94b3f..d5d8b4cc79 100644 --- a/screenshots/de/features.roomdetails.impl.securityandprivacy_SecurityAndPrivacyViewDark_5_de.png +++ b/screenshots/de/features.roomdetails.impl.securityandprivacy_SecurityAndPrivacyViewDark_5_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:5e3c39fd5676d85079371ecdf28f8f2351e6a998e7ea0658b5bc20f84c81b313 -size 51192 +oid sha256:b178fafb154da8c221366c5f569c60d0c6ecd7428c53a5bbf941519447ef97fe +size 52421 diff --git a/screenshots/de/features.roomdetails.impl.securityandprivacy_SecurityAndPrivacyViewDark_6_de.png b/screenshots/de/features.roomdetails.impl.securityandprivacy_SecurityAndPrivacyViewDark_6_de.png index 1597d94b3f..d5d8b4cc79 100644 --- a/screenshots/de/features.roomdetails.impl.securityandprivacy_SecurityAndPrivacyViewDark_6_de.png +++ b/screenshots/de/features.roomdetails.impl.securityandprivacy_SecurityAndPrivacyViewDark_6_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:5e3c39fd5676d85079371ecdf28f8f2351e6a998e7ea0658b5bc20f84c81b313 -size 51192 +oid sha256:b178fafb154da8c221366c5f569c60d0c6ecd7428c53a5bbf941519447ef97fe +size 52421 diff --git a/screenshots/de/features.roomdetails.impl.securityandprivacy_SecurityAndPrivacyViewDark_7_de.png b/screenshots/de/features.roomdetails.impl.securityandprivacy_SecurityAndPrivacyViewDark_7_de.png index 16f51ec236..cc41582f26 100644 --- a/screenshots/de/features.roomdetails.impl.securityandprivacy_SecurityAndPrivacyViewDark_7_de.png +++ b/screenshots/de/features.roomdetails.impl.securityandprivacy_SecurityAndPrivacyViewDark_7_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:897a788e5ef08a0b2a52b3e8066022635e297048d3f23e5aaeb38bd3c366a628 -size 54065 +oid sha256:22f2e704b8ceee4d52fcdaf2d62492b65cce83123b9f462720838e1fddc98bcb +size 54078 diff --git a/screenshots/de/features.roomdetails.impl.securityandprivacy_SecurityAndPrivacyViewDark_8_de.png b/screenshots/de/features.roomdetails.impl.securityandprivacy_SecurityAndPrivacyViewDark_8_de.png index fa8822689f..ddf4401141 100644 --- a/screenshots/de/features.roomdetails.impl.securityandprivacy_SecurityAndPrivacyViewDark_8_de.png +++ b/screenshots/de/features.roomdetails.impl.securityandprivacy_SecurityAndPrivacyViewDark_8_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:a20e2f48614f64654b0dfdf4fb9183afcf8bd901375f209b688655b760408ae0 -size 45243 +oid sha256:d1f2ee196f379b8c27f0c5e908ec9ef64cd034b7ed992dc7d31aa9cace5c2b39 +size 45958 diff --git a/screenshots/de/features.roomdetails.impl.securityandprivacy_SecurityAndPrivacyViewLight_0_de.png b/screenshots/de/features.roomdetails.impl.securityandprivacy_SecurityAndPrivacyViewLight_0_de.png index 8d7e6b9c73..69625cdc1f 100644 --- a/screenshots/de/features.roomdetails.impl.securityandprivacy_SecurityAndPrivacyViewLight_0_de.png +++ b/screenshots/de/features.roomdetails.impl.securityandprivacy_SecurityAndPrivacyViewLight_0_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:14768120dc544c2edd64d17fe169e5f9e361c007b61417f30be7a639c06f2a4f -size 53552 +oid sha256:b38ab8cec2863d4db7bcdd2e77efec75dbd5360872f66f5fc6f0c6a181ac196b +size 55062 diff --git a/screenshots/de/features.roomdetails.impl.securityandprivacy_SecurityAndPrivacyViewLight_1_de.png b/screenshots/de/features.roomdetails.impl.securityandprivacy_SecurityAndPrivacyViewLight_1_de.png index 0f2dcbf0ef..1cc6edec3f 100644 --- a/screenshots/de/features.roomdetails.impl.securityandprivacy_SecurityAndPrivacyViewLight_1_de.png +++ b/screenshots/de/features.roomdetails.impl.securityandprivacy_SecurityAndPrivacyViewLight_1_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:e25521eed0cdfbe79f59aae942e73527fe7795eee2fa9744422932e87fb63d79 -size 71175 +oid sha256:ea30884a56e97630c890f29b19ce655d2f88e4b1d9f2f123ab4f3295c1455c8a +size 72594 diff --git a/screenshots/de/features.roomdetails.impl.securityandprivacy_SecurityAndPrivacyViewLight_2_de.png b/screenshots/de/features.roomdetails.impl.securityandprivacy_SecurityAndPrivacyViewLight_2_de.png index 5e95307336..9fc37cfe1c 100644 --- a/screenshots/de/features.roomdetails.impl.securityandprivacy_SecurityAndPrivacyViewLight_2_de.png +++ b/screenshots/de/features.roomdetails.impl.securityandprivacy_SecurityAndPrivacyViewLight_2_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:dc7e4d24dace1b44700c07178fb048fe033f4ad0c10de06cea19ffdbe8d0092a -size 71400 +oid sha256:6d682879e6297b497e36ae688ee301685ce6b584599bcc399e19f987103efbed +size 72826 diff --git a/screenshots/de/features.roomdetails.impl.securityandprivacy_SecurityAndPrivacyViewLight_3_de.png b/screenshots/de/features.roomdetails.impl.securityandprivacy_SecurityAndPrivacyViewLight_3_de.png index 76c20dc1bc..0781b1c63c 100644 --- a/screenshots/de/features.roomdetails.impl.securityandprivacy_SecurityAndPrivacyViewLight_3_de.png +++ b/screenshots/de/features.roomdetails.impl.securityandprivacy_SecurityAndPrivacyViewLight_3_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:0831242cd85fd208f6425b4d03b9a3cc156da0d3da99eb9f7b648c9bdf2b4e1e -size 70295 +oid sha256:3c614f14062911a099cce2739490c2dbf6ab9e604d1ae4c168002eb219cc1f5a +size 71863 diff --git a/screenshots/de/features.roomdetails.impl.securityandprivacy_SecurityAndPrivacyViewLight_4_de.png b/screenshots/de/features.roomdetails.impl.securityandprivacy_SecurityAndPrivacyViewLight_4_de.png index 1706bc1cce..259646f838 100644 --- a/screenshots/de/features.roomdetails.impl.securityandprivacy_SecurityAndPrivacyViewLight_4_de.png +++ b/screenshots/de/features.roomdetails.impl.securityandprivacy_SecurityAndPrivacyViewLight_4_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:276f6a59cc9a99bc123b7363e1acd1c88b6998697180ff9a68644f4c0b824516 -size 70759 +oid sha256:75448b498fd54d100286b9c716b2a429ab2f1d5e5ea45fd28502a776ea0d8ab7 +size 71795 diff --git a/screenshots/de/features.roomdetails.impl.securityandprivacy_SecurityAndPrivacyViewLight_5_de.png b/screenshots/de/features.roomdetails.impl.securityandprivacy_SecurityAndPrivacyViewLight_5_de.png index bededdd992..b0389f4100 100644 --- a/screenshots/de/features.roomdetails.impl.securityandprivacy_SecurityAndPrivacyViewLight_5_de.png +++ b/screenshots/de/features.roomdetails.impl.securityandprivacy_SecurityAndPrivacyViewLight_5_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:5830dbf1d4aed28c4614473026820f6803c5b1a9f7a53398fac78dbafa7f4342 -size 53386 +oid sha256:6fc6be7296f4b3bdc1c6f4ef61278212f290b18f4404bc7244018a0e9b6c5a01 +size 54865 diff --git a/screenshots/de/features.roomdetails.impl.securityandprivacy_SecurityAndPrivacyViewLight_6_de.png b/screenshots/de/features.roomdetails.impl.securityandprivacy_SecurityAndPrivacyViewLight_6_de.png index bededdd992..b0389f4100 100644 --- a/screenshots/de/features.roomdetails.impl.securityandprivacy_SecurityAndPrivacyViewLight_6_de.png +++ b/screenshots/de/features.roomdetails.impl.securityandprivacy_SecurityAndPrivacyViewLight_6_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:5830dbf1d4aed28c4614473026820f6803c5b1a9f7a53398fac78dbafa7f4342 -size 53386 +oid sha256:6fc6be7296f4b3bdc1c6f4ef61278212f290b18f4404bc7244018a0e9b6c5a01 +size 54865 diff --git a/screenshots/de/features.roomdetails.impl.securityandprivacy_SecurityAndPrivacyViewLight_7_de.png b/screenshots/de/features.roomdetails.impl.securityandprivacy_SecurityAndPrivacyViewLight_7_de.png index c8c0723e74..3d5c5b68ee 100644 --- a/screenshots/de/features.roomdetails.impl.securityandprivacy_SecurityAndPrivacyViewLight_7_de.png +++ b/screenshots/de/features.roomdetails.impl.securityandprivacy_SecurityAndPrivacyViewLight_7_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:c8194be0e2575a8a0851c9661aef416bf9020feaf9e6fb1218ecee6597cb6db7 -size 56628 +oid sha256:fb24bc707910c1dc60679efe310840c62f8f35337db9ff846d491272e603ccc4 +size 56618 diff --git a/screenshots/de/features.roomdetails.impl.securityandprivacy_SecurityAndPrivacyViewLight_8_de.png b/screenshots/de/features.roomdetails.impl.securityandprivacy_SecurityAndPrivacyViewLight_8_de.png index 3d21fdc805..bb751c8bc0 100644 --- a/screenshots/de/features.roomdetails.impl.securityandprivacy_SecurityAndPrivacyViewLight_8_de.png +++ b/screenshots/de/features.roomdetails.impl.securityandprivacy_SecurityAndPrivacyViewLight_8_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:80c3256f801119397d9665c584234d48bf8ef6b20f13967f90f8d031a2c363b4 -size 46742 +oid sha256:64a5e97d73f2bca93918916af241c2f19f9a9f1281fbf7d8d4ce91b9efdf6b3f +size 47583 diff --git a/screenshots/de/features.roomdetails.impl_RoomDetailsDark_0_de.png b/screenshots/de/features.roomdetails.impl_RoomDetailsDark_0_de.png index 5e205681ad..43d4a8fdba 100644 --- a/screenshots/de/features.roomdetails.impl_RoomDetailsDark_0_de.png +++ b/screenshots/de/features.roomdetails.impl_RoomDetailsDark_0_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:064fc91cbf9c394ecc415a0c407b198266c18eeed58e2211e77a99b2566c6b4c -size 45992 +oid sha256:53e26f4b4e9badc0d9ee81b34eb39e5983c1711341ff39c5a2501a5a7b9cbef9 +size 46488 diff --git a/screenshots/de/features.roomdetails.impl_RoomDetailsDark_10_de.png b/screenshots/de/features.roomdetails.impl_RoomDetailsDark_10_de.png index b1b5c44bbe..e3af8fe59e 100644 --- a/screenshots/de/features.roomdetails.impl_RoomDetailsDark_10_de.png +++ b/screenshots/de/features.roomdetails.impl_RoomDetailsDark_10_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:1f287d2d55e3ed88bcfd7029e04850b9afb608bff4cdb307a2107ef3492263ea -size 44873 +oid sha256:01885455bc41f2d5e2a6579d9f8cc89dccf9c20423a840ba7bdb135b2e9946ed +size 45365 diff --git a/screenshots/de/features.roomdetails.impl_RoomDetailsDark_11_de.png b/screenshots/de/features.roomdetails.impl_RoomDetailsDark_11_de.png index d7fb40d3bc..31229a63c2 100644 --- a/screenshots/de/features.roomdetails.impl_RoomDetailsDark_11_de.png +++ b/screenshots/de/features.roomdetails.impl_RoomDetailsDark_11_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:1d38a07867e68e0bc2297ec94deacf33701a057ec3ac4826c9315ba343a9cc55 -size 43233 +oid sha256:e9e86d6b2c035e2051a53443e389fb6f64bdfb9a8735d503e7fc15dd50572802 +size 43704 diff --git a/screenshots/de/features.roomdetails.impl_RoomDetailsDark_12_de.png b/screenshots/de/features.roomdetails.impl_RoomDetailsDark_12_de.png index b3f166f0f9..07cd9cffe7 100644 --- a/screenshots/de/features.roomdetails.impl_RoomDetailsDark_12_de.png +++ b/screenshots/de/features.roomdetails.impl_RoomDetailsDark_12_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:f9095463651ea679d8bf78366da02023071a802d551874c56b333cdd9870eb1d -size 47131 +oid sha256:533f8becc79f0f9bbf8a8e0339d200ce820cb24736a53c469ece0bc220e7c524 +size 47523 diff --git a/screenshots/de/features.roomdetails.impl_RoomDetailsDark_13_de.png b/screenshots/de/features.roomdetails.impl_RoomDetailsDark_13_de.png index 3ca9500e98..dd98477d4d 100644 --- a/screenshots/de/features.roomdetails.impl_RoomDetailsDark_13_de.png +++ b/screenshots/de/features.roomdetails.impl_RoomDetailsDark_13_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:e0a2bae68fcaea24090d504a42bae48d4b540e0e7d8cc41b184645c432ff7f77 -size 45223 +oid sha256:d5d6b9d043362c56c019261f193813a5d0401ff77a56c8c7123514f99e98841c +size 45583 diff --git a/screenshots/de/features.roomdetails.impl_RoomDetailsDark_14_de.png b/screenshots/de/features.roomdetails.impl_RoomDetailsDark_14_de.png index e065b4bf53..59e6b50bac 100644 --- a/screenshots/de/features.roomdetails.impl_RoomDetailsDark_14_de.png +++ b/screenshots/de/features.roomdetails.impl_RoomDetailsDark_14_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:791a579b913e406287a37962145cf54c02d68dfc14c8d4a7ae864017de3e5629 -size 45737 +oid sha256:f5211fc81304fa414a6ffbccb9a9acaa6e68fae9be3e4d49faf801046e6831be +size 46169 diff --git a/screenshots/de/features.roomdetails.impl_RoomDetailsDark_15_de.png b/screenshots/de/features.roomdetails.impl_RoomDetailsDark_15_de.png index d42d2c613f..8112704fca 100644 --- a/screenshots/de/features.roomdetails.impl_RoomDetailsDark_15_de.png +++ b/screenshots/de/features.roomdetails.impl_RoomDetailsDark_15_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:62e5b6d06b83d9ffe61927391f0df7aa7d6a40950946cf3d68cc76363ff81197 -size 46263 +oid sha256:825835aa51124aab98c45182c93bd85deae427d7a7f484211720948523e7e599 +size 46703 diff --git a/screenshots/de/features.roomdetails.impl_RoomDetailsDark_16_de.png b/screenshots/de/features.roomdetails.impl_RoomDetailsDark_16_de.png index 77e4be20af..54993dfb57 100644 --- a/screenshots/de/features.roomdetails.impl_RoomDetailsDark_16_de.png +++ b/screenshots/de/features.roomdetails.impl_RoomDetailsDark_16_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:157f747b71d355493b7255b22e88742be69df779b6d9a1df6acf01069adab820 -size 45553 +oid sha256:2e54b8ba8b476ef5b03f45c647364c66c88d1ae95c99b9060158a277cc1e6648 +size 45930 diff --git a/screenshots/de/features.roomdetails.impl_RoomDetailsDark_17_de.png b/screenshots/de/features.roomdetails.impl_RoomDetailsDark_17_de.png index ff26d27fac..85778227bb 100644 --- a/screenshots/de/features.roomdetails.impl_RoomDetailsDark_17_de.png +++ b/screenshots/de/features.roomdetails.impl_RoomDetailsDark_17_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:155e895b03d5ec9747e248d6460bcc67a2a91adda5c93ffbe55bf1aa983111ca -size 44790 +oid sha256:3d3fe57dac71d0fdab6cd1027f35367de15a6f432e4c7c31e127bab26e05ad60 +size 45178 diff --git a/screenshots/de/features.roomdetails.impl_RoomDetailsDark_18_de.png b/screenshots/de/features.roomdetails.impl_RoomDetailsDark_18_de.png index 4fbcecfb3c..2f6f00a2ab 100644 --- a/screenshots/de/features.roomdetails.impl_RoomDetailsDark_18_de.png +++ b/screenshots/de/features.roomdetails.impl_RoomDetailsDark_18_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:3182cd1fb86194493ef923e46f5ade74ffd48b6a28a5f42c88dfbaa022736682 -size 41859 +oid sha256:4aa3e3af5c19c99f5d4e602344631e3b146a06c76cef26e83e729cc2cc9cb310 +size 42265 diff --git a/screenshots/de/features.roomdetails.impl_RoomDetailsDark_19_de.png b/screenshots/de/features.roomdetails.impl_RoomDetailsDark_19_de.png index 55772678a6..1f1fbb8c9c 100644 --- a/screenshots/de/features.roomdetails.impl_RoomDetailsDark_19_de.png +++ b/screenshots/de/features.roomdetails.impl_RoomDetailsDark_19_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:487b634d922beecb2d235a73d325f052ea904b8c5a053c4856ad9158cd9b47aa -size 41814 +oid sha256:09f77e0c5a383e988fff92c1ef940a6f74d824af05ef6a5740430899887cdc04 +size 42200 diff --git a/screenshots/de/features.roomdetails.impl_RoomDetailsDark_1_de.png b/screenshots/de/features.roomdetails.impl_RoomDetailsDark_1_de.png index 1659a6159f..05051a942d 100644 --- a/screenshots/de/features.roomdetails.impl_RoomDetailsDark_1_de.png +++ b/screenshots/de/features.roomdetails.impl_RoomDetailsDark_1_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:7b8420b2cb84f1d2b823b5853e64379c80b058d37cef06b0c03bd917ea124946 -size 42128 +oid sha256:23ac17a20e192be59d41bfb0ba1b307558b9f4b32d90b3f23482ddbcea4ae95e +size 42568 diff --git a/screenshots/de/features.roomdetails.impl_RoomDetailsDark_2_de.png b/screenshots/de/features.roomdetails.impl_RoomDetailsDark_2_de.png index 199eaf20b1..427a786440 100644 --- a/screenshots/de/features.roomdetails.impl_RoomDetailsDark_2_de.png +++ b/screenshots/de/features.roomdetails.impl_RoomDetailsDark_2_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:20a70e4f06f0d4273fbaca53a5a1847ae9487446b498a47257729c19d0843dfa -size 39857 +oid sha256:8ce32cad2d400336e1b29675ea9e8a16532efa5be54009f3c678a00ab5aa6de6 +size 40191 diff --git a/screenshots/de/features.roomdetails.impl_RoomDetailsDark_3_de.png b/screenshots/de/features.roomdetails.impl_RoomDetailsDark_3_de.png index 55745b3f8d..8ea9cae1f8 100644 --- a/screenshots/de/features.roomdetails.impl_RoomDetailsDark_3_de.png +++ b/screenshots/de/features.roomdetails.impl_RoomDetailsDark_3_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:1f1c37582bb9b3f680b302f9dea4f27213b562bdac7210d7d51247abe5b931ba -size 45558 +oid sha256:6462fafab220a93a72e7e258a0f2654d8853c54849e8497d84e2247f3f576d50 +size 45881 diff --git a/screenshots/de/features.roomdetails.impl_RoomDetailsDark_4_de.png b/screenshots/de/features.roomdetails.impl_RoomDetailsDark_4_de.png index 33604da95b..bd4c90331d 100644 --- a/screenshots/de/features.roomdetails.impl_RoomDetailsDark_4_de.png +++ b/screenshots/de/features.roomdetails.impl_RoomDetailsDark_4_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:f2625a58b93fb360b400f77cbf0238a44c0f1555bedda4e001baf552db0eaeee -size 45076 +oid sha256:11b866d4f836aac78ac237d9d61406a55ac854241af8f3fb3eea9ad54af400fe +size 45371 diff --git a/screenshots/de/features.roomdetails.impl_RoomDetailsDark_5_de.png b/screenshots/de/features.roomdetails.impl_RoomDetailsDark_5_de.png index 374d8eb94f..a9e70a26b2 100644 --- a/screenshots/de/features.roomdetails.impl_RoomDetailsDark_5_de.png +++ b/screenshots/de/features.roomdetails.impl_RoomDetailsDark_5_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:31e3a894473f061f2ee8dec48e9730ca84a6debcb8023b54b6510e20d8f64058 -size 41499 +oid sha256:031a260a9859d77cf7a69fd2fe6c52f3bd694dc7c25c15fe2315e236ecc4eae5 +size 41891 diff --git a/screenshots/de/features.roomdetails.impl_RoomDetailsDark_6_de.png b/screenshots/de/features.roomdetails.impl_RoomDetailsDark_6_de.png index 6fa141d6c4..77947d259d 100644 --- a/screenshots/de/features.roomdetails.impl_RoomDetailsDark_6_de.png +++ b/screenshots/de/features.roomdetails.impl_RoomDetailsDark_6_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:56875192f27f48df3d694effa375e7f703cc5ad820f2dd52b4c0cedea16771d5 -size 45201 +oid sha256:03a08a3999039ff5ac3a696b26e778d3136b21b5f30b5dd0a49b077170d79869 +size 45361 diff --git a/screenshots/de/features.roomdetails.impl_RoomDetailsDark_7_de.png b/screenshots/de/features.roomdetails.impl_RoomDetailsDark_7_de.png index d31c2858fb..7148b85dc9 100644 --- a/screenshots/de/features.roomdetails.impl_RoomDetailsDark_7_de.png +++ b/screenshots/de/features.roomdetails.impl_RoomDetailsDark_7_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:088695f25c715eff4442f65b285471cbc6e6efbb051c47fad738135146a89e04 -size 46464 +oid sha256:eb6a6bfd308fd385e2cca8e99bea65de49d8ea27986de920989035bfe74d2449 +size 46599 diff --git a/screenshots/de/features.roomdetails.impl_RoomDetailsDark_8_de.png b/screenshots/de/features.roomdetails.impl_RoomDetailsDark_8_de.png index fda497dde4..8e7c130464 100644 --- a/screenshots/de/features.roomdetails.impl_RoomDetailsDark_8_de.png +++ b/screenshots/de/features.roomdetails.impl_RoomDetailsDark_8_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:e5c948a7593cb3347fb43030a3456a6f1aef4fec0384eb9caacad8349d17626c -size 45248 +oid sha256:1ef2e551efb9b22cbe17dc857fac440c33c6dd36e2ef1dce329aa1606d92e67b +size 45639 diff --git a/screenshots/de/features.roomdetails.impl_RoomDetailsDark_9_de.png b/screenshots/de/features.roomdetails.impl_RoomDetailsDark_9_de.png index b5dde4ab2e..adde43541c 100644 --- a/screenshots/de/features.roomdetails.impl_RoomDetailsDark_9_de.png +++ b/screenshots/de/features.roomdetails.impl_RoomDetailsDark_9_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:b42f1dc3520d24f686eb66eaac509c3f1bb679dae2104d897b512c41b24557d0 -size 44298 +oid sha256:f0c38801d4ce5d5040af956b7c96f795f5251892bad5a9331858875ad5b5a048 +size 44679 diff --git a/screenshots/de/features.roomdetails.impl_RoomDetails_0_de.png b/screenshots/de/features.roomdetails.impl_RoomDetails_0_de.png index d6af09b4c7..5e240e59ff 100644 --- a/screenshots/de/features.roomdetails.impl_RoomDetails_0_de.png +++ b/screenshots/de/features.roomdetails.impl_RoomDetails_0_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:692d00e0a8597682bf414f91342ae2b7c9b68dc38944e77f783ef5e5776c2240 -size 47041 +oid sha256:a3b28f06bec8d728eafbd7a46588ac931e289cf36336ae4680791dfca3dea271 +size 47583 diff --git a/screenshots/de/features.roomdetails.impl_RoomDetails_10_de.png b/screenshots/de/features.roomdetails.impl_RoomDetails_10_de.png index bf9ed2a3cc..28a913a3bf 100644 --- a/screenshots/de/features.roomdetails.impl_RoomDetails_10_de.png +++ b/screenshots/de/features.roomdetails.impl_RoomDetails_10_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:c37ddb76e6d41c0b781569f482fad117ce48367847e0061972694030a9413085 -size 45882 +oid sha256:a8856c7eadc1e675d48638494ec3b14c4606c7db197d070ccb9af0a5c8114d26 +size 46405 diff --git a/screenshots/de/features.roomdetails.impl_RoomDetails_11_de.png b/screenshots/de/features.roomdetails.impl_RoomDetails_11_de.png index 4be06edf5f..455f0d9723 100644 --- a/screenshots/de/features.roomdetails.impl_RoomDetails_11_de.png +++ b/screenshots/de/features.roomdetails.impl_RoomDetails_11_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:15dad2dfa5ad660d8aef625be453432450b013d4b7f76979b6bbb21a2d5862be -size 44323 +oid sha256:3f3ccc11ecf31afd2caea6af382d0d3b1ae58e90fbc4e506df5a49713fd0f698 +size 44840 diff --git a/screenshots/de/features.roomdetails.impl_RoomDetails_12_de.png b/screenshots/de/features.roomdetails.impl_RoomDetails_12_de.png index 52e4702c1b..6b897fff33 100644 --- a/screenshots/de/features.roomdetails.impl_RoomDetails_12_de.png +++ b/screenshots/de/features.roomdetails.impl_RoomDetails_12_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:292dcae768ff8534f82e6bbe075a8fb4b4b57718d10a0f93d4d45b84e72becfe -size 47714 +oid sha256:22e4fcfa18a93a0ed4369d7aef331150f8300ffa5356003896674636c9e0383b +size 48143 diff --git a/screenshots/de/features.roomdetails.impl_RoomDetails_13_de.png b/screenshots/de/features.roomdetails.impl_RoomDetails_13_de.png index 36499ecb66..aa223f8ada 100644 --- a/screenshots/de/features.roomdetails.impl_RoomDetails_13_de.png +++ b/screenshots/de/features.roomdetails.impl_RoomDetails_13_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:b8f1513a55fa0d5b74657bcd224bac851151b2da10dd7f624cd92778e6ab0618 -size 46205 +oid sha256:0bb3c14f381583a5bc068cce244ff2105910cfa31791f7839a2951481159ec56 +size 46657 diff --git a/screenshots/de/features.roomdetails.impl_RoomDetails_14_de.png b/screenshots/de/features.roomdetails.impl_RoomDetails_14_de.png index b6fd155e9a..470f3817d2 100644 --- a/screenshots/de/features.roomdetails.impl_RoomDetails_14_de.png +++ b/screenshots/de/features.roomdetails.impl_RoomDetails_14_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:9d97e781bf08ff3c519d693ccd2dca3269706667a45ee06c866903b7a95a07da -size 46711 +oid sha256:be8328fe5952d93470b538321da39b055dfb69719778827653b0cfcfe03a8d94 +size 47180 diff --git a/screenshots/de/features.roomdetails.impl_RoomDetails_15_de.png b/screenshots/de/features.roomdetails.impl_RoomDetails_15_de.png index 8987195d54..8be5ea31cc 100644 --- a/screenshots/de/features.roomdetails.impl_RoomDetails_15_de.png +++ b/screenshots/de/features.roomdetails.impl_RoomDetails_15_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:5b7f88d28b9820258ebac7c375cdf4e64f9ad4a62c195ce4e7253722ced29d5e -size 47302 +oid sha256:e74f30454cc09ff1c56c763defb683e21c6c86153d8d79e5a5dede025fe19dc4 +size 47748 diff --git a/screenshots/de/features.roomdetails.impl_RoomDetails_16_de.png b/screenshots/de/features.roomdetails.impl_RoomDetails_16_de.png index 0fe04d6d9c..ac97c9cbee 100644 --- a/screenshots/de/features.roomdetails.impl_RoomDetails_16_de.png +++ b/screenshots/de/features.roomdetails.impl_RoomDetails_16_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:6126c10ff145a34ccedf9c7179c7786af1b6820a1dc2c3684aa649883e4833ba -size 46555 +oid sha256:229b37d061dbee966eb6421c4b3dd1804c624308b13407ba64219ca473cb4564 +size 47003 diff --git a/screenshots/de/features.roomdetails.impl_RoomDetails_17_de.png b/screenshots/de/features.roomdetails.impl_RoomDetails_17_de.png index d0eb978ab5..5787e10f3c 100644 --- a/screenshots/de/features.roomdetails.impl_RoomDetails_17_de.png +++ b/screenshots/de/features.roomdetails.impl_RoomDetails_17_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:7e66eee9c355b50a168c6158afd97757b523131c06895822c5b63252bb6ef6e2 -size 46035 +oid sha256:fd4ead2edbf54b0b91f92f948d8a68afaabd427a069458b127887ccfc337d915 +size 46490 diff --git a/screenshots/de/features.roomdetails.impl_RoomDetails_18_de.png b/screenshots/de/features.roomdetails.impl_RoomDetails_18_de.png index 1908f0d697..9aefd7740d 100644 --- a/screenshots/de/features.roomdetails.impl_RoomDetails_18_de.png +++ b/screenshots/de/features.roomdetails.impl_RoomDetails_18_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:82b74717000cf7d292a4fb9690e308e7f22db1a98e0231c6ef1cea8945e79418 -size 42883 +oid sha256:e2c2bd15e9a027430346841bfc040f99f4e5545138a09fd01e9af64f19a1172a +size 43316 diff --git a/screenshots/de/features.roomdetails.impl_RoomDetails_19_de.png b/screenshots/de/features.roomdetails.impl_RoomDetails_19_de.png index 7615ea6f5e..7b51cdb172 100644 --- a/screenshots/de/features.roomdetails.impl_RoomDetails_19_de.png +++ b/screenshots/de/features.roomdetails.impl_RoomDetails_19_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:156cf5bf138965d37b3ec8ffc88facb206c77cd82461b642c747b217b6bb6b53 -size 42761 +oid sha256:bc24fd0400fefd433cff35b57599259e23bddf4bf24a884dca5194e4ec090eea +size 43196 diff --git a/screenshots/de/features.roomdetails.impl_RoomDetails_1_de.png b/screenshots/de/features.roomdetails.impl_RoomDetails_1_de.png index bcc569ff83..25a3a06a41 100644 --- a/screenshots/de/features.roomdetails.impl_RoomDetails_1_de.png +++ b/screenshots/de/features.roomdetails.impl_RoomDetails_1_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:216646bef971c80ee653e34f0b04e5a43bd8a4f23e589d5abc0fe766e3a9127d -size 43242 +oid sha256:2cbeb5fcef8dc243ec1b5c457560a5b278b2fa7c9c7df86f91eccce8ac9eb7db +size 43809 diff --git a/screenshots/de/features.roomdetails.impl_RoomDetails_2_de.png b/screenshots/de/features.roomdetails.impl_RoomDetails_2_de.png index d20a2d599b..46b21d5a2a 100644 --- a/screenshots/de/features.roomdetails.impl_RoomDetails_2_de.png +++ b/screenshots/de/features.roomdetails.impl_RoomDetails_2_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:675706f853d416616df081db343abf9408f802ba14e99817c468bf0f936ab1c3 -size 40947 +oid sha256:b69d698c66368055776d69f6ccacb796cddbfa367c192cc2219e3d18e1c73656 +size 41328 diff --git a/screenshots/de/features.roomdetails.impl_RoomDetails_3_de.png b/screenshots/de/features.roomdetails.impl_RoomDetails_3_de.png index 13dc66abec..e551eb69dc 100644 --- a/screenshots/de/features.roomdetails.impl_RoomDetails_3_de.png +++ b/screenshots/de/features.roomdetails.impl_RoomDetails_3_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:86764932b950fb55ae017b870b79ab32e96cc3f88248c0fac5db8f618ca8b2b3 -size 46454 +oid sha256:6c55fd8e61f41612e91ce6cc27d7955c24f5c028aa4e161f560e14db4d7f7d77 +size 46841 diff --git a/screenshots/de/features.roomdetails.impl_RoomDetails_4_de.png b/screenshots/de/features.roomdetails.impl_RoomDetails_4_de.png index ff28978e2a..59f7752723 100644 --- a/screenshots/de/features.roomdetails.impl_RoomDetails_4_de.png +++ b/screenshots/de/features.roomdetails.impl_RoomDetails_4_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:644e2f5adcdc5aea4a03a20045d1635483002360aed6b9271f0d6e8c929f842f -size 46069 +oid sha256:8c5058e093b29b515028f268592ac7c47ba3fa9847f2e9791db25357bc61bcc7 +size 46430 diff --git a/screenshots/de/features.roomdetails.impl_RoomDetails_5_de.png b/screenshots/de/features.roomdetails.impl_RoomDetails_5_de.png index 01095a7bf7..074167caed 100644 --- a/screenshots/de/features.roomdetails.impl_RoomDetails_5_de.png +++ b/screenshots/de/features.roomdetails.impl_RoomDetails_5_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:5cb95f7267a454057e5fe2020f55b3c066110c08ac2d509443aa449daf95b2fb -size 42459 +oid sha256:b7e5e5ad50149ea60474d93498cf7a671779d1ccf75f89c091f864fac94a5335 +size 42858 diff --git a/screenshots/de/features.roomdetails.impl_RoomDetails_6_de.png b/screenshots/de/features.roomdetails.impl_RoomDetails_6_de.png index f6e0a5a0ee..b94d9ca17f 100644 --- a/screenshots/de/features.roomdetails.impl_RoomDetails_6_de.png +++ b/screenshots/de/features.roomdetails.impl_RoomDetails_6_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:d7b2e6e6461b04a9476e57ccebf35f79de29bf7c43c5936fc7bd497f8c238ac2 -size 46243 +oid sha256:ecdfe8dc5fc2fb547ceb0babda9856b2b0300c8794e9f9201f93f58693fa1532 +size 46517 diff --git a/screenshots/de/features.roomdetails.impl_RoomDetails_7_de.png b/screenshots/de/features.roomdetails.impl_RoomDetails_7_de.png index e093b35424..d693d6d649 100644 --- a/screenshots/de/features.roomdetails.impl_RoomDetails_7_de.png +++ b/screenshots/de/features.roomdetails.impl_RoomDetails_7_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:9e8262293955839ab0827b0d9bb04f7528e51513354a45bdd3738c601f5fcba8 -size 47542 +oid sha256:fbbdaaccb534a1cfa4288dc7a019699387d329831802153b0f4aa9b9580a4584 +size 47850 diff --git a/screenshots/de/features.roomdetails.impl_RoomDetails_8_de.png b/screenshots/de/features.roomdetails.impl_RoomDetails_8_de.png index 581cc59363..9255958570 100644 --- a/screenshots/de/features.roomdetails.impl_RoomDetails_8_de.png +++ b/screenshots/de/features.roomdetails.impl_RoomDetails_8_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:f3b57566b133fd7cd56b905470b744dc3d98e7a6112f3556b9490cb26c1c4092 -size 46305 +oid sha256:572ea075e5b270bb58f958c61e9a7b7e178a11ecd16ce9bba34fe0372c78adf5 +size 46767 diff --git a/screenshots/de/features.roomdetails.impl_RoomDetails_9_de.png b/screenshots/de/features.roomdetails.impl_RoomDetails_9_de.png index 5b13a4b02f..72450a3020 100644 --- a/screenshots/de/features.roomdetails.impl_RoomDetails_9_de.png +++ b/screenshots/de/features.roomdetails.impl_RoomDetails_9_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:f05fab1ea9b52eaeb667f1504ea536031470d1f455a35b0d71c8ce51baf83ddd -size 45211 +oid sha256:a9551167ec223ba7bed45858a85ceffce763e6808a7954ab6e09b088adacc3dc +size 45697 diff --git a/screenshots/de/features.roomdirectory.impl.root_RoomDirectoryView_Day_0_de.png b/screenshots/de/features.roomdirectory.impl.root_RoomDirectoryView_Day_0_de.png index 1c28385f83..9f3e20e5f3 100644 --- a/screenshots/de/features.roomdirectory.impl.root_RoomDirectoryView_Day_0_de.png +++ b/screenshots/de/features.roomdirectory.impl.root_RoomDirectoryView_Day_0_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:54655f494d57e3dbbcb8518112ba0b1385c77e9f60eaa35353316d6b6a5530c7 -size 13584 +oid sha256:c5b39e0b58f9ed1db274285d0b95767c854e14bacc1a416e0c96286cda169218 +size 13568 diff --git a/screenshots/de/features.roomdirectory.impl.root_RoomDirectoryView_Day_1_de.png b/screenshots/de/features.roomdirectory.impl.root_RoomDirectoryView_Day_1_de.png index d822e4ec92..b45df5fcc5 100644 --- a/screenshots/de/features.roomdirectory.impl.root_RoomDirectoryView_Day_1_de.png +++ b/screenshots/de/features.roomdirectory.impl.root_RoomDirectoryView_Day_1_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:aadaa202e7772a2ca09381dfbbb1acab6e06aa7c458582897b0da38ee9319071 -size 28398 +oid sha256:50c1ac010924a7bb1ee65c07c209c591c9da95633b7cbc0aa8236ab5b5190439 +size 28518 diff --git a/screenshots/de/features.roomdirectory.impl.root_RoomDirectoryView_Day_2_de.png b/screenshots/de/features.roomdirectory.impl.root_RoomDirectoryView_Day_2_de.png index 9c6890ec9b..f9d5c812ed 100644 --- a/screenshots/de/features.roomdirectory.impl.root_RoomDirectoryView_Day_2_de.png +++ b/screenshots/de/features.roomdirectory.impl.root_RoomDirectoryView_Day_2_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:ae00f91aac22d5e7dba2cffd2f5a6b14e6c3f43bc7dac1735abfec0da18731ff -size 30018 +oid sha256:c549721f24defa576135627f88117f057168bf1b64354078296bce9dd6b241f5 +size 30146 diff --git a/screenshots/de/features.roommembermoderation.impl_RoomMemberModerationView_Day_0_de.png b/screenshots/de/features.roommembermoderation.impl_RoomMemberModerationView_Day_0_de.png index 5cab90546a..0b94bf888d 100644 --- a/screenshots/de/features.roommembermoderation.impl_RoomMemberModerationView_Day_0_de.png +++ b/screenshots/de/features.roommembermoderation.impl_RoomMemberModerationView_Day_0_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:8edf8f2d1b29db9dfe47756dcd3fcc01fc908736b0c009320cf8bac535881416 -size 18252 +oid sha256:2b9f27b5742eb06ee518512a2bfd2e0e01d3e70ca248370e7e9155427c6f1aa8 +size 18466 diff --git a/screenshots/de/features.roommembermoderation.impl_RoomMemberModerationView_Day_1_de.png b/screenshots/de/features.roommembermoderation.impl_RoomMemberModerationView_Day_1_de.png index 8596d7d68c..1c38d575cc 100644 --- a/screenshots/de/features.roommembermoderation.impl_RoomMemberModerationView_Day_1_de.png +++ b/screenshots/de/features.roommembermoderation.impl_RoomMemberModerationView_Day_1_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:7203569b41833fe19935273838d59086031b10660f2e12ab5982432e867e5c1c -size 22128 +oid sha256:ca13853e5ada913d20dba5e3eeb6965006d46b6d035498fd082afa4c78f12525 +size 22336 diff --git a/screenshots/de/features.roommembermoderation.impl_RoomMemberModerationView_Day_2_de.png b/screenshots/de/features.roommembermoderation.impl_RoomMemberModerationView_Day_2_de.png index c3d7c681a1..29e3b32504 100644 --- a/screenshots/de/features.roommembermoderation.impl_RoomMemberModerationView_Day_2_de.png +++ b/screenshots/de/features.roommembermoderation.impl_RoomMemberModerationView_Day_2_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:ec50fa44bf08be308a39eb0d607803b079875c12dfd608f2a70ea4b53e164c39 -size 27566 +oid sha256:84faad4490bfbf48481ba870bc34c5b99d72984292b3b33d2c6bd619e2b78621 +size 27786 diff --git a/screenshots/de/features.roommembermoderation.impl_RoomMemberModerationView_Day_3_de.png b/screenshots/de/features.roommembermoderation.impl_RoomMemberModerationView_Day_3_de.png index f2b320ec01..9332c16d79 100644 --- a/screenshots/de/features.roommembermoderation.impl_RoomMemberModerationView_Day_3_de.png +++ b/screenshots/de/features.roommembermoderation.impl_RoomMemberModerationView_Day_3_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:a577c026a1502e2fe3bef1ff5f39e3857c06a0ab314c2ef4c384bceb7b9088b1 -size 28630 +oid sha256:d43dba57001db80c6b16334ca15ea2ae39df9c597a1adced3bb9b34f7c652163 +size 28922 diff --git a/screenshots/de/features.roommembermoderation.impl_RoomMemberModerationView_Day_4_de.png b/screenshots/de/features.roommembermoderation.impl_RoomMemberModerationView_Day_4_de.png index b11c62696e..6d56bb9a7f 100644 --- a/screenshots/de/features.roommembermoderation.impl_RoomMemberModerationView_Day_4_de.png +++ b/screenshots/de/features.roommembermoderation.impl_RoomMemberModerationView_Day_4_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:c302540a09bcaa5db3296b3825f3086e593a61d5cd2b4c834f23fc6827b91325 -size 34422 +oid sha256:51fe1a74680a6975652e5939665f64d116246015ca94cd234dfa9574a0bbc426 +size 34192 diff --git a/screenshots/de/features.roommembermoderation.impl_RoomMemberModerationView_Day_5_de.png b/screenshots/de/features.roommembermoderation.impl_RoomMemberModerationView_Day_5_de.png index b9df84aae0..93820e4e75 100644 --- a/screenshots/de/features.roommembermoderation.impl_RoomMemberModerationView_Day_5_de.png +++ b/screenshots/de/features.roommembermoderation.impl_RoomMemberModerationView_Day_5_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:d7ed8b8a8190f00ed028a901e23abaf6497b91718afd3f64af94e1d75e9562ff -size 9601 +oid sha256:dea0b85bc59ff503e9882f91207f0f31402d775cbe16e8a665bf55f069dddd77 +size 9562 diff --git a/screenshots/de/features.roommembermoderation.impl_RoomMemberModerationView_Day_6_de.png b/screenshots/de/features.roommembermoderation.impl_RoomMemberModerationView_Day_6_de.png index 58218ad823..de55bea6fc 100644 --- a/screenshots/de/features.roommembermoderation.impl_RoomMemberModerationView_Day_6_de.png +++ b/screenshots/de/features.roommembermoderation.impl_RoomMemberModerationView_Day_6_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:3fd3f5cc0b71a34bd10bd9ceffe1f6cfe7f266b0b82fefd93c18df78135ab213 -size 34551 +oid sha256:4555565484cde0f2beb81c26f14bc918f289f66cefc8d76b7b8dca0e29543d4d +size 34498 diff --git a/screenshots/de/features.roommembermoderation.impl_RoomMemberModerationView_Day_7_de.png b/screenshots/de/features.roommembermoderation.impl_RoomMemberModerationView_Day_7_de.png index 46bcee2f62..75255e0690 100644 --- a/screenshots/de/features.roommembermoderation.impl_RoomMemberModerationView_Day_7_de.png +++ b/screenshots/de/features.roommembermoderation.impl_RoomMemberModerationView_Day_7_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:a8a335d4f61371a5ba7f609446ba93c80b53ce06ca47aa011ab89ef43d3cfce3 -size 9926 +oid sha256:c71395a8c13be525de079f60036ee44f1175ab1c30f2486eb8a1682d02f929c8 +size 10007 diff --git a/screenshots/de/features.securebackup.impl.disable_SecureBackupDisableView_Day_0_de.png b/screenshots/de/features.securebackup.impl.disable_SecureBackupDisableView_Day_0_de.png index f2f91815ce..eb201eaf9b 100644 --- a/screenshots/de/features.securebackup.impl.disable_SecureBackupDisableView_Day_0_de.png +++ b/screenshots/de/features.securebackup.impl.disable_SecureBackupDisableView_Day_0_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:01b5e7fd76bd27d28420d6dcae61cc6381a9240e3bca78f4b1191a015eb395e2 -size 73458 +oid sha256:6a23da15af668434e8b4980fdb9882325416cd8b02704a1a2198969a1ca30ec9 +size 73662 diff --git a/screenshots/de/features.securebackup.impl.disable_SecureBackupDisableView_Day_1_de.png b/screenshots/de/features.securebackup.impl.disable_SecureBackupDisableView_Day_1_de.png index f2f91815ce..eb201eaf9b 100644 --- a/screenshots/de/features.securebackup.impl.disable_SecureBackupDisableView_Day_1_de.png +++ b/screenshots/de/features.securebackup.impl.disable_SecureBackupDisableView_Day_1_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:01b5e7fd76bd27d28420d6dcae61cc6381a9240e3bca78f4b1191a015eb395e2 -size 73458 +oid sha256:6a23da15af668434e8b4980fdb9882325416cd8b02704a1a2198969a1ca30ec9 +size 73662 diff --git a/screenshots/de/features.securebackup.impl.disable_SecureBackupDisableView_Day_2_de.png b/screenshots/de/features.securebackup.impl.disable_SecureBackupDisableView_Day_2_de.png index 24f0ee5f73..d5abdc1cfa 100644 --- a/screenshots/de/features.securebackup.impl.disable_SecureBackupDisableView_Day_2_de.png +++ b/screenshots/de/features.securebackup.impl.disable_SecureBackupDisableView_Day_2_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:362fa3a6e8da97f67c0c3502be9d53929cf2cec1f7bd6c15ccaa95070d65b24e -size 74006 +oid sha256:86c4d6448e42855bc8ff4f2f6607a597c5d5eb9040be750596d21bec67cd32bd +size 74288 diff --git a/screenshots/de/features.securebackup.impl.disable_SecureBackupDisableView_Day_3_de.png b/screenshots/de/features.securebackup.impl.disable_SecureBackupDisableView_Day_3_de.png index bd4e5a26b3..f86ea13aaf 100644 --- a/screenshots/de/features.securebackup.impl.disable_SecureBackupDisableView_Day_3_de.png +++ b/screenshots/de/features.securebackup.impl.disable_SecureBackupDisableView_Day_3_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:e80fa798011e89eb0cd931dbd384b7c800120dd2df8b2227d6e5d8ec93ef238f -size 46816 +oid sha256:a908b43102585b666bd495fef2f392ce32ebcf3bf05c62e2a38217ab63d4663b +size 47047 diff --git a/screenshots/de/features.securebackup.impl.enter_SecureBackupEnterRecoveryKeyView_Day_0_de.png b/screenshots/de/features.securebackup.impl.enter_SecureBackupEnterRecoveryKeyView_Day_0_de.png index a3f7eca10f..d7b18510b8 100644 --- a/screenshots/de/features.securebackup.impl.enter_SecureBackupEnterRecoveryKeyView_Day_0_de.png +++ b/screenshots/de/features.securebackup.impl.enter_SecureBackupEnterRecoveryKeyView_Day_0_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:af5b6edbc4ee55c99c8aff0cb3a8b99f6c48433697a2b071b36b820a8c0b89ac -size 44700 +oid sha256:87376ec236162d94be973568e748f130e06919e32fffa0a2dc58bc6a63d54d97 +size 45603 diff --git a/screenshots/de/features.securebackup.impl.enter_SecureBackupEnterRecoveryKeyView_Day_1_de.png b/screenshots/de/features.securebackup.impl.enter_SecureBackupEnterRecoveryKeyView_Day_1_de.png index bfdd53ce50..59a08eeebf 100644 --- a/screenshots/de/features.securebackup.impl.enter_SecureBackupEnterRecoveryKeyView_Day_1_de.png +++ b/screenshots/de/features.securebackup.impl.enter_SecureBackupEnterRecoveryKeyView_Day_1_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:03ec094b991196ae554829edf0f81397a9ad8baaac9bb06b6a88a17710e5007b -size 54011 +oid sha256:57fdd01154ee9c6b47064df0876116e6e748189ba43620360bbd56a0e5c343c7 +size 54891 diff --git a/screenshots/de/features.securebackup.impl.enter_SecureBackupEnterRecoveryKeyView_Day_2_de.png b/screenshots/de/features.securebackup.impl.enter_SecureBackupEnterRecoveryKeyView_Day_2_de.png index ff8ec58db7..37cdb90a65 100644 --- a/screenshots/de/features.securebackup.impl.enter_SecureBackupEnterRecoveryKeyView_Day_2_de.png +++ b/screenshots/de/features.securebackup.impl.enter_SecureBackupEnterRecoveryKeyView_Day_2_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:b62106916621aa500c296a921a43d3567739166d6a4050fee3b2246dc8b5a47c -size 54120 +oid sha256:5faa2b8d80dd59a1d50e39f42219e07c8b1d353e2b46ab6905f608a40734705a +size 54936 diff --git a/screenshots/de/features.securebackup.impl.enter_SecureBackupEnterRecoveryKeyView_Day_3_de.png b/screenshots/de/features.securebackup.impl.enter_SecureBackupEnterRecoveryKeyView_Day_3_de.png index 474fd363e9..fe1869e6e5 100644 --- a/screenshots/de/features.securebackup.impl.enter_SecureBackupEnterRecoveryKeyView_Day_3_de.png +++ b/screenshots/de/features.securebackup.impl.enter_SecureBackupEnterRecoveryKeyView_Day_3_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:ef64c212baf51a9e0a96293c549feba2604bf153457b7aded2b19ada306d26a2 -size 51423 +oid sha256:3d6dd613650135a44946be8b74b380782059ff20b81f87b0af5061a197a60e4c +size 52008 diff --git a/screenshots/de/features.securebackup.impl.enter_SecureBackupEnterRecoveryKeyView_Day_4_de.png b/screenshots/de/features.securebackup.impl.enter_SecureBackupEnterRecoveryKeyView_Day_4_de.png new file mode 100644 index 0000000000..2c19dce480 --- /dev/null +++ b/screenshots/de/features.securebackup.impl.enter_SecureBackupEnterRecoveryKeyView_Day_4_de.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:a3dfdef8db439460bc1221a1a1bbc63f17c1dd28d4057b6d664fc9ab5eff5719 +size 48401 diff --git a/screenshots/de/features.securebackup.impl.reset.password_ResetIdentityPasswordView_Day_0_de.png b/screenshots/de/features.securebackup.impl.reset.password_ResetIdentityPasswordView_Day_0_de.png index 1eebe02c06..b1ffc24c87 100644 --- a/screenshots/de/features.securebackup.impl.reset.password_ResetIdentityPasswordView_Day_0_de.png +++ b/screenshots/de/features.securebackup.impl.reset.password_ResetIdentityPasswordView_Day_0_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:04f58df72ebdcb770b9b9fe6dd003c0e63d49b2b8db532312ffa5b2a1701b3f2 -size 31116 +oid sha256:fa7a5ccf8389e9f95d2c8073fe67a13b3326f3bbd936d5a695697f4e038365c0 +size 31209 diff --git a/screenshots/de/features.securebackup.impl.reset.password_ResetIdentityPasswordView_Day_1_de.png b/screenshots/de/features.securebackup.impl.reset.password_ResetIdentityPasswordView_Day_1_de.png index 26afe9811a..e5820c0553 100644 --- a/screenshots/de/features.securebackup.impl.reset.password_ResetIdentityPasswordView_Day_1_de.png +++ b/screenshots/de/features.securebackup.impl.reset.password_ResetIdentityPasswordView_Day_1_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:31428c1b7058a831ac4ccfdd30425bb459f7d09eca08107656ed18fe1496f1c7 -size 29965 +oid sha256:e34410a9c8cd9101e1ee7ed325c5bd0fb9caef604d8b36c86a9640806ffec0d5 +size 30072 diff --git a/screenshots/de/features.securebackup.impl.reset.password_ResetIdentityPasswordView_Day_2_de.png b/screenshots/de/features.securebackup.impl.reset.password_ResetIdentityPasswordView_Day_2_de.png index 26afe9811a..e5820c0553 100644 --- a/screenshots/de/features.securebackup.impl.reset.password_ResetIdentityPasswordView_Day_2_de.png +++ b/screenshots/de/features.securebackup.impl.reset.password_ResetIdentityPasswordView_Day_2_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:31428c1b7058a831ac4ccfdd30425bb459f7d09eca08107656ed18fe1496f1c7 -size 29965 +oid sha256:e34410a9c8cd9101e1ee7ed325c5bd0fb9caef604d8b36c86a9640806ffec0d5 +size 30072 diff --git a/screenshots/de/features.securebackup.impl.reset.password_ResetIdentityPasswordView_Day_3_de.png b/screenshots/de/features.securebackup.impl.reset.password_ResetIdentityPasswordView_Day_3_de.png index 0540d995d8..9acaa7a56d 100644 --- a/screenshots/de/features.securebackup.impl.reset.password_ResetIdentityPasswordView_Day_3_de.png +++ b/screenshots/de/features.securebackup.impl.reset.password_ResetIdentityPasswordView_Day_3_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:ebab59af812c6a4cea61ecf7c73b835c9f47837c84b4e702db5aa6887e5980e3 -size 45092 +oid sha256:a9e9bd98267d2a9cf39bf78796cd330e2dedf674f5eb67d410d7527847b6f3ed +size 45297 diff --git a/screenshots/de/features.securebackup.impl.reset.root_ResetIdentityRootView_Day_0_de.png b/screenshots/de/features.securebackup.impl.reset.root_ResetIdentityRootView_Day_0_de.png index 37a6a0a0e9..1e75ce513e 100644 --- a/screenshots/de/features.securebackup.impl.reset.root_ResetIdentityRootView_Day_0_de.png +++ b/screenshots/de/features.securebackup.impl.reset.root_ResetIdentityRootView_Day_0_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:54862a355da93704e0e6eb779d6a6011296ca2a968117d36cc4eae8fd96173ac -size 69526 +oid sha256:f443fec4459c6af35efec0a3bbbc10737e3295456c17099c61060997fd3f2c07 +size 69576 diff --git a/screenshots/de/features.securebackup.impl.reset.root_ResetIdentityRootView_Day_1_de.png b/screenshots/de/features.securebackup.impl.reset.root_ResetIdentityRootView_Day_1_de.png index a3886a1e3d..f7360421ca 100644 --- a/screenshots/de/features.securebackup.impl.reset.root_ResetIdentityRootView_Day_1_de.png +++ b/screenshots/de/features.securebackup.impl.reset.root_ResetIdentityRootView_Day_1_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:f953a19a979cdee1503766531545b4683bc8b672a26903af8283820768e4a637 -size 53428 +oid sha256:da9bfa180a08787943a22b334f0aa7ff09f3229404581967fe27a26223f119de +size 53340 diff --git a/screenshots/de/features.securebackup.impl.root_SecureBackupRootView_Day_0_de.png b/screenshots/de/features.securebackup.impl.root_SecureBackupRootView_Day_0_de.png index 616ccc4581..d405b610e6 100644 --- a/screenshots/de/features.securebackup.impl.root_SecureBackupRootView_Day_0_de.png +++ b/screenshots/de/features.securebackup.impl.root_SecureBackupRootView_Day_0_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:815b0cd937d4a1cdd3ea44134146396e60df37d8d44bc2a44a19f07d4f738757 -size 45163 +oid sha256:fcfd2629be974eb03b0f6f41670f26599fa78ff4c779268568d68a0d23162954 +size 45139 diff --git a/screenshots/de/features.securebackup.impl.root_SecureBackupRootView_Day_10_de.png b/screenshots/de/features.securebackup.impl.root_SecureBackupRootView_Day_10_de.png index 616ccc4581..d405b610e6 100644 --- a/screenshots/de/features.securebackup.impl.root_SecureBackupRootView_Day_10_de.png +++ b/screenshots/de/features.securebackup.impl.root_SecureBackupRootView_Day_10_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:815b0cd937d4a1cdd3ea44134146396e60df37d8d44bc2a44a19f07d4f738757 -size 45163 +oid sha256:fcfd2629be974eb03b0f6f41670f26599fa78ff4c779268568d68a0d23162954 +size 45139 diff --git a/screenshots/de/features.securebackup.impl.root_SecureBackupRootView_Day_11_de.png b/screenshots/de/features.securebackup.impl.root_SecureBackupRootView_Day_11_de.png index 2fa1e1091e..9d322510f6 100644 --- a/screenshots/de/features.securebackup.impl.root_SecureBackupRootView_Day_11_de.png +++ b/screenshots/de/features.securebackup.impl.root_SecureBackupRootView_Day_11_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:7a1d3cd113712fb92a16e5dba4ca654332de17ba9b8bf358c2822ecc15ab4f78 -size 46111 +oid sha256:912d5638eb392917cb1dc18e43dbf9e978bc9c5c1582a35a4af025a9b1127367 +size 46068 diff --git a/screenshots/de/features.securebackup.impl.root_SecureBackupRootView_Day_12_de.png b/screenshots/de/features.securebackup.impl.root_SecureBackupRootView_Day_12_de.png index 2fa1e1091e..9d322510f6 100644 --- a/screenshots/de/features.securebackup.impl.root_SecureBackupRootView_Day_12_de.png +++ b/screenshots/de/features.securebackup.impl.root_SecureBackupRootView_Day_12_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:7a1d3cd113712fb92a16e5dba4ca654332de17ba9b8bf358c2822ecc15ab4f78 -size 46111 +oid sha256:912d5638eb392917cb1dc18e43dbf9e978bc9c5c1582a35a4af025a9b1127367 +size 46068 diff --git a/screenshots/de/features.securebackup.impl.root_SecureBackupRootView_Day_13_de.png b/screenshots/de/features.securebackup.impl.root_SecureBackupRootView_Day_13_de.png index b80d9bd4af..55afec7620 100644 --- a/screenshots/de/features.securebackup.impl.root_SecureBackupRootView_Day_13_de.png +++ b/screenshots/de/features.securebackup.impl.root_SecureBackupRootView_Day_13_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:f7ecfb9c5ba42edaf1123f7d4fd1dae9d036b51b9a992401ccaefe512abd26b6 -size 74574 +oid sha256:60929d900781d15bc764ff3120289c876dbb0588a8945129fcadf548c27b38d8 +size 74613 diff --git a/screenshots/de/features.securebackup.impl.root_SecureBackupRootView_Day_14_de.png b/screenshots/de/features.securebackup.impl.root_SecureBackupRootView_Day_14_de.png index e21a6c0b86..f605d74d53 100644 --- a/screenshots/de/features.securebackup.impl.root_SecureBackupRootView_Day_14_de.png +++ b/screenshots/de/features.securebackup.impl.root_SecureBackupRootView_Day_14_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:07bbdf3556e48016e4dc011b603ee9361f9488f375b76c9e3fc58d9cbcaaf8d9 -size 68285 +oid sha256:d06c4656ce197da1d76cd6067fe16b52c6ae2bd621bc6ee5804b0f3e9cbd4530 +size 68142 diff --git a/screenshots/de/features.securebackup.impl.root_SecureBackupRootView_Day_15_de.png b/screenshots/de/features.securebackup.impl.root_SecureBackupRootView_Day_15_de.png index f195be7076..a19b5967e8 100644 --- a/screenshots/de/features.securebackup.impl.root_SecureBackupRootView_Day_15_de.png +++ b/screenshots/de/features.securebackup.impl.root_SecureBackupRootView_Day_15_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:eedcee266e42accc3958a5c09b5abdcc493321e6da5455ceac43649c9f468d5a -size 58773 +oid sha256:7acde35b0674305b200b96226e5c0eb355bd89a62962315349a9cc026fa3eb14 +size 58630 diff --git a/screenshots/de/features.securebackup.impl.root_SecureBackupRootView_Day_16_de.png b/screenshots/de/features.securebackup.impl.root_SecureBackupRootView_Day_16_de.png index 7be694d95b..fa51cc3136 100644 --- a/screenshots/de/features.securebackup.impl.root_SecureBackupRootView_Day_16_de.png +++ b/screenshots/de/features.securebackup.impl.root_SecureBackupRootView_Day_16_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:2592bf3e90874c10506b127d3054a7ced3de2acac17f2b03906d9dae1a33d4c4 -size 72494 +oid sha256:eaf76022e22435ed2a6c4d210c96e24b529802b84d077b6e50812525fe6d68ee +size 72621 diff --git a/screenshots/de/features.securebackup.impl.root_SecureBackupRootView_Day_17_de.png b/screenshots/de/features.securebackup.impl.root_SecureBackupRootView_Day_17_de.png index 1cea5b2ff9..982f8daeb5 100644 --- a/screenshots/de/features.securebackup.impl.root_SecureBackupRootView_Day_17_de.png +++ b/screenshots/de/features.securebackup.impl.root_SecureBackupRootView_Day_17_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:217c067d4f0f2e035c8c7ff1c77db5f73941eaeb5798bfc5f5aa07ffc3bcf384 -size 49175 +oid sha256:ede603b925fbbfe304fc67e79e96883c3d5023db775b53e4f79da9a3a1e019ca +size 49095 diff --git a/screenshots/de/features.securebackup.impl.root_SecureBackupRootView_Day_1_de.png b/screenshots/de/features.securebackup.impl.root_SecureBackupRootView_Day_1_de.png index 2fa1e1091e..9d322510f6 100644 --- a/screenshots/de/features.securebackup.impl.root_SecureBackupRootView_Day_1_de.png +++ b/screenshots/de/features.securebackup.impl.root_SecureBackupRootView_Day_1_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:7a1d3cd113712fb92a16e5dba4ca654332de17ba9b8bf358c2822ecc15ab4f78 -size 46111 +oid sha256:912d5638eb392917cb1dc18e43dbf9e978bc9c5c1582a35a4af025a9b1127367 +size 46068 diff --git a/screenshots/de/features.securebackup.impl.root_SecureBackupRootView_Day_2_de.png b/screenshots/de/features.securebackup.impl.root_SecureBackupRootView_Day_2_de.png index 6563d138b1..e68d862bd7 100644 --- a/screenshots/de/features.securebackup.impl.root_SecureBackupRootView_Day_2_de.png +++ b/screenshots/de/features.securebackup.impl.root_SecureBackupRootView_Day_2_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:5519b95d8ef1f1e58e3a1f212440f382e18d34cd5400da3dbdda0cbb2c125cf7 -size 46489 +oid sha256:65a9cdf5c00daaac7cf3bf3130f8f9042fa0418f0fed7d207989d07ceb212d5d +size 46444 diff --git a/screenshots/de/features.securebackup.impl.root_SecureBackupRootView_Day_3_de.png b/screenshots/de/features.securebackup.impl.root_SecureBackupRootView_Day_3_de.png index 009c89fd9a..1486e3bf5b 100644 --- a/screenshots/de/features.securebackup.impl.root_SecureBackupRootView_Day_3_de.png +++ b/screenshots/de/features.securebackup.impl.root_SecureBackupRootView_Day_3_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:a7a354cd460888edd65a2185602d967314c620a2b3092d7c3eadc6e203d5cb13 -size 47214 +oid sha256:c179e94af188eb4e0496e8cfd7422c59cd373d5becb21782d02fb304ab6ce158 +size 47159 diff --git a/screenshots/de/features.securebackup.impl.root_SecureBackupRootView_Day_4_de.png b/screenshots/de/features.securebackup.impl.root_SecureBackupRootView_Day_4_de.png index 616ccc4581..d405b610e6 100644 --- a/screenshots/de/features.securebackup.impl.root_SecureBackupRootView_Day_4_de.png +++ b/screenshots/de/features.securebackup.impl.root_SecureBackupRootView_Day_4_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:815b0cd937d4a1cdd3ea44134146396e60df37d8d44bc2a44a19f07d4f738757 -size 45163 +oid sha256:fcfd2629be974eb03b0f6f41670f26599fa78ff4c779268568d68a0d23162954 +size 45139 diff --git a/screenshots/de/features.securebackup.impl.root_SecureBackupRootView_Day_5_de.png b/screenshots/de/features.securebackup.impl.root_SecureBackupRootView_Day_5_de.png index 2fa1e1091e..9d322510f6 100644 --- a/screenshots/de/features.securebackup.impl.root_SecureBackupRootView_Day_5_de.png +++ b/screenshots/de/features.securebackup.impl.root_SecureBackupRootView_Day_5_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:7a1d3cd113712fb92a16e5dba4ca654332de17ba9b8bf358c2822ecc15ab4f78 -size 46111 +oid sha256:912d5638eb392917cb1dc18e43dbf9e978bc9c5c1582a35a4af025a9b1127367 +size 46068 diff --git a/screenshots/de/features.securebackup.impl.root_SecureBackupRootView_Day_6_de.png b/screenshots/de/features.securebackup.impl.root_SecureBackupRootView_Day_6_de.png index e9298b6c95..633c56ca7f 100644 --- a/screenshots/de/features.securebackup.impl.root_SecureBackupRootView_Day_6_de.png +++ b/screenshots/de/features.securebackup.impl.root_SecureBackupRootView_Day_6_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:7cd028ca1dde88093ad553a58273a6f88565a14d84ffd563394d6b352914b34f -size 38885 +oid sha256:440258bb1f0eb7ee8e866f8cf9b278869cb35913e62f7883a4b0cc83753a8742 +size 38805 diff --git a/screenshots/de/features.securebackup.impl.root_SecureBackupRootView_Day_7_de.png b/screenshots/de/features.securebackup.impl.root_SecureBackupRootView_Day_7_de.png index 2fa1e1091e..9d322510f6 100644 --- a/screenshots/de/features.securebackup.impl.root_SecureBackupRootView_Day_7_de.png +++ b/screenshots/de/features.securebackup.impl.root_SecureBackupRootView_Day_7_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:7a1d3cd113712fb92a16e5dba4ca654332de17ba9b8bf358c2822ecc15ab4f78 -size 46111 +oid sha256:912d5638eb392917cb1dc18e43dbf9e978bc9c5c1582a35a4af025a9b1127367 +size 46068 diff --git a/screenshots/de/features.securebackup.impl.root_SecureBackupRootView_Day_8_de.png b/screenshots/de/features.securebackup.impl.root_SecureBackupRootView_Day_8_de.png index 2fa1e1091e..9d322510f6 100644 --- a/screenshots/de/features.securebackup.impl.root_SecureBackupRootView_Day_8_de.png +++ b/screenshots/de/features.securebackup.impl.root_SecureBackupRootView_Day_8_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:7a1d3cd113712fb92a16e5dba4ca654332de17ba9b8bf358c2822ecc15ab4f78 -size 46111 +oid sha256:912d5638eb392917cb1dc18e43dbf9e978bc9c5c1582a35a4af025a9b1127367 +size 46068 diff --git a/screenshots/de/features.securebackup.impl.root_SecureBackupRootView_Day_9_de.png b/screenshots/de/features.securebackup.impl.root_SecureBackupRootView_Day_9_de.png index 2fa1e1091e..9d322510f6 100644 --- a/screenshots/de/features.securebackup.impl.root_SecureBackupRootView_Day_9_de.png +++ b/screenshots/de/features.securebackup.impl.root_SecureBackupRootView_Day_9_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:7a1d3cd113712fb92a16e5dba4ca654332de17ba9b8bf358c2822ecc15ab4f78 -size 46111 +oid sha256:912d5638eb392917cb1dc18e43dbf9e978bc9c5c1582a35a4af025a9b1127367 +size 46068 diff --git a/screenshots/de/features.securebackup.impl.setup.views_RecoveryKeyView_Day_0_de.png b/screenshots/de/features.securebackup.impl.setup.views_RecoveryKeyView_Day_0_de.png index e9b20667b2..046fdf98f7 100644 --- a/screenshots/de/features.securebackup.impl.setup.views_RecoveryKeyView_Day_0_de.png +++ b/screenshots/de/features.securebackup.impl.setup.views_RecoveryKeyView_Day_0_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:c2b60e9c2fecc2b582976832543718487d9af77274261074e4c51dc8110acb46 -size 20676 +oid sha256:dfccf862e7d77889f282a7f2b5bc786ddd1cd3727c3d599643067ac37ec4bb34 +size 20722 diff --git a/screenshots/de/features.securebackup.impl.setup.views_RecoveryKeyView_Day_10_de.png b/screenshots/de/features.securebackup.impl.setup.views_RecoveryKeyView_Day_10_de.png index ca3893ec78..7359ced4e5 100644 --- a/screenshots/de/features.securebackup.impl.setup.views_RecoveryKeyView_Day_10_de.png +++ b/screenshots/de/features.securebackup.impl.setup.views_RecoveryKeyView_Day_10_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:27334cd7e92c6a3ad7c5cc6ab6d9af41b3424356ee8948a665d2a09d73ca967f -size 28834 +oid sha256:303a052955062e205dfb8eb9184e45623b3fdb2a2c7a5c07a951df5f10d6bfae +size 29837 diff --git a/screenshots/de/features.securebackup.impl.setup.views_RecoveryKeyView_Day_11_de.png b/screenshots/de/features.securebackup.impl.setup.views_RecoveryKeyView_Day_11_de.png index 764d47e6c1..8f943194b8 100644 --- a/screenshots/de/features.securebackup.impl.setup.views_RecoveryKeyView_Day_11_de.png +++ b/screenshots/de/features.securebackup.impl.setup.views_RecoveryKeyView_Day_11_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:5636f99a8f010f97c16f91e42b339dbf96664d4e616dbdddce15af45dbce8d1c -size 28616 +oid sha256:b8afdae33c4e7d344eb018392bdae4d3d42f7373d07230c2368f26b4ac2d6e7d +size 29444 diff --git a/screenshots/de/features.securebackup.impl.setup.views_RecoveryKeyView_Day_12_de.png b/screenshots/de/features.securebackup.impl.setup.views_RecoveryKeyView_Day_12_de.png index ca3893ec78..7359ced4e5 100644 --- a/screenshots/de/features.securebackup.impl.setup.views_RecoveryKeyView_Day_12_de.png +++ b/screenshots/de/features.securebackup.impl.setup.views_RecoveryKeyView_Day_12_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:27334cd7e92c6a3ad7c5cc6ab6d9af41b3424356ee8948a665d2a09d73ca967f -size 28834 +oid sha256:303a052955062e205dfb8eb9184e45623b3fdb2a2c7a5c07a951df5f10d6bfae +size 29837 diff --git a/screenshots/de/features.securebackup.impl.setup.views_RecoveryKeyView_Day_13_de.png b/screenshots/de/features.securebackup.impl.setup.views_RecoveryKeyView_Day_13_de.png index 237e5a7b6a..1b3dfeeecd 100644 --- a/screenshots/de/features.securebackup.impl.setup.views_RecoveryKeyView_Day_13_de.png +++ b/screenshots/de/features.securebackup.impl.setup.views_RecoveryKeyView_Day_13_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:98060280deae5e59b8ba5f707dbfe0cc429f22d17aab6a026d2fc5951a0e3c6d -size 24225 +oid sha256:f288fa2dad455d1975650a1a6eccca2f2749540e77b5b89c836d69782db06719 +size 25694 diff --git a/screenshots/de/features.securebackup.impl.setup.views_RecoveryKeyView_Day_14_de.png b/screenshots/de/features.securebackup.impl.setup.views_RecoveryKeyView_Day_14_de.png new file mode 100644 index 0000000000..4e7459f850 --- /dev/null +++ b/screenshots/de/features.securebackup.impl.setup.views_RecoveryKeyView_Day_14_de.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:aa96943056b0df8b39a6e759fbbdee9a74e191fe72db78dd1ab7cfa8c0bc5f0d +size 23406 diff --git a/screenshots/de/features.securebackup.impl.setup.views_RecoveryKeyView_Day_1_de.png b/screenshots/de/features.securebackup.impl.setup.views_RecoveryKeyView_Day_1_de.png index 13f5b6460b..0ffd345800 100644 --- a/screenshots/de/features.securebackup.impl.setup.views_RecoveryKeyView_Day_1_de.png +++ b/screenshots/de/features.securebackup.impl.setup.views_RecoveryKeyView_Day_1_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:a413daff5487085619bd9252215b5c10acd148553473efbf3aa5ed0363ad93cb -size 16925 +oid sha256:6fc2023ee98a0e4522033d1e3309cd83905a06ec26dfb094cbd37c99e8b4011f +size 16941 diff --git a/screenshots/de/features.securebackup.impl.setup.views_RecoveryKeyView_Day_2_de.png b/screenshots/de/features.securebackup.impl.setup.views_RecoveryKeyView_Day_2_de.png index 9a8d49404d..c6122e9c98 100644 --- a/screenshots/de/features.securebackup.impl.setup.views_RecoveryKeyView_Day_2_de.png +++ b/screenshots/de/features.securebackup.impl.setup.views_RecoveryKeyView_Day_2_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:afcab4f9e2d8be5ddf3d8dbc6f066fc9546d2f002aae5c2236a3098769c00c8e -size 26529 +oid sha256:d64fb359bd763930be6a6e37be3ebeaab3d8ec3cbfe28f11070fb44f33fce52e +size 26598 diff --git a/screenshots/de/features.securebackup.impl.setup.views_RecoveryKeyView_Day_3_de.png b/screenshots/de/features.securebackup.impl.setup.views_RecoveryKeyView_Day_3_de.png index 9a8d49404d..c6122e9c98 100644 --- a/screenshots/de/features.securebackup.impl.setup.views_RecoveryKeyView_Day_3_de.png +++ b/screenshots/de/features.securebackup.impl.setup.views_RecoveryKeyView_Day_3_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:afcab4f9e2d8be5ddf3d8dbc6f066fc9546d2f002aae5c2236a3098769c00c8e -size 26529 +oid sha256:d64fb359bd763930be6a6e37be3ebeaab3d8ec3cbfe28f11070fb44f33fce52e +size 26598 diff --git a/screenshots/de/features.securebackup.impl.setup.views_RecoveryKeyView_Day_4_de.png b/screenshots/de/features.securebackup.impl.setup.views_RecoveryKeyView_Day_4_de.png index e9b20667b2..046fdf98f7 100644 --- a/screenshots/de/features.securebackup.impl.setup.views_RecoveryKeyView_Day_4_de.png +++ b/screenshots/de/features.securebackup.impl.setup.views_RecoveryKeyView_Day_4_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:c2b60e9c2fecc2b582976832543718487d9af77274261074e4c51dc8110acb46 -size 20676 +oid sha256:dfccf862e7d77889f282a7f2b5bc786ddd1cd3727c3d599643067ac37ec4bb34 +size 20722 diff --git a/screenshots/de/features.securebackup.impl.setup.views_RecoveryKeyView_Day_5_de.png b/screenshots/de/features.securebackup.impl.setup.views_RecoveryKeyView_Day_5_de.png index 13f5b6460b..0ffd345800 100644 --- a/screenshots/de/features.securebackup.impl.setup.views_RecoveryKeyView_Day_5_de.png +++ b/screenshots/de/features.securebackup.impl.setup.views_RecoveryKeyView_Day_5_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:a413daff5487085619bd9252215b5c10acd148553473efbf3aa5ed0363ad93cb -size 16925 +oid sha256:6fc2023ee98a0e4522033d1e3309cd83905a06ec26dfb094cbd37c99e8b4011f +size 16941 diff --git a/screenshots/de/features.securebackup.impl.setup.views_RecoveryKeyView_Day_6_de.png b/screenshots/de/features.securebackup.impl.setup.views_RecoveryKeyView_Day_6_de.png index 9a8d49404d..c6122e9c98 100644 --- a/screenshots/de/features.securebackup.impl.setup.views_RecoveryKeyView_Day_6_de.png +++ b/screenshots/de/features.securebackup.impl.setup.views_RecoveryKeyView_Day_6_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:afcab4f9e2d8be5ddf3d8dbc6f066fc9546d2f002aae5c2236a3098769c00c8e -size 26529 +oid sha256:d64fb359bd763930be6a6e37be3ebeaab3d8ec3cbfe28f11070fb44f33fce52e +size 26598 diff --git a/screenshots/de/features.securebackup.impl.setup.views_RecoveryKeyView_Day_7_de.png b/screenshots/de/features.securebackup.impl.setup.views_RecoveryKeyView_Day_7_de.png index 9a8d49404d..c6122e9c98 100644 --- a/screenshots/de/features.securebackup.impl.setup.views_RecoveryKeyView_Day_7_de.png +++ b/screenshots/de/features.securebackup.impl.setup.views_RecoveryKeyView_Day_7_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:afcab4f9e2d8be5ddf3d8dbc6f066fc9546d2f002aae5c2236a3098769c00c8e -size 26529 +oid sha256:d64fb359bd763930be6a6e37be3ebeaab3d8ec3cbfe28f11070fb44f33fce52e +size 26598 diff --git a/screenshots/de/features.securebackup.impl.setup.views_RecoveryKeyView_Day_8_de.png b/screenshots/de/features.securebackup.impl.setup.views_RecoveryKeyView_Day_8_de.png index 974afa7061..62e3e51642 100644 --- a/screenshots/de/features.securebackup.impl.setup.views_RecoveryKeyView_Day_8_de.png +++ b/screenshots/de/features.securebackup.impl.setup.views_RecoveryKeyView_Day_8_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:1a2de493b5cba8cb705d74a4175c9102f961a4bf120b723b6fd862a57cd13a58 -size 20304 +oid sha256:19eca70164d75bad98c937f9dd6672fa318d1509d09f761b3be78c509e91edcc +size 22005 diff --git a/screenshots/de/features.securebackup.impl.setup.views_RecoveryKeyView_Day_9_de.png b/screenshots/de/features.securebackup.impl.setup.views_RecoveryKeyView_Day_9_de.png index a67c0639fe..023e49e1ad 100644 --- a/screenshots/de/features.securebackup.impl.setup.views_RecoveryKeyView_Day_9_de.png +++ b/screenshots/de/features.securebackup.impl.setup.views_RecoveryKeyView_Day_9_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:f8c9c08922408e5711bf63204cf9e26280109cdfdee29d1081fb91925ec40a2a -size 20679 +oid sha256:c2c99a457047cab44c2c4b56d1e0c9a31950cc7ce5f904665dfaccfa79afc128 +size 21672 diff --git a/screenshots/de/features.securebackup.impl.setup_SecureBackupSetupViewChange_Day_0_de.png b/screenshots/de/features.securebackup.impl.setup_SecureBackupSetupViewChange_Day_0_de.png index 7862c07b34..3d64b914fe 100644 --- a/screenshots/de/features.securebackup.impl.setup_SecureBackupSetupViewChange_Day_0_de.png +++ b/screenshots/de/features.securebackup.impl.setup_SecureBackupSetupViewChange_Day_0_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:c41db568ef86660c72181c40c9394031d5d12f5e794ebc513869991b37a7d957 -size 51836 +oid sha256:41efb25b3a2878ed5f1da9e965541df89a2221dc76826b02d6f5e451eaa55108 +size 51976 diff --git a/screenshots/de/features.securebackup.impl.setup_SecureBackupSetupViewChange_Day_1_de.png b/screenshots/de/features.securebackup.impl.setup_SecureBackupSetupViewChange_Day_1_de.png index 9c83d065f0..2aec5827b0 100644 --- a/screenshots/de/features.securebackup.impl.setup_SecureBackupSetupViewChange_Day_1_de.png +++ b/screenshots/de/features.securebackup.impl.setup_SecureBackupSetupViewChange_Day_1_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:a06c9f9245cf3b02229fcb838976a4d2272d44e40338e36e026dea7677e70ac9 -size 48416 +oid sha256:036a9f3744673cd2af05fd1b87c38e87b11d9df3748bb812ed2bf4dd3ea534df +size 48505 diff --git a/screenshots/de/features.securebackup.impl.setup_SecureBackupSetupViewChange_Day_2_de.png b/screenshots/de/features.securebackup.impl.setup_SecureBackupSetupViewChange_Day_2_de.png index 933993102a..b9dcbb7810 100644 --- a/screenshots/de/features.securebackup.impl.setup_SecureBackupSetupViewChange_Day_2_de.png +++ b/screenshots/de/features.securebackup.impl.setup_SecureBackupSetupViewChange_Day_2_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:a3766ba621a245967c15b7b83fa72bd9e4d7546a37f5ea4caf83c6788a1aa5b6 -size 61181 +oid sha256:183d775575bddcb0fab1b15363cc960914912dd43997469f28abf418dc85620a +size 61176 diff --git a/screenshots/de/features.securebackup.impl.setup_SecureBackupSetupViewChange_Day_3_de.png b/screenshots/de/features.securebackup.impl.setup_SecureBackupSetupViewChange_Day_3_de.png index 933993102a..b9dcbb7810 100644 --- a/screenshots/de/features.securebackup.impl.setup_SecureBackupSetupViewChange_Day_3_de.png +++ b/screenshots/de/features.securebackup.impl.setup_SecureBackupSetupViewChange_Day_3_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:a3766ba621a245967c15b7b83fa72bd9e4d7546a37f5ea4caf83c6788a1aa5b6 -size 61181 +oid sha256:183d775575bddcb0fab1b15363cc960914912dd43997469f28abf418dc85620a +size 61176 diff --git a/screenshots/de/features.securebackup.impl.setup_SecureBackupSetupViewChange_Day_4_de.png b/screenshots/de/features.securebackup.impl.setup_SecureBackupSetupViewChange_Day_4_de.png index 45fee6dd26..4f9799791e 100644 --- a/screenshots/de/features.securebackup.impl.setup_SecureBackupSetupViewChange_Day_4_de.png +++ b/screenshots/de/features.securebackup.impl.setup_SecureBackupSetupViewChange_Day_4_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:2fe92f15ed85ca629e56dad8c30487aee018a51fc4e9eaf6eab29a2eb4c27d42 -size 51695 +oid sha256:fa05ada01146fa4cfacd1bea817959e7253c5fb933f8f17320ae5f2c8b0a9e83 +size 51846 diff --git a/screenshots/de/features.securebackup.impl.setup_SecureBackupSetupViewChange_Day_5_de.png b/screenshots/de/features.securebackup.impl.setup_SecureBackupSetupViewChange_Day_5_de.png index 5247c53d90..1a226e1546 100644 --- a/screenshots/de/features.securebackup.impl.setup_SecureBackupSetupViewChange_Day_5_de.png +++ b/screenshots/de/features.securebackup.impl.setup_SecureBackupSetupViewChange_Day_5_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:22b11c5a6b5727f2e75c712a09a6d4a4ca103046c488a91f26e932cd1a2e2f2e -size 42522 +oid sha256:cb52202cc8e4a53de3556a6920817cff3f6df930824c5c58d2d4d8f30bbf85c1 +size 42661 diff --git a/screenshots/de/features.securebackup.impl.setup_SecureBackupSetupView_Day_0_de.png b/screenshots/de/features.securebackup.impl.setup_SecureBackupSetupView_Day_0_de.png index ac9e47eac1..f2c5fae8f6 100644 --- a/screenshots/de/features.securebackup.impl.setup_SecureBackupSetupView_Day_0_de.png +++ b/screenshots/de/features.securebackup.impl.setup_SecureBackupSetupView_Day_0_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:f4915dcc73c8761e491613c91542f65ea0e549bac1852b10770b9087b1f90a48 -size 61415 +oid sha256:597162d2e0f3d1113e0c1dc75ca8b9081bfa8c107499bb9c952d4b4c481a20fc +size 61462 diff --git a/screenshots/de/features.securebackup.impl.setup_SecureBackupSetupView_Day_1_de.png b/screenshots/de/features.securebackup.impl.setup_SecureBackupSetupView_Day_1_de.png index 6f657e67f8..62c7d701f3 100644 --- a/screenshots/de/features.securebackup.impl.setup_SecureBackupSetupView_Day_1_de.png +++ b/screenshots/de/features.securebackup.impl.setup_SecureBackupSetupView_Day_1_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:e1fe049a477258416fb2964230845ebf009e35d0a7baabefa624842cf1e8ff89 -size 57768 +oid sha256:c4be1c4435ac8ccc7a4d5591374185c1d96771fd6e11a27392d6d2cd80bb1c0b +size 57688 diff --git a/screenshots/de/features.securebackup.impl.setup_SecureBackupSetupView_Day_2_de.png b/screenshots/de/features.securebackup.impl.setup_SecureBackupSetupView_Day_2_de.png index 933993102a..b9dcbb7810 100644 --- a/screenshots/de/features.securebackup.impl.setup_SecureBackupSetupView_Day_2_de.png +++ b/screenshots/de/features.securebackup.impl.setup_SecureBackupSetupView_Day_2_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:a3766ba621a245967c15b7b83fa72bd9e4d7546a37f5ea4caf83c6788a1aa5b6 -size 61181 +oid sha256:183d775575bddcb0fab1b15363cc960914912dd43997469f28abf418dc85620a +size 61176 diff --git a/screenshots/de/features.securebackup.impl.setup_SecureBackupSetupView_Day_3_de.png b/screenshots/de/features.securebackup.impl.setup_SecureBackupSetupView_Day_3_de.png index 933993102a..b9dcbb7810 100644 --- a/screenshots/de/features.securebackup.impl.setup_SecureBackupSetupView_Day_3_de.png +++ b/screenshots/de/features.securebackup.impl.setup_SecureBackupSetupView_Day_3_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:a3766ba621a245967c15b7b83fa72bd9e4d7546a37f5ea4caf83c6788a1aa5b6 -size 61181 +oid sha256:183d775575bddcb0fab1b15363cc960914912dd43997469f28abf418dc85620a +size 61176 diff --git a/screenshots/de/features.securebackup.impl.setup_SecureBackupSetupView_Day_4_de.png b/screenshots/de/features.securebackup.impl.setup_SecureBackupSetupView_Day_4_de.png index 45fee6dd26..4f9799791e 100644 --- a/screenshots/de/features.securebackup.impl.setup_SecureBackupSetupView_Day_4_de.png +++ b/screenshots/de/features.securebackup.impl.setup_SecureBackupSetupView_Day_4_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:2fe92f15ed85ca629e56dad8c30487aee018a51fc4e9eaf6eab29a2eb4c27d42 -size 51695 +oid sha256:fa05ada01146fa4cfacd1bea817959e7253c5fb933f8f17320ae5f2c8b0a9e83 +size 51846 diff --git a/screenshots/de/features.securebackup.impl.setup_SecureBackupSetupView_Day_5_de.png b/screenshots/de/features.securebackup.impl.setup_SecureBackupSetupView_Day_5_de.png index b740e854ef..d0a8e3c4df 100644 --- a/screenshots/de/features.securebackup.impl.setup_SecureBackupSetupView_Day_5_de.png +++ b/screenshots/de/features.securebackup.impl.setup_SecureBackupSetupView_Day_5_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:6df431d98a676b66cd326fc27e2081a6d9998e7b9b709d922ce038ad5114fb6e -size 43758 +oid sha256:d82ac18cfb6823b04e0795d574b09e78164d5a7b9a7e78773e03deb9effcbf99 +size 43953 diff --git a/screenshots/de/features.share.impl_ShareView_Day_3_de.png b/screenshots/de/features.share.impl_ShareView_Day_3_de.png index e56fc99ed1..415bf08603 100644 --- a/screenshots/de/features.share.impl_ShareView_Day_3_de.png +++ b/screenshots/de/features.share.impl_ShareView_Day_3_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:346ce8a3b2353353d3b97a5a20c773a74b534fd0ab7f1d14d3d32bfeb5490f74 -size 9297 +oid sha256:a8077b421a93fb66d11503d75b558acda35947f5886c0f11d6b81dcf1c5e7653 +size 8681 diff --git a/screenshots/de/features.signedout.impl_SignedOutView_Day_0_de.png b/screenshots/de/features.signedout.impl_SignedOutView_Day_0_de.png index 9c6f85a915..171b9bd150 100644 --- a/screenshots/de/features.signedout.impl_SignedOutView_Day_0_de.png +++ b/screenshots/de/features.signedout.impl_SignedOutView_Day_0_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:5e794da71cadd6f1e9f0662a359325c9cae1e8ebc9877537a1fdba6d1c006ce6 -size 63399 +oid sha256:7ceca6380333b385e58bcab925625270901033de24bcce391ba6321e6d880ac0 +size 63371 diff --git a/screenshots/de/features.startchat.impl.components_SearchMultipleUsersResultItem_de.png b/screenshots/de/features.startchat.impl.components_SearchMultipleUsersResultItem_de.png new file mode 100644 index 0000000000..c1cf8833e4 --- /dev/null +++ b/screenshots/de/features.startchat.impl.components_SearchMultipleUsersResultItem_de.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:3cc5e887a1de69fc216a215680104098f1a689e5db992c3e65e5b66b0891d1cc +size 101103 diff --git a/screenshots/de/features.startchat.impl.components_SearchSingleUserResultItem_de.png b/screenshots/de/features.startchat.impl.components_SearchSingleUserResultItem_de.png new file mode 100644 index 0000000000..6ba2bd1cc4 --- /dev/null +++ b/screenshots/de/features.startchat.impl.components_SearchSingleUserResultItem_de.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:108b4c1abb1f143171e35aebd055da2fd52a95e1df8fc8dab29a797da7288beb +size 51250 diff --git a/screenshots/de/features.startchat.impl.components_UserListView_Day_0_de.png b/screenshots/de/features.startchat.impl.components_UserListView_Day_0_de.png new file mode 100644 index 0000000000..4484ebdad3 --- /dev/null +++ b/screenshots/de/features.startchat.impl.components_UserListView_Day_0_de.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:9401507c454cdb4babcc0bee4faa09f7199a64c5af349ce15a9df82956e10642 +size 9261 diff --git a/screenshots/de/features.startchat.impl.components_UserListView_Day_1_de.png b/screenshots/de/features.startchat.impl.components_UserListView_Day_1_de.png new file mode 100644 index 0000000000..aaa5964462 --- /dev/null +++ b/screenshots/de/features.startchat.impl.components_UserListView_Day_1_de.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:ac691a431d544e0e4c33c62b51c86f26efb9088a00a05cb9d3151256e2290eed +size 21823 diff --git a/screenshots/de/features.startchat.impl.components_UserListView_Day_2_de.png b/screenshots/de/features.startchat.impl.components_UserListView_Day_2_de.png new file mode 100644 index 0000000000..6a4ec71b9a --- /dev/null +++ b/screenshots/de/features.startchat.impl.components_UserListView_Day_2_de.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:2297fbeb63dbbf5281266f90015e047528e3287c923e2207af061458fd12897e +size 7929 diff --git a/screenshots/de/features.startchat.impl.components_UserListView_Day_7_de.png b/screenshots/de/features.startchat.impl.components_UserListView_Day_7_de.png new file mode 100644 index 0000000000..8397efd92e --- /dev/null +++ b/screenshots/de/features.startchat.impl.components_UserListView_Day_7_de.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:31de17fb1f44c06ffd9ce5d7e59c91b7da986720f90074802b1b566b55859186 +size 12303 diff --git a/screenshots/de/features.startchat.impl.components_UserListView_Day_9_de.png b/screenshots/de/features.startchat.impl.components_UserListView_Day_9_de.png new file mode 100644 index 0000000000..34ff3e91f3 --- /dev/null +++ b/screenshots/de/features.startchat.impl.components_UserListView_Day_9_de.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:fcd3d8e40e5d9f23c941efa17c37d0473df47d7924d2f51c94022a6c08f559a8 +size 37181 diff --git a/screenshots/de/features.startchat.impl.joinbyaddress_JoinRoomByAddressView_Day_0_de.png b/screenshots/de/features.startchat.impl.joinbyaddress_JoinRoomByAddressView_Day_0_de.png new file mode 100644 index 0000000000..abef461fea --- /dev/null +++ b/screenshots/de/features.startchat.impl.joinbyaddress_JoinRoomByAddressView_Day_0_de.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:dfa67f7e6470d840b3ccba4e44cba9dceeefdcc0daee1c989055bb2397690566 +size 18295 diff --git a/screenshots/de/features.startchat.impl.joinbyaddress_JoinRoomByAddressView_Day_1_de.png b/screenshots/de/features.startchat.impl.joinbyaddress_JoinRoomByAddressView_Day_1_de.png new file mode 100644 index 0000000000..08b1dbe723 --- /dev/null +++ b/screenshots/de/features.startchat.impl.joinbyaddress_JoinRoomByAddressView_Day_1_de.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:4a73ecdbe320b067c85c977c9d9ad649960c26ef9ce71b7080488cc6a4779b43 +size 18268 diff --git a/screenshots/de/features.startchat.impl.joinbyaddress_JoinRoomByAddressView_Day_2_de.png b/screenshots/de/features.startchat.impl.joinbyaddress_JoinRoomByAddressView_Day_2_de.png new file mode 100644 index 0000000000..f256b13970 --- /dev/null +++ b/screenshots/de/features.startchat.impl.joinbyaddress_JoinRoomByAddressView_Day_2_de.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:1b915b6fbe89255837a9cb61ea4465642fee00074c9d0bdcf2cba0f544e7b8c5 +size 18490 diff --git a/screenshots/de/features.startchat.impl.joinbyaddress_JoinRoomByAddressView_Day_3_de.png b/screenshots/de/features.startchat.impl.joinbyaddress_JoinRoomByAddressView_Day_3_de.png new file mode 100644 index 0000000000..7a37d92c1d --- /dev/null +++ b/screenshots/de/features.startchat.impl.joinbyaddress_JoinRoomByAddressView_Day_3_de.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:70856d165ce82eb2fec054f3c2be237733b0ed6b13a10c5eaa30f7cea7ad2b81 +size 21807 diff --git a/screenshots/de/features.startchat.impl.joinbyaddress_JoinRoomByAddressView_Day_4_de.png b/screenshots/de/features.startchat.impl.joinbyaddress_JoinRoomByAddressView_Day_4_de.png new file mode 100644 index 0000000000..faf4394aaa --- /dev/null +++ b/screenshots/de/features.startchat.impl.joinbyaddress_JoinRoomByAddressView_Day_4_de.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:d3b644f28632f427d9f4109b4bb5fd0fb9814d617c8e3af6e4aafc7b80c9c1bd +size 21425 diff --git a/screenshots/de/features.startchat.impl.joinbyaddress_JoinRoomByAddressView_Day_5_de.png b/screenshots/de/features.startchat.impl.joinbyaddress_JoinRoomByAddressView_Day_5_de.png new file mode 100644 index 0000000000..b600fe75ad --- /dev/null +++ b/screenshots/de/features.startchat.impl.joinbyaddress_JoinRoomByAddressView_Day_5_de.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:2d1b1ad058509bedd48422f5d64ca313c00fd50d2458a3f2f961910b1c5e93be +size 21741 diff --git a/screenshots/de/features.startchat.impl.root_StartChatView_Day_0_de.png b/screenshots/de/features.startchat.impl.root_StartChatView_Day_0_de.png new file mode 100644 index 0000000000..b450e243a6 --- /dev/null +++ b/screenshots/de/features.startchat.impl.root_StartChatView_Day_0_de.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:ff886e4d75f5a079527252384d4a96d2ee18af5686c1b4ae45b6fb7e4b4cf390 +size 28090 diff --git a/screenshots/de/features.startchat.impl.root_StartChatView_Day_1_de.png b/screenshots/de/features.startchat.impl.root_StartChatView_Day_1_de.png new file mode 100644 index 0000000000..cfab50e88e --- /dev/null +++ b/screenshots/de/features.startchat.impl.root_StartChatView_Day_1_de.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:b9c75cdedd4c36873fcd9c7666e17915d2167b3471777201e4e6bf20dc5a0010 +size 21031 diff --git a/screenshots/de/features.startchat.impl.root_StartChatView_Day_2_de.png b/screenshots/de/features.startchat.impl.root_StartChatView_Day_2_de.png new file mode 100644 index 0000000000..cb7209b068 --- /dev/null +++ b/screenshots/de/features.startchat.impl.root_StartChatView_Day_2_de.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:8b070f5671759396846a0796cb94307a429724318a74277a388839e79cb5c5e4 +size 31873 diff --git a/screenshots/de/features.startchat.impl.root_StartChatView_Day_3_de.png b/screenshots/de/features.startchat.impl.root_StartChatView_Day_3_de.png new file mode 100644 index 0000000000..3320dc49a8 --- /dev/null +++ b/screenshots/de/features.startchat.impl.root_StartChatView_Day_3_de.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:ec00175564a0a857d6bedd92eede06d191e9946224a76d8e4963c2d5748cf852 +size 55182 diff --git a/screenshots/de/features.startchat.impl.root_StartChatView_Day_4_de.png b/screenshots/de/features.startchat.impl.root_StartChatView_Day_4_de.png new file mode 100644 index 0000000000..f2029512b6 --- /dev/null +++ b/screenshots/de/features.startchat.impl.root_StartChatView_Day_4_de.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:57891ff2cc162505a6c4326d536720e49411f9eaf5a045b6d831b86c76fbef15 +size 45801 diff --git a/screenshots/de/features.startchat.impl.root_StartChatView_Day_5_de.png b/screenshots/de/features.startchat.impl.root_StartChatView_Day_5_de.png new file mode 100644 index 0000000000..73a3eedd97 --- /dev/null +++ b/screenshots/de/features.startchat.impl.root_StartChatView_Day_5_de.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:aeaedf2423783724b72fcd49b036ee29ae702c13fc86960eea1d3f091995adbf +size 32105 diff --git a/screenshots/de/features.userprofile.shared_UserProfileHeaderSectionWithVerificationViolation_Day_0_de.png b/screenshots/de/features.userprofile.shared_UserProfileHeaderSectionWithVerificationViolation_Day_0_de.png index 0347f23cbe..a5bd05f76a 100644 --- a/screenshots/de/features.userprofile.shared_UserProfileHeaderSectionWithVerificationViolation_Day_0_de.png +++ b/screenshots/de/features.userprofile.shared_UserProfileHeaderSectionWithVerificationViolation_Day_0_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:7fd007d20fc02d44d2230aa5471c2b7242cc3aff862025517a11a3ec2b8acfb8 -size 25057 +oid sha256:efcf75e329a329b37365e32f57fd6fc137a25f1b40cd5612249a56ea931d9037 +size 25495 diff --git a/screenshots/de/features.userprofile.shared_UserProfileHeaderSection_Day_0_de.png b/screenshots/de/features.userprofile.shared_UserProfileHeaderSection_Day_0_de.png index c80c1adae1..51436e8bbc 100644 --- a/screenshots/de/features.userprofile.shared_UserProfileHeaderSection_Day_0_de.png +++ b/screenshots/de/features.userprofile.shared_UserProfileHeaderSection_Day_0_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:c317599d84833c06a9931e41c0f20eacae4ea86dd1aa47f44c365acf34842707 -size 15395 +oid sha256:17589eb4a584617876c67f4dc7c5009ebf119b0bcbc3c117fa04f8e5764ab71e +size 16043 diff --git a/screenshots/de/features.userprofile.shared_UserProfileView_Day_0_de.png b/screenshots/de/features.userprofile.shared_UserProfileView_Day_0_de.png index 9b265262bc..c55dfeb43a 100644 --- a/screenshots/de/features.userprofile.shared_UserProfileView_Day_0_de.png +++ b/screenshots/de/features.userprofile.shared_UserProfileView_Day_0_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:c306232fc144adf7089d62cd867daf9a9abab26dadc3970330c3115196b3d712 -size 25733 +oid sha256:2ec98e8f379ff6f717e02e49a5ab28fa2f90061451ea2ee62034a8f01a1bc4f8 +size 25772 diff --git a/screenshots/de/features.userprofile.shared_UserProfileView_Day_1_de.png b/screenshots/de/features.userprofile.shared_UserProfileView_Day_1_de.png index b388b44d13..530494b9fb 100644 --- a/screenshots/de/features.userprofile.shared_UserProfileView_Day_1_de.png +++ b/screenshots/de/features.userprofile.shared_UserProfileView_Day_1_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:1693b3caa69c3da46ca80b7d36edd6ae69b8596b376c92f0c446457329f58e9e -size 23749 +oid sha256:d8b17dcc6496e77e90f10a31cbf83ea8a6d3bcf5ea7b2dfc735e845af78c8686 +size 23698 diff --git a/screenshots/de/features.userprofile.shared_UserProfileView_Day_2_de.png b/screenshots/de/features.userprofile.shared_UserProfileView_Day_2_de.png index 23370ab623..5783ca505d 100644 --- a/screenshots/de/features.userprofile.shared_UserProfileView_Day_2_de.png +++ b/screenshots/de/features.userprofile.shared_UserProfileView_Day_2_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:d2592e29284d3324b3fc3cfca87ac6722ee12cf0a88724ad85a47347f6485e03 -size 25174 +oid sha256:da774c8c49bd4eaf0266a1e14fc612385219d5c261dd8870d1738b0d2d6d6a53 +size 25152 diff --git a/screenshots/de/features.userprofile.shared_UserProfileView_Day_3_de.png b/screenshots/de/features.userprofile.shared_UserProfileView_Day_3_de.png index eaed9fdd2a..eb117a1f8b 100644 --- a/screenshots/de/features.userprofile.shared_UserProfileView_Day_3_de.png +++ b/screenshots/de/features.userprofile.shared_UserProfileView_Day_3_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:1224eff2644a6aaea8b429f9a2e228dc16ec6d5adaa753197f9f580dc16dc43a -size 43605 +oid sha256:2fb468eee0edfe56d60c55532068ca3b538dee026dfde4fcf13ec7adef383070 +size 43518 diff --git a/screenshots/de/features.userprofile.shared_UserProfileView_Day_4_de.png b/screenshots/de/features.userprofile.shared_UserProfileView_Day_4_de.png index 8e839d09c0..35577c491e 100644 --- a/screenshots/de/features.userprofile.shared_UserProfileView_Day_4_de.png +++ b/screenshots/de/features.userprofile.shared_UserProfileView_Day_4_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:9762e6ba62819e125f207ff88638383e8af90ea57b1e02b083718ce0df3e9391 -size 37210 +oid sha256:3cf73fa2cf91024cd576ccea663672257d5f9336b8ec41867e7bec87c96895cf +size 37141 diff --git a/screenshots/de/features.userprofile.shared_UserProfileView_Day_5_de.png b/screenshots/de/features.userprofile.shared_UserProfileView_Day_5_de.png index 83c27f4994..6d117cdcbc 100644 --- a/screenshots/de/features.userprofile.shared_UserProfileView_Day_5_de.png +++ b/screenshots/de/features.userprofile.shared_UserProfileView_Day_5_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:52ec49829640d5dc45f5b3f57d0bf8ecefcca2b4423d43c13718fb9ee3988f04 -size 23206 +oid sha256:e13a9114fdb169a8e84a2ca016ff89a107b563867b23da61e3b095a4f49b9047 +size 23266 diff --git a/screenshots/de/features.userprofile.shared_UserProfileView_Day_6_de.png b/screenshots/de/features.userprofile.shared_UserProfileView_Day_6_de.png index a49110d286..ef5e672184 100644 --- a/screenshots/de/features.userprofile.shared_UserProfileView_Day_6_de.png +++ b/screenshots/de/features.userprofile.shared_UserProfileView_Day_6_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:cf53dfe0613ded9f9560231b44b91513626ffc7bc207bc907f85d210fa02468d -size 25327 +oid sha256:60ce2ab0c52103719c9ab7c62c18680e18c5d56b4d71203b93d221e95ea59dad +size 25354 diff --git a/screenshots/de/features.userprofile.shared_UserProfileView_Day_7_de.png b/screenshots/de/features.userprofile.shared_UserProfileView_Day_7_de.png index 1473c91fda..22db29b9fe 100644 --- a/screenshots/de/features.userprofile.shared_UserProfileView_Day_7_de.png +++ b/screenshots/de/features.userprofile.shared_UserProfileView_Day_7_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:97fbfad0ad0fb7f73d04cfeeb1e3f452ea0704a32828036bf5023a7b94f12379 -size 26839 +oid sha256:d3e997bba5a039c42c17ae128d29c994c3fee668f152bbd267984d869d760f0f +size 26870 diff --git a/screenshots/de/features.userprofile.shared_UserProfileView_Day_8_de.png b/screenshots/de/features.userprofile.shared_UserProfileView_Day_8_de.png index 3f043c2172..7e06c715cd 100644 --- a/screenshots/de/features.userprofile.shared_UserProfileView_Day_8_de.png +++ b/screenshots/de/features.userprofile.shared_UserProfileView_Day_8_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:67a063a65537c571c9ce463c26304478d0ddf8557c1a2ce1ace6b4b4291aa3f2 -size 37306 +oid sha256:f6ed7be40ce5e819c001d23564b1df9ad9aca051e2e6ea523cd44da5bab1b5af +size 37292 diff --git a/screenshots/de/features.userprofile.shared_UserProfileView_Day_9_de.png b/screenshots/de/features.userprofile.shared_UserProfileView_Day_9_de.png index cbec65fcb8..d726b2afae 100644 --- a/screenshots/de/features.userprofile.shared_UserProfileView_Day_9_de.png +++ b/screenshots/de/features.userprofile.shared_UserProfileView_Day_9_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:16a5afedfc4fc23f47af53cf6767cce771ab4df495e79916816179ebc09a3306 -size 34210 +oid sha256:11820e6256d97c57f26f39b904618ee02ccbaf5fb8d1eb8c319ffb1116c8ce67 +size 34232 diff --git a/screenshots/de/features.verifysession.impl.emoji_SasEmojis_Day_0_de.png b/screenshots/de/features.verifysession.impl.emoji_SasEmojis_Day_0_de.png index 57903a1f0b..07a518fbe6 100644 --- a/screenshots/de/features.verifysession.impl.emoji_SasEmojis_Day_0_de.png +++ b/screenshots/de/features.verifysession.impl.emoji_SasEmojis_Day_0_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:25a82fddd01cee5c5d7825df63f257dbad35d73d2540e485c9939533f4b87abe -size 140122 +oid sha256:5a089f659aca611d4eb2c642e9fb64b6a761ad7983a466e3802e07751f073087 +size 141648 diff --git a/screenshots/de/features.verifysession.impl.incoming.ui_SessionDetailsView_Day_0_de.png b/screenshots/de/features.verifysession.impl.incoming.ui_SessionDetailsView_Day_0_de.png index e1bb4f0e81..a0b071fdc4 100644 --- a/screenshots/de/features.verifysession.impl.incoming.ui_SessionDetailsView_Day_0_de.png +++ b/screenshots/de/features.verifysession.impl.incoming.ui_SessionDetailsView_Day_0_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:84f130f6a61accfade1a5424a7da9ff1e7d314477dbcf464062467d72adab78d -size 14590 +oid sha256:583703525dc6b252fe7042d26b4ea3af06346eb971a78360db3a1fdf66ea995d +size 15110 diff --git a/screenshots/de/features.verifysession.impl.incoming_IncomingVerificationView_Day_0_de.png b/screenshots/de/features.verifysession.impl.incoming_IncomingVerificationView_Day_0_de.png index 5432f843d7..afc948e2be 100644 --- a/screenshots/de/features.verifysession.impl.incoming_IncomingVerificationView_Day_0_de.png +++ b/screenshots/de/features.verifysession.impl.incoming_IncomingVerificationView_Day_0_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:7b5b8f059789167f8e1f2eb20cf79be5e90b6dc97ed45bc9cf64ebacaa29f85d -size 50063 +oid sha256:223847851478472ab5ca7e918036e70a9629916ced775553c15483b32f558a5d +size 49804 diff --git a/screenshots/de/features.verifysession.impl.incoming_IncomingVerificationView_Day_10_de.png b/screenshots/de/features.verifysession.impl.incoming_IncomingVerificationView_Day_10_de.png index 2eaf5fa55f..022a8ca87c 100644 --- a/screenshots/de/features.verifysession.impl.incoming_IncomingVerificationView_Day_10_de.png +++ b/screenshots/de/features.verifysession.impl.incoming_IncomingVerificationView_Day_10_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:c28614a63922d6f87c37573037b5c6d3beff0ffdb0456a7c6c6cafecc2e68ca0 -size 36295 +oid sha256:e0eb44dc561e133991106d30d8a8f67e92005a91483aa0f7f9e5029fd0ca2a3d +size 36319 diff --git a/screenshots/de/features.verifysession.impl.incoming_IncomingVerificationView_Day_11_de.png b/screenshots/de/features.verifysession.impl.incoming_IncomingVerificationView_Day_11_de.png index a5f97ddead..2512b6a0e1 100644 --- a/screenshots/de/features.verifysession.impl.incoming_IncomingVerificationView_Day_11_de.png +++ b/screenshots/de/features.verifysession.impl.incoming_IncomingVerificationView_Day_11_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:91603c6bd26efcf41d06cb12e21795d61c9c6b24048610365be052416aa18a06 -size 29744 +oid sha256:446e8ab2ab97dac14c4852470276c42b81deca86258ad8971de14c88556d4101 +size 29923 diff --git a/screenshots/de/features.verifysession.impl.incoming_IncomingVerificationView_Day_12_de.png b/screenshots/de/features.verifysession.impl.incoming_IncomingVerificationView_Day_12_de.png index 5913be82d4..df307d5881 100644 --- a/screenshots/de/features.verifysession.impl.incoming_IncomingVerificationView_Day_12_de.png +++ b/screenshots/de/features.verifysession.impl.incoming_IncomingVerificationView_Day_12_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:748818c809f99f2fdadf30f29565ca959fa5e023817563f70621cdb2628150f5 -size 35187 +oid sha256:98727a2463f0a23be7bb0f4ee8daa76370de557ac265aae8c54c005218388fd2 +size 35381 diff --git a/screenshots/de/features.verifysession.impl.incoming_IncomingVerificationView_Day_13_de.png b/screenshots/de/features.verifysession.impl.incoming_IncomingVerificationView_Day_13_de.png index 5913be82d4..df307d5881 100644 --- a/screenshots/de/features.verifysession.impl.incoming_IncomingVerificationView_Day_13_de.png +++ b/screenshots/de/features.verifysession.impl.incoming_IncomingVerificationView_Day_13_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:748818c809f99f2fdadf30f29565ca959fa5e023817563f70621cdb2628150f5 -size 35187 +oid sha256:98727a2463f0a23be7bb0f4ee8daa76370de557ac265aae8c54c005218388fd2 +size 35381 diff --git a/screenshots/de/features.verifysession.impl.incoming_IncomingVerificationView_Day_1_de.png b/screenshots/de/features.verifysession.impl.incoming_IncomingVerificationView_Day_1_de.png index 5432f843d7..afc948e2be 100644 --- a/screenshots/de/features.verifysession.impl.incoming_IncomingVerificationView_Day_1_de.png +++ b/screenshots/de/features.verifysession.impl.incoming_IncomingVerificationView_Day_1_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:7b5b8f059789167f8e1f2eb20cf79be5e90b6dc97ed45bc9cf64ebacaa29f85d -size 50063 +oid sha256:223847851478472ab5ca7e918036e70a9629916ced775553c15483b32f558a5d +size 49804 diff --git a/screenshots/de/features.verifysession.impl.incoming_IncomingVerificationView_Day_2_de.png b/screenshots/de/features.verifysession.impl.incoming_IncomingVerificationView_Day_2_de.png index c265e62b22..c7acf9e1eb 100644 --- a/screenshots/de/features.verifysession.impl.incoming_IncomingVerificationView_Day_2_de.png +++ b/screenshots/de/features.verifysession.impl.incoming_IncomingVerificationView_Day_2_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:f14d3f79cba2389579654cc81e942deded5b575bbf7ff721e5a5fd9743d21eb2 -size 41463 +oid sha256:e659117f1413c8204ab65e227948fa10fb031809816b58feb09e849b174475cb +size 41370 diff --git a/screenshots/de/features.verifysession.impl.incoming_IncomingVerificationView_Day_3_de.png b/screenshots/de/features.verifysession.impl.incoming_IncomingVerificationView_Day_3_de.png index d4a9dbd6b2..e904d8e6a0 100644 --- a/screenshots/de/features.verifysession.impl.incoming_IncomingVerificationView_Day_3_de.png +++ b/screenshots/de/features.verifysession.impl.incoming_IncomingVerificationView_Day_3_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:4f2ae7b8478ce6be0a40d594b9a79cf16940de4811fed16f988f006157aed55a -size 46639 +oid sha256:ef0c20276c21ed759f6325a5daa7eadb7c05ffd3c17c47697af9b5b4c05bdea7 +size 46388 diff --git a/screenshots/de/features.verifysession.impl.incoming_IncomingVerificationView_Day_4_de.png b/screenshots/de/features.verifysession.impl.incoming_IncomingVerificationView_Day_4_de.png index b23f1584ee..bc56ffb6dc 100644 --- a/screenshots/de/features.verifysession.impl.incoming_IncomingVerificationView_Day_4_de.png +++ b/screenshots/de/features.verifysession.impl.incoming_IncomingVerificationView_Day_4_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:0b049ba6c08eda18c5d2d023b3997a8781715922d9c90473eaef2c98cd0198fe -size 36830 +oid sha256:696fa3ea9073b4a862fe21bd62ad29208b98f4179cadbf16a7a88170440cbf2d +size 36743 diff --git a/screenshots/de/features.verifysession.impl.incoming_IncomingVerificationView_Day_5_de.png b/screenshots/de/features.verifysession.impl.incoming_IncomingVerificationView_Day_5_de.png index 3df05cb2c1..b48478a927 100644 --- a/screenshots/de/features.verifysession.impl.incoming_IncomingVerificationView_Day_5_de.png +++ b/screenshots/de/features.verifysession.impl.incoming_IncomingVerificationView_Day_5_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:232c8a93fff37940b058795447f43388cd8d61de1a3ca5aab1545885b3bc566d -size 53704 +oid sha256:39f1ca571cc8cddfb12ea621735c5c3050f40560760bc91ddd0318275c1e6d93 +size 53934 diff --git a/screenshots/de/features.verifysession.impl.incoming_IncomingVerificationView_Day_6_de.png b/screenshots/de/features.verifysession.impl.incoming_IncomingVerificationView_Day_6_de.png index 10f61efd98..b72bd254dc 100644 --- a/screenshots/de/features.verifysession.impl.incoming_IncomingVerificationView_Day_6_de.png +++ b/screenshots/de/features.verifysession.impl.incoming_IncomingVerificationView_Day_6_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:9150cab47a9a9560df48ffefb09e7481f23f675a80877dfaf29168a535f4fee2 -size 55496 +oid sha256:875af306179d0c780a12aef21256a991ed258b249fd5ad178067fc93cfed2773 +size 55644 diff --git a/screenshots/de/features.verifysession.impl.incoming_IncomingVerificationView_Day_7_de.png b/screenshots/de/features.verifysession.impl.incoming_IncomingVerificationView_Day_7_de.png index fddbf4418c..c83c9cc3ee 100644 --- a/screenshots/de/features.verifysession.impl.incoming_IncomingVerificationView_Day_7_de.png +++ b/screenshots/de/features.verifysession.impl.incoming_IncomingVerificationView_Day_7_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:0a2c484e54b7b0a051c99a472d78efa6d5b9171e23b07fbfd37e66b56df96898 -size 44713 +oid sha256:2d77b9f2894a25092c74c3ad607f9d9a3695fb3d82b3187b01decddf97d8410a +size 45002 diff --git a/screenshots/de/features.verifysession.impl.incoming_IncomingVerificationView_Day_8_de.png b/screenshots/de/features.verifysession.impl.incoming_IncomingVerificationView_Day_8_de.png index d772ada026..6bb622c47d 100644 --- a/screenshots/de/features.verifysession.impl.incoming_IncomingVerificationView_Day_8_de.png +++ b/screenshots/de/features.verifysession.impl.incoming_IncomingVerificationView_Day_8_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:eea647e460084d645b91ade9261677ceef281d410d6463e5e0688b41c9754aed -size 46617 +oid sha256:9763b719d7d2b338590582dc789dfabbf9f35171528e30ac67f1355678857a85 +size 46808 diff --git a/screenshots/de/features.verifysession.impl.incoming_IncomingVerificationView_Day_9_de.png b/screenshots/de/features.verifysession.impl.incoming_IncomingVerificationView_Day_9_de.png index d63a010d55..ab69508a97 100644 --- a/screenshots/de/features.verifysession.impl.incoming_IncomingVerificationView_Day_9_de.png +++ b/screenshots/de/features.verifysession.impl.incoming_IncomingVerificationView_Day_9_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:b0ae7bbbde765a903beb419aff127b795bb4d49921b93dc60dd1d5218055fbd8 -size 35666 +oid sha256:5b6f190d51dfdce8096e223965ad4ea9bbd680d295836a6430980d8985471586 +size 35648 diff --git a/screenshots/de/features.verifysession.impl.outgoing_OutgoingVerificationView_Day_0_de.png b/screenshots/de/features.verifysession.impl.outgoing_OutgoingVerificationView_Day_0_de.png index a49c1f674e..8dad4963ef 100644 --- a/screenshots/de/features.verifysession.impl.outgoing_OutgoingVerificationView_Day_0_de.png +++ b/screenshots/de/features.verifysession.impl.outgoing_OutgoingVerificationView_Day_0_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:ef8a7a9c83f8fb4a325b76244f58f9aa1484b14038a22c2d896887d0d1f610d4 -size 40512 +oid sha256:eda5b403a447a8392a2bbb8d3f479d85e81bf91b1ec071af6eda7947c6e90b1c +size 40461 diff --git a/screenshots/de/features.verifysession.impl.outgoing_OutgoingVerificationView_Day_10_de.png b/screenshots/de/features.verifysession.impl.outgoing_OutgoingVerificationView_Day_10_de.png index b0948aceee..46fb1735ee 100644 --- a/screenshots/de/features.verifysession.impl.outgoing_OutgoingVerificationView_Day_10_de.png +++ b/screenshots/de/features.verifysession.impl.outgoing_OutgoingVerificationView_Day_10_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:ef5540e690a92a418c6bc78375b341ddb7acf65fd336d0ed710fae66c85721f5 -size 30741 +oid sha256:012fe99c68b915382d12a4f3cdb2224e40b5d1a2806e4be816fbf8a31632cc1b +size 30787 diff --git a/screenshots/de/features.verifysession.impl.outgoing_OutgoingVerificationView_Day_11_de.png b/screenshots/de/features.verifysession.impl.outgoing_OutgoingVerificationView_Day_11_de.png index 7f506bfc38..0e366f75dc 100644 --- a/screenshots/de/features.verifysession.impl.outgoing_OutgoingVerificationView_Day_11_de.png +++ b/screenshots/de/features.verifysession.impl.outgoing_OutgoingVerificationView_Day_11_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:d94fc082312e356145540c27959d454604dfdee4d7dade7a0ef5a6b94e223a7f -size 29895 +oid sha256:fe4827772d4f44a82ab9dfae5d43a1a93885f4c443f21dc53e752e6ec582e946 +size 30037 diff --git a/screenshots/de/features.verifysession.impl.outgoing_OutgoingVerificationView_Day_1_de.png b/screenshots/de/features.verifysession.impl.outgoing_OutgoingVerificationView_Day_1_de.png index d707bf8bff..39cbfc4757 100644 --- a/screenshots/de/features.verifysession.impl.outgoing_OutgoingVerificationView_Day_1_de.png +++ b/screenshots/de/features.verifysession.impl.outgoing_OutgoingVerificationView_Day_1_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:e6b07a3c79685c5d5358f9b21dde72b32331cfcf686d9378cb89076a1cc42695 -size 43862 +oid sha256:a17e2819004088741fdcea489d92b4197cfc97d9d52654be64523825f58807f1 +size 44022 diff --git a/screenshots/de/features.verifysession.impl.outgoing_OutgoingVerificationView_Day_2_de.png b/screenshots/de/features.verifysession.impl.outgoing_OutgoingVerificationView_Day_2_de.png index 45d5da6ce8..d9ab695d25 100644 --- a/screenshots/de/features.verifysession.impl.outgoing_OutgoingVerificationView_Day_2_de.png +++ b/screenshots/de/features.verifysession.impl.outgoing_OutgoingVerificationView_Day_2_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:7bb7b2631bfa9c7829b3320f0374137d9157ff9465a6d6a0843476cb1c1aef33 -size 29952 +oid sha256:99317c30be5c5e1aab6db79aad273123a173d012e63b73ce4aa70efb82a900b2 +size 29868 diff --git a/screenshots/de/features.verifysession.impl.outgoing_OutgoingVerificationView_Day_3_de.png b/screenshots/de/features.verifysession.impl.outgoing_OutgoingVerificationView_Day_3_de.png index b1d180c087..fe3f860024 100644 --- a/screenshots/de/features.verifysession.impl.outgoing_OutgoingVerificationView_Day_3_de.png +++ b/screenshots/de/features.verifysession.impl.outgoing_OutgoingVerificationView_Day_3_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:0d2466557382bab1b8222e22e8f559ae90bc2b156e8b62eba911721f85ad6c60 -size 26066 +oid sha256:4e179d57e7317b7e187220ac4a2498664115f599cb6aa2a330a3e718ff85959c +size 25981 diff --git a/screenshots/de/features.verifysession.impl.outgoing_OutgoingVerificationView_Day_4_de.png b/screenshots/de/features.verifysession.impl.outgoing_OutgoingVerificationView_Day_4_de.png index 3df05cb2c1..b48478a927 100644 --- a/screenshots/de/features.verifysession.impl.outgoing_OutgoingVerificationView_Day_4_de.png +++ b/screenshots/de/features.verifysession.impl.outgoing_OutgoingVerificationView_Day_4_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:232c8a93fff37940b058795447f43388cd8d61de1a3ca5aab1545885b3bc566d -size 53704 +oid sha256:39f1ca571cc8cddfb12ea621735c5c3050f40560760bc91ddd0318275c1e6d93 +size 53934 diff --git a/screenshots/de/features.verifysession.impl.outgoing_OutgoingVerificationView_Day_5_de.png b/screenshots/de/features.verifysession.impl.outgoing_OutgoingVerificationView_Day_5_de.png index 10f61efd98..b72bd254dc 100644 --- a/screenshots/de/features.verifysession.impl.outgoing_OutgoingVerificationView_Day_5_de.png +++ b/screenshots/de/features.verifysession.impl.outgoing_OutgoingVerificationView_Day_5_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:9150cab47a9a9560df48ffefb09e7481f23f675a80877dfaf29168a535f4fee2 -size 55496 +oid sha256:875af306179d0c780a12aef21256a991ed258b249fd5ad178067fc93cfed2773 +size 55644 diff --git a/screenshots/de/features.verifysession.impl.outgoing_OutgoingVerificationView_Day_6_de.png b/screenshots/de/features.verifysession.impl.outgoing_OutgoingVerificationView_Day_6_de.png index fddbf4418c..c83c9cc3ee 100644 --- a/screenshots/de/features.verifysession.impl.outgoing_OutgoingVerificationView_Day_6_de.png +++ b/screenshots/de/features.verifysession.impl.outgoing_OutgoingVerificationView_Day_6_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:0a2c484e54b7b0a051c99a472d78efa6d5b9171e23b07fbfd37e66b56df96898 -size 44713 +oid sha256:2d77b9f2894a25092c74c3ad607f9d9a3695fb3d82b3187b01decddf97d8410a +size 45002 diff --git a/screenshots/de/features.verifysession.impl.outgoing_OutgoingVerificationView_Day_7_de.png b/screenshots/de/features.verifysession.impl.outgoing_OutgoingVerificationView_Day_7_de.png index ee0007f60a..5763dc29e5 100644 --- a/screenshots/de/features.verifysession.impl.outgoing_OutgoingVerificationView_Day_7_de.png +++ b/screenshots/de/features.verifysession.impl.outgoing_OutgoingVerificationView_Day_7_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:29ef55e994b568cb85c0ce53b085fd4b33cc9bc754c9f9ce26f63fe73250213e -size 35188 +oid sha256:bbe818ccd36be1b0a24782e10cb862c523bf4e971e131878c39a7d637c206070 +size 35381 diff --git a/screenshots/de/features.verifysession.impl.outgoing_OutgoingVerificationView_Day_8_de.png b/screenshots/de/features.verifysession.impl.outgoing_OutgoingVerificationView_Day_8_de.png index 72aff64a03..bf8eac000d 100644 --- a/screenshots/de/features.verifysession.impl.outgoing_OutgoingVerificationView_Day_8_de.png +++ b/screenshots/de/features.verifysession.impl.outgoing_OutgoingVerificationView_Day_8_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:ae750c80d5be931a0b488777165d0a3bfed97dd4bf3b4f4667752a034c6f6b84 -size 21441 +oid sha256:8ab908e704aca311e6097d64c2bc8029c8921bd84538fc6df3c970640a9001a1 +size 21617 diff --git a/screenshots/de/features.verifysession.impl.outgoing_OutgoingVerificationView_Day_9_de.png b/screenshots/de/features.verifysession.impl.outgoing_OutgoingVerificationView_Day_9_de.png index d63a010d55..ab69508a97 100644 --- a/screenshots/de/features.verifysession.impl.outgoing_OutgoingVerificationView_Day_9_de.png +++ b/screenshots/de/features.verifysession.impl.outgoing_OutgoingVerificationView_Day_9_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:b0ae7bbbde765a903beb419aff127b795bb4d49921b93dc60dd1d5218055fbd8 -size 35666 +oid sha256:5b6f190d51dfdce8096e223965ad4ea9bbd680d295836a6430980d8985471586 +size 35648 diff --git a/screenshots/de/features.viewfolder.impl.file_ViewFileView_Day_3_de.png b/screenshots/de/features.viewfolder.impl.file_ViewFileView_Day_3_de.png index 11a065837e..b51de1e807 100644 --- a/screenshots/de/features.viewfolder.impl.file_ViewFileView_Day_3_de.png +++ b/screenshots/de/features.viewfolder.impl.file_ViewFileView_Day_3_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:15bf00066a3280085e83f07308dc0dcc4eb75a05a0a6d7bd762b7d646154949a -size 9230 +oid sha256:839eef003e2f567c59fc8a8719ef3a862ab16760cc4ddc4d82b1a68620736924 +size 9219 diff --git a/screenshots/de/libraries.dateformatter.impl.previews_DateFormatterModeView_0_de.png b/screenshots/de/libraries.dateformatter.impl.previews_DateFormatterModeView_0_de.png index 6bb6d7fe08..feab18e5d6 100644 --- a/screenshots/de/libraries.dateformatter.impl.previews_DateFormatterModeView_0_de.png +++ b/screenshots/de/libraries.dateformatter.impl.previews_DateFormatterModeView_0_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:da9eddf528f2af6eb3ba35e9322c90abd468d6d6d7367d559c10b3ebf84d5c4e -size 98472 +oid sha256:fe4e86f259de317a85bbf8330b8fcf01196cff7b041896322a43a2e2fdbf6fac +size 98600 diff --git a/screenshots/de/libraries.dateformatter.impl.previews_DateFormatterModeView_1_de.png b/screenshots/de/libraries.dateformatter.impl.previews_DateFormatterModeView_1_de.png index 59bdd4f577..b59582912b 100644 --- a/screenshots/de/libraries.dateformatter.impl.previews_DateFormatterModeView_1_de.png +++ b/screenshots/de/libraries.dateformatter.impl.previews_DateFormatterModeView_1_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:324f72f4b302266562437511e956b726718dfa637ba6dff224e1b885949e0122 -size 88116 +oid sha256:00044ef92186e74f6e659685ec8f833f7bc53c945342a98190c2b508ed87c8b1 +size 87739 diff --git a/screenshots/de/libraries.dateformatter.impl.previews_DateFormatterModeView_2_de.png b/screenshots/de/libraries.dateformatter.impl.previews_DateFormatterModeView_2_de.png index 7666ed50da..fc46469cbc 100644 --- a/screenshots/de/libraries.dateformatter.impl.previews_DateFormatterModeView_2_de.png +++ b/screenshots/de/libraries.dateformatter.impl.previews_DateFormatterModeView_2_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:a85899d835ae7fc78c9fa9bbb90de3bcdd0fbc92ef61c87178e850fdaf2e2857 -size 87898 +oid sha256:08c7899b6f9c07f6d7b5cf5222ba6a50ab67e624b271c4e828ce94806d8912e5 +size 87949 diff --git a/screenshots/de/libraries.dateformatter.impl.previews_DateFormatterModeView_3_de.png b/screenshots/de/libraries.dateformatter.impl.previews_DateFormatterModeView_3_de.png index 86b89bccb8..959e0a878d 100644 --- a/screenshots/de/libraries.dateformatter.impl.previews_DateFormatterModeView_3_de.png +++ b/screenshots/de/libraries.dateformatter.impl.previews_DateFormatterModeView_3_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:d5e6bb5f0c189d6e18efec5c620cfd50ef0810421212966c2dba5c42bf2950b0 -size 78098 +oid sha256:b8e76885a9e8771d280a092c53e4f62eea8f060813e0b2b88cf982e4af0d9fc3 +size 78306 diff --git a/screenshots/de/libraries.dateformatter.impl.previews_DateFormatterModeView_4_de.png b/screenshots/de/libraries.dateformatter.impl.previews_DateFormatterModeView_4_de.png index e79505a6f2..260010aa9a 100644 --- a/screenshots/de/libraries.dateformatter.impl.previews_DateFormatterModeView_4_de.png +++ b/screenshots/de/libraries.dateformatter.impl.previews_DateFormatterModeView_4_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:57fc4f25189522495e5e9d91b01104188e4e3c19a55219587d89887b3dc84aff -size 75700 +oid sha256:6b7f56bc93e5d0624af4ca7b08271a2049d1ff97fe7020fd3e4790b63f7b9520 +size 75793 diff --git a/screenshots/de/libraries.designsystem.atomic.molecules_ComposerAlertMolecule_Day_0_de.png b/screenshots/de/libraries.designsystem.atomic.molecules_ComposerAlertMolecule_Day_0_de.png index 134c2e067e..c324e85343 100644 --- a/screenshots/de/libraries.designsystem.atomic.molecules_ComposerAlertMolecule_Day_0_de.png +++ b/screenshots/de/libraries.designsystem.atomic.molecules_ComposerAlertMolecule_Day_0_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:cab55f00bc1f59fae859ae25ff7de9000277a7863e61c03194b304e764109b0b -size 20277 +oid sha256:2b8fe687014ad3a25b2f3f4818a9f17cef25fba7b18dfd792374c1ee7f1dc14f +size 19922 diff --git a/screenshots/de/libraries.designsystem.atomic.molecules_ComposerAlertMolecule_Day_1_de.png b/screenshots/de/libraries.designsystem.atomic.molecules_ComposerAlertMolecule_Day_1_de.png index 3a66f0c29c..01fb71821a 100644 --- a/screenshots/de/libraries.designsystem.atomic.molecules_ComposerAlertMolecule_Day_1_de.png +++ b/screenshots/de/libraries.designsystem.atomic.molecules_ComposerAlertMolecule_Day_1_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:2eb622c603392e5da8ebd3aba69e0bdbe238e9de46cb6ade6306fc2e8fc4ad7a -size 20001 +oid sha256:baa387061a7b75f76ecc92bea2ccf21faecd21d3c7a5db0f73dd7758c02cb4d6 +size 19695 diff --git a/screenshots/de/libraries.designsystem.components.async_AsyncActionView_Day_1_de.png b/screenshots/de/libraries.designsystem.components.async_AsyncActionView_Day_1_de.png index 7071a3986e..64d677da1f 100644 --- a/screenshots/de/libraries.designsystem.components.async_AsyncActionView_Day_1_de.png +++ b/screenshots/de/libraries.designsystem.components.async_AsyncActionView_Day_1_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:c6a13127a9fefff0a7aca2d7791f792a5eab3f361e4108a2885115ac7b389ce4 -size 15735 +oid sha256:02329c13cbb813f0e392c0e9cc45a1d1a696bf901b04bb172ef838eafd8e534d +size 15159 diff --git a/screenshots/de/libraries.designsystem.components.async_AsyncActionView_Day_3_de.png b/screenshots/de/libraries.designsystem.components.async_AsyncActionView_Day_3_de.png index 9367c10d95..40bb8c6698 100644 --- a/screenshots/de/libraries.designsystem.components.async_AsyncActionView_Day_3_de.png +++ b/screenshots/de/libraries.designsystem.components.async_AsyncActionView_Day_3_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:6011ceb2ef963b0410fd0bc3c01906c56a7f1b2a73f36c95f0951469c98f77dd -size 11128 +oid sha256:0e7f87cbe57ac1f64685dff9df668d30311898b045596b3f2c928c3606ea129c +size 10478 diff --git a/screenshots/de/libraries.designsystem.components.async_AsyncFailure_Day_0_de.png b/screenshots/de/libraries.designsystem.components.async_AsyncFailure_Day_0_de.png index 19da7abd14..f25207303d 100644 --- a/screenshots/de/libraries.designsystem.components.async_AsyncFailure_Day_0_de.png +++ b/screenshots/de/libraries.designsystem.components.async_AsyncFailure_Day_0_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:29671c38f20b2482596459d8d0ff9eb858f06f5ca5d2372cbf268e2defa0fd83 -size 11454 +oid sha256:48588f1ec235ed1e019090f2ff1fae9d8c20dbaaa39aad01f3fdce4f14dfe8d6 +size 11739 diff --git a/screenshots/de/libraries.designsystem.components.dialogs_AlertDialogContent_Dialogs_de.png b/screenshots/de/libraries.designsystem.components.dialogs_AlertDialogContent_Dialogs_de.png index 610d23419c..7835e23381 100644 --- a/screenshots/de/libraries.designsystem.components.dialogs_AlertDialogContent_Dialogs_de.png +++ b/screenshots/de/libraries.designsystem.components.dialogs_AlertDialogContent_Dialogs_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:e646d6abb488c9bef8cf565aac4921b944209690f0c79d98513bdd0526e8b5d0 -size 11358 +oid sha256:ca07dfb0582a89452d71a15c1d768cc7da2985e660355d526ff5a43a277ba1e7 +size 11162 diff --git a/screenshots/de/libraries.designsystem.components.dialogs_AlertDialog_Day_0_de.png b/screenshots/de/libraries.designsystem.components.dialogs_AlertDialog_Day_0_de.png index dc29999000..9046836606 100644 --- a/screenshots/de/libraries.designsystem.components.dialogs_AlertDialog_Day_0_de.png +++ b/screenshots/de/libraries.designsystem.components.dialogs_AlertDialog_Day_0_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:38246cb69da24dfcec5eff73b6be7a231c6225cba9fb9a23829edb41ce9b18dc -size 8436 +oid sha256:7a6f1dabf26d7e5ff1c880b949812dcdb9fcfca397ab0a555d6a4ab9d36796a9 +size 7810 diff --git a/screenshots/de/libraries.designsystem.components.dialogs_ErrorDialogContent_Dialogs_de.png b/screenshots/de/libraries.designsystem.components.dialogs_ErrorDialogContent_Dialogs_de.png index d249f446b1..fa50461695 100644 --- a/screenshots/de/libraries.designsystem.components.dialogs_ErrorDialogContent_Dialogs_de.png +++ b/screenshots/de/libraries.designsystem.components.dialogs_ErrorDialogContent_Dialogs_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:c805b099ea1e6f4004b1355ccb44c20b8f10db010f1807ae839bd07a46c420ac -size 14489 +oid sha256:674db98a0ff8dd9628b19583bf671b8eb7eefa13f3475525e14c8a61a5e05591 +size 14286 diff --git a/screenshots/de/libraries.designsystem.components.dialogs_ErrorDialogWithDoNotShowAgain_Day_0_de.png b/screenshots/de/libraries.designsystem.components.dialogs_ErrorDialogWithDoNotShowAgain_Day_0_de.png index 894109f34f..1b305a5b9d 100644 --- a/screenshots/de/libraries.designsystem.components.dialogs_ErrorDialogWithDoNotShowAgain_Day_0_de.png +++ b/screenshots/de/libraries.designsystem.components.dialogs_ErrorDialogWithDoNotShowAgain_Day_0_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:c3b135e10c4fbc13ac3f30decbc7ec1500d78dc49d49df4845c74fc6053992f5 -size 13365 +oid sha256:1e601b48a4db352012a7ce171f1ea6cf1e2241224dbec2944e9367e617348a86 +size 12864 diff --git a/screenshots/de/libraries.designsystem.components.dialogs_ErrorDialog_Day_0_de.png b/screenshots/de/libraries.designsystem.components.dialogs_ErrorDialog_Day_0_de.png index 0d02a5d547..bb113d1f29 100644 --- a/screenshots/de/libraries.designsystem.components.dialogs_ErrorDialog_Day_0_de.png +++ b/screenshots/de/libraries.designsystem.components.dialogs_ErrorDialog_Day_0_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:5b1c9b888034d035ba68e43fc9c4a2d594de2430d6cb76721d85a2b9a038580f -size 9862 +oid sha256:5bc1577f7e5d3125cd432cbc346803c81e9c4f24813241f90bc0542a0b2e5aa6 +size 9278 diff --git a/screenshots/de/libraries.designsystem.components.dialogs_RetryDialogContent_Dialogs_de.png b/screenshots/de/libraries.designsystem.components.dialogs_RetryDialogContent_Dialogs_de.png index 1acb5176b6..2958d50ac6 100644 --- a/screenshots/de/libraries.designsystem.components.dialogs_RetryDialogContent_Dialogs_de.png +++ b/screenshots/de/libraries.designsystem.components.dialogs_RetryDialogContent_Dialogs_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:62d060005cca6946867bc0781fce41121e4660ac7eb574526ecd68d533125505 -size 26115 +oid sha256:f9494488876263418a4c86505482910776062277385924f69e1dcb468d474991 +size 25944 diff --git a/screenshots/de/libraries.designsystem.components.dialogs_RetryDialog_Day_0_de.png b/screenshots/de/libraries.designsystem.components.dialogs_RetryDialog_Day_0_de.png index 67b2f2a724..ae23a0e725 100644 --- a/screenshots/de/libraries.designsystem.components.dialogs_RetryDialog_Day_0_de.png +++ b/screenshots/de/libraries.designsystem.components.dialogs_RetryDialog_Day_0_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:6bd2968ef070ec7413d53c3113cb929d9960bb467bb61a16e1ffd9af905d598b -size 15912 +oid sha256:46767b660cc867c2a3a264c35ff8d1b91593ee0b888dcf4a40c67361c36b5a74 +size 15358 diff --git a/screenshots/de/libraries.designsystem.components.dialogs_TextFieldDialogWithError_Day_0_de.png b/screenshots/de/libraries.designsystem.components.dialogs_TextFieldDialogWithError_Day_0_de.png index bde5f11c9c..2feea54379 100644 --- a/screenshots/de/libraries.designsystem.components.dialogs_TextFieldDialogWithError_Day_0_de.png +++ b/screenshots/de/libraries.designsystem.components.dialogs_TextFieldDialogWithError_Day_0_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:dff9f674b9d6ac618a59f8ba9a1b7d85218e720f40c7a313f8bf06254f0b9de1 -size 19237 +oid sha256:88f04fda2bd15ff245d888161f4e3dad21f550e6b2c7bd2a1026ca6e8eb450ca +size 18763 diff --git a/screenshots/de/libraries.designsystem.components.dialogs_TextFieldDialog_Day_0_de.png b/screenshots/de/libraries.designsystem.components.dialogs_TextFieldDialog_Day_0_de.png index 2ebb09a927..5c049d15c6 100644 --- a/screenshots/de/libraries.designsystem.components.dialogs_TextFieldDialog_Day_0_de.png +++ b/screenshots/de/libraries.designsystem.components.dialogs_TextFieldDialog_Day_0_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:caccab75ed386837ef568242893d41bc235b0cb33c62fa02d298a86b2bd5e491 -size 13869 +oid sha256:aee8afc4e0d43cbfeef5a18f4cb2ef2fb608b3caf7cadca95fe6cac9bdd3d21b +size 13338 diff --git a/screenshots/de/libraries.designsystem.components_ProgressDialogContent_Dialogs_de.png b/screenshots/de/libraries.designsystem.components_ProgressDialogContent_Dialogs_de.png index daddcf6fb1..602cb79553 100644 --- a/screenshots/de/libraries.designsystem.components_ProgressDialogContent_Dialogs_de.png +++ b/screenshots/de/libraries.designsystem.components_ProgressDialogContent_Dialogs_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:ebb99f5d5c123439a7df746b4150ceeb449a7a8ea3b5e769902bcc995b9b9e33 -size 20663 +oid sha256:7eede8bc4ca7b2424ab26ea197b8fe0c38fc18081845568365034fc9d426e7ad +size 20761 diff --git a/screenshots/de/libraries.designsystem.components_ProgressDialog_Day_0_de.png b/screenshots/de/libraries.designsystem.components_ProgressDialog_Day_0_de.png index 27a0ff9565..1428a6207b 100644 --- a/screenshots/de/libraries.designsystem.components_ProgressDialog_Day_0_de.png +++ b/screenshots/de/libraries.designsystem.components_ProgressDialog_Day_0_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:547c3576d4767b127372e4700985bd35bfd9e8632e96823a2ec4903658a12e82 -size 12921 +oid sha256:a1f00c4fcb3bd8c0b824585d9a6772aec33918390e79cd96a606b72bd540b21a +size 12460 diff --git a/screenshots/de/libraries.designsystem.theme.components.previews_DatePickerDark_DateTime_pickers_de.png b/screenshots/de/libraries.designsystem.theme.components.previews_DatePickerDark_DateTime_pickers_de.png index dbad303a62..23bb83db76 100644 --- a/screenshots/de/libraries.designsystem.theme.components.previews_DatePickerDark_DateTime_pickers_de.png +++ b/screenshots/de/libraries.designsystem.theme.components.previews_DatePickerDark_DateTime_pickers_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:9a552260805265802772756fc44a4e6944f2fa6b3b715c77958753cb52f48a18 -size 31452 +oid sha256:b477fdd9b75b1f71ef39c5eaffd797a8c0450ca006b8e1c074da217950f3a6bb +size 31211 diff --git a/screenshots/de/libraries.designsystem.theme.components.previews_DatePickerLight_DateTime_pickers_de.png b/screenshots/de/libraries.designsystem.theme.components.previews_DatePickerLight_DateTime_pickers_de.png index fbe511f864..9009e4b731 100644 --- a/screenshots/de/libraries.designsystem.theme.components.previews_DatePickerLight_DateTime_pickers_de.png +++ b/screenshots/de/libraries.designsystem.theme.components.previews_DatePickerLight_DateTime_pickers_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:dd9ce1166232db781b60f870a249789e8e723fe3ff9feeed64214774b4a049de -size 31986 +oid sha256:eaf8e28630f9bd8a807192aebf26d54f6d1ade375074589cb98f91dddab1f231 +size 31750 diff --git a/screenshots/de/libraries.designsystem.theme.components.previews_TimePickerHorizontal_DateTime_pickers_de.png b/screenshots/de/libraries.designsystem.theme.components.previews_TimePickerHorizontal_DateTime_pickers_de.png index b076d47f0b..d72b78ab4c 100644 --- a/screenshots/de/libraries.designsystem.theme.components.previews_TimePickerHorizontal_DateTime_pickers_de.png +++ b/screenshots/de/libraries.designsystem.theme.components.previews_TimePickerHorizontal_DateTime_pickers_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:c3fed1d9178d29f0e6af94d98753e8b07333e73cb363770427f604119dca64a3 -size 36434 +oid sha256:853edd40133d53f4109934cadfd7efd2cb6c6aeab6ad345b29a9008e902a9904 +size 36437 diff --git a/screenshots/de/libraries.designsystem.theme.components.previews_TimePickerVerticalDark_DateTime_pickers_de.png b/screenshots/de/libraries.designsystem.theme.components.previews_TimePickerVerticalDark_DateTime_pickers_de.png index 89ff0cb67f..37d16ec127 100644 --- a/screenshots/de/libraries.designsystem.theme.components.previews_TimePickerVerticalDark_DateTime_pickers_de.png +++ b/screenshots/de/libraries.designsystem.theme.components.previews_TimePickerVerticalDark_DateTime_pickers_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:995c11981fea3d0d2130fc6a7550c9b19d7a8ce1c340e56c52aefe2083f46d62 -size 26227 +oid sha256:93e92978235fb39a5b5721f524cd788ac1dfd6fe599d3bc1252c573b5d47c247 +size 26053 diff --git a/screenshots/de/libraries.designsystem.theme.components.previews_TimePickerVerticalLight_DateTime_pickers_de.png b/screenshots/de/libraries.designsystem.theme.components.previews_TimePickerVerticalLight_DateTime_pickers_de.png index 3a1ab5b73a..5d534fcfe4 100644 --- a/screenshots/de/libraries.designsystem.theme.components.previews_TimePickerVerticalLight_DateTime_pickers_de.png +++ b/screenshots/de/libraries.designsystem.theme.components.previews_TimePickerVerticalLight_DateTime_pickers_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:dab78f38ab66795b8a7f9c442916065fcc33534ca1e41d562c1cd889e71f5604 -size 25642 +oid sha256:19cee2c6819d1ce30c22b43c783317804c3ca781ee66f5771fd214e30d7801d7 +size 25578 diff --git a/screenshots/de/libraries.designsystem.theme.components_SearchBarActiveWithNoResults_Search_views_de.png b/screenshots/de/libraries.designsystem.theme.components_SearchBarActiveWithNoResults_Search_views_de.png index f43bc6e956..f91d67848f 100644 --- a/screenshots/de/libraries.designsystem.theme.components_SearchBarActiveWithNoResults_Search_views_de.png +++ b/screenshots/de/libraries.designsystem.theme.components_SearchBarActiveWithNoResults_Search_views_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:97f94090cc566f0df97fe30b18d5e775a8b46d3d33f7ba110786a6a465005e74 -size 10407 +oid sha256:a790bf2a4ddf074b1b040b8d3833fc3ccb7f37867e5ce98785cd6b80ed780ab4 +size 10421 diff --git a/screenshots/de/libraries.matrix.ui.components_AvatarActionBottomSheet_Day_0_de.png b/screenshots/de/libraries.matrix.ui.components_AvatarActionBottomSheet_Day_0_de.png index f96562d2dc..5e98741cdd 100644 --- a/screenshots/de/libraries.matrix.ui.components_AvatarActionBottomSheet_Day_0_de.png +++ b/screenshots/de/libraries.matrix.ui.components_AvatarActionBottomSheet_Day_0_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:0b7fec73fbfc84ec71386b10d6c69dbb22b5d6075f26430e6840829ae80e7063 -size 14188 +oid sha256:37e098e3e33c4b518c6cfe5358f3b79b1bce2117cd968103cf325e44da95fda2 +size 14163 diff --git a/screenshots/de/libraries.matrix.ui.components_CheckableUnresolvedUserRow_de.png b/screenshots/de/libraries.matrix.ui.components_CheckableUnresolvedUserRow_de.png index 0a2c8f25a4..b2f0e64495 100644 --- a/screenshots/de/libraries.matrix.ui.components_CheckableUnresolvedUserRow_de.png +++ b/screenshots/de/libraries.matrix.ui.components_CheckableUnresolvedUserRow_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:135a117af875a1b8ebecbaf4bf4ef86b69ad1ff2d6e207e6d8be5991ba92e658 -size 130475 +oid sha256:fde26e4404bb2a324cc098fc0c16dbfeabaf40fad7fc59c279c756e200b3a03b +size 127545 diff --git a/screenshots/de/libraries.matrix.ui.components_CreateDmConfirmationBottomSheet_Day_0_de.png b/screenshots/de/libraries.matrix.ui.components_CreateDmConfirmationBottomSheet_Day_0_de.png index 2e3d534bf5..b039c5443a 100644 --- a/screenshots/de/libraries.matrix.ui.components_CreateDmConfirmationBottomSheet_Day_0_de.png +++ b/screenshots/de/libraries.matrix.ui.components_CreateDmConfirmationBottomSheet_Day_0_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:4221f512a64596717845eb51f9316f51b955f9b823a06eb33cf875db4ac65194 -size 28590 +oid sha256:700e0f0019531df25af662e0f960e745344cc798667636d71981594cccc5715a +size 28744 diff --git a/screenshots/de/libraries.matrix.ui.components_CreateDmConfirmationBottomSheet_Day_1_de.png b/screenshots/de/libraries.matrix.ui.components_CreateDmConfirmationBottomSheet_Day_1_de.png index 22e7367fb7..077a8bb9b4 100644 --- a/screenshots/de/libraries.matrix.ui.components_CreateDmConfirmationBottomSheet_Day_1_de.png +++ b/screenshots/de/libraries.matrix.ui.components_CreateDmConfirmationBottomSheet_Day_1_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:ca667c0a03937e313117c5f5cfa1097813b98733e99561bb400d285420907dd7 -size 26961 +oid sha256:1e6f7d8976e5fd8a35c023194c7d5addc0167f4f97e2146c0c2be118a0a9e2f6 +size 27030 diff --git a/screenshots/de/libraries.matrix.ui.components_InviteSenderView_Day_0_de.png b/screenshots/de/libraries.matrix.ui.components_InviteSenderView_Day_0_de.png index 352e9b308e..c3d0df5920 100644 --- a/screenshots/de/libraries.matrix.ui.components_InviteSenderView_Day_0_de.png +++ b/screenshots/de/libraries.matrix.ui.components_InviteSenderView_Day_0_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:c6c0f0682bd840d34a2f50b799147bf4dec094d6164929e407ddb2b32fb001d7 -size 11617 +oid sha256:1ed3db17a4fc81cd6a0b50d82923fb2edfabf8f1ad4368305d5f6dd453021c0d +size 11672 diff --git a/screenshots/de/libraries.matrix.ui.components_UnresolvedUserRow_de.png b/screenshots/de/libraries.matrix.ui.components_UnresolvedUserRow_de.png index f41c9309ec..7718515f1f 100644 --- a/screenshots/de/libraries.matrix.ui.components_UnresolvedUserRow_de.png +++ b/screenshots/de/libraries.matrix.ui.components_UnresolvedUserRow_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:ac4dea47d3ad41ada5222a3b5f234b68b4d71189ce5454aa35551de7d3cdf786 -size 40444 +oid sha256:c9e55c46d0f6633650ea00b79a97e79f140e2ecc27e4af979a4d7a8ce059d1f7 +size 73790 diff --git a/screenshots/de/libraries.matrix.ui.messages.reply_InReplyToView_Day_4_de.png b/screenshots/de/libraries.matrix.ui.messages.reply_InReplyToView_Day_4_de.png index eed45a560c..a63226c222 100644 --- a/screenshots/de/libraries.matrix.ui.messages.reply_InReplyToView_Day_4_de.png +++ b/screenshots/de/libraries.matrix.ui.messages.reply_InReplyToView_Day_4_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:bacb2124d3ab428fbaeb72318508868219fceeaa34277f74e034f73f4adcba0a -size 8694 +oid sha256:ef21868f9e2a8438c344597e575aa4f73ccc110c648d463ecfcc9167a844e3fb +size 8892 diff --git a/screenshots/de/libraries.matrix.ui.messages.reply_InReplyToView_Day_8_de.png b/screenshots/de/libraries.matrix.ui.messages.reply_InReplyToView_Day_8_de.png index 3113a7932a..f6da8cad71 100644 --- a/screenshots/de/libraries.matrix.ui.messages.reply_InReplyToView_Day_8_de.png +++ b/screenshots/de/libraries.matrix.ui.messages.reply_InReplyToView_Day_8_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:6ae046a0491b19e60ef1fac693003db8e8105e65a304063dd80b07713030578b -size 9245 +oid sha256:f18775394d6ed273abd194b08007da8913258b4ab87d95a02baf05633c5ffec6 +size 9405 diff --git a/screenshots/de/libraries.mediaviewer.impl.details_MediaDeleteConfirmationBottomSheet_Day_0_de.png b/screenshots/de/libraries.mediaviewer.impl.details_MediaDeleteConfirmationBottomSheet_Day_0_de.png index e19fb7d37b..bce38076ef 100644 --- a/screenshots/de/libraries.mediaviewer.impl.details_MediaDeleteConfirmationBottomSheet_Day_0_de.png +++ b/screenshots/de/libraries.mediaviewer.impl.details_MediaDeleteConfirmationBottomSheet_Day_0_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:4154f4050650d940c5fd4efe4923f636625afc6472880ec3b3d28d8224346f10 -size 36519 +oid sha256:eb9b147dc0a5ebd86aedf5cef09300872712616f19669fafd7969b158994728a +size 36486 diff --git a/screenshots/de/libraries.mediaviewer.impl.details_MediaDetailsBottomSheet_Day_0_de.png b/screenshots/de/libraries.mediaviewer.impl.details_MediaDetailsBottomSheet_Day_0_de.png index ac4e761484..101f89bb83 100644 --- a/screenshots/de/libraries.mediaviewer.impl.details_MediaDetailsBottomSheet_Day_0_de.png +++ b/screenshots/de/libraries.mediaviewer.impl.details_MediaDetailsBottomSheet_Day_0_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:daa565bfe2140f1048ee5d49fa24b296919de197f89b4a251344d43c76dc6365 -size 42994 +oid sha256:aecba3d40603a4023dfcc8507cf19adc983e9993544c618d4bb3b5635bbbf921 +size 43059 diff --git a/screenshots/de/libraries.mediaviewer.impl.gallery_MediaGalleryView_Day_0_de.png b/screenshots/de/libraries.mediaviewer.impl.gallery_MediaGalleryView_Day_0_de.png index 50c4c25dbe..d8ce49ed62 100644 --- a/screenshots/de/libraries.mediaviewer.impl.gallery_MediaGalleryView_Day_0_de.png +++ b/screenshots/de/libraries.mediaviewer.impl.gallery_MediaGalleryView_Day_0_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:35ab834f00563550620783de13fc1ed3df82a36461f3a90196e2d50bdbb66827 -size 64664 +oid sha256:8802d043fdcda3663a7703b1986a25043d299008b0eef8a220dad5ccfd164b4a +size 64756 diff --git a/screenshots/de/libraries.mediaviewer.impl.gallery_MediaGalleryView_Day_10_de.png b/screenshots/de/libraries.mediaviewer.impl.gallery_MediaGalleryView_Day_10_de.png index bfed43523e..7e6337b642 100644 --- a/screenshots/de/libraries.mediaviewer.impl.gallery_MediaGalleryView_Day_10_de.png +++ b/screenshots/de/libraries.mediaviewer.impl.gallery_MediaGalleryView_Day_10_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:26ae069cc5a6f8b4d354f70a94dc80337dec614b44064849625d20babfa6e65c -size 15240 +oid sha256:471d9a1e70e019f373958aca834bf631874dc64fc8a2e04a5a8c36c11bf41770 +size 15256 diff --git a/screenshots/de/libraries.mediaviewer.impl.gallery_MediaGalleryView_Day_11_de.png b/screenshots/de/libraries.mediaviewer.impl.gallery_MediaGalleryView_Day_11_de.png index 5271324189..e2168318d1 100644 --- a/screenshots/de/libraries.mediaviewer.impl.gallery_MediaGalleryView_Day_11_de.png +++ b/screenshots/de/libraries.mediaviewer.impl.gallery_MediaGalleryView_Day_11_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:e5dd9c2cc7e2534297e94304e027791e662e92368e247fea090689f6f61684de -size 61794 +oid sha256:b19feb9904ba5128133c60af1d6ffe5755b4ef009b9611f3af83d3a25ae495a6 +size 61884 diff --git a/screenshots/de/libraries.mediaviewer.impl.gallery_MediaGalleryView_Day_12_de.png b/screenshots/de/libraries.mediaviewer.impl.gallery_MediaGalleryView_Day_12_de.png index 5e95f117f8..a8fd83c3db 100644 --- a/screenshots/de/libraries.mediaviewer.impl.gallery_MediaGalleryView_Day_12_de.png +++ b/screenshots/de/libraries.mediaviewer.impl.gallery_MediaGalleryView_Day_12_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:fd95a67267845f38c9e25be672826c5d48ae7edee0aa2c8916eefeafcffd6721 -size 61873 +oid sha256:fdb11e06a185f48bc899582c6fe38630d5b9a887b1f0908b586a43b17c0485cc +size 61885 diff --git a/screenshots/de/libraries.mediaviewer.impl.gallery_MediaGalleryView_Day_1_de.png b/screenshots/de/libraries.mediaviewer.impl.gallery_MediaGalleryView_Day_1_de.png index 5271324189..e2168318d1 100644 --- a/screenshots/de/libraries.mediaviewer.impl.gallery_MediaGalleryView_Day_1_de.png +++ b/screenshots/de/libraries.mediaviewer.impl.gallery_MediaGalleryView_Day_1_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:e5dd9c2cc7e2534297e94304e027791e662e92368e247fea090689f6f61684de -size 61794 +oid sha256:b19feb9904ba5128133c60af1d6ffe5755b4ef009b9611f3af83d3a25ae495a6 +size 61884 diff --git a/screenshots/de/libraries.mediaviewer.impl.gallery_MediaGalleryView_Day_2_de.png b/screenshots/de/libraries.mediaviewer.impl.gallery_MediaGalleryView_Day_2_de.png index 9b8975cb6d..fa03ecfd0b 100644 --- a/screenshots/de/libraries.mediaviewer.impl.gallery_MediaGalleryView_Day_2_de.png +++ b/screenshots/de/libraries.mediaviewer.impl.gallery_MediaGalleryView_Day_2_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:5858d626cc9c137dc7eccce489aba061ea16d2a7ee9ba69b21514d7408f97d9d -size 75806 +oid sha256:b6c9f9a367f05f667a91f8925d806ab70f6ade5db866a452a7c4ba6ba67ec51c +size 76029 diff --git a/screenshots/de/libraries.mediaviewer.impl.gallery_MediaGalleryView_Day_3_de.png b/screenshots/de/libraries.mediaviewer.impl.gallery_MediaGalleryView_Day_3_de.png index 9f825ec840..81ab79ed90 100644 --- a/screenshots/de/libraries.mediaviewer.impl.gallery_MediaGalleryView_Day_3_de.png +++ b/screenshots/de/libraries.mediaviewer.impl.gallery_MediaGalleryView_Day_3_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:31ba33141179bb2249d0ed3821e630289fe3bb7a85cf4f1b99795c85a507fb52 -size 529081 +oid sha256:fdd36f2537be1e2e5c32fcba86e53478d7e99ce152c59141f78e71917a181364 +size 529161 diff --git a/screenshots/de/libraries.mediaviewer.impl.gallery_MediaGalleryView_Day_4_de.png b/screenshots/de/libraries.mediaviewer.impl.gallery_MediaGalleryView_Day_4_de.png index 5e95f117f8..a8fd83c3db 100644 --- a/screenshots/de/libraries.mediaviewer.impl.gallery_MediaGalleryView_Day_4_de.png +++ b/screenshots/de/libraries.mediaviewer.impl.gallery_MediaGalleryView_Day_4_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:fd95a67267845f38c9e25be672826c5d48ae7edee0aa2c8916eefeafcffd6721 -size 61873 +oid sha256:fdb11e06a185f48bc899582c6fe38630d5b9a887b1f0908b586a43b17c0485cc +size 61885 diff --git a/screenshots/de/libraries.mediaviewer.impl.gallery_MediaGalleryView_Day_5_de.png b/screenshots/de/libraries.mediaviewer.impl.gallery_MediaGalleryView_Day_5_de.png index 5e95f117f8..a8fd83c3db 100644 --- a/screenshots/de/libraries.mediaviewer.impl.gallery_MediaGalleryView_Day_5_de.png +++ b/screenshots/de/libraries.mediaviewer.impl.gallery_MediaGalleryView_Day_5_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:fd95a67267845f38c9e25be672826c5d48ae7edee0aa2c8916eefeafcffd6721 -size 61873 +oid sha256:fdb11e06a185f48bc899582c6fe38630d5b9a887b1f0908b586a43b17c0485cc +size 61885 diff --git a/screenshots/de/libraries.mediaviewer.impl.gallery_MediaGalleryView_Day_6_de.png b/screenshots/de/libraries.mediaviewer.impl.gallery_MediaGalleryView_Day_6_de.png index 9c5268a6f0..9983e1aa88 100644 --- a/screenshots/de/libraries.mediaviewer.impl.gallery_MediaGalleryView_Day_6_de.png +++ b/screenshots/de/libraries.mediaviewer.impl.gallery_MediaGalleryView_Day_6_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:10a52fb677a9ab77e3f982716a1207b6364b707f376fddb878b6b89eaf0bbf76 -size 82784 +oid sha256:025118ba6f44c729cfdf0fbc21ce767842d15dd936534724ba9316f045653f31 +size 82682 diff --git a/screenshots/de/libraries.mediaviewer.impl.gallery_MediaGalleryView_Day_7_de.png b/screenshots/de/libraries.mediaviewer.impl.gallery_MediaGalleryView_Day_7_de.png index 0c61fdb501..2c9dbc4886 100644 --- a/screenshots/de/libraries.mediaviewer.impl.gallery_MediaGalleryView_Day_7_de.png +++ b/screenshots/de/libraries.mediaviewer.impl.gallery_MediaGalleryView_Day_7_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:0e96fd4b395e2752e3ff4feee266e23501021fb21ffd4399f2e464cddaee0e27 -size 33240 +oid sha256:cfb983c7773607092a316ee712c0d50ec4e0bb2cc69e53d849d98b32c2037c99 +size 33321 diff --git a/screenshots/de/libraries.mediaviewer.impl.gallery_MediaGalleryView_Day_8_de.png b/screenshots/de/libraries.mediaviewer.impl.gallery_MediaGalleryView_Day_8_de.png index 573176271f..8b2ea46507 100644 --- a/screenshots/de/libraries.mediaviewer.impl.gallery_MediaGalleryView_Day_8_de.png +++ b/screenshots/de/libraries.mediaviewer.impl.gallery_MediaGalleryView_Day_8_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:f856e324b80969e52dc04eb775047756901d913f6bc9293d33607b82c2efabd3 -size 45789 +oid sha256:2af40dcc68f10418ece9ebb6c5148bc2a3f339486f975dd2f6e82a3296554143 +size 45785 diff --git a/screenshots/de/libraries.mediaviewer.impl.gallery_MediaGalleryView_Day_9_de.png b/screenshots/de/libraries.mediaviewer.impl.gallery_MediaGalleryView_Day_9_de.png index 2d902fa8ac..b1428db8bf 100644 --- a/screenshots/de/libraries.mediaviewer.impl.gallery_MediaGalleryView_Day_9_de.png +++ b/screenshots/de/libraries.mediaviewer.impl.gallery_MediaGalleryView_Day_9_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:22b0d11b570cff54f333aa7130b6b8750cec4a4048183134d9e73400a1e0b37b -size 15173 +oid sha256:d422c54444ad386393580e35860ebb5a2e9121c5566b41455ab512cbb9042efb +size 15264 diff --git a/screenshots/de/libraries.mediaviewer.impl.local.pdf_PdfPagesErrorView_Day_0_de.png b/screenshots/de/libraries.mediaviewer.impl.local.pdf_PdfPagesErrorView_Day_0_de.png index 3a28283d14..9230b9715a 100644 --- a/screenshots/de/libraries.mediaviewer.impl.local.pdf_PdfPagesErrorView_Day_0_de.png +++ b/screenshots/de/libraries.mediaviewer.impl.local.pdf_PdfPagesErrorView_Day_0_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:5ab402da45794a19a5da974462a6078576fec90a8be0a467084fafecadc34abb -size 16057 +oid sha256:23b77be1572f4f3bd6fc9b013dd6a29047ad0e4a5b8dcea71073c13788c0f818 +size 16107 diff --git a/screenshots/de/libraries.mediaviewer.impl.viewer_MediaViewerView_11_de.png b/screenshots/de/libraries.mediaviewer.impl.viewer_MediaViewerView_11_de.png index dc8b7b0be0..efe2112eca 100644 --- a/screenshots/de/libraries.mediaviewer.impl.viewer_MediaViewerView_11_de.png +++ b/screenshots/de/libraries.mediaviewer.impl.viewer_MediaViewerView_11_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:80e41f7bd9db1206cfaf9ed19f141988e9415ad4f4198f859e8203455145cdf4 -size 42530 +oid sha256:9035f7f5e0981bfec028980576ddf3cb25fd03fe3e9c824efbb6579ba4d5816b +size 42671 diff --git a/screenshots/de/libraries.mediaviewer.impl.viewer_MediaViewerView_12_de.png b/screenshots/de/libraries.mediaviewer.impl.viewer_MediaViewerView_12_de.png index 60a3759c27..a84fdb5d7b 100644 --- a/screenshots/de/libraries.mediaviewer.impl.viewer_MediaViewerView_12_de.png +++ b/screenshots/de/libraries.mediaviewer.impl.viewer_MediaViewerView_12_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:757f2787e4e3cb1aa6fb8e5d60a852811db68921fc904acca0cf958420795e9c -size 35971 +oid sha256:1f7cf384740483dea7acc6c99aa0aaad9c9bdfa4a3d60e4f2ac04d4c1698b959 +size 35939 diff --git a/screenshots/de/libraries.mediaviewer.impl.viewer_MediaViewerView_14_de.png b/screenshots/de/libraries.mediaviewer.impl.viewer_MediaViewerView_14_de.png index 8335b7acbc..a82c4fbb48 100644 --- a/screenshots/de/libraries.mediaviewer.impl.viewer_MediaViewerView_14_de.png +++ b/screenshots/de/libraries.mediaviewer.impl.viewer_MediaViewerView_14_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:f065c8dc4ce2073c89b771a3f89c336877cd512f09133c9632f304e51f748907 -size 8852 +oid sha256:7353634dec22f3c4112c3d71290e8959775e97f7f1c140b0ec69c71f675c13c8 +size 8862 diff --git a/screenshots/de/libraries.mediaviewer.impl.viewer_MediaViewerView_2_de.png b/screenshots/de/libraries.mediaviewer.impl.viewer_MediaViewerView_2_de.png index d4551d3331..4b6d14cdb7 100644 --- a/screenshots/de/libraries.mediaviewer.impl.viewer_MediaViewerView_2_de.png +++ b/screenshots/de/libraries.mediaviewer.impl.viewer_MediaViewerView_2_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:71dda303c03a8e8d5aa0d959f726c6a74013ac6d8326a3fbb40e2b85cfe8c3bd -size 45983 +oid sha256:7c88b10eeb0b787624d12e653d4b7037cdc42b90a91c40ea23ab7b661af03625 +size 45999 diff --git a/screenshots/de/libraries.permissions.api_PermissionsView_Day_0_de.png b/screenshots/de/libraries.permissions.api_PermissionsView_Day_0_de.png index 103e1688da..be893d4857 100644 --- a/screenshots/de/libraries.permissions.api_PermissionsView_Day_0_de.png +++ b/screenshots/de/libraries.permissions.api_PermissionsView_Day_0_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:809786fd1963b6ffc673655e2eec299c7488636e3bab0f064d513a0901cfd1b3 -size 32773 +oid sha256:8e007e2bacf98c632d1bb9eda4fa04d3719538e4e9c301a645aaeeec477de546 +size 32161 diff --git a/screenshots/de/libraries.permissions.api_PermissionsView_Day_1_de.png b/screenshots/de/libraries.permissions.api_PermissionsView_Day_1_de.png index b3ffaebba1..8244550c6e 100644 --- a/screenshots/de/libraries.permissions.api_PermissionsView_Day_1_de.png +++ b/screenshots/de/libraries.permissions.api_PermissionsView_Day_1_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:81e091e214ac8e9ddc8b5980396b9c12433ef62a1a41f35dd48b96116b6974da -size 29998 +oid sha256:a5e3427e220abb3b7a6c165cf9651d742c3b81b77f08f0f88575a8fa3aa25dd4 +size 29431 diff --git a/screenshots/de/libraries.permissions.api_PermissionsView_Day_2_de.png b/screenshots/de/libraries.permissions.api_PermissionsView_Day_2_de.png index 8e0666e26a..f812bf4ac7 100644 --- a/screenshots/de/libraries.permissions.api_PermissionsView_Day_2_de.png +++ b/screenshots/de/libraries.permissions.api_PermissionsView_Day_2_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:b4553f6ebb23dad5fda6ca56340c47771b42a8d214c47a627a223d33a96d6d59 -size 30362 +oid sha256:e6e6930c02fbb1514ba608033dbc3b2ee5179463c83e5c1823a5330eec6467af +size 29817 diff --git a/screenshots/de/libraries.permissions.api_PermissionsView_Day_3_de.png b/screenshots/de/libraries.permissions.api_PermissionsView_Day_3_de.png index 8282092a3a..749747c45f 100644 --- a/screenshots/de/libraries.permissions.api_PermissionsView_Day_3_de.png +++ b/screenshots/de/libraries.permissions.api_PermissionsView_Day_3_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:b78efbd92e38f2414dc22d68e828ef5d0a1e559e60063d48608601d7f9d7f677 -size 22901 +oid sha256:75cdbf8a17df864faaec4ed2b228bb92c293e9d4e3385ddb11678cfff55976ed +size 22391 diff --git a/screenshots/de/libraries.roomselect.impl_RoomSelectView_Day_0_de.png b/screenshots/de/libraries.roomselect.impl_RoomSelectView_Day_0_de.png index 3b66447591..c22f818b3b 100644 --- a/screenshots/de/libraries.roomselect.impl_RoomSelectView_Day_0_de.png +++ b/screenshots/de/libraries.roomselect.impl_RoomSelectView_Day_0_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:6ff19ac2b9dbf379714490d1c8b6b7a84e88f2227bcbb3fd693729cf97ce397c -size 13959 +oid sha256:a89366ca6bc6a19e2661466d43f883532a84ad129bdc6f0249be8a0215f38184 +size 14046 diff --git a/screenshots/de/libraries.roomselect.impl_RoomSelectView_Day_1_de.png b/screenshots/de/libraries.roomselect.impl_RoomSelectView_Day_1_de.png index f91480b4f7..67b221f32d 100644 --- a/screenshots/de/libraries.roomselect.impl_RoomSelectView_Day_1_de.png +++ b/screenshots/de/libraries.roomselect.impl_RoomSelectView_Day_1_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:22822883cff44f202ed52c8673c2f0339eb786db936ab6e7d44228519be866d3 -size 11974 +oid sha256:6388e6452d693c8675ef66e55c53aba8625c54ba3fa1667ee808f00a06259ef7 +size 12015 diff --git a/screenshots/de/libraries.roomselect.impl_RoomSelectView_Day_2_de.png b/screenshots/de/libraries.roomselect.impl_RoomSelectView_Day_2_de.png index 48294c4a85..a793b7a3f6 100644 --- a/screenshots/de/libraries.roomselect.impl_RoomSelectView_Day_2_de.png +++ b/screenshots/de/libraries.roomselect.impl_RoomSelectView_Day_2_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:5b11f9a61532b3b5b7179bbae28cd9834128ed31b5b2d6fa18a5b58b87840c6d -size 32291 +oid sha256:2f28f4aa100b165a6e42c00954fe4db9d73ab22435030170350bea688bce4ec6 +size 32551 diff --git a/screenshots/de/libraries.roomselect.impl_RoomSelectView_Day_3_de.png b/screenshots/de/libraries.roomselect.impl_RoomSelectView_Day_3_de.png index bfcfcb5348..639a8ffd2b 100644 --- a/screenshots/de/libraries.roomselect.impl_RoomSelectView_Day_3_de.png +++ b/screenshots/de/libraries.roomselect.impl_RoomSelectView_Day_3_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:3f7f7be5d21620ea969c560863c0745928c3c8cb8706b6ab7c9ac45294388ea9 -size 30594 +oid sha256:d273538c58df7381a0fb1873a7a50e096e4c16c54682a5080f0bb1bde04f415e +size 30845 diff --git a/screenshots/de/libraries.roomselect.impl_RoomSelectView_Day_4_de.png b/screenshots/de/libraries.roomselect.impl_RoomSelectView_Day_4_de.png index dd9ab43246..a115bed8ee 100644 --- a/screenshots/de/libraries.roomselect.impl_RoomSelectView_Day_4_de.png +++ b/screenshots/de/libraries.roomselect.impl_RoomSelectView_Day_4_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:3e92d9906af1ac2fd4aad50ab37756e81a839f28efe1c20d9675f893fb925d53 -size 34952 +oid sha256:cdfa2531856686f975d8322edef4ec558980e92d60a7f10b0730da5f2428d8d3 +size 35211 diff --git a/screenshots/de/libraries.roomselect.impl_RoomSelectView_Day_5_de.png b/screenshots/de/libraries.roomselect.impl_RoomSelectView_Day_5_de.png index cee48fe4c4..f312c6ca84 100644 --- a/screenshots/de/libraries.roomselect.impl_RoomSelectView_Day_5_de.png +++ b/screenshots/de/libraries.roomselect.impl_RoomSelectView_Day_5_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:3f506cdaf8275b1174541b7f50e19f5a2b7f6bd07136333392fbeac8449b8f38 -size 29963 +oid sha256:353823e3ae77c8ad1bbf0eb06e0d81f8244d67c7614fb049695c1d34f3967b7f +size 30229 diff --git a/screenshots/de/libraries.textcomposer_CaptionWarningBottomSheet_Day_0_de.png b/screenshots/de/libraries.textcomposer_CaptionWarningBottomSheet_Day_0_de.png index 0f81e3a2f1..fddd65714a 100644 --- a/screenshots/de/libraries.textcomposer_CaptionWarningBottomSheet_Day_0_de.png +++ b/screenshots/de/libraries.textcomposer_CaptionWarningBottomSheet_Day_0_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:6b1fb180aaae1b9925b22fd1ba41f115ab2fee7992a4b7a81d1b82410d30dcdb -size 21086 +oid sha256:36e21a9663aeed7a474d422ec0c67cd770bf0d68ffebadcd770d115cb361ed47 +size 21279 diff --git a/screenshots/de/libraries.textcomposer_ComposerModeView_Day_0_de.png b/screenshots/de/libraries.textcomposer_ComposerModeView_Day_0_de.png index ed5241c920..8a66f0d314 100644 --- a/screenshots/de/libraries.textcomposer_ComposerModeView_Day_0_de.png +++ b/screenshots/de/libraries.textcomposer_ComposerModeView_Day_0_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:3052037d003f8bdde4bf79b820d8a1970604b0b8b8a0e2f8d7fa761b29c7c0cb -size 6305 +oid sha256:fa9ab0bf9088d4d19738eb2606b1f3e0dcf3aded754ee3a3ca5956d4a6a9fcde +size 6185 diff --git a/screenshots/de/libraries.textcomposer_MarkdownTextComposerEdit_Day_0_de.png b/screenshots/de/libraries.textcomposer_MarkdownTextComposerEdit_Day_0_de.png index 52b69e4ce4..d127fc83d7 100644 --- a/screenshots/de/libraries.textcomposer_MarkdownTextComposerEdit_Day_0_de.png +++ b/screenshots/de/libraries.textcomposer_MarkdownTextComposerEdit_Day_0_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:a6da300cfc024795c03eabdae55a72562be7a623d327ffb9c3a47b13c88cfc7a -size 55335 +oid sha256:60cc65fbeb8cda08f6ad79c30b0c67de60257a7993f9cf9a77a2e0b536ccf919 +size 55466 diff --git a/screenshots/de/libraries.textcomposer_TextComposerAddCaption_Day_0_de.png b/screenshots/de/libraries.textcomposer_TextComposerAddCaption_Day_0_de.png index a20414cab1..40b5e4fcdd 100644 --- a/screenshots/de/libraries.textcomposer_TextComposerAddCaption_Day_0_de.png +++ b/screenshots/de/libraries.textcomposer_TextComposerAddCaption_Day_0_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:f48d2c00b858cce8372f0adccf68aa0ae64fe2750d9cedb74e3cb720860e1b64 -size 61320 +oid sha256:fee1127041bff5a4047dac582bb8353d0b3bb4b2ef41f486d7bf7f646873591b +size 61474 diff --git a/screenshots/de/libraries.textcomposer_TextComposerCaption_Day_0_de.png b/screenshots/de/libraries.textcomposer_TextComposerCaption_Day_0_de.png index 602a6acbb6..569d92dccb 100644 --- a/screenshots/de/libraries.textcomposer_TextComposerCaption_Day_0_de.png +++ b/screenshots/de/libraries.textcomposer_TextComposerCaption_Day_0_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:36029ca7cf714611246a9f666e5cb83d1238768955a9bf13ed39f54d77220634 -size 48558 +oid sha256:096a1828bc630757e6abd080624fd81b4d3e667f83ce428fbd7a9bc9f6c1f7b6 +size 46548 diff --git a/screenshots/de/libraries.textcomposer_TextComposerEditCaption_Day_0_de.png b/screenshots/de/libraries.textcomposer_TextComposerEditCaption_Day_0_de.png index d63f174b65..fe75c2ca42 100644 --- a/screenshots/de/libraries.textcomposer_TextComposerEditCaption_Day_0_de.png +++ b/screenshots/de/libraries.textcomposer_TextComposerEditCaption_Day_0_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:63a1e53a8c10cb13717809f2d71fc2bf4ebdb668c9f42366650fb2f16f847876 -size 59210 +oid sha256:a6a9f4274e261724436a37c9ca59796c412e2f4ec4711bf2bbb8d8f7b3e01543 +size 59501 diff --git a/screenshots/de/libraries.textcomposer_TextComposerEditNotEncrypted_Day_0_de.png b/screenshots/de/libraries.textcomposer_TextComposerEditNotEncrypted_Day_0_de.png index 44a1e6d5ba..fa69690dc0 100644 --- a/screenshots/de/libraries.textcomposer_TextComposerEditNotEncrypted_Day_0_de.png +++ b/screenshots/de/libraries.textcomposer_TextComposerEditNotEncrypted_Day_0_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:e719da05692dbdac723848e89174692ee74a5d37383da4c1262d3b12d093eaa3 -size 67832 +oid sha256:8acf506699000a01eb65fd8acab056d070c1599a59319a0aae6dd1e38023da83 +size 67973 diff --git a/screenshots/de/libraries.textcomposer_TextComposerEdit_Day_0_de.png b/screenshots/de/libraries.textcomposer_TextComposerEdit_Day_0_de.png index 52b69e4ce4..d127fc83d7 100644 --- a/screenshots/de/libraries.textcomposer_TextComposerEdit_Day_0_de.png +++ b/screenshots/de/libraries.textcomposer_TextComposerEdit_Day_0_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:a6da300cfc024795c03eabdae55a72562be7a623d327ffb9c3a47b13c88cfc7a -size 55335 +oid sha256:60cc65fbeb8cda08f6ad79c30b0c67de60257a7993f9cf9a77a2e0b536ccf919 +size 55466 diff --git a/screenshots/de/libraries.textcomposer_TextComposerFormattingNotEncrypted_Day_0_de.png b/screenshots/de/libraries.textcomposer_TextComposerFormattingNotEncrypted_Day_0_de.png index 63577ff4fd..fb8bea88f5 100644 --- a/screenshots/de/libraries.textcomposer_TextComposerFormattingNotEncrypted_Day_0_de.png +++ b/screenshots/de/libraries.textcomposer_TextComposerFormattingNotEncrypted_Day_0_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:1e5c8a6b6452df551c2d185cf2952e53ffe1e580ba9f302cefbbd1a57c9f682b -size 65737 +oid sha256:a4782b03a120bbb9c54ebd34bb5ee892686277301fb8f1f3131d86a987f42f8e +size 66107 diff --git a/screenshots/de/libraries.textcomposer_TextComposerFormatting_Day_0_de.png b/screenshots/de/libraries.textcomposer_TextComposerFormatting_Day_0_de.png index b8698637e8..9136cb6afb 100644 --- a/screenshots/de/libraries.textcomposer_TextComposerFormatting_Day_0_de.png +++ b/screenshots/de/libraries.textcomposer_TextComposerFormatting_Day_0_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:46727b4a705460f05b5964006f3461aaabfe793763289d326963ba2a7ace1794 -size 53258 +oid sha256:187aa4b837fcd244f4cef929c9dc093defdba5315025e5ee2faea34d62aaa1b4 +size 53588 diff --git a/screenshots/de/libraries.textcomposer_TextComposerLinkDialogCreateLinkWithoutText_Day_0_de.png b/screenshots/de/libraries.textcomposer_TextComposerLinkDialogCreateLinkWithoutText_Day_0_de.png index 817e9368ee..b6ff7be595 100644 --- a/screenshots/de/libraries.textcomposer_TextComposerLinkDialogCreateLinkWithoutText_Day_0_de.png +++ b/screenshots/de/libraries.textcomposer_TextComposerLinkDialogCreateLinkWithoutText_Day_0_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:19eff09a3190f13352919e820f64a831544d3bcb5d45904bbb953be8d49f8e10 -size 14868 +oid sha256:567be7b8c78b5e48eaf5f3dc8403d9531d9ffd8876f586adc4bddae4bd184362 +size 14350 diff --git a/screenshots/de/libraries.textcomposer_TextComposerLinkDialogCreateLink_Day_0_de.png b/screenshots/de/libraries.textcomposer_TextComposerLinkDialogCreateLink_Day_0_de.png index e1c4bd661b..c5caa515a7 100644 --- a/screenshots/de/libraries.textcomposer_TextComposerLinkDialogCreateLink_Day_0_de.png +++ b/screenshots/de/libraries.textcomposer_TextComposerLinkDialogCreateLink_Day_0_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:796d1da0f461fe6a9544b98acb73a408feddb754f0fd1f595e773a65591d59b0 -size 16341 +oid sha256:e15daf3f353c3462086d514f58edffc00f8e432bb48bc4ef9d4f5f9a3b7447cd +size 15911 diff --git a/screenshots/de/libraries.textcomposer_TextComposerLinkDialogEditLink_Day_0_de.png b/screenshots/de/libraries.textcomposer_TextComposerLinkDialogEditLink_Day_0_de.png index aca05f1877..967d5845ac 100644 --- a/screenshots/de/libraries.textcomposer_TextComposerLinkDialogEditLink_Day_0_de.png +++ b/screenshots/de/libraries.textcomposer_TextComposerLinkDialogEditLink_Day_0_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:7167d05769b82a6c42face1fd25ecf82a96770fb0279834ffa99bd01d7ed53d9 -size 19969 +oid sha256:ae3e6e940fba50f527d553da3a45fbfab17d96d7b9e3762da2bf0236f8e9f873 +size 19531 diff --git a/screenshots/de/libraries.textcomposer_TextComposerReplyNotEncrypted_Day_0_de.png b/screenshots/de/libraries.textcomposer_TextComposerReplyNotEncrypted_Day_0_de.png index f914285192..a99064f50b 100644 --- a/screenshots/de/libraries.textcomposer_TextComposerReplyNotEncrypted_Day_0_de.png +++ b/screenshots/de/libraries.textcomposer_TextComposerReplyNotEncrypted_Day_0_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:0f4ccc93ebfd5f285695ed5b851ad4ffc98d9d708f3fe86e717f0793955f1463 -size 74778 +oid sha256:40592dd5b485f10fb6b180e676f59bc2ea3946b7966a7d3b82e0b5e2b6f8f53c +size 75347 diff --git a/screenshots/de/libraries.textcomposer_TextComposerReplyNotEncrypted_Day_10_de.png b/screenshots/de/libraries.textcomposer_TextComposerReplyNotEncrypted_Day_10_de.png index aec87f6d99..2979c82d8d 100644 --- a/screenshots/de/libraries.textcomposer_TextComposerReplyNotEncrypted_Day_10_de.png +++ b/screenshots/de/libraries.textcomposer_TextComposerReplyNotEncrypted_Day_10_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:6cafe6505cfe34469cd86f203f0c952a5f66f94a9407df1a6701804780058592 -size 61397 +oid sha256:717054f6cf1deaccc69e0f23587d4362b3f473c36abca4b08ea665affd1caf38 +size 61932 diff --git a/screenshots/de/libraries.textcomposer_TextComposerReplyNotEncrypted_Day_11_de.png b/screenshots/de/libraries.textcomposer_TextComposerReplyNotEncrypted_Day_11_de.png index 86412214e8..784c0fd618 100644 --- a/screenshots/de/libraries.textcomposer_TextComposerReplyNotEncrypted_Day_11_de.png +++ b/screenshots/de/libraries.textcomposer_TextComposerReplyNotEncrypted_Day_11_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:fbdb2c32142b84b98bb997c82eaf2197e38abf8425bc809099dad355e05f2fa4 -size 74221 +oid sha256:e13c7bc1577ceb046e6eff0ae8750299ef7f652e5e8b8e4183bca5e9b5c3b225 +size 74758 diff --git a/screenshots/de/libraries.textcomposer_TextComposerReplyNotEncrypted_Day_1_de.png b/screenshots/de/libraries.textcomposer_TextComposerReplyNotEncrypted_Day_1_de.png index d7146c75d2..def666e030 100644 --- a/screenshots/de/libraries.textcomposer_TextComposerReplyNotEncrypted_Day_1_de.png +++ b/screenshots/de/libraries.textcomposer_TextComposerReplyNotEncrypted_Day_1_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:473911e5c55ac318dbc44fa8c284679629b93587fb4888d9e454430c7bd36a56 -size 82320 +oid sha256:51f6dfb47b2799974065516f6e111730da5d8b6e2c904e297e11c6acb2c2835c +size 83409 diff --git a/screenshots/de/libraries.textcomposer_TextComposerReplyNotEncrypted_Day_2_de.png b/screenshots/de/libraries.textcomposer_TextComposerReplyNotEncrypted_Day_2_de.png index 47a829fdcb..543f397c18 100644 --- a/screenshots/de/libraries.textcomposer_TextComposerReplyNotEncrypted_Day_2_de.png +++ b/screenshots/de/libraries.textcomposer_TextComposerReplyNotEncrypted_Day_2_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:19a212e8ac870059243f03554d2963c11d422902a469b19135f2c1aca804534a -size 63883 +oid sha256:1eb54ffc3ab7ec3689ffabc896cb96e447b02784a68fd8c387ed89c62b07208a +size 64480 diff --git a/screenshots/de/libraries.textcomposer_TextComposerReplyNotEncrypted_Day_3_de.png b/screenshots/de/libraries.textcomposer_TextComposerReplyNotEncrypted_Day_3_de.png index 9fbb838a6d..ee37f89e24 100644 --- a/screenshots/de/libraries.textcomposer_TextComposerReplyNotEncrypted_Day_3_de.png +++ b/screenshots/de/libraries.textcomposer_TextComposerReplyNotEncrypted_Day_3_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:47f9866dc3ab1f26851849529d7e85747ef4006fdaa3ffbd17d90979779394c7 -size 62784 +oid sha256:09aa66b3c268caa5bc6b26192f27000be4a4894b1f54e4e659e2b215ae537a54 +size 63354 diff --git a/screenshots/de/libraries.textcomposer_TextComposerReplyNotEncrypted_Day_4_de.png b/screenshots/de/libraries.textcomposer_TextComposerReplyNotEncrypted_Day_4_de.png index 9d8cdca76d..51f6c059ba 100644 --- a/screenshots/de/libraries.textcomposer_TextComposerReplyNotEncrypted_Day_4_de.png +++ b/screenshots/de/libraries.textcomposer_TextComposerReplyNotEncrypted_Day_4_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:702c235b17b61998c34799b9704f94c2218c95147ce10db1f45caff5c1c928b5 -size 68408 +oid sha256:1c39ce41b357199a9e571f86b45f60f1dd42adcba243ead70b617723b01766f0 +size 69003 diff --git a/screenshots/de/libraries.textcomposer_TextComposerReplyNotEncrypted_Day_5_de.png b/screenshots/de/libraries.textcomposer_TextComposerReplyNotEncrypted_Day_5_de.png index 8c259ef5e2..22eeb8d4b2 100644 --- a/screenshots/de/libraries.textcomposer_TextComposerReplyNotEncrypted_Day_5_de.png +++ b/screenshots/de/libraries.textcomposer_TextComposerReplyNotEncrypted_Day_5_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:9c631ed737e97317e463439518cfe47243adbdafa1e727896d4ac40557687032 -size 91916 +oid sha256:237f46b3a247dfa29c545751d65a6a7317632edecd0daf81619912446b3900b2 +size 92282 diff --git a/screenshots/de/libraries.textcomposer_TextComposerReplyNotEncrypted_Day_6_de.png b/screenshots/de/libraries.textcomposer_TextComposerReplyNotEncrypted_Day_6_de.png index 708e2abbd8..dc35e95678 100644 --- a/screenshots/de/libraries.textcomposer_TextComposerReplyNotEncrypted_Day_6_de.png +++ b/screenshots/de/libraries.textcomposer_TextComposerReplyNotEncrypted_Day_6_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:157e642c761d59485bb55a40d3ffb5bebea9fb240f8b95de82573f75fb885fb8 -size 62283 +oid sha256:1e1d7bb5df8b681b4f68ca7dc8d4405c35f6a36fd40da84dd3f6ead8d601f28e +size 62803 diff --git a/screenshots/de/libraries.textcomposer_TextComposerReplyNotEncrypted_Day_7_de.png b/screenshots/de/libraries.textcomposer_TextComposerReplyNotEncrypted_Day_7_de.png index 12a57d4a12..ea7f60920a 100644 --- a/screenshots/de/libraries.textcomposer_TextComposerReplyNotEncrypted_Day_7_de.png +++ b/screenshots/de/libraries.textcomposer_TextComposerReplyNotEncrypted_Day_7_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:f18c21e5503ca05f05627c33a6d7acbb00bb23588a6a7775579e1e38c93a518a -size 63411 +oid sha256:9e3cfa1d4e2c6f5b9a3eb0a72a65c00b1ed94491b6d10ea589e9706d55d8c2e4 +size 63905 diff --git a/screenshots/de/libraries.textcomposer_TextComposerReplyNotEncrypted_Day_8_de.png b/screenshots/de/libraries.textcomposer_TextComposerReplyNotEncrypted_Day_8_de.png index ab744693e1..642fff5c6e 100644 --- a/screenshots/de/libraries.textcomposer_TextComposerReplyNotEncrypted_Day_8_de.png +++ b/screenshots/de/libraries.textcomposer_TextComposerReplyNotEncrypted_Day_8_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:38477ac2b061f7ef12078ba5be13c4404738811f6747b9c8e809c5d3ef0f0811 -size 71285 +oid sha256:7fdbb5f58bf14189d6d97269b70d31719c119598e9064f897a66b718d3b86a40 +size 71620 diff --git a/screenshots/de/libraries.textcomposer_TextComposerReplyNotEncrypted_Day_9_de.png b/screenshots/de/libraries.textcomposer_TextComposerReplyNotEncrypted_Day_9_de.png index 179abffb2b..c60b586751 100644 --- a/screenshots/de/libraries.textcomposer_TextComposerReplyNotEncrypted_Day_9_de.png +++ b/screenshots/de/libraries.textcomposer_TextComposerReplyNotEncrypted_Day_9_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:01b8d2822cabd678fe4e61e540bbbe2c1e24ef9fc0f3eb553303e9fe223bebd6 -size 61830 +oid sha256:7373c877c6c447cc9f436bd959dfb8e1f71bd61177b6d152353a2f5b43aa2c8e +size 62337 diff --git a/screenshots/de/libraries.textcomposer_TextComposerReply_Day_0_de.png b/screenshots/de/libraries.textcomposer_TextComposerReply_Day_0_de.png index b5fc32cbbb..2d07064de8 100644 --- a/screenshots/de/libraries.textcomposer_TextComposerReply_Day_0_de.png +++ b/screenshots/de/libraries.textcomposer_TextComposerReply_Day_0_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:9e05b1272eb9a15ce8fb9e93d9b999d1aee82d598faf4e60f73d6bbb8897d621 -size 75467 +oid sha256:60c4d9f1473045065241e3b0c09852671de07e1a31cd7eb696e6ac7fdfb09e51 +size 75722 diff --git a/screenshots/de/libraries.textcomposer_TextComposerReply_Day_10_de.png b/screenshots/de/libraries.textcomposer_TextComposerReply_Day_10_de.png index 61beab53f0..7f892e2d62 100644 --- a/screenshots/de/libraries.textcomposer_TextComposerReply_Day_10_de.png +++ b/screenshots/de/libraries.textcomposer_TextComposerReply_Day_10_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:9cc5e0ddd0b6be85ceeab24f427ac2f33bb8634215fdda3fd4b9747787fc9581 -size 59156 +oid sha256:d92f14b72f92753cb46b4ad46d395412a7155c2a9074c57562ab00e6e3c73c03 +size 59288 diff --git a/screenshots/de/libraries.textcomposer_TextComposerReply_Day_11_de.png b/screenshots/de/libraries.textcomposer_TextComposerReply_Day_11_de.png index 08faeee3e5..4bde8bd861 100644 --- a/screenshots/de/libraries.textcomposer_TextComposerReply_Day_11_de.png +++ b/screenshots/de/libraries.textcomposer_TextComposerReply_Day_11_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:e53cb31e8656076e4ac4a0162f15d028f0667e07878b0f79f80aa54dac17c41f -size 73732 +oid sha256:759ec0718213e6b6ee6fa41cbbce455687a353b98a3091cc3726007066cabd0f +size 73946 diff --git a/screenshots/de/libraries.textcomposer_TextComposerReply_Day_1_de.png b/screenshots/de/libraries.textcomposer_TextComposerReply_Day_1_de.png index 4e1db6cea7..ad5146d4cb 100644 --- a/screenshots/de/libraries.textcomposer_TextComposerReply_Day_1_de.png +++ b/screenshots/de/libraries.textcomposer_TextComposerReply_Day_1_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:bd59873415d8fbdc4351a9a2c518d2d85a6f783a9e03c6591c056f49ce7344d5 -size 84937 +oid sha256:ff399c6e701123d42878b6a0ef382691d7087ec5bdafe15b1ec757d702a7ac5d +size 85209 diff --git a/screenshots/de/libraries.textcomposer_TextComposerReply_Day_2_de.png b/screenshots/de/libraries.textcomposer_TextComposerReply_Day_2_de.png index ce09d649c9..60803e9382 100644 --- a/screenshots/de/libraries.textcomposer_TextComposerReply_Day_2_de.png +++ b/screenshots/de/libraries.textcomposer_TextComposerReply_Day_2_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:354eaf220e073aa0c440376717765b7c33f1cf272c9951d2e7128d77acee3477 -size 62257 +oid sha256:9b47d98d581d278f6e7afaccb590056bafc306b6c92b2f05c7c284d132e819e0 +size 62301 diff --git a/screenshots/de/libraries.textcomposer_TextComposerReply_Day_3_de.png b/screenshots/de/libraries.textcomposer_TextComposerReply_Day_3_de.png index 2bfb889089..34851b527b 100644 --- a/screenshots/de/libraries.textcomposer_TextComposerReply_Day_3_de.png +++ b/screenshots/de/libraries.textcomposer_TextComposerReply_Day_3_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:83e30eaedf06a2ac91950e50bf24b829d86303517ede79e0fd2431daf58812f5 -size 61315 +oid sha256:c407a602fc180ff841ae62405140da8978694b1b6f5f46c08a774607fbf3d3db +size 61365 diff --git a/screenshots/de/libraries.textcomposer_TextComposerReply_Day_4_de.png b/screenshots/de/libraries.textcomposer_TextComposerReply_Day_4_de.png index 59186137f6..d79e8b441d 100644 --- a/screenshots/de/libraries.textcomposer_TextComposerReply_Day_4_de.png +++ b/screenshots/de/libraries.textcomposer_TextComposerReply_Day_4_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:c47928a0783b56240d8293370e598544aa47e24a8b5d6d0450eccc5f2c118ef8 -size 68694 +oid sha256:195e435fcaebd76fedb1cf41f03776e1e68eb94f745c26b46d112d2d3fd86701 +size 68837 diff --git a/screenshots/de/libraries.textcomposer_TextComposerReply_Day_5_de.png b/screenshots/de/libraries.textcomposer_TextComposerReply_Day_5_de.png index fe48840600..46158a9f2e 100644 --- a/screenshots/de/libraries.textcomposer_TextComposerReply_Day_5_de.png +++ b/screenshots/de/libraries.textcomposer_TextComposerReply_Day_5_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:1477f45a4080a054bee9d8cf3fa772fcd1edc15683a17793ef93acccd0983fb4 -size 103892 +oid sha256:e4937bac91e2ce148abd5b09699291ca700d976069df2d39e62c86ef5acce36f +size 103915 diff --git a/screenshots/de/libraries.textcomposer_TextComposerReply_Day_6_de.png b/screenshots/de/libraries.textcomposer_TextComposerReply_Day_6_de.png index 037505304f..de116d7eaa 100644 --- a/screenshots/de/libraries.textcomposer_TextComposerReply_Day_6_de.png +++ b/screenshots/de/libraries.textcomposer_TextComposerReply_Day_6_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:25945b2e3e93385a66ec560daa7ab9d059428b2bdb4c5a551ce37c4c0eb3a401 -size 60339 +oid sha256:6256e13d0a7fc9b7416a4c24fd0a6e807cbd26c50e5b3794ddfc88bc3477aa9e +size 60552 diff --git a/screenshots/de/libraries.textcomposer_TextComposerReply_Day_7_de.png b/screenshots/de/libraries.textcomposer_TextComposerReply_Day_7_de.png index 8c6145eb13..05cc000090 100644 --- a/screenshots/de/libraries.textcomposer_TextComposerReply_Day_7_de.png +++ b/screenshots/de/libraries.textcomposer_TextComposerReply_Day_7_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:6fe0d1f3bc7330bfdd845fd585b3a415a740ba9be8d1871bc51da1167c19f5c4 -size 62380 +oid sha256:30eda7acc6b1f2bd984f8502ec88a0c9b8d79823e29b078228268a295efee748 +size 62485 diff --git a/screenshots/de/libraries.textcomposer_TextComposerReply_Day_8_de.png b/screenshots/de/libraries.textcomposer_TextComposerReply_Day_8_de.png index d546de4f62..059aa4abb3 100644 --- a/screenshots/de/libraries.textcomposer_TextComposerReply_Day_8_de.png +++ b/screenshots/de/libraries.textcomposer_TextComposerReply_Day_8_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:99f6671078331ca7c22123a0b54ca658048ee7c2f0286fb9a0f3f71cd9805602 -size 70799 +oid sha256:0a5b0960c05c047ae832a61fca7cf9593cc0ad24decd2eab363e652c1e3d962a +size 70887 diff --git a/screenshots/de/libraries.textcomposer_TextComposerReply_Day_9_de.png b/screenshots/de/libraries.textcomposer_TextComposerReply_Day_9_de.png index 3872d29b72..19ef265ff6 100644 --- a/screenshots/de/libraries.textcomposer_TextComposerReply_Day_9_de.png +++ b/screenshots/de/libraries.textcomposer_TextComposerReply_Day_9_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:892f08ea84d742190935ea492be7c3e724f60e85a712a5bfd4d5cb59b26ca5f8 -size 59851 +oid sha256:eda41a9560b0acdc6fcaace4d1bb274d5a65f1b5c95073ee86d828ad4b1fa33f +size 59925 diff --git a/screenshots/de/libraries.textcomposer_TextComposerSimpleNotEncrypted_Day_0_de.png b/screenshots/de/libraries.textcomposer_TextComposerSimpleNotEncrypted_Day_0_de.png index d5c1c82d92..dad38da8c2 100644 --- a/screenshots/de/libraries.textcomposer_TextComposerSimpleNotEncrypted_Day_0_de.png +++ b/screenshots/de/libraries.textcomposer_TextComposerSimpleNotEncrypted_Day_0_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:9a1476f67c50c2492c58fbbccb06d60f4d4e543b8231b1d8da491fa46fd99678 -size 58086 +oid sha256:53e771de4de90be6356b2a218d58ca658dc2895c32c63eafe8316557f259e8ac +size 58303 diff --git a/screenshots/de/libraries.textcomposer_TextComposerSimple_Day_0_de.png b/screenshots/de/libraries.textcomposer_TextComposerSimple_Day_0_de.png index 332816d156..cb60634ec8 100644 --- a/screenshots/de/libraries.textcomposer_TextComposerSimple_Day_0_de.png +++ b/screenshots/de/libraries.textcomposer_TextComposerSimple_Day_0_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:f93561a2553fe5cd29bf85a79cc14fba6960a4e43d888c86167b573ccfc0f89b -size 46357 +oid sha256:52a0b4d220040f7115109ec3434f4d0067c753608b7cc4736c634752caf1cfe2 +size 46254 diff --git a/screenshots/de/libraries.textcomposer_TextComposerVoiceNotEncrypted_Day_0_de.png b/screenshots/de/libraries.textcomposer_TextComposerVoiceNotEncrypted_Day_0_de.png index d5ae9e7bad..278db7b093 100644 --- a/screenshots/de/libraries.textcomposer_TextComposerVoiceNotEncrypted_Day_0_de.png +++ b/screenshots/de/libraries.textcomposer_TextComposerVoiceNotEncrypted_Day_0_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:93f45ea912642400884e19aaf3cc3d8c7461588309a22396a37fa6fb3945ec2a -size 39434 +oid sha256:83d2db1b20827de777296617927146c7142b21bf8efbfdf4aa40b21979b7aee7 +size 39694 diff --git a/screenshots/de/libraries.troubleshoot.impl.history_PushHistoryView_Day_0_de.png b/screenshots/de/libraries.troubleshoot.impl.history_PushHistoryView_Day_0_de.png index 9abe947d27..cbf965f243 100644 --- a/screenshots/de/libraries.troubleshoot.impl.history_PushHistoryView_Day_0_de.png +++ b/screenshots/de/libraries.troubleshoot.impl.history_PushHistoryView_Day_0_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:ae227ffb1062126d376bd128ce8ad8c5619fbdb95674c1c1e36065ca1dd98a44 -size 13159 +oid sha256:33421dbf0f3d14fee61a8cafc251ab1f84d81efcba9dfaadc07f80bb320aa607 +size 13136 diff --git a/screenshots/de/libraries.troubleshoot.impl.history_PushHistoryView_Day_1_de.png b/screenshots/de/libraries.troubleshoot.impl.history_PushHistoryView_Day_1_de.png index 26ef5f7f82..0296d9668b 100644 --- a/screenshots/de/libraries.troubleshoot.impl.history_PushHistoryView_Day_1_de.png +++ b/screenshots/de/libraries.troubleshoot.impl.history_PushHistoryView_Day_1_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:4be3d70c900c8e425267ab125e2391257468767c7eca5e5d4df9b4815524681a -size 45220 +oid sha256:77b59c5016827c32d9c1e028050bfa662406cfe5df67d039a4b919c6e66a4b62 +size 45170 diff --git a/screenshots/de/libraries.troubleshoot.impl.history_PushHistoryView_Day_2_de.png b/screenshots/de/libraries.troubleshoot.impl.history_PushHistoryView_Day_2_de.png index d784900e3a..5c252f34f6 100644 --- a/screenshots/de/libraries.troubleshoot.impl.history_PushHistoryView_Day_2_de.png +++ b/screenshots/de/libraries.troubleshoot.impl.history_PushHistoryView_Day_2_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:9a14221fec003c89240a14fb580878c8a826ff24deb1156d0342aceda91b78c0 -size 23391 +oid sha256:036931ca88ce36585a3377476821ad5e61221354f16adea22738b2588bdafe88 +size 23452 diff --git a/screenshots/de/libraries.troubleshoot.impl_TroubleshootNotificationsView_Day_0_de.png b/screenshots/de/libraries.troubleshoot.impl_TroubleshootNotificationsView_Day_0_de.png index 7a6150671c..2b3a69e096 100644 --- a/screenshots/de/libraries.troubleshoot.impl_TroubleshootNotificationsView_Day_0_de.png +++ b/screenshots/de/libraries.troubleshoot.impl_TroubleshootNotificationsView_Day_0_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:ca2ff10f7858de609d123f10d8e3b41da6c321c58159c6c20712fc5c27bf1c3b -size 33679 +oid sha256:135a936cb7799292a925ad39bd0efdc7f22f30d582c92f1a7b1156717a999d8b +size 33690 diff --git a/screenshots/de/libraries.troubleshoot.impl_TroubleshootNotificationsView_Day_1_de.png b/screenshots/de/libraries.troubleshoot.impl_TroubleshootNotificationsView_Day_1_de.png index 85376abe25..e1219337db 100644 --- a/screenshots/de/libraries.troubleshoot.impl_TroubleshootNotificationsView_Day_1_de.png +++ b/screenshots/de/libraries.troubleshoot.impl_TroubleshootNotificationsView_Day_1_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:fe33cd547b9b3029f850985edf71a76fb93fb3a47f36778fcfb2948f2c09b6c9 -size 20391 +oid sha256:457f34602d2880887d69837acc8a262d659a77740b8e2af4e23968effa62982b +size 20383 diff --git a/screenshots/de/libraries.troubleshoot.impl_TroubleshootNotificationsView_Day_2_de.png b/screenshots/de/libraries.troubleshoot.impl_TroubleshootNotificationsView_Day_2_de.png index 6fc011f7fd..81582cab35 100644 --- a/screenshots/de/libraries.troubleshoot.impl_TroubleshootNotificationsView_Day_2_de.png +++ b/screenshots/de/libraries.troubleshoot.impl_TroubleshootNotificationsView_Day_2_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:793dbbba2e946f34facc717cf42564efb6115f73b69c18b749e94769beac30dc -size 20805 +oid sha256:c452bf196838f1440c80099046f42854315ecd521adc6ad92eb84db7f7527f0d +size 20848 diff --git a/screenshots/de/libraries.troubleshoot.impl_TroubleshootNotificationsView_Day_3_de.png b/screenshots/de/libraries.troubleshoot.impl_TroubleshootNotificationsView_Day_3_de.png index 5aaef3937f..0eb4797269 100644 --- a/screenshots/de/libraries.troubleshoot.impl_TroubleshootNotificationsView_Day_3_de.png +++ b/screenshots/de/libraries.troubleshoot.impl_TroubleshootNotificationsView_Day_3_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:df0f6ea6c28da2bea1f1f0bf480e58f42c02e2b991c98a4343978417f3f70173 -size 33704 +oid sha256:9d1f0416ac9143034e55d517bfa531c4ac5fdac1683ac8a71f43c9bdc25c75c6 +size 33736 diff --git a/screenshots/de/libraries.troubleshoot.impl_TroubleshootNotificationsView_Day_4_de.png b/screenshots/de/libraries.troubleshoot.impl_TroubleshootNotificationsView_Day_4_de.png index 2f4733470f..fcb07dad50 100644 --- a/screenshots/de/libraries.troubleshoot.impl_TroubleshootNotificationsView_Day_4_de.png +++ b/screenshots/de/libraries.troubleshoot.impl_TroubleshootNotificationsView_Day_4_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:f55a2d44c18f67b1330a18c7ec8e6049d2be810a2a5d2840137555455fcb02ee -size 25554 +oid sha256:f35fafea2db7e6e158decbd84d17c2ac84ff69afc81aad2c63683206e07781ac +size 25633 diff --git a/screenshots/de/libraries.troubleshoot.impl_TroubleshootNotificationsView_Day_5_de.png b/screenshots/de/libraries.troubleshoot.impl_TroubleshootNotificationsView_Day_5_de.png index d88792d37c..f0fd4779ed 100644 --- a/screenshots/de/libraries.troubleshoot.impl_TroubleshootNotificationsView_Day_5_de.png +++ b/screenshots/de/libraries.troubleshoot.impl_TroubleshootNotificationsView_Day_5_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:3107a37af464ba5cda1c622a456365b199a33edaad1abd83a199d44aa4b34b0e -size 41654 +oid sha256:4d4af88d45b2f58a0118c1b588a1d056849e90c9fd8a1d2202047168434527d7 +size 41746 diff --git a/screenshots/de/libraries.troubleshoot.impl_TroubleshootNotificationsView_Day_6_de.png b/screenshots/de/libraries.troubleshoot.impl_TroubleshootNotificationsView_Day_6_de.png index 806fa70467..81a994c223 100644 --- a/screenshots/de/libraries.troubleshoot.impl_TroubleshootNotificationsView_Day_6_de.png +++ b/screenshots/de/libraries.troubleshoot.impl_TroubleshootNotificationsView_Day_6_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:565ecdd6b591e0112e0141f737908398f155ba3a4831c9ccdb5a2d4e58bbdb26 -size 27448 +oid sha256:8934bc59ff99f34f7cadfa830350bbb9dc8327093ae4b52a022a3c03a8ede3af +size 27466 diff --git a/screenshots/de/libraries.troubleshoot.impl_TroubleshootNotificationsView_Day_7_de.png b/screenshots/de/libraries.troubleshoot.impl_TroubleshootNotificationsView_Day_7_de.png index 5eac10d4ba..4113b0c70c 100644 --- a/screenshots/de/libraries.troubleshoot.impl_TroubleshootNotificationsView_Day_7_de.png +++ b/screenshots/de/libraries.troubleshoot.impl_TroubleshootNotificationsView_Day_7_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:e9f4eb92ea02e5f3f14c1b7f7ddaaea46f4b739735a290ff7ef812590d20f52b -size 27191 +oid sha256:83d4e3a056cf69e140a39e0cf7f6cfe1c058358f6eb44e40197d9a1c0f5779ab +size 27236 diff --git a/screenshots/de/services.apperror.impl_AppErrorView_Day_0_de.png b/screenshots/de/services.apperror.impl_AppErrorView_Day_0_de.png index 7278ccddc8..9116a57f72 100644 --- a/screenshots/de/services.apperror.impl_AppErrorView_Day_0_de.png +++ b/screenshots/de/services.apperror.impl_AppErrorView_Day_0_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:48a41b856627f077beefbd4f04c1fa7b6631dec40215bd1bded0ad15a4a3b1eb -size 20115 +oid sha256:26388ccf8c8d78a991bd46f39983536be27a1093d354436cfd3df466a414496b +size 19558 diff --git a/screenshots/html/data.js b/screenshots/html/data.js index 0813643028..c3d469507c 100644 --- a/screenshots/html/data.js +++ b/screenshots/html/data.js @@ -1,75 +1,76 @@ // Generated file, do not edit export const screenshots = [ ["en","en-dark","de",], -["features.preferences.impl.about_AboutView_Day_0_en","features.preferences.impl.about_AboutView_Night_0_en",20308,], +["features.preferences.impl.about_AboutView_Day_0_en","features.preferences.impl.about_AboutView_Night_0_en",20323,], ["features.invite.impl.acceptdecline_AcceptDeclineInviteView_Day_0_en","features.invite.impl.acceptdecline_AcceptDeclineInviteView_Night_0_en",0,], -["features.invite.impl.acceptdecline_AcceptDeclineInviteView_Day_1_en","features.invite.impl.acceptdecline_AcceptDeclineInviteView_Night_1_en",20308,], -["features.invite.impl.acceptdecline_AcceptDeclineInviteView_Day_2_en","features.invite.impl.acceptdecline_AcceptDeclineInviteView_Night_2_en",20308,], -["features.invite.impl.acceptdecline_AcceptDeclineInviteView_Day_3_en","features.invite.impl.acceptdecline_AcceptDeclineInviteView_Night_3_en",20308,], -["features.invite.impl.acceptdecline_AcceptDeclineInviteView_Day_4_en","features.invite.impl.acceptdecline_AcceptDeclineInviteView_Night_4_en",20308,], -["features.invite.impl.acceptdecline_AcceptDeclineInviteView_Day_5_en","features.invite.impl.acceptdecline_AcceptDeclineInviteView_Night_5_en",20308,], -["features.logout.impl_AccountDeactivationView_Day_0_en","features.logout.impl_AccountDeactivationView_Night_0_en",20308,], -["features.logout.impl_AccountDeactivationView_Day_1_en","features.logout.impl_AccountDeactivationView_Night_1_en",20308,], -["features.logout.impl_AccountDeactivationView_Day_2_en","features.logout.impl_AccountDeactivationView_Night_2_en",20308,], -["features.logout.impl_AccountDeactivationView_Day_3_en","features.logout.impl_AccountDeactivationView_Night_3_en",20308,], -["features.logout.impl_AccountDeactivationView_Day_4_en","features.logout.impl_AccountDeactivationView_Night_4_en",20308,], -["features.login.impl.accountprovider_AccountProviderOtherView_Day_0_en","features.login.impl.accountprovider_AccountProviderOtherView_Night_0_en",20308,], +["features.invite.impl.acceptdecline_AcceptDeclineInviteView_Day_1_en","features.invite.impl.acceptdecline_AcceptDeclineInviteView_Night_1_en",20323,], +["features.invite.impl.acceptdecline_AcceptDeclineInviteView_Day_2_en","features.invite.impl.acceptdecline_AcceptDeclineInviteView_Night_2_en",20323,], +["features.invite.impl.acceptdecline_AcceptDeclineInviteView_Day_3_en","features.invite.impl.acceptdecline_AcceptDeclineInviteView_Night_3_en",20323,], +["features.invite.impl.acceptdecline_AcceptDeclineInviteView_Day_4_en","features.invite.impl.acceptdecline_AcceptDeclineInviteView_Night_4_en",20323,], +["features.invite.impl.acceptdecline_AcceptDeclineInviteView_Day_5_en","features.invite.impl.acceptdecline_AcceptDeclineInviteView_Night_5_en",20323,], +["features.logout.impl_AccountDeactivationView_Day_0_en","features.logout.impl_AccountDeactivationView_Night_0_en",20323,], +["features.logout.impl_AccountDeactivationView_Day_1_en","features.logout.impl_AccountDeactivationView_Night_1_en",20323,], +["features.logout.impl_AccountDeactivationView_Day_2_en","features.logout.impl_AccountDeactivationView_Night_2_en",20323,], +["features.logout.impl_AccountDeactivationView_Day_3_en","features.logout.impl_AccountDeactivationView_Night_3_en",20323,], +["features.logout.impl_AccountDeactivationView_Day_4_en","features.logout.impl_AccountDeactivationView_Night_4_en",20323,], +["features.login.impl.accountprovider_AccountProviderOtherView_Day_0_en","features.login.impl.accountprovider_AccountProviderOtherView_Night_0_en",20323,], ["features.login.impl.accountprovider_AccountProviderView_Day_0_en","features.login.impl.accountprovider_AccountProviderView_Night_0_en",0,], ["features.login.impl.accountprovider_AccountProviderView_Day_1_en","features.login.impl.accountprovider_AccountProviderView_Night_1_en",0,], ["features.login.impl.accountprovider_AccountProviderView_Day_2_en","features.login.impl.accountprovider_AccountProviderView_Night_2_en",0,], ["features.login.impl.accountprovider_AccountProviderView_Day_3_en","features.login.impl.accountprovider_AccountProviderView_Night_3_en",0,], ["features.messages.impl.actionlist_ActionListViewContent_Day_0_en","features.messages.impl.actionlist_ActionListViewContent_Night_0_en",0,], -["features.messages.impl.actionlist_ActionListViewContent_Day_10_en","features.messages.impl.actionlist_ActionListViewContent_Night_10_en",20308,], -["features.messages.impl.actionlist_ActionListViewContent_Day_11_en","features.messages.impl.actionlist_ActionListViewContent_Night_11_en",20308,], -["features.messages.impl.actionlist_ActionListViewContent_Day_12_en","features.messages.impl.actionlist_ActionListViewContent_Night_12_en",20308,], +["features.messages.impl.actionlist_ActionListViewContent_Day_10_en","features.messages.impl.actionlist_ActionListViewContent_Night_10_en",20323,], +["features.messages.impl.actionlist_ActionListViewContent_Day_11_en","features.messages.impl.actionlist_ActionListViewContent_Night_11_en",20323,], +["features.messages.impl.actionlist_ActionListViewContent_Day_12_en","features.messages.impl.actionlist_ActionListViewContent_Night_12_en",20323,], ["features.messages.impl.actionlist_ActionListViewContent_Day_1_en","features.messages.impl.actionlist_ActionListViewContent_Night_1_en",0,], -["features.messages.impl.actionlist_ActionListViewContent_Day_2_en","features.messages.impl.actionlist_ActionListViewContent_Night_2_en",20308,], -["features.messages.impl.actionlist_ActionListViewContent_Day_3_en","features.messages.impl.actionlist_ActionListViewContent_Night_3_en",20308,], -["features.messages.impl.actionlist_ActionListViewContent_Day_4_en","features.messages.impl.actionlist_ActionListViewContent_Night_4_en",20308,], -["features.messages.impl.actionlist_ActionListViewContent_Day_5_en","features.messages.impl.actionlist_ActionListViewContent_Night_5_en",20308,], -["features.messages.impl.actionlist_ActionListViewContent_Day_6_en","features.messages.impl.actionlist_ActionListViewContent_Night_6_en",20308,], -["features.messages.impl.actionlist_ActionListViewContent_Day_7_en","features.messages.impl.actionlist_ActionListViewContent_Night_7_en",20308,], -["features.messages.impl.actionlist_ActionListViewContent_Day_8_en","features.messages.impl.actionlist_ActionListViewContent_Night_8_en",20308,], -["features.messages.impl.actionlist_ActionListViewContent_Day_9_en","features.messages.impl.actionlist_ActionListViewContent_Night_9_en",20308,], -["features.createroom.impl.addpeople_AddPeopleView_Day_0_en","features.createroom.impl.addpeople_AddPeopleView_Night_0_en",20308,], -["features.createroom.impl.addpeople_AddPeopleView_Day_1_en","features.createroom.impl.addpeople_AddPeopleView_Night_1_en",20308,], -["features.createroom.impl.addpeople_AddPeopleView_Day_2_en","features.createroom.impl.addpeople_AddPeopleView_Night_2_en",20308,], -["features.createroom.impl.addpeople_AddPeopleView_Day_3_en","features.createroom.impl.addpeople_AddPeopleView_Night_3_en",20308,], -["features.preferences.impl.advanced_AdvancedSettingsViewDark_0_en","",20308,], -["features.preferences.impl.advanced_AdvancedSettingsViewDark_1_en","",20308,], -["features.preferences.impl.advanced_AdvancedSettingsViewDark_2_en","",20308,], -["features.preferences.impl.advanced_AdvancedSettingsViewDark_3_en","",20308,], -["features.preferences.impl.advanced_AdvancedSettingsViewDark_4_en","",20308,], -["features.preferences.impl.advanced_AdvancedSettingsViewDark_5_en","",20308,], -["features.preferences.impl.advanced_AdvancedSettingsViewDark_6_en","",20308,], -["features.preferences.impl.advanced_AdvancedSettingsViewDark_7_en","",20308,], -["features.preferences.impl.advanced_AdvancedSettingsViewLight_0_en","",20308,], -["features.preferences.impl.advanced_AdvancedSettingsViewLight_1_en","",20308,], -["features.preferences.impl.advanced_AdvancedSettingsViewLight_2_en","",20308,], -["features.preferences.impl.advanced_AdvancedSettingsViewLight_3_en","",20308,], -["features.preferences.impl.advanced_AdvancedSettingsViewLight_4_en","",20308,], -["features.preferences.impl.advanced_AdvancedSettingsViewLight_5_en","",20308,], -["features.preferences.impl.advanced_AdvancedSettingsViewLight_6_en","",20308,], -["features.preferences.impl.advanced_AdvancedSettingsViewLight_7_en","",20308,], -["libraries.designsystem.components.dialogs_AlertDialogContent_Dialogs_en","",20308,], -["libraries.designsystem.components.dialogs_AlertDialog_Day_0_en","libraries.designsystem.components.dialogs_AlertDialog_Night_0_en",20308,], -["features.analytics.impl_AnalyticsOptInView_Day_0_en","features.analytics.impl_AnalyticsOptInView_Night_0_en",20308,], -["features.analytics.impl_AnalyticsOptInView_Day_1_en","features.analytics.impl_AnalyticsOptInView_Night_1_en",20308,], -["features.analytics.api.preferences_AnalyticsPreferencesView_Day_0_en","features.analytics.api.preferences_AnalyticsPreferencesView_Night_0_en",20308,], -["features.analytics.api.preferences_AnalyticsPreferencesView_Day_1_en","features.analytics.api.preferences_AnalyticsPreferencesView_Night_1_en",20308,], -["features.preferences.impl.analytics_AnalyticsSettingsView_Day_0_en","features.preferences.impl.analytics_AnalyticsSettingsView_Night_0_en",20308,], +["features.messages.impl.actionlist_ActionListViewContent_Day_2_en","features.messages.impl.actionlist_ActionListViewContent_Night_2_en",20323,], +["features.messages.impl.actionlist_ActionListViewContent_Day_3_en","features.messages.impl.actionlist_ActionListViewContent_Night_3_en",20323,], +["features.messages.impl.actionlist_ActionListViewContent_Day_4_en","features.messages.impl.actionlist_ActionListViewContent_Night_4_en",20323,], +["features.messages.impl.actionlist_ActionListViewContent_Day_5_en","features.messages.impl.actionlist_ActionListViewContent_Night_5_en",20323,], +["features.messages.impl.actionlist_ActionListViewContent_Day_6_en","features.messages.impl.actionlist_ActionListViewContent_Night_6_en",20323,], +["features.messages.impl.actionlist_ActionListViewContent_Day_7_en","features.messages.impl.actionlist_ActionListViewContent_Night_7_en",20323,], +["features.messages.impl.actionlist_ActionListViewContent_Day_8_en","features.messages.impl.actionlist_ActionListViewContent_Night_8_en",20323,], +["features.messages.impl.actionlist_ActionListViewContent_Day_9_en","features.messages.impl.actionlist_ActionListViewContent_Night_9_en",20323,], +["features.createroom.impl.addpeople_AddPeopleView_Day_0_en","features.createroom.impl.addpeople_AddPeopleView_Night_0_en",20323,], +["features.createroom.impl.addpeople_AddPeopleView_Day_1_en","features.createroom.impl.addpeople_AddPeopleView_Night_1_en",20323,], +["features.createroom.impl.addpeople_AddPeopleView_Day_2_en","features.createroom.impl.addpeople_AddPeopleView_Night_2_en",20323,], +["features.preferences.impl.advanced_AdvancedSettingsViewDark_0_en","",20323,], +["features.preferences.impl.advanced_AdvancedSettingsViewDark_1_en","",20323,], +["features.preferences.impl.advanced_AdvancedSettingsViewDark_2_en","",20323,], +["features.preferences.impl.advanced_AdvancedSettingsViewDark_3_en","",20323,], +["features.preferences.impl.advanced_AdvancedSettingsViewDark_4_en","",20323,], +["features.preferences.impl.advanced_AdvancedSettingsViewDark_5_en","",20323,], +["features.preferences.impl.advanced_AdvancedSettingsViewDark_6_en","",20323,], +["features.preferences.impl.advanced_AdvancedSettingsViewDark_7_en","",20323,], +["features.preferences.impl.advanced_AdvancedSettingsViewDark_8_en","",20323,], +["features.preferences.impl.advanced_AdvancedSettingsViewLight_0_en","",20323,], +["features.preferences.impl.advanced_AdvancedSettingsViewLight_1_en","",20323,], +["features.preferences.impl.advanced_AdvancedSettingsViewLight_2_en","",20323,], +["features.preferences.impl.advanced_AdvancedSettingsViewLight_3_en","",20323,], +["features.preferences.impl.advanced_AdvancedSettingsViewLight_4_en","",20323,], +["features.preferences.impl.advanced_AdvancedSettingsViewLight_5_en","",20323,], +["features.preferences.impl.advanced_AdvancedSettingsViewLight_6_en","",20323,], +["features.preferences.impl.advanced_AdvancedSettingsViewLight_7_en","",20323,], +["features.preferences.impl.advanced_AdvancedSettingsViewLight_8_en","",20323,], +["libraries.designsystem.components.dialogs_AlertDialogContent_Dialogs_en","",20323,], +["libraries.designsystem.components.dialogs_AlertDialog_Day_0_en","libraries.designsystem.components.dialogs_AlertDialog_Night_0_en",20323,], +["features.analytics.impl_AnalyticsOptInView_Day_0_en","features.analytics.impl_AnalyticsOptInView_Night_0_en",20323,], +["features.analytics.impl_AnalyticsOptInView_Day_1_en","features.analytics.impl_AnalyticsOptInView_Night_1_en",20323,], +["features.analytics.api.preferences_AnalyticsPreferencesView_Day_0_en","features.analytics.api.preferences_AnalyticsPreferencesView_Night_0_en",20323,], +["features.analytics.api.preferences_AnalyticsPreferencesView_Day_1_en","features.analytics.api.preferences_AnalyticsPreferencesView_Night_1_en",20323,], +["features.preferences.impl.analytics_AnalyticsSettingsView_Day_0_en","features.preferences.impl.analytics_AnalyticsSettingsView_Night_0_en",20323,], ["libraries.designsystem.components_Announcement_Day_0_en","libraries.designsystem.components_Announcement_Night_0_en",0,], -["services.apperror.impl_AppErrorView_Day_0_en","services.apperror.impl_AppErrorView_Night_0_en",20308,], +["services.apperror.impl_AppErrorView_Day_0_en","services.apperror.impl_AppErrorView_Night_0_en",20323,], ["libraries.designsystem.components.async_AsyncActionView_Day_0_en","libraries.designsystem.components.async_AsyncActionView_Night_0_en",0,], -["libraries.designsystem.components.async_AsyncActionView_Day_1_en","libraries.designsystem.components.async_AsyncActionView_Night_1_en",20308,], +["libraries.designsystem.components.async_AsyncActionView_Day_1_en","libraries.designsystem.components.async_AsyncActionView_Night_1_en",20323,], ["libraries.designsystem.components.async_AsyncActionView_Day_2_en","libraries.designsystem.components.async_AsyncActionView_Night_2_en",0,], -["libraries.designsystem.components.async_AsyncActionView_Day_3_en","libraries.designsystem.components.async_AsyncActionView_Night_3_en",20308,], +["libraries.designsystem.components.async_AsyncActionView_Day_3_en","libraries.designsystem.components.async_AsyncActionView_Night_3_en",20323,], ["libraries.designsystem.components.async_AsyncActionView_Day_4_en","libraries.designsystem.components.async_AsyncActionView_Night_4_en",0,], -["libraries.designsystem.components.async_AsyncFailure_Day_0_en","libraries.designsystem.components.async_AsyncFailure_Night_0_en",20308,], +["libraries.designsystem.components.async_AsyncFailure_Day_0_en","libraries.designsystem.components.async_AsyncFailure_Night_0_en",20323,], ["libraries.designsystem.components.async_AsyncIndicatorFailure_Day_0_en","libraries.designsystem.components.async_AsyncIndicatorFailure_Night_0_en",0,], ["libraries.designsystem.components.async_AsyncIndicatorLoading_Day_0_en","libraries.designsystem.components.async_AsyncIndicatorLoading_Night_0_en",0,], ["libraries.designsystem.components.async_AsyncLoading_Day_0_en","libraries.designsystem.components.async_AsyncLoading_Night_0_en",0,], -["features.messages.impl.messagecomposer_AttachmentSourcePickerMenu_Day_0_en","features.messages.impl.messagecomposer_AttachmentSourcePickerMenu_Night_0_en",20308,], +["features.messages.impl.messagecomposer_AttachmentSourcePickerMenu_Day_0_en","features.messages.impl.messagecomposer_AttachmentSourcePickerMenu_Night_0_en",20323,], ["libraries.matrix.ui.components_AttachmentThumbnail_Day_0_en","libraries.matrix.ui.components_AttachmentThumbnail_Night_0_en",0,], ["libraries.matrix.ui.components_AttachmentThumbnail_Day_1_en","libraries.matrix.ui.components_AttachmentThumbnail_Night_1_en",0,], ["libraries.matrix.ui.components_AttachmentThumbnail_Day_2_en","libraries.matrix.ui.components_AttachmentThumbnail_Night_2_en",0,], @@ -79,30 +80,43 @@ export const screenshots = [ ["libraries.matrix.ui.components_AttachmentThumbnail_Day_6_en","libraries.matrix.ui.components_AttachmentThumbnail_Night_6_en",0,], ["libraries.matrix.ui.components_AttachmentThumbnail_Day_7_en","libraries.matrix.ui.components_AttachmentThumbnail_Night_7_en",0,], ["libraries.matrix.ui.components_AttachmentThumbnail_Day_8_en","libraries.matrix.ui.components_AttachmentThumbnail_Night_8_en",0,], -["features.messages.impl.attachments.preview_AttachmentsView_0_en","",20308,], -["features.messages.impl.attachments.preview_AttachmentsView_1_en","",0,], -["features.messages.impl.attachments.preview_AttachmentsView_2_en","",20308,], -["features.messages.impl.attachments.preview_AttachmentsView_3_en","",20308,], -["features.messages.impl.attachments.preview_AttachmentsView_4_en","",20308,], -["features.messages.impl.attachments.preview_AttachmentsView_5_en","",20308,], -["features.messages.impl.attachments.preview_AttachmentsView_6_en","",0,], -["features.messages.impl.attachments.preview_AttachmentsView_7_en","",20308,], +["features.messages.impl.attachments.preview_AttachmentsView_0_en","",20323,], +["features.messages.impl.attachments.preview_AttachmentsView_1_en","",20323,], +["features.messages.impl.attachments.preview_AttachmentsView_2_en","",20323,], +["features.messages.impl.attachments.preview_AttachmentsView_3_en","",20323,], +["features.messages.impl.attachments.preview_AttachmentsView_4_en","",20323,], +["features.messages.impl.attachments.preview_AttachmentsView_5_en","",20323,], +["features.messages.impl.attachments.preview_AttachmentsView_6_en","",20323,], +["features.messages.impl.attachments.preview_AttachmentsView_7_en","",20323,], +["features.messages.impl.attachments.preview_AttachmentsView_8_en","",20323,], ["libraries.mediaviewer.impl.gallery.ui_AudioItemView_Day_0_en","libraries.mediaviewer.impl.gallery.ui_AudioItemView_Night_0_en",0,], ["libraries.mediaviewer.impl.gallery.ui_AudioItemView_Day_1_en","libraries.mediaviewer.impl.gallery.ui_AudioItemView_Night_1_en",0,], ["libraries.mediaviewer.impl.gallery.ui_AudioItemView_Day_2_en","libraries.mediaviewer.impl.gallery.ui_AudioItemView_Night_2_en",0,], -["libraries.matrix.ui.components_AvatarActionBottomSheet_Day_0_en","libraries.matrix.ui.components_AvatarActionBottomSheet_Night_0_en",20308,], +["libraries.matrix.ui.components_AvatarActionBottomSheet_Day_0_en","libraries.matrix.ui.components_AvatarActionBottomSheet_Night_0_en",20323,], ["libraries.designsystem.components.avatar.internal_AvatarCluster_Avatars_en","",0,], -["features.knockrequests.impl.banner_AvatarRowRtl_Day_0_en","features.knockrequests.impl.banner_AvatarRowRtl_Night_0_en",0,], -["features.knockrequests.impl.banner_AvatarRowRtl_Day_1_en","features.knockrequests.impl.banner_AvatarRowRtl_Night_1_en",0,], -["features.knockrequests.impl.banner_AvatarRowRtl_Day_2_en","features.knockrequests.impl.banner_AvatarRowRtl_Night_2_en",0,], -["features.knockrequests.impl.banner_AvatarRowRtl_Day_3_en","features.knockrequests.impl.banner_AvatarRowRtl_Night_3_en",0,], -["features.knockrequests.impl.banner_AvatarRowRtl_Day_4_en","features.knockrequests.impl.banner_AvatarRowRtl_Night_4_en",0,], -["features.knockrequests.impl.banner_AvatarRow_Day_0_en","features.knockrequests.impl.banner_AvatarRow_Night_0_en",0,], -["features.knockrequests.impl.banner_AvatarRow_Day_1_en","features.knockrequests.impl.banner_AvatarRow_Night_1_en",0,], -["features.knockrequests.impl.banner_AvatarRow_Day_2_en","features.knockrequests.impl.banner_AvatarRow_Night_2_en",0,], -["features.knockrequests.impl.banner_AvatarRow_Day_3_en","features.knockrequests.impl.banner_AvatarRow_Night_3_en",0,], -["features.knockrequests.impl.banner_AvatarRow_Day_4_en","features.knockrequests.impl.banner_AvatarRow_Night_4_en",0,], +["libraries.designsystem.components.avatar_AvatarRowLastOnTopRtl_Day_0_en","libraries.designsystem.components.avatar_AvatarRowLastOnTopRtl_Night_0_en",0,], +["libraries.designsystem.components.avatar_AvatarRowLastOnTopRtl_Day_1_en","libraries.designsystem.components.avatar_AvatarRowLastOnTopRtl_Night_1_en",0,], +["libraries.designsystem.components.avatar_AvatarRowLastOnTopRtl_Day_2_en","libraries.designsystem.components.avatar_AvatarRowLastOnTopRtl_Night_2_en",0,], +["libraries.designsystem.components.avatar_AvatarRowLastOnTopRtl_Day_3_en","libraries.designsystem.components.avatar_AvatarRowLastOnTopRtl_Night_3_en",0,], +["libraries.designsystem.components.avatar_AvatarRowLastOnTopRtl_Day_4_en","libraries.designsystem.components.avatar_AvatarRowLastOnTopRtl_Night_4_en",0,], +["libraries.designsystem.components.avatar_AvatarRowLastOnTop_Day_0_en","libraries.designsystem.components.avatar_AvatarRowLastOnTop_Night_0_en",0,], +["libraries.designsystem.components.avatar_AvatarRowLastOnTop_Day_1_en","libraries.designsystem.components.avatar_AvatarRowLastOnTop_Night_1_en",0,], +["libraries.designsystem.components.avatar_AvatarRowLastOnTop_Day_2_en","libraries.designsystem.components.avatar_AvatarRowLastOnTop_Night_2_en",0,], +["libraries.designsystem.components.avatar_AvatarRowLastOnTop_Day_3_en","libraries.designsystem.components.avatar_AvatarRowLastOnTop_Night_3_en",0,], +["libraries.designsystem.components.avatar_AvatarRowLastOnTop_Day_4_en","libraries.designsystem.components.avatar_AvatarRowLastOnTop_Night_4_en",0,], +["libraries.designsystem.components.avatar_AvatarRowRtl_Day_0_en","libraries.designsystem.components.avatar_AvatarRowRtl_Night_0_en",0,], +["libraries.designsystem.components.avatar_AvatarRowRtl_Day_1_en","libraries.designsystem.components.avatar_AvatarRowRtl_Night_1_en",0,], +["libraries.designsystem.components.avatar_AvatarRowRtl_Day_2_en","libraries.designsystem.components.avatar_AvatarRowRtl_Night_2_en",0,], +["libraries.designsystem.components.avatar_AvatarRowRtl_Day_3_en","libraries.designsystem.components.avatar_AvatarRowRtl_Night_3_en",0,], +["libraries.designsystem.components.avatar_AvatarRowRtl_Day_4_en","libraries.designsystem.components.avatar_AvatarRowRtl_Night_4_en",0,], +["libraries.designsystem.components.avatar_AvatarRow_Day_0_en","libraries.designsystem.components.avatar_AvatarRow_Night_0_en",0,], +["libraries.designsystem.components.avatar_AvatarRow_Day_1_en","libraries.designsystem.components.avatar_AvatarRow_Night_1_en",0,], +["libraries.designsystem.components.avatar_AvatarRow_Day_2_en","libraries.designsystem.components.avatar_AvatarRow_Night_2_en",0,], +["libraries.designsystem.components.avatar_AvatarRow_Day_3_en","libraries.designsystem.components.avatar_AvatarRow_Night_3_en",0,], +["libraries.designsystem.components.avatar_AvatarRow_Day_4_en","libraries.designsystem.components.avatar_AvatarRow_Night_4_en",0,], ["libraries.designsystem.components.avatar_Avatar_Avatars_0_en","",0,], +["libraries.designsystem.components.avatar_Avatar_Avatars_100_en","",0,], +["libraries.designsystem.components.avatar_Avatar_Avatars_101_en","",0,], ["libraries.designsystem.components.avatar_Avatar_Avatars_10_en","",0,], ["libraries.designsystem.components.avatar_Avatar_Avatars_11_en","",0,], ["libraries.designsystem.components.avatar_Avatar_Avatars_12_en","",0,], @@ -194,157 +208,158 @@ export const screenshots = [ ["libraries.designsystem.components.avatar_Avatar_Avatars_90_en","",0,], ["libraries.designsystem.components.avatar_Avatar_Avatars_91_en","",0,], ["libraries.designsystem.components.avatar_Avatar_Avatars_92_en","",0,], +["libraries.designsystem.components.avatar_Avatar_Avatars_93_en","",0,], +["libraries.designsystem.components.avatar_Avatar_Avatars_94_en","",0,], +["libraries.designsystem.components.avatar_Avatar_Avatars_95_en","",0,], +["libraries.designsystem.components.avatar_Avatar_Avatars_96_en","",0,], +["libraries.designsystem.components.avatar_Avatar_Avatars_97_en","",0,], +["libraries.designsystem.components.avatar_Avatar_Avatars_98_en","",0,], +["libraries.designsystem.components.avatar_Avatar_Avatars_99_en","",0,], ["libraries.designsystem.components.avatar_Avatar_Avatars_9_en","",0,], ["libraries.designsystem.components.button_BackButton_Buttons_en","",0,], ["libraries.designsystem.modifiers_BackgroundVerticalGradientDisabled_Day_0_en","libraries.designsystem.modifiers_BackgroundVerticalGradientDisabled_Night_0_en",0,], ["libraries.designsystem.modifiers_BackgroundVerticalGradientEnterprise_Day_0_en","libraries.designsystem.modifiers_BackgroundVerticalGradientEnterprise_Night_0_en",0,], ["libraries.designsystem.modifiers_BackgroundVerticalGradient_Day_0_en","libraries.designsystem.modifiers_BackgroundVerticalGradient_Night_0_en",0,], ["libraries.designsystem.components_Badge_Day_0_en","libraries.designsystem.components_Badge_Night_0_en",0,], -["features.home.impl.components_BatteryOptimizationBanner_Day_0_en","features.home.impl.components_BatteryOptimizationBanner_Night_0_en",20308,], +["features.home.impl.components_BatteryOptimizationBanner_Day_0_en","features.home.impl.components_BatteryOptimizationBanner_Night_0_en",20323,], ["libraries.designsystem.components_BigIcon_Day_0_en","libraries.designsystem.components_BigIcon_Night_0_en",0,], -["features.preferences.impl.blockedusers_BlockedUsersView_Day_0_en","features.preferences.impl.blockedusers_BlockedUsersView_Night_0_en",20308,], -["features.preferences.impl.blockedusers_BlockedUsersView_Day_1_en","features.preferences.impl.blockedusers_BlockedUsersView_Night_1_en",20308,], -["features.preferences.impl.blockedusers_BlockedUsersView_Day_2_en","features.preferences.impl.blockedusers_BlockedUsersView_Night_2_en",20308,], -["features.preferences.impl.blockedusers_BlockedUsersView_Day_3_en","features.preferences.impl.blockedusers_BlockedUsersView_Night_3_en",20308,], -["features.preferences.impl.blockedusers_BlockedUsersView_Day_4_en","features.preferences.impl.blockedusers_BlockedUsersView_Night_4_en",20308,], -["features.preferences.impl.blockedusers_BlockedUsersView_Day_5_en","features.preferences.impl.blockedusers_BlockedUsersView_Night_5_en",20308,], -["features.preferences.impl.blockedusers_BlockedUsersView_Day_6_en","features.preferences.impl.blockedusers_BlockedUsersView_Night_6_en",20308,], +["features.preferences.impl.blockedusers_BlockedUsersView_Day_0_en","features.preferences.impl.blockedusers_BlockedUsersView_Night_0_en",20323,], +["features.preferences.impl.blockedusers_BlockedUsersView_Day_1_en","features.preferences.impl.blockedusers_BlockedUsersView_Night_1_en",20323,], +["features.preferences.impl.blockedusers_BlockedUsersView_Day_2_en","features.preferences.impl.blockedusers_BlockedUsersView_Night_2_en",20323,], +["features.preferences.impl.blockedusers_BlockedUsersView_Day_3_en","features.preferences.impl.blockedusers_BlockedUsersView_Night_3_en",20323,], +["features.preferences.impl.blockedusers_BlockedUsersView_Day_4_en","features.preferences.impl.blockedusers_BlockedUsersView_Night_4_en",20323,], +["features.preferences.impl.blockedusers_BlockedUsersView_Day_5_en","features.preferences.impl.blockedusers_BlockedUsersView_Night_5_en",20323,], +["features.preferences.impl.blockedusers_BlockedUsersView_Day_6_en","features.preferences.impl.blockedusers_BlockedUsersView_Night_6_en",20323,], ["libraries.designsystem.theme.components_BottomSheetDragHandle_Day_0_en","libraries.designsystem.theme.components_BottomSheetDragHandle_Night_0_en",0,], -["features.rageshake.impl.bugreport_BugReportView_Day_0_en","features.rageshake.impl.bugreport_BugReportView_Night_0_en",20308,], -["features.rageshake.impl.bugreport_BugReportView_Day_1_en","features.rageshake.impl.bugreport_BugReportView_Night_1_en",20308,], -["features.rageshake.impl.bugreport_BugReportView_Day_2_en","features.rageshake.impl.bugreport_BugReportView_Night_2_en",20308,], -["features.rageshake.impl.bugreport_BugReportView_Day_3_en","features.rageshake.impl.bugreport_BugReportView_Night_3_en",20308,], -["features.rageshake.impl.bugreport_BugReportView_Day_4_en","features.rageshake.impl.bugreport_BugReportView_Night_4_en",20308,], +["features.rageshake.impl.bugreport_BugReportView_Day_0_en","features.rageshake.impl.bugreport_BugReportView_Night_0_en",20323,], +["features.rageshake.impl.bugreport_BugReportView_Day_1_en","features.rageshake.impl.bugreport_BugReportView_Night_1_en",20323,], +["features.rageshake.impl.bugreport_BugReportView_Day_2_en","features.rageshake.impl.bugreport_BugReportView_Night_2_en",20323,], +["features.rageshake.impl.bugreport_BugReportView_Day_3_en","features.rageshake.impl.bugreport_BugReportView_Night_3_en",20323,], +["features.rageshake.impl.bugreport_BugReportView_Day_4_en","features.rageshake.impl.bugreport_BugReportView_Night_4_en",20323,], ["libraries.designsystem.atomic.molecules_ButtonColumnMolecule_Day_0_en","libraries.designsystem.atomic.molecules_ButtonColumnMolecule_Night_0_en",0,], ["libraries.designsystem.atomic.molecules_ButtonRowMolecule_Day_0_en","libraries.designsystem.atomic.molecules_ButtonRowMolecule_Night_0_en",0,], ["features.messages.impl.timeline.components_CallMenuItem_Day_0_en","features.messages.impl.timeline.components_CallMenuItem_Night_0_en",0,], ["features.messages.impl.timeline.components_CallMenuItem_Day_1_en","features.messages.impl.timeline.components_CallMenuItem_Night_1_en",0,], -["features.messages.impl.timeline.components_CallMenuItem_Day_2_en","features.messages.impl.timeline.components_CallMenuItem_Night_2_en",20308,], -["features.messages.impl.timeline.components_CallMenuItem_Day_3_en","features.messages.impl.timeline.components_CallMenuItem_Night_3_en",20308,], +["features.messages.impl.timeline.components_CallMenuItem_Day_2_en","features.messages.impl.timeline.components_CallMenuItem_Night_2_en",20323,], +["features.messages.impl.timeline.components_CallMenuItem_Day_3_en","features.messages.impl.timeline.components_CallMenuItem_Night_3_en",20323,], ["features.messages.impl.timeline.components_CallMenuItem_Day_4_en","features.messages.impl.timeline.components_CallMenuItem_Night_4_en",0,], ["features.messages.impl.timeline.components_CallMenuItem_Day_5_en","features.messages.impl.timeline.components_CallMenuItem_Night_5_en",0,], ["features.call.impl.ui_CallScreenView_Day_0_en","features.call.impl.ui_CallScreenView_Night_0_en",0,], -["features.call.impl.ui_CallScreenView_Day_1_en","features.call.impl.ui_CallScreenView_Night_1_en",20308,], -["features.call.impl.ui_CallScreenView_Day_2_en","features.call.impl.ui_CallScreenView_Night_2_en",20308,], -["features.call.impl.ui_CallScreenView_Day_3_en","features.call.impl.ui_CallScreenView_Night_3_en",20308,], -["libraries.textcomposer_CaptionWarningBottomSheet_Day_0_en","libraries.textcomposer_CaptionWarningBottomSheet_Night_0_en",20308,], -["features.login.impl.screens.changeaccountprovider_ChangeAccountProviderView_Day_0_en","features.login.impl.screens.changeaccountprovider_ChangeAccountProviderView_Night_0_en",20308,], -["features.login.impl.screens.changeaccountprovider_ChangeAccountProviderView_Day_1_en","features.login.impl.screens.changeaccountprovider_ChangeAccountProviderView_Night_1_en",20308,], -["features.changeroommemberroles.impl_ChangeRolesView_Day_0_en","features.changeroommemberroles.impl_ChangeRolesView_Night_0_en",0,], -["features.changeroommemberroles.impl_ChangeRolesView_Day_10_en","features.changeroommemberroles.impl_ChangeRolesView_Night_10_en",0,], -["features.changeroommemberroles.impl_ChangeRolesView_Day_11_en","features.changeroommemberroles.impl_ChangeRolesView_Night_11_en",0,], -["features.changeroommemberroles.impl_ChangeRolesView_Day_12_en","features.changeroommemberroles.impl_ChangeRolesView_Night_12_en",0,], -["features.changeroommemberroles.impl_ChangeRolesView_Day_1_en","features.changeroommemberroles.impl_ChangeRolesView_Night_1_en",0,], -["features.changeroommemberroles.impl_ChangeRolesView_Day_2_en","features.changeroommemberroles.impl_ChangeRolesView_Night_2_en",0,], -["features.changeroommemberroles.impl_ChangeRolesView_Day_3_en","features.changeroommemberroles.impl_ChangeRolesView_Night_3_en",0,], -["features.changeroommemberroles.impl_ChangeRolesView_Day_4_en","features.changeroommemberroles.impl_ChangeRolesView_Night_4_en",0,], -["features.changeroommemberroles.impl_ChangeRolesView_Day_5_en","features.changeroommemberroles.impl_ChangeRolesView_Night_5_en",0,], -["features.changeroommemberroles.impl_ChangeRolesView_Day_6_en","features.changeroommemberroles.impl_ChangeRolesView_Night_6_en",0,], -["features.changeroommemberroles.impl_ChangeRolesView_Day_7_en","features.changeroommemberroles.impl_ChangeRolesView_Night_7_en",0,], -["features.changeroommemberroles.impl_ChangeRolesView_Day_8_en","features.changeroommemberroles.impl_ChangeRolesView_Night_8_en",0,], -["features.changeroommemberroles.impl_ChangeRolesView_Day_9_en","features.changeroommemberroles.impl_ChangeRolesView_Night_9_en",0,], -["features.roomdetails.impl.rolesandpermissions.permissions_ChangeRoomPermissionsView_Day_0_en","features.roomdetails.impl.rolesandpermissions.permissions_ChangeRoomPermissionsView_Night_0_en",20308,], -["features.roomdetails.impl.rolesandpermissions.permissions_ChangeRoomPermissionsView_Day_1_en","features.roomdetails.impl.rolesandpermissions.permissions_ChangeRoomPermissionsView_Night_1_en",20308,], -["features.roomdetails.impl.rolesandpermissions.permissions_ChangeRoomPermissionsView_Day_2_en","features.roomdetails.impl.rolesandpermissions.permissions_ChangeRoomPermissionsView_Night_2_en",20308,], -["features.roomdetails.impl.rolesandpermissions.permissions_ChangeRoomPermissionsView_Day_3_en","features.roomdetails.impl.rolesandpermissions.permissions_ChangeRoomPermissionsView_Night_3_en",20308,], -["features.roomdetails.impl.rolesandpermissions.permissions_ChangeRoomPermissionsView_Day_4_en","features.roomdetails.impl.rolesandpermissions.permissions_ChangeRoomPermissionsView_Night_4_en",20308,], -["features.roomdetails.impl.rolesandpermissions.permissions_ChangeRoomPermissionsView_Day_5_en","features.roomdetails.impl.rolesandpermissions.permissions_ChangeRoomPermissionsView_Night_5_en",20308,], -["features.roomdetails.impl.rolesandpermissions.permissions_ChangeRoomPermissionsView_Day_6_en","features.roomdetails.impl.rolesandpermissions.permissions_ChangeRoomPermissionsView_Night_6_en",20308,], +["features.call.impl.ui_CallScreenView_Day_1_en","features.call.impl.ui_CallScreenView_Night_1_en",20323,], +["features.call.impl.ui_CallScreenView_Day_2_en","features.call.impl.ui_CallScreenView_Night_2_en",20323,], +["features.call.impl.ui_CallScreenView_Day_3_en","features.call.impl.ui_CallScreenView_Night_3_en",20323,], +["libraries.textcomposer_CaptionWarningBottomSheet_Day_0_en","libraries.textcomposer_CaptionWarningBottomSheet_Night_0_en",20323,], +["features.login.impl.screens.changeaccountprovider_ChangeAccountProviderView_Day_0_en","features.login.impl.screens.changeaccountprovider_ChangeAccountProviderView_Night_0_en",20323,], +["features.login.impl.screens.changeaccountprovider_ChangeAccountProviderView_Day_1_en","features.login.impl.screens.changeaccountprovider_ChangeAccountProviderView_Night_1_en",20323,], +["features.changeroommemberroles.impl_ChangeRolesView_Day_0_en","features.changeroommemberroles.impl_ChangeRolesView_Night_0_en",20323,], +["features.changeroommemberroles.impl_ChangeRolesView_Day_10_en","features.changeroommemberroles.impl_ChangeRolesView_Night_10_en",20323,], +["features.changeroommemberroles.impl_ChangeRolesView_Day_11_en","features.changeroommemberroles.impl_ChangeRolesView_Night_11_en",20323,], +["features.changeroommemberroles.impl_ChangeRolesView_Day_12_en","features.changeroommemberroles.impl_ChangeRolesView_Night_12_en",20323,], +["features.changeroommemberroles.impl_ChangeRolesView_Day_1_en","features.changeroommemberroles.impl_ChangeRolesView_Night_1_en",20323,], +["features.changeroommemberroles.impl_ChangeRolesView_Day_2_en","features.changeroommemberroles.impl_ChangeRolesView_Night_2_en",20323,], +["features.changeroommemberroles.impl_ChangeRolesView_Day_3_en","features.changeroommemberroles.impl_ChangeRolesView_Night_3_en",20323,], +["features.changeroommemberroles.impl_ChangeRolesView_Day_4_en","features.changeroommemberroles.impl_ChangeRolesView_Night_4_en",20323,], +["features.changeroommemberroles.impl_ChangeRolesView_Day_5_en","features.changeroommemberroles.impl_ChangeRolesView_Night_5_en",20323,], +["features.changeroommemberroles.impl_ChangeRolesView_Day_6_en","features.changeroommemberroles.impl_ChangeRolesView_Night_6_en",20323,], +["features.changeroommemberroles.impl_ChangeRolesView_Day_7_en","features.changeroommemberroles.impl_ChangeRolesView_Night_7_en",20323,], +["features.changeroommemberroles.impl_ChangeRolesView_Day_8_en","features.changeroommemberroles.impl_ChangeRolesView_Night_8_en",20323,], +["features.changeroommemberroles.impl_ChangeRolesView_Day_9_en","features.changeroommemberroles.impl_ChangeRolesView_Night_9_en",20323,], +["features.roomdetails.impl.rolesandpermissions.permissions_ChangeRoomPermissionsView_Day_0_en","features.roomdetails.impl.rolesandpermissions.permissions_ChangeRoomPermissionsView_Night_0_en",20323,], +["features.roomdetails.impl.rolesandpermissions.permissions_ChangeRoomPermissionsView_Day_1_en","features.roomdetails.impl.rolesandpermissions.permissions_ChangeRoomPermissionsView_Night_1_en",20323,], +["features.roomdetails.impl.rolesandpermissions.permissions_ChangeRoomPermissionsView_Day_2_en","features.roomdetails.impl.rolesandpermissions.permissions_ChangeRoomPermissionsView_Night_2_en",20323,], +["features.roomdetails.impl.rolesandpermissions.permissions_ChangeRoomPermissionsView_Day_3_en","features.roomdetails.impl.rolesandpermissions.permissions_ChangeRoomPermissionsView_Night_3_en",20323,], +["features.roomdetails.impl.rolesandpermissions.permissions_ChangeRoomPermissionsView_Day_4_en","features.roomdetails.impl.rolesandpermissions.permissions_ChangeRoomPermissionsView_Night_4_en",20323,], +["features.roomdetails.impl.rolesandpermissions.permissions_ChangeRoomPermissionsView_Day_5_en","features.roomdetails.impl.rolesandpermissions.permissions_ChangeRoomPermissionsView_Night_5_en",20323,], +["features.roomdetails.impl.rolesandpermissions.permissions_ChangeRoomPermissionsView_Day_6_en","features.roomdetails.impl.rolesandpermissions.permissions_ChangeRoomPermissionsView_Night_6_en",20323,], ["features.login.impl.changeserver_ChangeServerView_Day_0_en","features.login.impl.changeserver_ChangeServerView_Night_0_en",0,], -["features.login.impl.changeserver_ChangeServerView_Day_1_en","features.login.impl.changeserver_ChangeServerView_Night_1_en",20308,], -["features.login.impl.changeserver_ChangeServerView_Day_2_en","features.login.impl.changeserver_ChangeServerView_Night_2_en",20308,], -["features.login.impl.changeserver_ChangeServerView_Day_3_en","features.login.impl.changeserver_ChangeServerView_Night_3_en",20308,], -["features.login.impl.changeserver_ChangeServerView_Day_4_en","features.login.impl.changeserver_ChangeServerView_Night_4_en",0,], +["features.login.impl.changeserver_ChangeServerView_Day_1_en","features.login.impl.changeserver_ChangeServerView_Night_1_en",20323,], +["features.login.impl.changeserver_ChangeServerView_Day_2_en","features.login.impl.changeserver_ChangeServerView_Night_2_en",20323,], +["features.login.impl.changeserver_ChangeServerView_Day_3_en","features.login.impl.changeserver_ChangeServerView_Night_3_en",20323,], +["features.login.impl.changeserver_ChangeServerView_Day_4_en","features.login.impl.changeserver_ChangeServerView_Night_4_en",20323,], ["libraries.matrix.ui.components_CheckableResolvedUserRow_en","",0,], -["libraries.matrix.ui.components_CheckableUnresolvedUserRow_en","",20308,], +["libraries.matrix.ui.components_CheckableUnresolvedUserRow_en","",20323,], ["libraries.designsystem.theme.components_Checkboxes_Toggles_en","",0,], -["features.login.impl.screens.chooseaccountprovider_ChooseAccountProviderView_Day_0_en","features.login.impl.screens.chooseaccountprovider_ChooseAccountProviderView_Night_0_en",20308,], -["features.login.impl.screens.chooseaccountprovider_ChooseAccountProviderView_Day_1_en","features.login.impl.screens.chooseaccountprovider_ChooseAccountProviderView_Night_1_en",20308,], -["features.login.impl.screens.chooseaccountprovider_ChooseAccountProviderView_Day_2_en","features.login.impl.screens.chooseaccountprovider_ChooseAccountProviderView_Night_2_en",20308,], -["features.ftue.impl.sessionverification.choosemode_ChooseSelfVerificationModeView_Day_0_en","features.ftue.impl.sessionverification.choosemode_ChooseSelfVerificationModeView_Night_0_en",20308,], -["features.ftue.impl.sessionverification.choosemode_ChooseSelfVerificationModeView_Day_1_en","features.ftue.impl.sessionverification.choosemode_ChooseSelfVerificationModeView_Night_1_en",20308,], -["features.ftue.impl.sessionverification.choosemode_ChooseSelfVerificationModeView_Day_2_en","features.ftue.impl.sessionverification.choosemode_ChooseSelfVerificationModeView_Night_2_en",20308,], -["features.ftue.impl.sessionverification.choosemode_ChooseSelfVerificationModeView_Day_3_en","features.ftue.impl.sessionverification.choosemode_ChooseSelfVerificationModeView_Night_3_en",20308,], +["features.login.impl.screens.chooseaccountprovider_ChooseAccountProviderView_Day_0_en","features.login.impl.screens.chooseaccountprovider_ChooseAccountProviderView_Night_0_en",20323,], +["features.login.impl.screens.chooseaccountprovider_ChooseAccountProviderView_Day_1_en","features.login.impl.screens.chooseaccountprovider_ChooseAccountProviderView_Night_1_en",20323,], +["features.login.impl.screens.chooseaccountprovider_ChooseAccountProviderView_Day_2_en","features.login.impl.screens.chooseaccountprovider_ChooseAccountProviderView_Night_2_en",20323,], +["features.ftue.impl.sessionverification.choosemode_ChooseSelfVerificationModeView_Day_0_en","features.ftue.impl.sessionverification.choosemode_ChooseSelfVerificationModeView_Night_0_en",20323,], +["features.ftue.impl.sessionverification.choosemode_ChooseSelfVerificationModeView_Day_1_en","features.ftue.impl.sessionverification.choosemode_ChooseSelfVerificationModeView_Night_1_en",20323,], +["features.ftue.impl.sessionverification.choosemode_ChooseSelfVerificationModeView_Day_2_en","features.ftue.impl.sessionverification.choosemode_ChooseSelfVerificationModeView_Night_2_en",20323,], +["features.ftue.impl.sessionverification.choosemode_ChooseSelfVerificationModeView_Day_3_en","features.ftue.impl.sessionverification.choosemode_ChooseSelfVerificationModeView_Night_3_en",20323,], ["libraries.designsystem.theme.components_CircularProgressIndicator_Progress_Indicators_en","",0,], ["libraries.designsystem.components_ClickableLinkText_Text_en","",0,], ["libraries.designsystem.theme_ColorAliases_Day_0_en","libraries.designsystem.theme_ColorAliases_Night_0_en",0,], -["libraries.designsystem.atomic.molecules_ComposerAlertMolecule_Day_0_en","libraries.designsystem.atomic.molecules_ComposerAlertMolecule_Night_0_en",20308,], -["libraries.designsystem.atomic.molecules_ComposerAlertMolecule_Day_1_en","libraries.designsystem.atomic.molecules_ComposerAlertMolecule_Night_1_en",20308,], -["libraries.textcomposer_ComposerModeView_Day_0_en","libraries.textcomposer_ComposerModeView_Night_0_en",20308,], +["libraries.designsystem.atomic.molecules_ComposerAlertMolecule_Day_0_en","libraries.designsystem.atomic.molecules_ComposerAlertMolecule_Night_0_en",20323,], +["libraries.designsystem.atomic.molecules_ComposerAlertMolecule_Day_1_en","libraries.designsystem.atomic.molecules_ComposerAlertMolecule_Night_1_en",20323,], +["libraries.textcomposer_ComposerModeView_Day_0_en","libraries.textcomposer_ComposerModeView_Night_0_en",20323,], ["libraries.textcomposer_ComposerModeView_Day_1_en","libraries.textcomposer_ComposerModeView_Night_1_en",0,], ["libraries.textcomposer_ComposerModeView_Day_2_en","libraries.textcomposer_ComposerModeView_Night_2_en",0,], ["libraries.textcomposer_ComposerModeView_Day_3_en","libraries.textcomposer_ComposerModeView_Night_3_en",0,], -["features.createroom.impl.configureroom_ConfigureRoomViewDark_0_en","",20308,], -["features.createroom.impl.configureroom_ConfigureRoomViewDark_1_en","",20308,], -["features.createroom.impl.configureroom_ConfigureRoomViewDark_2_en","",20308,], -["features.createroom.impl.configureroom_ConfigureRoomViewDark_3_en","",20308,], -["features.createroom.impl.configureroom_ConfigureRoomViewDark_4_en","",20308,], -["features.createroom.impl.configureroom_ConfigureRoomViewDark_5_en","",20308,], -["features.createroom.impl.configureroom_ConfigureRoomViewLight_0_en","",20308,], -["features.createroom.impl.configureroom_ConfigureRoomViewLight_1_en","",20308,], -["features.createroom.impl.configureroom_ConfigureRoomViewLight_2_en","",20308,], -["features.createroom.impl.configureroom_ConfigureRoomViewLight_3_en","",20308,], -["features.createroom.impl.configureroom_ConfigureRoomViewLight_4_en","",20308,], -["features.createroom.impl.configureroom_ConfigureRoomViewLight_5_en","",20308,], -["features.login.impl.screens.confirmaccountprovider_ConfirmAccountProviderView_Day_0_en","features.login.impl.screens.confirmaccountprovider_ConfirmAccountProviderView_Night_0_en",20308,], -["features.login.impl.screens.confirmaccountprovider_ConfirmAccountProviderView_Day_1_en","features.login.impl.screens.confirmaccountprovider_ConfirmAccountProviderView_Night_1_en",20308,], -["features.login.impl.screens.confirmaccountprovider_ConfirmAccountProviderView_Day_2_en","features.login.impl.screens.confirmaccountprovider_ConfirmAccountProviderView_Night_2_en",20308,], -["features.home.impl.components_ConfirmRecoveryKeyBanner_Day_0_en","features.home.impl.components_ConfirmRecoveryKeyBanner_Night_0_en",20308,], +["features.createroom.impl.configureroom_ConfigureRoomViewDark_0_en","",20323,], +["features.createroom.impl.configureroom_ConfigureRoomViewDark_1_en","",20323,], +["features.createroom.impl.configureroom_ConfigureRoomViewDark_2_en","",20323,], +["features.createroom.impl.configureroom_ConfigureRoomViewDark_3_en","",20323,], +["features.createroom.impl.configureroom_ConfigureRoomViewDark_4_en","",20323,], +["features.createroom.impl.configureroom_ConfigureRoomViewDark_5_en","",20323,], +["features.createroom.impl.configureroom_ConfigureRoomViewLight_0_en","",20323,], +["features.createroom.impl.configureroom_ConfigureRoomViewLight_1_en","",20323,], +["features.createroom.impl.configureroom_ConfigureRoomViewLight_2_en","",20323,], +["features.createroom.impl.configureroom_ConfigureRoomViewLight_3_en","",20323,], +["features.createroom.impl.configureroom_ConfigureRoomViewLight_4_en","",20323,], +["features.createroom.impl.configureroom_ConfigureRoomViewLight_5_en","",20323,], +["features.login.impl.screens.confirmaccountprovider_ConfirmAccountProviderView_Day_0_en","features.login.impl.screens.confirmaccountprovider_ConfirmAccountProviderView_Night_0_en",20323,], +["features.login.impl.screens.confirmaccountprovider_ConfirmAccountProviderView_Day_1_en","features.login.impl.screens.confirmaccountprovider_ConfirmAccountProviderView_Night_1_en",20323,], +["features.login.impl.screens.confirmaccountprovider_ConfirmAccountProviderView_Day_2_en","features.login.impl.screens.confirmaccountprovider_ConfirmAccountProviderView_Night_2_en",20323,], +["features.home.impl.components_ConfirmRecoveryKeyBanner_Day_0_en","features.home.impl.components_ConfirmRecoveryKeyBanner_Night_0_en",20323,], ["libraries.designsystem.components.dialogs_ConfirmationDialogContent_Dialogs_en","",0,], ["libraries.designsystem.components.dialogs_ConfirmationDialog_Day_0_en","libraries.designsystem.components.dialogs_ConfirmationDialog_Night_0_en",0,], ["features.networkmonitor.api.ui_ConnectivityIndicatorView_Day_0_en","features.networkmonitor.api.ui_ConnectivityIndicatorView_Night_0_en",0,], ["libraries.designsystem.atomic.atoms_CounterAtom_Day_0_en","libraries.designsystem.atomic.atoms_CounterAtom_Night_0_en",0,], -["features.rageshake.api.crash_CrashDetectionView_Day_0_en","features.rageshake.api.crash_CrashDetectionView_Night_0_en",20308,], -["features.login.impl.screens.createaccount_CreateAccountView_Day_0_en","features.login.impl.screens.createaccount_CreateAccountView_Night_0_en",20308,], -["features.login.impl.screens.createaccount_CreateAccountView_Day_1_en","features.login.impl.screens.createaccount_CreateAccountView_Night_1_en",20308,], -["features.login.impl.screens.createaccount_CreateAccountView_Day_2_en","features.login.impl.screens.createaccount_CreateAccountView_Night_2_en",20308,], -["features.login.impl.screens.createaccount_CreateAccountView_Day_3_en","features.login.impl.screens.createaccount_CreateAccountView_Night_3_en",20308,], -["libraries.matrix.ui.components_CreateDmConfirmationBottomSheet_Day_0_en","libraries.matrix.ui.components_CreateDmConfirmationBottomSheet_Night_0_en",20308,], -["libraries.matrix.ui.components_CreateDmConfirmationBottomSheet_Day_1_en","libraries.matrix.ui.components_CreateDmConfirmationBottomSheet_Night_1_en",20308,], -["features.poll.impl.create_CreatePollView_Day_0_en","features.poll.impl.create_CreatePollView_Night_0_en",20308,], -["features.poll.impl.create_CreatePollView_Day_1_en","features.poll.impl.create_CreatePollView_Night_1_en",20308,], -["features.poll.impl.create_CreatePollView_Day_2_en","features.poll.impl.create_CreatePollView_Night_2_en",20308,], -["features.poll.impl.create_CreatePollView_Day_3_en","features.poll.impl.create_CreatePollView_Night_3_en",20308,], -["features.poll.impl.create_CreatePollView_Day_4_en","features.poll.impl.create_CreatePollView_Night_4_en",20308,], -["features.poll.impl.create_CreatePollView_Day_5_en","features.poll.impl.create_CreatePollView_Night_5_en",20308,], -["features.poll.impl.create_CreatePollView_Day_6_en","features.poll.impl.create_CreatePollView_Night_6_en",20308,], -["features.poll.impl.create_CreatePollView_Day_7_en","features.poll.impl.create_CreatePollView_Night_7_en",20308,], -["features.createroom.impl.root_CreateRoomRootView_Day_0_en","features.createroom.impl.root_CreateRoomRootView_Night_0_en",20308,], -["features.createroom.impl.root_CreateRoomRootView_Day_1_en","features.createroom.impl.root_CreateRoomRootView_Night_1_en",20308,], -["features.createroom.impl.root_CreateRoomRootView_Day_2_en","features.createroom.impl.root_CreateRoomRootView_Night_2_en",20308,], -["features.createroom.impl.root_CreateRoomRootView_Day_3_en","features.createroom.impl.root_CreateRoomRootView_Night_3_en",20308,], -["features.createroom.impl.root_CreateRoomRootView_Day_4_en","features.createroom.impl.root_CreateRoomRootView_Night_4_en",20308,], -["features.createroom.impl.root_CreateRoomRootView_Day_5_en","features.createroom.impl.root_CreateRoomRootView_Night_5_en",20308,], -["libraries.dateformatter.impl.previews_DateFormatterModeView_0_en","",20308,], -["libraries.dateformatter.impl.previews_DateFormatterModeView_1_en","",20308,], -["libraries.dateformatter.impl.previews_DateFormatterModeView_2_en","",20308,], -["libraries.dateformatter.impl.previews_DateFormatterModeView_3_en","",20308,], -["libraries.dateformatter.impl.previews_DateFormatterModeView_4_en","",20308,], +["features.rageshake.api.crash_CrashDetectionView_Day_0_en","features.rageshake.api.crash_CrashDetectionView_Night_0_en",20323,], +["features.login.impl.screens.createaccount_CreateAccountView_Day_0_en","features.login.impl.screens.createaccount_CreateAccountView_Night_0_en",20323,], +["features.login.impl.screens.createaccount_CreateAccountView_Day_1_en","features.login.impl.screens.createaccount_CreateAccountView_Night_1_en",20323,], +["features.login.impl.screens.createaccount_CreateAccountView_Day_2_en","features.login.impl.screens.createaccount_CreateAccountView_Night_2_en",20323,], +["features.login.impl.screens.createaccount_CreateAccountView_Day_3_en","features.login.impl.screens.createaccount_CreateAccountView_Night_3_en",20323,], +["libraries.matrix.ui.components_CreateDmConfirmationBottomSheet_Day_0_en","libraries.matrix.ui.components_CreateDmConfirmationBottomSheet_Night_0_en",20323,], +["libraries.matrix.ui.components_CreateDmConfirmationBottomSheet_Day_1_en","libraries.matrix.ui.components_CreateDmConfirmationBottomSheet_Night_1_en",20323,], +["features.poll.impl.create_CreatePollView_Day_0_en","features.poll.impl.create_CreatePollView_Night_0_en",20323,], +["features.poll.impl.create_CreatePollView_Day_1_en","features.poll.impl.create_CreatePollView_Night_1_en",20323,], +["features.poll.impl.create_CreatePollView_Day_2_en","features.poll.impl.create_CreatePollView_Night_2_en",20323,], +["features.poll.impl.create_CreatePollView_Day_3_en","features.poll.impl.create_CreatePollView_Night_3_en",20323,], +["features.poll.impl.create_CreatePollView_Day_4_en","features.poll.impl.create_CreatePollView_Night_4_en",20323,], +["features.poll.impl.create_CreatePollView_Day_5_en","features.poll.impl.create_CreatePollView_Night_5_en",20323,], +["features.poll.impl.create_CreatePollView_Day_6_en","features.poll.impl.create_CreatePollView_Night_6_en",20323,], +["features.poll.impl.create_CreatePollView_Day_7_en","features.poll.impl.create_CreatePollView_Night_7_en",20323,], +["libraries.dateformatter.impl.previews_DateFormatterModeView_0_en","",20323,], +["libraries.dateformatter.impl.previews_DateFormatterModeView_1_en","",20323,], +["libraries.dateformatter.impl.previews_DateFormatterModeView_2_en","",20323,], +["libraries.dateformatter.impl.previews_DateFormatterModeView_3_en","",20323,], +["libraries.dateformatter.impl.previews_DateFormatterModeView_4_en","",20323,], ["libraries.mediaviewer.impl.gallery.ui_DateItemView_Day_0_en","libraries.mediaviewer.impl.gallery.ui_DateItemView_Night_0_en",0,], ["libraries.mediaviewer.impl.gallery.ui_DateItemView_Day_1_en","libraries.mediaviewer.impl.gallery.ui_DateItemView_Night_1_en",0,], -["libraries.designsystem.theme.components.previews_DatePickerDark_DateTime_pickers_en","",20308,], -["libraries.designsystem.theme.components.previews_DatePickerLight_DateTime_pickers_en","",20308,], -["features.invite.impl.declineandblock_DeclineAndBlockView_Day_0_en","features.invite.impl.declineandblock_DeclineAndBlockView_Night_0_en",20308,], -["features.invite.impl.declineandblock_DeclineAndBlockView_Day_1_en","features.invite.impl.declineandblock_DeclineAndBlockView_Night_1_en",20308,], -["features.invite.impl.declineandblock_DeclineAndBlockView_Day_2_en","features.invite.impl.declineandblock_DeclineAndBlockView_Night_2_en",20308,], -["features.invite.impl.declineandblock_DeclineAndBlockView_Day_3_en","features.invite.impl.declineandblock_DeclineAndBlockView_Night_3_en",20308,], -["features.invite.impl.declineandblock_DeclineAndBlockView_Day_4_en","features.invite.impl.declineandblock_DeclineAndBlockView_Night_4_en",20308,], +["libraries.designsystem.theme.components.previews_DatePickerDark_DateTime_pickers_en","",20323,], +["libraries.designsystem.theme.components.previews_DatePickerLight_DateTime_pickers_en","",20323,], +["features.invite.impl.declineandblock_DeclineAndBlockView_Day_0_en","features.invite.impl.declineandblock_DeclineAndBlockView_Night_0_en",20323,], +["features.invite.impl.declineandblock_DeclineAndBlockView_Day_1_en","features.invite.impl.declineandblock_DeclineAndBlockView_Night_1_en",20323,], +["features.invite.impl.declineandblock_DeclineAndBlockView_Day_2_en","features.invite.impl.declineandblock_DeclineAndBlockView_Night_2_en",20323,], +["features.invite.impl.declineandblock_DeclineAndBlockView_Day_3_en","features.invite.impl.declineandblock_DeclineAndBlockView_Night_3_en",20323,], +["features.invite.impl.declineandblock_DeclineAndBlockView_Day_4_en","features.invite.impl.declineandblock_DeclineAndBlockView_Night_4_en",20323,], ["features.logout.impl.direct_DefaultDirectLogoutView_Day_0_en","features.logout.impl.direct_DefaultDirectLogoutView_Night_0_en",0,], -["features.logout.impl.direct_DefaultDirectLogoutView_Day_1_en","features.logout.impl.direct_DefaultDirectLogoutView_Night_1_en",20308,], -["features.logout.impl.direct_DefaultDirectLogoutView_Day_2_en","features.logout.impl.direct_DefaultDirectLogoutView_Night_2_en",20308,], -["features.logout.impl.direct_DefaultDirectLogoutView_Day_3_en","features.logout.impl.direct_DefaultDirectLogoutView_Night_3_en",20308,], +["features.logout.impl.direct_DefaultDirectLogoutView_Day_1_en","features.logout.impl.direct_DefaultDirectLogoutView_Night_1_en",20323,], +["features.logout.impl.direct_DefaultDirectLogoutView_Day_2_en","features.logout.impl.direct_DefaultDirectLogoutView_Night_2_en",20323,], +["features.logout.impl.direct_DefaultDirectLogoutView_Day_3_en","features.logout.impl.direct_DefaultDirectLogoutView_Night_3_en",20323,], ["features.logout.impl.direct_DefaultDirectLogoutView_Day_4_en","features.logout.impl.direct_DefaultDirectLogoutView_Night_4_en",0,], -["features.preferences.impl.notifications.edit_DefaultNotificationSettingOption_Day_0_en","features.preferences.impl.notifications.edit_DefaultNotificationSettingOption_Night_0_en",20308,], -["features.home.impl.components_DefaultRoomListTopBarWithIndicator_Day_0_en","features.home.impl.components_DefaultRoomListTopBarWithIndicator_Night_0_en",20308,], -["features.home.impl.components_DefaultRoomListTopBar_Day_0_en","features.home.impl.components_DefaultRoomListTopBar_Night_0_en",20308,], +["features.preferences.impl.notifications.edit_DefaultNotificationSettingOption_Day_0_en","features.preferences.impl.notifications.edit_DefaultNotificationSettingOption_Night_0_en",20323,], +["features.home.impl.components_DefaultRoomListTopBarWithIndicator_Day_0_en","features.home.impl.components_DefaultRoomListTopBarWithIndicator_Night_0_en",20323,], +["features.home.impl.components_DefaultRoomListTopBar_Day_0_en","features.home.impl.components_DefaultRoomListTopBar_Night_0_en",20323,], ["features.licenses.impl.details_DependenciesDetailsView_Day_0_en","features.licenses.impl.details_DependenciesDetailsView_Night_0_en",0,], -["features.licenses.impl.list_DependencyLicensesListView_Day_0_en","features.licenses.impl.list_DependencyLicensesListView_Night_0_en",20308,], -["features.licenses.impl.list_DependencyLicensesListView_Day_1_en","features.licenses.impl.list_DependencyLicensesListView_Night_1_en",20308,], -["features.licenses.impl.list_DependencyLicensesListView_Day_2_en","features.licenses.impl.list_DependencyLicensesListView_Night_2_en",20308,], -["features.licenses.impl.list_DependencyLicensesListView_Day_3_en","features.licenses.impl.list_DependencyLicensesListView_Night_3_en",20308,], -["features.preferences.impl.developer_DeveloperSettingsView_Day_0_en","features.preferences.impl.developer_DeveloperSettingsView_Night_0_en",20308,], -["features.preferences.impl.developer_DeveloperSettingsView_Day_1_en","features.preferences.impl.developer_DeveloperSettingsView_Night_1_en",20308,], -["features.preferences.impl.developer_DeveloperSettingsView_Day_2_en","features.preferences.impl.developer_DeveloperSettingsView_Night_2_en",20308,], +["features.licenses.impl.list_DependencyLicensesListView_Day_0_en","features.licenses.impl.list_DependencyLicensesListView_Night_0_en",20323,], +["features.licenses.impl.list_DependencyLicensesListView_Day_1_en","features.licenses.impl.list_DependencyLicensesListView_Night_1_en",20323,], +["features.licenses.impl.list_DependencyLicensesListView_Day_2_en","features.licenses.impl.list_DependencyLicensesListView_Night_2_en",20323,], +["features.licenses.impl.list_DependencyLicensesListView_Day_3_en","features.licenses.impl.list_DependencyLicensesListView_Night_3_en",20323,], +["features.preferences.impl.developer_DeveloperSettingsView_Day_0_en","features.preferences.impl.developer_DeveloperSettingsView_Night_0_en",20323,], +["features.preferences.impl.developer_DeveloperSettingsView_Day_1_en","features.preferences.impl.developer_DeveloperSettingsView_Night_1_en",20323,], +["features.preferences.impl.developer_DeveloperSettingsView_Day_2_en","features.preferences.impl.developer_DeveloperSettingsView_Night_2_en",20323,], ["libraries.designsystem.theme.components_DialogWithDestructiveButton_Dialog_with_destructive_button_Dialogs_en","",0,], ["libraries.designsystem.theme.components_DialogWithOnlyMessageAndOkButton_Dialog_with_only_message_and_ok_button_Dialogs_en","",0,], ["libraries.designsystem.theme.components_DialogWithThirdButton_Dialog_with_third_button_Dialogs_en","",0,], @@ -357,30 +372,32 @@ export const screenshots = [ ["libraries.designsystem.text_DpScale_1_0f__en","",0,], ["libraries.designsystem.text_DpScale_1_5f__en","",0,], ["libraries.designsystem.theme.components_DropdownMenuItem_Menus_en","",0,], -["features.preferences.impl.notifications.edit_EditDefaultNotificationSettingView_Day_0_en","features.preferences.impl.notifications.edit_EditDefaultNotificationSettingView_Night_0_en",20308,], -["features.preferences.impl.notifications.edit_EditDefaultNotificationSettingView_Day_1_en","features.preferences.impl.notifications.edit_EditDefaultNotificationSettingView_Night_1_en",20308,], -["features.preferences.impl.notifications.edit_EditDefaultNotificationSettingView_Day_2_en","features.preferences.impl.notifications.edit_EditDefaultNotificationSettingView_Night_2_en",20308,], -["features.preferences.impl.notifications.edit_EditDefaultNotificationSettingView_Day_3_en","features.preferences.impl.notifications.edit_EditDefaultNotificationSettingView_Night_3_en",20308,], -["features.preferences.impl.notifications.edit_EditDefaultNotificationSettingView_Day_4_en","features.preferences.impl.notifications.edit_EditDefaultNotificationSettingView_Night_4_en",20308,], -["features.roomdetails.impl.securityandprivacy.editroomaddress_EditRoomAddressView_Day_0_en","features.roomdetails.impl.securityandprivacy.editroomaddress_EditRoomAddressView_Night_0_en",20308,], -["features.roomdetails.impl.securityandprivacy.editroomaddress_EditRoomAddressView_Day_1_en","features.roomdetails.impl.securityandprivacy.editroomaddress_EditRoomAddressView_Night_1_en",20308,], -["features.roomdetails.impl.securityandprivacy.editroomaddress_EditRoomAddressView_Day_2_en","features.roomdetails.impl.securityandprivacy.editroomaddress_EditRoomAddressView_Night_2_en",20308,], -["features.roomdetails.impl.securityandprivacy.editroomaddress_EditRoomAddressView_Day_3_en","features.roomdetails.impl.securityandprivacy.editroomaddress_EditRoomAddressView_Night_3_en",20308,], -["features.roomdetails.impl.securityandprivacy.editroomaddress_EditRoomAddressView_Day_4_en","features.roomdetails.impl.securityandprivacy.editroomaddress_EditRoomAddressView_Night_4_en",20308,], -["features.preferences.impl.user.editprofile_EditUserProfileView_Day_0_en","features.preferences.impl.user.editprofile_EditUserProfileView_Night_0_en",20308,], -["features.preferences.impl.user.editprofile_EditUserProfileView_Day_1_en","features.preferences.impl.user.editprofile_EditUserProfileView_Night_1_en",20308,], +["features.preferences.impl.notifications.edit_EditDefaultNotificationSettingView_Day_0_en","features.preferences.impl.notifications.edit_EditDefaultNotificationSettingView_Night_0_en",20323,], +["features.preferences.impl.notifications.edit_EditDefaultNotificationSettingView_Day_1_en","features.preferences.impl.notifications.edit_EditDefaultNotificationSettingView_Night_1_en",20323,], +["features.preferences.impl.notifications.edit_EditDefaultNotificationSettingView_Day_2_en","features.preferences.impl.notifications.edit_EditDefaultNotificationSettingView_Night_2_en",20323,], +["features.preferences.impl.notifications.edit_EditDefaultNotificationSettingView_Day_3_en","features.preferences.impl.notifications.edit_EditDefaultNotificationSettingView_Night_3_en",20323,], +["features.preferences.impl.notifications.edit_EditDefaultNotificationSettingView_Day_4_en","features.preferences.impl.notifications.edit_EditDefaultNotificationSettingView_Night_4_en",20323,], +["features.roomdetails.impl.securityandprivacy.editroomaddress_EditRoomAddressView_Day_0_en","features.roomdetails.impl.securityandprivacy.editroomaddress_EditRoomAddressView_Night_0_en",20323,], +["features.roomdetails.impl.securityandprivacy.editroomaddress_EditRoomAddressView_Day_1_en","features.roomdetails.impl.securityandprivacy.editroomaddress_EditRoomAddressView_Night_1_en",20323,], +["features.roomdetails.impl.securityandprivacy.editroomaddress_EditRoomAddressView_Day_2_en","features.roomdetails.impl.securityandprivacy.editroomaddress_EditRoomAddressView_Night_2_en",20323,], +["features.roomdetails.impl.securityandprivacy.editroomaddress_EditRoomAddressView_Day_3_en","features.roomdetails.impl.securityandprivacy.editroomaddress_EditRoomAddressView_Night_3_en",20323,], +["features.roomdetails.impl.securityandprivacy.editroomaddress_EditRoomAddressView_Day_4_en","features.roomdetails.impl.securityandprivacy.editroomaddress_EditRoomAddressView_Night_4_en",20323,], +["features.preferences.impl.user.editprofile_EditUserProfileView_Day_0_en","features.preferences.impl.user.editprofile_EditUserProfileView_Night_0_en",20323,], +["features.preferences.impl.user.editprofile_EditUserProfileView_Day_1_en","features.preferences.impl.user.editprofile_EditUserProfileView_Night_1_en",20323,], ["libraries.matrix.ui.components_EditableAvatarView_Day_0_en","libraries.matrix.ui.components_EditableAvatarView_Night_0_en",0,], ["libraries.matrix.ui.components_EditableAvatarView_Day_1_en","libraries.matrix.ui.components_EditableAvatarView_Night_1_en",0,], ["libraries.matrix.ui.components_EditableAvatarView_Day_2_en","libraries.matrix.ui.components_EditableAvatarView_Night_2_en",0,], +["libraries.matrix.ui.components_EditableOrgAvatarRtl_Day_0_en","libraries.matrix.ui.components_EditableOrgAvatarRtl_Night_0_en",0,], +["libraries.matrix.ui.components_EditableOrgAvatar_Day_0_en","libraries.matrix.ui.components_EditableOrgAvatar_Night_0_en",0,], ["libraries.designsystem.atomic.atoms_ElementLogoAtomLargeNoBlurShadow_Day_0_en","libraries.designsystem.atomic.atoms_ElementLogoAtomLargeNoBlurShadow_Night_0_en",0,], ["libraries.designsystem.atomic.atoms_ElementLogoAtomLarge_Day_0_en","libraries.designsystem.atomic.atoms_ElementLogoAtomLarge_Night_0_en",0,], ["libraries.designsystem.atomic.atoms_ElementLogoAtomMediumNoBlurShadow_Day_0_en","libraries.designsystem.atomic.atoms_ElementLogoAtomMediumNoBlurShadow_Night_0_en",0,], ["libraries.designsystem.atomic.atoms_ElementLogoAtomMedium_Day_0_en","libraries.designsystem.atomic.atoms_ElementLogoAtomMedium_Night_0_en",0,], ["features.messages.impl.timeline.components.customreaction_EmojiItem_Day_0_en","features.messages.impl.timeline.components.customreaction_EmojiItem_Night_0_en",0,], ["features.messages.impl.timeline.components.customreaction_EmojiPicker_Day_0_en","features.messages.impl.timeline.components.customreaction_EmojiPicker_Night_0_en",0,], -["libraries.designsystem.components.dialogs_ErrorDialogContent_Dialogs_en","",20308,], -["libraries.designsystem.components.dialogs_ErrorDialogWithDoNotShowAgain_Day_0_en","libraries.designsystem.components.dialogs_ErrorDialogWithDoNotShowAgain_Night_0_en",20308,], -["libraries.designsystem.components.dialogs_ErrorDialog_Day_0_en","libraries.designsystem.components.dialogs_ErrorDialog_Night_0_en",20308,], +["libraries.designsystem.components.dialogs_ErrorDialogContent_Dialogs_en","",20323,], +["libraries.designsystem.components.dialogs_ErrorDialogWithDoNotShowAgain_Day_0_en","libraries.designsystem.components.dialogs_ErrorDialogWithDoNotShowAgain_Night_0_en",20323,], +["libraries.designsystem.components.dialogs_ErrorDialog_Day_0_en","libraries.designsystem.components.dialogs_ErrorDialog_Night_0_en",20323,], ["features.messages.impl.timeline.debug_EventDebugInfoView_Day_0_en","features.messages.impl.timeline.debug_EventDebugInfoView_Night_0_en",0,], ["libraries.designsystem.components_ExpandableBottomSheetLayout_en","",0,], ["libraries.featureflag.ui_FeatureListView_Day_0_en","libraries.featureflag.ui_FeatureListView_Night_0_en",0,], @@ -399,38 +416,38 @@ export const screenshots = [ ["libraries.designsystem.theme.components_FloatingActionButton_Floating_Action_Buttons_en","",0,], ["libraries.designsystem.atomic.pages_FlowStepPage_Day_0_en","libraries.designsystem.atomic.pages_FlowStepPage_Night_0_en",0,], ["features.messages.impl.timeline.focus_FocusRequestStateView_Day_0_en","features.messages.impl.timeline.focus_FocusRequestStateView_Night_0_en",0,], -["features.messages.impl.timeline.focus_FocusRequestStateView_Day_1_en","features.messages.impl.timeline.focus_FocusRequestStateView_Night_1_en",20308,], -["features.messages.impl.timeline.focus_FocusRequestStateView_Day_2_en","features.messages.impl.timeline.focus_FocusRequestStateView_Night_2_en",20308,], -["features.messages.impl.timeline.focus_FocusRequestStateView_Day_3_en","features.messages.impl.timeline.focus_FocusRequestStateView_Night_3_en",20308,], +["features.messages.impl.timeline.focus_FocusRequestStateView_Day_1_en","features.messages.impl.timeline.focus_FocusRequestStateView_Night_1_en",20323,], +["features.messages.impl.timeline.focus_FocusRequestStateView_Day_2_en","features.messages.impl.timeline.focus_FocusRequestStateView_Night_2_en",20323,], +["features.messages.impl.timeline.focus_FocusRequestStateView_Day_3_en","features.messages.impl.timeline.focus_FocusRequestStateView_Night_3_en",20323,], ["features.messages.impl.timeline.components_FocusedEventEnterprise_Day_0_en","features.messages.impl.timeline.components_FocusedEventEnterprise_Night_0_en",0,], ["features.messages.impl.timeline.components_FocusedEvent_Day_0_en","features.messages.impl.timeline.components_FocusedEvent_Night_0_en",0,], ["libraries.textcomposer.components_FormattingOption_Day_0_en","libraries.textcomposer.components_FormattingOption_Night_0_en",0,], ["features.messages.impl.forward_ForwardMessagesView_Day_0_en","features.messages.impl.forward_ForwardMessagesView_Night_0_en",0,], ["features.messages.impl.forward_ForwardMessagesView_Day_1_en","features.messages.impl.forward_ForwardMessagesView_Night_1_en",0,], ["features.messages.impl.forward_ForwardMessagesView_Day_2_en","features.messages.impl.forward_ForwardMessagesView_Night_2_en",0,], -["features.messages.impl.forward_ForwardMessagesView_Day_3_en","features.messages.impl.forward_ForwardMessagesView_Night_3_en",20308,], -["features.home.impl.components_FullScreenIntentPermissionBanner_Day_0_en","features.home.impl.components_FullScreenIntentPermissionBanner_Night_0_en",20308,], +["features.messages.impl.forward_ForwardMessagesView_Day_3_en","features.messages.impl.forward_ForwardMessagesView_Night_3_en",20323,], +["features.home.impl.components_FullScreenIntentPermissionBanner_Day_0_en","features.home.impl.components_FullScreenIntentPermissionBanner_Night_0_en",20323,], ["libraries.designsystem.components.button_GradientFloatingActionButtonCircleShape_Day_0_en","libraries.designsystem.components.button_GradientFloatingActionButtonCircleShape_Night_0_en",0,], ["libraries.designsystem.components.button_GradientFloatingActionButton_Day_0_en","libraries.designsystem.components.button_GradientFloatingActionButton_Night_0_en",0,], ["features.messages.impl.timeline.components.group_GroupHeaderView_Day_0_en","features.messages.impl.timeline.components.group_GroupHeaderView_Night_0_en",0,], ["libraries.designsystem.atomic.pages_HeaderFooterPageScrollable_Day_0_en","libraries.designsystem.atomic.pages_HeaderFooterPageScrollable_Night_0_en",0,], ["libraries.designsystem.atomic.pages_HeaderFooterPage_Day_0_en","libraries.designsystem.atomic.pages_HeaderFooterPage_Night_0_en",0,], -["features.home.impl_HomeView_Day_0_en","features.home.impl_HomeView_Night_0_en",20308,], -["features.home.impl_HomeView_Day_10_en","features.home.impl_HomeView_Night_10_en",20308,], +["features.home.impl_HomeView_Day_0_en","features.home.impl_HomeView_Night_0_en",20323,], +["features.home.impl_HomeView_Day_10_en","features.home.impl_HomeView_Night_10_en",20323,], ["features.home.impl_HomeView_Day_11_en","features.home.impl_HomeView_Night_11_en",0,], ["features.home.impl_HomeView_Day_12_en","features.home.impl_HomeView_Night_12_en",0,], -["features.home.impl_HomeView_Day_13_en","features.home.impl_HomeView_Night_13_en",20308,], -["features.home.impl_HomeView_Day_14_en","features.home.impl_HomeView_Night_14_en",20308,], -["features.home.impl_HomeView_Day_15_en","features.home.impl_HomeView_Night_15_en",20308,], -["features.home.impl_HomeView_Day_1_en","features.home.impl_HomeView_Night_1_en",20308,], -["features.home.impl_HomeView_Day_2_en","features.home.impl_HomeView_Night_2_en",20308,], -["features.home.impl_HomeView_Day_3_en","features.home.impl_HomeView_Night_3_en",20308,], +["features.home.impl_HomeView_Day_13_en","features.home.impl_HomeView_Night_13_en",20323,], +["features.home.impl_HomeView_Day_14_en","features.home.impl_HomeView_Night_14_en",20323,], +["features.home.impl_HomeView_Day_15_en","features.home.impl_HomeView_Night_15_en",20323,], +["features.home.impl_HomeView_Day_1_en","features.home.impl_HomeView_Night_1_en",20323,], +["features.home.impl_HomeView_Day_2_en","features.home.impl_HomeView_Night_2_en",20323,], +["features.home.impl_HomeView_Day_3_en","features.home.impl_HomeView_Night_3_en",20323,], ["features.home.impl_HomeView_Day_4_en","features.home.impl_HomeView_Night_4_en",0,], -["features.home.impl_HomeView_Day_5_en","features.home.impl_HomeView_Night_5_en",20308,], -["features.home.impl_HomeView_Day_6_en","features.home.impl_HomeView_Night_6_en",20308,], -["features.home.impl_HomeView_Day_7_en","features.home.impl_HomeView_Night_7_en",20308,], -["features.home.impl_HomeView_Day_8_en","features.home.impl_HomeView_Night_8_en",20308,], -["features.home.impl_HomeView_Day_9_en","features.home.impl_HomeView_Night_9_en",20308,], +["features.home.impl_HomeView_Day_5_en","features.home.impl_HomeView_Night_5_en",20323,], +["features.home.impl_HomeView_Day_6_en","features.home.impl_HomeView_Night_6_en",20323,], +["features.home.impl_HomeView_Day_7_en","features.home.impl_HomeView_Night_7_en",20323,], +["features.home.impl_HomeView_Day_8_en","features.home.impl_HomeView_Night_8_en",20323,], +["features.home.impl_HomeView_Day_9_en","features.home.impl_HomeView_Night_9_en",20323,], ["libraries.designsystem.theme.components_HorizontalDivider_Dividers_en","",0,], ["libraries.designsystem.ruler_HorizontalRuler_Day_0_en","libraries.designsystem.ruler_HorizontalRuler_Night_0_en",0,], ["libraries.designsystem.theme.components_IconButton_Buttons_en","",0,], @@ -449,8 +466,8 @@ export const screenshots = [ ["libraries.designsystem.icons_IconsCompound_Day_5_en","libraries.designsystem.icons_IconsCompound_Night_5_en",0,], ["libraries.designsystem.icons_IconsOther_Day_0_en","libraries.designsystem.icons_IconsOther_Night_0_en",0,], ["features.messages.impl.crypto.identity_IdentityChangeStateView_Day_0_en","features.messages.impl.crypto.identity_IdentityChangeStateView_Night_0_en",0,], -["features.messages.impl.crypto.identity_IdentityChangeStateView_Day_1_en","features.messages.impl.crypto.identity_IdentityChangeStateView_Night_1_en",20308,], -["features.messages.impl.crypto.identity_IdentityChangeStateView_Day_2_en","features.messages.impl.crypto.identity_IdentityChangeStateView_Night_2_en",20308,], +["features.messages.impl.crypto.identity_IdentityChangeStateView_Day_1_en","features.messages.impl.crypto.identity_IdentityChangeStateView_Night_1_en",20323,], +["features.messages.impl.crypto.identity_IdentityChangeStateView_Day_2_en","features.messages.impl.crypto.identity_IdentityChangeStateView_Night_2_en",20323,], ["libraries.mediaviewer.impl.gallery.ui_ImageItemView_Day_0_en","libraries.mediaviewer.impl.gallery.ui_ImageItemView_Night_0_en",0,], ["libraries.matrix.ui.messages.reply_InReplyToView_Day_0_en","libraries.matrix.ui.messages.reply_InReplyToView_Night_0_en",0,], ["libraries.matrix.ui.messages.reply_InReplyToView_Day_10_en","libraries.matrix.ui.messages.reply_InReplyToView_Night_10_en",0,], @@ -458,86 +475,96 @@ export const screenshots = [ ["libraries.matrix.ui.messages.reply_InReplyToView_Day_1_en","libraries.matrix.ui.messages.reply_InReplyToView_Night_1_en",0,], ["libraries.matrix.ui.messages.reply_InReplyToView_Day_2_en","libraries.matrix.ui.messages.reply_InReplyToView_Night_2_en",0,], ["libraries.matrix.ui.messages.reply_InReplyToView_Day_3_en","libraries.matrix.ui.messages.reply_InReplyToView_Night_3_en",0,], -["libraries.matrix.ui.messages.reply_InReplyToView_Day_4_en","libraries.matrix.ui.messages.reply_InReplyToView_Night_4_en",20308,], +["libraries.matrix.ui.messages.reply_InReplyToView_Day_4_en","libraries.matrix.ui.messages.reply_InReplyToView_Night_4_en",20323,], ["libraries.matrix.ui.messages.reply_InReplyToView_Day_5_en","libraries.matrix.ui.messages.reply_InReplyToView_Night_5_en",0,], ["libraries.matrix.ui.messages.reply_InReplyToView_Day_6_en","libraries.matrix.ui.messages.reply_InReplyToView_Night_6_en",0,], ["libraries.matrix.ui.messages.reply_InReplyToView_Day_7_en","libraries.matrix.ui.messages.reply_InReplyToView_Night_7_en",0,], -["libraries.matrix.ui.messages.reply_InReplyToView_Day_8_en","libraries.matrix.ui.messages.reply_InReplyToView_Night_8_en",20308,], +["libraries.matrix.ui.messages.reply_InReplyToView_Day_8_en","libraries.matrix.ui.messages.reply_InReplyToView_Night_8_en",20323,], ["libraries.matrix.ui.messages.reply_InReplyToView_Day_9_en","libraries.matrix.ui.messages.reply_InReplyToView_Night_9_en",0,], -["features.call.impl.ui_IncomingCallScreen_Day_0_en","features.call.impl.ui_IncomingCallScreen_Night_0_en",20308,], -["features.verifysession.impl.incoming_IncomingVerificationView_Day_0_en","features.verifysession.impl.incoming_IncomingVerificationView_Night_0_en",20308,], -["features.verifysession.impl.incoming_IncomingVerificationView_Day_10_en","features.verifysession.impl.incoming_IncomingVerificationView_Night_10_en",20308,], -["features.verifysession.impl.incoming_IncomingVerificationView_Day_11_en","features.verifysession.impl.incoming_IncomingVerificationView_Night_11_en",20308,], -["features.verifysession.impl.incoming_IncomingVerificationView_Day_12_en","features.verifysession.impl.incoming_IncomingVerificationView_Night_12_en",20308,], -["features.verifysession.impl.incoming_IncomingVerificationView_Day_13_en","features.verifysession.impl.incoming_IncomingVerificationView_Night_13_en",20308,], -["features.verifysession.impl.incoming_IncomingVerificationView_Day_1_en","features.verifysession.impl.incoming_IncomingVerificationView_Night_1_en",20308,], -["features.verifysession.impl.incoming_IncomingVerificationView_Day_2_en","features.verifysession.impl.incoming_IncomingVerificationView_Night_2_en",20308,], -["features.verifysession.impl.incoming_IncomingVerificationView_Day_3_en","features.verifysession.impl.incoming_IncomingVerificationView_Night_3_en",20308,], -["features.verifysession.impl.incoming_IncomingVerificationView_Day_4_en","features.verifysession.impl.incoming_IncomingVerificationView_Night_4_en",20308,], -["features.verifysession.impl.incoming_IncomingVerificationView_Day_5_en","features.verifysession.impl.incoming_IncomingVerificationView_Night_5_en",20308,], -["features.verifysession.impl.incoming_IncomingVerificationView_Day_6_en","features.verifysession.impl.incoming_IncomingVerificationView_Night_6_en",20308,], -["features.verifysession.impl.incoming_IncomingVerificationView_Day_7_en","features.verifysession.impl.incoming_IncomingVerificationView_Night_7_en",20308,], -["features.verifysession.impl.incoming_IncomingVerificationView_Day_8_en","features.verifysession.impl.incoming_IncomingVerificationView_Night_8_en",20308,], -["features.verifysession.impl.incoming_IncomingVerificationView_Day_9_en","features.verifysession.impl.incoming_IncomingVerificationView_Night_9_en",20308,], +["features.call.impl.ui_IncomingCallScreen_Day_0_en","features.call.impl.ui_IncomingCallScreen_Night_0_en",20323,], +["features.verifysession.impl.incoming_IncomingVerificationView_Day_0_en","features.verifysession.impl.incoming_IncomingVerificationView_Night_0_en",20323,], +["features.verifysession.impl.incoming_IncomingVerificationView_Day_10_en","features.verifysession.impl.incoming_IncomingVerificationView_Night_10_en",20323,], +["features.verifysession.impl.incoming_IncomingVerificationView_Day_11_en","features.verifysession.impl.incoming_IncomingVerificationView_Night_11_en",20323,], +["features.verifysession.impl.incoming_IncomingVerificationView_Day_12_en","features.verifysession.impl.incoming_IncomingVerificationView_Night_12_en",20323,], +["features.verifysession.impl.incoming_IncomingVerificationView_Day_13_en","features.verifysession.impl.incoming_IncomingVerificationView_Night_13_en",20323,], +["features.verifysession.impl.incoming_IncomingVerificationView_Day_1_en","features.verifysession.impl.incoming_IncomingVerificationView_Night_1_en",20323,], +["features.verifysession.impl.incoming_IncomingVerificationView_Day_2_en","features.verifysession.impl.incoming_IncomingVerificationView_Night_2_en",20323,], +["features.verifysession.impl.incoming_IncomingVerificationView_Day_3_en","features.verifysession.impl.incoming_IncomingVerificationView_Night_3_en",20323,], +["features.verifysession.impl.incoming_IncomingVerificationView_Day_4_en","features.verifysession.impl.incoming_IncomingVerificationView_Night_4_en",20323,], +["features.verifysession.impl.incoming_IncomingVerificationView_Day_5_en","features.verifysession.impl.incoming_IncomingVerificationView_Night_5_en",20323,], +["features.verifysession.impl.incoming_IncomingVerificationView_Day_6_en","features.verifysession.impl.incoming_IncomingVerificationView_Night_6_en",20323,], +["features.verifysession.impl.incoming_IncomingVerificationView_Day_7_en","features.verifysession.impl.incoming_IncomingVerificationView_Night_7_en",20323,], +["features.verifysession.impl.incoming_IncomingVerificationView_Day_8_en","features.verifysession.impl.incoming_IncomingVerificationView_Night_8_en",20323,], +["features.verifysession.impl.incoming_IncomingVerificationView_Day_9_en","features.verifysession.impl.incoming_IncomingVerificationView_Night_9_en",20323,], ["features.networkmonitor.api.ui_Indicator_Day_0_en","features.networkmonitor.api.ui_Indicator_Night_0_en",0,], ["libraries.designsystem.atomic.molecules_InfoListItemMolecule_Day_0_en","libraries.designsystem.atomic.molecules_InfoListItemMolecule_Night_0_en",0,], ["libraries.designsystem.atomic.organisms_InfoListOrganism_Day_0_en","libraries.designsystem.atomic.organisms_InfoListOrganism_Night_0_en",0,], -["features.call.impl.ui_InvalidAudioDeviceDialog_Day_0_en","features.call.impl.ui_InvalidAudioDeviceDialog_Night_0_en",20308,], -["libraries.matrix.ui.components_InviteSenderView_Day_0_en","libraries.matrix.ui.components_InviteSenderView_Night_0_en",20308,], -["features.createroom.impl.joinbyaddress_JoinRoomByAddressView_Day_0_en","features.createroom.impl.joinbyaddress_JoinRoomByAddressView_Night_0_en",20308,], -["features.createroom.impl.joinbyaddress_JoinRoomByAddressView_Day_1_en","features.createroom.impl.joinbyaddress_JoinRoomByAddressView_Night_1_en",20308,], -["features.createroom.impl.joinbyaddress_JoinRoomByAddressView_Day_2_en","features.createroom.impl.joinbyaddress_JoinRoomByAddressView_Night_2_en",20308,], -["features.createroom.impl.joinbyaddress_JoinRoomByAddressView_Day_3_en","features.createroom.impl.joinbyaddress_JoinRoomByAddressView_Night_3_en",20308,], -["features.createroom.impl.joinbyaddress_JoinRoomByAddressView_Day_4_en","features.createroom.impl.joinbyaddress_JoinRoomByAddressView_Night_4_en",20308,], -["features.createroom.impl.joinbyaddress_JoinRoomByAddressView_Day_5_en","features.createroom.impl.joinbyaddress_JoinRoomByAddressView_Night_5_en",20308,], +["libraries.matrix.ui.media_InitialsAvatarBitmapGenerator_Day_0_en","libraries.matrix.ui.media_InitialsAvatarBitmapGenerator_Night_0_en",0,], +["features.call.impl.ui_InvalidAudioDeviceDialog_Day_0_en","features.call.impl.ui_InvalidAudioDeviceDialog_Night_0_en",20323,], +["features.invitepeople.impl_InvitePeopleView_Day_0_en","features.invitepeople.impl_InvitePeopleView_Night_0_en",20323,], +["features.invitepeople.impl_InvitePeopleView_Day_1_en","features.invitepeople.impl_InvitePeopleView_Night_1_en",20323,], +["features.invitepeople.impl_InvitePeopleView_Day_2_en","features.invitepeople.impl_InvitePeopleView_Night_2_en",0,], +["features.invitepeople.impl_InvitePeopleView_Day_3_en","features.invitepeople.impl_InvitePeopleView_Night_3_en",0,], +["features.invitepeople.impl_InvitePeopleView_Day_4_en","features.invitepeople.impl_InvitePeopleView_Night_4_en",20323,], +["features.invitepeople.impl_InvitePeopleView_Day_5_en","features.invitepeople.impl_InvitePeopleView_Night_5_en",20323,], +["features.invitepeople.impl_InvitePeopleView_Day_6_en","features.invitepeople.impl_InvitePeopleView_Night_6_en",20323,], +["features.invitepeople.impl_InvitePeopleView_Day_7_en","features.invitepeople.impl_InvitePeopleView_Night_7_en",20323,], +["features.invitepeople.impl_InvitePeopleView_Day_8_en","features.invitepeople.impl_InvitePeopleView_Night_8_en",0,], +["libraries.matrix.ui.components_InviteSenderView_Day_0_en","libraries.matrix.ui.components_InviteSenderView_Night_0_en",20323,], +["features.startchat.impl.joinbyaddress_JoinRoomByAddressView_Day_0_en","features.startchat.impl.joinbyaddress_JoinRoomByAddressView_Night_0_en",20323,], +["features.startchat.impl.joinbyaddress_JoinRoomByAddressView_Day_1_en","features.startchat.impl.joinbyaddress_JoinRoomByAddressView_Night_1_en",20323,], +["features.startchat.impl.joinbyaddress_JoinRoomByAddressView_Day_2_en","features.startchat.impl.joinbyaddress_JoinRoomByAddressView_Night_2_en",20323,], +["features.startchat.impl.joinbyaddress_JoinRoomByAddressView_Day_3_en","features.startchat.impl.joinbyaddress_JoinRoomByAddressView_Night_3_en",20323,], +["features.startchat.impl.joinbyaddress_JoinRoomByAddressView_Day_4_en","features.startchat.impl.joinbyaddress_JoinRoomByAddressView_Night_4_en",20323,], +["features.startchat.impl.joinbyaddress_JoinRoomByAddressView_Day_5_en","features.startchat.impl.joinbyaddress_JoinRoomByAddressView_Night_5_en",20323,], ["features.joinroom.impl_JoinRoomView_Day_0_en","features.joinroom.impl_JoinRoomView_Night_0_en",0,], -["features.joinroom.impl_JoinRoomView_Day_10_en","features.joinroom.impl_JoinRoomView_Night_10_en",20308,], -["features.joinroom.impl_JoinRoomView_Day_11_en","features.joinroom.impl_JoinRoomView_Night_11_en",20308,], -["features.joinroom.impl_JoinRoomView_Day_12_en","features.joinroom.impl_JoinRoomView_Night_12_en",20308,], -["features.joinroom.impl_JoinRoomView_Day_13_en","features.joinroom.impl_JoinRoomView_Night_13_en",20308,], -["features.joinroom.impl_JoinRoomView_Day_14_en","features.joinroom.impl_JoinRoomView_Night_14_en",20308,], -["features.joinroom.impl_JoinRoomView_Day_15_en","features.joinroom.impl_JoinRoomView_Night_15_en",20308,], -["features.joinroom.impl_JoinRoomView_Day_16_en","features.joinroom.impl_JoinRoomView_Night_16_en",20308,], -["features.joinroom.impl_JoinRoomView_Day_1_en","features.joinroom.impl_JoinRoomView_Night_1_en",20308,], -["features.joinroom.impl_JoinRoomView_Day_2_en","features.joinroom.impl_JoinRoomView_Night_2_en",20308,], -["features.joinroom.impl_JoinRoomView_Day_3_en","features.joinroom.impl_JoinRoomView_Night_3_en",20308,], -["features.joinroom.impl_JoinRoomView_Day_4_en","features.joinroom.impl_JoinRoomView_Night_4_en",20308,], -["features.joinroom.impl_JoinRoomView_Day_5_en","features.joinroom.impl_JoinRoomView_Night_5_en",20308,], -["features.joinroom.impl_JoinRoomView_Day_6_en","features.joinroom.impl_JoinRoomView_Night_6_en",20308,], -["features.joinroom.impl_JoinRoomView_Day_7_en","features.joinroom.impl_JoinRoomView_Night_7_en",20308,], -["features.joinroom.impl_JoinRoomView_Day_8_en","features.joinroom.impl_JoinRoomView_Night_8_en",20308,], -["features.joinroom.impl_JoinRoomView_Day_9_en","features.joinroom.impl_JoinRoomView_Night_9_en",20308,], -["features.knockrequests.impl.banner_KnockRequestsBannerView_Day_0_en","features.knockrequests.impl.banner_KnockRequestsBannerView_Night_0_en",20308,], -["features.knockrequests.impl.banner_KnockRequestsBannerView_Day_1_en","features.knockrequests.impl.banner_KnockRequestsBannerView_Night_1_en",20308,], -["features.knockrequests.impl.banner_KnockRequestsBannerView_Day_2_en","features.knockrequests.impl.banner_KnockRequestsBannerView_Night_2_en",20308,], -["features.knockrequests.impl.banner_KnockRequestsBannerView_Day_3_en","features.knockrequests.impl.banner_KnockRequestsBannerView_Night_3_en",20308,], -["features.knockrequests.impl.banner_KnockRequestsBannerView_Day_4_en","features.knockrequests.impl.banner_KnockRequestsBannerView_Night_4_en",20308,], -["features.knockrequests.impl.banner_KnockRequestsBannerView_Day_5_en","features.knockrequests.impl.banner_KnockRequestsBannerView_Night_5_en",20308,], -["features.knockrequests.impl.banner_KnockRequestsBannerView_Day_6_en","features.knockrequests.impl.banner_KnockRequestsBannerView_Night_6_en",20308,], -["features.knockrequests.impl.list_KnockRequestsListView_Day_0_en","features.knockrequests.impl.list_KnockRequestsListView_Night_0_en",20308,], -["features.knockrequests.impl.list_KnockRequestsListView_Day_10_en","features.knockrequests.impl.list_KnockRequestsListView_Night_10_en",20308,], -["features.knockrequests.impl.list_KnockRequestsListView_Day_1_en","features.knockrequests.impl.list_KnockRequestsListView_Night_1_en",20308,], -["features.knockrequests.impl.list_KnockRequestsListView_Day_2_en","features.knockrequests.impl.list_KnockRequestsListView_Night_2_en",20308,], -["features.knockrequests.impl.list_KnockRequestsListView_Day_3_en","features.knockrequests.impl.list_KnockRequestsListView_Night_3_en",20308,], -["features.knockrequests.impl.list_KnockRequestsListView_Day_4_en","features.knockrequests.impl.list_KnockRequestsListView_Night_4_en",20308,], -["features.knockrequests.impl.list_KnockRequestsListView_Day_5_en","features.knockrequests.impl.list_KnockRequestsListView_Night_5_en",20308,], -["features.knockrequests.impl.list_KnockRequestsListView_Day_6_en","features.knockrequests.impl.list_KnockRequestsListView_Night_6_en",20308,], -["features.knockrequests.impl.list_KnockRequestsListView_Day_7_en","features.knockrequests.impl.list_KnockRequestsListView_Night_7_en",20308,], -["features.knockrequests.impl.list_KnockRequestsListView_Day_8_en","features.knockrequests.impl.list_KnockRequestsListView_Night_8_en",20308,], -["features.knockrequests.impl.list_KnockRequestsListView_Day_9_en","features.knockrequests.impl.list_KnockRequestsListView_Night_9_en",20308,], +["features.joinroom.impl_JoinRoomView_Day_10_en","features.joinroom.impl_JoinRoomView_Night_10_en",20323,], +["features.joinroom.impl_JoinRoomView_Day_11_en","features.joinroom.impl_JoinRoomView_Night_11_en",20323,], +["features.joinroom.impl_JoinRoomView_Day_12_en","features.joinroom.impl_JoinRoomView_Night_12_en",20323,], +["features.joinroom.impl_JoinRoomView_Day_13_en","features.joinroom.impl_JoinRoomView_Night_13_en",20323,], +["features.joinroom.impl_JoinRoomView_Day_14_en","features.joinroom.impl_JoinRoomView_Night_14_en",20323,], +["features.joinroom.impl_JoinRoomView_Day_15_en","features.joinroom.impl_JoinRoomView_Night_15_en",20323,], +["features.joinroom.impl_JoinRoomView_Day_16_en","features.joinroom.impl_JoinRoomView_Night_16_en",20323,], +["features.joinroom.impl_JoinRoomView_Day_1_en","features.joinroom.impl_JoinRoomView_Night_1_en",20323,], +["features.joinroom.impl_JoinRoomView_Day_2_en","features.joinroom.impl_JoinRoomView_Night_2_en",20323,], +["features.joinroom.impl_JoinRoomView_Day_3_en","features.joinroom.impl_JoinRoomView_Night_3_en",20323,], +["features.joinroom.impl_JoinRoomView_Day_4_en","features.joinroom.impl_JoinRoomView_Night_4_en",20323,], +["features.joinroom.impl_JoinRoomView_Day_5_en","features.joinroom.impl_JoinRoomView_Night_5_en",20323,], +["features.joinroom.impl_JoinRoomView_Day_6_en","features.joinroom.impl_JoinRoomView_Night_6_en",20323,], +["features.joinroom.impl_JoinRoomView_Day_7_en","features.joinroom.impl_JoinRoomView_Night_7_en",20323,], +["features.joinroom.impl_JoinRoomView_Day_8_en","features.joinroom.impl_JoinRoomView_Night_8_en",20323,], +["features.joinroom.impl_JoinRoomView_Day_9_en","features.joinroom.impl_JoinRoomView_Night_9_en",20323,], +["features.knockrequests.impl.banner_KnockRequestsBannerView_Day_0_en","features.knockrequests.impl.banner_KnockRequestsBannerView_Night_0_en",20323,], +["features.knockrequests.impl.banner_KnockRequestsBannerView_Day_1_en","features.knockrequests.impl.banner_KnockRequestsBannerView_Night_1_en",20323,], +["features.knockrequests.impl.banner_KnockRequestsBannerView_Day_2_en","features.knockrequests.impl.banner_KnockRequestsBannerView_Night_2_en",20323,], +["features.knockrequests.impl.banner_KnockRequestsBannerView_Day_3_en","features.knockrequests.impl.banner_KnockRequestsBannerView_Night_3_en",20323,], +["features.knockrequests.impl.banner_KnockRequestsBannerView_Day_4_en","features.knockrequests.impl.banner_KnockRequestsBannerView_Night_4_en",20323,], +["features.knockrequests.impl.banner_KnockRequestsBannerView_Day_5_en","features.knockrequests.impl.banner_KnockRequestsBannerView_Night_5_en",20323,], +["features.knockrequests.impl.banner_KnockRequestsBannerView_Day_6_en","features.knockrequests.impl.banner_KnockRequestsBannerView_Night_6_en",20323,], +["features.knockrequests.impl.list_KnockRequestsListView_Day_0_en","features.knockrequests.impl.list_KnockRequestsListView_Night_0_en",20323,], +["features.knockrequests.impl.list_KnockRequestsListView_Day_10_en","features.knockrequests.impl.list_KnockRequestsListView_Night_10_en",20323,], +["features.knockrequests.impl.list_KnockRequestsListView_Day_1_en","features.knockrequests.impl.list_KnockRequestsListView_Night_1_en",20323,], +["features.knockrequests.impl.list_KnockRequestsListView_Day_2_en","features.knockrequests.impl.list_KnockRequestsListView_Night_2_en",20323,], +["features.knockrequests.impl.list_KnockRequestsListView_Day_3_en","features.knockrequests.impl.list_KnockRequestsListView_Night_3_en",20323,], +["features.knockrequests.impl.list_KnockRequestsListView_Day_4_en","features.knockrequests.impl.list_KnockRequestsListView_Night_4_en",20323,], +["features.knockrequests.impl.list_KnockRequestsListView_Day_5_en","features.knockrequests.impl.list_KnockRequestsListView_Night_5_en",20323,], +["features.knockrequests.impl.list_KnockRequestsListView_Day_6_en","features.knockrequests.impl.list_KnockRequestsListView_Night_6_en",20323,], +["features.knockrequests.impl.list_KnockRequestsListView_Day_7_en","features.knockrequests.impl.list_KnockRequestsListView_Night_7_en",20323,], +["features.knockrequests.impl.list_KnockRequestsListView_Day_8_en","features.knockrequests.impl.list_KnockRequestsListView_Night_8_en",20323,], +["features.knockrequests.impl.list_KnockRequestsListView_Day_9_en","features.knockrequests.impl.list_KnockRequestsListView_Night_9_en",20323,], ["libraries.designsystem.components_LabelledCheckbox_Toggles_en","",0,], ["features.leaveroom.impl_LeaveRoomView_Day_0_en","features.leaveroom.impl_LeaveRoomView_Night_0_en",0,], -["features.leaveroom.impl_LeaveRoomView_Day_1_en","features.leaveroom.impl_LeaveRoomView_Night_1_en",0,], -["features.leaveroom.impl_LeaveRoomView_Day_2_en","features.leaveroom.impl_LeaveRoomView_Night_2_en",0,], -["features.leaveroom.impl_LeaveRoomView_Day_3_en","features.leaveroom.impl_LeaveRoomView_Night_3_en",0,], -["features.leaveroom.impl_LeaveRoomView_Day_4_en","features.leaveroom.impl_LeaveRoomView_Night_4_en",0,], -["features.leaveroom.impl_LeaveRoomView_Day_5_en","features.leaveroom.impl_LeaveRoomView_Night_5_en",0,], -["features.leaveroom.impl_LeaveRoomView_Day_6_en","features.leaveroom.impl_LeaveRoomView_Night_6_en",0,], -["features.leaveroom.impl_LeaveRoomView_Day_7_en","features.leaveroom.impl_LeaveRoomView_Night_7_en",0,], +["features.leaveroom.impl_LeaveRoomView_Day_1_en","features.leaveroom.impl_LeaveRoomView_Night_1_en",20323,], +["features.leaveroom.impl_LeaveRoomView_Day_2_en","features.leaveroom.impl_LeaveRoomView_Night_2_en",20323,], +["features.leaveroom.impl_LeaveRoomView_Day_3_en","features.leaveroom.impl_LeaveRoomView_Night_3_en",20323,], +["features.leaveroom.impl_LeaveRoomView_Day_4_en","features.leaveroom.impl_LeaveRoomView_Night_4_en",20323,], +["features.leaveroom.impl_LeaveRoomView_Day_5_en","features.leaveroom.impl_LeaveRoomView_Night_5_en",20323,], +["features.leaveroom.impl_LeaveRoomView_Day_6_en","features.leaveroom.impl_LeaveRoomView_Night_6_en",20323,], +["features.leaveroom.impl_LeaveRoomView_Day_7_en","features.leaveroom.impl_LeaveRoomView_Night_7_en",20323,], ["libraries.designsystem.background_LightGradientBackground_Day_0_en","libraries.designsystem.background_LightGradientBackground_Night_0_en",0,], ["libraries.designsystem.theme.components_LinearProgressIndicator_Progress_Indicators_en","",0,], ["features.messages.impl.link_LinkView_Day_0_en","features.messages.impl.link_LinkView_Night_0_en",0,], -["features.messages.impl.link_LinkView_Day_1_en","features.messages.impl.link_LinkView_Night_1_en",20308,], +["features.messages.impl.link_LinkView_Day_1_en","features.messages.impl.link_LinkView_Night_1_en",20323,], ["libraries.designsystem.components.dialogs_ListDialogContent_Dialogs_en","",0,], ["libraries.designsystem.components.dialogs_ListDialog_Day_0_en","libraries.designsystem.components.dialogs_ListDialog_Night_0_en",0,], ["libraries.designsystem.theme.components_ListItemPrimaryActionWithIcon_List_item_-_Primary_action_&_Icon_List_items_en","",0,], @@ -592,36 +619,36 @@ export const screenshots = [ ["libraries.designsystem.theme.components_ListSupportingTextSmallPadding_List_supporting_text_-_small_padding_List_sections_en","",0,], ["libraries.textcomposer.components_LiveWaveformView_Day_0_en","libraries.textcomposer.components_LiveWaveformView_Night_0_en",0,], ["appnav.room.joined_LoadingRoomNodeView_Day_0_en","appnav.room.joined_LoadingRoomNodeView_Night_0_en",0,], -["appnav.room.joined_LoadingRoomNodeView_Day_1_en","appnav.room.joined_LoadingRoomNodeView_Night_1_en",20308,], -["features.lockscreen.impl.settings_LockScreenSettingsView_Day_0_en","features.lockscreen.impl.settings_LockScreenSettingsView_Night_0_en",20308,], -["features.lockscreen.impl.settings_LockScreenSettingsView_Day_1_en","features.lockscreen.impl.settings_LockScreenSettingsView_Night_1_en",20308,], -["features.lockscreen.impl.settings_LockScreenSettingsView_Day_2_en","features.lockscreen.impl.settings_LockScreenSettingsView_Night_2_en",20308,], +["appnav.room.joined_LoadingRoomNodeView_Day_1_en","appnav.room.joined_LoadingRoomNodeView_Night_1_en",20323,], +["features.lockscreen.impl.settings_LockScreenSettingsView_Day_0_en","features.lockscreen.impl.settings_LockScreenSettingsView_Night_0_en",20323,], +["features.lockscreen.impl.settings_LockScreenSettingsView_Day_1_en","features.lockscreen.impl.settings_LockScreenSettingsView_Night_1_en",20323,], +["features.lockscreen.impl.settings_LockScreenSettingsView_Day_2_en","features.lockscreen.impl.settings_LockScreenSettingsView_Night_2_en",20323,], ["appnav.loggedin_LoggedInView_Day_0_en","appnav.loggedin_LoggedInView_Night_0_en",0,], -["appnav.loggedin_LoggedInView_Day_1_en","appnav.loggedin_LoggedInView_Night_1_en",20308,], -["appnav.loggedin_LoggedInView_Day_2_en","appnav.loggedin_LoggedInView_Night_2_en",20308,], -["appnav.loggedin_LoggedInView_Day_3_en","appnav.loggedin_LoggedInView_Night_3_en",20308,], -["features.login.impl.login_LoginModeView_Day_0_en","features.login.impl.login_LoginModeView_Night_0_en",0,], -["features.login.impl.login_LoginModeView_Day_1_en","features.login.impl.login_LoginModeView_Night_1_en",0,], -["features.login.impl.login_LoginModeView_Day_2_en","features.login.impl.login_LoginModeView_Night_2_en",0,], -["features.login.impl.login_LoginModeView_Day_3_en","features.login.impl.login_LoginModeView_Night_3_en",0,], -["features.login.impl.login_LoginModeView_Day_4_en","features.login.impl.login_LoginModeView_Night_4_en",0,], -["features.login.impl.screens.loginpassword_LoginPasswordView_Day_0_en","features.login.impl.screens.loginpassword_LoginPasswordView_Night_0_en",20308,], -["features.login.impl.screens.loginpassword_LoginPasswordView_Day_1_en","features.login.impl.screens.loginpassword_LoginPasswordView_Night_1_en",20308,], -["features.login.impl.screens.loginpassword_LoginPasswordView_Day_2_en","features.login.impl.screens.loginpassword_LoginPasswordView_Night_2_en",20308,], -["features.logout.impl_LogoutView_Day_0_en","features.logout.impl_LogoutView_Night_0_en",20308,], -["features.logout.impl_LogoutView_Day_10_en","features.logout.impl_LogoutView_Night_10_en",20308,], -["features.logout.impl_LogoutView_Day_11_en","features.logout.impl_LogoutView_Night_11_en",20308,], -["features.logout.impl_LogoutView_Day_1_en","features.logout.impl_LogoutView_Night_1_en",20308,], -["features.logout.impl_LogoutView_Day_2_en","features.logout.impl_LogoutView_Night_2_en",20308,], -["features.logout.impl_LogoutView_Day_3_en","features.logout.impl_LogoutView_Night_3_en",20308,], -["features.logout.impl_LogoutView_Day_4_en","features.logout.impl_LogoutView_Night_4_en",20308,], -["features.logout.impl_LogoutView_Day_5_en","features.logout.impl_LogoutView_Night_5_en",20308,], -["features.logout.impl_LogoutView_Day_6_en","features.logout.impl_LogoutView_Night_6_en",20308,], -["features.logout.impl_LogoutView_Day_7_en","features.logout.impl_LogoutView_Night_7_en",20308,], -["features.logout.impl_LogoutView_Day_8_en","features.logout.impl_LogoutView_Night_8_en",20308,], -["features.logout.impl_LogoutView_Day_9_en","features.logout.impl_LogoutView_Night_9_en",20308,], +["appnav.loggedin_LoggedInView_Day_1_en","appnav.loggedin_LoggedInView_Night_1_en",20323,], +["appnav.loggedin_LoggedInView_Day_2_en","appnav.loggedin_LoggedInView_Night_2_en",20323,], +["appnav.loggedin_LoggedInView_Day_3_en","appnav.loggedin_LoggedInView_Night_3_en",20323,], +["features.login.impl.login_LoginModeView_Day_0_en","features.login.impl.login_LoginModeView_Night_0_en",20323,], +["features.login.impl.login_LoginModeView_Day_1_en","features.login.impl.login_LoginModeView_Night_1_en",20323,], +["features.login.impl.login_LoginModeView_Day_2_en","features.login.impl.login_LoginModeView_Night_2_en",20323,], +["features.login.impl.login_LoginModeView_Day_3_en","features.login.impl.login_LoginModeView_Night_3_en",20323,], +["features.login.impl.login_LoginModeView_Day_4_en","features.login.impl.login_LoginModeView_Night_4_en",20323,], +["features.login.impl.screens.loginpassword_LoginPasswordView_Day_0_en","features.login.impl.screens.loginpassword_LoginPasswordView_Night_0_en",20323,], +["features.login.impl.screens.loginpassword_LoginPasswordView_Day_1_en","features.login.impl.screens.loginpassword_LoginPasswordView_Night_1_en",20323,], +["features.login.impl.screens.loginpassword_LoginPasswordView_Day_2_en","features.login.impl.screens.loginpassword_LoginPasswordView_Night_2_en",20323,], +["features.logout.impl_LogoutView_Day_0_en","features.logout.impl_LogoutView_Night_0_en",20323,], +["features.logout.impl_LogoutView_Day_10_en","features.logout.impl_LogoutView_Night_10_en",20323,], +["features.logout.impl_LogoutView_Day_11_en","features.logout.impl_LogoutView_Night_11_en",20323,], +["features.logout.impl_LogoutView_Day_1_en","features.logout.impl_LogoutView_Night_1_en",20323,], +["features.logout.impl_LogoutView_Day_2_en","features.logout.impl_LogoutView_Night_2_en",20323,], +["features.logout.impl_LogoutView_Day_3_en","features.logout.impl_LogoutView_Night_3_en",20323,], +["features.logout.impl_LogoutView_Day_4_en","features.logout.impl_LogoutView_Night_4_en",20323,], +["features.logout.impl_LogoutView_Day_5_en","features.logout.impl_LogoutView_Night_5_en",20323,], +["features.logout.impl_LogoutView_Day_6_en","features.logout.impl_LogoutView_Night_6_en",20323,], +["features.logout.impl_LogoutView_Day_7_en","features.logout.impl_LogoutView_Night_7_en",20323,], +["features.logout.impl_LogoutView_Day_8_en","features.logout.impl_LogoutView_Night_8_en",20323,], +["features.logout.impl_LogoutView_Day_9_en","features.logout.impl_LogoutView_Night_9_en",20323,], ["libraries.designsystem.components.button_MainActionButton_Buttons_en","",0,], -["libraries.textcomposer_MarkdownTextComposerEdit_Day_0_en","libraries.textcomposer_MarkdownTextComposerEdit_Night_0_en",20308,], +["libraries.textcomposer_MarkdownTextComposerEdit_Day_0_en","libraries.textcomposer_MarkdownTextComposerEdit_Night_0_en",20323,], ["libraries.textcomposer.components.markdown_MarkdownTextInput_Day_0_en","libraries.textcomposer.components.markdown_MarkdownTextInput_Night_0_en",0,], ["libraries.designsystem.atomic.atoms_MatrixBadgeAtomInfo_Day_0_en","libraries.designsystem.atomic.atoms_MatrixBadgeAtomInfo_Night_0_en",0,], ["libraries.designsystem.atomic.atoms_MatrixBadgeAtomNegative_Day_0_en","libraries.designsystem.atomic.atoms_MatrixBadgeAtomNegative_Night_0_en",0,], @@ -634,22 +661,22 @@ export const screenshots = [ ["libraries.matrix.ui.components_MatrixUserRow_Day_1_en","libraries.matrix.ui.components_MatrixUserRow_Night_1_en",0,], ["libraries.mediaviewer.impl.local.audio_MediaAudioView_Day_0_en","libraries.mediaviewer.impl.local.audio_MediaAudioView_Night_0_en",0,], ["libraries.mediaviewer.impl.local.audio_MediaAudioView_Day_1_en","libraries.mediaviewer.impl.local.audio_MediaAudioView_Night_1_en",0,], -["libraries.mediaviewer.impl.details_MediaDeleteConfirmationBottomSheet_Day_0_en","libraries.mediaviewer.impl.details_MediaDeleteConfirmationBottomSheet_Night_0_en",20308,], -["libraries.mediaviewer.impl.details_MediaDetailsBottomSheet_Day_0_en","libraries.mediaviewer.impl.details_MediaDetailsBottomSheet_Night_0_en",20308,], +["libraries.mediaviewer.impl.details_MediaDeleteConfirmationBottomSheet_Day_0_en","libraries.mediaviewer.impl.details_MediaDeleteConfirmationBottomSheet_Night_0_en",20323,], +["libraries.mediaviewer.impl.details_MediaDetailsBottomSheet_Day_0_en","libraries.mediaviewer.impl.details_MediaDetailsBottomSheet_Night_0_en",20323,], ["libraries.mediaviewer.impl.local.file_MediaFileView_Day_0_en","libraries.mediaviewer.impl.local.file_MediaFileView_Night_0_en",0,], -["libraries.mediaviewer.impl.gallery_MediaGalleryView_Day_0_en","libraries.mediaviewer.impl.gallery_MediaGalleryView_Night_0_en",20308,], -["libraries.mediaviewer.impl.gallery_MediaGalleryView_Day_10_en","libraries.mediaviewer.impl.gallery_MediaGalleryView_Night_10_en",20308,], -["libraries.mediaviewer.impl.gallery_MediaGalleryView_Day_11_en","libraries.mediaviewer.impl.gallery_MediaGalleryView_Night_11_en",20308,], -["libraries.mediaviewer.impl.gallery_MediaGalleryView_Day_12_en","libraries.mediaviewer.impl.gallery_MediaGalleryView_Night_12_en",20308,], -["libraries.mediaviewer.impl.gallery_MediaGalleryView_Day_1_en","libraries.mediaviewer.impl.gallery_MediaGalleryView_Night_1_en",20308,], -["libraries.mediaviewer.impl.gallery_MediaGalleryView_Day_2_en","libraries.mediaviewer.impl.gallery_MediaGalleryView_Night_2_en",20308,], -["libraries.mediaviewer.impl.gallery_MediaGalleryView_Day_3_en","libraries.mediaviewer.impl.gallery_MediaGalleryView_Night_3_en",20308,], -["libraries.mediaviewer.impl.gallery_MediaGalleryView_Day_4_en","libraries.mediaviewer.impl.gallery_MediaGalleryView_Night_4_en",20308,], -["libraries.mediaviewer.impl.gallery_MediaGalleryView_Day_5_en","libraries.mediaviewer.impl.gallery_MediaGalleryView_Night_5_en",20308,], -["libraries.mediaviewer.impl.gallery_MediaGalleryView_Day_6_en","libraries.mediaviewer.impl.gallery_MediaGalleryView_Night_6_en",20308,], -["libraries.mediaviewer.impl.gallery_MediaGalleryView_Day_7_en","libraries.mediaviewer.impl.gallery_MediaGalleryView_Night_7_en",20308,], -["libraries.mediaviewer.impl.gallery_MediaGalleryView_Day_8_en","libraries.mediaviewer.impl.gallery_MediaGalleryView_Night_8_en",20308,], -["libraries.mediaviewer.impl.gallery_MediaGalleryView_Day_9_en","libraries.mediaviewer.impl.gallery_MediaGalleryView_Night_9_en",20308,], +["libraries.mediaviewer.impl.gallery_MediaGalleryView_Day_0_en","libraries.mediaviewer.impl.gallery_MediaGalleryView_Night_0_en",20323,], +["libraries.mediaviewer.impl.gallery_MediaGalleryView_Day_10_en","libraries.mediaviewer.impl.gallery_MediaGalleryView_Night_10_en",20323,], +["libraries.mediaviewer.impl.gallery_MediaGalleryView_Day_11_en","libraries.mediaviewer.impl.gallery_MediaGalleryView_Night_11_en",20323,], +["libraries.mediaviewer.impl.gallery_MediaGalleryView_Day_12_en","libraries.mediaviewer.impl.gallery_MediaGalleryView_Night_12_en",20323,], +["libraries.mediaviewer.impl.gallery_MediaGalleryView_Day_1_en","libraries.mediaviewer.impl.gallery_MediaGalleryView_Night_1_en",20323,], +["libraries.mediaviewer.impl.gallery_MediaGalleryView_Day_2_en","libraries.mediaviewer.impl.gallery_MediaGalleryView_Night_2_en",20323,], +["libraries.mediaviewer.impl.gallery_MediaGalleryView_Day_3_en","libraries.mediaviewer.impl.gallery_MediaGalleryView_Night_3_en",20323,], +["libraries.mediaviewer.impl.gallery_MediaGalleryView_Day_4_en","libraries.mediaviewer.impl.gallery_MediaGalleryView_Night_4_en",20323,], +["libraries.mediaviewer.impl.gallery_MediaGalleryView_Day_5_en","libraries.mediaviewer.impl.gallery_MediaGalleryView_Night_5_en",20323,], +["libraries.mediaviewer.impl.gallery_MediaGalleryView_Day_6_en","libraries.mediaviewer.impl.gallery_MediaGalleryView_Night_6_en",20323,], +["libraries.mediaviewer.impl.gallery_MediaGalleryView_Day_7_en","libraries.mediaviewer.impl.gallery_MediaGalleryView_Night_7_en",20323,], +["libraries.mediaviewer.impl.gallery_MediaGalleryView_Day_8_en","libraries.mediaviewer.impl.gallery_MediaGalleryView_Night_8_en",20323,], +["libraries.mediaviewer.impl.gallery_MediaGalleryView_Day_9_en","libraries.mediaviewer.impl.gallery_MediaGalleryView_Night_9_en",20323,], ["libraries.mediaviewer.impl.local.image_MediaImageView_Day_0_en","libraries.mediaviewer.impl.local.image_MediaImageView_Night_0_en",0,], ["libraries.mediaviewer.impl.local.player_MediaPlayerControllerView_Day_0_en","libraries.mediaviewer.impl.local.player_MediaPlayerControllerView_Night_0_en",0,], ["libraries.mediaviewer.impl.local.player_MediaPlayerControllerView_Day_1_en","libraries.mediaviewer.impl.local.player_MediaPlayerControllerView_Night_1_en",0,], @@ -657,14 +684,14 @@ export const screenshots = [ ["libraries.mediaviewer.impl.local.video_MediaVideoView_Day_0_en","libraries.mediaviewer.impl.local.video_MediaVideoView_Night_0_en",0,], ["libraries.mediaviewer.impl.viewer_MediaViewerView_0_en","",0,], ["libraries.mediaviewer.impl.viewer_MediaViewerView_10_en","",0,], -["libraries.mediaviewer.impl.viewer_MediaViewerView_11_en","",20308,], -["libraries.mediaviewer.impl.viewer_MediaViewerView_12_en","",20308,], +["libraries.mediaviewer.impl.viewer_MediaViewerView_11_en","",20323,], +["libraries.mediaviewer.impl.viewer_MediaViewerView_12_en","",20323,], ["libraries.mediaviewer.impl.viewer_MediaViewerView_13_en","",0,], -["libraries.mediaviewer.impl.viewer_MediaViewerView_14_en","",20308,], +["libraries.mediaviewer.impl.viewer_MediaViewerView_14_en","",20323,], ["libraries.mediaviewer.impl.viewer_MediaViewerView_15_en","",0,], ["libraries.mediaviewer.impl.viewer_MediaViewerView_16_en","",0,], ["libraries.mediaviewer.impl.viewer_MediaViewerView_1_en","",0,], -["libraries.mediaviewer.impl.viewer_MediaViewerView_2_en","",20308,], +["libraries.mediaviewer.impl.viewer_MediaViewerView_2_en","",20323,], ["libraries.mediaviewer.impl.viewer_MediaViewerView_3_en","",0,], ["libraries.mediaviewer.impl.viewer_MediaViewerView_4_en","",0,], ["libraries.mediaviewer.impl.viewer_MediaViewerView_5_en","",0,], @@ -673,11 +700,12 @@ export const screenshots = [ ["libraries.mediaviewer.impl.viewer_MediaViewerView_8_en","",0,], ["libraries.mediaviewer.impl.viewer_MediaViewerView_9_en","",0,], ["libraries.designsystem.theme.components_MediumTopAppBar_App_Bars_en","",0,], +["libraries.designsystem.atomic.molecules_MembersCountMolecule_Day_0_en","libraries.designsystem.atomic.molecules_MembersCountMolecule_Night_0_en",0,], ["libraries.textcomposer.mentions_MentionSpanThemeInTimeline_Day_0_en","libraries.textcomposer.mentions_MentionSpanThemeInTimeline_Night_0_en",0,], ["libraries.textcomposer.mentions_MentionSpanTheme_Day_0_en","libraries.textcomposer.mentions_MentionSpanTheme_Night_0_en",0,], ["libraries.designsystem.theme.components.previews_Menu_Menus_en","",0,], ["features.messages.impl.messagecomposer_MessageComposerViewVoice_Day_0_en","features.messages.impl.messagecomposer_MessageComposerViewVoice_Night_0_en",0,], -["features.messages.impl.messagecomposer_MessageComposerView_Day_0_en","features.messages.impl.messagecomposer_MessageComposerView_Night_0_en",20308,], +["features.messages.impl.messagecomposer_MessageComposerView_Day_0_en","features.messages.impl.messagecomposer_MessageComposerView_Night_0_en",20323,], ["features.messages.impl.timeline.components_MessageEventBubble_Day_0_en","features.messages.impl.timeline.components_MessageEventBubble_Night_0_en",0,], ["features.messages.impl.timeline.components_MessageEventBubble_Day_1_en","features.messages.impl.timeline.components_MessageEventBubble_Night_1_en",0,], ["features.messages.impl.timeline.components_MessageEventBubble_Day_2_en","features.messages.impl.timeline.components_MessageEventBubble_Night_2_en",0,], @@ -686,7 +714,7 @@ export const screenshots = [ ["features.messages.impl.timeline.components_MessageEventBubble_Day_5_en","features.messages.impl.timeline.components_MessageEventBubble_Night_5_en",0,], ["features.messages.impl.timeline.components_MessageEventBubble_Day_6_en","features.messages.impl.timeline.components_MessageEventBubble_Night_6_en",0,], ["features.messages.impl.timeline.components_MessageEventBubble_Day_7_en","features.messages.impl.timeline.components_MessageEventBubble_Night_7_en",0,], -["features.messages.impl.timeline.components_MessageShieldView_Day_0_en","features.messages.impl.timeline.components_MessageShieldView_Night_0_en",20308,], +["features.messages.impl.timeline.components_MessageShieldView_Day_0_en","features.messages.impl.timeline.components_MessageShieldView_Night_0_en",20323,], ["features.messages.impl.timeline.components_MessageStateEventContainer_Day_0_en","features.messages.impl.timeline.components_MessageStateEventContainer_Night_0_en",0,], ["features.messages.impl.timeline.components_MessagesReactionButtonAdd_Day_0_en","features.messages.impl.timeline.components_MessagesReactionButtonAdd_Night_0_en",0,], ["features.messages.impl.timeline.components_MessagesReactionButtonExtra_Day_0_en","features.messages.impl.timeline.components_MessagesReactionButtonExtra_Night_0_en",0,], @@ -694,26 +722,27 @@ export const screenshots = [ ["features.messages.impl.timeline.components_MessagesReactionButton_Day_1_en","features.messages.impl.timeline.components_MessagesReactionButton_Night_1_en",0,], ["features.messages.impl.timeline.components_MessagesReactionButton_Day_2_en","features.messages.impl.timeline.components_MessagesReactionButton_Night_2_en",0,], ["features.messages.impl.timeline.components_MessagesReactionButton_Day_3_en","features.messages.impl.timeline.components_MessagesReactionButton_Night_3_en",0,], -["features.messages.impl.crypto.identity_MessagesViewWithIdentityChange_Day_0_en","features.messages.impl.crypto.identity_MessagesViewWithIdentityChange_Night_0_en",20308,], -["features.messages.impl.crypto.identity_MessagesViewWithIdentityChange_Day_1_en","features.messages.impl.crypto.identity_MessagesViewWithIdentityChange_Night_1_en",20308,], -["features.messages.impl.crypto.identity_MessagesViewWithIdentityChange_Day_2_en","features.messages.impl.crypto.identity_MessagesViewWithIdentityChange_Night_2_en",20308,], -["features.messages.impl_MessagesView_Day_0_en","features.messages.impl_MessagesView_Night_0_en",20308,], -["features.messages.impl_MessagesView_Day_10_en","features.messages.impl_MessagesView_Night_10_en",20308,], -["features.messages.impl_MessagesView_Day_11_en","features.messages.impl_MessagesView_Night_11_en",20308,], -["features.messages.impl_MessagesView_Day_12_en","features.messages.impl_MessagesView_Night_12_en",20308,], -["features.messages.impl_MessagesView_Day_13_en","features.messages.impl_MessagesView_Night_13_en",20308,], -["features.messages.impl_MessagesView_Day_14_en","features.messages.impl_MessagesView_Night_14_en",20308,], -["features.messages.impl_MessagesView_Day_1_en","features.messages.impl_MessagesView_Night_1_en",20308,], -["features.messages.impl_MessagesView_Day_2_en","features.messages.impl_MessagesView_Night_2_en",20308,], -["features.messages.impl_MessagesView_Day_3_en","features.messages.impl_MessagesView_Night_3_en",20308,], -["features.messages.impl_MessagesView_Day_4_en","features.messages.impl_MessagesView_Night_4_en",20308,], -["features.messages.impl_MessagesView_Day_5_en","features.messages.impl_MessagesView_Night_5_en",20308,], -["features.messages.impl_MessagesView_Day_6_en","features.messages.impl_MessagesView_Night_6_en",20308,], -["features.messages.impl_MessagesView_Day_7_en","features.messages.impl_MessagesView_Night_7_en",20308,], -["features.messages.impl_MessagesView_Day_8_en","features.messages.impl_MessagesView_Night_8_en",20308,], -["features.messages.impl_MessagesView_Day_9_en","features.messages.impl_MessagesView_Night_9_en",20308,], +["features.messages.impl.crypto.identity_MessagesViewWithIdentityChange_Day_0_en","features.messages.impl.crypto.identity_MessagesViewWithIdentityChange_Night_0_en",20323,], +["features.messages.impl.crypto.identity_MessagesViewWithIdentityChange_Day_1_en","features.messages.impl.crypto.identity_MessagesViewWithIdentityChange_Night_1_en",20323,], +["features.messages.impl.crypto.identity_MessagesViewWithIdentityChange_Day_2_en","features.messages.impl.crypto.identity_MessagesViewWithIdentityChange_Night_2_en",20323,], +["features.messages.impl_MessagesView_Day_0_en","features.messages.impl_MessagesView_Night_0_en",20323,], +["features.messages.impl_MessagesView_Day_10_en","features.messages.impl_MessagesView_Night_10_en",20323,], +["features.messages.impl_MessagesView_Day_11_en","features.messages.impl_MessagesView_Night_11_en",20323,], +["features.messages.impl_MessagesView_Day_12_en","features.messages.impl_MessagesView_Night_12_en",20323,], +["features.messages.impl_MessagesView_Day_13_en","features.messages.impl_MessagesView_Night_13_en",20323,], +["features.messages.impl_MessagesView_Day_14_en","features.messages.impl_MessagesView_Night_14_en",20323,], +["features.messages.impl_MessagesView_Day_15_en","features.messages.impl_MessagesView_Night_15_en",20325,], +["features.messages.impl_MessagesView_Day_1_en","features.messages.impl_MessagesView_Night_1_en",20323,], +["features.messages.impl_MessagesView_Day_2_en","features.messages.impl_MessagesView_Night_2_en",20323,], +["features.messages.impl_MessagesView_Day_3_en","features.messages.impl_MessagesView_Night_3_en",20323,], +["features.messages.impl_MessagesView_Day_4_en","features.messages.impl_MessagesView_Night_4_en",20323,], +["features.messages.impl_MessagesView_Day_5_en","features.messages.impl_MessagesView_Night_5_en",20323,], +["features.messages.impl_MessagesView_Day_6_en","features.messages.impl_MessagesView_Night_6_en",20323,], +["features.messages.impl_MessagesView_Day_7_en","features.messages.impl_MessagesView_Night_7_en",20323,], +["features.messages.impl_MessagesView_Day_8_en","features.messages.impl_MessagesView_Night_8_en",20323,], +["features.messages.impl_MessagesView_Day_9_en","features.messages.impl_MessagesView_Night_9_en",20323,], ["features.migration.impl_MigrationView_Day_0_en","features.migration.impl_MigrationView_Night_0_en",0,], -["features.migration.impl_MigrationView_Day_1_en","features.migration.impl_MigrationView_Night_1_en",20308,], +["features.migration.impl_MigrationView_Day_1_en","features.migration.impl_MigrationView_Night_1_en",20323,], ["libraries.designsystem.theme.components_ModalBottomSheetDark_Bottom_Sheets_en","",0,], ["libraries.designsystem.theme.components_ModalBottomSheetLight_Bottom_Sheets_en","",0,], ["appicon.element_MonochromeIcon_en","",0,], @@ -723,107 +752,108 @@ export const screenshots = [ ["libraries.designsystem.components.list_MutipleSelectionListItemSelected_Multiple_selection_List_item_-_selection_in_supporting_text_List_items_en","",0,], ["libraries.designsystem.components.list_MutipleSelectionListItem_Multiple_selection_List_item_-_no_selection_List_items_en","",0,], ["libraries.designsystem.theme.components_NavigationBar_App_Bars_en","",0,], -["features.preferences.impl.notifications_NotificationSettingsView_Day_0_en","features.preferences.impl.notifications_NotificationSettingsView_Night_0_en",20308,], -["features.preferences.impl.notifications_NotificationSettingsView_Day_10_en","features.preferences.impl.notifications_NotificationSettingsView_Night_10_en",20308,], -["features.preferences.impl.notifications_NotificationSettingsView_Day_11_en","features.preferences.impl.notifications_NotificationSettingsView_Night_11_en",20308,], -["features.preferences.impl.notifications_NotificationSettingsView_Day_12_en","features.preferences.impl.notifications_NotificationSettingsView_Night_12_en",20308,], -["features.preferences.impl.notifications_NotificationSettingsView_Day_13_en","features.preferences.impl.notifications_NotificationSettingsView_Night_13_en",20308,], -["features.preferences.impl.notifications_NotificationSettingsView_Day_1_en","features.preferences.impl.notifications_NotificationSettingsView_Night_1_en",20308,], -["features.preferences.impl.notifications_NotificationSettingsView_Day_2_en","features.preferences.impl.notifications_NotificationSettingsView_Night_2_en",20308,], -["features.preferences.impl.notifications_NotificationSettingsView_Day_3_en","features.preferences.impl.notifications_NotificationSettingsView_Night_3_en",20308,], -["features.preferences.impl.notifications_NotificationSettingsView_Day_4_en","features.preferences.impl.notifications_NotificationSettingsView_Night_4_en",20308,], -["features.preferences.impl.notifications_NotificationSettingsView_Day_5_en","features.preferences.impl.notifications_NotificationSettingsView_Night_5_en",20308,], -["features.preferences.impl.notifications_NotificationSettingsView_Day_6_en","features.preferences.impl.notifications_NotificationSettingsView_Night_6_en",20308,], -["features.preferences.impl.notifications_NotificationSettingsView_Day_7_en","features.preferences.impl.notifications_NotificationSettingsView_Night_7_en",20308,], -["features.preferences.impl.notifications_NotificationSettingsView_Day_8_en","features.preferences.impl.notifications_NotificationSettingsView_Night_8_en",20308,], -["features.preferences.impl.notifications_NotificationSettingsView_Day_9_en","features.preferences.impl.notifications_NotificationSettingsView_Night_9_en",20308,], -["features.ftue.impl.notifications_NotificationsOptInView_Day_0_en","features.ftue.impl.notifications_NotificationsOptInView_Night_0_en",20308,], +["features.preferences.impl.notifications_NotificationSettingsView_Day_0_en","features.preferences.impl.notifications_NotificationSettingsView_Night_0_en",20323,], +["features.preferences.impl.notifications_NotificationSettingsView_Day_10_en","features.preferences.impl.notifications_NotificationSettingsView_Night_10_en",20323,], +["features.preferences.impl.notifications_NotificationSettingsView_Day_11_en","features.preferences.impl.notifications_NotificationSettingsView_Night_11_en",20323,], +["features.preferences.impl.notifications_NotificationSettingsView_Day_12_en","features.preferences.impl.notifications_NotificationSettingsView_Night_12_en",20323,], +["features.preferences.impl.notifications_NotificationSettingsView_Day_13_en","features.preferences.impl.notifications_NotificationSettingsView_Night_13_en",20323,], +["features.preferences.impl.notifications_NotificationSettingsView_Day_1_en","features.preferences.impl.notifications_NotificationSettingsView_Night_1_en",20323,], +["features.preferences.impl.notifications_NotificationSettingsView_Day_2_en","features.preferences.impl.notifications_NotificationSettingsView_Night_2_en",20323,], +["features.preferences.impl.notifications_NotificationSettingsView_Day_3_en","features.preferences.impl.notifications_NotificationSettingsView_Night_3_en",20323,], +["features.preferences.impl.notifications_NotificationSettingsView_Day_4_en","features.preferences.impl.notifications_NotificationSettingsView_Night_4_en",20323,], +["features.preferences.impl.notifications_NotificationSettingsView_Day_5_en","features.preferences.impl.notifications_NotificationSettingsView_Night_5_en",20323,], +["features.preferences.impl.notifications_NotificationSettingsView_Day_6_en","features.preferences.impl.notifications_NotificationSettingsView_Night_6_en",20323,], +["features.preferences.impl.notifications_NotificationSettingsView_Day_7_en","features.preferences.impl.notifications_NotificationSettingsView_Night_7_en",20323,], +["features.preferences.impl.notifications_NotificationSettingsView_Day_8_en","features.preferences.impl.notifications_NotificationSettingsView_Night_8_en",20323,], +["features.preferences.impl.notifications_NotificationSettingsView_Day_9_en","features.preferences.impl.notifications_NotificationSettingsView_Night_9_en",20323,], +["features.ftue.impl.notifications_NotificationsOptInView_Day_0_en","features.ftue.impl.notifications_NotificationsOptInView_Night_0_en",20323,], ["libraries.designsystem.atomic.pages_OnBoardingPage_Day_0_en","libraries.designsystem.atomic.pages_OnBoardingPage_Night_0_en",0,], -["features.login.impl.screens.onboarding_OnBoardingView_Day_0_en","features.login.impl.screens.onboarding_OnBoardingView_Night_0_en",20308,], -["features.login.impl.screens.onboarding_OnBoardingView_Day_1_en","features.login.impl.screens.onboarding_OnBoardingView_Night_1_en",20308,], -["features.login.impl.screens.onboarding_OnBoardingView_Day_2_en","features.login.impl.screens.onboarding_OnBoardingView_Night_2_en",20308,], -["features.login.impl.screens.onboarding_OnBoardingView_Day_3_en","features.login.impl.screens.onboarding_OnBoardingView_Night_3_en",20308,], -["features.login.impl.screens.onboarding_OnBoardingView_Day_4_en","features.login.impl.screens.onboarding_OnBoardingView_Night_4_en",20308,], -["features.login.impl.screens.onboarding_OnBoardingView_Day_5_en","features.login.impl.screens.onboarding_OnBoardingView_Night_5_en",20308,], +["features.login.impl.screens.onboarding_OnBoardingView_Day_0_en","features.login.impl.screens.onboarding_OnBoardingView_Night_0_en",20323,], +["features.login.impl.screens.onboarding_OnBoardingView_Day_1_en","features.login.impl.screens.onboarding_OnBoardingView_Night_1_en",20323,], +["features.login.impl.screens.onboarding_OnBoardingView_Day_2_en","features.login.impl.screens.onboarding_OnBoardingView_Night_2_en",20323,], +["features.login.impl.screens.onboarding_OnBoardingView_Day_3_en","features.login.impl.screens.onboarding_OnBoardingView_Night_3_en",20323,], +["features.login.impl.screens.onboarding_OnBoardingView_Day_4_en","features.login.impl.screens.onboarding_OnBoardingView_Night_4_en",20323,], +["features.login.impl.screens.onboarding_OnBoardingView_Day_5_en","features.login.impl.screens.onboarding_OnBoardingView_Night_5_en",20323,], ["libraries.designsystem.background_OnboardingBackground_Day_0_en","libraries.designsystem.background_OnboardingBackground_Night_0_en",0,], -["features.verifysession.impl.outgoing_OutgoingVerificationView_Day_0_en","features.verifysession.impl.outgoing_OutgoingVerificationView_Night_0_en",20308,], -["features.verifysession.impl.outgoing_OutgoingVerificationView_Day_10_en","features.verifysession.impl.outgoing_OutgoingVerificationView_Night_10_en",20308,], -["features.verifysession.impl.outgoing_OutgoingVerificationView_Day_11_en","features.verifysession.impl.outgoing_OutgoingVerificationView_Night_11_en",20308,], +["libraries.matrix.ui.components_OrganizationHeader_Day_0_en","libraries.matrix.ui.components_OrganizationHeader_Night_0_en",0,], +["features.verifysession.impl.outgoing_OutgoingVerificationView_Day_0_en","features.verifysession.impl.outgoing_OutgoingVerificationView_Night_0_en",20323,], +["features.verifysession.impl.outgoing_OutgoingVerificationView_Day_10_en","features.verifysession.impl.outgoing_OutgoingVerificationView_Night_10_en",20323,], +["features.verifysession.impl.outgoing_OutgoingVerificationView_Day_11_en","features.verifysession.impl.outgoing_OutgoingVerificationView_Night_11_en",20323,], ["features.verifysession.impl.outgoing_OutgoingVerificationView_Day_12_en","features.verifysession.impl.outgoing_OutgoingVerificationView_Night_12_en",0,], ["features.verifysession.impl.outgoing_OutgoingVerificationView_Day_13_en","features.verifysession.impl.outgoing_OutgoingVerificationView_Night_13_en",0,], -["features.verifysession.impl.outgoing_OutgoingVerificationView_Day_1_en","features.verifysession.impl.outgoing_OutgoingVerificationView_Night_1_en",20308,], -["features.verifysession.impl.outgoing_OutgoingVerificationView_Day_2_en","features.verifysession.impl.outgoing_OutgoingVerificationView_Night_2_en",20308,], -["features.verifysession.impl.outgoing_OutgoingVerificationView_Day_3_en","features.verifysession.impl.outgoing_OutgoingVerificationView_Night_3_en",20308,], -["features.verifysession.impl.outgoing_OutgoingVerificationView_Day_4_en","features.verifysession.impl.outgoing_OutgoingVerificationView_Night_4_en",20308,], -["features.verifysession.impl.outgoing_OutgoingVerificationView_Day_5_en","features.verifysession.impl.outgoing_OutgoingVerificationView_Night_5_en",20308,], -["features.verifysession.impl.outgoing_OutgoingVerificationView_Day_6_en","features.verifysession.impl.outgoing_OutgoingVerificationView_Night_6_en",20308,], -["features.verifysession.impl.outgoing_OutgoingVerificationView_Day_7_en","features.verifysession.impl.outgoing_OutgoingVerificationView_Night_7_en",20308,], -["features.verifysession.impl.outgoing_OutgoingVerificationView_Day_8_en","features.verifysession.impl.outgoing_OutgoingVerificationView_Night_8_en",20308,], -["features.verifysession.impl.outgoing_OutgoingVerificationView_Day_9_en","features.verifysession.impl.outgoing_OutgoingVerificationView_Night_9_en",20308,], +["features.verifysession.impl.outgoing_OutgoingVerificationView_Day_1_en","features.verifysession.impl.outgoing_OutgoingVerificationView_Night_1_en",20323,], +["features.verifysession.impl.outgoing_OutgoingVerificationView_Day_2_en","features.verifysession.impl.outgoing_OutgoingVerificationView_Night_2_en",20323,], +["features.verifysession.impl.outgoing_OutgoingVerificationView_Day_3_en","features.verifysession.impl.outgoing_OutgoingVerificationView_Night_3_en",20323,], +["features.verifysession.impl.outgoing_OutgoingVerificationView_Day_4_en","features.verifysession.impl.outgoing_OutgoingVerificationView_Night_4_en",20323,], +["features.verifysession.impl.outgoing_OutgoingVerificationView_Day_5_en","features.verifysession.impl.outgoing_OutgoingVerificationView_Night_5_en",20323,], +["features.verifysession.impl.outgoing_OutgoingVerificationView_Day_6_en","features.verifysession.impl.outgoing_OutgoingVerificationView_Night_6_en",20323,], +["features.verifysession.impl.outgoing_OutgoingVerificationView_Day_7_en","features.verifysession.impl.outgoing_OutgoingVerificationView_Night_7_en",20323,], +["features.verifysession.impl.outgoing_OutgoingVerificationView_Day_8_en","features.verifysession.impl.outgoing_OutgoingVerificationView_Night_8_en",20323,], +["features.verifysession.impl.outgoing_OutgoingVerificationView_Day_9_en","features.verifysession.impl.outgoing_OutgoingVerificationView_Night_9_en",20323,], ["libraries.designsystem.theme.components_OutlinedButtonLargeLowPadding_Buttons_en","",0,], ["libraries.designsystem.theme.components_OutlinedButtonLarge_Buttons_en","",0,], ["libraries.designsystem.theme.components_OutlinedButtonMediumLowPadding_Buttons_en","",0,], ["libraries.designsystem.theme.components_OutlinedButtonMedium_Buttons_en","",0,], ["libraries.designsystem.theme.components_OutlinedButtonSmall_Buttons_en","",0,], -["libraries.mediaviewer.impl.local.pdf_PdfPagesErrorView_Day_0_en","libraries.mediaviewer.impl.local.pdf_PdfPagesErrorView_Night_0_en",20308,], -["features.changeroommemberroles.impl_PendingMemberRowWithLongName_Day_0_en","features.changeroommemberroles.impl_PendingMemberRowWithLongName_Night_0_en",0,], -["libraries.permissions.api_PermissionsView_Day_0_en","libraries.permissions.api_PermissionsView_Night_0_en",20308,], -["libraries.permissions.api_PermissionsView_Day_1_en","libraries.permissions.api_PermissionsView_Night_1_en",20308,], -["libraries.permissions.api_PermissionsView_Day_2_en","libraries.permissions.api_PermissionsView_Night_2_en",20308,], -["libraries.permissions.api_PermissionsView_Day_3_en","libraries.permissions.api_PermissionsView_Night_3_en",20308,], +["libraries.mediaviewer.impl.local.pdf_PdfPagesErrorView_Day_0_en","libraries.mediaviewer.impl.local.pdf_PdfPagesErrorView_Night_0_en",20323,], +["features.changeroommemberroles.impl_PendingMemberRowWithLongName_Day_0_en","features.changeroommemberroles.impl_PendingMemberRowWithLongName_Night_0_en",20323,], +["libraries.permissions.api_PermissionsView_Day_0_en","libraries.permissions.api_PermissionsView_Night_0_en",20323,], +["libraries.permissions.api_PermissionsView_Day_1_en","libraries.permissions.api_PermissionsView_Night_1_en",20323,], +["libraries.permissions.api_PermissionsView_Day_2_en","libraries.permissions.api_PermissionsView_Night_2_en",20323,], +["libraries.permissions.api_PermissionsView_Day_3_en","libraries.permissions.api_PermissionsView_Night_3_en",20323,], ["features.lockscreen.impl.components_PinEntryTextField_Day_0_en","features.lockscreen.impl.components_PinEntryTextField_Night_0_en",0,], ["libraries.designsystem.components_PinIcon_Day_0_en","libraries.designsystem.components_PinIcon_Night_0_en",0,], ["features.lockscreen.impl.unlock.keypad_PinKeypad_Day_0_en","features.lockscreen.impl.unlock.keypad_PinKeypad_Night_0_en",0,], -["features.lockscreen.impl.unlock_PinUnlockViewInApp_Day_0_en","features.lockscreen.impl.unlock_PinUnlockViewInApp_Night_0_en",20308,], -["features.lockscreen.impl.unlock_PinUnlockViewInApp_Day_1_en","features.lockscreen.impl.unlock_PinUnlockViewInApp_Night_1_en",20308,], -["features.lockscreen.impl.unlock_PinUnlockViewInApp_Day_2_en","features.lockscreen.impl.unlock_PinUnlockViewInApp_Night_2_en",20308,], -["features.lockscreen.impl.unlock_PinUnlockViewInApp_Day_3_en","features.lockscreen.impl.unlock_PinUnlockViewInApp_Night_3_en",20308,], -["features.lockscreen.impl.unlock_PinUnlockViewInApp_Day_4_en","features.lockscreen.impl.unlock_PinUnlockViewInApp_Night_4_en",20308,], -["features.lockscreen.impl.unlock_PinUnlockViewInApp_Day_5_en","features.lockscreen.impl.unlock_PinUnlockViewInApp_Night_5_en",20308,], -["features.lockscreen.impl.unlock_PinUnlockViewInApp_Day_6_en","features.lockscreen.impl.unlock_PinUnlockViewInApp_Night_6_en",20308,], -["features.lockscreen.impl.unlock_PinUnlockViewInApp_Day_7_en","features.lockscreen.impl.unlock_PinUnlockViewInApp_Night_7_en",20308,], -["features.lockscreen.impl.unlock_PinUnlockView_Day_0_en","features.lockscreen.impl.unlock_PinUnlockView_Night_0_en",20308,], -["features.lockscreen.impl.unlock_PinUnlockView_Day_1_en","features.lockscreen.impl.unlock_PinUnlockView_Night_1_en",20308,], -["features.lockscreen.impl.unlock_PinUnlockView_Day_2_en","features.lockscreen.impl.unlock_PinUnlockView_Night_2_en",20308,], -["features.lockscreen.impl.unlock_PinUnlockView_Day_3_en","features.lockscreen.impl.unlock_PinUnlockView_Night_3_en",20308,], -["features.lockscreen.impl.unlock_PinUnlockView_Day_4_en","features.lockscreen.impl.unlock_PinUnlockView_Night_4_en",20308,], -["features.lockscreen.impl.unlock_PinUnlockView_Day_5_en","features.lockscreen.impl.unlock_PinUnlockView_Night_5_en",20308,], -["features.lockscreen.impl.unlock_PinUnlockView_Day_6_en","features.lockscreen.impl.unlock_PinUnlockView_Night_6_en",20308,], -["features.lockscreen.impl.unlock_PinUnlockView_Day_7_en","features.lockscreen.impl.unlock_PinUnlockView_Night_7_en",20308,], +["features.lockscreen.impl.unlock_PinUnlockViewInApp_Day_0_en","features.lockscreen.impl.unlock_PinUnlockViewInApp_Night_0_en",20323,], +["features.lockscreen.impl.unlock_PinUnlockViewInApp_Day_1_en","features.lockscreen.impl.unlock_PinUnlockViewInApp_Night_1_en",20323,], +["features.lockscreen.impl.unlock_PinUnlockViewInApp_Day_2_en","features.lockscreen.impl.unlock_PinUnlockViewInApp_Night_2_en",20323,], +["features.lockscreen.impl.unlock_PinUnlockViewInApp_Day_3_en","features.lockscreen.impl.unlock_PinUnlockViewInApp_Night_3_en",20323,], +["features.lockscreen.impl.unlock_PinUnlockViewInApp_Day_4_en","features.lockscreen.impl.unlock_PinUnlockViewInApp_Night_4_en",20323,], +["features.lockscreen.impl.unlock_PinUnlockViewInApp_Day_5_en","features.lockscreen.impl.unlock_PinUnlockViewInApp_Night_5_en",20323,], +["features.lockscreen.impl.unlock_PinUnlockViewInApp_Day_6_en","features.lockscreen.impl.unlock_PinUnlockViewInApp_Night_6_en",20323,], +["features.lockscreen.impl.unlock_PinUnlockViewInApp_Day_7_en","features.lockscreen.impl.unlock_PinUnlockViewInApp_Night_7_en",20323,], +["features.lockscreen.impl.unlock_PinUnlockView_Day_0_en","features.lockscreen.impl.unlock_PinUnlockView_Night_0_en",20323,], +["features.lockscreen.impl.unlock_PinUnlockView_Day_1_en","features.lockscreen.impl.unlock_PinUnlockView_Night_1_en",20323,], +["features.lockscreen.impl.unlock_PinUnlockView_Day_2_en","features.lockscreen.impl.unlock_PinUnlockView_Night_2_en",20323,], +["features.lockscreen.impl.unlock_PinUnlockView_Day_3_en","features.lockscreen.impl.unlock_PinUnlockView_Night_3_en",20323,], +["features.lockscreen.impl.unlock_PinUnlockView_Day_4_en","features.lockscreen.impl.unlock_PinUnlockView_Night_4_en",20323,], +["features.lockscreen.impl.unlock_PinUnlockView_Day_5_en","features.lockscreen.impl.unlock_PinUnlockView_Night_5_en",20323,], +["features.lockscreen.impl.unlock_PinUnlockView_Day_6_en","features.lockscreen.impl.unlock_PinUnlockView_Night_6_en",20323,], +["features.lockscreen.impl.unlock_PinUnlockView_Day_7_en","features.lockscreen.impl.unlock_PinUnlockView_Night_7_en",20323,], ["features.messages.impl.pinned.banner_PinnedMessagesBannerView_Day_0_en","features.messages.impl.pinned.banner_PinnedMessagesBannerView_Night_0_en",0,], -["features.messages.impl.pinned.banner_PinnedMessagesBannerView_Day_10_en","features.messages.impl.pinned.banner_PinnedMessagesBannerView_Night_10_en",20308,], -["features.messages.impl.pinned.banner_PinnedMessagesBannerView_Day_1_en","features.messages.impl.pinned.banner_PinnedMessagesBannerView_Night_1_en",20308,], -["features.messages.impl.pinned.banner_PinnedMessagesBannerView_Day_2_en","features.messages.impl.pinned.banner_PinnedMessagesBannerView_Night_2_en",20308,], -["features.messages.impl.pinned.banner_PinnedMessagesBannerView_Day_3_en","features.messages.impl.pinned.banner_PinnedMessagesBannerView_Night_3_en",20308,], -["features.messages.impl.pinned.banner_PinnedMessagesBannerView_Day_4_en","features.messages.impl.pinned.banner_PinnedMessagesBannerView_Night_4_en",20308,], -["features.messages.impl.pinned.banner_PinnedMessagesBannerView_Day_5_en","features.messages.impl.pinned.banner_PinnedMessagesBannerView_Night_5_en",20308,], -["features.messages.impl.pinned.banner_PinnedMessagesBannerView_Day_6_en","features.messages.impl.pinned.banner_PinnedMessagesBannerView_Night_6_en",20308,], -["features.messages.impl.pinned.banner_PinnedMessagesBannerView_Day_7_en","features.messages.impl.pinned.banner_PinnedMessagesBannerView_Night_7_en",20308,], -["features.messages.impl.pinned.banner_PinnedMessagesBannerView_Day_8_en","features.messages.impl.pinned.banner_PinnedMessagesBannerView_Night_8_en",20308,], -["features.messages.impl.pinned.banner_PinnedMessagesBannerView_Day_9_en","features.messages.impl.pinned.banner_PinnedMessagesBannerView_Night_9_en",20308,], -["features.messages.impl.pinned.list_PinnedMessagesListView_Day_0_en","features.messages.impl.pinned.list_PinnedMessagesListView_Night_0_en",20308,], -["features.messages.impl.pinned.list_PinnedMessagesListView_Day_1_en","features.messages.impl.pinned.list_PinnedMessagesListView_Night_1_en",20308,], -["features.messages.impl.pinned.list_PinnedMessagesListView_Day_2_en","features.messages.impl.pinned.list_PinnedMessagesListView_Night_2_en",20308,], -["features.messages.impl.pinned.list_PinnedMessagesListView_Day_3_en","features.messages.impl.pinned.list_PinnedMessagesListView_Night_3_en",20308,], +["features.messages.impl.pinned.banner_PinnedMessagesBannerView_Day_10_en","features.messages.impl.pinned.banner_PinnedMessagesBannerView_Night_10_en",20323,], +["features.messages.impl.pinned.banner_PinnedMessagesBannerView_Day_1_en","features.messages.impl.pinned.banner_PinnedMessagesBannerView_Night_1_en",20323,], +["features.messages.impl.pinned.banner_PinnedMessagesBannerView_Day_2_en","features.messages.impl.pinned.banner_PinnedMessagesBannerView_Night_2_en",20323,], +["features.messages.impl.pinned.banner_PinnedMessagesBannerView_Day_3_en","features.messages.impl.pinned.banner_PinnedMessagesBannerView_Night_3_en",20323,], +["features.messages.impl.pinned.banner_PinnedMessagesBannerView_Day_4_en","features.messages.impl.pinned.banner_PinnedMessagesBannerView_Night_4_en",20323,], +["features.messages.impl.pinned.banner_PinnedMessagesBannerView_Day_5_en","features.messages.impl.pinned.banner_PinnedMessagesBannerView_Night_5_en",20323,], +["features.messages.impl.pinned.banner_PinnedMessagesBannerView_Day_6_en","features.messages.impl.pinned.banner_PinnedMessagesBannerView_Night_6_en",20323,], +["features.messages.impl.pinned.banner_PinnedMessagesBannerView_Day_7_en","features.messages.impl.pinned.banner_PinnedMessagesBannerView_Night_7_en",20323,], +["features.messages.impl.pinned.banner_PinnedMessagesBannerView_Day_8_en","features.messages.impl.pinned.banner_PinnedMessagesBannerView_Night_8_en",20323,], +["features.messages.impl.pinned.banner_PinnedMessagesBannerView_Day_9_en","features.messages.impl.pinned.banner_PinnedMessagesBannerView_Night_9_en",20323,], +["features.messages.impl.pinned.list_PinnedMessagesListView_Day_0_en","features.messages.impl.pinned.list_PinnedMessagesListView_Night_0_en",20323,], +["features.messages.impl.pinned.list_PinnedMessagesListView_Day_1_en","features.messages.impl.pinned.list_PinnedMessagesListView_Night_1_en",20323,], +["features.messages.impl.pinned.list_PinnedMessagesListView_Day_2_en","features.messages.impl.pinned.list_PinnedMessagesListView_Night_2_en",20323,], +["features.messages.impl.pinned.list_PinnedMessagesListView_Day_3_en","features.messages.impl.pinned.list_PinnedMessagesListView_Night_3_en",20323,], ["libraries.designsystem.atomic.atoms_PlaceholderAtom_Day_0_en","libraries.designsystem.atomic.atoms_PlaceholderAtom_Night_0_en",0,], -["features.poll.api.pollcontent_PollAnswerViewDisclosedNotSelected_Day_0_en","features.poll.api.pollcontent_PollAnswerViewDisclosedNotSelected_Night_0_en",20308,], -["features.poll.api.pollcontent_PollAnswerViewDisclosedSelected_Day_0_en","features.poll.api.pollcontent_PollAnswerViewDisclosedSelected_Night_0_en",20308,], -["features.poll.api.pollcontent_PollAnswerViewEndedSelected_Day_0_en","features.poll.api.pollcontent_PollAnswerViewEndedSelected_Night_0_en",20308,], -["features.poll.api.pollcontent_PollAnswerViewEndedWinnerNotSelected_Day_0_en","features.poll.api.pollcontent_PollAnswerViewEndedWinnerNotSelected_Night_0_en",20308,], -["features.poll.api.pollcontent_PollAnswerViewEndedWinnerSelected_Day_0_en","features.poll.api.pollcontent_PollAnswerViewEndedWinnerSelected_Night_0_en",20308,], +["features.poll.api.pollcontent_PollAnswerViewDisclosedNotSelected_Day_0_en","features.poll.api.pollcontent_PollAnswerViewDisclosedNotSelected_Night_0_en",20323,], +["features.poll.api.pollcontent_PollAnswerViewDisclosedSelected_Day_0_en","features.poll.api.pollcontent_PollAnswerViewDisclosedSelected_Night_0_en",20323,], +["features.poll.api.pollcontent_PollAnswerViewEndedSelected_Day_0_en","features.poll.api.pollcontent_PollAnswerViewEndedSelected_Night_0_en",20323,], +["features.poll.api.pollcontent_PollAnswerViewEndedWinnerNotSelected_Day_0_en","features.poll.api.pollcontent_PollAnswerViewEndedWinnerNotSelected_Night_0_en",20323,], +["features.poll.api.pollcontent_PollAnswerViewEndedWinnerSelected_Day_0_en","features.poll.api.pollcontent_PollAnswerViewEndedWinnerSelected_Night_0_en",20323,], ["features.poll.api.pollcontent_PollAnswerViewUndisclosedNotSelected_Day_0_en","features.poll.api.pollcontent_PollAnswerViewUndisclosedNotSelected_Night_0_en",0,], ["features.poll.api.pollcontent_PollAnswerViewUndisclosedSelected_Day_0_en","features.poll.api.pollcontent_PollAnswerViewUndisclosedSelected_Night_0_en",0,], -["features.poll.api.pollcontent_PollContentViewCreatorEditable_Day_0_en","features.poll.api.pollcontent_PollContentViewCreatorEditable_Night_0_en",20308,], -["features.poll.api.pollcontent_PollContentViewCreatorEnded_Day_0_en","features.poll.api.pollcontent_PollContentViewCreatorEnded_Night_0_en",20308,], -["features.poll.api.pollcontent_PollContentViewCreator_Day_0_en","features.poll.api.pollcontent_PollContentViewCreator_Night_0_en",20308,], -["features.poll.api.pollcontent_PollContentViewDisclosed_Day_0_en","features.poll.api.pollcontent_PollContentViewDisclosed_Night_0_en",20308,], -["features.poll.api.pollcontent_PollContentViewEnded_Day_0_en","features.poll.api.pollcontent_PollContentViewEnded_Night_0_en",20308,], -["features.poll.api.pollcontent_PollContentViewUndisclosed_Day_0_en","features.poll.api.pollcontent_PollContentViewUndisclosed_Night_0_en",20308,], -["features.poll.impl.history_PollHistoryView_Day_0_en","features.poll.impl.history_PollHistoryView_Night_0_en",20308,], -["features.poll.impl.history_PollHistoryView_Day_1_en","features.poll.impl.history_PollHistoryView_Night_1_en",20308,], -["features.poll.impl.history_PollHistoryView_Day_2_en","features.poll.impl.history_PollHistoryView_Night_2_en",20308,], -["features.poll.impl.history_PollHistoryView_Day_3_en","features.poll.impl.history_PollHistoryView_Night_3_en",20308,], -["features.poll.impl.history_PollHistoryView_Day_4_en","features.poll.impl.history_PollHistoryView_Night_4_en",20308,], +["features.poll.api.pollcontent_PollContentViewCreatorEditable_Day_0_en","features.poll.api.pollcontent_PollContentViewCreatorEditable_Night_0_en",20323,], +["features.poll.api.pollcontent_PollContentViewCreatorEnded_Day_0_en","features.poll.api.pollcontent_PollContentViewCreatorEnded_Night_0_en",20323,], +["features.poll.api.pollcontent_PollContentViewCreator_Day_0_en","features.poll.api.pollcontent_PollContentViewCreator_Night_0_en",20323,], +["features.poll.api.pollcontent_PollContentViewDisclosed_Day_0_en","features.poll.api.pollcontent_PollContentViewDisclosed_Night_0_en",20323,], +["features.poll.api.pollcontent_PollContentViewEnded_Day_0_en","features.poll.api.pollcontent_PollContentViewEnded_Night_0_en",20323,], +["features.poll.api.pollcontent_PollContentViewUndisclosed_Day_0_en","features.poll.api.pollcontent_PollContentViewUndisclosed_Night_0_en",20323,], +["features.poll.impl.history_PollHistoryView_Day_0_en","features.poll.impl.history_PollHistoryView_Night_0_en",20323,], +["features.poll.impl.history_PollHistoryView_Day_1_en","features.poll.impl.history_PollHistoryView_Night_1_en",20323,], +["features.poll.impl.history_PollHistoryView_Day_2_en","features.poll.impl.history_PollHistoryView_Night_2_en",20323,], +["features.poll.impl.history_PollHistoryView_Day_3_en","features.poll.impl.history_PollHistoryView_Night_3_en",20323,], +["features.poll.impl.history_PollHistoryView_Day_4_en","features.poll.impl.history_PollHistoryView_Night_4_en",20323,], ["features.poll.api.pollcontent_PollTitleView_Day_0_en","features.poll.api.pollcontent_PollTitleView_Night_0_en",0,], ["libraries.designsystem.components.preferences_PreferenceCategory_Preferences_en","",0,], ["libraries.designsystem.components.preferences_PreferenceCheckbox_Preferences_en","",0,], @@ -837,208 +867,203 @@ export const screenshots = [ ["libraries.designsystem.components.preferences_PreferenceRow_Preferences_en","",0,], ["libraries.designsystem.components.preferences_PreferenceSlide_Preferences_en","",0,], ["libraries.designsystem.components.preferences_PreferenceSwitch_Preferences_en","",0,], -["features.preferences.impl.root_PreferencesRootViewDark_0_en","",20308,], -["features.preferences.impl.root_PreferencesRootViewDark_1_en","",20308,], -["features.preferences.impl.root_PreferencesRootViewLight_0_en","",20308,], -["features.preferences.impl.root_PreferencesRootViewLight_1_en","",20308,], +["features.preferences.impl.root_PreferencesRootViewDark_0_en","",20323,], +["features.preferences.impl.root_PreferencesRootViewDark_1_en","",20323,], +["features.preferences.impl.root_PreferencesRootViewLight_0_en","",20323,], +["features.preferences.impl.root_PreferencesRootViewLight_1_en","",20323,], ["features.messages.impl.timeline.components.event_ProgressButton_Day_0_en","features.messages.impl.timeline.components.event_ProgressButton_Night_0_en",0,], -["libraries.designsystem.components_ProgressDialogContent_Dialogs_en","",20308,], -["libraries.designsystem.components_ProgressDialog_Day_0_en","libraries.designsystem.components_ProgressDialog_Night_0_en",20308,], -["features.messages.impl.timeline.protection_ProtectedView_Day_0_en","features.messages.impl.timeline.protection_ProtectedView_Night_0_en",20308,], -["features.messages.impl.timeline.protection_ProtectedView_Day_1_en","features.messages.impl.timeline.protection_ProtectedView_Night_1_en",20308,], -["features.messages.impl.timeline.protection_ProtectedView_Day_2_en","features.messages.impl.timeline.protection_ProtectedView_Night_2_en",20308,], -["features.messages.impl.timeline.protection_ProtectedView_Day_3_en","features.messages.impl.timeline.protection_ProtectedView_Night_3_en",20308,], -["libraries.troubleshoot.impl.history_PushHistoryView_Day_0_en","libraries.troubleshoot.impl.history_PushHistoryView_Night_0_en",20308,], -["libraries.troubleshoot.impl.history_PushHistoryView_Day_1_en","libraries.troubleshoot.impl.history_PushHistoryView_Night_1_en",20308,], -["libraries.troubleshoot.impl.history_PushHistoryView_Day_2_en","libraries.troubleshoot.impl.history_PushHistoryView_Night_2_en",20308,], -["features.login.impl.screens.qrcode.confirmation_QrCodeConfirmationView_Day_0_en","features.login.impl.screens.qrcode.confirmation_QrCodeConfirmationView_Night_0_en",20308,], -["features.login.impl.screens.qrcode.confirmation_QrCodeConfirmationView_Day_1_en","features.login.impl.screens.qrcode.confirmation_QrCodeConfirmationView_Night_1_en",20308,], -["features.login.impl.screens.qrcode.confirmation_QrCodeConfirmationView_Day_2_en","features.login.impl.screens.qrcode.confirmation_QrCodeConfirmationView_Night_2_en",20308,], -["features.login.impl.screens.qrcode.error_QrCodeErrorView_Day_0_en","features.login.impl.screens.qrcode.error_QrCodeErrorView_Night_0_en",20308,], -["features.login.impl.screens.qrcode.error_QrCodeErrorView_Day_1_en","features.login.impl.screens.qrcode.error_QrCodeErrorView_Night_1_en",20308,], -["features.login.impl.screens.qrcode.error_QrCodeErrorView_Day_2_en","features.login.impl.screens.qrcode.error_QrCodeErrorView_Night_2_en",20308,], -["features.login.impl.screens.qrcode.error_QrCodeErrorView_Day_3_en","features.login.impl.screens.qrcode.error_QrCodeErrorView_Night_3_en",20308,], -["features.login.impl.screens.qrcode.error_QrCodeErrorView_Day_4_en","features.login.impl.screens.qrcode.error_QrCodeErrorView_Night_4_en",20308,], -["features.login.impl.screens.qrcode.error_QrCodeErrorView_Day_5_en","features.login.impl.screens.qrcode.error_QrCodeErrorView_Night_5_en",20308,], -["features.login.impl.screens.qrcode.error_QrCodeErrorView_Day_6_en","features.login.impl.screens.qrcode.error_QrCodeErrorView_Night_6_en",20308,], -["features.login.impl.screens.qrcode.intro_QrCodeIntroView_Day_0_en","features.login.impl.screens.qrcode.intro_QrCodeIntroView_Night_0_en",20308,], -["features.login.impl.screens.qrcode.intro_QrCodeIntroView_Day_1_en","features.login.impl.screens.qrcode.intro_QrCodeIntroView_Night_1_en",20308,], -["features.login.impl.screens.qrcode.scan_QrCodeScanView_Day_0_en","features.login.impl.screens.qrcode.scan_QrCodeScanView_Night_0_en",20308,], -["features.login.impl.screens.qrcode.scan_QrCodeScanView_Day_1_en","features.login.impl.screens.qrcode.scan_QrCodeScanView_Night_1_en",20308,], -["features.login.impl.screens.qrcode.scan_QrCodeScanView_Day_2_en","features.login.impl.screens.qrcode.scan_QrCodeScanView_Night_2_en",20308,], -["features.login.impl.screens.qrcode.scan_QrCodeScanView_Day_3_en","features.login.impl.screens.qrcode.scan_QrCodeScanView_Night_3_en",20308,], -["features.login.impl.screens.qrcode.scan_QrCodeScanView_Day_4_en","features.login.impl.screens.qrcode.scan_QrCodeScanView_Night_4_en",20308,], -["features.login.impl.screens.qrcode.scan_QrCodeScanView_Day_5_en","features.login.impl.screens.qrcode.scan_QrCodeScanView_Night_5_en",0,], +["libraries.designsystem.components_ProgressDialogContent_Dialogs_en","",20323,], +["libraries.designsystem.components_ProgressDialog_Day_0_en","libraries.designsystem.components_ProgressDialog_Night_0_en",20323,], +["features.messages.impl.timeline.protection_ProtectedView_Day_0_en","features.messages.impl.timeline.protection_ProtectedView_Night_0_en",20323,], +["features.messages.impl.timeline.protection_ProtectedView_Day_1_en","features.messages.impl.timeline.protection_ProtectedView_Night_1_en",20323,], +["features.messages.impl.timeline.protection_ProtectedView_Day_2_en","features.messages.impl.timeline.protection_ProtectedView_Night_2_en",20323,], +["features.messages.impl.timeline.protection_ProtectedView_Day_3_en","features.messages.impl.timeline.protection_ProtectedView_Night_3_en",20323,], +["libraries.troubleshoot.impl.history_PushHistoryView_Day_0_en","libraries.troubleshoot.impl.history_PushHistoryView_Night_0_en",20323,], +["libraries.troubleshoot.impl.history_PushHistoryView_Day_1_en","libraries.troubleshoot.impl.history_PushHistoryView_Night_1_en",20323,], +["libraries.troubleshoot.impl.history_PushHistoryView_Day_2_en","libraries.troubleshoot.impl.history_PushHistoryView_Night_2_en",20323,], +["features.login.impl.screens.qrcode.confirmation_QrCodeConfirmationView_Day_0_en","features.login.impl.screens.qrcode.confirmation_QrCodeConfirmationView_Night_0_en",20323,], +["features.login.impl.screens.qrcode.confirmation_QrCodeConfirmationView_Day_1_en","features.login.impl.screens.qrcode.confirmation_QrCodeConfirmationView_Night_1_en",20323,], +["features.login.impl.screens.qrcode.confirmation_QrCodeConfirmationView_Day_2_en","features.login.impl.screens.qrcode.confirmation_QrCodeConfirmationView_Night_2_en",20323,], +["features.login.impl.screens.qrcode.error_QrCodeErrorView_Day_0_en","features.login.impl.screens.qrcode.error_QrCodeErrorView_Night_0_en",20323,], +["features.login.impl.screens.qrcode.error_QrCodeErrorView_Day_1_en","features.login.impl.screens.qrcode.error_QrCodeErrorView_Night_1_en",20323,], +["features.login.impl.screens.qrcode.error_QrCodeErrorView_Day_2_en","features.login.impl.screens.qrcode.error_QrCodeErrorView_Night_2_en",20323,], +["features.login.impl.screens.qrcode.error_QrCodeErrorView_Day_3_en","features.login.impl.screens.qrcode.error_QrCodeErrorView_Night_3_en",20323,], +["features.login.impl.screens.qrcode.error_QrCodeErrorView_Day_4_en","features.login.impl.screens.qrcode.error_QrCodeErrorView_Night_4_en",20323,], +["features.login.impl.screens.qrcode.error_QrCodeErrorView_Day_5_en","features.login.impl.screens.qrcode.error_QrCodeErrorView_Night_5_en",20323,], +["features.login.impl.screens.qrcode.error_QrCodeErrorView_Day_6_en","features.login.impl.screens.qrcode.error_QrCodeErrorView_Night_6_en",20323,], +["features.login.impl.screens.qrcode.intro_QrCodeIntroView_Day_0_en","features.login.impl.screens.qrcode.intro_QrCodeIntroView_Night_0_en",20323,], +["features.login.impl.screens.qrcode.intro_QrCodeIntroView_Day_1_en","features.login.impl.screens.qrcode.intro_QrCodeIntroView_Night_1_en",20323,], +["features.login.impl.screens.qrcode.scan_QrCodeScanView_Day_0_en","features.login.impl.screens.qrcode.scan_QrCodeScanView_Night_0_en",20323,], +["features.login.impl.screens.qrcode.scan_QrCodeScanView_Day_1_en","features.login.impl.screens.qrcode.scan_QrCodeScanView_Night_1_en",20323,], +["features.login.impl.screens.qrcode.scan_QrCodeScanView_Day_2_en","features.login.impl.screens.qrcode.scan_QrCodeScanView_Night_2_en",20323,], +["features.login.impl.screens.qrcode.scan_QrCodeScanView_Day_3_en","features.login.impl.screens.qrcode.scan_QrCodeScanView_Night_3_en",20323,], +["features.login.impl.screens.qrcode.scan_QrCodeScanView_Day_4_en","features.login.impl.screens.qrcode.scan_QrCodeScanView_Night_4_en",20323,], +["features.login.impl.screens.qrcode.scan_QrCodeScanView_Day_5_en","features.login.impl.screens.qrcode.scan_QrCodeScanView_Night_5_en",20323,], ["libraries.designsystem.theme.components_RadioButton_Toggles_en","",0,], -["features.rageshake.api.detection_RageshakeDialogContent_Day_0_en","features.rageshake.api.detection_RageshakeDialogContent_Night_0_en",20308,], -["features.rageshake.api.preferences_RageshakePreferencesView_Day_0_en","features.rageshake.api.preferences_RageshakePreferencesView_Night_0_en",20308,], +["features.rageshake.api.detection_RageshakeDialogContent_Day_0_en","features.rageshake.api.detection_RageshakeDialogContent_Night_0_en",20323,], +["features.rageshake.api.preferences_RageshakePreferencesView_Day_0_en","features.rageshake.api.preferences_RageshakePreferencesView_Night_0_en",20323,], ["features.rageshake.api.preferences_RageshakePreferencesView_Day_1_en","features.rageshake.api.preferences_RageshakePreferencesView_Night_1_en",0,], ["features.messages.impl.timeline.components.reactionsummary_ReactionSummaryViewContent_Day_0_en","features.messages.impl.timeline.components.reactionsummary_ReactionSummaryViewContent_Night_0_en",0,], -["features.messages.impl.timeline.components.receipt.bottomsheet_ReadReceiptBottomSheet_Day_0_en","features.messages.impl.timeline.components.receipt.bottomsheet_ReadReceiptBottomSheet_Night_0_en",20308,], -["features.messages.impl.timeline.components.receipt.bottomsheet_ReadReceiptBottomSheet_Day_1_en","features.messages.impl.timeline.components.receipt.bottomsheet_ReadReceiptBottomSheet_Night_1_en",20308,], -["features.messages.impl.timeline.components.receipt.bottomsheet_ReadReceiptBottomSheet_Day_2_en","features.messages.impl.timeline.components.receipt.bottomsheet_ReadReceiptBottomSheet_Night_2_en",20308,], -["features.messages.impl.timeline.components.receipt.bottomsheet_ReadReceiptBottomSheet_Day_3_en","features.messages.impl.timeline.components.receipt.bottomsheet_ReadReceiptBottomSheet_Night_3_en",20308,], -["features.messages.impl.timeline.components.receipt.bottomsheet_ReadReceiptBottomSheet_Day_4_en","features.messages.impl.timeline.components.receipt.bottomsheet_ReadReceiptBottomSheet_Night_4_en",20308,], -["features.messages.impl.timeline.components.receipt.bottomsheet_ReadReceiptBottomSheet_Day_5_en","features.messages.impl.timeline.components.receipt.bottomsheet_ReadReceiptBottomSheet_Night_5_en",20308,], -["features.securebackup.impl.setup.views_RecoveryKeyView_Day_0_en","features.securebackup.impl.setup.views_RecoveryKeyView_Night_0_en",20308,], -["features.securebackup.impl.setup.views_RecoveryKeyView_Day_10_en","features.securebackup.impl.setup.views_RecoveryKeyView_Night_10_en",20308,], -["features.securebackup.impl.setup.views_RecoveryKeyView_Day_11_en","features.securebackup.impl.setup.views_RecoveryKeyView_Night_11_en",20308,], -["features.securebackup.impl.setup.views_RecoveryKeyView_Day_12_en","features.securebackup.impl.setup.views_RecoveryKeyView_Night_12_en",20308,], -["features.securebackup.impl.setup.views_RecoveryKeyView_Day_13_en","features.securebackup.impl.setup.views_RecoveryKeyView_Night_13_en",20308,], -["features.securebackup.impl.setup.views_RecoveryKeyView_Day_1_en","features.securebackup.impl.setup.views_RecoveryKeyView_Night_1_en",20308,], -["features.securebackup.impl.setup.views_RecoveryKeyView_Day_2_en","features.securebackup.impl.setup.views_RecoveryKeyView_Night_2_en",20308,], -["features.securebackup.impl.setup.views_RecoveryKeyView_Day_3_en","features.securebackup.impl.setup.views_RecoveryKeyView_Night_3_en",20308,], -["features.securebackup.impl.setup.views_RecoveryKeyView_Day_4_en","features.securebackup.impl.setup.views_RecoveryKeyView_Night_4_en",20308,], -["features.securebackup.impl.setup.views_RecoveryKeyView_Day_5_en","features.securebackup.impl.setup.views_RecoveryKeyView_Night_5_en",20308,], -["features.securebackup.impl.setup.views_RecoveryKeyView_Day_6_en","features.securebackup.impl.setup.views_RecoveryKeyView_Night_6_en",20308,], -["features.securebackup.impl.setup.views_RecoveryKeyView_Day_7_en","features.securebackup.impl.setup.views_RecoveryKeyView_Night_7_en",20308,], -["features.securebackup.impl.setup.views_RecoveryKeyView_Day_8_en","features.securebackup.impl.setup.views_RecoveryKeyView_Night_8_en",20308,], -["features.securebackup.impl.setup.views_RecoveryKeyView_Day_9_en","features.securebackup.impl.setup.views_RecoveryKeyView_Night_9_en",20308,], +["features.messages.impl.timeline.components.receipt.bottomsheet_ReadReceiptBottomSheet_Day_0_en","features.messages.impl.timeline.components.receipt.bottomsheet_ReadReceiptBottomSheet_Night_0_en",20323,], +["features.messages.impl.timeline.components.receipt.bottomsheet_ReadReceiptBottomSheet_Day_1_en","features.messages.impl.timeline.components.receipt.bottomsheet_ReadReceiptBottomSheet_Night_1_en",20323,], +["features.messages.impl.timeline.components.receipt.bottomsheet_ReadReceiptBottomSheet_Day_2_en","features.messages.impl.timeline.components.receipt.bottomsheet_ReadReceiptBottomSheet_Night_2_en",20323,], +["features.messages.impl.timeline.components.receipt.bottomsheet_ReadReceiptBottomSheet_Day_3_en","features.messages.impl.timeline.components.receipt.bottomsheet_ReadReceiptBottomSheet_Night_3_en",20323,], +["features.messages.impl.timeline.components.receipt.bottomsheet_ReadReceiptBottomSheet_Day_4_en","features.messages.impl.timeline.components.receipt.bottomsheet_ReadReceiptBottomSheet_Night_4_en",20323,], +["features.messages.impl.timeline.components.receipt.bottomsheet_ReadReceiptBottomSheet_Day_5_en","features.messages.impl.timeline.components.receipt.bottomsheet_ReadReceiptBottomSheet_Night_5_en",20323,], +["features.securebackup.impl.setup.views_RecoveryKeyView_Day_0_en","features.securebackup.impl.setup.views_RecoveryKeyView_Night_0_en",20323,], +["features.securebackup.impl.setup.views_RecoveryKeyView_Day_10_en","features.securebackup.impl.setup.views_RecoveryKeyView_Night_10_en",20323,], +["features.securebackup.impl.setup.views_RecoveryKeyView_Day_11_en","features.securebackup.impl.setup.views_RecoveryKeyView_Night_11_en",20323,], +["features.securebackup.impl.setup.views_RecoveryKeyView_Day_12_en","features.securebackup.impl.setup.views_RecoveryKeyView_Night_12_en",20323,], +["features.securebackup.impl.setup.views_RecoveryKeyView_Day_13_en","features.securebackup.impl.setup.views_RecoveryKeyView_Night_13_en",20323,], +["features.securebackup.impl.setup.views_RecoveryKeyView_Day_14_en","features.securebackup.impl.setup.views_RecoveryKeyView_Night_14_en",20323,], +["features.securebackup.impl.setup.views_RecoveryKeyView_Day_1_en","features.securebackup.impl.setup.views_RecoveryKeyView_Night_1_en",20323,], +["features.securebackup.impl.setup.views_RecoveryKeyView_Day_2_en","features.securebackup.impl.setup.views_RecoveryKeyView_Night_2_en",20323,], +["features.securebackup.impl.setup.views_RecoveryKeyView_Day_3_en","features.securebackup.impl.setup.views_RecoveryKeyView_Night_3_en",20323,], +["features.securebackup.impl.setup.views_RecoveryKeyView_Day_4_en","features.securebackup.impl.setup.views_RecoveryKeyView_Night_4_en",20323,], +["features.securebackup.impl.setup.views_RecoveryKeyView_Day_5_en","features.securebackup.impl.setup.views_RecoveryKeyView_Night_5_en",20323,], +["features.securebackup.impl.setup.views_RecoveryKeyView_Day_6_en","features.securebackup.impl.setup.views_RecoveryKeyView_Night_6_en",20323,], +["features.securebackup.impl.setup.views_RecoveryKeyView_Day_7_en","features.securebackup.impl.setup.views_RecoveryKeyView_Night_7_en",20323,], +["features.securebackup.impl.setup.views_RecoveryKeyView_Day_8_en","features.securebackup.impl.setup.views_RecoveryKeyView_Night_8_en",20323,], +["features.securebackup.impl.setup.views_RecoveryKeyView_Day_9_en","features.securebackup.impl.setup.views_RecoveryKeyView_Night_9_en",20323,], ["libraries.designsystem.atomic.atoms_RedIndicatorAtom_Day_0_en","libraries.designsystem.atomic.atoms_RedIndicatorAtom_Night_0_en",0,], ["features.messages.impl.timeline.components_ReplySwipeIndicator_Day_0_en","features.messages.impl.timeline.components_ReplySwipeIndicator_Night_0_en",0,], -["features.messages.impl.report_ReportMessageView_Day_0_en","features.messages.impl.report_ReportMessageView_Night_0_en",20308,], -["features.messages.impl.report_ReportMessageView_Day_1_en","features.messages.impl.report_ReportMessageView_Night_1_en",20308,], -["features.messages.impl.report_ReportMessageView_Day_2_en","features.messages.impl.report_ReportMessageView_Night_2_en",20308,], -["features.messages.impl.report_ReportMessageView_Day_3_en","features.messages.impl.report_ReportMessageView_Night_3_en",20308,], -["features.messages.impl.report_ReportMessageView_Day_4_en","features.messages.impl.report_ReportMessageView_Night_4_en",20308,], -["features.messages.impl.report_ReportMessageView_Day_5_en","features.messages.impl.report_ReportMessageView_Night_5_en",20308,], -["features.reportroom.impl_ReportRoomView_Day_0_en","features.reportroom.impl_ReportRoomView_Night_0_en",20308,], -["features.reportroom.impl_ReportRoomView_Day_1_en","features.reportroom.impl_ReportRoomView_Night_1_en",20308,], -["features.reportroom.impl_ReportRoomView_Day_2_en","features.reportroom.impl_ReportRoomView_Night_2_en",20308,], -["features.reportroom.impl_ReportRoomView_Day_3_en","features.reportroom.impl_ReportRoomView_Night_3_en",20308,], -["features.reportroom.impl_ReportRoomView_Day_4_en","features.reportroom.impl_ReportRoomView_Night_4_en",20308,], -["features.securebackup.impl.reset.password_ResetIdentityPasswordView_Day_0_en","features.securebackup.impl.reset.password_ResetIdentityPasswordView_Night_0_en",20308,], -["features.securebackup.impl.reset.password_ResetIdentityPasswordView_Day_1_en","features.securebackup.impl.reset.password_ResetIdentityPasswordView_Night_1_en",20308,], -["features.securebackup.impl.reset.password_ResetIdentityPasswordView_Day_2_en","features.securebackup.impl.reset.password_ResetIdentityPasswordView_Night_2_en",20308,], -["features.securebackup.impl.reset.password_ResetIdentityPasswordView_Day_3_en","features.securebackup.impl.reset.password_ResetIdentityPasswordView_Night_3_en",20308,], -["features.securebackup.impl.reset.root_ResetIdentityRootView_Day_0_en","features.securebackup.impl.reset.root_ResetIdentityRootView_Night_0_en",20308,], -["features.securebackup.impl.reset.root_ResetIdentityRootView_Day_1_en","features.securebackup.impl.reset.root_ResetIdentityRootView_Night_1_en",20308,], +["features.messages.impl.report_ReportMessageView_Day_0_en","features.messages.impl.report_ReportMessageView_Night_0_en",20323,], +["features.messages.impl.report_ReportMessageView_Day_1_en","features.messages.impl.report_ReportMessageView_Night_1_en",20323,], +["features.messages.impl.report_ReportMessageView_Day_2_en","features.messages.impl.report_ReportMessageView_Night_2_en",20323,], +["features.messages.impl.report_ReportMessageView_Day_3_en","features.messages.impl.report_ReportMessageView_Night_3_en",20323,], +["features.messages.impl.report_ReportMessageView_Day_4_en","features.messages.impl.report_ReportMessageView_Night_4_en",20323,], +["features.messages.impl.report_ReportMessageView_Day_5_en","features.messages.impl.report_ReportMessageView_Night_5_en",20323,], +["features.reportroom.impl_ReportRoomView_Day_0_en","features.reportroom.impl_ReportRoomView_Night_0_en",20323,], +["features.reportroom.impl_ReportRoomView_Day_1_en","features.reportroom.impl_ReportRoomView_Night_1_en",20323,], +["features.reportroom.impl_ReportRoomView_Day_2_en","features.reportroom.impl_ReportRoomView_Night_2_en",20323,], +["features.reportroom.impl_ReportRoomView_Day_3_en","features.reportroom.impl_ReportRoomView_Night_3_en",20323,], +["features.reportroom.impl_ReportRoomView_Day_4_en","features.reportroom.impl_ReportRoomView_Night_4_en",20323,], +["features.securebackup.impl.reset.password_ResetIdentityPasswordView_Day_0_en","features.securebackup.impl.reset.password_ResetIdentityPasswordView_Night_0_en",20323,], +["features.securebackup.impl.reset.password_ResetIdentityPasswordView_Day_1_en","features.securebackup.impl.reset.password_ResetIdentityPasswordView_Night_1_en",20323,], +["features.securebackup.impl.reset.password_ResetIdentityPasswordView_Day_2_en","features.securebackup.impl.reset.password_ResetIdentityPasswordView_Night_2_en",20323,], +["features.securebackup.impl.reset.password_ResetIdentityPasswordView_Day_3_en","features.securebackup.impl.reset.password_ResetIdentityPasswordView_Night_3_en",20323,], +["features.securebackup.impl.reset.root_ResetIdentityRootView_Day_0_en","features.securebackup.impl.reset.root_ResetIdentityRootView_Night_0_en",20323,], +["features.securebackup.impl.reset.root_ResetIdentityRootView_Day_1_en","features.securebackup.impl.reset.root_ResetIdentityRootView_Night_1_en",20323,], ["features.messages.impl.crypto.sendfailure.resolve_ResolveVerifiedUserSendFailureView_Day_0_en","features.messages.impl.crypto.sendfailure.resolve_ResolveVerifiedUserSendFailureView_Night_0_en",0,], -["features.messages.impl.crypto.sendfailure.resolve_ResolveVerifiedUserSendFailureView_Day_1_en","features.messages.impl.crypto.sendfailure.resolve_ResolveVerifiedUserSendFailureView_Night_1_en",20308,], -["features.messages.impl.crypto.sendfailure.resolve_ResolveVerifiedUserSendFailureView_Day_2_en","features.messages.impl.crypto.sendfailure.resolve_ResolveVerifiedUserSendFailureView_Night_2_en",20308,], -["libraries.designsystem.components.dialogs_RetryDialogContent_Dialogs_en","",20308,], -["libraries.designsystem.components.dialogs_RetryDialog_Day_0_en","libraries.designsystem.components.dialogs_RetryDialog_Night_0_en",20308,], -["features.roomdetails.impl.rolesandpermissions_RolesAndPermissionsView_Day_0_en","features.roomdetails.impl.rolesandpermissions_RolesAndPermissionsView_Night_0_en",20308,], -["features.roomdetails.impl.rolesandpermissions_RolesAndPermissionsView_Day_1_en","features.roomdetails.impl.rolesandpermissions_RolesAndPermissionsView_Night_1_en",20308,], -["features.roomdetails.impl.rolesandpermissions_RolesAndPermissionsView_Day_2_en","features.roomdetails.impl.rolesandpermissions_RolesAndPermissionsView_Night_2_en",20308,], -["features.roomdetails.impl.rolesandpermissions_RolesAndPermissionsView_Day_3_en","features.roomdetails.impl.rolesandpermissions_RolesAndPermissionsView_Night_3_en",20308,], -["features.roomdetails.impl.rolesandpermissions_RolesAndPermissionsView_Day_4_en","features.roomdetails.impl.rolesandpermissions_RolesAndPermissionsView_Night_4_en",20308,], -["features.roomdetails.impl.rolesandpermissions_RolesAndPermissionsView_Day_5_en","features.roomdetails.impl.rolesandpermissions_RolesAndPermissionsView_Night_5_en",20308,], -["features.roomdetails.impl.rolesandpermissions_RolesAndPermissionsView_Day_6_en","features.roomdetails.impl.rolesandpermissions_RolesAndPermissionsView_Night_6_en",20308,], -["features.roomdetails.impl.rolesandpermissions_RolesAndPermissionsView_Day_7_en","features.roomdetails.impl.rolesandpermissions_RolesAndPermissionsView_Night_7_en",20308,], -["features.roomdetails.impl.rolesandpermissions_RolesAndPermissionsView_Day_8_en","features.roomdetails.impl.rolesandpermissions_RolesAndPermissionsView_Night_8_en",20308,], +["features.messages.impl.crypto.sendfailure.resolve_ResolveVerifiedUserSendFailureView_Day_1_en","features.messages.impl.crypto.sendfailure.resolve_ResolveVerifiedUserSendFailureView_Night_1_en",20323,], +["features.messages.impl.crypto.sendfailure.resolve_ResolveVerifiedUserSendFailureView_Day_2_en","features.messages.impl.crypto.sendfailure.resolve_ResolveVerifiedUserSendFailureView_Night_2_en",20323,], +["libraries.designsystem.components.dialogs_RetryDialogContent_Dialogs_en","",20323,], +["libraries.designsystem.components.dialogs_RetryDialog_Day_0_en","libraries.designsystem.components.dialogs_RetryDialog_Night_0_en",20323,], +["features.roomdetails.impl.rolesandpermissions_RolesAndPermissionsView_Day_0_en","features.roomdetails.impl.rolesandpermissions_RolesAndPermissionsView_Night_0_en",20323,], +["features.roomdetails.impl.rolesandpermissions_RolesAndPermissionsView_Day_1_en","features.roomdetails.impl.rolesandpermissions_RolesAndPermissionsView_Night_1_en",20323,], +["features.roomdetails.impl.rolesandpermissions_RolesAndPermissionsView_Day_2_en","features.roomdetails.impl.rolesandpermissions_RolesAndPermissionsView_Night_2_en",20323,], +["features.roomdetails.impl.rolesandpermissions_RolesAndPermissionsView_Day_3_en","features.roomdetails.impl.rolesandpermissions_RolesAndPermissionsView_Night_3_en",20323,], +["features.roomdetails.impl.rolesandpermissions_RolesAndPermissionsView_Day_4_en","features.roomdetails.impl.rolesandpermissions_RolesAndPermissionsView_Night_4_en",20323,], +["features.roomdetails.impl.rolesandpermissions_RolesAndPermissionsView_Day_5_en","features.roomdetails.impl.rolesandpermissions_RolesAndPermissionsView_Night_5_en",20323,], +["features.roomdetails.impl.rolesandpermissions_RolesAndPermissionsView_Day_6_en","features.roomdetails.impl.rolesandpermissions_RolesAndPermissionsView_Night_6_en",20323,], +["features.roomdetails.impl.rolesandpermissions_RolesAndPermissionsView_Day_7_en","features.roomdetails.impl.rolesandpermissions_RolesAndPermissionsView_Night_7_en",20323,], +["features.roomdetails.impl.rolesandpermissions_RolesAndPermissionsView_Day_8_en","features.roomdetails.impl.rolesandpermissions_RolesAndPermissionsView_Night_8_en",20323,], ["libraries.matrix.ui.room.address_RoomAddressField_Day_0_en","libraries.matrix.ui.room.address_RoomAddressField_Night_0_en",0,], ["features.roomaliasresolver.impl_RoomAliasResolverView_Day_0_en","features.roomaliasresolver.impl_RoomAliasResolverView_Night_0_en",0,], -["features.roomaliasresolver.impl_RoomAliasResolverView_Day_1_en","features.roomaliasresolver.impl_RoomAliasResolverView_Night_1_en",20308,], -["features.roomaliasresolver.impl_RoomAliasResolverView_Day_2_en","features.roomaliasresolver.impl_RoomAliasResolverView_Night_2_en",20308,], -["features.roomdetails.impl_RoomDetailsDark_0_en","",20308,], -["features.roomdetails.impl_RoomDetailsDark_10_en","",20308,], -["features.roomdetails.impl_RoomDetailsDark_11_en","",20308,], -["features.roomdetails.impl_RoomDetailsDark_12_en","",20308,], -["features.roomdetails.impl_RoomDetailsDark_13_en","",20308,], -["features.roomdetails.impl_RoomDetailsDark_14_en","",20308,], -["features.roomdetails.impl_RoomDetailsDark_15_en","",20308,], -["features.roomdetails.impl_RoomDetailsDark_16_en","",20308,], -["features.roomdetails.impl_RoomDetailsDark_17_en","",20308,], -["features.roomdetails.impl_RoomDetailsDark_18_en","",20308,], -["features.roomdetails.impl_RoomDetailsDark_19_en","",20308,], -["features.roomdetails.impl_RoomDetailsDark_1_en","",20308,], -["features.roomdetails.impl_RoomDetailsDark_2_en","",20308,], -["features.roomdetails.impl_RoomDetailsDark_3_en","",20308,], -["features.roomdetails.impl_RoomDetailsDark_4_en","",20308,], -["features.roomdetails.impl_RoomDetailsDark_5_en","",20308,], -["features.roomdetails.impl_RoomDetailsDark_6_en","",20308,], -["features.roomdetails.impl_RoomDetailsDark_7_en","",20308,], -["features.roomdetails.impl_RoomDetailsDark_8_en","",20308,], -["features.roomdetails.impl_RoomDetailsDark_9_en","",20308,], -["features.roomdetails.impl.edit_RoomDetailsEditView_Day_0_en","features.roomdetails.impl.edit_RoomDetailsEditView_Night_0_en",20308,], -["features.roomdetails.impl.edit_RoomDetailsEditView_Day_1_en","features.roomdetails.impl.edit_RoomDetailsEditView_Night_1_en",20308,], -["features.roomdetails.impl.edit_RoomDetailsEditView_Day_2_en","features.roomdetails.impl.edit_RoomDetailsEditView_Night_2_en",20308,], -["features.roomdetails.impl.edit_RoomDetailsEditView_Day_3_en","features.roomdetails.impl.edit_RoomDetailsEditView_Night_3_en",20308,], -["features.roomdetails.impl.edit_RoomDetailsEditView_Day_4_en","features.roomdetails.impl.edit_RoomDetailsEditView_Night_4_en",20308,], -["features.roomdetails.impl.edit_RoomDetailsEditView_Day_5_en","features.roomdetails.impl.edit_RoomDetailsEditView_Night_5_en",20308,], -["features.roomdetails.impl.edit_RoomDetailsEditView_Day_6_en","features.roomdetails.impl.edit_RoomDetailsEditView_Night_6_en",20308,], -["features.roomdetails.impl.edit_RoomDetailsEditView_Day_7_en","features.roomdetails.impl.edit_RoomDetailsEditView_Night_7_en",20308,], -["features.roomdetails.impl_RoomDetails_0_en","",20308,], -["features.roomdetails.impl_RoomDetails_10_en","",20308,], -["features.roomdetails.impl_RoomDetails_11_en","",20308,], -["features.roomdetails.impl_RoomDetails_12_en","",20308,], -["features.roomdetails.impl_RoomDetails_13_en","",20308,], -["features.roomdetails.impl_RoomDetails_14_en","",20308,], -["features.roomdetails.impl_RoomDetails_15_en","",20308,], -["features.roomdetails.impl_RoomDetails_16_en","",20308,], -["features.roomdetails.impl_RoomDetails_17_en","",20308,], -["features.roomdetails.impl_RoomDetails_18_en","",20308,], -["features.roomdetails.impl_RoomDetails_19_en","",20308,], -["features.roomdetails.impl_RoomDetails_1_en","",20308,], -["features.roomdetails.impl_RoomDetails_2_en","",20308,], -["features.roomdetails.impl_RoomDetails_3_en","",20308,], -["features.roomdetails.impl_RoomDetails_4_en","",20308,], -["features.roomdetails.impl_RoomDetails_5_en","",20308,], -["features.roomdetails.impl_RoomDetails_6_en","",20308,], -["features.roomdetails.impl_RoomDetails_7_en","",20308,], -["features.roomdetails.impl_RoomDetails_8_en","",20308,], -["features.roomdetails.impl_RoomDetails_9_en","",20308,], -["features.roomdirectory.impl.root_RoomDirectoryView_Day_0_en","features.roomdirectory.impl.root_RoomDirectoryView_Night_0_en",20308,], -["features.roomdirectory.impl.root_RoomDirectoryView_Day_1_en","features.roomdirectory.impl.root_RoomDirectoryView_Night_1_en",20308,], -["features.roomdirectory.impl.root_RoomDirectoryView_Day_2_en","features.roomdirectory.impl.root_RoomDirectoryView_Night_2_en",20308,], -["features.roomdetails.impl.invite_RoomInviteMembersView_Day_0_en","features.roomdetails.impl.invite_RoomInviteMembersView_Night_0_en",20308,], -["features.roomdetails.impl.invite_RoomInviteMembersView_Day_1_en","features.roomdetails.impl.invite_RoomInviteMembersView_Night_1_en",20308,], -["features.roomdetails.impl.invite_RoomInviteMembersView_Day_2_en","features.roomdetails.impl.invite_RoomInviteMembersView_Night_2_en",20308,], -["features.roomdetails.impl.invite_RoomInviteMembersView_Day_3_en","features.roomdetails.impl.invite_RoomInviteMembersView_Night_3_en",20308,], -["features.roomdetails.impl.invite_RoomInviteMembersView_Day_4_en","features.roomdetails.impl.invite_RoomInviteMembersView_Night_4_en",20308,], -["features.roomdetails.impl.invite_RoomInviteMembersView_Day_5_en","features.roomdetails.impl.invite_RoomInviteMembersView_Night_5_en",20308,], -["features.roomdetails.impl.invite_RoomInviteMembersView_Day_6_en","features.roomdetails.impl.invite_RoomInviteMembersView_Night_6_en",20308,], -["features.roomdetails.impl.invite_RoomInviteMembersView_Day_7_en","features.roomdetails.impl.invite_RoomInviteMembersView_Night_7_en",20308,], -["features.home.impl.components_RoomListContentView_Day_0_en","features.home.impl.components_RoomListContentView_Night_0_en",20308,], -["features.home.impl.components_RoomListContentView_Day_1_en","features.home.impl.components_RoomListContentView_Night_1_en",20308,], +["features.roomaliasresolver.impl_RoomAliasResolverView_Day_1_en","features.roomaliasresolver.impl_RoomAliasResolverView_Night_1_en",20323,], +["features.roomaliasresolver.impl_RoomAliasResolverView_Day_2_en","features.roomaliasresolver.impl_RoomAliasResolverView_Night_2_en",20323,], +["features.roomdetails.impl_RoomDetailsDark_0_en","",20323,], +["features.roomdetails.impl_RoomDetailsDark_10_en","",20323,], +["features.roomdetails.impl_RoomDetailsDark_11_en","",20323,], +["features.roomdetails.impl_RoomDetailsDark_12_en","",20323,], +["features.roomdetails.impl_RoomDetailsDark_13_en","",20323,], +["features.roomdetails.impl_RoomDetailsDark_14_en","",20323,], +["features.roomdetails.impl_RoomDetailsDark_15_en","",20323,], +["features.roomdetails.impl_RoomDetailsDark_16_en","",20323,], +["features.roomdetails.impl_RoomDetailsDark_17_en","",20323,], +["features.roomdetails.impl_RoomDetailsDark_18_en","",20323,], +["features.roomdetails.impl_RoomDetailsDark_19_en","",20323,], +["features.roomdetails.impl_RoomDetailsDark_1_en","",20323,], +["features.roomdetails.impl_RoomDetailsDark_2_en","",20323,], +["features.roomdetails.impl_RoomDetailsDark_3_en","",20323,], +["features.roomdetails.impl_RoomDetailsDark_4_en","",20323,], +["features.roomdetails.impl_RoomDetailsDark_5_en","",20323,], +["features.roomdetails.impl_RoomDetailsDark_6_en","",20323,], +["features.roomdetails.impl_RoomDetailsDark_7_en","",20323,], +["features.roomdetails.impl_RoomDetailsDark_8_en","",20323,], +["features.roomdetails.impl_RoomDetailsDark_9_en","",20323,], +["features.roomdetails.impl.edit_RoomDetailsEditView_Day_0_en","features.roomdetails.impl.edit_RoomDetailsEditView_Night_0_en",20323,], +["features.roomdetails.impl.edit_RoomDetailsEditView_Day_1_en","features.roomdetails.impl.edit_RoomDetailsEditView_Night_1_en",20323,], +["features.roomdetails.impl.edit_RoomDetailsEditView_Day_2_en","features.roomdetails.impl.edit_RoomDetailsEditView_Night_2_en",20323,], +["features.roomdetails.impl.edit_RoomDetailsEditView_Day_3_en","features.roomdetails.impl.edit_RoomDetailsEditView_Night_3_en",20323,], +["features.roomdetails.impl.edit_RoomDetailsEditView_Day_4_en","features.roomdetails.impl.edit_RoomDetailsEditView_Night_4_en",20323,], +["features.roomdetails.impl.edit_RoomDetailsEditView_Day_5_en","features.roomdetails.impl.edit_RoomDetailsEditView_Night_5_en",20323,], +["features.roomdetails.impl.edit_RoomDetailsEditView_Day_6_en","features.roomdetails.impl.edit_RoomDetailsEditView_Night_6_en",20323,], +["features.roomdetails.impl.edit_RoomDetailsEditView_Day_7_en","features.roomdetails.impl.edit_RoomDetailsEditView_Night_7_en",20323,], +["features.roomdetails.impl_RoomDetails_0_en","",20323,], +["features.roomdetails.impl_RoomDetails_10_en","",20323,], +["features.roomdetails.impl_RoomDetails_11_en","",20323,], +["features.roomdetails.impl_RoomDetails_12_en","",20323,], +["features.roomdetails.impl_RoomDetails_13_en","",20323,], +["features.roomdetails.impl_RoomDetails_14_en","",20323,], +["features.roomdetails.impl_RoomDetails_15_en","",20323,], +["features.roomdetails.impl_RoomDetails_16_en","",20323,], +["features.roomdetails.impl_RoomDetails_17_en","",20323,], +["features.roomdetails.impl_RoomDetails_18_en","",20323,], +["features.roomdetails.impl_RoomDetails_19_en","",20323,], +["features.roomdetails.impl_RoomDetails_1_en","",20323,], +["features.roomdetails.impl_RoomDetails_2_en","",20323,], +["features.roomdetails.impl_RoomDetails_3_en","",20323,], +["features.roomdetails.impl_RoomDetails_4_en","",20323,], +["features.roomdetails.impl_RoomDetails_5_en","",20323,], +["features.roomdetails.impl_RoomDetails_6_en","",20323,], +["features.roomdetails.impl_RoomDetails_7_en","",20323,], +["features.roomdetails.impl_RoomDetails_8_en","",20323,], +["features.roomdetails.impl_RoomDetails_9_en","",20323,], +["features.roomdirectory.impl.root_RoomDirectoryView_Day_0_en","features.roomdirectory.impl.root_RoomDirectoryView_Night_0_en",20323,], +["features.roomdirectory.impl.root_RoomDirectoryView_Day_1_en","features.roomdirectory.impl.root_RoomDirectoryView_Night_1_en",20323,], +["features.roomdirectory.impl.root_RoomDirectoryView_Day_2_en","features.roomdirectory.impl.root_RoomDirectoryView_Night_2_en",20323,], +["features.roomdetails.impl.invite_RoomInviteMembersView_Day_0_en","features.roomdetails.impl.invite_RoomInviteMembersView_Night_0_en",20323,], +["features.roomdetails.impl.invite_RoomInviteMembersView_Day_1_en","features.roomdetails.impl.invite_RoomInviteMembersView_Night_1_en",20323,], +["features.roomdetails.impl.invite_RoomInviteMembersView_Day_2_en","features.roomdetails.impl.invite_RoomInviteMembersView_Night_2_en",20323,], +["features.home.impl.components_RoomListContentView_Day_0_en","features.home.impl.components_RoomListContentView_Night_0_en",20323,], +["features.home.impl.components_RoomListContentView_Day_1_en","features.home.impl.components_RoomListContentView_Night_1_en",20323,], ["features.home.impl.components_RoomListContentView_Day_2_en","features.home.impl.components_RoomListContentView_Night_2_en",0,], -["features.home.impl.components_RoomListContentView_Day_3_en","features.home.impl.components_RoomListContentView_Night_3_en",20308,], -["features.home.impl.components_RoomListContentView_Day_4_en","features.home.impl.components_RoomListContentView_Night_4_en",20308,], -["features.home.impl.roomlist_RoomListDeclineInviteMenuContent_Day_0_en","features.home.impl.roomlist_RoomListDeclineInviteMenuContent_Night_0_en",20308,], -["features.home.impl.filters_RoomListFiltersView_Day_0_en","features.home.impl.filters_RoomListFiltersView_Night_0_en",20308,], -["features.home.impl.filters_RoomListFiltersView_Day_1_en","features.home.impl.filters_RoomListFiltersView_Night_1_en",20308,], -["features.home.impl.roomlist_RoomListModalBottomSheetContent_Day_0_en","features.home.impl.roomlist_RoomListModalBottomSheetContent_Night_0_en",20308,], -["features.home.impl.roomlist_RoomListModalBottomSheetContent_Day_1_en","features.home.impl.roomlist_RoomListModalBottomSheetContent_Night_1_en",20308,], -["features.home.impl.roomlist_RoomListModalBottomSheetContent_Day_2_en","features.home.impl.roomlist_RoomListModalBottomSheetContent_Night_2_en",20308,], +["features.home.impl.components_RoomListContentView_Day_3_en","features.home.impl.components_RoomListContentView_Night_3_en",20323,], +["features.home.impl.components_RoomListContentView_Day_4_en","features.home.impl.components_RoomListContentView_Night_4_en",20323,], +["features.home.impl.roomlist_RoomListDeclineInviteMenuContent_Day_0_en","features.home.impl.roomlist_RoomListDeclineInviteMenuContent_Night_0_en",20323,], +["features.home.impl.filters_RoomListFiltersView_Day_0_en","features.home.impl.filters_RoomListFiltersView_Night_0_en",20323,], +["features.home.impl.filters_RoomListFiltersView_Day_1_en","features.home.impl.filters_RoomListFiltersView_Night_1_en",20323,], +["features.home.impl.roomlist_RoomListModalBottomSheetContent_Day_0_en","features.home.impl.roomlist_RoomListModalBottomSheetContent_Night_0_en",20323,], +["features.home.impl.roomlist_RoomListModalBottomSheetContent_Day_1_en","features.home.impl.roomlist_RoomListModalBottomSheetContent_Night_1_en",20323,], +["features.home.impl.roomlist_RoomListModalBottomSheetContent_Day_2_en","features.home.impl.roomlist_RoomListModalBottomSheetContent_Night_2_en",20323,], ["features.home.impl.search_RoomListSearchContent_Day_0_en","features.home.impl.search_RoomListSearchContent_Night_0_en",0,], -["features.home.impl.search_RoomListSearchContent_Day_1_en","features.home.impl.search_RoomListSearchContent_Night_1_en",20308,], -["features.roomdetails.impl.members_RoomMemberListViewBanned_Day_0_en","features.roomdetails.impl.members_RoomMemberListViewBanned_Night_0_en",20308,], -["features.roomdetails.impl.members_RoomMemberListViewBanned_Day_1_en","features.roomdetails.impl.members_RoomMemberListViewBanned_Night_1_en",20308,], -["features.roomdetails.impl.members_RoomMemberListViewBanned_Day_2_en","features.roomdetails.impl.members_RoomMemberListViewBanned_Night_2_en",20308,], -["features.roomdetails.impl.members_RoomMemberListView_Day_0_en","features.roomdetails.impl.members_RoomMemberListView_Night_0_en",20308,], -["features.roomdetails.impl.members_RoomMemberListView_Day_1_en","features.roomdetails.impl.members_RoomMemberListView_Night_1_en",20308,], -["features.roomdetails.impl.members_RoomMemberListView_Day_2_en","features.roomdetails.impl.members_RoomMemberListView_Night_2_en",20308,], -["features.roomdetails.impl.members_RoomMemberListView_Day_3_en","features.roomdetails.impl.members_RoomMemberListView_Night_3_en",20308,], -["features.roomdetails.impl.members_RoomMemberListView_Day_4_en","features.roomdetails.impl.members_RoomMemberListView_Night_4_en",20308,], -["features.roomdetails.impl.members_RoomMemberListView_Day_5_en","features.roomdetails.impl.members_RoomMemberListView_Night_5_en",20308,], +["features.home.impl.search_RoomListSearchContent_Day_1_en","features.home.impl.search_RoomListSearchContent_Night_1_en",20323,], +["features.roomdetails.impl.members_RoomMemberListViewBanned_Day_0_en","features.roomdetails.impl.members_RoomMemberListViewBanned_Night_0_en",20323,], +["features.roomdetails.impl.members_RoomMemberListViewBanned_Day_1_en","features.roomdetails.impl.members_RoomMemberListViewBanned_Night_1_en",20323,], +["features.roomdetails.impl.members_RoomMemberListViewBanned_Day_2_en","features.roomdetails.impl.members_RoomMemberListViewBanned_Night_2_en",20323,], +["features.roomdetails.impl.members_RoomMemberListView_Day_0_en","features.roomdetails.impl.members_RoomMemberListView_Night_0_en",20323,], +["features.roomdetails.impl.members_RoomMemberListView_Day_1_en","features.roomdetails.impl.members_RoomMemberListView_Night_1_en",20323,], +["features.roomdetails.impl.members_RoomMemberListView_Day_2_en","features.roomdetails.impl.members_RoomMemberListView_Night_2_en",20323,], +["features.roomdetails.impl.members_RoomMemberListView_Day_3_en","features.roomdetails.impl.members_RoomMemberListView_Night_3_en",20323,], +["features.roomdetails.impl.members_RoomMemberListView_Day_4_en","features.roomdetails.impl.members_RoomMemberListView_Night_4_en",20323,], +["features.roomdetails.impl.members_RoomMemberListView_Day_5_en","features.roomdetails.impl.members_RoomMemberListView_Night_5_en",20323,], ["features.roomdetails.impl.members_RoomMemberListView_Day_6_en","features.roomdetails.impl.members_RoomMemberListView_Night_6_en",0,], -["features.roomdetails.impl.members_RoomMemberListView_Day_7_en","features.roomdetails.impl.members_RoomMemberListView_Night_7_en",20308,], -["features.roomdetails.impl.members_RoomMemberListView_Day_8_en","features.roomdetails.impl.members_RoomMemberListView_Night_8_en",20308,], -["features.roomdetails.impl.members_RoomMemberListView_Day_9_en","features.roomdetails.impl.members_RoomMemberListView_Night_9_en",20308,], -["features.roommembermoderation.impl_RoomMemberModerationView_Day_0_en","features.roommembermoderation.impl_RoomMemberModerationView_Night_0_en",20308,], -["features.roommembermoderation.impl_RoomMemberModerationView_Day_1_en","features.roommembermoderation.impl_RoomMemberModerationView_Night_1_en",20308,], -["features.roommembermoderation.impl_RoomMemberModerationView_Day_2_en","features.roommembermoderation.impl_RoomMemberModerationView_Night_2_en",20308,], -["features.roommembermoderation.impl_RoomMemberModerationView_Day_3_en","features.roommembermoderation.impl_RoomMemberModerationView_Night_3_en",20308,], -["features.roommembermoderation.impl_RoomMemberModerationView_Day_4_en","features.roommembermoderation.impl_RoomMemberModerationView_Night_4_en",20308,], -["features.roommembermoderation.impl_RoomMemberModerationView_Day_5_en","features.roommembermoderation.impl_RoomMemberModerationView_Night_5_en",20308,], -["features.roommembermoderation.impl_RoomMemberModerationView_Day_6_en","features.roommembermoderation.impl_RoomMemberModerationView_Night_6_en",20308,], -["features.roommembermoderation.impl_RoomMemberModerationView_Day_7_en","features.roommembermoderation.impl_RoomMemberModerationView_Night_7_en",20308,], -["libraries.designsystem.atomic.molecules_RoomMembersCountMolecule_Day_0_en","libraries.designsystem.atomic.molecules_RoomMembersCountMolecule_Night_0_en",0,], -["features.roomdetails.impl.notificationsettings_RoomNotificationSettingsOption_Day_0_en","features.roomdetails.impl.notificationsettings_RoomNotificationSettingsOption_Night_0_en",20308,], -["features.roomdetails.impl.notificationsettings_RoomNotificationSettingsView_Day_0_en","features.roomdetails.impl.notificationsettings_RoomNotificationSettingsView_Night_0_en",20308,], -["features.roomdetails.impl.notificationsettings_RoomNotificationSettingsView_Day_1_en","features.roomdetails.impl.notificationsettings_RoomNotificationSettingsView_Night_1_en",20308,], -["features.roomdetails.impl.notificationsettings_RoomNotificationSettingsView_Day_2_en","features.roomdetails.impl.notificationsettings_RoomNotificationSettingsView_Night_2_en",20308,], -["features.roomdetails.impl.notificationsettings_RoomNotificationSettingsView_Day_3_en","features.roomdetails.impl.notificationsettings_RoomNotificationSettingsView_Night_3_en",20308,], -["features.roomdetails.impl.notificationsettings_RoomNotificationSettingsView_Day_4_en","features.roomdetails.impl.notificationsettings_RoomNotificationSettingsView_Night_4_en",20308,], -["features.roomdetails.impl.notificationsettings_RoomNotificationSettingsView_Day_5_en","features.roomdetails.impl.notificationsettings_RoomNotificationSettingsView_Night_5_en",20308,], -["features.roomdetails.impl.notificationsettings_RoomNotificationSettingsView_Day_6_en","features.roomdetails.impl.notificationsettings_RoomNotificationSettingsView_Night_6_en",20308,], -["libraries.roomselect.impl_RoomSelectView_Day_0_en","libraries.roomselect.impl_RoomSelectView_Night_0_en",20308,], -["libraries.roomselect.impl_RoomSelectView_Day_1_en","libraries.roomselect.impl_RoomSelectView_Night_1_en",20308,], -["libraries.roomselect.impl_RoomSelectView_Day_2_en","libraries.roomselect.impl_RoomSelectView_Night_2_en",20308,], -["libraries.roomselect.impl_RoomSelectView_Day_3_en","libraries.roomselect.impl_RoomSelectView_Night_3_en",20308,], -["libraries.roomselect.impl_RoomSelectView_Day_4_en","libraries.roomselect.impl_RoomSelectView_Night_4_en",20308,], -["libraries.roomselect.impl_RoomSelectView_Day_5_en","libraries.roomselect.impl_RoomSelectView_Night_5_en",20308,], +["features.roomdetails.impl.members_RoomMemberListView_Day_7_en","features.roomdetails.impl.members_RoomMemberListView_Night_7_en",20323,], +["features.roomdetails.impl.members_RoomMemberListView_Day_8_en","features.roomdetails.impl.members_RoomMemberListView_Night_8_en",20323,], +["features.roomdetails.impl.members_RoomMemberListView_Day_9_en","features.roomdetails.impl.members_RoomMemberListView_Night_9_en",20323,], +["features.roommembermoderation.impl_RoomMemberModerationView_Day_0_en","features.roommembermoderation.impl_RoomMemberModerationView_Night_0_en",20323,], +["features.roommembermoderation.impl_RoomMemberModerationView_Day_1_en","features.roommembermoderation.impl_RoomMemberModerationView_Night_1_en",20323,], +["features.roommembermoderation.impl_RoomMemberModerationView_Day_2_en","features.roommembermoderation.impl_RoomMemberModerationView_Night_2_en",20323,], +["features.roommembermoderation.impl_RoomMemberModerationView_Day_3_en","features.roommembermoderation.impl_RoomMemberModerationView_Night_3_en",20323,], +["features.roommembermoderation.impl_RoomMemberModerationView_Day_4_en","features.roommembermoderation.impl_RoomMemberModerationView_Night_4_en",20323,], +["features.roommembermoderation.impl_RoomMemberModerationView_Day_5_en","features.roommembermoderation.impl_RoomMemberModerationView_Night_5_en",20323,], +["features.roommembermoderation.impl_RoomMemberModerationView_Day_6_en","features.roommembermoderation.impl_RoomMemberModerationView_Night_6_en",20323,], +["features.roommembermoderation.impl_RoomMemberModerationView_Day_7_en","features.roommembermoderation.impl_RoomMemberModerationView_Night_7_en",20323,], +["features.roomdetails.impl.notificationsettings_RoomNotificationSettingsOption_Day_0_en","features.roomdetails.impl.notificationsettings_RoomNotificationSettingsOption_Night_0_en",20323,], +["features.roomdetails.impl.notificationsettings_RoomNotificationSettingsView_Day_0_en","features.roomdetails.impl.notificationsettings_RoomNotificationSettingsView_Night_0_en",20323,], +["features.roomdetails.impl.notificationsettings_RoomNotificationSettingsView_Day_1_en","features.roomdetails.impl.notificationsettings_RoomNotificationSettingsView_Night_1_en",20323,], +["features.roomdetails.impl.notificationsettings_RoomNotificationSettingsView_Day_2_en","features.roomdetails.impl.notificationsettings_RoomNotificationSettingsView_Night_2_en",20323,], +["features.roomdetails.impl.notificationsettings_RoomNotificationSettingsView_Day_3_en","features.roomdetails.impl.notificationsettings_RoomNotificationSettingsView_Night_3_en",20323,], +["features.roomdetails.impl.notificationsettings_RoomNotificationSettingsView_Day_4_en","features.roomdetails.impl.notificationsettings_RoomNotificationSettingsView_Night_4_en",20323,], +["features.roomdetails.impl.notificationsettings_RoomNotificationSettingsView_Day_5_en","features.roomdetails.impl.notificationsettings_RoomNotificationSettingsView_Night_5_en",20323,], +["features.roomdetails.impl.notificationsettings_RoomNotificationSettingsView_Day_6_en","features.roomdetails.impl.notificationsettings_RoomNotificationSettingsView_Night_6_en",20323,], +["libraries.roomselect.impl_RoomSelectView_Day_0_en","libraries.roomselect.impl_RoomSelectView_Night_0_en",20323,], +["libraries.roomselect.impl_RoomSelectView_Day_1_en","libraries.roomselect.impl_RoomSelectView_Night_1_en",20323,], +["libraries.roomselect.impl_RoomSelectView_Day_2_en","libraries.roomselect.impl_RoomSelectView_Night_2_en",20323,], +["libraries.roomselect.impl_RoomSelectView_Day_3_en","libraries.roomselect.impl_RoomSelectView_Night_3_en",20323,], +["libraries.roomselect.impl_RoomSelectView_Day_4_en","libraries.roomselect.impl_RoomSelectView_Night_4_en",20323,], +["libraries.roomselect.impl_RoomSelectView_Day_5_en","libraries.roomselect.impl_RoomSelectView_Night_5_en",20323,], ["features.home.impl.components_RoomSummaryPlaceholderRow_Day_0_en","features.home.impl.components_RoomSummaryPlaceholderRow_Night_0_en",0,], ["features.home.impl.components_RoomSummaryRow_Day_0_en","features.home.impl.components_RoomSummaryRow_Night_0_en",0,], ["features.home.impl.components_RoomSummaryRow_Day_10_en","features.home.impl.components_RoomSummaryRow_Night_10_en",0,], @@ -1061,13 +1086,13 @@ export const screenshots = [ ["features.home.impl.components_RoomSummaryRow_Day_26_en","features.home.impl.components_RoomSummaryRow_Night_26_en",0,], ["features.home.impl.components_RoomSummaryRow_Day_27_en","features.home.impl.components_RoomSummaryRow_Night_27_en",0,], ["features.home.impl.components_RoomSummaryRow_Day_28_en","features.home.impl.components_RoomSummaryRow_Night_28_en",0,], -["features.home.impl.components_RoomSummaryRow_Day_29_en","features.home.impl.components_RoomSummaryRow_Night_29_en",20308,], -["features.home.impl.components_RoomSummaryRow_Day_2_en","features.home.impl.components_RoomSummaryRow_Night_2_en",20308,], -["features.home.impl.components_RoomSummaryRow_Day_30_en","features.home.impl.components_RoomSummaryRow_Night_30_en",20308,], -["features.home.impl.components_RoomSummaryRow_Day_31_en","features.home.impl.components_RoomSummaryRow_Night_31_en",20308,], -["features.home.impl.components_RoomSummaryRow_Day_32_en","features.home.impl.components_RoomSummaryRow_Night_32_en",20308,], -["features.home.impl.components_RoomSummaryRow_Day_33_en","features.home.impl.components_RoomSummaryRow_Night_33_en",20308,], -["features.home.impl.components_RoomSummaryRow_Day_34_en","features.home.impl.components_RoomSummaryRow_Night_34_en",20308,], +["features.home.impl.components_RoomSummaryRow_Day_29_en","features.home.impl.components_RoomSummaryRow_Night_29_en",20323,], +["features.home.impl.components_RoomSummaryRow_Day_2_en","features.home.impl.components_RoomSummaryRow_Night_2_en",20323,], +["features.home.impl.components_RoomSummaryRow_Day_30_en","features.home.impl.components_RoomSummaryRow_Night_30_en",20323,], +["features.home.impl.components_RoomSummaryRow_Day_31_en","features.home.impl.components_RoomSummaryRow_Night_31_en",20323,], +["features.home.impl.components_RoomSummaryRow_Day_32_en","features.home.impl.components_RoomSummaryRow_Night_32_en",20323,], +["features.home.impl.components_RoomSummaryRow_Day_33_en","features.home.impl.components_RoomSummaryRow_Night_33_en",20323,], +["features.home.impl.components_RoomSummaryRow_Day_34_en","features.home.impl.components_RoomSummaryRow_Night_34_en",20323,], ["features.home.impl.components_RoomSummaryRow_Day_3_en","features.home.impl.components_RoomSummaryRow_Night_3_en",0,], ["features.home.impl.components_RoomSummaryRow_Day_4_en","features.home.impl.components_RoomSummaryRow_Night_4_en",0,], ["features.home.impl.components_RoomSummaryRow_Day_5_en","features.home.impl.components_RoomSummaryRow_Night_5_en",0,], @@ -1075,91 +1100,98 @@ export const screenshots = [ ["features.home.impl.components_RoomSummaryRow_Day_7_en","features.home.impl.components_RoomSummaryRow_Night_7_en",0,], ["features.home.impl.components_RoomSummaryRow_Day_8_en","features.home.impl.components_RoomSummaryRow_Night_8_en",0,], ["features.home.impl.components_RoomSummaryRow_Day_9_en","features.home.impl.components_RoomSummaryRow_Night_9_en",0,], -["appnav.root_RootView_Day_0_en","appnav.root_RootView_Night_0_en",20308,], -["appnav.root_RootView_Day_1_en","appnav.root_RootView_Night_1_en",20308,], -["appnav.root_RootView_Day_2_en","appnav.root_RootView_Night_2_en",20308,], +["appnav.root_RootView_Day_0_en","appnav.root_RootView_Night_0_en",20323,], +["appnav.root_RootView_Day_1_en","appnav.root_RootView_Night_1_en",20323,], +["appnav.root_RootView_Day_2_en","appnav.root_RootView_Night_2_en",20323,], ["appicon.enterprise_RoundIcon_en","",0,], ["appicon.element_RoundIcon_en","",0,], ["libraries.designsystem.atomic.atoms_RoundedIconAtom_Day_0_en","libraries.designsystem.atomic.atoms_RoundedIconAtom_Night_0_en",0,], -["features.verifysession.impl.emoji_SasEmojis_Day_0_en","features.verifysession.impl.emoji_SasEmojis_Night_0_en",20308,], -["features.login.impl.screens.searchaccountprovider_SearchAccountProviderView_Day_0_en","features.login.impl.screens.searchaccountprovider_SearchAccountProviderView_Night_0_en",20308,], -["features.login.impl.screens.searchaccountprovider_SearchAccountProviderView_Day_1_en","features.login.impl.screens.searchaccountprovider_SearchAccountProviderView_Night_1_en",20308,], +["features.verifysession.impl.emoji_SasEmojis_Day_0_en","features.verifysession.impl.emoji_SasEmojis_Night_0_en",20323,], +["features.login.impl.screens.searchaccountprovider_SearchAccountProviderView_Day_0_en","features.login.impl.screens.searchaccountprovider_SearchAccountProviderView_Night_0_en",20323,], +["features.login.impl.screens.searchaccountprovider_SearchAccountProviderView_Day_1_en","features.login.impl.screens.searchaccountprovider_SearchAccountProviderView_Night_1_en",20323,], ["libraries.designsystem.theme.components_SearchBarActiveNoneQuery_Search_views_en","",0,], ["libraries.designsystem.theme.components_SearchBarActiveWithContent_Search_views_en","",0,], -["libraries.designsystem.theme.components_SearchBarActiveWithNoResults_Search_views_en","",20308,], +["libraries.designsystem.theme.components_SearchBarActiveWithNoResults_Search_views_en","",20323,], ["libraries.designsystem.theme.components_SearchBarActiveWithQueryNoBackButton_Search_views_en","",0,], ["libraries.designsystem.theme.components_SearchBarActiveWithQuery_Search_views_en","",0,], ["libraries.designsystem.theme.components_SearchBarInactive_Search_views_en","",0,], -["features.createroom.impl.components_SearchMultipleUsersResultItem_en","",20308,], -["features.createroom.impl.components_SearchSingleUserResultItem_en","",20308,], -["features.securebackup.impl.disable_SecureBackupDisableView_Day_0_en","features.securebackup.impl.disable_SecureBackupDisableView_Night_0_en",20308,], -["features.securebackup.impl.disable_SecureBackupDisableView_Day_1_en","features.securebackup.impl.disable_SecureBackupDisableView_Night_1_en",20308,], -["features.securebackup.impl.disable_SecureBackupDisableView_Day_2_en","features.securebackup.impl.disable_SecureBackupDisableView_Night_2_en",20308,], -["features.securebackup.impl.disable_SecureBackupDisableView_Day_3_en","features.securebackup.impl.disable_SecureBackupDisableView_Night_3_en",20308,], -["features.securebackup.impl.enter_SecureBackupEnterRecoveryKeyView_Day_0_en","features.securebackup.impl.enter_SecureBackupEnterRecoveryKeyView_Night_0_en",20308,], -["features.securebackup.impl.enter_SecureBackupEnterRecoveryKeyView_Day_1_en","features.securebackup.impl.enter_SecureBackupEnterRecoveryKeyView_Night_1_en",20308,], -["features.securebackup.impl.enter_SecureBackupEnterRecoveryKeyView_Day_2_en","features.securebackup.impl.enter_SecureBackupEnterRecoveryKeyView_Night_2_en",20308,], -["features.securebackup.impl.enter_SecureBackupEnterRecoveryKeyView_Day_3_en","features.securebackup.impl.enter_SecureBackupEnterRecoveryKeyView_Night_3_en",20308,], -["features.securebackup.impl.root_SecureBackupRootView_Day_0_en","features.securebackup.impl.root_SecureBackupRootView_Night_0_en",20308,], -["features.securebackup.impl.root_SecureBackupRootView_Day_10_en","features.securebackup.impl.root_SecureBackupRootView_Night_10_en",20308,], -["features.securebackup.impl.root_SecureBackupRootView_Day_11_en","features.securebackup.impl.root_SecureBackupRootView_Night_11_en",20308,], -["features.securebackup.impl.root_SecureBackupRootView_Day_12_en","features.securebackup.impl.root_SecureBackupRootView_Night_12_en",20308,], -["features.securebackup.impl.root_SecureBackupRootView_Day_13_en","features.securebackup.impl.root_SecureBackupRootView_Night_13_en",20308,], -["features.securebackup.impl.root_SecureBackupRootView_Day_14_en","features.securebackup.impl.root_SecureBackupRootView_Night_14_en",20308,], -["features.securebackup.impl.root_SecureBackupRootView_Day_15_en","features.securebackup.impl.root_SecureBackupRootView_Night_15_en",20308,], -["features.securebackup.impl.root_SecureBackupRootView_Day_16_en","features.securebackup.impl.root_SecureBackupRootView_Night_16_en",20308,], -["features.securebackup.impl.root_SecureBackupRootView_Day_17_en","features.securebackup.impl.root_SecureBackupRootView_Night_17_en",20308,], -["features.securebackup.impl.root_SecureBackupRootView_Day_1_en","features.securebackup.impl.root_SecureBackupRootView_Night_1_en",20308,], -["features.securebackup.impl.root_SecureBackupRootView_Day_2_en","features.securebackup.impl.root_SecureBackupRootView_Night_2_en",20308,], -["features.securebackup.impl.root_SecureBackupRootView_Day_3_en","features.securebackup.impl.root_SecureBackupRootView_Night_3_en",20308,], -["features.securebackup.impl.root_SecureBackupRootView_Day_4_en","features.securebackup.impl.root_SecureBackupRootView_Night_4_en",20308,], -["features.securebackup.impl.root_SecureBackupRootView_Day_5_en","features.securebackup.impl.root_SecureBackupRootView_Night_5_en",20308,], -["features.securebackup.impl.root_SecureBackupRootView_Day_6_en","features.securebackup.impl.root_SecureBackupRootView_Night_6_en",20308,], -["features.securebackup.impl.root_SecureBackupRootView_Day_7_en","features.securebackup.impl.root_SecureBackupRootView_Night_7_en",20308,], -["features.securebackup.impl.root_SecureBackupRootView_Day_8_en","features.securebackup.impl.root_SecureBackupRootView_Night_8_en",20308,], -["features.securebackup.impl.root_SecureBackupRootView_Day_9_en","features.securebackup.impl.root_SecureBackupRootView_Night_9_en",20308,], -["features.securebackup.impl.setup_SecureBackupSetupViewChange_Day_0_en","features.securebackup.impl.setup_SecureBackupSetupViewChange_Night_0_en",20308,], -["features.securebackup.impl.setup_SecureBackupSetupViewChange_Day_1_en","features.securebackup.impl.setup_SecureBackupSetupViewChange_Night_1_en",20308,], -["features.securebackup.impl.setup_SecureBackupSetupViewChange_Day_2_en","features.securebackup.impl.setup_SecureBackupSetupViewChange_Night_2_en",20308,], -["features.securebackup.impl.setup_SecureBackupSetupViewChange_Day_3_en","features.securebackup.impl.setup_SecureBackupSetupViewChange_Night_3_en",20308,], -["features.securebackup.impl.setup_SecureBackupSetupViewChange_Day_4_en","features.securebackup.impl.setup_SecureBackupSetupViewChange_Night_4_en",20308,], -["features.securebackup.impl.setup_SecureBackupSetupViewChange_Day_5_en","features.securebackup.impl.setup_SecureBackupSetupViewChange_Night_5_en",20308,], -["features.securebackup.impl.setup_SecureBackupSetupView_Day_0_en","features.securebackup.impl.setup_SecureBackupSetupView_Night_0_en",20308,], -["features.securebackup.impl.setup_SecureBackupSetupView_Day_1_en","features.securebackup.impl.setup_SecureBackupSetupView_Night_1_en",20308,], -["features.securebackup.impl.setup_SecureBackupSetupView_Day_2_en","features.securebackup.impl.setup_SecureBackupSetupView_Night_2_en",20308,], -["features.securebackup.impl.setup_SecureBackupSetupView_Day_3_en","features.securebackup.impl.setup_SecureBackupSetupView_Night_3_en",20308,], -["features.securebackup.impl.setup_SecureBackupSetupView_Day_4_en","features.securebackup.impl.setup_SecureBackupSetupView_Night_4_en",20308,], -["features.securebackup.impl.setup_SecureBackupSetupView_Day_5_en","features.securebackup.impl.setup_SecureBackupSetupView_Night_5_en",20308,], -["features.roomdetails.impl.securityandprivacy_SecurityAndPrivacyViewDark_0_en","",20308,], -["features.roomdetails.impl.securityandprivacy_SecurityAndPrivacyViewDark_1_en","",20308,], -["features.roomdetails.impl.securityandprivacy_SecurityAndPrivacyViewDark_2_en","",20308,], -["features.roomdetails.impl.securityandprivacy_SecurityAndPrivacyViewDark_3_en","",20308,], -["features.roomdetails.impl.securityandprivacy_SecurityAndPrivacyViewDark_4_en","",20308,], -["features.roomdetails.impl.securityandprivacy_SecurityAndPrivacyViewDark_5_en","",20308,], -["features.roomdetails.impl.securityandprivacy_SecurityAndPrivacyViewDark_6_en","",20308,], -["features.roomdetails.impl.securityandprivacy_SecurityAndPrivacyViewDark_7_en","",20308,], -["features.roomdetails.impl.securityandprivacy_SecurityAndPrivacyViewDark_8_en","",20308,], -["features.roomdetails.impl.securityandprivacy_SecurityAndPrivacyViewLight_0_en","",20308,], -["features.roomdetails.impl.securityandprivacy_SecurityAndPrivacyViewLight_1_en","",20308,], -["features.roomdetails.impl.securityandprivacy_SecurityAndPrivacyViewLight_2_en","",20308,], -["features.roomdetails.impl.securityandprivacy_SecurityAndPrivacyViewLight_3_en","",20308,], -["features.roomdetails.impl.securityandprivacy_SecurityAndPrivacyViewLight_4_en","",20308,], -["features.roomdetails.impl.securityandprivacy_SecurityAndPrivacyViewLight_5_en","",20308,], -["features.roomdetails.impl.securityandprivacy_SecurityAndPrivacyViewLight_6_en","",20308,], -["features.roomdetails.impl.securityandprivacy_SecurityAndPrivacyViewLight_7_en","",20308,], -["features.roomdetails.impl.securityandprivacy_SecurityAndPrivacyViewLight_8_en","",20308,], +["features.startchat.impl.components_SearchMultipleUsersResultItem_en","",20323,], +["features.startchat.impl.components_SearchSingleUserResultItem_en","",20323,], +["features.securebackup.impl.disable_SecureBackupDisableView_Day_0_en","features.securebackup.impl.disable_SecureBackupDisableView_Night_0_en",20323,], +["features.securebackup.impl.disable_SecureBackupDisableView_Day_1_en","features.securebackup.impl.disable_SecureBackupDisableView_Night_1_en",20323,], +["features.securebackup.impl.disable_SecureBackupDisableView_Day_2_en","features.securebackup.impl.disable_SecureBackupDisableView_Night_2_en",20323,], +["features.securebackup.impl.disable_SecureBackupDisableView_Day_3_en","features.securebackup.impl.disable_SecureBackupDisableView_Night_3_en",20323,], +["features.securebackup.impl.enter_SecureBackupEnterRecoveryKeyView_Day_0_en","features.securebackup.impl.enter_SecureBackupEnterRecoveryKeyView_Night_0_en",20323,], +["features.securebackup.impl.enter_SecureBackupEnterRecoveryKeyView_Day_1_en","features.securebackup.impl.enter_SecureBackupEnterRecoveryKeyView_Night_1_en",20323,], +["features.securebackup.impl.enter_SecureBackupEnterRecoveryKeyView_Day_2_en","features.securebackup.impl.enter_SecureBackupEnterRecoveryKeyView_Night_2_en",20323,], +["features.securebackup.impl.enter_SecureBackupEnterRecoveryKeyView_Day_3_en","features.securebackup.impl.enter_SecureBackupEnterRecoveryKeyView_Night_3_en",20323,], +["features.securebackup.impl.enter_SecureBackupEnterRecoveryKeyView_Day_4_en","features.securebackup.impl.enter_SecureBackupEnterRecoveryKeyView_Night_4_en",20323,], +["features.securebackup.impl.root_SecureBackupRootView_Day_0_en","features.securebackup.impl.root_SecureBackupRootView_Night_0_en",20323,], +["features.securebackup.impl.root_SecureBackupRootView_Day_10_en","features.securebackup.impl.root_SecureBackupRootView_Night_10_en",20323,], +["features.securebackup.impl.root_SecureBackupRootView_Day_11_en","features.securebackup.impl.root_SecureBackupRootView_Night_11_en",20323,], +["features.securebackup.impl.root_SecureBackupRootView_Day_12_en","features.securebackup.impl.root_SecureBackupRootView_Night_12_en",20323,], +["features.securebackup.impl.root_SecureBackupRootView_Day_13_en","features.securebackup.impl.root_SecureBackupRootView_Night_13_en",20323,], +["features.securebackup.impl.root_SecureBackupRootView_Day_14_en","features.securebackup.impl.root_SecureBackupRootView_Night_14_en",20323,], +["features.securebackup.impl.root_SecureBackupRootView_Day_15_en","features.securebackup.impl.root_SecureBackupRootView_Night_15_en",20323,], +["features.securebackup.impl.root_SecureBackupRootView_Day_16_en","features.securebackup.impl.root_SecureBackupRootView_Night_16_en",20323,], +["features.securebackup.impl.root_SecureBackupRootView_Day_17_en","features.securebackup.impl.root_SecureBackupRootView_Night_17_en",20323,], +["features.securebackup.impl.root_SecureBackupRootView_Day_1_en","features.securebackup.impl.root_SecureBackupRootView_Night_1_en",20323,], +["features.securebackup.impl.root_SecureBackupRootView_Day_2_en","features.securebackup.impl.root_SecureBackupRootView_Night_2_en",20323,], +["features.securebackup.impl.root_SecureBackupRootView_Day_3_en","features.securebackup.impl.root_SecureBackupRootView_Night_3_en",20323,], +["features.securebackup.impl.root_SecureBackupRootView_Day_4_en","features.securebackup.impl.root_SecureBackupRootView_Night_4_en",20323,], +["features.securebackup.impl.root_SecureBackupRootView_Day_5_en","features.securebackup.impl.root_SecureBackupRootView_Night_5_en",20323,], +["features.securebackup.impl.root_SecureBackupRootView_Day_6_en","features.securebackup.impl.root_SecureBackupRootView_Night_6_en",20323,], +["features.securebackup.impl.root_SecureBackupRootView_Day_7_en","features.securebackup.impl.root_SecureBackupRootView_Night_7_en",20323,], +["features.securebackup.impl.root_SecureBackupRootView_Day_8_en","features.securebackup.impl.root_SecureBackupRootView_Night_8_en",20323,], +["features.securebackup.impl.root_SecureBackupRootView_Day_9_en","features.securebackup.impl.root_SecureBackupRootView_Night_9_en",20323,], +["features.securebackup.impl.setup_SecureBackupSetupViewChange_Day_0_en","features.securebackup.impl.setup_SecureBackupSetupViewChange_Night_0_en",20323,], +["features.securebackup.impl.setup_SecureBackupSetupViewChange_Day_1_en","features.securebackup.impl.setup_SecureBackupSetupViewChange_Night_1_en",20323,], +["features.securebackup.impl.setup_SecureBackupSetupViewChange_Day_2_en","features.securebackup.impl.setup_SecureBackupSetupViewChange_Night_2_en",20323,], +["features.securebackup.impl.setup_SecureBackupSetupViewChange_Day_3_en","features.securebackup.impl.setup_SecureBackupSetupViewChange_Night_3_en",20323,], +["features.securebackup.impl.setup_SecureBackupSetupViewChange_Day_4_en","features.securebackup.impl.setup_SecureBackupSetupViewChange_Night_4_en",20323,], +["features.securebackup.impl.setup_SecureBackupSetupViewChange_Day_5_en","features.securebackup.impl.setup_SecureBackupSetupViewChange_Night_5_en",20323,], +["features.securebackup.impl.setup_SecureBackupSetupView_Day_0_en","features.securebackup.impl.setup_SecureBackupSetupView_Night_0_en",20323,], +["features.securebackup.impl.setup_SecureBackupSetupView_Day_1_en","features.securebackup.impl.setup_SecureBackupSetupView_Night_1_en",20323,], +["features.securebackup.impl.setup_SecureBackupSetupView_Day_2_en","features.securebackup.impl.setup_SecureBackupSetupView_Night_2_en",20323,], +["features.securebackup.impl.setup_SecureBackupSetupView_Day_3_en","features.securebackup.impl.setup_SecureBackupSetupView_Night_3_en",20323,], +["features.securebackup.impl.setup_SecureBackupSetupView_Day_4_en","features.securebackup.impl.setup_SecureBackupSetupView_Night_4_en",20323,], +["features.securebackup.impl.setup_SecureBackupSetupView_Day_5_en","features.securebackup.impl.setup_SecureBackupSetupView_Night_5_en",20323,], +["features.roomdetails.impl.securityandprivacy_SecurityAndPrivacyViewDark_0_en","",20323,], +["features.roomdetails.impl.securityandprivacy_SecurityAndPrivacyViewDark_1_en","",20323,], +["features.roomdetails.impl.securityandprivacy_SecurityAndPrivacyViewDark_2_en","",20323,], +["features.roomdetails.impl.securityandprivacy_SecurityAndPrivacyViewDark_3_en","",20323,], +["features.roomdetails.impl.securityandprivacy_SecurityAndPrivacyViewDark_4_en","",20323,], +["features.roomdetails.impl.securityandprivacy_SecurityAndPrivacyViewDark_5_en","",20323,], +["features.roomdetails.impl.securityandprivacy_SecurityAndPrivacyViewDark_6_en","",20323,], +["features.roomdetails.impl.securityandprivacy_SecurityAndPrivacyViewDark_7_en","",20323,], +["features.roomdetails.impl.securityandprivacy_SecurityAndPrivacyViewDark_8_en","",20323,], +["features.roomdetails.impl.securityandprivacy_SecurityAndPrivacyViewLight_0_en","",20323,], +["features.roomdetails.impl.securityandprivacy_SecurityAndPrivacyViewLight_1_en","",20323,], +["features.roomdetails.impl.securityandprivacy_SecurityAndPrivacyViewLight_2_en","",20323,], +["features.roomdetails.impl.securityandprivacy_SecurityAndPrivacyViewLight_3_en","",20323,], +["features.roomdetails.impl.securityandprivacy_SecurityAndPrivacyViewLight_4_en","",20323,], +["features.roomdetails.impl.securityandprivacy_SecurityAndPrivacyViewLight_5_en","",20323,], +["features.roomdetails.impl.securityandprivacy_SecurityAndPrivacyViewLight_6_en","",20323,], +["features.roomdetails.impl.securityandprivacy_SecurityAndPrivacyViewLight_7_en","",20323,], +["features.roomdetails.impl.securityandprivacy_SecurityAndPrivacyViewLight_8_en","",20323,], +["libraries.designsystem.atomic.atoms_SelectedIndicatorAtom_Day_0_en","libraries.designsystem.atomic.atoms_SelectedIndicatorAtom_Night_0_en",0,], +["libraries.matrix.ui.components_SelectedRoomRtl_Day_0_en","libraries.matrix.ui.components_SelectedRoomRtl_Night_0_en",0,], +["libraries.matrix.ui.components_SelectedRoomRtl_Day_1_en","libraries.matrix.ui.components_SelectedRoomRtl_Night_1_en",0,], +["libraries.matrix.ui.components_SelectedRoomRtl_Day_2_en","libraries.matrix.ui.components_SelectedRoomRtl_Night_2_en",0,], ["libraries.matrix.ui.components_SelectedRoom_Day_0_en","libraries.matrix.ui.components_SelectedRoom_Night_0_en",0,], ["libraries.matrix.ui.components_SelectedRoom_Day_1_en","libraries.matrix.ui.components_SelectedRoom_Night_1_en",0,], ["libraries.matrix.ui.components_SelectedRoom_Day_2_en","libraries.matrix.ui.components_SelectedRoom_Night_2_en",0,], ["libraries.matrix.ui.components_SelectedUserCannotRemove_Day_0_en","libraries.matrix.ui.components_SelectedUserCannotRemove_Night_0_en",0,], +["libraries.matrix.ui.components_SelectedUserRtl_Day_0_en","libraries.matrix.ui.components_SelectedUserRtl_Night_0_en",0,], ["libraries.matrix.ui.components_SelectedUser_Day_0_en","libraries.matrix.ui.components_SelectedUser_Night_0_en",0,], +["libraries.matrix.ui.components_SelectedUser_Day_1_en","libraries.matrix.ui.components_SelectedUser_Night_1_en",0,], ["libraries.matrix.ui.components_SelectedUsersRowList_Day_0_en","libraries.matrix.ui.components_SelectedUsersRowList_Night_0_en",0,], ["libraries.textcomposer.components_SendButton_Day_0_en","libraries.textcomposer.components_SendButton_Night_0_en",0,], -["features.location.impl.send_SendLocationView_Day_0_en","features.location.impl.send_SendLocationView_Night_0_en",20308,], -["features.location.impl.send_SendLocationView_Day_1_en","features.location.impl.send_SendLocationView_Night_1_en",20308,], -["features.location.impl.send_SendLocationView_Day_2_en","features.location.impl.send_SendLocationView_Night_2_en",20308,], -["features.location.impl.send_SendLocationView_Day_3_en","features.location.impl.send_SendLocationView_Night_3_en",20308,], -["features.location.impl.send_SendLocationView_Day_4_en","features.location.impl.send_SendLocationView_Night_4_en",20308,], +["features.location.impl.send_SendLocationView_Day_0_en","features.location.impl.send_SendLocationView_Night_0_en",20323,], +["features.location.impl.send_SendLocationView_Day_1_en","features.location.impl.send_SendLocationView_Night_1_en",20323,], +["features.location.impl.send_SendLocationView_Day_2_en","features.location.impl.send_SendLocationView_Night_2_en",20323,], +["features.location.impl.send_SendLocationView_Day_3_en","features.location.impl.send_SendLocationView_Night_3_en",20323,], +["features.location.impl.send_SendLocationView_Day_4_en","features.location.impl.send_SendLocationView_Night_4_en",20323,], ["libraries.matrix.ui.messages.sender_SenderName_Day_0_en","libraries.matrix.ui.messages.sender_SenderName_Night_0_en",0,], ["libraries.matrix.ui.messages.sender_SenderName_Day_1_en","libraries.matrix.ui.messages.sender_SenderName_Night_1_en",0,], ["libraries.matrix.ui.messages.sender_SenderName_Day_2_en","libraries.matrix.ui.messages.sender_SenderName_Night_2_en",0,], @@ -1169,27 +1201,27 @@ export const screenshots = [ ["libraries.matrix.ui.messages.sender_SenderName_Day_6_en","libraries.matrix.ui.messages.sender_SenderName_Night_6_en",0,], ["libraries.matrix.ui.messages.sender_SenderName_Day_7_en","libraries.matrix.ui.messages.sender_SenderName_Night_7_en",0,], ["libraries.matrix.ui.messages.sender_SenderName_Day_8_en","libraries.matrix.ui.messages.sender_SenderName_Night_8_en",0,], -["features.verifysession.impl.incoming.ui_SessionDetailsView_Day_0_en","features.verifysession.impl.incoming.ui_SessionDetailsView_Night_0_en",20308,], -["features.home.impl.components_SetUpRecoveryKeyBanner_Day_0_en","features.home.impl.components_SetUpRecoveryKeyBanner_Night_0_en",20308,], -["features.lockscreen.impl.setup.biometric_SetupBiometricView_Day_0_en","features.lockscreen.impl.setup.biometric_SetupBiometricView_Night_0_en",20308,], -["features.lockscreen.impl.setup.pin_SetupPinView_Day_0_en","features.lockscreen.impl.setup.pin_SetupPinView_Night_0_en",20308,], -["features.lockscreen.impl.setup.pin_SetupPinView_Day_1_en","features.lockscreen.impl.setup.pin_SetupPinView_Night_1_en",20308,], -["features.lockscreen.impl.setup.pin_SetupPinView_Day_2_en","features.lockscreen.impl.setup.pin_SetupPinView_Night_2_en",20308,], -["features.lockscreen.impl.setup.pin_SetupPinView_Day_3_en","features.lockscreen.impl.setup.pin_SetupPinView_Night_3_en",20308,], -["features.lockscreen.impl.setup.pin_SetupPinView_Day_4_en","features.lockscreen.impl.setup.pin_SetupPinView_Night_4_en",20308,], +["features.verifysession.impl.incoming.ui_SessionDetailsView_Day_0_en","features.verifysession.impl.incoming.ui_SessionDetailsView_Night_0_en",20323,], +["features.home.impl.components_SetUpRecoveryKeyBanner_Day_0_en","features.home.impl.components_SetUpRecoveryKeyBanner_Night_0_en",20323,], +["features.lockscreen.impl.setup.biometric_SetupBiometricView_Day_0_en","features.lockscreen.impl.setup.biometric_SetupBiometricView_Night_0_en",20323,], +["features.lockscreen.impl.setup.pin_SetupPinView_Day_0_en","features.lockscreen.impl.setup.pin_SetupPinView_Night_0_en",20323,], +["features.lockscreen.impl.setup.pin_SetupPinView_Day_1_en","features.lockscreen.impl.setup.pin_SetupPinView_Night_1_en",20323,], +["features.lockscreen.impl.setup.pin_SetupPinView_Day_2_en","features.lockscreen.impl.setup.pin_SetupPinView_Night_2_en",20323,], +["features.lockscreen.impl.setup.pin_SetupPinView_Day_3_en","features.lockscreen.impl.setup.pin_SetupPinView_Night_3_en",20323,], +["features.lockscreen.impl.setup.pin_SetupPinView_Day_4_en","features.lockscreen.impl.setup.pin_SetupPinView_Night_4_en",20323,], ["features.share.impl_ShareView_Day_0_en","features.share.impl_ShareView_Night_0_en",0,], ["features.share.impl_ShareView_Day_1_en","features.share.impl_ShareView_Night_1_en",0,], ["features.share.impl_ShareView_Day_2_en","features.share.impl_ShareView_Night_2_en",0,], -["features.share.impl_ShareView_Day_3_en","features.share.impl_ShareView_Night_3_en",20308,], -["features.location.impl.show_ShowLocationView_Day_0_en","features.location.impl.show_ShowLocationView_Night_0_en",20308,], -["features.location.impl.show_ShowLocationView_Day_1_en","features.location.impl.show_ShowLocationView_Night_1_en",20308,], -["features.location.impl.show_ShowLocationView_Day_2_en","features.location.impl.show_ShowLocationView_Night_2_en",20308,], -["features.location.impl.show_ShowLocationView_Day_3_en","features.location.impl.show_ShowLocationView_Night_3_en",20308,], -["features.location.impl.show_ShowLocationView_Day_4_en","features.location.impl.show_ShowLocationView_Night_4_en",20308,], -["features.location.impl.show_ShowLocationView_Day_5_en","features.location.impl.show_ShowLocationView_Night_5_en",20308,], -["features.location.impl.show_ShowLocationView_Day_6_en","features.location.impl.show_ShowLocationView_Night_6_en",20308,], -["features.location.impl.show_ShowLocationView_Day_7_en","features.location.impl.show_ShowLocationView_Night_7_en",20308,], -["features.signedout.impl_SignedOutView_Day_0_en","features.signedout.impl_SignedOutView_Night_0_en",20308,], +["features.share.impl_ShareView_Day_3_en","features.share.impl_ShareView_Night_3_en",20323,], +["features.location.impl.show_ShowLocationView_Day_0_en","features.location.impl.show_ShowLocationView_Night_0_en",20323,], +["features.location.impl.show_ShowLocationView_Day_1_en","features.location.impl.show_ShowLocationView_Night_1_en",20323,], +["features.location.impl.show_ShowLocationView_Day_2_en","features.location.impl.show_ShowLocationView_Night_2_en",20323,], +["features.location.impl.show_ShowLocationView_Day_3_en","features.location.impl.show_ShowLocationView_Night_3_en",20323,], +["features.location.impl.show_ShowLocationView_Day_4_en","features.location.impl.show_ShowLocationView_Night_4_en",20323,], +["features.location.impl.show_ShowLocationView_Day_5_en","features.location.impl.show_ShowLocationView_Night_5_en",20323,], +["features.location.impl.show_ShowLocationView_Day_6_en","features.location.impl.show_ShowLocationView_Night_6_en",20323,], +["features.location.impl.show_ShowLocationView_Day_7_en","features.location.impl.show_ShowLocationView_Night_7_en",20323,], +["features.signedout.impl_SignedOutView_Day_0_en","features.signedout.impl_SignedOutView_Night_0_en",20323,], ["libraries.designsystem.components.dialogs_SingleSelectionDialogContent_Dialogs_en","",0,], ["libraries.designsystem.components.dialogs_SingleSelectionDialog_Day_0_en","libraries.designsystem.components.dialogs_SingleSelectionDialog_Night_0_en",0,], ["libraries.designsystem.components.list_SingleSelectionListItemCustomFormattert_Single_selection_List_item_-_custom_formatter_List_items_en","",0,], @@ -1198,71 +1230,81 @@ export const screenshots = [ ["libraries.designsystem.components.list_SingleSelectionListItemUnselectedWithSupportingText_Single_selection_List_item_-_no_selection,_supporting_text_List_items_en","",0,], ["libraries.designsystem.components.list_SingleSelectionListItem_Single_selection_List_item_-_no_selection_List_items_en","",0,], ["libraries.designsystem.theme.components_Sliders_Sliders_en","",0,], -["features.login.impl.dialogs_SlidingSyncNotSupportedDialog_Day_0_en","features.login.impl.dialogs_SlidingSyncNotSupportedDialog_Night_0_en",20308,], +["features.login.impl.dialogs_SlidingSyncNotSupportedDialog_Day_0_en","features.login.impl.dialogs_SlidingSyncNotSupportedDialog_Night_0_en",20323,], ["libraries.designsystem.theme.components_SnackbarWithActionAndCloseButton_Snackbar_with_action_and_close_button_Snackbars_en","",0,], ["libraries.designsystem.theme.components_SnackbarWithActionOnNewLineAndCloseButton_Snackbar_with_action_and_close_button_on_new_line_Snackbars_en","",0,], ["libraries.designsystem.theme.components_SnackbarWithActionOnNewLine_Snackbar_with_action_on_new_line_Snackbars_en","",0,], ["libraries.designsystem.theme.components_SnackbarWithAction_Snackbar_with_action_Snackbars_en","",0,], ["libraries.designsystem.theme.components_Snackbar_Snackbar_Snackbars_en","",0,], ["libraries.designsystem.components.avatar.internal_SpaceAvatar_Avatars_en","",0,], +["libraries.matrix.ui.components_SpaceHeaderView_Day_0_en","libraries.matrix.ui.components_SpaceHeaderView_Night_0_en",0,], +["libraries.matrix.ui.components_SpaceInfoRow_Day_0_en","libraries.matrix.ui.components_SpaceInfoRow_Night_0_en",0,], +["libraries.matrix.ui.components_SpaceMembersViewNoHeroes_Day_0_en","libraries.matrix.ui.components_SpaceMembersViewNoHeroes_Night_0_en",0,], +["libraries.matrix.ui.components_SpaceMembersView_Day_0_en","libraries.matrix.ui.components_SpaceMembersView_Night_0_en",0,], ["libraries.designsystem.modifiers_SquareSizeModifierInsideSquare_en","",0,], ["libraries.designsystem.modifiers_SquareSizeModifierLargeHeight_en","",0,], ["libraries.designsystem.modifiers_SquareSizeModifierLargeWidth_en","",0,], -["features.location.api.internal_StaticMapPlaceholder_Day_0_en","features.location.api.internal_StaticMapPlaceholder_Night_0_en",20308,], +["features.startchat.impl.root_StartChatView_Day_0_en","features.startchat.impl.root_StartChatView_Night_0_en",20323,], +["features.startchat.impl.root_StartChatView_Day_1_en","features.startchat.impl.root_StartChatView_Night_1_en",20323,], +["features.startchat.impl.root_StartChatView_Day_2_en","features.startchat.impl.root_StartChatView_Night_2_en",20323,], +["features.startchat.impl.root_StartChatView_Day_3_en","features.startchat.impl.root_StartChatView_Night_3_en",20323,], +["features.startchat.impl.root_StartChatView_Day_4_en","features.startchat.impl.root_StartChatView_Night_4_en",20323,], +["features.startchat.impl.root_StartChatView_Day_5_en","features.startchat.impl.root_StartChatView_Night_5_en",20323,], +["features.location.api.internal_StaticMapPlaceholder_Day_0_en","features.location.api.internal_StaticMapPlaceholder_Night_0_en",20323,], ["features.location.api_StaticMapView_Day_0_en","features.location.api_StaticMapView_Night_0_en",0,], -["features.messages.impl.messagecomposer.suggestions_SuggestionsPickerView_Day_0_en","features.messages.impl.messagecomposer.suggestions_SuggestionsPickerView_Night_0_en",20308,], +["features.messages.impl.messagecomposer.suggestions_SuggestionsPickerView_Day_0_en","features.messages.impl.messagecomposer.suggestions_SuggestionsPickerView_Night_0_en",20323,], ["libraries.designsystem.atomic.pages_SunsetPage_Day_0_en","libraries.designsystem.atomic.pages_SunsetPage_Night_0_en",0,], ["libraries.designsystem.components.button_SuperButton_Day_0_en","libraries.designsystem.components.button_SuperButton_Night_0_en",0,], ["libraries.designsystem.theme.components_Surface_en","",0,], ["libraries.designsystem.theme.components_Switch_Toggles_en","",0,], -["appnav.loggedin_SyncStateView_Day_0_en","appnav.loggedin_SyncStateView_Night_0_en",20308,], +["appnav.loggedin_SyncStateView_Day_0_en","appnav.loggedin_SyncStateView_Night_0_en",20323,], ["libraries.designsystem.components.avatar.internal_TextAvatar_Avatars_en","",0,], ["libraries.designsystem.theme.components_TextButtonLargeLowPadding_Buttons_en","",0,], ["libraries.designsystem.theme.components_TextButtonLarge_Buttons_en","",0,], ["libraries.designsystem.theme.components_TextButtonMediumLowPadding_Buttons_en","",0,], ["libraries.designsystem.theme.components_TextButtonMedium_Buttons_en","",0,], ["libraries.designsystem.theme.components_TextButtonSmall_Buttons_en","",0,], -["libraries.textcomposer_TextComposerAddCaption_Day_0_en","libraries.textcomposer_TextComposerAddCaption_Night_0_en",20308,], -["libraries.textcomposer_TextComposerCaption_Day_0_en","libraries.textcomposer_TextComposerCaption_Night_0_en",20308,], -["libraries.textcomposer_TextComposerEditCaption_Day_0_en","libraries.textcomposer_TextComposerEditCaption_Night_0_en",20308,], -["libraries.textcomposer_TextComposerEditNotEncrypted_Day_0_en","libraries.textcomposer_TextComposerEditNotEncrypted_Night_0_en",20308,], -["libraries.textcomposer_TextComposerEdit_Day_0_en","libraries.textcomposer_TextComposerEdit_Night_0_en",20308,], -["libraries.textcomposer_TextComposerFormattingNotEncrypted_Day_0_en","libraries.textcomposer_TextComposerFormattingNotEncrypted_Night_0_en",20308,], -["libraries.textcomposer_TextComposerFormatting_Day_0_en","libraries.textcomposer_TextComposerFormatting_Night_0_en",20308,], -["libraries.textcomposer_TextComposerLinkDialogCreateLinkWithoutText_Day_0_en","libraries.textcomposer_TextComposerLinkDialogCreateLinkWithoutText_Night_0_en",20308,], -["libraries.textcomposer_TextComposerLinkDialogCreateLink_Day_0_en","libraries.textcomposer_TextComposerLinkDialogCreateLink_Night_0_en",20308,], -["libraries.textcomposer_TextComposerLinkDialogEditLink_Day_0_en","libraries.textcomposer_TextComposerLinkDialogEditLink_Night_0_en",20308,], -["libraries.textcomposer_TextComposerReplyNotEncrypted_Day_0_en","libraries.textcomposer_TextComposerReplyNotEncrypted_Night_0_en",20308,], -["libraries.textcomposer_TextComposerReplyNotEncrypted_Day_10_en","libraries.textcomposer_TextComposerReplyNotEncrypted_Night_10_en",20308,], -["libraries.textcomposer_TextComposerReplyNotEncrypted_Day_11_en","libraries.textcomposer_TextComposerReplyNotEncrypted_Night_11_en",20308,], -["libraries.textcomposer_TextComposerReplyNotEncrypted_Day_1_en","libraries.textcomposer_TextComposerReplyNotEncrypted_Night_1_en",20308,], -["libraries.textcomposer_TextComposerReplyNotEncrypted_Day_2_en","libraries.textcomposer_TextComposerReplyNotEncrypted_Night_2_en",20308,], -["libraries.textcomposer_TextComposerReplyNotEncrypted_Day_3_en","libraries.textcomposer_TextComposerReplyNotEncrypted_Night_3_en",20308,], -["libraries.textcomposer_TextComposerReplyNotEncrypted_Day_4_en","libraries.textcomposer_TextComposerReplyNotEncrypted_Night_4_en",20308,], -["libraries.textcomposer_TextComposerReplyNotEncrypted_Day_5_en","libraries.textcomposer_TextComposerReplyNotEncrypted_Night_5_en",20308,], -["libraries.textcomposer_TextComposerReplyNotEncrypted_Day_6_en","libraries.textcomposer_TextComposerReplyNotEncrypted_Night_6_en",20308,], -["libraries.textcomposer_TextComposerReplyNotEncrypted_Day_7_en","libraries.textcomposer_TextComposerReplyNotEncrypted_Night_7_en",20308,], -["libraries.textcomposer_TextComposerReplyNotEncrypted_Day_8_en","libraries.textcomposer_TextComposerReplyNotEncrypted_Night_8_en",20308,], -["libraries.textcomposer_TextComposerReplyNotEncrypted_Day_9_en","libraries.textcomposer_TextComposerReplyNotEncrypted_Night_9_en",20308,], -["libraries.textcomposer_TextComposerReply_Day_0_en","libraries.textcomposer_TextComposerReply_Night_0_en",20308,], -["libraries.textcomposer_TextComposerReply_Day_10_en","libraries.textcomposer_TextComposerReply_Night_10_en",20308,], -["libraries.textcomposer_TextComposerReply_Day_11_en","libraries.textcomposer_TextComposerReply_Night_11_en",20308,], -["libraries.textcomposer_TextComposerReply_Day_1_en","libraries.textcomposer_TextComposerReply_Night_1_en",20308,], -["libraries.textcomposer_TextComposerReply_Day_2_en","libraries.textcomposer_TextComposerReply_Night_2_en",20308,], -["libraries.textcomposer_TextComposerReply_Day_3_en","libraries.textcomposer_TextComposerReply_Night_3_en",20308,], -["libraries.textcomposer_TextComposerReply_Day_4_en","libraries.textcomposer_TextComposerReply_Night_4_en",20308,], -["libraries.textcomposer_TextComposerReply_Day_5_en","libraries.textcomposer_TextComposerReply_Night_5_en",20308,], -["libraries.textcomposer_TextComposerReply_Day_6_en","libraries.textcomposer_TextComposerReply_Night_6_en",20308,], -["libraries.textcomposer_TextComposerReply_Day_7_en","libraries.textcomposer_TextComposerReply_Night_7_en",20308,], -["libraries.textcomposer_TextComposerReply_Day_8_en","libraries.textcomposer_TextComposerReply_Night_8_en",20308,], -["libraries.textcomposer_TextComposerReply_Day_9_en","libraries.textcomposer_TextComposerReply_Night_9_en",20308,], -["libraries.textcomposer_TextComposerSimpleNotEncrypted_Day_0_en","libraries.textcomposer_TextComposerSimpleNotEncrypted_Night_0_en",20308,], -["libraries.textcomposer_TextComposerSimple_Day_0_en","libraries.textcomposer_TextComposerSimple_Night_0_en",20308,], -["libraries.textcomposer_TextComposerVoiceNotEncrypted_Day_0_en","libraries.textcomposer_TextComposerVoiceNotEncrypted_Night_0_en",20308,], +["libraries.textcomposer_TextComposerAddCaption_Day_0_en","libraries.textcomposer_TextComposerAddCaption_Night_0_en",20323,], +["libraries.textcomposer_TextComposerCaption_Day_0_en","libraries.textcomposer_TextComposerCaption_Night_0_en",20323,], +["libraries.textcomposer_TextComposerEditCaption_Day_0_en","libraries.textcomposer_TextComposerEditCaption_Night_0_en",20323,], +["libraries.textcomposer_TextComposerEditNotEncrypted_Day_0_en","libraries.textcomposer_TextComposerEditNotEncrypted_Night_0_en",20323,], +["libraries.textcomposer_TextComposerEdit_Day_0_en","libraries.textcomposer_TextComposerEdit_Night_0_en",20323,], +["libraries.textcomposer_TextComposerFormattingNotEncrypted_Day_0_en","libraries.textcomposer_TextComposerFormattingNotEncrypted_Night_0_en",20323,], +["libraries.textcomposer_TextComposerFormatting_Day_0_en","libraries.textcomposer_TextComposerFormatting_Night_0_en",20323,], +["libraries.textcomposer_TextComposerLinkDialogCreateLinkWithoutText_Day_0_en","libraries.textcomposer_TextComposerLinkDialogCreateLinkWithoutText_Night_0_en",20323,], +["libraries.textcomposer_TextComposerLinkDialogCreateLink_Day_0_en","libraries.textcomposer_TextComposerLinkDialogCreateLink_Night_0_en",20323,], +["libraries.textcomposer_TextComposerLinkDialogEditLink_Day_0_en","libraries.textcomposer_TextComposerLinkDialogEditLink_Night_0_en",20323,], +["libraries.textcomposer_TextComposerReplyNotEncrypted_Day_0_en","libraries.textcomposer_TextComposerReplyNotEncrypted_Night_0_en",20323,], +["libraries.textcomposer_TextComposerReplyNotEncrypted_Day_10_en","libraries.textcomposer_TextComposerReplyNotEncrypted_Night_10_en",20323,], +["libraries.textcomposer_TextComposerReplyNotEncrypted_Day_11_en","libraries.textcomposer_TextComposerReplyNotEncrypted_Night_11_en",20323,], +["libraries.textcomposer_TextComposerReplyNotEncrypted_Day_1_en","libraries.textcomposer_TextComposerReplyNotEncrypted_Night_1_en",20323,], +["libraries.textcomposer_TextComposerReplyNotEncrypted_Day_2_en","libraries.textcomposer_TextComposerReplyNotEncrypted_Night_2_en",20323,], +["libraries.textcomposer_TextComposerReplyNotEncrypted_Day_3_en","libraries.textcomposer_TextComposerReplyNotEncrypted_Night_3_en",20323,], +["libraries.textcomposer_TextComposerReplyNotEncrypted_Day_4_en","libraries.textcomposer_TextComposerReplyNotEncrypted_Night_4_en",20323,], +["libraries.textcomposer_TextComposerReplyNotEncrypted_Day_5_en","libraries.textcomposer_TextComposerReplyNotEncrypted_Night_5_en",20323,], +["libraries.textcomposer_TextComposerReplyNotEncrypted_Day_6_en","libraries.textcomposer_TextComposerReplyNotEncrypted_Night_6_en",20323,], +["libraries.textcomposer_TextComposerReplyNotEncrypted_Day_7_en","libraries.textcomposer_TextComposerReplyNotEncrypted_Night_7_en",20323,], +["libraries.textcomposer_TextComposerReplyNotEncrypted_Day_8_en","libraries.textcomposer_TextComposerReplyNotEncrypted_Night_8_en",20323,], +["libraries.textcomposer_TextComposerReplyNotEncrypted_Day_9_en","libraries.textcomposer_TextComposerReplyNotEncrypted_Night_9_en",20323,], +["libraries.textcomposer_TextComposerReply_Day_0_en","libraries.textcomposer_TextComposerReply_Night_0_en",20323,], +["libraries.textcomposer_TextComposerReply_Day_10_en","libraries.textcomposer_TextComposerReply_Night_10_en",20323,], +["libraries.textcomposer_TextComposerReply_Day_11_en","libraries.textcomposer_TextComposerReply_Night_11_en",20323,], +["libraries.textcomposer_TextComposerReply_Day_1_en","libraries.textcomposer_TextComposerReply_Night_1_en",20323,], +["libraries.textcomposer_TextComposerReply_Day_2_en","libraries.textcomposer_TextComposerReply_Night_2_en",20323,], +["libraries.textcomposer_TextComposerReply_Day_3_en","libraries.textcomposer_TextComposerReply_Night_3_en",20323,], +["libraries.textcomposer_TextComposerReply_Day_4_en","libraries.textcomposer_TextComposerReply_Night_4_en",20323,], +["libraries.textcomposer_TextComposerReply_Day_5_en","libraries.textcomposer_TextComposerReply_Night_5_en",20323,], +["libraries.textcomposer_TextComposerReply_Day_6_en","libraries.textcomposer_TextComposerReply_Night_6_en",20323,], +["libraries.textcomposer_TextComposerReply_Day_7_en","libraries.textcomposer_TextComposerReply_Night_7_en",20323,], +["libraries.textcomposer_TextComposerReply_Day_8_en","libraries.textcomposer_TextComposerReply_Night_8_en",20323,], +["libraries.textcomposer_TextComposerReply_Day_9_en","libraries.textcomposer_TextComposerReply_Night_9_en",20323,], +["libraries.textcomposer_TextComposerSimpleNotEncrypted_Day_0_en","libraries.textcomposer_TextComposerSimpleNotEncrypted_Night_0_en",20323,], +["libraries.textcomposer_TextComposerSimple_Day_0_en","libraries.textcomposer_TextComposerSimple_Night_0_en",20323,], +["libraries.textcomposer_TextComposerVoiceNotEncrypted_Day_0_en","libraries.textcomposer_TextComposerVoiceNotEncrypted_Night_0_en",20323,], ["libraries.textcomposer_TextComposerVoice_Day_0_en","libraries.textcomposer_TextComposerVoice_Night_0_en",0,], ["libraries.designsystem.theme.components_TextDark_Text_en","",0,], -["libraries.designsystem.components.dialogs_TextFieldDialogWithError_Day_0_en","libraries.designsystem.components.dialogs_TextFieldDialogWithError_Night_0_en",20308,], -["libraries.designsystem.components.dialogs_TextFieldDialog_Day_0_en","libraries.designsystem.components.dialogs_TextFieldDialog_Night_0_en",20308,], +["libraries.designsystem.components.dialogs_TextFieldDialogWithError_Day_0_en","libraries.designsystem.components.dialogs_TextFieldDialogWithError_Night_0_en",20323,], +["libraries.designsystem.components.dialogs_TextFieldDialog_Day_0_en","libraries.designsystem.components.dialogs_TextFieldDialog_Night_0_en",20323,], ["libraries.designsystem.components.list_TextFieldListItemEmpty_Text_field_List_item_-_empty_List_items_en","",0,], ["libraries.designsystem.components.list_TextFieldListItemTextFieldValue_Text_field_List_item_-_textfieldvalue_List_items_en","",0,], ["libraries.designsystem.components.list_TextFieldListItem_Text_field_List_item_-_text_List_items_en","",0,], @@ -1274,14 +1316,14 @@ export const screenshots = [ ["libraries.mediaviewer.impl.local.txt_TextFileContentView_Day_3_en","libraries.mediaviewer.impl.local.txt_TextFileContentView_Night_3_en",0,], ["libraries.textcomposer.components_TextFormatting_Day_0_en","libraries.textcomposer.components_TextFormatting_Night_0_en",0,], ["libraries.designsystem.theme.components_TextLight_Text_en","",0,], -["libraries.designsystem.theme.components.previews_TimePickerHorizontal_DateTime_pickers_en","",20308,], -["libraries.designsystem.theme.components.previews_TimePickerVerticalDark_DateTime_pickers_en","",20308,], -["libraries.designsystem.theme.components.previews_TimePickerVerticalLight_DateTime_pickers_en","",20308,], +["libraries.designsystem.theme.components.previews_TimePickerHorizontal_DateTime_pickers_en","",20323,], +["libraries.designsystem.theme.components.previews_TimePickerVerticalDark_DateTime_pickers_en","",20323,], +["libraries.designsystem.theme.components.previews_TimePickerVerticalLight_DateTime_pickers_en","",20323,], ["features.messages.impl.timeline.components_TimelineEventTimestampView_Day_0_en","features.messages.impl.timeline.components_TimelineEventTimestampView_Night_0_en",0,], ["features.messages.impl.timeline.components_TimelineEventTimestampView_Day_1_en","features.messages.impl.timeline.components_TimelineEventTimestampView_Night_1_en",0,], ["features.messages.impl.timeline.components_TimelineEventTimestampView_Day_2_en","features.messages.impl.timeline.components_TimelineEventTimestampView_Night_2_en",0,], -["features.messages.impl.timeline.components_TimelineEventTimestampView_Day_3_en","features.messages.impl.timeline.components_TimelineEventTimestampView_Night_3_en",20308,], -["features.messages.impl.timeline.components_TimelineEventTimestampView_Day_4_en","features.messages.impl.timeline.components_TimelineEventTimestampView_Night_4_en",20308,], +["features.messages.impl.timeline.components_TimelineEventTimestampView_Day_3_en","features.messages.impl.timeline.components_TimelineEventTimestampView_Night_3_en",20323,], +["features.messages.impl.timeline.components_TimelineEventTimestampView_Day_4_en","features.messages.impl.timeline.components_TimelineEventTimestampView_Night_4_en",20323,], ["features.messages.impl.timeline.components_TimelineEventTimestampView_Day_5_en","features.messages.impl.timeline.components_TimelineEventTimestampView_Night_5_en",0,], ["features.messages.impl.timeline.components_TimelineEventTimestampView_Day_6_en","features.messages.impl.timeline.components_TimelineEventTimestampView_Night_6_en",0,], ["features.messages.impl.timeline.components_TimelineEventTimestampView_Day_7_en","features.messages.impl.timeline.components_TimelineEventTimestampView_Night_7_en",0,], @@ -1291,18 +1333,18 @@ export const screenshots = [ ["features.messages.impl.timeline.components.event_TimelineItemAudioView_Day_2_en","features.messages.impl.timeline.components.event_TimelineItemAudioView_Night_2_en",0,], ["features.messages.impl.timeline.components.event_TimelineItemAudioView_Day_3_en","features.messages.impl.timeline.components.event_TimelineItemAudioView_Night_3_en",0,], ["features.messages.impl.timeline.components.event_TimelineItemAudioView_Day_4_en","features.messages.impl.timeline.components.event_TimelineItemAudioView_Night_4_en",0,], -["features.messages.impl.timeline.components_TimelineItemCallNotifyView_Day_0_en","features.messages.impl.timeline.components_TimelineItemCallNotifyView_Night_0_en",20308,], +["features.messages.impl.timeline.components_TimelineItemCallNotifyView_Day_0_en","features.messages.impl.timeline.components_TimelineItemCallNotifyView_Night_0_en",20323,], ["features.messages.impl.timeline.components.virtual_TimelineItemDaySeparatorView_Day_0_en","features.messages.impl.timeline.components.virtual_TimelineItemDaySeparatorView_Night_0_en",0,], ["features.messages.impl.timeline.components.virtual_TimelineItemDaySeparatorView_Day_1_en","features.messages.impl.timeline.components.virtual_TimelineItemDaySeparatorView_Night_1_en",0,], -["features.messages.impl.timeline.components.event_TimelineItemEncryptedView_Day_0_en","features.messages.impl.timeline.components.event_TimelineItemEncryptedView_Night_0_en",20308,], -["features.messages.impl.timeline.components.event_TimelineItemEncryptedView_Day_1_en","features.messages.impl.timeline.components.event_TimelineItemEncryptedView_Night_1_en",20308,], -["features.messages.impl.timeline.components.event_TimelineItemEncryptedView_Day_2_en","features.messages.impl.timeline.components.event_TimelineItemEncryptedView_Night_2_en",20308,], -["features.messages.impl.timeline.components.event_TimelineItemEncryptedView_Day_3_en","features.messages.impl.timeline.components.event_TimelineItemEncryptedView_Night_3_en",20308,], -["features.messages.impl.timeline.components.event_TimelineItemEncryptedView_Day_4_en","features.messages.impl.timeline.components.event_TimelineItemEncryptedView_Night_4_en",20308,], -["features.messages.impl.timeline.components.event_TimelineItemEncryptedView_Day_5_en","features.messages.impl.timeline.components.event_TimelineItemEncryptedView_Night_5_en",20308,], -["features.messages.impl.timeline.components.event_TimelineItemEncryptedView_Day_6_en","features.messages.impl.timeline.components.event_TimelineItemEncryptedView_Night_6_en",20308,], -["features.messages.impl.timeline.components.event_TimelineItemEncryptedView_Day_7_en","features.messages.impl.timeline.components.event_TimelineItemEncryptedView_Night_7_en",20308,], -["features.messages.impl.timeline.components.event_TimelineItemEncryptedView_Day_8_en","features.messages.impl.timeline.components.event_TimelineItemEncryptedView_Night_8_en",20308,], +["features.messages.impl.timeline.components.event_TimelineItemEncryptedView_Day_0_en","features.messages.impl.timeline.components.event_TimelineItemEncryptedView_Night_0_en",20323,], +["features.messages.impl.timeline.components.event_TimelineItemEncryptedView_Day_1_en","features.messages.impl.timeline.components.event_TimelineItemEncryptedView_Night_1_en",20323,], +["features.messages.impl.timeline.components.event_TimelineItemEncryptedView_Day_2_en","features.messages.impl.timeline.components.event_TimelineItemEncryptedView_Night_2_en",20323,], +["features.messages.impl.timeline.components.event_TimelineItemEncryptedView_Day_3_en","features.messages.impl.timeline.components.event_TimelineItemEncryptedView_Night_3_en",20323,], +["features.messages.impl.timeline.components.event_TimelineItemEncryptedView_Day_4_en","features.messages.impl.timeline.components.event_TimelineItemEncryptedView_Night_4_en",20323,], +["features.messages.impl.timeline.components.event_TimelineItemEncryptedView_Day_5_en","features.messages.impl.timeline.components.event_TimelineItemEncryptedView_Night_5_en",20323,], +["features.messages.impl.timeline.components.event_TimelineItemEncryptedView_Day_6_en","features.messages.impl.timeline.components.event_TimelineItemEncryptedView_Night_6_en",20323,], +["features.messages.impl.timeline.components.event_TimelineItemEncryptedView_Day_7_en","features.messages.impl.timeline.components.event_TimelineItemEncryptedView_Night_7_en",20323,], +["features.messages.impl.timeline.components.event_TimelineItemEncryptedView_Day_8_en","features.messages.impl.timeline.components.event_TimelineItemEncryptedView_Night_8_en",20323,], ["features.messages.impl.timeline.components_TimelineItemEventRowDisambiguated_Day_0_en","features.messages.impl.timeline.components_TimelineItemEventRowDisambiguated_Night_0_en",0,], ["features.messages.impl.timeline.components_TimelineItemEventRowForDirectRoom_Day_0_en","features.messages.impl.timeline.components_TimelineItemEventRowForDirectRoom_Night_0_en",0,], ["features.messages.impl.timeline.components_TimelineItemEventRowLongSenderName_en","",0,], @@ -1310,18 +1352,18 @@ export const screenshots = [ ["features.messages.impl.timeline.components_TimelineItemEventRowTimestamp_Day_0_en","features.messages.impl.timeline.components_TimelineItemEventRowTimestamp_Night_0_en",0,], ["features.messages.impl.timeline.components_TimelineItemEventRowTimestamp_Day_1_en","features.messages.impl.timeline.components_TimelineItemEventRowTimestamp_Night_1_en",0,], ["features.messages.impl.timeline.components_TimelineItemEventRowTimestamp_Day_2_en","features.messages.impl.timeline.components_TimelineItemEventRowTimestamp_Night_2_en",0,], -["features.messages.impl.timeline.components_TimelineItemEventRowTimestamp_Day_3_en","features.messages.impl.timeline.components_TimelineItemEventRowTimestamp_Night_3_en",20308,], -["features.messages.impl.timeline.components_TimelineItemEventRowTimestamp_Day_4_en","features.messages.impl.timeline.components_TimelineItemEventRowTimestamp_Night_4_en",20308,], +["features.messages.impl.timeline.components_TimelineItemEventRowTimestamp_Day_3_en","features.messages.impl.timeline.components_TimelineItemEventRowTimestamp_Night_3_en",20323,], +["features.messages.impl.timeline.components_TimelineItemEventRowTimestamp_Day_4_en","features.messages.impl.timeline.components_TimelineItemEventRowTimestamp_Night_4_en",20323,], ["features.messages.impl.timeline.components_TimelineItemEventRowTimestamp_Day_5_en","features.messages.impl.timeline.components_TimelineItemEventRowTimestamp_Night_5_en",0,], ["features.messages.impl.timeline.components_TimelineItemEventRowTimestamp_Day_6_en","features.messages.impl.timeline.components_TimelineItemEventRowTimestamp_Night_6_en",0,], -["features.messages.impl.timeline.components_TimelineItemEventRowTimestamp_Day_7_en","features.messages.impl.timeline.components_TimelineItemEventRowTimestamp_Night_7_en",20308,], -["features.messages.impl.timeline.components_TimelineItemEventRowUtd_Day_0_en","features.messages.impl.timeline.components_TimelineItemEventRowUtd_Night_0_en",20308,], -["features.messages.impl.timeline.components_TimelineItemEventRowWithManyReactions_Day_0_en","features.messages.impl.timeline.components_TimelineItemEventRowWithManyReactions_Night_0_en",20308,], +["features.messages.impl.timeline.components_TimelineItemEventRowTimestamp_Day_7_en","features.messages.impl.timeline.components_TimelineItemEventRowTimestamp_Night_7_en",20323,], +["features.messages.impl.timeline.components_TimelineItemEventRowUtd_Day_0_en","features.messages.impl.timeline.components_TimelineItemEventRowUtd_Night_0_en",20323,], +["features.messages.impl.timeline.components_TimelineItemEventRowWithManyReactions_Day_0_en","features.messages.impl.timeline.components_TimelineItemEventRowWithManyReactions_Night_0_en",20323,], ["features.messages.impl.timeline.components_TimelineItemEventRowWithRR_Day_0_en","features.messages.impl.timeline.components_TimelineItemEventRowWithRR_Night_0_en",0,], ["features.messages.impl.timeline.components_TimelineItemEventRowWithRR_Day_1_en","features.messages.impl.timeline.components_TimelineItemEventRowWithRR_Night_1_en",0,], ["features.messages.impl.timeline.components_TimelineItemEventRowWithRR_Day_2_en","features.messages.impl.timeline.components_TimelineItemEventRowWithRR_Night_2_en",0,], -["features.messages.impl.timeline.components_TimelineItemEventRowWithReplyInformative_Day_0_en","features.messages.impl.timeline.components_TimelineItemEventRowWithReplyInformative_Night_0_en",20308,], -["features.messages.impl.timeline.components_TimelineItemEventRowWithReplyInformative_Day_1_en","features.messages.impl.timeline.components_TimelineItemEventRowWithReplyInformative_Night_1_en",20308,], +["features.messages.impl.timeline.components_TimelineItemEventRowWithReplyInformative_Day_0_en","features.messages.impl.timeline.components_TimelineItemEventRowWithReplyInformative_Night_0_en",20323,], +["features.messages.impl.timeline.components_TimelineItemEventRowWithReplyInformative_Day_1_en","features.messages.impl.timeline.components_TimelineItemEventRowWithReplyInformative_Night_1_en",20323,], ["features.messages.impl.timeline.components_TimelineItemEventRowWithReplyOther_Day_0_en","features.messages.impl.timeline.components_TimelineItemEventRowWithReplyOther_Night_0_en",0,], ["features.messages.impl.timeline.components_TimelineItemEventRowWithReplyOther_Day_1_en","features.messages.impl.timeline.components_TimelineItemEventRowWithReplyOther_Night_1_en",0,], ["features.messages.impl.timeline.components_TimelineItemEventRowWithReply_Day_0_en","features.messages.impl.timeline.components_TimelineItemEventRowWithReply_Night_0_en",0,], @@ -1330,40 +1372,41 @@ export const screenshots = [ ["features.messages.impl.timeline.components_TimelineItemEventRowWithReply_Day_1_en","features.messages.impl.timeline.components_TimelineItemEventRowWithReply_Night_1_en",0,], ["features.messages.impl.timeline.components_TimelineItemEventRowWithReply_Day_2_en","features.messages.impl.timeline.components_TimelineItemEventRowWithReply_Night_2_en",0,], ["features.messages.impl.timeline.components_TimelineItemEventRowWithReply_Day_3_en","features.messages.impl.timeline.components_TimelineItemEventRowWithReply_Night_3_en",0,], -["features.messages.impl.timeline.components_TimelineItemEventRowWithReply_Day_4_en","features.messages.impl.timeline.components_TimelineItemEventRowWithReply_Night_4_en",20308,], +["features.messages.impl.timeline.components_TimelineItemEventRowWithReply_Day_4_en","features.messages.impl.timeline.components_TimelineItemEventRowWithReply_Night_4_en",20323,], ["features.messages.impl.timeline.components_TimelineItemEventRowWithReply_Day_5_en","features.messages.impl.timeline.components_TimelineItemEventRowWithReply_Night_5_en",0,], ["features.messages.impl.timeline.components_TimelineItemEventRowWithReply_Day_6_en","features.messages.impl.timeline.components_TimelineItemEventRowWithReply_Night_6_en",0,], ["features.messages.impl.timeline.components_TimelineItemEventRowWithReply_Day_7_en","features.messages.impl.timeline.components_TimelineItemEventRowWithReply_Night_7_en",0,], -["features.messages.impl.timeline.components_TimelineItemEventRowWithReply_Day_8_en","features.messages.impl.timeline.components_TimelineItemEventRowWithReply_Night_8_en",20308,], +["features.messages.impl.timeline.components_TimelineItemEventRowWithReply_Day_8_en","features.messages.impl.timeline.components_TimelineItemEventRowWithReply_Night_8_en",20323,], ["features.messages.impl.timeline.components_TimelineItemEventRowWithReply_Day_9_en","features.messages.impl.timeline.components_TimelineItemEventRowWithReply_Night_9_en",0,], +["features.messages.impl.timeline.components_TimelineItemEventRowWithThreadSummary_Day_0_en","features.messages.impl.timeline.components_TimelineItemEventRowWithThreadSummary_Night_0_en",20325,], ["features.messages.impl.timeline.components_TimelineItemEventRow_Day_0_en","features.messages.impl.timeline.components_TimelineItemEventRow_Night_0_en",0,], -["features.messages.impl.timeline.components_TimelineItemEventTimestampBelow_en","",20308,], +["features.messages.impl.timeline.components_TimelineItemEventTimestampBelow_en","",20323,], ["features.messages.impl.timeline.components.event_TimelineItemFileView_Day_0_en","features.messages.impl.timeline.components.event_TimelineItemFileView_Night_0_en",0,], ["features.messages.impl.timeline.components.event_TimelineItemFileView_Day_1_en","features.messages.impl.timeline.components.event_TimelineItemFileView_Night_1_en",0,], ["features.messages.impl.timeline.components.event_TimelineItemFileView_Day_2_en","features.messages.impl.timeline.components.event_TimelineItemFileView_Night_2_en",0,], ["features.messages.impl.timeline.components.event_TimelineItemFileView_Day_3_en","features.messages.impl.timeline.components.event_TimelineItemFileView_Night_3_en",0,], ["features.messages.impl.timeline.components.event_TimelineItemFileView_Day_4_en","features.messages.impl.timeline.components.event_TimelineItemFileView_Night_4_en",0,], -["features.messages.impl.timeline.components_TimelineItemGroupedEventsRowContentCollapse_Day_0_en","features.messages.impl.timeline.components_TimelineItemGroupedEventsRowContentCollapse_Night_0_en",20308,], -["features.messages.impl.timeline.components_TimelineItemGroupedEventsRowContentExpanded_Day_0_en","features.messages.impl.timeline.components_TimelineItemGroupedEventsRowContentExpanded_Night_0_en",20308,], -["features.messages.impl.timeline.components.event_TimelineItemImageViewHideMediaContent_Day_0_en","features.messages.impl.timeline.components.event_TimelineItemImageViewHideMediaContent_Night_0_en",20308,], +["features.messages.impl.timeline.components_TimelineItemGroupedEventsRowContentCollapse_Day_0_en","features.messages.impl.timeline.components_TimelineItemGroupedEventsRowContentCollapse_Night_0_en",20323,], +["features.messages.impl.timeline.components_TimelineItemGroupedEventsRowContentExpanded_Day_0_en","features.messages.impl.timeline.components_TimelineItemGroupedEventsRowContentExpanded_Night_0_en",20323,], +["features.messages.impl.timeline.components.event_TimelineItemImageViewHideMediaContent_Day_0_en","features.messages.impl.timeline.components.event_TimelineItemImageViewHideMediaContent_Night_0_en",20323,], ["features.messages.impl.timeline.components.event_TimelineItemImageView_Day_0_en","features.messages.impl.timeline.components.event_TimelineItemImageView_Night_0_en",0,], ["features.messages.impl.timeline.components.event_TimelineItemImageView_Day_1_en","features.messages.impl.timeline.components.event_TimelineItemImageView_Night_1_en",0,], ["features.messages.impl.timeline.components.event_TimelineItemImageView_Day_2_en","features.messages.impl.timeline.components.event_TimelineItemImageView_Night_2_en",0,], ["features.messages.impl.timeline.components.event_TimelineItemImageView_Day_3_en","features.messages.impl.timeline.components.event_TimelineItemImageView_Night_3_en",0,], ["features.messages.impl.timeline.components.event_TimelineItemInformativeView_Day_0_en","features.messages.impl.timeline.components.event_TimelineItemInformativeView_Night_0_en",0,], -["features.messages.impl.timeline.components.event_TimelineItemLegacyCallInviteView_Day_0_en","features.messages.impl.timeline.components.event_TimelineItemLegacyCallInviteView_Night_0_en",20308,], +["features.messages.impl.timeline.components.event_TimelineItemLegacyCallInviteView_Day_0_en","features.messages.impl.timeline.components.event_TimelineItemLegacyCallInviteView_Night_0_en",20323,], ["features.messages.impl.timeline.components.event_TimelineItemLocationView_Day_0_en","features.messages.impl.timeline.components.event_TimelineItemLocationView_Night_0_en",0,], ["features.messages.impl.timeline.components.event_TimelineItemLocationView_Day_1_en","features.messages.impl.timeline.components.event_TimelineItemLocationView_Night_1_en",0,], -["features.messages.impl.timeline.components.event_TimelineItemPollView_Day_0_en","features.messages.impl.timeline.components.event_TimelineItemPollView_Night_0_en",20308,], -["features.messages.impl.timeline.components.event_TimelineItemPollView_Day_1_en","features.messages.impl.timeline.components.event_TimelineItemPollView_Night_1_en",20308,], -["features.messages.impl.timeline.components.event_TimelineItemPollView_Day_2_en","features.messages.impl.timeline.components.event_TimelineItemPollView_Night_2_en",20308,], -["features.messages.impl.timeline.components.event_TimelineItemPollView_Day_3_en","features.messages.impl.timeline.components.event_TimelineItemPollView_Night_3_en",20308,], -["features.messages.impl.timeline.components_TimelineItemReactionsLayout_Day_0_en","features.messages.impl.timeline.components_TimelineItemReactionsLayout_Night_0_en",20308,], +["features.messages.impl.timeline.components.event_TimelineItemPollView_Day_0_en","features.messages.impl.timeline.components.event_TimelineItemPollView_Night_0_en",20323,], +["features.messages.impl.timeline.components.event_TimelineItemPollView_Day_1_en","features.messages.impl.timeline.components.event_TimelineItemPollView_Night_1_en",20323,], +["features.messages.impl.timeline.components.event_TimelineItemPollView_Day_2_en","features.messages.impl.timeline.components.event_TimelineItemPollView_Night_2_en",20323,], +["features.messages.impl.timeline.components.event_TimelineItemPollView_Day_3_en","features.messages.impl.timeline.components.event_TimelineItemPollView_Night_3_en",20323,], +["features.messages.impl.timeline.components_TimelineItemReactionsLayout_Day_0_en","features.messages.impl.timeline.components_TimelineItemReactionsLayout_Night_0_en",20323,], ["features.messages.impl.timeline.components_TimelineItemReactionsViewFew_Day_0_en","features.messages.impl.timeline.components_TimelineItemReactionsViewFew_Night_0_en",0,], -["features.messages.impl.timeline.components_TimelineItemReactionsViewIncoming_Day_0_en","features.messages.impl.timeline.components_TimelineItemReactionsViewIncoming_Night_0_en",20308,], -["features.messages.impl.timeline.components_TimelineItemReactionsViewOutgoing_Day_0_en","features.messages.impl.timeline.components_TimelineItemReactionsViewOutgoing_Night_0_en",20308,], +["features.messages.impl.timeline.components_TimelineItemReactionsViewIncoming_Day_0_en","features.messages.impl.timeline.components_TimelineItemReactionsViewIncoming_Night_0_en",20323,], +["features.messages.impl.timeline.components_TimelineItemReactionsViewOutgoing_Day_0_en","features.messages.impl.timeline.components_TimelineItemReactionsViewOutgoing_Night_0_en",20323,], ["features.messages.impl.timeline.components_TimelineItemReactionsView_Day_0_en","features.messages.impl.timeline.components_TimelineItemReactionsView_Night_0_en",0,], -["features.messages.impl.timeline.components.virtual_TimelineItemReadMarkerView_Day_0_en","features.messages.impl.timeline.components.virtual_TimelineItemReadMarkerView_Night_0_en",20308,], +["features.messages.impl.timeline.components.virtual_TimelineItemReadMarkerView_Day_0_en","features.messages.impl.timeline.components.virtual_TimelineItemReadMarkerView_Night_0_en",20323,], ["features.messages.impl.timeline.components.receipt_TimelineItemReadReceiptView_Day_0_en","features.messages.impl.timeline.components.receipt_TimelineItemReadReceiptView_Night_0_en",0,], ["features.messages.impl.timeline.components.receipt_TimelineItemReadReceiptView_Day_1_en","features.messages.impl.timeline.components.receipt_TimelineItemReadReceiptView_Night_1_en",0,], ["features.messages.impl.timeline.components.receipt_TimelineItemReadReceiptView_Day_2_en","features.messages.impl.timeline.components.receipt_TimelineItemReadReceiptView_Night_2_en",0,], @@ -1372,8 +1415,8 @@ export const screenshots = [ ["features.messages.impl.timeline.components.receipt_TimelineItemReadReceiptView_Day_5_en","features.messages.impl.timeline.components.receipt_TimelineItemReadReceiptView_Night_5_en",0,], ["features.messages.impl.timeline.components.receipt_TimelineItemReadReceiptView_Day_6_en","features.messages.impl.timeline.components.receipt_TimelineItemReadReceiptView_Night_6_en",0,], ["features.messages.impl.timeline.components.receipt_TimelineItemReadReceiptView_Day_7_en","features.messages.impl.timeline.components.receipt_TimelineItemReadReceiptView_Night_7_en",0,], -["features.messages.impl.timeline.components.event_TimelineItemRedactedView_Day_0_en","features.messages.impl.timeline.components.event_TimelineItemRedactedView_Night_0_en",20308,], -["features.messages.impl.timeline.components.virtual_TimelineItemRoomBeginningView_Day_0_en","features.messages.impl.timeline.components.virtual_TimelineItemRoomBeginningView_Night_0_en",20308,], +["features.messages.impl.timeline.components.event_TimelineItemRedactedView_Day_0_en","features.messages.impl.timeline.components.event_TimelineItemRedactedView_Night_0_en",20323,], +["features.messages.impl.timeline.components.virtual_TimelineItemRoomBeginningView_Day_0_en","features.messages.impl.timeline.components.virtual_TimelineItemRoomBeginningView_Night_0_en",20323,], ["features.messages.impl.timeline.components_TimelineItemStateEventRow_Day_0_en","features.messages.impl.timeline.components_TimelineItemStateEventRow_Night_0_en",0,], ["features.messages.impl.timeline.components.event_TimelineItemStateView_Day_0_en","features.messages.impl.timeline.components.event_TimelineItemStateView_Night_0_en",0,], ["features.messages.impl.timeline.components.event_TimelineItemStickerView_Day_0_en","features.messages.impl.timeline.components.event_TimelineItemStickerView_Night_0_en",0,], @@ -1388,8 +1431,8 @@ export const screenshots = [ ["features.messages.impl.timeline.components.event_TimelineItemTextView_Day_3_en","features.messages.impl.timeline.components.event_TimelineItemTextView_Night_3_en",0,], ["features.messages.impl.timeline.components.event_TimelineItemTextView_Day_4_en","features.messages.impl.timeline.components.event_TimelineItemTextView_Night_4_en",0,], ["features.messages.impl.timeline.components.event_TimelineItemTextView_Day_5_en","features.messages.impl.timeline.components.event_TimelineItemTextView_Night_5_en",0,], -["features.messages.impl.timeline.components.event_TimelineItemUnknownView_Day_0_en","features.messages.impl.timeline.components.event_TimelineItemUnknownView_Night_0_en",20308,], -["features.messages.impl.timeline.components.event_TimelineItemVideoViewHideMediaContent_Day_0_en","features.messages.impl.timeline.components.event_TimelineItemVideoViewHideMediaContent_Night_0_en",20308,], +["features.messages.impl.timeline.components.event_TimelineItemUnknownView_Day_0_en","features.messages.impl.timeline.components.event_TimelineItemUnknownView_Night_0_en",20323,], +["features.messages.impl.timeline.components.event_TimelineItemVideoViewHideMediaContent_Day_0_en","features.messages.impl.timeline.components.event_TimelineItemVideoViewHideMediaContent_Night_0_en",20323,], ["features.messages.impl.timeline.components.event_TimelineItemVideoView_Day_0_en","features.messages.impl.timeline.components.event_TimelineItemVideoView_Night_0_en",0,], ["features.messages.impl.timeline.components.event_TimelineItemVideoView_Day_1_en","features.messages.impl.timeline.components.event_TimelineItemVideoView_Night_1_en",0,], ["features.messages.impl.timeline.components.event_TimelineItemVideoView_Day_2_en","features.messages.impl.timeline.components.event_TimelineItemVideoView_Night_2_en",0,], @@ -1412,83 +1455,85 @@ export const screenshots = [ ["features.messages.impl.timeline.components.event_TimelineItemVoiceView_Day_9_en","features.messages.impl.timeline.components.event_TimelineItemVoiceView_Night_9_en",0,], ["features.messages.impl.timeline.components.virtual_TimelineLoadingMoreIndicator_Day_0_en","features.messages.impl.timeline.components.virtual_TimelineLoadingMoreIndicator_Night_0_en",0,], ["features.messages.impl.timeline.components.event_TimelineVideoWithCaptionRow_Day_0_en","features.messages.impl.timeline.components.event_TimelineVideoWithCaptionRow_Night_0_en",0,], -["features.messages.impl.timeline_TimelineViewMessageShield_Day_0_en","features.messages.impl.timeline_TimelineViewMessageShield_Night_0_en",20308,], -["features.messages.impl.timeline_TimelineView_Day_0_en","features.messages.impl.timeline_TimelineView_Night_0_en",20308,], +["features.messages.impl.timeline_TimelineViewMessageShield_Day_0_en","features.messages.impl.timeline_TimelineViewMessageShield_Night_0_en",20323,], +["features.messages.impl.timeline_TimelineView_Day_0_en","features.messages.impl.timeline_TimelineView_Night_0_en",20323,], ["features.messages.impl.timeline_TimelineView_Day_10_en","features.messages.impl.timeline_TimelineView_Night_10_en",0,], -["features.messages.impl.timeline_TimelineView_Day_11_en","features.messages.impl.timeline_TimelineView_Night_11_en",20308,], -["features.messages.impl.timeline_TimelineView_Day_12_en","features.messages.impl.timeline_TimelineView_Night_12_en",20308,], -["features.messages.impl.timeline_TimelineView_Day_13_en","features.messages.impl.timeline_TimelineView_Night_13_en",20308,], -["features.messages.impl.timeline_TimelineView_Day_14_en","features.messages.impl.timeline_TimelineView_Night_14_en",20308,], -["features.messages.impl.timeline_TimelineView_Day_15_en","features.messages.impl.timeline_TimelineView_Night_15_en",20308,], -["features.messages.impl.timeline_TimelineView_Day_16_en","features.messages.impl.timeline_TimelineView_Night_16_en",20308,], -["features.messages.impl.timeline_TimelineView_Day_17_en","features.messages.impl.timeline_TimelineView_Night_17_en",20308,], -["features.messages.impl.timeline_TimelineView_Day_1_en","features.messages.impl.timeline_TimelineView_Night_1_en",20308,], +["features.messages.impl.timeline_TimelineView_Day_11_en","features.messages.impl.timeline_TimelineView_Night_11_en",20323,], +["features.messages.impl.timeline_TimelineView_Day_12_en","features.messages.impl.timeline_TimelineView_Night_12_en",20323,], +["features.messages.impl.timeline_TimelineView_Day_13_en","features.messages.impl.timeline_TimelineView_Night_13_en",20323,], +["features.messages.impl.timeline_TimelineView_Day_14_en","features.messages.impl.timeline_TimelineView_Night_14_en",20323,], +["features.messages.impl.timeline_TimelineView_Day_15_en","features.messages.impl.timeline_TimelineView_Night_15_en",20323,], +["features.messages.impl.timeline_TimelineView_Day_16_en","features.messages.impl.timeline_TimelineView_Night_16_en",20323,], +["features.messages.impl.timeline_TimelineView_Day_17_en","features.messages.impl.timeline_TimelineView_Night_17_en",20323,], +["features.messages.impl.timeline_TimelineView_Day_1_en","features.messages.impl.timeline_TimelineView_Night_1_en",20323,], ["features.messages.impl.timeline_TimelineView_Day_2_en","features.messages.impl.timeline_TimelineView_Night_2_en",0,], ["features.messages.impl.timeline_TimelineView_Day_3_en","features.messages.impl.timeline_TimelineView_Night_3_en",0,], -["features.messages.impl.timeline_TimelineView_Day_4_en","features.messages.impl.timeline_TimelineView_Night_4_en",20308,], +["features.messages.impl.timeline_TimelineView_Day_4_en","features.messages.impl.timeline_TimelineView_Night_4_en",20323,], ["features.messages.impl.timeline_TimelineView_Day_5_en","features.messages.impl.timeline_TimelineView_Night_5_en",0,], -["features.messages.impl.timeline_TimelineView_Day_6_en","features.messages.impl.timeline_TimelineView_Night_6_en",20308,], +["features.messages.impl.timeline_TimelineView_Day_6_en","features.messages.impl.timeline_TimelineView_Night_6_en",20323,], ["features.messages.impl.timeline_TimelineView_Day_7_en","features.messages.impl.timeline_TimelineView_Night_7_en",0,], -["features.messages.impl.timeline_TimelineView_Day_8_en","features.messages.impl.timeline_TimelineView_Night_8_en",20308,], +["features.messages.impl.timeline_TimelineView_Day_8_en","features.messages.impl.timeline_TimelineView_Night_8_en",20323,], ["features.messages.impl.timeline_TimelineView_Day_9_en","features.messages.impl.timeline_TimelineView_Night_9_en",0,], ["libraries.designsystem.components.avatar.internal_TombstonedRoomAvatar_Avatars_en","",0,], ["libraries.designsystem.theme.components_TopAppBarStr_App_Bars_en","",0,], ["libraries.designsystem.theme.components_TopAppBar_App_Bars_en","",0,], -["libraries.troubleshoot.impl_TroubleshootNotificationsView_Day_0_en","libraries.troubleshoot.impl_TroubleshootNotificationsView_Night_0_en",20308,], -["libraries.troubleshoot.impl_TroubleshootNotificationsView_Day_1_en","libraries.troubleshoot.impl_TroubleshootNotificationsView_Night_1_en",20308,], -["libraries.troubleshoot.impl_TroubleshootNotificationsView_Day_2_en","libraries.troubleshoot.impl_TroubleshootNotificationsView_Night_2_en",20308,], -["libraries.troubleshoot.impl_TroubleshootNotificationsView_Day_3_en","libraries.troubleshoot.impl_TroubleshootNotificationsView_Night_3_en",20308,], -["libraries.troubleshoot.impl_TroubleshootNotificationsView_Day_4_en","libraries.troubleshoot.impl_TroubleshootNotificationsView_Night_4_en",20308,], -["libraries.troubleshoot.impl_TroubleshootNotificationsView_Day_5_en","libraries.troubleshoot.impl_TroubleshootNotificationsView_Night_5_en",20308,], -["libraries.troubleshoot.impl_TroubleshootNotificationsView_Day_6_en","libraries.troubleshoot.impl_TroubleshootNotificationsView_Night_6_en",20308,], -["libraries.troubleshoot.impl_TroubleshootNotificationsView_Day_7_en","libraries.troubleshoot.impl_TroubleshootNotificationsView_Night_7_en",20308,], +["libraries.troubleshoot.impl_TroubleshootNotificationsView_Day_0_en","libraries.troubleshoot.impl_TroubleshootNotificationsView_Night_0_en",20323,], +["libraries.troubleshoot.impl_TroubleshootNotificationsView_Day_1_en","libraries.troubleshoot.impl_TroubleshootNotificationsView_Night_1_en",20323,], +["libraries.troubleshoot.impl_TroubleshootNotificationsView_Day_2_en","libraries.troubleshoot.impl_TroubleshootNotificationsView_Night_2_en",20323,], +["libraries.troubleshoot.impl_TroubleshootNotificationsView_Day_3_en","libraries.troubleshoot.impl_TroubleshootNotificationsView_Night_3_en",20323,], +["libraries.troubleshoot.impl_TroubleshootNotificationsView_Day_4_en","libraries.troubleshoot.impl_TroubleshootNotificationsView_Night_4_en",20323,], +["libraries.troubleshoot.impl_TroubleshootNotificationsView_Day_5_en","libraries.troubleshoot.impl_TroubleshootNotificationsView_Night_5_en",20323,], +["libraries.troubleshoot.impl_TroubleshootNotificationsView_Day_6_en","libraries.troubleshoot.impl_TroubleshootNotificationsView_Night_6_en",20323,], +["libraries.troubleshoot.impl_TroubleshootNotificationsView_Day_7_en","libraries.troubleshoot.impl_TroubleshootNotificationsView_Night_7_en",20323,], ["features.messages.impl.typing_TypingNotificationView_Day_0_en","features.messages.impl.typing_TypingNotificationView_Night_0_en",0,], -["features.messages.impl.typing_TypingNotificationView_Day_1_en","features.messages.impl.typing_TypingNotificationView_Night_1_en",20308,], -["features.messages.impl.typing_TypingNotificationView_Day_2_en","features.messages.impl.typing_TypingNotificationView_Night_2_en",20308,], -["features.messages.impl.typing_TypingNotificationView_Day_3_en","features.messages.impl.typing_TypingNotificationView_Night_3_en",20308,], -["features.messages.impl.typing_TypingNotificationView_Day_4_en","features.messages.impl.typing_TypingNotificationView_Night_4_en",20308,], -["features.messages.impl.typing_TypingNotificationView_Day_5_en","features.messages.impl.typing_TypingNotificationView_Night_5_en",20308,], -["features.messages.impl.typing_TypingNotificationView_Day_6_en","features.messages.impl.typing_TypingNotificationView_Night_6_en",20308,], +["features.messages.impl.typing_TypingNotificationView_Day_1_en","features.messages.impl.typing_TypingNotificationView_Night_1_en",20323,], +["features.messages.impl.typing_TypingNotificationView_Day_2_en","features.messages.impl.typing_TypingNotificationView_Night_2_en",20323,], +["features.messages.impl.typing_TypingNotificationView_Day_3_en","features.messages.impl.typing_TypingNotificationView_Night_3_en",20323,], +["features.messages.impl.typing_TypingNotificationView_Day_4_en","features.messages.impl.typing_TypingNotificationView_Night_4_en",20323,], +["features.messages.impl.typing_TypingNotificationView_Day_5_en","features.messages.impl.typing_TypingNotificationView_Night_5_en",20323,], +["features.messages.impl.typing_TypingNotificationView_Day_6_en","features.messages.impl.typing_TypingNotificationView_Night_6_en",20323,], ["features.messages.impl.typing_TypingNotificationView_Day_7_en","features.messages.impl.typing_TypingNotificationView_Night_7_en",0,], ["features.messages.impl.typing_TypingNotificationView_Day_8_en","features.messages.impl.typing_TypingNotificationView_Night_8_en",0,], ["libraries.designsystem.atomic.atoms_UnreadIndicatorAtom_Day_0_en","libraries.designsystem.atomic.atoms_UnreadIndicatorAtom_Night_0_en",0,], -["libraries.matrix.ui.components_UnresolvedUserRow_en","",20308,], +["libraries.matrix.ui.components_UnresolvedUserRow_en","",20323,], ["libraries.matrix.ui.components_UnsavedAvatar_Day_0_en","libraries.matrix.ui.components_UnsavedAvatar_Night_0_en",0,], ["libraries.designsystem.components.avatar.internal_UserAvatarColors_Day_0_en","libraries.designsystem.components.avatar.internal_UserAvatarColors_Night_0_en",0,], -["features.roomdetails.impl.notificationsettings_UserDefinedRoomNotificationSettingsView_Day_0_en","features.roomdetails.impl.notificationsettings_UserDefinedRoomNotificationSettingsView_Night_0_en",20308,], -["features.createroom.impl.components_UserListView_Day_0_en","features.createroom.impl.components_UserListView_Night_0_en",20308,], -["features.createroom.impl.components_UserListView_Day_1_en","features.createroom.impl.components_UserListView_Night_1_en",20308,], -["features.createroom.impl.components_UserListView_Day_2_en","features.createroom.impl.components_UserListView_Night_2_en",20308,], -["features.createroom.impl.components_UserListView_Day_3_en","features.createroom.impl.components_UserListView_Night_3_en",0,], -["features.createroom.impl.components_UserListView_Day_4_en","features.createroom.impl.components_UserListView_Night_4_en",0,], -["features.createroom.impl.components_UserListView_Day_5_en","features.createroom.impl.components_UserListView_Night_5_en",0,], -["features.createroom.impl.components_UserListView_Day_6_en","features.createroom.impl.components_UserListView_Night_6_en",0,], -["features.createroom.impl.components_UserListView_Day_7_en","features.createroom.impl.components_UserListView_Night_7_en",20308,], -["features.createroom.impl.components_UserListView_Day_8_en","features.createroom.impl.components_UserListView_Night_8_en",0,], -["features.createroom.impl.components_UserListView_Day_9_en","features.createroom.impl.components_UserListView_Night_9_en",20308,], +["features.roomdetails.impl.notificationsettings_UserDefinedRoomNotificationSettingsView_Day_0_en","features.roomdetails.impl.notificationsettings_UserDefinedRoomNotificationSettingsView_Night_0_en",20323,], +["features.startchat.impl.components_UserListView_Day_0_en","features.startchat.impl.components_UserListView_Night_0_en",20323,], +["features.startchat.impl.components_UserListView_Day_1_en","features.startchat.impl.components_UserListView_Night_1_en",20323,], +["features.startchat.impl.components_UserListView_Day_2_en","features.startchat.impl.components_UserListView_Night_2_en",20323,], +["features.startchat.impl.components_UserListView_Day_3_en","features.startchat.impl.components_UserListView_Night_3_en",0,], +["features.startchat.impl.components_UserListView_Day_4_en","features.startchat.impl.components_UserListView_Night_4_en",0,], +["features.startchat.impl.components_UserListView_Day_5_en","features.startchat.impl.components_UserListView_Night_5_en",0,], +["features.startchat.impl.components_UserListView_Day_6_en","features.startchat.impl.components_UserListView_Night_6_en",0,], +["features.startchat.impl.components_UserListView_Day_7_en","features.startchat.impl.components_UserListView_Night_7_en",20323,], +["features.startchat.impl.components_UserListView_Day_8_en","features.startchat.impl.components_UserListView_Night_8_en",0,], +["features.startchat.impl.components_UserListView_Day_9_en","features.startchat.impl.components_UserListView_Night_9_en",20323,], ["features.preferences.impl.user_UserPreferences_Day_0_en","features.preferences.impl.user_UserPreferences_Night_0_en",0,], ["features.preferences.impl.user_UserPreferences_Day_1_en","features.preferences.impl.user_UserPreferences_Night_1_en",0,], ["features.preferences.impl.user_UserPreferences_Day_2_en","features.preferences.impl.user_UserPreferences_Night_2_en",0,], -["features.userprofile.shared_UserProfileHeaderSectionWithVerificationViolation_Day_0_en","features.userprofile.shared_UserProfileHeaderSectionWithVerificationViolation_Night_0_en",20308,], -["features.userprofile.shared_UserProfileHeaderSection_Day_0_en","features.userprofile.shared_UserProfileHeaderSection_Night_0_en",20308,], -["features.userprofile.shared_UserProfileView_Day_0_en","features.userprofile.shared_UserProfileView_Night_0_en",20308,], -["features.userprofile.shared_UserProfileView_Day_1_en","features.userprofile.shared_UserProfileView_Night_1_en",20308,], -["features.userprofile.shared_UserProfileView_Day_2_en","features.userprofile.shared_UserProfileView_Night_2_en",20308,], -["features.userprofile.shared_UserProfileView_Day_3_en","features.userprofile.shared_UserProfileView_Night_3_en",20308,], -["features.userprofile.shared_UserProfileView_Day_4_en","features.userprofile.shared_UserProfileView_Night_4_en",20308,], -["features.userprofile.shared_UserProfileView_Day_5_en","features.userprofile.shared_UserProfileView_Night_5_en",20308,], -["features.userprofile.shared_UserProfileView_Day_6_en","features.userprofile.shared_UserProfileView_Night_6_en",20308,], -["features.userprofile.shared_UserProfileView_Day_7_en","features.userprofile.shared_UserProfileView_Night_7_en",20308,], -["features.userprofile.shared_UserProfileView_Day_8_en","features.userprofile.shared_UserProfileView_Night_8_en",20308,], -["features.userprofile.shared_UserProfileView_Day_9_en","features.userprofile.shared_UserProfileView_Night_9_en",20308,], +["features.userprofile.shared_UserProfileHeaderSectionWithVerificationViolation_Day_0_en","features.userprofile.shared_UserProfileHeaderSectionWithVerificationViolation_Night_0_en",20323,], +["features.userprofile.shared_UserProfileHeaderSection_Day_0_en","features.userprofile.shared_UserProfileHeaderSection_Night_0_en",20323,], +["features.userprofile.shared_UserProfileView_Day_0_en","features.userprofile.shared_UserProfileView_Night_0_en",20323,], +["features.userprofile.shared_UserProfileView_Day_1_en","features.userprofile.shared_UserProfileView_Night_1_en",20323,], +["features.userprofile.shared_UserProfileView_Day_2_en","features.userprofile.shared_UserProfileView_Night_2_en",20323,], +["features.userprofile.shared_UserProfileView_Day_3_en","features.userprofile.shared_UserProfileView_Night_3_en",20323,], +["features.userprofile.shared_UserProfileView_Day_4_en","features.userprofile.shared_UserProfileView_Night_4_en",20323,], +["features.userprofile.shared_UserProfileView_Day_5_en","features.userprofile.shared_UserProfileView_Night_5_en",20323,], +["features.userprofile.shared_UserProfileView_Day_6_en","features.userprofile.shared_UserProfileView_Night_6_en",20323,], +["features.userprofile.shared_UserProfileView_Day_7_en","features.userprofile.shared_UserProfileView_Night_7_en",20323,], +["features.userprofile.shared_UserProfileView_Day_8_en","features.userprofile.shared_UserProfileView_Night_8_en",20323,], +["features.userprofile.shared_UserProfileView_Day_9_en","features.userprofile.shared_UserProfileView_Night_9_en",20323,], ["features.verifysession.impl.ui_VerificationUserProfileContent_Day_0_en","features.verifysession.impl.ui_VerificationUserProfileContent_Night_0_en",0,], ["libraries.designsystem.ruler_VerticalRuler_Day_0_en","libraries.designsystem.ruler_VerticalRuler_Night_0_en",0,], ["libraries.mediaviewer.impl.gallery.ui_VideoItemView_Day_0_en","libraries.mediaviewer.impl.gallery.ui_VideoItemView_Night_0_en",0,], ["libraries.mediaviewer.impl.gallery.ui_VideoItemView_Day_1_en","libraries.mediaviewer.impl.gallery.ui_VideoItemView_Night_1_en",0,], +["features.messages.impl.attachments.preview_VideoQualitySelectorDialog_Day_0_en","features.messages.impl.attachments.preview_VideoQualitySelectorDialog_Night_0_en",20323,], +["features.preferences.impl.advanced_VideoQualitySelectorDialog_Day_0_en","features.preferences.impl.advanced_VideoQualitySelectorDialog_Night_0_en",20323,], ["features.viewfolder.impl.file_ViewFileView_Day_0_en","features.viewfolder.impl.file_ViewFileView_Night_0_en",0,], ["features.viewfolder.impl.file_ViewFileView_Day_1_en","features.viewfolder.impl.file_ViewFileView_Night_1_en",0,], ["features.viewfolder.impl.file_ViewFileView_Day_2_en","features.viewfolder.impl.file_ViewFileView_Night_2_en",0,], -["features.viewfolder.impl.file_ViewFileView_Day_3_en","features.viewfolder.impl.file_ViewFileView_Night_3_en",20308,], +["features.viewfolder.impl.file_ViewFileView_Day_3_en","features.viewfolder.impl.file_ViewFileView_Night_3_en",20323,], ["features.viewfolder.impl.file_ViewFileView_Day_4_en","features.viewfolder.impl.file_ViewFileView_Night_4_en",0,], ["features.viewfolder.impl.file_ViewFileView_Day_5_en","features.viewfolder.impl.file_ViewFileView_Night_5_en",0,], ["features.viewfolder.impl.folder_ViewFolderView_Day_0_en","features.viewfolder.impl.folder_ViewFolderView_Night_0_en",0,], @@ -1507,6 +1552,5 @@ export const screenshots = [ ["libraries.textcomposer.components_VoiceMessageRecording_Day_0_en","libraries.textcomposer.components_VoiceMessageRecording_Night_0_en",0,], ["libraries.textcomposer.components_VoiceMessage_Day_0_en","libraries.textcomposer.components_VoiceMessage_Night_0_en",0,], ["libraries.designsystem.components.media_WaveformPlaybackView_Day_0_en","libraries.designsystem.components.media_WaveformPlaybackView_Night_0_en",0,], -["features.ftue.impl.welcome_WelcomeView_Day_0_en","features.ftue.impl.welcome_WelcomeView_Night_0_en",20308,], ["libraries.designsystem.ruler_WithRulers_Day_0_en","libraries.designsystem.ruler_WithRulers_Night_0_en",0,], ]; diff --git a/services/analytics/impl/build.gradle.kts b/services/analytics/impl/build.gradle.kts index 3ccd7a18c8..6143511f26 100644 --- a/services/analytics/impl/build.gradle.kts +++ b/services/analytics/impl/build.gradle.kts @@ -23,6 +23,7 @@ dependencies { implementation(projects.libraries.core) implementation(projects.libraries.architecture) implementation(projects.libraries.designsystem) + implementation(projects.libraries.preferences.api) implementation(projects.libraries.sessionStorage.api) api(projects.services.analyticsproviders.api) diff --git a/services/analytics/impl/src/main/kotlin/io/element/android/services/analytics/impl/store/AnalyticsStore.kt b/services/analytics/impl/src/main/kotlin/io/element/android/services/analytics/impl/store/AnalyticsStore.kt index 7c7109e482..446d3fdaaa 100644 --- a/services/analytics/impl/src/main/kotlin/io/element/android/services/analytics/impl/store/AnalyticsStore.kt +++ b/services/analytics/impl/src/main/kotlin/io/element/android/services/analytics/impl/store/AnalyticsStore.kt @@ -7,27 +7,18 @@ package io.element.android.services.analytics.impl.store -import android.content.Context -import androidx.datastore.core.DataStore -import androidx.datastore.preferences.core.Preferences import androidx.datastore.preferences.core.booleanPreferencesKey import androidx.datastore.preferences.core.edit import androidx.datastore.preferences.core.stringPreferencesKey -import androidx.datastore.preferences.preferencesDataStore import com.squareup.anvil.annotations.ContributesBinding import io.element.android.libraries.core.bool.orFalse import io.element.android.libraries.di.AppScope -import io.element.android.libraries.di.ApplicationContext +import io.element.android.libraries.preferences.api.store.PreferenceDataStoreFactory import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.distinctUntilChanged import kotlinx.coroutines.flow.map import javax.inject.Inject -/** - * Also accessed via reflection by the instrumentation tests @see [im.vector.app.ClearCurrentSessionRule]. - */ -private val Context.dataStore: DataStore by preferencesDataStore(name = "vector_analytics") - /** * Local storage for: * - user consent (Boolean); @@ -46,44 +37,46 @@ interface AnalyticsStore { @ContributesBinding(AppScope::class) class DefaultAnalyticsStore @Inject constructor( - @ApplicationContext private val context: Context + preferenceDataStoreFactory: PreferenceDataStoreFactory, ) : AnalyticsStore { private val userConsent = booleanPreferencesKey("user_consent") private val didAskUserConsent = booleanPreferencesKey("did_ask_user_consent") private val analyticsId = stringPreferencesKey("analytics_id") - override val userConsentFlow: Flow = context.dataStore.data + private val dataStore = preferenceDataStoreFactory.create("vector_analytics") + + override val userConsentFlow: Flow = dataStore.data .map { preferences -> preferences[userConsent].orFalse() } .distinctUntilChanged() - override val didAskUserConsentFlow: Flow = context.dataStore.data + override val didAskUserConsentFlow: Flow = dataStore.data .map { preferences -> preferences[didAskUserConsent].orFalse() } .distinctUntilChanged() - override val analyticsIdFlow: Flow = context.dataStore.data + override val analyticsIdFlow: Flow = dataStore.data .map { preferences -> preferences[analyticsId].orEmpty() } .distinctUntilChanged() override suspend fun setUserConsent(newUserConsent: Boolean) { - context.dataStore.edit { settings -> + dataStore.edit { settings -> settings[userConsent] = newUserConsent } } override suspend fun setDidAskUserConsent(newValue: Boolean) { - context.dataStore.edit { settings -> + dataStore.edit { settings -> settings[didAskUserConsent] = newValue } } override suspend fun setAnalyticsId(newAnalyticsId: String) { - context.dataStore.edit { settings -> + dataStore.edit { settings -> settings[analyticsId] = newAnalyticsId } } override suspend fun reset() { - context.dataStore.edit { + dataStore.edit { it.clear() } } diff --git a/services/analytics/test/build.gradle.kts b/services/analytics/test/build.gradle.kts index 0103c99816..01b0544694 100644 --- a/services/analytics/test/build.gradle.kts +++ b/services/analytics/test/build.gradle.kts @@ -13,7 +13,7 @@ android { } dependencies { - implementation(projects.services.analytics.api) + api(projects.services.analytics.api) implementation(projects.libraries.core) implementation(projects.tests.testutils) implementation(libs.coroutines.core) diff --git a/services/apperror/api/src/main/kotlin/io/element/android/services/apperror/api/AppErrorStateService.kt b/services/apperror/api/src/main/kotlin/io/element/android/services/apperror/api/AppErrorStateService.kt index 45031fdf33..8070673804 100644 --- a/services/apperror/api/src/main/kotlin/io/element/android/services/apperror/api/AppErrorStateService.kt +++ b/services/apperror/api/src/main/kotlin/io/element/android/services/apperror/api/AppErrorStateService.kt @@ -7,10 +7,13 @@ package io.element.android.services.apperror.api +import androidx.annotation.StringRes import kotlinx.coroutines.flow.StateFlow interface AppErrorStateService { val appErrorStateFlow: StateFlow fun showError(title: String, body: String) + + fun showError(@StringRes titleRes: Int, @StringRes bodyRes: Int) } diff --git a/services/apperror/impl/build.gradle.kts b/services/apperror/impl/build.gradle.kts index a3d17a14cd..01163d240c 100644 --- a/services/apperror/impl/build.gradle.kts +++ b/services/apperror/impl/build.gradle.kts @@ -23,6 +23,7 @@ dependencies { implementation(projects.libraries.di) implementation(projects.libraries.designsystem) implementation(projects.libraries.uiStrings) + implementation(projects.services.toolbox.api) implementation(projects.anvilannotations) implementation(libs.coroutines.core) @@ -34,4 +35,5 @@ dependencies { testImplementation(libs.coroutines.test) testImplementation(libs.test.turbine) testImplementation(libs.test.truth) + testImplementation(projects.services.toolbox.test) } diff --git a/services/apperror/impl/src/main/kotlin/io/element/android/services/apperror/impl/DefaultAppErrorStateService.kt b/services/apperror/impl/src/main/kotlin/io/element/android/services/apperror/impl/DefaultAppErrorStateService.kt index 7341028784..9f9ede50ee 100644 --- a/services/apperror/impl/src/main/kotlin/io/element/android/services/apperror/impl/DefaultAppErrorStateService.kt +++ b/services/apperror/impl/src/main/kotlin/io/element/android/services/apperror/impl/DefaultAppErrorStateService.kt @@ -12,13 +12,16 @@ import io.element.android.libraries.di.AppScope import io.element.android.libraries.di.SingleIn import io.element.android.services.apperror.api.AppErrorState import io.element.android.services.apperror.api.AppErrorStateService +import io.element.android.services.toolbox.api.strings.StringProvider import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.StateFlow import javax.inject.Inject @ContributesBinding(AppScope::class) @SingleIn(AppScope::class) -class DefaultAppErrorStateService @Inject constructor() : AppErrorStateService { +class DefaultAppErrorStateService @Inject constructor( + private val stringProvider: StringProvider, +) : AppErrorStateService { private val currentAppErrorState = MutableStateFlow(AppErrorState.NoError) override val appErrorStateFlow: StateFlow = currentAppErrorState @@ -31,4 +34,10 @@ class DefaultAppErrorStateService @Inject constructor() : AppErrorStateService { }, ) } + + override fun showError(titleRes: Int, bodyRes: Int) { + val title = stringProvider.getString(titleRes) + val body = stringProvider.getString(bodyRes) + showError(title, body) + } } diff --git a/services/apperror/impl/src/test/kotlin/io/element/android/services/apperror/impl/DefaultAppErrorStateServiceTest.kt b/services/apperror/impl/src/test/kotlin/io/element/android/services/apperror/impl/DefaultAppErrorStateServiceTest.kt index 86f918c264..6eb26c9c50 100644 --- a/services/apperror/impl/src/test/kotlin/io/element/android/services/apperror/impl/DefaultAppErrorStateServiceTest.kt +++ b/services/apperror/impl/src/test/kotlin/io/element/android/services/apperror/impl/DefaultAppErrorStateServiceTest.kt @@ -10,14 +10,14 @@ package io.element.android.services.apperror.impl import app.cash.turbine.test import com.google.common.truth.Truth.assertThat import io.element.android.services.apperror.api.AppErrorState +import io.element.android.services.toolbox.test.strings.FakeStringProvider import kotlinx.coroutines.test.runTest import org.junit.Test internal class DefaultAppErrorStateServiceTest { @Test fun `initial value is no error`() = runTest { - val service = DefaultAppErrorStateService() - + val service = createDefaultAppErrorStateService() service.appErrorStateFlow.test { val state = awaitItem() assertThat(state).isInstanceOf(AppErrorState.NoError::class.java) @@ -26,8 +26,7 @@ internal class DefaultAppErrorStateServiceTest { @Test fun `showError - emits value`() = runTest { - val service = DefaultAppErrorStateService() - + val service = createDefaultAppErrorStateService() service.appErrorStateFlow.test { skipItems(1) @@ -42,9 +41,22 @@ internal class DefaultAppErrorStateServiceTest { } @Test - fun `dismiss - clears value`() = runTest { - val service = DefaultAppErrorStateService() + fun `showError - emits value from ids`() = runTest { + val service = createDefaultAppErrorStateService() + service.appErrorStateFlow.test { + skipItems(1) + service.showError(1, 2) + val state = awaitItem() + assertThat(state).isInstanceOf(AppErrorState.Error::class.java) + val errorState = state as AppErrorState.Error + assertThat(errorState.title).isEqualTo("A string") + assertThat(errorState.body).isEqualTo("A string") + } + } + @Test + fun `dismiss - clears value`() = runTest { + val service = createDefaultAppErrorStateService() service.appErrorStateFlow.test { skipItems(1) @@ -58,4 +70,8 @@ internal class DefaultAppErrorStateServiceTest { assertThat(awaitItem()).isInstanceOf(AppErrorState.NoError::class.java) } } + + private fun createDefaultAppErrorStateService() = DefaultAppErrorStateService( + stringProvider = FakeStringProvider(), + ) } diff --git a/services/apperror/test/build.gradle.kts b/services/apperror/test/build.gradle.kts new file mode 100644 index 0000000000..c8ac902784 --- /dev/null +++ b/services/apperror/test/build.gradle.kts @@ -0,0 +1,20 @@ +/* + * Copyright 2025 New Vector Ltd. + * + * SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial + * Please see LICENSE files in the repository root for full details. + */ + +plugins { + id("io.element.android-library") +} + +android { + namespace = "io.element.android.services.apperror.test" +} + +dependencies { + implementation(libs.coroutines.core) + implementation(projects.services.apperror.api) + implementation(projects.tests.testutils) +} diff --git a/services/apperror/test/src/main/kotlin/io/element/android/services/apperror/test/FakeAppErrorStateService.kt b/services/apperror/test/src/main/kotlin/io/element/android/services/apperror/test/FakeAppErrorStateService.kt new file mode 100644 index 0000000000..0783d08e02 --- /dev/null +++ b/services/apperror/test/src/main/kotlin/io/element/android/services/apperror/test/FakeAppErrorStateService.kt @@ -0,0 +1,36 @@ +/* + * Copyright 2025 New Vector Ltd. + * + * SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial + * Please see LICENSE files in the repository root for full details. + */ + +package io.element.android.services.apperror.test + +import io.element.android.services.apperror.api.AppErrorState +import io.element.android.services.apperror.api.AppErrorStateService +import io.element.android.tests.testutils.lambda.lambdaError +import kotlinx.coroutines.flow.MutableStateFlow +import kotlinx.coroutines.flow.StateFlow +import kotlinx.coroutines.flow.asStateFlow + +class FakeAppErrorStateService( + initialState: AppErrorState = AppErrorState.NoError, + private val showErrorResult: (String, String) -> Unit = { _, _ -> lambdaError() }, + private val showErrorResResult: (Int, Int) -> Unit = { _, _ -> lambdaError() } +) : AppErrorStateService { + private val mutableAppErrorStateFlow = MutableStateFlow(initialState) + override val appErrorStateFlow: StateFlow = mutableAppErrorStateFlow.asStateFlow() + + override fun showError(title: String, body: String) { + showErrorResult(title, body) + } + + override fun showError(titleRes: Int, bodyRes: Int) { + showErrorResResult(titleRes, bodyRes) + } + + fun setAppErrorState(state: AppErrorState) { + mutableAppErrorStateFlow.value = state + } +} diff --git a/tests/detekt-rules/src/main/kotlin/io/element/android/detektrules/ByPreferencesDataStoreRule.kt b/tests/detekt-rules/src/main/kotlin/io/element/android/detektrules/ByPreferencesDataStoreRule.kt new file mode 100644 index 0000000000..cb00dc18b1 --- /dev/null +++ b/tests/detekt-rules/src/main/kotlin/io/element/android/detektrules/ByPreferencesDataStoreRule.kt @@ -0,0 +1,44 @@ +/* + * Copyright 2025 New Vector Ltd. + * + * SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial + * Please see LICENSE files in the repository root for full details. + */ + +package io.element.android.detektrules + +import io.github.detekt.psi.fileName +import io.gitlab.arturbosch.detekt.api.CodeSmell +import io.gitlab.arturbosch.detekt.api.Config +import io.gitlab.arturbosch.detekt.api.Debt +import io.gitlab.arturbosch.detekt.api.Entity +import io.gitlab.arturbosch.detekt.api.Issue +import io.gitlab.arturbosch.detekt.api.Rule +import io.gitlab.arturbosch.detekt.api.Severity +import org.jetbrains.kotlin.psi.KtPropertyDelegate + +class ByPreferencesDataStoreRule(config: Config) : Rule(config) { + override val issue: Issue = Issue( + id = "ByPreferencesDataStoreNotAllowed", + severity = Severity.Style, + description = "Avoid using `by preferencesDataStore(...)`, use `PreferenceDataStoreFactory.create(name)`instead.", + debt = Debt.FIVE_MINS, + ) + + override fun visitPropertyDelegate(delegate: KtPropertyDelegate) { + super.visitPropertyDelegate(delegate) + + if (delegate.containingKtFile.fileName == "DefaultPreferencesDataStoreFactory.kt") { + // Skip the rule for the DefaultPreferencesDataStoreFactory implementation + return + } + + if (delegate.text.startsWith("by preferencesDataStore")) { + report(CodeSmell( + issue = issue, + entity = Entity.from(delegate), + message = "Use `PreferenceDataStoreFactory.create(name)` instead of `by preferencesDataStore(...)`." + )) + } + } +} diff --git a/tests/detekt-rules/src/main/kotlin/io/element/android/detektrules/ElementRuleSetProvider.kt b/tests/detekt-rules/src/main/kotlin/io/element/android/detektrules/ElementRuleSetProvider.kt index 8e0ed3ee50..9a7ba55dc6 100644 --- a/tests/detekt-rules/src/main/kotlin/io/element/android/detektrules/ElementRuleSetProvider.kt +++ b/tests/detekt-rules/src/main/kotlin/io/element/android/detektrules/ElementRuleSetProvider.kt @@ -18,6 +18,7 @@ class ElementRuleSetProvider : RuleSetProvider { id = ruleSetId, rules = listOf( RunCatchingRule(config), + ByPreferencesDataStoreRule(config), ) ) } diff --git a/tests/konsist/src/test/kotlin/io/element/android/tests/konsist/KonsistPreviewTest.kt b/tests/konsist/src/test/kotlin/io/element/android/tests/konsist/KonsistPreviewTest.kt index d34dabcb9f..d0408fb61a 100644 --- a/tests/konsist/src/test/kotlin/io/element/android/tests/konsist/KonsistPreviewTest.kt +++ b/tests/konsist/src/test/kotlin/io/element/android/tests/konsist/KonsistPreviewTest.kt @@ -12,6 +12,7 @@ import com.google.common.truth.Truth.assertThat import com.lemonappdev.konsist.api.Konsist import com.lemonappdev.konsist.api.ext.list.withAllAnnotationsOf import com.lemonappdev.konsist.api.ext.list.withName +import com.lemonappdev.konsist.api.ext.list.withNameEndingWith import com.lemonappdev.konsist.api.ext.list.withoutName import com.lemonappdev.konsist.api.verify.assertEmpty import com.lemonappdev.konsist.api.verify.assertTrue @@ -32,6 +33,26 @@ class KonsistPreviewTest { } } + @Test + fun `Check functions with 'A11yPreview'`() { + Konsist + .scopeFromProject() + .functions() + .withNameEndingWith("A11yPreview") + .assertTrue( + additionalMessage = "Functions with 'A11yPreview' suffix should have '@Preview' annotation and not '@PreviewsDayNight'," + + " should contain 'ElementPreview' composable," + + " should contain the tested view" + + " and should be internal." + ) { + val testedView = it.name.removeSuffix("A11yPreview") + it.text.contains("$testedView(") && + it.hasAllAnnotationsOf(PreviewsDayNight::class).not() && + it.text.contains("ElementPreview") && + it.hasInternalModifier + } + } + @Test fun `Functions with '@PreviewsDayNight' annotation should contain 'ElementPreview' composable`() { Konsist @@ -98,6 +119,7 @@ class KonsistPreviewTest { "SasEmojisPreview", "SecureBackupSetupViewChangePreview", "SelectedUserCannotRemovePreview", + "SpaceMembersViewNoHeroesPreview", "TextComposerAddCaptionPreview", "TextComposerCaptionPreview", "TextComposerEditCaptionPreview", @@ -122,6 +144,7 @@ class KonsistPreviewTest { "TimelineItemEventRowWithManyReactionsPreview", "TimelineItemEventRowWithRRPreview", "TimelineItemEventRowWithReplyPreview", + "TimelineItemEventRowWithThreadSummaryPreview", "TimelineItemGroupedEventsRowContentCollapsePreview", "TimelineItemGroupedEventsRowContentExpandedPreview", "TimelineItemImageViewHideMediaContentPreview", @@ -166,10 +189,15 @@ class KonsistPreviewTest { additionalMessage = "Functions for Preview should be named like this: Preview. " + "Exception can be added to the test, for multiple Previews of the same view", ) { - val testedView = it.name.removeSuffix("Preview") - it.text.contains("$testedView(") || - it.text.contains("$testedView {") || - it.text.contains("ContentToPreview(") + val testedView = if (it.name.endsWith("RtlPreview")) { + it.name.removeSuffix("RtlPreview") + } else { + it.name.removeSuffix("Preview") + } + it.name.endsWith("Preview") && + (it.text.contains("$testedView(") || + it.text.contains("$testedView {") || + it.text.contains("ContentToPreview(")) } } diff --git a/tests/uitests/src/test/kotlin/base/ComposablePreviewProvider.kt b/tests/uitests/src/test/kotlin/base/ComposablePreviewProvider.kt index c4dea95296..477e6a2da2 100644 --- a/tests/uitests/src/test/kotlin/base/ComposablePreviewProvider.kt +++ b/tests/uitests/src/test/kotlin/base/ComposablePreviewProvider.kt @@ -29,6 +29,7 @@ object ComposablePreviewProvider : TestParameter.TestParameterValuesProvider { AndroidComposablePreviewScanner() .scanPackageTrees(*PACKAGE_TREES) .getPreviews() + .filter { composablePreview -> composablePreview.methodName.endsWith("A11yPreview").not() } .withIndex() .toList() } @@ -36,6 +37,18 @@ object ComposablePreviewProvider : TestParameter.TestParameterValuesProvider { override fun provideValues(): List>> = values } +object ComposableA11yPreviewProvider : TestParameter.TestParameterValuesProvider { + private val values: List> by lazy { + AndroidComposablePreviewScanner() + .scanPackageTrees(*PACKAGE_TREES) + .getPreviews() + .filter { composablePreview -> composablePreview.methodName.endsWith("A11yPreview") } + .toList() + } + + override fun provideValues(): List> = values +} + object Shard1ComposablePreviewProvider : TestParameter.TestParameterValuesProvider { override fun provideValues(): List> = ComposablePreviewProvider.provideValues().filter { it.index % 4 == 0 }.map { it.value } diff --git a/tests/uitests/src/test/kotlin/base/ScreenshotTest.kt b/tests/uitests/src/test/kotlin/base/ScreenshotTest.kt index 02ffa418a3..114b2775f0 100644 --- a/tests/uitests/src/test/kotlin/base/ScreenshotTest.kt +++ b/tests/uitests/src/test/kotlin/base/ScreenshotTest.kt @@ -19,6 +19,7 @@ import androidx.compose.ui.platform.LocalInspectionMode import androidx.compose.ui.unit.Density import app.cash.paparazzi.DeviceConfig import app.cash.paparazzi.Paparazzi +import app.cash.paparazzi.RenderExtension import app.cash.paparazzi.TestName import com.android.resources.NightMode import io.element.android.compound.theme.ElementTheme @@ -112,7 +113,12 @@ fun createScreenshotIdFor(preview: ComposablePreview) = buil }.joinToString("_") object PaparazziPreviewRule { - fun createFor(preview: ComposablePreview, locale: String, deviceConfig: DeviceConfig = ScreenshotTest.defaultDeviceConfig): Paparazzi { + fun createFor( + preview: ComposablePreview, + locale: String, + deviceConfig: DeviceConfig = ScreenshotTest.defaultDeviceConfig, + renderExtensions: Set = setOf(), + ): Paparazzi { val densityScale = deviceConfig.density.dpiValue / 160f val customScreenHeight = preview.previewInfo.heightDp.takeIf { it >= 0 }?.let { it * densityScale }?.toInt() return Paparazzi( @@ -125,7 +131,8 @@ object PaparazziPreviewRule { softButtons = false, screenHeight = customScreenHeight ?: deviceConfig.screenHeight, ), - maxPercentDifference = 0.01 + maxPercentDifference = 0.01, + renderExtensions = renderExtensions, ) } } diff --git a/tests/uitests/src/test/kotlin/ui/PreviewA11yTest.kt b/tests/uitests/src/test/kotlin/ui/PreviewA11yTest.kt new file mode 100644 index 0000000000..d742db08b2 --- /dev/null +++ b/tests/uitests/src/test/kotlin/ui/PreviewA11yTest.kt @@ -0,0 +1,42 @@ +/* + * Copyright 2025 New Vector Ltd. + * + * SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial + * Please see LICENSE files in the repository root for full details. + */ + +package ui + +import app.cash.paparazzi.accessibility.AccessibilityRenderExtension +import base.ComposableA11yPreviewProvider +import base.PaparazziPreviewRule +import base.ScreenshotTest +import com.google.testing.junit.testparameterinjector.TestParameter +import com.google.testing.junit.testparameterinjector.TestParameterInjector +import org.junit.Rule +import org.junit.Test +import org.junit.runner.RunWith +import sergio.sastre.composable.preview.scanner.android.AndroidPreviewInfo +import sergio.sastre.composable.preview.scanner.core.preview.ComposablePreview + +/** + * Test that takes a preview and runs a screenshot test on it. + * It uses [ComposableA11yPreviewProvider] to test only previews that ends with "A11yPreview". + */ +@RunWith(TestParameterInjector::class) +class PreviewA11yTest( + @TestParameter(valuesProvider = ComposableA11yPreviewProvider::class) + val preview: ComposablePreview, +) { + @get:Rule + val paparazziRule = PaparazziPreviewRule.createFor( + preview = preview, + locale = "en", + renderExtensions = setOf(AccessibilityRenderExtension()), + ) + + @Test + fun snapshot() { + ScreenshotTest.runTest(paparazzi = paparazziRule, preview = preview, localeStr = "en") + } +} diff --git a/tests/uitests/src/test/snapshots/images/features.changeroommemberroles.impl_ChangeRolesView_Day_10_en.png b/tests/uitests/src/test/snapshots/images/features.changeroommemberroles.impl_ChangeRolesView_Day_10_en.png index 0aba9d459d..1b1dc0480b 100644 --- a/tests/uitests/src/test/snapshots/images/features.changeroommemberroles.impl_ChangeRolesView_Day_10_en.png +++ b/tests/uitests/src/test/snapshots/images/features.changeroommemberroles.impl_ChangeRolesView_Day_10_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:cd1d3333aa5af41506214d6a0cb952816cc3a8ebcf6a9d2da2c4dcc5af1ce89f -size 50409 +oid sha256:68fcdde40d2f2f1fa66186b0850b4ac70066314f9ebb6e515d4a0af528ac25cb +size 50316 diff --git a/tests/uitests/src/test/snapshots/images/features.changeroommemberroles.impl_ChangeRolesView_Day_11_en.png b/tests/uitests/src/test/snapshots/images/features.changeroommemberroles.impl_ChangeRolesView_Day_11_en.png index a3a28ba626..223d3ae94a 100644 --- a/tests/uitests/src/test/snapshots/images/features.changeroommemberroles.impl_ChangeRolesView_Day_11_en.png +++ b/tests/uitests/src/test/snapshots/images/features.changeroommemberroles.impl_ChangeRolesView_Day_11_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:ddeb1d8cd8f5588a3022c95a62c304a0097507a94e455d1f93d850e6c8f61e54 -size 53363 +oid sha256:0a0bf177f0f5fd5a939bbc51c922487614e3a8902f6d19327ee34f3654794053 +size 52657 diff --git a/tests/uitests/src/test/snapshots/images/features.changeroommemberroles.impl_ChangeRolesView_Day_12_en.png b/tests/uitests/src/test/snapshots/images/features.changeroommemberroles.impl_ChangeRolesView_Day_12_en.png index f9fc1ae805..ebe4ad0b9a 100644 --- a/tests/uitests/src/test/snapshots/images/features.changeroommemberroles.impl_ChangeRolesView_Day_12_en.png +++ b/tests/uitests/src/test/snapshots/images/features.changeroommemberroles.impl_ChangeRolesView_Day_12_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:bca3f97223622e762bb8564c966c986aedf98a2f029f46d311fd3d1bef346cc1 -size 54963 +oid sha256:997f0b0adc3e503cae7420dfbcfe7358b0597dc3f2d9325228a5f5f4feda76b1 +size 54407 diff --git a/tests/uitests/src/test/snapshots/images/features.changeroommemberroles.impl_ChangeRolesView_Day_1_en.png b/tests/uitests/src/test/snapshots/images/features.changeroommemberroles.impl_ChangeRolesView_Day_1_en.png index 3c10f8300b..79d8a34307 100644 --- a/tests/uitests/src/test/snapshots/images/features.changeroommemberroles.impl_ChangeRolesView_Day_1_en.png +++ b/tests/uitests/src/test/snapshots/images/features.changeroommemberroles.impl_ChangeRolesView_Day_1_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:6f997e20a2c9183038ef667cc54ec70e1c8e7a7a86f4effd33fb8d5c7b6354de -size 65630 +oid sha256:f3776c6e147cf70af109a8de76dc19575788f98afd55321601eaaf179f76b48c +size 67448 diff --git a/tests/uitests/src/test/snapshots/images/features.changeroommemberroles.impl_ChangeRolesView_Day_2_en.png b/tests/uitests/src/test/snapshots/images/features.changeroommemberroles.impl_ChangeRolesView_Day_2_en.png index bf0edb508e..b7e915c94b 100644 --- a/tests/uitests/src/test/snapshots/images/features.changeroommemberroles.impl_ChangeRolesView_Day_2_en.png +++ b/tests/uitests/src/test/snapshots/images/features.changeroommemberroles.impl_ChangeRolesView_Day_2_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:f9b68d8336e67ea157619a6997f1c87904ade129e68ce65c5d1139d35e0ef896 -size 60324 +oid sha256:76630125c828f4b7d34632e21ec5615a425f3eb5f17b15c963495e0247dcf820 +size 61249 diff --git a/tests/uitests/src/test/snapshots/images/features.changeroommemberroles.impl_ChangeRolesView_Day_3_en.png b/tests/uitests/src/test/snapshots/images/features.changeroommemberroles.impl_ChangeRolesView_Day_3_en.png index 5b433f4d94..54a11c5829 100644 --- a/tests/uitests/src/test/snapshots/images/features.changeroommemberroles.impl_ChangeRolesView_Day_3_en.png +++ b/tests/uitests/src/test/snapshots/images/features.changeroommemberroles.impl_ChangeRolesView_Day_3_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:f2c783b0fc7fbda178becdbc751ffd9cd05731f04824a0a004d7eddabe74d3ac -size 60277 +oid sha256:63ab147dd015d8dc1f3473749c0c1be34876610ca699e54c6f207624e14cf32c +size 61201 diff --git a/tests/uitests/src/test/snapshots/images/features.changeroommemberroles.impl_ChangeRolesView_Day_4_en.png b/tests/uitests/src/test/snapshots/images/features.changeroommemberroles.impl_ChangeRolesView_Day_4_en.png index aa82e56c96..aa65e67974 100644 --- a/tests/uitests/src/test/snapshots/images/features.changeroommemberroles.impl_ChangeRolesView_Day_4_en.png +++ b/tests/uitests/src/test/snapshots/images/features.changeroommemberroles.impl_ChangeRolesView_Day_4_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:b99e8f4003b56d3eb17e7a2b5dfc5bcb58ac8425b3be65c7494635fe3e5287ca -size 55156 +oid sha256:b62c47c4ae5f1d6a25fc5cdaa5e48c4815ae0de089f5e7b4770317281dc77258 +size 55033 diff --git a/tests/uitests/src/test/snapshots/images/features.changeroommemberroles.impl_ChangeRolesView_Day_6_en.png b/tests/uitests/src/test/snapshots/images/features.changeroommemberroles.impl_ChangeRolesView_Day_6_en.png index b43e09f614..4041cbc7ed 100644 --- a/tests/uitests/src/test/snapshots/images/features.changeroommemberroles.impl_ChangeRolesView_Day_6_en.png +++ b/tests/uitests/src/test/snapshots/images/features.changeroommemberroles.impl_ChangeRolesView_Day_6_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:944c964738fff2be6aebb9d0c33212ad4db48ebbc7c3c8475e35e9d71064337b -size 58167 +oid sha256:623941550c734147c294ec2294840d9353ac756b054b402b365060602ff614b0 +size 58961 diff --git a/tests/uitests/src/test/snapshots/images/features.changeroommemberroles.impl_ChangeRolesView_Day_7_en.png b/tests/uitests/src/test/snapshots/images/features.changeroommemberroles.impl_ChangeRolesView_Day_7_en.png index 99437da1a9..c6e3982793 100644 --- a/tests/uitests/src/test/snapshots/images/features.changeroommemberroles.impl_ChangeRolesView_Day_7_en.png +++ b/tests/uitests/src/test/snapshots/images/features.changeroommemberroles.impl_ChangeRolesView_Day_7_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:651f2c2d6b3277ee324b7cc18f0627806cdd6f780a73ad3be6a3a83f74634474 -size 60405 +oid sha256:de42de69f32f5b1657cb703028d7cce38e8d427360e92c1786d317013f17323d +size 61473 diff --git a/tests/uitests/src/test/snapshots/images/features.changeroommemberroles.impl_ChangeRolesView_Day_8_en.png b/tests/uitests/src/test/snapshots/images/features.changeroommemberroles.impl_ChangeRolesView_Day_8_en.png index ea85c13bbc..599e05ca89 100644 --- a/tests/uitests/src/test/snapshots/images/features.changeroommemberroles.impl_ChangeRolesView_Day_8_en.png +++ b/tests/uitests/src/test/snapshots/images/features.changeroommemberroles.impl_ChangeRolesView_Day_8_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:1ab201f2172c82c87cee0406d64f583bab080ef4783394a9d87a72c6232697bb -size 51884 +oid sha256:12a5a89c57cf315b9a2a753cdd43e6721d8565ff794b4fc31a9ef7b1b643ad1c +size 52704 diff --git a/tests/uitests/src/test/snapshots/images/features.changeroommemberroles.impl_ChangeRolesView_Day_9_en.png b/tests/uitests/src/test/snapshots/images/features.changeroommemberroles.impl_ChangeRolesView_Day_9_en.png index e82b5d5dde..edc3c60b54 100644 --- a/tests/uitests/src/test/snapshots/images/features.changeroommemberroles.impl_ChangeRolesView_Day_9_en.png +++ b/tests/uitests/src/test/snapshots/images/features.changeroommemberroles.impl_ChangeRolesView_Day_9_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:489006448e5ea62a219c1bd3c416560d4bf84b20706fe906a8deb6eef541d92f -size 64161 +oid sha256:9ad3480ab59df477aef94e2a1b57d247f09ae4a3beedf917ea445df0fb1dbd8d +size 65037 diff --git a/tests/uitests/src/test/snapshots/images/features.changeroommemberroles.impl_ChangeRolesView_Night_10_en.png b/tests/uitests/src/test/snapshots/images/features.changeroommemberroles.impl_ChangeRolesView_Night_10_en.png index 70f213d39e..f463ab8857 100644 --- a/tests/uitests/src/test/snapshots/images/features.changeroommemberroles.impl_ChangeRolesView_Night_10_en.png +++ b/tests/uitests/src/test/snapshots/images/features.changeroommemberroles.impl_ChangeRolesView_Night_10_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:7c929834f32069a8f21af87386f2e0b80c3ee481cfdc4c30c934338544e1482e -size 48742 +oid sha256:8ad0df06cade954de31bc7e6e5d5e14c1ed9590e70f425da6b82104839fe54eb +size 48592 diff --git a/tests/uitests/src/test/snapshots/images/features.changeroommemberroles.impl_ChangeRolesView_Night_11_en.png b/tests/uitests/src/test/snapshots/images/features.changeroommemberroles.impl_ChangeRolesView_Night_11_en.png index d885ae1bb6..4ef1339489 100644 --- a/tests/uitests/src/test/snapshots/images/features.changeroommemberroles.impl_ChangeRolesView_Night_11_en.png +++ b/tests/uitests/src/test/snapshots/images/features.changeroommemberroles.impl_ChangeRolesView_Night_11_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:90b1ab05a90e105c083a066d8ada1cd73ddc8b9c8b28872c2710eee5f890bdb8 -size 54022 +oid sha256:800600290cbb91a528273e2c88f6d73bc5c71b9d395315aa280277861b74c035 +size 53461 diff --git a/tests/uitests/src/test/snapshots/images/features.changeroommemberroles.impl_ChangeRolesView_Night_12_en.png b/tests/uitests/src/test/snapshots/images/features.changeroommemberroles.impl_ChangeRolesView_Night_12_en.png index 8c09bf1296..9f022eed6a 100644 --- a/tests/uitests/src/test/snapshots/images/features.changeroommemberroles.impl_ChangeRolesView_Night_12_en.png +++ b/tests/uitests/src/test/snapshots/images/features.changeroommemberroles.impl_ChangeRolesView_Night_12_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:d56ca66db0d8c0db7b295cf766e7c3bff4c2228951a46835f532b6b7e5f304a9 -size 55544 +oid sha256:ae2f05609d543bb6bb99df4f371d81b5d7c5040c66003afb30e6217395c51d0b +size 55040 diff --git a/tests/uitests/src/test/snapshots/images/features.changeroommemberroles.impl_ChangeRolesView_Night_1_en.png b/tests/uitests/src/test/snapshots/images/features.changeroommemberroles.impl_ChangeRolesView_Night_1_en.png index 7afc507e73..166bc7e714 100644 --- a/tests/uitests/src/test/snapshots/images/features.changeroommemberroles.impl_ChangeRolesView_Night_1_en.png +++ b/tests/uitests/src/test/snapshots/images/features.changeroommemberroles.impl_ChangeRolesView_Night_1_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:0f472e63a0df3c28613bb48c364e912ef0b434c92418d4121f6b36e421fbc55e -size 66087 +oid sha256:be065a6d9b0b6f24ae9f773b70f7c36d96939978ddaeee5da889e3d00388cc0e +size 68006 diff --git a/tests/uitests/src/test/snapshots/images/features.changeroommemberroles.impl_ChangeRolesView_Night_2_en.png b/tests/uitests/src/test/snapshots/images/features.changeroommemberroles.impl_ChangeRolesView_Night_2_en.png index 3a6090fba9..f5b8ab7002 100644 --- a/tests/uitests/src/test/snapshots/images/features.changeroommemberroles.impl_ChangeRolesView_Night_2_en.png +++ b/tests/uitests/src/test/snapshots/images/features.changeroommemberroles.impl_ChangeRolesView_Night_2_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:22c3785d8968dd8c69b03e676c783d705f149510a251a691cb2c8b8504e26f45 -size 61160 +oid sha256:82438000e7b5369d1cb45ca3f1b67599c77bcfac54fe50335509c144c7df33b4 +size 61968 diff --git a/tests/uitests/src/test/snapshots/images/features.changeroommemberroles.impl_ChangeRolesView_Night_3_en.png b/tests/uitests/src/test/snapshots/images/features.changeroommemberroles.impl_ChangeRolesView_Night_3_en.png index 71f6e3a2fa..ed9e1167f0 100644 --- a/tests/uitests/src/test/snapshots/images/features.changeroommemberroles.impl_ChangeRolesView_Night_3_en.png +++ b/tests/uitests/src/test/snapshots/images/features.changeroommemberroles.impl_ChangeRolesView_Night_3_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:a048ec5adbc1f5b2ac2a5cfc80e9d895ffdade4fa5057a5c3a0a890e50176411 -size 61077 +oid sha256:99628f108a0c165316d77b1189a70ebb8b4754ae3f96960b616d1305879324fd +size 61907 diff --git a/tests/uitests/src/test/snapshots/images/features.changeroommemberroles.impl_ChangeRolesView_Night_4_en.png b/tests/uitests/src/test/snapshots/images/features.changeroommemberroles.impl_ChangeRolesView_Night_4_en.png index 1149ec4a97..1a2eb9ea44 100644 --- a/tests/uitests/src/test/snapshots/images/features.changeroommemberroles.impl_ChangeRolesView_Night_4_en.png +++ b/tests/uitests/src/test/snapshots/images/features.changeroommemberroles.impl_ChangeRolesView_Night_4_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:4fa241f62c49fb6b26a3fed898d9904ef89f8bb2be83f3df75083cd8d4f2a6a9 -size 55679 +oid sha256:63639bf715af2a18f888a9fe54ea18403a13babdbd45fd86242253333cf1c5e8 +size 55372 diff --git a/tests/uitests/src/test/snapshots/images/features.changeroommemberroles.impl_ChangeRolesView_Night_6_en.png b/tests/uitests/src/test/snapshots/images/features.changeroommemberroles.impl_ChangeRolesView_Night_6_en.png index 6ec0e6438e..55506783c0 100644 --- a/tests/uitests/src/test/snapshots/images/features.changeroommemberroles.impl_ChangeRolesView_Night_6_en.png +++ b/tests/uitests/src/test/snapshots/images/features.changeroommemberroles.impl_ChangeRolesView_Night_6_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:831d92f14e40f12214d629da752edba0a776da5536bfac9a956bd94d7c2e93ee -size 56194 +oid sha256:17ca777cfd4e056078519282f928799dcb2e9aac1ab2757b7cb4cbb1fe93c573 +size 56855 diff --git a/tests/uitests/src/test/snapshots/images/features.changeroommemberroles.impl_ChangeRolesView_Night_7_en.png b/tests/uitests/src/test/snapshots/images/features.changeroommemberroles.impl_ChangeRolesView_Night_7_en.png index dabdc4e73d..42f0ff8d98 100644 --- a/tests/uitests/src/test/snapshots/images/features.changeroommemberroles.impl_ChangeRolesView_Night_7_en.png +++ b/tests/uitests/src/test/snapshots/images/features.changeroommemberroles.impl_ChangeRolesView_Night_7_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:6896524fa538385a57fbf209ca5af041bf9dfb87778994453dbb931530c15771 -size 58451 +oid sha256:76cb14f12f0d8304d3f3125026d79ac8b2012d00067578bee261dcba864e627e +size 59439 diff --git a/tests/uitests/src/test/snapshots/images/features.changeroommemberroles.impl_ChangeRolesView_Night_8_en.png b/tests/uitests/src/test/snapshots/images/features.changeroommemberroles.impl_ChangeRolesView_Night_8_en.png index be796119bd..ca3f9b212b 100644 --- a/tests/uitests/src/test/snapshots/images/features.changeroommemberroles.impl_ChangeRolesView_Night_8_en.png +++ b/tests/uitests/src/test/snapshots/images/features.changeroommemberroles.impl_ChangeRolesView_Night_8_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:2060bff28d43d739f6ba5b17205a00d64b8b0f63afc6241fecd5a4541a9564be -size 51062 +oid sha256:52f1de6e6bc921fd5b1862eb4804bd9a84474aa6e02bd34e2dfd8492a8f85fe7 +size 51790 diff --git a/tests/uitests/src/test/snapshots/images/features.changeroommemberroles.impl_ChangeRolesView_Night_9_en.png b/tests/uitests/src/test/snapshots/images/features.changeroommemberroles.impl_ChangeRolesView_Night_9_en.png index 64c8ad70f7..e5783a2ca3 100644 --- a/tests/uitests/src/test/snapshots/images/features.changeroommemberroles.impl_ChangeRolesView_Night_9_en.png +++ b/tests/uitests/src/test/snapshots/images/features.changeroommemberroles.impl_ChangeRolesView_Night_9_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:baee296829dfb127c8db2142041d905b342aab13d93408548b7fc9329dd8de26 -size 63894 +oid sha256:2973248a09cc824af7545f1209720e235e5dcdbde3b4f863d50c96c67e19dd7f +size 64709 diff --git a/tests/uitests/src/test/snapshots/images/features.createroom.impl.addpeople_AddPeopleView_Day_0_en.png b/tests/uitests/src/test/snapshots/images/features.createroom.impl.addpeople_AddPeopleView_Day_0_en.png index 1360f07fe2..338eb8d3f6 100644 --- a/tests/uitests/src/test/snapshots/images/features.createroom.impl.addpeople_AddPeopleView_Day_0_en.png +++ b/tests/uitests/src/test/snapshots/images/features.createroom.impl.addpeople_AddPeopleView_Day_0_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:e7f6f2d2302e958ec4c85a5856839f5ed430ff9bf1048a8427b8b589cbc3f8ce -size 13665 +oid sha256:7415b3286707130c0218a8d1e82a9d9c61c8eec8df346653dd67626d0dd7709c +size 10038 diff --git a/tests/uitests/src/test/snapshots/images/features.createroom.impl.addpeople_AddPeopleView_Day_1_en.png b/tests/uitests/src/test/snapshots/images/features.createroom.impl.addpeople_AddPeopleView_Day_1_en.png index f5ba7efcf3..a17b156fbf 100644 --- a/tests/uitests/src/test/snapshots/images/features.createroom.impl.addpeople_AddPeopleView_Day_1_en.png +++ b/tests/uitests/src/test/snapshots/images/features.createroom.impl.addpeople_AddPeopleView_Day_1_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:f315821d7f65b36f1237ffc4a7fc4e8d6ca1f00cc5452322495f057a9244dd20 -size 24704 +oid sha256:efe665c1419f9674e74b04dd066adf042cd421fd3e18a8cbc1f2ed80a0977e07 +size 10340 diff --git a/tests/uitests/src/test/snapshots/images/features.createroom.impl.addpeople_AddPeopleView_Day_2_en.png b/tests/uitests/src/test/snapshots/images/features.createroom.impl.addpeople_AddPeopleView_Day_2_en.png index 873b524941..338eb8d3f6 100644 --- a/tests/uitests/src/test/snapshots/images/features.createroom.impl.addpeople_AddPeopleView_Day_2_en.png +++ b/tests/uitests/src/test/snapshots/images/features.createroom.impl.addpeople_AddPeopleView_Day_2_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:9a04777e27af3dc8068f97e64c6312af53f416353b8b886f89368e83458d48b0 -size 77516 +oid sha256:7415b3286707130c0218a8d1e82a9d9c61c8eec8df346653dd67626d0dd7709c +size 10038 diff --git a/tests/uitests/src/test/snapshots/images/features.createroom.impl.addpeople_AddPeopleView_Day_3_en.png b/tests/uitests/src/test/snapshots/images/features.createroom.impl.addpeople_AddPeopleView_Day_3_en.png deleted file mode 100644 index 0c7800bb11..0000000000 --- a/tests/uitests/src/test/snapshots/images/features.createroom.impl.addpeople_AddPeopleView_Day_3_en.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:72216dbc7378b0745abc76a364258254cd7b7af56e47083799fb85e9f9d181f7 -size 41977 diff --git a/tests/uitests/src/test/snapshots/images/features.createroom.impl.addpeople_AddPeopleView_Night_0_en.png b/tests/uitests/src/test/snapshots/images/features.createroom.impl.addpeople_AddPeopleView_Night_0_en.png index 8207f06398..5bd1590652 100644 --- a/tests/uitests/src/test/snapshots/images/features.createroom.impl.addpeople_AddPeopleView_Night_0_en.png +++ b/tests/uitests/src/test/snapshots/images/features.createroom.impl.addpeople_AddPeopleView_Night_0_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:7b235755e1122103b52cb68a2ddef230ecfe3d61cac802d1fd633cf3bc37dbb0 -size 12880 +oid sha256:39c67413ca997982b0fcd32831ccedee1d7a0763619784b8758b194df6c7ff81 +size 9639 diff --git a/tests/uitests/src/test/snapshots/images/features.createroom.impl.addpeople_AddPeopleView_Night_1_en.png b/tests/uitests/src/test/snapshots/images/features.createroom.impl.addpeople_AddPeopleView_Night_1_en.png index 479aaeb6c6..5cfffac707 100644 --- a/tests/uitests/src/test/snapshots/images/features.createroom.impl.addpeople_AddPeopleView_Night_1_en.png +++ b/tests/uitests/src/test/snapshots/images/features.createroom.impl.addpeople_AddPeopleView_Night_1_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:b46150ff515da137e4b2a57c7f0739b700c984f08c5ac01b9804638e53b661d7 -size 24865 +oid sha256:d8b6fae4f9fa5be0bbad9855ce80b53206748970d1ea1f9473eaa476afa39bcc +size 9936 diff --git a/tests/uitests/src/test/snapshots/images/features.createroom.impl.addpeople_AddPeopleView_Night_2_en.png b/tests/uitests/src/test/snapshots/images/features.createroom.impl.addpeople_AddPeopleView_Night_2_en.png index f9fc27e0c0..5bd1590652 100644 --- a/tests/uitests/src/test/snapshots/images/features.createroom.impl.addpeople_AddPeopleView_Night_2_en.png +++ b/tests/uitests/src/test/snapshots/images/features.createroom.impl.addpeople_AddPeopleView_Night_2_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:04c62992c4744efc672861adbd0635a25616f060b66824ac0ad9c9ca89922462 -size 77954 +oid sha256:39c67413ca997982b0fcd32831ccedee1d7a0763619784b8758b194df6c7ff81 +size 9639 diff --git a/tests/uitests/src/test/snapshots/images/features.createroom.impl.addpeople_AddPeopleView_Night_3_en.png b/tests/uitests/src/test/snapshots/images/features.createroom.impl.addpeople_AddPeopleView_Night_3_en.png deleted file mode 100644 index 52779bf8fd..0000000000 --- a/tests/uitests/src/test/snapshots/images/features.createroom.impl.addpeople_AddPeopleView_Night_3_en.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:be7cfa925e024d94d72b17408fe3487007b6daee2c4dc728960f56af1351f644 -size 42100 diff --git a/tests/uitests/src/test/snapshots/images/features.createroom.impl.components_SearchMultipleUsersResultItem_en.png b/tests/uitests/src/test/snapshots/images/features.createroom.impl.components_SearchMultipleUsersResultItem_en.png deleted file mode 100644 index 0f96333206..0000000000 --- a/tests/uitests/src/test/snapshots/images/features.createroom.impl.components_SearchMultipleUsersResultItem_en.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:bb24343c24a1e8a8ef57a15ecead6be27b3ab78c4e0a71301bf9c4d7a5219e78 -size 82320 diff --git a/tests/uitests/src/test/snapshots/images/features.createroom.impl.components_UserListView_Day_1_en.png b/tests/uitests/src/test/snapshots/images/features.createroom.impl.components_UserListView_Day_1_en.png deleted file mode 100644 index 4886790c1c..0000000000 --- a/tests/uitests/src/test/snapshots/images/features.createroom.impl.components_UserListView_Day_1_en.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:de7dc937f73412f7144a396dc2453434a102615c62740188d9d3597c252d27f6 -size 20615 diff --git a/tests/uitests/src/test/snapshots/images/features.createroom.impl.components_UserListView_Day_6_en.png b/tests/uitests/src/test/snapshots/images/features.createroom.impl.components_UserListView_Day_6_en.png deleted file mode 100644 index a520fde607..0000000000 --- a/tests/uitests/src/test/snapshots/images/features.createroom.impl.components_UserListView_Day_6_en.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:d6bf660eaead16964fa91a2968e99b58304939b4e5c2a7301c4b2b70ce39eb6b -size 52095 diff --git a/tests/uitests/src/test/snapshots/images/features.createroom.impl.components_UserListView_Day_9_en.png b/tests/uitests/src/test/snapshots/images/features.createroom.impl.components_UserListView_Day_9_en.png deleted file mode 100644 index 601eb8542a..0000000000 --- a/tests/uitests/src/test/snapshots/images/features.createroom.impl.components_UserListView_Day_9_en.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:5ec147e3c6c93e637cbccf59ddfc5e4bafb754f2d49049a53cde0daacf88aa04 -size 38046 diff --git a/tests/uitests/src/test/snapshots/images/features.createroom.impl.components_UserListView_Night_1_en.png b/tests/uitests/src/test/snapshots/images/features.createroom.impl.components_UserListView_Night_1_en.png deleted file mode 100644 index 1f2e04fb2a..0000000000 --- a/tests/uitests/src/test/snapshots/images/features.createroom.impl.components_UserListView_Night_1_en.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:f94b632536ba458de480dbeb170b053774fa468a9afa996194af63f3d229a016 -size 20926 diff --git a/tests/uitests/src/test/snapshots/images/features.createroom.impl.components_UserListView_Night_6_en.png b/tests/uitests/src/test/snapshots/images/features.createroom.impl.components_UserListView_Night_6_en.png deleted file mode 100644 index c536ec374b..0000000000 --- a/tests/uitests/src/test/snapshots/images/features.createroom.impl.components_UserListView_Night_6_en.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:6221215e63ca968ea430c69ce7edd4c67f82daba86e07b56fffe89c9f7cf08ef -size 53177 diff --git a/tests/uitests/src/test/snapshots/images/features.createroom.impl.components_UserListView_Night_9_en.png b/tests/uitests/src/test/snapshots/images/features.createroom.impl.components_UserListView_Night_9_en.png deleted file mode 100644 index f37b21915e..0000000000 --- a/tests/uitests/src/test/snapshots/images/features.createroom.impl.components_UserListView_Night_9_en.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:aae661dfd462f19efa127a8c7242ff05e6bd9619f4827e494e9cc9557650f562 -size 37893 diff --git a/tests/uitests/src/test/snapshots/images/features.createroom.impl.configureroom_ConfigureRoomViewDark_1_en.png b/tests/uitests/src/test/snapshots/images/features.createroom.impl.configureroom_ConfigureRoomViewDark_1_en.png index 6ba325fefe..933f4d0185 100644 --- a/tests/uitests/src/test/snapshots/images/features.createroom.impl.configureroom_ConfigureRoomViewDark_1_en.png +++ b/tests/uitests/src/test/snapshots/images/features.createroom.impl.configureroom_ConfigureRoomViewDark_1_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:0c797770fae796712a4db1d9d4084ebef2211548a33c49178d015658ebc502a6 -size 42823 +oid sha256:e7a0b233fa704f80e06b4e5ed3b787722545e30b0adf3729b1618785169c8511 +size 35832 diff --git a/tests/uitests/src/test/snapshots/images/features.createroom.impl.configureroom_ConfigureRoomViewDark_2_en.png b/tests/uitests/src/test/snapshots/images/features.createroom.impl.configureroom_ConfigureRoomViewDark_2_en.png index 7e0c631982..867eb9e084 100644 --- a/tests/uitests/src/test/snapshots/images/features.createroom.impl.configureroom_ConfigureRoomViewDark_2_en.png +++ b/tests/uitests/src/test/snapshots/images/features.createroom.impl.configureroom_ConfigureRoomViewDark_2_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:45b66b5de32c34fde5ab5997e4ee7bc7fce64c9846220a6cb98acb462b3f79d8 -size 59051 +oid sha256:dc153a3db10441cb166f2cf1d767f59bd77f4b45ff3f6a2dce02324f265626b1 +size 56368 diff --git a/tests/uitests/src/test/snapshots/images/features.createroom.impl.configureroom_ConfigureRoomViewLight_1_en.png b/tests/uitests/src/test/snapshots/images/features.createroom.impl.configureroom_ConfigureRoomViewLight_1_en.png index c2c2dd1d1d..0d444e8f35 100644 --- a/tests/uitests/src/test/snapshots/images/features.createroom.impl.configureroom_ConfigureRoomViewLight_1_en.png +++ b/tests/uitests/src/test/snapshots/images/features.createroom.impl.configureroom_ConfigureRoomViewLight_1_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:8b846ef4e88898937c13d1a8e4a25d0ac1a5673e2906cca4369453fbd45b8dfa -size 43458 +oid sha256:686dd48e4b76b6f5bc06c8b2751b981a5a53dfba9821a138d2c64a9a9aacdd3c +size 36979 diff --git a/tests/uitests/src/test/snapshots/images/features.createroom.impl.configureroom_ConfigureRoomViewLight_2_en.png b/tests/uitests/src/test/snapshots/images/features.createroom.impl.configureroom_ConfigureRoomViewLight_2_en.png index 372d0db1bf..661406ac93 100644 --- a/tests/uitests/src/test/snapshots/images/features.createroom.impl.configureroom_ConfigureRoomViewLight_2_en.png +++ b/tests/uitests/src/test/snapshots/images/features.createroom.impl.configureroom_ConfigureRoomViewLight_2_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:fcd04f11078a2b5727a65b758b8425dddc49b28a11ef0cb61f35ad7f11ab90c9 -size 60231 +oid sha256:6c24eec8e26ba06ddb216e3d5335a139f947d9ff576dc8737af0bb713e0d68a1 +size 58216 diff --git a/tests/uitests/src/test/snapshots/images/features.home.impl_HomeViewA11y_en.png b/tests/uitests/src/test/snapshots/images/features.home.impl_HomeViewA11y_en.png new file mode 100644 index 0000000000..f34d4bae74 --- /dev/null +++ b/tests/uitests/src/test/snapshots/images/features.home.impl_HomeViewA11y_en.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:21c09cac237b2b4823dbb945161c6d6d574dc2c8ffb37088696d09736d8e782a +size 124636 diff --git a/tests/uitests/src/test/snapshots/images/features.invitepeople.impl_InvitePeopleView_Day_0_en.png b/tests/uitests/src/test/snapshots/images/features.invitepeople.impl_InvitePeopleView_Day_0_en.png new file mode 100644 index 0000000000..31d8d6d6ee --- /dev/null +++ b/tests/uitests/src/test/snapshots/images/features.invitepeople.impl_InvitePeopleView_Day_0_en.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:aae19b03efb483fd312e5cf4b02e000af86941ce5c8e3472fe2410bc67178519 +size 9122 diff --git a/tests/uitests/src/test/snapshots/images/features.invitepeople.impl_InvitePeopleView_Day_1_en.png b/tests/uitests/src/test/snapshots/images/features.invitepeople.impl_InvitePeopleView_Day_1_en.png new file mode 100644 index 0000000000..1e3446160f --- /dev/null +++ b/tests/uitests/src/test/snapshots/images/features.invitepeople.impl_InvitePeopleView_Day_1_en.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:94341fe8aa52b4551ef8a73cf298aaa1c4352ae0d4c83990c04c4c6e491b64e8 +size 21444 diff --git a/tests/uitests/src/test/snapshots/images/features.invitepeople.impl_InvitePeopleView_Day_2_en.png b/tests/uitests/src/test/snapshots/images/features.invitepeople.impl_InvitePeopleView_Day_2_en.png new file mode 100644 index 0000000000..bff2174041 --- /dev/null +++ b/tests/uitests/src/test/snapshots/images/features.invitepeople.impl_InvitePeopleView_Day_2_en.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:8a40987c3fb50529128eee026fa9b21495bacac58bdf20a01a39fb24ea462f4c +size 6676 diff --git a/tests/uitests/src/test/snapshots/images/features.invitepeople.impl_InvitePeopleView_Day_3_en.png b/tests/uitests/src/test/snapshots/images/features.invitepeople.impl_InvitePeopleView_Day_3_en.png new file mode 100644 index 0000000000..ab2eb0ce3e --- /dev/null +++ b/tests/uitests/src/test/snapshots/images/features.invitepeople.impl_InvitePeopleView_Day_3_en.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:7c4f3ad870d9d86b96a3cadcf574a48469e72a2270c66eaf5040f7bce2c9fda7 +size 18936 diff --git a/tests/uitests/src/test/snapshots/images/features.invitepeople.impl_InvitePeopleView_Day_4_en.png b/tests/uitests/src/test/snapshots/images/features.invitepeople.impl_InvitePeopleView_Day_4_en.png new file mode 100644 index 0000000000..09335740e8 --- /dev/null +++ b/tests/uitests/src/test/snapshots/images/features.invitepeople.impl_InvitePeopleView_Day_4_en.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:1ee1be1b069192b7e155139af4e3dba97fc21373d3e49d31be41f6263b733800 +size 8626 diff --git a/tests/uitests/src/test/snapshots/images/features.invitepeople.impl_InvitePeopleView_Day_5_en.png b/tests/uitests/src/test/snapshots/images/features.invitepeople.impl_InvitePeopleView_Day_5_en.png new file mode 100644 index 0000000000..7291dce252 --- /dev/null +++ b/tests/uitests/src/test/snapshots/images/features.invitepeople.impl_InvitePeopleView_Day_5_en.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:8e26d6a17523b87c2cb8b2078e0f4a1cfd8b1aa19fff022f97dff76dda9faab7 +size 38279 diff --git a/tests/uitests/src/test/snapshots/images/features.invitepeople.impl_InvitePeopleView_Day_6_en.png b/tests/uitests/src/test/snapshots/images/features.invitepeople.impl_InvitePeopleView_Day_6_en.png new file mode 100644 index 0000000000..47f0826f5c --- /dev/null +++ b/tests/uitests/src/test/snapshots/images/features.invitepeople.impl_InvitePeopleView_Day_6_en.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:61e5b4a31c2ab2620324655c5968799bd758d7256eb89f544b9800d7a81bb91c +size 32521 diff --git a/tests/uitests/src/test/snapshots/images/features.invitepeople.impl_InvitePeopleView_Day_7_en.png b/tests/uitests/src/test/snapshots/images/features.invitepeople.impl_InvitePeopleView_Day_7_en.png new file mode 100644 index 0000000000..9d3f70ba37 --- /dev/null +++ b/tests/uitests/src/test/snapshots/images/features.invitepeople.impl_InvitePeopleView_Day_7_en.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:1cf9c53daca4b53a2615a4980c2d606292f3fa1aca30bcdd13827d89898aa3b6 +size 25449 diff --git a/tests/uitests/src/test/snapshots/images/features.invitepeople.impl_InvitePeopleView_Day_8_en.png b/tests/uitests/src/test/snapshots/images/features.invitepeople.impl_InvitePeopleView_Day_8_en.png new file mode 100644 index 0000000000..7e1dc6ec2d --- /dev/null +++ b/tests/uitests/src/test/snapshots/images/features.invitepeople.impl_InvitePeopleView_Day_8_en.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:805f7e08c25821528d2748ffa2b4edeaf21d0ee2a1d833693e36e51fafe0f92b +size 6607 diff --git a/tests/uitests/src/test/snapshots/images/features.invitepeople.impl_InvitePeopleView_Night_0_en.png b/tests/uitests/src/test/snapshots/images/features.invitepeople.impl_InvitePeopleView_Night_0_en.png new file mode 100644 index 0000000000..d42ab638fa --- /dev/null +++ b/tests/uitests/src/test/snapshots/images/features.invitepeople.impl_InvitePeopleView_Night_0_en.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:31143646f33a013c30bc4e1cfd6e66beb8af100521dfd9dc599a94be8e6f415c +size 8535 diff --git a/tests/uitests/src/test/snapshots/images/features.invitepeople.impl_InvitePeopleView_Night_1_en.png b/tests/uitests/src/test/snapshots/images/features.invitepeople.impl_InvitePeopleView_Night_1_en.png new file mode 100644 index 0000000000..2de946c312 --- /dev/null +++ b/tests/uitests/src/test/snapshots/images/features.invitepeople.impl_InvitePeopleView_Night_1_en.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:00a961c76598dc98a0d9c7a45781865984c51bb440bb1605c381e9496ca1789f +size 21971 diff --git a/tests/uitests/src/test/snapshots/images/features.invitepeople.impl_InvitePeopleView_Night_2_en.png b/tests/uitests/src/test/snapshots/images/features.invitepeople.impl_InvitePeopleView_Night_2_en.png new file mode 100644 index 0000000000..d4004dd81d --- /dev/null +++ b/tests/uitests/src/test/snapshots/images/features.invitepeople.impl_InvitePeopleView_Night_2_en.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:5d2fae553f7775986fe0c50adcbb581eabe7ebf2f82d39e1fef3d6ecc4e3c288 +size 6511 diff --git a/tests/uitests/src/test/snapshots/images/features.invitepeople.impl_InvitePeopleView_Night_3_en.png b/tests/uitests/src/test/snapshots/images/features.invitepeople.impl_InvitePeopleView_Night_3_en.png new file mode 100644 index 0000000000..fb722baf78 --- /dev/null +++ b/tests/uitests/src/test/snapshots/images/features.invitepeople.impl_InvitePeopleView_Night_3_en.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:cbdebc079f54dbac4ce540a87f3ffdd37c4631b4704fb0783313735515e6e820 +size 19853 diff --git a/tests/uitests/src/test/snapshots/images/features.invitepeople.impl_InvitePeopleView_Night_4_en.png b/tests/uitests/src/test/snapshots/images/features.invitepeople.impl_InvitePeopleView_Night_4_en.png new file mode 100644 index 0000000000..0553656788 --- /dev/null +++ b/tests/uitests/src/test/snapshots/images/features.invitepeople.impl_InvitePeopleView_Night_4_en.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:fe4889333bc96358fb3121bdeb54d3d4d75eba234d318462da3985ee75cf8ed2 +size 8420 diff --git a/tests/uitests/src/test/snapshots/images/features.invitepeople.impl_InvitePeopleView_Night_5_en.png b/tests/uitests/src/test/snapshots/images/features.invitepeople.impl_InvitePeopleView_Night_5_en.png new file mode 100644 index 0000000000..54fe5b9b5a --- /dev/null +++ b/tests/uitests/src/test/snapshots/images/features.invitepeople.impl_InvitePeopleView_Night_5_en.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:f6fc23abdd913a0538776d0d0e96ce02ba119302c939ae3517f3eb5bb74b1de5 +size 38995 diff --git a/tests/uitests/src/test/snapshots/images/features.invitepeople.impl_InvitePeopleView_Night_6_en.png b/tests/uitests/src/test/snapshots/images/features.invitepeople.impl_InvitePeopleView_Night_6_en.png new file mode 100644 index 0000000000..4db335c11a --- /dev/null +++ b/tests/uitests/src/test/snapshots/images/features.invitepeople.impl_InvitePeopleView_Night_6_en.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:9591e809b411cc5192d35e08d79c6bc0e98bab6b01193207e5af94e778503eed +size 32679 diff --git a/tests/uitests/src/test/snapshots/images/features.invitepeople.impl_InvitePeopleView_Night_7_en.png b/tests/uitests/src/test/snapshots/images/features.invitepeople.impl_InvitePeopleView_Night_7_en.png new file mode 100644 index 0000000000..3c0bd76117 --- /dev/null +++ b/tests/uitests/src/test/snapshots/images/features.invitepeople.impl_InvitePeopleView_Night_7_en.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:ce62e536fd2413c1f15b00aeb9389591035196c74e45d27efab61a5d7add9b66 +size 25047 diff --git a/tests/uitests/src/test/snapshots/images/features.invitepeople.impl_InvitePeopleView_Night_8_en.png b/tests/uitests/src/test/snapshots/images/features.invitepeople.impl_InvitePeopleView_Night_8_en.png new file mode 100644 index 0000000000..03b52521f9 --- /dev/null +++ b/tests/uitests/src/test/snapshots/images/features.invitepeople.impl_InvitePeopleView_Night_8_en.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:65fde13bab6f3561319892c242c361fbd15874251670f5db3155ef75c3ba4cdb +size 6529 diff --git a/tests/uitests/src/test/snapshots/images/features.login.impl.screens.onboarding_OnBoardingView_Day_6_en.png b/tests/uitests/src/test/snapshots/images/features.login.impl.screens.onboarding_OnBoardingView_Day_6_en.png new file mode 100644 index 0000000000..7a0469e0a4 --- /dev/null +++ b/tests/uitests/src/test/snapshots/images/features.login.impl.screens.onboarding_OnBoardingView_Day_6_en.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:06af9be7c045759dbe9379b02996f3cbab7d7e52315080c1d61347a88a6b1957 +size 281422 diff --git a/tests/uitests/src/test/snapshots/images/features.login.impl.screens.onboarding_OnBoardingView_Night_6_en.png b/tests/uitests/src/test/snapshots/images/features.login.impl.screens.onboarding_OnBoardingView_Night_6_en.png new file mode 100644 index 0000000000..8423d6b535 --- /dev/null +++ b/tests/uitests/src/test/snapshots/images/features.login.impl.screens.onboarding_OnBoardingView_Night_6_en.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:5aa2a7263ae623143dfb687d9b92b3ff44d2388ee613c523f9533ae596902064 +size 280537 diff --git a/tests/uitests/src/test/snapshots/images/features.messages.impl.attachments.preview_AttachmentsView_0_en.png b/tests/uitests/src/test/snapshots/images/features.messages.impl.attachments.preview_AttachmentsView_0_en.png index 8cb4e5d4f9..fee039658b 100644 --- a/tests/uitests/src/test/snapshots/images/features.messages.impl.attachments.preview_AttachmentsView_0_en.png +++ b/tests/uitests/src/test/snapshots/images/features.messages.impl.attachments.preview_AttachmentsView_0_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:400426592b0020e5de30899574ce0abb70cebccbcff10c43728ee6dae4a421f3 -size 400259 +oid sha256:ab08d702a9426d5d577939130c8dc21c23574998754ff1afaa2fec8622fd35b5 +size 400216 diff --git a/tests/uitests/src/test/snapshots/images/features.messages.impl.attachments.preview_AttachmentsView_1_en.png b/tests/uitests/src/test/snapshots/images/features.messages.impl.attachments.preview_AttachmentsView_1_en.png index ca848e247e..c86b8ea729 100644 --- a/tests/uitests/src/test/snapshots/images/features.messages.impl.attachments.preview_AttachmentsView_1_en.png +++ b/tests/uitests/src/test/snapshots/images/features.messages.impl.attachments.preview_AttachmentsView_1_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:f092a9b9a3cb8fd1c958015194341e118deafd2589bd34c673747f7383a9ca87 -size 399962 +oid sha256:042e8567096a4ed1809286c48a6dcfeabf403098355ee5d56b8a2b5d9f71b4af +size 399918 diff --git a/tests/uitests/src/test/snapshots/images/features.messages.impl.attachments.preview_AttachmentsView_2_en.png b/tests/uitests/src/test/snapshots/images/features.messages.impl.attachments.preview_AttachmentsView_2_en.png index 60baf18322..b9fc892a6c 100644 --- a/tests/uitests/src/test/snapshots/images/features.messages.impl.attachments.preview_AttachmentsView_2_en.png +++ b/tests/uitests/src/test/snapshots/images/features.messages.impl.attachments.preview_AttachmentsView_2_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:3826735619bc623340cee79d6b232ff135f73830b6b8c7fd4f7ace1a28ef7c3f -size 59456 +oid sha256:6e9ee69210098536033f3b3ac80a5f2ff6e9b9f83e5b030eaec572bfc924431e +size 59465 diff --git a/tests/uitests/src/test/snapshots/images/features.messages.impl.attachments.preview_AttachmentsView_3_en.png b/tests/uitests/src/test/snapshots/images/features.messages.impl.attachments.preview_AttachmentsView_3_en.png index 8cb4e5d4f9..fee039658b 100644 --- a/tests/uitests/src/test/snapshots/images/features.messages.impl.attachments.preview_AttachmentsView_3_en.png +++ b/tests/uitests/src/test/snapshots/images/features.messages.impl.attachments.preview_AttachmentsView_3_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:400426592b0020e5de30899574ce0abb70cebccbcff10c43728ee6dae4a421f3 -size 400259 +oid sha256:ab08d702a9426d5d577939130c8dc21c23574998754ff1afaa2fec8622fd35b5 +size 400216 diff --git a/tests/uitests/src/test/snapshots/images/features.messages.impl.attachments.preview_AttachmentsView_4_en.png b/tests/uitests/src/test/snapshots/images/features.messages.impl.attachments.preview_AttachmentsView_4_en.png index b0e9461b90..3dbe80b1b5 100644 --- a/tests/uitests/src/test/snapshots/images/features.messages.impl.attachments.preview_AttachmentsView_4_en.png +++ b/tests/uitests/src/test/snapshots/images/features.messages.impl.attachments.preview_AttachmentsView_4_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:ac06a5df48b10957c6315eda76c8443f76f9d484a8cc1f9d2490d52f4badbe53 -size 59324 +oid sha256:8088d0a6abe61b16595574f4cf6b18af122a1e7caba61c560b7bd22af0c1fcad +size 59371 diff --git a/tests/uitests/src/test/snapshots/images/features.messages.impl.attachments.preview_AttachmentsView_5_en.png b/tests/uitests/src/test/snapshots/images/features.messages.impl.attachments.preview_AttachmentsView_5_en.png index a3552c400b..07c778a8a2 100644 --- a/tests/uitests/src/test/snapshots/images/features.messages.impl.attachments.preview_AttachmentsView_5_en.png +++ b/tests/uitests/src/test/snapshots/images/features.messages.impl.attachments.preview_AttachmentsView_5_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:6b43bff28db4411ba402204badd079323dad9ec7dd5dab1c13ba616e62b85dc4 -size 86461 +oid sha256:718838b71f5e69e54b9d2977c7dd9f4a1cfba2e5c03f98bbac4476bd4f91e352 +size 86475 diff --git a/tests/uitests/src/test/snapshots/images/features.messages.impl.attachments.preview_AttachmentsView_6_en.png b/tests/uitests/src/test/snapshots/images/features.messages.impl.attachments.preview_AttachmentsView_6_en.png index 8b48d015f0..8cb89ad06b 100644 --- a/tests/uitests/src/test/snapshots/images/features.messages.impl.attachments.preview_AttachmentsView_6_en.png +++ b/tests/uitests/src/test/snapshots/images/features.messages.impl.attachments.preview_AttachmentsView_6_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:b8119afe2e6a12bd41f8e838461c9e3f311ed0b5e5ce3c524a70226feb120996 -size 72836 +oid sha256:9368b86a0b2c5f73e97837019327e2f3c7898ded80de259a7c03e58f2ccf2b64 +size 72852 diff --git a/tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components_TimelineItemEventRowWithThreadSummary_Day_0_en.png b/tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components_TimelineItemEventRowWithThreadSummary_Day_0_en.png new file mode 100644 index 0000000000..4f8761e4dd --- /dev/null +++ b/tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components_TimelineItemEventRowWithThreadSummary_Day_0_en.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:ddaa247eea635d7e8c079ae128983fd25c1aeba96a48b08ae71218ef52e88d5b +size 69475 diff --git a/tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components_TimelineItemEventRowWithThreadSummary_Night_0_en.png b/tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components_TimelineItemEventRowWithThreadSummary_Night_0_en.png new file mode 100644 index 0000000000..f17dbbe01e --- /dev/null +++ b/tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components_TimelineItemEventRowWithThreadSummary_Night_0_en.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:647365688fd0c542d4be6dae570b33fbb7bab6261dc57791db85966808d440bb +size 67563 diff --git a/tests/uitests/src/test/snapshots/images/features.messages.impl_MessagesView_Day_15_en.png b/tests/uitests/src/test/snapshots/images/features.messages.impl_MessagesView_Day_15_en.png new file mode 100644 index 0000000000..ff317ac8ad --- /dev/null +++ b/tests/uitests/src/test/snapshots/images/features.messages.impl_MessagesView_Day_15_en.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:045e0d9605be905e4bbc5d88fc5cfa3bd4a109164709ce5276dedc3dbcf2da80 +size 51119 diff --git a/tests/uitests/src/test/snapshots/images/features.messages.impl_MessagesView_Night_15_en.png b/tests/uitests/src/test/snapshots/images/features.messages.impl_MessagesView_Night_15_en.png new file mode 100644 index 0000000000..7fb660b0fb --- /dev/null +++ b/tests/uitests/src/test/snapshots/images/features.messages.impl_MessagesView_Night_15_en.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:fdb2ca59f48d38d8fa7ebeb9d5768b44f216266a27f6cec9d518b729ecece253 +size 50253 diff --git a/tests/uitests/src/test/snapshots/images/features.preferences.impl.advanced_AdvancedSettingsViewDark_8_en.png b/tests/uitests/src/test/snapshots/images/features.preferences.impl.advanced_AdvancedSettingsViewDark_8_en.png index c8ee4260ef..0ebd5e5ce3 100644 --- a/tests/uitests/src/test/snapshots/images/features.preferences.impl.advanced_AdvancedSettingsViewDark_8_en.png +++ b/tests/uitests/src/test/snapshots/images/features.preferences.impl.advanced_AdvancedSettingsViewDark_8_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:d7a55f82ff11fe2b96d810900e3cdf782fe35036043e1685298a1b75017ba4bc -size 53448 +oid sha256:fbb6c5180c9f72153f6c500f96bf65b90fc26f312bedd6dcd7f02a31ba452048 +size 53003 diff --git a/tests/uitests/src/test/snapshots/images/features.preferences.impl.advanced_AdvancedSettingsViewLight_8_en.png b/tests/uitests/src/test/snapshots/images/features.preferences.impl.advanced_AdvancedSettingsViewLight_8_en.png index dd31d6c55e..3f480561a4 100644 --- a/tests/uitests/src/test/snapshots/images/features.preferences.impl.advanced_AdvancedSettingsViewLight_8_en.png +++ b/tests/uitests/src/test/snapshots/images/features.preferences.impl.advanced_AdvancedSettingsViewLight_8_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:3a8e9c91b35cf01c85df047ca23c7f3af197ed29e7e04afff0e7c3394fbab5cc -size 55551 +oid sha256:1de9e83c5ac5192c55e9147a2704caf20ce9d8f2966ee89f90f4e89a1b49b4fb +size 55180 diff --git a/tests/uitests/src/test/snapshots/images/features.roomdetails.impl.invite_RoomInviteMembersView_Day_0_en.png b/tests/uitests/src/test/snapshots/images/features.roomdetails.impl.invite_RoomInviteMembersView_Day_0_en.png index 6102c1316d..4149be807b 100644 --- a/tests/uitests/src/test/snapshots/images/features.roomdetails.impl.invite_RoomInviteMembersView_Day_0_en.png +++ b/tests/uitests/src/test/snapshots/images/features.roomdetails.impl.invite_RoomInviteMembersView_Day_0_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:cb145968deaf61c3c94c5094624a1024e796698fc7b62801f852fd4db4483de6 -size 13741 +oid sha256:611314345ea0f68062800755783e790ad452adec1f1dd01fcae1eec4cc5322fc +size 8188 diff --git a/tests/uitests/src/test/snapshots/images/features.roomdetails.impl.invite_RoomInviteMembersView_Day_1_en.png b/tests/uitests/src/test/snapshots/images/features.roomdetails.impl.invite_RoomInviteMembersView_Day_1_en.png index 8a3e9fced6..39ff3000da 100644 --- a/tests/uitests/src/test/snapshots/images/features.roomdetails.impl.invite_RoomInviteMembersView_Day_1_en.png +++ b/tests/uitests/src/test/snapshots/images/features.roomdetails.impl.invite_RoomInviteMembersView_Day_1_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:66f4f90864984ed917ff55916b62a825ab05915de3b7e7fc9be22b4bcb7c3ef1 -size 24702 +oid sha256:86a07a08b2bd2b6672da54bec6183ccdc860740a24cf43e88d3e40c0b50138ed +size 8110 diff --git a/tests/uitests/src/test/snapshots/images/features.roomdetails.impl.invite_RoomInviteMembersView_Day_2_en.png b/tests/uitests/src/test/snapshots/images/features.roomdetails.impl.invite_RoomInviteMembersView_Day_2_en.png index c042e2b852..4149be807b 100644 --- a/tests/uitests/src/test/snapshots/images/features.roomdetails.impl.invite_RoomInviteMembersView_Day_2_en.png +++ b/tests/uitests/src/test/snapshots/images/features.roomdetails.impl.invite_RoomInviteMembersView_Day_2_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:2df17818a5c948856cd4892f56e321b3f5f72353d0d05b0104c13115a1538c92 -size 11160 +oid sha256:611314345ea0f68062800755783e790ad452adec1f1dd01fcae1eec4cc5322fc +size 8188 diff --git a/tests/uitests/src/test/snapshots/images/features.roomdetails.impl.invite_RoomInviteMembersView_Day_3_en.png b/tests/uitests/src/test/snapshots/images/features.roomdetails.impl.invite_RoomInviteMembersView_Day_3_en.png deleted file mode 100644 index af42e49989..0000000000 --- a/tests/uitests/src/test/snapshots/images/features.roomdetails.impl.invite_RoomInviteMembersView_Day_3_en.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:c9b9ae8410f882587f286684da3d92fde0de1c5f9a42dcc4819e690c3fc997ba -size 22454 diff --git a/tests/uitests/src/test/snapshots/images/features.roomdetails.impl.invite_RoomInviteMembersView_Day_4_en.png b/tests/uitests/src/test/snapshots/images/features.roomdetails.impl.invite_RoomInviteMembersView_Day_4_en.png deleted file mode 100644 index 528b5ad450..0000000000 --- a/tests/uitests/src/test/snapshots/images/features.roomdetails.impl.invite_RoomInviteMembersView_Day_4_en.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:c69900f653154c27dea219139c66337783e3ed1a04d1520c18c4271430a1910b -size 13111 diff --git a/tests/uitests/src/test/snapshots/images/features.roomdetails.impl.invite_RoomInviteMembersView_Day_5_en.png b/tests/uitests/src/test/snapshots/images/features.roomdetails.impl.invite_RoomInviteMembersView_Day_5_en.png deleted file mode 100644 index 7db6382d79..0000000000 --- a/tests/uitests/src/test/snapshots/images/features.roomdetails.impl.invite_RoomInviteMembersView_Day_5_en.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:022d3375146f9fc4d68b5342a725492e5e3899565518110ee0a5c25687b46764 -size 42527 diff --git a/tests/uitests/src/test/snapshots/images/features.roomdetails.impl.invite_RoomInviteMembersView_Day_6_en.png b/tests/uitests/src/test/snapshots/images/features.roomdetails.impl.invite_RoomInviteMembersView_Day_6_en.png deleted file mode 100644 index b9cdf531f8..0000000000 --- a/tests/uitests/src/test/snapshots/images/features.roomdetails.impl.invite_RoomInviteMembersView_Day_6_en.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:0e13b174b62b089cf1275d5bbf7ca59bbcb0c8afe416d0dbc8bc92c6267b7379 -size 37547 diff --git a/tests/uitests/src/test/snapshots/images/features.roomdetails.impl.invite_RoomInviteMembersView_Day_7_en.png b/tests/uitests/src/test/snapshots/images/features.roomdetails.impl.invite_RoomInviteMembersView_Day_7_en.png deleted file mode 100644 index 4097a7998a..0000000000 --- a/tests/uitests/src/test/snapshots/images/features.roomdetails.impl.invite_RoomInviteMembersView_Day_7_en.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:5f46810124f978b267deb9b6418b740ae845bd53529cda4de688e2d09cea1010 -size 29699 diff --git a/tests/uitests/src/test/snapshots/images/features.roomdetails.impl.invite_RoomInviteMembersView_Night_0_en.png b/tests/uitests/src/test/snapshots/images/features.roomdetails.impl.invite_RoomInviteMembersView_Night_0_en.png index f13c0ff5ff..b27727ee2b 100644 --- a/tests/uitests/src/test/snapshots/images/features.roomdetails.impl.invite_RoomInviteMembersView_Night_0_en.png +++ b/tests/uitests/src/test/snapshots/images/features.roomdetails.impl.invite_RoomInviteMembersView_Night_0_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:b385467c9bf74c9abc478d3cc2b20f73abd2da65f71a75d8f86e9e8635b86af1 -size 12919 +oid sha256:7ba9d3cb9a5a601b28ad9ff508c3179921cf26fcee86194c582092b1d7bf79d3 +size 7992 diff --git a/tests/uitests/src/test/snapshots/images/features.roomdetails.impl.invite_RoomInviteMembersView_Night_1_en.png b/tests/uitests/src/test/snapshots/images/features.roomdetails.impl.invite_RoomInviteMembersView_Night_1_en.png index 9832cb4eb2..3f5cacc2d0 100644 --- a/tests/uitests/src/test/snapshots/images/features.roomdetails.impl.invite_RoomInviteMembersView_Night_1_en.png +++ b/tests/uitests/src/test/snapshots/images/features.roomdetails.impl.invite_RoomInviteMembersView_Night_1_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:44264663827df1a99b190ec02edddac80d6b95a65f98a4abc4e8cf7a1141b793 -size 24841 +oid sha256:6cb292850354b8b6ba5ca36334d1664dccd617e7a6b9b55ecf3ac7d1b9729d90 +size 7872 diff --git a/tests/uitests/src/test/snapshots/images/features.roomdetails.impl.invite_RoomInviteMembersView_Night_2_en.png b/tests/uitests/src/test/snapshots/images/features.roomdetails.impl.invite_RoomInviteMembersView_Night_2_en.png index c9c0170659..b27727ee2b 100644 --- a/tests/uitests/src/test/snapshots/images/features.roomdetails.impl.invite_RoomInviteMembersView_Night_2_en.png +++ b/tests/uitests/src/test/snapshots/images/features.roomdetails.impl.invite_RoomInviteMembersView_Night_2_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:77a5df48748a583eb76d1fd9ddfc334f16d8b327f31edde679a548ada59f4488 -size 10772 +oid sha256:7ba9d3cb9a5a601b28ad9ff508c3179921cf26fcee86194c582092b1d7bf79d3 +size 7992 diff --git a/tests/uitests/src/test/snapshots/images/features.roomdetails.impl.invite_RoomInviteMembersView_Night_3_en.png b/tests/uitests/src/test/snapshots/images/features.roomdetails.impl.invite_RoomInviteMembersView_Night_3_en.png deleted file mode 100644 index e49a38e82e..0000000000 --- a/tests/uitests/src/test/snapshots/images/features.roomdetails.impl.invite_RoomInviteMembersView_Night_3_en.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:40eb69cf8c757555304edccca2e1b57d378e0cf9f4a8c42b275287d0f44a7f18 -size 22877 diff --git a/tests/uitests/src/test/snapshots/images/features.roomdetails.impl.invite_RoomInviteMembersView_Night_4_en.png b/tests/uitests/src/test/snapshots/images/features.roomdetails.impl.invite_RoomInviteMembersView_Night_4_en.png deleted file mode 100644 index 8c0a4c43a0..0000000000 --- a/tests/uitests/src/test/snapshots/images/features.roomdetails.impl.invite_RoomInviteMembersView_Night_4_en.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:2c54621eb62e69ea15b707a75a1a579836730ab321c67e16535a56da0b972ed3 -size 12689 diff --git a/tests/uitests/src/test/snapshots/images/features.roomdetails.impl.invite_RoomInviteMembersView_Night_5_en.png b/tests/uitests/src/test/snapshots/images/features.roomdetails.impl.invite_RoomInviteMembersView_Night_5_en.png deleted file mode 100644 index 3645708432..0000000000 --- a/tests/uitests/src/test/snapshots/images/features.roomdetails.impl.invite_RoomInviteMembersView_Night_5_en.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:25eb2a710631f8297160e6a8e51102f454db559d7c56b8b14a33e2bbfb5a4173 -size 43159 diff --git a/tests/uitests/src/test/snapshots/images/features.roomdetails.impl.invite_RoomInviteMembersView_Night_6_en.png b/tests/uitests/src/test/snapshots/images/features.roomdetails.impl.invite_RoomInviteMembersView_Night_6_en.png deleted file mode 100644 index 136e28cb23..0000000000 --- a/tests/uitests/src/test/snapshots/images/features.roomdetails.impl.invite_RoomInviteMembersView_Night_6_en.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:b5d429e01ef00018de091809af63edc12827362fe82498bca5c85b85a0e6fd6a -size 37451 diff --git a/tests/uitests/src/test/snapshots/images/features.roomdetails.impl.invite_RoomInviteMembersView_Night_7_en.png b/tests/uitests/src/test/snapshots/images/features.roomdetails.impl.invite_RoomInviteMembersView_Night_7_en.png deleted file mode 100644 index ad4dd4a0a0..0000000000 --- a/tests/uitests/src/test/snapshots/images/features.roomdetails.impl.invite_RoomInviteMembersView_Night_7_en.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:4e1e57cfdee3e3f45024b9b9bafa5ea9eade19ab4b9ff48f2acd76245d5cc026 -size 29011 diff --git a/tests/uitests/src/test/snapshots/images/features.startchat.impl.components_SearchMultipleUsersResultItem_en.png b/tests/uitests/src/test/snapshots/images/features.startchat.impl.components_SearchMultipleUsersResultItem_en.png new file mode 100644 index 0000000000..dfa930f47f --- /dev/null +++ b/tests/uitests/src/test/snapshots/images/features.startchat.impl.components_SearchMultipleUsersResultItem_en.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:10da292ee61043de44cfc3edfdc671ce923df0788765d9a63e846912a876cc6d +size 82806 diff --git a/tests/uitests/src/test/snapshots/images/features.createroom.impl.components_SearchSingleUserResultItem_en.png b/tests/uitests/src/test/snapshots/images/features.startchat.impl.components_SearchSingleUserResultItem_en.png similarity index 100% rename from tests/uitests/src/test/snapshots/images/features.createroom.impl.components_SearchSingleUserResultItem_en.png rename to tests/uitests/src/test/snapshots/images/features.startchat.impl.components_SearchSingleUserResultItem_en.png diff --git a/tests/uitests/src/test/snapshots/images/features.createroom.impl.components_UserListView_Day_0_en.png b/tests/uitests/src/test/snapshots/images/features.startchat.impl.components_UserListView_Day_0_en.png similarity index 100% rename from tests/uitests/src/test/snapshots/images/features.createroom.impl.components_UserListView_Day_0_en.png rename to tests/uitests/src/test/snapshots/images/features.startchat.impl.components_UserListView_Day_0_en.png diff --git a/tests/uitests/src/test/snapshots/images/features.startchat.impl.components_UserListView_Day_1_en.png b/tests/uitests/src/test/snapshots/images/features.startchat.impl.components_UserListView_Day_1_en.png new file mode 100644 index 0000000000..dd4a5e679b --- /dev/null +++ b/tests/uitests/src/test/snapshots/images/features.startchat.impl.components_UserListView_Day_1_en.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:721f7effa69fa976958537cf651afb3e5b5023bd31adf2d27004f98cce7949d4 +size 21525 diff --git a/tests/uitests/src/test/snapshots/images/features.createroom.impl.components_UserListView_Day_2_en.png b/tests/uitests/src/test/snapshots/images/features.startchat.impl.components_UserListView_Day_2_en.png similarity index 100% rename from tests/uitests/src/test/snapshots/images/features.createroom.impl.components_UserListView_Day_2_en.png rename to tests/uitests/src/test/snapshots/images/features.startchat.impl.components_UserListView_Day_2_en.png diff --git a/tests/uitests/src/test/snapshots/images/features.createroom.impl.components_UserListView_Day_3_en.png b/tests/uitests/src/test/snapshots/images/features.startchat.impl.components_UserListView_Day_3_en.png similarity index 100% rename from tests/uitests/src/test/snapshots/images/features.createroom.impl.components_UserListView_Day_3_en.png rename to tests/uitests/src/test/snapshots/images/features.startchat.impl.components_UserListView_Day_3_en.png diff --git a/tests/uitests/src/test/snapshots/images/features.createroom.impl.components_UserListView_Day_4_en.png b/tests/uitests/src/test/snapshots/images/features.startchat.impl.components_UserListView_Day_4_en.png similarity index 100% rename from tests/uitests/src/test/snapshots/images/features.createroom.impl.components_UserListView_Day_4_en.png rename to tests/uitests/src/test/snapshots/images/features.startchat.impl.components_UserListView_Day_4_en.png diff --git a/tests/uitests/src/test/snapshots/images/features.createroom.impl.components_UserListView_Day_5_en.png b/tests/uitests/src/test/snapshots/images/features.startchat.impl.components_UserListView_Day_5_en.png similarity index 100% rename from tests/uitests/src/test/snapshots/images/features.createroom.impl.components_UserListView_Day_5_en.png rename to tests/uitests/src/test/snapshots/images/features.startchat.impl.components_UserListView_Day_5_en.png diff --git a/tests/uitests/src/test/snapshots/images/features.startchat.impl.components_UserListView_Day_6_en.png b/tests/uitests/src/test/snapshots/images/features.startchat.impl.components_UserListView_Day_6_en.png new file mode 100644 index 0000000000..9f7469b9d9 --- /dev/null +++ b/tests/uitests/src/test/snapshots/images/features.startchat.impl.components_UserListView_Day_6_en.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:2f894f9818cd057c6ccef33948cff0d3d55b2478e30275af9a6406a31fecdb59 +size 54748 diff --git a/tests/uitests/src/test/snapshots/images/features.createroom.impl.components_UserListView_Day_7_en.png b/tests/uitests/src/test/snapshots/images/features.startchat.impl.components_UserListView_Day_7_en.png similarity index 100% rename from tests/uitests/src/test/snapshots/images/features.createroom.impl.components_UserListView_Day_7_en.png rename to tests/uitests/src/test/snapshots/images/features.startchat.impl.components_UserListView_Day_7_en.png diff --git a/tests/uitests/src/test/snapshots/images/features.createroom.impl.components_UserListView_Day_8_en.png b/tests/uitests/src/test/snapshots/images/features.startchat.impl.components_UserListView_Day_8_en.png similarity index 100% rename from tests/uitests/src/test/snapshots/images/features.createroom.impl.components_UserListView_Day_8_en.png rename to tests/uitests/src/test/snapshots/images/features.startchat.impl.components_UserListView_Day_8_en.png diff --git a/tests/uitests/src/test/snapshots/images/features.startchat.impl.components_UserListView_Day_9_en.png b/tests/uitests/src/test/snapshots/images/features.startchat.impl.components_UserListView_Day_9_en.png new file mode 100644 index 0000000000..297cd16bfb --- /dev/null +++ b/tests/uitests/src/test/snapshots/images/features.startchat.impl.components_UserListView_Day_9_en.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:a137133ce6c61e0dd6d4e7bfcac4cb8b93a607114fbc9c0183a2d97b6cd25520 +size 37207 diff --git a/tests/uitests/src/test/snapshots/images/features.createroom.impl.components_UserListView_Night_0_en.png b/tests/uitests/src/test/snapshots/images/features.startchat.impl.components_UserListView_Night_0_en.png similarity index 100% rename from tests/uitests/src/test/snapshots/images/features.createroom.impl.components_UserListView_Night_0_en.png rename to tests/uitests/src/test/snapshots/images/features.startchat.impl.components_UserListView_Night_0_en.png diff --git a/tests/uitests/src/test/snapshots/images/features.startchat.impl.components_UserListView_Night_1_en.png b/tests/uitests/src/test/snapshots/images/features.startchat.impl.components_UserListView_Night_1_en.png new file mode 100644 index 0000000000..39f3f34f90 --- /dev/null +++ b/tests/uitests/src/test/snapshots/images/features.startchat.impl.components_UserListView_Night_1_en.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:ce7350e400a50ce7fd359a17240c816ab527e5296563f87eeb6a2aad50640e47 +size 21982 diff --git a/tests/uitests/src/test/snapshots/images/features.createroom.impl.components_UserListView_Night_2_en.png b/tests/uitests/src/test/snapshots/images/features.startchat.impl.components_UserListView_Night_2_en.png similarity index 100% rename from tests/uitests/src/test/snapshots/images/features.createroom.impl.components_UserListView_Night_2_en.png rename to tests/uitests/src/test/snapshots/images/features.startchat.impl.components_UserListView_Night_2_en.png diff --git a/tests/uitests/src/test/snapshots/images/features.createroom.impl.components_UserListView_Night_3_en.png b/tests/uitests/src/test/snapshots/images/features.startchat.impl.components_UserListView_Night_3_en.png similarity index 100% rename from tests/uitests/src/test/snapshots/images/features.createroom.impl.components_UserListView_Night_3_en.png rename to tests/uitests/src/test/snapshots/images/features.startchat.impl.components_UserListView_Night_3_en.png diff --git a/tests/uitests/src/test/snapshots/images/features.createroom.impl.components_UserListView_Night_4_en.png b/tests/uitests/src/test/snapshots/images/features.startchat.impl.components_UserListView_Night_4_en.png similarity index 100% rename from tests/uitests/src/test/snapshots/images/features.createroom.impl.components_UserListView_Night_4_en.png rename to tests/uitests/src/test/snapshots/images/features.startchat.impl.components_UserListView_Night_4_en.png diff --git a/tests/uitests/src/test/snapshots/images/features.createroom.impl.components_UserListView_Night_5_en.png b/tests/uitests/src/test/snapshots/images/features.startchat.impl.components_UserListView_Night_5_en.png similarity index 100% rename from tests/uitests/src/test/snapshots/images/features.createroom.impl.components_UserListView_Night_5_en.png rename to tests/uitests/src/test/snapshots/images/features.startchat.impl.components_UserListView_Night_5_en.png diff --git a/tests/uitests/src/test/snapshots/images/features.startchat.impl.components_UserListView_Night_6_en.png b/tests/uitests/src/test/snapshots/images/features.startchat.impl.components_UserListView_Night_6_en.png new file mode 100644 index 0000000000..5954e7a5f3 --- /dev/null +++ b/tests/uitests/src/test/snapshots/images/features.startchat.impl.components_UserListView_Night_6_en.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:86c7495d6b7ffb86f64ec3f5231eacf1532e4104c529de3569eb0d155d45fc34 +size 55722 diff --git a/tests/uitests/src/test/snapshots/images/features.createroom.impl.components_UserListView_Night_7_en.png b/tests/uitests/src/test/snapshots/images/features.startchat.impl.components_UserListView_Night_7_en.png similarity index 100% rename from tests/uitests/src/test/snapshots/images/features.createroom.impl.components_UserListView_Night_7_en.png rename to tests/uitests/src/test/snapshots/images/features.startchat.impl.components_UserListView_Night_7_en.png diff --git a/tests/uitests/src/test/snapshots/images/features.createroom.impl.components_UserListView_Night_8_en.png b/tests/uitests/src/test/snapshots/images/features.startchat.impl.components_UserListView_Night_8_en.png similarity index 100% rename from tests/uitests/src/test/snapshots/images/features.createroom.impl.components_UserListView_Night_8_en.png rename to tests/uitests/src/test/snapshots/images/features.startchat.impl.components_UserListView_Night_8_en.png diff --git a/tests/uitests/src/test/snapshots/images/features.startchat.impl.components_UserListView_Night_9_en.png b/tests/uitests/src/test/snapshots/images/features.startchat.impl.components_UserListView_Night_9_en.png new file mode 100644 index 0000000000..d116dfcc48 --- /dev/null +++ b/tests/uitests/src/test/snapshots/images/features.startchat.impl.components_UserListView_Night_9_en.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:8b0cff302bbc1d6fc45d7615737e750eabee54d7881e5e7aba7ea6a1a8045762 +size 37135 diff --git a/tests/uitests/src/test/snapshots/images/features.createroom.impl.joinbyaddress_JoinRoomByAddressView_Day_0_en.png b/tests/uitests/src/test/snapshots/images/features.startchat.impl.joinbyaddress_JoinRoomByAddressView_Day_0_en.png similarity index 100% rename from tests/uitests/src/test/snapshots/images/features.createroom.impl.joinbyaddress_JoinRoomByAddressView_Day_0_en.png rename to tests/uitests/src/test/snapshots/images/features.startchat.impl.joinbyaddress_JoinRoomByAddressView_Day_0_en.png diff --git a/tests/uitests/src/test/snapshots/images/features.createroom.impl.joinbyaddress_JoinRoomByAddressView_Day_1_en.png b/tests/uitests/src/test/snapshots/images/features.startchat.impl.joinbyaddress_JoinRoomByAddressView_Day_1_en.png similarity index 100% rename from tests/uitests/src/test/snapshots/images/features.createroom.impl.joinbyaddress_JoinRoomByAddressView_Day_1_en.png rename to tests/uitests/src/test/snapshots/images/features.startchat.impl.joinbyaddress_JoinRoomByAddressView_Day_1_en.png diff --git a/tests/uitests/src/test/snapshots/images/features.createroom.impl.joinbyaddress_JoinRoomByAddressView_Day_2_en.png b/tests/uitests/src/test/snapshots/images/features.startchat.impl.joinbyaddress_JoinRoomByAddressView_Day_2_en.png similarity index 100% rename from tests/uitests/src/test/snapshots/images/features.createroom.impl.joinbyaddress_JoinRoomByAddressView_Day_2_en.png rename to tests/uitests/src/test/snapshots/images/features.startchat.impl.joinbyaddress_JoinRoomByAddressView_Day_2_en.png diff --git a/tests/uitests/src/test/snapshots/images/features.createroom.impl.joinbyaddress_JoinRoomByAddressView_Day_3_en.png b/tests/uitests/src/test/snapshots/images/features.startchat.impl.joinbyaddress_JoinRoomByAddressView_Day_3_en.png similarity index 100% rename from tests/uitests/src/test/snapshots/images/features.createroom.impl.joinbyaddress_JoinRoomByAddressView_Day_3_en.png rename to tests/uitests/src/test/snapshots/images/features.startchat.impl.joinbyaddress_JoinRoomByAddressView_Day_3_en.png diff --git a/tests/uitests/src/test/snapshots/images/features.createroom.impl.joinbyaddress_JoinRoomByAddressView_Day_4_en.png b/tests/uitests/src/test/snapshots/images/features.startchat.impl.joinbyaddress_JoinRoomByAddressView_Day_4_en.png similarity index 100% rename from tests/uitests/src/test/snapshots/images/features.createroom.impl.joinbyaddress_JoinRoomByAddressView_Day_4_en.png rename to tests/uitests/src/test/snapshots/images/features.startchat.impl.joinbyaddress_JoinRoomByAddressView_Day_4_en.png diff --git a/tests/uitests/src/test/snapshots/images/features.createroom.impl.joinbyaddress_JoinRoomByAddressView_Day_5_en.png b/tests/uitests/src/test/snapshots/images/features.startchat.impl.joinbyaddress_JoinRoomByAddressView_Day_5_en.png similarity index 100% rename from tests/uitests/src/test/snapshots/images/features.createroom.impl.joinbyaddress_JoinRoomByAddressView_Day_5_en.png rename to tests/uitests/src/test/snapshots/images/features.startchat.impl.joinbyaddress_JoinRoomByAddressView_Day_5_en.png diff --git a/tests/uitests/src/test/snapshots/images/features.createroom.impl.joinbyaddress_JoinRoomByAddressView_Night_0_en.png b/tests/uitests/src/test/snapshots/images/features.startchat.impl.joinbyaddress_JoinRoomByAddressView_Night_0_en.png similarity index 100% rename from tests/uitests/src/test/snapshots/images/features.createroom.impl.joinbyaddress_JoinRoomByAddressView_Night_0_en.png rename to tests/uitests/src/test/snapshots/images/features.startchat.impl.joinbyaddress_JoinRoomByAddressView_Night_0_en.png diff --git a/tests/uitests/src/test/snapshots/images/features.createroom.impl.joinbyaddress_JoinRoomByAddressView_Night_1_en.png b/tests/uitests/src/test/snapshots/images/features.startchat.impl.joinbyaddress_JoinRoomByAddressView_Night_1_en.png similarity index 100% rename from tests/uitests/src/test/snapshots/images/features.createroom.impl.joinbyaddress_JoinRoomByAddressView_Night_1_en.png rename to tests/uitests/src/test/snapshots/images/features.startchat.impl.joinbyaddress_JoinRoomByAddressView_Night_1_en.png diff --git a/tests/uitests/src/test/snapshots/images/features.createroom.impl.joinbyaddress_JoinRoomByAddressView_Night_2_en.png b/tests/uitests/src/test/snapshots/images/features.startchat.impl.joinbyaddress_JoinRoomByAddressView_Night_2_en.png similarity index 100% rename from tests/uitests/src/test/snapshots/images/features.createroom.impl.joinbyaddress_JoinRoomByAddressView_Night_2_en.png rename to tests/uitests/src/test/snapshots/images/features.startchat.impl.joinbyaddress_JoinRoomByAddressView_Night_2_en.png diff --git a/tests/uitests/src/test/snapshots/images/features.createroom.impl.joinbyaddress_JoinRoomByAddressView_Night_3_en.png b/tests/uitests/src/test/snapshots/images/features.startchat.impl.joinbyaddress_JoinRoomByAddressView_Night_3_en.png similarity index 100% rename from tests/uitests/src/test/snapshots/images/features.createroom.impl.joinbyaddress_JoinRoomByAddressView_Night_3_en.png rename to tests/uitests/src/test/snapshots/images/features.startchat.impl.joinbyaddress_JoinRoomByAddressView_Night_3_en.png diff --git a/tests/uitests/src/test/snapshots/images/features.createroom.impl.joinbyaddress_JoinRoomByAddressView_Night_4_en.png b/tests/uitests/src/test/snapshots/images/features.startchat.impl.joinbyaddress_JoinRoomByAddressView_Night_4_en.png similarity index 100% rename from tests/uitests/src/test/snapshots/images/features.createroom.impl.joinbyaddress_JoinRoomByAddressView_Night_4_en.png rename to tests/uitests/src/test/snapshots/images/features.startchat.impl.joinbyaddress_JoinRoomByAddressView_Night_4_en.png diff --git a/tests/uitests/src/test/snapshots/images/features.createroom.impl.joinbyaddress_JoinRoomByAddressView_Night_5_en.png b/tests/uitests/src/test/snapshots/images/features.startchat.impl.joinbyaddress_JoinRoomByAddressView_Night_5_en.png similarity index 100% rename from tests/uitests/src/test/snapshots/images/features.createroom.impl.joinbyaddress_JoinRoomByAddressView_Night_5_en.png rename to tests/uitests/src/test/snapshots/images/features.startchat.impl.joinbyaddress_JoinRoomByAddressView_Night_5_en.png diff --git a/tests/uitests/src/test/snapshots/images/features.createroom.impl.root_CreateRoomRootView_Day_0_en.png b/tests/uitests/src/test/snapshots/images/features.startchat.impl.root_StartChatView_Day_0_en.png similarity index 100% rename from tests/uitests/src/test/snapshots/images/features.createroom.impl.root_CreateRoomRootView_Day_0_en.png rename to tests/uitests/src/test/snapshots/images/features.startchat.impl.root_StartChatView_Day_0_en.png diff --git a/tests/uitests/src/test/snapshots/images/features.createroom.impl.root_CreateRoomRootView_Day_1_en.png b/tests/uitests/src/test/snapshots/images/features.startchat.impl.root_StartChatView_Day_1_en.png similarity index 100% rename from tests/uitests/src/test/snapshots/images/features.createroom.impl.root_CreateRoomRootView_Day_1_en.png rename to tests/uitests/src/test/snapshots/images/features.startchat.impl.root_StartChatView_Day_1_en.png diff --git a/tests/uitests/src/test/snapshots/images/features.createroom.impl.root_CreateRoomRootView_Day_2_en.png b/tests/uitests/src/test/snapshots/images/features.startchat.impl.root_StartChatView_Day_2_en.png similarity index 100% rename from tests/uitests/src/test/snapshots/images/features.createroom.impl.root_CreateRoomRootView_Day_2_en.png rename to tests/uitests/src/test/snapshots/images/features.startchat.impl.root_StartChatView_Day_2_en.png diff --git a/tests/uitests/src/test/snapshots/images/features.createroom.impl.root_CreateRoomRootView_Day_3_en.png b/tests/uitests/src/test/snapshots/images/features.startchat.impl.root_StartChatView_Day_3_en.png similarity index 100% rename from tests/uitests/src/test/snapshots/images/features.createroom.impl.root_CreateRoomRootView_Day_3_en.png rename to tests/uitests/src/test/snapshots/images/features.startchat.impl.root_StartChatView_Day_3_en.png diff --git a/tests/uitests/src/test/snapshots/images/features.createroom.impl.root_CreateRoomRootView_Day_4_en.png b/tests/uitests/src/test/snapshots/images/features.startchat.impl.root_StartChatView_Day_4_en.png similarity index 100% rename from tests/uitests/src/test/snapshots/images/features.createroom.impl.root_CreateRoomRootView_Day_4_en.png rename to tests/uitests/src/test/snapshots/images/features.startchat.impl.root_StartChatView_Day_4_en.png diff --git a/tests/uitests/src/test/snapshots/images/features.createroom.impl.root_CreateRoomRootView_Day_5_en.png b/tests/uitests/src/test/snapshots/images/features.startchat.impl.root_StartChatView_Day_5_en.png similarity index 100% rename from tests/uitests/src/test/snapshots/images/features.createroom.impl.root_CreateRoomRootView_Day_5_en.png rename to tests/uitests/src/test/snapshots/images/features.startchat.impl.root_StartChatView_Day_5_en.png diff --git a/tests/uitests/src/test/snapshots/images/features.createroom.impl.root_CreateRoomRootView_Night_0_en.png b/tests/uitests/src/test/snapshots/images/features.startchat.impl.root_StartChatView_Night_0_en.png similarity index 100% rename from tests/uitests/src/test/snapshots/images/features.createroom.impl.root_CreateRoomRootView_Night_0_en.png rename to tests/uitests/src/test/snapshots/images/features.startchat.impl.root_StartChatView_Night_0_en.png diff --git a/tests/uitests/src/test/snapshots/images/features.createroom.impl.root_CreateRoomRootView_Night_1_en.png b/tests/uitests/src/test/snapshots/images/features.startchat.impl.root_StartChatView_Night_1_en.png similarity index 100% rename from tests/uitests/src/test/snapshots/images/features.createroom.impl.root_CreateRoomRootView_Night_1_en.png rename to tests/uitests/src/test/snapshots/images/features.startchat.impl.root_StartChatView_Night_1_en.png diff --git a/tests/uitests/src/test/snapshots/images/features.createroom.impl.root_CreateRoomRootView_Night_2_en.png b/tests/uitests/src/test/snapshots/images/features.startchat.impl.root_StartChatView_Night_2_en.png similarity index 100% rename from tests/uitests/src/test/snapshots/images/features.createroom.impl.root_CreateRoomRootView_Night_2_en.png rename to tests/uitests/src/test/snapshots/images/features.startchat.impl.root_StartChatView_Night_2_en.png diff --git a/tests/uitests/src/test/snapshots/images/features.createroom.impl.root_CreateRoomRootView_Night_3_en.png b/tests/uitests/src/test/snapshots/images/features.startchat.impl.root_StartChatView_Night_3_en.png similarity index 100% rename from tests/uitests/src/test/snapshots/images/features.createroom.impl.root_CreateRoomRootView_Night_3_en.png rename to tests/uitests/src/test/snapshots/images/features.startchat.impl.root_StartChatView_Night_3_en.png diff --git a/tests/uitests/src/test/snapshots/images/features.createroom.impl.root_CreateRoomRootView_Night_4_en.png b/tests/uitests/src/test/snapshots/images/features.startchat.impl.root_StartChatView_Night_4_en.png similarity index 100% rename from tests/uitests/src/test/snapshots/images/features.createroom.impl.root_CreateRoomRootView_Night_4_en.png rename to tests/uitests/src/test/snapshots/images/features.startchat.impl.root_StartChatView_Night_4_en.png diff --git a/tests/uitests/src/test/snapshots/images/features.createroom.impl.root_CreateRoomRootView_Night_5_en.png b/tests/uitests/src/test/snapshots/images/features.startchat.impl.root_StartChatView_Night_5_en.png similarity index 100% rename from tests/uitests/src/test/snapshots/images/features.createroom.impl.root_CreateRoomRootView_Night_5_en.png rename to tests/uitests/src/test/snapshots/images/features.startchat.impl.root_StartChatView_Night_5_en.png diff --git a/tests/uitests/src/test/snapshots/images/libraries.designsystem.atomic.atoms_SelectedIndicatorAtom_Day_0_en.png b/tests/uitests/src/test/snapshots/images/libraries.designsystem.atomic.atoms_SelectedIndicatorAtom_Day_0_en.png new file mode 100644 index 0000000000..4cd52747eb --- /dev/null +++ b/tests/uitests/src/test/snapshots/images/libraries.designsystem.atomic.atoms_SelectedIndicatorAtom_Day_0_en.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:eda6f086863c3d3f7bc76448777768785cd69b1ac685ee1db8f95cacb3389a30 +size 5564 diff --git a/tests/uitests/src/test/snapshots/images/libraries.designsystem.atomic.atoms_SelectedIndicatorAtom_Night_0_en.png b/tests/uitests/src/test/snapshots/images/libraries.designsystem.atomic.atoms_SelectedIndicatorAtom_Night_0_en.png new file mode 100644 index 0000000000..2f6a9869f5 --- /dev/null +++ b/tests/uitests/src/test/snapshots/images/libraries.designsystem.atomic.atoms_SelectedIndicatorAtom_Night_0_en.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:19db99b73c148ad3ffc6b5e522510b8b64a3ed1de3614510c58ba7f35a4a610c +size 5338 diff --git a/tests/uitests/src/test/snapshots/images/libraries.designsystem.atomic.molecules_RoomMembersCountMolecule_Day_0_en.png b/tests/uitests/src/test/snapshots/images/libraries.designsystem.atomic.molecules_MembersCountMolecule_Day_0_en.png similarity index 100% rename from tests/uitests/src/test/snapshots/images/libraries.designsystem.atomic.molecules_RoomMembersCountMolecule_Day_0_en.png rename to tests/uitests/src/test/snapshots/images/libraries.designsystem.atomic.molecules_MembersCountMolecule_Day_0_en.png diff --git a/tests/uitests/src/test/snapshots/images/libraries.designsystem.atomic.molecules_RoomMembersCountMolecule_Night_0_en.png b/tests/uitests/src/test/snapshots/images/libraries.designsystem.atomic.molecules_MembersCountMolecule_Night_0_en.png similarity index 100% rename from tests/uitests/src/test/snapshots/images/libraries.designsystem.atomic.molecules_RoomMembersCountMolecule_Night_0_en.png rename to tests/uitests/src/test/snapshots/images/libraries.designsystem.atomic.molecules_MembersCountMolecule_Night_0_en.png diff --git a/tests/uitests/src/test/snapshots/images/features.knockrequests.impl.banner_AvatarRowRtl_Day_0_en.png b/tests/uitests/src/test/snapshots/images/libraries.designsystem.components.avatar_AvatarRowLastOnTopRtl_Day_0_en.png similarity index 100% rename from tests/uitests/src/test/snapshots/images/features.knockrequests.impl.banner_AvatarRowRtl_Day_0_en.png rename to tests/uitests/src/test/snapshots/images/libraries.designsystem.components.avatar_AvatarRowLastOnTopRtl_Day_0_en.png diff --git a/tests/uitests/src/test/snapshots/images/libraries.designsystem.components.avatar_AvatarRowLastOnTopRtl_Day_1_en.png b/tests/uitests/src/test/snapshots/images/libraries.designsystem.components.avatar_AvatarRowLastOnTopRtl_Day_1_en.png new file mode 100644 index 0000000000..4ecd0ac898 --- /dev/null +++ b/tests/uitests/src/test/snapshots/images/libraries.designsystem.components.avatar_AvatarRowLastOnTopRtl_Day_1_en.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:d510dce684941c35ef1b6ea670156e2e5d5ed0eee3577c433e02ca073e0e84c5 +size 8615 diff --git a/tests/uitests/src/test/snapshots/images/libraries.designsystem.components.avatar_AvatarRowLastOnTopRtl_Day_2_en.png b/tests/uitests/src/test/snapshots/images/libraries.designsystem.components.avatar_AvatarRowLastOnTopRtl_Day_2_en.png new file mode 100644 index 0000000000..7369d4db69 --- /dev/null +++ b/tests/uitests/src/test/snapshots/images/libraries.designsystem.components.avatar_AvatarRowLastOnTopRtl_Day_2_en.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:577579f2ed5d7ffb0d289f91d98b13b1df2f9846fefd9c494522809b18de1854 +size 8225 diff --git a/tests/uitests/src/test/snapshots/images/libraries.designsystem.components.avatar_AvatarRowLastOnTopRtl_Day_3_en.png b/tests/uitests/src/test/snapshots/images/libraries.designsystem.components.avatar_AvatarRowLastOnTopRtl_Day_3_en.png new file mode 100644 index 0000000000..7e3f2857f1 --- /dev/null +++ b/tests/uitests/src/test/snapshots/images/libraries.designsystem.components.avatar_AvatarRowLastOnTopRtl_Day_3_en.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:f053948660fad8b021a4b22d9cd234cde1cce72c3165c812000bd97b0c2da440 +size 7156 diff --git a/tests/uitests/src/test/snapshots/images/libraries.designsystem.components.avatar_AvatarRowLastOnTopRtl_Day_4_en.png b/tests/uitests/src/test/snapshots/images/libraries.designsystem.components.avatar_AvatarRowLastOnTopRtl_Day_4_en.png new file mode 100644 index 0000000000..5835ffc88e --- /dev/null +++ b/tests/uitests/src/test/snapshots/images/libraries.designsystem.components.avatar_AvatarRowLastOnTopRtl_Day_4_en.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:66c4f53b8a2b81285243a162c56521d2cb011ece4e725b9c2152d498b9f5a382 +size 5563 diff --git a/tests/uitests/src/test/snapshots/images/features.knockrequests.impl.banner_AvatarRowRtl_Night_0_en.png b/tests/uitests/src/test/snapshots/images/libraries.designsystem.components.avatar_AvatarRowLastOnTopRtl_Night_0_en.png similarity index 100% rename from tests/uitests/src/test/snapshots/images/features.knockrequests.impl.banner_AvatarRowRtl_Night_0_en.png rename to tests/uitests/src/test/snapshots/images/libraries.designsystem.components.avatar_AvatarRowLastOnTopRtl_Night_0_en.png diff --git a/tests/uitests/src/test/snapshots/images/libraries.designsystem.components.avatar_AvatarRowLastOnTopRtl_Night_1_en.png b/tests/uitests/src/test/snapshots/images/libraries.designsystem.components.avatar_AvatarRowLastOnTopRtl_Night_1_en.png new file mode 100644 index 0000000000..5ab3c70401 --- /dev/null +++ b/tests/uitests/src/test/snapshots/images/libraries.designsystem.components.avatar_AvatarRowLastOnTopRtl_Night_1_en.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:400a14cd9e24e55351cace9c44432d94d5a81b827a19dff8e61154193e13393a +size 8879 diff --git a/tests/uitests/src/test/snapshots/images/libraries.designsystem.components.avatar_AvatarRowLastOnTopRtl_Night_2_en.png b/tests/uitests/src/test/snapshots/images/libraries.designsystem.components.avatar_AvatarRowLastOnTopRtl_Night_2_en.png new file mode 100644 index 0000000000..02f28d9d30 --- /dev/null +++ b/tests/uitests/src/test/snapshots/images/libraries.designsystem.components.avatar_AvatarRowLastOnTopRtl_Night_2_en.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:31a781b781a1dccbf15012c2171f0467e54675c3b6c79740b63b9dc878324754 +size 8500 diff --git a/tests/uitests/src/test/snapshots/images/libraries.designsystem.components.avatar_AvatarRowLastOnTopRtl_Night_3_en.png b/tests/uitests/src/test/snapshots/images/libraries.designsystem.components.avatar_AvatarRowLastOnTopRtl_Night_3_en.png new file mode 100644 index 0000000000..3978d80a92 --- /dev/null +++ b/tests/uitests/src/test/snapshots/images/libraries.designsystem.components.avatar_AvatarRowLastOnTopRtl_Night_3_en.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:65cd68f9efcac21733ad327afa3308c09b8e1eece9c0d4323e7c7261a4cd3370 +size 7502 diff --git a/tests/uitests/src/test/snapshots/images/libraries.designsystem.components.avatar_AvatarRowLastOnTopRtl_Night_4_en.png b/tests/uitests/src/test/snapshots/images/libraries.designsystem.components.avatar_AvatarRowLastOnTopRtl_Night_4_en.png new file mode 100644 index 0000000000..083f8a317f --- /dev/null +++ b/tests/uitests/src/test/snapshots/images/libraries.designsystem.components.avatar_AvatarRowLastOnTopRtl_Night_4_en.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:a9f18b956d5280c31a4fae4754ddd8c2300e37580dd477b06ed043e198b08fa3 +size 5655 diff --git a/tests/uitests/src/test/snapshots/images/features.knockrequests.impl.banner_AvatarRow_Day_0_en.png b/tests/uitests/src/test/snapshots/images/libraries.designsystem.components.avatar_AvatarRowLastOnTop_Day_0_en.png similarity index 100% rename from tests/uitests/src/test/snapshots/images/features.knockrequests.impl.banner_AvatarRow_Day_0_en.png rename to tests/uitests/src/test/snapshots/images/libraries.designsystem.components.avatar_AvatarRowLastOnTop_Day_0_en.png diff --git a/tests/uitests/src/test/snapshots/images/libraries.designsystem.components.avatar_AvatarRowLastOnTop_Day_1_en.png b/tests/uitests/src/test/snapshots/images/libraries.designsystem.components.avatar_AvatarRowLastOnTop_Day_1_en.png new file mode 100644 index 0000000000..ad5437d3ac --- /dev/null +++ b/tests/uitests/src/test/snapshots/images/libraries.designsystem.components.avatar_AvatarRowLastOnTop_Day_1_en.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:cf2ad9276a0aed1b9a97067a4ce60938b0fd556050db36cf28631ce0d69a8c36 +size 8588 diff --git a/tests/uitests/src/test/snapshots/images/libraries.designsystem.components.avatar_AvatarRowLastOnTop_Day_2_en.png b/tests/uitests/src/test/snapshots/images/libraries.designsystem.components.avatar_AvatarRowLastOnTop_Day_2_en.png new file mode 100644 index 0000000000..92d02ba84b --- /dev/null +++ b/tests/uitests/src/test/snapshots/images/libraries.designsystem.components.avatar_AvatarRowLastOnTop_Day_2_en.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:223be8c6d34b8a19758575c7798ca6d925efb391c1ceabd0a1ed4c472364dcbb +size 7823 diff --git a/tests/uitests/src/test/snapshots/images/libraries.designsystem.components.avatar_AvatarRowLastOnTop_Day_3_en.png b/tests/uitests/src/test/snapshots/images/libraries.designsystem.components.avatar_AvatarRowLastOnTop_Day_3_en.png new file mode 100644 index 0000000000..a78614c3df --- /dev/null +++ b/tests/uitests/src/test/snapshots/images/libraries.designsystem.components.avatar_AvatarRowLastOnTop_Day_3_en.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:b6e439c9cd3b611cb8beac629d4d6e4da8927d05199aefec9eabe3e77ee67fe4 +size 7187 diff --git a/tests/uitests/src/test/snapshots/images/libraries.designsystem.components.avatar_AvatarRowLastOnTop_Day_4_en.png b/tests/uitests/src/test/snapshots/images/libraries.designsystem.components.avatar_AvatarRowLastOnTop_Day_4_en.png new file mode 100644 index 0000000000..5835ffc88e --- /dev/null +++ b/tests/uitests/src/test/snapshots/images/libraries.designsystem.components.avatar_AvatarRowLastOnTop_Day_4_en.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:66c4f53b8a2b81285243a162c56521d2cb011ece4e725b9c2152d498b9f5a382 +size 5563 diff --git a/tests/uitests/src/test/snapshots/images/features.knockrequests.impl.banner_AvatarRow_Night_0_en.png b/tests/uitests/src/test/snapshots/images/libraries.designsystem.components.avatar_AvatarRowLastOnTop_Night_0_en.png similarity index 100% rename from tests/uitests/src/test/snapshots/images/features.knockrequests.impl.banner_AvatarRow_Night_0_en.png rename to tests/uitests/src/test/snapshots/images/libraries.designsystem.components.avatar_AvatarRowLastOnTop_Night_0_en.png diff --git a/tests/uitests/src/test/snapshots/images/libraries.designsystem.components.avatar_AvatarRowLastOnTop_Night_1_en.png b/tests/uitests/src/test/snapshots/images/libraries.designsystem.components.avatar_AvatarRowLastOnTop_Night_1_en.png new file mode 100644 index 0000000000..25dda15a06 --- /dev/null +++ b/tests/uitests/src/test/snapshots/images/libraries.designsystem.components.avatar_AvatarRowLastOnTop_Night_1_en.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:fb3cec5cf746f7faf350c3bc8cb919e5ba0e207ff87959e817e86d82e8531d72 +size 8831 diff --git a/tests/uitests/src/test/snapshots/images/libraries.designsystem.components.avatar_AvatarRowLastOnTop_Night_2_en.png b/tests/uitests/src/test/snapshots/images/libraries.designsystem.components.avatar_AvatarRowLastOnTop_Night_2_en.png new file mode 100644 index 0000000000..05f3548b6d --- /dev/null +++ b/tests/uitests/src/test/snapshots/images/libraries.designsystem.components.avatar_AvatarRowLastOnTop_Night_2_en.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:489cf3807e915dff5ff19458166ab12379002edc42f745e28ae40d151316ed72 +size 8143 diff --git a/tests/uitests/src/test/snapshots/images/libraries.designsystem.components.avatar_AvatarRowLastOnTop_Night_3_en.png b/tests/uitests/src/test/snapshots/images/libraries.designsystem.components.avatar_AvatarRowLastOnTop_Night_3_en.png new file mode 100644 index 0000000000..122b31372c --- /dev/null +++ b/tests/uitests/src/test/snapshots/images/libraries.designsystem.components.avatar_AvatarRowLastOnTop_Night_3_en.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:dc8bd17e8101352a0bdf542b1fe2ef0de85aa44f78afeb582d7ee18af4d9af75 +size 7491 diff --git a/tests/uitests/src/test/snapshots/images/libraries.designsystem.components.avatar_AvatarRowLastOnTop_Night_4_en.png b/tests/uitests/src/test/snapshots/images/libraries.designsystem.components.avatar_AvatarRowLastOnTop_Night_4_en.png new file mode 100644 index 0000000000..083f8a317f --- /dev/null +++ b/tests/uitests/src/test/snapshots/images/libraries.designsystem.components.avatar_AvatarRowLastOnTop_Night_4_en.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:a9f18b956d5280c31a4fae4754ddd8c2300e37580dd477b06ed043e198b08fa3 +size 5655 diff --git a/tests/uitests/src/test/snapshots/images/libraries.designsystem.components.avatar_AvatarRowRtl_Day_0_en.png b/tests/uitests/src/test/snapshots/images/libraries.designsystem.components.avatar_AvatarRowRtl_Day_0_en.png new file mode 100644 index 0000000000..8872565657 --- /dev/null +++ b/tests/uitests/src/test/snapshots/images/libraries.designsystem.components.avatar_AvatarRowRtl_Day_0_en.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:781862888b73f9bb0948758783a3987d2e04ac2e0690996cdc913b09e4d7283c +size 8645 diff --git a/tests/uitests/src/test/snapshots/images/features.knockrequests.impl.banner_AvatarRowRtl_Day_1_en.png b/tests/uitests/src/test/snapshots/images/libraries.designsystem.components.avatar_AvatarRowRtl_Day_1_en.png similarity index 100% rename from tests/uitests/src/test/snapshots/images/features.knockrequests.impl.banner_AvatarRowRtl_Day_1_en.png rename to tests/uitests/src/test/snapshots/images/libraries.designsystem.components.avatar_AvatarRowRtl_Day_1_en.png diff --git a/tests/uitests/src/test/snapshots/images/features.knockrequests.impl.banner_AvatarRowRtl_Day_2_en.png b/tests/uitests/src/test/snapshots/images/libraries.designsystem.components.avatar_AvatarRowRtl_Day_2_en.png similarity index 100% rename from tests/uitests/src/test/snapshots/images/features.knockrequests.impl.banner_AvatarRowRtl_Day_2_en.png rename to tests/uitests/src/test/snapshots/images/libraries.designsystem.components.avatar_AvatarRowRtl_Day_2_en.png diff --git a/tests/uitests/src/test/snapshots/images/features.knockrequests.impl.banner_AvatarRowRtl_Day_3_en.png b/tests/uitests/src/test/snapshots/images/libraries.designsystem.components.avatar_AvatarRowRtl_Day_3_en.png similarity index 100% rename from tests/uitests/src/test/snapshots/images/features.knockrequests.impl.banner_AvatarRowRtl_Day_3_en.png rename to tests/uitests/src/test/snapshots/images/libraries.designsystem.components.avatar_AvatarRowRtl_Day_3_en.png diff --git a/tests/uitests/src/test/snapshots/images/features.knockrequests.impl.banner_AvatarRowRtl_Day_4_en.png b/tests/uitests/src/test/snapshots/images/libraries.designsystem.components.avatar_AvatarRowRtl_Day_4_en.png similarity index 100% rename from tests/uitests/src/test/snapshots/images/features.knockrequests.impl.banner_AvatarRowRtl_Day_4_en.png rename to tests/uitests/src/test/snapshots/images/libraries.designsystem.components.avatar_AvatarRowRtl_Day_4_en.png diff --git a/tests/uitests/src/test/snapshots/images/libraries.designsystem.components.avatar_AvatarRowRtl_Night_0_en.png b/tests/uitests/src/test/snapshots/images/libraries.designsystem.components.avatar_AvatarRowRtl_Night_0_en.png new file mode 100644 index 0000000000..f3df67ab02 --- /dev/null +++ b/tests/uitests/src/test/snapshots/images/libraries.designsystem.components.avatar_AvatarRowRtl_Night_0_en.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:21edc3161193318e2b1ca0a6b1136b76616011b3eb3bf0a3308f81b9c9038303 +size 8957 diff --git a/tests/uitests/src/test/snapshots/images/features.knockrequests.impl.banner_AvatarRowRtl_Night_1_en.png b/tests/uitests/src/test/snapshots/images/libraries.designsystem.components.avatar_AvatarRowRtl_Night_1_en.png similarity index 100% rename from tests/uitests/src/test/snapshots/images/features.knockrequests.impl.banner_AvatarRowRtl_Night_1_en.png rename to tests/uitests/src/test/snapshots/images/libraries.designsystem.components.avatar_AvatarRowRtl_Night_1_en.png diff --git a/tests/uitests/src/test/snapshots/images/features.knockrequests.impl.banner_AvatarRowRtl_Night_2_en.png b/tests/uitests/src/test/snapshots/images/libraries.designsystem.components.avatar_AvatarRowRtl_Night_2_en.png similarity index 100% rename from tests/uitests/src/test/snapshots/images/features.knockrequests.impl.banner_AvatarRowRtl_Night_2_en.png rename to tests/uitests/src/test/snapshots/images/libraries.designsystem.components.avatar_AvatarRowRtl_Night_2_en.png diff --git a/tests/uitests/src/test/snapshots/images/features.knockrequests.impl.banner_AvatarRowRtl_Night_3_en.png b/tests/uitests/src/test/snapshots/images/libraries.designsystem.components.avatar_AvatarRowRtl_Night_3_en.png similarity index 100% rename from tests/uitests/src/test/snapshots/images/features.knockrequests.impl.banner_AvatarRowRtl_Night_3_en.png rename to tests/uitests/src/test/snapshots/images/libraries.designsystem.components.avatar_AvatarRowRtl_Night_3_en.png diff --git a/tests/uitests/src/test/snapshots/images/features.knockrequests.impl.banner_AvatarRowRtl_Night_4_en.png b/tests/uitests/src/test/snapshots/images/libraries.designsystem.components.avatar_AvatarRowRtl_Night_4_en.png similarity index 100% rename from tests/uitests/src/test/snapshots/images/features.knockrequests.impl.banner_AvatarRowRtl_Night_4_en.png rename to tests/uitests/src/test/snapshots/images/libraries.designsystem.components.avatar_AvatarRowRtl_Night_4_en.png diff --git a/tests/uitests/src/test/snapshots/images/libraries.designsystem.components.avatar_AvatarRow_Day_0_en.png b/tests/uitests/src/test/snapshots/images/libraries.designsystem.components.avatar_AvatarRow_Day_0_en.png new file mode 100644 index 0000000000..a6f19f722c --- /dev/null +++ b/tests/uitests/src/test/snapshots/images/libraries.designsystem.components.avatar_AvatarRow_Day_0_en.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:7dc701122587804c0e8fe5e238dbfdddd0c93cb3a15c50eab2b0439a8b0a8f86 +size 8638 diff --git a/tests/uitests/src/test/snapshots/images/features.knockrequests.impl.banner_AvatarRow_Day_1_en.png b/tests/uitests/src/test/snapshots/images/libraries.designsystem.components.avatar_AvatarRow_Day_1_en.png similarity index 100% rename from tests/uitests/src/test/snapshots/images/features.knockrequests.impl.banner_AvatarRow_Day_1_en.png rename to tests/uitests/src/test/snapshots/images/libraries.designsystem.components.avatar_AvatarRow_Day_1_en.png diff --git a/tests/uitests/src/test/snapshots/images/features.knockrequests.impl.banner_AvatarRow_Day_2_en.png b/tests/uitests/src/test/snapshots/images/libraries.designsystem.components.avatar_AvatarRow_Day_2_en.png similarity index 100% rename from tests/uitests/src/test/snapshots/images/features.knockrequests.impl.banner_AvatarRow_Day_2_en.png rename to tests/uitests/src/test/snapshots/images/libraries.designsystem.components.avatar_AvatarRow_Day_2_en.png diff --git a/tests/uitests/src/test/snapshots/images/features.knockrequests.impl.banner_AvatarRow_Day_3_en.png b/tests/uitests/src/test/snapshots/images/libraries.designsystem.components.avatar_AvatarRow_Day_3_en.png similarity index 100% rename from tests/uitests/src/test/snapshots/images/features.knockrequests.impl.banner_AvatarRow_Day_3_en.png rename to tests/uitests/src/test/snapshots/images/libraries.designsystem.components.avatar_AvatarRow_Day_3_en.png diff --git a/tests/uitests/src/test/snapshots/images/features.knockrequests.impl.banner_AvatarRow_Day_4_en.png b/tests/uitests/src/test/snapshots/images/libraries.designsystem.components.avatar_AvatarRow_Day_4_en.png similarity index 100% rename from tests/uitests/src/test/snapshots/images/features.knockrequests.impl.banner_AvatarRow_Day_4_en.png rename to tests/uitests/src/test/snapshots/images/libraries.designsystem.components.avatar_AvatarRow_Day_4_en.png diff --git a/tests/uitests/src/test/snapshots/images/libraries.designsystem.components.avatar_AvatarRow_Night_0_en.png b/tests/uitests/src/test/snapshots/images/libraries.designsystem.components.avatar_AvatarRow_Night_0_en.png new file mode 100644 index 0000000000..0cf7f398fa --- /dev/null +++ b/tests/uitests/src/test/snapshots/images/libraries.designsystem.components.avatar_AvatarRow_Night_0_en.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:25262fd5004a941229d6404d73cbacb8c10b4c009b519acb07584eada553bf22 +size 8946 diff --git a/tests/uitests/src/test/snapshots/images/features.knockrequests.impl.banner_AvatarRow_Night_1_en.png b/tests/uitests/src/test/snapshots/images/libraries.designsystem.components.avatar_AvatarRow_Night_1_en.png similarity index 100% rename from tests/uitests/src/test/snapshots/images/features.knockrequests.impl.banner_AvatarRow_Night_1_en.png rename to tests/uitests/src/test/snapshots/images/libraries.designsystem.components.avatar_AvatarRow_Night_1_en.png diff --git a/tests/uitests/src/test/snapshots/images/features.knockrequests.impl.banner_AvatarRow_Night_2_en.png b/tests/uitests/src/test/snapshots/images/libraries.designsystem.components.avatar_AvatarRow_Night_2_en.png similarity index 100% rename from tests/uitests/src/test/snapshots/images/features.knockrequests.impl.banner_AvatarRow_Night_2_en.png rename to tests/uitests/src/test/snapshots/images/libraries.designsystem.components.avatar_AvatarRow_Night_2_en.png diff --git a/tests/uitests/src/test/snapshots/images/features.knockrequests.impl.banner_AvatarRow_Night_3_en.png b/tests/uitests/src/test/snapshots/images/libraries.designsystem.components.avatar_AvatarRow_Night_3_en.png similarity index 100% rename from tests/uitests/src/test/snapshots/images/features.knockrequests.impl.banner_AvatarRow_Night_3_en.png rename to tests/uitests/src/test/snapshots/images/libraries.designsystem.components.avatar_AvatarRow_Night_3_en.png diff --git a/tests/uitests/src/test/snapshots/images/features.knockrequests.impl.banner_AvatarRow_Night_4_en.png b/tests/uitests/src/test/snapshots/images/libraries.designsystem.components.avatar_AvatarRow_Night_4_en.png similarity index 100% rename from tests/uitests/src/test/snapshots/images/features.knockrequests.impl.banner_AvatarRow_Night_4_en.png rename to tests/uitests/src/test/snapshots/images/libraries.designsystem.components.avatar_AvatarRow_Night_4_en.png diff --git a/tests/uitests/src/test/snapshots/images/libraries.designsystem.components.avatar_Avatar_Avatars_100_en.png b/tests/uitests/src/test/snapshots/images/libraries.designsystem.components.avatar_Avatar_Avatars_100_en.png new file mode 100644 index 0000000000..0b12b366b9 --- /dev/null +++ b/tests/uitests/src/test/snapshots/images/libraries.designsystem.components.avatar_Avatar_Avatars_100_en.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:6a4d295ae71ba2709845312b84983b79348069ded46b30091b9fa769a587cbb7 +size 14337 diff --git a/tests/uitests/src/test/snapshots/images/libraries.designsystem.components.avatar_Avatar_Avatars_101_en.png b/tests/uitests/src/test/snapshots/images/libraries.designsystem.components.avatar_Avatar_Avatars_101_en.png new file mode 100644 index 0000000000..556cb141b0 --- /dev/null +++ b/tests/uitests/src/test/snapshots/images/libraries.designsystem.components.avatar_Avatar_Avatars_101_en.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:da8f54591a52475c6f47fa083a1bb397e1164dd3e735562388fde4ff45644150 +size 16275 diff --git a/tests/uitests/src/test/snapshots/images/libraries.designsystem.components.avatar_Avatar_Avatars_24_en.png b/tests/uitests/src/test/snapshots/images/libraries.designsystem.components.avatar_Avatar_Avatars_24_en.png index 1ff3833c32..d4d332376b 100644 --- a/tests/uitests/src/test/snapshots/images/libraries.designsystem.components.avatar_Avatar_Avatars_24_en.png +++ b/tests/uitests/src/test/snapshots/images/libraries.designsystem.components.avatar_Avatar_Avatars_24_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:1e6b4ed2799c9ef83eae30e4f99896f6a78808be7d897c53de1a35c8828b477c -size 17135 +oid sha256:f05acb090eb967a126bb1c4741f763bc7ba254e2d32641d7f6b7d0c3888f5f44 +size 16522 diff --git a/tests/uitests/src/test/snapshots/images/libraries.designsystem.components.avatar_Avatar_Avatars_25_en.png b/tests/uitests/src/test/snapshots/images/libraries.designsystem.components.avatar_Avatar_Avatars_25_en.png index 33e4130eae..9c52eff9b0 100644 --- a/tests/uitests/src/test/snapshots/images/libraries.designsystem.components.avatar_Avatar_Avatars_25_en.png +++ b/tests/uitests/src/test/snapshots/images/libraries.designsystem.components.avatar_Avatar_Avatars_25_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:964d9951c9b8ff644c0961268a4299634b70e5915ac23c37369198ddd0568845 -size 15822 +oid sha256:408498059aa91ae83ec3617172dd1af1ace78c99b172c3da1895d125965a4bd6 +size 15272 diff --git a/tests/uitests/src/test/snapshots/images/libraries.designsystem.components.avatar_Avatar_Avatars_26_en.png b/tests/uitests/src/test/snapshots/images/libraries.designsystem.components.avatar_Avatar_Avatars_26_en.png index 227ccb638c..8c2a67e4f4 100644 --- a/tests/uitests/src/test/snapshots/images/libraries.designsystem.components.avatar_Avatar_Avatars_26_en.png +++ b/tests/uitests/src/test/snapshots/images/libraries.designsystem.components.avatar_Avatar_Avatars_26_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:3961ff50b6a6604c4da84be949d25a66ac9a511c9abe4af64cff239e8febb1e6 -size 20742 +oid sha256:884eb2d69af3e1d91fddcbcd7173ac547530e5f3439ad2edc3df6cdbbc5ac312 +size 19914 diff --git a/tests/uitests/src/test/snapshots/images/libraries.designsystem.components.avatar_Avatar_Avatars_93_en.png b/tests/uitests/src/test/snapshots/images/libraries.designsystem.components.avatar_Avatar_Avatars_93_en.png new file mode 100644 index 0000000000..3eeb6f47e4 --- /dev/null +++ b/tests/uitests/src/test/snapshots/images/libraries.designsystem.components.avatar_Avatar_Avatars_93_en.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:90982bf0b723b89c9b070c1dc94eb5a9fcf66623c382d496174f026e053929fb +size 19493 diff --git a/tests/uitests/src/test/snapshots/images/libraries.designsystem.components.avatar_Avatar_Avatars_94_en.png b/tests/uitests/src/test/snapshots/images/libraries.designsystem.components.avatar_Avatar_Avatars_94_en.png new file mode 100644 index 0000000000..eee5b83831 --- /dev/null +++ b/tests/uitests/src/test/snapshots/images/libraries.designsystem.components.avatar_Avatar_Avatars_94_en.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:9640e8e6d758a03f995c7fbbb6c3c123109594138a7cc53d5416ef5e3e157693 +size 18006 diff --git a/tests/uitests/src/test/snapshots/images/libraries.designsystem.components.avatar_Avatar_Avatars_95_en.png b/tests/uitests/src/test/snapshots/images/libraries.designsystem.components.avatar_Avatar_Avatars_95_en.png new file mode 100644 index 0000000000..70c84280d6 --- /dev/null +++ b/tests/uitests/src/test/snapshots/images/libraries.designsystem.components.avatar_Avatar_Avatars_95_en.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:fbe699fb17947981c53d47a9570da71e2388ec493a3a9471aaa13a5405075069 +size 23421 diff --git a/tests/uitests/src/test/snapshots/images/libraries.designsystem.components.avatar_Avatar_Avatars_96_en.png b/tests/uitests/src/test/snapshots/images/libraries.designsystem.components.avatar_Avatar_Avatars_96_en.png new file mode 100644 index 0000000000..f4e93c12ae --- /dev/null +++ b/tests/uitests/src/test/snapshots/images/libraries.designsystem.components.avatar_Avatar_Avatars_96_en.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:8c6688901f89d3858ec67dda889fe589fb6b59202c64a4b700c2aa484e19f4cd +size 17606 diff --git a/tests/uitests/src/test/snapshots/images/libraries.designsystem.components.avatar_Avatar_Avatars_97_en.png b/tests/uitests/src/test/snapshots/images/libraries.designsystem.components.avatar_Avatar_Avatars_97_en.png new file mode 100644 index 0000000000..53dbe79213 --- /dev/null +++ b/tests/uitests/src/test/snapshots/images/libraries.designsystem.components.avatar_Avatar_Avatars_97_en.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:26b9908bbd388321444037dcc1aae55037d3dabc7a9f9b14c39ba871f4f9d593 +size 16128 diff --git a/tests/uitests/src/test/snapshots/images/libraries.designsystem.components.avatar_Avatar_Avatars_98_en.png b/tests/uitests/src/test/snapshots/images/libraries.designsystem.components.avatar_Avatar_Avatars_98_en.png new file mode 100644 index 0000000000..9c9b3d4717 --- /dev/null +++ b/tests/uitests/src/test/snapshots/images/libraries.designsystem.components.avatar_Avatar_Avatars_98_en.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:1a96b6d95b8941d80035b309444b9eaa038098fb16aa84dec209fc3ee215ac9e +size 21687 diff --git a/tests/uitests/src/test/snapshots/images/libraries.designsystem.components.avatar_Avatar_Avatars_99_en.png b/tests/uitests/src/test/snapshots/images/libraries.designsystem.components.avatar_Avatar_Avatars_99_en.png new file mode 100644 index 0000000000..7946dc4e91 --- /dev/null +++ b/tests/uitests/src/test/snapshots/images/libraries.designsystem.components.avatar_Avatar_Avatars_99_en.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:ce1aba18ea8a6b45d9c40de9af961952e261c7c6200ab13cdfa67906d995208b +size 14888 diff --git a/tests/uitests/src/test/snapshots/images/libraries.matrix.ui.components_CheckableResolvedUserRow_en.png b/tests/uitests/src/test/snapshots/images/libraries.matrix.ui.components_CheckableResolvedUserRow_en.png index b54e3cf78d..7b98ed1529 100644 --- a/tests/uitests/src/test/snapshots/images/libraries.matrix.ui.components_CheckableResolvedUserRow_en.png +++ b/tests/uitests/src/test/snapshots/images/libraries.matrix.ui.components_CheckableResolvedUserRow_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:fa11bdf391701b6d4087506cc9b46545199185f3df661d6edfd19020ca5af7ab -size 51356 +oid sha256:10796b9478b53030d106b092242b2fb29432306c975cba899a4a803468a102b2 +size 50455 diff --git a/tests/uitests/src/test/snapshots/images/libraries.matrix.ui.components_CheckableUnresolvedUserRow_en.png b/tests/uitests/src/test/snapshots/images/libraries.matrix.ui.components_CheckableUnresolvedUserRow_en.png index 417fb60979..0bc23ac100 100644 --- a/tests/uitests/src/test/snapshots/images/libraries.matrix.ui.components_CheckableUnresolvedUserRow_en.png +++ b/tests/uitests/src/test/snapshots/images/libraries.matrix.ui.components_CheckableUnresolvedUserRow_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:dd65f1e18c78ea369ffa811236db1aafc35acd83a34e2d7858e888d8097edad4 -size 112005 +oid sha256:68571ead8897090de9308062686d608333d9145640214d0f5661d87460007b90 +size 108334 diff --git a/tests/uitests/src/test/snapshots/images/libraries.matrix.ui.components_EditableOrgAvatarRtl_Day_0_en.png b/tests/uitests/src/test/snapshots/images/libraries.matrix.ui.components_EditableOrgAvatarRtl_Day_0_en.png new file mode 100644 index 0000000000..7bff485c2a --- /dev/null +++ b/tests/uitests/src/test/snapshots/images/libraries.matrix.ui.components_EditableOrgAvatarRtl_Day_0_en.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:2b9bd735000eda1054294863bdff79d32b391e1511f025bdc05ba4374be3f27c +size 31769 diff --git a/tests/uitests/src/test/snapshots/images/libraries.matrix.ui.components_EditableOrgAvatarRtl_Night_0_en.png b/tests/uitests/src/test/snapshots/images/libraries.matrix.ui.components_EditableOrgAvatarRtl_Night_0_en.png new file mode 100644 index 0000000000..8b36a5e259 --- /dev/null +++ b/tests/uitests/src/test/snapshots/images/libraries.matrix.ui.components_EditableOrgAvatarRtl_Night_0_en.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:8da76de0773fc62f7eb73dd16756d6ccad8229db121eb39d43f7c27d4ab8b48b +size 31339 diff --git a/tests/uitests/src/test/snapshots/images/libraries.matrix.ui.components_EditableOrgAvatar_Day_0_en.png b/tests/uitests/src/test/snapshots/images/libraries.matrix.ui.components_EditableOrgAvatar_Day_0_en.png new file mode 100644 index 0000000000..1771b0fbd9 --- /dev/null +++ b/tests/uitests/src/test/snapshots/images/libraries.matrix.ui.components_EditableOrgAvatar_Day_0_en.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:9a7773c27cc488967a4c8c526f4d19ca3a78e15c1efa2f7267881c2e9798d5c4 +size 31223 diff --git a/tests/uitests/src/test/snapshots/images/libraries.matrix.ui.components_EditableOrgAvatar_Night_0_en.png b/tests/uitests/src/test/snapshots/images/libraries.matrix.ui.components_EditableOrgAvatar_Night_0_en.png new file mode 100644 index 0000000000..5b5950e4c3 --- /dev/null +++ b/tests/uitests/src/test/snapshots/images/libraries.matrix.ui.components_EditableOrgAvatar_Night_0_en.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:6b5b92e446d5968fb115e49b2b2337a46a9a7f43577413924e7a1b1f3b752646 +size 30692 diff --git a/tests/uitests/src/test/snapshots/images/libraries.matrix.ui.components_OrganizationHeader_Day_0_en.png b/tests/uitests/src/test/snapshots/images/libraries.matrix.ui.components_OrganizationHeader_Day_0_en.png new file mode 100644 index 0000000000..b4bf34b446 --- /dev/null +++ b/tests/uitests/src/test/snapshots/images/libraries.matrix.ui.components_OrganizationHeader_Day_0_en.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:862a2a93700999b27dbdf461e70d2e97441550795d03ccb3e4ec4f964d3d6d99 +size 41995 diff --git a/tests/uitests/src/test/snapshots/images/libraries.matrix.ui.components_OrganizationHeader_Night_0_en.png b/tests/uitests/src/test/snapshots/images/libraries.matrix.ui.components_OrganizationHeader_Night_0_en.png new file mode 100644 index 0000000000..02e7b152fe --- /dev/null +++ b/tests/uitests/src/test/snapshots/images/libraries.matrix.ui.components_OrganizationHeader_Night_0_en.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:33f802e03011231b8ef81574b12e9622cf9d3901e3faf0225b8e745e88f50623 +size 41324 diff --git a/tests/uitests/src/test/snapshots/images/libraries.matrix.ui.components_SelectedRoomRtl_Day_0_en.png b/tests/uitests/src/test/snapshots/images/libraries.matrix.ui.components_SelectedRoomRtl_Day_0_en.png new file mode 100644 index 0000000000..185c02ca0d --- /dev/null +++ b/tests/uitests/src/test/snapshots/images/libraries.matrix.ui.components_SelectedRoomRtl_Day_0_en.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:096dea8789c339ce57121433a5ab07e4a8a387a00c2a1a7e2cae22864e194884 +size 7123 diff --git a/tests/uitests/src/test/snapshots/images/libraries.matrix.ui.components_SelectedRoomRtl_Day_1_en.png b/tests/uitests/src/test/snapshots/images/libraries.matrix.ui.components_SelectedRoomRtl_Day_1_en.png new file mode 100644 index 0000000000..8a801fee62 --- /dev/null +++ b/tests/uitests/src/test/snapshots/images/libraries.matrix.ui.components_SelectedRoomRtl_Day_1_en.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:4b7c8c2bb6fd65dc8309c5ce38620068064cf2b905f55024d45b730713664b39 +size 7930 diff --git a/tests/uitests/src/test/snapshots/images/libraries.matrix.ui.components_SelectedRoomRtl_Day_2_en.png b/tests/uitests/src/test/snapshots/images/libraries.matrix.ui.components_SelectedRoomRtl_Day_2_en.png new file mode 100644 index 0000000000..c7dab07045 --- /dev/null +++ b/tests/uitests/src/test/snapshots/images/libraries.matrix.ui.components_SelectedRoomRtl_Day_2_en.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:5537f922d2c5ed7b9a0984c8fc59d0a8714a8fd8c59f8f3ccfa4d86c0c031858 +size 24427 diff --git a/tests/uitests/src/test/snapshots/images/libraries.matrix.ui.components_SelectedRoomRtl_Night_0_en.png b/tests/uitests/src/test/snapshots/images/libraries.matrix.ui.components_SelectedRoomRtl_Night_0_en.png new file mode 100644 index 0000000000..ef8ef021d8 --- /dev/null +++ b/tests/uitests/src/test/snapshots/images/libraries.matrix.ui.components_SelectedRoomRtl_Night_0_en.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:dc6bee8dae3dad28e9c4c84f83c0cbb869ebdab62e1a423eddbc1acf5622fbeb +size 7372 diff --git a/tests/uitests/src/test/snapshots/images/libraries.matrix.ui.components_SelectedRoomRtl_Night_1_en.png b/tests/uitests/src/test/snapshots/images/libraries.matrix.ui.components_SelectedRoomRtl_Night_1_en.png new file mode 100644 index 0000000000..374c2c5d2b --- /dev/null +++ b/tests/uitests/src/test/snapshots/images/libraries.matrix.ui.components_SelectedRoomRtl_Night_1_en.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:7fdbaa1c4aecc9c5b8373d9ff22d88f8552ff40569961e246eced7b0cfcb98a7 +size 7831 diff --git a/tests/uitests/src/test/snapshots/images/libraries.matrix.ui.components_SelectedRoomRtl_Night_2_en.png b/tests/uitests/src/test/snapshots/images/libraries.matrix.ui.components_SelectedRoomRtl_Night_2_en.png new file mode 100644 index 0000000000..14dc55610e --- /dev/null +++ b/tests/uitests/src/test/snapshots/images/libraries.matrix.ui.components_SelectedRoomRtl_Night_2_en.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:6c661596938da606edbf9bab7951eb7b15f438c8af52bc5b8f915db640ebe6bc +size 24098 diff --git a/tests/uitests/src/test/snapshots/images/libraries.matrix.ui.components_SelectedRoom_Day_0_en.png b/tests/uitests/src/test/snapshots/images/libraries.matrix.ui.components_SelectedRoom_Day_0_en.png index 89e97a22be..2daf359887 100644 --- a/tests/uitests/src/test/snapshots/images/libraries.matrix.ui.components_SelectedRoom_Day_0_en.png +++ b/tests/uitests/src/test/snapshots/images/libraries.matrix.ui.components_SelectedRoom_Day_0_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:abb717c09558d42d3721c17d363d3ca67d3c9270b63aac6dcd7bd4663c7a427f -size 7025 +oid sha256:ddf94690a70ce16c5956acc02e799a9cf0e9a25a9e39e232ad29f62b7f42b10d +size 7146 diff --git a/tests/uitests/src/test/snapshots/images/libraries.matrix.ui.components_SelectedRoom_Day_1_en.png b/tests/uitests/src/test/snapshots/images/libraries.matrix.ui.components_SelectedRoom_Day_1_en.png index 794e9c6add..479ad32923 100644 --- a/tests/uitests/src/test/snapshots/images/libraries.matrix.ui.components_SelectedRoom_Day_1_en.png +++ b/tests/uitests/src/test/snapshots/images/libraries.matrix.ui.components_SelectedRoom_Day_1_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:7a1d3baf704ab9e59f7d209339634fdf3f9f531dfb8074403badce8249ef27a8 -size 8004 +oid sha256:50728380e53730d17d11f354f0922ef7d3918d91952a48ccbd80d150b7f9a561 +size 8019 diff --git a/tests/uitests/src/test/snapshots/images/libraries.matrix.ui.components_SelectedRoom_Day_2_en.png b/tests/uitests/src/test/snapshots/images/libraries.matrix.ui.components_SelectedRoom_Day_2_en.png index b761fc1f1b..9e3acefa43 100644 --- a/tests/uitests/src/test/snapshots/images/libraries.matrix.ui.components_SelectedRoom_Day_2_en.png +++ b/tests/uitests/src/test/snapshots/images/libraries.matrix.ui.components_SelectedRoom_Day_2_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:45f64462f82b00c81cc9e7ba0a264f7b678dd1ac46dcab2c31d1382467dddf26 -size 7876 +oid sha256:cdb4e762013d17daea7a3f5694131b59e503cbe5a37f47512b6a7e4029815eee +size 24169 diff --git a/tests/uitests/src/test/snapshots/images/libraries.matrix.ui.components_SelectedRoom_Night_0_en.png b/tests/uitests/src/test/snapshots/images/libraries.matrix.ui.components_SelectedRoom_Night_0_en.png index 807d730d9c..51083d077f 100644 --- a/tests/uitests/src/test/snapshots/images/libraries.matrix.ui.components_SelectedRoom_Night_0_en.png +++ b/tests/uitests/src/test/snapshots/images/libraries.matrix.ui.components_SelectedRoom_Night_0_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:3f555b8c5471938171fe161cbd48b0f3b1447a132432d4e9168594d6d0f01a82 -size 7228 +oid sha256:ad290caf59b3b03eb0c67e228bc8e24da846e1650d7442f147a2e973caa44b92 +size 7430 diff --git a/tests/uitests/src/test/snapshots/images/libraries.matrix.ui.components_SelectedRoom_Night_1_en.png b/tests/uitests/src/test/snapshots/images/libraries.matrix.ui.components_SelectedRoom_Night_1_en.png index dd4cb8561d..2d8b75a87c 100644 --- a/tests/uitests/src/test/snapshots/images/libraries.matrix.ui.components_SelectedRoom_Night_1_en.png +++ b/tests/uitests/src/test/snapshots/images/libraries.matrix.ui.components_SelectedRoom_Night_1_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:f25f643f1b578dbf88bbb9c0e4c95c49fb74d629733540fd25bba3bdb0ec536d -size 7881 +oid sha256:b7f2bb6aaa4385cb230884fcd41df28ac38a88e12cc30fb215812fca82324deb +size 7922 diff --git a/tests/uitests/src/test/snapshots/images/libraries.matrix.ui.components_SelectedRoom_Night_2_en.png b/tests/uitests/src/test/snapshots/images/libraries.matrix.ui.components_SelectedRoom_Night_2_en.png index 8230305620..01fa7b6759 100644 --- a/tests/uitests/src/test/snapshots/images/libraries.matrix.ui.components_SelectedRoom_Night_2_en.png +++ b/tests/uitests/src/test/snapshots/images/libraries.matrix.ui.components_SelectedRoom_Night_2_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:6e30bf215242fb5ffbbbcea02884c553af162f804405d6b795c9f68bbf125df4 -size 8013 +oid sha256:c8a72f53dc0c94e364d094f2bf911e9d39777d51c81e02e384c868e03a3df198 +size 23860 diff --git a/tests/uitests/src/test/snapshots/images/libraries.matrix.ui.components_SelectedUserCannotRemove_Day_0_en.png b/tests/uitests/src/test/snapshots/images/libraries.matrix.ui.components_SelectedUserCannotRemove_Day_0_en.png index 2772dadd09..06b1bff9e1 100644 --- a/tests/uitests/src/test/snapshots/images/libraries.matrix.ui.components_SelectedUserCannotRemove_Day_0_en.png +++ b/tests/uitests/src/test/snapshots/images/libraries.matrix.ui.components_SelectedUserCannotRemove_Day_0_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:04aa402d8d9d9c72217360411325b31e0abf21a0fc0a911014427aad7997c88a -size 6583 +oid sha256:f06ddb8fcf8c74676103b0af9df6e9a8ef38b1c3627abe55c9e7edc28ccdcb13 +size 6305 diff --git a/tests/uitests/src/test/snapshots/images/libraries.matrix.ui.components_SelectedUserCannotRemove_Night_0_en.png b/tests/uitests/src/test/snapshots/images/libraries.matrix.ui.components_SelectedUserCannotRemove_Night_0_en.png index f7869189b3..85b09d13ef 100644 --- a/tests/uitests/src/test/snapshots/images/libraries.matrix.ui.components_SelectedUserCannotRemove_Night_0_en.png +++ b/tests/uitests/src/test/snapshots/images/libraries.matrix.ui.components_SelectedUserCannotRemove_Night_0_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:cfda3f200fba0a6cf49cf4f37b4c1cf4f04dd9b8fc3e129e2e72c94b3631256b -size 7083 +oid sha256:d15c2a561e06890c7959f9000f73037cdd957c91f8a26066ac7620fecf635b82 +size 6762 diff --git a/tests/uitests/src/test/snapshots/images/libraries.matrix.ui.components_SelectedUserRtl_Day_0_en.png b/tests/uitests/src/test/snapshots/images/libraries.matrix.ui.components_SelectedUserRtl_Day_0_en.png new file mode 100644 index 0000000000..6c272ba624 --- /dev/null +++ b/tests/uitests/src/test/snapshots/images/libraries.matrix.ui.components_SelectedUserRtl_Day_0_en.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:08493cd3243d38eeac09a13e4fb5db97361bf5677db251cd4b5887b595379ec5 +size 7700 diff --git a/tests/uitests/src/test/snapshots/images/libraries.matrix.ui.components_SelectedUserRtl_Night_0_en.png b/tests/uitests/src/test/snapshots/images/libraries.matrix.ui.components_SelectedUserRtl_Night_0_en.png new file mode 100644 index 0000000000..11ee6b2140 --- /dev/null +++ b/tests/uitests/src/test/snapshots/images/libraries.matrix.ui.components_SelectedUserRtl_Night_0_en.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:ec043b99fa7a6a622784a17914369f499feef1818501e582c345c0ecd8a9f398 +size 8132 diff --git a/tests/uitests/src/test/snapshots/images/libraries.matrix.ui.components_SelectedUser_Day_0_en.png b/tests/uitests/src/test/snapshots/images/libraries.matrix.ui.components_SelectedUser_Day_0_en.png index 91d5c7f9bb..da73aeee9a 100644 --- a/tests/uitests/src/test/snapshots/images/libraries.matrix.ui.components_SelectedUser_Day_0_en.png +++ b/tests/uitests/src/test/snapshots/images/libraries.matrix.ui.components_SelectedUser_Day_0_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:2a067fd04c656418bc184355a1a756f09b2648bc1bb33b2f32a4c0c4a701c7b6 -size 7811 +oid sha256:eca67b4cb2a2fd6526bf9fa6fd89b643fcd2c227c5abed2c4f32db81617130c8 +size 7723 diff --git a/tests/uitests/src/test/snapshots/images/libraries.matrix.ui.components_SelectedUser_Day_1_en.png b/tests/uitests/src/test/snapshots/images/libraries.matrix.ui.components_SelectedUser_Day_1_en.png new file mode 100644 index 0000000000..2db6c5ef59 --- /dev/null +++ b/tests/uitests/src/test/snapshots/images/libraries.matrix.ui.components_SelectedUser_Day_1_en.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:d8ae13a72c3bd657db2a1d927856d74103e5e046cdf22b7dd6b887f77cd19f5c +size 21442 diff --git a/tests/uitests/src/test/snapshots/images/libraries.matrix.ui.components_SelectedUser_Night_0_en.png b/tests/uitests/src/test/snapshots/images/libraries.matrix.ui.components_SelectedUser_Night_0_en.png index 9ec6fcd049..05a4c7f73a 100644 --- a/tests/uitests/src/test/snapshots/images/libraries.matrix.ui.components_SelectedUser_Night_0_en.png +++ b/tests/uitests/src/test/snapshots/images/libraries.matrix.ui.components_SelectedUser_Night_0_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:8d6ba66c26f575c6e7e36bd71cc20c99b31f65472e6b4f39fb1de8300b6ff2d8 -size 8238 +oid sha256:71f623b4b4ffdd5b1be1e94e12ba908f323b809559f62b6c9948e2d76ddf127a +size 8142 diff --git a/tests/uitests/src/test/snapshots/images/libraries.matrix.ui.components_SelectedUser_Night_1_en.png b/tests/uitests/src/test/snapshots/images/libraries.matrix.ui.components_SelectedUser_Night_1_en.png new file mode 100644 index 0000000000..9f2748820c --- /dev/null +++ b/tests/uitests/src/test/snapshots/images/libraries.matrix.ui.components_SelectedUser_Night_1_en.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:4e40a4a4a8db9c2b60b91bd1478c7555534d3a3473e06489d547925f8a9771b1 +size 21203 diff --git a/tests/uitests/src/test/snapshots/images/libraries.matrix.ui.components_SelectedUsersRowList_Day_0_en.png b/tests/uitests/src/test/snapshots/images/libraries.matrix.ui.components_SelectedUsersRowList_Day_0_en.png index a7e88bb39d..2e9cdfa5ca 100644 --- a/tests/uitests/src/test/snapshots/images/libraries.matrix.ui.components_SelectedUsersRowList_Day_0_en.png +++ b/tests/uitests/src/test/snapshots/images/libraries.matrix.ui.components_SelectedUsersRowList_Day_0_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:fbf5b5e97c523c2e60619143bef719166b03344461e03cd9e7dff66f2e175e86 -size 63066 +oid sha256:c68ddf678e534f385f03565cc764c276a10b3af2a3292de775740157d1ca88c2 +size 66549 diff --git a/tests/uitests/src/test/snapshots/images/libraries.matrix.ui.components_SelectedUsersRowList_Night_0_en.png b/tests/uitests/src/test/snapshots/images/libraries.matrix.ui.components_SelectedUsersRowList_Night_0_en.png index 3e92d31ab2..1b883b8781 100644 --- a/tests/uitests/src/test/snapshots/images/libraries.matrix.ui.components_SelectedUsersRowList_Night_0_en.png +++ b/tests/uitests/src/test/snapshots/images/libraries.matrix.ui.components_SelectedUsersRowList_Night_0_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:9bdc7f7d67648ba8cce2479c78707aad05244e9b2b20ef44547f0c989629a10b -size 67126 +oid sha256:fdec02458ef526f62be74baf71f6539d266592267e93c61e20f035b7528fc65b +size 71172 diff --git a/tests/uitests/src/test/snapshots/images/libraries.matrix.ui.components_SpaceHeaderView_Day_0_en.png b/tests/uitests/src/test/snapshots/images/libraries.matrix.ui.components_SpaceHeaderView_Day_0_en.png new file mode 100644 index 0000000000..785ed41190 --- /dev/null +++ b/tests/uitests/src/test/snapshots/images/libraries.matrix.ui.components_SpaceHeaderView_Day_0_en.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:ebb657ce2227ccefcf9055c8c90342d6581ac0d916cd9f7e6a4990fa2bdc4177 +size 61352 diff --git a/tests/uitests/src/test/snapshots/images/libraries.matrix.ui.components_SpaceHeaderView_Night_0_en.png b/tests/uitests/src/test/snapshots/images/libraries.matrix.ui.components_SpaceHeaderView_Night_0_en.png new file mode 100644 index 0000000000..e9329548e3 --- /dev/null +++ b/tests/uitests/src/test/snapshots/images/libraries.matrix.ui.components_SpaceHeaderView_Night_0_en.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:97c8ea5d2d83222ee16c0a27c783e04ec12dbd26aff427c28a21c9c581ad057d +size 60558 diff --git a/tests/uitests/src/test/snapshots/images/libraries.matrix.ui.components_SpaceInfoRow_Day_0_en.png b/tests/uitests/src/test/snapshots/images/libraries.matrix.ui.components_SpaceInfoRow_Day_0_en.png new file mode 100644 index 0000000000..7138e2aa39 --- /dev/null +++ b/tests/uitests/src/test/snapshots/images/libraries.matrix.ui.components_SpaceInfoRow_Day_0_en.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:0e4684cfbe7611d6c68879ddd7da5c57aa542b9f8b9250caf5f27009cabaadb2 +size 22353 diff --git a/tests/uitests/src/test/snapshots/images/libraries.matrix.ui.components_SpaceInfoRow_Night_0_en.png b/tests/uitests/src/test/snapshots/images/libraries.matrix.ui.components_SpaceInfoRow_Night_0_en.png new file mode 100644 index 0000000000..38e9551bc3 --- /dev/null +++ b/tests/uitests/src/test/snapshots/images/libraries.matrix.ui.components_SpaceInfoRow_Night_0_en.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:4c7ad1861890262a67664d4e3b3e28d8a5d9ac4556ad029d1d5a387f61ac513f +size 21275 diff --git a/tests/uitests/src/test/snapshots/images/libraries.matrix.ui.components_SpaceMembersViewNoHeroes_Day_0_en.png b/tests/uitests/src/test/snapshots/images/libraries.matrix.ui.components_SpaceMembersViewNoHeroes_Day_0_en.png new file mode 100644 index 0000000000..937800912c --- /dev/null +++ b/tests/uitests/src/test/snapshots/images/libraries.matrix.ui.components_SpaceMembersViewNoHeroes_Day_0_en.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:9df673a4073b6806332b3181987f7ff0594eca818ef4a2b760136582d16de476 +size 6191 diff --git a/tests/uitests/src/test/snapshots/images/libraries.matrix.ui.components_SpaceMembersViewNoHeroes_Night_0_en.png b/tests/uitests/src/test/snapshots/images/libraries.matrix.ui.components_SpaceMembersViewNoHeroes_Night_0_en.png new file mode 100644 index 0000000000..44709bf2c1 --- /dev/null +++ b/tests/uitests/src/test/snapshots/images/libraries.matrix.ui.components_SpaceMembersViewNoHeroes_Night_0_en.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:c6a4bf38d356974df822f69f6de85b5b83b4622395c98b1c72d2d352b4e820ce +size 6093 diff --git a/tests/uitests/src/test/snapshots/images/libraries.matrix.ui.components_SpaceMembersView_Day_0_en.png b/tests/uitests/src/test/snapshots/images/libraries.matrix.ui.components_SpaceMembersView_Day_0_en.png new file mode 100644 index 0000000000..a855314980 --- /dev/null +++ b/tests/uitests/src/test/snapshots/images/libraries.matrix.ui.components_SpaceMembersView_Day_0_en.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:0df7c79b75dabc28fbae243d83547bb3786cb36eca0d33cabc38db0c40ffeb90 +size 6993 diff --git a/tests/uitests/src/test/snapshots/images/libraries.matrix.ui.components_SpaceMembersView_Night_0_en.png b/tests/uitests/src/test/snapshots/images/libraries.matrix.ui.components_SpaceMembersView_Night_0_en.png new file mode 100644 index 0000000000..2226a864e7 --- /dev/null +++ b/tests/uitests/src/test/snapshots/images/libraries.matrix.ui.components_SpaceMembersView_Night_0_en.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:f1c7cd3392fa7550edf07859f3e5c9a8e69c3e20ea784ac5acffcee5876a4dca +size 7312 diff --git a/tests/uitests/src/test/snapshots/images/libraries.matrix.ui.components_UnresolvedUserRow_en.png b/tests/uitests/src/test/snapshots/images/libraries.matrix.ui.components_UnresolvedUserRow_en.png index ab8e4739d9..41eed18ca5 100644 --- a/tests/uitests/src/test/snapshots/images/libraries.matrix.ui.components_UnresolvedUserRow_en.png +++ b/tests/uitests/src/test/snapshots/images/libraries.matrix.ui.components_UnresolvedUserRow_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:a79cb47ea2bfcbf7c8ef7101ce73c45c744c88f91d3aea9768586dcd591f89bd -size 30395 +oid sha256:cb1d078da743c900a512987314d72aac77fa6565fd28cc970d52443298c77605 +size 55164 diff --git a/tests/uitests/src/test/snapshots/images/libraries.matrix.ui.media_InitialsAvatarBitmapGenerator_Day_0_en.png b/tests/uitests/src/test/snapshots/images/libraries.matrix.ui.media_InitialsAvatarBitmapGenerator_Day_0_en.png new file mode 100644 index 0000000000..a277935539 --- /dev/null +++ b/tests/uitests/src/test/snapshots/images/libraries.matrix.ui.media_InitialsAvatarBitmapGenerator_Day_0_en.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:66bb008da1a5e258a021eb669d76b26c03217bd4cd3a09aeef7a6ab3247caab1 +size 6782 diff --git a/tests/uitests/src/test/snapshots/images/libraries.matrix.ui.media_InitialsAvatarBitmapGenerator_Night_0_en.png b/tests/uitests/src/test/snapshots/images/libraries.matrix.ui.media_InitialsAvatarBitmapGenerator_Night_0_en.png new file mode 100644 index 0000000000..9c96549e0d --- /dev/null +++ b/tests/uitests/src/test/snapshots/images/libraries.matrix.ui.media_InitialsAvatarBitmapGenerator_Night_0_en.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:0d29041afd1cbb103c5d426c7ea8a74d00fd86646c862800426bf37ed0befd59 +size 6776 diff --git a/tests/uitests/src/test/snapshots/images/libraries.roomselect.impl_RoomSelectView_Day_4_en.png b/tests/uitests/src/test/snapshots/images/libraries.roomselect.impl_RoomSelectView_Day_4_en.png index c65e09028a..1c637dc6d6 100644 --- a/tests/uitests/src/test/snapshots/images/libraries.roomselect.impl_RoomSelectView_Day_4_en.png +++ b/tests/uitests/src/test/snapshots/images/libraries.roomselect.impl_RoomSelectView_Day_4_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:3d5ca9e04e1501927fdc64a59ba18f65c24665645685c503964320531c3e96a0 -size 33716 +oid sha256:bc6c0bcba6d1f694473cf7bd9279a004acce376a84959d63c5a5d52b1322f3ef +size 33756 diff --git a/tests/uitests/src/test/snapshots/images/libraries.roomselect.impl_RoomSelectView_Night_4_en.png b/tests/uitests/src/test/snapshots/images/libraries.roomselect.impl_RoomSelectView_Night_4_en.png index 3b6de3a62b..43379b722d 100644 --- a/tests/uitests/src/test/snapshots/images/libraries.roomselect.impl_RoomSelectView_Night_4_en.png +++ b/tests/uitests/src/test/snapshots/images/libraries.roomselect.impl_RoomSelectView_Night_4_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:bb7eababcebb71de5cb61e515da4ec59be2937ca20090b49b94377a84c9e4f2c -size 33378 +oid sha256:e1d16b4735f630c40ea1ed23daf71f6914fda48fc8c70d35d50037c50e93c25a +size 33350 diff --git a/tools/localazy/config.json b/tools/localazy/config.json index 1f0d291d0b..0aac7e51af 100644 --- a/tools/localazy/config.json +++ b/tools/localazy/config.json @@ -59,10 +59,16 @@ "name" : ":features:createroom:impl", "includeRegex" : [ "screen_create_room_.*", - "screen\\.create_room\\..*", + "screen\\.create_room\\..*" + ] + }, + { + "name" : ":features:startchat:impl", + "includeRegex" : [ "screen_start_chat_.*", "screen\\.start_chat\\..*", - "screen_room_directory_search_title*" + "screen_room_directory_search_title", + "screen_create_room_action_create_room" ] }, { @@ -201,6 +207,12 @@ "screen_room_member_details_.*" ] }, + { + "name" : ":features:invitepeople:impl", + "includeRegex" : [ + "screen\\.invite_users\\..*" + ] + }, { "name" : ":features:messages:impl", "includeRegex" : [ diff --git a/tools/release/release.sh b/tools/release/release.sh index 4120a1da06..30d4cea205 100755 --- a/tools/release/release.sh +++ b/tools/release/release.sh @@ -64,7 +64,7 @@ fi # Read minSdkVersion from file plugins/src/main/kotlin/Versions.kt minSdkVersion=$(grep "MIN_SDK_FOSS =" ./plugins/src/main/kotlin/Versions.kt |cut -d '=' -f 2 |xargs) -buildToolsVersion="35.0.0" +buildToolsVersion="36.0.0" buildToolsPath="${androidHome}/build-tools/${buildToolsVersion}" if [[ ! -d ${buildToolsPath} ]]; then