diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 3b80134e52..da1299b035 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -25,7 +25,7 @@ jobs: group: ${{ github.ref == 'refs/heads/develop' && format('build-develop-{0}-{1}', matrix.variant, github.sha) || format('build-{0}-{1}', matrix.variant, github.ref) }} cancel-in-progress: true steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@v5 with: # Ensure we are building the branch and not the branch after being merged on develop # https://github.com/actions/checkout/issues/881 @@ -69,7 +69,7 @@ jobs: retention-days: 5 overwrite: true if-no-files-found: error - - uses: rnkdsh/action-upload-diawi@993c2e9f871486114a171cf7fb40554716dac3c5 # v1.5.10 + - uses: rnkdsh/action-upload-diawi@26292a7b424bdc9f4ab4ccea6202fc513f571370 # v1.5.11 id: diawi # Do not fail the whole build if Diawi upload fails continue-on-error: true diff --git a/.github/workflows/build_enterprise.yml b/.github/workflows/build_enterprise.yml index a1ec5063c0..bccdb84516 100644 --- a/.github/workflows/build_enterprise.yml +++ b/.github/workflows/build_enterprise.yml @@ -27,7 +27,7 @@ jobs: group: ${{ github.ref == 'refs/heads/develop' && format('build-develop-enterprise-{0}-{1}', matrix.variant, github.sha) || format('build-enterprise-{0}-{1}', matrix.variant, github.ref) }} cancel-in-progress: true steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@v5 with: # Ensure we are building the branch and not the branch after being merged on develop # https://github.com/actions/checkout/issues/881 diff --git a/.github/workflows/danger.yml b/.github/workflows/danger.yml index 9de62e104c..0868b0729f 100644 --- a/.github/workflows/danger.yml +++ b/.github/workflows/danger.yml @@ -9,7 +9,7 @@ jobs: # Skip in forks, it doesn't work even with the fallback token if: ${{ github.event_name != 'pull_request' || github.event.pull_request.head.repo.full_name == 'element-hq/element-x-android' }} steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@v5 - name: Add SSH private keys for submodule repositories uses: webfactory/ssh-agent@a6f90b1f127823b31d4d4a8d96047790581349bd # v0.9.1 with: diff --git a/.github/workflows/generate_github_pages.yml b/.github/workflows/generate_github_pages.yml index 1f5551ca8c..5fddd72eea 100644 --- a/.github/workflows/generate_github_pages.yml +++ b/.github/workflows/generate_github_pages.yml @@ -25,7 +25,7 @@ jobs: - name: Set up Python 3.12 uses: actions/setup-python@v5 with: - python-version: 3.12 + python-version: 3.13 - name: Run World screenshots generation script run: | ./tools/test/generateWorldScreenshots.py diff --git a/.github/workflows/gradle-wrapper-update.yml b/.github/workflows/gradle-wrapper-update.yml index dcc7bc5f0a..a9cb463629 100644 --- a/.github/workflows/gradle-wrapper-update.yml +++ b/.github/workflows/gradle-wrapper-update.yml @@ -11,7 +11,7 @@ jobs: # Skip in forks if: ${{ github.event_name != 'pull_request' || github.event.pull_request.head.repo.full_name == 'element-hq/element-x-android' }} steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@v5 - uses: actions/setup-java@v4 name: Use JDK 21 if: (github.event_name == 'pull_request' && github.event.pull_request.fork == null) || github.event_name == 'workflow_dispatch' diff --git a/.github/workflows/maestro-local.yml b/.github/workflows/maestro-local.yml index 9deb7c61b4..b784514d13 100644 --- a/.github/workflows/maestro-local.yml +++ b/.github/workflows/maestro-local.yml @@ -23,7 +23,7 @@ jobs: group: ${{ format('maestro-{0}', github.ref) }} cancel-in-progress: true steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@v5 with: # Ensure we are building the branch and not the branch after being merged on develop # https://github.com/actions/checkout/issues/881 @@ -62,7 +62,7 @@ jobs: group: ${{ format('maestro-{0}', github.ref) }} cancel-in-progress: true steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@v5 if: (github.event_name == 'pull_request' && github.event.pull_request.fork == null) || github.event_name == 'workflow_dispatch' with: # Ensure we are building the branch and not the branch after being merged on develop diff --git a/.github/workflows/nightly.yml b/.github/workflows/nightly.yml index d82129e18d..f09e36b785 100644 --- a/.github/workflows/nightly.yml +++ b/.github/workflows/nightly.yml @@ -16,7 +16,7 @@ jobs: runs-on: ubuntu-latest if: ${{ github.repository == 'element-hq/element-x-android' }} steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@v5 - name: Use JDK 21 uses: actions/setup-java@v4 with: diff --git a/.github/workflows/nightlyReports.yml b/.github/workflows/nightlyReports.yml index 7cc4f766c2..177b429a10 100644 --- a/.github/workflows/nightlyReports.yml +++ b/.github/workflows/nightlyReports.yml @@ -60,7 +60,7 @@ jobs: name: Dependency analysis runs-on: ubuntu-latest steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@v5 - name: Use JDK 21 uses: actions/setup-java@v4 with: diff --git a/.github/workflows/quality.yml b/.github/workflows/quality.yml index f66086ad06..1157a02eea 100644 --- a/.github/workflows/quality.yml +++ b/.github/workflows/quality.yml @@ -17,7 +17,7 @@ jobs: name: Search for forbidden patterns runs-on: ubuntu-latest steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@v5 - name: Add SSH private keys for submodule repositories uses: webfactory/ssh-agent@a6f90b1f127823b31d4d4a8d96047790581349bd # v0.9.1 if: ${{ github.event_name != 'pull_request' || github.event.pull_request.head.repo.full_name == 'element-hq/element-x-android' }} @@ -33,11 +33,11 @@ jobs: name: Search for invalid screenshot files runs-on: ubuntu-latest steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@v5 - name: Set up Python 3.12 uses: actions/setup-python@v5 with: - python-version: 3.12 + python-version: 3.13 - name: Search for invalid screenshot files run: ./tools/test/checkInvalidScreenshots.py @@ -45,7 +45,7 @@ jobs: name: Search for invalid dependencies runs-on: ubuntu-latest steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@v5 - name: Use JDK 21 uses: actions/setup-java@v4 with: @@ -58,7 +58,7 @@ jobs: - name: Set up Python 3.12 uses: actions/setup-python@v5 with: - python-version: 3.12 + python-version: 3.13 - name: Search for invalid dependencies run: ./tools/dependencies/checkDependencies.py @@ -71,7 +71,7 @@ jobs: group: ${{ github.ref == 'refs/heads/main' && format('check-konsist-main-{0}', github.sha) || github.ref == 'refs/heads/develop' && format('check-konsist-develop-{0}', github.sha) || format('check-konsist-{0}', github.ref) }} cancel-in-progress: true steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@v5 with: # Ensure we are building the branch and not the branch after being merged on develop # https://github.com/actions/checkout/issues/881 @@ -111,7 +111,7 @@ jobs: group: ${{ github.ref == 'refs/heads/main' && format('check-lint-main-{0}', github.sha) || github.ref == 'refs/heads/develop' && format('check-lint-develop-{0}', github.sha) || format('check-lint-{0}', github.ref) }} cancel-in-progress: true steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@v5 with: # Ensure we are building the branch and not the branch after being merged on develop # https://github.com/actions/checkout/issues/881 @@ -155,7 +155,7 @@ jobs: group: ${{ github.ref == 'refs/heads/main' && format('check-detekt-main-{0}', github.sha) || github.ref == 'refs/heads/develop' && format('check-detekt-develop-{0}', github.sha) || format('check-detekt-{0}', github.ref) }} cancel-in-progress: true steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@v5 with: # Ensure we are building the branch and not the branch after being merged on develop # https://github.com/actions/checkout/issues/881 @@ -195,7 +195,7 @@ jobs: group: ${{ github.ref == 'refs/heads/main' && format('check-ktlint-main-{0}', github.sha) || github.ref == 'refs/heads/develop' && format('check-ktlint-develop-{0}', github.sha) || format('check-ktlint-{0}', github.ref) }} cancel-in-progress: true steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@v5 with: # Ensure we are building the branch and not the branch after being merged on develop # https://github.com/actions/checkout/issues/881 @@ -235,7 +235,7 @@ jobs: group: ${{ github.ref == 'refs/heads/main' && format('check-knit-main-{0}', github.sha) || github.ref == 'refs/heads/develop' && format('check-knit-develop-{0}', github.sha) || format('check-knit-{0}', github.ref) }} cancel-in-progress: true steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@v5 with: # Ensure we are building the branch and not the branch after being merged on develop # https://github.com/actions/checkout/issues/881 @@ -266,7 +266,7 @@ jobs: name: Check shell scripts runs-on: ubuntu-latest steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@v5 - name: Run shellcheck uses: ludeeus/action-shellcheck@2.0.0 with: @@ -278,7 +278,7 @@ jobs: needs: [konsist, lint, ktlint, detekt] if: ${{ github.event_name != 'pull_request' || github.event.pull_request.head.repo.full_name == 'element-hq/element-x-android' }} steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@v5 with: # Ensure we are building the branch and not the branch after being merged on develop # https://github.com/actions/checkout/issues/881 diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 704802258e..c3f51f8ec4 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -18,7 +18,7 @@ jobs: group: ${{ format('build-release-main-gplay-{0}', github.sha) }} cancel-in-progress: true steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@v5 - name: Use JDK 21 uses: actions/setup-java@v4 with: @@ -52,7 +52,7 @@ jobs: group: ${{ format('build-release-main-enterprise-{0}', github.sha) }} cancel-in-progress: true steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@v5 - name: Add SSH private keys for submodule repositories uses: webfactory/ssh-agent@a6f90b1f127823b31d4d4a8d96047790581349bd # v0.9.1 if: ${{ github.event_name != 'pull_request' || github.event.pull_request.head.repo.full_name == 'element-hq/element-x-android' }} @@ -87,7 +87,7 @@ jobs: group: ${{ format('build-release-main-fdroid-{0}', github.sha) }} cancel-in-progress: true steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@v5 - name: Use JDK 21 uses: actions/setup-java@v4 with: diff --git a/.github/workflows/sonar.yml b/.github/workflows/sonar.yml index c3b8cdf497..d85e4edf27 100644 --- a/.github/workflows/sonar.yml +++ b/.github/workflows/sonar.yml @@ -22,7 +22,7 @@ jobs: group: ${{ format('sonar-{0}', github.ref) }} cancel-in-progress: ${{ github.ref != 'refs/heads/main' && github.ref != 'refs/heads/develop' }} steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@v5 with: # Ensure we are building the branch and not the branch after being merged on develop # https://github.com/actions/checkout/issues/881 diff --git a/.github/workflows/sync-localazy.yml b/.github/workflows/sync-localazy.yml index 3e9e4692a4..44c3a24eb7 100644 --- a/.github/workflows/sync-localazy.yml +++ b/.github/workflows/sync-localazy.yml @@ -11,7 +11,7 @@ jobs: # Skip in forks if: ${{ github.event_name != 'pull_request' || github.event.pull_request.head.repo.full_name == 'element-hq/element-x-android' }} steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@v5 - name: Use JDK 21 uses: actions/setup-java@v4 with: @@ -24,7 +24,7 @@ jobs: - name: Set up Python 3.12 uses: actions/setup-python@v5 with: - python-version: 3.12 + python-version: 3.13 - name: Setup Localazy run: | curl -sS https://dist.localazy.com/debian/pubkey.gpg | sudo gpg --dearmor -o /etc/apt/trusted.gpg.d/localazy.gpg diff --git a/.github/workflows/sync-sas-strings.yml b/.github/workflows/sync-sas-strings.yml index f9224853fd..c6c6a76c9f 100644 --- a/.github/workflows/sync-sas-strings.yml +++ b/.github/workflows/sync-sas-strings.yml @@ -12,11 +12,11 @@ jobs: if: ${{ github.event_name != 'pull_request' || github.event.pull_request.head.repo.full_name == 'element-hq/element-x-android' }} # No concurrency required, runs every time on a schedule. steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@v5 - name: Set up Python 3.12 uses: actions/setup-python@v5 with: - python-version: 3.12 + python-version: 3.13 - name: Install Prerequisite dependencies run: | pip install requests diff --git a/CHANGES.md b/CHANGES.md index 3563713bf5..bed23e2dc3 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -1,3 +1,25 @@ +Changes in Element X v25.08.2 +============================= + + + +## What's Changed +### 🐛 Bugfixes +* When mapping an invalid notification event, only drop that one by @jmartinesp in https://github.com/element-hq/element-x-android/pull/5137 +### Dependency upgrades +* Update dependency io.nlopez.compose.rules:detekt to v0.4.27 by @renovate[bot] in https://github.com/element-hq/element-x-android/pull/5123 +* Update actions/download-artifact action to v5 by @renovate[bot] in https://github.com/element-hq/element-x-android/pull/5122 +* Update dependency net.zetetic:sqlcipher-android to v4.10.0 by @renovate[bot] in https://github.com/element-hq/element-x-android/pull/5121 +* Update dependency com.posthog:posthog-android to v3.20.2 by @renovate[bot] in https://github.com/element-hq/element-x-android/pull/5133 +* Update dependency com.google.firebase:firebase-bom to v34.1.0 by @renovate[bot] in https://github.com/element-hq/element-x-android/pull/5136 +### Others +* [a11y] Open context menu with the keyboard by @bmarty in https://github.com/element-hq/element-x-android/pull/5120 +* Let enterprise build store the logs in a dedicated subfolder by @bmarty in https://github.com/element-hq/element-x-android/pull/5132 +* Redirect FOSS user to Element Pro according to element .well-known file by @bmarty in https://github.com/element-hq/element-x-android/pull/5126 + + +**Full Changelog**: https://github.com/element-hq/element-x-android/compare/v25.08.1...v25.08.2 + Changes in Element X v25.08.1 ============================= 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 25c89abce9..38751c0a1e 100644 --- a/appnav/src/main/kotlin/io/element/android/appnav/LoggedInFlowNode.kt +++ b/appnav/src/main/kotlin/io/element/android/appnav/LoggedInFlowNode.kt @@ -53,6 +53,8 @@ import io.element.android.features.ftue.api.state.FtueService import io.element.android.features.ftue.api.state.FtueState import io.element.android.features.home.api.HomeEntryPoint import io.element.android.features.logout.api.LogoutEntryPoint +import io.element.android.features.networkmonitor.api.NetworkMonitor +import io.element.android.features.networkmonitor.api.NetworkStatus import io.element.android.features.preferences.api.PreferencesEntryPoint import io.element.android.features.roomdirectory.api.RoomDescription import io.element.android.features.roomdirectory.api.RoomDirectoryEntryPoint @@ -127,6 +129,7 @@ class LoggedInFlowNode @AssistedInject constructor( private val incomingVerificationEntryPoint: IncomingVerificationEntryPoint, private val mediaPreviewConfigMigration: MediaPreviewConfigMigration, private val sessionEnterpriseService: SessionEnterpriseService, + private val networkMonitor: NetworkMonitor, snackbarDispatcher: SnackbarDispatcher, ) : BaseFlowNode( backstack = BackStack( @@ -196,6 +199,12 @@ class LoggedInFlowNode @AssistedInject constructor( matrixClient.sessionVerificationService().setListener(verificationListener) mediaPreviewConfigMigration() + sessionCoroutineScope.launch { + // Wait for the network to be connected before pre-fetching the max file upload size + networkMonitor.connectivity.first { networkStatus -> networkStatus == NetworkStatus.Connected } + matrixClient.getMaxFileUploadSize() + } + ftueService.state .onEach { ftueState -> when (ftueState) { diff --git a/fastlane/metadata/android/en-US/changelogs/202508020.txt b/fastlane/metadata/android/en-US/changelogs/202508020.txt new file mode 100644 index 0000000000..4da3e65049 --- /dev/null +++ b/fastlane/metadata/android/en-US/changelogs/202508020.txt @@ -0,0 +1,3 @@ +Main changes in this version: +- Fix a bug with notifications being incorrectly dropped. +Full changelog: https://github.com/element-hq/element-x-android/releases diff --git a/features/call/impl/src/main/res/values-sv/translations.xml b/features/call/impl/src/main/res/values-sv/translations.xml index b5ee7bc2da..930b5eec6f 100644 --- a/features/call/impl/src/main/res/values-sv/translations.xml +++ b/features/call/impl/src/main/res/values-sv/translations.xml @@ -3,5 +3,6 @@ "Pågående samtal" "Tryck för att återgå till samtalet" "☎️ Samtal pågår" + "Element Call stöder inte användning av Bluetooth-ljudenheter i den här Android-versionen. Välj en annan ljudenhet." "Inkommande Element Call" diff --git a/features/changeroommemberroles/impl/src/main/res/values-be/translations.xml b/features/changeroommemberroles/impl/src/main/res/values-be/translations.xml new file mode 100644 index 0000000000..6d16b23bcc --- /dev/null +++ b/features/changeroommemberroles/impl/src/main/res/values-be/translations.xml @@ -0,0 +1,64 @@ + + + "Толькі адміністратары" + "Заблакіраваць людзей" + "Выдаліць паведамленні" + "Усе" + "Запрашайце людзей і прымайце запыты на далучэнне" + "Мадэрацыя ўдзельнікаў" + "Паведамленні і змест" + "Адміністратары і мадэратары" + "Выдаляйце людзей і адхіляйце запыты на далучэнне" + "Змяніць аватар пакоя" + "Дэталі пакоя" + "Змяніць назву пакоя" + "Змяніць тэму пакоя" + "Адправіць паведамленні" + "Рэдагаваць адміністратараў" + "Вы не зможаце адмяніць гэта дзеянне. Вы прасоўваеце карыстальніка да таго ж узроўню магутнасці, што і вы." + "Дадаць адміністратара?" + "Паніжэнне ўзроўню" + "Вы не зможаце адмяніць гэтае змяненне, бо паніжаеце сябе. Калі вы апошні адміністратар у пакоі, вярнуць права будзе немагчыма." + "Панізіць сябе?" + "%1$s (У чаканні)" + "(У чаканні)" + "Адміністратары аўтаматычна маюць права мадэратара" + "Рэдагаваць мадэратараў" + "Адміністратары" + "Мадэратары" + "Удзельнікі" + "У вас ёсць незахаваныя змены." + "Захаваць змены?" + "У гэтым пакоі няма заблакіраваных удзельнікаў." + + "%1$d удзельнік" + "%1$d удзельнікі" + "%1$d удзельнікаў" + + "Выдаліць і заблакіраваць удзельніка" + "Толькі выдаліць удзельніка" + "Разблакіраваць" + "Яны змогуць зноў далучыцца да гэтага пакоя, калі іх запросяць." + "Разблакіраваць удзельніка" + "Заблакіраваныя" + "Удзельнікі" + "У чаканні" + "Адміністратар" + "Мадэратар" + "Удзельнікі пакоя" + "Разблакіроўка %1$s" + "Адміністратары" + "Змяніць маю роль" + "Панізіць да ўдзельніка" + "Панізіць да мадэратара" + "Мадэрацыя ўдзельнікаў" + "Паведамленні і змест" + "Мадэратары" + "Дазволы" + "Скінуць дазволы" + "Пасля скіду дазволаў вы страціце бягучыя налады." + "Скінуць дазволы?" + "Ролі" + "Дэталі пакоя" + "Ролі і дазволы" + diff --git a/features/changeroommemberroles/impl/src/main/res/values-bg/translations.xml b/features/changeroommemberroles/impl/src/main/res/values-bg/translations.xml new file mode 100644 index 0000000000..2b4718f078 --- /dev/null +++ b/features/changeroommemberroles/impl/src/main/res/values-bg/translations.xml @@ -0,0 +1,40 @@ + + + "Само администратори" + "Премахване на съобщения" + "Всеки" + "Поканване на хора и приемане на заявки за присъединяване" + "Модериране на членове" + "Съобщения и съдържание" + "Администратори и модератори" + "Премахване на хора и отхвърляне на заявки за присъединяване" + "Подробности за стаята" + "Промяна на името на стаята" + "Промяна на темата на стаята" + "Изпращане на съобщения" + "Редактиране на администраторите" + "Добавяне на администратор?" + "Администраторите автоматично имат модераторски права" + "Редактиране на модераторите" + "Администратори" + "Модератори" + "Членове" + + "%1$d човек" + "%1$d души" + + "Членове" + "Администратор" + "Модератор" + "Членове на стаята" + "Администратори" + "Промяна на моята роля" + "Модериране на членове" + "Съобщения и съдържание" + "Модератори" + "Разрешения" + "Нулиране на разрешенията" + "Роли" + "Подробности за стаята" + "Роли и разрешения" + diff --git a/features/changeroommemberroles/impl/src/main/res/values-cs/translations.xml b/features/changeroommemberroles/impl/src/main/res/values-cs/translations.xml new file mode 100644 index 0000000000..504b88b23c --- /dev/null +++ b/features/changeroommemberroles/impl/src/main/res/values-cs/translations.xml @@ -0,0 +1,65 @@ + + + "Pouze správci" + "Vykázat lidi" + "Odstranit zprávy" + "Všichni" + "Pozvěte lidi a přijímejte žádosti o připojení" + "Moderování členů" + "Zprávy a obsah" + "Správci a moderátoři" + "Odeberte lidi a odmítněte žádosti o připojení" + "Změnit avatar místnosti" + "Podrobnosti místnosti" + "Změnit název místnosti" + "Změnit téma místnosti" + "Odeslat zprávy" + "Upravit správce" + "Tuto akci nebudete moci vrátit zpět. Upravujete oprávnění uživatele, tak aby měl stejnou úroveň jako vy." + "Přidat správce?" + "Degradovat" + "Tuto změnu nebudete moci vrátit zpět, protože sami degradujete, pokud jste posledním privilegovaným uživatelem v místnosti, nebude možné znovu získat oprávnění." + "Degradovat se?" + "%1$s (čekající)" + "(Čeká na vyřízení)" + "Správci mají automaticky oprávnění moderátora" + "Upravit moderátory" + "Správci" + "Moderátoři" + "Členové" + "Máte neuložené změny." + "Uložit změny?" + "V této místnosti nejsou žádní vykázaní uživatelé." + + "%1$d osoba" + "%1$d osoby" + "%1$d osob" + + "Odebrat a vykázat člena" + "Pouze odebrat člena" + "Zrušit vykázání" + "Pokud budou pozváni, budou se moci do této místnosti znovu připojit." + "Zrušit vykázání uživatele" + "Vykázaní" + "Členové" + "Nevyřízeno" + "Správce" + "Moderátor" + "Vlastník" + "Členové místnosti" + "Rušení vykázání %1$s" + "Správci" + "Změnit moji roli" + "Degradovat na člena" + "Degradovat na moderátora" + "Moderování členů" + "Zprávy a obsah" + "Moderátoři" + "Oprávnění" + "Obnovit oprávnění" + "Po obnovení oprávnění ztratíte aktuální nastavení." + "Obnovit oprávnění?" + "Role" + "Podrobnosti místnosti" + "Role a oprávnění" + diff --git a/features/changeroommemberroles/impl/src/main/res/values-cy/translations.xml b/features/changeroommemberroles/impl/src/main/res/values-cy/translations.xml new file mode 100644 index 0000000000..53d4927f0f --- /dev/null +++ b/features/changeroommemberroles/impl/src/main/res/values-cy/translations.xml @@ -0,0 +1,67 @@ + + + "Gweinyddwyr yn unig" + "Gwahardd pobl" + "Dileu negeseuon" + "Pawb" + "Gwahodd pobl a derbyn ceisiadau i ymuno" + "Cymedroli aelodau" + "Negeseuon a chynnwys" + "Gweinyddwyr a chymedrolwyr" + "Dileu pobl a gwrthod ceisiadau i ymuno" + "Newid afatar ystafell" + "Manylion yr ystafell" + "Newid enw\'r ystafell" + "Newid pwnc yr ystafell" + "Anfon negeseuon" + "Golygu Gweinyddwyr" + "Fyddwch chi ddim yn gallu dadwneud y weithred hon. Rydych chi\'n hyrwyddo\'r defnyddiwr i gael yr un lefel pŵer â chi." + "Ychwanegu Gweinyddwr?" + "Gostwng" + "Fyddwch chi ddim yn gallu dadwneud y newid hwn gan eich bod yn israddio eich hun, os mai chi yw\'r defnyddiwr breintiedig olaf yn yr ystafell bydd yn amhosibl adennill breintiau." + "Israddio eich hun?" + "%1$s (Yn aros)" + "Yn aros" + "Mae gan weinyddwyr freintiau cymedrolwr yn awtomatig" + "Golygu Cymedrolwyr" + "Gweinyddwyr" + "Cymedrolwyr" + "Aelodau" + "Mae gennych newidiadau heb eu cadw." + "Cadw\'r newidiadau?" + "Nid oes unrhyw ddefnyddwyr gwaharddedig yn yr ystafell hon." + + "%1$d personau" + "%1$d person" + "%1$d berson" + "%1$d person" + "%1$d pherson" + "%1$d person" + + "Gwahardd o ystafell" + "Dileu aelod yn unig" + "Adfer" + "Fyddan nhw yn gallu ymuno â\'r ystafell hon eto os cân nhw wahoddiad." + "Gwahardd defnyddiwr" + "Wedi\'i wahardd" + "Aelodau" + "Dan ystyriaeth" + "Gweinyddwr" + "Cymedrolwr" + "Aelodau\'r ystafell" + "Dad-wahardd %1$s" + "Gweinyddwyr" + "Newid fy rôl" + "Israddio aelod" + "Israddio cymedrolwr" + "Cymedroli aelodau" + "Negeseuon a chynnwys" + "Cymedrolwyr" + "Caniatâd" + "Ailosod caniatâd" + "Ar ôl i chi ailosod caniatâd, byddwch yn colli\'r gosodiadau cyfredol." + "Ailosod caniatâd?" + "Rolau" + "Manylion yr ystafell" + "Rolau a chaniatâd" + diff --git a/features/changeroommemberroles/impl/src/main/res/values-da/translations.xml b/features/changeroommemberroles/impl/src/main/res/values-da/translations.xml new file mode 100644 index 0000000000..a1b2bf6e05 --- /dev/null +++ b/features/changeroommemberroles/impl/src/main/res/values-da/translations.xml @@ -0,0 +1,70 @@ + + + "Kun admins" + "Spær personer" + "Fjern beskeder" + "Alle" + "Invitér personer og acceptér anmodninger om at deltage" + "Moderation af medlemmer" + "Beskeder og indhold" + "Admins og moderatorer" + "Fjern personer og afvis anmodninger om at deltage" + "Skift rummets avatar" + "Detaljer om rummet" + "Skift rummets navn" + "Skift emne for rummet" + "Send beskeder" + "Redigér admins" + "Du kan ikke fortryde denne handling. Du forfremmer brugeren til at have samme magtniveau som dig." + "Tilføj Admin?" + "Du kan ikke fortryde denne handling. Du overfører ejerskabet til de valgte brugere. Når du forlader siden, vil dette være permanent." + "Overdrag ejerskab?" + "Nedgradering" + "Du vil ikke være i stand til at fortryde denne ændring, da du degraderer dig selv. Hvis du er den sidste privilegerede bruger i rummet, vil det være umuligt at genvinde privilegier." + "Nedgrader dig selv?" + "%1$s (Afventer)" + "(Afventer)" + "Administratorer har automatisk moderatorrettigheder" + "Ejere har automatisk administratorrettigheder." + "Redigér moderatorer" + "Vælg ejere" + "Administratorer" + "Moderatorer" + "Medlemmer" + "Du har ændringer, der ikke er gemt." + "Gem ændringer?" + "Der er ingen spærrede brugere i dette rum." + + "%1$d person" + "%1$d personer" + + "Spær fra rum" + "Fjern kun medlem" + "Fjern spærring af" + "De vil være i stand til at deltage i dette rum igen, hvis de inviteres." + "Ophæv blokering af bruger fra rum" + "Spærret" + "Medlemmer" + "Afventer" + "Admin" + "Moderator" + "Ejeren" + "Medlemmer af rummet" + "Ophæver spærring af %1$s" + "Administratorer" + "Administratorer og ejere" + "Skift min rolle" + "Nedgrader til medlem" + "Nedgradering til moderator" + "Moderation af medlemmer" + "Beskeder og indhold" + "Moderatorer" + "Ejere" + "Tilladelser" + "Nulstil tilladelser" + "Når du nulstiller tilladelserne, mister du de nuværende indstillinger." + "Nulstil tilladelser?" + "Roller" + "Detaljer om rummet" + "Roller og tilladelser" + diff --git a/features/changeroommemberroles/impl/src/main/res/values-de/translations.xml b/features/changeroommemberroles/impl/src/main/res/values-de/translations.xml new file mode 100644 index 0000000000..93a36500e3 --- /dev/null +++ b/features/changeroommemberroles/impl/src/main/res/values-de/translations.xml @@ -0,0 +1,63 @@ + + + "Nur Administratoren" + "Mitglieder sperren" + "Nachrichten anderer Mitgliedern löschen" + "Alle" + "Leute einladen und Beitrittsanfragen annehmen" + "Moderation der Mitglieder" + "Nachrichten senden & löschen" + "Administratoren und Moderatoren" + "Personen entfernen und Beitrittsanfragen ablehnen" + "Avatar ändern" + "Raum-Details anpassen" + "Raumname ändern" + "Raumthema ändern" + "Nachrichten senden" + "Admins bearbeiten" + "Sie können diese Aktion nicht mehr rückgängig machen. Sie vergeben die gleiche Rolle, die Sie auch haben." + "Als Administrator hinzufügen?" + "Zurückstufen" + "Sie stufen sich selbst herab. Diese Änderung kann nicht rückgängig gemacht werden. Wenn Sie der letzte Nutzer mit dieser Rolle sind, ist es nicht möglich, diese Rolle wiederzuerlangen." + "Möchten Sie sich selbst herabstufen?" + "%1$s (Ausstehend)" + "(Ausstehend)" + "Administratoren haben automatisch Moderatorenrechte" + "Moderatoren bearbeiten" + "Administratoren" + "Moderatoren" + "Mitglieder" + "Sie haben ungespeicherte Änderungen." + "Änderungen speichern?" + "In diesem Chatroom gibt es keine gesperrten Nutzer." + + "%1$d Person" + "%1$d Personen" + + "Mitglied entfernen und sperren" + "Mitglied nur entfernen" + "Sperre aufheben" + "Die Nutzer können den Raum wieder beitreten, wenn sie dazu eingeladen werden." + "Nutzer entsperren" + "Gesperrt" + "Mitglieder" + "Ausstehend" + "Administrator" + "Moderator" + "Mitglieder" + "%1$s wird entsperrt." + "Administratoren" + "Ändere meine Rolle" + "Zum Mitglied herabstufen" + "Zum Moderator herabstufen" + "Moderation der Mitglieder" + "Nachrichten senden & löschen" + "Moderatoren" + "Berechtigungen" + "Rollen und Berechtigungen zurücksetzen" + "Sobald Sie die Berechtigungen zurücksetzen, verlieren Sie die aktuellen Einstellungen." + "Berechtigungen zurücksetzen?" + "Rollen" + "Raum-Details anpassen" + "Rollen und Berechtigungen" + diff --git a/features/changeroommemberroles/impl/src/main/res/values-el/translations.xml b/features/changeroommemberroles/impl/src/main/res/values-el/translations.xml new file mode 100644 index 0000000000..fbb7e6952f --- /dev/null +++ b/features/changeroommemberroles/impl/src/main/res/values-el/translations.xml @@ -0,0 +1,63 @@ + + + "Μόνο διαχειριστές" + "Αποκλεισμός ατόμων" + "Αφαίρεση μηνυμάτων" + "Όλοι" + "Προσκάλεσε άτομα και αποδέξου αιτήματα συμμετοχής" + "Συντονισμός μελών" + "Μηνύματα και περιεχόμενο" + "Διαχειριστές και συντονιστές" + "Αφαίρεση ατόμων και απόρριψη αιτημάτων συμμετοχής" + "Αλλαγή εικόνας προφίλ αίθουσας" + "Λεπτομέρειες αίθουσας" + "Αλλαγή ονόματος αίθουσας" + "Αλλαγή θέματος αίθουσας" + "Αποστολή μηνυμάτων" + "Επεξεργασία Διαχειριστών" + "Δεν θα μπορείς να αναιρέσεις αυτήν την ενέργεια. Προβιβάζεις τον χρήστη να έχει το ίδιο επίπεδο ισχύος με σένα." + "Προσθήκη Διαχειριστή;" + "Υποβιβασμός" + "Δεν θα μπορέσετε να αναιρέσετε αυτή την αλλαγή καθώς υποβιβάζετε τον εαυτό σας, αν είστε ο τελευταίος χρήστης με δικαιώματα στην αίθουσα θα είναι αδύνατο να ανακτήσετε δικαιώματα." + "Υποβιβασμός του εαυτού σου;" + "%1$s (Σε αναμονή)" + "(Σε αναμονή)" + "Οι διαχειριστές έχουν αυτόματα δικαιώματα συντονιστή" + "Επεξεργασία Συντονιστών" + "Διαχειριστές" + "Συντονιστές" + "Μέλη" + "Έχεις μη αποθηκευμένες αλλαγές." + "Αποθήκευση αλλαγών;" + "Δεν υπάρχουν αποκλεισμένοι χρήστες σε αυτή την αίθουσα." + + "%1$d άτομο" + "%1$d άτομα" + + "Αφαίρεση και αποκλεισμός μέλους" + "Μόνο αφαίρεση μέλους" + "Αναίρεση αποκλεισμού" + "Θα μπορούν να συμμετάσχουν ξανά σε αυτή την αίθουσα, εάν προσκληθούν." + "Άρση αποκλεισμού χρήστη" + "Αποκλεισμένοι" + "Μέλη" + "Σε αναμονή" + "Διαχειριστής" + "Συντονιστής" + "Μέλη της αίθουσας" + "Άρση αποκλεισμού %1$s" + "Διαχειριστές" + "Άλλαξε τον ρόλο μου" + "Υποβιβασμός σε μέλος" + "Υποβιβασμός σε συντονιστή" + "Συντονισμός μελών" + "Μηνύματα και περιεχόμενο" + "Συντονιστές" + "Άδειες" + "Επαναφορά δικαιωμάτων" + "Μόλις επαναφέρεις τα δικαιώματα, θα χάσεις τις τρέχουσες ρυθμίσεις." + "Επαναφορά δικαιωμάτων;" + "Ρόλοι" + "Λεπτομέρειες αίθουσας" + "Ρόλοι και δικαιώματα" + diff --git a/features/changeroommemberroles/impl/src/main/res/values-es/translations.xml b/features/changeroommemberroles/impl/src/main/res/values-es/translations.xml new file mode 100644 index 0000000000..128435bbc2 --- /dev/null +++ b/features/changeroommemberroles/impl/src/main/res/values-es/translations.xml @@ -0,0 +1,63 @@ + + + "Solo administradores" + "Vetar personas" + "Eliminar mensajes" + "Todos" + "Invitar personas y aceptar solicitudes de unión" + "Moderación de miembros" + "Mensajes y contenido" + "Administradores y moderadores" + "Eliminar personas y rechazar solicitudes de unión" + "Cambiar el avatar de la sala" + "Detalles de la sala" + "Cambiar el nombre de la sala" + "Cambiar el tema de la sala" + "Enviar mensajes" + "Editar administradores" + "No podrás deshacer esta acción. Estás promocionando al usuario para que tenga el mismo nivel de poder que tú." + "¿Agregar Admin?" + "Degradar" + "No podrás deshacer este cambio ya que te estás degradando. Si eres el último usuario privilegiado en la sala será imposible recuperar los privilegios." + "¿Degradarte?" + "%1$s (Pendiente)" + "(Pendiente)" + "Los administradores tienen privilegios de moderador de forma automática" + "Editar moderadores" + "Administradores" + "Moderadores" + "Miembros" + "Tienes cambios sin guardar." + "¿Guardar cambios?" + "No hay usuarios vetados en esta sala." + + "Una persona" + "%1$d personas" + + "Sacar y vetar a un miembro" + "Solo eliminar miembro" + "Quitar veto" + "Podrá volver a unirse a esta sala si se le invita." + "Quitar veto al usuario" + "Vetados" + "Miembros" + "Pendiente" + "Admin" + "Moderador" + "Miembros de la sala" + "Levantando veto a %1$s" + "Administradores" + "Cambiar mi rol" + "Degradar a miembro" + "Degradar a moderador" + "Moderación de miembros" + "Mensajes y contenido" + "Moderadores" + "Permisos" + "Restablecer permisos" + "Una vez que restablezca los permisos, perderá la configuración actual." + "¿Restablecer los permisos?" + "Roles" + "Detalles de la sala" + "Roles y permisos" + diff --git a/features/changeroommemberroles/impl/src/main/res/values-et/translations.xml b/features/changeroommemberroles/impl/src/main/res/values-et/translations.xml new file mode 100644 index 0000000000..044503f1de --- /dev/null +++ b/features/changeroommemberroles/impl/src/main/res/values-et/translations.xml @@ -0,0 +1,70 @@ + + + "Vaid peakasutajad" + "Suhtluskeelu seadmine" + "Sõnumite kustutamine" + "Kõik" + "Kutsu teisi osalejaid ja vasta ise liitumiskutsetele" + "Jututoas osalejate modereerimine" + "Sõnumid ja sisu" + "Peakasutajad ja moderaatorid" + "Eemalda osalejaid jututoast ja lükka liitumiskutsed tagasi" + "Jututoa tunnuspildi muutmine" + "Jututoa üksikasjad" + "Jututoa nime muutmine" + "Jututoa teema muutmine" + "Sõnumite saatmine" + "Muuda peakasutajaid" + "Kuna sa annad teisele kasutajale sinu õigustega võrreldes samad õigused, siis sa ei saa seda muudatust hiljem tagasi pöörata." + "Lisame peakasutaja?" + "Seda tegevust ei saa tagasi pöörata. Järgnevaga annad jututoa omandi üle valitud kasutajatele. Kui lahkus, siis muutub see muudatus püsivaks." + "Kas soovid omandi üle anda?" + "Vähenda õigusi" + "Kui sa võtad endalt kõik õigused ära ja oled viimane peakasutaja selles jututoas, siis sa ei saa seda muudatust hiljem tagasi pöörata." + "Kas vähendad enda õigusi?" + "%1$s (ootel)" + "(ootel)" + "Peakasutajatel on automaatselt ka moderaatori õigused" + "Omanikel on automaatselt ka peakasutaja õigused." + "Muuda moderaatoreid" + "Vali omanikud" + "Peakasutajad" + "Moderaatorid" + "Liikmed" + "Sul on salvestamata muudatusi" + "Kas salvestame muudatused?" + "Jututoas pole suhtluskeeluga kasutajaid" + + "%1$d osaleja" + "%1$d osalejat" + + "Eemalda ja sea suhtluskeeld" + "Ainult eemalda kasutaja" + "Eemalda suhtluskeeld" + "Kutse olemasolul saab ta nüüd jututoaga uuesti liituda" + "Eemalda kasutaja suhtluskeeld" + "Suhtluskeeluga kasutajad" + "Liikmed" + "Ootel" + "Peakasutaja" + "Moderaator" + "Omanik" + "Jututoas osalejad" + "Eemaldame suhtluskeelu kasutajalt %1$s" + "Peakasutajad" + "Peakasutajad ja omanikud" + "Muuda minu rolli" + "Muuda tavaliikmeks" + "Muuda moderaatoriks" + "Jututoas osalejate modereerimine" + "Sõnumid ja sisu" + "Moderaatorid" + "Omanikud" + "Õigused" + "Lähtesta õigused" + "Kui lähtestad õigused, siis praegune õiguste kombinatsioon läheb kaotsi." + "Kas lähtestame õigused?" + "Rollid" + "Jututoa üksikasjad" + "Rollid ja õigused" + diff --git a/features/changeroommemberroles/impl/src/main/res/values-eu/translations.xml b/features/changeroommemberroles/impl/src/main/res/values-eu/translations.xml new file mode 100644 index 0000000000..a6b701f0a0 --- /dev/null +++ b/features/changeroommemberroles/impl/src/main/res/values-eu/translations.xml @@ -0,0 +1,61 @@ + + + "Administratzaileak soilik" + "Jarri debekua jendeari" + "Kendu mezuak" + "Guztiak" + "Gonbidatu jendea" + "Kideen moderazioa" + "Mezuak eta edukiak" + "Administratzaileak eta moderatzaileak" + "Kendu jendea" + "Aldatu gelaren abatarra" + "Gelaren xehetasunak" + "Aldatu gelaren izena" + "Aldatu gelako mintzagaia" + "Bidali mezuak" + "Editatu administratzaileak" + "Administratzailea gehitu?" + "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?" + "%1$s (zain)" + "(Egiteke)" + "Administratzaileek automatikoki dute moderatzaile-pribilegioak" + "Editatu moderatzaileak" + "Administratzaileak" + "Moderatzaileak" + "Kideak" + "Gorde gabeko aldaketak dituzu." + "Aldaketak gorde?" + "Gela honetan ez dago debekua ezarri zaion erabiltzailerik." + + "Pertsona %1$d" + "%1$d pertsona" + + "Kendu kidea eta ezarri debekua" + "Kendu kidea soilik" + "Kendu debekua" + "Kendu debekua erabiltzaileari" + "Debekatuta" + "Kideak" + "Zain" + "Kudeatzailea" + "Moderatzailea" + "Gelako kideak" + "%1$s(r)i debekua kentzen" + "Administratzaileak" + "Aldatu nire rola" + "Jaitsi maila, kidera" + "Jaitsi maila, moderatzailera" + "Kideen moderazioa" + "Mezuak eta edukiak" + "Moderatzaileak" + "Baimenak" + "Berrezarri baimenak" + "Baimenak berrezarritakoan, uneko ezarpenak galduko dituzu." + "Baimenak berrezarri?" + "Rolak" + "Gelaren xehetasunak" + "Rolak eta baimenak" + diff --git a/features/changeroommemberroles/impl/src/main/res/values-fa/translations.xml b/features/changeroommemberroles/impl/src/main/res/values-fa/translations.xml new file mode 100644 index 0000000000..c9c9da0882 --- /dev/null +++ b/features/changeroommemberroles/impl/src/main/res/values-fa/translations.xml @@ -0,0 +1,58 @@ + + + "فقط مدیران" + "تحریم افراد" + "برداشتن پیام‌ها" + "هرکسی" + "دعوت افراد و پذیرش درخواست‌های پیوستن" + "نظارت اعضا" + "پیام‌ها و محتوا" + "مدیرن و ناظران" + "برداشتن افراد و رد درخواست‌های پیوستن" + "تغییر چهرک اتاق" + "جزییات اتاق" + "تغییر نام اتاق" + "دگرگونی موضوع اتاق" + "فرستادن پیام‌ها" + "ویرایش مدیران" + "قادر نخواهید بود این کنش را بازکردانید. داردید کاربر را به سطح قدرت خودتان ارتقا می‌دهید." + "افزودن مدیر؟" + "تنزل بده" + "شما نمی‌توانید این تغییر را بازگردانید زیرا در حال تنزل نقش خود در اتاق هستید، اگر آخرین کاربر ممتاز در اتاق باشید، امکان دستیابی مجدد به دسترسی‌های سطح بالای اتاق غیرممکن است." + "تنزل نقش شما در اتاق؟" + "%1$s (منتظر)" + "(منتظر)" + "مدیران به صورت خودکار اجازه‌های نظارتی را دارند" + "ویرایش ناظران" + "مدیران" + "ناظم‌ها" + "اعضا" + "تغییراتی ذخیره نشده دارید." + "ذخیرهٔ تغییرات؟" + "برداشت و تحریم عضو" + "تنها برداشتن عضو" + "رفع انسداد" + "در صورت دعوت می‌تواند دوباره به اتاق بپیوندد." + "تحریم نکردن کاربر" + "محروم" + "اعضا" + "منتظر" + "مدیر" + "ناظمر" + "مالک" + "اعضای اتاق" + "رفع تحریم %1$s" + "مدیران" + "تغییر نقشم" + "تنزّل به عضو" + "تنزّل به ناظم" + "نظارت اعضا" + "پیام‌ها و محتوا" + "ناظم‌ها" + "اجازه‌ها" + "بازنشانی اجازه‌ها" + "بازنشانی اجازه‌ها؟" + "نقش‌ها" + "جزییات اتاق" + "نقش‌ها و اجازه‌ها" + diff --git a/features/changeroommemberroles/impl/src/main/res/values-fi/translations.xml b/features/changeroommemberroles/impl/src/main/res/values-fi/translations.xml new file mode 100644 index 0000000000..b8ff96085a --- /dev/null +++ b/features/changeroommemberroles/impl/src/main/res/values-fi/translations.xml @@ -0,0 +1,70 @@ + + + "Vain ylläpitäjät" + "Porttikieltojen antaminen" + "Viestien poistaminen" + "Kaikki" + "Ihmisten kutsuminen ja liittymispyyntöjen hyväksyminen" + "Jäsenten valvonta" + "Viestit ja sisältö" + "Ylläpitäjät ja valvojat" + "Henkilöiden poistaminen ja liittymispyyntöjen hylkääminen" + "Huoneen avatarin vaihtaminen" + "Huoneen tiedot" + "Huoneen nimen vaihtaminen" + "Huoneen aiheen vaihtaminen" + "Viestien lähettäminen" + "Muokkaa ylläpitäjiä" + "Et voi peruuttaa tätä toimenpidettä. Ylennät käyttäjän samalle oikeustasolle kuin sinä." + "Lisää ylläpitäjä?" + "Et voi kumota tätä toimintoa. Olet siirtämässä omistajuuden valituille käyttäjille. Kun poistut, muutos on pysyvä." + "Siirretäänkö omistajuus?" + "Alenna" + "Et voi perua tätä muutosta, koska olet alentamassa itseäsi. Jos olet viimeinen oikeutettu henkilö tässä huoneessa, oikeuksia ei voi enää saada takaisin." + "Alenna itsesi?" + "%1$s (Kutsuttu)" + "(Kutsuttu)" + "Ylläpitäjillä on automaattisesti valvojan oikeudet" + "Omistajilla on automaattisesti ylläpitäjän oikeudet." + "Muokkaa valvojia" + "Valitse Omistajat" + "Ylläpitäjät" + "Valvojat" + "Jäsenet" + "Sinulla on tallentamattomia muutoksia" + "Tallenna muutokset?" + "Tässä huoneessa ei ole porttikieltoja" + + "%1$d henkilö" + "%1$d henkilöä" + + "Poista jäsen huoneesta ja anna porttikielto" + "Poista vain jäsen huoneesta" + "Poista porttikielto" + "He voivat liittyä tähän huoneeseen uudelleen, jos heidät kutsutaan." + "Poista käyttäjän porttikielto" + "Porttikiellot" + "Jäsenet" + "Kutsuttu" + "Ylläpitäjä" + "Valvoja" + "Omistaja" + "Huoneen jäsenet" + "Poistetaan käyttäjän %1$s porttikieltoa" + "Ylläpitäjät" + "Ylläpitäjät ja omistajat" + "Vaihda rooliani" + "Alenna jäseneksi" + "Alenna valvojaksi" + "Jäsenten valvonta" + "Viestit ja sisältö" + "Valvojat" + "Omistajat" + "Oikeudet" + "Nollaa oikeudet" + "Kun nollaat käyttöoikeudet, menetät nykyiset asetukset." + "Nollataanko oikeudet?" + "Roolit" + "Huoneen tiedot" + "Roolit ja oikeudet" + diff --git a/features/changeroommemberroles/impl/src/main/res/values-fr/translations.xml b/features/changeroommemberroles/impl/src/main/res/values-fr/translations.xml new file mode 100644 index 0000000000..a708c9ffb5 --- /dev/null +++ b/features/changeroommemberroles/impl/src/main/res/values-fr/translations.xml @@ -0,0 +1,70 @@ + + + "Administrateurs seulement" + "Bannir des participants" + "Supprimer des messages" + "Tout le monde" + "Inviter des personnes et accepter les demandes pour rejoindre" + "Administration des membres" + "Messages et contenus" + "Administrateurs et modérateurs" + "Retirer des personnes et refuser les demandes pour rejoindre" + "Changer l’avatar du salon" + "Détails du salon" + "Changer le nom du salon" + "Changer le sujet du salon" + "Envoyer des messages" + "Modifier les administrateurs" + "Vous ne pourrez pas annuler cette action. Vous êtes en train de promouvoir l’utilisateur pour qu’il ait le même niveau que vous." + "Ajouter un administrateur ?" + "Vous ne pourrez pas annuler cette action. Vous transférez la propriété aux utilisateurs sélectionnés. Une fois que vous serez parti, l’action sera définitive." + "Transférer la propriété?" + "Rétrograder" + "Vous ne pourrez pas annuler ce changement car vous vous rétrogradez, si vous êtes le dernier utilisateur privilégié du salon il sera impossible de retrouver les privilèges." + "Vous rétrograder ?" + "%1$s (En attente)" + "(En attente)" + "Les administrateurs ont automatiquement les privilèges des modérateurs" + "Les propriétaires disposent automatiquement des privilèges des administrateurs." + "Modifier les modérateurs" + "Choisissez les propriétaires" + "Administrateurs" + "Modérateurs" + "Membres" + "Vous avez des modifications non-enregistrées." + "Enregistrer les changements ?" + "Il n’y a pas d’utilisateur banni dans ce salon." + + "%1$d personne" + "%1$d personnes" + + "Bannir du salon" + "Retirer le membre uniquement" + "Débannir" + "Il pourra rejoindre le salon à nouveau si il est invité." + "Débannir l’utilisateur" + "Bannis" + "Membres" + "En attente" + "Administrateur" + "Modérateur" + "Propriétaire" + "Membres du salon" + "Débannissement de %1$s" + "Administrateurs" + "Administrateurs et propriétaires" + "Changer mon rôle" + "Devenir simple membre" + "Devenir simple modérateur" + "Administration des membres" + "Messages et contenus" + "Modérateurs" + "Propriétaires" + "Autorisations" + "Réinitialisation des autorisations" + "La réinitialisation des autorisations entraîne la perte des réglages actuels." + "Réinitialisation des autorisations ?" + "Rôles" + "Détails du salon" + "Rôles et autorisations" + diff --git a/features/changeroommemberroles/impl/src/main/res/values-hu/translations.xml b/features/changeroommemberroles/impl/src/main/res/values-hu/translations.xml new file mode 100644 index 0000000000..29e45978e1 --- /dev/null +++ b/features/changeroommemberroles/impl/src/main/res/values-hu/translations.xml @@ -0,0 +1,70 @@ + + + "Csak adminisztrátorok" + "Emberek kitiltása" + "Üzenetek eltávolítása" + "Mindenki" + "Személyek meghívása és csatlakozási kérések elfogadása" + "Tagok moderálása" + "Üzenetek és tartalom" + "Adminisztrátorok és moderátorok" + "Emberek eltávolítása és a csatlakozási kérések elutasítása" + "Szoba profilképének módosítása" + "Szoba részletei" + "Szoba nevének módosítása" + "Szoba témájának módosítása" + "Üzenetek küldése" + "Adminisztrátorok szerkesztése" + "Ezt a műveletet nem fogja tudja visszavonni. Ugyanarra a szintre lépteti elő a felhasználót, mint amellyel Ön is rendelkezik." + "Adminisztrátor hozzáadása?" + "Ezt a műveletet nem lehet visszavonni. A tulajdonjogot a kiválasztott felhasználókra ruházza át. Távozás után a művelet véglegessé válik." + "Átruházza a tulajdonjogot?" + "Lefokozás" + "Ezt a változtatást nem fogja tudni visszavonni, mivel lefokozza magát, ha Ön az utolsó jogosultságokkal rendelkező felhasználó a szobában, akkor lehetetlen lesz visszaszerezni a jogosultságokat." + "Lefokozza magát?" + "%1$s (függőben)" + "(Függőben)" + "Az adminisztrátorok automatikusan moderátori jogosultságokkal rendelkeznek" + "A tulajdonosok automatikusan adminisztrátori jogosultsággal rendelkeznek." + "Moderátorok szerkesztése" + "Tulajdonosok kiválasztása" + "Adminisztrátorok" + "Moderátorok" + "Tagok" + "Mentetlen módosításai vannak." + "Menti a módosításokat?" + "Ebben a szobában nincsenek kitiltott felhasználók." + + "%1$d személy" + "%1$d személy" + + "Eltávolítás és a tag kitiltása" + "Csak a tag eltávolítása" + "Tiltás feloldása" + "Ehhez a szobához is csatlakozhat, ha meghívják." + "Felhasználó tiltásának feloldása" + "Kitiltva" + "Tagok" + "Függőben" + "Adminisztrátor" + "Moderátor" + "Tulajdonos" + "Szoba tagjai" + "%1$s tiltásának feloldása" + "Adminisztrátorok" + "Adminisztrátorok és tulajdonosok" + "Saját szerepkör módosítása" + "Lefokozás taggá" + "Lefokozás moderátorrá" + "Tagok moderálása" + "Üzenetek és tartalom" + "Moderátorok" + "Tulajdonosok" + "Jogosultságok" + "Jogosultságok visszaállítása" + "A jogosultságok visszaállítása után a jelenlegi beállítások elvesznek." + "Jogosultságok visszaállítása?" + "Szerepkörök" + "Szoba részletei" + "Szerepkörök és jogosultságok" + diff --git a/features/changeroommemberroles/impl/src/main/res/values-in/translations.xml b/features/changeroommemberroles/impl/src/main/res/values-in/translations.xml new file mode 100644 index 0000000000..1f25e9ada3 --- /dev/null +++ b/features/changeroommemberroles/impl/src/main/res/values-in/translations.xml @@ -0,0 +1,62 @@ + + + "Hanya admin" + "Cekal orang-orang" + "Hapus pesan" + "Semua orang" + "Undang orang-orang dan terima permintaan untuk bergabung" + "Moderasi anggota" + "Pesan dan konten" + "Admin dan moderator" + "Keluarkan orang-orang dan tolak permintaan untuk bergabung" + "Ubah avatar ruangan" + "Detail ruangan" + "Ubah nama ruangan" + "Ubah topik ruangan" + "Kirim pesan" + "Sunting Admin" + "Anda tidak akan dapat mengurungkan tindakan ini. Anda mempromosikan pengguna untuk memiliki tingkat daya yang sama seperti Anda." + "Tambahkan Admin?" + "Turunkan" + "Anda tidak akan dapat mengurungkan perubahan ini karena Anda sedang menurunkan Anda sendiri, jika Anda merupakan pengguna dengan hak khusus dalam ruangan maka tidak akan memungkinkan untuk mendapatkan hak tersebut lagi." + "Turunkan Anda sendiri?" + "%1$s (Tertunda)" + "(Tertunda)" + "Admin secara otomatis memiliki hak moderator" + "Sunting Moderator" + "Admin" + "Moderator" + "Anggota" + "Anda memiliki perubahan yang belum disimpan." + "Simpan perubahan?" + "Tidak ada pengguna yang dicekal dalam ruangan ini." + + "%1$d orang" + + "Keluarkan dan cekal anggota" + "Hanya keluarkan anggota" + "Batalkan pencekalan" + "Pengguna dapat bergabung ke ruangan ini lagi jika diundang." + "Batalkan pencekalan pengguna" + "Tercekal" + "Anggota" + "Tertunda" + "Admin" + "Moderator" + "Anggota ruangan" + "Membatalkan cekalan %1$s" + "Admin" + "Ubah peran saya" + "Turunkan ke anggota" + "Turunkan ke moderator" + "Moderasi anggota" + "Pesan dan konten" + "Moderator" + "Perizinan" + "Atur ulang perizinan" + "Setelah Anda mengatur ulang perizinan, Anda akan kehilangan pengaturan Anda saat ini." + "Atur ulang perizinan?" + "Peran" + "Detail ruangan" + "Peran dan perizinan" + diff --git a/features/changeroommemberroles/impl/src/main/res/values-it/translations.xml b/features/changeroommemberroles/impl/src/main/res/values-it/translations.xml new file mode 100644 index 0000000000..ebe1c391bf --- /dev/null +++ b/features/changeroommemberroles/impl/src/main/res/values-it/translations.xml @@ -0,0 +1,63 @@ + + + "Solo amministratori" + "Escludi membri" + "Rimuovi messaggi" + "Tutti" + "Invita persone e accetta richieste di partecipazione" + "Moderazione dei membri" + "Messaggi e contenuti" + "Amministratori e moderatori" + "Rimuovi le persone e rifiuta le richieste di partecipazione" + "Cambia avatar della stanza" + "Dettagli della stanza" + "Cambia il nome della stanza" + "Cambiare l\'argomento della stanza" + "Inviare messaggi" + "Modifica amministratori" + "Non potrai annullare questa azione. Stai promuovendo l\'utente al tuo stesso livello di potere." + "Aggiungi amministratore?" + "Declassa" + "Non potrai annullare questa modifica perché ti stai declassando, se sei l\'ultimo utente privilegiato nella stanza, sarà impossibile riottenere i privilegi." + "Declassare te stesso?" + "%1$s (In attesa)" + "(In attesa)" + "Gli amministratori hanno automaticamente i privilegi di moderatore" + "Modifica moderatori" + "Amministratori" + "Moderatori" + "Membri" + "Hai delle modifiche non salvate." + "Salvare le modifiche?" + "Non ci sono utenti esclusi in questa stanza." + + "1 persona" + "%1$d persone" + + "Rimuovi ed escludi" + "Rimuovi soltanto" + "Riammetti" + "Potrà entrare nuovamente in questa stanza se invitato." + "Riammetti utente" + "Esclusi" + "Membri" + "In attesa" + "Amministratore" + "Moderatore" + "Membri della stanza" + "Riammissione di %1$s" + "Amministratori" + "Cambia il mio ruolo" + "Declassa a membro" + "Declassa a moderatore" + "Moderazione dei membri" + "Messaggi e contenuti" + "Moderatori" + "Autorizzazioni" + "Reimpostare le autorizzazioni" + "Una volta reimpostate le autorizzazioni, perderai le impostazioni correnti." + "Reimpostare autorizzazioni?" + "Ruoli" + "Dettagli della stanza" + "Ruoli e autorizzazioni" + diff --git a/features/changeroommemberroles/impl/src/main/res/values-ka/translations.xml b/features/changeroommemberroles/impl/src/main/res/values-ka/translations.xml new file mode 100644 index 0000000000..17d80ba10b --- /dev/null +++ b/features/changeroommemberroles/impl/src/main/res/values-ka/translations.xml @@ -0,0 +1,62 @@ + + + "მხოლოდ ადმინისტრატორები" + "მომხმარებლების დაბლოკვა" + "შეტყობინებების წაშლა" + "ყველა" + "მომხმარებლების მოწვევა და გაწევრიანების მოთხოვნების დადასტურება" + "წევრების მოდერირება" + "შეტყობინებები და შინაარსი" + "ადმინისტრატორები და მოდერატორები" + "მომხმარებლების გაგდება და გაწევრიანების მოთხოვნების უარყოფა" + "ოთახის სურათის შეცვლა" + "ოთახის დეტალები" + "ოთახის სახელის შეცვლა" + "ოთახის თემის შეცვლა" + "შეტყობინებების გაგზავნა" + "ადმინისტრატორების რედაქტირება" + "ამ მოქმედების გაუქმებას ვერ შეძლებთ. თქვენ ნიშნავთ ამ მომხმარებელს იმავე ძალაუფლების დონეზე, რომელიც გაქვთ თქვენ." + "ადმინისტრატორის დამატება?" + "დაქვეითება" + "იმის გამო, რომ აქვეითებთ თქვენ თავს, ამ მოქმედებას ვერ გააუქმებთ. პრივილეგიების აღდგენა შეუძლებელია თუ თქვენ ბოლო პრივილეგირებული მომხმარებელი ხართ ამ ოთახში." + "გსურთ საკუთარი თავის დაქვეითება?" + "%1$s (მოლოდინი)" + "(მოლოდინში)" + "მოდერატორების რედაქტირება" + "ადმინისტრატორები" + "მოდერატორები" + "წევრები" + "თქვენ გაქვთ შეუნახავი ცვლილებები" + "შენახვა?" + "ამ ოთახში არაა დაბლოკილი მომხმარებლები." + + "%1$d ადამიანი" + "%1$d ადამიანი" + + "წევრის წაშლა და დაბლოკვა" + "მხოლოდ წევრის წაშლა" + "განბლოკვა" + "მოწვევის შემთხვევაში განბლოკილი მომხმარებელი ისევ შეძლებს ოთახს შეუერთდეს." + "მომხმარებლის განბლოკვა" + "დაბლოკილები" + "წევრები" + "მომლოდინე" + "ადმინისტრატორი" + "მოდერატორი" + "ოთახის წევრები" + "%1$s-ს განბლოკვა" + "ადმინისტრატორები" + "ჩემი როლის შეცვლა" + "დაქვეითება წევრამდე" + "დაქვეითება მოდერატორამდე" + "წევრების მოდერირება" + "შეტყობინებები და შინაარსი" + "მოდერატორები" + "ნებართვები" + "ნებართვების გადაყენება" + "ნებართვების გადაყენების შემთხვევაში მიმდინარე პარამეტრებს დაკარგავთ." + "გადავაყენოთ ცვლილებები?" + "როლები" + "ოთახის დეტალები" + "როლები და ნებართვები" + diff --git a/features/changeroommemberroles/impl/src/main/res/values-lt/translations.xml b/features/changeroommemberroles/impl/src/main/res/values-lt/translations.xml new file mode 100644 index 0000000000..80a91ac742 --- /dev/null +++ b/features/changeroommemberroles/impl/src/main/res/values-lt/translations.xml @@ -0,0 +1,10 @@ + + + + "%1$d asmuo" + "%1$d asmenys" + "%1$d asmenų" + + "Laukiama" + "Kambario nariai" + diff --git a/features/changeroommemberroles/impl/src/main/res/values-nb/translations.xml b/features/changeroommemberroles/impl/src/main/res/values-nb/translations.xml new file mode 100644 index 0000000000..62f96eec72 --- /dev/null +++ b/features/changeroommemberroles/impl/src/main/res/values-nb/translations.xml @@ -0,0 +1,63 @@ + + + "Kun for administratorer" + "Forby folk" + "Fjern meldinger" + "Alle" + "Inviter folk og godta forespørsler om å bli med" + "Moderering av medlemmer" + "Meldinger og innhold" + "Administratorer og moderatorer" + "Fjern folk og avslå forespørsler om å bli med" + "Endre romavatar" + "Romdetaljer" + "Endre romnavn" + "Endre temaet til rommet" + "Send meldinger" + "Rediger administratorer" + "Du vil ikke kunne angre denne handlingen. Du forfremmer brukeren til å ha samme rettighetsnivå som deg." + "Legg til administrator?" + "Degradere" + "Du vil ikke kunne angre denne endringen ettersom du degraderer deg selv, og hvis du er den siste privilegerte brukeren i rommet, vil det være umulig å få tilbake privilegiene." + "Degradere deg selv?" + "%1$s (Venter)" + "(Venter)" + "Administratorer har automatisk moderatorrettigheter" + "Rediger moderatorer" + "Administratorer" + "Moderatorer" + "Medlemmer" + "Du har endringer som ikke er lagret." + "Lagre endringer?" + "Det er ingen utestengte brukere i dette rommet." + + "%1$d person" + "%1$d personer" + + "Fjern og utesteng medlem" + "Bare fjern medlem" + "Opphev utestengelse" + "De vil kunne bli med i dette rommet igjen hvis de blir invitert." + "Opphev utestengelse av bruker" + "Utestengt" + "Medlemmer" + "Venter" + "Administrator" + "Moderator" + "Medlemmer av rommet" + "Oppheve utestengelsen av %1$s" + "Administratorer" + "Endre rollen min" + "Nedgradere til medlem" + "Nedgradere til moderator" + "Moderering av medlemmer" + "Meldinger og innhold" + "Moderatorer" + "Tillatelser" + "Tilbakestill tillatelser" + "Når du har tilbakestilt tillatelsene, mister du gjeldende innstillinger." + "Vil du tilbakestille tillatelsene?" + "Roller" + "Romdetaljer" + "Roller og tillatelser" + diff --git a/features/changeroommemberroles/impl/src/main/res/values-nl/translations.xml b/features/changeroommemberroles/impl/src/main/res/values-nl/translations.xml new file mode 100644 index 0000000000..b8cdd89620 --- /dev/null +++ b/features/changeroommemberroles/impl/src/main/res/values-nl/translations.xml @@ -0,0 +1,63 @@ + + + "Alleen beheerders" + "Personen verbannen" + "Berichten verwijderen" + "Iedereen" + "Nodig personen uit en accepteer verzoeken om deel te nemen" + "Moderatie van leden" + "Berichten en inhoud" + "Beheerders en moderators" + "Verwijder personen en weiger verzoeken om deel te nemen" + "Kamerafbeelding wijzigen" + "Kamergegevens" + "Kamernaam wijzigen" + "Kameronderwerp wijzigen" + "Berichten verzenden" + "Beheerders bewerken" + "Je kunt deze actie niet ongedaan maken. Je bevordert deze gebruiker tot hetzelfde machtsniveau als jij." + "Beheerder toevoegen?" + "Degraderen" + "Je kunt deze wijziging niet ongedaan maken omdat je jezelf degradeert. Als je de laatste gebruiker met bevoegdheden in de kamer bent, is het onmogelijk om deze bevoegdheden terug te krijgen." + "Jezelf degraderen?" + "%1$s (In behandeling)" + "(In afwachting)" + "Beheerders hebben automatisch moderatorrechten" + "Moderators bewerken" + "Beheerders" + "Moderators" + "Leden" + "Je hebt niet-opgeslagen wijzigingen" + "Wijzigingen opslaan?" + "Er zijn geen verbannen gebruikers in deze kamer." + + "%1$d persoon" + "%1$d personen" + + "Lid verwijderen en verbannen" + "Alleen lid verwijderen" + "Ontbannen" + "Ze kunnen opnieuw tot de kamer toetreden als ze worden uitgenodigd." + "Ontban gebruiker" + "Verbannen" + "Leden" + "In behandeling" + "Beheerder" + "Moderator" + "Kamerleden" + "%1$s ontbannen" + "Beheerders" + "Mijn rol wijzigen" + "Degraderen tot lid" + "Degraderen tot moderator" + "Moderatie van leden" + "Berichten en inhoud" + "Moderators" + "Rechten" + "Rechten opnieuw instellen" + "Als je de rechten opnieuw instelt, raak je de huidige instellingen kwijt." + "Rechten opnieuw instellen?" + "Rollen" + "Kamergegevens" + "Rollen en rechten" + diff --git a/features/changeroommemberroles/impl/src/main/res/values-pl/translations.xml b/features/changeroommemberroles/impl/src/main/res/values-pl/translations.xml new file mode 100644 index 0000000000..ad4c7239d7 --- /dev/null +++ b/features/changeroommemberroles/impl/src/main/res/values-pl/translations.xml @@ -0,0 +1,71 @@ + + + "Tylko administratorzy" + "Banowanie osób" + "Usuwanie wiadomości" + "Wszyscy" + "Zapraszanie osób i akceptowanie próśb o dołączenie" + "Moderacja członków" + "Wiadomości i zawartość" + "Administratorzy i moderatorzy" + "Usuwanie osób i odrzucanie próśb o dołączenie" + "Zmień awatar pokoju" + "Szczegóły pokoju" + "Zmień nazwę pokoju" + "Zmień temat pokoju" + "Wysyłanie wiadomości" + "Edytuj administratorów" + "Tej akcji nie będzie można cofnąć. Promujesz użytkownika, który będzie posiadał takie same uprawnienia jak Ty." + "Dodać administratora?" + "Tej akcji nie będzie można cofnąć. Przenosisz prawa własności na wybranych użytkowników. Po opuszczeniu tej strony zmiana będzie nieodwracalna." + "Przenieść własność?" + "Zdegraduj" + "Nie będzie można cofnąć tej zmiany, jeśli się zdegradujesz. Jeśli jesteś ostatnim uprzywilejowanym użytkownikiem w pokoju, nie będziesz w stanie odzyskać uprawnień." + "Zdegradować siebie?" + "%1$s (Oczekujące)" + "(Oczekujący)" + "Administratorzy automatycznie mają uprawnienia moderatora" + "Właściciele automatycznie mają uprawnienia administratora." + "Edytuj moderatorów" + "Wybierz właścicieli" + "Administratorzy" + "Moderatorzy" + "Członków" + "Masz niezapisane zmiany." + "Zapisać zmiany?" + "W tym pokoju nie ma zbanowanych użytkowników." + + "%1$d osoba" + "%1$d osoby" + "%1$d osób" + + "Usuń i zbanuj członka" + "Tylko usuń członka" + "Odbanuj" + "Będą mogli ponownie dołączyć do tego pokoju, jeśli zostaną zaproszeni." + "Odbanuj użytkownika" + "Zbanowanych" + "Członków" + "Oczekujące" + "Administrator" + "Moderator" + "Właściciel" + "Członkowie pokoju" + "Odbanowanie %1$s" + "Administratorzy" + "Administratorzy i właściciele" + "Zmień moją rolę" + "Zdegraduj do członka" + "Zdegraduj do moderatora" + "Moderacja członków" + "Wiadomości i zawartość" + "Moderatorzy" + "Właściciele" + "Uprawnienia" + "Resetuj uprawnienia" + "Po zresetowaniu uprawnień utracisz bieżące ustawienia." + "Zresetować uprawnienia?" + "Role" + "Szczegóły pokoju" + "Role i uprawnienia" + diff --git a/features/changeroommemberroles/impl/src/main/res/values-pt-rBR/translations.xml b/features/changeroommemberroles/impl/src/main/res/values-pt-rBR/translations.xml new file mode 100644 index 0000000000..e2155955d6 --- /dev/null +++ b/features/changeroommemberroles/impl/src/main/res/values-pt-rBR/translations.xml @@ -0,0 +1,63 @@ + + + "Somente administradores" + "Banir pessoas" + "Remover mensagens" + "Todos" + "Convide pessoas e aceite solicitações de entrada" + "Moderação de membros" + "Mensagens e conteúdo" + "Administradores e moderadores" + "Remover pessoas e recusar solicitações de entrada" + "Alterar avatar da sala" + "Detalhes da sala" + "Alterar nome da sala" + "Alterar tópico da sala" + "Enviar mensagens" + "Editar administradores" + "Você não poderá desfazer essa ação. Você está promovendo o usuário a ter o mesmo nível de poder que você." + "Adicionar administrador?" + "Reduzir privilégio" + "Você não poderá desfazer essa alteração, pois estará se rebaixando. Se você for o último usuário privilegiado na sala, será impossível recuperar os privilégios." + "Reduzir seu próprio privilégio?" + "%1$s (Pendente)" + "(Pendente)" + "Os administradores têm privilégios de moderador automaticamente" + "Editar moderadores" + "Administradores" + "Moderadores" + "Membros" + "Você tem alterações não salvas." + "Salvar alterações?" + "Não há usuários banidos nesta sala." + + "%1$d pessoa" + "%1$d pessoas" + + "Remover e banir membro" + "Somente remover membro" + "Desbanir" + "Eles poderão entrar nesta sala novamente se forem convidados." + "Desbanir usuário" + "Banidos" + "Membros" + "Pendente" + "Administrador" + "Moderador" + "Membros da sala" + "Desbanindo %1$s" + "Administradores" + "Alterar meu cargo" + "Rebaixar para membro" + "Rebaixar para moderador" + "Moderação de membros" + "Mensagens e conteúdo" + "Moderadores" + "Permissões" + "Redefinir permissões" + "Depois de redefinir as permissões, você perderá as configurações atuais." + "Redefinir permissões?" + "Cargos" + "Detalhes da sala" + "Cargos e permissões" + diff --git a/features/changeroommemberroles/impl/src/main/res/values-pt/translations.xml b/features/changeroommemberroles/impl/src/main/res/values-pt/translations.xml new file mode 100644 index 0000000000..f7e93f359a --- /dev/null +++ b/features/changeroommemberroles/impl/src/main/res/values-pt/translations.xml @@ -0,0 +1,70 @@ + + + "Apenas administradores" + "Banir pessoas" + "Remover mensagens" + "Toda a gente" + "Convidar pessoas e aceitar pedidos de entrada" + "Moderação de participantes" + "Mensagens e conteúdo" + "Administradores e moderadores" + "Remover pessoas e rejeitar pedidos de entrada" + "Alterar o ícone da sala" + "Detalhes da sala" + "Altera o nome da sala" + "Alterar a descrição da sala" + "Enviar mensagens" + "Editar Administradores" + "Não poderás desfazer esta ação. Estás a promover o utilizador para ter o mesmo nível de poder que tu." + "Adicionar administrador?" + "Não será possível reverter esta ação. Estás a transferir a posse para os utilizadores selecionados. Será permanente depois de saíres." + "Transferir posse?" + "Despromover" + "Não poderás desfazer esta alteração, uma vez que te estás a despromover. Se fores o último utilizador privilegiado na sala, será impossível recuperar os privilégios." + "Despromover-te?" + "%1$s (pendente)" + "(pendente)" + "Os administradores têm automaticamente privilégios de moderador" + "Os donos têm permissões de administrador automaticamente" + "Editar Moderadores" + "Escolher donos" + "Administradores" + "Moderadores" + "Participantes" + "Tens alterações por guardar." + "Guardar alterações?" + "Não há nenhum utilizador banido desta sala." + + "%1$d pessoa" + "%1$d pessoas" + + "Remover e banir participante" + "Remover apenas" + "Anular banimento" + "Poderão juntar-se novamente a esta sala se forem convidados." + "Anular banimento do utilizador" + "Banidos" + "Participantes" + "Pendente" + "Administrador" + "Moderador" + "Dono / Dona" + "Participantes" + "A anular banimento de %1$s" + "Administradores" + "Administradores e donos" + "Alterar o meu cargo" + "Despromover para participante" + "Despromover para moderador" + "Moderação de participantes" + "Mensagens e conteúdo" + "Moderadores" + "Donos" + "Permissões" + "Repor permissões" + "Ao repores as permissões, perderás as configurações atuais." + "Repor as permissões?" + "Cargos" + "Detalhes da sala" + "Cargos e permissões" + diff --git a/features/changeroommemberroles/impl/src/main/res/values-ro/translations.xml b/features/changeroommemberroles/impl/src/main/res/values-ro/translations.xml new file mode 100644 index 0000000000..be944409a1 --- /dev/null +++ b/features/changeroommemberroles/impl/src/main/res/values-ro/translations.xml @@ -0,0 +1,63 @@ + + + "Doar administratori" + "Interziceți persoane" + "Eliminați mesaje" + "Toți" + "Invitați persoane" + "Moderarea membrilor" + "Mesaje și conținut" + "Administratori și moderatori" + "Îndepărtați persoane" + "Schimbați avatarul camerei" + "Detaliile camerei" + "Schimbă numele camerei" + "Schimbați subiectul camerei" + "Trimiteți mesaje" + "Editați administratorii" + "Promovați utilizatorul să aibă același nivel de putere ca dumneavoastră. Nu veți putea anula această acțiune." + "Adăugați administrator?" + "Retrogradare" + "Nu veți putea anula această modificare, deoarece vă retrogradați. Dacă sunteți ultimul utilizator privilegiat din cameră, va fi imposibil să recâștigați privilegiile." + "Vreți să vă retrogradați?" + "%1$s (În așteptare)" + "(În așteptare)" + "Administratorii au automat privilegii de moderator" + "Editați moderatorii" + "Administratori" + "Moderatori" + "Membri" + "Aveți modificări nesalvate." + "Salvați modificările?" + "Nu există utilizatori interziși în această cameră." + + "o persoană" + "%1$d persoane" + + "Eliminați și interziceți membrul" + "Doar înlăturare" + "Anulare excludere" + "Se vor putea alătura din nou acestei săli dacă sunt invitați." + "Anulați interzicerea utilizatorului" + "Excluși" + "Membri" + "În așteptare" + "Administrator" + "Moderator" + "Membrii camerei" + "Se anulează interzicerea lui %1$s" + "Administratori" + "Schimbare rol" + "Degradare la membru" + "Degradare la moderator" + "Moderarea membrilor" + "Mesaje și conținut" + "Moderatori" + "Permisiuni" + "Resetați permisiunile" + "După ce resetați permisiunile, veți pierde setările curente." + "Resetați permisiunile?" + "Roluri" + "Detaliile camerei" + "Roluri și permisiuni" + diff --git a/features/changeroommemberroles/impl/src/main/res/values-ru/translations.xml b/features/changeroommemberroles/impl/src/main/res/values-ru/translations.xml new file mode 100644 index 0000000000..adf745c8cf --- /dev/null +++ b/features/changeroommemberroles/impl/src/main/res/values-ru/translations.xml @@ -0,0 +1,64 @@ + + + "Только администраторы" + "Блокировать людей могут" + "Удалять сообщения могут" + "Все" + "Приглашайте людей и принимайте заявки на присоединение" + "Модерация участников" + "Сообщения и содержание" + "Администраторы и модераторы" + "Удаляйте пользователей и отклоняйте запросы на присоединение" + "Менять изображение комнаты могут" + "Информация о комнате" + "Менять название комнаты могут" + "Менять тему комнаты могут" + "Отправлять сообщения могут" + "Редактировать роль администраторов" + "Вы не сможете отменить это действие. Вы устанавливаете уровень пользователю соответствующий вашему." + "Добавить администратора?" + "Понизить уровень" + "Вы не сможете отменить это изменение, так как понижаете себя статус. Если вы являетесь последним привилегированным пользователем в комнате, восстановить привилегии будет невозможно." + "Понизить свой уровень?" + "%1$s (Ожидание)" + "(В ожидании)" + "Администраторы автоматически получают права модератора" + "Редактировать роль модераторов" + "Администраторы" + "Модераторы" + "Участники" + "У вас есть несохраненные изменения." + "Сохранить изменения?" + "В этой комнате нет заблокированных пользователей." + + "%1$d пользователь" + "%1$d пользователя" + "%1$d пользователей" + + "Удалить и заблокировать участника" + "Только удалить участника" + "Разблокировать" + "Они снова смогут присоединиться в эту комнату если их пригласят." + "Разбанить пользователя?" + "Заблокированные" + "Участники" + "В ожидании" + "Администратор" + "Модератор" + "Участники комнаты" + "Разблокировка %1$s" + "Администраторы" + "Изменить мою роль" + "Понизить до участника" + "Понизить до модератора" + "Модерация участников" + "Сообщения и содержание" + "Модераторы" + "Разрешения" + "Сбросить разрешения" + "Как только вы сбросите разрешения, все текущие настройки будут утеряны." + "Сбросить разрешения?" + "Роли" + "Информация о комнате" + "Роли и разрешения" + diff --git a/features/changeroommemberroles/impl/src/main/res/values-sk/translations.xml b/features/changeroommemberroles/impl/src/main/res/values-sk/translations.xml new file mode 100644 index 0000000000..8d5c6e8502 --- /dev/null +++ b/features/changeroommemberroles/impl/src/main/res/values-sk/translations.xml @@ -0,0 +1,71 @@ + + + "Iba správcovia" + "Zakázať ľudí" + "Odstrániť správy" + "Všetci" + "Pozvite ľudí a prijmite žiadosti o pripojenie" + "Moderovanie členov" + "Správy a obsah" + "Správcovia a moderátori" + "Odstrániť ľudí a odmietnuť žiadosti o pripojenie" + "Zmeniť obrázok miestnosti" + "Podrobnosti o miestnosti" + "Zmeniť názov miestnosti" + "Zmeniť tému miestnosti" + "Odoslať správy" + "Upraviť správcov" + "Túto akciu nebudete môcť vrátiť späť. Zvyšujete úroveň používateľa na rovnakú úroveň výkonu ako máte vy." + "Pridať správcu?" + "Túto akciu nebude možné vrátiť späť. Prenášate vlastníctvo na vybraných používateľov. Po opustení bude táto akcia trvalá." + "Previesť vlastníctvo?" + "Znížiť" + "Túto zmenu nebudete môcť vrátiť späť, pretože znižujete svoju úroveň. Ak ste posledným privilegovaným používateľom v miestnosti, nebude možné získať znova oprávnenia." + "Znížiť svoju úroveň?" + "%1$s (Čaká sa)" + "(Čaká sa)" + "Správcovia majú automaticky oprávnenia moderátora" + "Vlastníci majú automaticky správcovské oprávnenia." + "Upraviť moderátorov" + "Vybrať vlastníkov" + "Správcovia" + "Moderátori" + "Členovia" + "Máte neuložené zmeny." + "Uložiť zmeny?" + "V tejto miestnosti nie sú žiadni zakázaní používatelia." + + "%1$d osoba" + "%1$d osoby" + "%1$d osôb" + + "Odstrániť a zakázať člena" + "Iba odstrániť člena" + "Zrušiť zákaz" + "V prípade pozvania sa budú môcť znova pripojiť k tejto miestnosti." + "Zrušiť zákaz používateľa" + "Zakázaní" + "Členovia" + "Čaká sa" + "Administrátor" + "Moderátor" + "Vlastník" + "Členovia miestnosti" + "Zrušenie zákazu %1$s" + "Správcovia" + "Správcovia a vlastníci" + "Zmeniť moje oprávnenia" + "Znížiť úroveň na člena" + "Znížiť úroveň na moderátora" + "Moderovanie členov" + "Správy a obsah" + "Moderátori" + "Vlastníci" + "Oprávnenia" + "Obnoviť povolenia" + "Po obnovení oprávnení prídete o aktuálne nastavenia." + "Obnoviť oprávnenia?" + "Roly" + "Podrobnosti o miestnosti" + "Roly a povolenia" + diff --git a/features/changeroommemberroles/impl/src/main/res/values-sv/translations.xml b/features/changeroommemberroles/impl/src/main/res/values-sv/translations.xml new file mode 100644 index 0000000000..9153ccc89f --- /dev/null +++ b/features/changeroommemberroles/impl/src/main/res/values-sv/translations.xml @@ -0,0 +1,63 @@ + + + "Endast administratörer" + "Banna personer" + "Ta bort meddelanden" + "Alla" + "Bjuda in personer och acceptera förfrågningar om att gå med" + "Medlemsmoderering" + "Meddelanden och innehåll" + "Administratörer och moderatorer" + "Ta bort personer och avslå förfrågningar om att gå med" + "Byt rumsavatar" + "Rumsdetaljer" + "Byt rumsnamn" + "Byt rumsämne" + "Skicka meddelanden" + "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?" + "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" + "Redigera moderatorer" + "Administratörer" + "Moderatorer" + "Medlemmar" + "Du har osparade ändringar." + "Spara ändringar?" + "Det finns inga bannade användare i det här rummet." + + "%1$d person" + "%1$d personer" + + "Ta bort och banna medlem" + "Ta bara bort medlem" + "Avbanna" + "Denne kommer kunna gå med i rummet igen om denne bjuds in" + "Avbanna användare" + "Bannade" + "Medlemmar" + "Väntar" + "Admin" + "Moderator" + "Rumsmedlemmar" + "Avbannar %1$s" + "Administratörer" + "Ändra min roll" + "Degradera till medlem" + "Degradera till moderator" + "Medlemsmoderering" + "Meddelanden och innehåll" + "Moderatorer" + "Behörigheter" + "Återställ behörigheter" + "När du har återställt behörigheterna kommer du att förlora de aktuella inställningarna." + "Återställ behörigheter?" + "Roller" + "Rumsdetaljer" + "Roller och behörigheter" + diff --git a/features/changeroommemberroles/impl/src/main/res/values-tr/translations.xml b/features/changeroommemberroles/impl/src/main/res/values-tr/translations.xml new file mode 100644 index 0000000000..923320e8de --- /dev/null +++ b/features/changeroommemberroles/impl/src/main/res/values-tr/translations.xml @@ -0,0 +1,63 @@ + + + "Yalnızca yöneticiler" + "İnsanları yasakla" + "Mesajları kaldır" + "Herkes" + "Kişileri davet etme ve katılma isteklerini kabul etme" + "Üye moderasyonu" + "Mesajlar ve içerik" + "Yöneticiler ve moderatörler" + "Kişileri kaldırma ve katılma isteklerini reddetme" + "Oda resmini değiştir" + "Oda bilgileri" + "Oda adını değiştir" + "Oda konusunu değiştir" + "Mesaj gönder" + "Yöneticileri Düzenle" + "Bu eylemi geri alamazsınız. Kullanıcıyı sizinle aynı güç seviyesine sahip olacak şekilde terfi ettiriyorsunuz." + "Yönetici Ekle?" + "Rütbe Düşür" + "Rütbenizi düşürdüğünüz için bu değişikliği geri alamazsınız, eğer odadaki son ayrıcalıklı kullanıcı sizseniz ayrıcalıkları yeniden kazanmanız mümkün olmayacaktır." + "Rütbeni düşür?" + "%1$s (Beklemede)" + "(Beklemede)" + "Yöneticiler otomatik olarak moderatör ayrıcalıklarına sahiptir" + "Moderatörleri Düzenle" + "Yöneticiler" + "Moderatörler" + "Üyeler" + "Kaydedilmemiş değişiklikleriniz var." + "Değişiklikleri Kaydet?" + "Bu odada yasaklı kullanıcı yok." + + "%1$d kişi" + "%1$d kişi" + + "Üyeyi çıkar ve yasakla" + "Yalnızca üyeyi kaldır" + "Yasağı Kaldır" + "Davet edildikleri takdirde bu odaya tekrar katılabileceklerdir." + "Kullanıcının yasağını kaldır" + "Yasaklandı" + "Üyeler" + "Beklemede" + "Yönetici" + "Moderatör" + "Oda üyeleri" + "Yasak kaldırılıyor %1$s" + "Yöneticiler" + "Rolümü değiştir" + "Üyeliğe düşür" + "Moderatörlüğe düşür" + "Üye moderasyonu" + "Mesajlar ve içerik" + "Moderatörler" + "İzinler" + "İzinleri sıfırla" + "İzinleri sıfırladığınızda, mevcut ayarları kaybedersiniz." + "İzinleri sıfırla?" + "Roller" + "Oda bilgileri" + "Roller ve izinler" + diff --git a/features/changeroommemberroles/impl/src/main/res/values-uk/translations.xml b/features/changeroommemberroles/impl/src/main/res/values-uk/translations.xml new file mode 100644 index 0000000000..9c7b3c74f6 --- /dev/null +++ b/features/changeroommemberroles/impl/src/main/res/values-uk/translations.xml @@ -0,0 +1,71 @@ + + + "Тільки для адміністраторів" + "Заблоковувати людей" + "Вилучати повідомлення" + "Усі" + "Запрошувати людей і приймати запити на приєднання" + "Модерація учасників" + "Повідомлення та зміст" + "Адміністратори та модератори" + "Вилучати людей і відхиляти запити на приєднання" + "Змінювати аватар кімнати" + "Деталі кімнати" + "Змінювати назву кімнати" + "Змінювати тему кімнати" + "Надсилати повідомлення" + "Керувати адмінами" + "Ви не зможете скасувати цю дію. Ви просуваєте користувача, щоб він мав такий же рівень прав, як і ви." + "Додати адміністратора?" + "Ви не зможете скасувати цю дію. Ви передаєте право власності вибраним користувачам. Після вашого виходу це буде остаточно." + "Передати право власності?" + "Понизити" + "Ви не зможете скасувати цю зміну, оскільки ви понижуєте себе, якщо ви останній привілейований користувач у кімнаті, відновити повноваження буде неможливо." + "Понизити себе?" + "%1$s (Очікується)" + "(Очікується)" + "Адміністратори автоматично мають повноваження модератора" + "Власники автоматично отримують права адміністратора." + "Керувати модераторами" + "Оберіть власників" + "Адміністратори" + "Модератори" + "Учасники" + "У вас є не збережені зміни." + "Зберегти зміни?" + "У цій кімнаті немає заблокованих користувачів." + + "%1$d особа" + "%1$d особи" + "%1$d осіб" + + "Вилучити й заблокувати учасника" + "Лише вилучити учасника" + "Розблокувати" + "Вони зможуть знову приєднатися до цієї кімнати, якщо їх запросять." + "Розблокувати користувача" + "Заблоковані" + "Учасники" + "На розгляді" + "Адміністратор" + "Модератор" + "Власник" + "Учасники кімнати" + "Розблокування %1$s" + "Адміністратори" + "Адміністратори та власники" + "Змінити мою роль" + "Понизити до учасника" + "Понизити до модератора" + "Модерація учасників" + "Повідомлення та зміст" + "Модератори" + "Власники" + "Дозволи" + "Скинути дозволи" + "Після скидання дозволів ви втратите поточні налаштування." + "Скинути дозволи?" + "Ролі" + "Деталі кімнати" + "Ролі та дозволи" + diff --git a/features/changeroommemberroles/impl/src/main/res/values-ur/translations.xml b/features/changeroommemberroles/impl/src/main/res/values-ur/translations.xml new file mode 100644 index 0000000000..db49a1493b --- /dev/null +++ b/features/changeroommemberroles/impl/src/main/res/values-ur/translations.xml @@ -0,0 +1,63 @@ + + + "صرف منتظمین" + "لوگوں کو محظور کریں" + "پیغامات ہٹائیں" + "ہر کوئی" + "لوگوں کو مدعو کریں اور شمولیت کی درخواستیں قبول کریں" + "ارکان کا اعتدال" + "پیغامات اور مواد" + "منتظمین اور ناظمین" + "لوگوں کو ہٹا دیں اور شمولیت کی درخواستیں مسترد کریں" + "کمرے کا اوتار بدلیں" + "کمرے کی تفصیلات" + "کمرے کا نام بدلیں" + "کمرے کا موضوع بدلیں" + "پیغامات بھیجیں" + "منتظمین میں ترمیم کریں" + "آپ اس کارروائی کو کالعدم نہیں کرسکیں گے۔ آپ صارف کو اپنی جیسی طاقت کی سطح رکھنے کے لئے فروغ دے رہے ہیں۔" + "منتظم شمال کریں؟" + "تنزل کریں" + "آپ اس تبدیلی کو کالعدم نہیں کرسکیں گے کیونکہ آپ اپنے آپ کو تنزل کر رہے ہیں، اگر آپ کمرے میں آخری مراعات یافتہ صارف ہیں تو مراعات پھر حاصل کرنا ناممکن ہو جائے گا۔" + "اپنے آپ کو تنزل کریں؟" + "%1$s (زیر التواء)" + "(زیر التواء)" + "منتظمین کے پاس خودکاراً ناظمین مراعات ہوتی ہیں" + "ناظمین میں ترمیم کریں" + "منتظمین" + "ناظمین" + "اراکین" + "آپکے پاس غیر محفوظ تبدیلیاں ہیں" + "تبدیلیاں محفوظ کریں؟" + "اس کمرے میں کوئی محظور صارفین نہیں ہیں۔" + + "%1$d شخص" + "%1$d اشخاص" + + "کمرے سے محظور کریں" + "رکن کو صرف ہٹائیں" + "غیر محظور کریں" + "اگر وہ مدعو کیا جائیں تو وہ دوبارہ اس کمرے میں شامل ہوسکیں گے۔" + "صارف کو غیر محظور کریں" + "محظور" + "اراکین" + "زیر التواء" + "منتظم" + "ناظم" + "کمرے کے ارکان" + "%1$s کو غیر محظور کر رہا ہے" + "منتظمین" + "میرا کردار تبدیل کریں" + "تا رکن تنزلی کریں" + "تا ناظم تنزلی کریں" + "ارکان کا اعتدال" + "پیغامات اور مواد" + "ناظمین" + "اجازتیں" + "اجازتیں بحال کریں" + "ایک بار جب آپ اجازتیں بحال کردیں گے، آپ موجودہ ترتیبات کھو دیں گے۔" + "اجازتیں بحال کریں؟" + "کردارہا" + "کمرے کی تفصیلات" + "کردارہا اور اجازتیں" + diff --git a/features/changeroommemberroles/impl/src/main/res/values-uz/translations.xml b/features/changeroommemberroles/impl/src/main/res/values-uz/translations.xml new file mode 100644 index 0000000000..29df30f421 --- /dev/null +++ b/features/changeroommemberroles/impl/src/main/res/values-uz/translations.xml @@ -0,0 +1,10 @@ + + + "Har kim" + + "%1$dodam" + "%1$dodamlar" + + "Kutilmoqda" + "Xona a\'zolari" + 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 new file mode 100644 index 0000000000..0aaee24ce2 --- /dev/null +++ b/features/changeroommemberroles/impl/src/main/res/values-zh-rTW/translations.xml @@ -0,0 +1,62 @@ + + + "僅限管理員" + "管理黑名單" + "移除訊息" + "所有人" + "邀請夥伴並接受加入請求" + "成員管理" + "訊息與內容" + "管理員和版主" + "移除夥伴並拒絕加入請求" + "變更聊天室大頭照" + "聊天室資訊" + "變更聊天室名稱" + "變更聊天室主題" + "傳送訊息" + "編輯管理員" + "您將無法復原此動作。您正將使用者提昇至與您相同的權力等級。" + "要新增管理員嗎?" + "降級" + "當您自行降級時,您將無法復原此變更,若您是聊天室中的最後一位特權使用者,則無法重新獲得權限。" + "將自己降級?" + "%1$s(擱置中)" + "(擱置中)" + "管理員自動擁有版主權限" + "編輯版主" + "管理員" + "版主" + "成員" + "您有尚未儲存的變更" + "是否儲存變更?" + "此聊天室沒有黑名單。" + + "%1$d 位夥伴" + + "踢出並加入黑名單" + "僅移除成員" + "解除黑名單" + "如果收到邀請,他們能再次加入聊天室。" + "解除黑名單" + "黑名單" + "成員" + "待定" + "管理員" + "版主" + "聊天室成員" + "正在解除黑名單 %1$s" + "管理員" + "變更我的身份" + "降級為普通成員" + "降級為版主" + "成員管理" + "訊息與內容" + "版主" + "權限" + "重設權限" + "重設之後,您會遺失當前的設定。" + "確定要重設權限嗎?" + "身份" + "聊天室資訊" + "身份與權限" + diff --git a/features/changeroommemberroles/impl/src/main/res/values-zh/translations.xml b/features/changeroommemberroles/impl/src/main/res/values-zh/translations.xml new file mode 100644 index 0000000000..db1481b4d4 --- /dev/null +++ b/features/changeroommemberroles/impl/src/main/res/values-zh/translations.xml @@ -0,0 +1,62 @@ + + + "仅限管理员" + "封禁成员" + "移除消息" + "所有人" + "邀请他人及接受加入请求" + "成员权限" + "消息和内容" + "管理员和协管员" + "移除成员及拒绝加入请求" + "更改聊天室头像" + "聊天室详情" + "更改聊天室名称" + "更改聊天室主题" + "发送消息" + "编辑管理员" + "您将无法撤消此操作。您正在提升用户的权限,使其拥有与您平权。" + "添加管理员?" + "降级" + "您正在降级,此更改将无法撤消。如果您是聊天室中的最后一个特权用户,则无法重新获得权限。" + "降级自己?" + "%1$s(待处理)" + "(已邀请)" + "管理员自动拥有协管员权限" + "编辑协管员" + "管理员" + "协管员" + "成员" + "您有未保存的更改。" + "保存更改?" + "此聊天室里没有被封禁的用户。" + + "%1$d 人" + + "移除并封禁成员" + "仅移除成员" + "取消封禁" + "如果受到邀请,他们可以重新加入聊天室。" + "解封用户" + "已封禁用户" + "成员" + "待处理" + "管理员" + "协管员" + "聊天室成员" + "解除封禁 %1$s" + "管理员" + "更改我的角色" + "降级为成员" + "降级为协管员" + "成员权限" + "消息和内容" + "协管员" + "权限" + "重置权限" + "重置权限后,您将丢失当前设置。" + "重置权限?" + "角色" + "聊天室详情" + "角色与权限" + 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 0025a64df3..a3e8f67edf 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 @@ -37,6 +37,7 @@ import io.element.android.libraries.matrix.ui.media.AvatarAction import io.element.android.libraries.matrix.ui.room.address.RoomAddressValidity import io.element.android.libraries.matrix.ui.room.address.RoomAddressValidityEffect import io.element.android.libraries.mediapickers.api.PickerProvider +import io.element.android.libraries.mediaupload.api.MediaOptimizationConfigProvider import io.element.android.libraries.mediaupload.api.MediaPreProcessor import io.element.android.libraries.permissions.api.PermissionsEvents import io.element.android.libraries.permissions.api.PermissionsPresenter @@ -57,6 +58,7 @@ class ConfigureRoomPresenter @Inject constructor( permissionsPresenterFactory: PermissionsPresenter.Factory, private val featureFlagService: FeatureFlagService, private val roomAliasHelper: RoomAliasHelper, + private val mediaOptimizationConfigProvider: MediaOptimizationConfigProvider, ) : Presenter { private val cameraPermissionPresenter: PermissionsPresenter = permissionsPresenterFactory.create(android.Manifest.permission.CAMERA) private var pendingPermissionRequest = false @@ -201,7 +203,7 @@ class ConfigureRoomPresenter @Inject constructor( uri = avatarUri, mimeType = MimeTypes.Jpeg, deleteOriginal = false, - compressIfPossible = false, + mediaOptimizationConfig = mediaOptimizationConfigProvider.get(), ).getOrThrow() val byteArray = preprocessed.file.readBytes() return matrixClient.uploadMedia(MimeTypes.Jpeg, byteArray, null).getOrThrow() 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/createroom/impl/configureroom/ConfigureBaseRoomPresenterTest.kt index a0a4783093..8c8ba7ca58 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/createroom/impl/configureroom/ConfigureBaseRoomPresenterTest.kt @@ -35,6 +35,7 @@ import io.element.android.libraries.mediapickers.api.PickerProvider import io.element.android.libraries.mediapickers.test.FakePickerProvider import io.element.android.libraries.mediaupload.api.MediaPreProcessor import io.element.android.libraries.mediaupload.api.MediaUploadInfo +import io.element.android.libraries.mediaupload.test.FakeMediaOptimizationConfigProvider import io.element.android.libraries.mediaupload.test.FakeMediaPreProcessor import io.element.android.libraries.permissions.api.PermissionsPresenter import io.element.android.libraries.permissions.test.FakePermissionsPresenter @@ -411,6 +412,7 @@ class ConfigureBaseRoomPresenterTest { analyticsService: AnalyticsService = FakeAnalyticsService(), permissionsPresenter: PermissionsPresenter = FakePermissionsPresenter(), isKnockFeatureEnabled: Boolean = true, + mediaOptimizationConfigProvider: FakeMediaOptimizationConfigProvider = FakeMediaOptimizationConfigProvider(), ) = ConfigureRoomPresenter( dataStore = createRoomDataStore, matrixClient = matrixClient, @@ -421,6 +423,7 @@ class ConfigureBaseRoomPresenterTest { roomAliasHelper = roomAliasHelper, featureFlagService = FakeFeatureFlagService( mapOf(FeatureFlags.Knock.key to isKnockFeatureEnabled) - ) + ), + mediaOptimizationConfigProvider = mediaOptimizationConfigProvider, ) } diff --git a/features/ftue/impl/src/main/kotlin/io/element/android/features/ftue/impl/welcome/WelcomeNode.kt b/features/ftue/impl/src/main/kotlin/io/element/android/features/ftue/impl/welcome/WelcomeNode.kt deleted file mode 100644 index a624db937f..0000000000 --- a/features/ftue/impl/src/main/kotlin/io/element/android/features/ftue/impl/welcome/WelcomeNode.kt +++ /dev/null @@ -1,43 +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.ftue.impl.welcome - -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 dagger.assisted.Assisted -import dagger.assisted.AssistedInject -import io.element.android.anvilannotations.ContributesNode -import io.element.android.libraries.core.meta.BuildMeta -import io.element.android.libraries.di.AppScope - -@ContributesNode(AppScope::class) -class WelcomeNode @AssistedInject constructor( - @Assisted buildContext: BuildContext, - @Assisted plugins: List, - private val buildMeta: BuildMeta, -) : Node(buildContext, plugins = plugins) { - interface Callback : Plugin { - fun onContinueClick() - } - - private fun onContinueClick() { - plugins.filterIsInstance().forEach { it.onContinueClick() } - } - - @Composable - override fun View(modifier: Modifier) { - WelcomeView( - applicationName = buildMeta.applicationName, - onContinueClick = ::onContinueClick, - modifier = modifier - ) - } -} diff --git a/features/ftue/impl/src/main/kotlin/io/element/android/features/ftue/impl/welcome/WelcomeView.kt b/features/ftue/impl/src/main/kotlin/io/element/android/features/ftue/impl/welcome/WelcomeView.kt deleted file mode 100644 index b68f8e711b..0000000000 --- a/features/ftue/impl/src/main/kotlin/io/element/android/features/ftue/impl/welcome/WelcomeView.kt +++ /dev/null @@ -1,109 +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.ftue.impl.welcome - -import androidx.activity.compose.BackHandler -import androidx.compose.foundation.layout.Column -import androidx.compose.foundation.layout.Spacer -import androidx.compose.foundation.layout.fillMaxSize -import androidx.compose.foundation.layout.fillMaxWidth -import androidx.compose.foundation.layout.height -import androidx.compose.foundation.layout.systemBarsPadding -import androidx.compose.foundation.rememberScrollState -import androidx.compose.foundation.verticalScroll -import androidx.compose.runtime.Composable -import androidx.compose.ui.Alignment -import androidx.compose.ui.Modifier -import androidx.compose.ui.res.stringResource -import androidx.compose.ui.text.style.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.features.ftue.impl.R -import io.element.android.libraries.designsystem.atomic.atoms.ElementLogoAtom -import io.element.android.libraries.designsystem.atomic.atoms.ElementLogoAtomSize -import io.element.android.libraries.designsystem.atomic.organisms.InfoListItem -import io.element.android.libraries.designsystem.atomic.organisms.InfoListOrganism -import io.element.android.libraries.designsystem.atomic.pages.OnBoardingPage -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 -import io.element.android.libraries.designsystem.theme.components.Text -import io.element.android.libraries.testtags.TestTags -import io.element.android.libraries.testtags.testTag -import io.element.android.libraries.ui.strings.CommonStrings -import kotlinx.collections.immutable.persistentListOf - -@Composable -fun WelcomeView( - applicationName: String, - onContinueClick: () -> Unit, - modifier: Modifier = Modifier, -) { - BackHandler(onBack = onContinueClick) - OnBoardingPage( - modifier = modifier - .systemBarsPadding() - .fillMaxSize(), - content = { - Column( - modifier = Modifier - .fillMaxWidth() - .verticalScroll(rememberScrollState()), - horizontalAlignment = Alignment.CenterHorizontally, - ) { - Spacer(modifier = Modifier.height(78.dp)) - ElementLogoAtom(size = ElementLogoAtomSize.Medium) - Spacer(modifier = Modifier.height(32.dp)) - Text( - modifier = Modifier.testTag(TestTags.welcomeScreenTitle), - text = stringResource(R.string.screen_welcome_title, applicationName), - style = ElementTheme.typography.fontHeadingMdBold, - color = ElementTheme.colors.textPrimary, - textAlign = TextAlign.Center, - ) - Spacer(modifier = Modifier.height(80.dp)) - InfoListOrganism( - items = listItems(), - textStyle = ElementTheme.typography.fontBodyMdMedium, - iconTint = ElementTheme.colors.iconSecondary, - backgroundColor = ElementTheme.colors.bgCanvasDefault.copy(alpha = 0.7f), - ) - Spacer(modifier = Modifier.height(32.dp)) - } - }, - footer = { - Button( - text = stringResource(CommonStrings.action_continue), - modifier = Modifier.fillMaxWidth(), - onClick = onContinueClick - ) - Spacer(modifier = Modifier.height(32.dp)) - } - ) -} - -@Composable -private fun listItems() = persistentListOf( - InfoListItem( - message = stringResource(R.string.screen_welcome_bullet_2), - iconVector = CompoundIcons.Lock(), - ), - InfoListItem( - message = stringResource(R.string.screen_welcome_bullet_3), - iconVector = CompoundIcons.ChatProblem(), - ), -) - -@PreviewsDayNight -@Composable -internal fun WelcomeViewPreview() { - ElementPreview { - WelcomeView(applicationName = "Element X", onContinueClick = {}) - } -} diff --git a/features/ftue/impl/src/main/kotlin/io/element/android/features/ftue/impl/welcome/state/SharedPreferencesWelcomeScreenStore.kt b/features/ftue/impl/src/main/kotlin/io/element/android/features/ftue/impl/welcome/state/SharedPreferencesWelcomeScreenStore.kt deleted file mode 100644 index 701d442aca..0000000000 --- a/features/ftue/impl/src/main/kotlin/io/element/android/features/ftue/impl/welcome/state/SharedPreferencesWelcomeScreenStore.kt +++ /dev/null @@ -1,39 +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.ftue.impl.welcome.state - -import android.content.SharedPreferences -import androidx.core.content.edit -import com.squareup.anvil.annotations.ContributesBinding -import io.element.android.libraries.di.AppScope -import io.element.android.libraries.di.SingleIn -import javax.inject.Inject - -@ContributesBinding(AppScope::class) -@SingleIn(AppScope::class) -class SharedPreferencesWelcomeScreenStore @Inject constructor( - private val sharedPreferences: SharedPreferences, -) : WelcomeScreenStore { - companion object { - private const val IS_WELCOME_SCREEN_SHOWN = "is_welcome_screen_shown" - } - - override fun isWelcomeScreenNeeded(): Boolean { - return sharedPreferences.getBoolean(IS_WELCOME_SCREEN_SHOWN, false).not() - } - - override fun setWelcomeScreenShown() { - sharedPreferences.edit().putBoolean(IS_WELCOME_SCREEN_SHOWN, true).apply() - } - - override fun reset() { - sharedPreferences.edit { - remove(IS_WELCOME_SCREEN_SHOWN) - } - } -} diff --git a/features/ftue/impl/src/main/kotlin/io/element/android/features/ftue/impl/welcome/state/WelcomeScreenStore.kt b/features/ftue/impl/src/main/kotlin/io/element/android/features/ftue/impl/welcome/state/WelcomeScreenStore.kt deleted file mode 100644 index a829feaf90..0000000000 --- a/features/ftue/impl/src/main/kotlin/io/element/android/features/ftue/impl/welcome/state/WelcomeScreenStore.kt +++ /dev/null @@ -1,14 +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.ftue.impl.welcome.state - -interface WelcomeScreenStore { - fun isWelcomeScreenNeeded(): Boolean - fun setWelcomeScreenShown() - fun reset() -} diff --git a/features/ftue/impl/src/main/res/values-be/translations.xml b/features/ftue/impl/src/main/res/values-be/translations.xml index 6c10902ca6..949410ce73 100644 --- a/features/ftue/impl/src/main/res/values-be/translations.xml +++ b/features/ftue/impl/src/main/res/values-be/translations.xml @@ -13,10 +13,4 @@ "Вы можаце змяніць налады пазней." "Дазвольце апавяшчэнні і ніколі не прапускайце іх" "Увядзіце ключ аднаўлення" - "Званкі, апытанні, пошук і многае іншае будзе дададзена пазней у гэтым годзе." - "Гісторыя паведамленняў для зашыфраваных пакояў пакуль недаступна." - "Мы будзем рады пачуць вашае меркаванне, паведаміце нам аб гэтым праз старонку налад." - "Пачнём!" - "Вось што вам трэба ведаць:" - "Вітаем у %1$s!" diff --git a/features/ftue/impl/src/main/res/values-bg/translations.xml b/features/ftue/impl/src/main/res/values-bg/translations.xml index 7918ac7a0c..0b7bd3de3e 100644 --- a/features/ftue/impl/src/main/res/values-bg/translations.xml +++ b/features/ftue/impl/src/main/res/values-bg/translations.xml @@ -10,6 +10,4 @@ "Можете да промените настройките си по-късно." "Разрешете известията и никога не пропускайте съобщение" "Въвеждане на ключ за възстановяване" - "Хронологията на съобщенията за шифровани стаи все още не е налична." - "Добре дошли в %1$s!" diff --git a/features/ftue/impl/src/main/res/values-cs/translations.xml b/features/ftue/impl/src/main/res/values-cs/translations.xml index 9d852feed6..6190f04faa 100644 --- a/features/ftue/impl/src/main/res/values-cs/translations.xml +++ b/features/ftue/impl/src/main/res/values-cs/translations.xml @@ -13,10 +13,4 @@ "Nastavení můžete později změnit." "Povolte oznámení a nezmeškejte žádnou zprávu" "Zadejte klíč pro obnovení" - "Hovory, hlasování, vyhledávání a další budou přidány koncem tohoto roku." - "Historie zpráv šifrovaných místností nebude v této aktualizaci k dispozici." - "Rádi bychom se od vás dozvěděli, co si o tom myslíte, dejte nám vědět prostřednictvím stránky s nastavením." - "Jdeme na to!" - "Zde je to, co potřebujete vědět:" - "Vítá vás %1$s!" diff --git a/features/ftue/impl/src/main/res/values-cy/translations.xml b/features/ftue/impl/src/main/res/values-cy/translations.xml index bf87c2ca70..c9ed3c04e1 100644 --- a/features/ftue/impl/src/main/res/values-cy/translations.xml +++ b/features/ftue/impl/src/main/res/values-cy/translations.xml @@ -13,10 +13,4 @@ "Gallwch newid eich gosodiadau yn nes ymlaen." "Caniatáu hysbysiadau a pheidio byth â cholli neges" "Rhowch eich allwedd adfer" - "Bydd galwadau, pleidleisiau, chwilio a mwy yn cael eu hychwanegu yn ddiweddarach eleni." - "Nid yw hanes negeseuon ar gyfer ystafelloedd sydd wedi\'u hamgryptio ar gael eto." - "Byddem wrth ein bodd yn clywed gennych, gadewch i ni wybod beth yw eich barn drwy\'r dudalen gosodiadau." - "Ymlaen!" - "Dyma beth sydd angen i chi ei wybod:" - "Croeso i %1$s!" diff --git a/features/ftue/impl/src/main/res/values-da/translations.xml b/features/ftue/impl/src/main/res/values-da/translations.xml index b1ae89a3b4..abbf00f49d 100644 --- a/features/ftue/impl/src/main/res/values-da/translations.xml +++ b/features/ftue/impl/src/main/res/values-da/translations.xml @@ -13,10 +13,4 @@ "Du kan ændre dine indstillinger senere." "Tillad notifikationer, og gå aldrig glip af en besked" "Indtast gendannelsesnøgle" - "Opkald, afstemninger, søgninger og mere vil blive tilføjet senere på året." - "Beskedhistorik for krypterede rum er ikke tilgængelig endnu." - "Vi vil meget gerne høre fra dig. Fortæl os din mening via indstillingssiden." - "Lad os komme i gang!" - "Her er, hvad du har brug for at vide:" - "Velkommen til %1$s!" diff --git a/features/ftue/impl/src/main/res/values-de/translations.xml b/features/ftue/impl/src/main/res/values-de/translations.xml index 10473d297e..773cdc09f8 100644 --- a/features/ftue/impl/src/main/res/values-de/translations.xml +++ b/features/ftue/impl/src/main/res/values-de/translations.xml @@ -13,10 +13,4 @@ "Sie können Ihre Einstellungen später ändern." "Erlaube Benachrichtigungen und verpasse keine Nachricht" "Wiederherstellungsschlüssel eingeben" - "Anrufe, Umfragen, Suchfunktionen und mehr werden im Laufe des Jahres hinzugefügt." - "Der Nachrichtenverlauf für verschlüsselte Räume wird in diesem Update nicht verfügbar sein." - "Wir würden uns freuen, von dir zu hören. Teile uns deine Meinung über die Einstellungsseite mit." - "Los geht\'s!" - "Folgendes sollten Sie wissen:" - "Willkommen bei %1$s!" diff --git a/features/ftue/impl/src/main/res/values-el/translations.xml b/features/ftue/impl/src/main/res/values-el/translations.xml index 585f5f0952..f9029a7948 100644 --- a/features/ftue/impl/src/main/res/values-el/translations.xml +++ b/features/ftue/impl/src/main/res/values-el/translations.xml @@ -13,10 +13,4 @@ "Μπορείς να αλλάξεις τις ρυθμίσεις σου αργότερα." "Επέτρεψε τις ειδοποιήσεις και μην χάσεις ούτε ένα μήνυμα" "Εισαγωγή κλειδιού ανάκτησης" - "Κλήσεις, δημοσκοπήσεις, αναζήτηση και άλλα, θα προστεθούν αργότερα φέτος." - "Το ιστορικό μηνυμάτων για κρυπτογραφημένες αίθουσες δεν είναι ακόμη διαθέσιμο." - "Θα θέλαμε να ακούσουμε τη γνώμη σου, πες μας τη γνώμη σου μέσω της σελίδας ρυθμίσεων." - "Πάμε!" - "Να τί πρέπει να ξέρεις:" - "Καλώς ήρθες στο %1$s!" diff --git a/features/ftue/impl/src/main/res/values-es/translations.xml b/features/ftue/impl/src/main/res/values-es/translations.xml index 36015aa6dd..111821f026 100644 --- a/features/ftue/impl/src/main/res/values-es/translations.xml +++ b/features/ftue/impl/src/main/res/values-es/translations.xml @@ -13,10 +13,4 @@ "Puedes cambiar la configuración más tarde." "Activa las notificaciones y nunca te pierdas un mensaje" "Introduce la clave de recuperación" - "Las llamadas, las encuestas, la búsqueda y más se agregarán más adelante este año." - "El historial de mensajes de las salas cifradas aún no está disponible." - "Nos encantaría saber de ti, haznos saber lo que piensas a través de la página de configuración." - "¡Vamos!" - "Esto es lo que necesitas saber:" - "¡Bienvenido a %1$s!" diff --git a/features/ftue/impl/src/main/res/values-et/translations.xml b/features/ftue/impl/src/main/res/values-et/translations.xml index 09762a4f63..c1898c3ce1 100644 --- a/features/ftue/impl/src/main/res/values-et/translations.xml +++ b/features/ftue/impl/src/main/res/values-et/translations.xml @@ -13,10 +13,4 @@ "Sa võid seadistusi hiljem alati muuta." "Luba teavitused ja kunagi ei jää sul sõnumid märkamata" "Sisesta taastevõti" - "Kõned, küsitlused, otsing ja palju muud lisanduvad hiljem selle aasta jooksul." - "Krüptitud jututubade sõnumite ajalugu pole veel saadaval." - "Me soovime teada mida sa arvad. Seadistuste lehel olevast valikust võid saata meile oma kommentaare." - "Alustame!" - "Sa peaksid teadma alljärgnevat:" - "Tere tulemast rakendusse %1$s!" diff --git a/features/ftue/impl/src/main/res/values-eu/translations.xml b/features/ftue/impl/src/main/res/values-eu/translations.xml index 2dcdff7330..f512a62a33 100644 --- a/features/ftue/impl/src/main/res/values-eu/translations.xml +++ b/features/ftue/impl/src/main/res/values-eu/translations.xml @@ -13,9 +13,4 @@ "Geroago alda ditzakezu ezarpenak." "Baimendu jakinarazpenak eta ez galdu inoiz mezurik" "Sartu berreskuratze-gakoa" - "Deiak, inkestak, bilaketa eta gehiago gehituko dira aurten." - "Enkriptatutako geletarako mezuen historia ez dago oraindik erabilgarri." - "Goazen!" - "Hona hemen jakin beharrekoa:" - "Ongi etorri %1$s(e)ra!" diff --git a/features/ftue/impl/src/main/res/values-fa/translations.xml b/features/ftue/impl/src/main/res/values-fa/translations.xml index 72151a1176..8c2b5ae2bc 100644 --- a/features/ftue/impl/src/main/res/values-fa/translations.xml +++ b/features/ftue/impl/src/main/res/values-fa/translations.xml @@ -13,10 +13,4 @@ "می‌توانید بعداً تنظیماتتان را تغییر دهید." "اجازه به آگاهی‌ها و از دست ندادن پیام‌ها" "ورود کلید بازیابی" - "تماس ها، نظرسنجی، جستجو و موارد دیگر در اواخر امسال اضافه خواهند شد." - "سابقه پیام برای اتاق های رمزگذاری شده هنوز دردسترس نیست." - "ما دوست داریم از شما بشنویم، نظر خود را از طریق صفحه تنظیمات با ما در میان بگذارید." - "بزن بریم!" - "چیزهایی که باید بدانید:" - "به %1$s خوش آمدید!" diff --git a/features/ftue/impl/src/main/res/values-fi/translations.xml b/features/ftue/impl/src/main/res/values-fi/translations.xml index 3f3110bcdf..cc3ee454f7 100644 --- a/features/ftue/impl/src/main/res/values-fi/translations.xml +++ b/features/ftue/impl/src/main/res/values-fi/translations.xml @@ -13,10 +13,4 @@ "Voit muuttaa asetuksia myöhemmin." "Salli ilmoitukset ja älä koskaan missaa viestejä" "Syötä palautusavain" - "Puhelut, kyselyt, haku ja paljon muuta lisätään myöhemmin tänä vuonna." - "Salattujen huoneiden viestihistoria ei ole vielä käytettävissä." - "Haluaisimme kuulla mielipiteesi, kerro mitä mieltä olet asetuksien kautta." - "Mennään!" - "Tässä on mitä sinun tarvitsee tietää:" - "Tervetuloa %1$s -sovellukseen!" diff --git a/features/ftue/impl/src/main/res/values-fr/translations.xml b/features/ftue/impl/src/main/res/values-fr/translations.xml index 0439601447..43bc6e0b44 100644 --- a/features/ftue/impl/src/main/res/values-fr/translations.xml +++ b/features/ftue/impl/src/main/res/values-fr/translations.xml @@ -13,10 +13,4 @@ "Vous pourrez modifier vos paramètres ultérieurement." "Autorisez les notifications et ne manquez aucun message" "Utiliser la clé de récupération" - "Les appels, les sondages, les recherches et plus encore seront ajoutés plus tard cette année." - "L’historique des messages pour les salons chiffrés ne sera pas disponible dans cette mise à jour." - "N’hésitez pas à nous faire part de vos commentaires via l’écran des paramètres." - "C’est parti !" - "Voici ce que vous devez savoir :" - "Bienvenue dans %1$s !" diff --git a/features/ftue/impl/src/main/res/values-hu/translations.xml b/features/ftue/impl/src/main/res/values-hu/translations.xml index 5dfdedd4b0..90a2667d85 100644 --- a/features/ftue/impl/src/main/res/values-hu/translations.xml +++ b/features/ftue/impl/src/main/res/values-hu/translations.xml @@ -13,10 +13,4 @@ "A beállításokat később is módosíthatja." "Értesítések engedélyezése, hogy soha ne maradjon le egyetlen üzenetről sem" "Adja meg a helyreállítási kulcsot" - "A hívások, szavazások, keresések és egyebek az év további részében kerülnek hozzáadásra." - "A titkosított szobák üzenetelőzményei nem lesznek elérhetők ebben a frissítésben." - "Szeretnénk hallani a véleményét, ossza meg velünk a beállítások oldalon." - "Lássunk neki!" - "A következőket kell tudnia:" - "Üdvözli az %1$s!" diff --git a/features/ftue/impl/src/main/res/values-in/translations.xml b/features/ftue/impl/src/main/res/values-in/translations.xml index 5325b7f58d..3b6f878afc 100644 --- a/features/ftue/impl/src/main/res/values-in/translations.xml +++ b/features/ftue/impl/src/main/res/values-in/translations.xml @@ -13,10 +13,4 @@ "Anda dapat mengubah pengaturan Anda nanti." "Izinkan pemberitahuan dan jangan pernah melewatkan pesan" "Masukkan kunci pemulihan" - "Panggilan, pemungutan suara, pencarian, dan lainnya akan ditambahkan di tahun ini." - "Riwayat pesan untuk ruangan terenkripsi tidak akan tersedia dalam pembaruan ini." - "Kami ingin mendengar dari Anda, beri tahu kami pendapat Anda melalui halaman pengaturan." - "Ayo!" - "Berikut adalah yang perlu Anda ketahui:" - "Selamat datang di %1$s!" diff --git a/features/ftue/impl/src/main/res/values-it/translations.xml b/features/ftue/impl/src/main/res/values-it/translations.xml index 3992acd63e..c8c4766d2f 100644 --- a/features/ftue/impl/src/main/res/values-it/translations.xml +++ b/features/ftue/impl/src/main/res/values-it/translations.xml @@ -13,10 +13,4 @@ "Potrai modificare le tue impostazioni in seguito." "Consenti le notifiche e non perdere mai un messaggio" "Inserisci la chiave di recupero" - "Chiamate, sondaggi, ricerche e altro ancora saranno aggiunti nel corso dell\'anno." - "La cronologia dei messaggi per le stanze crittografate non è ancora disponibile." - "Ci piacerebbe sentire il tuo parere, facci sapere cosa ne pensi tramite la pagina delle impostazioni." - "Andiamo!" - "Ecco cosa c\'è da sapere:" - "Benvenuti in %1$s!" diff --git a/features/ftue/impl/src/main/res/values-ka/translations.xml b/features/ftue/impl/src/main/res/values-ka/translations.xml index f8ae896aba..7118eaf913 100644 --- a/features/ftue/impl/src/main/res/values-ka/translations.xml +++ b/features/ftue/impl/src/main/res/values-ka/translations.xml @@ -9,10 +9,4 @@ "თქვენ შეგიძლიათ შეცვალოთ თქვენი პარამეტრები მოგვიანებით." "ყველა შეტყობინებაზე შეტყობინებების მიღება" "შეიყვანეთ აღდგენის გასაღები" - "ზარები, გამოკითხვები, ძიება და სხვა დაემატება ამ წლის ბოლოს." - "დაშიფრული ოთახებისთვის შეტყობინებების ისტორია ჯერ არ არის ხელმისაწვდომი." - "ჩვენ სიამოვნებით მოვისმინოთ თქვენგან, შეგვატყობინეთ რას ფიქრობთ პარამეტრების გვერდზე." - "დავიწყოთ!" - "აი, რა უნდა იცოდეთ:" - "კეთილი იყოს თქვენი მობრძანება %1$s-ში!" diff --git a/features/ftue/impl/src/main/res/values-nb/translations.xml b/features/ftue/impl/src/main/res/values-nb/translations.xml index 61810952ba..aa0f4a1443 100644 --- a/features/ftue/impl/src/main/res/values-nb/translations.xml +++ b/features/ftue/impl/src/main/res/values-nb/translations.xml @@ -13,10 +13,4 @@ "Du kan endre innstillingene dine senere." "Tillat varslinger og gå aldri glipp av en melding" "Skriv inn gjenopprettingsnøkkel" - "Samtaler, avstemninger, søk og mer vil bli lagt til senere i år." - "Meldingshistorikk for krypterte rom er ikke tilgjengelig ennå." - "Vi vil gjerne høre fra deg, så la oss få vite hva du synes via innstillingssiden." - "Kom igjen!" - "Her er hva du trenger å vite:" - "Velkommen til %1$s!" diff --git a/features/ftue/impl/src/main/res/values-nl/translations.xml b/features/ftue/impl/src/main/res/values-nl/translations.xml index 459b003e53..ca49c620af 100644 --- a/features/ftue/impl/src/main/res/values-nl/translations.xml +++ b/features/ftue/impl/src/main/res/values-nl/translations.xml @@ -13,10 +13,4 @@ "Je kunt je instellingen later wijzigen." "Sta meldingen toe en mis nooit meer een bericht" "Voer herstelsleutel in" - "Oproepen, peilingen, zoekopdrachten en meer zullen later dit jaar worden toegevoegd." - "Berichtgeschiedenis voor versleutelde kamers is nog niet beschikbaar." - "We horen graag van je, laat ons weten wat je ervan vindt via de instellingenpagina." - "Aan de slag!" - "Dit is wat je moet weten:" - "Welkom bij %1$s!" diff --git a/features/ftue/impl/src/main/res/values-pl/translations.xml b/features/ftue/impl/src/main/res/values-pl/translations.xml index 682bae9cf9..c348c9b4f5 100644 --- a/features/ftue/impl/src/main/res/values-pl/translations.xml +++ b/features/ftue/impl/src/main/res/values-pl/translations.xml @@ -13,10 +13,4 @@ "Możesz zmienić ustawienia później." "Zezwól na powiadomienia i nie przegap żadnej wiadomości" "Wprowadź klucz przywracania" - "Połączenia, ankiety, wyszukiwanie i inne zostaną dodane później w tym roku." - "Historia wiadomości dla pokoi szyfrowanych nie jest jeszcze dostępna." - "Chętnie poznamy Twoją opinię. Daj nam znać, co myślisz na stronie ustawień." - "Naprzód!" - "Oto, co musisz wiedzieć:" - "Witamy w %1$s!" diff --git a/features/ftue/impl/src/main/res/values-pt-rBR/translations.xml b/features/ftue/impl/src/main/res/values-pt-rBR/translations.xml index 223ceedd31..6e280bf479 100644 --- a/features/ftue/impl/src/main/res/values-pt-rBR/translations.xml +++ b/features/ftue/impl/src/main/res/values-pt-rBR/translations.xml @@ -13,10 +13,4 @@ "Você pode alterar suas configurações mais tarde." "Permita notificações e nunca perca uma mensagem" "Insira a chave de recuperação" - "Chamadas, enquetes, pesquisa e muito mais serão adicionadas ainda este ano." - "O histórico de mensagens para salas criptografadas ainda não está disponível." - "Adoraríamos ouvir sua opinião. Deixe-nos saber o que você pensa através da página de configurações." - "Vamos lá!" - "Aqui está o que você precisa saber:" - "Bem-vindo ao %1$s!" diff --git a/features/ftue/impl/src/main/res/values-pt/translations.xml b/features/ftue/impl/src/main/res/values-pt/translations.xml index d96caa5065..c05eca2af5 100644 --- a/features/ftue/impl/src/main/res/values-pt/translations.xml +++ b/features/ftue/impl/src/main/res/values-pt/translations.xml @@ -13,10 +13,4 @@ "Podes alterar as tuas definições mais tarde." "Permite as notificações e nunca percas uma mensagem" "Insere a chave de recuperação" - "Chamadas, sondagens, pesquisa e mais funcionalidades vão ser adicionadas ao longo do ano." - "O histórico de mensagens em salas cifradas ainda não está disponível." - "Gostaríamos de ouvir a tua opinião, diz-nos o que pensas através da página de configurações." - "Vamos lá!" - "Eis o que tens de saber:" - "Bem-vindo à %1$s!" diff --git a/features/ftue/impl/src/main/res/values-ro/translations.xml b/features/ftue/impl/src/main/res/values-ro/translations.xml index 4d2c9febae..b58414a275 100644 --- a/features/ftue/impl/src/main/res/values-ro/translations.xml +++ b/features/ftue/impl/src/main/res/values-ro/translations.xml @@ -13,10 +13,4 @@ "Puteți modifica setările mai târziu." "Permiteți notificările și nu pierdeți niciodată un mesaj" "Introduceți cheia de recuperare" - "Apelurile, sondajele, căutare și multe altele vor fi adăugate în cursul acestui an." - "Istoricul mesajelor pentru camerele criptate nu va fi disponibil în această actualizare." - "Ne-ar plăcea să auzim de la dumneavoastră, spuneți-ne ce părere aveți prin intermediul paginii de setări." - "Să începem!" - "Iată ce trebuie să știți:" - "Bun venit la%1$s!" diff --git a/features/ftue/impl/src/main/res/values-ru/translations.xml b/features/ftue/impl/src/main/res/values-ru/translations.xml index d287e65640..75a927e927 100644 --- a/features/ftue/impl/src/main/res/values-ru/translations.xml +++ b/features/ftue/impl/src/main/res/values-ru/translations.xml @@ -13,10 +13,4 @@ "Вы можете изменить настройки позже." "Разрешите отправку уведомлений и ни одно сообщение не будет пропущено" "Введите ключ восстановления" - "Звонки, опросы, поиск и многое другое будут добавлены позже в этом году." - "История сообщений для зашифрованных комнат в этом обновлении будет недоступна." - "Мы будем рады услышать ваше мнение, сообщите нам об этом через страницу настроек." - "Поехали!" - "Вот что вам необходимо знать:" - "Добро пожаловать в %1$s!" diff --git a/features/ftue/impl/src/main/res/values-sk/translations.xml b/features/ftue/impl/src/main/res/values-sk/translations.xml index 9f39ca6065..ca2cc3ec63 100644 --- a/features/ftue/impl/src/main/res/values-sk/translations.xml +++ b/features/ftue/impl/src/main/res/values-sk/translations.xml @@ -13,10 +13,4 @@ "Svoje nastavenia môžete neskôr zmeniť." "Povoľte oznámenia a nikdy nezmeškajte žiadnu správu" "Zadajte kľúč na obnovenie" - "Hovory, ankety, vyhľadávanie a ďalšie funkcie pribudnú neskôr v tomto roku." - "História správ pre zašifrované miestnosti nebude v tejto aktualizácii k dispozícii." - "Radi by sme od vás počuli, dajte nám vedieť, čo si myslíte, prostredníctvom stránky nastavení." - "Poďme na to!" - "Toto by ste mali vedieť:" - "Vitajte v %1$s!" diff --git a/features/ftue/impl/src/main/res/values-sv/translations.xml b/features/ftue/impl/src/main/res/values-sv/translations.xml index ffaf682393..0bca53cf1d 100644 --- a/features/ftue/impl/src/main/res/values-sv/translations.xml +++ b/features/ftue/impl/src/main/res/values-sv/translations.xml @@ -13,10 +13,4 @@ "Du kan ändra dina inställningar senare." "Tillåt aviseringar och missa aldrig ett meddelande" "Ange återställningsnyckel" - "Samtal, omröstningar, sökning och mer kommer att läggas till senare i år." - "Meddelandehistorik för krypterade rum är inte tillgänglig än." - "Vi vill gärna höra från dig, låt oss veta vad du tycker via inställningssidan." - "Nu kör vi!" - "Här är vad du behöver veta:" - "Välkommen till %1$s!" diff --git a/features/ftue/impl/src/main/res/values-tr/translations.xml b/features/ftue/impl/src/main/res/values-tr/translations.xml index dbeb65832c..dbdfe557f1 100644 --- a/features/ftue/impl/src/main/res/values-tr/translations.xml +++ b/features/ftue/impl/src/main/res/values-tr/translations.xml @@ -13,10 +13,4 @@ "Ayarlarınızı daha sonra değiştirebilirsiniz." "Bildirimlere izin verin ve hiçbir mesajı kaçırmayın" "Kurtarma anahtarını girin" - "Çağrılar, anketler, arama ve daha fazlası bu yıl içinde eklenecek." - "Şifrelenmiş odalar için mesaj geçmişi henüz mevcut değil." - "Düşüncelerinizi bizimle paylaşmanızı çok isteriz. Ayarlar sayfasından düşüncelerinizi bize iletin." - "Hadi başlayalım!" - "İşte bilmeniz gerekenler:" - "%1$s hoş geldiniz!" diff --git a/features/ftue/impl/src/main/res/values-uk/translations.xml b/features/ftue/impl/src/main/res/values-uk/translations.xml index 6dc0056149..14ee57af8a 100644 --- a/features/ftue/impl/src/main/res/values-uk/translations.xml +++ b/features/ftue/impl/src/main/res/values-uk/translations.xml @@ -13,10 +13,4 @@ "Ви можете змінити свої налаштування пізніше." "Дозволити сповіщення і ніколи не пропускати повідомлення" "Введіть ключ відновлення" - "Виклики, опитування, пошук тощо будуть додані пізніше цього року." - "Історія повідомлень для зашифрованих кімнат ще недоступна." - "Ми хотіли б почути вас, розкажіть нам ваші враження та ідеї щодо застосунку на сторінці налаштувань." - "Уперед!" - "Ось що вам потрібно знати:" - "Ласкаво просимо до %1$s!" diff --git a/features/ftue/impl/src/main/res/values-ur/translations.xml b/features/ftue/impl/src/main/res/values-ur/translations.xml index 69882e87d0..402140ed71 100644 --- a/features/ftue/impl/src/main/res/values-ur/translations.xml +++ b/features/ftue/impl/src/main/res/values-ur/translations.xml @@ -13,10 +13,4 @@ "آپ بعد میں اپنی ترتیبات تبدیل کر سکتے ہیں۔" "اطلاعات کی اجازت دیں اور کبھی بھی کسی پیغام سے محروم نہ ہوں۔" "بازیابی کلید درج کریں" - "مکالمات، رائے شماری، تلاش اور مزید بعد میں اس سال شامل کیا جائے گا۔" - "مرموز کردہ کمروں کیلئے سرگزشتِ پیغام ابھی دستیاب نہیں ہے" - "ہم آپ سے سننا پسند کریں گے، ترتیبات کے صفحہ کے ذریعے ہمیں بتائیں کہ آپ کیا سوچتے ہیں۔" - "چلیں!" - "یہ ہے جو آپ کو جاننے کی ضرورت ہے:" - "%1$s میں خوش آمدید!" diff --git a/features/ftue/impl/src/main/res/values-uz/translations.xml b/features/ftue/impl/src/main/res/values-uz/translations.xml index f8ede2ecf4..c283423486 100644 --- a/features/ftue/impl/src/main/res/values-uz/translations.xml +++ b/features/ftue/impl/src/main/res/values-uz/translations.xml @@ -2,10 +2,4 @@ "Sozlamalaringizni keyinroq o\'zgartirishingiz mumkin." "Bildirishnomalarga ruxsat bering va hech qachon xabarni o\'tkazib yubormang" - "Qo\'ng\'iroqlar, so\'ro\'vlar, qidiruv va boshqalar shu yil oxirida qo\'shiladi." - "Shifrlangan xonalar uchun xabarlar tarixi hali mavjud emas." - "Biz sizdan eshitishni istardik, sozlamalar sahifasi orqali fikringizni bildiring." - "Qani ketdik!" - "Buni bilishingiz kerak:" - "%1$sga Xush kelibsiz!" diff --git a/features/ftue/impl/src/main/res/values-zh-rTW/translations.xml b/features/ftue/impl/src/main/res/values-zh-rTW/translations.xml index 5658f30616..93ef03932b 100644 --- a/features/ftue/impl/src/main/res/values-zh-rTW/translations.xml +++ b/features/ftue/impl/src/main/res/values-zh-rTW/translations.xml @@ -13,10 +13,4 @@ "您稍後仍可變更設定。" "允許通知,永遠不會錯誤任何訊息" "輸入復原金鑰" - "通話、投票、搜尋等更多功能將在今年登場。" - "在這次的更新,您無法查看聊天室內被加密的歷史訊息。" - "我們很樂意聽取您的意見,請到設定頁面告訴我們您的想法。" - "開始吧!" - "我們有些事想告訴您:" - "歡迎使用 %1$s!" diff --git a/features/ftue/impl/src/main/res/values-zh/translations.xml b/features/ftue/impl/src/main/res/values-zh/translations.xml index 88b8b4252e..1c72ad8c30 100644 --- a/features/ftue/impl/src/main/res/values-zh/translations.xml +++ b/features/ftue/impl/src/main/res/values-zh/translations.xml @@ -13,10 +13,4 @@ "您可以稍后更改设置。" "允许通知,绝不错过任何消息" "输入恢复密钥" - "今年晚些时候将增加通话、投票、搜索等功能。" - "加密聊天室的消息历史记录尚不可用。" - "我们很乐意听取您的意见,请通过设置页面告诉我们您的想法。" - "开始吧!" - "以下是您需要了解的内容:" - "欢迎使用 %1$s" diff --git a/features/ftue/impl/src/main/res/values/localazy.xml b/features/ftue/impl/src/main/res/values/localazy.xml index 47214a9304..91cf96df2a 100644 --- a/features/ftue/impl/src/main/res/values/localazy.xml +++ b/features/ftue/impl/src/main/res/values/localazy.xml @@ -13,10 +13,4 @@ "You can change your settings later." "Allow notifications and never miss a message" "Enter recovery key" - "Calls, polls, search and more will be added later this year." - "Message history for encrypted rooms isn’t available yet." - "We’d love to hear from you, let us know what you think via the settings page." - "Let\'s go!" - "Here’s what you need to know:" - "Welcome to %1$s!" diff --git a/features/ftue/impl/src/test/kotlin/io/element/android/features/ftue/impl/welcome/state/InMemoryWelcomeScreenStore.kt b/features/ftue/impl/src/test/kotlin/io/element/android/features/ftue/impl/welcome/state/InMemoryWelcomeScreenStore.kt deleted file mode 100644 index 0cd37bef0a..0000000000 --- a/features/ftue/impl/src/test/kotlin/io/element/android/features/ftue/impl/welcome/state/InMemoryWelcomeScreenStore.kt +++ /dev/null @@ -1,24 +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.ftue.impl.welcome.state - -class InMemoryWelcomeScreenStore : WelcomeScreenStore { - private var isWelcomeScreenNeeded = true - - override fun isWelcomeScreenNeeded(): Boolean { - return isWelcomeScreenNeeded - } - - override fun setWelcomeScreenShown() { - isWelcomeScreenNeeded = false - } - - override fun reset() { - isWelcomeScreenNeeded = true - } -} diff --git a/features/home/impl/src/main/kotlin/io/element/android/features/home/impl/search/RoomListSearchView.kt b/features/home/impl/src/main/kotlin/io/element/android/features/home/impl/search/RoomListSearchView.kt index 29c8078c09..2302b3325f 100644 --- a/features/home/impl/src/main/kotlin/io/element/android/features/home/impl/search/RoomListSearchView.kt +++ b/features/home/impl/src/main/kotlin/io/element/android/features/home/impl/search/RoomListSearchView.kt @@ -23,13 +23,15 @@ import androidx.compose.material3.TextFieldDefaults import androidx.compose.material3.TopAppBarDefaults import androidx.compose.runtime.Composable import androidx.compose.runtime.LaunchedEffect +import androidx.compose.runtime.getValue +import androidx.compose.runtime.remember +import androidx.compose.runtime.setValue import androidx.compose.ui.Modifier import androidx.compose.ui.draw.drawBehind import androidx.compose.ui.focus.FocusRequester import androidx.compose.ui.focus.focusRequester import androidx.compose.ui.geometry.Offset import androidx.compose.ui.graphics.Color -import androidx.compose.ui.input.pointer.pointerInput import androidx.compose.ui.res.stringResource import androidx.compose.ui.tooling.preview.PreviewParameter import androidx.compose.ui.unit.dp @@ -39,7 +41,7 @@ import io.element.android.features.home.impl.contentType import io.element.android.features.home.impl.model.RoomListRoomSummary import io.element.android.features.home.impl.roomlist.RoomListEvents import io.element.android.libraries.designsystem.components.button.BackButton -import io.element.android.libraries.designsystem.modifiers.applyIf +import io.element.android.libraries.designsystem.components.form.textFieldState import io.element.android.libraries.designsystem.preview.ElementPreview import io.element.android.libraries.designsystem.preview.PreviewsDayNight import io.element.android.libraries.designsystem.theme.components.FilledTextField @@ -68,24 +70,13 @@ internal fun RoomListSearchView( enter = fadeIn(), exit = fadeOut(), ) { - Column( - modifier = modifier - .applyIf( - condition = state.isSearchActive, - ifTrue = { - // Disable input interaction to underlying views - pointerInput(Unit) {} - } - ) - ) { - if (state.isSearchActive) { - RoomListSearchContent( - state = state, - hideInvitesAvatars = hideInvitesAvatars, - onRoomClick = onRoomClick, - eventSink = eventSink, - ) - } + Column(modifier = modifier) { + RoomListSearchContent( + state = state, + hideInvitesAvatars = hideInvitesAvatars, + onRoomClick = onRoomClick, + eventSink = eventSink, + ) } } } @@ -120,15 +111,19 @@ private fun RoomListSearchContent( }, navigationIcon = { BackButton(onClick = ::onBackButtonClick) }, title = { - val filter = state.query - val focusRequester = FocusRequester() + var filter by textFieldState(state.query) + + val focusRequester = remember { FocusRequester() } FilledTextField( modifier = Modifier .fillMaxWidth() .focusRequester(focusRequester), value = filter, singleLine = true, - onValueChange = { state.eventSink(RoomListSearchEvents.QueryChanged(it)) }, + onValueChange = { + filter = it + state.eventSink(RoomListSearchEvents.QueryChanged(it)) + }, colors = TextFieldDefaults.colors( focusedContainerColor = Color.Transparent, unfocusedContainerColor = Color.Transparent, @@ -152,10 +147,8 @@ private fun RoomListSearchContent( } ) - LaunchedEffect(state.isSearchActive) { - if (state.isSearchActive) { - focusRequester.requestFocus() - } + LaunchedEffect(Unit) { + focusRequester.requestFocus() } }, windowInsets = TopAppBarDefaults.windowInsets.copy(top = 0) diff --git a/features/home/impl/src/main/res/values-be/translations.xml b/features/home/impl/src/main/res/values-be/translations.xml index b34671ed86..d6cd4a1e71 100644 --- a/features/home/impl/src/main/res/values-be/translations.xml +++ b/features/home/impl/src/main/res/values-be/translations.xml @@ -7,6 +7,7 @@ "Ваша сховішча ключоў не сінхранізавана" "Каб не прапусціць важны званок, зменіце налады, каб дазволіць поўнаэкранныя апавяшчэнні, калі тэлефон заблакіраваны." "Палепшыце якасць званкоў" + "Усе чаты" "Вы ўпэўненыя, што хочаце адхіліць запрашэнне ў %1$s?" "Адхіліць запрашэнне" "Вы ўпэўненыя, што хочаце адмовіцца ад прыватных зносін з %1$s?" diff --git a/features/home/impl/src/main/res/values-bg/translations.xml b/features/home/impl/src/main/res/values-bg/translations.xml index 8a555ebbb8..b2053200fc 100644 --- a/features/home/impl/src/main/res/values-bg/translations.xml +++ b/features/home/impl/src/main/res/values-bg/translations.xml @@ -3,6 +3,7 @@ "Потвърдете ключа си за възстановяване, за да запазите достъп до хранилището за ключове и историята на съобщенията си." "Въведете ключа си за възстановяване" "Хранилището ви за ключове не е синхронизирано" + "Всички чатове" "Сигурни ли сте, че искате да отхвърлите поканата за присъединяване в %1$s?" "Отказване на покана" "Няма покани" diff --git a/features/home/impl/src/main/res/values-cs/translations.xml b/features/home/impl/src/main/res/values-cs/translations.xml index 9fcea2887a..4754bddeda 100644 --- a/features/home/impl/src/main/res/values-cs/translations.xml +++ b/features/home/impl/src/main/res/values-cs/translations.xml @@ -12,6 +12,7 @@ "Vaše úložiště klíčů není synchronizováno" "Abyste nikdy nezmeškali důležitý hovor, změňte nastavení tak, abyste povolili oznámení na celé obrazovce, když je telefon uzamčen." "Vylepšete si zážitek z volání" + "Všechny chaty" "Opravdu chcete odmítnout pozvánku do %1$s?" "Odmítnout pozvání" "Opravdu chcete odmítnout tuto soukromou konverzaci s %1$s?" @@ -21,6 +22,7 @@ "Jedná se o jednorázový proces, prosíme o strpení." "Nastavení vašeho účtu" "Vytvořte novou konverzaci nebo místnost" + "Vymazat filtry" "Začněte tím, že někomu pošnete zprávu." "Zatím žádné konverzace." "Oblíbené" diff --git a/features/home/impl/src/main/res/values-cy/translations.xml b/features/home/impl/src/main/res/values-cy/translations.xml index d0ea8f974b..bde8ee4c19 100644 --- a/features/home/impl/src/main/res/values-cy/translations.xml +++ b/features/home/impl/src/main/res/values-cy/translations.xml @@ -13,7 +13,6 @@ "Er mwyn sicrhau fyddwch chi ddim yn colli galwad bwysig, newidiwch eich gosodiadau i ganiatáu hysbysiadau sgrin lawn pan fydd eich ffôn wedi\'i gloi." "Gwella profiad eich galwadau" "Sgyrsiau" - "Gofodau" "Ydych chi\'n siŵr eich bod am wrthod y gwahoddiad i ymuno â %1$s?" "Gwrthod y gwahoddiad" "Ydych chi\'n siŵr eich bod am wrthod y sgwrs breifat hon gyda %1$s?" 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 274b5a9d60..f6e94e85b2 100644 --- a/features/home/impl/src/main/res/values-da/translations.xml +++ b/features/home/impl/src/main/res/values-da/translations.xml @@ -13,7 +13,6 @@ "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?" diff --git a/features/home/impl/src/main/res/values-de/translations.xml b/features/home/impl/src/main/res/values-de/translations.xml index 037a3e53c5..a6b2593bc6 100644 --- a/features/home/impl/src/main/res/values-de/translations.xml +++ b/features/home/impl/src/main/res/values-de/translations.xml @@ -13,7 +13,6 @@ "Damit Sie keine wichtigen Anrufe verpassen, ändern Sie bitte Ihre Einstellungen, so dass das gesperrte Telefon auch Benachrichtigungen im Vollbildmodus erhalten darf." "Verbessere dein Anruferlebnis" "Chats" - "Spaces" "Möchten Sie die Einladung zum Betreten von %1$s wirklich ablehnen?" "Einladung ablehnen" "Möchten Sie diesen privaten Chat mit %1$s wirklich ablehnen?" diff --git a/features/home/impl/src/main/res/values-el/translations.xml b/features/home/impl/src/main/res/values-el/translations.xml index 692aace0ab..df492840b0 100644 --- a/features/home/impl/src/main/res/values-el/translations.xml +++ b/features/home/impl/src/main/res/values-el/translations.xml @@ -12,6 +12,7 @@ "Ο χώρος αποθήκευσης κλειδιών σου δεν είναι συγχρονισμένος" "Για να διασφαλίσετε ότι δεν θα χάσετε ποτέ μια σημαντική κλήση, αλλάξτε τις ρυθμίσεις σας ώστε να επιτρέπονται οι ειδοποιήσεις πλήρους οθόνης όταν το τηλέφωνό σας είναι κλειδωμένο." "Βελτίωσε την εμπειρία κλήσεων" + "Συνομιλίες" "Σίγουρα θες να απορρίψεις την πρόσκληση συμμετοχής στο %1$s;" "Απόρριψη πρόσκλησης" "Σίγουρα θες να απορρίψεις την ιδιωτική συνομιλία με τον χρήστη %1$s;" diff --git a/features/home/impl/src/main/res/values-es/translations.xml b/features/home/impl/src/main/res/values-es/translations.xml index a58f9e743a..77e52fc6b6 100644 --- a/features/home/impl/src/main/res/values-es/translations.xml +++ b/features/home/impl/src/main/res/values-es/translations.xml @@ -9,6 +9,7 @@ "Tu almacén de claves no está sincronizado" "Para asegurarte de que nunca te pierdas una llamada importante, modifica tus ajustes para permitir notificaciones a pantalla completa cuando el teléfono esté bloqueado." "Mejora tu experiencia de llamada" + "Chats" "¿Estás seguro de que quieres rechazar la invitación a unirte a %1$s?" "Rechazar la invitación" "¿Estás seguro de que quieres rechazar este chat privado con %1$s?" 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 8289dc97d4..62d65d9949 100644 --- a/features/home/impl/src/main/res/values-eu/translations.xml +++ b/features/home/impl/src/main/res/values-eu/translations.xml @@ -5,6 +5,7 @@ "Berreskuratze-gakoa ahaztu al duzu?" "Dei garrantzitsurik galduko ez duzula ziurtatzeko, aldatu ezarpenak telefonoa blokeatuta dagoenean pantaila osoko jakinarazpenak baimentzeko." "Hobetu deien esperientzia" + "Txatak" "Ziur %1$s(e)ra batzeko gonbidapena baztertu nahi duzula?" "Baztertu gonbidapena" "Ziur %1$s(r)en txat pribatua baztertu nahi duzula?" diff --git a/features/home/impl/src/main/res/values-fa/translations.xml b/features/home/impl/src/main/res/values-fa/translations.xml index f923a35813..be83431f7d 100644 --- a/features/home/impl/src/main/res/values-fa/translations.xml +++ b/features/home/impl/src/main/res/values-fa/translations.xml @@ -10,7 +10,6 @@ "ذخیره‌ساز کلیدتان از هم‌گام بودن در آمده" "بهبود تجریهٔ تماستان" "گپ‌ها" - "فضاها" "مطمئنید که می‌خواهید دعوت پیوستن به %1$s را رد کنید؟" "رد دعوت" "مطمئنید که می‌خواهید این گپ خصوصی با %1$s را رد کنید؟" diff --git a/features/home/impl/src/main/res/values-fi/translations.xml b/features/home/impl/src/main/res/values-fi/translations.xml index de509cd462..52e8e9b9a2 100644 --- a/features/home/impl/src/main/res/values-fi/translations.xml +++ b/features/home/impl/src/main/res/values-fi/translations.xml @@ -12,6 +12,8 @@ "Avainten säilytys ei ole synkronoitu" "Salli koko näytön ilmoitukset, kun laite on lukittu, jos et halua koskaan missata tärkeää puhelua." "Paranna puhelukokemustasi" + "Keskustelut" + "Tilat" "Haluatko varmasti hylätä kutsun liittyä %1$s -huoneeseen?" "Hylkää kutsu" "Haluatko varmasti hylätä kutsun yksityiseen keskusteluun käyttäjän %1$s kanssa?" 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 aaa0702637..23d621a3a4 100644 --- a/features/home/impl/src/main/res/values-fr/translations.xml +++ b/features/home/impl/src/main/res/values-fr/translations.xml @@ -12,8 +12,7 @@ "Le stockage de vos clés n’est pas synchronisé" "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" - "Discussions" - "Espaces" + "Conversations" "Ê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 121d58dd77..9d7ee11427 100644 --- a/features/home/impl/src/main/res/values-hu/translations.xml +++ b/features/home/impl/src/main/res/values-hu/translations.xml @@ -12,7 +12,7 @@ "A kulcstároló nincs szinkronizálva" "Hogy sose maradjon le egyetlen fontos hívásról sem, a beállításokban engedélyezze a teljes képernyős értesítéseket, amikor a telefon zárolva van." "Fokozza a hívásélményét" - "Csevegések" + "Összes csevegés" "Terek" "Biztos, hogy elutasítja a meghívást, hogy csatlakozzon ehhez: %1$s?" "Meghívás elutasítása" diff --git a/features/home/impl/src/main/res/values-in/translations.xml b/features/home/impl/src/main/res/values-in/translations.xml index b3e16b4c25..924b019103 100644 --- a/features/home/impl/src/main/res/values-in/translations.xml +++ b/features/home/impl/src/main/res/values-in/translations.xml @@ -12,6 +12,7 @@ "Penyimpanan kunci Anda tidak sinkron" "Untuk memastikan Anda tidak melewatkan panggilan penting, silakan ubah pengaturan Anda untuk memperbolehkan notifikasi layar penuh ketika ponsel Anda terkunci." "Tingkatkan pengalaman panggilan Anda" + "Semua Obrolan" "Apakah Anda yakin ingin menolak undangan untuk bergabung ke %1$s?" "Tolak undangan" "Apakah Anda yakin ingin menolak obrolan pribadi dengan %1$s?" diff --git a/features/home/impl/src/main/res/values-it/translations.xml b/features/home/impl/src/main/res/values-it/translations.xml index 88ff0eb3be..d6cfef8db3 100644 --- a/features/home/impl/src/main/res/values-it/translations.xml +++ b/features/home/impl/src/main/res/values-it/translations.xml @@ -12,6 +12,7 @@ "L\'archiviazione delle chiavi non è sincronizzata" "Per non perdere mai una chiamata importante, modifica le impostazioni per consentire le notifiche a schermo intero quando il telefono è bloccato." "Migliora la tua esperienza di chiamata" + "Tutte le conversazioni" "Vuoi davvero rifiutare l\'invito ad entrare in %1$s?" "Rifiuta l\'invito" "Vuoi davvero rifiutare questa conversazione privata con %1$s?" diff --git a/features/home/impl/src/main/res/values-ka/translations.xml b/features/home/impl/src/main/res/values-ka/translations.xml index bcedaeac60..1aa5b2d33d 100644 --- a/features/home/impl/src/main/res/values-ka/translations.xml +++ b/features/home/impl/src/main/res/values-ka/translations.xml @@ -3,6 +3,7 @@ "აღდგენის დაყენება" "დაადასტურეთ თქვენი აღდგენის გასაღები რათა გქონდეთ წვდომა გასაღებების დამგროვებელთან და შეტყობინებების ისტორიასთან." "თქვენი გასაღების დამგროვებელი არაა სინქრონიზებული" + "ჩატები" "დარწმუნებული ხართ, რომ გსურთ, უარი თქვათ მოწვევაზე %1$s-ში?" "მოწვევაზე უარის თქმა" "დარწმუნებული ხართ, რომ გსურთ, უარი თქვათ ჩატზე %1$s-თან?" diff --git a/features/home/impl/src/main/res/values-lt/translations.xml b/features/home/impl/src/main/res/values-lt/translations.xml index 2be9acd507..03771f7ae0 100644 --- a/features/home/impl/src/main/res/values-lt/translations.xml +++ b/features/home/impl/src/main/res/values-lt/translations.xml @@ -1,7 +1,6 @@ "Pokalbiai" - "Erdvės" "Ar tikrai norite atmesti kvietimą prisijungti prie %1$s?" "Atmesti kvietimą" "Ar tikrai norite atmesti šį privatų pokalbį su %1$s ?" diff --git a/features/home/impl/src/main/res/values-nb/translations.xml b/features/home/impl/src/main/res/values-nb/translations.xml index 2ce6733b8a..558460a732 100644 --- a/features/home/impl/src/main/res/values-nb/translations.xml +++ b/features/home/impl/src/main/res/values-nb/translations.xml @@ -12,6 +12,7 @@ "Nøkkellagringen din er ikke synkronisert" "For å sikre at du aldri går glipp av en viktig samtale, må du endre innstillingene dine for å tillate fullskjermvarsler når telefonen er låst." "Forbedre samtaleopplevelsen din" + "Chatter" "Er du sikker på at du vil takke nei til invitasjonen til å bli med i %1$s?" "Avvis invitasjon" "Er du sikker på at du vil avslå denne private chatten med %1$s?" @@ -21,6 +22,7 @@ "Dette er en engangsprosess, takk for at du venter." "Setter opp kontoen din." "Opprett en ny samtale eller et nytt rom" + "Fjern filtre" "Kom i gang med å sende meldinger til noen." "Ingen chatter ennå." "Favoritter" diff --git a/features/home/impl/src/main/res/values-nl/translations.xml b/features/home/impl/src/main/res/values-nl/translations.xml index 40e0a07481..b6df46e98b 100644 --- a/features/home/impl/src/main/res/values-nl/translations.xml +++ b/features/home/impl/src/main/res/values-nl/translations.xml @@ -8,6 +8,7 @@ "Je sleutelopslag is niet gesynchroniseerd" "Pas je instellingen aan om meldingen op het volledige scherm toe te staan wanneer de telefoon is vergrendeld. Zo mis je nooit een belangrijk gesprek." "Verbeter je gesprekservaring" + "Chats" "Weet je zeker dat je de uitnodiging om toe te treden tot %1$s wilt weigeren?" "Uitnodiging weigeren" "Weet je zeker dat je deze privéchat met %1$s wilt weigeren?" diff --git a/features/home/impl/src/main/res/values-pl/translations.xml b/features/home/impl/src/main/res/values-pl/translations.xml index 63f81cb1b3..51dbc0512b 100644 --- a/features/home/impl/src/main/res/values-pl/translations.xml +++ b/features/home/impl/src/main/res/values-pl/translations.xml @@ -12,8 +12,7 @@ "Magazyn kluczy nie jest zsynchronizowany" "Upewnij się, że nie pominiesz żadnego połączenia. Zmień swoje ustawienia i zezwól na powiadomienia na blokadzie ekranu." "Popraw jakość swoich rozmów" - "Czaty" - "Przestrzenie" + "Wszystkie czaty" "Czy na pewno chcesz odrzucić zaproszenie dołączenia do %1$s?" "Odrzuć zaproszenie" "Czy na pewno chcesz odrzucić rozmowę prywatną z %1$s?" diff --git a/features/home/impl/src/main/res/values-pt-rBR/translations.xml b/features/home/impl/src/main/res/values-pt-rBR/translations.xml index 871a2bcc5c..0a9a608413 100644 --- a/features/home/impl/src/main/res/values-pt-rBR/translations.xml +++ b/features/home/impl/src/main/res/values-pt-rBR/translations.xml @@ -12,6 +12,7 @@ "Seu armazenamento de chaves está fora de sincronia" "Para garantir que você nunca perca uma chamada importante, por favor altere as suas configurações para permitir notificações em tela cheia enquanto o seu celular estiver bloqueado." "Melhore a sua experiência de chamadas" + "Conversas" "Tem certeza de que deseja recusar o convite para ingressar em %1$s?" "Recusar convite" "Tem certeza de que deseja recusar esse chat privado com %1$s?" diff --git a/features/home/impl/src/main/res/values-pt/translations.xml b/features/home/impl/src/main/res/values-pt/translations.xml index daba977faa..2a63000ea0 100644 --- a/features/home/impl/src/main/res/values-pt/translations.xml +++ b/features/home/impl/src/main/res/values-pt/translations.xml @@ -12,6 +12,8 @@ "O teu armazenamento de chaves não está sincronizado" "Para garantir que nunca perdes uma chamada importante, altera as configurações para permitir notificações em ecrã inteiro quando o telemóvel está bloqueado." "Melhora a tua experiência de chamada" + "Conversas" + "Espaços" "Tens a certeza que queres rejeitar o convite para entra em %1$s?" "Rejeitar convite" "Tem a certeza que queres rejeitar esta conversa privada com %1$s?" diff --git a/features/home/impl/src/main/res/values-ro/translations.xml b/features/home/impl/src/main/res/values-ro/translations.xml index 2d7bdd8a95..1be4ab7b66 100644 --- a/features/home/impl/src/main/res/values-ro/translations.xml +++ b/features/home/impl/src/main/res/values-ro/translations.xml @@ -7,6 +7,7 @@ "Backup-ul nu este sincronizat" "Pentru a vă asigura că nu pierdeți niciodată un apel important, vă rugăm să modificați setările pentru a permite notificări fullscreen atunci când telefonul este blocat." "Îmbunătățiți-vă experiența in timpul unui apel" + "Toate conversatiile" "Sigur doriți să refuzați alăturarea la %1$s?" "Refuzați invitația" "Sigur doriți să refuzați conversațiile cu %1$s?" diff --git a/features/home/impl/src/main/res/values-ru/translations.xml b/features/home/impl/src/main/res/values-ru/translations.xml index a70efcfdfd..f147166e80 100644 --- a/features/home/impl/src/main/res/values-ru/translations.xml +++ b/features/home/impl/src/main/res/values-ru/translations.xml @@ -9,6 +9,7 @@ "Хранилище ключей не синхронизировано" "Чтобы больше не пропускать важные звонки, разрешите приложению показывать полноэкранные уведомления на заблокированном экране телефона." "Улучшите качество звонков" + "Все чаты" "Вы уверены, что хотите отклонить приглашение в %1$s?" "Отклонить приглашение" "Вы уверены, что хотите отказаться от личного общения с %1$s?" 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 36c93eb09e..62df718bc2 100644 --- a/features/home/impl/src/main/res/values-sk/translations.xml +++ b/features/home/impl/src/main/res/values-sk/translations.xml @@ -12,7 +12,7 @@ "Vaše úložisko kľúčov nie je synchronizované" "Aby ste už nikdy nezmeškali dôležitý hovor, zmeňte svoje nastavenia a povoľte upozornenia na celú obrazovku, keď je váš telefón uzamknutý." "Vylepšite svoj zážitok z hovoru" - "Konverzácie" + "Všetky konverzácie" "Priestory" "Naozaj chcete odmietnuť pozvánku na pripojenie do %1$s?" "Odmietnuť pozvanie" 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 ab00fd3dd3..ff2d495b3a 100644 --- a/features/home/impl/src/main/res/values-sv/translations.xml +++ b/features/home/impl/src/main/res/values-sv/translations.xml @@ -1,5 +1,8 @@ + "Inaktivera batterioptimering för den här appen för att säkerställa att alla aviseringar tas emot." + "Inaktivera optimering" + "Aviseringar kommer inte fram?" "Skapa en ny återställningsnyckel som kan användas för att återställa din krypterade meddelandehistorik om du förlorar åtkomst till dina enheter." "Ställ in återställning" "Ställ in återställning" @@ -9,6 +12,7 @@ "Din nyckellagring är inte synkroniserad" "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" "Ä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?" @@ -18,6 +22,7 @@ "Detta är en engångsprocess, tack för att du väntar." "Konfigurerar ditt konto" "Skapa en ny konversation eller ett nytt rum" + "Rensa filter" "Kom igång genom att skicka meddelanden till någon." "Inga chattar än." "Favoriter" diff --git a/features/home/impl/src/main/res/values-tr/translations.xml b/features/home/impl/src/main/res/values-tr/translations.xml index 6f42809ef3..1dda320ff0 100644 --- a/features/home/impl/src/main/res/values-tr/translations.xml +++ b/features/home/impl/src/main/res/values-tr/translations.xml @@ -9,6 +9,7 @@ "Anahtar depolama alanınız senkronize değil" "Önemli bir aramayı asla kaçırmamak için, telefonunuz kilitliyken tam ekran bildirimlere izin vermek üzere ayarlarınızı değiştirin." "Arama deneyiminizi geliştirin" + "Sohbetler" "%1$s katılma davetini reddetmek istediğinizden emin misiniz?" "Daveti reddet" "%1$s ile bu özel sohbeti reddetmek istediğinizden emin misiniz?" 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 a16eb058fe..c513aee351 100644 --- a/features/home/impl/src/main/res/values-uk/translations.xml +++ b/features/home/impl/src/main/res/values-uk/translations.xml @@ -13,7 +13,6 @@ "Щоб ніколи не пропустити важливий виклик, змініть налаштування, щоб увімкнути повноекранні сповіщення, коли телефон заблоковано." "Покращуйте досвід дзвінків" "Бесіди" - "Простори" "Ви впевнені, що хочете відхилити запрошення приєднатися до %1$s?" "Відхилити запрошення" "Ви дійсно хочете відмовитися від приватної бесіди з %1$s?" 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 7a0fd3acb6..cdcc9661b2 100644 --- a/features/home/impl/src/main/res/values-ur/translations.xml +++ b/features/home/impl/src/main/res/values-ur/translations.xml @@ -5,6 +5,7 @@ "آپ کا کلید کا ذخیرہ غیر ہم وقت ساز ہے۔" "اس بات کو یقینی بنانے کے لیے کہ آپ کبھی بھی اہم مکالمہ سے محروم نہ ہوں، براہ کرم اپنی ترتیبات تبدیل کریں تاکہ آپ کا ہاتف مقفل ہونے پر مکمل پردۂ نمائش اطلاعات کی اجازت دی جا سکے۔" "اپنے مکالمتی تجربے کو احسن کریں" + "گفتگوئیں" "کیا آپکو یقین ہے کہ آپ %1$s میں شامل ہونے کی درخواست مسترد کرنا چاہتے ہیں؟" "دعوت مسترد کریں" "کیا آپکو یقین ہے کہ آپ %1$s کیساتھ نجی گفتگو مسترد کرنا چاہتے ہیں؟" 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 077f9ecc4a..e638e86838 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,7 @@ "Qayta tiklashni sozlang" + "Suhbatlar" "Haqiqatan ham qo\'shilish taklifini rad qilmoqchimisiz%1$s ?" "Taklifni rad etish" "Haqiqatan ham bu shaxsiy chatni rad qilmoqchimisiz%1$s ?" 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 1bc2ae181c..644baf8f08 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 @@ -9,6 +9,7 @@ "您的金鑰儲存空間並未同步" "為確保您永遠不會錯過重要通話,請變更設定以允許在手機鎖定時允許全螢幕通知。" "提升您的通話體驗" + "所有聊天室" "您確定您想要拒絕加入 %1$s 的邀請嗎?" "拒絕邀請" "您確定您要拒絕此與 %1$s 的私人聊天嗎?" 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 4ca91cb796..52ef5ad761 100644 --- a/features/home/impl/src/main/res/values-zh/translations.xml +++ b/features/home/impl/src/main/res/values-zh/translations.xml @@ -11,6 +11,7 @@ "你的密钥存储已不同步" "为确保您不会错过重要来电,请更改设置以允许锁屏时的全屏通知。" "提升通话体验" + "全部聊天" "您确定要拒绝加入 %1$s 的邀请吗?" "拒绝邀请" "您确定要拒绝与 %1$s 开始私聊吗?" diff --git a/features/invite/impl/src/main/res/values-be/translations.xml b/features/invite/impl/src/main/res/values-be/translations.xml index 13c241102f..fca38b796a 100644 --- a/features/invite/impl/src/main/res/values-be/translations.xml +++ b/features/invite/impl/src/main/res/values-be/translations.xml @@ -1,5 +1,6 @@ + "Заблакіраваць карыстальніка" "Вы ўпэўненыя, што хочаце адхіліць запрашэнне ў %1$s?" "Адхіліць запрашэнне" "Вы ўпэўненыя, што хочаце адмовіцца ад прыватных зносін з %1$s?" diff --git a/features/invite/impl/src/main/res/values-de/translations.xml b/features/invite/impl/src/main/res/values-de/translations.xml index e3937fbda1..202000d45f 100644 --- a/features/invite/impl/src/main/res/values-de/translations.xml +++ b/features/invite/impl/src/main/res/values-de/translations.xml @@ -1,7 +1,7 @@ "Sie werden keine Nachrichten oder Chateinladungen von diesem Nutzer sehen." - "Benutzer blockieren" + "Nutzer blockieren" "Melden Sie diesen Raum Ihrem Kontoanbieter." "Nennen Sie den Grund für die Meldung…" "Ablehnen und blockieren" 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 d60aeced77..f99d5691d9 100644 --- a/features/invite/impl/src/main/res/values-eu/translations.xml +++ b/features/invite/impl/src/main/res/values-eu/translations.xml @@ -1,5 +1,6 @@ + "Blokeatu erabiltzailea" "Ziur %1$s(e)ra batzeko gonbidapena baztertu nahi duzula?" "Baztertu gonbidapena" "Ziur %1$s(r)en txat pribatua baztertu nahi duzula?" diff --git a/features/invite/impl/src/main/res/values-ka/translations.xml b/features/invite/impl/src/main/res/values-ka/translations.xml index 3accaf9eda..7b60e8f7ee 100644 --- a/features/invite/impl/src/main/res/values-ka/translations.xml +++ b/features/invite/impl/src/main/res/values-ka/translations.xml @@ -1,5 +1,6 @@ + "მომხმარებლის დაბლოკვა" "დარწმუნებული ხართ, რომ გსურთ, უარი თქვათ მოწვევაზე %1$s-ში?" "მოწვევაზე უარის თქმა" "დარწმუნებული ხართ, რომ გსურთ, უარი თქვათ ჩატზე %1$s-თან?" diff --git a/features/invite/impl/src/main/res/values-lt/translations.xml b/features/invite/impl/src/main/res/values-lt/translations.xml index c94b61fd5d..375aab7f35 100644 --- a/features/invite/impl/src/main/res/values-lt/translations.xml +++ b/features/invite/impl/src/main/res/values-lt/translations.xml @@ -1,5 +1,6 @@ + "Blokuoti vartotoją" "Ar tikrai norite atmesti kvietimą prisijungti prie %1$s?" "Atmesti kvietimą" "Ar tikrai norite atmesti šį privatų pokalbį su %1$s ?" diff --git a/features/invite/impl/src/main/res/values-nl/translations.xml b/features/invite/impl/src/main/res/values-nl/translations.xml index 25eee1572d..65051679a2 100644 --- a/features/invite/impl/src/main/res/values-nl/translations.xml +++ b/features/invite/impl/src/main/res/values-nl/translations.xml @@ -1,5 +1,6 @@ + "Gebruiker blokkeren" "Weet je zeker dat je de uitnodiging om toe te treden tot %1$s wilt weigeren?" "Uitnodiging weigeren" "Weet je zeker dat je deze privéchat met %1$s wilt weigeren?" diff --git a/features/invite/impl/src/main/res/values-ro/translations.xml b/features/invite/impl/src/main/res/values-ro/translations.xml index 3f00d32337..1856b36021 100644 --- a/features/invite/impl/src/main/res/values-ro/translations.xml +++ b/features/invite/impl/src/main/res/values-ro/translations.xml @@ -1,5 +1,6 @@ + "Blocați utilizatorul" "Sigur doriți să refuzați alăturarea la %1$s?" "Refuzați invitația" "Sigur doriți să refuzați conversațiile cu %1$s?" diff --git a/features/invite/impl/src/main/res/values-tr/translations.xml b/features/invite/impl/src/main/res/values-tr/translations.xml index 7c60a22b8a..3cfdca3ec6 100644 --- a/features/invite/impl/src/main/res/values-tr/translations.xml +++ b/features/invite/impl/src/main/res/values-tr/translations.xml @@ -1,5 +1,6 @@ + "Kullanıcıyı engelle" "%1$s katılma davetini reddetmek istediğinizden emin misiniz?" "Daveti reddet" "%1$s ile bu özel sohbeti reddetmek istediğinizden emin misiniz?" diff --git a/features/invite/impl/src/main/res/values-ur/translations.xml b/features/invite/impl/src/main/res/values-ur/translations.xml index 641f5e7b7e..42bb36ee14 100644 --- a/features/invite/impl/src/main/res/values-ur/translations.xml +++ b/features/invite/impl/src/main/res/values-ur/translations.xml @@ -1,5 +1,6 @@ + "صارف کو مسدود کریں" "کیا آپکو یقین ہے کہ آپ %1$s میں شامل ہونے کی درخواست مسترد کرنا چاہتے ہیں؟" "دعوت مسترد کریں" "کیا آپکو یقین ہے کہ آپ %1$s کیساتھ نجی گفتگو مسترد کرنا چاہتے ہیں؟" diff --git a/features/invite/impl/src/main/res/values-uz/translations.xml b/features/invite/impl/src/main/res/values-uz/translations.xml index 78e3975700..bf1f398712 100644 --- a/features/invite/impl/src/main/res/values-uz/translations.xml +++ b/features/invite/impl/src/main/res/values-uz/translations.xml @@ -1,5 +1,6 @@ + "Foydalanuvchini bloklash" "Haqiqatan ham qo\'shilish taklifini rad qilmoqchimisiz%1$s ?" "Taklifni rad etish" "Haqiqatan ham bu shaxsiy chatni rad qilmoqchimisiz%1$s ?" 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 3d25434438..a340e22984 100644 --- a/features/invite/impl/src/main/res/values-zh/translations.xml +++ b/features/invite/impl/src/main/res/values-zh/translations.xml @@ -1,5 +1,6 @@ + "封禁用户" "您确定要拒绝加入 %1$s 的邀请吗?" "拒绝邀请" "您确定要拒绝与 %1$s 开始私聊吗?" diff --git a/features/joinroom/impl/src/main/res/values-cs/translations.xml b/features/joinroom/impl/src/main/res/values-cs/translations.xml index bab8e1f01e..2e0720ea42 100644 --- a/features/joinroom/impl/src/main/res/values-cs/translations.xml +++ b/features/joinroom/impl/src/main/res/values-cs/translations.xml @@ -18,6 +18,7 @@ "Připojit se do místnosti" "Abyste se mohli připojit, musíte být pozváni nebo být členem některého prostoru." "Zaklepejte a připojte se" + "Povolené znaky %1$d z %2$d" "Zpráva (nepovinné)" "Pokud bude váš požadavek přijat, obdržíte pozvánku na vstup do místnosti." "Žádost o vstup odeslána" diff --git a/features/joinroom/impl/src/main/res/values-pt/translations.xml b/features/joinroom/impl/src/main/res/values-pt/translations.xml index ffca14b009..695d3124c3 100644 --- a/features/joinroom/impl/src/main/res/values-pt/translations.xml +++ b/features/joinroom/impl/src/main/res/values-pt/translations.xml @@ -18,6 +18,7 @@ "Entrar na sala" "Podes ter que ser convidado ou pertenceres a um espaço para poderes entrar." "Bater à porta" + "%1$d de %2$d caracteres permitidos" "Mensagem (opcional)" "Irá receber um convite para participar na sala se seu pedido for aceite." "Pedido de adesão enviado" diff --git a/features/leaveroom/api/src/main/res/values-fi/translations.xml b/features/leaveroom/api/src/main/res/values-fi/translations.xml index da1ba00ae5..a97696ceb2 100644 --- a/features/leaveroom/api/src/main/res/values-fi/translations.xml +++ b/features/leaveroom/api/src/main/res/values-fi/translations.xml @@ -3,5 +3,8 @@ "Haluatko varmasti poistua keskustelusta? Tämä keskustelu ei ole julkinen ja et voi liittyä takaisin ilman kutsua." "Haluatko varmasti poistua huoneesta? Olet huoneen ainoa jäsen. Jos poistut, kukaan ei voi liittyä takaisin, et edes sinä." "Haluatko varmasti poistua huoneesta? Tämä huone ei ole julkinen ja et voi liittyä takaisin ilman kutsua." + "Valitse omistajat" + "Olet tämän huoneen ainoa omistaja. Sinun on siirrettävä omistajuus jollekulle toiselle ennen kuin poistut huoneesta." + "Siirrä omistajuus" "Haluatko varmasti poistua huoneesta?" diff --git a/features/leaveroom/api/src/main/res/values-hu/translations.xml b/features/leaveroom/api/src/main/res/values-hu/translations.xml index 8b5136f495..90eae5cb22 100644 --- a/features/leaveroom/api/src/main/res/values-hu/translations.xml +++ b/features/leaveroom/api/src/main/res/values-hu/translations.xml @@ -3,5 +3,8 @@ "Biztos, hogy elhagyja ezt a beszélgetést? Ez a beszélgetés nem nyilvános, és meghívás nélkül nem fog tudni visszacsatlakozni." "Biztos, hogy elhagyja ezt a szobát? Ön az egyedüli ember itt. Ha kilép, akkor senki sem fog tudni csatlakozni a jövőben, Önt is beleértve." "Biztos, hogy elhagyja ezt a szobát? Ez a szoba nem nyilvános, és meghívó nélkül nem fog tudni újra belépni." + "Tulajdonosok kiválasztása" + "Ön az egyetlen tulajdonosa ennek a szobának. Mielőtt elhagyja a szobát, át kell adnia a tulajdonjogot valaki másnak." + "Tulajdonjog átruházása" "Biztos, hogy elhagyja a szobát?" diff --git a/features/leaveroom/api/src/main/res/values-pt/translations.xml b/features/leaveroom/api/src/main/res/values-pt/translations.xml index 7547378598..4832cd9201 100644 --- a/features/leaveroom/api/src/main/res/values-pt/translations.xml +++ b/features/leaveroom/api/src/main/res/values-pt/translations.xml @@ -3,5 +3,8 @@ "Tens a certeza que queres sair desta conversa? Não é pública, logo não poderás voltar a participar sem um convite." "Tens a certeza que queres sair desta sala? És o único participante. Se saíres, ninguém mais poderá entrar, incluindo tu." "Tens a certeza que queres sair desta sala? Atenta que não é pública e portanto não poderás voltar a entrar sem um novo convite." + "Escolher donos" + "És o único dono/dona desta sala. Se quiseres sair, terás que a transferir para alguém primeiro." + "Transferir posse" "Tens a certeza que queres sair da sala?" diff --git a/features/leaveroom/api/src/main/res/values-uk/translations.xml b/features/leaveroom/api/src/main/res/values-uk/translations.xml index c26a0bbaaa..0c7c92bd2c 100644 --- a/features/leaveroom/api/src/main/res/values-uk/translations.xml +++ b/features/leaveroom/api/src/main/res/values-uk/translations.xml @@ -3,5 +3,8 @@ "Ви впевнені, що хочете залишити цю розмову? Ця розмова не загальнодоступна, і ви не зможете знову приєднатися без запрошення." "Ви впевнені, що хочете вийти з цієї кімнати? Ви тут єдина людина. Якщо ви вийдете, ніхто в майбутньому не зможе приєднатися, у тому числі й ви." "Ви впевнені, що хочете вийти з цієї кімнати? Ця кімната не загальнодоступна, і ви не зможете повернутися до неї без запрошення." + "Оберіть власників" + "Ви є єдиним власником цієї кімнати. Перед тим як вийти з кімнати, вам потрібно передати право власності іншій особі." + "Передати право власності" "Ви впевнені, що хочете вийти з кімнати?" diff --git a/features/login/impl/src/main/res/values-cs/translations.xml b/features/login/impl/src/main/res/values-cs/translations.xml index 9d6e4c51f7..b6be1932b8 100644 --- a/features/login/impl/src/main/res/values-cs/translations.xml +++ b/features/login/impl/src/main/res/values-cs/translations.xml @@ -13,6 +13,8 @@ "Jiný" "Použijte jiného poskytovatele účtu, například vlastní soukromý server nebo pracovní účet." "Změnit poskytovatele účtu" + "Na %1$s je vyžadována aplikace Element Pro. Stáhněte si ji prosím z obchodu." + "Vyžadován Element Pro" "Nepodařilo se nám připojit k tomuto domovskému serveru. Zkontrolujte prosím, zda jste správně zadali adresu URL domovského serveru. Pokud je adresa URL správná, obraťte se na správce domovského serveru, který vám poskytne další pomoc." "Server není k dispozici kvůli problému se souborem well-known: %1$s" @@ -34,6 +36,7 @@ "Matrix je otevřená síť pro bezpečnou a decentralizovanou komunikaci." "Vítejte zpět!" "Přihlaste se k %1$s" + "Verze %1$s" "Ruční přihlášení" "Přihlásit se do %1$s" "Přihlásit se pomocí QR kódu" diff --git a/features/login/impl/src/main/res/values-et/translations.xml b/features/login/impl/src/main/res/values-et/translations.xml index f7a910fd22..83df34e10a 100644 --- a/features/login/impl/src/main/res/values-et/translations.xml +++ b/features/login/impl/src/main/res/values-et/translations.xml @@ -13,6 +13,7 @@ "Muu teenusepakkuja" "Kasuta erinevat teenusepakkujat, milleks võib olla ka sinu oma server või töökoha hallatav server." "Muuda teenusepakkujat" + "Google Play" "%1$s koduserver eeldab Element Pro rakenduse kasutamist. Palun laadi ta alla rakendustepoest." "Vajalik on Element Pro" "Me ei suutnud luuaühendust selle koduserveriga. Palun kontrolli, kas koduserveri aadress on õige. Kui aadress on õige, siis täiendavat teavet oskab sulle anda koduserveri haldaja." diff --git a/features/login/impl/src/main/res/values-fi/translations.xml b/features/login/impl/src/main/res/values-fi/translations.xml index 1c2b75ae82..e16f66b87e 100644 --- a/features/login/impl/src/main/res/values-fi/translations.xml +++ b/features/login/impl/src/main/res/values-fi/translations.xml @@ -13,6 +13,7 @@ "Muu" "Käytä toista palveluntarjoajaa, kuten omaa yksityistä palvelintasi tai työpaikkaasi." "Vaihda palveluntarjoajaa" + "Google Play" "Element Pro -sovellus on pakollinen %1$s -palvelimella. Lataa se sovelluskaupasta." "Element Pro vaaditaan" "Kotipalvelimeen ei saatu yhteyttä. Varmista, että olet syöttänyt osoitteen oikein. Jos osoite on oikein, ota yhteyttä palvelimesi ylläpitäjään." diff --git a/features/login/impl/src/main/res/values-hu/translations.xml b/features/login/impl/src/main/res/values-hu/translations.xml index a8ea012c60..fd05e194e3 100644 --- a/features/login/impl/src/main/res/values-hu/translations.xml +++ b/features/login/impl/src/main/res/values-hu/translations.xml @@ -13,6 +13,7 @@ "Egyéb" "Másik fiókszolgáltató, például a saját privát kiszolgáló vagy egy munkahelyi fiók használata." "Fiókszolgáltató módosítása" + "Google Play" "Az Element Pro alkalmazás szükséges a következőn: %1$s. Töltse le az áruházból." "Element Pro szükséges" "Nem sikerült elérni ezt a Matrix-kiszolgálót. Ellenőrizze, hogy helyesen adta-e meg a Matrix-kiszolgáló webcímét. Ha a webcím helyes, akkor további segítségért lépjen kapcsolatba a Matrix-kiszolgáló adminisztrátorával." diff --git a/features/login/impl/src/main/res/values-nb/translations.xml b/features/login/impl/src/main/res/values-nb/translations.xml index 0054906e65..003e6966d4 100644 --- a/features/login/impl/src/main/res/values-nb/translations.xml +++ b/features/login/impl/src/main/res/values-nb/translations.xml @@ -34,6 +34,7 @@ "Matrix er et åpent nettverk for sikker, desentralisert kommunikasjon." "Velkommen tilbake!" "Logg inn på %1$s" + "Versjon %1$s" "Logg på manuelt" "Logg inn på %1$s" "Logg inn med QR-kode" diff --git a/features/login/impl/src/main/res/values-pt/translations.xml b/features/login/impl/src/main/res/values-pt/translations.xml index 1b60edf146..c371b79a63 100644 --- a/features/login/impl/src/main/res/values-pt/translations.xml +++ b/features/login/impl/src/main/res/values-pt/translations.xml @@ -13,6 +13,9 @@ "Outro" "Utiliza um operador de conta diferente, como o teu próprio servidor privado ou uma conta de trabalho." "Alterar operador de conta" + "Google Play" + "%1$s requer a Element Pro. Por favor, descarrega-a da app store." + "Element Pro necessária" "Não foi possível comunicar com este servidor. Por favor, verifica se introduziste o seu URL corretamente. Se sim, contacta o administrador para obteres mais ajuda." "O servidor não está disponível devido a um problema no ficheiro \".well-known\": %1$s" diff --git a/features/login/impl/src/main/res/values-sk/translations.xml b/features/login/impl/src/main/res/values-sk/translations.xml index 00c2c1d04f..6a8acf1f68 100644 --- a/features/login/impl/src/main/res/values-sk/translations.xml +++ b/features/login/impl/src/main/res/values-sk/translations.xml @@ -13,6 +13,7 @@ "Iný" "Použite iného poskytovateľa účtu, ako napríklad vlastný súkromný server alebo pracovný účet." "Zmeniť poskytovateľa účtu" + "Google Play" "Aplikácia Element Pro je potrebná na %1$s Stiahnite si ju z obchodu." "Vyžaduje sa Element Pro" "Nemohli sme sa spojiť s týmto domovským serverom. Skontrolujte prosím, či ste zadali URL adresu domovského servera správne. Ak je adresa URL správna, kontaktujte svoj domovský server pre ďalšiu pomoc." 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 711e899ca6..7d59180093 100644 --- a/features/login/impl/src/main/res/values-sv/translations.xml +++ b/features/login/impl/src/main/res/values-sv/translations.xml @@ -34,6 +34,7 @@ "Matrix är ett öppet nätverk för säker, decentraliserad kommunikation." "Välkommen tillbaka!" "Logga in på %1$s" + "Version %1$s" "Logga in manuellt" "Logga in på %1$s" "Logga in med QR-kod" diff --git a/features/messages/api/build.gradle.kts b/features/messages/api/build.gradle.kts index aa715dcae4..7eefee11cc 100644 --- a/features/messages/api/build.gradle.kts +++ b/features/messages/api/build.gradle.kts @@ -17,5 +17,7 @@ android { dependencies { implementation(projects.libraries.architecture) implementation(projects.libraries.matrix.api) + implementation(projects.libraries.mediaviewer.api) + implementation(projects.libraries.preferences.api) api(projects.libraries.textcomposer.impl) } 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 8f97b6bc19..a0df0615eb 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 @@ -462,6 +462,7 @@ class MessagesFlowNode @AssistedInject constructor( eventId = event.eventId, mediaInfo = MediaInfo( filename = content.filename, + fileSize = content.fileSize, caption = content.caption, mimeType = content.mimeType, formattedFileSize = content.formattedFileSize, 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 bfae4c20d1..6af3033345 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 @@ -22,21 +22,26 @@ import dagger.assisted.Assisted import dagger.assisted.AssistedFactory import dagger.assisted.AssistedInject 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.architecture.Presenter import io.element.android.libraries.core.coroutine.CoroutineDispatchers import io.element.android.libraries.core.coroutine.firstInstanceOf import io.element.android.libraries.core.extensions.runCatchingExceptions +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.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.ProgressCallback import io.element.android.libraries.matrix.api.permalink.PermalinkBuilder +import io.element.android.libraries.mediaupload.api.MediaOptimizationConfig import io.element.android.libraries.mediaupload.api.MediaSender import io.element.android.libraries.mediaupload.api.MediaUploadInfo import io.element.android.libraries.mediaupload.api.allFiles +import io.element.android.libraries.preferences.api.store.VideoCompressionPreset import io.element.android.libraries.textcomposer.model.TextEditorState import io.element.android.libraries.textcomposer.model.rememberMarkdownTextEditorState import kotlinx.coroutines.CancellationException @@ -54,6 +59,7 @@ class AttachmentsPreviewPresenter @AssistedInject constructor( private val permalinkBuilder: PermalinkBuilder, private val temporaryUriDeleter: TemporaryUriDeleter, private val featureFlagService: FeatureFlagService, + private val mediaOptimizationSelectorPresenterFactory: MediaOptimizationSelectorPresenter.Factory, @SessionCoroutineScope private val sessionCoroutineScope: CoroutineScope, private val dispatchers: CoroutineDispatchers, ) : Presenter { @@ -89,21 +95,80 @@ class AttachmentsPreviewPresenter @AssistedInject constructor( var useSendQueue by remember { mutableStateOf(false) } var preprocessMediaJob by remember { mutableStateOf(null) } - LaunchedEffect(Unit) { - useSendQueue = featureFlagService.isFeatureEnabled(FeatureFlags.MediaUploadOnSendQueue) - preprocessMediaJob = preProcessAttachment( - attachment, - sendActionState - ) + val mediaAttachment = attachment as Attachment.Media + val mediaOptimizationSelectorPresenter = remember { + mediaOptimizationSelectorPresenterFactory.create(mediaAttachment.localMedia) } + val mediaOptimizationSelectorState = mediaOptimizationSelectorPresenter.present() val observableSendState = snapshotFlow { sendActionState.value } + var displayFileTooLargeError by remember { mutableStateOf(false) } + + LaunchedEffect(Unit) { + useSendQueue = featureFlagService.isFeatureEnabled(FeatureFlags.MediaUploadOnSendQueue) + } + + LaunchedEffect(mediaOptimizationSelectorState.displayMediaSelectorViews) { + // If the media optimization selector is not displayed, we can pre-process the media + // to prepare it for sending. This is done to avoid blocking the UI thread when the + // user clicks on the send button. + if (mediaOptimizationSelectorState.displayMediaSelectorViews == false) { + val mediaOptimizationConfig = MediaOptimizationConfig( + compressImages = mediaOptimizationSelectorState.isImageOptimizationEnabled == true, + videoCompressionPreset = mediaOptimizationSelectorState.selectedVideoPreset ?: VideoCompressionPreset.STANDARD, + ) + preprocessMediaJob = preProcessAttachment( + attachment = attachment, + mediaOptimizationConfig = mediaOptimizationConfig, + displayProgress = false, + sendActionState = sendActionState, + ) + } + } + + val maxUploadSize = mediaOptimizationSelectorState.maxUploadSize.dataOrNull() + LaunchedEffect(maxUploadSize) { + // Check file upload size if the media won't be processed for upload + val isImageFile = mediaAttachment.localMedia.info.mimeType.isMimeTypeImage() + val isVideoFile = mediaAttachment.localMedia.info.mimeType.isMimeTypeVideo() + if (maxUploadSize != null && !(isImageFile || isVideoFile)) { + // If file size is not known, we're permissive and allow sending. The SDK will cancel the upload if needed. + val fileSize = mediaAttachment.localMedia.info.fileSize ?: 0L + if (maxUploadSize < fileSize) { + displayFileTooLargeError = true + } + } + } + + val videoSizeEstimations = mediaOptimizationSelectorState.videoSizeEstimations.dataOrNull() + LaunchedEffect(videoSizeEstimations) { + if (videoSizeEstimations != null) { + // Check if the video size estimations are too large for the max upload size + displayFileTooLargeError = videoSizeEstimations.none { it.canUpload } + } + } + fun handleEvents(attachmentsPreviewEvents: AttachmentsPreviewEvents) { when (attachmentsPreviewEvents) { is AttachmentsPreviewEvents.SendAttachment -> { ongoingSendAttachmentJob.value = coroutineScope.launch { + // If the media optimization selector is displayed, we need to wait for the user to select the options + // before we can pre-process the media. + if (mediaOptimizationSelectorState.displayMediaSelectorViews == true) { + val config = MediaOptimizationConfig( + compressImages = mediaOptimizationSelectorState.isImageOptimizationEnabled == true, + videoCompressionPreset = mediaOptimizationSelectorState.selectedVideoPreset ?: VideoCompressionPreset.STANDARD, + ) + preprocessMediaJob = preProcessAttachment( + attachment = attachment, + mediaOptimizationConfig = config, + displayProgress = true, + sendActionState = sendActionState, + ) + } + // If the processing was hidden before, make it visible now if (sendActionState.value is SendActionState.Sending.Processing) { sendActionState.value = SendActionState.Sending.Processing(displayProgress = true) @@ -138,6 +203,8 @@ class AttachmentsPreviewPresenter @AssistedInject constructor( } } AttachmentsPreviewEvents.CancelAndDismiss -> { + displayFileTooLargeError = false + // Cancel media preprocessing and sending preprocessMediaJob?.cancel() // If we couldn't send the pre-processed media, remove it @@ -173,18 +240,24 @@ class AttachmentsPreviewPresenter @AssistedInject constructor( textEditorState = textEditorState, allowCaption = allowCaption, showCaptionCompatibilityWarning = showCaptionCompatibilityWarning, + mediaOptimizationSelectorState = mediaOptimizationSelectorState, + displayFileTooLargeError = displayFileTooLargeError, eventSink = ::handleEvents ) } private fun CoroutineScope.preProcessAttachment( attachment: Attachment, + mediaOptimizationConfig: MediaOptimizationConfig, + displayProgress: Boolean, sendActionState: MutableState, ) = launch(dispatchers.io) { when (attachment) { is Attachment.Media -> { preProcessMedia( mediaAttachment = attachment, + mediaOptimizationConfig = mediaOptimizationConfig, + displayProgress = displayProgress, sendActionState = sendActionState, ) } @@ -193,12 +266,15 @@ class AttachmentsPreviewPresenter @AssistedInject constructor( private suspend fun preProcessMedia( mediaAttachment: Attachment.Media, + mediaOptimizationConfig: MediaOptimizationConfig, + displayProgress: Boolean, sendActionState: MutableState, ) { - sendActionState.value = SendActionState.Sending.Processing(displayProgress = false) + sendActionState.value = SendActionState.Sending.Processing(displayProgress = displayProgress) mediaSender.preProcessMedia( uri = mediaAttachment.localMedia.uri, mimeType = mediaAttachment.localMedia.info.mimeType, + mediaOptimizationConfig = mediaOptimizationConfig, ).fold( onSuccess = { mediaUploadInfo -> sendActionState.value = SendActionState.Sending.ReadyToUpload(mediaUploadInfo) 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 90438e14c3..a935dd3afe 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 @@ -9,6 +9,7 @@ package io.element.android.features.messages.impl.attachments.preview import androidx.compose.runtime.Immutable import io.element.android.features.messages.impl.attachments.Attachment +import io.element.android.features.messages.impl.attachments.video.MediaOptimizationSelectorState import io.element.android.libraries.mediaupload.api.MediaUploadInfo import io.element.android.libraries.textcomposer.model.TextEditorState @@ -18,6 +19,8 @@ data class AttachmentsPreviewState( val textEditorState: TextEditorState, val allowCaption: Boolean, val showCaptionCompatibilityWarning: Boolean, + val mediaOptimizationSelectorState: MediaOptimizationSelectorState, + val displayFileTooLargeError: Boolean, val eventSink: (AttachmentsPreviewEvents) -> Unit ) 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 e7dac45cd8..b1985482f6 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 @@ -10,14 +10,21 @@ package io.element.android.features.messages.impl.attachments.preview import androidx.compose.ui.tooling.preview.PreviewParameterProvider import androidx.core.net.toUri import io.element.android.features.messages.impl.attachments.Attachment +import io.element.android.features.messages.impl.attachments.video.MediaOptimizationSelectorState +import io.element.android.features.messages.impl.attachments.video.VideoUploadEstimation +import io.element.android.libraries.architecture.AsyncData import io.element.android.libraries.core.mimetype.MimeTypes import io.element.android.libraries.matrix.api.media.ImageInfo import io.element.android.libraries.mediaupload.api.MediaUploadInfo import io.element.android.libraries.mediaviewer.api.MediaInfo +import io.element.android.libraries.mediaviewer.api.aVideoMediaInfo import io.element.android.libraries.mediaviewer.api.anImageMediaInfo import io.element.android.libraries.mediaviewer.api.local.LocalMedia +import io.element.android.libraries.preferences.api.store.VideoCompressionPreset import io.element.android.libraries.textcomposer.model.TextEditorState import io.element.android.libraries.textcomposer.model.aTextEditorStateMarkdown +import kotlinx.collections.immutable.ImmutableList +import kotlinx.collections.immutable.persistentListOf import java.io.File open class AttachmentsPreviewStateProvider : PreviewParameterProvider { @@ -36,6 +43,21 @@ open class AttachmentsPreviewStateProvider : PreviewParameterProvider> = AsyncData.Success(persistentListOf()), + isImageOptimizationEnabled: Boolean = true, + selectedVideoPreset: VideoCompressionPreset = VideoCompressionPreset.STANDARD, + displayMediaSelectorViews: Boolean = true, + displayVideoPresetSelectorDialog: Boolean = false, +) = MediaOptimizationSelectorState( + maxUploadSize = AsyncData.Success(maxUploadSize), + videoSizeEstimations = videoSizeEstimations, + isImageOptimizationEnabled = isImageOptimizationEnabled, + selectedVideoPreset = selectedVideoPreset, + displayMediaSelectorViews = displayMediaSelectorViews, + displayVideoPresetSelectorDialog = displayVideoPresetSelectorDialog, + eventSink = {}, +) + +internal fun aVideoSizeEstimationList(): AsyncData> = AsyncData.Success( + persistentListOf( + VideoUploadEstimation( + preset = VideoCompressionPreset.HIGH, + sizeInBytes = 8_200_000L, + canUpload = false, + ), + VideoUploadEstimation( + preset = VideoCompressionPreset.STANDARD, + sizeInBytes = 4_200_000L, + canUpload = true, + ), + ) +) diff --git a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/attachments/preview/AttachmentsPreviewView.kt b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/attachments/preview/AttachmentsPreviewView.kt index 0ea99a9c35..86d742d03d 100644 --- a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/attachments/preview/AttachmentsPreviewView.kt +++ b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/attachments/preview/AttachmentsPreviewView.kt @@ -13,6 +13,7 @@ import androidx.compose.foundation.background import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.IntrinsicSize +import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.height @@ -21,31 +22,56 @@ import androidx.compose.foundation.layout.navigationBarsPadding import androidx.compose.foundation.layout.padding import androidx.compose.material3.ExperimentalMaterial3Api import androidx.compose.runtime.Composable +import androidx.compose.runtime.getValue +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.remember +import androidx.compose.runtime.setValue import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.res.painterResource 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 io.element.android.compound.theme.ElementTheme import io.element.android.compound.tokens.generated.CompoundIcons +import io.element.android.features.messages.impl.R import io.element.android.features.messages.impl.attachments.Attachment import io.element.android.features.messages.impl.attachments.preview.error.sendAttachmentError +import io.element.android.features.messages.impl.attachments.video.MediaOptimizationSelectorEvent +import io.element.android.features.messages.impl.attachments.video.MediaOptimizationSelectorState +import io.element.android.features.messages.impl.attachments.video.VideoUploadEstimation +import io.element.android.libraries.core.bool.orFalse +import io.element.android.libraries.core.mimetype.MimeTypes.isMimeTypeImage +import io.element.android.libraries.core.mimetype.MimeTypes.isMimeTypeVideo import io.element.android.libraries.designsystem.components.ProgressDialog import io.element.android.libraries.designsystem.components.ProgressDialogType import io.element.android.libraries.designsystem.components.button.BackButton +import io.element.android.libraries.designsystem.components.dialogs.AlertDialog +import io.element.android.libraries.designsystem.components.dialogs.ListDialog import io.element.android.libraries.designsystem.components.dialogs.RetryDialog +import io.element.android.libraries.designsystem.components.list.ListItemContent +import io.element.android.libraries.designsystem.modifiers.niceClickable +import io.element.android.libraries.designsystem.preview.ElementPreview import io.element.android.libraries.designsystem.preview.ElementPreviewDark +import io.element.android.libraries.designsystem.preview.PreviewsDayNight +import io.element.android.libraries.designsystem.theme.components.ListItem import io.element.android.libraries.designsystem.theme.components.Scaffold +import io.element.android.libraries.designsystem.theme.components.Switch +import io.element.android.libraries.designsystem.theme.components.Text import io.element.android.libraries.designsystem.theme.components.TopAppBar import io.element.android.libraries.designsystem.utils.CommonDrawables import io.element.android.libraries.mediaviewer.api.local.LocalMedia import io.element.android.libraries.mediaviewer.api.local.LocalMediaRenderer +import io.element.android.libraries.preferences.api.store.VideoCompressionPreset import io.element.android.libraries.textcomposer.TextComposer import io.element.android.libraries.textcomposer.model.MessageComposerMode import io.element.android.libraries.textcomposer.model.VoiceMessageState import io.element.android.libraries.ui.strings.CommonStrings +import io.element.android.libraries.ui.utils.formatter.rememberFileSizeFormatter import io.element.android.wysiwyg.display.TextDisplay +import kotlinx.collections.immutable.ImmutableList +import kotlinx.collections.immutable.persistentListOf @OptIn(ExperimentalMaterial3Api::class) @Composable @@ -109,7 +135,7 @@ private fun AttachmentSendStateView( if (sendActionState.displayProgress) { ProgressDialog( type = ProgressDialogType.Indeterminate, - text = stringResource(id = CommonStrings.common_sending), + text = stringResource(CommonStrings.common_preparing), showCancelButton = true, onDismissRequest = onDismissClick, ) @@ -157,6 +183,26 @@ private fun AttachmentPreviewContent( } } } + val mimeType = (state.attachment as? Attachment.Media)?.localMedia?.info?.mimeType + if (mimeType?.isMimeTypeImage() == true) { + ImageOptimizationSelector(state.mediaOptimizationSelectorState) + } else if (mimeType?.isMimeTypeVideo() == true) { + VideoPresetSelector(state = state.mediaOptimizationSelectorState) + } + + val sizeFormatter = rememberFileSizeFormatter() + if (state.displayFileTooLargeError) { + val maxFileUploadSize = state.mediaOptimizationSelectorState.maxUploadSize.dataOrNull() + if (maxFileUploadSize != null) { + val content = stringResource(CommonStrings.dialog_file_too_large_to_upload_subtitle, sizeFormatter.format(maxFileUploadSize, true)) + AlertDialog( + title = stringResource(CommonStrings.dialog_file_too_large_to_upload_title), + content = content, + onDismiss = { state.eventSink(AttachmentsPreviewEvents.CancelAndDismiss) }, + ) + } + } + AttachmentsPreviewBottomActions( state = state, onSendClick = onSendClick, @@ -169,6 +215,144 @@ private fun AttachmentPreviewContent( } } +@Composable +private fun ImageOptimizationSelector(state: MediaOptimizationSelectorState) { + if (state.displayMediaSelectorViews == true) { + Row( + modifier = Modifier.fillMaxWidth() + .niceClickable { + state.isImageOptimizationEnabled?.let { value -> + state.eventSink(MediaOptimizationSelectorEvent.SelectImageOptimization(!value)) + } + } + .padding(horizontal = 16.dp, vertical = 16.dp) + ) { + Text( + modifier = Modifier.weight(1f).align(Alignment.CenterVertically), + text = stringResource(R.string.screen_media_upload_preview_optimize_image_quality_title), + style = ElementTheme.materialTypography.bodyLarge, + ) + Switch( + modifier = Modifier.height(32.dp), + checked = state.isImageOptimizationEnabled.orFalse(), + onCheckedChange = { value -> state.eventSink(MediaOptimizationSelectorEvent.SelectImageOptimization(value)) }, + ) + } + } +} + +@Composable +private fun VideoPresetSelector( + state: MediaOptimizationSelectorState, +) { + val videoPresets = state.videoSizeEstimations.dataOrNull() + var selectedPreset by remember(state.selectedVideoPreset) { mutableStateOf(state.selectedVideoPreset) } + + val displayDialog = state.displayVideoPresetSelectorDialog + + val sizeFormatter = rememberFileSizeFormatter() + + if (state.displayMediaSelectorViews == true && videoPresets != null && state.selectedVideoPreset != null) { + Column( + modifier = Modifier.fillMaxWidth() + .padding(horizontal = 16.dp, vertical = 16.dp) + .niceClickable { state.eventSink(MediaOptimizationSelectorEvent.OpenVideoPresetSelectorDialog) } + ) { + val estimation = videoPresets.find { it.preset == selectedPreset } + val estimationMb = estimation?.sizeInBytes?.let { sizeFormatter.format(it, true) } + val title = buildString { + append(state.selectedVideoPreset.title()) + if (estimationMb != null) { + append(" ($estimationMb)") + } + } + Text(text = title, style = ElementTheme.typography.fontBodyLgMedium) + Text( + text = stringResource(R.string.screen_media_upload_preview_change_video_quality_prompt), + style = ElementTheme.typography.fontBodyLgMedium, + color = ElementTheme.colors.textSecondary, + ) + } + } + + if (displayDialog) { + VideoQualitySelectorDialog( + selectedPreset = selectedPreset ?: VideoCompressionPreset.STANDARD, + videoSizeEstimations = videoPresets ?: persistentListOf(), + maxFileUploadSize = state.maxUploadSize.dataOrNull(), + onSubmit = { preset -> + selectedPreset = preset + state.eventSink(MediaOptimizationSelectorEvent.SelectVideoPreset(preset)) + }, + onDismiss = { state.eventSink(MediaOptimizationSelectorEvent.DismissVideoPresetSelectorDialog) } + ) + } +} + +@Composable +private fun VideoQualitySelectorDialog( + selectedPreset: VideoCompressionPreset, + videoSizeEstimations: ImmutableList, + maxFileUploadSize: Long?, + onSubmit: (VideoCompressionPreset) -> Unit, + onDismiss: () -> Unit, +) { + val sizeFormatter = rememberFileSizeFormatter() + + var localSelectedPreset by remember(selectedPreset) { mutableStateOf(selectedPreset) } + val subtitlePartNoFileSize = stringResource(CommonStrings.dialog_video_quality_selector_subtitle_no_file_size) + val subtitlePartWithFileSize = stringResource(CommonStrings.dialog_video_quality_selector_subtitle_file_size) + val subtitle = remember(maxFileUploadSize) { + buildString { + append(subtitlePartNoFileSize) + if (maxFileUploadSize != null) { + append(String.format(subtitlePartWithFileSize, sizeFormatter.format(maxFileUploadSize, true))) + } + } + } + ListDialog( + title = stringResource(CommonStrings.dialog_video_quality_selector_title), + subtitle = subtitle, + onSubmit = { onSubmit(localSelectedPreset) }, + onDismissRequest = onDismiss, + applyPaddingToContents = false, + ) { + for (videoEstimation in videoSizeEstimations) { + val preset = videoEstimation.preset + val isSelected = preset == localSelectedPreset + item( + key = preset, + contentType = preset, + ) { + val estimationMb = sizeFormatter.format(videoEstimation.sizeInBytes, true) + val title = "${preset.title()} ($estimationMb)" + ListItem( + headlineContent = { + Text( + text = title, + style = ElementTheme.typography.fontBodyLgMedium, + ) + }, + supportingContent = { + Text( + text = preset.subtitle(), + style = ElementTheme.materialTypography.bodyMedium, + color = ElementTheme.colors.textSecondary, + ) + }, + leadingContent = ListItemContent.RadioButton( + selected = isSelected, + ), + onClick = { + localSelectedPreset = preset + }, + enabled = videoEstimation.canUpload, + ) + } + } + } +} + @Composable private fun AttachmentsPreviewBottomActions( state: AttachmentsPreviewState, @@ -221,3 +405,43 @@ internal fun AttachmentsPreviewViewPreview(@PreviewParameter(AttachmentsPreviewS } ) } + +@PreviewsDayNight +@Composable +internal fun VideoQualitySelectorDialogPreview() { + ElementPreview { + VideoQualitySelectorDialog( + selectedPreset = VideoCompressionPreset.STANDARD, + videoSizeEstimations = persistentListOf( + VideoUploadEstimation(VideoCompressionPreset.HIGH, 2_000_000, canUpload = false), + VideoUploadEstimation(VideoCompressionPreset.STANDARD, 1_000_000, canUpload = true), + VideoUploadEstimation(VideoCompressionPreset.LOW, 500_000, canUpload = true) + ), + maxFileUploadSize = 1_500_000, + onSubmit = {}, + onDismiss = {}, + ) + } +} + +@Composable +fun VideoCompressionPreset.title(): String { + return stringResource( + when (this) { + VideoCompressionPreset.STANDARD -> CommonStrings.common_video_quality_standard + VideoCompressionPreset.HIGH -> CommonStrings.common_video_quality_high + VideoCompressionPreset.LOW -> CommonStrings.common_video_quality_low + } + ) +} + +@Composable +fun VideoCompressionPreset.subtitle(): String { + return stringResource( + when (this) { + VideoCompressionPreset.STANDARD -> CommonStrings.common_video_quality_standard_description + VideoCompressionPreset.HIGH -> CommonStrings.common_video_quality_high_description + VideoCompressionPreset.LOW -> CommonStrings.common_video_quality_low_description + } + ) +} diff --git a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/attachments/preview/error/ErrorFormatter.kt b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/attachments/preview/error/ErrorFormatter.kt index ad057ca3b4..51507667ba 100644 --- a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/attachments/preview/error/ErrorFormatter.kt +++ b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/attachments/preview/error/ErrorFormatter.kt @@ -7,15 +7,15 @@ package io.element.android.features.messages.impl.attachments.preview.error +import io.element.android.features.messages.impl.R import io.element.android.libraries.mediaupload.api.MediaPreProcessor -import io.element.android.libraries.ui.strings.CommonStrings fun sendAttachmentError( throwable: Throwable ): Int { return if (throwable is MediaPreProcessor.Failure) { - CommonStrings.screen_media_upload_preview_error_failed_processing + R.string.screen_media_upload_preview_error_failed_processing } else { - CommonStrings.screen_media_upload_preview_error_failed_sending + R.string.screen_media_upload_preview_error_failed_sending } } 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 new file mode 100644 index 0000000000..b14b17dc01 --- /dev/null +++ b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/attachments/video/DefaultMediaOptimizationSelectorPresenter.kt @@ -0,0 +1,192 @@ +/* + * Copyright 2025 New Vector Ltd. + * + * SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial + * Please see LICENSE files in the repository root for full details. + */ + +package io.element.android.features.messages.impl.attachments.video + +import androidx.compose.runtime.Composable +import androidx.compose.runtime.LaunchedEffect +import androidx.compose.runtime.getValue +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.produceState +import androidx.compose.runtime.remember +import androidx.compose.runtime.setValue +import com.squareup.anvil.annotations.ContributesBinding +import dagger.assisted.Assisted +import dagger.assisted.AssistedFactory +import dagger.assisted.AssistedInject +import io.element.android.libraries.architecture.AsyncData +import io.element.android.libraries.core.mimetype.MimeTypes.isMimeTypeVideo +import io.element.android.libraries.di.SessionScope +import io.element.android.libraries.featureflag.api.FeatureFlagService +import io.element.android.libraries.featureflag.api.FeatureFlags +import io.element.android.libraries.mediaupload.api.MaxUploadSizeProvider +import io.element.android.libraries.mediaupload.api.compressorHelper +import io.element.android.libraries.mediaviewer.api.local.LocalMedia +import io.element.android.libraries.preferences.api.store.SessionPreferencesStore +import io.element.android.libraries.preferences.api.store.VideoCompressionPreset +import kotlinx.collections.immutable.ImmutableList +import kotlinx.collections.immutable.toPersistentList +import kotlinx.coroutines.flow.first +import timber.log.Timber +import kotlin.math.roundToLong + +class DefaultMediaOptimizationSelectorPresenter @AssistedInject constructor( + @Assisted private val localMedia: LocalMedia, + private val maxUploadSizeProvider: MaxUploadSizeProvider, + private val sessionPreferencesStore: SessionPreferencesStore, + private val featureFlagService: FeatureFlagService, + mediaExtractorFactory: VideoMetadataExtractor.Factory, +) : MediaOptimizationSelectorPresenter { + @ContributesBinding(SessionScope::class) + @AssistedFactory + interface Factory : MediaOptimizationSelectorPresenter.Factory { + override fun create( + localMedia: LocalMedia, + ): DefaultMediaOptimizationSelectorPresenter + } + + private val mediaExtractor = mediaExtractorFactory.create(localMedia.uri) + + @Composable + override fun present(): MediaOptimizationSelectorState { + val displayMediaSelectorViews by produceState(null) { + value = featureFlagService.isFeatureEnabled(FeatureFlags.SelectableMediaQuality) + } + + var displayVideoPresetSelectorDialog by remember { mutableStateOf(false) } + + val maxUploadSize by produceState(AsyncData.Loading()) { + maxUploadSizeProvider.getMaxUploadSize().fold( + onSuccess = { value = AsyncData.Success(it) }, + onFailure = { + Timber.e(it, "Failed to retrieve max upload size for video optimization selector") + value = AsyncData.Success((100 * 1024 * 1024).toLong()) // Default to 100 MB if we can't retrieve the max upload size + } + ) + } + + val mediaMimeType = localMedia.info.mimeType + + val videoSizeEstimations by produceState>>( + initialValue = AsyncData.Loading(), + key1 = maxUploadSize, + ) { + if (maxUploadSize !is AsyncData.Success) { + return@produceState + } + + if (!mediaMimeType.isMimeTypeVideo()) { + value = AsyncData.Uninitialized + return@produceState + } + + val (videoDimensions, duration) = mediaExtractor.use { + val size = it.getSize() + .getOrElse { exception -> + value = AsyncData.Failure(exception) + return@produceState + } + + val duration = it.getDuration() + .getOrElse { exception -> + value = AsyncData.Failure(exception) + return@produceState + } + size to duration + } + + 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 + VideoUploadEstimation( + preset = preset, + sizeInBytes = calculatedSize, + canUpload = calculatedSize <= (maxUploadSize as AsyncData.Success).data + ) + } + .toPersistentList() + .also { sizes -> + Timber.d(sizes.joinToString("\n") { "Calculated size for ${it.preset}: ${it.sizeInBytes} MB. Max upload size: $maxUploadSize" }) + } + + value = AsyncData.Success(sizeEstimations) + } + + var selectedImageOptimization by remember { mutableStateOf>(AsyncData.Loading()) } + var selectedVideoOptimizationPreset by remember { mutableStateOf>(AsyncData.Loading()) } + + LaunchedEffect(videoSizeEstimations.dataOrNull()) { + selectedImageOptimization = AsyncData.Success(sessionPreferencesStore.doesOptimizeImages().first()) + // Find the best video preset based on the default preset and the video size estimations + // Since the estimation for the current preset may be way too large to upload, we check the ones that provide lower file sizes + selectedVideoOptimizationPreset = findBestVideoPreset( + defaultVideoPreset = sessionPreferencesStore.getVideoCompressionPreset().first(), + videoSizeEstimations = videoSizeEstimations, + ) + } + + fun handleEvent(event: MediaOptimizationSelectorEvent) { + when (event) { + is MediaOptimizationSelectorEvent.SelectImageOptimization -> { + selectedImageOptimization = AsyncData.Success(event.enabled) + } + is MediaOptimizationSelectorEvent.SelectVideoPreset -> { + val estimations = videoSizeEstimations.dataOrNull() + if (estimations != null) { + val preset = estimations.find { it.preset == event.preset } + if (preset == null) { + Timber.e("Selected video preset ${event.preset} is not available in the estimations") + return + } + if (!preset.canUpload) { + Timber.w("Selected video preset ${event.preset} exceeds max upload size") + return + } + } else { + Timber.e("Video size estimations are not available") + return + } + selectedVideoOptimizationPreset = AsyncData.Success(event.preset) + displayVideoPresetSelectorDialog = false + } + is MediaOptimizationSelectorEvent.OpenVideoPresetSelectorDialog -> { + displayVideoPresetSelectorDialog = true + } + is MediaOptimizationSelectorEvent.DismissVideoPresetSelectorDialog -> { + displayVideoPresetSelectorDialog = false + } + } + } + + return MediaOptimizationSelectorState( + maxUploadSize = maxUploadSize, + videoSizeEstimations = videoSizeEstimations, + isImageOptimizationEnabled = selectedImageOptimization.dataOrNull(), + selectedVideoPreset = selectedVideoOptimizationPreset.dataOrNull(), + displayMediaSelectorViews = displayMediaSelectorViews, + displayVideoPresetSelectorDialog = displayVideoPresetSelectorDialog, + eventSink = { handleEvent(it) }, + ) + } + + private fun findBestVideoPreset( + defaultVideoPreset: VideoCompressionPreset, + videoSizeEstimations: AsyncData>, + ): AsyncData { + val estimations = videoSizeEstimations.dataOrNull() ?: return AsyncData.Loading() + // This will find the best video preset that can be used to produce a video that can be uploaded + val bestEstimation = estimations.find { it.preset.ordinal >= defaultVideoPreset.ordinal && it.canUpload }?.preset + return if (bestEstimation != null) { + AsyncData.Success(bestEstimation) + } else { + AsyncData.Failure( + IllegalStateException("No suitable video preset found for default preset: $defaultVideoPreset") + ) + } + } +} diff --git a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/attachments/video/MediaOptimizationSelectorEvent.kt b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/attachments/video/MediaOptimizationSelectorEvent.kt new file mode 100644 index 0000000000..3f6beaa750 --- /dev/null +++ b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/attachments/video/MediaOptimizationSelectorEvent.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.impl.attachments.video + +import io.element.android.libraries.preferences.api.store.VideoCompressionPreset + +sealed interface MediaOptimizationSelectorEvent { + data class SelectImageOptimization(val enabled: Boolean) : MediaOptimizationSelectorEvent + data class SelectVideoPreset(val preset: VideoCompressionPreset) : MediaOptimizationSelectorEvent + data object OpenVideoPresetSelectorDialog : MediaOptimizationSelectorEvent + data object DismissVideoPresetSelectorDialog : MediaOptimizationSelectorEvent +} diff --git a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/attachments/video/MediaOptimizationSelectorPresenter.kt b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/attachments/video/MediaOptimizationSelectorPresenter.kt new file mode 100644 index 0000000000..5efa9964ff --- /dev/null +++ b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/attachments/video/MediaOptimizationSelectorPresenter.kt @@ -0,0 +1,19 @@ +/* + * Copyright 2025 New Vector Ltd. + * + * SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial + * Please see LICENSE files in the repository root for full details. + */ + +package io.element.android.features.messages.impl.attachments.video + +import io.element.android.libraries.architecture.Presenter +import io.element.android.libraries.mediaviewer.api.local.LocalMedia + +fun interface MediaOptimizationSelectorPresenter : Presenter { + interface Factory { + fun create( + localMedia: LocalMedia, + ): MediaOptimizationSelectorPresenter + } +} diff --git a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/attachments/video/MediaOptimizationSelectorState.kt b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/attachments/video/MediaOptimizationSelectorState.kt new file mode 100644 index 0000000000..24e76f0f0b --- /dev/null +++ b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/attachments/video/MediaOptimizationSelectorState.kt @@ -0,0 +1,28 @@ +/* + * Copyright 2025 New Vector Ltd. + * + * SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial + * Please see LICENSE files in the repository root for full details. + */ + +package io.element.android.features.messages.impl.attachments.video + +import io.element.android.libraries.architecture.AsyncData +import io.element.android.libraries.preferences.api.store.VideoCompressionPreset +import kotlinx.collections.immutable.ImmutableList + +data class MediaOptimizationSelectorState( + val maxUploadSize: AsyncData, + val videoSizeEstimations: AsyncData>, + val isImageOptimizationEnabled: Boolean?, + val selectedVideoPreset: VideoCompressionPreset?, + val displayMediaSelectorViews: Boolean?, + val displayVideoPresetSelectorDialog: Boolean, + val eventSink: (MediaOptimizationSelectorEvent) -> Unit +) + +data class VideoUploadEstimation( + val preset: VideoCompressionPreset, + val sizeInBytes: Long, + val canUpload: Boolean, +) 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 new file mode 100644 index 0000000000..e16fd09b3b --- /dev/null +++ b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/attachments/video/VideoMetadataExtractor.kt @@ -0,0 +1,68 @@ +/* + * Copyright 2025 New Vector Ltd. + * + * SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial + * Please see LICENSE files in the repository root for full details. + */ + +package io.element.android.features.messages.impl.attachments.video + +import android.content.Context +import android.media.MediaMetadataRetriever +import android.net.Uri +import android.util.Size +import com.squareup.anvil.annotations.ContributesBinding +import dagger.assisted.Assisted +import dagger.assisted.AssistedFactory +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 + +interface VideoMetadataExtractor : AutoCloseable { + fun getSize(): Result + fun getDuration(): Result + interface Factory { + fun create(uri: Uri): VideoMetadataExtractor + } +} + +@ContributesBinding(AppScope::class) +class DefaultVideoMetadataExtractor @AssistedInject constructor( + @ApplicationContext context: Context, + @Assisted private val uri: Uri, +) : VideoMetadataExtractor { + @ContributesBinding(AppScope::class) + @AssistedFactory + interface Factory : VideoMetadataExtractor.Factory { + override fun create(uri: Uri): DefaultVideoMetadataExtractor + } + + private val mediaMetadataRetriever = MediaMetadataRetriever() + + init { + mediaMetadataRetriever.setDataSource(context, uri) + } + + override fun getSize(): Result = runCatchingExceptions { + val width = mediaMetadataRetriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_VIDEO_WIDTH)?.toInt() + val height = mediaMetadataRetriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_VIDEO_HEIGHT)?.toInt() + + @Suppress("ComplexCondition") + if (width != null && width > 0 && height != null && height > 0) { + Size(width, height) + } else { + error("Could not retrieve video size from metadata for $uri") + } + } + + override fun getDuration(): Result = runCatchingExceptions { + mediaMetadataRetriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_DURATION)?.toLong() + ?.takeIf { it > 0L } + ?: error("Could not retrieve video duration from metadata") + } + + override fun close() { + mediaMetadataRetriever.release() + } +} 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 c998090b76..1301a6ddff 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 @@ -60,6 +60,7 @@ import io.element.android.libraries.matrix.api.timeline.item.event.toEventOrTran import io.element.android.libraries.matrix.ui.messages.reply.InReplyToDetails import io.element.android.libraries.matrix.ui.messages.reply.map import io.element.android.libraries.mediapickers.api.PickerProvider +import io.element.android.libraries.mediaupload.api.MediaOptimizationConfigProvider import io.element.android.libraries.mediaupload.api.MediaSender import io.element.android.libraries.mediaviewer.api.local.LocalMediaFactory import io.element.android.libraries.permissions.api.PermissionsEvents @@ -120,6 +121,7 @@ class MessageComposerPresenter @AssistedInject constructor( private val mentionSpanProvider: MentionSpanProvider, private val pillificationHelper: TextPillificationHelper, private val suggestionsProcessor: SuggestionsProcessor, + private val mediaOptimizationConfigProvider: MediaOptimizationConfigProvider, ) : Presenter { @AssistedFactory interface Factory { @@ -519,6 +521,7 @@ class MessageComposerPresenter @AssistedInject constructor( uri = uri, mimeType = mimeType, progressCallback = null, + mediaOptimizationConfig = mediaOptimizationConfigProvider.get(), ).getOrThrow() } .onFailure { cause -> diff --git a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/factories/event/TimelineItemContentMessageFactory.kt b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/factories/event/TimelineItemContentMessageFactory.kt index f3b54dae53..c6a6e3c10c 100644 --- a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/factories/event/TimelineItemContentMessageFactory.kt +++ b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/factories/event/TimelineItemContentMessageFactory.kt @@ -86,6 +86,7 @@ class TimelineItemContentMessageFactory @Inject constructor( val aspectRatio = aspectRatioOf(messageType.info?.width, messageType.info?.height) TimelineItemImageContent( filename = messageType.filename, + fileSize = messageType.info?.size ?: 0, caption = messageType.caption?.trimEnd(), formattedCaption = parseHtml(messageType.formattedCaption) ?: messageType.caption?.withLinks(), isEdited = content.isEdited, @@ -106,6 +107,7 @@ class TimelineItemContentMessageFactory @Inject constructor( val aspectRatio = aspectRatioOf(messageType.info?.width, messageType.info?.height) TimelineItemStickerContent( filename = messageType.filename, + fileSize = messageType.info?.size ?: 0, caption = messageType.caption?.trimEnd(), formattedCaption = parseHtml(messageType.formattedCaption) ?: messageType.caption?.withLinks(), isEdited = content.isEdited, @@ -142,6 +144,7 @@ class TimelineItemContentMessageFactory @Inject constructor( val aspectRatio = aspectRatioOf(messageType.info?.width, messageType.info?.height) TimelineItemVideoContent( filename = messageType.filename, + fileSize = messageType.info?.size ?: 0, caption = messageType.caption?.trimEnd(), formattedCaption = parseHtml(messageType.formattedCaption) ?: messageType.caption?.withLinks(), isEdited = content.isEdited, @@ -162,6 +165,7 @@ class TimelineItemContentMessageFactory @Inject constructor( is AudioMessageType -> { TimelineItemAudioContent( filename = messageType.filename, + fileSize = messageType.info?.size ?: 0, caption = messageType.caption?.trimEnd(), formattedCaption = parseHtml(messageType.formattedCaption) ?: messageType.caption?.withLinks(), isEdited = content.isEdited, @@ -178,6 +182,7 @@ class TimelineItemContentMessageFactory @Inject constructor( TimelineItemVoiceContent( eventId = eventId, filename = messageType.filename, + fileSize = messageType.info?.size ?: 0, caption = messageType.caption?.trimEnd(), formattedCaption = parseHtml(messageType.formattedCaption) ?: messageType.caption?.withLinks(), isEdited = content.isEdited, @@ -192,6 +197,7 @@ class TimelineItemContentMessageFactory @Inject constructor( false -> { TimelineItemAudioContent( filename = messageType.filename, + fileSize = messageType.info?.size ?: 0, caption = messageType.caption?.trimEnd(), formattedCaption = parseHtml(messageType.formattedCaption) ?: messageType.caption?.withLinks(), isEdited = content.isEdited, @@ -208,6 +214,7 @@ class TimelineItemContentMessageFactory @Inject constructor( val fileExtension = fileExtensionExtractor.extractFromName(messageType.filename) TimelineItemFileContent( filename = messageType.filename, + fileSize = messageType.info?.size ?: 0, caption = messageType.caption?.trimEnd(), formattedCaption = parseHtml(messageType.formattedCaption) ?: messageType.caption?.withLinks(), isEdited = content.isEdited, diff --git a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/factories/event/TimelineItemContentStickerFactory.kt b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/factories/event/TimelineItemContentStickerFactory.kt index 84e9687b51..94e75c48ef 100644 --- a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/factories/event/TimelineItemContentStickerFactory.kt +++ b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/factories/event/TimelineItemContentStickerFactory.kt @@ -34,6 +34,7 @@ class TimelineItemContentStickerFactory @Inject constructor( return TimelineItemStickerContent( filename = content.filename, + fileSize = content.info.size ?: 0L, caption = content.body, formattedCaption = null, isEdited = false, diff --git a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/model/event/TimelineItemAudioContent.kt b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/model/event/TimelineItemAudioContent.kt index 0c77ff58ce..d543294d07 100644 --- a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/model/event/TimelineItemAudioContent.kt +++ b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/model/event/TimelineItemAudioContent.kt @@ -13,6 +13,7 @@ import kotlin.time.Duration data class TimelineItemAudioContent( override val filename: String, + override val fileSize: Long?, override val caption: String?, override val formattedCaption: CharSequence?, override val isEdited: Boolean, diff --git a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/model/event/TimelineItemAudioContentProvider.kt b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/model/event/TimelineItemAudioContentProvider.kt index e79129323b..5e9facbde5 100644 --- a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/model/event/TimelineItemAudioContentProvider.kt +++ b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/model/event/TimelineItemAudioContentProvider.kt @@ -28,6 +28,7 @@ fun aTimelineItemAudioContent( caption: String? = null, ) = TimelineItemAudioContent( filename = fileName, + fileSize = 100 * 1024L, caption = caption, formattedCaption = null, isEdited = false, diff --git a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/model/event/TimelineItemEventContent.kt b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/model/event/TimelineItemEventContent.kt index 6c20d7326f..d011865964 100644 --- a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/model/event/TimelineItemEventContent.kt +++ b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/model/event/TimelineItemEventContent.kt @@ -26,6 +26,7 @@ sealed interface TimelineItemEventContentWithAttachment : TimelineItemEventContent, TimelineItemEventMutableContent { val filename: String + val fileSize: Long? val caption: String? val formattedCaption: CharSequence? val mediaSource: MediaSource diff --git a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/model/event/TimelineItemFileContent.kt b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/model/event/TimelineItemFileContent.kt index 5b06ea18d7..c012cfcba7 100644 --- a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/model/event/TimelineItemFileContent.kt +++ b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/model/event/TimelineItemFileContent.kt @@ -12,6 +12,7 @@ import io.element.android.libraries.mediaviewer.api.helper.formatFileExtensionAn data class TimelineItemFileContent( override val filename: String, + override val fileSize: Long?, override val caption: String?, override val formattedCaption: CharSequence?, override val isEdited: Boolean, diff --git a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/model/event/TimelineItemFileContentProvider.kt b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/model/event/TimelineItemFileContentProvider.kt index 3fca3d739a..9f29c861da 100644 --- a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/model/event/TimelineItemFileContentProvider.kt +++ b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/model/event/TimelineItemFileContentProvider.kt @@ -27,6 +27,7 @@ fun aTimelineItemFileContent( caption: String? = null, ) = TimelineItemFileContent( filename = fileName, + fileSize = 100 * 1024L, caption = caption, formattedCaption = null, isEdited = false, diff --git a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/model/event/TimelineItemImageContent.kt b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/model/event/TimelineItemImageContent.kt index 90cbb85a7e..5b26d28806 100644 --- a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/model/event/TimelineItemImageContent.kt +++ b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/model/event/TimelineItemImageContent.kt @@ -15,6 +15,7 @@ import io.element.android.libraries.matrix.ui.media.MediaRequestData data class TimelineItemImageContent( override val filename: String, + override val fileSize: Long?, override val caption: String?, override val formattedCaption: CharSequence?, override val isEdited: Boolean, diff --git a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/model/event/TimelineItemImageContentProvider.kt b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/model/event/TimelineItemImageContentProvider.kt index 9d8ec47767..a5527bc74f 100644 --- a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/model/event/TimelineItemImageContentProvider.kt +++ b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/model/event/TimelineItemImageContentProvider.kt @@ -29,6 +29,7 @@ fun aTimelineItemImageContent( caption: String? = null, ) = TimelineItemImageContent( filename = filename, + fileSize = 4 * 1024 * 1024L, caption = caption, formattedCaption = null, isEdited = false, diff --git a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/model/event/TimelineItemStickerContent.kt b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/model/event/TimelineItemStickerContent.kt index 230f292cbb..6d7809b258 100644 --- a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/model/event/TimelineItemStickerContent.kt +++ b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/model/event/TimelineItemStickerContent.kt @@ -11,6 +11,7 @@ import io.element.android.libraries.matrix.api.media.MediaSource data class TimelineItemStickerContent( override val filename: String, + override val fileSize: Long?, override val caption: String?, override val formattedCaption: CharSequence?, override val isEdited: Boolean, diff --git a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/model/event/TimelineItemStickerContentProvider.kt b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/model/event/TimelineItemStickerContentProvider.kt index 52f9fc3d2c..acda873b77 100644 --- a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/model/event/TimelineItemStickerContentProvider.kt +++ b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/model/event/TimelineItemStickerContentProvider.kt @@ -27,6 +27,7 @@ fun aTimelineItemStickerContent( blurhash: String? = A_BLUR_HASH, ) = TimelineItemStickerContent( filename = "a sticker.gif", + fileSize = 4 * 1024 * 1024L, caption = "a body", formattedCaption = null, isEdited = false, diff --git a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/model/event/TimelineItemVideoContent.kt b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/model/event/TimelineItemVideoContent.kt index f43b81a52f..b8eeedd3bb 100644 --- a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/model/event/TimelineItemVideoContent.kt +++ b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/model/event/TimelineItemVideoContent.kt @@ -12,6 +12,7 @@ import kotlin.time.Duration data class TimelineItemVideoContent( override val filename: String, + override val fileSize: Long?, override val caption: String?, override val formattedCaption: CharSequence?, override val isEdited: Boolean, diff --git a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/model/event/TimelineItemVideoContentProvider.kt b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/model/event/TimelineItemVideoContentProvider.kt index d2255a36ec..a7499dc7dd 100644 --- a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/model/event/TimelineItemVideoContentProvider.kt +++ b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/model/event/TimelineItemVideoContentProvider.kt @@ -28,6 +28,7 @@ fun aTimelineItemVideoContent( blurhash: String? = A_BLUR_HASH, ) = TimelineItemVideoContent( filename = "Video.mp4", + fileSize = 14 * 1024 * 1024L, caption = null, formattedCaption = null, isEdited = false, diff --git a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/model/event/TimelineItemVoiceContent.kt b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/model/event/TimelineItemVoiceContent.kt index 5040ee36f2..cc4a764c2c 100644 --- a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/model/event/TimelineItemVoiceContent.kt +++ b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/model/event/TimelineItemVoiceContent.kt @@ -15,6 +15,7 @@ import kotlin.time.Duration data class TimelineItemVoiceContent( val eventId: EventId?, override val filename: String, + override val fileSize: Long?, override val caption: String?, override val formattedCaption: CharSequence?, override val isEdited: Boolean, diff --git a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/model/event/TimelineItemVoiceContentProvider.kt b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/model/event/TimelineItemVoiceContentProvider.kt index 73c29b2b89..37c9a906bf 100644 --- a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/model/event/TimelineItemVoiceContentProvider.kt +++ b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/model/event/TimelineItemVoiceContentProvider.kt @@ -45,6 +45,7 @@ fun aTimelineItemVoiceContent( waveform: List = listOf(0f, 1f, 2f, 3f, 4f, 5f, 6f, 7f, 8f, 9f, 8f, 7f, 6f, 5f, 4f, 3f, 2f, 1f, 0f), ) = TimelineItemVoiceContent( eventId = eventId, + fileSize = 1024 * 1024, filename = filename, caption = caption, formattedCaption = null, diff --git a/features/messages/impl/src/main/res/values-be/translations.xml b/features/messages/impl/src/main/res/values-be/translations.xml index 7ea003cfd7..ff8fd2efad 100644 --- a/features/messages/impl/src/main/res/values-be/translations.xml +++ b/features/messages/impl/src/main/res/values-be/translations.xml @@ -8,6 +8,8 @@ "Усмешкі & Удзельнікі" "Падарожжы & Месцы" "Сімвалы" + "Не атрымалася апрацаваць медыяфайл для загрузкі, паспрабуйце яшчэ раз." + "Не атрымалася загрузіць медыяфайлы, паспрабуйце яшчэ раз." "Заблакіраваць карыстальніка" "Адзначце, ці хочаце вы схаваць усе бягучыя і будучыя паведамленні ад гэтага карыстальніка" "Гэтае паведамленне будзе перададзена адміністратару вашага хатняга сервера. Яны не змогуць прачытаць зашыфраваныя паведамленні." diff --git a/features/messages/impl/src/main/res/values-cs/translations.xml b/features/messages/impl/src/main/res/values-cs/translations.xml index 3f5f94e595..c3707a2379 100644 --- a/features/messages/impl/src/main/res/values-cs/translations.xml +++ b/features/messages/impl/src/main/res/values-cs/translations.xml @@ -8,6 +8,12 @@ "Smajlíci a lidé" "Cestování a místa" "Symboly" + "Titulky nemusí být viditelné pro lidi, kteří používají starší aplikace." + "Soubor nelze nahrát." + "Nahrání média se nezdařilo, zkuste to prosím znovu." + "Nahrání média se nezdařilo, zkuste to prosím znovu." + "Maximální povolená velikost souboru je %1$s." + "Soubor je pro nahrání příliš velký." "Zablokovat uživatele" "Zaškrtněte, pokud chcete skrýt všechny aktuální a budoucí zprávy od tohoto uživatele" "Tato zpráva bude nahlášena správci vašeho domovského serveru. Nebude si moci přečíst žádné šifrované zprávy." diff --git a/features/messages/impl/src/main/res/values-cy/translations.xml b/features/messages/impl/src/main/res/values-cy/translations.xml index eb277d2f75..16841b55f6 100644 --- a/features/messages/impl/src/main/res/values-cy/translations.xml +++ b/features/messages/impl/src/main/res/values-cy/translations.xml @@ -8,6 +8,9 @@ "Wynebau Hapus a Phobl" "Teithio a Llefydd" "Symbolau" + "Efallai na fydd capsiynau yn weladwy i bobl sy\'n defnyddio apiau hŷn." + "Wedi methu â phrosesu cyfryngau i\'w llwytho, ceisiwch eto." + "Wedi methu llwytho cyfryngau, ceisiwch eto." "Rhwystro defnyddiwr" "Gwiriwch a ydych am guddio\'r holl negeseuon presennol ac yn y dyfodol gan y defnyddiwr hwn" "Bydd y neges hon yn cael ei hadrodd i weinyddwr eich gweinyddwr cartref. Fyddan nhw ddim yn gallu darllen unrhyw negeseuon wedi\'u hamgryptio." 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 a249db99f3..bd5fc09b9e 100644 --- a/features/messages/impl/src/main/res/values-da/translations.xml +++ b/features/messages/impl/src/main/res/values-da/translations.xml @@ -8,6 +8,12 @@ "Smileys og mennesker" "Rejser og steder" "Symboler" + "Billedtekster er muligvis ikke synlige for personer, der bruger ældre apps." + "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." "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-de/translations.xml b/features/messages/impl/src/main/res/values-de/translations.xml index 4b2d3cff0c..a2bac9fbf2 100644 --- a/features/messages/impl/src/main/res/values-de/translations.xml +++ b/features/messages/impl/src/main/res/values-de/translations.xml @@ -8,6 +8,9 @@ "Smileys & Menschen" "Reisen & Orte" "Symbole" + "Bildunterschriften sind für Nutzer älterer Apps möglicherweise nicht sichtbar." + "Fehler beim Verarbeiten des hochgeladenen Mediums. Bitte versuche es erneut." + "Das Hochladen der Medien ist fehlgeschlagen. Bitte versuche es erneut." "Nutzer blockieren" "Prüfen Sie, ob Sie alle aktuellen und zukünftigen Nachrichten dieses Nutzers ausblenden wollen" "Diese Nachricht wird dem Administrator ihres Homeservers gemeldet. Dieser kann allerdings keine verschlüsselten Nachrichten lesen." diff --git a/features/messages/impl/src/main/res/values-el/translations.xml b/features/messages/impl/src/main/res/values-el/translations.xml index 2b64d3ce98..1bee722e63 100644 --- a/features/messages/impl/src/main/res/values-el/translations.xml +++ b/features/messages/impl/src/main/res/values-el/translations.xml @@ -8,6 +8,9 @@ "Φατσούλες & Άνθρωποι" "Ταξίδια & Μέρη" "Σύμβολα" + "Οι λεζάντες ενδέχεται να μην είναι ορατές σε άτομα που χρησιμοποιούν παλαιότερες εφαρμογές." + "Αποτυχία μεταφόρτωσης μέσου, δοκίμασε ξανά." + "Αποτυχία μεταφόρτωσης πολυμέσων, δοκίμασε ξανά." "Αποκλεισμός χρήστη" "Επέλεξε εάν θες να αποκρύψεις όλα τα τρέχοντα και μελλοντικά μηνύματα από αυτόν τον χρήστη" "Αυτό το μήνυμα θα αναφερθεί στον διαχειριστή του οικιακού διακομιστή σας. Δεν θα μπορεί να διαβάσει κρυπτογραφημένα μηνύματα." diff --git a/features/messages/impl/src/main/res/values-es/translations.xml b/features/messages/impl/src/main/res/values-es/translations.xml index 54b15f66a5..e8f639fd21 100644 --- a/features/messages/impl/src/main/res/values-es/translations.xml +++ b/features/messages/impl/src/main/res/values-es/translations.xml @@ -8,6 +8,9 @@ "Emojis y personas" "Viajes y lugares" "Símbolos" + "Es posible que las leyendas no sean visibles para las personas que usan aplicaciones más antiguas." + "Error al procesar el contenido multimedia, por favor inténtalo de nuevo." + "Error al subir el contenido multimedia, por favor inténtalo de nuevo." "Bloquear usuario" "Marca esta casilla si quieres ocultar todos los mensajes actuales y futuros de este usuario" "Se denunciará este mensaje al administrador de tu servidor base. No será capaz de leer ningún mensaje cifrado." 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 6d369a083a..f6ed132375 100644 --- a/features/messages/impl/src/main/res/values-et/translations.xml +++ b/features/messages/impl/src/main/res/values-et/translations.xml @@ -8,6 +8,12 @@ "Emotikonid ja inimesed" "Reisimine ja kohad" "Sümbolid" + "Selgitused ja alapealkirjad ei pruugi olla nähtavad vanemate rakenduste kasutajatele." + "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" "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-eu/translations.xml b/features/messages/impl/src/main/res/values-eu/translations.xml index 34d0a114ee..fdd0b79ab2 100644 --- a/features/messages/impl/src/main/res/values-eu/translations.xml +++ b/features/messages/impl/src/main/res/values-eu/translations.xml @@ -8,6 +8,7 @@ "Irribartxoak eta jendea" "Bidaiak eta tokiak" "Ikurrak" + "Huts egin du multimedia igotzeak, saiatu berriro." "Blokeatu erabiltzailea" "Mezua zure zerbitzariko administratzaileari jakinaraziko zaio. Ezingo dute zifratutako mezurik irakurri." "Edukia salatzeko arrazoia" 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 589748f59c..205907a3b0 100644 --- a/features/messages/impl/src/main/res/values-fa/translations.xml +++ b/features/messages/impl/src/main/res/values-fa/translations.xml @@ -8,6 +8,8 @@ "شکلک‌ها و افراد" "سفر و مکان‌ها" "نمادها" + "پردازش رسانه برای بارگذاری شکست خورد. لطفاً دوباره تلاش کنید." + "بارگذاری رسانه شکست خورد. لطفاً دوباره تلاش کنید." "انسداد کاربر" "اگر می‌خواهید همه پیام‌های فعلی و آینده را از این کاربر را پنهان کنید، علامت بزنید" "این پیام به مدیر کارساز خانگی شما گزارش خواهد شد. آنها قادر به خواندن پیام های رمزگذاری شده نخواهند بود." diff --git a/features/messages/impl/src/main/res/values-fi/translations.xml b/features/messages/impl/src/main/res/values-fi/translations.xml index 3c09463742..0f4a273f0f 100644 --- a/features/messages/impl/src/main/res/values-fi/translations.xml +++ b/features/messages/impl/src/main/res/values-fi/translations.xml @@ -8,6 +8,12 @@ "Hymiöt ja ihmiset" "Matkustaminen ja paikat" "Symbolit" + "Kuvatekstit eivät välttämättä näy ihmisille, jotka käyttävät vanhempia sovelluksia." + "Tiedostoa ei voitu lähettää." + "Median käsittely epäonnistui, yritä uudelleen." + "Median lähettäminen epäonnistui, yritä uudelleen." + "Suurin sallittu tiedostokoko on %1$s." + "Tiedosto on liian suuri lähetettäväksi" "Estä käyttäjä" "Valitse tämä, jos haluat piilottaa kaikki nykyiset ja tulevat viestit tältä käyttäjältä" "Tämä viesti ilmoitetaan kotipalvelimesi ylläpitäjälle. Ylläpitäjä ei pysty lukemaan salattuja viestejä." 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 87465ddf36..c5b80c02f6 100644 --- a/features/messages/impl/src/main/res/values-fr/translations.xml +++ b/features/messages/impl/src/main/res/values-fr/translations.xml @@ -8,6 +8,12 @@ "Émoticônes et personnes" "Voyages & lieux" "Symboles" + "Les légendes peuvent ne pas être visibles pour les utilisateurs d’anciennes applications." + "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é." "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 9e7de8616d..a37858681d 100644 --- a/features/messages/impl/src/main/res/values-hu/translations.xml +++ b/features/messages/impl/src/main/res/values-hu/translations.xml @@ -8,6 +8,12 @@ "Mosolyok és emberek" "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." + "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" "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-in/translations.xml b/features/messages/impl/src/main/res/values-in/translations.xml index 253e521c88..1be1dba94c 100644 --- a/features/messages/impl/src/main/res/values-in/translations.xml +++ b/features/messages/impl/src/main/res/values-in/translations.xml @@ -8,6 +8,9 @@ "Senyuman & Orang" "Wisata & Tempat" "Simbol" + "Keterangan mungkin tidak terlihat oleh orang yang menggunakan aplikasi lama." + "Gagal memproses media untuk diunggah, silakan coba lagi." + "Gagal mengunggah media, silakan coba lagi." "Blokir pengguna" "Centang jika Anda ingin menyembunyikan semua pesan saat ini dan yang akan datang dari pengguna ini" "Pesan ini akan dilaporkan ke administrator homeserver Anda. Mereka tidak akan dapat membaca pesan terenkripsi apa pun." diff --git a/features/messages/impl/src/main/res/values-it/translations.xml b/features/messages/impl/src/main/res/values-it/translations.xml index 69c6c996a9..f0d7e95766 100644 --- a/features/messages/impl/src/main/res/values-it/translations.xml +++ b/features/messages/impl/src/main/res/values-it/translations.xml @@ -8,6 +8,9 @@ "Faccine & Persone" "Viaggi & Luoghi" "Simboli" + "Le didascalie potrebbero non essere visibili agli utenti di app meno recenti." + "Elaborazione del file multimediale da caricare fallita, riprova." + "Caricamento del file multimediale fallito, riprova." "Blocca utente" "Seleziona se vuoi nascondere tutti i messaggi attuali e futuri di questo utente" "Questo messaggio verrà segnalato all\'amministratore dell\'homeserver. Questi non sarà in grado di leggere i messaggi cifrati." diff --git a/features/messages/impl/src/main/res/values-ka/translations.xml b/features/messages/impl/src/main/res/values-ka/translations.xml index 1c5ad9e8ed..842fa4bf5b 100644 --- a/features/messages/impl/src/main/res/values-ka/translations.xml +++ b/features/messages/impl/src/main/res/values-ka/translations.xml @@ -8,6 +8,8 @@ "ღიმილები & ხალხი" "მოგზაურობა და ადგილები" "სიმბოლოები" + "მედიის ატვირთვა ვერ მოხერხდა. გთხოვთ, სცადოთ ხელახლა." + "მედიის ატვირთვა ვერ მოხერხდა, გთხოვთ, სცადოთ ხელახლა." "მომხმარებლის დაბლოკვა" "შეამოწმეთ, გსურთ თუ არა ამ მომხმარებლის ყველა მიმდინარე და მომავალი შეტყობინების დამალვა" "ეს შეტყობინება გაგზავნილი იქნება თქვენი სახლის სერვერის ადმინისტრატორისადმი. მას არ ექნება დაშიფვრული შეტყობინებების წაკითხვის შესაძლებლობა." diff --git a/features/messages/impl/src/main/res/values-lt/translations.xml b/features/messages/impl/src/main/res/values-lt/translations.xml index 0b5c33adeb..627d431748 100644 --- a/features/messages/impl/src/main/res/values-lt/translations.xml +++ b/features/messages/impl/src/main/res/values-lt/translations.xml @@ -8,6 +8,8 @@ "Šypsenėlės ir Žmonės" "Kelionės ir Vietovės" "Simboliai" + "Nepavyko apdoroti įkeliamos laikmenos, bandykite dar kartą." + "Nepavyko įkelti laikmenos, pabandykite dar kartą." "Blokuoti vartotoją" "Pažymėkite, jei norite paslėpti visas esamas ir būsimas šio vartotojo žinutes" "Apie šią žinutę bus pranešta Jūsų serverio administracijai. Jie negalės perskaityti jokių užšifruotų žinučių." diff --git a/features/messages/impl/src/main/res/values-nb/translations.xml b/features/messages/impl/src/main/res/values-nb/translations.xml index acb6762a1b..18bf54b1fd 100644 --- a/features/messages/impl/src/main/res/values-nb/translations.xml +++ b/features/messages/impl/src/main/res/values-nb/translations.xml @@ -8,6 +8,9 @@ "Smilefjes og mennesker" "Reising og steder" "Symboler" + "Teksting er kanskje ikke synlig for personer som bruker eldre apper." + "Kunne ikke behandle medier for opplasting, vennligst prøv igjen." + "Opplasting av medier mislyktes, vennligst prøv igjen." "Blokker bruker" "Kryss av for om du vil skjule alle nåværende og fremtidige meldinger fra denne brukeren" "Denne meldingen vil bli rapportert til hjemmeserverens administratorer. De vil ikke kunne lese noen krypterte meldinger." diff --git a/features/messages/impl/src/main/res/values-nl/translations.xml b/features/messages/impl/src/main/res/values-nl/translations.xml index 3cfd37be19..afc25d2a24 100644 --- a/features/messages/impl/src/main/res/values-nl/translations.xml +++ b/features/messages/impl/src/main/res/values-nl/translations.xml @@ -8,6 +8,8 @@ "Smileys & Mensen" "Reizen & Locaties" "Symbolen" + "Het verwerken van media voor uploaden is mislukt. Probeer het opnieuw." + "Het uploaden van media is mislukt. Probeer het opnieuw." "Gebruiker blokkeren" "Vink aan als je alle huidige en toekomstige berichten van deze gebruiker wilt verbergen" "Dit bericht wordt gerapporteerd aan de beheerder van je homeserver. Ze zullen geen versleutelde berichten kunnen lezen." diff --git a/features/messages/impl/src/main/res/values-pl/translations.xml b/features/messages/impl/src/main/res/values-pl/translations.xml index 69005d3c77..b7925c7865 100644 --- a/features/messages/impl/src/main/res/values-pl/translations.xml +++ b/features/messages/impl/src/main/res/values-pl/translations.xml @@ -8,6 +8,12 @@ "Buźki i osoby" "Podróż i miejsca" "Symbole" + "Opis może być niedostępny dla osób korzystających ze starszej wersji aplikacji." + "Nie udało się przesłać pliku." + "Przetwarzanie multimediów do przesłania nie powiodło się, spróbuj ponownie." + "Przesyłanie multimediów nie powiodło się, spróbuj ponownie." + "Maksymalny dozwolony rozmiar pliku to %1$s." + "Plik jest za duży, aby go przesłać." "Zablokuj użytkownika" "Sprawdź, czy chcesz ukryć wszystkie bieżące i przyszłe wiadomości od tego użytkownika." "Ta wiadomość zostanie zgłoszona do administratora Twojego serwera domowego. Nie będzie mógł on przeczytać żadnych zaszyfrowanych wiadomości." diff --git a/features/messages/impl/src/main/res/values-pt-rBR/translations.xml b/features/messages/impl/src/main/res/values-pt-rBR/translations.xml index 9688adc49d..190b50d2ad 100644 --- a/features/messages/impl/src/main/res/values-pt-rBR/translations.xml +++ b/features/messages/impl/src/main/res/values-pt-rBR/translations.xml @@ -8,6 +8,9 @@ "Sorrisos & Pessoas" "Viagens & Lugares" "Símbolos" + "As legendas podem não ser visíveis para pessoas que usam aplicativos mais antigos." + "Falha ao processar mídia para upload. Tente novamente." + "Falha ao enviar mídia. Tente novamente." "Bloquear usuário" "Marque se você deseja ocultar todas as mensagens atuais e futuras desse usuário" "Essa mensagem será reportada ao administrador do seu homeserver. Eles não conseguirão ler nenhuma mensagem criptografada." diff --git a/features/messages/impl/src/main/res/values-pt/translations.xml b/features/messages/impl/src/main/res/values-pt/translations.xml index 4759a6aeb9..4ed5faff55 100644 --- a/features/messages/impl/src/main/res/values-pt/translations.xml +++ b/features/messages/impl/src/main/res/values-pt/translations.xml @@ -8,6 +8,12 @@ "Caras e Pessoas" "Viagens e Lugares" "Símbolos" + "As legendas poderão não ser visíveis em versões mais antigas da aplicação." + "Não foi possível enviar o ficheiro" + "Falha ao processar multimédia para carregamento, por favor tente novamente." + "Falhar ao carregar multimédia, por favor tente novamente." + "O tamanho máximo permitido é %1$s." + "O ficheiro é demasiado grande para enviar" "Bloquear utilizador" "Ativar para ocultar todas as atuais e futuras mensagens deste utilizador" "Esta mensagem será denunciada ao administrador do teu servidor. Porém, não lhe será possível ler quaisquer mensagens cifradas." diff --git a/features/messages/impl/src/main/res/values-ro/translations.xml b/features/messages/impl/src/main/res/values-ro/translations.xml index 9b44893ce2..3ca5002f38 100644 --- a/features/messages/impl/src/main/res/values-ro/translations.xml +++ b/features/messages/impl/src/main/res/values-ro/translations.xml @@ -8,6 +8,8 @@ "Fețe zâmbitoare & Oameni" "Călătorii & Locuri" "Simboluri" + "Procesarea datelor media a eșuat, vă rugăm să încercați din nou." + "Încărcarea fișierelor media a eșuat, încercați din nou." "Blocați utilizatorul" "Confirmați că doriți să ascundeți toate mesajele curente și viitoare de la acest utilizator" "Acest mesaj va fi raportat administratorilor homeserver-ului tau. Ei nu vor putea citi niciun mesaj criptat." diff --git a/features/messages/impl/src/main/res/values-ru/translations.xml b/features/messages/impl/src/main/res/values-ru/translations.xml index b8c3cc237f..61d1efa0b8 100644 --- a/features/messages/impl/src/main/res/values-ru/translations.xml +++ b/features/messages/impl/src/main/res/values-ru/translations.xml @@ -8,6 +8,9 @@ "Улыбки и люди" "Путешествия и места" "Символы" + "Подпись может быть не видна пользователям старых приложений." + "Не удалось обработать медиафайл для загрузки, попробуйте еще раз." + "Не удалось загрузить медиафайлы, попробуйте еще раз." "Заблокировать пользователя" "Отметьте, хотите ли вы скрыть все текущие и будущие сообщения от этого пользователя" "Это сообщение будет передано администратору вашего домашнего сервера. Они не смогут прочитать зашифрованные сообщения." 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 23c664c5d4..834ad4111a 100644 --- a/features/messages/impl/src/main/res/values-sk/translations.xml +++ b/features/messages/impl/src/main/res/values-sk/translations.xml @@ -8,6 +8,12 @@ "Smajlíky a ľudia" "Cestovanie a miesta" "Symboly" + "Titulky nemusia byť viditeľné pre ľudí používajúcich staršie aplikácie." + "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" "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 bb803b396f..5ecb88af84 100644 --- a/features/messages/impl/src/main/res/values-sv/translations.xml +++ b/features/messages/impl/src/main/res/values-sv/translations.xml @@ -8,6 +8,9 @@ "Smileys & personer" "Resor & platser" "Symboler" + "Bildtexter kanske inte är synliga för personer som använder äldre appar." + "Misslyckades att bearbeta media för uppladdning, vänligen pröva igen." + "Misslyckades att ladda upp media, vänligen pröva igen." "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." @@ -35,8 +38,18 @@ "Visa mindre" "Meddelande kopierat" "Du är inte behörig att göra inlägg i det här rummet" + + "%1$d medlem reagerade med %2$s" + "%1$d medlemmar reagerade med %2$s" + + + "Du och %1$d medlem reagerade med %2$s" + "Du och %1$d medlemmarna reagerade med %2$s" + + "Du reagerade med %1$s" "Visa mindre" "Visa mer" + "Visa sammanfattning av reaktioner" "Nytt" "%1$d rumsändring" diff --git a/features/messages/impl/src/main/res/values-tr/translations.xml b/features/messages/impl/src/main/res/values-tr/translations.xml index de962f72ee..fbd425eee4 100644 --- a/features/messages/impl/src/main/res/values-tr/translations.xml +++ b/features/messages/impl/src/main/res/values-tr/translations.xml @@ -8,6 +8,9 @@ "İfadeler ve İnsanlar" "Seyahat ve Yerler" "Simgeler" + "Açıklamalar, eski uygulamaları kullanan kişiler tarafından görülemeyebilir." + "Medya yüklenemedi, lütfen tekrar deneyin." + "Medya yüklenemedi, lütfen tekrar deneyin." "Kullanıcıyı engelle" "Bu kullanıcıdan gelen mevcut ve gelecekteki tüm mesajları gizlemek isteyip istemediğinizi işaretleyin" "Bu mesaj ana sunucunuzun yöneticisine bildirilecektir. Şifrelenmiş mesajları okuyamayacaklardır." 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 b8f9ec0b68..f9a5fc6652 100644 --- a/features/messages/impl/src/main/res/values-uk/translations.xml +++ b/features/messages/impl/src/main/res/values-uk/translations.xml @@ -8,6 +8,12 @@ "Смайлики та люди" "Подорожі та місця" "Символи" + "Користувачі старих застосунків можуть не бачити підписи." + "Файл не може бути вивантажено." + "Не вдалося обробити медіафайл для завантаження, спробуйте ще раз." + "Не вдалося завантажити медіафайл, спробуйте ще раз." + "Максимально дозволений розмір файлу — %1$s." + "Файл завеликий для вивантаження" "Заблокувати користувача" "Перевірте, чи хочете ви приховати всі поточні та майбутні повідомлення від цього користувача" "Це повідомлення буде надіслано адміністраторам вашого домашнього сервера. Вони не зможуть прочитати зашифровані повідомлення." diff --git a/features/messages/impl/src/main/res/values-ur/translations.xml b/features/messages/impl/src/main/res/values-ur/translations.xml index 2b09c2bf0c..3b743a69e8 100644 --- a/features/messages/impl/src/main/res/values-ur/translations.xml +++ b/features/messages/impl/src/main/res/values-ur/translations.xml @@ -8,6 +8,8 @@ "مسکراہٹیں و لوگ" "سفر و مقامات" "علامتیں" + "وسائط کا معالجہ برائے ترفیع ناکام، برائے مہربانی دوبارہ کوشش کریں۔" + "وسائط رفع کرنے میں ناکام، برائے مہربانی دوبارہ کوشش کریں۔" "صارف کو مسدود کریں" "پڑتال کریں کہ کیا آپ اس صارف سے تمام موجودہ اور مستقبلی پیغامات چھپانا چاہتے ہیں۔" "اس پیغام کی اطلاع آپکے منزلی خادم کے منتظم کو دی جائیگی۔ وہ کوئی مرموزکردہ پیغامات نہیں پڑھ سکیں گے۔" 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 78681df692..9c1b9e0df7 100644 --- a/features/messages/impl/src/main/res/values-uz/translations.xml +++ b/features/messages/impl/src/main/res/values-uz/translations.xml @@ -8,6 +8,8 @@ "Smayllar va odamlar" "Sayohat va Joylar" "Belgilar" + "Mediani yuklab bo‘lmadi, qayta urinib ko‘ring." + "Media yuklanmadi, qayta urinib ko‘ring." "Foydalanuvchini bloklash" "Ushbu foydalanuvchidan barcha joriy va kelajakdagi xabarlarni yashirishni xohlayotganingizni tekshiring" "Bu xabar uy serveringiz administratoriga xabar qilinadi. Ular hech qanday shifrlangan xabarlarni o\'qiy olmaydi." 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 bf87bdf3e1..5e4caa1cc6 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 @@ -8,6 +8,9 @@ "表情與人物" "旅行與景點" "標誌" + "使用舊應用程式的使用者可能看不到標題。" + "無法處理要上傳的媒體,請再試一次。" + "無法上傳媒體檔案,請稍後再試。" "封鎖使用者" "檢查您是否要隱藏所有來自此使用者的目前及未來的訊息" "此訊息將會回報給您的家伺服器管理員。他們將無法讀取任何已加密的訊息。" 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 79c818a52a..74902e353c 100644 --- a/features/messages/impl/src/main/res/values-zh/translations.xml +++ b/features/messages/impl/src/main/res/values-zh/translations.xml @@ -8,6 +8,9 @@ "表情和人物" "旅行和地点" "符号" + "使用旧版应用程序的用户可能无法看到字幕。" + "处理要上传的媒体失败,请重试。" + "上传媒体失败,请重试。" "封禁用户" "请确认是否要隐藏该用户当前和未来的所有信息" "此消息将举报给您的服务器管理员。他们无法读取任何加密消息。" diff --git a/features/messages/impl/src/main/res/values/localazy.xml b/features/messages/impl/src/main/res/values/localazy.xml index 2d208bef49..dc9e2a1892 100644 --- a/features/messages/impl/src/main/res/values/localazy.xml +++ b/features/messages/impl/src/main/res/values/localazy.xml @@ -8,6 +8,15 @@ "Smileys & People" "Travel & Places" "Symbols" + "Captions might not be visible to people using older apps." + "Tap to change the video upload quality" + "The file could not be uploaded." + "Failed processing media to upload, please try again." + "Failed uploading media, please try again." + "The maximum file size allowed is %1$s." + "The file is too large to upload" + "Optimise image quality" + "Processing…" "Block user" "Check if you want to hide all current and future messages from this user" "This message will be reported to your homeserver’s administrator. They will not be able to read any encrypted messages." 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 f24175c33e..001da88bd4 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 @@ -325,6 +325,7 @@ class MessagesPresenterTest { val mediaMessage = aMessageEvent( content = TimelineItemImageContent( filename = "image.jpg", + fileSize = 4 * 1024 * 1024L, caption = null, formattedCaption = null, isEdited = false, @@ -365,6 +366,7 @@ class MessagesPresenterTest { val mediaMessage = aMessageEvent( content = TimelineItemVideoContent( filename = "video.mp4", + fileSize = 50 * 1024 * 1024L, caption = null, formattedCaption = null, isEdited = false, @@ -406,6 +408,7 @@ class MessagesPresenterTest { val mediaMessage = aMessageEvent( content = TimelineItemFileContent( filename = "file.pdf", + fileSize = 10 * 1024 * 1024L, caption = null, isEdited = false, formattedCaption = null, 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 292bc89654..18808d9ddf 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 @@ -18,8 +18,12 @@ import io.element.android.features.messages.impl.attachments.preview.Attachments import io.element.android.features.messages.impl.attachments.preview.AttachmentsPreviewPresenter import io.element.android.features.messages.impl.attachments.preview.OnDoneListener import io.element.android.features.messages.impl.attachments.preview.SendActionState +import io.element.android.features.messages.impl.attachments.video.MediaOptimizationSelectorState +import io.element.android.features.messages.impl.attachments.video.VideoUploadEstimation import io.element.android.features.messages.impl.fixtures.aMediaAttachment +import io.element.android.features.messages.test.attachments.video.FakeMediaOptimizationSelectorPresenterFactory 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.featureflag.api.FeatureFlags import io.element.android.libraries.featureflag.test.FakeFeatureFlagService @@ -36,15 +40,19 @@ import io.element.android.libraries.matrix.test.media.FakeMediaUploadHandler import io.element.android.libraries.matrix.test.permalink.FakePermalinkBuilder import io.element.android.libraries.matrix.test.room.FakeJoinedRoom import io.element.android.libraries.matrix.test.timeline.FakeTimeline +import io.element.android.libraries.mediaupload.api.MediaOptimizationConfig import io.element.android.libraries.mediaupload.api.MediaPreProcessor import io.element.android.libraries.mediaupload.api.MediaSender import io.element.android.libraries.mediaupload.api.MediaUploadInfo import io.element.android.libraries.mediaupload.test.FakeMediaPreProcessor +import io.element.android.libraries.mediaviewer.api.aVideoMediaInfo +import io.element.android.libraries.mediaviewer.api.anApkMediaInfo import io.element.android.libraries.mediaviewer.api.local.LocalMedia import io.element.android.libraries.mediaviewer.test.viewer.aLocalMedia -import io.element.android.libraries.preferences.test.InMemorySessionPreferencesStore +import io.element.android.libraries.preferences.api.store.VideoCompressionPreset import io.element.android.tests.testutils.WarmUpRule import io.element.android.tests.testutils.awaitLastSequentialItem +import io.element.android.tests.testutils.consumeItemsUntilPredicate import io.element.android.tests.testutils.fake.FakeTemporaryUriDeleter import io.element.android.tests.testutils.lambda.any import io.element.android.tests.testutils.lambda.lambdaError @@ -53,6 +61,7 @@ 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.mockk +import kotlinx.collections.immutable.persistentListOf import kotlinx.coroutines.CompletableDeferred import kotlinx.coroutines.ExperimentalCoroutinesApi import kotlinx.coroutines.test.TestScope @@ -64,6 +73,7 @@ import org.junit.runner.RunWith import org.robolectric.RobolectricTestRunner import java.io.File +@Suppress("LargeClass") @RunWith(RobolectricTestRunner::class) class AttachmentsPreviewPresenterTest { @get:Rule @@ -548,6 +558,111 @@ class AttachmentsPreviewPresenterTest { } } + @Test + fun `present - file too large will display error`() = runTest { + val onDoneListenerResult = lambdaRecorder {} + + val localMedia = aLocalMedia(uri = Uri.EMPTY, mediaInfo = anApkMediaInfo()) + val maxUploadSize = 999L // Set a max upload size smaller than the file size + + val presenter = createAttachmentsPreviewPresenter( + localMedia = localMedia, + room = FakeJoinedRoom( + liveTimeline = FakeTimeline().apply { + sendFileLambda = { _, _, _, _, _, _ -> + Result.success(FakeMediaUploadHandler()) + } + } + ), + mediaUploadOnSendQueueEnabled = true, + onDoneListener = onDoneListenerResult, + mediaOptimizationSelectorPresenterFactory = FakeMediaOptimizationSelectorPresenterFactory { + MediaOptimizationSelectorState( + // Set a max upload size smaller than the file size + maxUploadSize = AsyncData.Success(maxUploadSize), + videoSizeEstimations = AsyncData.Uninitialized, + isImageOptimizationEnabled = null, + selectedVideoPreset = null, + displayMediaSelectorViews = false, + displayVideoPresetSelectorDialog = false, + eventSink = {}, + ) + } + ) + + moleculeFlow(RecompositionMode.Immediate) { + presenter.present() + }.test { + assertThat(localMedia.info.fileSize).isGreaterThan(maxUploadSize) + + consumeItemsUntilPredicate { it.mediaOptimizationSelectorState.maxUploadSize.isSuccess() } + + assertThat(awaitItem().displayFileTooLargeError).isTrue() + } + } + + @Test + fun `present - video size estimations too large will display error`() = runTest { + val onDoneListenerResult = lambdaRecorder {} + + val localMedia = aLocalMedia(uri = Uri.EMPTY, mediaInfo = aVideoMediaInfo()) + + val presenter = createAttachmentsPreviewPresenter( + localMedia = localMedia, + room = FakeJoinedRoom( + liveTimeline = FakeTimeline().apply { + sendFileLambda = { _, _, _, _, _, _ -> + Result.success(FakeMediaUploadHandler()) + } + } + ), + mediaUploadOnSendQueueEnabled = true, + onDoneListener = onDoneListenerResult, + mediaOptimizationSelectorPresenterFactory = FakeMediaOptimizationSelectorPresenterFactory { + MediaOptimizationSelectorState( + // Set a max upload size smaller than the file size + maxUploadSize = AsyncData.Success(Long.MAX_VALUE), + videoSizeEstimations = AsyncData.Success( + persistentListOf( + VideoUploadEstimation( + preset = VideoCompressionPreset.LOW, + // The important field is canUpload, it will normally be based on the sizeInBytes + canUpload = false, + sizeInBytes = 0L, + ), + VideoUploadEstimation( + preset = VideoCompressionPreset.STANDARD, + canUpload = false, + sizeInBytes = 0L, + ), + VideoUploadEstimation( + preset = VideoCompressionPreset.HIGH, + canUpload = false, + sizeInBytes = 0L, + ), + ) + ), + isImageOptimizationEnabled = null, + selectedVideoPreset = null, + displayMediaSelectorViews = false, + displayVideoPresetSelectorDialog = false, + eventSink = {}, + ) + } + ) + + moleculeFlow(RecompositionMode.Immediate) { + presenter.present() + }.test { + consumeItemsUntilPredicate { + it.mediaOptimizationSelectorState.maxUploadSize.isSuccess() && + it.mediaOptimizationSelectorState.videoSizeEstimations.dataOrNull()?.isNotEmpty() == true + } + + assertThat(awaitItem().displayFileTooLargeError).isTrue() + } + } + private fun TestScope.createAttachmentsPreviewPresenter( localMedia: LocalMedia = aLocalMedia( uri = mockMediaUrl, @@ -560,11 +675,27 @@ class AttachmentsPreviewPresenterTest { mediaUploadOnSendQueueEnabled: Boolean = true, allowCaption: Boolean = true, showCaptionCompatibilityWarning: Boolean = true, + displayMediaQualitySelectorViews: Boolean = false, + mediaOptimizationSelectorPresenterFactory: FakeMediaOptimizationSelectorPresenterFactory = FakeMediaOptimizationSelectorPresenterFactory( + fakePresenter = { + MediaOptimizationSelectorState( + maxUploadSize = AsyncData.Uninitialized, + videoSizeEstimations = AsyncData.Uninitialized, + isImageOptimizationEnabled = null, + selectedVideoPreset = null, + displayMediaSelectorViews = displayMediaQualitySelectorViews, + displayVideoPresetSelectorDialog = false, + eventSink = {}, + ) + } + ), ): AttachmentsPreviewPresenter { return AttachmentsPreviewPresenter( attachment = aMediaAttachment(localMedia), onDoneListener = onDoneListener, - mediaSender = MediaSender(mediaPreProcessor, room, InMemorySessionPreferencesStore()), + mediaSender = MediaSender(mediaPreProcessor, room, { + MediaOptimizationConfig(compressImages = true, videoCompressionPreset = VideoCompressionPreset.STANDARD) + }), permalinkBuilder = permalinkBuilder, temporaryUriDeleter = temporaryUriDeleter, featureFlagService = FakeFeatureFlagService( @@ -576,6 +707,7 @@ class AttachmentsPreviewPresenterTest { ), sessionCoroutineScope = this, dispatchers = testCoroutineDispatchers(), + mediaOptimizationSelectorPresenterFactory = mediaOptimizationSelectorPresenterFactory, ) } 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 new file mode 100644 index 0000000000..b529918ddc --- /dev/null +++ b/features/messages/impl/src/test/kotlin/io/element/android/features/messages/impl/attachments/video/DefaultMediaOptimizationSelectorPresenterTest.kt @@ -0,0 +1,249 @@ +/* + * Copyright 2025 New Vector Ltd. + * + * SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial + * Please see LICENSE files in the repository root for full details. + */ + +package io.element.android.features.messages.impl.attachments.video + +import android.net.Uri +import android.util.Size +import androidx.test.ext.junit.runners.AndroidJUnit4 +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.messages.test.attachments.video.FakeVideoMetadataExtractor +import io.element.android.features.messages.test.attachments.video.FakeVideoMetadataExtractorFactory +import io.element.android.libraries.architecture.AsyncData +import io.element.android.libraries.featureflag.api.FeatureFlags +import io.element.android.libraries.featureflag.test.FakeFeatureFlagService +import io.element.android.libraries.matrix.test.AN_EXCEPTION +import io.element.android.libraries.matrix.test.FakeMatrixClient +import io.element.android.libraries.mediaupload.api.MaxUploadSizeProvider +import io.element.android.libraries.mediaviewer.api.aVideoMediaInfo +import io.element.android.libraries.mediaviewer.api.anImageMediaInfo +import io.element.android.libraries.mediaviewer.api.local.LocalMedia +import io.element.android.libraries.mediaviewer.test.viewer.aLocalMedia +import io.element.android.libraries.preferences.api.store.VideoCompressionPreset +import io.element.android.libraries.preferences.test.InMemorySessionPreferencesStore +import io.element.android.tests.testutils.WarmUpRule +import io.mockk.mockk +import kotlinx.coroutines.test.runTest +import org.junit.Rule +import org.junit.Test +import org.junit.runner.RunWith + +@RunWith(AndroidJUnit4::class) +class DefaultMediaOptimizationSelectorPresenterTest { + @get:Rule + val warmUpRule = WarmUpRule() + + private val mockMediaUrl: Uri = mockk("localMediaUri") + + @Test + fun `present - initial state`() = runTest { + val presenter = createDefaultMediaOptimizationSelectorPresenter() + moleculeFlow(RecompositionMode.Immediate) { + presenter.present() + }.test { + awaitItem().run { + // Loading + assertThat(videoSizeEstimations).isInstanceOf(AsyncData.Loading::class.java) + assertThat(maxUploadSize).isInstanceOf(AsyncData.Loading::class.java) + // Not loaded yet + assertThat(isImageOptimizationEnabled).isNull() + assertThat(selectedVideoPreset).isNull() + assertThat(displayMediaSelectorViews).isNull() + assertThat(displayVideoPresetSelectorDialog).isFalse() + } + + // The data will load after the first recomposition + awaitItem().run { + assertThat(videoSizeEstimations).isInstanceOf(AsyncData.Success::class.java) + assertThat(maxUploadSize).isInstanceOf(AsyncData.Success::class.java) + assertThat(isImageOptimizationEnabled).isTrue() + assertThat(selectedVideoPreset).isEqualTo(VideoCompressionPreset.STANDARD) + assertThat(displayMediaSelectorViews).isTrue() + assertThat(displayVideoPresetSelectorDialog).isFalse() + } + } + } + + @Test + fun `present - if media info is not video, the video state won't load`() = runTest { + val presenter = createDefaultMediaOptimizationSelectorPresenter( + localMedia = aLocalMedia(mockMediaUrl, anImageMediaInfo()) + ) + moleculeFlow(RecompositionMode.Immediate) { + presenter.present() + }.test { + // Skip loading state + skipItems(1) + + // The data will load after the first recomposition + awaitItem().run { + assertThat(videoSizeEstimations).isInstanceOf(AsyncData.Uninitialized::class.java) + assertThat(selectedVideoPreset).isNull() + } + } + } + + @Test + fun `present - OpenVideoPresetSelectorDialog displays it, DismissVideoPresetSelectorDialog hides it`() = runTest { + val presenter = createDefaultMediaOptimizationSelectorPresenter() + moleculeFlow(RecompositionMode.Immediate) { + presenter.present() + }.test { + // Skip loading state + val eventSink = awaitItem().eventSink + + assertThat(awaitItem().displayVideoPresetSelectorDialog).isFalse() + + eventSink(MediaOptimizationSelectorEvent.OpenVideoPresetSelectorDialog) + + assertThat(awaitItem().displayVideoPresetSelectorDialog).isTrue() + + eventSink(MediaOptimizationSelectorEvent.DismissVideoPresetSelectorDialog) + + assertThat(awaitItem().displayVideoPresetSelectorDialog).isFalse() + } + } + + @Test + fun `present - SelectVideoPreset sets it and dismisses the dialog`() = runTest { + val presenter = createDefaultMediaOptimizationSelectorPresenter() + moleculeFlow(RecompositionMode.Immediate) { + presenter.present() + }.test { + // Skip loading state + val eventSink = awaitItem().eventSink + + assertThat(awaitItem().displayVideoPresetSelectorDialog).isFalse() + + eventSink(MediaOptimizationSelectorEvent.OpenVideoPresetSelectorDialog) + + assertThat(awaitItem().displayVideoPresetSelectorDialog).isTrue() + + eventSink(MediaOptimizationSelectorEvent.SelectVideoPreset(VideoCompressionPreset.LOW)) + + assertThat(awaitItem().selectedVideoPreset).isEqualTo(VideoCompressionPreset.LOW) + assertThat(awaitItem().displayVideoPresetSelectorDialog).isFalse() + } + } + + @Test + fun `present - SelectVideoPreset won't do anything if there is no metadata`() = runTest { + val presenter = createDefaultMediaOptimizationSelectorPresenter( + mediaExtractorFactory = FakeVideoMetadataExtractorFactory(FakeVideoMetadataExtractor(sizeResult = Result.failure(AN_EXCEPTION))), + ) + moleculeFlow(RecompositionMode.Immediate) { + presenter.present() + }.test { + // Skip loading state + val eventSink = awaitItem().eventSink + + assertThat(awaitItem().videoSizeEstimations.dataOrNull()).isNull() + + eventSink(MediaOptimizationSelectorEvent.SelectVideoPreset(VideoCompressionPreset.LOW)) + + ensureAllEventsConsumed() + } + } + + @Test + fun `present - SelectVideoPreset won't select the preset if it won't allow to upload the video`() = runTest { + val presenter = createDefaultMediaOptimizationSelectorPresenter( + mediaExtractorFactory = FakeVideoMetadataExtractorFactory( + FakeVideoMetadataExtractor( + sizeResult = Result.success(Size(10_000, 10_000)), + duration = Result.success(600L) + ) + ), + ) + moleculeFlow(RecompositionMode.Immediate) { + presenter.present() + }.test { + // Skip loading and loaded states + val eventSink = awaitItem().eventSink + skipItems(1) + + // No video results could be uploaded + awaitItem().run { + val videoSizeEstimations = videoSizeEstimations.dataOrNull() + assertThat(videoSizeEstimations).isNotNull() + assertThat(videoSizeEstimations!!.none { it.canUpload }).isTrue() + } + + eventSink(MediaOptimizationSelectorEvent.SelectVideoPreset(VideoCompressionPreset.HIGH)) + + ensureAllEventsConsumed() + } + } + + @Test + fun `present - SelectImageOptimization sets the new value`() = runTest { + val presenter = createDefaultMediaOptimizationSelectorPresenter( + localMedia = aLocalMedia(mockMediaUrl, anImageMediaInfo()), + ) + moleculeFlow(RecompositionMode.Immediate) { + presenter.present() + }.test { + // Skip loading state + val eventSink = awaitItem().eventSink + + assertThat(awaitItem().isImageOptimizationEnabled).isTrue() + + eventSink(MediaOptimizationSelectorEvent.SelectImageOptimization(false)) + + assertThat(awaitItem().isImageOptimizationEnabled).isFalse() + } + } + + @Test + fun `present - max upload size will default to 100MB if we can't get it`() = runTest { + val presenter = createDefaultMediaOptimizationSelectorPresenter( + maxUploadSizeProvider = MaxUploadSizeProvider(FakeMatrixClient(getMaxUploadSizeResult = { Result.failure(AN_EXCEPTION) })) + ) + moleculeFlow(RecompositionMode.Immediate) { + presenter.present() + }.test { + // Skip loading and loaded state + skipItems(1) + assertThat(awaitItem().maxUploadSize.dataOrNull()).isEqualTo(1024 * 1024 * 100) + } + } + + @Test + fun `present - with feature flag disabled won't display the media quality selector views`() = runTest { + val presenter = createDefaultMediaOptimizationSelectorPresenter( + featureFlagService = FakeFeatureFlagService(mapOf(FeatureFlags.SelectableMediaQuality.key to false)), + ) + moleculeFlow(RecompositionMode.Immediate) { + presenter.present() + }.test { + // Skip loading and loaded state + skipItems(1) + assertThat(awaitItem().displayMediaSelectorViews).isFalse() + } + } + + private fun createDefaultMediaOptimizationSelectorPresenter( + localMedia: LocalMedia = aLocalMedia(mockMediaUrl, aVideoMediaInfo()), + maxUploadSizeProvider: MaxUploadSizeProvider = MaxUploadSizeProvider( + FakeMatrixClient(getMaxUploadSizeResult = { Result.success(1_000L) }), + ), + sessionPreferencesStore: InMemorySessionPreferencesStore = InMemorySessionPreferencesStore(), + featureFlagService: FakeFeatureFlagService = FakeFeatureFlagService(mapOf(FeatureFlags.SelectableMediaQuality.key to true)), + mediaExtractorFactory: FakeVideoMetadataExtractorFactory = FakeVideoMetadataExtractorFactory(), + ): DefaultMediaOptimizationSelectorPresenter { + return DefaultMediaOptimizationSelectorPresenter( + localMedia = localMedia, + maxUploadSizeProvider = maxUploadSizeProvider, + sessionPreferencesStore = sessionPreferencesStore, + featureFlagService = featureFlagService, + mediaExtractorFactory = mediaExtractorFactory, + ) + } +} 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 1d5318f94f..a677207b13 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 @@ -74,15 +74,18 @@ import io.element.android.libraries.matrix.test.timeline.FakeTimeline import io.element.android.libraries.matrix.ui.messages.reply.InReplyToDetails import io.element.android.libraries.mediapickers.api.PickerProvider import io.element.android.libraries.mediapickers.test.FakePickerProvider +import io.element.android.libraries.mediaupload.api.MediaOptimizationConfig import io.element.android.libraries.mediaupload.api.MediaPreProcessor import io.element.android.libraries.mediaupload.api.MediaSender import io.element.android.libraries.mediaupload.api.MediaUploadInfo +import io.element.android.libraries.mediaupload.test.FakeMediaOptimizationConfigProvider import io.element.android.libraries.mediaupload.test.FakeMediaPreProcessor import io.element.android.libraries.mediaviewer.test.FakeLocalMediaFactory import io.element.android.libraries.permissions.api.PermissionsPresenter import io.element.android.libraries.permissions.test.FakePermissionsPresenter import io.element.android.libraries.permissions.test.FakePermissionsPresenterFactory 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.textcomposer.mentions.MentionSpanProvider import io.element.android.libraries.textcomposer.mentions.MentionSpanTheme @@ -1542,6 +1545,7 @@ class MessageComposerPresenterTest { textPillificationHelper: TextPillificationHelper = FakeTextPillificationHelper(), isRichTextEditorEnabled: Boolean = true, draftService: ComposerDraftService = FakeComposerDraftService(), + mediaOptimizationConfigProvider: FakeMediaOptimizationConfigProvider = FakeMediaOptimizationConfigProvider(), ) = MessageComposerPresenter( navigator = navigator, sessionCoroutineScope = this, @@ -1550,7 +1554,11 @@ class MessageComposerPresenterTest { featureFlagService = featureFlagService, sessionPreferencesStore = sessionPreferencesStore, localMediaFactory = localMediaFactory, - mediaSender = MediaSender(mediaPreProcessor, room, InMemorySessionPreferencesStore()), + mediaSender = MediaSender( + preProcessor = mediaPreProcessor, + room = room, + mediaOptimizationConfigProvider = { MediaOptimizationConfig(compressImages = true, videoCompressionPreset = VideoCompressionPreset.STANDARD) } + ), snackbarDispatcher = snackbarDispatcher, analyticsService = analyticsService, locationService = locationService, @@ -1565,6 +1573,7 @@ class MessageComposerPresenterTest { mentionSpanProvider = mentionSpanProvider, pillificationHelper = textPillificationHelper, suggestionsProcessor = SuggestionsProcessor(), + mediaOptimizationConfigProvider = mediaOptimizationConfigProvider, ).apply { isTesting = true showTextFormatting = isRichTextEditorEnabled 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 c6c8c7c1e3..9aaa49f4ca 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 @@ -231,6 +231,7 @@ class TimelineItemContentMessageFactoryTest { ) val expected = TimelineItemVideoContent( filename = "filename", + fileSize = 0L, caption = null, formattedCaption = null, isEdited = false, @@ -283,6 +284,7 @@ class TimelineItemContentMessageFactoryTest { ) val expected = TimelineItemVideoContent( filename = "body.mp4", + fileSize = 555L, caption = "body.mp4 caption", formattedCaption = SpannedString("formatted"), isEdited = true, @@ -312,6 +314,7 @@ class TimelineItemContentMessageFactoryTest { ) val expected = TimelineItemAudioContent( filename = "filename", + fileSize = 0L, caption = null, formattedCaption = null, isEdited = false, @@ -347,6 +350,7 @@ class TimelineItemContentMessageFactoryTest { ) val expected = TimelineItemAudioContent( filename = "body.mp3", + fileSize = 123L, caption = null, formattedCaption = null, isEdited = true, @@ -369,6 +373,7 @@ class TimelineItemContentMessageFactoryTest { ) val expected = TimelineItemVoiceContent( filename = "filename", + fileSize = 0L, eventId = AN_EVENT_ID, caption = null, formattedCaption = null, @@ -411,6 +416,7 @@ class TimelineItemContentMessageFactoryTest { val expected = TimelineItemVoiceContent( eventId = AN_EVENT_ID, filename = "body.ogg", + fileSize = 123L, caption = null, formattedCaption = null, isEdited = true, @@ -440,6 +446,7 @@ class TimelineItemContentMessageFactoryTest { ) val expected = TimelineItemAudioContent( filename = "filename", + fileSize = 0L, caption = null, formattedCaption = null, isEdited = false, @@ -462,6 +469,7 @@ class TimelineItemContentMessageFactoryTest { ) val expected = TimelineItemImageContent( filename = "filename", + fileSize = 0L, caption = "body", formattedCaption = null, isEdited = false, @@ -492,6 +500,7 @@ class TimelineItemContentMessageFactoryTest { ) val expected = TimelineItemStickerContent( filename = "filename", + fileSize = 8_192L, caption = null, formattedCaption = null, isEdited = false, @@ -540,6 +549,7 @@ class TimelineItemContentMessageFactoryTest { ) val expected = TimelineItemImageContent( filename = "body.jpg", + fileSize = 888L, caption = "body.jpg caption", formattedCaption = SpannedString("formatted"), isEdited = true, @@ -568,6 +578,7 @@ class TimelineItemContentMessageFactoryTest { ) val expected = TimelineItemFileContent( filename = "filename", + fileSize = 0L, caption = null, formattedCaption = null, isEdited = false, @@ -609,6 +620,7 @@ class TimelineItemContentMessageFactoryTest { ) val expected = TimelineItemFileContent( filename = "body.pdf", + fileSize = 123L, caption = null, formattedCaption = null, isEdited = true, 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 3eb3210a63..9f9b8526a1 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 @@ -26,13 +26,14 @@ 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 import io.element.android.libraries.mediaplayer.test.FakeMediaPlayer +import io.element.android.libraries.mediaupload.api.MediaOptimizationConfig import io.element.android.libraries.mediaupload.api.MediaSender import io.element.android.libraries.mediaupload.test.FakeMediaPreProcessor import io.element.android.libraries.permissions.api.PermissionsPresenter import io.element.android.libraries.permissions.api.aPermissionsState import io.element.android.libraries.permissions.test.FakePermissionsPresenter import io.element.android.libraries.permissions.test.FakePermissionsPresenterFactory -import io.element.android.libraries.preferences.test.InMemorySessionPreferencesStore +import io.element.android.libraries.preferences.api.store.VideoCompressionPreset import io.element.android.libraries.textcomposer.model.MessageComposerMode import io.element.android.libraries.textcomposer.model.VoiceMessagePlayerEvent import io.element.android.libraries.textcomposer.model.VoiceMessageRecorderEvent @@ -72,7 +73,11 @@ class VoiceMessageComposerPresenterTest { }, ) private val mediaPreProcessor = FakeMediaPreProcessor().apply { givenAudioResult() } - private val mediaSender = MediaSender(mediaPreProcessor, joinedRoom, InMemorySessionPreferencesStore()) + private val mediaSender = MediaSender( + preProcessor = mediaPreProcessor, + room = joinedRoom, + mediaOptimizationConfigProvider = { MediaOptimizationConfig(compressImages = true, videoCompressionPreset = VideoCompressionPreset.STANDARD) }, + ) private val messageComposerContext = FakeMessageComposerContext() companion object { diff --git a/features/messages/test/build.gradle.kts b/features/messages/test/build.gradle.kts index 8cd32d58cf..5e98674f4e 100644 --- a/features/messages/test/build.gradle.kts +++ b/features/messages/test/build.gradle.kts @@ -14,6 +14,8 @@ android { } dependencies { - api(projects.features.messages.api) + api(projects.features.messages.impl) implementation(projects.libraries.matrix.api) + implementation(projects.libraries.mediaviewer.api) + implementation(projects.libraries.preferences.api) } diff --git a/features/messages/test/src/main/kotlin/io/element/android/features/messages/test/attachments/video/FakeMediaOptimizationSelectorPresenterFactory.kt b/features/messages/test/src/main/kotlin/io/element/android/features/messages/test/attachments/video/FakeMediaOptimizationSelectorPresenterFactory.kt new file mode 100644 index 0000000000..780638a205 --- /dev/null +++ b/features/messages/test/src/main/kotlin/io/element/android/features/messages/test/attachments/video/FakeMediaOptimizationSelectorPresenterFactory.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.messages.test.attachments.video + +import io.element.android.features.messages.impl.attachments.video.MediaOptimizationSelectorPresenter +import io.element.android.features.messages.impl.attachments.video.MediaOptimizationSelectorState +import io.element.android.libraries.architecture.AsyncData +import io.element.android.libraries.mediaviewer.api.local.LocalMedia + +class FakeMediaOptimizationSelectorPresenterFactory( + private val fakePresenter: MediaOptimizationSelectorPresenter = MediaOptimizationSelectorPresenter { + MediaOptimizationSelectorState( + maxUploadSize = AsyncData.Uninitialized, + videoSizeEstimations = AsyncData.Uninitialized, + isImageOptimizationEnabled = null, + selectedVideoPreset = null, + displayMediaSelectorViews = null, + displayVideoPresetSelectorDialog = false, + eventSink = {}, + ) + } +) : MediaOptimizationSelectorPresenter.Factory { + override fun create(localMedia: LocalMedia): MediaOptimizationSelectorPresenter { + return fakePresenter + } +} 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 new file mode 100644 index 0000000000..54b27ac675 --- /dev/null +++ b/features/messages/test/src/main/kotlin/io/element/android/features/messages/test/attachments/video/FakeVideoMetadataExtractor.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.messages.test.attachments.video + +import android.net.Uri +import android.util.Size +import io.element.android.features.messages.impl.attachments.video.VideoMetadataExtractor + +class FakeVideoMetadataExtractor( + private val sizeResult: Result = Result.success(Size(1, 1)), + private val duration: Result = Result.success(1L), +) : VideoMetadataExtractor { + override fun getSize(): Result = sizeResult + + override fun getDuration(): Result = duration + + override fun close() = Unit +} + +class FakeVideoMetadataExtractorFactory( + private val fakeVideoMetadataExtractor: FakeVideoMetadataExtractor = FakeVideoMetadataExtractor(), +) : VideoMetadataExtractor.Factory { + override fun create(uri: Uri): VideoMetadataExtractor { + return fakeVideoMetadataExtractor + } +} diff --git a/features/poll/api/src/main/res/values-cs/translations.xml b/features/poll/api/src/main/res/values-cs/translations.xml index 888f9efbad..e87760d8f4 100644 --- a/features/poll/api/src/main/res/values-cs/translations.xml +++ b/features/poll/api/src/main/res/values-cs/translations.xml @@ -5,5 +5,6 @@ "%1$d procenta z celkového počtu hlasů" "%1$d procent z celkového počtu hlasů" + "Odstraní předchozí výběr" "Toto je vítězná odpověď" diff --git a/features/poll/api/src/main/res/values-pt/translations.xml b/features/poll/api/src/main/res/values-pt/translations.xml index f1292fee2f..81db444f43 100644 --- a/features/poll/api/src/main/res/values-pt/translations.xml +++ b/features/poll/api/src/main/res/values-pt/translations.xml @@ -4,5 +4,6 @@ "%1$d porcento de todos os votos" "%1$d porcento de todos os votos" + "Irá remover seleção anterior" "Esta é a reposta vencedora" diff --git a/features/poll/api/src/main/res/values-sv/translations.xml b/features/poll/api/src/main/res/values-sv/translations.xml new file mode 100644 index 0000000000..54b7f62d01 --- /dev/null +++ b/features/poll/api/src/main/res/values-sv/translations.xml @@ -0,0 +1,8 @@ + + + + "%1$d procent av totala röster" + "%1$d procent av totala röster" + + "Detta är det vinnande svaret" + diff --git a/features/poll/impl/src/main/res/values-sv/translations.xml b/features/poll/impl/src/main/res/values-sv/translations.xml index f2116d1eef..423b17dbc1 100644 --- a/features/poll/impl/src/main/res/values-sv/translations.xml +++ b/features/poll/impl/src/main/res/values-sv/translations.xml @@ -5,6 +5,7 @@ "Dölj röster" "Alternativ %1$d" "Dina ändringar har inte sparats. Är du säker på att du vill gå tillbaka?" + "Radera alternativet %1$s" "Fråga eller ämne" "Vad handlar omröstningen om?" "Skapa omröstning" diff --git a/features/preferences/impl/src/main/kotlin/io/element/android/features/preferences/impl/advanced/AdvancedSettingsEvents.kt b/features/preferences/impl/src/main/kotlin/io/element/android/features/preferences/impl/advanced/AdvancedSettingsEvents.kt index fc78ae561a..d685402055 100644 --- a/features/preferences/impl/src/main/kotlin/io/element/android/features/preferences/impl/advanced/AdvancedSettingsEvents.kt +++ b/features/preferences/impl/src/main/kotlin/io/element/android/features/preferences/impl/advanced/AdvancedSettingsEvents.kt @@ -8,11 +8,14 @@ package io.element.android.features.preferences.impl.advanced import io.element.android.libraries.matrix.api.media.MediaPreviewValue +import io.element.android.libraries.preferences.api.store.VideoCompressionPreset sealed interface AdvancedSettingsEvents { data class SetDeveloperModeEnabled(val enabled: Boolean) : AdvancedSettingsEvents data class SetSharePresenceEnabled(val enabled: Boolean) : AdvancedSettingsEvents data class SetCompressMedia(val compress: Boolean) : AdvancedSettingsEvents + data class SetCompressImages(val compress: Boolean) : AdvancedSettingsEvents + data class SetVideoUploadQuality(val videoPreset: VideoCompressionPreset) : AdvancedSettingsEvents data class SetTheme(val theme: ThemeOption) : AdvancedSettingsEvents data class SetTimelineMediaPreviewValue(val value: MediaPreviewValue) : AdvancedSettingsEvents data class SetHideInviteAvatars(val value: Boolean) : AdvancedSettingsEvents diff --git a/features/preferences/impl/src/main/kotlin/io/element/android/features/preferences/impl/advanced/AdvancedSettingsPresenter.kt b/features/preferences/impl/src/main/kotlin/io/element/android/features/preferences/impl/advanced/AdvancedSettingsPresenter.kt index be5f11116c..152e71901c 100644 --- a/features/preferences/impl/src/main/kotlin/io/element/android/features/preferences/impl/advanced/AdvancedSettingsPresenter.kt +++ b/features/preferences/impl/src/main/kotlin/io/element/android/features/preferences/impl/advanced/AdvancedSettingsPresenter.kt @@ -11,15 +11,19 @@ import androidx.compose.runtime.Composable import androidx.compose.runtime.collectAsState import androidx.compose.runtime.derivedStateOf import androidx.compose.runtime.getValue +import androidx.compose.runtime.produceState import androidx.compose.runtime.remember -import androidx.compose.runtime.setValue import io.element.android.compound.theme.Theme import io.element.android.compound.theme.mapToTheme import io.element.android.libraries.architecture.Presenter 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.preferences.api.store.AppPreferencesStore import io.element.android.libraries.preferences.api.store.SessionPreferencesStore import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.flow.collect +import kotlinx.coroutines.flow.combine import kotlinx.coroutines.launch import javax.inject.Inject @@ -29,6 +33,7 @@ class AdvancedSettingsPresenter @Inject constructor( private val mediaPreviewConfigStateStore: MediaPreviewConfigStateStore, @SessionCoroutineScope private val sessionCoroutineScope: CoroutineScope, + private val featureFlagService: FeatureFlagService, ) : Presenter { @Composable override fun present(): AdvancedSettingsState { @@ -38,9 +43,6 @@ class AdvancedSettingsPresenter @Inject constructor( val isSharePresenceEnabled by remember { sessionPreferencesStore.isSharePresenceEnabled() }.collectAsState(initial = true) - val doesCompressMedia by remember { - sessionPreferencesStore.doesCompressMedia() - }.collectAsState(initial = true) val theme = remember { appPreferencesStore.getThemeFlow().mapToTheme() }.collectAsState(initial = Theme.System) @@ -57,6 +59,28 @@ class AdvancedSettingsPresenter @Inject constructor( } } + val hasSplitMediaQualityOptions by produceState(null) { + value = featureFlagService.isFeatureEnabled(FeatureFlags.SelectableMediaQuality) + } + + val mediaOptimizationState by produceState(null) { + val hasSplitMediaQualityOptionsFlow = featureFlagService.isFeatureEnabledFlow(FeatureFlags.SelectableMediaQuality) + combine( + hasSplitMediaQualityOptionsFlow, + sessionPreferencesStore.doesOptimizeImages(), + sessionPreferencesStore.getVideoCompressionPreset() + ) { hasSplitOptions, compressImages, videoPreset -> + if (hasSplitMediaQualityOptions == true) { + value = MediaOptimizationState.Split( + compressImages = compressImages, + videoPreset = videoPreset, + ) + } else if (hasSplitMediaQualityOptions == false) { + value = MediaOptimizationState.AllMedia(isEnabled = compressImages) + } + }.collect() + } + fun handleEvents(event: AdvancedSettingsEvents) { when (event) { is AdvancedSettingsEvents.SetDeveloperModeEnabled -> sessionCoroutineScope.launch { @@ -66,7 +90,7 @@ class AdvancedSettingsPresenter @Inject constructor( sessionPreferencesStore.setSharePresence(event.enabled) } is AdvancedSettingsEvents.SetCompressMedia -> sessionCoroutineScope.launch { - sessionPreferencesStore.setCompressMedia(event.compress) + sessionPreferencesStore.setOptimizeImages(event.compress) } is AdvancedSettingsEvents.SetTheme -> sessionCoroutineScope.launch { when (event.theme) { @@ -77,13 +101,19 @@ class AdvancedSettingsPresenter @Inject constructor( } is AdvancedSettingsEvents.SetHideInviteAvatars -> mediaPreviewConfigStateStore.setHideInviteAvatars(event.value) is AdvancedSettingsEvents.SetTimelineMediaPreviewValue -> mediaPreviewConfigStateStore.setTimelineMediaPreviewValue(event.value) + is AdvancedSettingsEvents.SetCompressImages -> sessionCoroutineScope.launch { + sessionPreferencesStore.setOptimizeImages(event.compress) + } + is AdvancedSettingsEvents.SetVideoUploadQuality -> sessionCoroutineScope.launch { + sessionPreferencesStore.setVideoCompressionPreset(event.videoPreset) + } } } return AdvancedSettingsState( isDeveloperModeEnabled = isDeveloperModeEnabled, isSharePresenceEnabled = isSharePresenceEnabled, - doesCompressMedia = doesCompressMedia, + mediaOptimizationState = mediaOptimizationState, theme = themeOption, mediaPreviewConfigState = mediaPreviewConfigState, eventSink = ::handleEvents, diff --git a/features/preferences/impl/src/main/kotlin/io/element/android/features/preferences/impl/advanced/AdvancedSettingsState.kt b/features/preferences/impl/src/main/kotlin/io/element/android/features/preferences/impl/advanced/AdvancedSettingsState.kt index ef41ab26b3..1251723f1c 100644 --- a/features/preferences/impl/src/main/kotlin/io/element/android/features/preferences/impl/advanced/AdvancedSettingsState.kt +++ b/features/preferences/impl/src/main/kotlin/io/element/android/features/preferences/impl/advanced/AdvancedSettingsState.kt @@ -11,17 +11,31 @@ import androidx.compose.runtime.Composable import androidx.compose.runtime.ReadOnlyComposable import androidx.compose.ui.res.stringResource import io.element.android.libraries.designsystem.components.preferences.DropdownOption +import io.element.android.libraries.preferences.api.store.VideoCompressionPreset import io.element.android.libraries.ui.strings.CommonStrings data class AdvancedSettingsState( val isDeveloperModeEnabled: Boolean, val isSharePresenceEnabled: Boolean, - val doesCompressMedia: Boolean, + val mediaOptimizationState: MediaOptimizationState?, val theme: ThemeOption, val mediaPreviewConfigState: MediaPreviewConfigState, val eventSink: (AdvancedSettingsEvents) -> Unit ) +sealed interface MediaOptimizationState { + data class AllMedia(val isEnabled: Boolean) : MediaOptimizationState + data class Split( + val compressImages: Boolean, + val videoPreset: VideoCompressionPreset, + ) : MediaOptimizationState + + val shouldCompressImages: Boolean get() = when (this) { + is AllMedia -> isEnabled + is Split -> compressImages + } +} + enum class ThemeOption : DropdownOption { System { @Composable diff --git a/features/preferences/impl/src/main/kotlin/io/element/android/features/preferences/impl/advanced/AdvancedSettingsStateProvider.kt b/features/preferences/impl/src/main/kotlin/io/element/android/features/preferences/impl/advanced/AdvancedSettingsStateProvider.kt index 42e63134d1..055edd20d2 100644 --- a/features/preferences/impl/src/main/kotlin/io/element/android/features/preferences/impl/advanced/AdvancedSettingsStateProvider.kt +++ b/features/preferences/impl/src/main/kotlin/io/element/android/features/preferences/impl/advanced/AdvancedSettingsStateProvider.kt @@ -10,6 +10,7 @@ package io.element.android.features.preferences.impl.advanced import androidx.compose.ui.tooling.preview.PreviewParameterProvider import io.element.android.libraries.architecture.AsyncAction import io.element.android.libraries.matrix.api.media.MediaPreviewValue +import io.element.android.libraries.preferences.api.store.VideoCompressionPreset open class AdvancedSettingsStateProvider : PreviewParameterProvider { override val values: Sequence @@ -17,18 +18,22 @@ open class AdvancedSettingsStateProvider : PreviewParameterProvider Unit + is MediaOptimizationState.AllMedia -> { + ListItem( + headlineContent = { + Text(text = stringResource(id = R.string.screen_advanced_settings_media_compression_title)) + }, + supportingContent = { + Text(text = stringResource(id = R.string.screen_advanced_settings_media_compression_description)) + }, + trailingContent = ListItemContent.Switch( + checked = compressImages ?: false, + ), + onClick = { + val newValue = !(compressImages ?: false) + analyticsService.captureInteraction( + if (newValue) { + Interaction.Name.MobileSettingsOptimizeMediaUploadsEnabled + } else { + Interaction.Name.MobileSettingsOptimizeMediaUploadsDisabled + } + ) + state.eventSink(AdvancedSettingsEvents.SetCompressMedia(newValue)) } ) - state.eventSink(AdvancedSettingsEvents.SetCompressMedia(newValue)) } - ) + is MediaOptimizationState.Split -> { + ListItem( + headlineContent = { + Text(text = stringResource(id = R.string.screen_advanced_settings_optimise_image_upload_quality_title)) + }, + supportingContent = { + Text(text = stringResource(id = R.string.screen_advanced_settings_optimise_image_upload_quality_description)) + }, + trailingContent = ListItemContent.Switch( + checked = compressImages ?: false, + ), + onClick = { + val newValue = !(compressImages ?: false) + analyticsService.captureInteraction( + if (newValue) { + Interaction.Name.MobileSettingsOptimizeMediaUploadsEnabled + } else { + Interaction.Name.MobileSettingsOptimizeMediaUploadsDisabled + } + ) + state.eventSink(AdvancedSettingsEvents.SetCompressMedia(newValue)) + } + ) + + var displaySelectorDialog by remember { mutableStateOf(false) } + + ListItem( + headlineContent = { + Text(text = stringResource(id = R.string.screen_advanced_settings_optimise_video_upload_quality_title)) + }, + supportingContent = { + val description = stringResource(id = R.string.screen_advanced_settings_optimise_video_upload_quality_description) + val quality = when (state.mediaOptimizationState.videoPreset) { + VideoCompressionPreset.LOW -> stringResource(id = R.string.screen_advanced_settings_optimise_video_upload_quality_low) + VideoCompressionPreset.STANDARD -> stringResource(id = R.string.screen_advanced_settings_optimise_video_upload_quality_standard) + VideoCompressionPreset.HIGH -> stringResource(id = R.string.screen_advanced_settings_optimise_video_upload_quality_high) + } + val descriptionWithValue = remember(quality) { + String.format(description, quality) + } + Text(text = descriptionWithValue) + }, + onClick = { displaySelectorDialog = true }, + ) + + if (displaySelectorDialog) { + VideoQualitySelectorDialog( + selectedPreset = state.mediaOptimizationState.videoPreset, + onSubmit = { preset -> + state.eventSink(AdvancedSettingsEvents.SetVideoUploadQuality(preset)) + displaySelectorDialog = false + }, + onDismiss = { displaySelectorDialog = false }, + ) + } + } + } + ModerationAndSafety(state) } } +@Composable +private fun VideoQualitySelectorDialog( + selectedPreset: VideoCompressionPreset, + onSubmit: (VideoCompressionPreset) -> Unit, + onDismiss: () -> Unit +) { + val videoPresets = VideoCompressionPreset.entries + var localSelectedPreset by remember { mutableStateOf(selectedPreset) } + ListDialog( + title = stringResource(CommonStrings.dialog_video_quality_selector_title), + subtitle = stringResource(CommonStrings.dialog_default_video_quality_selector_subtitle), + onSubmit = { onSubmit(localSelectedPreset) }, + onDismissRequest = onDismiss, + applyPaddingToContents = false, + ) { + for (preset in videoPresets) { + val isSelected = preset == localSelectedPreset + item( + key = preset, + contentType = preset, + ) { + val title = when (preset) { + VideoCompressionPreset.LOW -> stringResource(R.string.screen_advanced_settings_optimise_video_upload_quality_low) + VideoCompressionPreset.STANDARD -> stringResource(R.string.screen_advanced_settings_optimise_video_upload_quality_standard) + VideoCompressionPreset.HIGH -> stringResource(R.string.screen_advanced_settings_optimise_video_upload_quality_high) + } + val subtitle = when (preset) { + VideoCompressionPreset.LOW -> stringResource(CommonStrings.common_video_quality_low_description) + VideoCompressionPreset.STANDARD -> stringResource(CommonStrings.common_video_quality_standard_description) + VideoCompressionPreset.HIGH -> stringResource(CommonStrings.common_video_quality_high_description) + } + ListItem( + headlineContent = { + Text( + text = title, + style = ElementTheme.typography.fontBodyLgMedium, + ) + }, + supportingContent = { + Text( + text = subtitle, + style = ElementTheme.materialTypography.bodyMedium, + color = ElementTheme.colors.textSecondary, + ) + }, + leadingContent = ListItemContent.RadioButton( + selected = isSelected, + ), + onClick = { + localSelectedPreset = preset + }, + ) + } + } + } +} + @Composable private fun ModerationAndSafety( state: AdvancedSettingsState, @@ -202,3 +331,15 @@ private fun ContentToPreview(state: AdvancedSettingsState) { onBackClick = { } ) } + +@Composable +@PreviewsDayNight +internal fun VideoQualitySelectorDialogPreview() { + ElementPreview { + VideoQualitySelectorDialog( + selectedPreset = VideoCompressionPreset.STANDARD, + onSubmit = { /* no-op */ }, + onDismiss = { /* no-op */ } + ) + } +} diff --git a/features/preferences/impl/src/main/kotlin/io/element/android/features/preferences/impl/user/editprofile/EditUserProfilePresenter.kt b/features/preferences/impl/src/main/kotlin/io/element/android/features/preferences/impl/user/editprofile/EditUserProfilePresenter.kt index fd3f96efac..fc8aa0175c 100644 --- a/features/preferences/impl/src/main/kotlin/io/element/android/features/preferences/impl/user/editprofile/EditUserProfilePresenter.kt +++ b/features/preferences/impl/src/main/kotlin/io/element/android/features/preferences/impl/user/editprofile/EditUserProfilePresenter.kt @@ -32,6 +32,7 @@ import io.element.android.libraries.matrix.api.MatrixClient import io.element.android.libraries.matrix.api.user.MatrixUser import io.element.android.libraries.matrix.ui.media.AvatarAction import io.element.android.libraries.mediapickers.api.PickerProvider +import io.element.android.libraries.mediaupload.api.MediaOptimizationConfigProvider import io.element.android.libraries.mediaupload.api.MediaPreProcessor import io.element.android.libraries.permissions.api.PermissionsEvents import io.element.android.libraries.permissions.api.PermissionsPresenter @@ -46,6 +47,7 @@ class EditUserProfilePresenter @AssistedInject constructor( private val mediaPickerProvider: PickerProvider, private val mediaPreProcessor: MediaPreProcessor, private val temporaryUriDeleter: TemporaryUriDeleter, + private val mediaOptimizationConfigProvider: MediaOptimizationConfigProvider, permissionsPresenterFactory: PermissionsPresenter.Factory, ) : Presenter { private val cameraPermissionPresenter: PermissionsPresenter = permissionsPresenterFactory.create(android.Manifest.permission.CAMERA) @@ -175,7 +177,7 @@ class EditUserProfilePresenter @AssistedInject constructor( uri = avatarUri, mimeType = MimeTypes.Jpeg, deleteOriginal = false, - compressIfPossible = false, + mediaOptimizationConfig = mediaOptimizationConfigProvider.get(), ).getOrThrow() matrixClient.uploadAvatar(MimeTypes.Jpeg, preprocessed.file.readBytes()).getOrThrow() } else { diff --git a/features/preferences/impl/src/main/res/values-hu/translations.xml b/features/preferences/impl/src/main/res/values-hu/translations.xml index da63c18fb7..d64864549d 100644 --- a/features/preferences/impl/src/main/res/values-hu/translations.xml +++ b/features/preferences/impl/src/main/res/values-hu/translations.xml @@ -13,6 +13,13 @@ "Töltse fel gyorsabban a fényképeket és videókat, valamint csökkentse az adatforgalmat" "Média minőségének optimalizálása" "Moderálás és biztonság" + "Képek automatikus optimalizációja a gyorsabb feltöltések és kisebb fájlméretek érdekében." + "Képfeltöltési minőség optimalizációja" + "%1$s. Koppintson a megváltoztatáshoz." + "Magas (1080p)" + "Alacsony (480p)" + "Szokásos (720p)" + "Feltöltött videó minősége" "Leküldéses értesítések szolgáltatója" "A formázott szöveges szerkesztő letiltása, hogy kézzel írhasson Markdownt." "Olvasási visszaigazolások" diff --git a/features/preferences/impl/src/main/res/values-sk/translations.xml b/features/preferences/impl/src/main/res/values-sk/translations.xml index 33dddb66e7..f484a1aee0 100644 --- a/features/preferences/impl/src/main/res/values-sk/translations.xml +++ b/features/preferences/impl/src/main/res/values-sk/translations.xml @@ -13,6 +13,13 @@ "Nahrávajte fotografie a videá rýchlejšie a znížte spotrebu dát" "Optimalizovať kvalitu médií" "Moderovanie a bezpečnosť" + "Automaticky optimalizovať obrázky pre rýchlejšie nahrávanie a menšie veľkosti súborov." + "Optimalizovať kvalitu nahrávaných obrázkov" + "%1$s. Ťuknite sem, ak ju chcete zmeniť." + "Vysoká (1080p)" + "Nízka (480p)" + "Štandardná (720p)" + "Kvalita nahrávania videa" "Poskytovateľ oznámení Push" "Vypnite rozšírený textový editor na ručné písanie Markdown." "Potvrdenia o prečítaní" diff --git a/features/preferences/impl/src/main/res/values/localazy.xml b/features/preferences/impl/src/main/res/values/localazy.xml index 520a2a9e18..8b3c9d1d82 100644 --- a/features/preferences/impl/src/main/res/values/localazy.xml +++ b/features/preferences/impl/src/main/res/values/localazy.xml @@ -13,6 +13,13 @@ "Upload photos and videos faster and reduce data usage" "Optimise media quality" "Moderation and Safety" + "Automatically optimise images for faster uploads and smaller file sizes." + "Optimise image upload quality" + "%1$s. Tap here to change." + "High (1080p)" + "Low (480p)" + "Standard (720p)" + "Video upload quality" "Push notification provider" "Disable the rich text editor to type Markdown manually." "Read receipts" diff --git a/features/preferences/impl/src/test/kotlin/io/element/android/features/preferences/impl/advanced/AdvancedSettingsPresenterTest.kt b/features/preferences/impl/src/test/kotlin/io/element/android/features/preferences/impl/advanced/AdvancedSettingsPresenterTest.kt index de84e887d6..9bd90aa28c 100644 --- a/features/preferences/impl/src/test/kotlin/io/element/android/features/preferences/impl/advanced/AdvancedSettingsPresenterTest.kt +++ b/features/preferences/impl/src/test/kotlin/io/element/android/features/preferences/impl/advanced/AdvancedSettingsPresenterTest.kt @@ -12,7 +12,10 @@ import app.cash.molecule.moleculeFlow import app.cash.turbine.test import com.google.common.truth.Truth.assertThat import io.element.android.libraries.architecture.AsyncAction +import io.element.android.libraries.featureflag.api.FeatureFlags +import io.element.android.libraries.featureflag.test.FakeFeatureFlagService import io.element.android.libraries.matrix.api.media.MediaPreviewValue +import io.element.android.libraries.preferences.api.store.VideoCompressionPreset import io.element.android.libraries.preferences.test.InMemoryAppPreferencesStore import io.element.android.libraries.preferences.test.InMemorySessionPreferencesStore import io.element.android.tests.testutils.WarmUpRule @@ -34,13 +37,19 @@ class AdvancedSettingsPresenterTest { with(awaitItem()) { assertThat(isDeveloperModeEnabled).isFalse() assertThat(isSharePresenceEnabled).isTrue() - assertThat(doesCompressMedia).isTrue() + assertThat(mediaOptimizationState).isNull() assertThat(theme).isEqualTo(ThemeOption.System) assertThat(mediaPreviewConfigState.hideInviteAvatars).isFalse() assertThat(mediaPreviewConfigState.timelineMediaPreviewValue).isEqualTo(MediaPreviewValue.On) assertThat(mediaPreviewConfigState.setHideInviteAvatarsAction).isEqualTo(AsyncAction.Uninitialized) assertThat(mediaPreviewConfigState.setTimelineMediaPreviewAction).isEqualTo(AsyncAction.Uninitialized) } + + // After the initial state, we expect the media optimization state to be set + with(awaitItem()) { + assertThat(mediaOptimizationState).isInstanceOf(MediaOptimizationState.AllMedia::class.java) + assertThat((mediaOptimizationState as MediaOptimizationState.AllMedia).isEnabled).isTrue() + } } } @@ -50,6 +59,9 @@ class AdvancedSettingsPresenterTest { moleculeFlow(RecompositionMode.Immediate) { presenter.present() }.test { + // Skip until the initial data it loaded + skipItems(1) + with(awaitItem()) { assertThat(isDeveloperModeEnabled).isFalse() eventSink(AdvancedSettingsEvents.SetDeveloperModeEnabled(true)) @@ -70,6 +82,9 @@ class AdvancedSettingsPresenterTest { moleculeFlow(RecompositionMode.Immediate) { presenter.present() }.test { + // Skip until the initial data it loaded + skipItems(1) + with(awaitItem()) { assertThat(isSharePresenceEnabled).isTrue() eventSink(AdvancedSettingsEvents.SetSharePresenceEnabled(false)) @@ -90,16 +105,73 @@ class AdvancedSettingsPresenterTest { moleculeFlow(RecompositionMode.Immediate) { presenter.present() }.test { + // Skip until the initial data it loaded + skipItems(1) + with(awaitItem()) { - assertThat(doesCompressMedia).isTrue() + assertThat((mediaOptimizationState as MediaOptimizationState.AllMedia).isEnabled).isTrue() eventSink(AdvancedSettingsEvents.SetCompressMedia(false)) } with(awaitItem()) { - assertThat(doesCompressMedia).isFalse() + assertThat((mediaOptimizationState as MediaOptimizationState.AllMedia).isEnabled).isFalse() eventSink(AdvancedSettingsEvents.SetCompressMedia(true)) } with(awaitItem()) { - assertThat(doesCompressMedia).isTrue() + assertThat((mediaOptimizationState as MediaOptimizationState.AllMedia).isEnabled).isTrue() + } + } + } + + @Test + fun `present - compress images off on`() = runTest { + val presenter = createAdvancedSettingsPresenter( + featureFlagService = FakeFeatureFlagService().apply { + setFeatureEnabled(FeatureFlags.SelectableMediaQuality, true) + } + ) + moleculeFlow(RecompositionMode.Immediate) { + presenter.present() + }.test { + // Skip until the initial data it loaded + skipItems(1) + + with(awaitItem()) { + assertThat((mediaOptimizationState as MediaOptimizationState.Split).compressImages).isTrue() + eventSink(AdvancedSettingsEvents.SetCompressImages(false)) + } + with(awaitItem()) { + assertThat((mediaOptimizationState as MediaOptimizationState.Split).compressImages).isFalse() + eventSink(AdvancedSettingsEvents.SetCompressImages(true)) + } + with(awaitItem()) { + assertThat((mediaOptimizationState as MediaOptimizationState.Split).compressImages).isTrue() + } + } + } + + @Test + fun `present - video upload quality selector`() = runTest { + val presenter = createAdvancedSettingsPresenter( + featureFlagService = FakeFeatureFlagService().apply { + setFeatureEnabled(FeatureFlags.SelectableMediaQuality, true) + } + ) + moleculeFlow(RecompositionMode.Immediate) { + presenter.present() + }.test { + // Skip until the initial data it loaded + skipItems(1) + + with(awaitItem()) { + assertThat((mediaOptimizationState as MediaOptimizationState.Split).videoPreset).isEqualTo(VideoCompressionPreset.STANDARD) + eventSink(AdvancedSettingsEvents.SetVideoUploadQuality(VideoCompressionPreset.LOW)) + } + with(awaitItem()) { + assertThat((mediaOptimizationState as MediaOptimizationState.Split).videoPreset).isEqualTo(VideoCompressionPreset.LOW) + eventSink(AdvancedSettingsEvents.SetVideoUploadQuality(VideoCompressionPreset.HIGH)) + } + with(awaitItem()) { + assertThat((mediaOptimizationState as MediaOptimizationState.Split).videoPreset).isEqualTo(VideoCompressionPreset.HIGH) } } } @@ -110,6 +182,9 @@ class AdvancedSettingsPresenterTest { moleculeFlow(RecompositionMode.Immediate) { presenter.present() }.test { + // Skip until the initial data it loaded + skipItems(1) + with(awaitItem()) { assertThat(theme).isEqualTo(ThemeOption.System) eventSink(AdvancedSettingsEvents.SetTheme(ThemeOption.Dark)) @@ -135,6 +210,9 @@ class AdvancedSettingsPresenterTest { moleculeFlow(RecompositionMode.Immediate) { presenter.present() }.test { + // Skip until the initial data it loaded + skipItems(1) + with(awaitItem()) { assertThat(mediaPreviewConfigState.hideInviteAvatars).isFalse() eventSink(AdvancedSettingsEvents.SetHideInviteAvatars(true)) @@ -157,6 +235,9 @@ class AdvancedSettingsPresenterTest { moleculeFlow(RecompositionMode.Immediate) { presenter.present() }.test { + // Skip until the initial data it loaded + skipItems(1) + with(awaitItem()) { assertThat(mediaPreviewConfigState.timelineMediaPreviewValue).isEqualTo(MediaPreviewValue.On) eventSink(AdvancedSettingsEvents.SetTimelineMediaPreviewValue(MediaPreviewValue.Off)) @@ -184,6 +265,9 @@ class AdvancedSettingsPresenterTest { moleculeFlow(RecompositionMode.Immediate) { presenter.present() }.test { + // Skip until the initial data it loaded + skipItems(1) + with(awaitItem()) { assertThat(mediaPreviewConfigState.hideInviteAvatars).isTrue() assertThat(mediaPreviewConfigState.timelineMediaPreviewValue).isEqualTo(MediaPreviewValue.Private) @@ -201,6 +285,9 @@ class AdvancedSettingsPresenterTest { moleculeFlow(RecompositionMode.Immediate) { presenter.present() }.test { + // Skip until the initial data it loaded + skipItems(1) + with(awaitItem()) { assertThat(mediaPreviewConfigState.setHideInviteAvatarsAction).isEqualTo(AsyncAction.Loading) assertThat(mediaPreviewConfigState.setTimelineMediaPreviewAction).isEqualTo(AsyncAction.Success(Unit)) @@ -212,10 +299,12 @@ class AdvancedSettingsPresenterTest { appPreferencesStore: InMemoryAppPreferencesStore = InMemoryAppPreferencesStore(), sessionPreferencesStore: InMemorySessionPreferencesStore = InMemorySessionPreferencesStore(), mediaPreviewConfigStateStore: MediaPreviewConfigStateStore = FakeMediaPreviewConfigStateStore(), + featureFlagService: FakeFeatureFlagService = FakeFeatureFlagService(), ) = AdvancedSettingsPresenter( appPreferencesStore = appPreferencesStore, sessionPreferencesStore = sessionPreferencesStore, mediaPreviewConfigStateStore = mediaPreviewConfigStateStore, + featureFlagService = featureFlagService, sessionCoroutineScope = this, ) } diff --git a/features/preferences/impl/src/test/kotlin/io/element/android/features/preferences/impl/advanced/AdvancedSettingsViewTest.kt b/features/preferences/impl/src/test/kotlin/io/element/android/features/preferences/impl/advanced/AdvancedSettingsViewTest.kt index d5e90047c7..9e105d4da1 100644 --- a/features/preferences/impl/src/test/kotlin/io/element/android/features/preferences/impl/advanced/AdvancedSettingsViewTest.kt +++ b/features/preferences/impl/src/test/kotlin/io/element/android/features/preferences/impl/advanced/AdvancedSettingsViewTest.kt @@ -115,7 +115,7 @@ class AdvancedSettingsViewTest { val analyticsService = FakeAnalyticsService() rule.setAdvancedSettingsView( state = aAdvancedSettingsState( - doesCompressMedia = true, + mediaOptimizationState = MediaOptimizationState.AllMedia(isEnabled = true), eventSink = eventsRecorder, ), analyticsService = analyticsService diff --git a/features/preferences/impl/src/test/kotlin/io/element/android/features/preferences/impl/user/editprofile/EditUserProfilePresenterTest.kt b/features/preferences/impl/src/test/kotlin/io/element/android/features/preferences/impl/user/editprofile/EditUserProfilePresenterTest.kt index 01e56e8f59..947be54785 100644 --- a/features/preferences/impl/src/test/kotlin/io/element/android/features/preferences/impl/user/editprofile/EditUserProfilePresenterTest.kt +++ b/features/preferences/impl/src/test/kotlin/io/element/android/features/preferences/impl/user/editprofile/EditUserProfilePresenterTest.kt @@ -23,6 +23,7 @@ import io.element.android.libraries.matrix.ui.components.aMatrixUser import io.element.android.libraries.matrix.ui.media.AvatarAction import io.element.android.libraries.mediapickers.test.FakePickerProvider import io.element.android.libraries.mediaupload.api.MediaUploadInfo +import io.element.android.libraries.mediaupload.test.FakeMediaOptimizationConfigProvider import io.element.android.libraries.mediaupload.test.FakeMediaPreProcessor import io.element.android.libraries.permissions.api.PermissionsPresenter import io.element.android.libraries.permissions.test.FakePermissionsPresenter @@ -78,6 +79,7 @@ class EditUserProfilePresenterTest { matrixUser: MatrixUser = aMatrixUser(), permissionsPresenter: PermissionsPresenter = FakePermissionsPresenter(), temporaryUriDeleter: TemporaryUriDeleter = FakeTemporaryUriDeleter(), + mediaOptimizationConfigProvider: FakeMediaOptimizationConfigProvider = FakeMediaOptimizationConfigProvider(), ): EditUserProfilePresenter { return EditUserProfilePresenter( matrixClient = matrixClient, @@ -86,6 +88,7 @@ class EditUserProfilePresenterTest { mediaPreProcessor = fakeMediaPreProcessor, temporaryUriDeleter = temporaryUriDeleter, permissionsPresenterFactory = FakePermissionsPresenterFactory(permissionsPresenter), + mediaOptimizationConfigProvider = mediaOptimizationConfigProvider, ) } diff --git a/features/rageshake/impl/src/main/res/values-cs/translations.xml b/features/rageshake/impl/src/main/res/values-cs/translations.xml index a200558df6..0ae9e585b1 100644 --- a/features/rageshake/impl/src/main/res/values-cs/translations.xml +++ b/features/rageshake/impl/src/main/res/values-cs/translations.xml @@ -10,6 +10,7 @@ "Popis je příliš krátký, uveďte prosím více podrobností o tom, co se stalo. Děkujeme!" "Odeslat záznamy o selhání" "Povolit protokoly" + "Vaše protokoly jsou příliš velké, proto je nelze zahrnout do této zprávy. Zašlete nám je prosím jiným způsobem." "Odeslat snímek obrazovky" "Protokoly budou součástí vaší zprávy, aby se zajistilo že vše funguje správně. Chcete-li odeslat zprávu bez protokolů, vypněte toto nastavení." "%1$s havaroval při posledním použití. Chcete se s námi podělit o zprávu o selhání?" diff --git a/features/rageshake/impl/src/main/res/values-sv/translations.xml b/features/rageshake/impl/src/main/res/values-sv/translations.xml index f04ccdf738..9542842ea3 100644 --- a/features/rageshake/impl/src/main/res/values-sv/translations.xml +++ b/features/rageshake/impl/src/main/res/values-sv/translations.xml @@ -10,6 +10,7 @@ "Beskrivningen är för kort, vänligen ge mer information om vad som hände. Tack!" "Skicka kraschloggar" "Tillåt loggar" + "Dina loggar är alltför stora och kan därför inte inkluderas i den här rapporten. Vänligen skicka dem till oss på annat sätt." "Skicka skärmdump" "Loggar kommer att inkluderas i ditt meddelande för att se till att allt fungerar korrekt. Om du vill skicka ditt meddelande utan loggar stänger du av den här inställningen." "%1$s kraschade senast den användes. Vill du dela en kraschrapport med oss?" diff --git a/features/reportroom/impl/src/main/res/values-hu/translations.xml b/features/reportroom/impl/src/main/res/values-hu/translations.xml index dcf563eb8e..9e2a3899a3 100644 --- a/features/reportroom/impl/src/main/res/values-hu/translations.xml +++ b/features/reportroom/impl/src/main/res/values-hu/translations.xml @@ -2,7 +2,7 @@ "A jelentése sikeresen el lett küldve, de hibát találtunk a szoba elhagyása során. Próbálja újra." "Nem tudja elhagyni a szobát" - "A szoba jelentése a rendszergazdának. Ha az üzenetek titkosítva vannak, akkor a rendszergazda nem fogja tudni elolvasni őket." + "A szoba jelentése az adminisztrátoroknak. Ha az üzenetek titkosítva vannak, akkor az adminisztrátor nem fogja tudni elolvasni őket." "Írja le az okot…" "Szoba jelentése" diff --git a/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/edit/RoomDetailsEditPresenter.kt b/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/edit/RoomDetailsEditPresenter.kt index fb530e601a..ae324b4027 100644 --- a/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/edit/RoomDetailsEditPresenter.kt +++ b/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/edit/RoomDetailsEditPresenter.kt @@ -34,6 +34,7 @@ import io.element.android.libraries.matrix.ui.room.avatarUrl import io.element.android.libraries.matrix.ui.room.rawName import io.element.android.libraries.matrix.ui.room.topic import io.element.android.libraries.mediapickers.api.PickerProvider +import io.element.android.libraries.mediaupload.api.MediaOptimizationConfigProvider import io.element.android.libraries.mediaupload.api.MediaPreProcessor import io.element.android.libraries.permissions.api.PermissionsEvents import io.element.android.libraries.permissions.api.PermissionsPresenter @@ -49,6 +50,7 @@ class RoomDetailsEditPresenter @Inject constructor( private val mediaPreProcessor: MediaPreProcessor, private val temporaryUriDeleter: TemporaryUriDeleter, permissionsPresenterFactory: PermissionsPresenter.Factory, + private val mediaOptimizationConfigProvider: MediaOptimizationConfigProvider, ) : Presenter { private val cameraPermissionPresenter = permissionsPresenterFactory.create(android.Manifest.permission.CAMERA) private var pendingPermissionRequest = false @@ -223,7 +225,7 @@ class RoomDetailsEditPresenter @Inject constructor( uri = avatarUri, mimeType = MimeTypes.Jpeg, deleteOriginal = false, - compressIfPossible = false, + mediaOptimizationConfig = mediaOptimizationConfigProvider.get(), ).getOrThrow() room.updateAvatar(MimeTypes.Jpeg, preprocessed.file.readBytes()).getOrThrow() } else { 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 73e51ad045..3bd037b1c0 100644 --- a/features/roomdetails/impl/src/main/res/values-cs/translations.xml +++ b/features/roomdetails/impl/src/main/res/values-cs/translations.xml @@ -82,6 +82,7 @@ "Nevyřízeno" "Správce" "Moderátor" + "Vlastník" "Členové místnosti" "Rušení vykázání %1$s" "Povolit vlastní nastavení" 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 efa349d2ed..5906bd5986 100644 --- a/features/roomdetails/impl/src/main/res/values-fi/translations.xml +++ b/features/roomdetails/impl/src/main/res/values-fi/translations.xml @@ -22,6 +22,8 @@ "Muokkaa ylläpitäjiä" "Et voi peruuttaa tätä toimenpidettä. Ylennät käyttäjän samalle oikeustasolle kuin sinä." "Lisää ylläpitäjä?" + "Et voi kumota tätä toimintoa. Olet siirtämässä omistajuuden valituille käyttäjille. Kun poistut, muutos on pysyvä." + "Siirretäänkö omistajuus?" "Alenna" "Et voi perua tätä muutosta, koska olet alentamassa itseäsi. Jos olet viimeinen oikeutettu henkilö tässä huoneessa, oikeuksia ei voi enää saada takaisin." "Alenna itsesi?" @@ -30,6 +32,7 @@ "Ylläpitäjillä on automaattisesti valvojan oikeudet" "Omistajilla on automaattisesti ylläpitäjän oikeudet." "Muokkaa valvojia" + "Valitse Omistajat" "Ylläpitäjät" "Valvojat" "Jäsenet" 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 3cb7796de8..dfe25cf712 100644 --- a/features/roomdetails/impl/src/main/res/values-hu/translations.xml +++ b/features/roomdetails/impl/src/main/res/values-hu/translations.xml @@ -22,13 +22,17 @@ "Adminisztrátorok szerkesztése" "Ezt a műveletet nem fogja tudja visszavonni. Ugyanarra a szintre lépteti elő a felhasználót, mint amellyel Ön is rendelkezik." "Adminisztrátor hozzáadása?" + "Ezt a műveletet nem lehet visszavonni. A tulajdonjogot a kiválasztott felhasználókra ruházza át. Távozás után a művelet véglegessé válik." + "Átruházza a tulajdonjogot?" "Lefokozás" "Ezt a változtatást nem fogja tudni visszavonni, mivel lefokozza magát, ha Ön az utolsó jogosultságokkal rendelkező felhasználó a szobában, akkor lehetetlen lesz visszaszerezni a jogosultságokat." "Lefokozza magát?" "%1$s (függőben)" "(Függőben)" "Az adminisztrátorok automatikusan moderátori jogosultságokkal rendelkeznek" + "A tulajdonosok automatikusan adminisztrátori jogosultsággal rendelkeznek." "Moderátorok szerkesztése" + "Tulajdonosok kiválasztása" "Adminisztrátorok" "Moderátorok" "Tagok" @@ -99,12 +103,14 @@ "Csak említések és kulcsszavak" "Ebben a szobában, értesítés ezekről:" "Adminisztrátorok" + "Adminisztrátorok és tulajdonosok" "Saját szerepkör módosítása" "Lefokozás taggá" "Lefokozás moderátorrá" "Tagok moderálása" "Üzenetek és tartalom" "Moderátorok" + "Tulajdonosok" "Jogosultságok" "Jogosultságok visszaállítása" "A jogosultságok visszaállítása után a jelenlegi beállítások elvesznek." 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 8eadbeed09..32d1bb8fc8 100644 --- a/features/roomdetails/impl/src/main/res/values-pt/translations.xml +++ b/features/roomdetails/impl/src/main/res/values-pt/translations.xml @@ -22,13 +22,17 @@ "Editar Administradores" "Não poderás desfazer esta ação. Estás a promover o utilizador para ter o mesmo nível de poder que tu." "Adicionar administrador?" + "Não será possível reverter esta ação. Estás a transferir a posse para os utilizadores selecionados. Será permanente depois de saíres." + "Transferir posse?" "Despromover" "Não poderás desfazer esta alteração, uma vez que te estás a despromover. Se fores o último utilizador privilegiado na sala, será impossível recuperar os privilégios." "Despromover-te?" "%1$s (pendente)" "(pendente)" "Os administradores têm automaticamente privilégios de moderador" + "Os donos têm permissões de administrador automaticamente" "Editar Moderadores" + "Escolher donos" "Administradores" "Moderadores" "Participantes" @@ -81,6 +85,7 @@ "Pendente" "Administrador" "Moderador" + "Dono / Dona" "Participantes" "A anular banimento de %1$s" "Permitir configuração personalizada" @@ -98,12 +103,14 @@ "Menções ou palavras-chave" "Nesta sala, notifica-me se" "Administradores" + "Administradores e donos" "Alterar o meu cargo" "Despromover para participante" "Despromover para moderador" "Moderação de participantes" "Mensagens e conteúdo" "Moderadores" + "Donos" "Permissões" "Repor permissões" "Ao repores as permissões, perderás as configurações atuais." 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 e3de1aaa1f..b3cac2e00a 100644 --- a/features/roomdetails/impl/src/main/res/values-uk/translations.xml +++ b/features/roomdetails/impl/src/main/res/values-uk/translations.xml @@ -22,6 +22,8 @@ "Керувати адмінами" "Ви не зможете скасувати цю дію. Ви просуваєте користувача, щоб він мав такий же рівень прав, як і ви." "Додати адміністратора?" + "Ви не зможете скасувати цю дію. Ви передаєте право власності вибраним користувачам. Після вашого виходу це буде остаточно." + "Передати право власності?" "Понизити" "Ви не зможете скасувати цю зміну, оскільки ви понижуєте себе, якщо ви останній привілейований користувач у кімнаті, відновити повноваження буде неможливо." "Понизити себе?" @@ -30,6 +32,7 @@ "Адміністратори автоматично мають повноваження модератора" "Власники автоматично отримують права адміністратора." "Керувати модераторами" + "Оберіть власників" "Адміністратори" "Модератори" "Учасники" diff --git a/features/roomdetails/impl/src/test/kotlin/io/element/android/features/roomdetails/impl/edit/RoomDetailsEditPresenterTest.kt b/features/roomdetails/impl/src/test/kotlin/io/element/android/features/roomdetails/impl/edit/RoomDetailsEditPresenterTest.kt index bb6a9b3027..996cbcfece 100644 --- a/features/roomdetails/impl/src/test/kotlin/io/element/android/features/roomdetails/impl/edit/RoomDetailsEditPresenterTest.kt +++ b/features/roomdetails/impl/src/test/kotlin/io/element/android/features/roomdetails/impl/edit/RoomDetailsEditPresenterTest.kt @@ -22,6 +22,7 @@ import io.element.android.libraries.matrix.test.A_ROOM_RAW_NAME import io.element.android.libraries.matrix.ui.media.AvatarAction import io.element.android.libraries.mediapickers.test.FakePickerProvider import io.element.android.libraries.mediaupload.api.MediaUploadInfo +import io.element.android.libraries.mediaupload.test.FakeMediaOptimizationConfigProvider import io.element.android.libraries.mediaupload.test.FakeMediaPreProcessor import io.element.android.libraries.permissions.api.PermissionsPresenter import io.element.android.libraries.permissions.test.FakePermissionsPresenter @@ -77,6 +78,7 @@ class RoomDetailsEditPresenterTest { room: JoinedRoom, permissionsPresenter: PermissionsPresenter = FakePermissionsPresenter(), temporaryUriDeleter: TemporaryUriDeleter = FakeTemporaryUriDeleter(), + mediaOptimizationConfigProvider: FakeMediaOptimizationConfigProvider = FakeMediaOptimizationConfigProvider(), ): RoomDetailsEditPresenter { return RoomDetailsEditPresenter( room = room, @@ -84,6 +86,7 @@ class RoomDetailsEditPresenterTest { mediaPreProcessor = fakeMediaPreProcessor, permissionsPresenterFactory = FakePermissionsPresenterFactory(permissionsPresenter), temporaryUriDeleter = temporaryUriDeleter, + mediaOptimizationConfigProvider = mediaOptimizationConfigProvider, ) } 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 6dac12a6e2..ea38b0bc70 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,9 +22,9 @@ 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.mediaupload.api.MediaOptimizationConfigProvider import io.element.android.libraries.mediaupload.api.MediaPreProcessor import io.element.android.libraries.mediaupload.api.MediaSender -import io.element.android.libraries.preferences.api.store.SessionPreferencesStore import io.element.android.services.appnavstate.api.ActiveRoomsHolder import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.launch @@ -37,8 +37,8 @@ class SharePresenter @AssistedInject constructor( private val shareIntentHandler: ShareIntentHandler, private val matrixClient: MatrixClient, private val mediaPreProcessor: MediaPreProcessor, - private val sessionPreferencesStore: SessionPreferencesStore, private val activeRoomsHolder: ActiveRoomsHolder, + private val mediaOptimizationConfigProvider: MediaOptimizationConfigProvider, ) : Presenter { @AssistedFactory interface Factory { @@ -88,13 +88,14 @@ class SharePresenter @AssistedInject constructor( val mediaSender = MediaSender( preProcessor = mediaPreProcessor, room = room, - sessionPreferencesStore = sessionPreferencesStore, + mediaOptimizationConfigProvider = mediaOptimizationConfigProvider, ) filesToShare .map { fileToShare -> val result = mediaSender.sendMedia( uri = fileToShare.uri, mimeType = fileToShare.mimeType, + mediaOptimizationConfig = mediaOptimizationConfigProvider.get(), ) // If the coroutine was cancelled, destroy the room and rethrow the exception val cancellationException = result.exceptionOrNull() as? CancellationException 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 203d5888d1..a9346fbf6e 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 @@ -26,8 +26,8 @@ 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 import io.element.android.libraries.mediaupload.api.MediaPreProcessor +import io.element.android.libraries.mediaupload.test.FakeMediaOptimizationConfigProvider import io.element.android.libraries.mediaupload.test.FakeMediaPreProcessor -import io.element.android.libraries.preferences.test.InMemorySessionPreferencesStore import io.element.android.services.appnavstate.api.ActiveRoomsHolder import io.element.android.tests.testutils.WarmUpRule import io.element.android.tests.testutils.lambda.lambdaRecorder @@ -166,6 +166,7 @@ class SharePresenterTest { matrixClient: MatrixClient = FakeMatrixClient(), mediaPreProcessor: MediaPreProcessor = FakeMediaPreProcessor(), activeRoomsHolder: ActiveRoomsHolder = ActiveRoomsHolder(), + mediaOptimizationConfigProvider: FakeMediaOptimizationConfigProvider = FakeMediaOptimizationConfigProvider(), ): SharePresenter { return SharePresenter( intent = intent, @@ -173,8 +174,8 @@ class SharePresenterTest { shareIntentHandler = shareIntentHandler, matrixClient = matrixClient, mediaPreProcessor = mediaPreProcessor, - sessionPreferencesStore = InMemorySessionPreferencesStore(), activeRoomsHolder = activeRoomsHolder, + mediaOptimizationConfigProvider = mediaOptimizationConfigProvider, ) } } diff --git a/gradle.properties b/gradle.properties index 7f6fe32a88..74dc7941d2 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-alpha07 +android.experimental.lint.version=8.12.0 # Enable test fixture for all modules by default android.experimental.enableTestFixtures=true diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index dc20729ac6..62f55d776a 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -3,7 +3,7 @@ [versions] # Project -android_gradle_plugin = "8.11.1" +android_gradle_plugin = "8.12.0" kotlin = "2.2.0" kotlinpoet = "2.2.0" ksp = "2.2.0-2.0.2" @@ -42,7 +42,7 @@ coil = "3.3.0" showkase = "1.0.4" appyx = "1.7.1" sqldelight = "2.1.0" -wysiwyg = "2.38.5" +wysiwyg = "2.39.0" telephoto = "0.16.0" haze = "1.6.9" @@ -156,7 +156,7 @@ test_truth = "com.google.truth:truth:1.4.4" test_parameter_injector = "com.google.testparameterinjector:test-parameter-injector:1.18" test_robolectric = "org.robolectric:robolectric:4.15.1" test_appyx_junit = { module = "com.bumble.appyx:testing-junit4", version.ref = "appyx" } -test_composable_preview_scanner = "io.github.sergio-sastre.ComposablePreviewScanner:android:0.6.1" +test_composable_preview_scanner = "io.github.sergio-sastre.ComposablePreviewScanner:android:0.7.0" test_detekt_api = { module = "io.gitlab.arturbosch.detekt:detekt-api", version.ref = "detekt" } test_detekt_test = { module = "io.gitlab.arturbosch.detekt:detekt-test", version.ref = "detekt" } 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 new file mode 100644 index 0000000000..a9aa8cf378 --- /dev/null +++ b/libraries/androidutils/src/main/kotlin/io/element/android/libraries/androidutils/media/VideoCompressorHelper.kt @@ -0,0 +1,46 @@ +/* + * 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 kotlin.math.min +import kotlin.math.roundToInt + +/** + * Helper class to calculate the resulting output size and optimal bitrate for video compression. + */ +class VideoCompressorHelper( + /** + * The maximum size (in pixels) for the output video. + * The output will maintain the aspect ratio of the input video. + */ + val maxSize: Int, +) { + /** + * Calculates the output size for video compression based on the input size and [maxSize]. + */ + 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()) + } + + /** + * Calculates the optimal bitrate for video compression based on the input size and frame rate. + */ + fun calculateOptimalBitrate(inputSize: Size, frameRate: Int): Long { + val outputSize = getOutputSize(inputSize) + 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 + } +} + +internal fun Size.major(): Int = if (width > height) width else height +internal fun Size.minor(): Int = if (width < height) width else height 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 c1bd0bdb80..16a6d6839a 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 @@ -184,4 +184,12 @@ enum class FeatureFlags( // False so it's displayed in the developer options screen isFinished = false, ), + SelectableMediaQuality( + key = "feature.selectable_media_quality", + title = "Select media quality per upload", + description = "You can select the media quality for each attachment you upload.", + defaultValue = { false }, + // False so it's displayed in the developer options screen + isFinished = false, + ), } 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 a23ee2c14e..e8c346cf9e 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 @@ -171,6 +171,11 @@ interface MatrixClient { * Return true if Livekit Rtc is supported, i.e. if Element Call is available. */ suspend fun isLivekitRtcSupported(): Boolean + + /** + * Returns the maximum file upload size allowed by the Matrix server. + */ + suspend fun getMaxFileUploadSize(): Result } /** diff --git a/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/RustMatrixClient.kt b/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/RustMatrixClient.kt index 83369b4c59..50c311e56a 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 @@ -692,6 +692,10 @@ class RustMatrixClient( innerClient.isLivekitRtcSupported() } + override suspend fun getMaxFileUploadSize(): Result = withContext(sessionDispatcher) { + runCatchingExceptions { innerClient.getMaxMediaUploadSize().toLong() } + } + private suspend fun File.getCacheSize( includeCryptoDb: Boolean = false, ): Long = withContext(sessionDispatcher) { diff --git a/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/notification/NotificationMapper.kt b/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/notification/NotificationMapper.kt index 9130df5c7a..e7831bc492 100644 --- a/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/notification/NotificationMapper.kt +++ b/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/notification/NotificationMapper.kt @@ -8,6 +8,7 @@ package io.element.android.libraries.matrix.impl.notification import io.element.android.libraries.core.bool.orFalse +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.RoomId import io.element.android.libraries.matrix.api.core.SessionId @@ -30,31 +31,33 @@ class NotificationMapper( eventId: EventId, roomId: RoomId, notificationItem: NotificationItem - ): NotificationData { - return notificationItem.use { item -> - val isDm = isDm( - isDirect = item.roomInfo.isDirect, - activeMembersCount = item.roomInfo.joinedMembersCount.toInt(), - ) - NotificationData( - sessionId = sessionId, - eventId = eventId, - // FIXME once the `NotificationItem` in the SDK returns the thread id - threadId = null, - roomId = roomId, - senderAvatarUrl = item.senderInfo.avatarUrl, - senderDisplayName = item.senderInfo.displayName, - senderIsNameAmbiguous = item.senderInfo.isNameAmbiguous, - roomAvatarUrl = item.roomInfo.avatarUrl ?: item.senderInfo.avatarUrl.takeIf { isDm }, - roomDisplayName = item.roomInfo.displayName, - isDirect = item.roomInfo.isDirect, - isDm = isDm, - isEncrypted = item.roomInfo.isEncrypted.orFalse(), - isNoisy = item.isNoisy.orFalse(), - timestamp = item.timestamp() ?: clock.epochMillis(), - content = item.event.use { notificationContentMapper.map(it) }, - hasMention = item.hasMention.orFalse(), - ) + ): Result { + return runCatchingExceptions { + notificationItem.use { item -> + val isDm = isDm( + isDirect = item.roomInfo.isDirect, + activeMembersCount = item.roomInfo.joinedMembersCount.toInt(), + ) + NotificationData( + sessionId = sessionId, + eventId = eventId, + // FIXME once the `NotificationItem` in the SDK returns the thread id + threadId = null, + roomId = roomId, + senderAvatarUrl = item.senderInfo.avatarUrl, + senderDisplayName = item.senderInfo.displayName, + senderIsNameAmbiguous = item.senderInfo.isNameAmbiguous, + roomAvatarUrl = item.roomInfo.avatarUrl ?: item.senderInfo.avatarUrl.takeIf { isDm }, + roomDisplayName = item.roomInfo.displayName, + isDirect = item.roomInfo.isDirect, + isDm = isDm, + isEncrypted = item.roomInfo.isEncrypted.orFalse(), + isNoisy = item.isNoisy.orFalse(), + timestamp = item.timestamp() ?: clock.epochMillis(), + content = item.event.use { notificationContentMapper.map(it) }.getOrThrow(), + hasMention = item.hasMention.orFalse(), + ) + } } } } @@ -62,11 +65,13 @@ class NotificationMapper( class NotificationContentMapper { private val timelineEventToNotificationContentMapper = TimelineEventToNotificationContentMapper() - fun map(notificationEvent: NotificationEvent): NotificationContent = + fun map(notificationEvent: NotificationEvent): Result = when (notificationEvent) { is NotificationEvent.Timeline -> timelineEventToNotificationContentMapper.map(notificationEvent.event) - is NotificationEvent.Invite -> NotificationContent.Invite( - senderId = UserId(notificationEvent.sender), + is NotificationEvent.Invite -> Result.success( + NotificationContent.Invite( + senderId = UserId(notificationEvent.sender), + ) ) } } diff --git a/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/notification/RustNotificationService.kt b/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/notification/RustNotificationService.kt index 4b4693c73b..1379392ae3 100644 --- a/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/notification/RustNotificationService.kt +++ b/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/notification/RustNotificationService.kt @@ -53,7 +53,9 @@ class RustNotificationService( is BatchNotificationResult.Ok -> { when (val status = result.status) { is NotificationStatus.Event -> { - put(eventId, Result.success(notificationMapper.map(sessionId, eventId, roomId, status.item))) + val result = notificationMapper.map(sessionId, eventId, roomId, status.item) + result.onFailure { Timber.e(it, "Could not map notification event $eventId") } + put(eventId, result) } is NotificationStatus.EventNotFound -> { Timber.e("Could not retrieve event for notification with $eventId - event not found") diff --git a/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/notification/TimelineEventToNotificationContentMapper.kt b/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/notification/TimelineEventToNotificationContentMapper.kt index cf914abe8d..85f87b271f 100644 --- a/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/notification/TimelineEventToNotificationContentMapper.kt +++ b/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/notification/TimelineEventToNotificationContentMapper.kt @@ -7,6 +7,7 @@ package io.element.android.libraries.matrix.impl.notification +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.UserId import io.element.android.libraries.matrix.api.notification.CallNotifyType @@ -21,10 +22,12 @@ import org.matrix.rustcomponents.sdk.TimelineEventType import org.matrix.rustcomponents.sdk.use class TimelineEventToNotificationContentMapper { - fun map(timelineEvent: TimelineEvent): NotificationContent { - return timelineEvent.use { - timelineEvent.eventType().use { eventType -> - eventType.toContent(senderId = UserId(timelineEvent.senderId())) + fun map(timelineEvent: TimelineEvent): Result { + return runCatchingExceptions { + timelineEvent.use { + timelineEvent.eventType().use { eventType -> + eventType.toContent(senderId = UserId(timelineEvent.senderId())) + } } } } diff --git a/libraries/matrix/impl/src/test/kotlin/io/element/android/libraries/matrix/impl/fixtures/fakes/FakeFfiTimelineEvent.kt b/libraries/matrix/impl/src/test/kotlin/io/element/android/libraries/matrix/impl/fixtures/fakes/FakeFfiTimelineEvent.kt index e514cef7a8..41eb9c798e 100644 --- a/libraries/matrix/impl/src/test/kotlin/io/element/android/libraries/matrix/impl/fixtures/fakes/FakeFfiTimelineEvent.kt +++ b/libraries/matrix/impl/src/test/kotlin/io/element/android/libraries/matrix/impl/fixtures/fakes/FakeFfiTimelineEvent.kt @@ -14,7 +14,7 @@ import org.matrix.rustcomponents.sdk.NoPointer import org.matrix.rustcomponents.sdk.TimelineEvent import org.matrix.rustcomponents.sdk.TimelineEventType -class FakeFfiTimelineEvent( +open class FakeFfiTimelineEvent( val timestamp: ULong = A_FAKE_TIMESTAMP.toULong(), val timelineEventType: TimelineEventType = aRustTimelineEventTypeMessageLike(), val senderId: String = A_USER_ID_2.value, diff --git a/libraries/matrix/impl/src/test/kotlin/io/element/android/libraries/matrix/impl/notification/RustNotificationServiceTest.kt b/libraries/matrix/impl/src/test/kotlin/io/element/android/libraries/matrix/impl/notification/RustNotificationServiceTest.kt index 117d164ab9..2b6717910b 100644 --- a/libraries/matrix/impl/src/test/kotlin/io/element/android/libraries/matrix/impl/notification/RustNotificationServiceTest.kt +++ b/libraries/matrix/impl/src/test/kotlin/io/element/android/libraries/matrix/impl/notification/RustNotificationServiceTest.kt @@ -12,8 +12,12 @@ import io.element.android.libraries.matrix.api.exception.NotificationResolverExc import io.element.android.libraries.matrix.api.notification.NotificationContent import io.element.android.libraries.matrix.api.timeline.item.event.TextMessageType import io.element.android.libraries.matrix.impl.fixtures.factories.aRustBatchNotificationResult +import io.element.android.libraries.matrix.impl.fixtures.factories.aRustNotificationEventTimeline +import io.element.android.libraries.matrix.impl.fixtures.factories.aRustNotificationItem import io.element.android.libraries.matrix.impl.fixtures.fakes.FakeFfiNotificationClient +import io.element.android.libraries.matrix.impl.fixtures.fakes.FakeFfiTimelineEvent import io.element.android.libraries.matrix.test.AN_EVENT_ID +import io.element.android.libraries.matrix.test.AN_EVENT_ID_2 import io.element.android.libraries.matrix.test.A_MESSAGE import io.element.android.libraries.matrix.test.A_ROOM_ID import io.element.android.libraries.matrix.test.A_SESSION_ID @@ -26,6 +30,8 @@ import kotlinx.coroutines.test.TestScope import kotlinx.coroutines.test.runTest import org.junit.Test import org.matrix.rustcomponents.sdk.NotificationClient +import org.matrix.rustcomponents.sdk.NotificationStatus +import org.matrix.rustcomponents.sdk.TimelineEventType class RustNotificationServiceTest { @Test @@ -49,6 +55,33 @@ class RustNotificationServiceTest { ) } + @Test + fun `test mapping invalid item only drops that item`() = runTest { + val error = IllegalStateException("This event type is not supported") + val faultyEvent = object : FakeFfiTimelineEvent() { + override fun eventType(): TimelineEventType { + throw error + } + } + val notificationClient = FakeFfiNotificationClient( + notificationItemResult = mapOf( + AN_EVENT_ID.value to aRustBatchNotificationResult( + notificationStatus = NotificationStatus.Event(aRustNotificationItem(aRustNotificationEventTimeline(faultyEvent))) + ), + AN_EVENT_ID_2.value to aRustBatchNotificationResult() + ), + ) + val sut = createRustNotificationService( + notificationClient = notificationClient, + ) + val result = sut.getNotifications(mapOf(A_ROOM_ID to listOf(AN_EVENT_ID, AN_EVENT_ID_2))).getOrThrow() + val exception = result[AN_EVENT_ID]!!.exceptionOrNull() + assertThat(exception).isEqualTo(error) + + val successfulResult = result[AN_EVENT_ID_2] + assertThat(successfulResult?.isSuccess).isTrue() + } + @Test fun `test unable to resolve event`() = runTest { val notificationClient = FakeFfiNotificationClient( 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 a36704c342..41ceb72200 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 @@ -94,6 +94,7 @@ class FakeMatrixClient( private val canReportRoomLambda: () -> Boolean = { false }, private val isLivekitRtcSupportedLambda: () -> Boolean = { false }, override val ignoredUsersFlow: StateFlow> = MutableStateFlow(persistentListOf()), + private val getMaxUploadSizeResult: () -> Result = { lambdaError() }, ) : MatrixClient { var setDisplayNameCalled: Boolean = false private set @@ -343,4 +344,8 @@ class FakeMatrixClient( override suspend fun isLivekitRtcSupported(): Boolean { return isLivekitRtcSupportedLambda() } + + override suspend fun getMaxFileUploadSize(): Result { + return getMaxUploadSizeResult() + } } diff --git a/libraries/mediaupload/api/src/main/kotlin/io/element/android/libraries/mediaupload/api/MaxUploadSizeProvider.kt b/libraries/mediaupload/api/src/main/kotlin/io/element/android/libraries/mediaupload/api/MaxUploadSizeProvider.kt new file mode 100644 index 0000000000..884d75e325 --- /dev/null +++ b/libraries/mediaupload/api/src/main/kotlin/io/element/android/libraries/mediaupload/api/MaxUploadSizeProvider.kt @@ -0,0 +1,22 @@ +/* + * Copyright 2025 New Vector Ltd. + * + * SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial + * Please see LICENSE files in the repository root for full details. + */ + +package io.element.android.libraries.mediaupload.api + +import io.element.android.libraries.matrix.api.MatrixClient +import javax.inject.Inject + +/** + * Provides the maximum upload size allowed by the Matrix server. + */ +class MaxUploadSizeProvider @Inject constructor( + private val matrixClient: MatrixClient, +) { + suspend fun getMaxUploadSize(): Result { + return matrixClient.getMaxFileUploadSize() + } +} diff --git a/libraries/mediaupload/api/src/main/kotlin/io/element/android/libraries/mediaupload/api/MediaOptimizationConfig.kt b/libraries/mediaupload/api/src/main/kotlin/io/element/android/libraries/mediaupload/api/MediaOptimizationConfig.kt new file mode 100644 index 0000000000..bfa6e427c9 --- /dev/null +++ b/libraries/mediaupload/api/src/main/kotlin/io/element/android/libraries/mediaupload/api/MediaOptimizationConfig.kt @@ -0,0 +1,22 @@ +/* + * Copyright 2025 New Vector Ltd. + * + * SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial + * Please see LICENSE files in the repository root for full details. + */ + +package io.element.android.libraries.mediaupload.api + +import io.element.android.libraries.androidutils.media.VideoCompressorHelper +import io.element.android.libraries.preferences.api.store.VideoCompressionPreset + +data class MediaOptimizationConfig( + val compressImages: Boolean, + val videoCompressionPreset: VideoCompressionPreset, +) + +fun VideoCompressionPreset.compressorHelper(): VideoCompressorHelper = when (this) { + VideoCompressionPreset.STANDARD -> VideoCompressorHelper(1280) + VideoCompressionPreset.HIGH -> VideoCompressorHelper(1920) + VideoCompressionPreset.LOW -> VideoCompressorHelper(640) +} diff --git a/libraries/mediaupload/api/src/main/kotlin/io/element/android/libraries/mediaupload/api/MediaOptimizationConfigProvider.kt b/libraries/mediaupload/api/src/main/kotlin/io/element/android/libraries/mediaupload/api/MediaOptimizationConfigProvider.kt new file mode 100644 index 0000000000..eb13022ae3 --- /dev/null +++ b/libraries/mediaupload/api/src/main/kotlin/io/element/android/libraries/mediaupload/api/MediaOptimizationConfigProvider.kt @@ -0,0 +1,12 @@ +/* + * Copyright 2025 New Vector Ltd. + * + * SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial + * Please see LICENSE files in the repository root for full details. + */ + +package io.element.android.libraries.mediaupload.api + +fun interface MediaOptimizationConfigProvider { + suspend fun get(): MediaOptimizationConfig +} diff --git a/libraries/mediaupload/api/src/main/kotlin/io/element/android/libraries/mediaupload/api/MediaPreProcessor.kt b/libraries/mediaupload/api/src/main/kotlin/io/element/android/libraries/mediaupload/api/MediaPreProcessor.kt index 347197bd2d..9f2f91f8c9 100644 --- a/libraries/mediaupload/api/src/main/kotlin/io/element/android/libraries/mediaupload/api/MediaPreProcessor.kt +++ b/libraries/mediaupload/api/src/main/kotlin/io/element/android/libraries/mediaupload/api/MediaPreProcessor.kt @@ -19,7 +19,7 @@ interface MediaPreProcessor { uri: Uri, mimeType: String, deleteOriginal: Boolean, - compressIfPossible: Boolean, + mediaOptimizationConfig: MediaOptimizationConfig, ): Result /** 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 0039f87963..a010b892a8 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 @@ -14,17 +14,15 @@ 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.JoinedRoom import io.element.android.libraries.matrix.api.timeline.Timeline -import io.element.android.libraries.preferences.api.store.SessionPreferencesStore import kotlinx.coroutines.CancellationException import kotlinx.coroutines.Job -import kotlinx.coroutines.flow.first import java.util.concurrent.ConcurrentHashMap import javax.inject.Inject class MediaSender @Inject constructor( private val preProcessor: MediaPreProcessor, private val room: JoinedRoom, - private val sessionPreferencesStore: SessionPreferencesStore, + private val mediaOptimizationConfigProvider: MediaOptimizationConfigProvider, ) { private val ongoingUploadJobs = ConcurrentHashMap() val hasOngoingMediaUploads get() = ongoingUploadJobs.isNotEmpty() @@ -32,14 +30,14 @@ class MediaSender @Inject constructor( suspend fun preProcessMedia( uri: Uri, mimeType: String, + mediaOptimizationConfig: MediaOptimizationConfig, ): Result { - val compressIfPossible = sessionPreferencesStore.doesCompressMedia().first() return preProcessor .process( uri = uri, mimeType = mimeType, deleteOriginal = false, - compressIfPossible = compressIfPossible, + mediaOptimizationConfig = mediaOptimizationConfig, ) } @@ -67,14 +65,14 @@ class MediaSender @Inject constructor( formattedCaption: String? = null, progressCallback: ProgressCallback? = null, inReplyToEventId: EventId? = null, + mediaOptimizationConfig: MediaOptimizationConfig, ): Result { - val compressIfPossible = sessionPreferencesStore.doesCompressMedia().first() return preProcessor .process( uri = uri, mimeType = mimeType, deleteOriginal = false, - compressIfPossible = compressIfPossible, + mediaOptimizationConfig = mediaOptimizationConfig, ) .flatMapCatching { info -> room.liveTimeline.sendMedia( @@ -100,7 +98,7 @@ class MediaSender @Inject constructor( uri = uri, mimeType = mimeType, deleteOriginal = true, - compressIfPossible = false, + mediaOptimizationConfig = mediaOptimizationConfigProvider.get(), ) .flatMapCatching { info -> val audioInfo = (info as MediaUploadInfo.Audio).audioInfo 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 fd6110f700..7ed36ce492 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 @@ -19,8 +19,7 @@ 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 import io.element.android.libraries.mediaupload.test.FakeMediaPreProcessor -import io.element.android.libraries.preferences.api.store.SessionPreferencesStore -import io.element.android.libraries.preferences.test.InMemorySessionPreferencesStore +import io.element.android.libraries.preferences.api.store.VideoCompressionPreset import io.element.android.tests.testutils.lambda.lambdaRecorder import kotlinx.coroutines.ExperimentalCoroutinesApi import kotlinx.coroutines.launch @@ -34,6 +33,11 @@ import java.io.File @RunWith(RobolectricTestRunner::class) class MediaSenderTest { + private val mediaOptimizationConfig = MediaOptimizationConfig( + compressImages = true, + videoCompressionPreset = VideoCompressionPreset.STANDARD, + ) + @Test fun `given an attachment when sending it the preprocessor always runs`() = runTest { val preProcessor = FakeMediaPreProcessor() @@ -57,7 +61,7 @@ class MediaSenderTest { ) val uri = Uri.parse("content://image.jpg") - sender.sendMedia(uri = uri, mimeType = MimeTypes.Jpeg) + sender.sendMedia(uri = uri, mimeType = MimeTypes.Jpeg, mediaOptimizationConfig = mediaOptimizationConfig) assertThat(preProcessor.processCallCount).isEqualTo(1) } @@ -76,7 +80,7 @@ class MediaSenderTest { val sender = createMediaSender(room = room) val uri = Uri.parse("content://image.jpg") - sender.sendMedia(uri = uri, mimeType = MimeTypes.Jpeg) + sender.sendMedia(uri = uri, mimeType = MimeTypes.Jpeg, mediaOptimizationConfig = mediaOptimizationConfig) } @Test @@ -87,7 +91,7 @@ class MediaSenderTest { val sender = createMediaSender(preProcessor) val uri = Uri.parse("content://image.jpg") - val result = sender.sendMedia(uri = uri, mimeType = MimeTypes.Jpeg) + val result = sender.sendMedia(uri = uri, mimeType = MimeTypes.Jpeg, mediaOptimizationConfig = mediaOptimizationConfig) assertThat(result.exceptionOrNull()).isNotNull() } @@ -112,7 +116,7 @@ class MediaSenderTest { ) val uri = Uri.parse("content://image.jpg") - val result = sender.sendMedia(uri = uri, mimeType = MimeTypes.Jpeg) + val result = sender.sendMedia(uri = uri, mimeType = MimeTypes.Jpeg, mediaOptimizationConfig = mediaOptimizationConfig) assertThat(result.exceptionOrNull()).isNotNull() } @@ -132,7 +136,7 @@ class MediaSenderTest { val sender = createMediaSender(room = room) val sendJob = launch { val uri = Uri.parse("content://image.jpg") - sender.sendMedia(uri = uri, mimeType = MimeTypes.Jpeg) + sender.sendMedia(uri = uri, mimeType = MimeTypes.Jpeg, mediaOptimizationConfig = mediaOptimizationConfig) } // Wait until several internal tasks run and the file is being uploaded advanceTimeBy(3L) @@ -154,10 +158,10 @@ class MediaSenderTest { private fun createMediaSender( preProcessor: MediaPreProcessor = FakeMediaPreProcessor(), room: JoinedRoom = FakeJoinedRoom(), - sessionPreferencesStore: SessionPreferencesStore = InMemorySessionPreferencesStore(), + mediaOptimizationConfigProvider: MediaOptimizationConfigProvider = MediaOptimizationConfigProvider { mediaOptimizationConfig }, ) = MediaSender( preProcessor = preProcessor, room = room, - sessionPreferencesStore = sessionPreferencesStore, + 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 8b93c7e938..e1758e9429 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 @@ -32,8 +32,10 @@ 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.mediaupload.api.MediaOptimizationConfig import io.element.android.libraries.mediaupload.api.MediaPreProcessor import io.element.android.libraries.mediaupload.api.MediaUploadInfo +import io.element.android.libraries.preferences.api.store.VideoCompressionPreset import kotlinx.coroutines.flow.filterIsInstance import kotlinx.coroutines.flow.first import kotlinx.coroutines.flow.onEach @@ -76,7 +78,7 @@ class AndroidMediaPreProcessor @Inject constructor( uri: Uri, mimeType: String, deleteOriginal: Boolean, - compressIfPossible: Boolean, + mediaOptimizationConfig: MediaOptimizationConfig, ): Result = withContext(coroutineDispatchers.computation) { runCatchingExceptions { val result = when { @@ -85,10 +87,10 @@ class AndroidMediaPreProcessor @Inject constructor( processFile(uri, mimeType) } mimeType.isMimeTypeImage() -> { - val shouldBeCompressed = compressIfPossible && mimeType !in notCompressibleImageTypes + val shouldBeCompressed = mediaOptimizationConfig.compressImages && mimeType !in notCompressibleImageTypes processImage(uri, mimeType, shouldBeCompressed) } - mimeType.isMimeTypeVideo() -> processVideo(uri, mimeType, compressIfPossible) + mimeType.isMimeTypeVideo() -> processVideo(uri, mimeType, mediaOptimizationConfig.videoCompressionPreset) mimeType.isMimeTypeAudio() -> processAudio(uri, mimeType) else -> processFile(uri, mimeType) } @@ -214,9 +216,9 @@ class AndroidMediaPreProcessor @Inject constructor( } } - private suspend fun processVideo(uri: Uri, mimeType: String?, shouldBeCompressed: Boolean): MediaUploadInfo { + private suspend fun processVideo(uri: Uri, mimeType: String?, videoCompressionPreset: VideoCompressionPreset): MediaUploadInfo { val resultFile = runCatchingExceptions { - videoCompressor.compress(uri, shouldBeCompressed) + videoCompressor.compress(uri, videoCompressionPreset) .onEach { if (it is VideoTranscodingEvent.Progress) { Timber.d("Video compression progress: ${it.value}%") diff --git a/libraries/mediaupload/impl/src/main/kotlin/io/element/android/libraries/mediaupload/impl/DefaultMediaOptimizationConfigProvider.kt b/libraries/mediaupload/impl/src/main/kotlin/io/element/android/libraries/mediaupload/impl/DefaultMediaOptimizationConfigProvider.kt new file mode 100644 index 0000000000..7642599077 --- /dev/null +++ b/libraries/mediaupload/impl/src/main/kotlin/io/element/android/libraries/mediaupload/impl/DefaultMediaOptimizationConfigProvider.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.mediaupload.impl + +import com.squareup.anvil.annotations.ContributesBinding +import io.element.android.libraries.di.SessionScope +import io.element.android.libraries.mediaupload.api.MediaOptimizationConfig +import io.element.android.libraries.mediaupload.api.MediaOptimizationConfigProvider +import io.element.android.libraries.preferences.api.store.SessionPreferencesStore +import kotlinx.coroutines.flow.first +import javax.inject.Inject + +@ContributesBinding(SessionScope::class) +class DefaultMediaOptimizationConfigProvider @Inject constructor( + private val sessionPreferencesStore: SessionPreferencesStore, +) : MediaOptimizationConfigProvider { + override suspend fun get(): MediaOptimizationConfig = MediaOptimizationConfig( + compressImages = sessionPreferencesStore.doesOptimizeImages().first(), + videoCompressionPreset = sessionPreferencesStore.getVideoCompressionPreset().first(), + ) +} 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 efa9042759..c21bd301ef 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 @@ -11,10 +11,10 @@ import android.content.Context import android.media.MediaCodecInfo import android.media.MediaMetadataRetriever import android.net.Uri +import android.util.Size import androidx.annotation.OptIn import androidx.media3.common.MediaItem import androidx.media3.common.MimeTypes -import androidx.media3.common.util.Size import androidx.media3.common.util.UnstableApi import androidx.media3.effect.Presentation import androidx.media3.transformer.Composition @@ -31,6 +31,7 @@ import io.element.android.libraries.androidutils.file.createTmpFile import io.element.android.libraries.androidutils.file.safeDelete import io.element.android.libraries.core.extensions.runCatchingExceptions import io.element.android.libraries.di.ApplicationContext +import io.element.android.libraries.preferences.api.store.VideoCompressionPreset import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.channels.awaitClose import kotlinx.coroutines.delay @@ -47,12 +48,12 @@ class VideoCompressor @Inject constructor( @ApplicationContext private val context: Context, ) { @OptIn(UnstableApi::class) - fun compress(uri: Uri, shouldBeCompressed: Boolean): Flow = callbackFlow { + fun compress(uri: Uri, videoCompressionPreset: VideoCompressionPreset): Flow = callbackFlow { val metadata = getVideoMetadata(uri) val videoCompressorConfig = VideoCompressorConfigFactory.create( metadata = metadata, - shouldBeCompressed = shouldBeCompressed + preset = videoCompressionPreset, ) val tmpFile = context.createTmpFile(extension = "mp4") @@ -60,7 +61,7 @@ class VideoCompressor @Inject constructor( val width = metadata?.width ?: Int.MAX_VALUE val height = metadata?.height ?: Int.MAX_VALUE - val videoResizeEffect = videoCompressorConfig.resizer?.let { + val videoResizeEffect = videoCompressorConfig.videoCompressorHelper?.let { val outputSize = it.getOutputSize(Size(width, height)) if (metadata?.rotation == 90 || metadata?.rotation == 270) { // If the video is rotated, we need to swap width and height diff --git a/libraries/mediaupload/impl/src/main/kotlin/io/element/android/libraries/mediaupload/impl/VideoCompressorConfig.kt b/libraries/mediaupload/impl/src/main/kotlin/io/element/android/libraries/mediaupload/impl/VideoCompressorConfig.kt index b3b0e66ccf..0337713f2a 100644 --- a/libraries/mediaupload/impl/src/main/kotlin/io/element/android/libraries/mediaupload/impl/VideoCompressorConfig.kt +++ b/libraries/mediaupload/impl/src/main/kotlin/io/element/android/libraries/mediaupload/impl/VideoCompressorConfig.kt @@ -7,62 +7,37 @@ package io.element.android.libraries.mediaupload.impl +import android.util.Size import androidx.annotation.OptIn -import androidx.media3.common.util.Size import androidx.media3.common.util.UnstableApi -import androidx.media3.transformer.VideoEncoderSettings +import io.element.android.libraries.androidutils.media.VideoCompressorHelper +import io.element.android.libraries.mediaupload.api.compressorHelper +import io.element.android.libraries.preferences.api.store.VideoCompressionPreset import kotlin.math.min -import kotlin.math.roundToInt @OptIn(UnstableApi::class) internal object VideoCompressorConfigFactory { - // Major dimension of 720p - private const val MAX_COMPRESSED_PIXEL_SIZE = 1280 - - // Major dimension of 1080p - private const val MAX_PIXEL_SIZE = 1920 - private const val DEFAULT_FRAME_RATE = 30 fun create( metadata: VideoFileMetadata?, - shouldBeCompressed: Boolean, + preset: VideoCompressionPreset, ): VideoCompressorConfig { val width = metadata?.width?.takeIf { it >= 0 } ?: Int.MAX_VALUE val height = metadata?.height?.takeIf { it >= 0 } ?: Int.MAX_VALUE - val originalBitrate = metadata?.bitrate?.takeIf { it >= 0 } val originalFrameRate = metadata?.frameRate?.takeIf { it >= 0 } ?: DEFAULT_FRAME_RATE - // We only create a resizer if needed - val resizer = when { - shouldBeCompressed && (width > MAX_COMPRESSED_PIXEL_SIZE || height > MAX_COMPRESSED_PIXEL_SIZE) -> VideoResizer(MAX_COMPRESSED_PIXEL_SIZE) - width > MAX_PIXEL_SIZE || height > MAX_PIXEL_SIZE -> VideoResizer(MAX_PIXEL_SIZE) - else -> null - } + val resizer = preset.compressorHelper() // If we are resizing, we also want to reduce the frame rate to the default value (30fps) - val newFrameRate = if (resizer is VideoResizer) { - min(originalFrameRate, DEFAULT_FRAME_RATE) - } else { - originalFrameRate - } + val newFrameRate = min(originalFrameRate, DEFAULT_FRAME_RATE) // If we need to resize the video, we also want to recalculate the bitrate - val newBitrate = if (resizer is VideoResizer) { - val maxSize = resizer.getOutputSize(Size(width, height)) - val pixelsPerFrame = maxSize.width * maxSize.height - val frameRate = newFrameRate - // Apparently, 0.1 bits per pixel is a sweet spot for video compression - val bitsPerPixel = 0.1f - - (pixelsPerFrame * bitsPerPixel * frameRate).toLong() - } else { - originalBitrate - } + val newBitrate = resizer.calculateOptimalBitrate(Size(width, height), newFrameRate) return VideoCompressorConfig( - resizer = resizer, - newBitRate = newBitrate?.toInt() ?: VideoEncoderSettings.NO_VALUE, + videoCompressorHelper = resizer, + newBitRate = newBitrate.toInt(), newFrameRate = newFrameRate, ) } @@ -70,28 +45,7 @@ internal object VideoCompressorConfigFactory { @OptIn(UnstableApi::class) internal data class VideoCompressorConfig( - val resizer: VideoResizer?, + val videoCompressorHelper: VideoCompressorHelper, val newBitRate: Int, val newFrameRate: Int, ) - -@OptIn(UnstableApi::class) -internal class VideoResizer( - val maxSize: Int, -) { - fun getOutputSize(inputSize: Size): Size { - val resultMajor = min(inputSize.major(), maxSize) - val aspectRatio = inputSize.width.toFloat() / inputSize.height.toFloat() - return if (inputSize.width > inputSize.height) { - Size(resultMajor, (resultMajor / aspectRatio).roundToInt()) - } else { - Size((resultMajor * aspectRatio).roundToInt(), resultMajor) - } - } -} - -@OptIn(UnstableApi::class) -internal fun Size.major(): Int = if (width > height) width else height - -@OptIn(UnstableApi::class) -internal fun Size.minor(): Int = if (width < height) width else height diff --git a/libraries/mediaupload/impl/src/test/kotlin/io/element/android/libraries/mediaupload/impl/AndroidMediaPreProcessorTest.kt b/libraries/mediaupload/impl/src/test/kotlin/io/element/android/libraries/mediaupload/impl/AndroidMediaPreProcessorTest.kt index 7f2f8b0ff6..3327a28e82 100644 --- a/libraries/mediaupload/impl/src/test/kotlin/io/element/android/libraries/mediaupload/impl/AndroidMediaPreProcessorTest.kt +++ b/libraries/mediaupload/impl/src/test/kotlin/io/element/android/libraries/mediaupload/impl/AndroidMediaPreProcessorTest.kt @@ -20,8 +20,10 @@ 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.ThumbnailInfo import io.element.android.libraries.matrix.api.media.VideoInfo +import io.element.android.libraries.mediaupload.api.MediaOptimizationConfig import io.element.android.libraries.mediaupload.api.MediaPreProcessor import io.element.android.libraries.mediaupload.api.MediaUploadInfo +import io.element.android.libraries.preferences.api.store.VideoCompressionPreset import io.element.android.services.toolbox.test.sdk.FakeBuildVersionSdkIntProvider import io.element.android.tests.testutils.fake.FakeTemporaryUriDeleter import io.element.android.tests.testutils.lambda.lambdaRecorder @@ -41,7 +43,7 @@ import kotlin.time.Duration class AndroidMediaPreProcessorTest { private suspend fun TestScope.process( asset: Asset, - compressIfPossible: Boolean, + mediaOptimizationConfig: MediaOptimizationConfig, sdkIntVersion: Int = Build.VERSION_CODES.P, deleteOriginal: Boolean = false, ): MediaUploadInfo { @@ -57,7 +59,7 @@ class AndroidMediaPreProcessorTest { uri = file.toUri(), mimeType = asset.mimeType, deleteOriginal = deleteOriginal, - compressIfPossible = compressIfPossible, + mediaOptimizationConfig = mediaOptimizationConfig, ) val data = result.getOrThrow() assertThat(data.file.path).endsWith(asset.filename) @@ -70,7 +72,10 @@ class AndroidMediaPreProcessorTest { fun `test processing png`() = runTest { val mediaUploadInfo = process( asset = assetImagePng, - compressIfPossible = true, + mediaOptimizationConfig = MediaOptimizationConfig( + compressImages = true, + videoCompressionPreset = VideoCompressionPreset.STANDARD, + ), ) val info = mediaUploadInfo as MediaUploadInfo.Image assertThat(info.thumbnailFile).isNotNull() @@ -91,7 +96,10 @@ class AndroidMediaPreProcessorTest { fun `test processing png api Q`() = runTest { val mediaUploadInfo = process( asset = assetImagePng, - compressIfPossible = true, + mediaOptimizationConfig = MediaOptimizationConfig( + compressImages = true, + videoCompressionPreset = VideoCompressionPreset.STANDARD, + ), sdkIntVersion = Build.VERSION_CODES.Q, ) val info = mediaUploadInfo as MediaUploadInfo.Image @@ -114,7 +122,10 @@ class AndroidMediaPreProcessorTest { fun `test processing png no compression`() = runTest { val mediaUploadInfo = process( asset = assetImagePng, - compressIfPossible = false, + mediaOptimizationConfig = MediaOptimizationConfig( + compressImages = false, + videoCompressionPreset = VideoCompressionPreset.STANDARD, + ), ) val info = mediaUploadInfo as MediaUploadInfo.Image assertThat(info.thumbnailFile).isNotNull() @@ -136,7 +147,10 @@ class AndroidMediaPreProcessorTest { fun `test processing png and delete`() = runTest { val mediaUploadInfo = process( asset = assetImagePng, - compressIfPossible = false, + mediaOptimizationConfig = MediaOptimizationConfig( + compressImages = false, + videoCompressionPreset = VideoCompressionPreset.STANDARD, + ), deleteOriginal = true, ) val info = mediaUploadInfo as MediaUploadInfo.Image @@ -161,7 +175,10 @@ class AndroidMediaPreProcessorTest { fun `test processing jpeg`() = runTest { val mediaUploadInfo = process( asset = assetImageJpeg, - compressIfPossible = true, + mediaOptimizationConfig = MediaOptimizationConfig( + compressImages = true, + videoCompressionPreset = VideoCompressionPreset.STANDARD, + ), ) val info = mediaUploadInfo as MediaUploadInfo.Image assertThat(info.thumbnailFile).isNotNull() @@ -182,7 +199,10 @@ class AndroidMediaPreProcessorTest { fun `test processing jpeg api Q`() = runTest { val mediaUploadInfo = process( asset = assetImageJpeg, - compressIfPossible = true, + mediaOptimizationConfig = MediaOptimizationConfig( + compressImages = true, + videoCompressionPreset = VideoCompressionPreset.STANDARD, + ), sdkIntVersion = Build.VERSION_CODES.Q, ) val info = mediaUploadInfo as MediaUploadInfo.Image @@ -205,7 +225,10 @@ class AndroidMediaPreProcessorTest { fun `test processing jpeg no compression`() = runTest { val mediaUploadInfo = process( asset = assetImageJpeg, - compressIfPossible = false, + mediaOptimizationConfig = MediaOptimizationConfig( + compressImages = false, + videoCompressionPreset = VideoCompressionPreset.STANDARD, + ), ) val info = mediaUploadInfo as MediaUploadInfo.Image assertThat(info.thumbnailFile).isNotNull() @@ -227,7 +250,10 @@ class AndroidMediaPreProcessorTest { fun `test processing jpeg and delete`() = runTest { val mediaUploadInfo = process( asset = assetImageJpeg, - compressIfPossible = false, + mediaOptimizationConfig = MediaOptimizationConfig( + compressImages = false, + videoCompressionPreset = VideoCompressionPreset.STANDARD, + ), deleteOriginal = true, ) val info = mediaUploadInfo as MediaUploadInfo.Image @@ -252,7 +278,10 @@ class AndroidMediaPreProcessorTest { fun `test processing gif`() = runTest { val mediaUploadInfo = process( asset = assetAnimatedGif, - compressIfPossible = true, + mediaOptimizationConfig = MediaOptimizationConfig( + compressImages = true, + videoCompressionPreset = VideoCompressionPreset.STANDARD, + ), ) val info = mediaUploadInfo as MediaUploadInfo.Image assertThat(info.thumbnailFile).isNotNull() @@ -273,7 +302,10 @@ class AndroidMediaPreProcessorTest { fun `test processing file`() = runTest { val mediaUploadInfo = process( asset = assetText, - compressIfPossible = true, + mediaOptimizationConfig = MediaOptimizationConfig( + compressImages = true, + videoCompressionPreset = VideoCompressionPreset.STANDARD, + ), ) val info = mediaUploadInfo as MediaUploadInfo.AnyFile assertThat(info.fileInfo).isEqualTo( @@ -291,7 +323,10 @@ class AndroidMediaPreProcessorTest { fun `test processing video`() = runTest { val mediaUploadInfo = process( asset = assetVideo, - compressIfPossible = true, + mediaOptimizationConfig = MediaOptimizationConfig( + compressImages = true, + videoCompressionPreset = VideoCompressionPreset.STANDARD, + ), ) val info = mediaUploadInfo as MediaUploadInfo.Video assertThat(info.thumbnailFile).isNotNull() @@ -315,7 +350,10 @@ class AndroidMediaPreProcessorTest { fun `test processing video no compression`() = runTest { val mediaUploadInfo = process( asset = assetVideo, - compressIfPossible = false, + mediaOptimizationConfig = MediaOptimizationConfig( + compressImages = true, + videoCompressionPreset = VideoCompressionPreset.HIGH, + ), ) val info = mediaUploadInfo as MediaUploadInfo.Video // Computing thumbnailFile is failing with Robolectric @@ -341,7 +379,10 @@ class AndroidMediaPreProcessorTest { fun `test processing audio`() = runTest { val mediaUploadInfo = process( asset = assetAudio, - compressIfPossible = true, + mediaOptimizationConfig = MediaOptimizationConfig( + compressImages = true, + videoCompressionPreset = VideoCompressionPreset.STANDARD, + ), ) val info = mediaUploadInfo as MediaUploadInfo.Audio assertThat(info.audioInfo).isEqualTo( @@ -363,7 +404,10 @@ class AndroidMediaPreProcessorTest { uri = file.toUri(), mimeType = MimeTypes.PlainText, deleteOriginal = false, - compressIfPossible = true, + mediaOptimizationConfig = MediaOptimizationConfig( + compressImages = true, + videoCompressionPreset = VideoCompressionPreset.STANDARD, + ), ) assertThat(result.isFailure).isTrue() val failure = result.exceptionOrNull() diff --git a/libraries/mediaupload/impl/src/test/kotlin/io/element/android/libraries/mediaupload/impl/VideoCompressorConfigFactoryTest.kt b/libraries/mediaupload/impl/src/test/kotlin/io/element/android/libraries/mediaupload/impl/VideoCompressorConfigFactoryTest.kt index 5050d14a3e..943e89011f 100644 --- a/libraries/mediaupload/impl/src/test/kotlin/io/element/android/libraries/mediaupload/impl/VideoCompressorConfigFactoryTest.kt +++ b/libraries/mediaupload/impl/src/test/kotlin/io/element/android/libraries/mediaupload/impl/VideoCompressorConfigFactoryTest.kt @@ -9,6 +9,7 @@ package io.element.android.libraries.mediaupload.impl import androidx.media3.transformer.VideoEncoderSettings import com.google.common.truth.Truth.assertThat +import io.element.android.libraries.preferences.api.store.VideoCompressionPreset import org.junit.Test import org.junit.runner.RunWith import org.robolectric.RobolectricTestRunner @@ -20,16 +21,16 @@ class VideoCompressorConfigFactoryTest { fun `if we don't have metadata the video will be resized`() { // Given val metadata = null - val shouldBeCompressed = false + val preset = VideoCompressionPreset.STANDARD // When val videoCompressorConfig = VideoCompressorConfigFactory.create( metadata = metadata, - shouldBeCompressed = shouldBeCompressed + preset = preset, ) // Then - assertThat(videoCompressorConfig.resizer).isNotNull() + assertThat(videoCompressorConfig.videoCompressorHelper).isNotNull() assertThat(videoCompressorConfig.newFrameRate).isEqualTo(30) assertThat(videoCompressorConfig.newBitRate).isNotEqualTo(VideoEncoderSettings.NO_VALUE) } @@ -38,71 +39,71 @@ class VideoCompressorConfigFactoryTest { fun `if the video should be compressed and is larger than 720p it will be resized`() { // Given val metadata = VideoFileMetadata(width = 1920, height = 1080, bitrate = 1_000_000, frameRate = 50, rotation = 0) - val shouldBeCompressed = true + val preset = VideoCompressionPreset.STANDARD // When val videoCompressorConfig = VideoCompressorConfigFactory.create( metadata = metadata, - shouldBeCompressed = shouldBeCompressed + preset = preset, ) // Then - assertIsResized(videoCompressorConfig) + assertIsResized(videoCompressorConfig, metadata.width) } @Test fun `if the video should be compressed and is smaller or equal to 720p it will not be resized`() { // Given val metadata = VideoFileMetadata(width = 1280, height = 720, bitrate = 1_000_000, frameRate = 50, rotation = 0) - val shouldBeCompressed = true + val preset = VideoCompressionPreset.STANDARD // When val videoCompressorConfig = VideoCompressorConfigFactory.create( metadata = metadata, - shouldBeCompressed = shouldBeCompressed + preset = preset, ) // Then - assertIsNotResized(videoCompressorConfig) + assertIsNotResized(videoCompressorConfig, 1280) } @Test fun `if the video should not be compressed and is larger than 1080p it will be resized`() { // Given val metadata = VideoFileMetadata(width = 2560, height = 1440, bitrate = 1_000_000, frameRate = 50, rotation = 0) - val shouldBeCompressed = false + val preset = VideoCompressionPreset.HIGH // When val videoCompressorConfig = VideoCompressorConfigFactory.create( metadata = metadata, - shouldBeCompressed = shouldBeCompressed + preset = preset, ) // Then - assertIsResized(videoCompressorConfig) + assertIsResized(videoCompressorConfig, metadata.width) } @Test fun `if the video should not be compressed and is smaller or equal than 1080p it will not be resized`() { // Given val metadata = VideoFileMetadata(width = 1920, height = 1080, bitrate = 1_000_000, frameRate = 50, rotation = 0) - val shouldBeCompressed = false + val preset = VideoCompressionPreset.HIGH // When val videoCompressorConfig = VideoCompressorConfigFactory.create( metadata = metadata, - shouldBeCompressed = shouldBeCompressed + preset = preset, ) // Then - assertIsNotResized(videoCompressorConfig) + assertIsNotResized(videoCompressorConfig, 1920) } - private inline fun assertIsResized(videoCompressorConfig: VideoCompressorConfig) { - assertThat(videoCompressorConfig.resizer).isNotNull() + private inline fun assertIsResized(videoCompressorConfig: VideoCompressorConfig, referenceSize: Int) { + assertThat(videoCompressorConfig.videoCompressorHelper.maxSize).isNotEqualTo(referenceSize) } - private inline fun assertIsNotResized(videoCompressorConfig: VideoCompressorConfig) { - assertThat(videoCompressorConfig.resizer).isNull() + private inline fun assertIsNotResized(videoCompressorConfig: VideoCompressorConfig, referenceSize: Int) { + assertThat(videoCompressorConfig.videoCompressorHelper.maxSize).isEqualTo(referenceSize) } } diff --git a/libraries/mediaupload/test/src/main/kotlin/io/element/android/libraries/mediaupload/test/FakeMediaOptimizationConfigProvider.kt b/libraries/mediaupload/test/src/main/kotlin/io/element/android/libraries/mediaupload/test/FakeMediaOptimizationConfigProvider.kt new file mode 100644 index 0000000000..6e5d73d305 --- /dev/null +++ b/libraries/mediaupload/test/src/main/kotlin/io/element/android/libraries/mediaupload/test/FakeMediaOptimizationConfigProvider.kt @@ -0,0 +1,21 @@ +/* + * Copyright 2025 New Vector Ltd. + * + * SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial + * Please see LICENSE files in the repository root for full details. + */ + +package io.element.android.libraries.mediaupload.test + +import io.element.android.libraries.mediaupload.api.MediaOptimizationConfig +import io.element.android.libraries.mediaupload.api.MediaOptimizationConfigProvider +import io.element.android.libraries.preferences.api.store.VideoCompressionPreset + +class FakeMediaOptimizationConfigProvider( + val config: MediaOptimizationConfig = MediaOptimizationConfig( + compressImages = true, + videoCompressionPreset = VideoCompressionPreset.STANDARD, + ) +) : MediaOptimizationConfigProvider { + override suspend fun get(): MediaOptimizationConfig = config +} diff --git a/libraries/mediaupload/test/src/main/kotlin/io/element/android/libraries/mediaupload/test/FakeMediaPreProcessor.kt b/libraries/mediaupload/test/src/main/kotlin/io/element/android/libraries/mediaupload/test/FakeMediaPreProcessor.kt index 87b739d786..cda951ff50 100644 --- a/libraries/mediaupload/test/src/main/kotlin/io/element/android/libraries/mediaupload/test/FakeMediaPreProcessor.kt +++ b/libraries/mediaupload/test/src/main/kotlin/io/element/android/libraries/mediaupload/test/FakeMediaPreProcessor.kt @@ -13,6 +13,7 @@ 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.mediaupload.api.MediaOptimizationConfig import io.element.android.libraries.mediaupload.api.MediaPreProcessor import io.element.android.libraries.mediaupload.api.MediaUploadInfo import io.element.android.tests.testutils.simulateLongTask @@ -45,7 +46,7 @@ class FakeMediaPreProcessor( uri: Uri, mimeType: String, deleteOriginal: Boolean, - compressIfPossible: Boolean + mediaOptimizationConfig: MediaOptimizationConfig, ): Result = simulateLongTask { processLatch?.await() processCallCount++ diff --git a/libraries/mediaviewer/api/src/main/kotlin/io/element/android/libraries/mediaviewer/api/MediaInfo.kt b/libraries/mediaviewer/api/src/main/kotlin/io/element/android/libraries/mediaviewer/api/MediaInfo.kt index f5440a48b6..da7944e5d1 100644 --- a/libraries/mediaviewer/api/src/main/kotlin/io/element/android/libraries/mediaviewer/api/MediaInfo.kt +++ b/libraries/mediaviewer/api/src/main/kotlin/io/element/android/libraries/mediaviewer/api/MediaInfo.kt @@ -17,6 +17,7 @@ data class MediaInfo( val filename: String, val caption: String?, val mimeType: String, + val fileSize: Long?, val formattedFileSize: String, val fileExtension: String, val senderId: UserId?, @@ -36,6 +37,7 @@ fun anImageMediaInfo( dateSentFull: String? = null, ): MediaInfo = MediaInfo( filename = "an image file.jpg", + fileSize = 4 * 1024 * 1024, caption = caption, mimeType = MimeTypes.Jpeg, formattedFileSize = "4MB", @@ -57,6 +59,7 @@ fun aVideoMediaInfo( duration: String? = null, ): MediaInfo = MediaInfo( filename = "a video file.mp4", + fileSize = 14 * 1024 * 1024, caption = caption, mimeType = MimeTypes.Mp4, formattedFileSize = "14MB", @@ -78,6 +81,7 @@ fun aPdfMediaInfo( dateSentFull: String? = null, ): MediaInfo = MediaInfo( filename = filename, + fileSize = 23 * 1024 * 1024, caption = caption, mimeType = MimeTypes.Pdf, formattedFileSize = "23MB", @@ -98,6 +102,7 @@ fun anApkMediaInfo( dateSentFull: String? = null, ): MediaInfo = MediaInfo( filename = "an apk file.apk", + fileSize = 50 * 1024 * 1024, caption = null, mimeType = MimeTypes.Apk, formattedFileSize = "50MB", @@ -121,6 +126,7 @@ fun anAudioMediaInfo( duration: String? = null, ): MediaInfo = MediaInfo( filename = filename, + fileSize = 7 * 1024 * 1024, caption = caption, mimeType = MimeTypes.Mp3, formattedFileSize = "7MB", @@ -144,6 +150,7 @@ fun aVoiceMediaInfo( duration: String? = null, ): MediaInfo = MediaInfo( filename = filename, + fileSize = 3 * 1024 * 1024, caption = caption, mimeType = MimeTypes.Ogg, formattedFileSize = "3MB", @@ -165,6 +172,7 @@ fun aTxtMediaInfo( dateSentFull: String? = null, ): MediaInfo = MediaInfo( filename = filename, + fileSize = 2 * 1024, caption = caption, mimeType = MimeTypes.PlainText, formattedFileSize = "2kB", diff --git a/libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/DefaultMediaViewerEntryPoint.kt b/libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/DefaultMediaViewerEntryPoint.kt index 64cd9093a2..2a137bb387 100644 --- a/libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/DefaultMediaViewerEntryPoint.kt +++ b/libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/DefaultMediaViewerEntryPoint.kt @@ -46,6 +46,7 @@ class DefaultMediaViewerEntryPoint @Inject constructor() : MediaViewerEntryPoint eventId = null, mediaInfo = MediaInfo( filename = filename, + fileSize = null, caption = null, mimeType = mimeType, formattedFileSize = "", diff --git a/libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/datasource/EventItemFactory.kt b/libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/datasource/EventItemFactory.kt index 705921db8b..ed39faf080 100644 --- a/libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/datasource/EventItemFactory.kt +++ b/libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/datasource/EventItemFactory.kt @@ -92,6 +92,7 @@ class EventItemFactory @Inject constructor( eventId = currentTimelineItem.eventId, mediaInfo = MediaInfo( filename = type.filename, + fileSize = type.info?.size, caption = type.caption, mimeType = type.info?.mimetype.orEmpty(), formattedFileSize = type.info?.size?.let { fileSizeFormatter.format(it) }.orEmpty(), @@ -111,6 +112,7 @@ class EventItemFactory @Inject constructor( eventId = currentTimelineItem.eventId, mediaInfo = MediaInfo( filename = type.filename, + fileSize = type.info?.size, caption = type.caption, mimeType = type.info?.mimetype.orEmpty(), formattedFileSize = type.info?.size?.let { fileSizeFormatter.format(it) }.orEmpty(), @@ -131,6 +133,7 @@ class EventItemFactory @Inject constructor( eventId = currentTimelineItem.eventId, mediaInfo = MediaInfo( filename = type.filename, + fileSize = type.info?.size, caption = type.caption, mimeType = type.info?.mimetype.orEmpty(), formattedFileSize = type.info?.size?.let { fileSizeFormatter.format(it) }.orEmpty(), @@ -151,6 +154,7 @@ class EventItemFactory @Inject constructor( eventId = currentTimelineItem.eventId, mediaInfo = MediaInfo( filename = type.filename, + fileSize = type.info?.size, caption = type.caption, mimeType = type.info?.mimetype.orEmpty(), formattedFileSize = type.info?.size?.let { fileSizeFormatter.format(it) }.orEmpty(), @@ -171,6 +175,7 @@ class EventItemFactory @Inject constructor( eventId = currentTimelineItem.eventId, mediaInfo = MediaInfo( filename = type.filename, + fileSize = type.info?.size, caption = type.caption, mimeType = type.info?.mimetype.orEmpty(), formattedFileSize = type.info?.size?.let { fileSizeFormatter.format(it) }.orEmpty(), @@ -191,6 +196,7 @@ class EventItemFactory @Inject constructor( eventId = currentTimelineItem.eventId, mediaInfo = MediaInfo( filename = type.filename, + fileSize = type.info?.size, caption = type.caption, mimeType = type.info?.mimetype.orEmpty(), formattedFileSize = type.info?.size?.let { fileSizeFormatter.format(it) }.orEmpty(), diff --git a/libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/local/AndroidLocalMediaFactory.kt b/libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/local/AndroidLocalMediaFactory.kt index b7ae566ab1..aa4b2ec53e 100644 --- a/libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/local/AndroidLocalMediaFactory.kt +++ b/libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/local/AndroidLocalMediaFactory.kt @@ -87,15 +87,17 @@ class AndroidLocalMediaFactory @Inject constructor( ): LocalMedia { val resolvedMimeType = mimeType ?: context.getMimeType(uri) ?: MimeTypes.OctetStream val fileName = name ?: context.getFileName(uri) ?: "" - val fileSize = formattedFileSize ?: fileSizeFormatter.format(context.getFileSize(uri)) + val fileSize = context.getFileSize(uri) + val calculatedFormattedFileSize = formattedFileSize ?: fileSizeFormatter.format(fileSize) val fileExtension = fileExtensionExtractor.extractFromName(fileName) return LocalMedia( uri = uri, info = MediaInfo( mimeType = resolvedMimeType, filename = fileName, + fileSize = fileSize, caption = caption, - formattedFileSize = fileSize, + formattedFileSize = calculatedFormattedFileSize, fileExtension = fileExtension, senderId = senderId, senderName = senderName, diff --git a/libraries/mediaviewer/impl/src/test/kotlin/io/element/android/libraries/mediaviewer/impl/datasource/DefaultEventItemFactoryTest.kt b/libraries/mediaviewer/impl/src/test/kotlin/io/element/android/libraries/mediaviewer/impl/datasource/DefaultEventItemFactoryTest.kt index 16e6057df6..457907793f 100644 --- a/libraries/mediaviewer/impl/src/test/kotlin/io/element/android/libraries/mediaviewer/impl/datasource/DefaultEventItemFactoryTest.kt +++ b/libraries/mediaviewer/impl/src/test/kotlin/io/element/android/libraries/mediaviewer/impl/datasource/DefaultEventItemFactoryTest.kt @@ -155,6 +155,7 @@ class DefaultEventItemFactoryTest { mediaInfo = MediaInfo( mimeType = MimeTypes.Apk, filename = "filename.apk", + fileSize = 123L, caption = "caption", formattedFileSize = "123 Bytes", fileExtension = "apk", @@ -205,6 +206,7 @@ class DefaultEventItemFactoryTest { mediaInfo = MediaInfo( mimeType = MimeTypes.Jpeg, filename = "filename.jpg", + fileSize = 123L, caption = "caption", formattedFileSize = "123 Bytes", fileExtension = "jpg", @@ -252,6 +254,7 @@ class DefaultEventItemFactoryTest { mediaInfo = MediaInfo( mimeType = MimeTypes.Mp3, filename = "filename.mp3", + fileSize = 123L, caption = "caption", formattedFileSize = "123 Bytes", fileExtension = "mp3", @@ -303,6 +306,7 @@ class DefaultEventItemFactoryTest { mediaInfo = MediaInfo( mimeType = MimeTypes.Mp4, filename = "filename.mp4", + fileSize = 123L, caption = "caption", formattedFileSize = "123 Bytes", fileExtension = "mp4", @@ -354,6 +358,7 @@ class DefaultEventItemFactoryTest { mediaInfo = MediaInfo( mimeType = MimeTypes.Ogg, filename = "filename.ogg", + fileSize = 123L, caption = "caption", formattedFileSize = "123 Bytes", fileExtension = "ogg", @@ -404,6 +409,7 @@ class DefaultEventItemFactoryTest { mediaInfo = MediaInfo( mimeType = MimeTypes.Gif, filename = "filename.gif", + fileSize = 123L, caption = "caption", formattedFileSize = "123 Bytes", fileExtension = "gif", diff --git a/libraries/mediaviewer/impl/src/test/kotlin/io/element/android/libraries/mediaviewer/impl/datasource/TimelineMediaGalleryDataSourceTest.kt b/libraries/mediaviewer/impl/src/test/kotlin/io/element/android/libraries/mediaviewer/impl/datasource/TimelineMediaGalleryDataSourceTest.kt index 20208a55dc..7e9f1870f5 100644 --- a/libraries/mediaviewer/impl/src/test/kotlin/io/element/android/libraries/mediaviewer/impl/datasource/TimelineMediaGalleryDataSourceTest.kt +++ b/libraries/mediaviewer/impl/src/test/kotlin/io/element/android/libraries/mediaviewer/impl/datasource/TimelineMediaGalleryDataSourceTest.kt @@ -232,6 +232,7 @@ class TimelineMediaGalleryDataSourceTest { eventId = AN_EVENT_ID, mediaInfo = MediaInfo( filename = "body.jpg", + fileSize = 888L, caption = "body.jpg caption", mimeType = MimeTypes.Jpeg, formattedFileSize = "888 Bytes", diff --git a/libraries/mediaviewer/impl/src/test/kotlin/io/element/android/libraries/mediaviewer/impl/local/AndroidLocalMediaFactoryTest.kt b/libraries/mediaviewer/impl/src/test/kotlin/io/element/android/libraries/mediaviewer/impl/local/AndroidLocalMediaFactoryTest.kt index 48c636297b..e092f5c624 100644 --- a/libraries/mediaviewer/impl/src/test/kotlin/io/element/android/libraries/mediaviewer/impl/local/AndroidLocalMediaFactoryTest.kt +++ b/libraries/mediaviewer/impl/src/test/kotlin/io/element/android/libraries/mediaviewer/impl/local/AndroidLocalMediaFactoryTest.kt @@ -40,6 +40,8 @@ class AndroidLocalMediaFactoryTest { assertThat(result.info).isEqualTo( MediaInfo( filename = "an image file.jpg", + // MediaFile does not provide file size in this test + fileSize = 0L, caption = null, mimeType = MimeTypes.Jpeg, formattedFileSize = "4MB", diff --git a/libraries/mediaviewer/test/src/main/kotlin/io/element/android/libraries/mediaviewer/test/FakeLocalMediaFactory.kt b/libraries/mediaviewer/test/src/main/kotlin/io/element/android/libraries/mediaviewer/test/FakeLocalMediaFactory.kt index f1ebbd04e9..a9e962bac4 100644 --- a/libraries/mediaviewer/test/src/main/kotlin/io/element/android/libraries/mediaviewer/test/FakeLocalMediaFactory.kt +++ b/libraries/mediaviewer/test/src/main/kotlin/io/element/android/libraries/mediaviewer/test/FakeLocalMediaFactory.kt @@ -29,10 +29,16 @@ class FakeLocalMediaFactory( return aLocalMedia(uri = localMediaUri, mediaInfo = mediaInfo) } - override fun createFromUri(uri: Uri, mimeType: String?, name: String?, formattedFileSize: String?): LocalMedia { + override fun createFromUri( + uri: Uri, + mimeType: String?, + name: String?, + formattedFileSize: String? + ): LocalMedia { val safeName = name ?: fallbackName val mediaInfo = MediaInfo( filename = safeName, + fileSize = null, caption = null, mimeType = mimeType ?: fallbackMimeType, formattedFileSize = formattedFileSize ?: fallbackFileSize, diff --git a/libraries/preferences/api/src/main/kotlin/io/element/android/libraries/preferences/api/store/SessionPreferencesStore.kt b/libraries/preferences/api/src/main/kotlin/io/element/android/libraries/preferences/api/store/SessionPreferencesStore.kt index 47fb86af56..4cc16b3056 100644 --- a/libraries/preferences/api/src/main/kotlin/io/element/android/libraries/preferences/api/store/SessionPreferencesStore.kt +++ b/libraries/preferences/api/src/main/kotlin/io/element/android/libraries/preferences/api/store/SessionPreferencesStore.kt @@ -28,8 +28,11 @@ interface SessionPreferencesStore { suspend fun setSkipSessionVerification(skip: Boolean) fun isSessionVerificationSkipped(): Flow - suspend fun setCompressMedia(compress: Boolean) - fun doesCompressMedia(): Flow + suspend fun setOptimizeImages(compress: Boolean) + fun doesOptimizeImages(): Flow + + suspend fun setVideoCompressionPreset(preset: VideoCompressionPreset) + fun getVideoCompressionPreset(): Flow suspend fun clear() } diff --git a/libraries/preferences/api/src/main/kotlin/io/element/android/libraries/preferences/api/store/VideoCompressionPreset.kt b/libraries/preferences/api/src/main/kotlin/io/element/android/libraries/preferences/api/store/VideoCompressionPreset.kt new file mode 100644 index 0000000000..d68a53a1a5 --- /dev/null +++ b/libraries/preferences/api/src/main/kotlin/io/element/android/libraries/preferences/api/store/VideoCompressionPreset.kt @@ -0,0 +1,22 @@ +/* + * Copyright 2025 New Vector Ltd. + * + * SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial + * Please see LICENSE files in the repository root for full details. + */ + +package io.element.android.libraries.preferences.api.store + +/** + * Video compression presets to use when processing videos before uploading them. + */ +enum class VideoCompressionPreset { + /** High quality compression, suitable for high-resolution videos. */ + HIGH, + + /** Standard quality compression, suitable for most videos. */ + STANDARD, + + /** Low quality compression, suitable for low-resolution videos or when bandwidth is a concern. */ + LOW +} diff --git a/libraries/preferences/impl/src/main/kotlin/io/element/android/libraries/preferences/impl/store/DefaultSessionPreferencesStore.kt b/libraries/preferences/impl/src/main/kotlin/io/element/android/libraries/preferences/impl/store/DefaultSessionPreferencesStore.kt index 4b9363da0e..3d6cd266b1 100644 --- a/libraries/preferences/impl/src/main/kotlin/io/element/android/libraries/preferences/impl/store/DefaultSessionPreferencesStore.kt +++ b/libraries/preferences/impl/src/main/kotlin/io/element/android/libraries/preferences/impl/store/DefaultSessionPreferencesStore.kt @@ -12,12 +12,15 @@ import androidx.datastore.preferences.core.PreferenceDataStoreFactory 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.preferencesDataStoreFile import io.element.android.libraries.androidutils.file.safeDelete import io.element.android.libraries.androidutils.hash.hash +import io.element.android.libraries.core.data.tryOrNull import io.element.android.libraries.di.annotations.SessionCoroutineScope import io.element.android.libraries.matrix.api.core.SessionId import io.element.android.libraries.preferences.api.store.SessionPreferencesStore +import io.element.android.libraries.preferences.api.store.VideoCompressionPreset import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.map @@ -41,7 +44,8 @@ class DefaultSessionPreferencesStore( private val sendTypingNotificationsKey = booleanPreferencesKey("sendTypingNotifications") private val renderTypingNotificationsKey = booleanPreferencesKey("renderTypingNotifications") private val skipSessionVerification = booleanPreferencesKey("skipSessionVerification") - private val compressMedia = booleanPreferencesKey("compressMedia") + private val compressImages = booleanPreferencesKey("compressMedia") + private val compressMediaPreset = stringPreferencesKey("compressMediaPreset") private val dataStoreFile = storeFile(context, sessionId) private val store = PreferenceDataStoreFactory.create( @@ -82,8 +86,12 @@ class DefaultSessionPreferencesStore( override suspend fun setSkipSessionVerification(skip: Boolean) = update(skipSessionVerification, skip) override fun isSessionVerificationSkipped(): Flow = get(skipSessionVerification) { false } - override suspend fun setCompressMedia(compress: Boolean) = update(compressMedia, compress) - override fun doesCompressMedia(): Flow = get(compressMedia) { true } + override suspend fun setOptimizeImages(compress: Boolean) = update(compressImages, compress) + override fun doesOptimizeImages(): Flow = get(compressImages) { true } + + override suspend fun setVideoCompressionPreset(preset: VideoCompressionPreset) = update(compressMediaPreset, preset.name) + override fun getVideoCompressionPreset(): Flow = get(compressMediaPreset) { VideoCompressionPreset.STANDARD.name } + .map { tryOrNull { VideoCompressionPreset.valueOf(it) } ?: VideoCompressionPreset.STANDARD } override suspend fun clear() { dataStoreFile.safeDelete() diff --git a/libraries/preferences/test/src/main/kotlin/io/element/android/libraries/preferences/test/InMemorySessionPreferencesStore.kt b/libraries/preferences/test/src/main/kotlin/io/element/android/libraries/preferences/test/InMemorySessionPreferencesStore.kt index 15b93152cb..e5e1923f7b 100644 --- a/libraries/preferences/test/src/main/kotlin/io/element/android/libraries/preferences/test/InMemorySessionPreferencesStore.kt +++ b/libraries/preferences/test/src/main/kotlin/io/element/android/libraries/preferences/test/InMemorySessionPreferencesStore.kt @@ -8,6 +8,7 @@ package io.element.android.libraries.preferences.test import io.element.android.libraries.preferences.api.store.SessionPreferencesStore +import io.element.android.libraries.preferences.api.store.VideoCompressionPreset import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.MutableStateFlow @@ -19,6 +20,7 @@ class InMemorySessionPreferencesStore( isRenderTypingNotificationsEnabled: Boolean = true, isSessionVerificationSkipped: Boolean = false, doesCompressMedia: Boolean = true, + videoCompressionPreset: VideoCompressionPreset = VideoCompressionPreset.STANDARD, ) : SessionPreferencesStore { private val isSharePresenceEnabled = MutableStateFlow(isSharePresenceEnabled) private val isSendPublicReadReceiptsEnabled = MutableStateFlow(isSendPublicReadReceiptsEnabled) @@ -27,6 +29,7 @@ class InMemorySessionPreferencesStore( private val isRenderTypingNotificationsEnabled = MutableStateFlow(isRenderTypingNotificationsEnabled) private val isSessionVerificationSkipped = MutableStateFlow(isSessionVerificationSkipped) private val doesCompressMedia = MutableStateFlow(doesCompressMedia) + private val videoCompressionPreset = MutableStateFlow(videoCompressionPreset) var clearCallCount = 0 private set @@ -68,9 +71,17 @@ class InMemorySessionPreferencesStore( return isSessionVerificationSkipped } - override suspend fun setCompressMedia(compress: Boolean) = doesCompressMedia.emit(compress) + override suspend fun setOptimizeImages(compress: Boolean) = doesCompressMedia.emit(compress) - override fun doesCompressMedia(): Flow = doesCompressMedia + override fun doesOptimizeImages(): Flow = doesCompressMedia + + override suspend fun setVideoCompressionPreset(preset: VideoCompressionPreset) { + videoCompressionPreset.value = preset + } + + override fun getVideoCompressionPreset(): Flow { + return videoCompressionPreset + } override suspend fun clear() { clearCallCount++ diff --git a/libraries/push/impl/src/main/res/values-sv/translations.xml b/libraries/push/impl/src/main/res/values-sv/translations.xml index fd3739915f..aff078b2c0 100644 --- a/libraries/push/impl/src/main/res/values-sv/translations.xml +++ b/libraries/push/impl/src/main/res/values-sv/translations.xml @@ -13,6 +13,7 @@ "%d avisering" "%d aviseringar" + "Du har nya meddelanden." "📹 Inkommande samtal" "** Misslyckades att skicka - vänligen öppna rummet" "Gå med" diff --git a/libraries/textcomposer/impl/src/main/kotlin/io/element/android/libraries/textcomposer/CaptionWarningBottomSheet.kt b/libraries/textcomposer/impl/src/main/kotlin/io/element/android/libraries/textcomposer/CaptionWarningBottomSheet.kt index edbbfc0a65..4154d7a594 100644 --- a/libraries/textcomposer/impl/src/main/kotlin/io/element/android/libraries/textcomposer/CaptionWarningBottomSheet.kt +++ b/libraries/textcomposer/impl/src/main/kotlin/io/element/android/libraries/textcomposer/CaptionWarningBottomSheet.kt @@ -48,7 +48,7 @@ fun CaptionWarningBottomSheet( style = BigIcon.Style.AlertSolid, ) Text( - text = stringResource(CommonStrings.screen_media_upload_preview_caption_warning), + text = stringResource(R.string.screen_media_upload_preview_caption_warning), style = ElementTheme.typography.fontBodyMdRegular, color = ElementTheme.colors.textPrimary, textAlign = TextAlign.Center, 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 9693f64835..4bcacafeb7 100644 --- a/libraries/textcomposer/impl/src/main/res/values-cs/translations.xml +++ b/libraries/textcomposer/impl/src/main/res/values-cs/translations.xml @@ -2,7 +2,7 @@ "Přidat přílohu" "Přepnout seznam s odrážkami" - "Zavřít možnosti formátování" + "Zrušit a zavřít formátování textu" "Přepnout blok kódu" "Volitelný titulek…" "Šifrovaná zpráva…" 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 18a724a4b2..c7b4581eab 100644 --- a/libraries/textcomposer/impl/src/main/res/values-nb/translations.xml +++ b/libraries/textcomposer/impl/src/main/res/values-nb/translations.xml @@ -2,7 +2,7 @@ "Legg til vedlegg" "Aktiver/deaktiver punktliste" - "Lukk formateringsvalg" + "Avbryt og lukk formateringsvalg" "Aktiver kodeblokk" "Legg til en tekstbeskrivelse" "Kryptert melding…" 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 721812d60c..6c83c6e513 100644 --- a/libraries/textcomposer/impl/src/main/res/values-sv/translations.xml +++ b/libraries/textcomposer/impl/src/main/res/values-sv/translations.xml @@ -2,7 +2,7 @@ "Lägg till bilaga" "Växla punktlista" - "Stäng formateringsalternativ" + "Avbryt och stäng textformatering" "Växla kodblock" "Lägg till en bildtext" "Krypterat meddelande …" @@ -10,8 +10,12 @@ "Okrypterat meddelande …" "Skapa en länk" "Redigera länk" + "%1$s, läge: %2$s" "Använd fetstil" "Använd kursiv stil" + "inaktiverad" + "av" + "på" "Använda genomstryken stil" "Använd understruken stil" "Växla helskärmsläge" diff --git a/libraries/textcomposer/impl/src/main/res/values/localazy.xml b/libraries/textcomposer/impl/src/main/res/values/localazy.xml index 89331da7ed..a9e0ca3540 100644 --- a/libraries/textcomposer/impl/src/main/res/values/localazy.xml +++ b/libraries/textcomposer/impl/src/main/res/values/localazy.xml @@ -28,5 +28,6 @@ "Remove link" "Unindent" "Link" + "Captions might not be visible to people using older apps." "Hold to record" diff --git a/libraries/ui-strings/src/main/res/values-be/translations.xml b/libraries/ui-strings/src/main/res/values-be/translations.xml index 0a508dfd5e..b964fff4c0 100644 --- a/libraries/ui-strings/src/main/res/values-be/translations.xml +++ b/libraries/ui-strings/src/main/res/values-be/translations.xml @@ -209,6 +209,8 @@ "%d галасоў" "Палітыка прыватнасці" + "Прыватны пакой" + "Публічны пакой" "Рэакцыя" "Рэакцыі" "Ключ аднаўлення" @@ -295,8 +297,6 @@ "%1$s Android" "Паведаміць аб памылцы з дапамогай Rageshake" "Не ўдалося выбраць носьбіт, паўтарыце спробу." - "Не атрымалася апрацаваць медыяфайл для загрузкі, паспрабуйце яшчэ раз." - "Не атрымалася загрузіць медыяфайлы, паспрабуйце яшчэ раз." "Націсніце на паведамленне і абярыце «%1$s », каб уключыць сюды." "Замацуеце важныя паведамленні, каб іх можна было лёгка знайсці" diff --git a/libraries/ui-strings/src/main/res/values-bg/translations.xml b/libraries/ui-strings/src/main/res/values-bg/translations.xml index f6f999a1a1..153476931b 100644 --- a/libraries/ui-strings/src/main/res/values-bg/translations.xml +++ b/libraries/ui-strings/src/main/res/values-bg/translations.xml @@ -175,6 +175,8 @@ "%d гласа" "Политика за поверителност" + "Частна стая" + "Общодостъпна стая" "Реакция" "Реакции" "Причина" diff --git a/libraries/ui-strings/src/main/res/values-cs/translations.xml b/libraries/ui-strings/src/main/res/values-cs/translations.xml index 7091d73b8b..5a67d92b4f 100644 --- a/libraries/ui-strings/src/main/res/values-cs/translations.xml +++ b/libraries/ui-strings/src/main/res/values-cs/translations.xml @@ -8,11 +8,19 @@ "zadány %1$d číslice" "zadáno %1$d číslic" + "Upravit avatar" + "Úplná adresa bude %1$s" + "Podrobnosti o šifrování" "Skrýt heslo" "Připojit se k hovoru" "Přejít dolů" + "Přesunout mapu na mou polohu" "Pouze zmínky" "Ztišeno" + "Nové zmínky" + "Nové zprávy" + "Probíhající hovor" + "Avatar jiného uživatele" "Strana %1$d" "Pozastavit" "Hlasová zpráva, délka: %1$s, aktuální pozice: %2$s" @@ -32,14 +40,20 @@ "Klepnutím zobrazíte vše" "Odstraňit reakci s %1$s" "Odstranit reakci pomocí %1$s" + "Avatar místnosti" "Odeslat soubory" "Zobrazit heslo" "Zahájit hovor" + "Vyžaduje se časově omezená akce" + "Místnost s náhrobkem" + "Avatar uživatele" "Uživatelské menu" + "Zobrazit avatar" "Zobrazit podrobnosti" "Hlasová zpráva, délka: %1$s" "Nahrajte hlasovou zprávu." "Zastavit nahrávání" + "Váš avatar" "Přijmout" "Přidat titulek" "Přidat na časovou osu" @@ -98,6 +112,7 @@ "Ne" "Teď ne" "OK" + "Otevřít kontextovou nabídku" "Otevřít nastavení" "Otevřít v aplikaci" "Pin" @@ -122,7 +137,9 @@ "Uložit" "Hledat" "Odeslat" + "Odeslat upravenou zprávu" "Odeslat zprávu" + "Odeslat hlasovou zprávu" "Sdílet" "Sdílet odkaz" "Zobrazit" @@ -138,6 +155,7 @@ "Klepnutím zobrazíte možnosti" "Zkusit znovu" "Odepnout" + "Zobrazit" "Zobrazit na časové ose" "Zobrazit zdroj" "Ano" @@ -243,6 +261,8 @@ Důvod: %1$s." "%d hlasů" "Zásady ochrany osobních údajů" + "Soukromá místnost" + "Veřejná místnost" "Reakce" "Reakce" "Důvod" @@ -336,6 +356,7 @@ Opravdu chcete pokračovat?" "Načítání zpráv se nezdařilo" "%1$s nemá přístup k vaší poloze. Zkuste to prosím později." "Nepodařilo se nahrát hlasovou zprávu." + "Místnost již neexistuje nebo pozvánka již není platná." "Zpráva nebyla nalezena" "%1$s nemá oprávnění k přístupu k vaší poloze. Přístup můžete povolit v Nastavení." "%1$s nemá oprávnění k přístupu k vaší poloze. Povolit přístup níže." @@ -356,14 +377,12 @@ Opravdu chcete pokračovat?" "Ahoj, ozvi se mi na %1$s: %2$s" "%1$s Android" "Zatřeste zařízením pro nahlášení chyby" + "Snímek obrazovky" "%1$s: %2$s" "Možnosti" "Odstranit %1$s" "Nastavení" "Výběr média se nezdařil, zkuste to prosím znovu." - "Titulky nemusí být viditelné pro lidi, kteří používají starší aplikace." - "Nahrání média se nezdařilo, zkuste to prosím znovu." - "Nahrání média se nezdařilo, zkuste to prosím znovu." "Přidržte zprávu a vyberte „%1$s“, kterou chcete zahrnout sem." "Připněte důležité zprávy, aby je bylo možné snadno najít" diff --git a/libraries/ui-strings/src/main/res/values-cy/translations.xml b/libraries/ui-strings/src/main/res/values-cy/translations.xml index 8d99640979..bf4c9a67c6 100644 --- a/libraries/ui-strings/src/main/res/values-cy/translations.xml +++ b/libraries/ui-strings/src/main/res/values-cy/translations.xml @@ -273,6 +273,8 @@ Rheswm: %1$s." "%d pleidlais" "Polisi preifatrwydd" + "Ystafell breifat" + "Ystafell gyhoeddus" "Adwaith" "Adweithiau" "Rheswm" @@ -389,9 +391,6 @@ Ydych chi\'n siŵr eich bod am barhau?" "Tynnu %1$s" "Gosodiadau" "Wedi methu dewis cyfrwng, ceisiwch eto." - "Efallai na fydd capsiynau yn weladwy i bobl sy\'n defnyddio apiau hŷn." - "Wedi methu â phrosesu cyfryngau i\'w llwytho, ceisiwch eto." - "Wedi methu llwytho cyfryngau, ceisiwch eto." "Pwyswch ar neges a dewis “%1$s” i\'w cynnwys yma." "Pinio negeseuon pwysig fel y mae modd eu darganfod yn hawdd" 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 bfe4ac5b37..7a9270ff4a 100644 --- a/libraries/ui-strings/src/main/res/values-da/translations.xml +++ b/libraries/ui-strings/src/main/res/values-da/translations.xml @@ -257,6 +257,8 @@ "Forbereder…" "Privatlivspolitik" + "Privat rum" + "Offentligt rum" "Reaktion" "Reaktioner" "Årsag" @@ -377,12 +379,6 @@ Er du sikker på, at du vil fortsætte?" "Fjern %1$s" "Indstillinger" "Det lykkedes ikke at vælge medie. Prøv igen." - "Billedtekster er muligvis ikke synlige for personer, der bruger ældre apps." - "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." "Tryk på en besked og vælg \"%1$s\" for at inkludere den her." "Fastgør vigtige beskeder, så de let kan opdages" diff --git a/libraries/ui-strings/src/main/res/values-de/translations.xml b/libraries/ui-strings/src/main/res/values-de/translations.xml index 61ce7a003c..3bd2cd518a 100644 --- a/libraries/ui-strings/src/main/res/values-de/translations.xml +++ b/libraries/ui-strings/src/main/res/values-de/translations.xml @@ -253,6 +253,8 @@ Grund: %1$s." "%d Stimmen" "Datenschutz­erklärung" + "Privater Chatroom" + "Öffentlicher Raum" "Reaktion" "Reaktionen" "Grund" @@ -373,9 +375,6 @@ Möchten Sie wirklich fortfahren?" "Entferne %1$s" "Einstellungen" "Medienauswahl fehlgeschlagen, bitte versuche es erneut." - "Bildunterschriften sind für Nutzer älterer Apps möglicherweise nicht sichtbar." - "Fehler beim Verarbeiten des hochgeladenen Mediums. Bitte versuche es erneut." - "Das Hochladen der Medien ist fehlgeschlagen. Bitte versuche es erneut." "Drücke auf eine Nachricht und wähle “%1$s”, um sie hier einzufügen." "Fixiere wichtige Nachrichten, so dass sie leicht gefunden werden können" diff --git a/libraries/ui-strings/src/main/res/values-el/translations.xml b/libraries/ui-strings/src/main/res/values-el/translations.xml index a9b1e15f7a..5085f404a1 100644 --- a/libraries/ui-strings/src/main/res/values-el/translations.xml +++ b/libraries/ui-strings/src/main/res/values-el/translations.xml @@ -238,6 +238,8 @@ "%d ψήφοι" "Πολιτική απορρήτου" + "Ιδιωτική αίθουσα" + "Δημόσια αίθουσα" "Αντίδραση" "Αντιδράσεις" "Αιτιολογία" @@ -358,9 +360,6 @@ "Αφαίρεση %1$s" "Ρυθμίσεις" "Αποτυχία επιλογής πολυμέσου, δοκίμασε ξανά." - "Οι λεζάντες ενδέχεται να μην είναι ορατές σε άτομα που χρησιμοποιούν παλαιότερες εφαρμογές." - "Αποτυχία μεταφόρτωσης μέσου, δοκίμασε ξανά." - "Αποτυχία μεταφόρτωσης πολυμέσων, δοκίμασε ξανά." "Πάτα σε ένα μήνυμα και επέλεξε «%1$s» για να συμπεριληφθεί εδώ." "Καρφίτσωσε σημαντικά μηνύματα, ώστε να μπορούν να εντοπιστούν εύκολα" diff --git a/libraries/ui-strings/src/main/res/values-es/translations.xml b/libraries/ui-strings/src/main/res/values-es/translations.xml index 06b0270525..4428e0b864 100644 --- a/libraries/ui-strings/src/main/res/values-es/translations.xml +++ b/libraries/ui-strings/src/main/res/values-es/translations.xml @@ -235,6 +235,8 @@ Motivo: %1$s." "%d votos" "Política de privacidad" + "Sala privada" + "Sala pública" "Reacción" "Reacciones" "Motivo" @@ -344,9 +346,6 @@ Motivo: %1$s." "%1$s Android" "Agitar con fuerza para informar de un error" "Error al seleccionar archivos multimedia, por favor inténtalo de nuevo." - "Es posible que las leyendas no sean visibles para las personas que usan aplicaciones más antiguas." - "Error al procesar el contenido multimedia, por favor inténtalo de nuevo." - "Error al subir el contenido multimedia, por favor inténtalo de nuevo." "Presiona sobre un mensaje y selecciona «%1$s» para incluirlo aquí." "Fija los mensajes importantes para que se puedan descubrir fácilmente" 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 cea72f55a5..8c3a72156e 100644 --- a/libraries/ui-strings/src/main/res/values-et/translations.xml +++ b/libraries/ui-strings/src/main/res/values-et/translations.xml @@ -257,6 +257,10 @@ Põhjus: %1$s." "Ettevalmistamisel…" "Privaatsuspoliitika" + "Privaatne jututuba" + "Privaatne kogukond" + "Avalik jututuba" + "Avalik kogukond" "Reaktsioon" "Reaktsioonid" "Põhjus" @@ -274,6 +278,10 @@ Põhjus: %1$s." "Jututuba" "Jututoa nimi" "näiteks sinu projekti või seltsingu nimi" + + "%1$d jututuba" + "%1$d jututuba" + "Muudatused on salvestatud" "Salvestame" "Ekraanilukk" @@ -293,6 +301,10 @@ Põhjus: %1$s." "Logime välja" "Midagi läks valesti" "Tekkis viga. Palun proovi uuesti." + + "%1$d kogukond" + "%1$d kogukonda" + "Alustame vestlust…" "Kleeps" "Õnnestus" @@ -378,12 +390,6 @@ Kas sa oled kindel, et soovid jätkata?" "Kustuta: %1$s" "Seadistused" "Meediafaili valimine ei õnnestunud. Palun proovi uuesti." - "Selgitused ja alapealkirjad ei pruugi olla nähtavad vanemate rakenduste kasutajatele." - "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" "Siia lisamiseks vajuta sõnumil ja vali „%1$s“." "Et olulisi sõnumeid oleks lihtsam leida, tõsta nad esile" @@ -418,6 +424,9 @@ Kas sa oled kindel, et soovid jätkata?" "Ava Google Mapsis" "Ava OpenStreetMapis" "Jaga seda asukohta" + "Sinu loodud kogukonnad ning need, millega oled liitunud." + "%1$s • %2$s" + "Kogukonnad" "Sõnum on saatmata, kuna kasutaja %1$s verifitseeritud identiteet on lähtestatud." "Sõnum on saatmata, kuna %1$s pole verifitseerinud kõiki oma seadmeid." "Kuna sa pole üks või enamgi oma seadet verifitseerinud, siis sinu sõnum on saatmata." 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 38cd755a78..03f2459129 100644 --- a/libraries/ui-strings/src/main/res/values-eu/translations.xml +++ b/libraries/ui-strings/src/main/res/values-eu/translations.xml @@ -228,6 +228,8 @@ Arrazoia: %1$s." "%d boto" "Pribatutasun-politika" + "Gela pribatua" + "Gela publikoa" "Erreakzioa" "Erreakzioak" "Arrazoia" @@ -323,7 +325,6 @@ Arrazoia: %1$s." "%1$s Android" "Astindu erroreen berri emateko" "Huts egin du multimedia aukeratzeak, saiatu berriro." - "Huts egin du multimedia igotzeak, saiatu berriro." "Finkatutako mezuak" "Bidali mezua hala ere" "%2$s(e)tik %1$s" 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 5535c5c310..16a95e9f78 100644 --- a/libraries/ui-strings/src/main/res/values-fa/translations.xml +++ b/libraries/ui-strings/src/main/res/values-fa/translations.xml @@ -231,6 +231,8 @@ "نتیجه‌ها پس از پایان نظرسنجی نشان داده خواهند شد" "آماده سازی…" "سیاست محرمانگی" + "اتاق خصوصی" + "اتاق عمومی" "واکنش" "واکنش‌ها" "دلیل" @@ -332,8 +334,6 @@ "گزینه‌ها" "تنظیمات" "گزینش رسانه شکست خورد. لطفاً دوباره تلاش کنید." - "پردازش رسانه برای بارگذاری شکست خورد. لطفاً دوباره تلاش کنید." - "بارگذاری رسانه شکست خورد. لطفاً دوباره تلاش کنید." "پیام‌های سنجاق شده" "داردید برای بازنشانی هویتتان به حساب %1$s می‌روید. پس از آن به کاره برگردانده خواهید شد." "فرستادن پیام به هر روی" diff --git a/libraries/ui-strings/src/main/res/values-fi/translations.xml b/libraries/ui-strings/src/main/res/values-fi/translations.xml index 6779564575..6ebf3b84e1 100644 --- a/libraries/ui-strings/src/main/res/values-fi/translations.xml +++ b/libraries/ui-strings/src/main/res/values-fi/translations.xml @@ -224,8 +224,8 @@ Syy: %1$s." "%d muuta" - "%1$d jäsen" - "%1$d jäsentä" + "%1$d Jäsen" + "%1$d Jäsentä" "Viesti" "Viestitoiminnot" @@ -257,6 +257,10 @@ Syy: %1$s." "Valmistellaan…" "Tietosuojakäytäntö" + "Yksityinen huone" + "Yksityinen tila" + "Julkinen huone" + "Julkinen tila" "Reaktio" "Reaktiot" "Syy" @@ -274,6 +278,10 @@ Syy: %1$s." "Huone" "Huoneen nimi" "esim. projektisi nimi" + + "%1$d Huone" + "%1$d Huonetta" + "Muutokset tallennettu" "Tallennetaan" "Näyttölukko" @@ -293,6 +301,10 @@ Syy: %1$s." "Kirjaudutaan ulos" "Jokin meni pieleen" "Kohtasimme ongelman. Yritä uudelleen." + + "%1$d Tila" + "%1$d Tilaa" + "Aloitetaan keskustelua…" "Tarra" "Onnistui" @@ -378,12 +390,6 @@ Haluatko varmasti jatkaa?" "Poista %1$s" "Asetukset" "Median valinta epäonnistui, yritä uudelleen." - "Kuvatekstit eivät välttämättä näy ihmisille, jotka käyttävät vanhempia sovelluksia." - "Tiedostoa ei voitu lähettää." - "Median käsittely epäonnistui, yritä uudelleen." - "Median lähettäminen epäonnistui, yritä uudelleen." - "Suurin sallittu tiedostokoko on %1$s." - "Tiedosto on liian suuri lähetettäväksi" "Paina viestiä ja valitse “%1$s” lisätäksesi sen tänne." "Kiinnitä tärkeät viestit, jotta ne löytyvät helposti." @@ -401,6 +407,7 @@ Haluatko varmasti jatkaa?" "Viestiäsi ei lähetetty, koska %1$s ei ole vahvistanut kaikkia laitteitaan." "Yksi tai useampi laitteistasi on vahvistamaton. Voit lähettää viestin silti tai peruuttaa sen toistaiseksi ja yrittää uudelleen myöhemmin, kun olet vahvistanut kaikki laitteesi." "Viestiäsi ei lähetetty, koska et ole vahvistanut yhtä tai useampaa laitettasi." + "Muokkaa ylläpitäjiä tai omistajia" "Median käsittely epäonnistui, yritä uudelleen." "Käyttäjän tietojen hakeminen epäonnistui" "Viesti huoneessa %1$s" @@ -418,6 +425,9 @@ Haluatko varmasti jatkaa?" "Avaa Google Mapsissa" "Avaa OpenStreetMapissa" "Jaa tämä sijainti" + "Luomasi tai liittymäsi tilat." + "%1$s • %2$s" + "Tilat" "Viestiä ei lähetetty, koska käyttäjän %1$s vahvistettu identiteetti nollattiin." "Viestiä ei lähetetty, koska %1$s ei ole vahvistanut kaikkia laitteitaan." "Viestiä ei lähetetty, koska et ole vahvistanut yhtä tai useampaa laitettasi." 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 aa2ff62bd9..bde9f7500f 100644 --- a/libraries/ui-strings/src/main/res/values-fr/translations.xml +++ b/libraries/ui-strings/src/main/res/values-fr/translations.xml @@ -257,6 +257,8 @@ Raison : %1$s." "Préparation…" "Politique de confidentialité" + "Salon privé" + "Salon public" "Réaction" "Réactions" "Raison" @@ -378,12 +380,6 @@ Raison : %1$s." "Supprimer %1$s" "Paramètres" "Échec de la sélection du média, veuillez réessayer." - "Les légendes peuvent ne pas être visibles pour les utilisateurs d’anciennes applications." - "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é." "Cliquez (clic long) sur un message et choisissez « %1$s » pour qu‘il apparaisse ici." "Épinglez les messages importants pour leur donner plus de visibilité" 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 7b6de4520a..e68ffe8939 100644 --- a/libraries/ui-strings/src/main/res/values-hu/translations.xml +++ b/libraries/ui-strings/src/main/res/values-hu/translations.xml @@ -255,7 +255,12 @@ Ok: %1$s." "%d szavazat" "%d szavazat" + "Előkészítés…" "Adatvédelmi nyilatkozat" + "Privát szoba" + "Privát tér" + "Nyilvános szoba" + "Nyilvános tér" "Reakció" "Reakciók" "Ok" @@ -272,6 +277,10 @@ Ok: %1$s." "Szoba" "Szoba neve" "például a projektje neve" + + "%1$d szoba" + "%1$d szoba" + "Mentett módosítások" "Mentés" "Képernyőzár" @@ -291,6 +300,10 @@ Ok: %1$s." "Kijelentkezés" "Valamilyen hiba történt" "Problémába ütköztünk. Próbálja újra." + + "%1$d tér" + "%1$d tér" + "Csevegés megkezdése…" "Matrica" "Sikeres" @@ -321,6 +334,12 @@ Ok: %1$s." "Személyazonosság ellenőrzése" "Felhasználó ellenőrzése" "Videó" + "Magas minőség" + "Legjobb minőség, de nagyobb fájlméret" + "Alacsony minőség" + "Leggyorsabb feltöltési sebesség és legkisebb fájlméret" + "Szokásos minőség" + "A minőség és a feltöltési sebesség egyensúlya." "Hangüzenet" "Várakozás…" "Várakozás a visszafejtési kulcsra" @@ -335,6 +354,10 @@ Ok: %1$s." Biztos, hogy folytatja?" "Ellenőrizze újra ezt a hivatkozást" + "Válaszd ki a feltöltött videók alapértelmezett minőségét." + "Feltöltött videó minősége" + "A legnagyobb megengedett fájlméret: %1$s" + "A feltöltendő fájl túl nagy" "Szoba jelentve" "Jelentve, és a szoba elhagyva" "Megerősítés" @@ -343,6 +366,9 @@ Biztos, hogy folytatja?" "Figyelmeztetés" "A módosítások nem lettek mentve. Biztos, hogy visszalép?" "Menti a módosításokat?" + "A legnagyobb megengedett fájlméret: %1$s" + "Válassza ki a feltöltendő videó minőségét." + "Feltöltött videó minőségének kiválasztása" "A Matrix-kiszolgálót frissíteni kell a Matrix Authentication Service és a fióklétrehozás támogatásához." "Nem sikerült létrehozni az állandó hivatkozást" "Az %1$s nem tudta betölteni a térképet. Próbálja meg újra később." @@ -376,12 +402,6 @@ Biztos, hogy folytatja?" "Eltávolítás: %1$s" "Beállítások" "Nem sikerült kiválasztani a médiát, próbálja újra." - "Előfordulhat, hogy a feliratok nem láthatók a régebbi alkalmazásokat használók számára." - "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" "Nyomjon hosszan az üzenetre, és válassza a „%1$s” lehetőséget, hogy itt szerepeljen." "Tűzze ki a fontos üzeneteket, hogy könnyen felfedezhetők legyenek" @@ -399,6 +419,7 @@ Biztos, hogy folytatja?" "Az üzenet nem lett elküldve, mert %1$s nem ellenőrizte az összes eszközét" "Egy vagy több eszköze nincs ellenőrizve. Így is elküldheti az üzenetet, vagy egyelőre megszakíthatja, és később, az összes eszköz ellenőrzése után újrapróbálkozhat." "Az üzenet nem lett elküldve, mert egy vagy több eszközét nem ellenőrizte" + "Adminisztrátorok vagy tulajdonosok szerkesztése" "Nem sikerült feldolgozni a feltöltendő médiát, próbálja újra." "Nem sikerült letölteni a felhasználói adatokat" "Üzenet a következőben: %1$s" @@ -416,6 +437,9 @@ Biztos, hogy folytatja?" "Megnyitás a Google Mapsben" "Megnyitás az OpenStreetMapen" "E hely megosztása" + "Létrehozott vagy olyan terek, melyekhez csatlakozott." + "%1$s • %2$s" + "Terek" "Az üzenet nem lett elküldve, mert %1$s ellenőrzött személyazonossága megváltozott." "Az üzenet nem lett elküldve, mert %1$s nem ellenőrizte az összes eszközét." "Az üzenet nem lett elküldve, mert egy vagy több eszközét nem ellenőrizte." 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 b77370f81b..294ab5fd27 100644 --- a/libraries/ui-strings/src/main/res/values-in/translations.xml +++ b/libraries/ui-strings/src/main/res/values-in/translations.xml @@ -239,6 +239,8 @@ Alasan: %1$s." "%d suara" "Kebijakan privasi" + "Ruangan pribadi" + "Ruangan publik" "Reaksi" "Reaksi" "Alasan" @@ -358,9 +360,6 @@ Apakah Anda yakin ingin melanjutkan?" "Hapus %1$s" "Pengaturan" "Gagal memilih media, silakan coba lagi." - "Keterangan mungkin tidak terlihat oleh orang yang menggunakan aplikasi lama." - "Gagal memproses media untuk diunggah, silakan coba lagi." - "Gagal mengunggah media, silakan coba lagi." "Tekan pesan dan pilih “%1$s” untuk disertakan di sini." "Sematkan pesan penting agar mudah ditemukan" diff --git a/libraries/ui-strings/src/main/res/values-it/translations.xml b/libraries/ui-strings/src/main/res/values-it/translations.xml index d0f28e1319..c5bc5e45b2 100644 --- a/libraries/ui-strings/src/main/res/values-it/translations.xml +++ b/libraries/ui-strings/src/main/res/values-it/translations.xml @@ -207,8 +207,8 @@ Motivo:. %1$s" "altri %d" - "%1$d membro" - "%1$d membri" + "%1$d Membro" + "%1$d Membri" "Messaggio" "Azioni messaggio" @@ -239,6 +239,8 @@ Motivo:. %1$s" "%d voti" "Informativa sulla privacy" + "Stanza privata" + "Stanza pubblica" "Reazione" "Reazioni" "Motivo" @@ -359,9 +361,6 @@ Sei sicuro di voler continuare?" "Rimuovi %1$s" "Impostazioni" "Selezione del file multimediale fallita, riprova." - "Le didascalie potrebbero non essere visibili agli utenti di app meno recenti." - "Elaborazione del file multimediale da caricare fallita, riprova." - "Caricamento del file multimediale fallito, riprova." "Premi su un messaggio e scegli “%1$s” per includerlo qui." "Fissa i messaggi importanti così che possano essere trovati facilmente" diff --git a/libraries/ui-strings/src/main/res/values-ka/translations.xml b/libraries/ui-strings/src/main/res/values-ka/translations.xml index 7e3fe1912a..dd67ca02c2 100644 --- a/libraries/ui-strings/src/main/res/values-ka/translations.xml +++ b/libraries/ui-strings/src/main/res/values-ka/translations.xml @@ -177,6 +177,7 @@ "%d ხმა" "კონფიდენციალურობის პოლიტიკა" + "კერძო ოთახი" "რეაქცია" "რეაქციები" @@ -252,8 +253,6 @@ "%1$s Android" "შეცდომის შესატყობინებლად ტელეფონის შენჯღრევა" "მედიის შერჩევა ვერ მოხერხდა, გთხოვთ, სცადოთ ხელახლა." - "მედიის ატვირთვა ვერ მოხერხდა. გთხოვთ, სცადოთ ხელახლა." - "მედიის ატვირთვა ვერ მოხერხდა, გთხოვთ, სცადოთ ხელახლა." "მედიის ატვირთვა ვერ მოხერხდა. გთხოვთ, სცადოთ ხელახლა." "მომხმარებლის მონაცემების მოძიება ვერ მოხერხდა" "მდებარეობის გაზიარება" diff --git a/libraries/ui-strings/src/main/res/values-lt/translations.xml b/libraries/ui-strings/src/main/res/values-lt/translations.xml index c899e70b12..535e57f7fe 100644 --- a/libraries/ui-strings/src/main/res/values-lt/translations.xml +++ b/libraries/ui-strings/src/main/res/values-lt/translations.xml @@ -99,6 +99,7 @@ "Slaptažodis" "Žmonės" "Nuolatinė nuoroda" + "Privatus kambarys" "Reakcijos" "Atsakant %1$s" "Pranešti apie klaidą" @@ -141,8 +142,6 @@ "%1$s Android" "Papurtykite, kad praneštumėte apie klaidą" "Nepavyko pasirinkti laikmenos, pabandykite dar kartą." - "Nepavyko apdoroti įkeliamos laikmenos, bandykite dar kartą." - "Nepavyko įkelti laikmenos, pabandykite dar kartą." "Nepavyko apdoroti įkeliamos laikmenos, bandykite dar kartą." "Nepavyko gauti naudotojo išsamios informacijos." "Versija: %1$s (%2$s)" diff --git a/libraries/ui-strings/src/main/res/values-nb/translations.xml b/libraries/ui-strings/src/main/res/values-nb/translations.xml index 6c2ec13d81..253db15e4d 100644 --- a/libraries/ui-strings/src/main/res/values-nb/translations.xml +++ b/libraries/ui-strings/src/main/res/values-nb/translations.xml @@ -30,10 +30,13 @@ "Trykk for å vise alle" "Fjern reaksjonen med %1$s" "Fjern reaksjonen med %1$s" + "Romavatar" "Sende filer" "Vis passord" "Start en samtale" + "Brukeravatar" "Brukermeny" + "Vis avatar" "Vis detaljer" "Talemelding, lengde: %1$s" "Ta opp talemelding." @@ -136,6 +139,7 @@ "Trykk for alternativer" "Prøv igjen" "Løsne" + "Vis" "Vis i tidslinjen" "Vis kilde" "Ja" @@ -238,6 +242,8 @@ "%d stemmer" "Retningslinjer for personvern" + "Privat rom" + "Offentlig rom" "Reaksjon" "Reaksjoner" "Årsak" @@ -356,9 +362,6 @@ Er du sikker på at du vil fortsette?" "Fjern %1$s" "Innstillinger" "Kunne ikke velge medium, prøv igjen." - "Teksting er kanskje ikke synlig for personer som bruker eldre apper." - "Kunne ikke behandle medier for opplasting, vennligst prøv igjen." - "Opplasting av medier mislyktes, vennligst prøv igjen." "Trykk på en melding og velg “%1$s” for å inkludere her." "Fest viktige meldinger slik at de lett kan ses" 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 356245a670..ffd68b2010 100644 --- a/libraries/ui-strings/src/main/res/values-nl/translations.xml +++ b/libraries/ui-strings/src/main/res/values-nl/translations.xml @@ -220,6 +220,8 @@ Reden: %1$s." "%d stemmen" "Privacybeleid" + "Privé kamer" + "Openbare kamer" "Reactie" "Reacties" "Herstelsleutel" @@ -309,8 +311,6 @@ Reden: %1$s." "%1$s Android" "Schudden om een bug te melden" "Het selecteren van media is mislukt. Probeer het opnieuw." - "Het verwerken van media voor uploaden is mislukt. Probeer het opnieuw." - "Het uploaden van media is mislukt. Probeer het opnieuw." "Druk op een bericht en kies „%1$s” om het hier toe te voegen." "Zet belangrijke berichten vast zodat ze gemakkelijk te vinden zijn" diff --git a/libraries/ui-strings/src/main/res/values-pl/translations.xml b/libraries/ui-strings/src/main/res/values-pl/translations.xml index 5a674b250f..4248212aff 100644 --- a/libraries/ui-strings/src/main/res/values-pl/translations.xml +++ b/libraries/ui-strings/src/main/res/values-pl/translations.xml @@ -262,6 +262,8 @@ Powód: %1$s." "Przygotowuję…" "Polityka prywatności" + "Pokój prywatny" + "Pokój publiczny" "Reakcja" "Reakcje" "Powód" @@ -384,12 +386,6 @@ Czy na pewno chcesz kontynuować?" "Usuń %1$s" "Ustawienia" "Nie udało się wybrać multimediów. Spróbuj ponownie." - "Opis może być niedostępny dla osób korzystających ze starszej wersji aplikacji." - "Nie udało się przesłać pliku." - "Przetwarzanie multimediów do przesłania nie powiodło się, spróbuj ponownie." - "Przesyłanie multimediów nie powiodło się, spróbuj ponownie." - "Maksymalny dozwolony rozmiar pliku to %1$s." - "Plik jest za duży, aby go przesłać." "Naciśnij wiadomość i wybierz “%1$s”, aby dołączyć tutaj." "Przypinaj ważne wiadomości, aby można było je łatwo znaleźć" diff --git a/libraries/ui-strings/src/main/res/values-pt-rBR/translations.xml b/libraries/ui-strings/src/main/res/values-pt-rBR/translations.xml index 40cd039158..57ecd3388d 100644 --- a/libraries/ui-strings/src/main/res/values-pt-rBR/translations.xml +++ b/libraries/ui-strings/src/main/res/values-pt-rBR/translations.xml @@ -239,6 +239,8 @@ Motivo:​ %1$s." "%d votos" "Política de Privacidade" + "Sala privada" + "Sala pública" "Reação" "Reações" "Motivo" @@ -359,9 +361,6 @@ Você tem certeza de que deseja continuar?" "Remover %1$s" "Configurações" "Falha ao selecionar a mídia, tente novamente." - "As legendas podem não ser visíveis para pessoas que usam aplicativos mais antigos." - "Falha ao processar mídia para upload. Tente novamente." - "Falha ao enviar mídia. Tente novamente." "Pressione em uma mensagem e escolha \"%1$s\" para incluir aqui." "Fixe mensagens importantes para que elas possam ser facilmente descobertas" diff --git a/libraries/ui-strings/src/main/res/values-pt/translations.xml b/libraries/ui-strings/src/main/res/values-pt/translations.xml index 9027b51547..ce5c97b78f 100644 --- a/libraries/ui-strings/src/main/res/values-pt/translations.xml +++ b/libraries/ui-strings/src/main/res/values-pt/translations.xml @@ -7,11 +7,19 @@ "%1$d dígito inserido" "%1$d dígitos inseridos" + "Editar avatar" + "O endereço completo será %1$s" + "Detalhes de cifragem" "Ocultar palavra-passe" "Juntar-se à chamada" "Saltar para o fundo" + "Mover o mapa para a minha localização" "Apenas menções" "Silenciado" + "Novas menções" + "Novas mensagens" + "Chamada em curso" + "O avatar do outro utilizador" "Página %1$d" "Pausar" "Mensagem de voz, duração: %1$s, posição atual: %2$s" @@ -30,15 +38,20 @@ "Toca para mostrar tudo" "Remover reação com %1$s" "Remover reação com %1$s" + "Ícone da sala" "Enviar ficheiros" "Mostrar palavra-passe" "Iniciar chamada" + "Necessária ação em tempo limitado" + "Sala antiga" + "Avatar do utilizador" "Menu de utilizador" "Ver avatar" "Ver detalhes" "Mensagem de voz, duração: %1$s" "Gravar mensagem de voz." "Parar gravação" + "O teu avatar" "Aceitar" "Adicionar legenda" "Adicionar à cronologia" @@ -97,6 +110,7 @@ "Não" "Agora não" "OK" + "Abrir menu de contexto" "Definições" "Abrir com" "Afixar" @@ -121,7 +135,9 @@ "Guardar" "Pesquisar" "Enviar" + "Enviar mensagem editada" "Enviar mensagem" + "Enviar mensagem de voz" "Partilhar" "Partilhar ligação" "Mostrar" @@ -137,6 +153,7 @@ "Toca para ver as opções" "Tentar novamente" "Desafixar" + "Ver" "Ver na cronologia" "Ver fonte" "Sim" @@ -238,7 +255,12 @@ Razão: %1$s." "%d voto" "%d votos" + "A preparar…" "Política de privacidade" + "Sala privada" + "Espaço privado" + "Sala pública" + "Espaço público" "Reação" "Reações" "Motivo" @@ -256,6 +278,10 @@ Razão: %1$s." "Sala" "Nome da sala" "p.ex. o nome do teu projeto" + + "%1$d sala" + "%1$d salas" + "Alterações guardadas" "A guardar" "Bloqueio do ecrã" @@ -275,6 +301,10 @@ Razão: %1$s." "A terminar sessão" "Algo correu mal" "Encontrámos um erro. Por favor, tenta novamente." + + "%1$d espaço" + "%1$d espaços" + "A iniciar conversa…" "Autocolante" "Sucesso" @@ -354,14 +384,12 @@ Tens a certeza de que queres continuar?" "Alô! Fala comigo na %1$s: %2$s" "%1$s Android" "Agita o dispositivo em fúria para comunicar um problema" + "Captura de ecrã" "%1$s: %2$s" "Opções" "Remover %1$s" "Configurações" "Falha ao selecionar multimédia, por favor tente novamente." - "As legendas poderão não ser visíveis em versões mais antigas da aplicação." - "Falha ao processar multimédia para carregamento, por favor tente novamente." - "Falhar ao carregar multimédia, por favor tente novamente." "Pressione uma mensagem e escolha \"%1$s\" para incluir aqui." "Fixa mensagens importantes para que possam ser facilmente descobertas" @@ -396,6 +424,9 @@ Tens a certeza de que queres continuar?" "Abrir no Google Maps" "Abrir no OpenStreetMap" "Partilhar este local" + "Espaços que criaste ou nos quais entraste." + "%1$s • %2$s" + "Espaços" "Mensagem não enviada porque a identidade verificada de %1$s foi reposta." "Mensagem não enviada porque %1$s não verificou todos os dispositivos." "Mensagem não enviada porque não verificou um ou mais dos seus dispositivos." diff --git a/libraries/ui-strings/src/main/res/values-ro/translations.xml b/libraries/ui-strings/src/main/res/values-ro/translations.xml index 4f370e6924..77f1a715be 100644 --- a/libraries/ui-strings/src/main/res/values-ro/translations.xml +++ b/libraries/ui-strings/src/main/res/values-ro/translations.xml @@ -208,6 +208,8 @@ Motiv:%1$s." "%d voturi" "Politica de confidențialitate" + "Cameră privată" + "Cameră publică" "Reacţie" "Reacții" "Cheie de recuperare" @@ -300,8 +302,6 @@ Motiv:%1$s." "%1$s Android" "Rageshake pentru a raporta erori" "Selectarea fișierelor media a eșuat, încercați din nou." - "Procesarea datelor media a eșuat, vă rugăm să încercați din nou." - "Încărcarea fișierelor media a eșuat, încercați din nou." "Apăsați pe un mesaj și alegeți \"%1$s\" pentru a-l include aici." "Fixați mesajele importante, astfel încât să poată fi descoperite cu ușurință" 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 93fb5cb170..70b55a2252 100644 --- a/libraries/ui-strings/src/main/res/values-ru/translations.xml +++ b/libraries/ui-strings/src/main/res/values-ru/translations.xml @@ -240,6 +240,8 @@ "%d голосов" "Политика конфиденциальности" + "Частная комната" + "Общедоступная комната" "Реакция" "Реакции" "Причина" @@ -349,9 +351,6 @@ "%1$s Android" "Встряхните устройство, чтобы сообщить об ошибке" "Не удалось выбрать носитель, попробуйте еще раз." - "Подпись может быть не видна пользователям старых приложений." - "Не удалось обработать медиафайл для загрузки, попробуйте еще раз." - "Не удалось загрузить медиафайлы, попробуйте еще раз." "Нажмите на сообщение и выберите “%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 cb6d97dcdd..4c542069be 100644 --- a/libraries/ui-strings/src/main/res/values-sk/translations.xml +++ b/libraries/ui-strings/src/main/res/values-sk/translations.xml @@ -262,6 +262,10 @@ Dôvod: %1$s." "Pripravuje sa…" "Zásady ochrany osobných údajov" + "Súkromná miestnosť" + "Súkromný priestor" + "Verejná miestnosť" + "Verejný priestor" "Reakcia" "Reakcie" "Dôvod" @@ -280,6 +284,11 @@ Dôvod: %1$s." "Miestnosť" "Názov miestnosti" "napr. názov vášho projektu" + + "%1$d miestnosť" + "%1$d miestnosti" + "%1$d miestností" + "Uložené zmeny" "Ukladá sa" "Zámok obrazovky" @@ -299,6 +308,11 @@ Dôvod: %1$s." "Odhlasovanie" "Niečo sa pokazilo" "Vyskytol sa problém. Skúste to prosím znova." + + "%1$d priestor" + "%1$d priestory" + "%1$d priestorov" + "Spustenie konverzácie…" "Nálepka" "Úspech" @@ -329,6 +343,12 @@ Dôvod: %1$s." "Overiť totožnosť" "Overiť používateľa" "Video" + "Vysoká kvalita" + "Najlepšia kvalita, ale väčšia veľkosť súboru" + "Nízka kvalita" + "Najrýchlejšia rýchlosť nahrávania a najmenšia veľkosť súboru" + "Štandardná kvalita" + "Vyvážená kvalita a rýchlosť nahrávania" "Hlasová správa" "Čaká sa…" "Čaká sa na dešifrovací kľúč" @@ -343,6 +363,10 @@ Dôvod: %1$s." Naozaj chcete pokračovať?" "Dôkladne skontrolujte tento odkaz" + "Vyberte predvolenú kvalitu nahrávaných videí." + "Kvalita nahrávania videa" + "Maximálna povolená veľkosť súboru je: %1$s" + "Súbor je príliš veľký na nahratie" "Miestnosť nahlásená" "Nahlásili ste a opustili ste miestnosť" "Potvrdenie" @@ -351,6 +375,9 @@ Naozaj chcete pokračovať?" "Upozornenie" "Vaše zmeny neboli uložené. Naozaj sa chcete vrátiť?" "Uložiť zmeny?" + "Maximálna povolená veľkosť súboru je: %1$s" + "Vyberte kvalitu videa, ktoré chcete nahrať." + "Vyberte kvalitu nahrávania videa" "Váš domovský server musí byť aktualizovaný tak, aby podporoval Matrix Authentication Service a vytvorenie účtu." "Nepodarilo sa vytvoriť trvalý odkaz" "%1$s nedokázal načítať mapu. Skúste to prosím neskôr." @@ -384,12 +411,6 @@ Naozaj chcete pokračovať?" "Odstrániť %1$s" "Nastavenia" "Nepodarilo sa vybrať médium, skúste to prosím znova." - "Titulky nemusia byť viditeľné pre ľudí používajúcich staršie aplikácie." - "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" "Stlačte správu a vyberte možnosť „%1$s“, ktorú chcete zahrnúť sem." "Pripnite dôležité správy, aby sa dali ľahko nájsť" @@ -408,6 +429,7 @@ Naozaj chcete pokračovať?" "Vaša správa nebola odoslaná, pretože %1$s neoveril/a všetky zariadenia." "Jedno alebo viac vašich zariadení nie je overených. Správu môžete odoslať aj tak, alebo môžete zatiaľ zrušiť a skúsiť to znova neskôr po overení všetkých svojich zariadení." "Vaša správa nebola odoslaná, pretože ste neoverili jedno alebo viac svojich zariadení" + "Upraviť správcov alebo vlastníkov" "Nepodarilo sa spracovať médiá na odoslanie, skúste to prosím znova." "Nepodarilo sa získať údaje o používateľovi" "Správa v %1$s" @@ -425,6 +447,9 @@ Naozaj chcete pokračovať?" "Otvoriť v Mapách Google" "Otvoriť v OpenStreetMap" "Zdieľajte túto polohu" + "Priestory, ktoré ste vytvorili alebo ku ktorým ste sa pripojili." + "%1$s • %2$s" + "Priestory" "Správa nebola odoslaná, pretože sa zmenila overená totožnosť používateľa %1$s." "Správa nebola odoslaná, pretože %1$s neoveril/a všetky zariadenia." "Správa nebola odoslaná, pretože ste neoverili jedno alebo viac svojich zariadení." 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 046da66d2d..8187c4b3a5 100644 --- a/libraries/ui-strings/src/main/res/values-sv/translations.xml +++ b/libraries/ui-strings/src/main/res/values-sv/translations.xml @@ -1,16 +1,22 @@ + "Lägg till reaktion: %1$s" "Avatar" "Radera" "%1$d siffra angiven" "%1$d siffror angivna" + "Redigera avatar" "Dölj lösenord" "Anslut till samtal" "Hoppa till botten" "Endast omnämningar" "Tystad" + "Nya omnämnanden" + "Nya meddelanden" + "Pågående samtal" + "Annan användares avatar" "Sida %1$d" "Pausa" "Röstmeddelande, varaktighet:%1$s, nuvarande position: %2$s" @@ -28,14 +34,19 @@ "Läst av %1$s" "Tryck för att visa alla" "Ta bort reaktionen med %1$s" + "Ta bort reaktion med %1$s" + "Rumsavatar" "Skicka filer" "Visa lösenord" "Starta ett samtal" + "Användaravatar" "Användarmeny" + "Visa avatar" "Visa detaljer" "Röstmeddelande, varaktighet: %1$s" "Spela in röstmeddelande." "Stoppa inspelning" + "Din avatar" "Godkänn" "Lägg till bildtext" "Lägg till i tidslinjen" @@ -94,6 +105,7 @@ "Nej" "Inte nu" "OK" + "Öppna kontextmenyn" "Inställningar" "Öppna med" "Fäst" @@ -118,7 +130,9 @@ "Spara" "Sök" "Skicka" + "Skicka redigerat message" "Skicka meddelande" + "Skicka röstmeddelande" "Dela" "Dela länk" "Visa" @@ -134,6 +148,7 @@ "Tryck för alternativ" "Försök igen" "Frigör" + "Visa" "Visa i tidslinjen" "Visa källkod" "Ja" @@ -144,6 +159,7 @@ "Policy för godtagbar användning" "Lägga till bildtext" "Avancerade inställningar" + "en bild" "Analysdata" "Utseende" "Ljud" @@ -235,11 +251,17 @@ Anledning:%1$s." "%d röster" "Integritetspolicy" + "Privat rum" + "Offentligt rum" "Reaktion" "Reaktioner" "Orsak" "Återställningsnyckel" "Uppdaterar …" + + "%1$d svar" + "%1$d svar" + "Svarar till %1$s" "Rapportera en bugg" "Rapportera ett problem" @@ -259,6 +281,7 @@ Anledning:%1$s." "Skickar …" "Misslyckades att skicka" "Skickat" + ". " "Servern stöds inte" "Server-URL" "Inställningar" @@ -324,6 +347,7 @@ Anledning:%1$s." "Misslyckades att ladda meddelanden" "%1$s kunde inte komma åt din plats. Vänligen försök igen senare." "Misslyckades med att ladda upp ditt röstmeddelande." + "Rummet finns inte längre eller så är inbjudan inte längre giltig." "Meddelandet hittades inte" "%1$s är inte behörig att komma åt din plats. Du kan aktivera åtkomst i Inställningar." "%1$s är inte behörig att komma åt din plats. Aktivera åtkomst nedan." @@ -333,6 +357,7 @@ Anledning:%1$s." "Vissa tecken är inte tillåtna. Endast bokstäver, siffror och följande symboler stöds ! $ & ‘ ( ) * + / ; = ? @ [ ] - . _" "Vissa meddelanden har inte skickats" "Tyvärr, ett fel uppstod" + "Avsändaren av händelsen matchar inte ägaren av den enhet som skickade den." "Detta krypterade meddelandes äkthet kan inte garanteras på den här enheten." "Krypterat av en tidigare verifierad användare." "Inte krypterad." @@ -343,10 +368,11 @@ Anledning:%1$s." "Hallå, prata med mig på %1$s: %2$s" "%1$s Android" "Raseriskaka för att rapportera bugg" + "%1$s: %2$s" + "Alternativ" + "Ta bort %1$s" + "Inställningar" "Misslyckades att välja media, vänligen pröva igen." - "Bildtexter kanske inte är synliga för personer som använder äldre appar." - "Misslyckades att bearbeta media för uppladdning, vänligen pröva igen." - "Misslyckades att ladda upp media, vänligen pröva igen." "Tryck på ett meddelande och välj ”%1$s” för att inkludera det här." "Fäst viktiga meddelanden så att de lätt kan upptäckas" @@ -367,6 +393,9 @@ Anledning:%1$s." "Misslyckades att bearbeta media för uppladdning, vänligen pröva igen." "Kunde inte hämta användarinformation" "Meddelande i %1$s" + "Expandera" + "Reducera" + "Visar redan det här rummet!" "%1$s av %2$s" "%1$s Fästa meddelanden" "Laddar meddelande …" diff --git a/libraries/ui-strings/src/main/res/values-tr/translations.xml b/libraries/ui-strings/src/main/res/values-tr/translations.xml index fdec006bb3..d4db6202fd 100644 --- a/libraries/ui-strings/src/main/res/values-tr/translations.xml +++ b/libraries/ui-strings/src/main/res/values-tr/translations.xml @@ -220,6 +220,8 @@ Neden: %1$s." "%d oy" "Gizlilik Politikası" + "Özel oda" + "Herkese açık oda" "Tepki" "Tepkiler" "Kurtarma anahtarı" @@ -321,9 +323,6 @@ Neden: %1$s." "%1$s Android" "Hata bildirmek için Rageshake" "Medya seçilemedi, lütfen tekrar deneyin." - "Açıklamalar, eski uygulamaları kullanan kişiler tarafından görülemeyebilir." - "Medya yüklenemedi, lütfen tekrar deneyin." - "Medya yüklenemedi, lütfen tekrar deneyin." "Bir mesaja basın ve buraya eklemek için “%1$s” yi seçin." "Önemli mesajları kolayca keşfedilebilmeleri için sabitleyin" 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 f2aae4c210..c2bc2a895e 100644 --- a/libraries/ui-strings/src/main/res/values-uk/translations.xml +++ b/libraries/ui-strings/src/main/res/values-uk/translations.xml @@ -261,6 +261,8 @@ "Приготування…" "Політика конфіденційності" + "Приватна кімната (тільки за запрошенням)" + "Загальнодоступна кімната" "Реакція" "Реакції" "Причина" @@ -383,11 +385,6 @@ "Вилучити %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 aa813b829b..1df9fd99aa 100644 --- a/libraries/ui-strings/src/main/res/values-ur/translations.xml +++ b/libraries/ui-strings/src/main/res/values-ur/translations.xml @@ -190,6 +190,8 @@ "%d آراء" "سیاستِ نجیت" + "نجی کمرہ" + "عوامی کمرہ" "ردعمل" "ردود عمل" "بازیابی کی کلید" @@ -272,8 +274,6 @@ "%1$s Android" "خطاء کی اطلاع دینے کیلئے غصے سے ہلائیں" "وسائط منتخب کرنا ناکام، برائے مہربانی دوبارہ کوشش کریں۔" - "وسائط کا معالجہ برائے ترفیع ناکام، برائے مہربانی دوبارہ کوشش کریں۔" - "وسائط رفع کرنے میں ناکام، برائے مہربانی دوبارہ کوشش کریں۔" "%1$d مثبوتہ پیغام" "%1$d مثبوتہ پیغامات" 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 f2498383d7..888ab594d6 100644 --- a/libraries/ui-strings/src/main/res/values-uz/translations.xml +++ b/libraries/ui-strings/src/main/res/values-uz/translations.xml @@ -23,7 +23,7 @@ "To\'liq tekshirish" "Tasdiqlash" "Davom etish" - "nusxa" + "Nusxa" "Havolani nusxalash" "Havolani xabaraga nusxalash" "Yaratmoq" @@ -102,6 +102,7 @@ "Fayl" "Fayl “Yuklashlar”ga saqlandi" "Xabarni yo\'naltirish" + "GIF" "Surat" "%1$sga Javob bering" "APK-ni o\'rnating" @@ -133,6 +134,7 @@ "%dovozlar" "Maxfiylik siyosati" + "Shaxsiy xona (faqat taklif)" "Reaktsiya" "reaksiyalar" "Qayta tiklash kaliti" @@ -189,8 +191,6 @@ "%1$sAndroid" "Xato haqida xabar berish uchun G\'azablanish" "Media tanlash jarayonida xatolik yuz berdi, qayta urinib ko\'ring" - "Mediani yuklab bo‘lmadi, qayta urinib ko‘ring." - "Media yuklanmadi, qayta urinib ko‘ring." "Mediani yuklab bo‘lmadi, qayta urinib ko‘ring." "Foydalanuvchi tafsilotlarini olinmadi" "Joylashuvni ulashish" 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 86b6dfdaaf..4f3fb4b963 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 @@ -230,6 +230,8 @@ "%d 票" "隱私權政策" + "私密聊天室" + "公開的聊天室" "回應" "回應" "理由" @@ -339,9 +341,6 @@ "%1$s Android" "憤怒搖晃以回報臭蟲" "選取媒體失敗,請再試一次。" - "使用舊應用程式的使用者可能看不到標題。" - "無法處理要上傳的媒體,請再試一次。" - "無法上傳媒體檔案,請稍後再試。" "按一下訊息,然後選擇「%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 b9dc5d882e..0363ae9405 100644 --- a/libraries/ui-strings/src/main/res/values-zh/translations.xml +++ b/libraries/ui-strings/src/main/res/values-zh/translations.xml @@ -230,6 +230,8 @@ "%d 票" "隐私政策" + "私有聊天室" + "公共聊天室" "回应" "回应" "理由" @@ -342,9 +344,6 @@ "%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 430772a0ac..ec29d79f19 100644 --- a/libraries/ui-strings/src/main/res/values/localazy.xml +++ b/libraries/ui-strings/src/main/res/values/localazy.xml @@ -224,8 +224,8 @@ Reason: %1$s." "%d others" - "%1$d member" - "%1$d members" + "%1$d Member" + "%1$d Members" "Message" "Message actions" @@ -257,6 +257,10 @@ Reason: %1$s." "Preparing…" "Privacy policy" + "Private room" + "Private space" + "Public room" + "Public space" "Reaction" "Reactions" "Reason" @@ -274,6 +278,10 @@ Reason: %1$s." "Room" "Room name" "e.g. your project name" + + "%1$d Room" + "%1$d Rooms" + "Saved changes" "Saving" "Screen lock" @@ -293,6 +301,10 @@ Reason: %1$s." "Signing out" "Something went wrong" "We encountered an issue. Please try again." + + "%1$d Space" + "%1$d Spaces" + "Starting chat…" "Sticker" "Success" @@ -323,6 +335,12 @@ Reason: %1$s." "Verify identity" "Verify user" "Video" + "High quality" + "Best quality but larger file size" + "Low quality" + "Fastest upload speed and smallest file size" + "Standard quality" + "Balance of quality and upload speed" "Voice message" "Waiting…" "Waiting for this message" @@ -337,6 +355,10 @@ Reason: %1$s." Are you sure you want to continue?" "Double-check this link" + "Select the default quality of videos you upload." + "Video upload quality" + "The max file size allowed is: %1$s" + "The file size is too large to upload" "Room reported" "Reported and left room" "Confirmation" @@ -345,6 +367,9 @@ Are you sure you want to continue?" "Warning" "Your changes have not been saved. Are you sure you want to go back?" "Save changes?" + "The max file size allowed is: %1$s" + "Select the quality of the video you want to upload." + "Select video upload quality" "Your homeserver needs to be upgraded to support Matrix Authentication Service and account creation." "Failed creating the permalink" "%1$s could not load the map. Please try again later." @@ -378,12 +403,6 @@ Are you sure you want to continue?" "Remove %1$s" "Settings" "Failed selecting media, please try again." - "Captions might not be visible to people using older apps." - "The file could not be uploaded." - "Failed processing media to upload, please try again." - "Failed uploading media, please try again." - "The maximum file size allowed is %1$s." - "The file is too large to upload" "Press on a message and choose “%1$s” to include here." "Pin important messages so that they can be easily discovered" @@ -401,6 +420,7 @@ Are you sure you want to continue?" "Your message was not sent because %1$s has not verified all devices" "One or more of your devices are unverified. You can send the message anyway, or you can cancel for now and try again later after you have verified all of your devices." "Your message was not sent because you have not verified one or more of your devices" + "Edit Admins or Owners" "Failed processing media to upload, please try again." "Could not retrieve user details" "Message in %1$s" @@ -418,6 +438,9 @@ Are you sure you want to continue?" "Open in Google Maps" "Open in OpenStreetMap" "Share this location" + "Spaces you have created or joined." + "%1$s • %2$s" + "Spaces" "Message not sent because %1$s’s verified identity was reset." "Message not sent because %1$s has not verified all devices." "Message not sent because you have not verified one or more of your devices." diff --git a/libraries/ui-utils/build.gradle.kts b/libraries/ui-utils/build.gradle.kts index fc60dc277e..62962fbcb4 100644 --- a/libraries/ui-utils/build.gradle.kts +++ b/libraries/ui-utils/build.gradle.kts @@ -13,6 +13,9 @@ android { namespace = "io.element.android.libraries.ui.utils" dependencies { + implementation(projects.libraries.androidutils) + implementation(projects.services.toolbox.impl) + testImplementation(libs.test.junit) testImplementation(libs.test.truth) testImplementation(libs.coroutines.test) diff --git a/libraries/ui-utils/src/main/kotlin/io/element/android/libraries/ui/utils/formatter/FIleSizeFormatter.kt b/libraries/ui-utils/src/main/kotlin/io/element/android/libraries/ui/utils/formatter/FIleSizeFormatter.kt new file mode 100644 index 0000000000..3be7a438f3 --- /dev/null +++ b/libraries/ui-utils/src/main/kotlin/io/element/android/libraries/ui/utils/formatter/FIleSizeFormatter.kt @@ -0,0 +1,24 @@ +/* + * Copyright 2025 New Vector Ltd. + * + * SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial + * Please see LICENSE files in the repository root for full details. + */ + +package io.element.android.libraries.ui.utils.formatter + +import androidx.compose.runtime.Composable +import androidx.compose.runtime.remember +import androidx.compose.ui.platform.LocalContext +import io.element.android.libraries.androidutils.filesize.AndroidFileSizeFormatter +import io.element.android.libraries.androidutils.filesize.FileSizeFormatter +import io.element.android.libraries.ui.utils.version.LocalSdkIntVersionProvider + +@Composable +fun rememberFileSizeFormatter(): FileSizeFormatter { + val context = LocalContext.current + val sdkIntProvider = LocalSdkIntVersionProvider.current + return remember { + AndroidFileSizeFormatter(context, sdkIntProvider) + } +} diff --git a/libraries/ui-utils/src/main/kotlin/io/element/android/libraries/ui/utils/version/LocalSdkIntVersionProvider.kt b/libraries/ui-utils/src/main/kotlin/io/element/android/libraries/ui/utils/version/LocalSdkIntVersionProvider.kt new file mode 100644 index 0000000000..d1dc5a5eb7 --- /dev/null +++ b/libraries/ui-utils/src/main/kotlin/io/element/android/libraries/ui/utils/version/LocalSdkIntVersionProvider.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.libraries.ui.utils.version + +import androidx.compose.runtime.staticCompositionLocalOf +import io.element.android.services.toolbox.api.sdk.BuildVersionSdkIntProvider +import io.element.android.services.toolbox.impl.sdk.DefaultBuildVersionSdkIntProvider + +val LocalSdkIntVersionProvider = staticCompositionLocalOf { DefaultBuildVersionSdkIntProvider() } diff --git a/plugins/src/main/kotlin/Versions.kt b/plugins/src/main/kotlin/Versions.kt index eca866747d..7edbc7b3f9 100644 --- a/plugins/src/main/kotlin/Versions.kt +++ b/plugins/src/main/kotlin/Versions.kt @@ -32,7 +32,7 @@ private const val versionYear = 25 private const val versionMonth = 8 // Note: must be in [0,99] -private const val versionReleaseNumber = 1 +private const val versionReleaseNumber = 2 object Versions { const val VERSION_CODE = (2000 + versionYear) * 10_000 + versionMonth * 100 + versionReleaseNumber diff --git a/screenshots/html/data.js b/screenshots/html/data.js index cf1ae12e7f..0813643028 100644 --- a/screenshots/html/data.js +++ b/screenshots/html/data.js @@ -1,75 +1,75 @@ // Generated file, do not edit export const screenshots = [ ["en","en-dark","de",], -["features.preferences.impl.about_AboutView_Day_0_en","features.preferences.impl.about_AboutView_Night_0_en",20301,], +["features.preferences.impl.about_AboutView_Day_0_en","features.preferences.impl.about_AboutView_Night_0_en",20308,], ["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",20301,], -["features.invite.impl.acceptdecline_AcceptDeclineInviteView_Day_2_en","features.invite.impl.acceptdecline_AcceptDeclineInviteView_Night_2_en",20301,], -["features.invite.impl.acceptdecline_AcceptDeclineInviteView_Day_3_en","features.invite.impl.acceptdecline_AcceptDeclineInviteView_Night_3_en",20301,], -["features.invite.impl.acceptdecline_AcceptDeclineInviteView_Day_4_en","features.invite.impl.acceptdecline_AcceptDeclineInviteView_Night_4_en",20301,], -["features.invite.impl.acceptdecline_AcceptDeclineInviteView_Day_5_en","features.invite.impl.acceptdecline_AcceptDeclineInviteView_Night_5_en",20301,], -["features.logout.impl_AccountDeactivationView_Day_0_en","features.logout.impl_AccountDeactivationView_Night_0_en",20301,], -["features.logout.impl_AccountDeactivationView_Day_1_en","features.logout.impl_AccountDeactivationView_Night_1_en",20301,], -["features.logout.impl_AccountDeactivationView_Day_2_en","features.logout.impl_AccountDeactivationView_Night_2_en",20301,], -["features.logout.impl_AccountDeactivationView_Day_3_en","features.logout.impl_AccountDeactivationView_Night_3_en",20301,], -["features.logout.impl_AccountDeactivationView_Day_4_en","features.logout.impl_AccountDeactivationView_Night_4_en",20301,], -["features.login.impl.accountprovider_AccountProviderOtherView_Day_0_en","features.login.impl.accountprovider_AccountProviderOtherView_Night_0_en",20301,], +["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.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",20301,], -["features.messages.impl.actionlist_ActionListViewContent_Day_11_en","features.messages.impl.actionlist_ActionListViewContent_Night_11_en",20301,], -["features.messages.impl.actionlist_ActionListViewContent_Day_12_en","features.messages.impl.actionlist_ActionListViewContent_Night_12_en",20301,], +["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_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",20301,], -["features.messages.impl.actionlist_ActionListViewContent_Day_3_en","features.messages.impl.actionlist_ActionListViewContent_Night_3_en",20301,], -["features.messages.impl.actionlist_ActionListViewContent_Day_4_en","features.messages.impl.actionlist_ActionListViewContent_Night_4_en",20301,], -["features.messages.impl.actionlist_ActionListViewContent_Day_5_en","features.messages.impl.actionlist_ActionListViewContent_Night_5_en",20301,], -["features.messages.impl.actionlist_ActionListViewContent_Day_6_en","features.messages.impl.actionlist_ActionListViewContent_Night_6_en",20301,], -["features.messages.impl.actionlist_ActionListViewContent_Day_7_en","features.messages.impl.actionlist_ActionListViewContent_Night_7_en",20301,], -["features.messages.impl.actionlist_ActionListViewContent_Day_8_en","features.messages.impl.actionlist_ActionListViewContent_Night_8_en",20301,], -["features.messages.impl.actionlist_ActionListViewContent_Day_9_en","features.messages.impl.actionlist_ActionListViewContent_Night_9_en",20301,], -["features.createroom.impl.addpeople_AddPeopleView_Day_0_en","features.createroom.impl.addpeople_AddPeopleView_Night_0_en",20301,], -["features.createroom.impl.addpeople_AddPeopleView_Day_1_en","features.createroom.impl.addpeople_AddPeopleView_Night_1_en",20301,], -["features.createroom.impl.addpeople_AddPeopleView_Day_2_en","features.createroom.impl.addpeople_AddPeopleView_Night_2_en",20301,], -["features.createroom.impl.addpeople_AddPeopleView_Day_3_en","features.createroom.impl.addpeople_AddPeopleView_Night_3_en",20301,], -["features.preferences.impl.advanced_AdvancedSettingsViewDark_0_en","",20301,], -["features.preferences.impl.advanced_AdvancedSettingsViewDark_1_en","",20301,], -["features.preferences.impl.advanced_AdvancedSettingsViewDark_2_en","",20301,], -["features.preferences.impl.advanced_AdvancedSettingsViewDark_3_en","",20301,], -["features.preferences.impl.advanced_AdvancedSettingsViewDark_4_en","",20301,], -["features.preferences.impl.advanced_AdvancedSettingsViewDark_5_en","",20301,], -["features.preferences.impl.advanced_AdvancedSettingsViewDark_6_en","",20301,], -["features.preferences.impl.advanced_AdvancedSettingsViewDark_7_en","",20301,], -["features.preferences.impl.advanced_AdvancedSettingsViewLight_0_en","",20301,], -["features.preferences.impl.advanced_AdvancedSettingsViewLight_1_en","",20301,], -["features.preferences.impl.advanced_AdvancedSettingsViewLight_2_en","",20301,], -["features.preferences.impl.advanced_AdvancedSettingsViewLight_3_en","",20301,], -["features.preferences.impl.advanced_AdvancedSettingsViewLight_4_en","",20301,], -["features.preferences.impl.advanced_AdvancedSettingsViewLight_5_en","",20301,], -["features.preferences.impl.advanced_AdvancedSettingsViewLight_6_en","",20301,], -["features.preferences.impl.advanced_AdvancedSettingsViewLight_7_en","",20301,], -["libraries.designsystem.components.dialogs_AlertDialogContent_Dialogs_en","",20301,], -["libraries.designsystem.components.dialogs_AlertDialog_Day_0_en","libraries.designsystem.components.dialogs_AlertDialog_Night_0_en",20301,], -["features.analytics.impl_AnalyticsOptInView_Day_0_en","features.analytics.impl_AnalyticsOptInView_Night_0_en",20301,], -["features.analytics.impl_AnalyticsOptInView_Day_1_en","features.analytics.impl_AnalyticsOptInView_Night_1_en",20301,], -["features.analytics.api.preferences_AnalyticsPreferencesView_Day_0_en","features.analytics.api.preferences_AnalyticsPreferencesView_Night_0_en",20301,], -["features.analytics.api.preferences_AnalyticsPreferencesView_Day_1_en","features.analytics.api.preferences_AnalyticsPreferencesView_Night_1_en",20301,], -["features.preferences.impl.analytics_AnalyticsSettingsView_Day_0_en","features.preferences.impl.analytics_AnalyticsSettingsView_Night_0_en",20301,], +["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,], ["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",20301,], +["services.apperror.impl_AppErrorView_Day_0_en","services.apperror.impl_AppErrorView_Night_0_en",20308,], ["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",20301,], +["libraries.designsystem.components.async_AsyncActionView_Day_1_en","libraries.designsystem.components.async_AsyncActionView_Night_1_en",20308,], ["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",20301,], +["libraries.designsystem.components.async_AsyncActionView_Day_3_en","libraries.designsystem.components.async_AsyncActionView_Night_3_en",20308,], ["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",20301,], +["libraries.designsystem.components.async_AsyncFailure_Day_0_en","libraries.designsystem.components.async_AsyncFailure_Night_0_en",20308,], ["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",20301,], +["features.messages.impl.messagecomposer_AttachmentSourcePickerMenu_Day_0_en","features.messages.impl.messagecomposer_AttachmentSourcePickerMenu_Night_0_en",20308,], ["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,18 +79,18 @@ export const screenshots = [ ["libraries.matrix.ui.components_AttachmentThumbnail_Day_6_en","libraries.matrix.ui.components_AttachmentThumbnail_Night_6_en",0,], ["libraries.matrix.ui.components_AttachmentThumbnail_Day_7_en","libraries.matrix.ui.components_AttachmentThumbnail_Night_7_en",0,], ["libraries.matrix.ui.components_AttachmentThumbnail_Day_8_en","libraries.matrix.ui.components_AttachmentThumbnail_Night_8_en",0,], -["features.messages.impl.attachments.preview_AttachmentsView_0_en","",20301,], +["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","",20301,], -["features.messages.impl.attachments.preview_AttachmentsView_3_en","",20301,], -["features.messages.impl.attachments.preview_AttachmentsView_4_en","",20301,], -["features.messages.impl.attachments.preview_AttachmentsView_5_en","",20301,], +["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","",20301,], +["features.messages.impl.attachments.preview_AttachmentsView_7_en","",20308,], ["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",20301,], +["libraries.matrix.ui.components_AvatarActionBottomSheet_Day_0_en","libraries.matrix.ui.components_AvatarActionBottomSheet_Night_0_en",20308,], ["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,], @@ -200,149 +200,151 @@ export const screenshots = [ ["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",20301,], +["features.home.impl.components_BatteryOptimizationBanner_Day_0_en","features.home.impl.components_BatteryOptimizationBanner_Night_0_en",20308,], ["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",20301,], -["features.preferences.impl.blockedusers_BlockedUsersView_Day_1_en","features.preferences.impl.blockedusers_BlockedUsersView_Night_1_en",20301,], -["features.preferences.impl.blockedusers_BlockedUsersView_Day_2_en","features.preferences.impl.blockedusers_BlockedUsersView_Night_2_en",20301,], -["features.preferences.impl.blockedusers_BlockedUsersView_Day_3_en","features.preferences.impl.blockedusers_BlockedUsersView_Night_3_en",20301,], -["features.preferences.impl.blockedusers_BlockedUsersView_Day_4_en","features.preferences.impl.blockedusers_BlockedUsersView_Night_4_en",20301,], -["features.preferences.impl.blockedusers_BlockedUsersView_Day_5_en","features.preferences.impl.blockedusers_BlockedUsersView_Night_5_en",20301,], -["features.preferences.impl.blockedusers_BlockedUsersView_Day_6_en","features.preferences.impl.blockedusers_BlockedUsersView_Night_6_en",20301,], +["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,], ["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",20301,], -["features.rageshake.impl.bugreport_BugReportView_Day_1_en","features.rageshake.impl.bugreport_BugReportView_Night_1_en",20301,], -["features.rageshake.impl.bugreport_BugReportView_Day_2_en","features.rageshake.impl.bugreport_BugReportView_Night_2_en",20301,], -["features.rageshake.impl.bugreport_BugReportView_Day_3_en","features.rageshake.impl.bugreport_BugReportView_Night_3_en",20301,], -["features.rageshake.impl.bugreport_BugReportView_Day_4_en","features.rageshake.impl.bugreport_BugReportView_Night_4_en",20301,], +["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,], ["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",20301,], -["features.messages.impl.timeline.components_CallMenuItem_Day_3_en","features.messages.impl.timeline.components_CallMenuItem_Night_3_en",20301,], +["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_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",20301,], -["features.call.impl.ui_CallScreenView_Day_2_en","features.call.impl.ui_CallScreenView_Night_2_en",20301,], -["features.call.impl.ui_CallScreenView_Day_3_en","features.call.impl.ui_CallScreenView_Night_3_en",20301,], -["libraries.textcomposer_CaptionWarningBottomSheet_Day_0_en","libraries.textcomposer_CaptionWarningBottomSheet_Night_0_en",20301,], -["features.login.impl.screens.changeaccountprovider_ChangeAccountProviderView_Day_0_en","features.login.impl.screens.changeaccountprovider_ChangeAccountProviderView_Night_0_en",20301,], -["features.login.impl.screens.changeaccountprovider_ChangeAccountProviderView_Day_1_en","features.login.impl.screens.changeaccountprovider_ChangeAccountProviderView_Night_1_en",20301,], -["features.roomdetails.impl.rolesandpermissions.changeroles_ChangeRolesView_Day_0_en","features.roomdetails.impl.rolesandpermissions.changeroles_ChangeRolesView_Night_0_en",20301,], -["features.roomdetails.impl.rolesandpermissions.changeroles_ChangeRolesView_Day_10_en","features.roomdetails.impl.rolesandpermissions.changeroles_ChangeRolesView_Night_10_en",20301,], -["features.roomdetails.impl.rolesandpermissions.changeroles_ChangeRolesView_Day_11_en","features.roomdetails.impl.rolesandpermissions.changeroles_ChangeRolesView_Night_11_en",20304,], -["features.roomdetails.impl.rolesandpermissions.changeroles_ChangeRolesView_Day_1_en","features.roomdetails.impl.rolesandpermissions.changeroles_ChangeRolesView_Night_1_en",20301,], -["features.roomdetails.impl.rolesandpermissions.changeroles_ChangeRolesView_Day_2_en","features.roomdetails.impl.rolesandpermissions.changeroles_ChangeRolesView_Night_2_en",20301,], -["features.roomdetails.impl.rolesandpermissions.changeroles_ChangeRolesView_Day_3_en","features.roomdetails.impl.rolesandpermissions.changeroles_ChangeRolesView_Night_3_en",20301,], -["features.roomdetails.impl.rolesandpermissions.changeroles_ChangeRolesView_Day_4_en","features.roomdetails.impl.rolesandpermissions.changeroles_ChangeRolesView_Night_4_en",20301,], -["features.roomdetails.impl.rolesandpermissions.changeroles_ChangeRolesView_Day_5_en","features.roomdetails.impl.rolesandpermissions.changeroles_ChangeRolesView_Night_5_en",20301,], -["features.roomdetails.impl.rolesandpermissions.changeroles_ChangeRolesView_Day_6_en","features.roomdetails.impl.rolesandpermissions.changeroles_ChangeRolesView_Night_6_en",20301,], -["features.roomdetails.impl.rolesandpermissions.changeroles_ChangeRolesView_Day_7_en","features.roomdetails.impl.rolesandpermissions.changeroles_ChangeRolesView_Night_7_en",20301,], -["features.roomdetails.impl.rolesandpermissions.changeroles_ChangeRolesView_Day_8_en","features.roomdetails.impl.rolesandpermissions.changeroles_ChangeRolesView_Night_8_en",20301,], -["features.roomdetails.impl.rolesandpermissions.changeroles_ChangeRolesView_Day_9_en","features.roomdetails.impl.rolesandpermissions.changeroles_ChangeRolesView_Night_9_en",20301,], -["features.roomdetails.impl.rolesandpermissions.permissions_ChangeRoomPermissionsView_Day_0_en","features.roomdetails.impl.rolesandpermissions.permissions_ChangeRoomPermissionsView_Night_0_en",20301,], -["features.roomdetails.impl.rolesandpermissions.permissions_ChangeRoomPermissionsView_Day_1_en","features.roomdetails.impl.rolesandpermissions.permissions_ChangeRoomPermissionsView_Night_1_en",20301,], -["features.roomdetails.impl.rolesandpermissions.permissions_ChangeRoomPermissionsView_Day_2_en","features.roomdetails.impl.rolesandpermissions.permissions_ChangeRoomPermissionsView_Night_2_en",20301,], -["features.roomdetails.impl.rolesandpermissions.permissions_ChangeRoomPermissionsView_Day_3_en","features.roomdetails.impl.rolesandpermissions.permissions_ChangeRoomPermissionsView_Night_3_en",20301,], -["features.roomdetails.impl.rolesandpermissions.permissions_ChangeRoomPermissionsView_Day_4_en","features.roomdetails.impl.rolesandpermissions.permissions_ChangeRoomPermissionsView_Night_4_en",20301,], -["features.roomdetails.impl.rolesandpermissions.permissions_ChangeRoomPermissionsView_Day_5_en","features.roomdetails.impl.rolesandpermissions.permissions_ChangeRoomPermissionsView_Night_5_en",20301,], -["features.roomdetails.impl.rolesandpermissions.permissions_ChangeRoomPermissionsView_Day_6_en","features.roomdetails.impl.rolesandpermissions.permissions_ChangeRoomPermissionsView_Night_6_en",20301,], +["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.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",20301,], -["features.login.impl.changeserver_ChangeServerView_Day_2_en","features.login.impl.changeserver_ChangeServerView_Night_2_en",20301,], -["features.login.impl.changeserver_ChangeServerView_Day_3_en","features.login.impl.changeserver_ChangeServerView_Night_3_en",20301,], +["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,], ["libraries.matrix.ui.components_CheckableResolvedUserRow_en","",0,], -["libraries.matrix.ui.components_CheckableUnresolvedUserRow_en","",20301,], +["libraries.matrix.ui.components_CheckableUnresolvedUserRow_en","",20308,], ["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",20301,], -["features.login.impl.screens.chooseaccountprovider_ChooseAccountProviderView_Day_1_en","features.login.impl.screens.chooseaccountprovider_ChooseAccountProviderView_Night_1_en",20301,], -["features.login.impl.screens.chooseaccountprovider_ChooseAccountProviderView_Day_2_en","features.login.impl.screens.chooseaccountprovider_ChooseAccountProviderView_Night_2_en",20301,], -["features.ftue.impl.sessionverification.choosemode_ChooseSelfVerificationModeView_Day_0_en","features.ftue.impl.sessionverification.choosemode_ChooseSelfVerificationModeView_Night_0_en",20301,], -["features.ftue.impl.sessionverification.choosemode_ChooseSelfVerificationModeView_Day_1_en","features.ftue.impl.sessionverification.choosemode_ChooseSelfVerificationModeView_Night_1_en",20301,], -["features.ftue.impl.sessionverification.choosemode_ChooseSelfVerificationModeView_Day_2_en","features.ftue.impl.sessionverification.choosemode_ChooseSelfVerificationModeView_Night_2_en",20301,], -["features.ftue.impl.sessionverification.choosemode_ChooseSelfVerificationModeView_Day_3_en","features.ftue.impl.sessionverification.choosemode_ChooseSelfVerificationModeView_Night_3_en",20301,], +["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,], ["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",20301,], -["libraries.designsystem.atomic.molecules_ComposerAlertMolecule_Day_1_en","libraries.designsystem.atomic.molecules_ComposerAlertMolecule_Night_1_en",20301,], -["libraries.textcomposer_ComposerModeView_Day_0_en","libraries.textcomposer_ComposerModeView_Night_0_en",20301,], +["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.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","",20301,], -["features.createroom.impl.configureroom_ConfigureRoomViewDark_1_en","",20301,], -["features.createroom.impl.configureroom_ConfigureRoomViewDark_2_en","",20301,], -["features.createroom.impl.configureroom_ConfigureRoomViewDark_3_en","",20301,], -["features.createroom.impl.configureroom_ConfigureRoomViewDark_4_en","",20301,], -["features.createroom.impl.configureroom_ConfigureRoomViewDark_5_en","",20301,], -["features.createroom.impl.configureroom_ConfigureRoomViewLight_0_en","",20301,], -["features.createroom.impl.configureroom_ConfigureRoomViewLight_1_en","",20301,], -["features.createroom.impl.configureroom_ConfigureRoomViewLight_2_en","",20301,], -["features.createroom.impl.configureroom_ConfigureRoomViewLight_3_en","",20301,], -["features.createroom.impl.configureroom_ConfigureRoomViewLight_4_en","",20301,], -["features.createroom.impl.configureroom_ConfigureRoomViewLight_5_en","",20301,], -["features.login.impl.screens.confirmaccountprovider_ConfirmAccountProviderView_Day_0_en","features.login.impl.screens.confirmaccountprovider_ConfirmAccountProviderView_Night_0_en",20301,], -["features.login.impl.screens.confirmaccountprovider_ConfirmAccountProviderView_Day_1_en","features.login.impl.screens.confirmaccountprovider_ConfirmAccountProviderView_Night_1_en",20301,], -["features.login.impl.screens.confirmaccountprovider_ConfirmAccountProviderView_Day_2_en","features.login.impl.screens.confirmaccountprovider_ConfirmAccountProviderView_Night_2_en",20301,], -["features.home.impl.components_ConfirmRecoveryKeyBanner_Day_0_en","features.home.impl.components_ConfirmRecoveryKeyBanner_Night_0_en",20301,], +["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,], ["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",20301,], -["features.login.impl.screens.createaccount_CreateAccountView_Day_0_en","features.login.impl.screens.createaccount_CreateAccountView_Night_0_en",20301,], -["features.login.impl.screens.createaccount_CreateAccountView_Day_1_en","features.login.impl.screens.createaccount_CreateAccountView_Night_1_en",20301,], -["features.login.impl.screens.createaccount_CreateAccountView_Day_2_en","features.login.impl.screens.createaccount_CreateAccountView_Night_2_en",20301,], -["features.login.impl.screens.createaccount_CreateAccountView_Day_3_en","features.login.impl.screens.createaccount_CreateAccountView_Night_3_en",20301,], -["libraries.matrix.ui.components_CreateDmConfirmationBottomSheet_Day_0_en","libraries.matrix.ui.components_CreateDmConfirmationBottomSheet_Night_0_en",20301,], -["libraries.matrix.ui.components_CreateDmConfirmationBottomSheet_Day_1_en","libraries.matrix.ui.components_CreateDmConfirmationBottomSheet_Night_1_en",20301,], -["features.poll.impl.create_CreatePollView_Day_0_en","features.poll.impl.create_CreatePollView_Night_0_en",20301,], -["features.poll.impl.create_CreatePollView_Day_1_en","features.poll.impl.create_CreatePollView_Night_1_en",20301,], -["features.poll.impl.create_CreatePollView_Day_2_en","features.poll.impl.create_CreatePollView_Night_2_en",20301,], -["features.poll.impl.create_CreatePollView_Day_3_en","features.poll.impl.create_CreatePollView_Night_3_en",20301,], -["features.poll.impl.create_CreatePollView_Day_4_en","features.poll.impl.create_CreatePollView_Night_4_en",20301,], -["features.poll.impl.create_CreatePollView_Day_5_en","features.poll.impl.create_CreatePollView_Night_5_en",20301,], -["features.poll.impl.create_CreatePollView_Day_6_en","features.poll.impl.create_CreatePollView_Night_6_en",20301,], -["features.poll.impl.create_CreatePollView_Day_7_en","features.poll.impl.create_CreatePollView_Night_7_en",20301,], -["features.createroom.impl.root_CreateRoomRootView_Day_0_en","features.createroom.impl.root_CreateRoomRootView_Night_0_en",20301,], -["features.createroom.impl.root_CreateRoomRootView_Day_1_en","features.createroom.impl.root_CreateRoomRootView_Night_1_en",20301,], -["features.createroom.impl.root_CreateRoomRootView_Day_2_en","features.createroom.impl.root_CreateRoomRootView_Night_2_en",20301,], -["features.createroom.impl.root_CreateRoomRootView_Day_3_en","features.createroom.impl.root_CreateRoomRootView_Night_3_en",20301,], -["features.createroom.impl.root_CreateRoomRootView_Day_4_en","features.createroom.impl.root_CreateRoomRootView_Night_4_en",20301,], -["features.createroom.impl.root_CreateRoomRootView_Day_5_en","features.createroom.impl.root_CreateRoomRootView_Night_5_en",20301,], -["libraries.dateformatter.impl.previews_DateFormatterModeView_0_en","",20301,], -["libraries.dateformatter.impl.previews_DateFormatterModeView_1_en","",20301,], -["libraries.dateformatter.impl.previews_DateFormatterModeView_2_en","",20301,], -["libraries.dateformatter.impl.previews_DateFormatterModeView_3_en","",20301,], -["libraries.dateformatter.impl.previews_DateFormatterModeView_4_en","",20301,], +["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,], ["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","",20301,], -["libraries.designsystem.theme.components.previews_DatePickerLight_DateTime_pickers_en","",20301,], -["features.invite.impl.declineandblock_DeclineAndBlockView_Day_0_en","features.invite.impl.declineandblock_DeclineAndBlockView_Night_0_en",20301,], -["features.invite.impl.declineandblock_DeclineAndBlockView_Day_1_en","features.invite.impl.declineandblock_DeclineAndBlockView_Night_1_en",20301,], -["features.invite.impl.declineandblock_DeclineAndBlockView_Day_2_en","features.invite.impl.declineandblock_DeclineAndBlockView_Night_2_en",20301,], -["features.invite.impl.declineandblock_DeclineAndBlockView_Day_3_en","features.invite.impl.declineandblock_DeclineAndBlockView_Night_3_en",20301,], -["features.invite.impl.declineandblock_DeclineAndBlockView_Day_4_en","features.invite.impl.declineandblock_DeclineAndBlockView_Night_4_en",20301,], +["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,], ["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",20301,], -["features.logout.impl.direct_DefaultDirectLogoutView_Day_2_en","features.logout.impl.direct_DefaultDirectLogoutView_Night_2_en",20301,], -["features.logout.impl.direct_DefaultDirectLogoutView_Day_3_en","features.logout.impl.direct_DefaultDirectLogoutView_Night_3_en",20301,], +["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_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",20301,], -["features.home.impl.components_DefaultRoomListTopBarWithIndicator_Day_0_en","features.home.impl.components_DefaultRoomListTopBarWithIndicator_Night_0_en",20301,], -["features.home.impl.components_DefaultRoomListTopBar_Day_0_en","features.home.impl.components_DefaultRoomListTopBar_Night_0_en",20301,], +["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.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",20301,], -["features.licenses.impl.list_DependencyLicensesListView_Day_1_en","features.licenses.impl.list_DependencyLicensesListView_Night_1_en",20301,], -["features.licenses.impl.list_DependencyLicensesListView_Day_2_en","features.licenses.impl.list_DependencyLicensesListView_Night_2_en",20301,], -["features.licenses.impl.list_DependencyLicensesListView_Day_3_en","features.licenses.impl.list_DependencyLicensesListView_Night_3_en",20301,], -["features.preferences.impl.developer_DeveloperSettingsView_Day_0_en","features.preferences.impl.developer_DeveloperSettingsView_Night_0_en",20301,], -["features.preferences.impl.developer_DeveloperSettingsView_Day_1_en","features.preferences.impl.developer_DeveloperSettingsView_Night_1_en",20301,], -["features.preferences.impl.developer_DeveloperSettingsView_Day_2_en","features.preferences.impl.developer_DeveloperSettingsView_Night_2_en",20301,], +["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,], ["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,], @@ -355,18 +357,18 @@ export const screenshots = [ ["libraries.designsystem.text_DpScale_1_0f__en","",0,], ["libraries.designsystem.text_DpScale_1_5f__en","",0,], ["libraries.designsystem.theme.components_DropdownMenuItem_Menus_en","",0,], -["features.preferences.impl.notifications.edit_EditDefaultNotificationSettingView_Day_0_en","features.preferences.impl.notifications.edit_EditDefaultNotificationSettingView_Night_0_en",20301,], -["features.preferences.impl.notifications.edit_EditDefaultNotificationSettingView_Day_1_en","features.preferences.impl.notifications.edit_EditDefaultNotificationSettingView_Night_1_en",20301,], -["features.preferences.impl.notifications.edit_EditDefaultNotificationSettingView_Day_2_en","features.preferences.impl.notifications.edit_EditDefaultNotificationSettingView_Night_2_en",20301,], -["features.preferences.impl.notifications.edit_EditDefaultNotificationSettingView_Day_3_en","features.preferences.impl.notifications.edit_EditDefaultNotificationSettingView_Night_3_en",20301,], -["features.preferences.impl.notifications.edit_EditDefaultNotificationSettingView_Day_4_en","features.preferences.impl.notifications.edit_EditDefaultNotificationSettingView_Night_4_en",20301,], -["features.roomdetails.impl.securityandprivacy.editroomaddress_EditRoomAddressView_Day_0_en","features.roomdetails.impl.securityandprivacy.editroomaddress_EditRoomAddressView_Night_0_en",20301,], -["features.roomdetails.impl.securityandprivacy.editroomaddress_EditRoomAddressView_Day_1_en","features.roomdetails.impl.securityandprivacy.editroomaddress_EditRoomAddressView_Night_1_en",20301,], -["features.roomdetails.impl.securityandprivacy.editroomaddress_EditRoomAddressView_Day_2_en","features.roomdetails.impl.securityandprivacy.editroomaddress_EditRoomAddressView_Night_2_en",20301,], -["features.roomdetails.impl.securityandprivacy.editroomaddress_EditRoomAddressView_Day_3_en","features.roomdetails.impl.securityandprivacy.editroomaddress_EditRoomAddressView_Night_3_en",20301,], -["features.roomdetails.impl.securityandprivacy.editroomaddress_EditRoomAddressView_Day_4_en","features.roomdetails.impl.securityandprivacy.editroomaddress_EditRoomAddressView_Night_4_en",20301,], -["features.preferences.impl.user.editprofile_EditUserProfileView_Day_0_en","features.preferences.impl.user.editprofile_EditUserProfileView_Night_0_en",20301,], -["features.preferences.impl.user.editprofile_EditUserProfileView_Day_1_en","features.preferences.impl.user.editprofile_EditUserProfileView_Night_1_en",20301,], +["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,], ["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,], @@ -376,9 +378,9 @@ export const screenshots = [ ["libraries.designsystem.atomic.atoms_ElementLogoAtomMedium_Day_0_en","libraries.designsystem.atomic.atoms_ElementLogoAtomMedium_Night_0_en",0,], ["features.messages.impl.timeline.components.customreaction_EmojiItem_Day_0_en","features.messages.impl.timeline.components.customreaction_EmojiItem_Night_0_en",0,], ["features.messages.impl.timeline.components.customreaction_EmojiPicker_Day_0_en","features.messages.impl.timeline.components.customreaction_EmojiPicker_Night_0_en",0,], -["libraries.designsystem.components.dialogs_ErrorDialogContent_Dialogs_en","",20301,], -["libraries.designsystem.components.dialogs_ErrorDialogWithDoNotShowAgain_Day_0_en","libraries.designsystem.components.dialogs_ErrorDialogWithDoNotShowAgain_Night_0_en",20301,], -["libraries.designsystem.components.dialogs_ErrorDialog_Day_0_en","libraries.designsystem.components.dialogs_ErrorDialog_Night_0_en",20301,], +["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,], ["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,], @@ -397,38 +399,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",20301,], -["features.messages.impl.timeline.focus_FocusRequestStateView_Day_2_en","features.messages.impl.timeline.focus_FocusRequestStateView_Night_2_en",20301,], -["features.messages.impl.timeline.focus_FocusRequestStateView_Day_3_en","features.messages.impl.timeline.focus_FocusRequestStateView_Night_3_en",20301,], +["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.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",20301,], -["features.home.impl.components_FullScreenIntentPermissionBanner_Day_0_en","features.home.impl.components_FullScreenIntentPermissionBanner_Night_0_en",20301,], +["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,], ["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",20301,], -["features.home.impl_HomeView_Day_10_en","features.home.impl_HomeView_Night_10_en",20301,], +["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_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",20301,], -["features.home.impl_HomeView_Day_14_en","features.home.impl_HomeView_Night_14_en",20301,], -["features.home.impl_HomeView_Day_15_en","features.home.impl_HomeView_Night_15_en",20301,], -["features.home.impl_HomeView_Day_1_en","features.home.impl_HomeView_Night_1_en",20301,], -["features.home.impl_HomeView_Day_2_en","features.home.impl_HomeView_Night_2_en",20301,], -["features.home.impl_HomeView_Day_3_en","features.home.impl_HomeView_Night_3_en",20301,], +["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_4_en","features.home.impl_HomeView_Night_4_en",0,], -["features.home.impl_HomeView_Day_5_en","features.home.impl_HomeView_Night_5_en",20301,], -["features.home.impl_HomeView_Day_6_en","features.home.impl_HomeView_Night_6_en",20301,], -["features.home.impl_HomeView_Day_7_en","features.home.impl_HomeView_Night_7_en",20301,], -["features.home.impl_HomeView_Day_8_en","features.home.impl_HomeView_Night_8_en",20301,], -["features.home.impl_HomeView_Day_9_en","features.home.impl_HomeView_Night_9_en",20301,], +["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,], ["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,], @@ -447,8 +449,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",20301,], -["features.messages.impl.crypto.identity_IdentityChangeStateView_Day_2_en","features.messages.impl.crypto.identity_IdentityChangeStateView_Night_2_en",20301,], +["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,], ["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,], @@ -456,85 +458,86 @@ 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",20301,], +["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_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",20301,], +["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_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",20301,], -["features.verifysession.impl.incoming_IncomingVerificationView_Day_0_en","features.verifysession.impl.incoming_IncomingVerificationView_Night_0_en",20301,], -["features.verifysession.impl.incoming_IncomingVerificationView_Day_10_en","features.verifysession.impl.incoming_IncomingVerificationView_Night_10_en",20301,], -["features.verifysession.impl.incoming_IncomingVerificationView_Day_11_en","features.verifysession.impl.incoming_IncomingVerificationView_Night_11_en",20301,], -["features.verifysession.impl.incoming_IncomingVerificationView_Day_12_en","features.verifysession.impl.incoming_IncomingVerificationView_Night_12_en",20301,], -["features.verifysession.impl.incoming_IncomingVerificationView_Day_13_en","features.verifysession.impl.incoming_IncomingVerificationView_Night_13_en",20301,], -["features.verifysession.impl.incoming_IncomingVerificationView_Day_1_en","features.verifysession.impl.incoming_IncomingVerificationView_Night_1_en",20301,], -["features.verifysession.impl.incoming_IncomingVerificationView_Day_2_en","features.verifysession.impl.incoming_IncomingVerificationView_Night_2_en",20301,], -["features.verifysession.impl.incoming_IncomingVerificationView_Day_3_en","features.verifysession.impl.incoming_IncomingVerificationView_Night_3_en",20301,], -["features.verifysession.impl.incoming_IncomingVerificationView_Day_4_en","features.verifysession.impl.incoming_IncomingVerificationView_Night_4_en",20301,], -["features.verifysession.impl.incoming_IncomingVerificationView_Day_5_en","features.verifysession.impl.incoming_IncomingVerificationView_Night_5_en",20301,], -["features.verifysession.impl.incoming_IncomingVerificationView_Day_6_en","features.verifysession.impl.incoming_IncomingVerificationView_Night_6_en",20301,], -["features.verifysession.impl.incoming_IncomingVerificationView_Day_7_en","features.verifysession.impl.incoming_IncomingVerificationView_Night_7_en",20301,], -["features.verifysession.impl.incoming_IncomingVerificationView_Day_8_en","features.verifysession.impl.incoming_IncomingVerificationView_Night_8_en",20301,], -["features.verifysession.impl.incoming_IncomingVerificationView_Day_9_en","features.verifysession.impl.incoming_IncomingVerificationView_Night_9_en",20301,], +["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.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",20301,], -["libraries.matrix.ui.components_InviteSenderView_Day_0_en","libraries.matrix.ui.components_InviteSenderView_Night_0_en",20301,], -["features.createroom.impl.joinbyaddress_JoinRoomByAddressView_Day_0_en","features.createroom.impl.joinbyaddress_JoinRoomByAddressView_Night_0_en",20301,], -["features.createroom.impl.joinbyaddress_JoinRoomByAddressView_Day_1_en","features.createroom.impl.joinbyaddress_JoinRoomByAddressView_Night_1_en",20301,], -["features.createroom.impl.joinbyaddress_JoinRoomByAddressView_Day_2_en","features.createroom.impl.joinbyaddress_JoinRoomByAddressView_Night_2_en",20301,], -["features.createroom.impl.joinbyaddress_JoinRoomByAddressView_Day_3_en","features.createroom.impl.joinbyaddress_JoinRoomByAddressView_Night_3_en",20301,], -["features.createroom.impl.joinbyaddress_JoinRoomByAddressView_Day_4_en","features.createroom.impl.joinbyaddress_JoinRoomByAddressView_Night_4_en",20301,], -["features.createroom.impl.joinbyaddress_JoinRoomByAddressView_Day_5_en","features.createroom.impl.joinbyaddress_JoinRoomByAddressView_Night_5_en",20301,], +["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,], ["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",20301,], -["features.joinroom.impl_JoinRoomView_Day_11_en","features.joinroom.impl_JoinRoomView_Night_11_en",20301,], -["features.joinroom.impl_JoinRoomView_Day_12_en","features.joinroom.impl_JoinRoomView_Night_12_en",20301,], -["features.joinroom.impl_JoinRoomView_Day_13_en","features.joinroom.impl_JoinRoomView_Night_13_en",20301,], -["features.joinroom.impl_JoinRoomView_Day_14_en","features.joinroom.impl_JoinRoomView_Night_14_en",20301,], -["features.joinroom.impl_JoinRoomView_Day_15_en","features.joinroom.impl_JoinRoomView_Night_15_en",20301,], -["features.joinroom.impl_JoinRoomView_Day_16_en","features.joinroom.impl_JoinRoomView_Night_16_en",20301,], -["features.joinroom.impl_JoinRoomView_Day_1_en","features.joinroom.impl_JoinRoomView_Night_1_en",20301,], -["features.joinroom.impl_JoinRoomView_Day_2_en","features.joinroom.impl_JoinRoomView_Night_2_en",20301,], -["features.joinroom.impl_JoinRoomView_Day_3_en","features.joinroom.impl_JoinRoomView_Night_3_en",20301,], -["features.joinroom.impl_JoinRoomView_Day_4_en","features.joinroom.impl_JoinRoomView_Night_4_en",20301,], -["features.joinroom.impl_JoinRoomView_Day_5_en","features.joinroom.impl_JoinRoomView_Night_5_en",20301,], -["features.joinroom.impl_JoinRoomView_Day_6_en","features.joinroom.impl_JoinRoomView_Night_6_en",20301,], -["features.joinroom.impl_JoinRoomView_Day_7_en","features.joinroom.impl_JoinRoomView_Night_7_en",20301,], -["features.joinroom.impl_JoinRoomView_Day_8_en","features.joinroom.impl_JoinRoomView_Night_8_en",20301,], -["features.joinroom.impl_JoinRoomView_Day_9_en","features.joinroom.impl_JoinRoomView_Night_9_en",20301,], -["features.knockrequests.impl.banner_KnockRequestsBannerView_Day_0_en","features.knockrequests.impl.banner_KnockRequestsBannerView_Night_0_en",20301,], -["features.knockrequests.impl.banner_KnockRequestsBannerView_Day_1_en","features.knockrequests.impl.banner_KnockRequestsBannerView_Night_1_en",20301,], -["features.knockrequests.impl.banner_KnockRequestsBannerView_Day_2_en","features.knockrequests.impl.banner_KnockRequestsBannerView_Night_2_en",20301,], -["features.knockrequests.impl.banner_KnockRequestsBannerView_Day_3_en","features.knockrequests.impl.banner_KnockRequestsBannerView_Night_3_en",20301,], -["features.knockrequests.impl.banner_KnockRequestsBannerView_Day_4_en","features.knockrequests.impl.banner_KnockRequestsBannerView_Night_4_en",20301,], -["features.knockrequests.impl.banner_KnockRequestsBannerView_Day_5_en","features.knockrequests.impl.banner_KnockRequestsBannerView_Night_5_en",20301,], -["features.knockrequests.impl.banner_KnockRequestsBannerView_Day_6_en","features.knockrequests.impl.banner_KnockRequestsBannerView_Night_6_en",20301,], -["features.knockrequests.impl.list_KnockRequestsListView_Day_0_en","features.knockrequests.impl.list_KnockRequestsListView_Night_0_en",20301,], -["features.knockrequests.impl.list_KnockRequestsListView_Day_10_en","features.knockrequests.impl.list_KnockRequestsListView_Night_10_en",20301,], -["features.knockrequests.impl.list_KnockRequestsListView_Day_1_en","features.knockrequests.impl.list_KnockRequestsListView_Night_1_en",20301,], -["features.knockrequests.impl.list_KnockRequestsListView_Day_2_en","features.knockrequests.impl.list_KnockRequestsListView_Night_2_en",20301,], -["features.knockrequests.impl.list_KnockRequestsListView_Day_3_en","features.knockrequests.impl.list_KnockRequestsListView_Night_3_en",20301,], -["features.knockrequests.impl.list_KnockRequestsListView_Day_4_en","features.knockrequests.impl.list_KnockRequestsListView_Night_4_en",20301,], -["features.knockrequests.impl.list_KnockRequestsListView_Day_5_en","features.knockrequests.impl.list_KnockRequestsListView_Night_5_en",20301,], -["features.knockrequests.impl.list_KnockRequestsListView_Day_6_en","features.knockrequests.impl.list_KnockRequestsListView_Night_6_en",20301,], -["features.knockrequests.impl.list_KnockRequestsListView_Day_7_en","features.knockrequests.impl.list_KnockRequestsListView_Night_7_en",20301,], -["features.knockrequests.impl.list_KnockRequestsListView_Day_8_en","features.knockrequests.impl.list_KnockRequestsListView_Night_8_en",20301,], -["features.knockrequests.impl.list_KnockRequestsListView_Day_9_en","features.knockrequests.impl.list_KnockRequestsListView_Night_9_en",20301,], +["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,], ["libraries.designsystem.components_LabelledCheckbox_Toggles_en","",0,], -["features.leaveroom.api_LeaveRoomView_Day_0_en","features.leaveroom.api_LeaveRoomView_Night_0_en",0,], -["features.leaveroom.api_LeaveRoomView_Day_1_en","features.leaveroom.api_LeaveRoomView_Night_1_en",20301,], -["features.leaveroom.api_LeaveRoomView_Day_2_en","features.leaveroom.api_LeaveRoomView_Night_2_en",20301,], -["features.leaveroom.api_LeaveRoomView_Day_3_en","features.leaveroom.api_LeaveRoomView_Night_3_en",20301,], -["features.leaveroom.api_LeaveRoomView_Day_4_en","features.leaveroom.api_LeaveRoomView_Night_4_en",20301,], -["features.leaveroom.api_LeaveRoomView_Day_5_en","features.leaveroom.api_LeaveRoomView_Night_5_en",20301,], -["features.leaveroom.api_LeaveRoomView_Day_6_en","features.leaveroom.api_LeaveRoomView_Night_6_en",20301,], +["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,], ["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",20301,], +["features.messages.impl.link_LinkView_Day_1_en","features.messages.impl.link_LinkView_Night_1_en",20308,], ["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,], @@ -589,31 +592,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",20301,], -["features.lockscreen.impl.settings_LockScreenSettingsView_Day_0_en","features.lockscreen.impl.settings_LockScreenSettingsView_Night_0_en",20301,], -["features.lockscreen.impl.settings_LockScreenSettingsView_Day_1_en","features.lockscreen.impl.settings_LockScreenSettingsView_Night_1_en",20301,], -["features.lockscreen.impl.settings_LockScreenSettingsView_Day_2_en","features.lockscreen.impl.settings_LockScreenSettingsView_Night_2_en",20301,], +["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.loggedin_LoggedInView_Day_0_en","appnav.loggedin_LoggedInView_Night_0_en",0,], -["appnav.loggedin_LoggedInView_Day_1_en","appnav.loggedin_LoggedInView_Night_1_en",20301,], -["appnav.loggedin_LoggedInView_Day_2_en","appnav.loggedin_LoggedInView_Night_2_en",20301,], -["appnav.loggedin_LoggedInView_Day_3_en","appnav.loggedin_LoggedInView_Night_3_en",20301,], -["features.login.impl.screens.loginpassword_LoginPasswordView_Day_0_en","features.login.impl.screens.loginpassword_LoginPasswordView_Night_0_en",20301,], -["features.login.impl.screens.loginpassword_LoginPasswordView_Day_1_en","features.login.impl.screens.loginpassword_LoginPasswordView_Night_1_en",20301,], -["features.login.impl.screens.loginpassword_LoginPasswordView_Day_2_en","features.login.impl.screens.loginpassword_LoginPasswordView_Night_2_en",20301,], -["features.logout.impl_LogoutView_Day_0_en","features.logout.impl_LogoutView_Night_0_en",20301,], -["features.logout.impl_LogoutView_Day_10_en","features.logout.impl_LogoutView_Night_10_en",20301,], -["features.logout.impl_LogoutView_Day_11_en","features.logout.impl_LogoutView_Night_11_en",20301,], -["features.logout.impl_LogoutView_Day_1_en","features.logout.impl_LogoutView_Night_1_en",20301,], -["features.logout.impl_LogoutView_Day_2_en","features.logout.impl_LogoutView_Night_2_en",20301,], -["features.logout.impl_LogoutView_Day_3_en","features.logout.impl_LogoutView_Night_3_en",20301,], -["features.logout.impl_LogoutView_Day_4_en","features.logout.impl_LogoutView_Night_4_en",20301,], -["features.logout.impl_LogoutView_Day_5_en","features.logout.impl_LogoutView_Night_5_en",20301,], -["features.logout.impl_LogoutView_Day_6_en","features.logout.impl_LogoutView_Night_6_en",20301,], -["features.logout.impl_LogoutView_Day_7_en","features.logout.impl_LogoutView_Night_7_en",20301,], -["features.logout.impl_LogoutView_Day_8_en","features.logout.impl_LogoutView_Night_8_en",20301,], -["features.logout.impl_LogoutView_Day_9_en","features.logout.impl_LogoutView_Night_9_en",20301,], +["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,], ["libraries.designsystem.components.button_MainActionButton_Buttons_en","",0,], -["libraries.textcomposer_MarkdownTextComposerEdit_Day_0_en","libraries.textcomposer_MarkdownTextComposerEdit_Night_0_en",20301,], +["libraries.textcomposer_MarkdownTextComposerEdit_Day_0_en","libraries.textcomposer_MarkdownTextComposerEdit_Night_0_en",20308,], ["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,], @@ -626,22 +634,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",20301,], -["libraries.mediaviewer.impl.details_MediaDetailsBottomSheet_Day_0_en","libraries.mediaviewer.impl.details_MediaDetailsBottomSheet_Night_0_en",20301,], +["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.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",20301,], -["libraries.mediaviewer.impl.gallery_MediaGalleryView_Day_10_en","libraries.mediaviewer.impl.gallery_MediaGalleryView_Night_10_en",20301,], -["libraries.mediaviewer.impl.gallery_MediaGalleryView_Day_11_en","libraries.mediaviewer.impl.gallery_MediaGalleryView_Night_11_en",20301,], -["libraries.mediaviewer.impl.gallery_MediaGalleryView_Day_12_en","libraries.mediaviewer.impl.gallery_MediaGalleryView_Night_12_en",20301,], -["libraries.mediaviewer.impl.gallery_MediaGalleryView_Day_1_en","libraries.mediaviewer.impl.gallery_MediaGalleryView_Night_1_en",20301,], -["libraries.mediaviewer.impl.gallery_MediaGalleryView_Day_2_en","libraries.mediaviewer.impl.gallery_MediaGalleryView_Night_2_en",20301,], -["libraries.mediaviewer.impl.gallery_MediaGalleryView_Day_3_en","libraries.mediaviewer.impl.gallery_MediaGalleryView_Night_3_en",20301,], -["libraries.mediaviewer.impl.gallery_MediaGalleryView_Day_4_en","libraries.mediaviewer.impl.gallery_MediaGalleryView_Night_4_en",20301,], -["libraries.mediaviewer.impl.gallery_MediaGalleryView_Day_5_en","libraries.mediaviewer.impl.gallery_MediaGalleryView_Night_5_en",20301,], -["libraries.mediaviewer.impl.gallery_MediaGalleryView_Day_6_en","libraries.mediaviewer.impl.gallery_MediaGalleryView_Night_6_en",20301,], -["libraries.mediaviewer.impl.gallery_MediaGalleryView_Day_7_en","libraries.mediaviewer.impl.gallery_MediaGalleryView_Night_7_en",20301,], -["libraries.mediaviewer.impl.gallery_MediaGalleryView_Day_8_en","libraries.mediaviewer.impl.gallery_MediaGalleryView_Night_8_en",20301,], -["libraries.mediaviewer.impl.gallery_MediaGalleryView_Day_9_en","libraries.mediaviewer.impl.gallery_MediaGalleryView_Night_9_en",20301,], +["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.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,], @@ -649,14 +657,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","",20301,], -["libraries.mediaviewer.impl.viewer_MediaViewerView_12_en","",20301,], +["libraries.mediaviewer.impl.viewer_MediaViewerView_11_en","",20308,], +["libraries.mediaviewer.impl.viewer_MediaViewerView_12_en","",20308,], ["libraries.mediaviewer.impl.viewer_MediaViewerView_13_en","",0,], -["libraries.mediaviewer.impl.viewer_MediaViewerView_14_en","",20301,], +["libraries.mediaviewer.impl.viewer_MediaViewerView_14_en","",20308,], ["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","",20301,], +["libraries.mediaviewer.impl.viewer_MediaViewerView_2_en","",20308,], ["libraries.mediaviewer.impl.viewer_MediaViewerView_3_en","",0,], ["libraries.mediaviewer.impl.viewer_MediaViewerView_4_en","",0,], ["libraries.mediaviewer.impl.viewer_MediaViewerView_5_en","",0,], @@ -669,7 +677,7 @@ export const screenshots = [ ["libraries.textcomposer.mentions_MentionSpanTheme_Day_0_en","libraries.textcomposer.mentions_MentionSpanTheme_Night_0_en",0,], ["libraries.designsystem.theme.components.previews_Menu_Menus_en","",0,], ["features.messages.impl.messagecomposer_MessageComposerViewVoice_Day_0_en","features.messages.impl.messagecomposer_MessageComposerViewVoice_Night_0_en",0,], -["features.messages.impl.messagecomposer_MessageComposerView_Day_0_en","features.messages.impl.messagecomposer_MessageComposerView_Night_0_en",20301,], +["features.messages.impl.messagecomposer_MessageComposerView_Day_0_en","features.messages.impl.messagecomposer_MessageComposerView_Night_0_en",20308,], ["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,], @@ -678,7 +686,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",20301,], +["features.messages.impl.timeline.components_MessageShieldView_Day_0_en","features.messages.impl.timeline.components_MessageShieldView_Night_0_en",20308,], ["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,], @@ -686,26 +694,26 @@ export const screenshots = [ ["features.messages.impl.timeline.components_MessagesReactionButton_Day_1_en","features.messages.impl.timeline.components_MessagesReactionButton_Night_1_en",0,], ["features.messages.impl.timeline.components_MessagesReactionButton_Day_2_en","features.messages.impl.timeline.components_MessagesReactionButton_Night_2_en",0,], ["features.messages.impl.timeline.components_MessagesReactionButton_Day_3_en","features.messages.impl.timeline.components_MessagesReactionButton_Night_3_en",0,], -["features.messages.impl.crypto.identity_MessagesViewWithIdentityChange_Day_0_en","features.messages.impl.crypto.identity_MessagesViewWithIdentityChange_Night_0_en",20301,], -["features.messages.impl.crypto.identity_MessagesViewWithIdentityChange_Day_1_en","features.messages.impl.crypto.identity_MessagesViewWithIdentityChange_Night_1_en",20301,], -["features.messages.impl.crypto.identity_MessagesViewWithIdentityChange_Day_2_en","features.messages.impl.crypto.identity_MessagesViewWithIdentityChange_Night_2_en",20301,], -["features.messages.impl_MessagesView_Day_0_en","features.messages.impl_MessagesView_Night_0_en",20301,], -["features.messages.impl_MessagesView_Day_10_en","features.messages.impl_MessagesView_Night_10_en",20301,], -["features.messages.impl_MessagesView_Day_11_en","features.messages.impl_MessagesView_Night_11_en",20301,], -["features.messages.impl_MessagesView_Day_12_en","features.messages.impl_MessagesView_Night_12_en",20301,], -["features.messages.impl_MessagesView_Day_13_en","features.messages.impl_MessagesView_Night_13_en",20301,], -["features.messages.impl_MessagesView_Day_14_en","features.messages.impl_MessagesView_Night_14_en",20301,], -["features.messages.impl_MessagesView_Day_1_en","features.messages.impl_MessagesView_Night_1_en",20301,], -["features.messages.impl_MessagesView_Day_2_en","features.messages.impl_MessagesView_Night_2_en",20301,], -["features.messages.impl_MessagesView_Day_3_en","features.messages.impl_MessagesView_Night_3_en",20301,], -["features.messages.impl_MessagesView_Day_4_en","features.messages.impl_MessagesView_Night_4_en",20301,], -["features.messages.impl_MessagesView_Day_5_en","features.messages.impl_MessagesView_Night_5_en",20301,], -["features.messages.impl_MessagesView_Day_6_en","features.messages.impl_MessagesView_Night_6_en",20301,], -["features.messages.impl_MessagesView_Day_7_en","features.messages.impl_MessagesView_Night_7_en",20301,], -["features.messages.impl_MessagesView_Day_8_en","features.messages.impl_MessagesView_Night_8_en",20301,], -["features.messages.impl_MessagesView_Day_9_en","features.messages.impl_MessagesView_Night_9_en",20301,], +["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.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",20301,], +["features.migration.impl_MigrationView_Day_1_en","features.migration.impl_MigrationView_Night_1_en",20308,], ["libraries.designsystem.theme.components_ModalBottomSheetDark_Bottom_Sheets_en","",0,], ["libraries.designsystem.theme.components_ModalBottomSheetLight_Bottom_Sheets_en","",0,], ["appicon.element_MonochromeIcon_en","",0,], @@ -715,107 +723,107 @@ 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",20301,], -["features.preferences.impl.notifications_NotificationSettingsView_Day_10_en","features.preferences.impl.notifications_NotificationSettingsView_Night_10_en",20301,], -["features.preferences.impl.notifications_NotificationSettingsView_Day_11_en","features.preferences.impl.notifications_NotificationSettingsView_Night_11_en",20301,], -["features.preferences.impl.notifications_NotificationSettingsView_Day_12_en","features.preferences.impl.notifications_NotificationSettingsView_Night_12_en",20301,], -["features.preferences.impl.notifications_NotificationSettingsView_Day_13_en","features.preferences.impl.notifications_NotificationSettingsView_Night_13_en",20301,], -["features.preferences.impl.notifications_NotificationSettingsView_Day_1_en","features.preferences.impl.notifications_NotificationSettingsView_Night_1_en",20301,], -["features.preferences.impl.notifications_NotificationSettingsView_Day_2_en","features.preferences.impl.notifications_NotificationSettingsView_Night_2_en",20301,], -["features.preferences.impl.notifications_NotificationSettingsView_Day_3_en","features.preferences.impl.notifications_NotificationSettingsView_Night_3_en",20301,], -["features.preferences.impl.notifications_NotificationSettingsView_Day_4_en","features.preferences.impl.notifications_NotificationSettingsView_Night_4_en",20301,], -["features.preferences.impl.notifications_NotificationSettingsView_Day_5_en","features.preferences.impl.notifications_NotificationSettingsView_Night_5_en",20301,], -["features.preferences.impl.notifications_NotificationSettingsView_Day_6_en","features.preferences.impl.notifications_NotificationSettingsView_Night_6_en",20301,], -["features.preferences.impl.notifications_NotificationSettingsView_Day_7_en","features.preferences.impl.notifications_NotificationSettingsView_Night_7_en",20301,], -["features.preferences.impl.notifications_NotificationSettingsView_Day_8_en","features.preferences.impl.notifications_NotificationSettingsView_Night_8_en",20301,], -["features.preferences.impl.notifications_NotificationSettingsView_Day_9_en","features.preferences.impl.notifications_NotificationSettingsView_Night_9_en",20301,], -["features.ftue.impl.notifications_NotificationsOptInView_Day_0_en","features.ftue.impl.notifications_NotificationsOptInView_Night_0_en",20301,], +["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,], ["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",20301,], -["features.login.impl.screens.onboarding_OnBoardingView_Day_1_en","features.login.impl.screens.onboarding_OnBoardingView_Night_1_en",20301,], -["features.login.impl.screens.onboarding_OnBoardingView_Day_2_en","features.login.impl.screens.onboarding_OnBoardingView_Night_2_en",20301,], -["features.login.impl.screens.onboarding_OnBoardingView_Day_3_en","features.login.impl.screens.onboarding_OnBoardingView_Night_3_en",20301,], -["features.login.impl.screens.onboarding_OnBoardingView_Day_4_en","features.login.impl.screens.onboarding_OnBoardingView_Night_4_en",20301,], -["features.login.impl.screens.onboarding_OnBoardingView_Day_5_en","features.login.impl.screens.onboarding_OnBoardingView_Night_5_en",20301,], +["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,], ["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",20301,], -["features.verifysession.impl.outgoing_OutgoingVerificationView_Day_10_en","features.verifysession.impl.outgoing_OutgoingVerificationView_Night_10_en",20301,], -["features.verifysession.impl.outgoing_OutgoingVerificationView_Day_11_en","features.verifysession.impl.outgoing_OutgoingVerificationView_Night_11_en",20301,], +["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,], ["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",20301,], -["features.verifysession.impl.outgoing_OutgoingVerificationView_Day_2_en","features.verifysession.impl.outgoing_OutgoingVerificationView_Night_2_en",20301,], -["features.verifysession.impl.outgoing_OutgoingVerificationView_Day_3_en","features.verifysession.impl.outgoing_OutgoingVerificationView_Night_3_en",20301,], -["features.verifysession.impl.outgoing_OutgoingVerificationView_Day_4_en","features.verifysession.impl.outgoing_OutgoingVerificationView_Night_4_en",20301,], -["features.verifysession.impl.outgoing_OutgoingVerificationView_Day_5_en","features.verifysession.impl.outgoing_OutgoingVerificationView_Night_5_en",20301,], -["features.verifysession.impl.outgoing_OutgoingVerificationView_Day_6_en","features.verifysession.impl.outgoing_OutgoingVerificationView_Night_6_en",20301,], -["features.verifysession.impl.outgoing_OutgoingVerificationView_Day_7_en","features.verifysession.impl.outgoing_OutgoingVerificationView_Night_7_en",20301,], -["features.verifysession.impl.outgoing_OutgoingVerificationView_Day_8_en","features.verifysession.impl.outgoing_OutgoingVerificationView_Night_8_en",20301,], -["features.verifysession.impl.outgoing_OutgoingVerificationView_Day_9_en","features.verifysession.impl.outgoing_OutgoingVerificationView_Night_9_en",20301,], +["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,], ["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",20301,], -["features.roomdetails.impl.rolesandpermissions.changeroles_PendingMemberRowWithLongName_Day_0_en","features.roomdetails.impl.rolesandpermissions.changeroles_PendingMemberRowWithLongName_Night_0_en",20301,], -["libraries.permissions.api_PermissionsView_Day_0_en","libraries.permissions.api_PermissionsView_Night_0_en",20301,], -["libraries.permissions.api_PermissionsView_Day_1_en","libraries.permissions.api_PermissionsView_Night_1_en",20301,], -["libraries.permissions.api_PermissionsView_Day_2_en","libraries.permissions.api_PermissionsView_Night_2_en",20301,], -["libraries.permissions.api_PermissionsView_Day_3_en","libraries.permissions.api_PermissionsView_Night_3_en",20301,], +["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,], ["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",20301,], -["features.lockscreen.impl.unlock_PinUnlockViewInApp_Day_1_en","features.lockscreen.impl.unlock_PinUnlockViewInApp_Night_1_en",20301,], -["features.lockscreen.impl.unlock_PinUnlockViewInApp_Day_2_en","features.lockscreen.impl.unlock_PinUnlockViewInApp_Night_2_en",20301,], -["features.lockscreen.impl.unlock_PinUnlockViewInApp_Day_3_en","features.lockscreen.impl.unlock_PinUnlockViewInApp_Night_3_en",20301,], -["features.lockscreen.impl.unlock_PinUnlockViewInApp_Day_4_en","features.lockscreen.impl.unlock_PinUnlockViewInApp_Night_4_en",20301,], -["features.lockscreen.impl.unlock_PinUnlockViewInApp_Day_5_en","features.lockscreen.impl.unlock_PinUnlockViewInApp_Night_5_en",20301,], -["features.lockscreen.impl.unlock_PinUnlockViewInApp_Day_6_en","features.lockscreen.impl.unlock_PinUnlockViewInApp_Night_6_en",20301,], -["features.lockscreen.impl.unlock_PinUnlockViewInApp_Day_7_en","features.lockscreen.impl.unlock_PinUnlockViewInApp_Night_7_en",20301,], -["features.lockscreen.impl.unlock_PinUnlockView_Day_0_en","features.lockscreen.impl.unlock_PinUnlockView_Night_0_en",20301,], -["features.lockscreen.impl.unlock_PinUnlockView_Day_1_en","features.lockscreen.impl.unlock_PinUnlockView_Night_1_en",20301,], -["features.lockscreen.impl.unlock_PinUnlockView_Day_2_en","features.lockscreen.impl.unlock_PinUnlockView_Night_2_en",20301,], -["features.lockscreen.impl.unlock_PinUnlockView_Day_3_en","features.lockscreen.impl.unlock_PinUnlockView_Night_3_en",20301,], -["features.lockscreen.impl.unlock_PinUnlockView_Day_4_en","features.lockscreen.impl.unlock_PinUnlockView_Night_4_en",20301,], -["features.lockscreen.impl.unlock_PinUnlockView_Day_5_en","features.lockscreen.impl.unlock_PinUnlockView_Night_5_en",20301,], -["features.lockscreen.impl.unlock_PinUnlockView_Day_6_en","features.lockscreen.impl.unlock_PinUnlockView_Night_6_en",20301,], -["features.lockscreen.impl.unlock_PinUnlockView_Day_7_en","features.lockscreen.impl.unlock_PinUnlockView_Night_7_en",20301,], +["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.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",20301,], -["features.messages.impl.pinned.banner_PinnedMessagesBannerView_Day_1_en","features.messages.impl.pinned.banner_PinnedMessagesBannerView_Night_1_en",20301,], -["features.messages.impl.pinned.banner_PinnedMessagesBannerView_Day_2_en","features.messages.impl.pinned.banner_PinnedMessagesBannerView_Night_2_en",20301,], -["features.messages.impl.pinned.banner_PinnedMessagesBannerView_Day_3_en","features.messages.impl.pinned.banner_PinnedMessagesBannerView_Night_3_en",20301,], -["features.messages.impl.pinned.banner_PinnedMessagesBannerView_Day_4_en","features.messages.impl.pinned.banner_PinnedMessagesBannerView_Night_4_en",20301,], -["features.messages.impl.pinned.banner_PinnedMessagesBannerView_Day_5_en","features.messages.impl.pinned.banner_PinnedMessagesBannerView_Night_5_en",20301,], -["features.messages.impl.pinned.banner_PinnedMessagesBannerView_Day_6_en","features.messages.impl.pinned.banner_PinnedMessagesBannerView_Night_6_en",20301,], -["features.messages.impl.pinned.banner_PinnedMessagesBannerView_Day_7_en","features.messages.impl.pinned.banner_PinnedMessagesBannerView_Night_7_en",20301,], -["features.messages.impl.pinned.banner_PinnedMessagesBannerView_Day_8_en","features.messages.impl.pinned.banner_PinnedMessagesBannerView_Night_8_en",20301,], -["features.messages.impl.pinned.banner_PinnedMessagesBannerView_Day_9_en","features.messages.impl.pinned.banner_PinnedMessagesBannerView_Night_9_en",20301,], -["features.messages.impl.pinned.list_PinnedMessagesListView_Day_0_en","features.messages.impl.pinned.list_PinnedMessagesListView_Night_0_en",20301,], -["features.messages.impl.pinned.list_PinnedMessagesListView_Day_1_en","features.messages.impl.pinned.list_PinnedMessagesListView_Night_1_en",20301,], -["features.messages.impl.pinned.list_PinnedMessagesListView_Day_2_en","features.messages.impl.pinned.list_PinnedMessagesListView_Night_2_en",20301,], -["features.messages.impl.pinned.list_PinnedMessagesListView_Day_3_en","features.messages.impl.pinned.list_PinnedMessagesListView_Night_3_en",20301,], +["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,], ["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",20301,], -["features.poll.api.pollcontent_PollAnswerViewDisclosedSelected_Day_0_en","features.poll.api.pollcontent_PollAnswerViewDisclosedSelected_Night_0_en",20301,], -["features.poll.api.pollcontent_PollAnswerViewEndedSelected_Day_0_en","features.poll.api.pollcontent_PollAnswerViewEndedSelected_Night_0_en",20301,], -["features.poll.api.pollcontent_PollAnswerViewEndedWinnerNotSelected_Day_0_en","features.poll.api.pollcontent_PollAnswerViewEndedWinnerNotSelected_Night_0_en",20301,], -["features.poll.api.pollcontent_PollAnswerViewEndedWinnerSelected_Day_0_en","features.poll.api.pollcontent_PollAnswerViewEndedWinnerSelected_Night_0_en",20301,], +["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_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",20301,], -["features.poll.api.pollcontent_PollContentViewCreatorEnded_Day_0_en","features.poll.api.pollcontent_PollContentViewCreatorEnded_Night_0_en",20301,], -["features.poll.api.pollcontent_PollContentViewCreator_Day_0_en","features.poll.api.pollcontent_PollContentViewCreator_Night_0_en",20301,], -["features.poll.api.pollcontent_PollContentViewDisclosed_Day_0_en","features.poll.api.pollcontent_PollContentViewDisclosed_Night_0_en",20301,], -["features.poll.api.pollcontent_PollContentViewEnded_Day_0_en","features.poll.api.pollcontent_PollContentViewEnded_Night_0_en",20301,], -["features.poll.api.pollcontent_PollContentViewUndisclosed_Day_0_en","features.poll.api.pollcontent_PollContentViewUndisclosed_Night_0_en",20301,], -["features.poll.impl.history_PollHistoryView_Day_0_en","features.poll.impl.history_PollHistoryView_Night_0_en",20301,], -["features.poll.impl.history_PollHistoryView_Day_1_en","features.poll.impl.history_PollHistoryView_Night_1_en",20301,], -["features.poll.impl.history_PollHistoryView_Day_2_en","features.poll.impl.history_PollHistoryView_Night_2_en",20301,], -["features.poll.impl.history_PollHistoryView_Day_3_en","features.poll.impl.history_PollHistoryView_Night_3_en",20301,], -["features.poll.impl.history_PollHistoryView_Day_4_en","features.poll.impl.history_PollHistoryView_Night_4_en",20301,], +["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_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,], @@ -829,207 +837,208 @@ export const screenshots = [ ["libraries.designsystem.components.preferences_PreferenceRow_Preferences_en","",0,], ["libraries.designsystem.components.preferences_PreferenceSlide_Preferences_en","",0,], ["libraries.designsystem.components.preferences_PreferenceSwitch_Preferences_en","",0,], -["features.preferences.impl.root_PreferencesRootViewDark_0_en","",20301,], -["features.preferences.impl.root_PreferencesRootViewDark_1_en","",20301,], -["features.preferences.impl.root_PreferencesRootViewLight_0_en","",20301,], -["features.preferences.impl.root_PreferencesRootViewLight_1_en","",20301,], +["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.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","",20301,], -["libraries.designsystem.components_ProgressDialog_Day_0_en","libraries.designsystem.components_ProgressDialog_Night_0_en",20301,], -["features.messages.impl.timeline.protection_ProtectedView_Day_0_en","features.messages.impl.timeline.protection_ProtectedView_Night_0_en",20301,], -["features.messages.impl.timeline.protection_ProtectedView_Day_1_en","features.messages.impl.timeline.protection_ProtectedView_Night_1_en",20301,], -["features.messages.impl.timeline.protection_ProtectedView_Day_2_en","features.messages.impl.timeline.protection_ProtectedView_Night_2_en",20301,], -["features.messages.impl.timeline.protection_ProtectedView_Day_3_en","features.messages.impl.timeline.protection_ProtectedView_Night_3_en",20301,], -["libraries.troubleshoot.impl.history_PushHistoryView_Day_0_en","libraries.troubleshoot.impl.history_PushHistoryView_Night_0_en",20301,], -["libraries.troubleshoot.impl.history_PushHistoryView_Day_1_en","libraries.troubleshoot.impl.history_PushHistoryView_Night_1_en",20301,], -["libraries.troubleshoot.impl.history_PushHistoryView_Day_2_en","libraries.troubleshoot.impl.history_PushHistoryView_Night_2_en",20301,], -["features.login.impl.screens.qrcode.confirmation_QrCodeConfirmationView_Day_0_en","features.login.impl.screens.qrcode.confirmation_QrCodeConfirmationView_Night_0_en",20301,], -["features.login.impl.screens.qrcode.confirmation_QrCodeConfirmationView_Day_1_en","features.login.impl.screens.qrcode.confirmation_QrCodeConfirmationView_Night_1_en",20301,], -["features.login.impl.screens.qrcode.confirmation_QrCodeConfirmationView_Day_2_en","features.login.impl.screens.qrcode.confirmation_QrCodeConfirmationView_Night_2_en",20301,], -["features.login.impl.screens.qrcode.error_QrCodeErrorView_Day_0_en","features.login.impl.screens.qrcode.error_QrCodeErrorView_Night_0_en",20301,], -["features.login.impl.screens.qrcode.error_QrCodeErrorView_Day_1_en","features.login.impl.screens.qrcode.error_QrCodeErrorView_Night_1_en",20301,], -["features.login.impl.screens.qrcode.error_QrCodeErrorView_Day_2_en","features.login.impl.screens.qrcode.error_QrCodeErrorView_Night_2_en",20301,], -["features.login.impl.screens.qrcode.error_QrCodeErrorView_Day_3_en","features.login.impl.screens.qrcode.error_QrCodeErrorView_Night_3_en",20301,], -["features.login.impl.screens.qrcode.error_QrCodeErrorView_Day_4_en","features.login.impl.screens.qrcode.error_QrCodeErrorView_Night_4_en",20301,], -["features.login.impl.screens.qrcode.error_QrCodeErrorView_Day_5_en","features.login.impl.screens.qrcode.error_QrCodeErrorView_Night_5_en",20301,], -["features.login.impl.screens.qrcode.error_QrCodeErrorView_Day_6_en","features.login.impl.screens.qrcode.error_QrCodeErrorView_Night_6_en",20301,], -["features.login.impl.screens.qrcode.intro_QrCodeIntroView_Day_0_en","features.login.impl.screens.qrcode.intro_QrCodeIntroView_Night_0_en",20301,], -["features.login.impl.screens.qrcode.intro_QrCodeIntroView_Day_1_en","features.login.impl.screens.qrcode.intro_QrCodeIntroView_Night_1_en",20301,], -["features.login.impl.screens.qrcode.scan_QrCodeScanView_Day_0_en","features.login.impl.screens.qrcode.scan_QrCodeScanView_Night_0_en",20301,], -["features.login.impl.screens.qrcode.scan_QrCodeScanView_Day_1_en","features.login.impl.screens.qrcode.scan_QrCodeScanView_Night_1_en",20301,], -["features.login.impl.screens.qrcode.scan_QrCodeScanView_Day_2_en","features.login.impl.screens.qrcode.scan_QrCodeScanView_Night_2_en",20301,], -["features.login.impl.screens.qrcode.scan_QrCodeScanView_Day_3_en","features.login.impl.screens.qrcode.scan_QrCodeScanView_Night_3_en",20301,], -["features.login.impl.screens.qrcode.scan_QrCodeScanView_Day_4_en","features.login.impl.screens.qrcode.scan_QrCodeScanView_Night_4_en",20301,], +["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.theme.components_RadioButton_Toggles_en","",0,], -["features.rageshake.api.detection_RageshakeDialogContent_Day_0_en","features.rageshake.api.detection_RageshakeDialogContent_Night_0_en",20301,], -["features.rageshake.api.preferences_RageshakePreferencesView_Day_0_en","features.rageshake.api.preferences_RageshakePreferencesView_Night_0_en",20301,], +["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.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",20301,], -["features.messages.impl.timeline.components.receipt.bottomsheet_ReadReceiptBottomSheet_Day_1_en","features.messages.impl.timeline.components.receipt.bottomsheet_ReadReceiptBottomSheet_Night_1_en",20301,], -["features.messages.impl.timeline.components.receipt.bottomsheet_ReadReceiptBottomSheet_Day_2_en","features.messages.impl.timeline.components.receipt.bottomsheet_ReadReceiptBottomSheet_Night_2_en",20301,], -["features.messages.impl.timeline.components.receipt.bottomsheet_ReadReceiptBottomSheet_Day_3_en","features.messages.impl.timeline.components.receipt.bottomsheet_ReadReceiptBottomSheet_Night_3_en",20301,], -["features.messages.impl.timeline.components.receipt.bottomsheet_ReadReceiptBottomSheet_Day_4_en","features.messages.impl.timeline.components.receipt.bottomsheet_ReadReceiptBottomSheet_Night_4_en",20301,], -["features.messages.impl.timeline.components.receipt.bottomsheet_ReadReceiptBottomSheet_Day_5_en","features.messages.impl.timeline.components.receipt.bottomsheet_ReadReceiptBottomSheet_Night_5_en",20301,], -["features.securebackup.impl.setup.views_RecoveryKeyView_Day_0_en","features.securebackup.impl.setup.views_RecoveryKeyView_Night_0_en",20301,], -["features.securebackup.impl.setup.views_RecoveryKeyView_Day_10_en","features.securebackup.impl.setup.views_RecoveryKeyView_Night_10_en",20301,], -["features.securebackup.impl.setup.views_RecoveryKeyView_Day_11_en","features.securebackup.impl.setup.views_RecoveryKeyView_Night_11_en",20301,], -["features.securebackup.impl.setup.views_RecoveryKeyView_Day_12_en","features.securebackup.impl.setup.views_RecoveryKeyView_Night_12_en",20301,], -["features.securebackup.impl.setup.views_RecoveryKeyView_Day_13_en","features.securebackup.impl.setup.views_RecoveryKeyView_Night_13_en",20301,], -["features.securebackup.impl.setup.views_RecoveryKeyView_Day_1_en","features.securebackup.impl.setup.views_RecoveryKeyView_Night_1_en",20301,], -["features.securebackup.impl.setup.views_RecoveryKeyView_Day_2_en","features.securebackup.impl.setup.views_RecoveryKeyView_Night_2_en",20301,], -["features.securebackup.impl.setup.views_RecoveryKeyView_Day_3_en","features.securebackup.impl.setup.views_RecoveryKeyView_Night_3_en",20301,], -["features.securebackup.impl.setup.views_RecoveryKeyView_Day_4_en","features.securebackup.impl.setup.views_RecoveryKeyView_Night_4_en",20301,], -["features.securebackup.impl.setup.views_RecoveryKeyView_Day_5_en","features.securebackup.impl.setup.views_RecoveryKeyView_Night_5_en",20301,], -["features.securebackup.impl.setup.views_RecoveryKeyView_Day_6_en","features.securebackup.impl.setup.views_RecoveryKeyView_Night_6_en",20301,], -["features.securebackup.impl.setup.views_RecoveryKeyView_Day_7_en","features.securebackup.impl.setup.views_RecoveryKeyView_Night_7_en",20301,], -["features.securebackup.impl.setup.views_RecoveryKeyView_Day_8_en","features.securebackup.impl.setup.views_RecoveryKeyView_Night_8_en",20301,], -["features.securebackup.impl.setup.views_RecoveryKeyView_Day_9_en","features.securebackup.impl.setup.views_RecoveryKeyView_Night_9_en",20301,], +["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,], ["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",20301,], -["features.messages.impl.report_ReportMessageView_Day_1_en","features.messages.impl.report_ReportMessageView_Night_1_en",20301,], -["features.messages.impl.report_ReportMessageView_Day_2_en","features.messages.impl.report_ReportMessageView_Night_2_en",20301,], -["features.messages.impl.report_ReportMessageView_Day_3_en","features.messages.impl.report_ReportMessageView_Night_3_en",20301,], -["features.messages.impl.report_ReportMessageView_Day_4_en","features.messages.impl.report_ReportMessageView_Night_4_en",20301,], -["features.messages.impl.report_ReportMessageView_Day_5_en","features.messages.impl.report_ReportMessageView_Night_5_en",20301,], -["features.reportroom.impl_ReportRoomView_Day_0_en","features.reportroom.impl_ReportRoomView_Night_0_en",20301,], -["features.reportroom.impl_ReportRoomView_Day_1_en","features.reportroom.impl_ReportRoomView_Night_1_en",20301,], -["features.reportroom.impl_ReportRoomView_Day_2_en","features.reportroom.impl_ReportRoomView_Night_2_en",20301,], -["features.reportroom.impl_ReportRoomView_Day_3_en","features.reportroom.impl_ReportRoomView_Night_3_en",20301,], -["features.reportroom.impl_ReportRoomView_Day_4_en","features.reportroom.impl_ReportRoomView_Night_4_en",20301,], -["features.securebackup.impl.reset.password_ResetIdentityPasswordView_Day_0_en","features.securebackup.impl.reset.password_ResetIdentityPasswordView_Night_0_en",20301,], -["features.securebackup.impl.reset.password_ResetIdentityPasswordView_Day_1_en","features.securebackup.impl.reset.password_ResetIdentityPasswordView_Night_1_en",20301,], -["features.securebackup.impl.reset.password_ResetIdentityPasswordView_Day_2_en","features.securebackup.impl.reset.password_ResetIdentityPasswordView_Night_2_en",20301,], -["features.securebackup.impl.reset.password_ResetIdentityPasswordView_Day_3_en","features.securebackup.impl.reset.password_ResetIdentityPasswordView_Night_3_en",20301,], -["features.securebackup.impl.reset.root_ResetIdentityRootView_Day_0_en","features.securebackup.impl.reset.root_ResetIdentityRootView_Night_0_en",20301,], -["features.securebackup.impl.reset.root_ResetIdentityRootView_Day_1_en","features.securebackup.impl.reset.root_ResetIdentityRootView_Night_1_en",20301,], +["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.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",20301,], -["features.messages.impl.crypto.sendfailure.resolve_ResolveVerifiedUserSendFailureView_Day_2_en","features.messages.impl.crypto.sendfailure.resolve_ResolveVerifiedUserSendFailureView_Night_2_en",20301,], -["libraries.designsystem.components.dialogs_RetryDialogContent_Dialogs_en","",20301,], -["libraries.designsystem.components.dialogs_RetryDialog_Day_0_en","libraries.designsystem.components.dialogs_RetryDialog_Night_0_en",20301,], -["features.roomdetails.impl.rolesandpermissions_RolesAndPermissionsView_Day_0_en","features.roomdetails.impl.rolesandpermissions_RolesAndPermissionsView_Night_0_en",20301,], -["features.roomdetails.impl.rolesandpermissions_RolesAndPermissionsView_Day_1_en","features.roomdetails.impl.rolesandpermissions_RolesAndPermissionsView_Night_1_en",20301,], -["features.roomdetails.impl.rolesandpermissions_RolesAndPermissionsView_Day_2_en","features.roomdetails.impl.rolesandpermissions_RolesAndPermissionsView_Night_2_en",20301,], -["features.roomdetails.impl.rolesandpermissions_RolesAndPermissionsView_Day_3_en","features.roomdetails.impl.rolesandpermissions_RolesAndPermissionsView_Night_3_en",20301,], -["features.roomdetails.impl.rolesandpermissions_RolesAndPermissionsView_Day_4_en","features.roomdetails.impl.rolesandpermissions_RolesAndPermissionsView_Night_4_en",20301,], -["features.roomdetails.impl.rolesandpermissions_RolesAndPermissionsView_Day_5_en","features.roomdetails.impl.rolesandpermissions_RolesAndPermissionsView_Night_5_en",20301,], -["features.roomdetails.impl.rolesandpermissions_RolesAndPermissionsView_Day_6_en","features.roomdetails.impl.rolesandpermissions_RolesAndPermissionsView_Night_6_en",20301,], -["features.roomdetails.impl.rolesandpermissions_RolesAndPermissionsView_Day_7_en","features.roomdetails.impl.rolesandpermissions_RolesAndPermissionsView_Night_7_en",20301,], -["features.roomdetails.impl.rolesandpermissions_RolesAndPermissionsView_Day_8_en","features.roomdetails.impl.rolesandpermissions_RolesAndPermissionsView_Night_8_en",20304,], +["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,], ["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",20301,], -["features.roomaliasresolver.impl_RoomAliasResolverView_Day_2_en","features.roomaliasresolver.impl_RoomAliasResolverView_Night_2_en",20301,], -["features.roomdetails.impl_RoomDetailsDark_0_en","",20301,], -["features.roomdetails.impl_RoomDetailsDark_10_en","",20301,], -["features.roomdetails.impl_RoomDetailsDark_11_en","",20301,], -["features.roomdetails.impl_RoomDetailsDark_12_en","",20301,], -["features.roomdetails.impl_RoomDetailsDark_13_en","",20301,], -["features.roomdetails.impl_RoomDetailsDark_14_en","",20301,], -["features.roomdetails.impl_RoomDetailsDark_15_en","",20301,], -["features.roomdetails.impl_RoomDetailsDark_16_en","",20301,], -["features.roomdetails.impl_RoomDetailsDark_17_en","",20301,], -["features.roomdetails.impl_RoomDetailsDark_18_en","",20301,], -["features.roomdetails.impl_RoomDetailsDark_19_en","",20301,], -["features.roomdetails.impl_RoomDetailsDark_1_en","",20301,], -["features.roomdetails.impl_RoomDetailsDark_2_en","",20301,], -["features.roomdetails.impl_RoomDetailsDark_3_en","",20301,], -["features.roomdetails.impl_RoomDetailsDark_4_en","",20301,], -["features.roomdetails.impl_RoomDetailsDark_5_en","",20301,], -["features.roomdetails.impl_RoomDetailsDark_6_en","",20301,], -["features.roomdetails.impl_RoomDetailsDark_7_en","",20301,], -["features.roomdetails.impl_RoomDetailsDark_8_en","",20301,], -["features.roomdetails.impl_RoomDetailsDark_9_en","",20301,], -["features.roomdetails.impl.edit_RoomDetailsEditView_Day_0_en","features.roomdetails.impl.edit_RoomDetailsEditView_Night_0_en",20301,], -["features.roomdetails.impl.edit_RoomDetailsEditView_Day_1_en","features.roomdetails.impl.edit_RoomDetailsEditView_Night_1_en",20301,], -["features.roomdetails.impl.edit_RoomDetailsEditView_Day_2_en","features.roomdetails.impl.edit_RoomDetailsEditView_Night_2_en",20301,], -["features.roomdetails.impl.edit_RoomDetailsEditView_Day_3_en","features.roomdetails.impl.edit_RoomDetailsEditView_Night_3_en",20301,], -["features.roomdetails.impl.edit_RoomDetailsEditView_Day_4_en","features.roomdetails.impl.edit_RoomDetailsEditView_Night_4_en",20301,], -["features.roomdetails.impl.edit_RoomDetailsEditView_Day_5_en","features.roomdetails.impl.edit_RoomDetailsEditView_Night_5_en",20301,], -["features.roomdetails.impl.edit_RoomDetailsEditView_Day_6_en","features.roomdetails.impl.edit_RoomDetailsEditView_Night_6_en",20301,], -["features.roomdetails.impl.edit_RoomDetailsEditView_Day_7_en","features.roomdetails.impl.edit_RoomDetailsEditView_Night_7_en",20301,], -["features.roomdetails.impl_RoomDetails_0_en","",20301,], -["features.roomdetails.impl_RoomDetails_10_en","",20301,], -["features.roomdetails.impl_RoomDetails_11_en","",20301,], -["features.roomdetails.impl_RoomDetails_12_en","",20301,], -["features.roomdetails.impl_RoomDetails_13_en","",20301,], -["features.roomdetails.impl_RoomDetails_14_en","",20301,], -["features.roomdetails.impl_RoomDetails_15_en","",20301,], -["features.roomdetails.impl_RoomDetails_16_en","",20301,], -["features.roomdetails.impl_RoomDetails_17_en","",20301,], -["features.roomdetails.impl_RoomDetails_18_en","",20301,], -["features.roomdetails.impl_RoomDetails_19_en","",20301,], -["features.roomdetails.impl_RoomDetails_1_en","",20301,], -["features.roomdetails.impl_RoomDetails_2_en","",20301,], -["features.roomdetails.impl_RoomDetails_3_en","",20301,], -["features.roomdetails.impl_RoomDetails_4_en","",20301,], -["features.roomdetails.impl_RoomDetails_5_en","",20301,], -["features.roomdetails.impl_RoomDetails_6_en","",20301,], -["features.roomdetails.impl_RoomDetails_7_en","",20301,], -["features.roomdetails.impl_RoomDetails_8_en","",20301,], -["features.roomdetails.impl_RoomDetails_9_en","",20301,], -["features.roomdirectory.impl.root_RoomDirectoryView_Day_0_en","features.roomdirectory.impl.root_RoomDirectoryView_Night_0_en",20301,], -["features.roomdirectory.impl.root_RoomDirectoryView_Day_1_en","features.roomdirectory.impl.root_RoomDirectoryView_Night_1_en",20301,], -["features.roomdirectory.impl.root_RoomDirectoryView_Day_2_en","features.roomdirectory.impl.root_RoomDirectoryView_Night_2_en",20301,], -["features.roomdetails.impl.invite_RoomInviteMembersView_Day_0_en","features.roomdetails.impl.invite_RoomInviteMembersView_Night_0_en",20301,], -["features.roomdetails.impl.invite_RoomInviteMembersView_Day_1_en","features.roomdetails.impl.invite_RoomInviteMembersView_Night_1_en",20301,], -["features.roomdetails.impl.invite_RoomInviteMembersView_Day_2_en","features.roomdetails.impl.invite_RoomInviteMembersView_Night_2_en",20301,], -["features.roomdetails.impl.invite_RoomInviteMembersView_Day_3_en","features.roomdetails.impl.invite_RoomInviteMembersView_Night_3_en",20301,], -["features.roomdetails.impl.invite_RoomInviteMembersView_Day_4_en","features.roomdetails.impl.invite_RoomInviteMembersView_Night_4_en",20301,], -["features.roomdetails.impl.invite_RoomInviteMembersView_Day_5_en","features.roomdetails.impl.invite_RoomInviteMembersView_Night_5_en",20301,], -["features.roomdetails.impl.invite_RoomInviteMembersView_Day_6_en","features.roomdetails.impl.invite_RoomInviteMembersView_Night_6_en",20301,], -["features.roomdetails.impl.invite_RoomInviteMembersView_Day_7_en","features.roomdetails.impl.invite_RoomInviteMembersView_Night_7_en",20301,], -["features.home.impl.components_RoomListContentView_Day_0_en","features.home.impl.components_RoomListContentView_Night_0_en",20301,], -["features.home.impl.components_RoomListContentView_Day_1_en","features.home.impl.components_RoomListContentView_Night_1_en",20301,], +["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.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",20301,], -["features.home.impl.components_RoomListContentView_Day_4_en","features.home.impl.components_RoomListContentView_Night_4_en",20301,], -["features.home.impl.roomlist_RoomListDeclineInviteMenuContent_Day_0_en","features.home.impl.roomlist_RoomListDeclineInviteMenuContent_Night_0_en",20301,], -["features.home.impl.filters_RoomListFiltersView_Day_0_en","features.home.impl.filters_RoomListFiltersView_Night_0_en",20301,], -["features.home.impl.filters_RoomListFiltersView_Day_1_en","features.home.impl.filters_RoomListFiltersView_Night_1_en",20301,], -["features.home.impl.roomlist_RoomListModalBottomSheetContent_Day_0_en","features.home.impl.roomlist_RoomListModalBottomSheetContent_Night_0_en",20301,], -["features.home.impl.roomlist_RoomListModalBottomSheetContent_Day_1_en","features.home.impl.roomlist_RoomListModalBottomSheetContent_Night_1_en",20301,], -["features.home.impl.roomlist_RoomListModalBottomSheetContent_Day_2_en","features.home.impl.roomlist_RoomListModalBottomSheetContent_Night_2_en",20301,], +["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.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",20301,], -["features.roomdetails.impl.members_RoomMemberListViewBanned_Day_0_en","features.roomdetails.impl.members_RoomMemberListViewBanned_Night_0_en",20301,], -["features.roomdetails.impl.members_RoomMemberListViewBanned_Day_1_en","features.roomdetails.impl.members_RoomMemberListViewBanned_Night_1_en",20301,], -["features.roomdetails.impl.members_RoomMemberListViewBanned_Day_2_en","features.roomdetails.impl.members_RoomMemberListViewBanned_Night_2_en",20301,], -["features.roomdetails.impl.members_RoomMemberListView_Day_0_en","features.roomdetails.impl.members_RoomMemberListView_Night_0_en",20301,], -["features.roomdetails.impl.members_RoomMemberListView_Day_1_en","features.roomdetails.impl.members_RoomMemberListView_Night_1_en",20301,], -["features.roomdetails.impl.members_RoomMemberListView_Day_2_en","features.roomdetails.impl.members_RoomMemberListView_Night_2_en",20301,], -["features.roomdetails.impl.members_RoomMemberListView_Day_3_en","features.roomdetails.impl.members_RoomMemberListView_Night_3_en",20301,], -["features.roomdetails.impl.members_RoomMemberListView_Day_4_en","features.roomdetails.impl.members_RoomMemberListView_Night_4_en",20301,], -["features.roomdetails.impl.members_RoomMemberListView_Day_5_en","features.roomdetails.impl.members_RoomMemberListView_Night_5_en",20301,], +["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.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",20301,], -["features.roomdetails.impl.members_RoomMemberListView_Day_8_en","features.roomdetails.impl.members_RoomMemberListView_Night_8_en",20301,], -["features.roomdetails.impl.members_RoomMemberListView_Day_9_en","features.roomdetails.impl.members_RoomMemberListView_Night_9_en",20301,], -["features.roommembermoderation.impl_RoomMemberModerationView_Day_0_en","features.roommembermoderation.impl_RoomMemberModerationView_Night_0_en",20301,], -["features.roommembermoderation.impl_RoomMemberModerationView_Day_1_en","features.roommembermoderation.impl_RoomMemberModerationView_Night_1_en",20301,], -["features.roommembermoderation.impl_RoomMemberModerationView_Day_2_en","features.roommembermoderation.impl_RoomMemberModerationView_Night_2_en",20301,], -["features.roommembermoderation.impl_RoomMemberModerationView_Day_3_en","features.roommembermoderation.impl_RoomMemberModerationView_Night_3_en",20301,], -["features.roommembermoderation.impl_RoomMemberModerationView_Day_4_en","features.roommembermoderation.impl_RoomMemberModerationView_Night_4_en",20301,], -["features.roommembermoderation.impl_RoomMemberModerationView_Day_5_en","features.roommembermoderation.impl_RoomMemberModerationView_Night_5_en",20301,], -["features.roommembermoderation.impl_RoomMemberModerationView_Day_6_en","features.roommembermoderation.impl_RoomMemberModerationView_Night_6_en",20301,], -["features.roommembermoderation.impl_RoomMemberModerationView_Day_7_en","features.roommembermoderation.impl_RoomMemberModerationView_Night_7_en",20301,], +["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",20301,], -["features.roomdetails.impl.notificationsettings_RoomNotificationSettingsView_Day_0_en","features.roomdetails.impl.notificationsettings_RoomNotificationSettingsView_Night_0_en",20301,], -["features.roomdetails.impl.notificationsettings_RoomNotificationSettingsView_Day_1_en","features.roomdetails.impl.notificationsettings_RoomNotificationSettingsView_Night_1_en",20301,], -["features.roomdetails.impl.notificationsettings_RoomNotificationSettingsView_Day_2_en","features.roomdetails.impl.notificationsettings_RoomNotificationSettingsView_Night_2_en",20301,], -["features.roomdetails.impl.notificationsettings_RoomNotificationSettingsView_Day_3_en","features.roomdetails.impl.notificationsettings_RoomNotificationSettingsView_Night_3_en",20301,], -["features.roomdetails.impl.notificationsettings_RoomNotificationSettingsView_Day_4_en","features.roomdetails.impl.notificationsettings_RoomNotificationSettingsView_Night_4_en",20301,], -["features.roomdetails.impl.notificationsettings_RoomNotificationSettingsView_Day_5_en","features.roomdetails.impl.notificationsettings_RoomNotificationSettingsView_Night_5_en",20301,], -["features.roomdetails.impl.notificationsettings_RoomNotificationSettingsView_Day_6_en","features.roomdetails.impl.notificationsettings_RoomNotificationSettingsView_Night_6_en",20301,], -["libraries.roomselect.impl_RoomSelectView_Day_0_en","libraries.roomselect.impl_RoomSelectView_Night_0_en",20301,], -["libraries.roomselect.impl_RoomSelectView_Day_1_en","libraries.roomselect.impl_RoomSelectView_Night_1_en",20301,], -["libraries.roomselect.impl_RoomSelectView_Day_2_en","libraries.roomselect.impl_RoomSelectView_Night_2_en",20301,], -["libraries.roomselect.impl_RoomSelectView_Day_3_en","libraries.roomselect.impl_RoomSelectView_Night_3_en",20301,], -["libraries.roomselect.impl_RoomSelectView_Day_4_en","libraries.roomselect.impl_RoomSelectView_Night_4_en",20301,], -["libraries.roomselect.impl_RoomSelectView_Day_5_en","libraries.roomselect.impl_RoomSelectView_Night_5_en",20301,], +["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.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,], @@ -1052,13 +1061,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",20301,], -["features.home.impl.components_RoomSummaryRow_Day_2_en","features.home.impl.components_RoomSummaryRow_Night_2_en",20301,], -["features.home.impl.components_RoomSummaryRow_Day_30_en","features.home.impl.components_RoomSummaryRow_Night_30_en",20301,], -["features.home.impl.components_RoomSummaryRow_Day_31_en","features.home.impl.components_RoomSummaryRow_Night_31_en",20301,], -["features.home.impl.components_RoomSummaryRow_Day_32_en","features.home.impl.components_RoomSummaryRow_Night_32_en",20301,], -["features.home.impl.components_RoomSummaryRow_Day_33_en","features.home.impl.components_RoomSummaryRow_Night_33_en",20301,], -["features.home.impl.components_RoomSummaryRow_Day_34_en","features.home.impl.components_RoomSummaryRow_Night_34_en",20301,], +["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_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,], @@ -1066,79 +1075,79 @@ 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",20301,], -["appnav.root_RootView_Day_1_en","appnav.root_RootView_Night_1_en",20301,], -["appnav.root_RootView_Day_2_en","appnav.root_RootView_Night_2_en",20301,], +["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,], ["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",20301,], -["features.login.impl.screens.searchaccountprovider_SearchAccountProviderView_Day_0_en","features.login.impl.screens.searchaccountprovider_SearchAccountProviderView_Night_0_en",20301,], -["features.login.impl.screens.searchaccountprovider_SearchAccountProviderView_Day_1_en","features.login.impl.screens.searchaccountprovider_SearchAccountProviderView_Night_1_en",20301,], +["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,], ["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","",20301,], +["libraries.designsystem.theme.components_SearchBarActiveWithNoResults_Search_views_en","",20308,], ["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","",20301,], -["features.createroom.impl.components_SearchSingleUserResultItem_en","",20301,], -["features.securebackup.impl.disable_SecureBackupDisableView_Day_0_en","features.securebackup.impl.disable_SecureBackupDisableView_Night_0_en",20301,], -["features.securebackup.impl.disable_SecureBackupDisableView_Day_1_en","features.securebackup.impl.disable_SecureBackupDisableView_Night_1_en",20301,], -["features.securebackup.impl.disable_SecureBackupDisableView_Day_2_en","features.securebackup.impl.disable_SecureBackupDisableView_Night_2_en",20301,], -["features.securebackup.impl.disable_SecureBackupDisableView_Day_3_en","features.securebackup.impl.disable_SecureBackupDisableView_Night_3_en",20301,], -["features.securebackup.impl.enter_SecureBackupEnterRecoveryKeyView_Day_0_en","features.securebackup.impl.enter_SecureBackupEnterRecoveryKeyView_Night_0_en",20301,], -["features.securebackup.impl.enter_SecureBackupEnterRecoveryKeyView_Day_1_en","features.securebackup.impl.enter_SecureBackupEnterRecoveryKeyView_Night_1_en",20301,], -["features.securebackup.impl.enter_SecureBackupEnterRecoveryKeyView_Day_2_en","features.securebackup.impl.enter_SecureBackupEnterRecoveryKeyView_Night_2_en",20301,], -["features.securebackup.impl.enter_SecureBackupEnterRecoveryKeyView_Day_3_en","features.securebackup.impl.enter_SecureBackupEnterRecoveryKeyView_Night_3_en",20301,], -["features.securebackup.impl.root_SecureBackupRootView_Day_0_en","features.securebackup.impl.root_SecureBackupRootView_Night_0_en",20301,], -["features.securebackup.impl.root_SecureBackupRootView_Day_10_en","features.securebackup.impl.root_SecureBackupRootView_Night_10_en",20301,], -["features.securebackup.impl.root_SecureBackupRootView_Day_11_en","features.securebackup.impl.root_SecureBackupRootView_Night_11_en",20301,], -["features.securebackup.impl.root_SecureBackupRootView_Day_12_en","features.securebackup.impl.root_SecureBackupRootView_Night_12_en",20301,], -["features.securebackup.impl.root_SecureBackupRootView_Day_13_en","features.securebackup.impl.root_SecureBackupRootView_Night_13_en",20301,], -["features.securebackup.impl.root_SecureBackupRootView_Day_14_en","features.securebackup.impl.root_SecureBackupRootView_Night_14_en",20301,], -["features.securebackup.impl.root_SecureBackupRootView_Day_15_en","features.securebackup.impl.root_SecureBackupRootView_Night_15_en",20301,], -["features.securebackup.impl.root_SecureBackupRootView_Day_16_en","features.securebackup.impl.root_SecureBackupRootView_Night_16_en",20301,], -["features.securebackup.impl.root_SecureBackupRootView_Day_17_en","features.securebackup.impl.root_SecureBackupRootView_Night_17_en",20301,], -["features.securebackup.impl.root_SecureBackupRootView_Day_1_en","features.securebackup.impl.root_SecureBackupRootView_Night_1_en",20301,], -["features.securebackup.impl.root_SecureBackupRootView_Day_2_en","features.securebackup.impl.root_SecureBackupRootView_Night_2_en",20301,], -["features.securebackup.impl.root_SecureBackupRootView_Day_3_en","features.securebackup.impl.root_SecureBackupRootView_Night_3_en",20301,], -["features.securebackup.impl.root_SecureBackupRootView_Day_4_en","features.securebackup.impl.root_SecureBackupRootView_Night_4_en",20301,], -["features.securebackup.impl.root_SecureBackupRootView_Day_5_en","features.securebackup.impl.root_SecureBackupRootView_Night_5_en",20301,], -["features.securebackup.impl.root_SecureBackupRootView_Day_6_en","features.securebackup.impl.root_SecureBackupRootView_Night_6_en",20301,], -["features.securebackup.impl.root_SecureBackupRootView_Day_7_en","features.securebackup.impl.root_SecureBackupRootView_Night_7_en",20301,], -["features.securebackup.impl.root_SecureBackupRootView_Day_8_en","features.securebackup.impl.root_SecureBackupRootView_Night_8_en",20301,], -["features.securebackup.impl.root_SecureBackupRootView_Day_9_en","features.securebackup.impl.root_SecureBackupRootView_Night_9_en",20301,], -["features.securebackup.impl.setup_SecureBackupSetupViewChange_Day_0_en","features.securebackup.impl.setup_SecureBackupSetupViewChange_Night_0_en",20301,], -["features.securebackup.impl.setup_SecureBackupSetupViewChange_Day_1_en","features.securebackup.impl.setup_SecureBackupSetupViewChange_Night_1_en",20301,], -["features.securebackup.impl.setup_SecureBackupSetupViewChange_Day_2_en","features.securebackup.impl.setup_SecureBackupSetupViewChange_Night_2_en",20301,], -["features.securebackup.impl.setup_SecureBackupSetupViewChange_Day_3_en","features.securebackup.impl.setup_SecureBackupSetupViewChange_Night_3_en",20301,], -["features.securebackup.impl.setup_SecureBackupSetupViewChange_Day_4_en","features.securebackup.impl.setup_SecureBackupSetupViewChange_Night_4_en",20301,], -["features.securebackup.impl.setup_SecureBackupSetupViewChange_Day_5_en","features.securebackup.impl.setup_SecureBackupSetupViewChange_Night_5_en",20301,], -["features.securebackup.impl.setup_SecureBackupSetupView_Day_0_en","features.securebackup.impl.setup_SecureBackupSetupView_Night_0_en",20301,], -["features.securebackup.impl.setup_SecureBackupSetupView_Day_1_en","features.securebackup.impl.setup_SecureBackupSetupView_Night_1_en",20301,], -["features.securebackup.impl.setup_SecureBackupSetupView_Day_2_en","features.securebackup.impl.setup_SecureBackupSetupView_Night_2_en",20301,], -["features.securebackup.impl.setup_SecureBackupSetupView_Day_3_en","features.securebackup.impl.setup_SecureBackupSetupView_Night_3_en",20301,], -["features.securebackup.impl.setup_SecureBackupSetupView_Day_4_en","features.securebackup.impl.setup_SecureBackupSetupView_Night_4_en",20301,], -["features.securebackup.impl.setup_SecureBackupSetupView_Day_5_en","features.securebackup.impl.setup_SecureBackupSetupView_Night_5_en",20301,], -["features.roomdetails.impl.securityandprivacy_SecurityAndPrivacyViewDark_0_en","",20301,], -["features.roomdetails.impl.securityandprivacy_SecurityAndPrivacyViewDark_1_en","",20301,], -["features.roomdetails.impl.securityandprivacy_SecurityAndPrivacyViewDark_2_en","",20301,], -["features.roomdetails.impl.securityandprivacy_SecurityAndPrivacyViewDark_3_en","",20301,], -["features.roomdetails.impl.securityandprivacy_SecurityAndPrivacyViewDark_4_en","",20301,], -["features.roomdetails.impl.securityandprivacy_SecurityAndPrivacyViewDark_5_en","",20301,], -["features.roomdetails.impl.securityandprivacy_SecurityAndPrivacyViewDark_6_en","",20301,], -["features.roomdetails.impl.securityandprivacy_SecurityAndPrivacyViewDark_7_en","",20301,], -["features.roomdetails.impl.securityandprivacy_SecurityAndPrivacyViewDark_8_en","",20301,], -["features.roomdetails.impl.securityandprivacy_SecurityAndPrivacyViewLight_0_en","",20301,], -["features.roomdetails.impl.securityandprivacy_SecurityAndPrivacyViewLight_1_en","",20301,], -["features.roomdetails.impl.securityandprivacy_SecurityAndPrivacyViewLight_2_en","",20301,], -["features.roomdetails.impl.securityandprivacy_SecurityAndPrivacyViewLight_3_en","",20301,], -["features.roomdetails.impl.securityandprivacy_SecurityAndPrivacyViewLight_4_en","",20301,], -["features.roomdetails.impl.securityandprivacy_SecurityAndPrivacyViewLight_5_en","",20301,], -["features.roomdetails.impl.securityandprivacy_SecurityAndPrivacyViewLight_6_en","",20301,], -["features.roomdetails.impl.securityandprivacy_SecurityAndPrivacyViewLight_7_en","",20301,], -["features.roomdetails.impl.securityandprivacy_SecurityAndPrivacyViewLight_8_en","",20301,], +["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,], ["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,], @@ -1146,11 +1155,11 @@ export const screenshots = [ ["libraries.matrix.ui.components_SelectedUser_Day_0_en","libraries.matrix.ui.components_SelectedUser_Night_0_en",0,], ["libraries.matrix.ui.components_SelectedUsersRowList_Day_0_en","libraries.matrix.ui.components_SelectedUsersRowList_Night_0_en",0,], ["libraries.textcomposer.components_SendButton_Day_0_en","libraries.textcomposer.components_SendButton_Night_0_en",0,], -["features.location.impl.send_SendLocationView_Day_0_en","features.location.impl.send_SendLocationView_Night_0_en",20301,], -["features.location.impl.send_SendLocationView_Day_1_en","features.location.impl.send_SendLocationView_Night_1_en",20301,], -["features.location.impl.send_SendLocationView_Day_2_en","features.location.impl.send_SendLocationView_Night_2_en",20301,], -["features.location.impl.send_SendLocationView_Day_3_en","features.location.impl.send_SendLocationView_Night_3_en",20301,], -["features.location.impl.send_SendLocationView_Day_4_en","features.location.impl.send_SendLocationView_Night_4_en",20301,], +["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,], ["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,], @@ -1160,27 +1169,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",20301,], -["features.home.impl.components_SetUpRecoveryKeyBanner_Day_0_en","features.home.impl.components_SetUpRecoveryKeyBanner_Night_0_en",20301,], -["features.lockscreen.impl.setup.biometric_SetupBiometricView_Day_0_en","features.lockscreen.impl.setup.biometric_SetupBiometricView_Night_0_en",20301,], -["features.lockscreen.impl.setup.pin_SetupPinView_Day_0_en","features.lockscreen.impl.setup.pin_SetupPinView_Night_0_en",20301,], -["features.lockscreen.impl.setup.pin_SetupPinView_Day_1_en","features.lockscreen.impl.setup.pin_SetupPinView_Night_1_en",20301,], -["features.lockscreen.impl.setup.pin_SetupPinView_Day_2_en","features.lockscreen.impl.setup.pin_SetupPinView_Night_2_en",20301,], -["features.lockscreen.impl.setup.pin_SetupPinView_Day_3_en","features.lockscreen.impl.setup.pin_SetupPinView_Night_3_en",20301,], -["features.lockscreen.impl.setup.pin_SetupPinView_Day_4_en","features.lockscreen.impl.setup.pin_SetupPinView_Night_4_en",20301,], +["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.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",20301,], -["features.location.impl.show_ShowLocationView_Day_0_en","features.location.impl.show_ShowLocationView_Night_0_en",20301,], -["features.location.impl.show_ShowLocationView_Day_1_en","features.location.impl.show_ShowLocationView_Night_1_en",20301,], -["features.location.impl.show_ShowLocationView_Day_2_en","features.location.impl.show_ShowLocationView_Night_2_en",20301,], -["features.location.impl.show_ShowLocationView_Day_3_en","features.location.impl.show_ShowLocationView_Night_3_en",20301,], -["features.location.impl.show_ShowLocationView_Day_4_en","features.location.impl.show_ShowLocationView_Night_4_en",20301,], -["features.location.impl.show_ShowLocationView_Day_5_en","features.location.impl.show_ShowLocationView_Night_5_en",20301,], -["features.location.impl.show_ShowLocationView_Day_6_en","features.location.impl.show_ShowLocationView_Night_6_en",20301,], -["features.location.impl.show_ShowLocationView_Day_7_en","features.location.impl.show_ShowLocationView_Night_7_en",20301,], -["features.signedout.impl_SignedOutView_Day_0_en","features.signedout.impl_SignedOutView_Night_0_en",20301,], +["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,], ["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,], @@ -1189,7 +1198,7 @@ export const screenshots = [ ["libraries.designsystem.components.list_SingleSelectionListItemUnselectedWithSupportingText_Single_selection_List_item_-_no_selection,_supporting_text_List_items_en","",0,], ["libraries.designsystem.components.list_SingleSelectionListItem_Single_selection_List_item_-_no_selection_List_items_en","",0,], ["libraries.designsystem.theme.components_Sliders_Sliders_en","",0,], -["features.login.impl.dialogs_SlidingSyncNotSupportedDialog_Day_0_en","features.login.impl.dialogs_SlidingSyncNotSupportedDialog_Night_0_en",20301,], +["features.login.impl.dialogs_SlidingSyncNotSupportedDialog_Day_0_en","features.login.impl.dialogs_SlidingSyncNotSupportedDialog_Night_0_en",20308,], ["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,], @@ -1199,61 +1208,61 @@ export const screenshots = [ ["libraries.designsystem.modifiers_SquareSizeModifierInsideSquare_en","",0,], ["libraries.designsystem.modifiers_SquareSizeModifierLargeHeight_en","",0,], ["libraries.designsystem.modifiers_SquareSizeModifierLargeWidth_en","",0,], -["features.location.api.internal_StaticMapPlaceholder_Day_0_en","features.location.api.internal_StaticMapPlaceholder_Night_0_en",20301,], +["features.location.api.internal_StaticMapPlaceholder_Day_0_en","features.location.api.internal_StaticMapPlaceholder_Night_0_en",20308,], ["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",20301,], +["features.messages.impl.messagecomposer.suggestions_SuggestionsPickerView_Day_0_en","features.messages.impl.messagecomposer.suggestions_SuggestionsPickerView_Night_0_en",20308,], ["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",20301,], +["appnav.loggedin_SyncStateView_Day_0_en","appnav.loggedin_SyncStateView_Night_0_en",20308,], ["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",20301,], -["libraries.textcomposer_TextComposerCaption_Day_0_en","libraries.textcomposer_TextComposerCaption_Night_0_en",20301,], -["libraries.textcomposer_TextComposerEditCaption_Day_0_en","libraries.textcomposer_TextComposerEditCaption_Night_0_en",20301,], -["libraries.textcomposer_TextComposerEditNotEncrypted_Day_0_en","libraries.textcomposer_TextComposerEditNotEncrypted_Night_0_en",20301,], -["libraries.textcomposer_TextComposerEdit_Day_0_en","libraries.textcomposer_TextComposerEdit_Night_0_en",20301,], -["libraries.textcomposer_TextComposerFormattingNotEncrypted_Day_0_en","libraries.textcomposer_TextComposerFormattingNotEncrypted_Night_0_en",20301,], -["libraries.textcomposer_TextComposerFormatting_Day_0_en","libraries.textcomposer_TextComposerFormatting_Night_0_en",20301,], -["libraries.textcomposer_TextComposerLinkDialogCreateLinkWithoutText_Day_0_en","libraries.textcomposer_TextComposerLinkDialogCreateLinkWithoutText_Night_0_en",20301,], -["libraries.textcomposer_TextComposerLinkDialogCreateLink_Day_0_en","libraries.textcomposer_TextComposerLinkDialogCreateLink_Night_0_en",20301,], -["libraries.textcomposer_TextComposerLinkDialogEditLink_Day_0_en","libraries.textcomposer_TextComposerLinkDialogEditLink_Night_0_en",20301,], -["libraries.textcomposer_TextComposerReplyNotEncrypted_Day_0_en","libraries.textcomposer_TextComposerReplyNotEncrypted_Night_0_en",20301,], -["libraries.textcomposer_TextComposerReplyNotEncrypted_Day_10_en","libraries.textcomposer_TextComposerReplyNotEncrypted_Night_10_en",20301,], -["libraries.textcomposer_TextComposerReplyNotEncrypted_Day_11_en","libraries.textcomposer_TextComposerReplyNotEncrypted_Night_11_en",20301,], -["libraries.textcomposer_TextComposerReplyNotEncrypted_Day_1_en","libraries.textcomposer_TextComposerReplyNotEncrypted_Night_1_en",20301,], -["libraries.textcomposer_TextComposerReplyNotEncrypted_Day_2_en","libraries.textcomposer_TextComposerReplyNotEncrypted_Night_2_en",20301,], -["libraries.textcomposer_TextComposerReplyNotEncrypted_Day_3_en","libraries.textcomposer_TextComposerReplyNotEncrypted_Night_3_en",20301,], -["libraries.textcomposer_TextComposerReplyNotEncrypted_Day_4_en","libraries.textcomposer_TextComposerReplyNotEncrypted_Night_4_en",20301,], -["libraries.textcomposer_TextComposerReplyNotEncrypted_Day_5_en","libraries.textcomposer_TextComposerReplyNotEncrypted_Night_5_en",20301,], -["libraries.textcomposer_TextComposerReplyNotEncrypted_Day_6_en","libraries.textcomposer_TextComposerReplyNotEncrypted_Night_6_en",20301,], -["libraries.textcomposer_TextComposerReplyNotEncrypted_Day_7_en","libraries.textcomposer_TextComposerReplyNotEncrypted_Night_7_en",20301,], -["libraries.textcomposer_TextComposerReplyNotEncrypted_Day_8_en","libraries.textcomposer_TextComposerReplyNotEncrypted_Night_8_en",20301,], -["libraries.textcomposer_TextComposerReplyNotEncrypted_Day_9_en","libraries.textcomposer_TextComposerReplyNotEncrypted_Night_9_en",20301,], -["libraries.textcomposer_TextComposerReply_Day_0_en","libraries.textcomposer_TextComposerReply_Night_0_en",20301,], -["libraries.textcomposer_TextComposerReply_Day_10_en","libraries.textcomposer_TextComposerReply_Night_10_en",20301,], -["libraries.textcomposer_TextComposerReply_Day_11_en","libraries.textcomposer_TextComposerReply_Night_11_en",20301,], -["libraries.textcomposer_TextComposerReply_Day_1_en","libraries.textcomposer_TextComposerReply_Night_1_en",20301,], -["libraries.textcomposer_TextComposerReply_Day_2_en","libraries.textcomposer_TextComposerReply_Night_2_en",20301,], -["libraries.textcomposer_TextComposerReply_Day_3_en","libraries.textcomposer_TextComposerReply_Night_3_en",20301,], -["libraries.textcomposer_TextComposerReply_Day_4_en","libraries.textcomposer_TextComposerReply_Night_4_en",20301,], -["libraries.textcomposer_TextComposerReply_Day_5_en","libraries.textcomposer_TextComposerReply_Night_5_en",20301,], -["libraries.textcomposer_TextComposerReply_Day_6_en","libraries.textcomposer_TextComposerReply_Night_6_en",20301,], -["libraries.textcomposer_TextComposerReply_Day_7_en","libraries.textcomposer_TextComposerReply_Night_7_en",20301,], -["libraries.textcomposer_TextComposerReply_Day_8_en","libraries.textcomposer_TextComposerReply_Night_8_en",20301,], -["libraries.textcomposer_TextComposerReply_Day_9_en","libraries.textcomposer_TextComposerReply_Night_9_en",20301,], -["libraries.textcomposer_TextComposerSimpleNotEncrypted_Day_0_en","libraries.textcomposer_TextComposerSimpleNotEncrypted_Night_0_en",20301,], -["libraries.textcomposer_TextComposerSimple_Day_0_en","libraries.textcomposer_TextComposerSimple_Night_0_en",20301,], -["libraries.textcomposer_TextComposerVoiceNotEncrypted_Day_0_en","libraries.textcomposer_TextComposerVoiceNotEncrypted_Night_0_en",20301,], +["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_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",20301,], -["libraries.designsystem.components.dialogs_TextFieldDialog_Day_0_en","libraries.designsystem.components.dialogs_TextFieldDialog_Night_0_en",20301,], +["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.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,], @@ -1265,14 +1274,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","",20301,], -["libraries.designsystem.theme.components.previews_TimePickerVerticalDark_DateTime_pickers_en","",20301,], -["libraries.designsystem.theme.components.previews_TimePickerVerticalLight_DateTime_pickers_en","",20301,], +["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,], ["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",20301,], -["features.messages.impl.timeline.components_TimelineEventTimestampView_Day_4_en","features.messages.impl.timeline.components_TimelineEventTimestampView_Night_4_en",20301,], +["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_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,], @@ -1282,18 +1291,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",20301,], +["features.messages.impl.timeline.components_TimelineItemCallNotifyView_Day_0_en","features.messages.impl.timeline.components_TimelineItemCallNotifyView_Night_0_en",20308,], ["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",20301,], -["features.messages.impl.timeline.components.event_TimelineItemEncryptedView_Day_1_en","features.messages.impl.timeline.components.event_TimelineItemEncryptedView_Night_1_en",20301,], -["features.messages.impl.timeline.components.event_TimelineItemEncryptedView_Day_2_en","features.messages.impl.timeline.components.event_TimelineItemEncryptedView_Night_2_en",20301,], -["features.messages.impl.timeline.components.event_TimelineItemEncryptedView_Day_3_en","features.messages.impl.timeline.components.event_TimelineItemEncryptedView_Night_3_en",20301,], -["features.messages.impl.timeline.components.event_TimelineItemEncryptedView_Day_4_en","features.messages.impl.timeline.components.event_TimelineItemEncryptedView_Night_4_en",20301,], -["features.messages.impl.timeline.components.event_TimelineItemEncryptedView_Day_5_en","features.messages.impl.timeline.components.event_TimelineItemEncryptedView_Night_5_en",20301,], -["features.messages.impl.timeline.components.event_TimelineItemEncryptedView_Day_6_en","features.messages.impl.timeline.components.event_TimelineItemEncryptedView_Night_6_en",20301,], -["features.messages.impl.timeline.components.event_TimelineItemEncryptedView_Day_7_en","features.messages.impl.timeline.components.event_TimelineItemEncryptedView_Night_7_en",20301,], -["features.messages.impl.timeline.components.event_TimelineItemEncryptedView_Day_8_en","features.messages.impl.timeline.components.event_TimelineItemEncryptedView_Night_8_en",20301,], +["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_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,], @@ -1301,18 +1310,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",20301,], -["features.messages.impl.timeline.components_TimelineItemEventRowTimestamp_Day_4_en","features.messages.impl.timeline.components_TimelineItemEventRowTimestamp_Night_4_en",20301,], +["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_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",20301,], -["features.messages.impl.timeline.components_TimelineItemEventRowUtd_Day_0_en","features.messages.impl.timeline.components_TimelineItemEventRowUtd_Night_0_en",20301,], -["features.messages.impl.timeline.components_TimelineItemEventRowWithManyReactions_Day_0_en","features.messages.impl.timeline.components_TimelineItemEventRowWithManyReactions_Night_0_en",20301,], +["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_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",20301,], -["features.messages.impl.timeline.components_TimelineItemEventRowWithReplyInformative_Day_1_en","features.messages.impl.timeline.components_TimelineItemEventRowWithReplyInformative_Night_1_en",20301,], +["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_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,], @@ -1321,40 +1330,40 @@ export const screenshots = [ ["features.messages.impl.timeline.components_TimelineItemEventRowWithReply_Day_1_en","features.messages.impl.timeline.components_TimelineItemEventRowWithReply_Night_1_en",0,], ["features.messages.impl.timeline.components_TimelineItemEventRowWithReply_Day_2_en","features.messages.impl.timeline.components_TimelineItemEventRowWithReply_Night_2_en",0,], ["features.messages.impl.timeline.components_TimelineItemEventRowWithReply_Day_3_en","features.messages.impl.timeline.components_TimelineItemEventRowWithReply_Night_3_en",0,], -["features.messages.impl.timeline.components_TimelineItemEventRowWithReply_Day_4_en","features.messages.impl.timeline.components_TimelineItemEventRowWithReply_Night_4_en",20301,], +["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_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",20301,], +["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_9_en","features.messages.impl.timeline.components_TimelineItemEventRowWithReply_Night_9_en",0,], ["features.messages.impl.timeline.components_TimelineItemEventRow_Day_0_en","features.messages.impl.timeline.components_TimelineItemEventRow_Night_0_en",0,], -["features.messages.impl.timeline.components_TimelineItemEventTimestampBelow_en","",20301,], +["features.messages.impl.timeline.components_TimelineItemEventTimestampBelow_en","",20308,], ["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",20301,], -["features.messages.impl.timeline.components_TimelineItemGroupedEventsRowContentExpanded_Day_0_en","features.messages.impl.timeline.components_TimelineItemGroupedEventsRowContentExpanded_Night_0_en",20301,], -["features.messages.impl.timeline.components.event_TimelineItemImageViewHideMediaContent_Day_0_en","features.messages.impl.timeline.components.event_TimelineItemImageViewHideMediaContent_Night_0_en",20301,], +["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.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",20301,], +["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_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",20301,], -["features.messages.impl.timeline.components.event_TimelineItemPollView_Day_1_en","features.messages.impl.timeline.components.event_TimelineItemPollView_Night_1_en",20301,], -["features.messages.impl.timeline.components.event_TimelineItemPollView_Day_2_en","features.messages.impl.timeline.components.event_TimelineItemPollView_Night_2_en",20301,], -["features.messages.impl.timeline.components.event_TimelineItemPollView_Day_3_en","features.messages.impl.timeline.components.event_TimelineItemPollView_Night_3_en",20301,], -["features.messages.impl.timeline.components_TimelineItemReactionsLayout_Day_0_en","features.messages.impl.timeline.components_TimelineItemReactionsLayout_Night_0_en",20301,], +["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_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",20301,], -["features.messages.impl.timeline.components_TimelineItemReactionsViewOutgoing_Day_0_en","features.messages.impl.timeline.components_TimelineItemReactionsViewOutgoing_Night_0_en",20301,], +["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_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",20301,], +["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.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,], @@ -1363,8 +1372,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",20301,], -["features.messages.impl.timeline.components.virtual_TimelineItemRoomBeginningView_Day_0_en","features.messages.impl.timeline.components.virtual_TimelineItemRoomBeginningView_Night_0_en",20301,], +["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_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,], @@ -1379,8 +1388,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",20301,], -["features.messages.impl.timeline.components.event_TimelineItemVideoViewHideMediaContent_Day_0_en","features.messages.impl.timeline.components.event_TimelineItemVideoViewHideMediaContent_Night_0_en",20301,], +["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_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,], @@ -1403,75 +1412,75 @@ 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",20301,], -["features.messages.impl.timeline_TimelineView_Day_0_en","features.messages.impl.timeline_TimelineView_Night_0_en",20301,], +["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_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",20301,], -["features.messages.impl.timeline_TimelineView_Day_12_en","features.messages.impl.timeline_TimelineView_Night_12_en",20301,], -["features.messages.impl.timeline_TimelineView_Day_13_en","features.messages.impl.timeline_TimelineView_Night_13_en",20301,], -["features.messages.impl.timeline_TimelineView_Day_14_en","features.messages.impl.timeline_TimelineView_Night_14_en",20301,], -["features.messages.impl.timeline_TimelineView_Day_15_en","features.messages.impl.timeline_TimelineView_Night_15_en",20301,], -["features.messages.impl.timeline_TimelineView_Day_16_en","features.messages.impl.timeline_TimelineView_Night_16_en",20301,], -["features.messages.impl.timeline_TimelineView_Day_17_en","features.messages.impl.timeline_TimelineView_Night_17_en",20301,], -["features.messages.impl.timeline_TimelineView_Day_1_en","features.messages.impl.timeline_TimelineView_Night_1_en",20301,], +["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_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",20301,], +["features.messages.impl.timeline_TimelineView_Day_4_en","features.messages.impl.timeline_TimelineView_Night_4_en",20308,], ["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",20301,], +["features.messages.impl.timeline_TimelineView_Day_6_en","features.messages.impl.timeline_TimelineView_Night_6_en",20308,], ["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",20301,], +["features.messages.impl.timeline_TimelineView_Day_8_en","features.messages.impl.timeline_TimelineView_Night_8_en",20308,], ["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",20301,], -["libraries.troubleshoot.impl_TroubleshootNotificationsView_Day_1_en","libraries.troubleshoot.impl_TroubleshootNotificationsView_Night_1_en",20301,], -["libraries.troubleshoot.impl_TroubleshootNotificationsView_Day_2_en","libraries.troubleshoot.impl_TroubleshootNotificationsView_Night_2_en",20301,], -["libraries.troubleshoot.impl_TroubleshootNotificationsView_Day_3_en","libraries.troubleshoot.impl_TroubleshootNotificationsView_Night_3_en",20301,], -["libraries.troubleshoot.impl_TroubleshootNotificationsView_Day_4_en","libraries.troubleshoot.impl_TroubleshootNotificationsView_Night_4_en",20301,], -["libraries.troubleshoot.impl_TroubleshootNotificationsView_Day_5_en","libraries.troubleshoot.impl_TroubleshootNotificationsView_Night_5_en",20301,], -["libraries.troubleshoot.impl_TroubleshootNotificationsView_Day_6_en","libraries.troubleshoot.impl_TroubleshootNotificationsView_Night_6_en",20301,], -["libraries.troubleshoot.impl_TroubleshootNotificationsView_Day_7_en","libraries.troubleshoot.impl_TroubleshootNotificationsView_Night_7_en",20301,], +["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,], ["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",20301,], -["features.messages.impl.typing_TypingNotificationView_Day_2_en","features.messages.impl.typing_TypingNotificationView_Night_2_en",20301,], -["features.messages.impl.typing_TypingNotificationView_Day_3_en","features.messages.impl.typing_TypingNotificationView_Night_3_en",20301,], -["features.messages.impl.typing_TypingNotificationView_Day_4_en","features.messages.impl.typing_TypingNotificationView_Night_4_en",20301,], -["features.messages.impl.typing_TypingNotificationView_Day_5_en","features.messages.impl.typing_TypingNotificationView_Night_5_en",20301,], -["features.messages.impl.typing_TypingNotificationView_Day_6_en","features.messages.impl.typing_TypingNotificationView_Night_6_en",20301,], +["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_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","",20301,], +["libraries.matrix.ui.components_UnresolvedUserRow_en","",20308,], ["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",20301,], -["features.createroom.impl.components_UserListView_Day_0_en","features.createroom.impl.components_UserListView_Night_0_en",20301,], -["features.createroom.impl.components_UserListView_Day_1_en","features.createroom.impl.components_UserListView_Night_1_en",20301,], -["features.createroom.impl.components_UserListView_Day_2_en","features.createroom.impl.components_UserListView_Night_2_en",20301,], +["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",20301,], +["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",20301,], +["features.createroom.impl.components_UserListView_Day_9_en","features.createroom.impl.components_UserListView_Night_9_en",20308,], ["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",20301,], -["features.userprofile.shared_UserProfileHeaderSection_Day_0_en","features.userprofile.shared_UserProfileHeaderSection_Night_0_en",20301,], -["features.userprofile.shared_UserProfileView_Day_0_en","features.userprofile.shared_UserProfileView_Night_0_en",20301,], -["features.userprofile.shared_UserProfileView_Day_1_en","features.userprofile.shared_UserProfileView_Night_1_en",20301,], -["features.userprofile.shared_UserProfileView_Day_2_en","features.userprofile.shared_UserProfileView_Night_2_en",20301,], -["features.userprofile.shared_UserProfileView_Day_3_en","features.userprofile.shared_UserProfileView_Night_3_en",20301,], -["features.userprofile.shared_UserProfileView_Day_4_en","features.userprofile.shared_UserProfileView_Night_4_en",20301,], -["features.userprofile.shared_UserProfileView_Day_5_en","features.userprofile.shared_UserProfileView_Night_5_en",20301,], -["features.userprofile.shared_UserProfileView_Day_6_en","features.userprofile.shared_UserProfileView_Night_6_en",20301,], -["features.userprofile.shared_UserProfileView_Day_7_en","features.userprofile.shared_UserProfileView_Night_7_en",20301,], -["features.userprofile.shared_UserProfileView_Day_8_en","features.userprofile.shared_UserProfileView_Night_8_en",20301,], -["features.userprofile.shared_UserProfileView_Day_9_en","features.userprofile.shared_UserProfileView_Night_9_en",20301,], +["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.verifysession.impl.ui_VerificationUserProfileContent_Day_0_en","features.verifysession.impl.ui_VerificationUserProfileContent_Night_0_en",0,], ["libraries.designsystem.ruler_VerticalRuler_Day_0_en","libraries.designsystem.ruler_VerticalRuler_Night_0_en",0,], ["libraries.mediaviewer.impl.gallery.ui_VideoItemView_Day_0_en","libraries.mediaviewer.impl.gallery.ui_VideoItemView_Night_0_en",0,], @@ -1479,7 +1488,7 @@ export const screenshots = [ ["features.viewfolder.impl.file_ViewFileView_Day_0_en","features.viewfolder.impl.file_ViewFileView_Night_0_en",0,], ["features.viewfolder.impl.file_ViewFileView_Day_1_en","features.viewfolder.impl.file_ViewFileView_Night_1_en",0,], ["features.viewfolder.impl.file_ViewFileView_Day_2_en","features.viewfolder.impl.file_ViewFileView_Night_2_en",0,], -["features.viewfolder.impl.file_ViewFileView_Day_3_en","features.viewfolder.impl.file_ViewFileView_Night_3_en",20301,], +["features.viewfolder.impl.file_ViewFileView_Day_3_en","features.viewfolder.impl.file_ViewFileView_Night_3_en",20308,], ["features.viewfolder.impl.file_ViewFileView_Day_4_en","features.viewfolder.impl.file_ViewFileView_Night_4_en",0,], ["features.viewfolder.impl.file_ViewFileView_Day_5_en","features.viewfolder.impl.file_ViewFileView_Night_5_en",0,], ["features.viewfolder.impl.folder_ViewFolderView_Day_0_en","features.viewfolder.impl.folder_ViewFolderView_Night_0_en",0,], @@ -1498,6 +1507,6 @@ export const screenshots = [ ["libraries.textcomposer.components_VoiceMessageRecording_Day_0_en","libraries.textcomposer.components_VoiceMessageRecording_Night_0_en",0,], ["libraries.textcomposer.components_VoiceMessage_Day_0_en","libraries.textcomposer.components_VoiceMessage_Night_0_en",0,], ["libraries.designsystem.components.media_WaveformPlaybackView_Day_0_en","libraries.designsystem.components.media_WaveformPlaybackView_Night_0_en",0,], -["features.ftue.impl.welcome_WelcomeView_Day_0_en","features.ftue.impl.welcome_WelcomeView_Night_0_en",20301,], +["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/tests/uitests/src/test/snapshots/images/features.ftue.impl.welcome_WelcomeView_Day_0_en.png b/tests/uitests/src/test/snapshots/images/features.ftue.impl.welcome_WelcomeView_Day_0_en.png deleted file mode 100644 index 6860df8654..0000000000 --- a/tests/uitests/src/test/snapshots/images/features.ftue.impl.welcome_WelcomeView_Day_0_en.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:72a54bb0c6c72e992468d81df80d0d1d274bb8b94f6883df1d2891483a855c56 -size 269259 diff --git a/tests/uitests/src/test/snapshots/images/features.ftue.impl.welcome_WelcomeView_Night_0_en.png b/tests/uitests/src/test/snapshots/images/features.ftue.impl.welcome_WelcomeView_Night_0_en.png deleted file mode 100644 index c2a050dcd8..0000000000 --- a/tests/uitests/src/test/snapshots/images/features.ftue.impl.welcome_WelcomeView_Night_0_en.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:2ea10f84e31b3591596dbfb4b3930fb108ce5d7704bdda108a8dac9b78ccbca3 -size 345504 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 0be9c85fe2..cecd1965bc 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:724df787c6c033c40967bfc62de74e71613ef8221bfc18a9859fcc0b5fb9a8ca -size 394854 +oid sha256:27cf5dae58f473d3fd9554b159aa925596c6316934ad4bb47069d5829fd0b28c +size 400237 diff --git a/tests/uitests/src/test/snapshots/images/features.messages.impl.attachments.preview_AttachmentsView_10_en.png b/tests/uitests/src/test/snapshots/images/features.messages.impl.attachments.preview_AttachmentsView_10_en.png new file mode 100644 index 0000000000..e466a5f480 --- /dev/null +++ b/tests/uitests/src/test/snapshots/images/features.messages.impl.attachments.preview_AttachmentsView_10_en.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:b9faa86b429960368f6df670817c8d7236434d83b6154f295e1100003838ae80 +size 83633 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 3d03bc54a2..e884cae8ff 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:a4b9d7cfa35310566401bc031a2554e49ea71820b3050abc449f91fad3ad892a -size 394573 +oid sha256:3aefd14cc6e89b89e0965042b69e4d005a3c243e02c27d7d16296d314ad0e377 +size 399961 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 9f1be8d864..af9151e2af 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:3ccf51958e5757064087f6a589032b7bb25b30827ecfc7864f157a6da689a67c -size 51024 +oid sha256:bb7b368caebda5198bf2c523318ae349f010b89da011bf649d25374cba32318c +size 59517 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 0be9c85fe2..cecd1965bc 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:724df787c6c033c40967bfc62de74e71613ef8221bfc18a9859fcc0b5fb9a8ca -size 394854 +oid sha256:27cf5dae58f473d3fd9554b159aa925596c6316934ad4bb47069d5829fd0b28c +size 400237 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 ae6fd4011c..1b32113513 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:15782147de5dc2fda9d77f75694bba22d9998db5c245969baa192e87543387cf -size 50991 +oid sha256:599542430fa68487a2114228f79e6d1c91f2ad3e495c6e969ba08d43de66ed49 +size 59330 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 859bfb59c5..6a78324db8 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:9476e888ecf6ac7d374d146a8aa5bfa3ed66b0c4b722d46052b56d177a543733 -size 89112 +oid sha256:ab0aac7e1228338e9f5c1b5e1a939ae13e9af6b8128b2508d0d37756b3baee34 +size 86550 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 0366e59529..252936e18e 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:36aa7ce68da79c229612156d1870c904a87482b64bc9eb262d2c52c1e813d31d -size 390438 +oid sha256:ca6f96cb449f902205bb7eac111e98dbde38b0043640cd2264ecabed605ee758 +size 395882 diff --git a/tests/uitests/src/test/snapshots/images/features.messages.impl.attachments.preview_AttachmentsView_7_en.png b/tests/uitests/src/test/snapshots/images/features.messages.impl.attachments.preview_AttachmentsView_7_en.png index 0be9c85fe2..cecd1965bc 100644 --- a/tests/uitests/src/test/snapshots/images/features.messages.impl.attachments.preview_AttachmentsView_7_en.png +++ b/tests/uitests/src/test/snapshots/images/features.messages.impl.attachments.preview_AttachmentsView_7_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:724df787c6c033c40967bfc62de74e71613ef8221bfc18a9859fcc0b5fb9a8ca -size 394854 +oid sha256:27cf5dae58f473d3fd9554b159aa925596c6316934ad4bb47069d5829fd0b28c +size 400237 diff --git a/tests/uitests/src/test/snapshots/images/features.messages.impl.attachments.preview_AttachmentsView_8_en.png b/tests/uitests/src/test/snapshots/images/features.messages.impl.attachments.preview_AttachmentsView_8_en.png new file mode 100644 index 0000000000..5696315478 --- /dev/null +++ b/tests/uitests/src/test/snapshots/images/features.messages.impl.attachments.preview_AttachmentsView_8_en.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:01a9e0fac77cb3d1b1915407f59c44a1a9aa870033eb14e7cf3b2ae51e403c76 +size 72954 diff --git a/tests/uitests/src/test/snapshots/images/features.messages.impl.attachments.preview_AttachmentsView_9_en.png b/tests/uitests/src/test/snapshots/images/features.messages.impl.attachments.preview_AttachmentsView_9_en.png new file mode 100644 index 0000000000..05d94b86f7 --- /dev/null +++ b/tests/uitests/src/test/snapshots/images/features.messages.impl.attachments.preview_AttachmentsView_9_en.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:52ec4658e2f4f4d07f1ad9ea16ac288ca9fa49440656a4590f686ea17e9ea309 +size 406043 diff --git a/tests/uitests/src/test/snapshots/images/features.messages.impl.attachments.preview_VideoQualitySelectorDialog_Day_0_en.png b/tests/uitests/src/test/snapshots/images/features.messages.impl.attachments.preview_VideoQualitySelectorDialog_Day_0_en.png new file mode 100644 index 0000000000..af03698322 --- /dev/null +++ b/tests/uitests/src/test/snapshots/images/features.messages.impl.attachments.preview_VideoQualitySelectorDialog_Day_0_en.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:9677ef17b1c00248df44354599debe4af0f21998b3e0797a9e701d39d48abecc +size 56820 diff --git a/tests/uitests/src/test/snapshots/images/features.messages.impl.attachments.preview_VideoQualitySelectorDialog_Night_0_en.png b/tests/uitests/src/test/snapshots/images/features.messages.impl.attachments.preview_VideoQualitySelectorDialog_Night_0_en.png new file mode 100644 index 0000000000..bf1b04add8 --- /dev/null +++ b/tests/uitests/src/test/snapshots/images/features.messages.impl.attachments.preview_VideoQualitySelectorDialog_Night_0_en.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:f6184dbd6c3511f0d8a703bd86c1c85b77efbabcdbe0e116f4ce034a392f410e +size 54474 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 new file mode 100644 index 0000000000..e5fb3178c4 --- /dev/null +++ b/tests/uitests/src/test/snapshots/images/features.preferences.impl.advanced_AdvancedSettingsViewDark_8_en.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:bd8d14ba4e202190b47fed580cf35c568c03d1aaaf8971b274a4ba9949176c9b +size 52870 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 new file mode 100644 index 0000000000..817ce70d06 --- /dev/null +++ b/tests/uitests/src/test/snapshots/images/features.preferences.impl.advanced_AdvancedSettingsViewLight_8_en.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:aa743f37c2131ff63979836259ae9290c9937f23f4341e52e14418e3c23010bc +size 55003 diff --git a/tests/uitests/src/test/snapshots/images/features.preferences.impl.advanced_VideoQualitySelectorDialog_Day_0_en.png b/tests/uitests/src/test/snapshots/images/features.preferences.impl.advanced_VideoQualitySelectorDialog_Day_0_en.png new file mode 100644 index 0000000000..87fd99aca9 --- /dev/null +++ b/tests/uitests/src/test/snapshots/images/features.preferences.impl.advanced_VideoQualitySelectorDialog_Day_0_en.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:2945a3dfc8090c03755a8fefdf37b20e235a35fcb48ff5efce216100679999bd +size 49823 diff --git a/tests/uitests/src/test/snapshots/images/features.preferences.impl.advanced_VideoQualitySelectorDialog_Night_0_en.png b/tests/uitests/src/test/snapshots/images/features.preferences.impl.advanced_VideoQualitySelectorDialog_Night_0_en.png new file mode 100644 index 0000000000..0800217c1e --- /dev/null +++ b/tests/uitests/src/test/snapshots/images/features.preferences.impl.advanced_VideoQualitySelectorDialog_Night_0_en.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:5507dc3686ec765a56caca94180a8650a316744f6bf419a0c916229c1f973da7 +size 47562 diff --git a/tools/detekt/detekt.yml b/tools/detekt/detekt.yml index 9af20180c6..aab640d906 100644 --- a/tools/detekt/detekt.yml +++ b/tools/detekt/detekt.yml @@ -231,6 +231,7 @@ Compose: - LocalAnalyticsService - LocalBuildMeta - LocalUiTestMode + - LocalSdkIntVersionProvider CompositionLocalNaming: active: true ContentEmitterReturningValues: diff --git a/tools/localazy/config.json b/tools/localazy/config.json index 010a722e30..1f0d291d0b 100644 --- a/tools/localazy/config.json +++ b/tools/localazy/config.json @@ -77,7 +77,8 @@ "name" : ":libraries:textcomposer:impl", "includeRegex" : [ "rich_text_editor.*", - ".*voice_message_tooltip" + ".*voice_message_tooltip", + "screen\\.media_upload_preview.caption_warning" ] }, { @@ -213,7 +214,8 @@ "screen_room_retry.*", "screen_room_timeline.*", "screen\\.room_timeline.*", - "screen_room_typing.*" + "screen_room_typing.*", + "screen\\.media_upload.*" ] }, {