From 8c3e4f491f8d513327c7d20505d33b63066677e4 Mon Sep 17 00:00:00 2001 From: proitlab Date: Thu, 18 Dec 2025 16:28:50 +0700 Subject: [PATCH] First Commit --- .editorconfig | 928 +++++ .gitattributes | 5 + .gitignore | 117 + .gitmodules | 3 + .idea/codeStyles/Project.xml | 124 + .idea/codeStyles/codeStyleConfig.xml | 5 + .idea/copyright/Element_Enterprise.xml | 6 + .idea/copyright/Element_FOSS.xml | 6 + .idea/copyright/profiles_settings.xml | 7 + .idea/dictionaries/shared.xml | 27 + .idea/icon.png | Bin 0 -> 14783 bytes .idea/kotlinc.xml | 6 + .idea/migrations.xml | 10 + .idea/scopes/Enterprise.xml | 3 + .maestro/README.md | 74 + .maestro/allTests.yaml | 10 + .maestro/scripts/checkEnv.js | 10 + .maestro/tests/account/changeServer.yaml | 21 + .maestro/tests/account/login.yaml | 47 + .maestro/tests/account/logout.yaml | 15 + .maestro/tests/account/verifySession.yaml | 13 + .../assertions/assertAnalyticsDisplayed.yaml | 5 + .../tests/assertions/assertHomeDisplayed.yaml | 5 + .../tests/assertions/assertInitDisplayed.yaml | 5 + .../assertions/assertLoginDisplayed.yaml | 5 + .../assertions/assertRoomListSynced.yaml | 5 + .../assertSessionVerificationDisplayed.yaml | 5 + .maestro/tests/init.yaml | 7 + .../tests/roomList/createAndDeleteDM.yaml | 15 + .../tests/roomList/createAndDeleteRoom.yaml | 39 + .maestro/tests/roomList/roomContextMenu.yaml | 14 + .maestro/tests/roomList/roomList.yaml | 8 + .maestro/tests/roomList/searchRoomList.yaml | 18 + .../tests/roomList/timeline/call/call.yaml | 13 + .../roomList/timeline/messages/location.yaml | 7 + .../roomList/timeline/messages/poll.yaml | 13 + .../roomList/timeline/messages/text.yaml | 9 + .../tests/roomList/timeline/timeline.yaml | 14 + .maestro/tests/settings/settings.yaml | 46 + AUTHORS.md | 17 + CHANGES.md | 3034 +++++++++++++++++ CODEOWNERS | 1 + CONTRIBUTING.md | 195 ++ Gemfile | 3 + LICENSE | 661 ++++ LICENSE-COMMERCIAL | 6 + README.md | 114 + annotations/.gitignore | 1 + annotations/build.gradle.kts | 11 + .../android/annotations/ContributesNode.kt | 31 + app/build.gradle.kts | 363 ++ app/proguard-rules.pro | 72 + app/signature/debug.keystore | Bin 0 -> 1260 bytes app/signature/nightly.keystore | Bin 0 -> 2217 bytes app/src/main/AndroidManifest.xml | 188 + .../element/android/x/ElementXApplication.kt | 40 + .../io/element/android/x/MainActivity.kt | 170 + .../kotlin/io/element/android/x/MainNode.kt | 62 + .../io/element/android/x/di/AppBindings.kt | 51 + .../io/element/android/x/di/AppGraph.kt | 37 + .../io/element/android/x/di/AppModule.kt | 124 + .../android/x/di/DefaultRoomGraphFactory.kt | 24 + .../x/di/DefaultSessionGraphFactory.kt | 23 + .../io/element/android/x/di/RoomGraph.kt | 28 + .../io/element/android/x/di/SessionGraph.kt | 25 + .../kotlin/io/element/android/x/info/Logs.kt | 41 + .../x/initializer/CacheCleanerInitializer.kt | 22 + .../android/x/initializer/CrashInitializer.kt | 25 + .../x/initializer/PlatformInitializer.kt | 49 + .../android/x/intent/DefaultIntentProvider.kt | 44 + .../android/x/intent/SafeUriHandler.kt | 19 + .../x/oidc/DefaultOidcRedirectUrlProvider.kt | 25 + app/src/main/res/drawable/transparent.xml | 12 + app/src/main/res/resources.properties | 7 + app/src/main/res/values-night/themes.xml | 17 + app/src/main/res/values/colors.xml | 13 + app/src/main/res/values/themes.xml | 17 + app/src/main/res/xml/automotive_app_desc.xml | 10 + app/src/main/res/xml/backup_rules.xml | 17 + .../main/res/xml/data_extraction_rules.xml | 27 + app/src/main/res/xml/file_providers.xml | 10 + app/src/main/res/xml/locales_config.xml | 39 + .../main/res/xml/network_security_config.xml | 34 + .../x/intent/DefaultIntentProviderTest.kt | 70 + .../DefaultOidcRedirectUrlProviderTest.kt | 29 + appconfig/build.gradle.kts | 53 + .../android/appconfig/AnalyticsConfig.kt | 13 + .../android/appconfig/ApplicationConfig.kt | 35 + .../android/appconfig/AuthenticationConfig.kt | 23 + .../android/appconfig/ElementCallConfig.kt | 16 + .../android/appconfig/LearnMoreConfig.kt | 16 + .../android/appconfig/LockScreenConfig.kt | 35 + .../android/appconfig/MatrixConfiguration.kt | 14 + .../appconfig/MessageComposerConfig.kt | 16 + .../android/appconfig/NotificationConfig.kt | 32 + .../android/appconfig/OnBoardingConfig.kt | 14 + .../element/android/appconfig/PushConfig.kt | 16 + .../android/appconfig/RageshakeConfig.kt | 28 + .../android/appconfig/RoomListConfig.kt | 16 + .../android/appconfig/TimelineConfig.kt | 35 + .../android/appconfig/VoiceMessageConfig.kt | 15 + appicon/element/build.gradle.kts | 18 + .../res/drawable/ic_launcher_background.xml | 10 + .../src/main/ic_launcher-playstore.png | Bin 0 -> 100546 bytes .../android/appicon/element/IconPreview.kt | 68 + .../res/mipmap-anydpi-v26/ic_launcher.xml | 12 + .../mipmap-anydpi-v26/ic_launcher_round.xml | 12 + .../src/main/res/mipmap-hdpi/ic_launcher.webp | Bin 0 -> 2558 bytes .../mipmap-hdpi/ic_launcher_foreground.webp | Bin 0 -> 6494 bytes .../mipmap-hdpi/ic_launcher_monochrome.webp | Bin 0 -> 1426 bytes .../res/mipmap-hdpi/ic_launcher_round.webp | Bin 0 -> 4112 bytes .../src/main/res/mipmap-mdpi/ic_launcher.webp | Bin 0 -> 1612 bytes .../mipmap-mdpi/ic_launcher_foreground.webp | Bin 0 -> 3482 bytes .../mipmap-mdpi/ic_launcher_monochrome.webp | Bin 0 -> 946 bytes .../res/mipmap-mdpi/ic_launcher_round.webp | Bin 0 -> 2590 bytes .../main/res/mipmap-xhdpi/ic_launcher.webp | Bin 0 -> 3700 bytes .../mipmap-xhdpi/ic_launcher_foreground.webp | Bin 0 -> 10464 bytes .../mipmap-xhdpi/ic_launcher_monochrome.webp | Bin 0 -> 1950 bytes .../res/mipmap-xhdpi/ic_launcher_round.webp | Bin 0 -> 6018 bytes .../main/res/mipmap-xxhdpi/ic_launcher.webp | Bin 0 -> 6746 bytes .../mipmap-xxhdpi/ic_launcher_foreground.webp | Bin 0 -> 19448 bytes .../mipmap-xxhdpi/ic_launcher_monochrome.webp | Bin 0 -> 3340 bytes .../res/mipmap-xxhdpi/ic_launcher_round.webp | Bin 0 -> 10530 bytes .../main/res/mipmap-xxxhdpi/ic_launcher.webp | Bin 0 -> 10000 bytes .../ic_launcher_foreground.webp | Bin 0 -> 31880 bytes .../ic_launcher_monochrome.webp | Bin 0 -> 4664 bytes .../res/mipmap-xxxhdpi/ic_launcher_round.webp | Bin 0 -> 15374 bytes .../res/drawable/ic_launcher_background.xml | 10 + .../res/drawable/ic_launcher_background.xml | 10 + appicon/enterprise/build.gradle.kts | 18 + .../ic_launcher_background_enterprise.xml | 10 + .../android/appicon/enterprise/IconPreview.kt | 45 + .../main/res/mipmap-anydpi/ic_launcher.xml | 11 + .../res/mipmap-anydpi/ic_launcher_round.xml | 11 + .../ic_launcher_background_enterprise.webp | Bin 0 -> 2458 bytes .../ic_launcher_background_enterprise.webp | Bin 0 -> 1428 bytes .../ic_launcher_background_enterprise.webp | Bin 0 -> 4050 bytes .../ic_launcher_background_enterprise.webp | Bin 0 -> 7436 bytes .../ic_launcher_foreground_enterprise.webp | Bin 0 -> 4816 bytes .../ic_launcher_background_enterprise.webp | Bin 0 -> 14080 bytes .../ic_launcher_background_enterprise.xml | 10 + .../ic_launcher_background_enterprise.xml | 2 + appnav/build.gradle.kts | 71 + .../io/element/android/appnav/BackstackExt.kt | 34 + .../appnav/LoggedInAppScopeFlowNode.kt | 107 + .../android/appnav/LoggedInEventProcessor.kt | 62 + .../android/appnav/LoggedInFlowNode.kt | 633 ++++ .../android/appnav/NotLoggedInFlowNode.kt | 115 + .../io/element/android/appnav/RootFlowNode.kt | 478 +++ .../android/appnav/di/MatrixSessionCache.kt | 126 + .../android/appnav/di/RoomGraphFactory.kt | 15 + .../android/appnav/di/SessionGraphFactory.kt | 15 + .../android/appnav/di/SyncOrchestrator.kt | 144 + .../android/appnav/di/TimelineBindings.kt | 17 + .../android/appnav/intent/IntentResolver.kt | 77 + .../loggedin/AnalyticsVerificationStateExt.kt | 51 + .../android/appnav/loggedin/LoggedInEvents.kt | 15 + .../android/appnav/loggedin/LoggedInNode.kt | 47 + .../appnav/loggedin/LoggedInPresenter.kt | 172 + .../android/appnav/loggedin/LoggedInState.kt | 20 + .../appnav/loggedin/LoggedInStateProvider.kt | 37 + .../android/appnav/loggedin/LoggedInView.kt | 125 + .../loggedin/MediaPreviewConfigMigration.kt | 60 + .../android/appnav/loggedin/SendQueues.kt | 56 + .../android/appnav/loggedin/SyncStateView.kt | 52 + .../android/appnav/room/RoomFlowNode.kt | 259 ++ .../appnav/room/RoomNavigationTarget.kt | 29 + .../appnav/room/joined/JoinedRoomFlowNode.kt | 140 + .../room/joined/JoinedRoomLoadedFlowNode.kt | 309 ++ .../appnav/room/joined/LoadingRoomNodeView.kt | 92 + .../android/appnav/root/RootNavState.kt | 26 + .../appnav/root/RootNavStateFlowFactory.kt | 89 + .../android/appnav/root/RootPresenter.kt | 54 + .../element/android/appnav/root/RootState.kt | 19 + .../android/appnav/root/RootStateProvider.kt | 38 + .../element/android/appnav/root/RootView.kt | 70 + .../src/main/res/values-be/translations.xml | 5 + .../src/main/res/values-cs/translations.xml | 6 + .../src/main/res/values-cy/translations.xml | 6 + .../src/main/res/values-da/translations.xml | 6 + .../src/main/res/values-de/translations.xml | 6 + .../src/main/res/values-el/translations.xml | 6 + .../src/main/res/values-es/translations.xml | 6 + .../src/main/res/values-et/translations.xml | 6 + .../src/main/res/values-eu/translations.xml | 6 + .../src/main/res/values-fa/translations.xml | 5 + .../src/main/res/values-fi/translations.xml | 6 + .../src/main/res/values-fr/translations.xml | 6 + .../src/main/res/values-hu/translations.xml | 6 + .../src/main/res/values-in/translations.xml | 6 + .../src/main/res/values-it/translations.xml | 6 + .../src/main/res/values-ko/translations.xml | 6 + .../src/main/res/values-nb/translations.xml | 6 + .../src/main/res/values-nl/translations.xml | 5 + .../src/main/res/values-pl/translations.xml | 6 + .../main/res/values-pt-rBR/translations.xml | 6 + .../src/main/res/values-pt/translations.xml | 6 + .../src/main/res/values-ro/translations.xml | 6 + .../src/main/res/values-ru/translations.xml | 6 + .../src/main/res/values-sk/translations.xml | 6 + .../src/main/res/values-sv/translations.xml | 6 + .../src/main/res/values-tr/translations.xml | 7 + .../src/main/res/values-uk/translations.xml | 6 + .../src/main/res/values-ur/translations.xml | 5 + .../src/main/res/values-uz/translations.xml | 6 + .../main/res/values-zh-rTW/translations.xml | 6 + .../src/main/res/values-zh/translations.xml | 6 + appnav/src/main/res/values/localazy.xml | 6 + .../appnav/JoinedRoomLoadedFlowNodeTest.kt | 239 ++ .../android/appnav/RootPresenterTest.kt | 80 + .../android/appnav/SyncOrchestratorTest.kt | 396 +++ .../appnav/di/MatrixSessionCacheTest.kt | 137 + .../appnav/intent/IntentResolverTest.kt | 313 ++ .../AnalyticsVerificationStateMappingTest.kt | 62 + .../appnav/loggedin/LoggedInPresenterTest.kt | 348 ++ .../MediaPreviewConfigMigrationTest.kt | 163 + .../android/appnav/loggedin/SendQueuesTest.kt | 79 + .../LoadingBaseRoomStateFlowFactoryTest.kt | 83 + .../FakeJoinedRoomLoadedFlowNodeCallback.kt | 19 + build.gradle.kts | 237 ++ codegen/.gitignore | 1 + codegen/build.gradle.kts | 20 + .../codegen/ContributesNodeProcessor.kt | 173 + .../ContributesNodeProcessorProvider.kt | 24 + ...ols.ksp.processing.SymbolProcessorProvider | 1 + docs/_developer_onboarding.md | 433 +++ docs/analytics.md | 17 + docs/continuous_integration.md | 69 + docs/danger.md | 105 + docs/debug_proxying.md | 22 + docs/deeplink.md | 71 + docs/design.md | 161 + docs/images-lfs/screen_1_dark.png | 3 + docs/images-lfs/screen_1_light.png | 3 + docs/images-lfs/screen_2_dark.png | 3 + docs/images-lfs/screen_2_light.png | 3 + docs/images-lfs/screen_3_dark.png | 3 + docs/images-lfs/screen_3_light.png | 3 + docs/images-lfs/screen_4_dark.png | 3 + docs/images-lfs/screen_4_light.png | 3 + docs/images/module_graph.png | Bin 0 -> 276632 bytes docs/install_from_github_release.md | 94 + docs/installing_from_ci.md | 49 + docs/integration_tests.md | 131 + docs/maps.md | 47 + docs/migration_to_metro.md | 15 + docs/nightly_build.md | 48 + docs/notifications.md | 284 ++ docs/oidc.md | 51 + docs/pull_request.md | 290 ++ docs/screenshot_testing.md | 67 + .../android/en-US/changelogs/1001000.txt | 1 + .../android/en-US/changelogs/202502000.txt | 2 + .../android/en-US/changelogs/202503000.txt | 2 + .../android/en-US/changelogs/202503010.txt | 2 + .../android/en-US/changelogs/202503020.txt | 2 + .../android/en-US/changelogs/202503030.txt | 2 + .../android/en-US/changelogs/202503040.txt | 2 + .../android/en-US/changelogs/202504000.txt | 2 + .../android/en-US/changelogs/202504010.txt | 2 + .../android/en-US/changelogs/202504020.txt | 2 + .../android/en-US/changelogs/202504030.txt | 2 + .../android/en-US/changelogs/202505000.txt | 2 + .../android/en-US/changelogs/202505010.txt | 2 + .../android/en-US/changelogs/202505030.txt | 2 + .../android/en-US/changelogs/202505040.txt | 2 + .../android/en-US/changelogs/202506000.txt | 2 + .../android/en-US/changelogs/202506010.txt | 2 + .../android/en-US/changelogs/202506020.txt | 2 + .../android/en-US/changelogs/202506030.txt | 2 + .../android/en-US/changelogs/202507000.txt | 2 + .../android/en-US/changelogs/202507010.txt | 2 + .../android/en-US/changelogs/202508000.txt | 2 + .../android/en-US/changelogs/202508010.txt | 4 + .../android/en-US/changelogs/202508020.txt | 3 + .../android/en-US/changelogs/202508030.txt | 2 + .../android/en-US/changelogs/202508040.txt | 2 + .../android/en-US/changelogs/202509000.txt | 2 + .../android/en-US/changelogs/202509010.txt | 2 + .../android/en-US/changelogs/202509020.txt | 2 + .../android/en-US/changelogs/202510000.txt | 2 + .../android/en-US/changelogs/202510010.txt | 2 + .../android/en-US/changelogs/202511000.txt | 2 + .../android/en-US/changelogs/202511020.txt | 2 + .../android/en-US/changelogs/202511030.txt | 2 + .../android/en-US/changelogs/202512000.txt | 6 + .../android/en-US/changelogs/40001020.txt | 2 + .../android/en-US/changelogs/40001040.txt | 2 + .../android/en-US/changelogs/40001050.txt | 2 + .../android/en-US/changelogs/40001060.txt | 2 + .../android/en-US/changelogs/40002000.txt | 2 + .../android/en-US/changelogs/40002010.txt | 2 + .../android/en-US/changelogs/40002020.txt | 2 + .../android/en-US/changelogs/40002030.txt | 2 + .../android/en-US/changelogs/40002040.txt | 2 + .../android/en-US/changelogs/40003000.txt | 2 + .../android/en-US/changelogs/40003010.txt | 2 + .../android/en-US/changelogs/40003020.txt | 7 + .../android/en-US/changelogs/40004000.txt | 13 + .../android/en-US/changelogs/40004010.txt | 2 + .../android/en-US/changelogs/40004020.txt | 2 + .../android/en-US/changelogs/40004030.txt | 10 + .../android/en-US/changelogs/40004040.txt | 4 + .../android/en-US/changelogs/40004050.txt | 2 + .../android/en-US/changelogs/40004060.txt | 2 + .../android/en-US/changelogs/40004070.txt | 2 + .../android/en-US/changelogs/40004080.txt | 2 + .../android/en-US/changelogs/40004090.txt | 2 + .../android/en-US/changelogs/40004100.txt | 2 + .../android/en-US/changelogs/40004120.txt | 10 + .../android/en-US/changelogs/40004130.txt | 2 + .../android/en-US/changelogs/40004140.txt | 2 + .../android/en-US/changelogs/40004150.txt | 2 + .../android/en-US/changelogs/40004160.txt | 2 + .../android/en-US/changelogs/40005000.txt | 2 + .../android/en-US/changelogs/40005010.txt | 2 + .../android/en-US/changelogs/40005020.txt | 2 + .../android/en-US/changelogs/40005030.txt | 2 + .../android/en-US/changelogs/40006000.txt | 2 + .../android/en-US/changelogs/40006010.txt | 2 + .../android/en-US/changelogs/40006020.txt | 2 + .../android/en-US/changelogs/40006030.txt | 2 + .../android/en-US/changelogs/40006040.txt | 2 + .../android/en-US/changelogs/40006050.txt | 2 + .../android/en-US/changelogs/40007000.txt | 2 + .../android/en-US/changelogs/40007010.txt | 2 + .../android/en-US/changelogs/40007020.txt | 2 + .../android/en-US/changelogs/40007030.txt | 2 + .../android/en-US/changelogs/40007040.txt | 2 + .../android/en-US/changelogs/40007050.txt | 2 + .../android/en-US/changelogs/40007060.txt | 2 + .../android/en-US/full_description.txt | 29 + .../android/en-US/images/featureGraphic.png | Bin 0 -> 400607 bytes .../metadata/android/en-US/images/icon.png | Bin 0 -> 100546 bytes .../en-US/images/phoneScreenshots/1.png | Bin 0 -> 2111233 bytes .../en-US/images/phoneScreenshots/2.png | Bin 0 -> 1505815 bytes .../en-US/images/phoneScreenshots/3.png | Bin 0 -> 1450454 bytes .../en-US/images/phoneScreenshots/4.png | Bin 0 -> 1330207 bytes .../en-US/images/phoneScreenshots/5.png | Bin 0 -> 2529493 bytes .../android/en-US/short_description.txt | 1 + fastlane/metadata/android/en-US/title.txt | 1 + features/analytics/api/build.gradle.kts | 21 + .../analytics/api/AnalyticsEntryPoint.kt | 13 + .../analytics/api/AnalyticsOptInEvents.kt | 13 + .../preferences/AnalyticsPreferencesState.kt | 18 + .../AnalyticsPreferencesStateProvider.kt | 30 + .../preferences/AnalyticsPreferencesView.kt | 74 + .../src/main/res/values-be/translations.xml | 7 + .../src/main/res/values-bg/translations.xml | 7 + .../src/main/res/values-cs/translations.xml | 7 + .../src/main/res/values-cy/translations.xml | 7 + .../src/main/res/values-da/translations.xml | 7 + .../src/main/res/values-de/translations.xml | 7 + .../src/main/res/values-el/translations.xml | 7 + .../src/main/res/values-es/translations.xml | 7 + .../src/main/res/values-et/translations.xml | 7 + .../src/main/res/values-eu/translations.xml | 7 + .../src/main/res/values-fa/translations.xml | 7 + .../src/main/res/values-fi/translations.xml | 7 + .../src/main/res/values-fr/translations.xml | 7 + .../src/main/res/values-hu/translations.xml | 7 + .../src/main/res/values-in/translations.xml | 7 + .../src/main/res/values-it/translations.xml | 7 + .../src/main/res/values-ka/translations.xml | 7 + .../src/main/res/values-ko/translations.xml | 7 + .../src/main/res/values-lt/translations.xml | 7 + .../src/main/res/values-nb/translations.xml | 7 + .../src/main/res/values-nl/translations.xml | 7 + .../src/main/res/values-pl/translations.xml | 7 + .../main/res/values-pt-rBR/translations.xml | 7 + .../src/main/res/values-pt/translations.xml | 7 + .../src/main/res/values-ro/translations.xml | 7 + .../src/main/res/values-ru/translations.xml | 7 + .../src/main/res/values-sk/translations.xml | 7 + .../src/main/res/values-sv/translations.xml | 7 + .../src/main/res/values-tr/translations.xml | 7 + .../src/main/res/values-uk/translations.xml | 7 + .../src/main/res/values-ur/translations.xml | 7 + .../src/main/res/values-uz/translations.xml | 7 + .../main/res/values-zh-rTW/translations.xml | 7 + .../src/main/res/values-zh/translations.xml | 7 + .../api/src/main/res/values/localazy.xml | 7 + features/analytics/impl/build.gradle.kts | 38 + .../analytics/impl/AnalyticsOptInNode.kt | 48 + .../analytics/impl/AnalyticsOptInPresenter.kt | 50 + .../analytics/impl/AnalyticsOptInState.kt | 17 + .../impl/AnalyticsOptInStateProvider.kt | 27 + .../analytics/impl/AnalyticsOptInView.kt | 180 + .../impl/DefaultAnalyticsEntryPoint.kt | 23 + .../analytics/impl/di/AnalyticsModule.kt | 24 + .../AnalyticsPreferencesPresenter.kt | 51 + .../src/main/res/values-be/translations.xml | 10 + .../src/main/res/values-bg/translations.xml | 10 + .../src/main/res/values-cs/translations.xml | 10 + .../src/main/res/values-cy/translations.xml | 10 + .../src/main/res/values-da/translations.xml | 10 + .../src/main/res/values-de/translations.xml | 10 + .../src/main/res/values-el/translations.xml | 10 + .../src/main/res/values-es/translations.xml | 10 + .../src/main/res/values-et/translations.xml | 10 + .../src/main/res/values-eu/translations.xml | 9 + .../src/main/res/values-fa/translations.xml | 10 + .../src/main/res/values-fi/translations.xml | 10 + .../src/main/res/values-fr/translations.xml | 10 + .../src/main/res/values-hu/translations.xml | 10 + .../src/main/res/values-in/translations.xml | 10 + .../src/main/res/values-it/translations.xml | 10 + .../src/main/res/values-ka/translations.xml | 10 + .../src/main/res/values-ko/translations.xml | 10 + .../src/main/res/values-lt/translations.xml | 10 + .../src/main/res/values-nb/translations.xml | 10 + .../src/main/res/values-nl/translations.xml | 10 + .../src/main/res/values-pl/translations.xml | 10 + .../main/res/values-pt-rBR/translations.xml | 10 + .../src/main/res/values-pt/translations.xml | 10 + .../src/main/res/values-ro/translations.xml | 10 + .../src/main/res/values-ru/translations.xml | 10 + .../src/main/res/values-sk/translations.xml | 10 + .../src/main/res/values-sv/translations.xml | 10 + .../src/main/res/values-tr/translations.xml | 10 + .../src/main/res/values-uk/translations.xml | 10 + .../src/main/res/values-ur/translations.xml | 10 + .../src/main/res/values-uz/translations.xml | 10 + .../main/res/values-zh-rTW/translations.xml | 10 + .../src/main/res/values-zh/translations.xml | 10 + .../impl/src/main/res/values/localazy.xml | 10 + .../impl/AnalyticsOptInPresenterTest.kt | 63 + .../impl/DefaultAnalyticsEntryPointTest.kt | 40 + .../AnalyticsPreferencesPresenterTest.kt | 76 + features/announcement/api/build.gradle.kts | 14 + .../features/announcement/api/Announcement.kt | 14 + .../announcement/api/AnnouncementService.kt | 29 + features/announcement/impl/build.gradle.kts | 38 + .../impl/AnnouncementPresenter.kt | 37 + .../announcement/impl/AnnouncementState.kt | 19 + .../impl/DefaultAnnouncementService.kt | 89 + .../impl/di/AnnouncementModule.kt | 29 + .../impl/spaces/SpaceAnnouncementEvents.kt | 13 + .../impl/spaces/SpaceAnnouncementPresenter.kt | 40 + .../impl/spaces/SpaceAnnouncementState.kt | 13 + .../spaces/SpaceAnnouncementStateProvider.kt | 24 + .../impl/spaces/SpaceAnnouncementView.kt | 158 + .../impl/store/AnnouncementStatus.kt | 15 + .../impl/store/AnnouncementStore.kt | 25 + .../impl/store/DefaultAnnouncementStore.kt | 57 + .../src/main/res/values-bg/translations.xml | 4 + .../src/main/res/values-cs/translations.xml | 11 + .../src/main/res/values-da/translations.xml | 11 + .../src/main/res/values-de/translations.xml | 11 + .../src/main/res/values-et/translations.xml | 11 + .../src/main/res/values-fa/translations.xml | 11 + .../src/main/res/values-fi/translations.xml | 11 + .../src/main/res/values-fr/translations.xml | 11 + .../src/main/res/values-hu/translations.xml | 11 + .../src/main/res/values-it/translations.xml | 11 + .../src/main/res/values-nb/translations.xml | 11 + .../src/main/res/values-pl/translations.xml | 11 + .../main/res/values-pt-rBR/translations.xml | 11 + .../src/main/res/values-ro/translations.xml | 11 + .../src/main/res/values-ru/translations.xml | 11 + .../src/main/res/values-sk/translations.xml | 11 + .../main/res/values-zh-rTW/translations.xml | 11 + .../src/main/res/values-zh/translations.xml | 11 + .../impl/src/main/res/values/localazy.xml | 11 + .../impl/AnnouncementPresenterTest.kt | 53 + .../impl/DefaultAnnouncementServiceTest.kt | 85 + .../spaces/SpaceAnnouncementPresenterTest.kt | 41 + .../impl/spaces/SpaceAnnouncementViewTest.kt | 61 + .../impl/store/InMemoryAnnouncementStore.kt | 40 + features/announcement/test/build.gradle.kts | 20 + .../test/logs/FakeAnnouncementService.kt | 48 + features/cachecleaner/api/build.gradle.kts | 20 + .../features/cachecleaner/api/CacheCleaner.kt | 18 + features/cachecleaner/impl/build.gradle.kts | 28 + .../cachecleaner/impl/CacheCleanerBindings.kt | 18 + .../cachecleaner/impl/DefaultCacheCleaner.kt | 53 + .../impl/DefaultCacheCleanerTest.kt | 63 + features/call/api/build.gradle.kts | 22 + .../android/features/call/api/CallType.kt | 34 + .../android/features/call/api/CurrentCall.kt | 26 + .../features/call/api/CurrentCallService.kt | 20 + .../call/api/ElementCallEntryPoint.kt | 49 + features/call/impl/build.gradle.kts | 103 + .../call/impl/src/main/AndroidManifest.xml | 93 + .../call/impl/DefaultElementCallEntryPoint.kt | 64 + .../features/call/impl/data/WidgetMessage.kt | 49 + .../features/call/impl/di/CallBindings.kt | 22 + .../notifications/CallNotificationData.kt | 32 + .../RingingCallNotificationCreator.kt | 148 + .../call/impl/pip/PictureInPictureEvents.kt | 17 + .../impl/pip/PictureInPicturePresenter.kt | 96 + .../call/impl/pip/PictureInPictureState.kt | 15 + .../impl/pip/PictureInPictureStateProvider.kt | 21 + .../call/impl/pip/PipSupportProvider.kt | 34 + .../android/features/call/impl/pip/PipView.kt | 15 + .../receivers/DeclineCallBroadcastReceiver.kt | 46 + .../impl/services/CallForegroundService.kt | 98 + .../features/call/impl/ui/CallScreenEvents.kt | 17 + .../call/impl/ui/CallScreenPresenter.kt | 281 ++ .../features/call/impl/ui/CallScreenState.kt | 20 + .../call/impl/ui/CallScreenStateProvider.kt | 40 + .../features/call/impl/ui/CallScreenView.kt | 277 ++ .../call/impl/ui/CallTypeExtension.kt | 19 + .../call/impl/ui/ElementCallActivity.kt | 299 ++ .../call/impl/ui/IncomingCallActivity.kt | 124 + .../call/impl/ui/IncomingCallScreen.kt | 185 + .../call/impl/ui/LanguageTagProvider.kt | 27 + .../call/impl/utils/ActiveCallManager.kt | 400 +++ .../call/impl/utils/CallIntentDataParser.kt | 98 + .../call/impl/utils/CallWidgetProvider.kt | 28 + .../DefaultCallAnalyticCredentialsProvider.kt | 23 + .../impl/utils/DefaultCallWidgetProvider.kt | 69 + .../impl/utils/DefaultCurrentCallService.kt | 30 + .../call/impl/utils/IntentProvider.kt | 34 + .../features/call/impl/utils/PipController.kt | 15 + .../call/impl/utils/WebViewAudioManager.kt | 521 +++ .../call/impl/utils/WebViewPipController.kt | 38 + .../utils/WebViewWidgetMessageInterceptor.kt | 174 + .../impl/utils/WidgetMessageInterceptor.kt | 16 + .../impl/utils/WidgetMessageSerializer.kt | 27 + .../src/main/res/values-be/translations.xml | 7 + .../src/main/res/values-cs/translations.xml | 8 + .../src/main/res/values-cy/translations.xml | 8 + .../src/main/res/values-da/translations.xml | 8 + .../src/main/res/values-de/translations.xml | 8 + .../src/main/res/values-el/translations.xml | 8 + .../src/main/res/values-es/translations.xml | 7 + .../src/main/res/values-et/translations.xml | 8 + .../src/main/res/values-eu/translations.xml | 7 + .../src/main/res/values-fa/translations.xml | 7 + .../src/main/res/values-fi/translations.xml | 8 + .../src/main/res/values-fr/translations.xml | 8 + .../src/main/res/values-hu/translations.xml | 8 + .../src/main/res/values-in/translations.xml | 8 + .../src/main/res/values-it/translations.xml | 8 + .../src/main/res/values-ka/translations.xml | 6 + .../src/main/res/values-ko/translations.xml | 8 + .../src/main/res/values-nb/translations.xml | 8 + .../src/main/res/values-nl/translations.xml | 7 + .../src/main/res/values-pl/translations.xml | 8 + .../main/res/values-pt-rBR/translations.xml | 8 + .../src/main/res/values-pt/translations.xml | 8 + .../src/main/res/values-ro/translations.xml | 8 + .../src/main/res/values-ru/translations.xml | 8 + .../src/main/res/values-sk/translations.xml | 8 + .../src/main/res/values-sv/translations.xml | 8 + .../src/main/res/values-tr/translations.xml | 7 + .../src/main/res/values-uk/translations.xml | 8 + .../src/main/res/values-ur/translations.xml | 7 + .../src/main/res/values-uz/translations.xml | 8 + .../main/res/values-zh-rTW/translations.xml | 8 + .../src/main/res/values-zh/translations.xml | 8 + .../src/main/res/values/do_not_translate.xml | 10 + .../impl/src/main/res/values/localazy.xml | 8 + .../call/DefaultElementCallEntryPointTest.kt | 79 + .../features/call/MapWebkitPermissionsTest.kt | 35 + .../call/impl/pip/FakePipController.kt | 24 + .../call/impl/pip/FakePipSupportProvider.kt | 15 + .../features/call/impl/pip/FakePipView.kt | 21 + .../impl/pip/PictureInPicturePresenterTest.kt | 144 + .../RingingCallNotificationCreatorTest.kt | 92 + .../call/ui/CallScreenPresenterTest.kt | 419 +++ .../android/features/call/ui/CallTypeTest.kt | 44 + .../call/ui/FakeCallScreenNavigator.kt | 20 + .../call/ui/FakeLanguageTagProvider.kt | 17 + .../call/utils/CallIntentDataParserTest.kt | 226 ++ .../utils/DefaultActiveCallManagerTest.kt | 480 +++ .../utils/DefaultCallWidgetProviderTest.kt | 141 + .../call/utils/FakeActiveCallManager.kt | 40 + .../call/utils/FakeCallWidgetProvider.kt | 38 + .../utils/FakeWidgetMessageInterceptor.kt | 26 + features/call/test/build.gradle.kts | 27 + .../call/test/CallNotificationData.kt | 48 + .../call/test/FakeCurrentCallService.kt | 17 + .../call/test/FakeElementCallEntryPoint.kt | 57 + features/createroom/api/build.gradle.kts | 19 + .../createroom/api/CreateRoomEntryPoint.kt | 27 + features/createroom/impl/build.gradle.kts | 57 + .../createroom/impl/CreateRoomFlowNode.kt | 82 + .../impl/DefaultCreateRoomEntryPoint.kt | 27 + .../impl/addpeople/AddPeopleNode.kt | 60 + .../impl/addpeople/AddPeopleView.kt | 86 + .../impl/configureroom/ConfigureRoomEvents.kt | 22 + .../impl/configureroom/ConfigureRoomNode.kt | 58 + .../configureroom/ConfigureRoomPresenter.kt | 211 ++ .../impl/configureroom/ConfigureRoomState.kt | 30 + .../ConfigureRoomStateProvider.kt | 102 + .../impl/configureroom/ConfigureRoomView.kt | 337 ++ .../impl/configureroom/CreateRoomConfig.kt | 21 + .../configureroom/CreateRoomConfigStore.kt | 120 + .../impl/configureroom/RoomAccess.kt | 23 + .../impl/configureroom/RoomAccessItem.kt | 26 + .../impl/configureroom/RoomAddress.kt | 14 + .../impl/configureroom/RoomVisibilityItem.kt | 31 + .../impl/configureroom/RoomVisibilityState.kt | 27 + .../src/main/res/values-be/translations.xml | 17 + .../src/main/res/values-bg/translations.xml | 18 + .../src/main/res/values-cs/translations.xml | 22 + .../src/main/res/values-cy/translations.xml | 22 + .../src/main/res/values-da/translations.xml | 21 + .../src/main/res/values-de/translations.xml | 22 + .../src/main/res/values-el/translations.xml | 22 + .../src/main/res/values-es/translations.xml | 21 + .../src/main/res/values-et/translations.xml | 22 + .../src/main/res/values-eu/translations.xml | 19 + .../src/main/res/values-fa/translations.xml | 20 + .../src/main/res/values-fi/translations.xml | 22 + .../src/main/res/values-fr/translations.xml | 22 + .../src/main/res/values-hu/translations.xml | 22 + .../src/main/res/values-in/translations.xml | 22 + .../src/main/res/values-it/translations.xml | 22 + .../src/main/res/values-ka/translations.xml | 13 + .../src/main/res/values-ko/translations.xml | 21 + .../src/main/res/values-lt/translations.xml | 13 + .../src/main/res/values-nb/translations.xml | 21 + .../src/main/res/values-nl/translations.xml | 19 + .../src/main/res/values-pl/translations.xml | 22 + .../main/res/values-pt-rBR/translations.xml | 22 + .../src/main/res/values-pt/translations.xml | 22 + .../src/main/res/values-ro/translations.xml | 22 + .../src/main/res/values-ru/translations.xml | 22 + .../src/main/res/values-sk/translations.xml | 22 + .../src/main/res/values-sv/translations.xml | 22 + .../src/main/res/values-tr/translations.xml | 22 + .../src/main/res/values-uk/translations.xml | 22 + .../src/main/res/values-ur/translations.xml | 14 + .../src/main/res/values-uz/translations.xml | 21 + .../main/res/values-zh-rTW/translations.xml | 22 + .../src/main/res/values-zh/translations.xml | 22 + .../impl/src/main/res/values/localazy.xml | 22 + .../impl/DefaultCreateRoomEntryPointTest.kt | 49 + .../ConfigureRoomPresenterTest.kt | 416 +++ features/createroom/test/build.gradle.kts | 20 + .../api/FakeCreateRoomEntryPoint.kt | 21 + features/deactivation/api/build.gradle.kts | 18 + .../api/AccountDeactivationEntryPoint.kt | 13 + features/deactivation/impl/build.gradle.kts | 41 + .../logout/impl/AccountDeactivationEvents.kt | 16 + .../logout/impl/AccountDeactivationNode.kt | 37 + .../impl/AccountDeactivationPresenter.kt | 86 + .../logout/impl/AccountDeactivationState.kt | 33 + .../impl/AccountDeactivationStateProvider.kt | 53 + .../logout/impl/AccountDeactivationView.kt | 321 ++ .../DefaultAccountDeactivationEntryPoint.kt | 23 + .../ui/AccountDeactivationActionDialog.kt | 44 + .../AccountDeactivationConfirmationDialog.kt | 30 + .../src/main/res/values-be/translations.xml | 11 + .../src/main/res/values-bg/translations.xml | 5 + .../src/main/res/values-cs/translations.xml | 14 + .../src/main/res/values-cy/translations.xml | 14 + .../src/main/res/values-da/translations.xml | 14 + .../src/main/res/values-de/translations.xml | 14 + .../src/main/res/values-el/translations.xml | 14 + .../src/main/res/values-es/translations.xml | 14 + .../src/main/res/values-et/translations.xml | 14 + .../src/main/res/values-eu/translations.xml | 12 + .../src/main/res/values-fa/translations.xml | 9 + .../src/main/res/values-fi/translations.xml | 14 + .../src/main/res/values-fr/translations.xml | 14 + .../src/main/res/values-hu/translations.xml | 14 + .../src/main/res/values-in/translations.xml | 14 + .../src/main/res/values-it/translations.xml | 14 + .../src/main/res/values-ko/translations.xml | 14 + .../src/main/res/values-nb/translations.xml | 14 + .../src/main/res/values-nl/translations.xml | 14 + .../src/main/res/values-pl/translations.xml | 14 + .../main/res/values-pt-rBR/translations.xml | 14 + .../src/main/res/values-pt/translations.xml | 14 + .../src/main/res/values-ro/translations.xml | 14 + .../src/main/res/values-ru/translations.xml | 14 + .../src/main/res/values-sk/translations.xml | 14 + .../src/main/res/values-sv/translations.xml | 14 + .../src/main/res/values-tr/translations.xml | 14 + .../src/main/res/values-uk/translations.xml | 14 + .../src/main/res/values-ur/translations.xml | 14 + .../src/main/res/values-uz/translations.xml | 14 + .../main/res/values-zh-rTW/translations.xml | 14 + .../src/main/res/values-zh/translations.xml | 14 + .../impl/src/main/res/values/localazy.xml | 14 + .../impl/AccountDeactivationPresenterTest.kt | 158 + .../impl/AccountDeactivationViewTest.kt | 153 + ...efaultAccountDeactivationEntryPointTest.kt | 35 + features/deactivation/test/build.gradle.kts | 20 + .../test/FakeAccountDeactivationEntryPoint.kt | 23 + features/enterprise/api/build.gradle.kts | 20 + .../features/enterprise/api/BugReportUrl.kt | 17 + .../enterprise/api/EnterpriseService.kt | 47 + .../api/SessionEnterpriseService.kt | 15 + .../enterprise/impl-foss/build.gradle.kts | 29 + .../impl/DefaultEnterpriseService.kt | 46 + .../impl/DefaultSessionEnterpriseService.kt | 19 + .../impl/DefaultEnterpriseServiceTest.kt | 101 + .../DefaultSessionEnterpriseServiceTest.kt | 21 + features/enterprise/test/build.gradle.kts | 21 + .../enterprise/test/FakeEnterpriseService.kt | 72 + .../test/FakeSessionEnterpriseService.kt | 24 + features/forward/api/build.gradle.kts | 20 + .../features/forward/api/ForwardEntryPoint.kt | 36 + features/forward/impl/build.gradle.kts | 41 + .../forward/impl/DefaultForwardEntryPoint.kt | 37 + .../forward/impl/ForwardMessagesEvents.kt | 13 + .../forward/impl/ForwardMessagesNode.kt | 97 + .../forward/impl/ForwardMessagesPresenter.kt | 76 + .../forward/impl/ForwardMessagesState.kt | 17 + .../impl/ForwardMessagesStateProvider.kt | 39 + .../forward/impl/ForwardMessagesView.kt | 46 + .../impl/DefaultForwardEntryPointTest.kt | 66 + .../impl/ForwardMessagesPresenterTest.kt | 103 + .../forward/impl/ForwardMessagesViewTest.kt | 72 + features/forward/test/build.gradle.kts | 21 + .../forward/test/FakeForwardEntryPoint.kt | 23 + features/ftue/api/build.gradle.kts | 19 + .../features/ftue/api/FtueEntryPoint.kt | 13 + .../features/ftue/api/state/FtueService.kt | 31 + features/ftue/impl/build.gradle.kts | 60 + .../ftue/impl/DefaultFtueEntryPoint.kt | 23 + .../features/ftue/impl/FtueFlowNode.kt | 148 + .../features/ftue/impl/di/FtueModule.kt | 24 + .../notifications/NotificationsOptInEvents.kt | 14 + .../notifications/NotificationsOptInNode.kt | 47 + .../NotificationsOptInPresenter.kt | 90 + .../notifications/NotificationsOptInState.kt | 16 + .../NotificationsOptInStateProvider.kt | 25 + .../notifications/NotificationsOptInView.kt | 189 + .../FtueSessionVerificationFlowNode.kt | 161 + .../ChooseSelfVerificationModeEvent.kt | 13 + .../ChooseSelfVerificationModeNode.kt | 56 + .../ChooseSelfVerificationModePresenter.kt | 75 + .../ChooseSelfVerificationModeState.kt | 23 + ...ChooseSelfVerificationModeStateProvider.kt | 58 + .../ChooseSelfVerificationModeView.kt | 159 + .../ftue/impl/state/DefaultFtueService.kt | 156 + .../ftue/impl/state/InternalFtueState.kt | 19 + .../src/main/res/values-be/translations.xml | 16 + .../src/main/res/values-bg/translations.xml | 13 + .../src/main/res/values-cs/translations.xml | 16 + .../src/main/res/values-cy/translations.xml | 16 + .../src/main/res/values-da/translations.xml | 16 + .../src/main/res/values-de/translations.xml | 16 + .../src/main/res/values-el/translations.xml | 16 + .../src/main/res/values-es/translations.xml | 16 + .../src/main/res/values-et/translations.xml | 16 + .../src/main/res/values-eu/translations.xml | 16 + .../src/main/res/values-fa/translations.xml | 16 + .../src/main/res/values-fi/translations.xml | 16 + .../src/main/res/values-fr/translations.xml | 16 + .../src/main/res/values-hu/translations.xml | 16 + .../src/main/res/values-in/translations.xml | 16 + .../src/main/res/values-it/translations.xml | 16 + .../src/main/res/values-ka/translations.xml | 12 + .../src/main/res/values-ko/translations.xml | 16 + .../src/main/res/values-nb/translations.xml | 16 + .../src/main/res/values-nl/translations.xml | 16 + .../src/main/res/values-pl/translations.xml | 16 + .../main/res/values-pt-rBR/translations.xml | 16 + .../src/main/res/values-pt/translations.xml | 16 + .../src/main/res/values-ro/translations.xml | 16 + .../src/main/res/values-ru/translations.xml | 16 + .../src/main/res/values-sk/translations.xml | 16 + .../src/main/res/values-sv/translations.xml | 16 + .../src/main/res/values-tr/translations.xml | 16 + .../src/main/res/values-uk/translations.xml | 16 + .../src/main/res/values-ur/translations.xml | 16 + .../src/main/res/values-uz/translations.xml | 16 + .../main/res/values-zh-rTW/translations.xml | 16 + .../src/main/res/values-zh/translations.xml | 16 + .../impl/src/main/res/values/localazy.xml | 16 + .../ftue/impl/DefaultFtueEntryPointTest.kt | 44 + .../ftue/impl/DefaultFtueServiceTest.kt | 211 ++ .../NotificationsOptInPresenterTest.kt | 135 + ...oseSessionVerificationModePresenterTest.kt | 135 + .../ChooseSessionVerificationModeViewTest.kt | 96 + features/ftue/test/build.gradle.kts | 21 + .../features/ftue/test/FakeFtueService.kt | 21 + features/home/api/build.gradle.kts | 19 + .../features/home/api/HomeEntryPoint.kt | 34 + features/home/impl/build.gradle.kts | 81 + .../impl/CurrentUserWithNeighborsBuilder.kt | 70 + .../home/impl/DefaultHomeEntryPoint.kt | 27 + .../android/features/home/impl/HomeEvents.kt | 16 + .../features/home/impl/HomeFlowNode.kt | 283 ++ .../home/impl/HomeNavigationBarItem.kt | 39 + .../features/home/impl/HomePresenter.kt | 124 + .../android/features/home/impl/HomeState.kt | 38 + .../features/home/impl/HomeStateProvider.kt | 78 + .../android/features/home/impl/HomeView.kt | 361 ++ .../home/impl/components/BannerPadding.kt | 18 + .../components/BatteryOptimizationBanner.kt | 46 + .../components/ConfirmRecoveryKeyBanner.kt | 46 + .../FullScreenIntentPermissionBanner.kt | 47 + .../home/impl/components/HomeTopBar.kt | 332 ++ .../components/NewNotificationSoundBanner.kt | 44 + .../impl/components/RoomListContentView.kt | 355 ++ .../impl/components/RoomListMenuAction.kt | 14 + .../components/RoomSummaryPlaceholderRow.kt | 86 + .../home/impl/components/RoomSummaryRow.kt | 445 +++ .../impl/components/SetUpRecoveryKeyBanner.kt | 45 + .../impl/datasource/RoomListDataSource.kt | 161 + .../datasource/RoomListRoomSummaryFactory.kt | 100 + .../features/home/impl/di/HomeSpacesModule.kt | 24 + .../features/home/impl/di/RoomListModule.kt | 34 + .../home/impl/filters/RoomListFilter.kt | 32 + .../RoomListFiltersEmptyStateResources.kt | 61 + .../impl/filters/RoomListFiltersEvents.kt | 14 + .../impl/filters/RoomListFiltersPresenter.kt | 70 + .../home/impl/filters/RoomListFiltersState.kt | 27 + .../filters/RoomListFiltersStateProvider.kt | 31 + .../home/impl/filters/RoomListFiltersView.kt | 220 ++ .../DefaultFilterSelectionStrategy.kt | 57 + .../filters/selection/FilterSelectionState.kt | 16 + .../selection/FilterSelectionStrategy.kt | 29 + .../features/home/impl/model/LatestEvent.kt | 34 + .../home/impl/model/RoomListRoomSummary.kt | 58 + .../impl/model/RoomListRoomSummaryProvider.kt | 193 ++ .../home/impl/model/RoomSummaryDisplayType.kt | 19 + .../roomlist/RoomListContentStateProvider.kt | 58 + .../home/impl/roomlist/RoomListContextMenu.kt | 229 ++ .../roomlist/RoomListDeclineInviteMenu.kt | 127 + .../home/impl/roomlist/RoomListEvents.kt | 34 + .../home/impl/roomlist/RoomListPresenter.kt | 344 ++ .../home/impl/roomlist/RoomListState.kt | 76 + .../RoomListStateContextMenuShownProvider.kt | 35 + .../impl/roomlist/RoomListStateProvider.kt | 128 + .../impl/search/RoomListSearchDataSource.kt | 64 + .../home/impl/search/RoomListSearchEvents.kt | 15 + .../impl/search/RoomListSearchPresenter.kt | 68 + .../home/impl/search/RoomListSearchState.kt | 19 + .../search/RoomListSearchStateProvider.kt | 39 + .../home/impl/search/RoomListSearchView.kt | 202 ++ .../home/impl/spaces/HomeSpacesEvents.kt | 11 + .../home/impl/spaces/HomeSpacesPresenter.kt | 54 + .../home/impl/spaces/HomeSpacesState.kt | 27 + .../impl/spaces/HomeSpacesStateProvider.kt | 56 + .../home/impl/spaces/HomeSpacesView.kt | 96 + .../home/impl/spaces/SpaceRoomProvider.kt | 42 + .../src/main/res/values-be/translations.xml | 43 + .../src/main/res/values-bg/translations.xml | 39 + .../src/main/res/values-cs/translations.xml | 55 + .../src/main/res/values-cy/translations.xml | 53 + .../src/main/res/values-da/translations.xml | 55 + .../src/main/res/values-de/translations.xml | 55 + .../src/main/res/values-el/translations.xml | 50 + .../main/res/values-en-rUS/translations.xml | 9 + .../src/main/res/values-es/translations.xml | 46 + .../src/main/res/values-et/translations.xml | 55 + .../src/main/res/values-eu/translations.xml | 46 + .../src/main/res/values-fa/translations.xml | 48 + .../src/main/res/values-fi/translations.xml | 55 + .../src/main/res/values-fr/translations.xml | 55 + .../src/main/res/values-hu/translations.xml | 55 + .../src/main/res/values-in/translations.xml | 51 + .../src/main/res/values-it/translations.xml | 55 + .../src/main/res/values-ka/translations.xml | 38 + .../src/main/res/values-ko/translations.xml | 53 + .../src/main/res/values-lt/translations.xml | 16 + .../src/main/res/values-nb/translations.xml | 55 + .../src/main/res/values-nl/translations.xml | 45 + .../src/main/res/values-pl/translations.xml | 55 + .../main/res/values-pt-rBR/translations.xml | 55 + .../src/main/res/values-pt/translations.xml | 53 + .../src/main/res/values-ro/translations.xml | 55 + .../src/main/res/values-ru/translations.xml | 55 + .../src/main/res/values-sk/translations.xml | 55 + .../src/main/res/values-sv/translations.xml | 53 + .../src/main/res/values-tr/translations.xml | 46 + .../src/main/res/values-uk/translations.xml | 53 + .../src/main/res/values-ur/translations.xml | 43 + .../src/main/res/values-uz/translations.xml | 53 + .../main/res/values-zh-rTW/translations.xml | 55 + .../src/main/res/values-zh/translations.xml | 55 + .../impl/src/main/res/values/localazy.xml | 55 + .../CurrentUserWithNeighborsBuilderTest.kt | 223 ++ .../home/impl/DefaultHomeEntryPointTest.kt | 64 + .../home/impl/FakeDateTimeObserver.kt | 20 + .../features/home/impl/HomePresenterTest.kt | 260 ++ .../impl/datasource/RoomListDataSourceTest.kt | 107 + .../RoomListRoomSummaryFactoryTest.kt | 22 + .../RoomListFiltersEmptyStateResourcesTest.kt | 76 + .../filters/RoomListFiltersPresenterTest.kt | 118 + .../impl/filters/RoomListFiltersViewTest.kt | 62 + .../impl/model/RoomListBaseRoomSummaryTest.kt | 112 + .../impl/roomlist/RoomListContextMenuTest.kt | 149 + .../roomlist/RoomListDeclineInviteMenuTest.kt | 102 + .../impl/roomlist/RoomListPresenterTest.kt | 679 ++++ .../home/impl/roomlist/RoomListState.kt | 11 + .../home/impl/roomlist/RoomListViewTest.kt | 297 ++ .../search/RoomListSearchPresenterTest.kt | 134 + .../impl/spaces/HomeSpacesPresenterTest.kt | 40 + features/invite/api/build.gradle.kts | 24 + .../android/features/invite/api/InviteData.kt | 48 + .../features/invite/api/SeenInvitesStore.kt | 38 + .../AcceptDeclineInviteEvents.kt | 16 + .../acceptdecline/AcceptDeclineInviteState.kt | 18 + .../AcceptDeclineInviteStateProvider.kt | 22 + .../acceptdecline/AcceptDeclineInviteView.kt | 23 + .../acceptdecline/ConfirmingDeclineInvite.kt | 14 + .../DeclineInviteAndBlockEntryPoint.kt | 22 + features/invite/impl/build.gradle.kts | 46 + .../features/invite/impl/AcceptInvite.kt | 58 + .../features/invite/impl/DeclineInvite.kt | 74 + .../invite/impl/DefaultSeenInvitesStore.kt | 79 + .../impl/DefaultSeenInvitesStoreFactory.kt | 44 + .../invite/impl/SeenInvitesStoreFactory.kt | 20 + .../AcceptDeclineInvitePresenter.kt | 101 + .../AcceptDeclineInviteStateProvider.kt | 54 + .../acceptdecline/AcceptDeclineInviteView.kt | 133 + .../DefaultAcceptDeclineInviteView.kt | 35 + .../InternalAcceptDeclineInviteEvents.kt | 16 + .../declineandblock/DeclineAndBlockEvents.kt | 17 + .../declineandblock/DeclineAndBlockNode.kt | 45 + .../DeclineAndBlockPresenter.kt | 94 + .../declineandblock/DeclineAndBlockState.kt | 21 + .../DeclineAndBlockStateProvider.kt | 46 + .../declineandblock/DeclineAndBlockView.kt | 153 + .../DefaultDeclineAndBlockEntryPoint.kt | 29 + .../features/invite/impl/di/InviteModule.kt | 41 + .../src/main/res/values-be/translations.xml | 10 + .../src/main/res/values-bg/translations.xml | 12 + .../src/main/res/values-cs/translations.xml | 18 + .../src/main/res/values-cy/translations.xml | 18 + .../src/main/res/values-da/translations.xml | 18 + .../src/main/res/values-de/translations.xml | 18 + .../src/main/res/values-el/translations.xml | 18 + .../src/main/res/values-es/translations.xml | 18 + .../src/main/res/values-et/translations.xml | 18 + .../src/main/res/values-eu/translations.xml | 13 + .../src/main/res/values-fa/translations.xml | 15 + .../src/main/res/values-fi/translations.xml | 18 + .../src/main/res/values-fr/translations.xml | 18 + .../src/main/res/values-hu/translations.xml | 18 + .../src/main/res/values-in/translations.xml | 18 + .../src/main/res/values-it/translations.xml | 18 + .../src/main/res/values-ka/translations.xml | 10 + .../src/main/res/values-ko/translations.xml | 18 + .../src/main/res/values-lt/translations.xml | 10 + .../src/main/res/values-nb/translations.xml | 18 + .../src/main/res/values-nl/translations.xml | 12 + .../src/main/res/values-pl/translations.xml | 18 + .../main/res/values-pt-rBR/translations.xml | 18 + .../src/main/res/values-pt/translations.xml | 18 + .../src/main/res/values-ro/translations.xml | 18 + .../src/main/res/values-ru/translations.xml | 18 + .../src/main/res/values-sk/translations.xml | 18 + .../src/main/res/values-sv/translations.xml | 18 + .../src/main/res/values-tr/translations.xml | 13 + .../src/main/res/values-uk/translations.xml | 18 + .../src/main/res/values-ur/translations.xml | 10 + .../src/main/res/values-uz/translations.xml | 18 + .../main/res/values-zh-rTW/translations.xml | 18 + .../src/main/res/values-zh/translations.xml | 18 + .../impl/src/main/res/values/localazy.xml | 18 + .../invite/impl/DefaultAcceptInviteTest.kt | 95 + .../invite/impl/DefaultDeclineInviteTest.kt | 179 + .../AcceptDeclineInvitePresenterTest.kt | 218 ++ .../DeclineAndBlockPresenterTest.kt | 164 + .../DeclineAndBlockViewTest.kt | 125 + .../DefaultDeclineAndBlockEntryPointTest.kt | 42 + .../invite/impl/fake/FakeAcceptInvite.kt | 22 + .../invite/impl/fake/FakeDeclineInvite.kt | 22 + features/invite/test/build.gradle.kts | 23 + .../invite/test/InMemorySeenInvitesStore.kt | 34 + .../features/invite/test/InviteData.kt | 24 + .../FakeDeclineInviteAndBlockEntryPoint.kt | 25 + features/invitepeople/api/build.gradle.kts | 19 + .../invitepeople/api/InvitePeopleEvents.kt | 14 + .../invitepeople/api/InvitePeoplePresenter.kt | 22 + .../invitepeople/api/InvitePeopleRenderer.kt | 20 + .../invitepeople/api/InvitePeopleState.kt | 18 + .../api/InvitePeopleStateProvider.kt | 41 + features/invitepeople/impl/build.gradle.kts | 46 + .../impl/DefaultInvitePeopleEvents.kt | 18 + .../impl/DefaultInvitePeoplePresenter.kt | 233 ++ .../impl/DefaultInvitePeopleRenderer.kt | 31 + .../impl/DefaultInvitePeopleState.kt | 29 + .../impl/DefaultInvitePeopleStateProvider.kt | 116 + .../invitepeople/impl/InvitableUser.kt | 19 + .../invitepeople/impl/InvitePeopleView.kt | 206 ++ .../src/main/res/values-be/translations.xml | 5 + .../src/main/res/values-bg/translations.xml | 5 + .../src/main/res/values-cs/translations.xml | 5 + .../src/main/res/values-cy/translations.xml | 5 + .../src/main/res/values-da/translations.xml | 5 + .../src/main/res/values-de/translations.xml | 5 + .../src/main/res/values-el/translations.xml | 5 + .../src/main/res/values-es/translations.xml | 5 + .../src/main/res/values-et/translations.xml | 5 + .../src/main/res/values-eu/translations.xml | 5 + .../src/main/res/values-fa/translations.xml | 5 + .../src/main/res/values-fi/translations.xml | 5 + .../src/main/res/values-fr/translations.xml | 5 + .../src/main/res/values-hu/translations.xml | 5 + .../src/main/res/values-in/translations.xml | 5 + .../src/main/res/values-it/translations.xml | 5 + .../src/main/res/values-ka/translations.xml | 5 + .../src/main/res/values-ko/translations.xml | 5 + .../src/main/res/values-lt/translations.xml | 5 + .../src/main/res/values-nb/translations.xml | 5 + .../src/main/res/values-nl/translations.xml | 5 + .../src/main/res/values-pl/translations.xml | 5 + .../main/res/values-pt-rBR/translations.xml | 5 + .../src/main/res/values-pt/translations.xml | 5 + .../src/main/res/values-ro/translations.xml | 5 + .../src/main/res/values-ru/translations.xml | 5 + .../src/main/res/values-sk/translations.xml | 5 + .../src/main/res/values-sv/translations.xml | 5 + .../src/main/res/values-tr/translations.xml | 5 + .../src/main/res/values-uk/translations.xml | 5 + .../src/main/res/values-ur/translations.xml | 5 + .../src/main/res/values-uz/translations.xml | 5 + .../main/res/values-zh-rTW/translations.xml | 5 + .../src/main/res/values-zh/translations.xml | 5 + .../impl/src/main/res/values/localazy.xml | 5 + .../impl/DefaultInvitePeoplePresenterTest.kt | 574 ++++ features/joinroom/api/build.gradle.kts | 22 + .../joinroom/api/JoinRoomEntryPoint.kt | 35 + features/joinroom/impl/build.gradle.kts | 48 + .../impl/DefaultJoinRoomEntryPoint.kt | 30 + .../features/joinroom/impl/JoinRoomEvents.kt | 24 + .../joinroom/impl/JoinRoomFlowNode.kt | 107 + .../joinroom/impl/JoinRoomPresenter.kt | 385 +++ .../features/joinroom/impl/JoinRoomState.kt | 121 + .../joinroom/impl/JoinRoomStateProvider.kt | 246 ++ .../features/joinroom/impl/JoinRoomView.kt | 658 ++++ .../joinroom/impl/di/CancelKnockRoom.kt | 28 + .../features/joinroom/impl/di/ForgetRoom.kt | 26 + .../joinroom/impl/di/JoinRoomModule.kt | 68 + .../features/joinroom/impl/di/KnockRoom.kt | 35 + .../src/main/res/values-be/translations.xml | 11 + .../src/main/res/values-bg/translations.xml | 5 + .../src/main/res/values-cs/translations.xml | 34 + .../src/main/res/values-cy/translations.xml | 34 + .../src/main/res/values-da/translations.xml | 34 + .../src/main/res/values-de/translations.xml | 34 + .../src/main/res/values-el/translations.xml | 32 + .../src/main/res/values-es/translations.xml | 32 + .../src/main/res/values-et/translations.xml | 34 + .../src/main/res/values-eu/translations.xml | 20 + .../src/main/res/values-fa/translations.xml | 27 + .../src/main/res/values-fi/translations.xml | 34 + .../src/main/res/values-fr/translations.xml | 34 + .../src/main/res/values-hu/translations.xml | 34 + .../src/main/res/values-in/translations.xml | 32 + .../src/main/res/values-it/translations.xml | 34 + .../src/main/res/values-ka/translations.xml | 4 + .../src/main/res/values-ko/translations.xml | 33 + .../src/main/res/values-nb/translations.xml | 34 + .../src/main/res/values-nl/translations.xml | 18 + .../src/main/res/values-pl/translations.xml | 34 + .../main/res/values-pt-rBR/translations.xml | 34 + .../src/main/res/values-pt/translations.xml | 34 + .../src/main/res/values-ro/translations.xml | 34 + .../src/main/res/values-ru/translations.xml | 34 + .../src/main/res/values-sk/translations.xml | 34 + .../src/main/res/values-sv/translations.xml | 33 + .../src/main/res/values-tr/translations.xml | 31 + .../src/main/res/values-uk/translations.xml | 33 + .../src/main/res/values-ur/translations.xml | 11 + .../src/main/res/values-uz/translations.xml | 33 + .../main/res/values-zh-rTW/translations.xml | 34 + .../src/main/res/values-zh/translations.xml | 34 + .../impl/src/main/res/values/localazy.xml | 34 + .../impl/DefaultJoinRoomEntryPointTest.kt | 60 + .../joinroom/impl/FakeCancelKnockRoom.kt | 21 + .../features/joinroom/impl/FakeForgetRoom.kt | 21 + .../features/joinroom/impl/FakeKnockRoom.kt | 21 + .../joinroom/impl/JoinRoomPresenterTest.kt | 1285 +++++++ .../joinroom/impl/JoinRoomViewTest.kt | 271 ++ features/knockrequests/api/build.gradle.kts | 20 + .../api/banner/KnockRequestsBannerRenderer.kt | 17 + .../api/list/KnockRequestsListEntryPoint.kt | 13 + features/knockrequests/impl/build.gradle.kts | 41 + .../DefaultKnockRequestsBannerRenderer.kt | 29 + .../impl/banner/KnockRequestsBannerEvents.kt | 14 + .../banner/KnockRequestsBannerPresenter.kt | 95 + .../impl/banner/KnockRequestsBannerState.kt | 45 + .../KnockRequestsBannerStateProvider.kt | 71 + .../impl/banner/KnockRequestsBannerView.kt | 235 ++ .../impl/data/KnockRequestFixture.kt | 28 + .../impl/data/KnockRequestPermissions.kt | 33 + .../impl/data/KnockRequestPresentable.kt | 36 + .../impl/data/KnockRequestWrapper.kt | 35 + .../impl/data/KnockRequestsException.kt | 14 + .../impl/data/KnockRequestsModule.kt | 33 + .../impl/data/KnockRequestsService.kt | 146 + .../DefaultKnockRequestsListEntryPoint.kt | 23 + .../impl/list/KnockRequestsListEvents.kt | 21 + .../impl/list/KnockRequestsListNode.kt | 37 + .../impl/list/KnockRequestsListPresenter.kt | 122 + .../impl/list/KnockRequestsListState.kt | 35 + .../list/KnockRequestsListStateProvider.kt | 150 + .../impl/list/KnockRequestsListView.kt | 496 +++ .../src/main/res/values-be/translations.xml | 4 + .../src/main/res/values-bg/translations.xml | 4 + .../src/main/res/values-cs/translations.xml | 37 + .../src/main/res/values-cy/translations.xml | 40 + .../src/main/res/values-da/translations.xml | 36 + .../src/main/res/values-de/translations.xml | 36 + .../src/main/res/values-el/translations.xml | 35 + .../src/main/res/values-es/translations.xml | 35 + .../src/main/res/values-et/translations.xml | 36 + .../src/main/res/values-eu/translations.xml | 19 + .../src/main/res/values-fa/translations.xml | 23 + .../src/main/res/values-fi/translations.xml | 36 + .../src/main/res/values-fr/translations.xml | 36 + .../src/main/res/values-hu/translations.xml | 36 + .../src/main/res/values-in/translations.xml | 35 + .../src/main/res/values-it/translations.xml | 36 + .../src/main/res/values-ka/translations.xml | 4 + .../src/main/res/values-ko/translations.xml | 35 + .../src/main/res/values-lt/translations.xml | 4 + .../src/main/res/values-nb/translations.xml | 36 + .../src/main/res/values-nl/translations.xml | 5 + .../src/main/res/values-pl/translations.xml | 37 + .../main/res/values-pt-rBR/translations.xml | 36 + .../src/main/res/values-pt/translations.xml | 36 + .../src/main/res/values-ro/translations.xml | 37 + .../src/main/res/values-ru/translations.xml | 37 + .../src/main/res/values-sk/translations.xml | 37 + .../src/main/res/values-sv/translations.xml | 36 + .../src/main/res/values-tr/translations.xml | 35 + .../src/main/res/values-uk/translations.xml | 37 + .../src/main/res/values-ur/translations.xml | 4 + .../src/main/res/values-uz/translations.xml | 36 + .../main/res/values-zh-rTW/translations.xml | 35 + .../src/main/res/values-zh/translations.xml | 35 + .../impl/src/main/res/values/localazy.xml | 36 + .../KnockRequestsBannerPresenterTest.kt | 244 ++ .../banner/KnockRequestsBannerViewTest.kt | 103 + .../DefaultKnockRequestsListEntryPointTest.kt | 37 + .../list/KnockRequestsListPresenterTest.kt | 305 ++ .../impl/list/KnockRequestsListViewTest.kt | 164 + features/knockrequests/test/build.gradle.kts | 22 + .../test/FakeKnockRequestsListEntryPoint.kt | 21 + features/leaveroom/api/build.gradle.kts | 19 + .../features/leaveroom/api/LeaveRoomEvent.kt | 15 + .../leaveroom/api/LeaveRoomRenderer.kt | 22 + .../features/leaveroom/api/LeaveRoomState.kt | 16 + .../src/main/res/values-be/translations.xml | 7 + .../src/main/res/values-bg/translations.xml | 6 + .../src/main/res/values-cs/translations.xml | 9 + .../src/main/res/values-cy/translations.xml | 10 + .../src/main/res/values-da/translations.xml | 10 + .../src/main/res/values-de/translations.xml | 10 + .../src/main/res/values-el/translations.xml | 7 + .../src/main/res/values-es/translations.xml | 7 + .../src/main/res/values-et/translations.xml | 10 + .../src/main/res/values-eu/translations.xml | 9 + .../src/main/res/values-fa/translations.xml | 8 + .../src/main/res/values-fi/translations.xml | 10 + .../src/main/res/values-fr/translations.xml | 10 + .../src/main/res/values-hu/translations.xml | 10 + .../src/main/res/values-in/translations.xml | 7 + .../src/main/res/values-it/translations.xml | 10 + .../src/main/res/values-ka/translations.xml | 7 + .../src/main/res/values-ko/translations.xml | 10 + .../src/main/res/values-lt/translations.xml | 6 + .../src/main/res/values-nb/translations.xml | 10 + .../src/main/res/values-nl/translations.xml | 7 + .../src/main/res/values-pl/translations.xml | 10 + .../main/res/values-pt-rBR/translations.xml | 10 + .../src/main/res/values-pt/translations.xml | 10 + .../src/main/res/values-ro/translations.xml | 10 + .../src/main/res/values-ru/translations.xml | 10 + .../src/main/res/values-sk/translations.xml | 10 + .../src/main/res/values-sv/translations.xml | 10 + .../src/main/res/values-tr/translations.xml | 7 + .../src/main/res/values-uk/translations.xml | 10 + .../src/main/res/values-ur/translations.xml | 7 + .../src/main/res/values-uz/translations.xml | 10 + .../main/res/values-zh-rTW/translations.xml | 10 + .../src/main/res/values-zh/translations.xml | 10 + .../api/src/main/res/values/localazy.xml | 10 + features/leaveroom/impl/build.gradle.kts | 35 + .../leaveroom/impl/InternalLeaveRoomEvent.kt | 15 + .../impl/InternalLeaveRoomRenderer.kt | 29 + .../leaveroom/impl/InternalLeaveRoomState.kt | 29 + .../impl/InternalLeaveRoomStateProvider.kt | 52 + .../leaveroom/impl/LeaveRoomPresenter.kt | 106 + .../features/leaveroom/impl/LeaveRoomView.kt | 150 + .../leaveroom/impl/di/LeaveRoomModule.kt | 24 + .../impl/LeaveBaseRoomPresenterTest.kt | 215 ++ features/licenses/api/build.gradle.kts | 20 + .../api/OpenSourceLicensesEntryPoint.kt | 13 + features/licenses/impl/build.gradle.kts | 35 + .../DefaultOpenSourcesLicensesEntryPoint.kt | 23 + .../licenses/impl/DependenciesFlowNode.kt | 72 + .../licenses/impl/LicensesProvider.kt | 44 + .../impl/details/DependenciesDetailsNode.kt | 47 + .../impl/details/DependenciesDetailsView.kt | 81 + .../impl/list/DependencyLicensesListEvent.kt | 13 + .../impl/list/DependencyLicensesListNode.kt | 48 + .../list/DependencyLicensesListPresenter.kt | 74 + .../impl/list/DependencyLicensesListState.kt | 19 + .../DependencyLicensesListStateProvider.kt | 74 + .../impl/list/DependencyLicensesListView.kt | 130 + .../impl/model/DependencyLicenseItem.kt | 45 + ...efaultOpenSourcesLicensesEntryPointTest.kt | 38 + .../DependencyLicensesListPresenterTest.kt | 98 + .../impl/list/FakeLicensesProvider.kt | 21 + features/licenses/test/build.gradle.kts | 20 + .../test/FakeOpenSourceLicensesEntryPoint.kt | 23 + features/location/api/build.gradle.kts | 76 + .../android/features/location/api/Location.kt | 38 + .../features/location/api/LocationService.kt | 13 + .../location/api/SendLocationEntryPoint.kt | 27 + .../location/api/ShowLocationEntryPoint.kt | 27 + .../features/location/api/StaticMapView.kt | 132 + .../internal/MapTilerStaticMapUrlBuilder.kt | 88 + .../MapTilerTileServerStyleUriBuilder.kt | 32 + .../api/internal/ModifierCenterBottomEdge.kt | 28 + .../api/internal/StaticMapPlaceholder.kt | 95 + .../api/internal/StaticMapUrlBuilder.kt | 28 + .../api/internal/TileServerStyleUriBuilder.kt | 39 + .../main/res/drawable-night/blurred_map.png | Bin 0 -> 34121 bytes .../api/src/main/res/drawable/blurred_map.png | Bin 0 -> 48957 bytes .../features/location/api/LocationKtTest.kt | 75 + .../MapTilerStaticMapUrlBuilderTest.kt | 199 ++ .../MapTilerTileServerStyleUriBuilderTest.kt | 35 + features/location/impl/build.gradle.kts | 48 + .../impl/src/main/AndroidManifest.xml | 12 + .../location/impl/DefaultLocationService.kt | 21 + .../location/impl/common/MapDefaults.kt | 66 + .../impl/common/PermissionDeniedDialog.kt | 29 + .../impl/common/PermissionRationaleDialog.kt | 29 + .../common/actions/AndroidLocationActions.kt | 58 + .../impl/common/actions/LocationActions.kt | 16 + .../DefaultPermissionsPresenter.kt | 53 + .../common/permissions/PermissionsEvents.kt | 13 + .../permissions/PermissionsPresenter.kt | 17 + .../common/permissions/PermissionsState.kt | 24 + .../common/ui/LocationFloatingActionButton.kt | 51 + .../send/DefaultSendLocationEntryPoint.kt | 31 + .../location/impl/send/SendLocationEvents.kt | 30 + .../location/impl/send/SendLocationNode.kt | 57 + .../impl/send/SendLocationPresenter.kt | 175 + .../location/impl/send/SendLocationState.kt | 28 + .../impl/send/SendLocationStateProvider.kt | 58 + .../location/impl/send/SendLocationView.kt | 212 ++ .../show/DefaultShowLocationEntryPoint.kt | 27 + .../location/impl/show/ShowLocationEvents.kt | 17 + .../location/impl/show/ShowLocationNode.kt | 53 + .../impl/show/ShowLocationPresenter.kt | 93 + .../location/impl/show/ShowLocationState.kt | 27 + .../impl/show/ShowLocationStateProvider.kt | 62 + .../location/impl/show/ShowLocationView.kt | 179 + .../src/main/res/drawable-night/pin_small.xml | 19 + .../impl/src/main/res/drawable/pin_small.xml | 19 + .../impl/DefaultLocationServiceTest.kt | 23 + .../location/impl/PermissionsStateFactory.kt | 22 + .../actions/AndroidLocationActionsTest.kt | 79 + .../common/actions/FakeLocationActions.kt | 31 + .../permissions/FakePermissionsPresenter.kt | 35 + .../send/DefaultSendLocationEntryPointTest.kt | 59 + .../impl/send/SendLocationPresenterTest.kt | 496 +++ .../show/DefaultShowLocationEntryPointTest.kt | 59 + .../impl/show/ShowLocationPresenterTest.kt | 288 ++ .../impl/show/ShowLocationViewTest.kt | 147 + features/location/test/build.gradle.kts | 22 + .../location/test/FakeLocationService.kt | 17 + .../test/FakeSendLocationEntryPoint.kt | 23 + .../test/FakeShowLocationEntryPoint.kt | 22 + features/lockscreen/api/build.gradle.kts | 19 + .../lockscreen/api/LockScreenEntryPoint.kt | 36 + .../lockscreen/api/LockScreenLockState.kt | 14 + .../lockscreen/api/LockScreenService.kt | 60 + features/lockscreen/impl/build.gradle.kts | 58 + .../impl/src/main/AndroidManifest.xml | 16 + .../impl/DefaultLockScreenEntryPoint.kt | 46 + .../impl/DefaultLockScreenService.kt | 121 + .../lockscreen/impl/LockScreenConfig.kt | 41 + .../lockscreen/impl/LockScreenFlowNode.kt | 81 + .../impl/biometric/BiometricAuthenticator.kt | 128 + .../BiometricAuthenticatorManager.kt | 38 + .../impl/biometric/BiometricUnlockError.kt | 30 + .../DefaultBiometricAuthenticatorManager.kt | 169 + .../DefaultBiometricUnlockCallback.kt | 15 + .../impl/components/PinEntryTextField.kt | 125 + .../impl/pin/DefaultPinCodeManager.kt | 88 + .../impl/pin/DefaultPinCodeManagerCallback.kt | 17 + .../lockscreen/impl/pin/PinCodeManager.kt | 78 + .../lockscreen/impl/pin/model/PinDigit.kt | 24 + .../lockscreen/impl/pin/model/PinEntry.kt | 79 + .../impl/settings/LockScreenSettingsEvents.kt | 16 + .../settings/LockScreenSettingsFlowNode.kt | 127 + .../impl/settings/LockScreenSettingsNode.kt | 45 + .../settings/LockScreenSettingsPresenter.kt | 89 + .../impl/settings/LockScreenSettingsState.kt | 17 + .../LockScreenSettingsStateProvider.kt | 33 + .../impl/settings/LockScreenSettingsView.kt | 96 + .../impl/setup/LockScreenSetupFlowNode.kt | 105 + .../setup/biometric/SetupBiometricEvents.kt | 14 + .../setup/biometric/SetupBiometricNode.kt | 49 + .../biometric/SetupBiometricPresenter.kt | 59 + .../setup/biometric/SetupBiometricState.kt | 14 + .../biometric/SetupBiometricStateProvider.kt | 25 + .../setup/biometric/SetupBiometricView.kt | 88 + .../impl/setup/pin/SetupPinEvents.kt | 14 + .../lockscreen/impl/setup/pin/SetupPinNode.kt | 37 + .../impl/setup/pin/SetupPinPresenter.kt | 113 + .../impl/setup/pin/SetupPinState.kt | 27 + .../impl/setup/pin/SetupPinStateProvider.kt | 51 + .../lockscreen/impl/setup/pin/SetupPinView.kt | 155 + .../impl/setup/pin/validation/PinValidator.kt | 31 + .../setup/pin/validation/SetupPinFailure.kt | 14 + .../impl/storage/EncryptedPinCodeStorage.kt | 37 + .../impl/storage/LockScreenStore.kt | 38 + .../storage/PreferencesLockScreenStore.kt | 92 + .../lockscreen/impl/unlock/PinUnlockEvents.kt | 21 + .../lockscreen/impl/unlock/PinUnlockHelper.kt | 48 + .../lockscreen/impl/unlock/PinUnlockNode.kt | 52 + .../impl/unlock/PinUnlockPresenter.kt | 181 + .../lockscreen/impl/unlock/PinUnlockState.kt | 42 + .../impl/unlock/PinUnlockStateProvider.kt | 56 + .../lockscreen/impl/unlock/PinUnlockView.kt | 377 ++ .../impl/unlock/activity/PinUnlockActivity.kt | 84 + .../impl/unlock/di/PinUnlockBindings.kt | 18 + .../impl/unlock/keypad/PinKeypad.kt | 227 ++ .../impl/unlock/keypad/PinKeypadModel.kt | 18 + .../src/main/res/values-be/translations.xml | 39 + .../src/main/res/values-bg/translations.xml | 35 + .../src/main/res/values-cs/translations.xml | 40 + .../src/main/res/values-cy/translations.xml | 46 + .../src/main/res/values-da/translations.xml | 38 + .../src/main/res/values-de/translations.xml | 38 + .../src/main/res/values-el/translations.xml | 38 + .../src/main/res/values-es/translations.xml | 38 + .../src/main/res/values-et/translations.xml | 38 + .../src/main/res/values-eu/translations.xml | 33 + .../src/main/res/values-fa/translations.xml | 38 + .../src/main/res/values-fi/translations.xml | 38 + .../src/main/res/values-fr/translations.xml | 38 + .../src/main/res/values-hu/translations.xml | 38 + .../src/main/res/values-in/translations.xml | 36 + .../src/main/res/values-it/translations.xml | 38 + .../src/main/res/values-ka/translations.xml | 37 + .../src/main/res/values-ko/translations.xml | 36 + .../src/main/res/values-lt/translations.xml | 4 + .../src/main/res/values-nb/translations.xml | 38 + .../src/main/res/values-nl/translations.xml | 37 + .../src/main/res/values-pl/translations.xml | 40 + .../main/res/values-pt-rBR/translations.xml | 38 + .../src/main/res/values-pt/translations.xml | 38 + .../src/main/res/values-ro/translations.xml | 40 + .../src/main/res/values-ru/translations.xml | 40 + .../src/main/res/values-sk/translations.xml | 40 + .../src/main/res/values-sv/translations.xml | 38 + .../src/main/res/values-tr/translations.xml | 38 + .../src/main/res/values-uk/translations.xml | 40 + .../src/main/res/values-ur/translations.xml | 37 + .../src/main/res/values-uz/translations.xml | 38 + .../main/res/values-zh-rTW/translations.xml | 36 + .../src/main/res/values-zh/translations.xml | 36 + .../impl/src/main/res/values/localazy.xml | 38 + .../DefaultLockScreenEntryPointIntentTest.kt | 26 + .../impl/DefaultLockScreenEntryPointTest.kt | 75 + .../impl/DefaultLockScreenServiceTest.kt | 96 + .../biometric/FakeBiometricAuthenticator.kt | 17 + .../FakeBiometricAuthenticatorManager.kt | 40 + .../impl/fixtures/LockScreenConfig.kt | 33 + .../impl/fixtures/PinCodeManager.kt | 25 + .../impl/pin/DefaultPinCodeManagerTest.kt | 59 + .../impl/pin/model/PinEntryAssertions.kt | 20 + .../lockscreen/impl/pin/model/PinEntryTest.kt | 72 + .../pin/storage/InMemoryLockScreenStore.kt | 62 + .../LockScreenSettingsPresenterTest.kt | 164 + .../biometric/SetupBiometricPresenterTest.kt | 92 + .../impl/setup/pin/SetupPinPresenterTest.kt | 129 + .../impl/unlock/PinUnlockPresenterTest.kt | 156 + .../impl/unlock/PinUnlockStateTest.kt | 77 + .../impl/unlock/keypad/PinKeypadTest.kt | 132 + features/lockscreen/test/build.gradle.kts | 22 + .../test/FakeLockScreenEntryPoint.kt | 27 + .../lockscreen/test/FakeLockScreenService.kt | 38 + features/login/api/build.gradle.kts | 19 + .../features/login/api/LoginEntryPoint.kt | 33 + .../features/login/api/LoginIntentResolver.kt | 13 + .../android/features/login/api/LoginParams.kt | 22 + .../AccountProviderAccessControl.kt | 13 + features/login/impl/build.gradle.kts | 63 + .../login/impl/src/main/AndroidManifest.xml | 18 + .../login/impl/DefaultLoginEntryPoint.kt | 37 + .../login/impl/DefaultLoginIntentResolver.kt | 30 + .../features/login/impl/LoginFlowNode.kt | 287 ++ .../DefaultAccountProviderAccessControl.kt | 62 + .../impl/accountprovider/AccountProvider.kt | 17 + .../AccountProviderDataSource.kt | 55 + .../AccountProviderOtherView.kt | 76 + .../AccountProviderProvider.kt | 35 + .../accountprovider/AccountProviderView.kt | 123 + .../AccountProviderAccessException.kt | 21 + .../impl/changeserver/ChangeServerEvents.kt | 16 + .../changeserver/ChangeServerPresenter.kt | 72 + .../impl/changeserver/ChangeServerState.kt | 16 + .../changeserver/ChangeServerStateProvider.kt | 50 + .../impl/changeserver/ChangeServerView.kt | 134 + .../features/login/impl/di/LoginModule.kt | 24 + .../login/impl/di/QrCodeLoginBindings.kt | 17 + .../login/impl/di/QrCodeLoginGraph.kt | 23 + .../login/impl/di/QrCodeLoginScope.kt | 11 + .../dialogs/SlidingSyncNotSupportedDialog.kt | 48 + .../login/impl/error/ChangeServerError.kt | 58 + .../impl/error/ChangeServerErrorProvider.kt | 31 + .../login/impl/error/ErrorFormatter.kt | 28 + .../features/login/impl/login/LoginHelper.kt | 119 + .../features/login/impl/login/LoginMode.kt | 17 + .../login/impl/login/LoginModeView.kt | 145 + .../impl/login/LoginModeViewErrorProvider.kt | 19 + .../impl/qrcode/DefaultQrCodeLoginManager.kt | 45 + .../login/impl/qrcode/QrCodeLoginFlowNode.kt | 238 ++ .../login/impl/qrcode/QrCodeLoginManager.kt | 33 + .../login/impl/resolver/HomeserverData.kt | 14 + .../login/impl/resolver/HomeserverResolver.kt | 76 + .../ChangeAccountProviderNode.kt | 51 + .../ChangeAccountProviderPresenter.kt | 57 + .../ChangeAccountProviderState.kt | 19 + .../ChangeAccountProviderStateProvider.kt | 37 + .../ChangeAccountProviderView.kt | 125 + .../ChooseAccountProviderEvents.kt | 17 + .../ChooseAccountProviderNode.kt | 54 + .../ChooseAccountProviderPresenter.kt | 83 + .../ChooseAccountProviderState.kt | 24 + .../ChooseAccountProviderStateProvider.kt | 79 + .../ChooseAccountProviderView.kt | 151 + .../ConfirmAccountProviderEvents.kt | 14 + .../ConfirmAccountProviderNode.kt | 68 + .../ConfirmAccountProviderPresenter.kt | 65 + .../ConfirmAccountProviderState.kt | 22 + .../ConfirmAccountProviderStateProvider.kt | 42 + .../ConfirmAccountProviderView.kt | 126 + .../AccountCreationNotSupported.kt | 11 + .../createaccount/CreateAccountEvents.kt | 14 + .../createaccount/CreateAccountNode.kt | 58 + .../createaccount/CreateAccountPresenter.kt | 94 + .../createaccount/CreateAccountState.kt | 20 + .../CreateAccountStateProvider.kt | 34 + .../createaccount/CreateAccountView.kt | 176 + .../screens/createaccount/MessageParser.kt | 44 + .../MobileRegistrationResponse.kt | 28 + .../WebViewMessageInterceptor.kt | 91 + .../loginpassword/LoginPasswordEvents.kt | 16 + .../loginpassword/LoginPasswordNode.kt | 37 + .../loginpassword/LoginPasswordPresenter.kt | 82 + .../loginpassword/LoginPasswordState.kt | 37 + .../LoginPasswordStateProvider.kt | 46 + .../loginpassword/LoginPasswordView.kt | 298 ++ .../screens/onboarding/OnBoardingEvents.kt | 18 + .../onboarding/OnBoardingLogoResIdProvider.kt | 32 + .../impl/screens/onboarding/OnBoardingNode.kt | 78 + .../screens/onboarding/OnBoardingPresenter.kt | 138 + .../screens/onboarding/OnBoardingState.kt | 31 + .../onboarding/OnBoardingStateProvider.kt | 60 + .../impl/screens/onboarding/OnBoardingView.kt | 325 ++ .../confirmation/QrCodeConfirmationNode.kt | 43 + .../confirmation/QrCodeConfirmationStep.kt | 23 + .../QrCodeConfirmationStepProvider.kt | 20 + .../confirmation/QrCodeConfirmationView.kt | 158 + .../screens/qrcode/error/QrCodeErrorNode.kt | 48 + .../screens/qrcode/error/QrCodeErrorView.kt | 151 + .../screens/qrcode/intro/QrCodeIntroEvents.kt | 13 + .../screens/qrcode/intro/QrCodeIntroNode.kt | 46 + .../qrcode/intro/QrCodeIntroPresenter.kt | 62 + .../screens/qrcode/intro/QrCodeIntroState.kt | 19 + .../qrcode/intro/QrCodeIntroStateProvider.kt | 40 + .../screens/qrcode/intro/QrCodeIntroView.kt | 107 + .../screens/qrcode/scan/QrCodeScanEvents.kt | 14 + .../screens/qrcode/scan/QrCodeScanNode.kt | 47 + .../qrcode/scan/QrCodeScanPresenter.kt | 113 + .../screens/qrcode/scan/QrCodeScanState.kt | 18 + .../qrcode/scan/QrCodeScanStateProvider.kt | 54 + .../screens/qrcode/scan/QrCodeScanView.kt | 227 ++ .../SearchAccountProviderEvents.kt | 17 + .../SearchAccountProviderNode.kt | 49 + .../SearchAccountProviderPresenter.kt | 77 + .../SearchAccountProviderState.kt | 20 + .../SearchAccountProviderStateProvider.kt | 48 + .../SearchAccountProviderView.kt | 208 ++ .../android/features/login/impl/util/Util.kt | 20 + .../WebClientUrlForAuthenticationRetriever.kt | 45 + .../impl/src/main/res/drawable/ic_matrix.xml | 12 + features/login/impl/src/main/res/raw/keep.xml | 13 + .../src/main/res/values-be/translations.xml | 88 + .../src/main/res/values-bg/translations.xml | 44 + .../src/main/res/values-cs/translations.xml | 98 + .../src/main/res/values-cy/translations.xml | 98 + .../src/main/res/values-da/translations.xml | 98 + .../src/main/res/values-de/translations.xml | 98 + .../src/main/res/values-el/translations.xml | 94 + .../main/res/values-en-rUS/translations.xml | 7 + .../src/main/res/values-es/translations.xml | 94 + .../src/main/res/values-et/translations.xml | 98 + .../src/main/res/values-eu/translations.xml | 80 + .../src/main/res/values-fa/translations.xml | 85 + .../src/main/res/values-fi/translations.xml | 98 + .../src/main/res/values-fr/translations.xml | 96 + .../src/main/res/values-hu/translations.xml | 98 + .../src/main/res/values-in/translations.xml | 95 + .../src/main/res/values-it/translations.xml | 98 + .../src/main/res/values-ka/translations.xml | 45 + .../src/main/res/values-ko/translations.xml | 98 + .../src/main/res/values-lt/translations.xml | 39 + .../src/main/res/values-nb/translations.xml | 98 + .../src/main/res/values-nl/translations.xml | 88 + .../src/main/res/values-pl/translations.xml | 98 + .../main/res/values-pt-rBR/translations.xml | 98 + .../src/main/res/values-pt/translations.xml | 98 + .../src/main/res/values-ro/translations.xml | 98 + .../src/main/res/values-ru/translations.xml | 98 + .../src/main/res/values-sk/translations.xml | 98 + .../src/main/res/values-sv/translations.xml | 98 + .../src/main/res/values-tr/translations.xml | 88 + .../src/main/res/values-uk/translations.xml | 98 + .../src/main/res/values-ur/translations.xml | 87 + .../src/main/res/values-uz/translations.xml | 97 + .../main/res/values-zh-rTW/translations.xml | 98 + .../src/main/res/values-zh/translations.xml | 98 + .../impl/src/main/res/values/localazy.xml | 98 + .../login/impl/DefaultLoginEntryPointTest.kt | 62 + .../impl/DefaultLoginIntentResolverTest.kt | 82 + ...DefaultAccountProviderAccessControlTest.kt | 224 ++ .../AccountProviderDataSourceTest.kt | 129 + .../changeserver/ChangeServerPresenterTest.kt | 199 ++ .../login/impl/di/FakeQrCodeLoginGraph.kt | 41 + .../login/impl/error/ErrorFormatterTest.kt | 50 + .../qrcode/DefaultQrCodeLoginManagerTest.kt | 67 + .../impl/qrcode/FakeQrCodeLoginManager.kt | 33 + .../impl/qrcode/QrCodeLoginFlowNodeTest.kt | 193 ++ .../ChangeAccountProviderPresenterTest.kt | 113 + .../ChooseAccountProviderPresenterTest.kt | 169 + .../ChooseAccountProviderStateTest.kt | 51 + .../ChooseAccountProviderViewTest.kt | 103 + .../ConfirmAccountProviderPresenterTest.kt | 394 +++ .../CreateAccountPresenterTest.kt | 131 + .../createaccount/DefaultMessageParserTest.kt | 87 + .../createaccount/FakeMessageParser.kt | 20 + .../LoginPasswordPresenterTest.kt | 149 + .../loginpassword/LoginPasswordViewTest.kt | 194 ++ .../DefaultOnBoardingLogoResIdProviderTest.kt | 26 + .../onboarding/OnBoardingPresenterTest.kt | 296 ++ .../screens/onboarding/OnboardingViewTest.kt | 280 ++ .../QrCodeConfirmationViewTest.kt | 62 + .../qrcode/error/QrCodeErrorViewTest.kt | 63 + .../qrcode/intro/QrCodeIntroPresenterTest.kt | 68 + .../qrcode/intro/QrCodeIntroViewTest.kt | 87 + .../qrcode/scan/QrCodeScanPresenterTest.kt | 167 + .../screens/qrcode/scan/QrCodeScanViewTest.kt | 68 + .../SearchAccountProviderPresenterTest.kt | 178 + ...eWebClientUrlForAuthenticationRetriever.kt | 19 + features/login/test/build.gradle.kts | 20 + .../login/test/FakeLoginIntentResolver.kt | 21 + features/logout/api/build.gradle.kts | 21 + .../features/logout/api/LogoutEntryPoint.kt | 26 + .../features/logout/api/LogoutUseCase.kt | 20 + .../logout/api/direct/DirectLogoutEvents.kt | 14 + .../logout/api/direct/DirectLogoutState.kt | 17 + .../api/direct/DirectLogoutStateProvider.kt | 33 + .../logout/api/direct/DirectLogoutView.kt | 16 + features/logout/impl/build.gradle.kts | 46 + .../logout/impl/DefaultLogoutEntryPoint.kt | 27 + .../logout/impl/DefaultLogoutUseCase.kt | 41 + .../features/logout/impl/LogoutEvents.kt | 14 + .../features/logout/impl/LogoutNode.kt | 42 + .../features/logout/impl/LogoutPresenter.kt | 121 + .../features/logout/impl/LogoutState.kt | 25 + .../logout/impl/LogoutStateProvider.kt | 63 + .../features/logout/impl/LogoutView.kt | 196 ++ .../features/logout/impl/di/LogoutModule.kt | 24 + .../impl/direct/DefaultDirectLogoutView.kt | 49 + .../impl/direct/DirectLogoutPresenter.kt | 82 + .../features/logout/impl/tools/Extensions.kt | 24 + .../logout/impl/ui/LogoutActionDialog.kt | 46 + .../impl/ui/LogoutConfirmationDialog.kt | 29 + .../src/main/res/values-be/translations.xml | 18 + .../src/main/res/values-bg/translations.xml | 8 + .../src/main/res/values-cs/translations.xml | 18 + .../src/main/res/values-cy/translations.xml | 18 + .../src/main/res/values-da/translations.xml | 18 + .../src/main/res/values-de/translations.xml | 18 + .../src/main/res/values-el/translations.xml | 18 + .../src/main/res/values-es/translations.xml | 18 + .../src/main/res/values-et/translations.xml | 18 + .../src/main/res/values-eu/translations.xml | 12 + .../src/main/res/values-fa/translations.xml | 18 + .../src/main/res/values-fi/translations.xml | 18 + .../src/main/res/values-fr/translations.xml | 18 + .../src/main/res/values-hu/translations.xml | 18 + .../src/main/res/values-in/translations.xml | 18 + .../src/main/res/values-it/translations.xml | 18 + .../src/main/res/values-ka/translations.xml | 18 + .../src/main/res/values-ko/translations.xml | 18 + .../src/main/res/values-lt/translations.xml | 8 + .../src/main/res/values-nb/translations.xml | 18 + .../src/main/res/values-nl/translations.xml | 18 + .../src/main/res/values-pl/translations.xml | 18 + .../main/res/values-pt-rBR/translations.xml | 18 + .../src/main/res/values-pt/translations.xml | 18 + .../src/main/res/values-ro/translations.xml | 18 + .../src/main/res/values-ru/translations.xml | 18 + .../src/main/res/values-sk/translations.xml | 18 + .../src/main/res/values-sv/translations.xml | 18 + .../src/main/res/values-tr/translations.xml | 18 + .../src/main/res/values-uk/translations.xml | 18 + .../src/main/res/values-ur/translations.xml | 18 + .../src/main/res/values-uz/translations.xml | 18 + .../main/res/values-zh-rTW/translations.xml | 18 + .../src/main/res/values-zh/translations.xml | 18 + .../impl/src/main/res/values/localazy.xml | 18 + .../impl/DefaultLogoutEntryPointTest.kt | 46 + .../logout/impl/DefaultLogoutUseCaseTest.kt | 121 + .../logout/impl/LogoutPresenterTest.kt | 246 ++ .../features/logout/impl/LogoutViewTest.kt | 126 + .../direct/DefaultDirectLogoutViewTest.kt | 106 + .../impl/direct/DirectLogoutPresenterTest.kt | 188 + features/logout/test/build.gradle.kts | 22 + .../logout/test/FakeLogoutEntryPoint.kt | 22 + .../features/logout/test/FakeLogoutUseCase.kt | 21 + features/messages/api/.gitignore | 1 + features/messages/api/build.gradle.kts | 25 + .../messages/api/MessageComposerContext.kt | 21 + .../messages/api/MessagesEntryPoint.kt | 55 + .../pinned/PinnedEventsTimelineProvider.kt | 13 + .../api/timeline/HtmlConverterProvider.kt | 19 + .../composer/VoiceMessageComposerEvent.kt | 28 + .../composer/VoiceMessageComposerPresenter.kt | 18 + .../composer/VoiceMessageComposerState.kt | 21 + .../VoiceMessageComposerStateProvider.kt | 43 + features/messages/impl/.gitignore | 1 + features/messages/impl/build.gradle.kts | 105 + features/messages/impl/consumer-rules.pro | 0 .../impl/src/main/AndroidManifest.xml | 10 + .../impl/DefaultMessagesEntryPoint.kt | 33 + .../features/messages/impl/MessagesEvents.kt | 28 + .../messages/impl/MessagesFlowNode.kt | 634 ++++ .../messages/impl/MessagesNavigator.kt | 28 + .../features/messages/impl/MessagesNode.kt | 314 ++ .../messages/impl/MessagesPresenter.kt | 586 ++++ .../features/messages/impl/MessagesState.kt | 61 + .../messages/impl/MessagesStateProvider.kt | 195 ++ .../features/messages/impl/MessagesView.kt | 552 +++ .../messages/impl/UserEventPermissions.kt | 31 + .../impl/actionlist/ActionListEvents.kt | 20 + .../impl/actionlist/ActionListPresenter.kt | 265 ++ .../impl/actionlist/ActionListState.kt | 34 + .../actionlist/ActionListStateProvider.kt | 229 ++ .../impl/actionlist/ActionListView.kt | 508 +++ .../actionlist/model/TimelineItemAction.kt | 39 + .../model/TimelineItemActionComparator.kt | 42 + .../model/TimelineItemActionPostProcessor.kt | 19 + .../messages/impl/attachments/Attachment.kt | 20 + .../preview/AttachmentsPreviewEvents.kt | 15 + .../preview/AttachmentsPreviewNode.kt | 79 + .../preview/AttachmentsPreviewPresenter.kt | 342 ++ .../preview/AttachmentsPreviewState.kt | 46 + .../AttachmentsPreviewStateProvider.kt | 127 + .../preview/AttachmentsPreviewView.kt | 444 +++ .../attachments/preview/OnDoneListener.kt | 13 + .../preview/error/ErrorFormatter.kt | 22 + ...faultMediaOptimizationSelectorPresenter.kt | 195 ++ .../video/MediaOptimizationSelectorEvent.kt | 18 + .../MediaOptimizationSelectorPresenter.kt | 20 + .../video/MediaOptimizationSelectorState.kt | 29 + .../video/VideoMetadataExtractor.kt | 76 + .../crypto/identity/IdentityChangeEvent.kt | 16 + .../crypto/identity/IdentityChangeState.kt | 17 + .../identity/IdentityChangeStatePresenter.kt | 68 + .../identity/IdentityChangeStateProvider.kt | 72 + .../identity/IdentityChangeStateView.kt | 131 + .../MessagesViewWithIdentityChangePreview.kt | 46 + .../sendfailure/VerifiedUserSendFailure.kt | 25 + .../VerifiedUserSendFailureFactory.kt | 48 + .../ResolveVerifiedUserSendFailureEvents.kt | 21 + ...ResolveVerifiedUserSendFailurePresenter.kt | 99 + .../ResolveVerifiedUserSendFailureState.kt | 19 + ...lveVerifiedUserSendFailureStateProvider.kt | 46 + .../ResolveVerifiedUserSendFailureView.kt | 159 + .../VerifiedUserSendFailureIterator.kt | 74 + .../VerifiedUserSendFailureResolver.kt | 73 + .../messages/impl/di/MessagesBindsModule.kt | 64 + .../impl/di/MessagesProvidesModule.kt | 25 + .../impl/draft/ComposerDraftService.kt | 18 + .../messages/impl/draft/ComposerDraftStore.kt | 18 + .../impl/draft/DefaultComposerDraftService.kt | 37 + .../impl/draft/MatrixComposerDraftStore.kt | 56 + .../impl/draft/VolatileComposerDraftStore.kt | 39 + .../messages/impl/link/ConfirmingLinkClick.kt | 16 + .../messages/impl/link/LinkChecker.kt | 39 + .../features/messages/impl/link/LinkEvents.kt | 17 + .../messages/impl/link/LinkPresenter.kt | 55 + .../features/messages/impl/link/LinkState.kt | 17 + .../messages/impl/link/LinkStateProvider.kt | 36 + .../features/messages/impl/link/LinkView.kt | 74 + .../messagecomposer/AttachmentsBottomSheet.kt | 167 + .../DefaultMessageComposerContext.kt | 25 + .../messagecomposer/DisabledComposerView.kt | 95 + .../messagecomposer/MessageComposerEvent.kt | 39 + .../MessageComposerPresenter.kt | 766 +++++ .../messagecomposer/MessageComposerState.kt | 30 + .../MessageComposerStateProvider.kt | 47 + .../messagecomposer/MessageComposerView.kt | 152 + .../RichTextEditorStateFactory.kt | 28 + .../RoomAliasSuggestionsDataSource.kt | 52 + .../suggestions/SuggestionsPickerView.kt | 182 + .../suggestions/SuggestionsProcessor.kt | 118 + .../DefaultPinnedEventsTimelineProvider.kt | 107 + .../banner/PinnedMessagesBannerEvents.kt | 13 + .../pinned/banner/PinnedMessagesBannerItem.kt | 17 + .../banner/PinnedMessagesBannerItemFactory.kt | 40 + .../banner/PinnedMessagesBannerPresenter.kt | 141 + .../banner/PinnedMessagesBannerState.kt | 46 + .../PinnedMessagesBannerStateProvider.kt | 59 + .../pinned/banner/PinnedMessagesBannerView.kt | 297 ++ .../pinned/list/PinnedMessagesListEvents.kt | 16 + .../list/PinnedMessagesListNavigator.kt | 18 + .../pinned/list/PinnedMessagesListNode.kt | 124 + .../list/PinnedMessagesListPresenter.kt | 272 ++ .../pinned/list/PinnedMessagesListState.kt | 52 + .../list/PinnedMessagesListStateProvider.kt | 107 + ...MessagesListTimelineActionPostProcessor.kt | 23 + .../pinned/list/PinnedMessagesListView.kt | 307 ++ .../impl/report/ReportMessageEvents.kt | 16 + .../messages/impl/report/ReportMessageNode.kt | 52 + .../impl/report/ReportMessagePresenter.kt | 89 + .../impl/report/ReportMessageState.kt | 18 + .../impl/report/ReportMessageStateProvider.kt | 36 + .../messages/impl/report/ReportMessageView.kt | 145 + .../impl/threads/ThreadedMessagesNode.kt | 287 ++ .../timeline/DefaultHtmlConverterProvider.kt | 78 + .../messages/impl/timeline/MarkAsFullyRead.kt | 34 + .../impl/timeline/TimelineController.kt | 148 + .../messages/impl/timeline/TimelineEvents.kt | 60 + .../impl/timeline/TimelineItemIndexer.kt | 68 + .../impl/timeline/TimelinePresenter.kt | 464 +++ .../messages/impl/timeline/TimelineState.kt | 84 + .../impl/timeline/TimelineStateProvider.kt | 266 ++ .../messages/impl/timeline/TimelineView.kt | 419 +++ .../TimelineViewMessageShieldPreview.kt | 56 + .../messages/impl/timeline/a11y/Reactions.kt | 62 + .../components/ATimelineItemEventRow.kt | 49 + .../impl/timeline/components/CallMenuItem.kt | 124 + .../timeline/components/ContentPadding.kt | 15 + .../timeline/components/MessageEventBubble.kt | 200 ++ .../timeline/components/MessageShieldView.kt | 133 + .../components/MessageStateEventContainer.kt | 67 + .../components/MessagesReactionButton.kt | 239 ++ .../components/ReplySwipeIndicator.kt | 59 + .../components/TimelineEventTimestampView.kt | 120 + .../components/TimelineItemCallNotifyView.kt | 130 + ...melineItemEventForTimestampViewProvider.kt | 43 + .../components/TimelineItemEventRow.kt | 898 +++++ ...imelineItemEventRowDisambiguatedPreview.kt | 27 + ...imelineItemEventRowForDirectRoomPreview.kt | 53 + ...melineItemEventRowLongSenderNamePreview.kt | 25 + .../TimelineItemEventRowShieldPreview.kt | 70 + .../TimelineItemEventRowTimestampPreview.kt | 50 + .../TimelineItemEventRowUtdPreview.kt | 70 + ...ineItemEventRowWithManyReactionsPreview.kt | 36 + .../TimelineItemEventRowWithRRPreview.kt | 68 + ...ItemEventRowWithReplyInformativePreview.kt | 24 + ...melineItemEventRowWithReplyOtherPreview.kt | 24 + .../TimelineItemEventRowWithReplyPreview.kt | 68 + .../TimelineItemEventTimestampBelowPreview.kt | 24 + .../TimelineItemGroupedEventsRow.kt | 266 ++ .../components/TimelineItemReactionsLayout.kt | 208 ++ .../components/TimelineItemReactionsView.kt | 184 + .../timeline/components/TimelineItemRow.kt | 258 ++ .../components/TimelineItemStateEventRow.kt | 114 + .../components/TimelineItemVirtualRow.kt | 74 + .../timeline/components/TimestampPosition.kt | 33 + .../CustomReactionBottomSheet.kt | 70 + .../customreaction/CustomReactionEvents.kt | 16 + .../customreaction/CustomReactionPresenter.kt | 78 + .../customreaction/CustomReactionState.kt | 30 + .../components/customreaction/EmojiItem.kt | 100 + .../customreaction/EmojibaseExtensions.kt | 48 + .../customreaction/picker/EmojiPicker.kt | 151 + .../picker/EmojiPickerEvents.kt | 14 + .../picker/EmojiPickerPresenter.kt | 113 + .../customreaction/picker/EmojiPickerState.kt | 36 + .../picker/EmojiPickerStateProvider.kt | 83 + .../event/TimelineItemAspectRatioBox.kt | 41 + .../event/TimelineItemAttachmentView.kt | 129 + .../components/event/TimelineItemAudioView.kt | 57 + .../event/TimelineItemEncryptedView.kt | 84 + .../event/TimelineItemEventContentView.kt | 139 + .../components/event/TimelineItemFileView.kt | 60 + .../components/event/TimelineItemImageView.kt | 202 ++ .../event/TimelineItemInformativeView.kt | 80 + .../event/TimelineItemLegacyCallInviteView.kt | 53 + .../event/TimelineItemLocationView.kt | 58 + .../components/event/TimelineItemPollView.kt | 64 + .../event/TimelineItemRedactedView.kt | 43 + .../components/event/TimelineItemStateView.kt | 41 + .../event/TimelineItemStickerView.kt | 111 + .../components/event/TimelineItemTextView.kt | 114 + .../event/TimelineItemUnknownView.kt | 43 + .../components/event/TimelineItemVideoView.kt | 234 ++ .../components/event/TimelineItemVoiceView.kt | 298 ++ .../components/group/GroupHeaderView.kt | 133 + .../layout/ContentAvoidingLayout.kt | 197 ++ .../reactionsummary/ReactionSummaryEvents.kt | 17 + .../ReactionSummaryPresenter.kt | 74 + .../reactionsummary/ReactionSummaryState.kt | 24 + .../ReactionSummaryStateProvider.kt | 29 + .../reactionsummary/ReactionSummaryView.kt | 296 ++ .../receipt/ReadReceiptViewState.kt | 19 + ...iewStateForTimelineItemEventRowProvider.kt | 39 + .../receipt/ReadReceiptViewStateProvider.kt | 69 + .../receipt/TimelineItemReadReceiptView.kt | 215 ++ .../bottomsheet/ReadReceiptBottomSheet.kt | 124 + .../ReadReceiptBottomSheetEvents.kt | 16 + .../ReadReceiptBottomSheetPresenter.kt | 43 + .../ReadReceiptBottomSheetState.kt | 16 + .../ReadReceiptBottomSheetStateProvider.kt | 36 + .../virtual/TimelineItemDaySeparatorView.kt | 61 + .../virtual/TimelineItemReadMarkerView.kt | 56 + .../virtual/TimelineItemRoomBeginningView.kt | 101 + .../virtual/TimelineLoadingMoreIndicator.kt | 65 + .../impl/timeline/debug/EventDebugInfoNode.kt | 52 + .../impl/timeline/debug/EventDebugInfoView.kt | 181 + .../di/FakeTimelineItemPresenterFactories.kt | 26 + .../messages/impl/timeline/di/LiveTimeline.kt | 16 + .../di/LocalTimelineItemPresenterFactories.kt | 18 + .../di/TimelineItemEventContentKey.kt | 21 + .../di/TimelineItemPresenterFactories.kt | 93 + .../di/TimelineItemPresenterFactory.kt | 25 + .../diff/TimelineItemsCacheInvalidator.kt | 54 + .../factories/TimelineItemsFactory.kt | 116 + .../factories/TimelineItemsFactoryConfig.kt | 19 + .../event/TimelineItemContentFactory.kt | 101 + ...eItemContentFailedToParseMessageFactory.kt | 21 + ...ineItemContentFailedToParseStateFactory.kt | 22 + .../TimelineItemContentMessageFactory.kt | 279 ++ .../event/TimelineItemContentPollFactory.kt | 40 + ...TimelineItemContentProfileChangeFactory.kt | 27 + .../TimelineItemContentRedactedFactory.kt | 21 + ...imelineItemContentRoomMembershipFactory.kt | 27 + .../event/TimelineItemContentStateFactory.kt | 27 + .../TimelineItemContentStickerFactory.kt | 54 + .../event/TimelineItemContentUTDFactory.kt | 21 + .../event/TimelineItemEventFactory.kt | 250 ++ .../TimelineItemDaySeparatorFactory.kt | 32 + .../virtual/TimelineItemVirtualFactory.kt | 48 + .../focus/FocusRequestStateProvider.kt | 39 + .../timeline/focus/FocusRequestStateView.kt | 64 + .../impl/timeline/groups/Groupability.kt | 94 + .../timeline/groups/TimelineItemGrouper.kt | 91 + .../impl/timeline/model/AggregatedReaction.kt | 49 + .../model/AggregatedReactionProvider.kt | 55 + .../model/AggregatedReactionSender.kt | 19 + .../impl/timeline/model/NewEventState.kt | 19 + .../impl/timeline/model/TimelineItem.kt | 136 + .../model/TimelineItemGroupPosition.kt | 59 + .../timeline/model/TimelineItemReactions.kt | 22 + .../model/TimelineItemReactionsProvider.kt | 16 + .../model/TimelineItemReadReceipts.kt | 21 + .../impl/timeline/model/bubble/BubbleState.kt | 21 + .../model/bubble/BubbleStateProvider.kt | 42 + .../model/event/TimelineItemAudioContent.kt | 33 + .../event/TimelineItemAudioContentProvider.kt | 41 + .../model/event/TimelineItemEmoteContent.kt | 22 + .../event/TimelineItemEncryptedContent.kt | 17 + .../TimelineItemEncryptedContentProvider.kt | 74 + .../model/event/TimelineItemEventContent.kt | 109 + .../event/TimelineItemEventContentProvider.kt | 111 + .../model/event/TimelineItemFileContent.kt | 29 + .../event/TimelineItemFileContentProvider.kt | 40 + .../model/event/TimelineItemImageContent.kt | 58 + .../event/TimelineItemImageContentProvider.kt | 48 + .../TimelineItemLegacyCallInviteContent.kt | 16 + .../event/TimelineItemLocationContent.kt | 19 + .../TimelineItemLocationContentProvider.kt | 30 + .../model/event/TimelineItemNoticeContent.kt | 22 + .../model/event/TimelineItemPollContent.kt | 27 + .../event/TimelineItemPollContentProvider.kt | 46 + .../event/TimelineItemProfileChangeContent.kt | 15 + .../event/TimelineItemRedactedContent.kt | 13 + .../TimelineItemRoomMembershipContent.kt | 15 + .../TimelineItemRtcNotificationContent.kt | 13 + .../model/event/TimelineItemStateContent.kt | 16 + .../event/TimelineItemStateEventContent.kt | 15 + .../model/event/TimelineItemStickerContent.kt | 34 + .../TimelineItemStickerContentProvider.kt | 44 + .../event/TimelineItemTextBasedContent.kt | 37 + .../model/event/TimelineItemTextContent.kt | 22 + .../model/event/TimelineItemUnknownContent.kt | 13 + .../model/event/TimelineItemVideoContent.kt | 36 + .../event/TimelineItemVideoContentProvider.kt | 48 + .../model/event/TimelineItemVoiceContent.kt | 31 + .../event/TimelineItemVoiceContentProvider.kt | 60 + .../virtual/TimelineItemDaySeparatorModel.kt | 15 + .../TimelineItemDaySeparatorModelProvider.kt | 22 + .../TimelineItemLastForwardIndicatorModel.kt | 13 + .../TimelineItemLoadingIndicatorModel.kt | 18 + .../virtual/TimelineItemReadMarkerModel.kt | 13 + .../virtual/TimelineItemRoomBeginningModel.kt | 13 + .../TimelineItemTypingNotificationModel.kt | 13 + .../model/virtual/TimelineItemVirtualModel.kt | 16 + .../protection/AspectRatioProvider.kt | 20 + .../impl/timeline/protection/ProtectedView.kt | 97 + .../impl/timeline/protection/RatioHelper.kt | 20 + .../impl/timeline/protection/TimelineItem.kt | 61 + .../protection/TimelineProtectionEvent.kt | 15 + .../protection/TimelineProtectionPresenter.kt | 63 + .../protection/TimelineProtectionState.kt | 29 + .../TimelineProtectionStateProvider.kt | 17 + .../messages/impl/timeline/util/Modifiers.kt | 15 + .../impl/topbars/MessagesViewTopBar.kt | 212 ++ .../messages/impl/topbars/ThreadTopBar.kt | 136 + .../typing/TypingNotificationPresenter.kt | 96 + .../impl/typing/TypingNotificationState.kt | 23 + .../typing/TypingNotificationStateProvider.kt | 80 + .../impl/typing/TypingNotificationView.kt | 150 + .../messages/impl/typing/TypingRoomMember.kt | 13 + .../features/messages/impl/utils/Emoji.kt | 44 + .../impl/utils/TextPillificationHelper.kt | 108 + .../DefaultMessageSummaryFormatter.kt | 61 + .../messagesummary/MessageSummaryFormatter.kt | 19 + .../DefaultVoiceMessageComposerPresenter.kt | 309 ++ .../composer/VoiceMessageComposerPlayer.kt | 243 ++ .../VoiceMessagePermissionRationaleDialog.kt | 29 + .../VoiceMessageSendingFailedDialog.kt | 26 + .../timeline/RedactedVoiceMessageManager.kt | 44 + .../timeline/VoiceMessagePresenter.kt | 58 + .../src/main/res/values-be/translations.xml | 57 + .../src/main/res/values-bg/translations.xml | 60 + .../src/main/res/values-cs/translations.xml | 84 + .../src/main/res/values-cy/translations.xml | 99 + .../src/main/res/values-da/translations.xml | 79 + .../src/main/res/values-de/translations.xml | 79 + .../src/main/res/values-el/translations.xml | 71 + .../main/res/values-en-rUS/translations.xml | 4 + .../src/main/res/values-es/translations.xml | 57 + .../src/main/res/values-et/translations.xml | 79 + .../src/main/res/values-eu/translations.xml | 53 + .../src/main/res/values-fa/translations.xml | 54 + .../src/main/res/values-fi/translations.xml | 79 + .../src/main/res/values-fr/translations.xml | 79 + .../src/main/res/values-hu/translations.xml | 79 + .../src/main/res/values-in/translations.xml | 66 + .../src/main/res/values-it/translations.xml | 79 + .../src/main/res/values-ka/translations.xml | 55 + .../src/main/res/values-ko/translations.xml | 72 + .../src/main/res/values-lt/translations.xml | 30 + .../src/main/res/values-nb/translations.xml | 79 + .../src/main/res/values-nl/translations.xml | 55 + .../src/main/res/values-pl/translations.xml | 84 + .../main/res/values-pt-rBR/translations.xml | 79 + .../src/main/res/values-pt/translations.xml | 79 + .../src/main/res/values-ro/translations.xml | 84 + .../src/main/res/values-ru/translations.xml | 84 + .../src/main/res/values-sk/translations.xml | 84 + .../src/main/res/values-sv/translations.xml | 77 + .../src/main/res/values-tr/translations.xml | 57 + .../src/main/res/values-uk/translations.xml | 82 + .../src/main/res/values-ur/translations.xml | 55 + .../src/main/res/values-uz/translations.xml | 77 + .../main/res/values-zh-rTW/translations.xml | 74 + .../src/main/res/values-zh/translations.xml | 74 + .../impl/src/main/res/values/localazy.xml | 79 + .../impl/DefaultMessagesEntryPointTest.kt | 117 + .../messages/impl/FakeMessagesNavigator.kt | 61 + .../messages/impl/MessagesPresenterTest.kt | 1381 ++++++++ .../messages/impl/MessagesViewTest.kt | 633 ++++ .../actionlist/ActionListPresenterTest.kt | 1556 +++++++++ .../model/TimelineItemActionComparatorTest.kt | 29 + .../AttachmentsPreviewPresenterTest.kt | 634 ++++ .../impl/attachments/SendActionStateTest.kt | 38 + ...tMediaOptimizationSelectorPresenterTest.kt | 248 ++ .../IdentityChangeStatePresenterTest.kt | 185 + .../identity/IdentityChangeStateViewTest.kt | 109 + ...lveVerifiedUserSendFailurePresenterTest.kt | 362 ++ .../ResolveVerifiedUserSendFailureViewTest.kt | 63 + .../impl/draft/FakeComposerDraftService.kt | 30 + .../draft/VolatileComposerDraftStoreTest.kt | 73 + .../impl/fixtures/MediaAttachmentFixtures.kt | 16 + .../impl/fixtures/MessageEventFixtures.kt | 71 + .../fixtures/TimelineItemsFactoryFixtures.kt | 107 + .../impl/link/DefaultLinkCheckerTest.kt | 52 + .../messages/impl/link/FakeLinkChecker.kt | 18 + .../messages/impl/link/LinkPresenterTest.kt | 97 + .../messages/impl/link/LinkViewTest.kt | 90 + ...faultRoomAliasSuggestionsDataSourceTest.kt | 52 + .../FakeRoomAliasSuggestionsDataSource.kt | 28 + .../MessageComposerPresenterTest.kt | 1611 +++++++++ .../TestRichTextEditorStateFactory.kt | 20 + .../suggestions/SuggestionsProcessorTest.kt | 341 ++ .../FakeMessageSummaryFormatter.kt | 22 + .../PinnedMessagesBannerPresenterTest.kt | 203 ++ .../banner/PinnedMessagesBannerViewTest.kt | 79 + .../list/FakePinnedMessagesListNavigator.kt | 29 + .../list/PinnedMessagesListPresenterTest.kt | 326 ++ ...agesListTimelineActionPostProcessorTest.kt | 42 + .../pinned/list/PinnedMessagesListViewTest.kt | 117 + .../impl/report/ReportMessagePresenterTest.kt | 152 + .../DefaultHtmlConverterProviderTest.kt | 56 + .../timeline/DefaultMarkAsFullyReadTest.kt | 55 + .../impl/timeline/FakeMarkAsFullyRead.kt | 22 + .../impl/timeline/TimelineControllerTest.kt | 230 ++ .../impl/timeline/TimelineItemIndexerTest.kt | 50 + .../impl/timeline/TimelinePresenterTest.kt | 1061 ++++++ .../impl/timeline/TimelineViewTest.kt | 208 ++ .../CustomReactionPresenterTest.kt | 76 + .../picker/EmojiPickerPresenterTest.kt | 126 + .../event/TimelineItemPollViewTest.kt | 93 + .../components/event/TimelineTextViewTest.kt | 168 + .../ReactionSummaryPresenterTest.kt | 75 + .../ReadReceiptBottomSheetPresenterTest.kt | 54 + .../TimelineItemContentMessageFactoryTest.kt | 832 +++++ .../groups/TimelineItemGrouperTest.kt | 170 + .../timeline/model/AggregatedReactionTest.kt | 36 + .../timeline/protection/ProtectedViewTest.kt | 70 + .../TimelineProtectionPresenterTest.kt | 97 + .../protection/TimelineProtectionStateTest.kt | 45 + .../typing/TypingNotificationPresenterTest.kt | 237 ++ .../DefaultTextPillificationHelperTest.kt | 235 ++ .../features/messages/impl/utils/EmojiTest.kt | 38 + .../impl/utils/FakeMentionSpanFormatter.kt | 20 + .../impl/utils/FakeTextPillificationHelper.kt | 17 + ...efaultVoiceMessageComposerPresenterTest.kt | 715 ++++ .../FakeRedactedVoiceMessageManager.kt | 21 + .../RedactedVoiceMessageManagerTest.kt | 104 + features/messages/test/build.gradle.kts | 29 + .../test/FakeMessageComposerContext.kt | 16 + .../messages/test/FakeMessagesEntryPoint.kt | 23 + ...diaOptimizationSelectorPresenterFactory.kt | 32 + .../video/FakeVideoMetadataExtractor.kt | 34 + .../timeline/FakeHtmlConverterProvider.kt | 28 + ...ultVoiceMessageComposerPresenterFactory.kt | 50 + features/migration/api/build.gradle.kts | 19 + .../features/api/MigrationEntryPoint.kt | 23 + .../android/features/api/MigrationState.kt | 15 + features/migration/impl/build.gradle.kts | 41 + .../impl/DefaultMigrationEntryPoint.kt | 33 + .../migration/impl/DefaultMigrationStore.kt | 38 + .../migration/impl/MigrationPresenter.kt | 74 + .../migration/impl/MigrationStateProvider.kt | 27 + .../features/migration/impl/MigrationStore.kt | 26 + .../features/migration/impl/MigrationView.kt | 57 + .../migration/impl/migrations/AppMigration.kt | 14 + .../impl/migrations/AppMigration01.kt | 29 + .../impl/migrations/AppMigration02.kt | 42 + .../impl/migrations/AppMigration03.kt | 28 + .../impl/migrations/AppMigration04.kt | 34 + .../impl/migrations/AppMigration05.kt | 35 + .../impl/migrations/AppMigration06.kt | 54 + .../impl/migrations/AppMigration07.kt | 31 + .../impl/migrations/AppMigration08.kt | 32 + .../migration/impl/InMemoryMigrationStore.kt | 26 + .../migration/impl/MigrationPresenterTest.kt | 122 + .../impl/migrations/AppMigration01Test.kt | 25 + .../impl/migrations/AppMigration02Test.kt | 43 + .../impl/migrations/AppMigration03Test.kt | 25 + .../impl/migrations/AppMigration04Test.kt | 37 + .../impl/migrations/AppMigration05Test.kt | 51 + .../impl/migrations/AppMigration06Test.kt | 52 + .../impl/migrations/AppMigration07Test.kt | 31 + .../impl/migrations/AppMigration08Test.kt | 43 + features/networkmonitor/api/build.gradle.kts | 21 + .../networkmonitor/api/NetworkMonitor.kt | 23 + .../networkmonitor/api/NetworkStatus.kt | 26 + .../api/ui/ConnectivityIndicator.kt | 69 + .../api/ui/ConnectivityIndicatorContainer.kt | 74 + features/networkmonitor/impl/build.gradle.kts | 26 + .../impl/src/main/AndroidManifest.xml | 10 + .../impl/DefaultNetworkMonitor.kt | 89 + features/networkmonitor/test/build.gradle.kts | 20 + .../networkmonitor/test/FakeNetworkMonitor.kt | 17 + features/poll/api/build.gradle.kts | 22 + .../poll/api/actions/EndPollAction.kt | 16 + .../api/actions/SendPollResponseAction.kt | 20 + .../poll/api/create/CreatePollEntryPoint.kt | 27 + .../poll/api/create/CreatePollMode.kt | 16 + .../poll/api/history/PollHistoryEntryPoint.kt | 13 + .../poll/api/pollcontent/PollAnswerItem.kt | 32 + .../poll/api/pollcontent/PollAnswerView.kt | 204 ++ .../poll/api/pollcontent/PollContentState.kt | 33 + .../pollcontent/PollContentStateFactory.kt | 25 + .../pollcontent/PollContentStateFixtures.kt | 100 + .../poll/api/pollcontent/PollContentView.kt | 302 ++ .../poll/api/pollcontent/PollTitleView.kt | 63 + .../src/main/res/values-cs/translations.xml | 10 + .../src/main/res/values-cy/translations.xml | 13 + .../src/main/res/values-da/translations.xml | 9 + .../src/main/res/values-de/translations.xml | 9 + .../src/main/res/values-el/translations.xml | 8 + .../src/main/res/values-et/translations.xml | 9 + .../src/main/res/values-eu/translations.xml | 5 + .../src/main/res/values-fa/translations.xml | 5 + .../src/main/res/values-fi/translations.xml | 9 + .../src/main/res/values-fr/translations.xml | 9 + .../src/main/res/values-hu/translations.xml | 9 + .../src/main/res/values-in/translations.xml | 7 + .../src/main/res/values-it/translations.xml | 9 + .../src/main/res/values-ko/translations.xml | 8 + .../src/main/res/values-nb/translations.xml | 9 + .../src/main/res/values-nl/translations.xml | 4 + .../src/main/res/values-pl/translations.xml | 10 + .../main/res/values-pt-rBR/translations.xml | 9 + .../src/main/res/values-pt/translations.xml | 9 + .../src/main/res/values-ro/translations.xml | 10 + .../src/main/res/values-ru/translations.xml | 10 + .../src/main/res/values-sk/translations.xml | 10 + .../src/main/res/values-sv/translations.xml | 9 + .../src/main/res/values-uk/translations.xml | 10 + .../src/main/res/values-uz/translations.xml | 9 + .../main/res/values-zh-rTW/translations.xml | 8 + .../src/main/res/values-zh/translations.xml | 8 + .../poll/api/src/main/res/values/localazy.xml | 9 + features/poll/impl/build.gradle.kts | 46 + .../features/poll/impl/PollConstants.kt | 16 + .../poll/impl/actions/DefaultEndPollAction.kt | 31 + .../actions/DefaultSendPollResponseAction.kt | 31 + .../poll/impl/create/CreatePollEvents.kt | 24 + .../poll/impl/create/CreatePollException.kt | 21 + .../poll/impl/create/CreatePollNode.kt | 68 + .../poll/impl/create/CreatePollPresenter.kt | 244 ++ .../poll/impl/create/CreatePollState.kt | 36 + .../impl/create/CreatePollStateProvider.kt | 177 + .../poll/impl/create/CreatePollView.kt | 244 ++ .../create/DefaultCreatePollEntryPoint.kt | 30 + .../poll/impl/create/PollFormState.kt | 122 + .../features/poll/impl/data/PollRepository.kt | 110 + .../history/DefaultPollHistoryEntryPoint.kt | 23 + .../poll/impl/history/PollHistoryEvents.kt | 19 + .../poll/impl/history/PollHistoryFlowNode.kt | 84 + .../poll/impl/history/PollHistoryNode.kt | 48 + .../poll/impl/history/PollHistoryPresenter.kt | 99 + .../poll/impl/history/PollHistoryState.kt | 29 + .../impl/history/PollHistoryStateProvider.kt | 69 + .../poll/impl/history/PollHistoryView.kt | 265 ++ .../impl/history/model/PollHistoryFilter.kt | 16 + .../impl/history/model/PollHistoryItem.kt | 16 + .../impl/history/model/PollHistoryItems.kt | 19 + .../history/model/PollHistoryItemsFactory.kt | 67 + .../model/DefaultPollContentStateFactory.kt | 72 + .../src/main/res/values-be/translations.xml | 19 + .../src/main/res/values-bg/translations.xml | 18 + .../src/main/res/values-cs/translations.xml | 20 + .../src/main/res/values-cy/translations.xml | 20 + .../src/main/res/values-da/translations.xml | 20 + .../src/main/res/values-de/translations.xml | 20 + .../src/main/res/values-el/translations.xml | 20 + .../src/main/res/values-es/translations.xml | 19 + .../src/main/res/values-et/translations.xml | 20 + .../src/main/res/values-eu/translations.xml | 19 + .../src/main/res/values-fa/translations.xml | 19 + .../src/main/res/values-fi/translations.xml | 20 + .../src/main/res/values-fr/translations.xml | 20 + .../src/main/res/values-hu/translations.xml | 20 + .../src/main/res/values-in/translations.xml | 20 + .../src/main/res/values-it/translations.xml | 20 + .../src/main/res/values-ka/translations.xml | 19 + .../src/main/res/values-ko/translations.xml | 20 + .../src/main/res/values-nb/translations.xml | 20 + .../src/main/res/values-nl/translations.xml | 19 + .../src/main/res/values-pl/translations.xml | 20 + .../main/res/values-pt-rBR/translations.xml | 20 + .../src/main/res/values-pt/translations.xml | 20 + .../src/main/res/values-ro/translations.xml | 20 + .../src/main/res/values-ru/translations.xml | 20 + .../src/main/res/values-sk/translations.xml | 20 + .../src/main/res/values-sv/translations.xml | 20 + .../src/main/res/values-tr/translations.xml | 19 + .../src/main/res/values-uk/translations.xml | 20 + .../src/main/res/values-ur/translations.xml | 19 + .../src/main/res/values-uz/translations.xml | 20 + .../main/res/values-zh-rTW/translations.xml | 20 + .../src/main/res/values-zh/translations.xml | 20 + .../impl/src/main/res/values/localazy.xml | 20 + .../features/poll/impl/PollFixtures.kt | 49 + .../impl/create/CreatePollPresenterTest.kt | 576 ++++ .../create/DefaultCreatePollEntryPointTest.kt | 65 + .../impl/create/PollFormStateSaverTest.kt | 41 + .../poll/impl/create/PollFormStateTest.kt | 137 + .../DefaultPollHistoryEntryPointTest.kt | 41 + .../impl/history/PollHistoryPresenterTest.kt | 174 + .../poll/impl/history/PollHistoryViewTest.kt | 187 + .../PollContentStateFactoryTest.kt | 291 ++ features/poll/test/build.gradle.kts | 22 + .../poll/test/actions/FakeEndPollAction.kt | 26 + .../actions/FakeSendPollResponseAction.kt | 26 + .../test/create/FakeCreatePollEntryPoint.kt | 23 + .../test/history/FakePollHistoryEntryPoint.kt | 21 + .../FakePollContentStateFactory.kt | 30 + features/preferences/api/build.gradle.kts | 20 + .../features/preferences/api/CacheService.kt | 20 + .../preferences/api/PreferencesEntryPoint.kt | 49 + features/preferences/impl/build.gradle.kts | 121 + .../preferences/impl/DefaultCacheService.kt | 28 + .../impl/DefaultPreferencesEntryPoint.kt | 37 + .../preferences/impl/PreferencesFlowNode.kt | 326 ++ .../preferences/impl/about/AboutNode.kt | 62 + .../preferences/impl/about/AboutPresenter.kt | 23 + .../preferences/impl/about/AboutState.kt | 15 + .../impl/about/AboutStateProvider.kt | 25 + .../preferences/impl/about/AboutView.kt | 61 + .../preferences/impl/about/ElementLegal.kt | 36 + .../impl/advanced/AdvancedSettingsEvents.kt | 23 + .../impl/advanced/AdvancedSettingsNode.kt | 37 + .../advanced/AdvancedSettingsPresenter.kt | 124 + .../impl/advanced/AdvancedSettingsState.kt | 56 + .../advanced/AdvancedSettingsStateProvider.kt | 56 + .../impl/advanced/AdvancedSettingsView.kt | 346 ++ .../advanced/MediaPreviewConfigStateStore.kt | 122 + .../impl/analytics/AnalyticsSettingsNode.kt | 37 + .../analytics/AnalyticsSettingsPresenter.kt | 28 + .../impl/analytics/AnalyticsSettingsState.kt | 15 + .../AnalyticsSettingsStateProvider.kt | 23 + .../impl/analytics/AnalyticsSettingsView.kt | 45 + .../impl/blockedusers/BlockedUsersEvents.kt | 17 + .../impl/blockedusers/BlockedUsersNode.kt | 37 + .../blockedusers/BlockedUsersPresenter.kt | 98 + .../impl/blockedusers/BlockedUsersState.kt | 19 + .../blockedusers/BlockedUsersStateProvider.kt | 40 + .../impl/blockedusers/BlockedUsersView.kt | 126 + .../impl/developer/DeveloperSettingsEvents.kt | 24 + .../impl/developer/DeveloperSettingsNode.kt | 56 + .../developer/DeveloperSettingsPresenter.kt | 226 ++ .../impl/developer/DeveloperSettingsState.kt | 37 + .../DeveloperSettingsStateProvider.kt | 65 + .../impl/developer/DeveloperSettingsView.kt | 250 ++ .../impl/developer/tracing/LogLevelItem.kt | 35 + .../impl/developer/tracing/LogLevelMapper.kt | 31 + .../preferences/impl/labs/LabsEvents.kt | 15 + .../preferences/impl/labs/LabsNode.kt | 43 + .../preferences/impl/labs/LabsPresenter.kt | 114 + .../preferences/impl/labs/LabsState.kt | 18 + .../impl/labs/LabsStateProvider.kt | 49 + .../preferences/impl/labs/LabsView.kt | 108 + .../preferences/impl/model/EnabledFeature.kt | 16 + .../NotificationSettingsEvents.kt | 23 + .../notifications/NotificationSettingsNode.kt | 47 + .../NotificationSettingsPresenter.kt | 274 ++ .../NotificationSettingsState.kt | 53 + .../NotificationSettingsStateProvider.kt | 111 + .../notifications/NotificationSettingsView.kt | 309 ++ .../SystemNotificationsEnabledProvider.kt | 28 + .../edit/DefaultNotificationSettingOption.kt | 73 + .../EditDefaultNotificationSettingNode.kt | 54 + ...EditDefaultNotificationSettingPresenter.kt | 163 + .../EditDefaultNotificationSettingState.kt | 22 + ...itDefaultNotificationSettingStateEvents.kt | 16 + ...DefaultNotificationSettingStateProvider.kt | 59 + .../EditDefaultNotificationSettingView.kt | 135 + .../edit/EditNotificationSettingRoomInfo.kt | 22 + .../impl/root/PreferencesRootEvents.kt | 16 + .../impl/root/PreferencesRootNode.kt | 104 + .../impl/root/PreferencesRootPresenter.kt | 166 + .../impl/root/PreferencesRootState.kt | 36 + .../impl/root/PreferencesRootStateProvider.kt | 42 + .../impl/root/PreferencesRootView.kt | 376 ++ .../preferences/impl/root/VersionFormatter.kt | 39 + .../impl/tasks/ClearCacheUseCase.kt | 63 + .../impl/tasks/ComputeCacheSizeUseCase.kt | 39 + .../preferences/impl/user/UserPreferences.kt | 35 + .../user/editprofile/EditUserProfileEvents.kt | 19 + .../editprofile/EditUserProfileNavigator.kt | 12 + .../user/editprofile/EditUserProfileNode.kt | 59 + .../editprofile/EditUserProfilePresenter.kt | 219 ++ .../user/editprofile/EditUserProfileState.kt | 26 + .../EditUserProfileStateProvider.kt | 46 + .../user/editprofile/EditUserProfileView.kt | 175 + .../utils/ShowDeveloperSettingsProvider.kt | 38 + .../src/main/res/values-be/translations.xml | 58 + .../src/main/res/values-bg/translations.xml | 59 + .../src/main/res/values-cs/translations.xml | 84 + .../src/main/res/values-cy/translations.xml | 76 + .../src/main/res/values-da/translations.xml | 82 + .../src/main/res/values-de/translations.xml | 82 + .../src/main/res/values-el/translations.xml | 69 + .../main/res/values-en-rUS/translations.xml | 6 + .../src/main/res/values-es/translations.xml | 69 + .../src/main/res/values-et/translations.xml | 82 + .../src/main/res/values-eu/translations.xml | 58 + .../src/main/res/values-fa/translations.xml | 70 + .../src/main/res/values-fi/translations.xml | 82 + .../src/main/res/values-fr/translations.xml | 82 + .../src/main/res/values-hu/translations.xml | 82 + .../src/main/res/values-in/translations.xml | 71 + .../src/main/res/values-it/translations.xml | 82 + .../src/main/res/values-ka/translations.xml | 55 + .../src/main/res/values-ko/translations.xml | 77 + .../src/main/res/values-lt/translations.xml | 7 + .../src/main/res/values-nb/translations.xml | 82 + .../src/main/res/values-nl/translations.xml | 58 + .../src/main/res/values-pl/translations.xml | 82 + .../main/res/values-pt-rBR/translations.xml | 82 + .../src/main/res/values-pt/translations.xml | 76 + .../src/main/res/values-ro/translations.xml | 84 + .../src/main/res/values-ru/translations.xml | 82 + .../src/main/res/values-sk/translations.xml | 84 + .../src/main/res/values-sv/translations.xml | 76 + .../src/main/res/values-tr/translations.xml | 63 + .../src/main/res/values-uk/translations.xml | 76 + .../src/main/res/values-ur/translations.xml | 58 + .../src/main/res/values-uz/translations.xml | 76 + .../main/res/values-zh-rTW/translations.xml | 82 + .../src/main/res/values-zh/translations.xml | 82 + .../impl/src/main/res/values/localazy.xml | 82 + .../impl/DefaultPreferencesEntryPointTest.kt | 81 + .../impl/about/AboutPresenterTest.kt | 34 + .../preferences/impl/about/AboutViewTest.kt | 80 + .../advanced/AdvancedSettingsPresenterTest.kt | 311 ++ .../impl/advanced/AdvancedSettingsViewTest.kt | 238 ++ .../FakeMediaPreviewConfigStateStore.kt | 52 + .../MediaPreviewConfigStateStoreTest.kt | 207 ++ .../AnalyticsSettingsPresenterTest.kt | 37 + .../impl/blockedusers/BlockedUserViewTest.kt | 101 + .../blockedusers/BlockedUsersPresenterTest.kt | 190 ++ .../DeveloperSettingsPresenterTest.kt | 245 ++ .../developer/DeveloperSettingsViewTest.kt | 144 + .../impl/labs/LabsPresenterTest.kt | 120 + ...efaultNotificationSettingsPresenterTest.kt | 191 ++ .../FakeSystemNotificationsEnabledProvider.kt | 15 + .../NotificationSettingsPresenterTest.kt | 372 ++ .../NotificationSettingsViewTest.kt | 298 ++ .../impl/root/FakeVersionFormatter.kt | 15 + .../impl/root/PreferencesRootPresenterTest.kt | 287 ++ .../impl/root/VersionFormatterTest.kt | 48 + .../tasks/DefaultClearCacheUseCaseTest.kt | 73 + .../impl/tasks/FakeClearCacheUseCase.kt | 20 + .../impl/tasks/FakeComputeCacheSizeUseCase.kt | 17 + .../EditUserProfilePresenterTest.kt | 524 +++ .../editprofile/EditUserProfileViewTest.kt | 136 + .../FakeEditUserProfileNavigator.kt | 16 + features/rageshake/api/build.gradle.kts | 22 + .../api/RageshakeFeatureAvailability.kt | 15 + .../api/bugreport/BugReportEntryPoint.kt | 26 + .../api/crash/CrashDetectionEvents.kt | 14 + .../api/crash/CrashDetectionPresenter.kt | 13 + .../api/crash/CrashDetectionState.kt | 15 + .../api/crash/CrashDetectionStateProvider.kt | 15 + .../rageshake/api/crash/CrashDetectionView.kt | 62 + .../api/detection/RageshakeDetectionEvents.kt | 19 + .../detection/RageshakeDetectionPresenter.kt | 13 + .../api/detection/RageshakeDetectionState.kt | 19 + .../RageshakeDetectionStateProvider.kt | 19 + .../api/detection/RageshakeDetectionView.kt | 96 + .../rageshake/api/logs/LogFilesRemover.kt | 19 + .../logs/WriteToFilesConfigurationFactory.kt | 21 + .../preferences/RageshakePreferencesEvents.kt | 14 + .../RageshakePreferencesPresenter.kt | 13 + .../preferences/RageshakePreferencesState.kt | 17 + .../RageshakePreferencesStateProvider.kt | 33 + .../preferences/RageshakePreferencesView.kt | 73 + .../rageshake/api/reporter/BugReporter.kt | 49 + .../api/reporter/BugReporterListener.kt | 38 + .../rageshake/api/screenshot/Screenshot.kt | 65 + .../src/main/res/values-be/translations.xml | 7 + .../src/main/res/values-bg/translations.xml | 4 + .../src/main/res/values-cs/translations.xml | 7 + .../src/main/res/values-cy/translations.xml | 7 + .../src/main/res/values-da/translations.xml | 7 + .../src/main/res/values-de/translations.xml | 7 + .../src/main/res/values-el/translations.xml | 7 + .../src/main/res/values-es/translations.xml | 7 + .../src/main/res/values-et/translations.xml | 7 + .../src/main/res/values-eu/translations.xml | 5 + .../src/main/res/values-fa/translations.xml | 7 + .../src/main/res/values-fi/translations.xml | 7 + .../src/main/res/values-fr/translations.xml | 7 + .../src/main/res/values-hu/translations.xml | 7 + .../src/main/res/values-in/translations.xml | 7 + .../src/main/res/values-it/translations.xml | 7 + .../src/main/res/values-ka/translations.xml | 7 + .../src/main/res/values-ko/translations.xml | 7 + .../src/main/res/values-lt/translations.xml | 7 + .../src/main/res/values-nb/translations.xml | 7 + .../src/main/res/values-nl/translations.xml | 7 + .../src/main/res/values-pl/translations.xml | 7 + .../main/res/values-pt-rBR/translations.xml | 7 + .../src/main/res/values-pt/translations.xml | 7 + .../src/main/res/values-ro/translations.xml | 7 + .../src/main/res/values-ru/translations.xml | 7 + .../src/main/res/values-sk/translations.xml | 7 + .../src/main/res/values-sv/translations.xml | 7 + .../src/main/res/values-tr/translations.xml | 7 + .../src/main/res/values-uk/translations.xml | 7 + .../src/main/res/values-ur/translations.xml | 7 + .../src/main/res/values-uz/translations.xml | 7 + .../main/res/values-zh-rTW/translations.xml | 7 + .../src/main/res/values-zh/translations.xml | 7 + .../api/src/main/res/values/localazy.xml | 7 + features/rageshake/impl/build.gradle.kts | 60 + .../DefaultRageshakeFeatureAvailability.kt | 26 + .../impl/bugreport/BugReportEvents.kt | 21 + .../impl/bugreport/BugReportFlowNode.kt | 95 + .../impl/bugreport/BugReportFormError.kt | 13 + .../rageshake/impl/bugreport/BugReportNode.kt | 60 + .../impl/bugreport/BugReportPresenter.kt | 153 + .../impl/bugreport/BugReportState.kt | 45 + .../impl/bugreport/BugReportStateProvider.kt | 39 + .../rageshake/impl/bugreport/BugReportView.kt | 206 ++ .../bugreport/DefaultBugReportEntryPoint.kt | 27 + .../rageshake/impl/crash/CrashDataStore.kt | 21 + .../crash/DefaultCrashDetectionPresenter.kt | 72 + .../impl/crash/PreferencesCrashDataStore.kt | 62 + .../crash/VectorUncaughtExceptionHandler.kt | 71 + .../DefaultRageshakeDetectionPresenter.kt | 116 + .../rageshake/impl/di/RageshakeBindings.kt | 18 + .../rageshake/impl/di/RageshakeModule.kt | 34 + .../impl/logs/DefaultLogFilesRemover.kt | 24 + .../DefaultRageshakePreferencesPresenter.kt | 74 + .../impl/rageshake/DefaultRageShake.kt | 68 + .../PreferencesRageshakeDataStore.kt | 57 + .../rageshake/impl/rageshake/RageShake.kt | 28 + .../impl/rageshake/RageshakeDataStore.kt | 23 + .../impl/reporter/BugReportAppNameProvider.kt | 22 + .../impl/reporter/BugReporterMultipartBody.kt | 420 +++ .../BugReporterMultipartBodyListener.kt | 19 + .../impl/reporter/BugReporterUrlProvider.kt | 16 + .../impl/reporter/DefaultBugReporter.kt | 444 +++ .../reporter/DefaultBugReporterUrlProvider.kt | 48 + .../screenshot/DefaultScreenshotHolder.kt | 43 + .../impl/screenshot/ScreenshotHolder.kt | 17 + .../src/main/res/values-be/translations.xml | 17 + .../src/main/res/values-bg/translations.xml | 17 + .../src/main/res/values-cs/translations.xml | 20 + .../src/main/res/values-cy/translations.xml | 20 + .../src/main/res/values-da/translations.xml | 20 + .../src/main/res/values-de/translations.xml | 20 + .../src/main/res/values-el/translations.xml | 17 + .../src/main/res/values-es/translations.xml | 17 + .../src/main/res/values-et/translations.xml | 20 + .../src/main/res/values-eu/translations.xml | 16 + .../src/main/res/values-fa/translations.xml | 16 + .../src/main/res/values-fi/translations.xml | 20 + .../src/main/res/values-fr/translations.xml | 20 + .../src/main/res/values-hu/translations.xml | 20 + .../src/main/res/values-in/translations.xml | 18 + .../src/main/res/values-it/translations.xml | 20 + .../src/main/res/values-ka/translations.xml | 17 + .../src/main/res/values-ko/translations.xml | 18 + .../src/main/res/values-lt/translations.xml | 14 + .../src/main/res/values-nb/translations.xml | 20 + .../src/main/res/values-nl/translations.xml | 17 + .../src/main/res/values-pl/translations.xml | 20 + .../main/res/values-pt-rBR/translations.xml | 20 + .../src/main/res/values-pt/translations.xml | 20 + .../src/main/res/values-ro/translations.xml | 20 + .../src/main/res/values-ru/translations.xml | 20 + .../src/main/res/values-sk/translations.xml | 20 + .../src/main/res/values-sv/translations.xml | 18 + .../src/main/res/values-tr/translations.xml | 17 + .../src/main/res/values-uk/translations.xml | 18 + .../src/main/res/values-ur/translations.xml | 17 + .../src/main/res/values-uz/translations.xml | 18 + .../main/res/values-zh-rTW/translations.xml | 20 + .../src/main/res/values-zh/translations.xml | 20 + .../impl/src/main/res/values/localazy.xml | 20 + ...DefaultRageshakeFeatureAvailabilityTest.kt | 34 + .../impl/bugreport/BugReportPresenterTest.kt | 254 ++ .../DefaultBugReportEntryPointTest.kt | 51 + .../impl/bugreport/FakeBugReporter.kt | 65 + .../impl/crash/FakeCrashDataStore.kt | 40 + .../VectorUncaughtExceptionHandlerTest.kt | 43 + .../crash/ui/CrashDetectionPresenterTest.kt | 142 + .../RageshakeDetectionPresenterTest.kt | 201 ++ .../RageshakePreferencesPresenterTest.kt | 100 + .../rageshake/impl/rageshake/FakeRageShake.kt | 32 + .../impl/rageshake/FakeRageshakeDataStore.kt | 35 + .../impl/reporter/DefaultBugReporterTest.kt | 541 +++ .../DefaultBugReporterUrlProviderTest.kt | 60 + .../impl/reporter/NoopBugReporterListener.kt | 18 + .../impl/screenshot/FakeScreenshotHolder.kt | 21 + features/rageshake/test/build.gradle.kts | 20 + .../test/logs/FakeLogFilesRemover.kt | 22 + features/reportroom/api/build.gradle.kts | 20 + .../reportroom/api/ReportRoomEntryPoint.kt | 22 + features/reportroom/impl/build.gradle.kts | 39 + .../impl/DefaultReportRoomEntryPoint.kt | 28 + .../features/reportroom/impl/ReportRoom.kt | 60 + .../reportroom/impl/ReportRoomEvents.kt | 16 + .../reportroom/impl/ReportRoomNode.kt | 45 + .../reportroom/impl/ReportRoomPresenter.kt | 85 + .../reportroom/impl/ReportRoomState.kt | 20 + .../impl/ReportRoomStateProvider.kt | 39 + .../reportroom/impl/ReportRoomView.kt | 148 + .../src/main/res/values-bg/translations.xml | 4 + .../src/main/res/values-cs/translations.xml | 8 + .../src/main/res/values-cy/translations.xml | 8 + .../src/main/res/values-da/translations.xml | 8 + .../src/main/res/values-de/translations.xml | 8 + .../src/main/res/values-el/translations.xml | 8 + .../src/main/res/values-es/translations.xml | 8 + .../src/main/res/values-et/translations.xml | 8 + .../src/main/res/values-eu/translations.xml | 4 + .../src/main/res/values-fa/translations.xml | 6 + .../src/main/res/values-fi/translations.xml | 8 + .../src/main/res/values-fr/translations.xml | 8 + .../src/main/res/values-hu/translations.xml | 8 + .../src/main/res/values-in/translations.xml | 8 + .../src/main/res/values-it/translations.xml | 8 + .../src/main/res/values-ko/translations.xml | 8 + .../src/main/res/values-nb/translations.xml | 8 + .../src/main/res/values-nl/translations.xml | 4 + .../src/main/res/values-pl/translations.xml | 8 + .../main/res/values-pt-rBR/translations.xml | 8 + .../src/main/res/values-pt/translations.xml | 8 + .../src/main/res/values-ro/translations.xml | 8 + .../src/main/res/values-ru/translations.xml | 8 + .../src/main/res/values-sk/translations.xml | 8 + .../src/main/res/values-sv/translations.xml | 8 + .../src/main/res/values-uk/translations.xml | 8 + .../src/main/res/values-uz/translations.xml | 8 + .../main/res/values-zh-rTW/translations.xml | 8 + .../src/main/res/values-zh/translations.xml | 8 + .../impl/src/main/res/values/localazy.xml | 8 + .../impl/DefaultReportRoomEntryPointTest.kt | 44 + .../reportroom/impl/DefaultReportRoomTest.kt | 151 + .../impl/ReportRoomPresenterTest.kt | 152 + .../reportroom/impl/ReportRoomViewTest.kt | 102 + .../reportroom/impl/fakes/FakeReportRoom.kt | 27 + features/reportroom/test/build.gradle.kts | 22 + .../test/FakeReportRoomEntryPoint.kt | 25 + .../rolesandpermissions/api/build.gradle.kts | 23 + .../api/ChangeRoomMemberRolesEntryPoint.kt | 35 + .../api/RolesAndPermissionsEntryPoint.kt | 13 + .../rolesandpermissions/impl/build.gradle.kts | 45 + .../DefaultRolesAndPermissionsEntryPoint.kt | 23 + .../impl/RolesAndPermissionsFlowNode.kt | 137 + .../impl/RoomMemberListDataSource.kt | 39 + .../impl/analytics/AnalyticUtils.kt | 52 + .../permissions/ChangeRoomPermissionsEvent.kt | 16 + .../permissions/ChangeRoomPermissionsNode.kt | 44 + .../ChangeRoomPermissionsPresenter.kt | 156 + .../permissions/ChangeRoomPermissionsState.kt | 85 + .../ChangeRoomPermissionsStateProvider.kt | 64 + .../permissions/ChangeRoomPermissionsView.kt | 144 + .../impl/roles/ChangeRolesEvent.kt | 20 + .../impl/roles/ChangeRolesNode.kt | 64 + .../impl/roles/ChangeRolesPresenter.kt | 237 ++ .../impl/roles/ChangeRolesState.kt | 53 + .../impl/roles/ChangeRolesStateProvider.kt | 146 + .../impl/roles/ChangeRolesView.kt | 424 +++ .../roles/ChangeRoomMemberRolesRootNode.kt | 77 + .../impl/roles/ConfirmingModifyingAdmins.kt | 12 + .../impl/roles/ConfirmingModifyingOwners.kt | 12 + .../DefaultChangeRoomMemberRolesEntyPoint.kt | 35 + .../impl/root/RolesAndPermissionsEvents.kt | 18 + .../impl/root/RolesAndPermissionsNode.kt | 89 + .../impl/root/RolesAndPermissionsPresenter.kt | 129 + .../impl/root/RolesAndPermissionsState.kt | 21 + .../root/RolesAndPermissionsStateProvider.kt | 69 + .../impl/root/RolesAndPermissionsView.kt | 198 ++ .../src/main/res/values-be/translations.xml | 59 + .../src/main/res/values-bg/translations.xml | 38 + .../src/main/res/values-cs/translations.xml | 84 + .../src/main/res/values-cy/translations.xml | 72 + .../src/main/res/values-da/translations.xml | 66 + .../src/main/res/values-de/translations.xml | 66 + .../src/main/res/values-el/translations.xml | 59 + .../src/main/res/values-es/translations.xml | 59 + .../src/main/res/values-et/translations.xml | 73 + .../src/main/res/values-eu/translations.xml | 61 + .../src/main/res/values-fa/translations.xml | 66 + .../src/main/res/values-fi/translations.xml | 70 + .../src/main/res/values-fr/translations.xml | 81 + .../src/main/res/values-hu/translations.xml | 71 + .../src/main/res/values-in/translations.xml | 58 + .../src/main/res/values-it/translations.xml | 81 + .../src/main/res/values-ka/translations.xml | 57 + .../src/main/res/values-ko/translations.xml | 65 + .../src/main/res/values-lt/translations.xml | 10 + .../src/main/res/values-nb/translations.xml | 66 + .../src/main/res/values-nl/translations.xml | 58 + .../src/main/res/values-pl/translations.xml | 67 + .../main/res/values-pt-rBR/translations.xml | 81 + .../src/main/res/values-pt/translations.xml | 66 + .../src/main/res/values-ro/translations.xml | 66 + .../src/main/res/values-ru/translations.xml | 74 + .../src/main/res/values-sk/translations.xml | 68 + .../src/main/res/values-sv/translations.xml | 66 + .../src/main/res/values-tr/translations.xml | 58 + .../src/main/res/values-uk/translations.xml | 67 + .../src/main/res/values-ur/translations.xml | 58 + .../src/main/res/values-uz/translations.xml | 66 + .../main/res/values-zh-rTW/translations.xml | 72 + .../src/main/res/values-zh/translations.xml | 66 + .../impl/src/main/res/values/localazy.xml | 81 + .../ChangeRoomPermissionsPresenterTest.kt | 283 ++ .../ChangeRoomPermissionsViewTest.kt | 172 + .../impl/roles/ChangeRolesNodeTest.kt | 26 + .../impl/roles/ChangeRolesPresenterTest.kt | 584 ++++ .../impl/roles/ChangeRolesViewTest.kt | 308 ++ ...faultChangeRoomMemberRolesEntyPointTest.kt | 47 + .../impl/roles/MembersByRoleTest.kt | 79 + .../root/RolesAndPermissionPresenterTest.kt | 166 + .../impl/root/RolesAndPermissionsViewTest.kt | 199 ++ .../rolesandpermissions/test/build.gradle.kts | 22 + .../FakeChangeRoomMemberRolesEntryPoint.kt | 27 + .../test/FakeRolesAndPermissionsEntryPoint.kt | 20 + .../roomaliasresolver/api/build.gradle.kts | 20 + .../api/RoomAliasResolverEntryPoint.kt | 34 + .../roomaliasresolver/impl/build.gradle.kts | 40 + .../DefaultRoomAliasResolverEntryPoint.kt | 31 + .../impl/RoomAliasResolverEvents.kt | 14 + .../impl/RoomAliasResolverNode.kt | 48 + .../impl/RoomAliasResolverPresenter.kt | 69 + .../impl/RoomAliasResolverState.kt | 23 + .../impl/RoomAliasResolverStateProvider.kt | 40 + .../impl/RoomAliasResolverView.kt | 156 + .../impl/di/RoomAliasResolverModule.kt | 35 + .../src/main/res/values-be/translations.xml | 4 + .../src/main/res/values-cs/translations.xml | 5 + .../src/main/res/values-cy/translations.xml | 5 + .../src/main/res/values-da/translations.xml | 5 + .../src/main/res/values-de/translations.xml | 5 + .../src/main/res/values-el/translations.xml | 5 + .../src/main/res/values-es/translations.xml | 5 + .../src/main/res/values-et/translations.xml | 5 + .../src/main/res/values-fi/translations.xml | 5 + .../src/main/res/values-fr/translations.xml | 5 + .../src/main/res/values-hu/translations.xml | 5 + .../src/main/res/values-in/translations.xml | 5 + .../src/main/res/values-it/translations.xml | 5 + .../src/main/res/values-ko/translations.xml | 5 + .../src/main/res/values-nb/translations.xml | 5 + .../src/main/res/values-nl/translations.xml | 4 + .../src/main/res/values-pl/translations.xml | 5 + .../main/res/values-pt-rBR/translations.xml | 5 + .../src/main/res/values-pt/translations.xml | 5 + .../src/main/res/values-ro/translations.xml | 5 + .../src/main/res/values-ru/translations.xml | 5 + .../src/main/res/values-sk/translations.xml | 5 + .../src/main/res/values-sv/translations.xml | 5 + .../src/main/res/values-tr/translations.xml | 5 + .../src/main/res/values-uk/translations.xml | 5 + .../src/main/res/values-ur/translations.xml | 4 + .../src/main/res/values-uz/translations.xml | 5 + .../main/res/values-zh-rTW/translations.xml | 5 + .../src/main/res/values-zh/translations.xml | 5 + .../impl/src/main/res/values/localazy.xml | 5 + .../DefaultRoomAliasResolverEntryPointTest.kt | 57 + .../impl/RoomAliasHelperPresenterTest.kt | 99 + .../impl/RoomAliasHelperViewTest.kt | 89 + features/roomcall/api/build.gradle.kts | 21 + .../features/roomcall/api/RoomCallState.kt | 34 + .../roomcall/api/RoomCallStateProvider.kt | 38 + features/roomcall/impl/build.gradle.kts | 35 + .../roomcall/impl/RoomCallStatePresenter.kt | 66 + .../roomcall/impl/di/RoomCallModule.kt | 24 + .../impl/RoomCallStatePresenterTest.kt | 239 ++ features/roomdetails/api/.gitignore | 1 + features/roomdetails/api/build.gradle.kts | 21 + .../roomdetails/api/RoomDetailsEntryPoint.kt | 53 + features/roomdetails/impl/.gitignore | 1 + features/roomdetails/impl/build.gradle.kts | 83 + features/roomdetails/impl/consumer-rules.pro | 0 .../impl/DefaultRoomDetailsEntryPoint.kt | 40 + .../roomdetails/impl/RoomDetailsAction.kt | 14 + .../roomdetails/impl/RoomDetailsEvent.kt | 17 + .../roomdetails/impl/RoomDetailsFlowNode.kt | 438 +++ .../roomdetails/impl/RoomDetailsNode.kt | 146 + .../roomdetails/impl/RoomDetailsPresenter.kt | 257 ++ .../roomdetails/impl/RoomDetailsState.kt | 87 + .../impl/RoomDetailsStateProvider.kt | 184 + .../roomdetails/impl/RoomDetailsView.kt | 793 +++++ .../roomdetails/impl/di/RoomMemberModule.kt | 44 + .../impl/edit/RoomDetailsEditEvents.kt | 20 + .../impl/edit/RoomDetailsEditNode.kt | 49 + .../impl/edit/RoomDetailsEditPresenter.kt | 244 ++ .../impl/edit/RoomDetailsEditState.kt | 31 + .../impl/edit/RoomDetailsEditStateProvider.kt | 60 + .../impl/edit/RoomDetailsEditView.kt | 179 + .../impl/invite/RoomInviteMembersNode.kt | 70 + .../impl/invite/RoomInviteMembersView.kt | 125 + .../impl/members/RoomMemberListEvents.kt | 17 + .../impl/members/RoomMemberListNode.kt | 94 + .../impl/members/RoomMemberListPresenter.kt | 163 + .../impl/members/RoomMemberListState.kt | 68 + .../members/RoomMemberListStateProvider.kt | 159 + .../impl/members/RoomMemberListView.kt | 368 ++ .../members/details/RoomMemberDetailsNode.kt | 87 + .../details/RoomMemberDetailsPresenter.kt | 136 + .../RoomNotificationSettingsEvents.kt | 19 + .../RoomNotificationSettingsItem.kt | 44 + .../RoomNotificationSettingsNode.kt | 66 + .../RoomNotificationSettingsOption.kt | 64 + .../RoomNotificationSettingsOptions.kt | 37 + .../RoomNotificationSettingsPresenter.kt | 208 ++ .../RoomNotificationSettingsState.kt | 35 + .../RoomNotificationSettingsStateProvider.kt | 51 + .../RoomNotificationSettingsView.kt | 185 + ...edRoomNotificationSettingsStateProvider.kt | 38 + ...UserDefinedRoomNotificationSettingsView.kt | 114 + .../src/main/res/values-be/translations.xml | 106 + .../src/main/res/values-bg/translations.xml | 101 + .../src/main/res/values-cs/translations.xml | 170 + .../src/main/res/values-cy/translations.xml | 154 + .../src/main/res/values-da/translations.xml | 146 + .../src/main/res/values-de/translations.xml | 148 + .../src/main/res/values-el/translations.xml | 137 + .../src/main/res/values-es/translations.xml | 137 + .../src/main/res/values-et/translations.xml | 155 + .../src/main/res/values-eu/translations.xml | 121 + .../src/main/res/values-fa/translations.xml | 134 + .../src/main/res/values-fi/translations.xml | 152 + .../src/main/res/values-fr/translations.xml | 164 + .../src/main/res/values-hu/translations.xml | 153 + .../src/main/res/values-in/translations.xml | 135 + .../src/main/res/values-it/translations.xml | 164 + .../src/main/res/values-ka/translations.xml | 97 + .../src/main/res/values-ko/translations.xml | 143 + .../src/main/res/values-lt/translations.xml | 24 + .../src/main/res/values-nb/translations.xml | 146 + .../src/main/res/values-nl/translations.xml | 105 + .../src/main/res/values-pl/translations.xml | 149 + .../main/res/values-pt-rBR/translations.xml | 164 + .../src/main/res/values-pt/translations.xml | 148 + .../src/main/res/values-ro/translations.xml | 146 + .../src/main/res/values-ru/translations.xml | 156 + .../src/main/res/values-sk/translations.xml | 149 + .../src/main/res/values-sv/translations.xml | 144 + .../src/main/res/values-tr/translations.xml | 138 + .../src/main/res/values-uk/translations.xml | 147 + .../src/main/res/values-ur/translations.xml | 102 + .../src/main/res/values-uz/translations.xml | 143 + .../main/res/values-zh-rTW/translations.xml | 154 + .../src/main/res/values-zh/translations.xml | 147 + .../impl/src/main/res/values/localazy.xml | 168 + .../impl/DefaultRoomDetailsEntryPointTest.kt | 97 + .../roomdetails/impl/MatrixRoomFixture.kt | 158 + .../impl/RoomDetailsPresenterTest.kt | 747 ++++ .../roomdetails/impl/RoomDetailsStateTest.kt | 59 + .../roomdetails/impl/RoomDetailsViewTest.kt | 375 ++ .../impl/edit/RoomDetailsEditPresenterTest.kt | 780 +++++ .../impl/edit/RoomDetailsEditViewTest.kt | 251 ++ .../members/RoomMemberListPresenterTest.kt | 236 ++ .../details/RoomMemberDetailsPresenterTest.kt | 388 +++ .../RoomNotificationSettingsPresenterTest.kt | 195 ++ features/roomdirectory/api/build.gradle.kts | 22 + .../roomdirectory/api/RoomDescription.kt | 61 + .../api/RoomDirectoryEntryPoint.kt | 26 + features/roomdirectory/impl/build.gradle.kts | 42 + .../impl/DefaultRoomDirectoryEntryPoint.kt | 28 + .../impl/root/RoomDirectoryEvents.kt | 14 + .../impl/root/RoomDirectoryNode.kt | 42 + .../impl/root/RoomDirectoryPresenter.kt | 94 + .../impl/root/RoomDirectoryState.kt | 21 + .../impl/root/RoomDirectoryStateProvider.kt | 67 + .../impl/root/RoomDirectoryView.kt | 281 ++ .../impl/root/model/RoomDescription.kt | 31 + .../impl/root/model/RoomDirectoryListState.kt | 25 + .../src/main/res/values-be/translations.xml | 5 + .../src/main/res/values-cs/translations.xml | 5 + .../src/main/res/values-cy/translations.xml | 5 + .../src/main/res/values-da/translations.xml | 5 + .../src/main/res/values-de/translations.xml | 5 + .../src/main/res/values-el/translations.xml | 5 + .../src/main/res/values-es/translations.xml | 5 + .../src/main/res/values-et/translations.xml | 5 + .../src/main/res/values-eu/translations.xml | 5 + .../src/main/res/values-fa/translations.xml | 5 + .../src/main/res/values-fi/translations.xml | 5 + .../src/main/res/values-fr/translations.xml | 5 + .../src/main/res/values-hu/translations.xml | 5 + .../src/main/res/values-in/translations.xml | 5 + .../src/main/res/values-it/translations.xml | 5 + .../src/main/res/values-ka/translations.xml | 5 + .../src/main/res/values-ko/translations.xml | 5 + .../src/main/res/values-nb/translations.xml | 5 + .../src/main/res/values-nl/translations.xml | 5 + .../src/main/res/values-pl/translations.xml | 5 + .../main/res/values-pt-rBR/translations.xml | 5 + .../src/main/res/values-pt/translations.xml | 5 + .../src/main/res/values-ro/translations.xml | 5 + .../src/main/res/values-ru/translations.xml | 5 + .../src/main/res/values-sk/translations.xml | 5 + .../src/main/res/values-sv/translations.xml | 5 + .../src/main/res/values-tr/translations.xml | 5 + .../src/main/res/values-uk/translations.xml | 5 + .../src/main/res/values-ur/translations.xml | 5 + .../src/main/res/values-uz/translations.xml | 5 + .../main/res/values-zh-rTW/translations.xml | 5 + .../src/main/res/values-zh/translations.xml | 5 + .../impl/src/main/res/values/localazy.xml | 5 + .../DefaultRoomDirectoryEntryPointTest.kt | 49 + .../impl/root/RoomDirectoryPresenterTest.kt | 135 + .../impl/root/RoomDirectoryViewTest.kt | 89 + .../roommembermoderation/api/build.gradle.kts | 22 + .../api/RoomMemberModerationEvents.kt | 16 + .../api/RoomMemberModerationRenderer.kt | 22 + .../api/RoomMemberModerationState.kt | 30 + .../impl/build.gradle.kts | 41 + .../DefaultRoomMemberModerationRenderer.kt | 38 + .../InternalRoomMemberModerationEvents.kt | 18 + .../impl/InternalRoomMemberModerationState.kt | 29 + ...ternalRoomMemberModerationStateProvider.kt | 103 + .../impl/RoomMemberModerationPresenter.kt | 233 ++ .../impl/RoomMemberModerationView.kt | 345 ++ .../impl/di/RoomMemberModerationModule.kt | 24 + .../src/main/res/values-be/translations.xml | 15 + .../src/main/res/values-bg/translations.xml | 4 + .../src/main/res/values-cs/translations.xml | 22 + .../src/main/res/values-cy/translations.xml | 20 + .../src/main/res/values-da/translations.xml | 22 + .../src/main/res/values-de/translations.xml | 20 + .../src/main/res/values-el/translations.xml | 20 + .../src/main/res/values-es/translations.xml | 20 + .../src/main/res/values-et/translations.xml | 22 + .../src/main/res/values-eu/translations.xml | 14 + .../src/main/res/values-fa/translations.xml | 18 + .../src/main/res/values-fi/translations.xml | 22 + .../src/main/res/values-fr/translations.xml | 22 + .../src/main/res/values-hu/translations.xml | 22 + .../src/main/res/values-in/translations.xml | 20 + .../src/main/res/values-it/translations.xml | 22 + .../src/main/res/values-ka/translations.xml | 15 + .../src/main/res/values-ko/translations.xml | 20 + .../src/main/res/values-nb/translations.xml | 20 + .../src/main/res/values-nl/translations.xml | 15 + .../src/main/res/values-pl/translations.xml | 20 + .../main/res/values-pt-rBR/translations.xml | 22 + .../src/main/res/values-pt/translations.xml | 20 + .../src/main/res/values-ro/translations.xml | 20 + .../src/main/res/values-ru/translations.xml | 22 + .../src/main/res/values-sk/translations.xml | 22 + .../src/main/res/values-sv/translations.xml | 20 + .../src/main/res/values-tr/translations.xml | 15 + .../src/main/res/values-uk/translations.xml | 20 + .../src/main/res/values-ur/translations.xml | 15 + .../src/main/res/values-uz/translations.xml | 20 + .../main/res/values-zh-rTW/translations.xml | 22 + .../src/main/res/values-zh/translations.xml | 22 + .../impl/src/main/res/values/localazy.xml | 22 + .../impl/RoomMemberModerationPresenterTest.kt | 384 +++ .../impl/RoomMemberModerationViewTest.kt | 228 ++ features/securebackup/api/build.gradle.kts | 20 + .../api/SecureBackupEntryPoint.kt | 46 + features/securebackup/impl/build.gradle.kts | 45 + .../impl/DefaultSecureBackupEntryPoint.kt | 31 + .../features/securebackup/impl/LoggerTag.kt | 16 + .../securebackup/impl/SecureBackupFlowNode.kt | 141 + .../impl/disable/SecureBackupDisableEvents.kt | 14 + .../impl/disable/SecureBackupDisableNode.kt | 38 + .../disable/SecureBackupDisablePresenter.kt | 63 + .../impl/disable/SecureBackupDisableState.kt | 19 + .../SecureBackupDisableStateProvider.kt | 34 + .../impl/disable/SecureBackupDisableView.kt | 122 + .../SecureBackupEnterRecoveryKeyEvents.kt | 16 + .../enter/SecureBackupEnterRecoveryKeyNode.kt | 45 + .../SecureBackupEnterRecoveryKeyPresenter.kt | 94 + .../SecureBackupEnterRecoveryKeyState.kt | 19 + ...cureBackupEnterRecoveryKeyStateProvider.kt | 44 + .../enter/SecureBackupEnterRecoveryKeyView.kt | 137 + .../impl/reset/ResetIdentityFlowManager.kt | 70 + .../impl/reset/ResetIdentityFlowNode.kt | 172 + .../password/ResetIdentityPasswordEvent.kt | 14 + .../password/ResetIdentityPasswordNode.kt | 47 + .../ResetIdentityPasswordPresenter.kt | 52 + .../password/ResetIdentityPasswordState.kt | 16 + .../ResetIdentityPasswordStateProvider.kt | 30 + .../password/ResetIdentityPasswordView.kt | 122 + .../impl/reset/root/ResetIdentityRootEvent.kt | 14 + .../impl/reset/root/ResetIdentityRootNode.kt | 45 + .../reset/root/ResetIdentityRootPresenter.kt | 35 + .../impl/reset/root/ResetIdentityRootState.kt | 14 + .../root/ResetIdentityRootStateProvider.kt | 25 + .../impl/reset/root/ResetIdentityRootView.kt | 141 + .../impl/root/SecureBackupRootEvents.kt | 16 + .../impl/root/SecureBackupRootNode.kt | 63 + .../impl/root/SecureBackupRootPresenter.kt | 98 + .../impl/root/SecureBackupRootState.kt | 38 + .../root/SecureBackupRootStateProvider.kt | 70 + .../impl/root/SecureBackupRootView.kt | 250 ++ .../impl/setup/SecureBackupSetupEvents.kt | 16 + .../impl/setup/SecureBackupSetupNode.kt | 67 + .../impl/setup/SecureBackupSetupPresenter.kt | 144 + .../impl/setup/SecureBackupSetupState.kt | 33 + .../setup/SecureBackupSetupStateMachine.kt | 68 + .../setup/SecureBackupSetupStateProvider.kt | 50 + .../impl/setup/SecureBackupSetupView.kt | 204 ++ .../SecureBackupSetupViewChangePreview.kt | 30 + .../impl/setup/views/RecoveryKeyView.kt | 287 ++ .../impl/setup/views/RecoveryKeyViewState.kt | 22 + .../views/RecoveryKeyViewStateProvider.kt | 48 + .../impl/tools/RecoveryKeyTools.kt | 22 + .../tools/RecoveryKeyVisualTransformation.kt | 44 + .../src/main/res/values-be/translations.xml | 65 + .../src/main/res/values-bg/translations.xml | 32 + .../src/main/res/values-cs/translations.xml | 70 + .../src/main/res/values-cy/translations.xml | 70 + .../src/main/res/values-da/translations.xml | 70 + .../src/main/res/values-de/translations.xml | 79 + .../src/main/res/values-el/translations.xml | 70 + .../src/main/res/values-es/translations.xml | 70 + .../src/main/res/values-et/translations.xml | 70 + .../src/main/res/values-eu/translations.xml | 61 + .../src/main/res/values-fa/translations.xml | 64 + .../src/main/res/values-fi/translations.xml | 70 + .../src/main/res/values-fr/translations.xml | 70 + .../src/main/res/values-hu/translations.xml | 70 + .../src/main/res/values-in/translations.xml | 70 + .../src/main/res/values-it/translations.xml | 70 + .../src/main/res/values-ka/translations.xml | 47 + .../src/main/res/values-ko/translations.xml | 70 + .../src/main/res/values-nb/translations.xml | 70 + .../src/main/res/values-nl/translations.xml | 65 + .../src/main/res/values-pl/translations.xml | 70 + .../main/res/values-pt-rBR/translations.xml | 70 + .../src/main/res/values-pt/translations.xml | 70 + .../src/main/res/values-ro/translations.xml | 70 + .../src/main/res/values-ru/translations.xml | 70 + .../src/main/res/values-sk/translations.xml | 70 + .../src/main/res/values-sv/translations.xml | 70 + .../src/main/res/values-tr/translations.xml | 70 + .../src/main/res/values-uk/translations.xml | 70 + .../src/main/res/values-ur/translations.xml | 65 + .../src/main/res/values-uz/translations.xml | 70 + .../main/res/values-zh-rTW/translations.xml | 70 + .../src/main/res/values-zh/translations.xml | 70 + .../impl/src/main/res/values/localazy.xml | 70 + .../impl/DefaultSecureBackupEntryPointTest.kt | 51 + .../SecureBackupDisablePresenterTest.kt | 93 + ...cureBackupEnterRecoveryKeyPresenterTest.kt | 99 + .../SecureBackupEnterRecoveryKeyViewTest.kt | 137 + .../reset/ResetIdentityFlowManagerTest.kt | 139 + .../ResetIdentityPasswordPresenterTest.kt | 88 + .../password/ResetIdentityPasswordViewTest.kt | 89 + .../root/ResetIdentityRootPresenterTest.kt | 57 + .../reset/root/ResetIdentityRootViewTest.kt | 100 + .../root/SecureBackupRootPresenterTest.kt | 116 + .../impl/root/SecureBackupRootStateTest.kt | 64 + .../setup/SecureBackupSetupPresenterTest.kt | 201 ++ .../impl/tools/RecoveryKeyToolsTest.kt | 37 + .../RecoveryKeyVisualTransformationTest.kt | 67 + .../securityandprivacy/api/build.gradle.kts | 21 + .../api/SecurityAndPrivacyEntryPoint.kt | 13 + .../api/SecurityAndPrivacyPermissions.kt | 50 + .../securityandprivacy/impl/build.gradle.kts | 48 + .../DefaultSecurityAndPrivacyEntryPoint.kt | 23 + .../impl/SecurityAndPrivacyFlowNode.kt | 67 + .../impl/SecurityAndPrivacyNavigator.kt | 31 + .../editroomaddress/EditRoomAddressEvents.kt | 15 + .../editroomaddress/EditRoomAddressNode.kt | 42 + .../EditRoomAddressPresenter.kt | 150 + .../editroomaddress/EditRoomAddressState.kt | 22 + .../EditRoomAddressStateProvider.kt | 38 + .../editroomaddress/EditRoomAddressView.kt | 121 + .../impl/editroomaddress/RoomAlias.kt | 25 + .../impl/root/SecurityAndPrivacyEvents.kt | 23 + .../impl/root/SecurityAndPrivacyNode.kt | 47 + .../impl/root/SecurityAndPrivacyPresenter.kt | 306 ++ .../impl/root/SecurityAndPrivacyState.kt | 91 + .../root/SecurityAndPrivacyStateProvider.kt | 133 + .../impl/root/SecurityAndPrivacyView.kt | 430 +++ .../src/main/res/values-be/translations.xml | 6 + .../src/main/res/values-bg/translations.xml | 22 + .../src/main/res/values-cs/translations.xml | 41 + .../src/main/res/values-cy/translations.xml | 36 + .../src/main/res/values-da/translations.xml | 34 + .../src/main/res/values-de/translations.xml | 36 + .../src/main/res/values-el/translations.xml | 34 + .../src/main/res/values-es/translations.xml | 34 + .../src/main/res/values-et/translations.xml | 37 + .../src/main/res/values-eu/translations.xml | 22 + .../src/main/res/values-fa/translations.xml | 22 + .../src/main/res/values-fi/translations.xml | 37 + .../src/main/res/values-fr/translations.xml | 38 + .../src/main/res/values-hu/translations.xml | 37 + .../src/main/res/values-in/translations.xml | 33 + .../src/main/res/values-it/translations.xml | 38 + .../src/main/res/values-ko/translations.xml | 34 + .../src/main/res/values-nb/translations.xml | 34 + .../src/main/res/values-nl/translations.xml | 6 + .../src/main/res/values-pl/translations.xml | 36 + .../main/res/values-pt-rBR/translations.xml | 38 + .../src/main/res/values-pt/translations.xml | 36 + .../src/main/res/values-ro/translations.xml | 34 + .../src/main/res/values-ru/translations.xml | 37 + .../src/main/res/values-sk/translations.xml | 36 + .../src/main/res/values-sv/translations.xml | 34 + .../src/main/res/values-tr/translations.xml | 36 + .../src/main/res/values-uk/translations.xml | 36 + .../src/main/res/values-uz/translations.xml | 33 + .../main/res/values-zh-rTW/translations.xml | 37 + .../src/main/res/values-zh/translations.xml | 36 + .../impl/src/main/res/values/localazy.xml | 42 + .../impl/FakeSecurityAndPrivacyNavigator.kt | 24 + .../impl/SecurityAndPrivacyPresenterTest.kt | 390 +++ .../impl/SecurityAndPrivacyViewTest.kt | 196 ++ .../EditRoomAddressPresenterTest.kt | 380 +++ .../EditRoomAddressViewTest.kt | 117 + .../securityandprivacy/test/build.gradle.kts | 22 + .../test/FakeSecurityAndPrivacyEntryPoint.kt | 19 + features/share/api/build.gradle.kts | 21 + .../features/share/api/ShareEntryPoint.kt | 31 + features/share/impl/build.gradle.kts | 52 + .../share/impl/DefaultShareEntryPoint.kt | 34 + .../features/share/impl/ShareEvents.kt | 13 + .../features/share/impl/ShareIntentHandler.kt | 141 + .../android/features/share/impl/ShareNode.kt | 93 + .../features/share/impl/SharePresenter.kt | 135 + .../android/features/share/impl/ShareState.kt | 17 + .../features/share/impl/ShareStateProvider.kt | 39 + .../android/features/share/impl/ShareView.kt | 41 + .../share/impl/DefaultShareEntryPointTest.kt | 59 + .../share/impl/FakeShareIntentHandler.kt | 27 + .../features/share/impl/SharePresenterTest.kt | 178 + features/signedout/api/build.gradle.kts | 20 + .../signedout/api/SignedOutEntryPoint.kt | 26 + features/signedout/impl/build.gradle.kts | 35 + .../impl/DefaultSignedOutEntryPoint.kt | 30 + .../signedout/impl/SignedOutEvents.kt | 13 + .../features/signedout/impl/SignedOutNode.kt | 46 + .../signedout/impl/SignedOutPresenter.kt | 60 + .../features/signedout/impl/SignedOutState.kt | 17 + .../signedout/impl/SignedOutStateProvider.kt | 51 + .../features/signedout/impl/SignedOutView.kt | 120 + .../src/main/res/values-be/translations.xml | 8 + .../src/main/res/values-bg/translations.xml | 5 + .../src/main/res/values-cs/translations.xml | 8 + .../src/main/res/values-cy/translations.xml | 8 + .../src/main/res/values-da/translations.xml | 8 + .../src/main/res/values-de/translations.xml | 8 + .../src/main/res/values-el/translations.xml | 8 + .../src/main/res/values-es/translations.xml | 8 + .../src/main/res/values-et/translations.xml | 8 + .../src/main/res/values-eu/translations.xml | 8 + .../src/main/res/values-fa/translations.xml | 8 + .../src/main/res/values-fi/translations.xml | 8 + .../src/main/res/values-fr/translations.xml | 8 + .../src/main/res/values-hu/translations.xml | 8 + .../src/main/res/values-in/translations.xml | 8 + .../src/main/res/values-it/translations.xml | 8 + .../src/main/res/values-ka/translations.xml | 8 + .../src/main/res/values-ko/translations.xml | 8 + .../src/main/res/values-lt/translations.xml | 4 + .../src/main/res/values-nb/translations.xml | 8 + .../src/main/res/values-nl/translations.xml | 8 + .../src/main/res/values-pl/translations.xml | 8 + .../main/res/values-pt-rBR/translations.xml | 8 + .../src/main/res/values-pt/translations.xml | 8 + .../src/main/res/values-ro/translations.xml | 8 + .../src/main/res/values-ru/translations.xml | 8 + .../src/main/res/values-sk/translations.xml | 8 + .../src/main/res/values-sv/translations.xml | 8 + .../src/main/res/values-tr/translations.xml | 8 + .../src/main/res/values-uk/translations.xml | 8 + .../src/main/res/values-ur/translations.xml | 8 + .../src/main/res/values-uz/translations.xml | 8 + .../main/res/values-zh-rTW/translations.xml | 8 + .../src/main/res/values-zh/translations.xml | 8 + .../impl/src/main/res/values/localazy.xml | 8 + .../impl/DefaultSignedOutEntryPointTest.kt | 46 + .../signedout/impl/SignedOutPresenterTest.kt | 80 + features/space/api/build.gradle.kts | 19 + .../features/space/api/SpaceEntryPoint.kt | 34 + features/space/impl/build.gradle.kts | 50 + .../space/impl/DefaultSpaceEntryPoint.kt | 31 + .../features/space/impl/SpaceFlowNode.kt | 150 + .../features/space/impl/di/SpaceFlowGraph.kt | 25 + .../features/space/impl/di/SpaceFlowScope.kt | 11 + .../space/impl/leave/LeaveSpaceEvents.kt | 20 + .../space/impl/leave/LeaveSpaceNode.kt | 63 + .../space/impl/leave/LeaveSpacePresenter.kt | 150 + .../space/impl/leave/LeaveSpaceState.kt | 57 + .../impl/leave/LeaveSpaceStateProvider.kt | 136 + .../space/impl/leave/LeaveSpaceView.kt | 363 ++ .../space/impl/leave/SelectableSpaceRoom.kt | 17 + .../features/space/impl/root/SpaceEvents.kt | 22 + .../features/space/impl/root/SpaceNode.kt | 107 + .../space/impl/root/SpacePresenter.kt | 154 + .../features/space/impl/root/SpaceState.kt | 41 + .../space/impl/root/SpaceStateProvider.kt | 97 + .../features/space/impl/root/SpaceView.kt | 427 +++ .../impl/settings/SpaceSettingsEvents.kt | 11 + .../space/impl/settings/SpaceSettingsNode.kt | 59 + .../impl/settings/SpaceSettingsPresenter.kt | 38 + .../space/impl/settings/SpaceSettingsState.kt | 23 + .../settings/SpaceSettingsStateProvider.kt | 43 + .../space/impl/settings/SpaceSettingsView.kt | 232 ++ .../src/main/res/values-be/translations.xml | 4 + .../src/main/res/values-bg/translations.xml | 6 + .../src/main/res/values-cs/translations.xml | 17 + .../src/main/res/values-cy/translations.xml | 17 + .../src/main/res/values-da/translations.xml | 16 + .../src/main/res/values-de/translations.xml | 16 + .../src/main/res/values-el/translations.xml | 5 + .../src/main/res/values-es/translations.xml | 5 + .../src/main/res/values-et/translations.xml | 16 + .../src/main/res/values-eu/translations.xml | 5 + .../src/main/res/values-fa/translations.xml | 11 + .../src/main/res/values-fi/translations.xml | 16 + .../src/main/res/values-fr/translations.xml | 16 + .../src/main/res/values-hu/translations.xml | 16 + .../src/main/res/values-in/translations.xml | 5 + .../src/main/res/values-it/translations.xml | 16 + .../src/main/res/values-ka/translations.xml | 4 + .../src/main/res/values-ko/translations.xml | 5 + .../src/main/res/values-nb/translations.xml | 16 + .../src/main/res/values-nl/translations.xml | 4 + .../src/main/res/values-pl/translations.xml | 17 + .../main/res/values-pt-rBR/translations.xml | 16 + .../src/main/res/values-pt/translations.xml | 13 + .../src/main/res/values-ro/translations.xml | 17 + .../src/main/res/values-ru/translations.xml | 17 + .../src/main/res/values-sk/translations.xml | 17 + .../src/main/res/values-sv/translations.xml | 5 + .../src/main/res/values-tr/translations.xml | 5 + .../src/main/res/values-uk/translations.xml | 5 + .../src/main/res/values-ur/translations.xml | 4 + .../src/main/res/values-uz/translations.xml | 5 + .../main/res/values-zh-rTW/translations.xml | 15 + .../src/main/res/values-zh/translations.xml | 15 + .../impl/src/main/res/values/localazy.xml | 16 + .../space/impl/DefaultSpaceEntryPointTest.kt | 63 + .../space/impl/di/FakeSpaceFlowGraph.kt | 26 + .../impl/leave/LeaveSpacePresenterTest.kt | 253 ++ .../space/impl/leave/LeaveSpaceStateTest.kt | 129 + .../space/impl/root/SpacePresenterTest.kt | 341 ++ .../space/impl/root/SpaceStateTest.kt | 48 + .../features/space/impl/root/SpaceViewTest.kt | 159 + features/startchat/api/build.gradle.kts | 19 + .../api/ConfirmingStartDmWithMatrixUser.kt | 16 + .../startchat/api/StartChatEntryPoint.kt | 28 + .../features/startchat/api/StartDMAction.kt | 29 + features/startchat/impl/build.gradle.kts | 58 + .../features/startchat/StartChatNavigator.kt | 50 + .../impl/DefaultStartChatEntryPoint.kt | 27 + .../startchat/impl/DefaultStartDMAction.kt | 51 + .../startchat/impl/StartChatFlowNode.kt | 102 + .../SearchMultipleUsersResultItem.kt | 92 + .../components/SearchSingleUserResultItem.kt | 60 + .../impl/components/SearchUserBar.kt | 137 + .../startchat/impl/components/UserListView.kt | 127 + .../joinbyaddress/JoinRoomByAddressEvents.kt | 15 + .../joinbyaddress/JoinRoomByAddressNode.kt | 41 + .../JoinRoomByAddressPresenter.kt | 140 + .../joinbyaddress/JoinRoomByAddressState.kt | 27 + .../JoinRoomByAddressStateProvider.kt | 38 + .../joinbyaddress/JoinRoomByAddressView.kt | 135 + .../startchat/impl/root/StartChatEvents.kt | 16 + .../startchat/impl/root/StartChatNode.kt | 68 + .../startchat/impl/root/StartChatPresenter.kt | 82 + .../startchat/impl/root/StartChatState.kt | 21 + .../impl/root/StartChatStateProvider.kt | 75 + .../startchat/impl/root/StartChatView.kt | 254 ++ .../impl/userlist/DefaultUserListPresenter.kt | 99 + .../impl/userlist/UserListDataStore.kt | 31 + .../startchat/impl/userlist/UserListEvents.kt | 18 + .../impl/userlist/UserListPresenter.kt | 22 + .../impl/userlist/UserListPresenterArgs.kt | 18 + .../startchat/impl/userlist/UserListState.kt | 28 + .../impl/userlist/UserListStateProvider.kt | 91 + .../src/main/res/values-be/translations.xml | 6 + .../src/main/res/values-bg/translations.xml | 10 + .../src/main/res/values-cs/translations.xml | 12 + .../src/main/res/values-cy/translations.xml | 12 + .../src/main/res/values-da/translations.xml | 12 + .../src/main/res/values-de/translations.xml | 12 + .../src/main/res/values-el/translations.xml | 12 + .../src/main/res/values-es/translations.xml | 12 + .../src/main/res/values-et/translations.xml | 12 + .../src/main/res/values-eu/translations.xml | 9 + .../src/main/res/values-fa/translations.xml | 12 + .../src/main/res/values-fi/translations.xml | 12 + .../src/main/res/values-fr/translations.xml | 12 + .../src/main/res/values-hu/translations.xml | 12 + .../src/main/res/values-in/translations.xml | 12 + .../src/main/res/values-it/translations.xml | 12 + .../src/main/res/values-ka/translations.xml | 6 + .../src/main/res/values-ko/translations.xml | 12 + .../src/main/res/values-lt/translations.xml | 5 + .../src/main/res/values-nb/translations.xml | 12 + .../src/main/res/values-nl/translations.xml | 6 + .../src/main/res/values-pl/translations.xml | 12 + .../main/res/values-pt-rBR/translations.xml | 12 + .../src/main/res/values-pt/translations.xml | 12 + .../src/main/res/values-ro/translations.xml | 12 + .../src/main/res/values-ru/translations.xml | 12 + .../src/main/res/values-sk/translations.xml | 12 + .../src/main/res/values-sv/translations.xml | 12 + .../src/main/res/values-tr/translations.xml | 11 + .../src/main/res/values-uk/translations.xml | 12 + .../src/main/res/values-ur/translations.xml | 6 + .../src/main/res/values-uz/translations.xml | 12 + .../main/res/values-zh-rTW/translations.xml | 12 + .../src/main/res/values-zh/translations.xml | 12 + .../impl/src/main/res/values/localazy.xml | 12 + .../impl/DefaultStartChatEntryPointTest.kt | 52 + .../impl/DefaultStartDMActionTest.kt | 106 + .../startchat/impl/FakeStartChatNavigator.kt | 40 + .../JoinBaseRoomByAddressPresenterTest.kt | 141 + .../JoinBaseRoomByAddressViewTest.kt | 64 + .../impl/root/StartChatPresenterTest.kt | 200 ++ .../startchat/impl/root/StartChatViewTest.kt | 157 + .../userlist/DefaultUserListPresenterTest.kt | 233 ++ .../impl/userlist/FakeUserListPresenter.kt | 24 + .../userlist/FakeUserListPresenterFactory.kt | 21 + features/startchat/test/build.gradle.kts | 24 + .../invitepeople/test/FakeStartDMAction.kt | 30 + features/userprofile/api/build.gradle.kts | 22 + .../userprofile/api/UserProfileEntryPoint.kt | 32 + .../userprofile/api/UserProfileEvents.kt | 20 + .../api/UserProfilePresenterFactory.kt | 16 + .../userprofile/api/UserProfileState.kt | 42 + features/userprofile/impl/build.gradle.kts | 53 + .../impl/DefaultUserProfileEntryPoint.kt | 31 + .../DefaultUserProfilePresenterFactory.kt | 24 + .../userprofile/impl/UserProfileFlowNode.kt | 153 + .../userprofile/impl/root/UserProfileNode.kt | 83 + .../impl/root/UserProfilePresenter.kt | 180 + .../impl/DefaultUserProfileEntryPointTest.kt | 66 + .../impl/UserProfilePresenterTest.kt | 417 +++ features/userprofile/shared/build.gradle.kts | 46 + .../shared/UserProfileHeaderSection.kt | 163 + .../shared/UserProfileMainActionsSection.kt | 56 + .../shared/UserProfileNodeHelper.kt | 47 + .../shared/UserProfileStateProvider.kt | 65 + .../userprofile/shared/UserProfileView.kt | 158 + .../shared/blockuser/BlockUserDialogs.kt | 75 + .../shared/blockuser/BlockUserSection.kt | 98 + .../src/main/res/values-be/translations.xml | 17 + .../src/main/res/values-bg/translations.xml | 18 + .../src/main/res/values-cs/translations.xml | 19 + .../src/main/res/values-cy/translations.xml | 19 + .../src/main/res/values-da/translations.xml | 19 + .../src/main/res/values-de/translations.xml | 19 + .../src/main/res/values-el/translations.xml | 19 + .../src/main/res/values-es/translations.xml | 19 + .../src/main/res/values-et/translations.xml | 19 + .../src/main/res/values-eu/translations.xml | 19 + .../src/main/res/values-fa/translations.xml | 19 + .../src/main/res/values-fi/translations.xml | 19 + .../src/main/res/values-fr/translations.xml | 19 + .../src/main/res/values-hu/translations.xml | 19 + .../src/main/res/values-in/translations.xml | 19 + .../src/main/res/values-it/translations.xml | 19 + .../src/main/res/values-ka/translations.xml | 17 + .../src/main/res/values-ko/translations.xml | 19 + .../src/main/res/values-lt/translations.xml | 16 + .../src/main/res/values-nb/translations.xml | 19 + .../src/main/res/values-nl/translations.xml | 18 + .../src/main/res/values-pl/translations.xml | 19 + .../main/res/values-pt-rBR/translations.xml | 19 + .../src/main/res/values-pt/translations.xml | 19 + .../src/main/res/values-ro/translations.xml | 19 + .../src/main/res/values-ru/translations.xml | 19 + .../src/main/res/values-sk/translations.xml | 19 + .../src/main/res/values-sv/translations.xml | 19 + .../src/main/res/values-tr/translations.xml | 19 + .../src/main/res/values-uk/translations.xml | 19 + .../src/main/res/values-ur/translations.xml | 17 + .../src/main/res/values-uz/translations.xml | 19 + .../main/res/values-zh-rTW/translations.xml | 19 + .../src/main/res/values-zh/translations.xml | 19 + .../shared/src/main/res/values/localazy.xml | 19 + .../userprofile/UserProfileViewTest.kt | 235 ++ .../shared/blockuser/BlockUserDialogsTest.kt | 88 + features/verifysession/api/build.gradle.kts | 20 + .../api/IncomingVerificationEntryPoint.kt | 33 + .../api/OutgoingVerificationEntryPoint.kt | 36 + features/verifysession/impl/.gitignore | 1 + features/verifysession/impl/build.gradle.kts | 47 + .../verifysession/impl/consumer-rules.pro | 0 .../verifysession/impl/emoji/EmojiResource.kt | 87 + .../impl/emoji/SasEmojisPreview.kt | 67 + .../DefaultIncomingVerificationEntryPoint.kt | 28 + .../incoming/IncomingVerificationNavigator.kt | 13 + .../impl/incoming/IncomingVerificationNode.kt | 50 + .../incoming/IncomingVerificationPresenter.kt | 216 ++ .../incoming/IncomingVerificationState.kt | 43 + .../IncomingVerificationStateMachine.kt | 165 + .../IncomingVerificationStateProvider.kt | 94 + .../impl/incoming/IncomingVerificationView.kt | 302 ++ .../IncomingVerificationViewEvents.kt | 17 + .../impl/incoming/ui/SessionDetailsView.kt | 103 + .../DefaultOutgoingVerificationEntryPoint.kt | 28 + .../impl/outgoing/OutgoingVerificationNode.kt | 50 + .../outgoing/OutgoingVerificationPresenter.kt | 181 + .../outgoing/OutgoingVerificationState.kt | 38 + .../OutgoingVerificationStateMachine.kt | 203 ++ .../OutgoingVerificationStateProvider.kt | 87 + .../impl/outgoing/OutgoingVerificationView.kt | 350 ++ .../OutgoingVerificationViewEvents.kt | 18 + .../features/verifysession/impl/ui/Common.kt | 34 + .../impl/ui/VerificationBottomMenu.kt | 28 + .../impl/ui/VerificationContentVerifying.kt | 105 + .../impl/ui/VerificationUserProfileContent.kt | 93 + .../impl/util/StateMachineUtil.kt | 26 + .../main/res/drawable/ic_verification_00.xml | 45 + .../main/res/drawable/ic_verification_01.xml | 36 + .../main/res/drawable/ic_verification_02.xml | 54 + .../main/res/drawable/ic_verification_03.xml | 33 + .../main/res/drawable/ic_verification_04.xml | 30 + .../main/res/drawable/ic_verification_05.xml | 21 + .../main/res/drawable/ic_verification_06.xml | 15 + .../main/res/drawable/ic_verification_07.xml | 27 + .../main/res/drawable/ic_verification_08.xml | 42 + .../main/res/drawable/ic_verification_09.xml | 18 + .../main/res/drawable/ic_verification_10.xml | 21 + .../main/res/drawable/ic_verification_11.xml | 21 + .../main/res/drawable/ic_verification_12.xml | 24 + .../main/res/drawable/ic_verification_13.xml | 24 + .../main/res/drawable/ic_verification_14.xml | 39 + .../main/res/drawable/ic_verification_15.xml | 15 + .../main/res/drawable/ic_verification_16.xml | 54 + .../main/res/drawable/ic_verification_17.xml | 51 + .../main/res/drawable/ic_verification_18.xml | 24 + .../main/res/drawable/ic_verification_19.xml | 15 + .../main/res/drawable/ic_verification_20.xml | 12 + .../main/res/drawable/ic_verification_21.xml | 12 + .../main/res/drawable/ic_verification_22.xml | 12 + .../main/res/drawable/ic_verification_23.xml | 36 + .../main/res/drawable/ic_verification_24.xml | 15 + .../main/res/drawable/ic_verification_25.xml | 15 + .../main/res/drawable/ic_verification_26.xml | 18 + .../main/res/drawable/ic_verification_27.xml | 21 + .../main/res/drawable/ic_verification_28.xml | 42 + .../main/res/drawable/ic_verification_29.xml | 9 + .../main/res/drawable/ic_verification_30.xml | 21 + .../main/res/drawable/ic_verification_31.xml | 48 + .../main/res/drawable/ic_verification_32.xml | 15 + .../main/res/drawable/ic_verification_33.xml | 12 + .../main/res/drawable/ic_verification_34.xml | 9 + .../main/res/drawable/ic_verification_35.xml | 42 + .../main/res/drawable/ic_verification_36.xml | 12 + .../main/res/drawable/ic_verification_37.xml | 18 + .../main/res/drawable/ic_verification_38.xml | 15 + .../main/res/drawable/ic_verification_39.xml | 27 + .../main/res/drawable/ic_verification_40.xml | 21 + .../main/res/drawable/ic_verification_41.xml | 21 + .../main/res/drawable/ic_verification_42.xml | 24 + .../main/res/drawable/ic_verification_43.xml | 24 + .../main/res/drawable/ic_verification_44.xml | 9 + .../main/res/drawable/ic_verification_45.xml | 21 + .../main/res/drawable/ic_verification_46.xml | 12 + .../main/res/drawable/ic_verification_47.xml | 9 + .../main/res/drawable/ic_verification_48.xml | 12 + .../main/res/drawable/ic_verification_49.xml | 15 + .../main/res/drawable/ic_verification_50.xml | 24 + .../main/res/drawable/ic_verification_51.xml | 72 + .../main/res/drawable/ic_verification_52.xml | 27 + .../main/res/drawable/ic_verification_53.xml | 18 + .../main/res/drawable/ic_verification_54.xml | 24 + .../main/res/drawable/ic_verification_55.xml | 18 + .../main/res/drawable/ic_verification_56.xml | 15 + .../main/res/drawable/ic_verification_57.xml | 51 + .../main/res/drawable/ic_verification_58.xml | 21 + .../main/res/drawable/ic_verification_59.xml | 15 + .../main/res/drawable/ic_verification_60.xml | 12 + .../main/res/drawable/ic_verification_61.xml | 15 + .../main/res/drawable/ic_verification_62.xml | 12 + .../main/res/drawable/ic_verification_63.xml | 18 + .../src/main/res/values-ar/strings_sas.xml | 68 + .../src/main/res/values-be/translations.xml | 35 + .../src/main/res/values-bg/strings_sas.xml | 68 + .../src/main/res/values-bg/translations.xml | 42 + .../src/main/res/values-ca/strings_sas.xml | 68 + .../src/main/res/values-cs/strings_sas.xml | 68 + .../src/main/res/values-cs/translations.xml | 54 + .../src/main/res/values-cy/translations.xml | 54 + .../src/main/res/values-da/translations.xml | 54 + .../src/main/res/values-de/strings_sas.xml | 68 + .../src/main/res/values-de/translations.xml | 54 + .../src/main/res/values-el/translations.xml | 54 + .../src/main/res/values-eo/strings_sas.xml | 68 + .../src/main/res/values-es/strings_sas.xml | 68 + .../src/main/res/values-es/translations.xml | 54 + .../src/main/res/values-et/strings_sas.xml | 68 + .../src/main/res/values-et/translations.xml | 54 + .../src/main/res/values-eu/translations.xml | 48 + .../src/main/res/values-fa/strings_sas.xml | 68 + .../src/main/res/values-fa/translations.xml | 36 + .../src/main/res/values-fi/strings_sas.xml | 68 + .../src/main/res/values-fi/translations.xml | 54 + .../src/main/res/values-fr/strings_sas.xml | 68 + .../src/main/res/values-fr/translations.xml | 54 + .../src/main/res/values-hr/strings_sas.xml | 68 + .../src/main/res/values-hu/strings_sas.xml | 68 + .../src/main/res/values-hu/translations.xml | 54 + .../src/main/res/values-in/strings_sas.xml | 68 + .../src/main/res/values-in/translations.xml | 54 + .../src/main/res/values-it/strings_sas.xml | 68 + .../src/main/res/values-it/translations.xml | 54 + .../src/main/res/values-ja/strings_sas.xml | 68 + .../src/main/res/values-ka/translations.xml | 31 + .../src/main/res/values-ko/translations.xml | 54 + .../src/main/res/values-lt/translations.xml | 19 + .../main/res/values-nb-rNO/strings_sas.xml | 68 + .../src/main/res/values-nb/translations.xml | 54 + .../src/main/res/values-nl/strings_sas.xml | 68 + .../src/main/res/values-nl/translations.xml | 39 + .../src/main/res/values-pl/translations.xml | 54 + .../main/res/values-pt-rBR/strings_sas.xml | 68 + .../main/res/values-pt-rBR/translations.xml | 54 + .../src/main/res/values-pt/strings_sas.xml | 68 + .../src/main/res/values-pt/translations.xml | 54 + .../src/main/res/values-ro/translations.xml | 54 + .../src/main/res/values-ru/strings_sas.xml | 68 + .../src/main/res/values-ru/translations.xml | 54 + .../src/main/res/values-si/strings_sas.xml | 8 + .../src/main/res/values-sk/strings_sas.xml | 68 + .../src/main/res/values-sk/translations.xml | 54 + .../src/main/res/values-sq/strings_sas.xml | 67 + .../src/main/res/values-sr/strings_sas.xml | 68 + .../src/main/res/values-sv/strings_sas.xml | 68 + .../src/main/res/values-sv/translations.xml | 54 + .../src/main/res/values-szl/strings_sas.xml | 4 + .../src/main/res/values-tr/translations.xml | 54 + .../src/main/res/values-tzm/strings_sas.xml | 30 + .../src/main/res/values-uk/strings_sas.xml | 68 + .../src/main/res/values-uk/translations.xml | 54 + .../src/main/res/values-ur/translations.xml | 35 + .../src/main/res/values-uz/translations.xml | 54 + .../src/main/res/values-vi/strings_sas.xml | 68 + .../main/res/values-zh-rCN/strings_sas.xml | 68 + .../main/res/values-zh-rTW/strings_sas.xml | 68 + .../main/res/values-zh-rTW/translations.xml | 54 + .../src/main/res/values-zh/translations.xml | 54 + .../impl/src/main/res/values/localazy.xml | 54 + .../impl/src/main/res/values/strings_sas.xml | 68 + ...faultIncomingVerificationEntryPointTest.kt | 51 + .../IncomingVerificationPresenterTest.kt | 322 ++ .../incoming/IncomingVerificationViewTest.kt | 218 ++ ...faultOutgoingVerificationEntryPointTest.kt | 56 + .../OutgoingVerificationPresenterTest.kt | 339 ++ .../outgoing/OutgoingVerificationViewTest.kt | 179 + features/verifysession/test/build.gradle.kts | 21 + .../FakeIncomingVerificationEntryPoint.kt | 23 + .../FakeOutgoingVerificationEntryPoint.kt | 23 + features/viewfolder/api/build.gradle.kts | 18 + .../features/viewfolder/api/TextFileViewer.kt | 21 + .../viewfolder/api/ViewFolderEntryPoint.kt | 31 + features/viewfolder/impl/build.gradle.kts | 33 + .../viewfolder/impl/DefaultTextFileViewer.kt | 33 + .../impl/DefaultViewFolderEntryPoint.kt | 35 + .../viewfolder/impl/file/FileContent.kt | 153 + .../viewfolder/impl/file/FileContentReader.kt | 31 + .../features/viewfolder/impl/file/FileSave.kt | 92 + .../viewfolder/impl/file/FileShare.kt | 64 + .../viewfolder/impl/file/ViewFileEvents.kt | 14 + .../viewfolder/impl/file/ViewFileNode.kt | 57 + .../viewfolder/impl/file/ViewFilePresenter.kt | 84 + .../viewfolder/impl/file/ViewFileState.kt | 24 + .../impl/file/ViewFileStateProvider.kt | 68 + .../viewfolder/impl/file/ViewFileView.kt | 100 + .../viewfolder/impl/folder/FolderExplorer.kt | 52 + .../viewfolder/impl/folder/ViewFolderNode.kt | 60 + .../impl/folder/ViewFolderPresenter.kt | 61 + .../viewfolder/impl/folder/ViewFolderState.kt | 17 + .../impl/folder/ViewFolderStateProvider.kt | 35 + .../viewfolder/impl/folder/ViewFolderView.kt | 151 + .../features/viewfolder/impl/model/Item.kt | 27 + .../impl/root/ViewFolderFlowNode.kt | 138 + .../impl/DefaultViewFolderEntryPointTest.kt | 54 + .../test/file/FakeFileContentReader.kt | 21 + .../viewfolder/test/file/FakeFileSave.kt | 20 + .../viewfolder/test/file/FakeFileShare.kt | 20 + .../test/file/ViewFilePresenterTest.kt | 142 + .../test/folder/FakeFolderExplorer.kt | 22 + .../test/folder/ViewFolderPresenterTest.kt | 112 + features/viewfolder/test/build.gradle.kts | 20 + .../test/FakeViewFolderEntryPoint.kt | 23 + gradle.properties | 64 + gradle/libs.versions.toml | 270 ++ gradle/wrapper/gradle-wrapper.jar | Bin 0 -> 45633 bytes gradle/wrapper/gradle-wrapper.properties | 8 + gradlew | 248 ++ gradlew.bat | 93 + libraries/accountselect/api/build.gradle.kts | 19 + .../api/AccountSelectEntryPoint.kt | 28 + libraries/accountselect/impl/build.gradle.kts | 36 + .../accountselect/impl/AccountSelectNode.kt | 42 + .../impl/AccountSelectPresenter.kt | 46 + .../accountselect/impl/AccountSelectState.kt | 16 + .../impl/AccountSelectStateProvider.kt | 28 + .../accountselect/impl/AccountSelectView.kt | 89 + .../impl/DefaultAccountSelectEntryPoint.kt | 27 + .../impl/AccountSelectPresenterTest.kt | 79 + .../DefaultAccountSelectEntryPointTest.kt | 47 + libraries/androidutils/.gitignore | 1 + libraries/androidutils/build.gradle.kts | 42 + libraries/androidutils/consumer-rules.pro | 0 .../androidutils/src/main/AndroidManifest.xml | 11 + .../androidutils/assets/AssetReader.kt | 46 + .../libraries/androidutils/bitmap/Bitmap.kt | 88 + .../androidutils/browser/ChromeCustomTab.kt | 66 + .../browser/ConsoleMessageLogger.kt | 60 + .../clipboard/AndroidClipboardHelper.kt | 30 + .../androidutils/clipboard/ClipboardHelper.kt | 16 + .../clipboard/FakeClipboardHelper.kt | 17 + .../libraries/androidutils/compat/Compat.kt | 35 + .../androidutils/diff/DefaultDiffCallback.kt | 40 + .../libraries/androidutils/diff/DiffCache.kt | 58 + .../androidutils/diff/DiffCacheInvalidator.kt | 54 + .../androidutils/diff/DiffCacheUpdater.kt | 61 + .../libraries/androidutils/file/Context.kt | 49 + .../libraries/androidutils/file/File.kt | 62 + .../androidutils/file/FileCompression.kt | 43 + .../androidutils/file/TemporaryUriDeleter.kt | 39 + .../filesize/AndroidFileSizeFormatter.kt | 45 + .../filesize/FakeFileSizeFormatter.kt | 15 + .../filesize/FileSizeFormatter.kt | 16 + .../androidutils/hardware/VibratorTools.kt | 25 + .../libraries/androidutils/hash/Hash.kt | 26 + .../androidutils/json/JsonProvider.kt | 27 + .../media/MediaMetaDataRetriever.kt | 20 + .../media/VideoCompressorHelper.kt | 52 + .../androidutils/metadata/IsInDebug.kt | 29 + ...aultPreferencesCorruptionHandlerFactory.kt | 27 + .../androidutils/system/Accessibility.kt | 20 + .../system/CopyToClipboardUseCase.kt | 23 + .../androidutils/system/DateTimeObserver.kt | 61 + .../androidutils/system/SystemUtils.kt | 207 ++ .../androidutils/text/LinkifyHelper.kt | 110 + .../androidutils/throttler/FirstThrottler.kt | 35 + .../android/libraries/androidutils/ui/View.kt | 62 + .../androidutils/uri/UriExtensions.kt | 16 + .../src/main/res/values-be/translations.xml | 4 + .../src/main/res/values-cs/translations.xml | 4 + .../src/main/res/values-cy/translations.xml | 4 + .../src/main/res/values-da/translations.xml | 4 + .../src/main/res/values-de/translations.xml | 4 + .../src/main/res/values-el/translations.xml | 4 + .../src/main/res/values-es/translations.xml | 4 + .../src/main/res/values-et/translations.xml | 4 + .../src/main/res/values-eu/translations.xml | 4 + .../src/main/res/values-fa/translations.xml | 4 + .../src/main/res/values-fi/translations.xml | 4 + .../src/main/res/values-fr/translations.xml | 4 + .../src/main/res/values-hu/translations.xml | 4 + .../src/main/res/values-in/translations.xml | 4 + .../src/main/res/values-it/translations.xml | 4 + .../src/main/res/values-ka/translations.xml | 4 + .../src/main/res/values-ko/translations.xml | 4 + .../src/main/res/values-ldrtl/integers.xml | 13 + .../src/main/res/values-lt/translations.xml | 4 + .../src/main/res/values-nb/translations.xml | 4 + .../src/main/res/values-nl/translations.xml | 4 + .../src/main/res/values-pl/translations.xml | 4 + .../main/res/values-pt-rBR/translations.xml | 4 + .../src/main/res/values-pt/translations.xml | 4 + .../src/main/res/values-ro/translations.xml | 4 + .../src/main/res/values-ru/translations.xml | 4 + .../src/main/res/values-sk/translations.xml | 4 + .../src/main/res/values-sv/translations.xml | 4 + .../src/main/res/values-tr/translations.xml | 4 + .../src/main/res/values-uk/translations.xml | 4 + .../src/main/res/values-ur/translations.xml | 4 + .../src/main/res/values-uz/translations.xml | 4 + .../main/res/values-zh-rTW/translations.xml | 4 + .../src/main/res/values-zh/translations.xml | 4 + .../src/main/res/values/integers.xml | 13 + .../src/main/res/values/localazy.xml | 4 + .../filesize/AndroidFileSizeFormatterTest.kt | 63 + .../media/VideoCompressorHelperTest.kt | 80 + .../androidutils/text/LinkifierHelperTest.kt | 125 + .../throttler/FirstThrottlerTest.kt | 33 + libraries/architecture/.gitignore | 1 + libraries/architecture/build.gradle.kts | 31 + .../architecture/AssistedNodeFactory.kt | 17 + .../libraries/architecture/AsyncAction.kt | 185 + .../libraries/architecture/AsyncData.kt | 174 + .../libraries/architecture/BaseFlowNode.kt | 98 + .../libraries/architecture/Bindings.kt | 40 + .../architecture/FeatureEntryPoint.kt | 24 + .../libraries/architecture/LifecycleExt.kt | 22 + .../libraries/architecture/NodeCallback.kt | 17 + .../libraries/architecture/NodeFactories.kt | 44 + .../libraries/architecture/NodeInputs.kt | 19 + .../android/libraries/architecture/NodeKey.kt | 18 + .../libraries/architecture/ParentNodeExt.kt | 63 + .../libraries/architecture/Presenter.kt | 16 + .../animation/ScreenTransition.kt | 23 + .../architecture/appyx/BackStackExt.kt | 17 + .../appyx/DelegateTransitionHandler.kt | 36 + .../libraries/architecture/appyx/NodeExt.kt | 35 + .../coverage/ExcludeFromCoverage.kt | 13 + .../overlay/HideOverlayBackPressHandler.kt | 30 + .../libraries/architecture/overlay/Overlay.kt | 37 + .../architecture/overlay/operation/Hide.kt | 45 + .../overlay/operation/OverlayOperation.kt | 14 + .../architecture/overlay/operation/Show.kt | 39 + .../libraries/architecture/AsyncActionTest.kt | 43 + .../libraries/architecture/AsyncDataKtTest.kt | 104 + libraries/audio/api/build.gradle.kts | 14 + .../android/libraries/audio/api/AudioFocus.kt | 33 + libraries/audio/impl/build.gradle.kts | 25 + .../libraries/audio/impl/DefaultAudioFocus.kt | 106 + libraries/audio/test/build.gradle.kts | 20 + .../mediaplayer/test/FakeAudioFocus.kt | 29 + libraries/compound/build.gradle.kts | 30 + .../screenshots/Avatar Colors - Dark.png | 3 + .../screenshots/Avatar Colors - Light.png | 3 + .../screenshots/Compound Icons - Dark.png | 3 + .../screenshots/Compound Icons - Light.png | 3 + .../screenshots/Compound Icons - Rtl.png | 3 + .../Compound Semantic Colors - Dark HC.png | 3 + .../Compound Semantic Colors - Dark.png | 3 + .../Compound Semantic Colors - Light HC.png | 3 + .../Compound Semantic Colors - Light.png | 3 + .../screenshots/Compound Typography.png | 3 + .../Compound Vector Icons - Dark.png | 3 + .../Compound Vector Icons - Light.png | 3 + .../screenshots/ForcedDarkElementTheme.png | 3 + .../compound/screenshots/Legacy Colors.png | 3 + .../screenshots/Material Typography.png | 3 + .../Material3 Colors - Dark HC.png | 3 + .../screenshots/Material3 Colors - Dark.png | 3 + .../Material3 Colors - Light HC.png | 3 + .../screenshots/Material3 Colors - Light.png | 3 + .../screenshots/MaterialText Colors.png | 3 + .../screenshots/MaterialYou Theme - Dark.png | 3 + .../screenshots/MaterialYou Theme - Light.png | 3 + .../compound/src/main/assets/theme.iife.js | 38 + .../compound/annotations/CoreColorToken.kt | 17 + .../colors/SemanticColorsLightDark.kt | 25 + .../compound/previews/ColorListPreview.kt | 58 + .../android/compound/previews/ColorPreview.kt | 63 + .../compound/previews/ColorsSchemePreview.kt | 61 + .../compound/previews/CompoundIconsPreview.kt | 144 + .../previews/SemanticColorsPreview.kt | 206 ++ .../android/compound/previews/Typography.kt | 50 + .../showkase/CompoundShowkaseRootModule.kt | 15 + .../android/compound/theme/AvatarColors.kt | 94 + .../android/compound/theme/ElementTheme.kt | 168 + .../compound/theme/ForcedDarkElementTheme.kt | 60 + .../android/compound/theme/LegacyColors.kt | 28 + .../compound/theme/MaterialColorSchemeDark.kt | 53 + .../theme/MaterialColorSchemeLight.kt | 53 + .../compound/theme/MaterialTextPreview.kt | 139 + .../compound/theme/MaterialThemeColors.kt | 73 + .../element/android/compound/theme/Theme.kt | 36 + .../compound/tokens/CompoundTypography.kt | 94 + .../tokens/generated/CompoundIcons.kt | 1035 ++++++ .../tokens/generated/DO_NOT_MODIFY.txt | 1 + .../tokens/generated/SemanticColors.kt | 222 ++ .../tokens/generated/SemanticColorsDark.kt | 122 + .../tokens/generated/SemanticColorsDarkHc.kt | 122 + .../tokens/generated/SemanticColorsLight.kt | 122 + .../tokens/generated/SemanticColorsLightHc.kt | 122 + .../tokens/generated/TypographyTokens.kt | 175 + .../generated/internal/DarkColorTokens.kt | 336 ++ .../generated/internal/DarkHcColorTokens.kt | 336 ++ .../generated/internal/LightColorTokens.kt | 336 ++ .../generated/internal/LightHcColorTokens.kt | 336 ++ .../android/compound/utils/ColorUtils.kt | 18 + .../main/res/drawable/ic_compound_admin.xml | 10 + .../res/drawable/ic_compound_arrow_down.xml | 9 + .../res/drawable/ic_compound_arrow_left.xml | 10 + .../res/drawable/ic_compound_arrow_right.xml | 10 + .../res/drawable/ic_compound_arrow_up.xml | 9 + .../drawable/ic_compound_arrow_up_right.xml | 10 + .../res/drawable/ic_compound_ask_to_join.xml | 9 + .../ic_compound_ask_to_join_solid.xml | 9 + .../res/drawable/ic_compound_attachment.xml | 10 + .../main/res/drawable/ic_compound_audio.xml | 9 + .../main/res/drawable/ic_compound_block.xml | 10 + .../main/res/drawable/ic_compound_bold.xml | 9 + .../res/drawable/ic_compound_calendar.xml | 9 + .../main/res/drawable/ic_compound_chart.xml | 10 + .../main/res/drawable/ic_compound_chat.xml | 10 + .../res/drawable/ic_compound_chat_new.xml | 13 + .../res/drawable/ic_compound_chat_problem.xml | 13 + .../res/drawable/ic_compound_chat_solid.xml | 10 + .../main/res/drawable/ic_compound_check.xml | 9 + .../res/drawable/ic_compound_check_circle.xml | 9 + .../ic_compound_check_circle_solid.xml | 9 + .../res/drawable/ic_compound_chevron_down.xml | 9 + .../res/drawable/ic_compound_chevron_left.xml | 10 + .../drawable/ic_compound_chevron_right.xml | 10 + .../res/drawable/ic_compound_chevron_up.xml | 9 + .../drawable/ic_compound_chevron_up_down.xml | 9 + .../main/res/drawable/ic_compound_circle.xml | 9 + .../main/res/drawable/ic_compound_close.xml | 9 + .../main/res/drawable/ic_compound_cloud.xml | 10 + .../res/drawable/ic_compound_cloud_solid.xml | 10 + .../main/res/drawable/ic_compound_code.xml | 9 + .../res/drawable/ic_compound_collapse.xml | 10 + .../main/res/drawable/ic_compound_company.xml | 10 + .../main/res/drawable/ic_compound_compose.xml | 14 + .../res/drawable/ic_compound_computer.xml | 9 + .../main/res/drawable/ic_compound_copy.xml | 13 + .../res/drawable/ic_compound_dark_mode.xml | 11 + .../main/res/drawable/ic_compound_delete.xml | 9 + .../main/res/drawable/ic_compound_devices.xml | 10 + .../res/drawable/ic_compound_dial_pad.xml | 9 + .../res/drawable/ic_compound_document.xml | 10 + .../res/drawable/ic_compound_download.xml | 9 + .../res/drawable/ic_compound_download_ios.xml | 12 + .../res/drawable/ic_compound_drag_grid.xml | 9 + .../res/drawable/ic_compound_drag_list.xml | 9 + .../res/drawable/ic_compound_earpiece.xml | 13 + .../main/res/drawable/ic_compound_edit.xml | 11 + .../res/drawable/ic_compound_edit_solid.xml | 11 + .../main/res/drawable/ic_compound_email.xml | 9 + .../res/drawable/ic_compound_email_solid.xml | 9 + .../res/drawable/ic_compound_end_call.xml | 9 + .../main/res/drawable/ic_compound_error.xml | 9 + .../res/drawable/ic_compound_error_solid.xml | 9 + .../main/res/drawable/ic_compound_expand.xml | 10 + .../main/res/drawable/ic_compound_explore.xml | 9 + .../drawable/ic_compound_export_archive.xml | 9 + .../res/drawable/ic_compound_extensions.xml | 10 + .../drawable/ic_compound_extensions_solid.xml | 10 + .../res/drawable/ic_compound_favourite.xml | 9 + .../drawable/ic_compound_favourite_solid.xml | 9 + .../res/drawable/ic_compound_file_error.xml | 13 + .../main/res/drawable/ic_compound_files.xml | 10 + .../main/res/drawable/ic_compound_filter.xml | 9 + .../main/res/drawable/ic_compound_forward.xml | 10 + .../main/res/drawable/ic_compound_grid.xml | 9 + .../main/res/drawable/ic_compound_group.xml | 9 + .../main/res/drawable/ic_compound_guest.xml | 13 + .../ic_compound_headphones_off_solid.xml | 9 + .../drawable/ic_compound_headphones_solid.xml | 9 + .../main/res/drawable/ic_compound_help.xml | 12 + .../res/drawable/ic_compound_help_solid.xml | 9 + .../main/res/drawable/ic_compound_history.xml | 13 + .../main/res/drawable/ic_compound_home.xml | 10 + .../res/drawable/ic_compound_home_solid.xml | 9 + .../main/res/drawable/ic_compound_host.xml | 14 + .../main/res/drawable/ic_compound_image.xml | 13 + .../res/drawable/ic_compound_image_error.xml | 13 + .../drawable/ic_compound_indent_decrease.xml | 10 + .../drawable/ic_compound_indent_increase.xml | 10 + .../main/res/drawable/ic_compound_info.xml | 13 + .../res/drawable/ic_compound_info_solid.xml | 9 + .../res/drawable/ic_compound_inline_code.xml | 9 + .../main/res/drawable/ic_compound_italic.xml | 10 + .../src/main/res/drawable/ic_compound_key.xml | 10 + .../main/res/drawable/ic_compound_key_off.xml | 13 + .../drawable/ic_compound_key_off_solid.xml | 10 + .../res/drawable/ic_compound_key_solid.xml | 10 + .../res/drawable/ic_compound_keyboard.xml | 13 + .../main/res/drawable/ic_compound_labs.xml | 16 + .../main/res/drawable/ic_compound_leave.xml | 13 + .../main/res/drawable/ic_compound_link.xml | 10 + .../main/res/drawable/ic_compound_linux.xml | 19 + .../drawable/ic_compound_list_bulleted.xml | 10 + .../drawable/ic_compound_list_numbered.xml | 9 + .../res/drawable/ic_compound_list_view.xml | 16 + .../ic_compound_location_navigator.xml | 9 + ...ic_compound_location_navigator_centred.xml | 9 + .../res/drawable/ic_compound_location_pin.xml | 9 + .../ic_compound_location_pin_solid.xml | 9 + .../main/res/drawable/ic_compound_lock.xml | 9 + .../res/drawable/ic_compound_lock_off.xml | 10 + .../res/drawable/ic_compound_lock_solid.xml | 9 + .../src/main/res/drawable/ic_compound_mac.xml | 10 + .../res/drawable/ic_compound_mark_as_read.xml | 9 + .../drawable/ic_compound_mark_as_unread.xml | 14 + .../ic_compound_mark_threads_as_read.xml | 10 + .../ic_compound_marker_read_receipts.xml | 13 + .../main/res/drawable/ic_compound_mention.xml | 9 + .../main/res/drawable/ic_compound_menu.xml | 9 + .../main/res/drawable/ic_compound_mic_off.xml | 14 + .../drawable/ic_compound_mic_off_solid.xml | 10 + .../main/res/drawable/ic_compound_mic_on.xml | 13 + .../res/drawable/ic_compound_mic_on_solid.xml | 12 + .../main/res/drawable/ic_compound_minus.xml | 9 + .../main/res/drawable/ic_compound_mobile.xml | 9 + .../drawable/ic_compound_notifications.xml | 9 + .../ic_compound_notifications_off.xml | 13 + .../ic_compound_notifications_off_solid.xml | 13 + .../ic_compound_notifications_solid.xml | 9 + .../main/res/drawable/ic_compound_offline.xml | 10 + .../ic_compound_overflow_horizontal.xml | 9 + .../ic_compound_overflow_vertical.xml | 9 + .../main/res/drawable/ic_compound_pause.xml | 9 + .../res/drawable/ic_compound_pause_solid.xml | 9 + .../src/main/res/drawable/ic_compound_pin.xml | 10 + .../res/drawable/ic_compound_pin_solid.xml | 9 + .../main/res/drawable/ic_compound_play.xml | 10 + .../res/drawable/ic_compound_play_solid.xml | 10 + .../main/res/drawable/ic_compound_plus.xml | 9 + .../main/res/drawable/ic_compound_polls.xml | 10 + .../res/drawable/ic_compound_polls_end.xml | 13 + .../main/res/drawable/ic_compound_pop_out.xml | 13 + .../res/drawable/ic_compound_preferences.xml | 10 + .../ic_compound_presence_outline_8_x_8.xml | 14 + .../ic_compound_presence_solid_8_x_8.xml | 13 + ..._compound_presence_strikethrough_8_x_8.xml | 14 + .../main/res/drawable/ic_compound_public.xml | 9 + .../main/res/drawable/ic_compound_qr_code.xml | 17 + .../main/res/drawable/ic_compound_quote.xml | 10 + .../ic_compound_raised_hand_solid.xml | 9 + .../res/drawable/ic_compound_reaction.xml | 12 + .../res/drawable/ic_compound_reaction_add.xml | 13 + .../drawable/ic_compound_reaction_solid.xml | 10 + .../main/res/drawable/ic_compound_reply.xml | 10 + .../main/res/drawable/ic_compound_restart.xml | 10 + .../main/res/drawable/ic_compound_room.xml | 10 + .../main/res/drawable/ic_compound_search.xml | 10 + .../main/res/drawable/ic_compound_send.xml | 11 + .../res/drawable/ic_compound_send_solid.xml | 10 + .../res/drawable/ic_compound_settings.xml | 12 + .../drawable/ic_compound_settings_solid.xml | 9 + .../main/res/drawable/ic_compound_share.xml | 9 + .../drawable/ic_compound_share_android.xml | 10 + .../res/drawable/ic_compound_share_ios.xml | 12 + .../res/drawable/ic_compound_share_screen.xml | 12 + .../ic_compound_share_screen_solid.xml | 9 + .../main/res/drawable/ic_compound_shield.xml | 10 + .../main/res/drawable/ic_compound_sidebar.xml | 11 + .../res/drawable/ic_compound_sign_out.xml | 10 + .../main/res/drawable/ic_compound_spinner.xml | 11 + .../res/drawable/ic_compound_spotlight.xml | 10 + .../drawable/ic_compound_spotlight_view.xml | 10 + .../drawable/ic_compound_strikethrough.xml | 9 + .../ic_compound_switch_camera_solid.xml | 13 + .../res/drawable/ic_compound_take_photo.xml | 9 + .../drawable/ic_compound_take_photo_solid.xml | 10 + .../drawable/ic_compound_text_formatting.xml | 9 + .../main/res/drawable/ic_compound_threads.xml | 13 + .../drawable/ic_compound_threads_solid.xml | 10 + .../main/res/drawable/ic_compound_time.xml | 13 + .../res/drawable/ic_compound_underline.xml | 9 + .../main/res/drawable/ic_compound_unknown.xml | 13 + .../drawable/ic_compound_unknown_solid.xml | 10 + .../main/res/drawable/ic_compound_unpin.xml | 14 + .../main/res/drawable/ic_compound_user.xml | 9 + .../res/drawable/ic_compound_user_add.xml | 10 + .../drawable/ic_compound_user_add_solid.xml | 10 + .../res/drawable/ic_compound_user_profile.xml | 15 + .../ic_compound_user_profile_solid.xml | 12 + .../res/drawable/ic_compound_user_solid.xml | 9 + .../res/drawable/ic_compound_verified.xml | 9 + .../res/drawable/ic_compound_video_call.xml | 10 + .../ic_compound_video_call_declined_solid.xml | 10 + .../ic_compound_video_call_missed_solid.xml | 10 + .../drawable/ic_compound_video_call_off.xml | 10 + .../ic_compound_video_call_off_solid.xml | 10 + .../drawable/ic_compound_video_call_solid.xml | 10 + .../drawable/ic_compound_visibility_off.xml | 10 + .../drawable/ic_compound_visibility_on.xml | 9 + .../res/drawable/ic_compound_voice_call.xml | 15 + .../drawable/ic_compound_voice_call_solid.xml | 10 + .../res/drawable/ic_compound_volume_off.xml | 10 + .../drawable/ic_compound_volume_off_solid.xml | 10 + .../res/drawable/ic_compound_volume_on.xml | 13 + .../drawable/ic_compound_volume_on_solid.xml | 13 + .../main/res/drawable/ic_compound_warning.xml | 13 + .../res/drawable/ic_compound_web_browser.xml | 9 + .../main/res/drawable/ic_compound_windows.xml | 9 + .../res/drawable/ic_compound_workspace.xml | 9 + .../drawable/ic_compound_workspace_solid.xml | 9 + .../compound/screenshot/AvatarColorsTest.kt | 34 + .../compound/screenshot/CompoundIconTest.kt | 67 + .../screenshot/CompoundTypographyTest.kt | 66 + .../screenshot/ForcedDarkElementThemeTest.kt | 61 + .../compound/screenshot/LegacyColorsTest.kt | 73 + .../screenshot/MaterialColorSchemeTest.kt | 97 + .../compound/screenshot/MaterialTextTest.kt | 30 + .../screenshot/MaterialTypographyTest.kt | 30 + .../screenshot/MaterialYouThemeTest.kt | 69 + .../compound/screenshot/SemanticColorsTest.kt | 45 + .../screenshot/utils/ScreenshotUtils.kt | 19 + .../android/compound/theme/ThemeTest.kt | 75 + libraries/core/build.gradle.kts | 29 + .../android/libraries/core/bool/Booleans.kt | 13 + .../libraries/core/cache/CircularCache.kt | 32 + .../libraries/core/coroutine/ChildScopeOf.kt | 33 + .../core/coroutine/CoroutineDispatchers.kt | 26 + .../core/coroutine/DerivedStateFlow.kt | 48 + .../libraries/core/coroutine/ErrorFlow.kt | 14 + .../android/libraries/core/coroutine/Flow.kt | 32 + .../libraries/core/coroutine/ParallelMap.kt | 18 + .../libraries/core/coroutine/Suspend.kt | 22 + .../libraries/core/coroutine/SuspendLazy.kt | 26 + .../android/libraries/core/data/ByteSize.kt | 27 + .../android/libraries/core/data/FilterUpTo.kt | 31 + .../android/libraries/core/data/Try.kt | 27 + .../core/extensions/BasicExtensions.kt | 120 + .../libraries/core/extensions/BuildMeta.kt | 20 + .../libraries/core/extensions/Result.kt | 106 + .../android/libraries/core/hash/Hash.kt | 27 + .../libraries/core/log/logger/LoggerTag.kt | 26 + .../android/libraries/core/meta/BuildMeta.kt | 26 + .../android/libraries/core/meta/BuildType.kt | 15 + .../libraries/core/mimetype/MimeTypes.kt | 66 + .../libraries/core/preview/PreviewUtil.kt | 17 + .../android/libraries/core/uri/UrlUtils.kt | 39 + .../libraries/core/cache/CircularCacheTest.kt | 63 + .../libraries/core/data/ByteSizeTest.kt | 49 + .../core/extensions/BasicExtensionsTest.kt | 77 + .../libraries/core/extensions/ResultTest.kt | 59 + libraries/cryptography/api/build.gradle.kts | 15 + .../cryptography/api/AESEncryptionSpecs.kt | 19 + .../api/EncryptionDecryptionService.kt | 22 + .../cryptography/api/EncryptionResult.kt | 51 + .../cryptography/api/SecretKeyRepository.kt | 30 + libraries/cryptography/impl/build.gradle.kts | 27 + .../impl/AESEncryptionDecryptionService.kt | 48 + .../cryptography/impl/CryptographyModule.kt | 28 + .../impl/KeyStoreSecretKeyRepository.kt | 62 + .../AESEncryptionDecryptionServiceTest.kt | 44 + libraries/cryptography/test/build.gradle.kts | 19 + .../test/SimpleSecretKeyRepository.kt | 34 + libraries/dateformatter/api/.gitignore | 1 + libraries/dateformatter/api/build.gradle.kts | 21 + .../dateformatter/api/consumer-rules.pro | 0 .../dateformatter/api/DateFormatter.kt | 57 + .../dateformatter/api/DurationFormatter.kt | 44 + .../api/DurationFormatterTest.kt | 44 + libraries/dateformatter/impl/.gitignore | 1 + libraries/dateformatter/impl/build.gradle.kts | 49 + .../dateformatter/impl/consumer-rules.pro | 0 .../dateformatter/impl/DateFormatterDay.kt | 57 + .../dateformatter/impl/DateFormatterFull.kt | 40 + .../dateformatter/impl/DateFormatterMonth.kt | 34 + .../dateformatter/impl/DateFormatterTime.kt | 38 + .../impl/DateFormatterTimeOnly.kt | 24 + .../dateformatter/impl/DateFormatters.kt | 95 + .../dateformatter/impl/DateTimeFormatters.kt | 55 + .../impl/DefaultDateFormatter.kt | 48 + .../impl/LocalDateTimeProvider.kt | 31 + .../impl/LocaleChangeObserver.kt | 56 + .../dateformatter/impl/TimezoneProvider.kt | 15 + .../impl/di/DateFormatterModule.kt | 31 + .../impl/previews/DateForPreview.kt | 54 + .../previews/DateFormatterModeProvider.kt | 17 + .../previews/DateFormatterModeViewPreview.kt | 125 + .../dateformatter/impl/previews/Factory.kt | 67 + .../impl/previews/PreviewClock.kt | 22 + .../impl/previews/PreviewStringProvider.kt | 30 + .../src/main/res/values-bg/translations.xml | 4 + .../src/main/res/values-cs/translations.xml | 5 + .../src/main/res/values-cy/translations.xml | 5 + .../src/main/res/values-da/translations.xml | 5 + .../src/main/res/values-de/translations.xml | 5 + .../src/main/res/values-el/translations.xml | 5 + .../src/main/res/values-es/translations.xml | 5 + .../src/main/res/values-et/translations.xml | 5 + .../src/main/res/values-eu/translations.xml | 4 + .../src/main/res/values-fa/translations.xml | 5 + .../src/main/res/values-fi/translations.xml | 5 + .../src/main/res/values-fr/translations.xml | 5 + .../src/main/res/values-hu/translations.xml | 5 + .../src/main/res/values-in/translations.xml | 5 + .../src/main/res/values-it/translations.xml | 5 + .../src/main/res/values-ko/translations.xml | 5 + .../src/main/res/values-nb/translations.xml | 5 + .../src/main/res/values-pl/translations.xml | 5 + .../main/res/values-pt-rBR/translations.xml | 5 + .../src/main/res/values-pt/translations.xml | 5 + .../src/main/res/values-ro/translations.xml | 5 + .../src/main/res/values-ru/translations.xml | 5 + .../src/main/res/values-sk/translations.xml | 5 + .../src/main/res/values-sv/translations.xml | 5 + .../src/main/res/values-tr/translations.xml | 5 + .../src/main/res/values-uk/translations.xml | 5 + .../src/main/res/values-uz/translations.xml | 5 + .../main/res/values-zh-rTW/translations.xml | 5 + .../src/main/res/values-zh/translations.xml | 5 + .../impl/src/main/res/values/localazy.xml | 5 + .../impl/DefaultDateFormatterFrTest.kt | 262 ++ .../impl/DefaultDateFormatterTest.kt | 262 ++ .../libraries/dateformatter/impl/Factory.kt | 55 + .../libraries/dateformatter/impl/FakeClock.kt | 22 + libraries/dateformatter/test/.gitignore | 1 + libraries/dateformatter/test/build.gradle.kts | 20 + .../dateformatter/test/consumer-rules.pro | 0 .../dateformatter/test/FakeDateFormatter.kt | 26 + libraries/deeplink/api/build.gradle.kts | 18 + .../libraries/deeplink/api/DeepLinkCreator.kt | 18 + .../libraries/deeplink/api/DeeplinkData.kt | 25 + .../libraries/deeplink/api/DeeplinkParser.kt | 15 + .../api/usecase/InviteFriendsUseCase.kt | 15 + libraries/deeplink/impl/build.gradle.kts | 35 + .../libraries/deeplink/impl/Constants.kt | 12 + .../deeplink/impl/DefaultDeepLinkCreator.kt | 40 + .../deeplink/impl/DefaultDeeplinkParser.kt | 47 + .../usecase/DefaultInviteFriendsUseCase.kt | 49 + .../impl/DefaultDeepLinkCreatorTest.kt | 33 + .../impl/DefaultDeeplinkParserTest.kt | 80 + libraries/designsystem/.gitignore | 1 + libraries/designsystem/build.gradle.kts | 49 + libraries/designsystem/consumer-rules.pro | 23 + .../libraries/designsystem/ColorUtil.kt | 49 + .../designsystem/animation/AlphaAnimation.kt | 41 + .../designsystem/atomic/atoms/BetaLabel.kt | 52 + .../designsystem/atomic/atoms/CounterAtom.kt | 99 + .../atomic/atoms/ElementLogoAtom.kt | 177 + .../atomic/atoms/MatrixBadgeAtom.kt | 111 + .../atomic/atoms/PlaceholderAtom.kt | 54 + .../atomic/atoms/RedIndicatorAtom.kt | 48 + .../atoms/RoomPreviewDescriptionAtom.kt | 33 + .../atomic/atoms/RoomPreviewSubtitleAtom.kt | 26 + .../atomic/atoms/RoomPreviewTitleAtom.kt | 32 + .../atomic/atoms/RoundedIconAtom.kt | 109 + .../atomic/atoms/SelectedIndicatorAtom.kt | 82 + .../atomic/atoms/UnreadIndicatorAtom.kt | 51 + .../atomic/molecules/ButtonColumnMolecule.kt | 48 + .../atomic/molecules/ButtonRowMolecule.kt | 45 + .../atomic/molecules/ComposerAlertMolecule.kt | 151 + .../ComposerAlertMoleculeParamsProvider.kt | 37 + .../IconTitlePlaceholdersRowMolecule.kt | 63 + .../molecules/IconTitleSubtitleMolecule.kt | 96 + .../atomic/molecules/InfoListItemMolecule.kt | 104 + .../molecules/InviteButtonsRowMolecule.kt | 47 + .../molecules/MatrixBadgeRowMolecule.kt | 34 + .../atomic/molecules/MembersCountMolecule.kt | 64 + .../atomic/molecules/NumberedListMolecule.kt | 59 + .../atomic/molecules/TextWithLabelMolecule.kt | 52 + .../atomic/organisms/InfoListOrganism.kt | 117 + .../atomic/organisms/NumberedListOrganism.kt | 34 + .../atomic/organisms/RoomPreviewOrganism.kt | 47 + .../designsystem/atomic/pages/FlowStepPage.kt | 115 + .../atomic/pages/HeaderFooterPage.kt | 214 ++ .../atomic/pages/OnBoardingPage.kt | 114 + .../designsystem/atomic/pages/SunsetPage.kt | 155 + .../background/LightGradientBackground.kt | 55 + .../background/OnboardingBackground.kt | 84 + .../colors/AvatarColorsProvider.kt | 26 + .../libraries/designsystem/colors/Gradient.kt | 45 + .../designsystem/components/Announcement.kt | 212 ++ .../designsystem/components/Badge.kt | 83 + .../designsystem/components/BigIcon.kt | 204 ++ .../components/ClickableLinkText.kt | 183 + .../components/EqualWidthColumn.kt | 50 + .../components/ExpandableBottomSheetLayout.kt | 293 ++ .../ExpandableBottomSheetLayoutState.kt | 63 + .../components/LabelledCheckbox.kt | 55 + .../designsystem/components/PinIcon.kt | 48 + .../designsystem/components/ProgressDialog.kt | 197 ++ .../components/SimpleModalBottomSheet.kt | 68 + .../TopAppBarScrollBehaviorLayout.kt | 55 + .../components/async/AsyncActionProvider.kt | 23 + .../components/async/AsyncActionView.kt | 100 + .../components/async/AsyncFailure.kt | 57 + .../components/async/AsyncIndicator.kt | 109 + .../components/async/AsyncIndicatorHost.kt | 144 + .../components/async/AsyncIndicatorView.kt | 82 + .../components/async/AsyncLoading.kt | 38 + .../designsystem/components/avatar/Avatar.kt | 119 + .../components/avatar/AvatarData.kt | 68 + .../components/avatar/AvatarDataProvider.kt | 22 + .../components/avatar/AvatarRow.kt | 174 + .../components/avatar/AvatarShape.kt | 33 + .../components/avatar/AvatarSize.kt | 79 + .../components/avatar/AvatarType.kt | 27 + .../components/avatar/DmAvatars.kt | 140 + .../avatar/internal/AvatarCluster.kt | 150 + .../components/avatar/internal/ImageAvatar.kt | 69 + .../avatar/internal/InitialLetterAvatar.kt | 35 + .../avatar/internal/InitialOrImageAvatar.kt | 42 + .../avatar/internal/OverlapRatioProvider.kt | 21 + .../components/avatar/internal/RoomAvatar.kt | 59 + .../components/avatar/internal/SpaceAvatar.kt | 76 + .../components/avatar/internal/TextAvatar.kt | 95 + .../avatar/internal/TombstonedRoomAvatar.kt | 51 + .../components/avatar/internal/UserAvatar.kt | 34 + .../avatar/internal/UserAvatarPreview.kt | 48 + .../components/blurhash/BlurHashAsyncImage.kt | 58 + .../blurhash/BlurHashBackgroundModifier.kt | 25 + .../components/blurhash/BlurHashImage.kt | 50 + .../components/button/BackButton.kt | 49 + .../components/button/ButtonVisuals.kt | 46 + .../button/GradientFloatingActionButton.kt | 135 + .../components/button/MainActionButton.kt | 107 + .../components/button/SuperButton.kt | 187 + .../components/dialogs/AlertDialog.kt | 84 + .../components/dialogs/ConfirmationDialog.kt | 114 + .../components/dialogs/ErrorDialog.kt | 91 + .../dialogs/ErrorDialogWithDoNotShowAgain.kt | 82 + .../components/dialogs/ListDialog.kt | 152 + .../components/dialogs/ListOption.kt | 25 + .../dialogs/MultipleSelectionDialog.kt | 160 + .../components/dialogs/RetryDialog.kt | 95 + .../components/dialogs/SaveChangesDialog.kt | 40 + .../dialogs/SingleSelectionDialog.kt | 138 + .../components/dialogs/TextFieldDialog.kt | 142 + .../components/form/TextFieldLocalState.kt | 18 + .../components/list/CheckboxListItem.kt | 43 + .../components/list/ListItemContent.kt | 139 + .../list/MultipleSelectionListItem.kt | 151 + .../components/list/RadioButtonListItem.kt | 43 + .../list/SingleSelectionListItem.kt | 166 + .../components/list/SwitchListItem.kt | 41 + .../components/list/TextFieldListItem.kt | 113 + .../media/DrawScopeWaveformExtensions.kt | 48 + .../components/media/WaveFormSamples.kt | 30 + .../components/media/WaveformPlaybackView.kt | 220 ++ .../preferences/PreferenceCategory.kt | 65 + .../preferences/PreferenceCheckbox.kt | 119 + .../preferences/PreferenceDivider.kt | 29 + .../preferences/PreferenceDropdown.kt | 210 ++ .../components/preferences/PreferencePage.kt | 130 + .../components/preferences/PreferenceRow.kt | 50 + .../components/preferences/PreferenceSlide.kt | 94 + .../preferences/PreferenceSwitch.kt | 98 + .../preferences/PreferenceTextField.kt | 68 + .../components/ImageVectorProvider.kt | 22 + .../preferences/components/PreferenceIcon.kt | 106 + .../tooltip/ElementTooltipDefaults.kt | 81 + .../components/tooltip/PlainTooltip.kt | 35 + .../components/tooltip/TooltipBox.kt | 37 + .../designsystem/icons/CompoundDrawables.kt | 11 + .../libraries/designsystem/icons/IconsList.kt | 20 + .../designsystem/icons/IconsPreview.kt | 87 + .../designsystem/modifiers/ApplyIf.kt | 24 + .../libraries/designsystem/modifiers/Blur.kt | 92 + .../designsystem/modifiers/ClearFocusOnTap.kt | 20 + .../designsystem/modifiers/Clickable.kt | 32 + .../designsystem/modifiers/CornerBorder.kt | 66 + .../designsystem/modifiers/FadingEdge.kt | 49 + .../designsystem/modifiers/Gradient.kt | 62 + .../designsystem/modifiers/Keyboard.kt | 43 + .../modifiers/OnTabOrEnterKeyFocusNext.kt | 29 + .../modifiers/RoundedBackground.kt | 32 + .../modifiers/SquareSizeModifier.kt | 180 + .../designsystem/preview/ElementPreview.kt | 50 + .../preview/ElementPreviewDark.kt | 23 + .../preview/ElementPreviewLight.kt | 23 + .../preview/ElementThemedPreview.kt | 74 + .../designsystem/preview/PreviewGroup.kt | 33 + .../preview/PreviewWithLargeHeight.kt | 18 + .../designsystem/preview/PreviewsDayNight.kt | 46 + .../designsystem/preview/SheetState.kt | 23 + .../designsystem/preview/WithFontScale.kt | 30 + .../designsystem/ruler/HorizontalRuler.kt | 63 + .../designsystem/ruler/VerticalRuler.kt | 63 + .../designsystem/ruler/WithRulers.kt | 67 + .../DesignSystemShowkaseRootModule.kt | 15 + .../swipe/SwipeableActionsState.kt | 68 + .../designsystem/text/AnnotatedStrings.kt | 105 + .../libraries/designsystem/text/DpScale.kt | 121 + .../designsystem/text/TextSyleToTypeface.kt | 34 + .../designsystem/text/UnitConverters.kt | 52 + .../designsystem/theme/ColorAliases.kt | 96 + .../designsystem/theme/ElementThemeApp.kt | 85 + .../designsystem/theme/ElementTypography.kt | 23 + .../designsystem/theme/TypographyAliases.kt | 22 + .../theme/components/AlertDialogContent.kt | 553 +++ .../theme/components/BottomSheetDragHandle.kt | 67 + .../theme/components/BottomSheetScaffold.kt | 65 + .../designsystem/theme/components/Button.kt | 557 +++ .../designsystem/theme/components/Checkbox.kt | 117 + .../components/CircularProgressIndicator.kt | 86 + .../theme/components/DropdownMenu.kt | 50 + .../theme/components/DropdownMenuItem.kt | 106 + .../theme/components/FilledTextField.kt | 203 ++ .../theme/components/FloatingActionButton.kt | 61 + .../theme/components/HorizontalDivider.kt | 47 + .../designsystem/theme/components/Icon.kt | 166 + .../theme/components/IconButton.kt | 76 + .../theme/components/IconColorButton.kt | 112 + .../theme/components/IconToggleButton.kt | 76 + .../components/LinearProgressIndicator.kt | 86 + .../designsystem/theme/components/ListItem.kt | 610 ++++ .../theme/components/ListSectionHeader.kt | 119 + .../theme/components/ListSupportingText.kt | 189 + .../theme/components/MediumTopAppBar.kt | 71 + .../theme/components/ModalBottomSheet.kt | 124 + .../theme/components/NavigationBar.kt | 112 + .../theme/components/NavigationBarIcon.kt | 39 + .../theme/components/NavigationBarItem.kt | 55 + .../theme/components/NavigationBarText.kt | 25 + .../theme/components/RadioButton.kt | 75 + .../designsystem/theme/components/Scaffold.kt | 46 + .../theme/components/SearchBar.kt | 309 ++ .../theme/components/SearchField.kt | 224 ++ .../theme/components/SegmentedButton.kt | 62 + .../designsystem/theme/components/Slider.kt | 134 + .../designsystem/theme/components/Snackbar.kt | 142 + .../designsystem/theme/components/Surface.kt | 55 + .../designsystem/theme/components/Switch.kt | 84 + .../designsystem/theme/components/Text.kt | 154 + .../theme/components/TextField.kt | 337 ++ .../theme/components/TopAppBar.kt | 143 + .../components/previews/DatePickerPreview.kt | 57 + .../theme/components/previews/MenuPreview.kt | 64 + .../components/previews/TimePickerPreview.kt | 93 + .../designsystem/utils/AnnotatedString.kt | 28 + .../designsystem/utils/BooleanProvider.kt | 16 + .../designsystem/utils/CommonDrawables.kt | 13 + .../designsystem/utils/DelayedVisibility.kt | 47 + .../libraries/designsystem/utils/DrawScope.kt | 23 + .../designsystem/utils/Extensions.kt | 13 + .../designsystem/utils/ForceOrientation.kt | 32 + .../utils/ForceOrientationInMobileDevices.kt | 26 + .../utils/HideKeyboardWhenDisposed.kt | 23 + .../designsystem/utils/KeepScreenOn.kt | 28 + .../designsystem/utils/LazyListState.kt | 75 + .../designsystem/utils/LocalUiTestMode.kt | 16 + .../designsystem/utils/OnLifecycleEvent.kt | 35 + .../designsystem/utils/OpenUrlInTabView.kt | 30 + .../utils/WindowInsetsExtension.kt | 33 + .../utils/snackbar/SnackbarDispatcher.kt | 96 + .../utils/snackbar/SnackbarHost.kt | 39 + .../utils/snackbar/SnackbarMessage.kt | 32 + .../drawable-night-xxhdpi/element_logo.png | Bin 0 -> 72919 bytes .../main/res/drawable-night/bg_migration.png | Bin 0 -> 336418 bytes .../main/res/drawable-night/onboarding_bg.png | Bin 0 -> 413555 bytes .../src/main/res/drawable-night/pin.xml | 19 + .../main/res/drawable-xxhdpi/element_logo.png | Bin 0 -> 72689 bytes .../src/main/res/drawable/bg_migration.png | Bin 0 -> 95397 bytes .../src/main/res/drawable/ic_notification.xml | 7 + .../src/main/res/drawable/ic_stop.xml | 9 + .../src/main/res/drawable/ic_winner.xml | 19 + .../src/main/res/drawable/onboarding_bg.png | Bin 0 -> 233286 bytes .../src/main/res/drawable/pin.xml | 19 + .../src/main/res/drawable/sample_avatar.xml | 52 + .../main/res/drawable/sample_background.webp | Bin 0 -> 24990 bytes .../designsystem/colors/AvatarColorsTest.kt | 34 + .../component/async/AsyncIndicatorTest.kt | 272 ++ .../components/avatar/AvatarDataTest.kt | 44 + .../utils/snackbar/SnackbarDispatcherTest.kt | 81 + libraries/di/.gitignore | 1 + libraries/di/build.gradle.kts | 16 + .../android/libraries/di/BaseDirectory.kt | 28 + .../android/libraries/di/CacheDirectory.kt | 28 + .../di/DependencyInjectionGraphOwner.kt | 18 + .../element/android/libraries/di/RoomScope.kt | 11 + .../android/libraries/di/SessionScope.kt | 11 + .../di/annotations/AppCoroutineScope.kt | 19 + .../di/annotations/ApplicationContext.kt | 19 + .../di/annotations/RoomCoroutineScope.kt | 19 + .../di/annotations/SessionCoroutineScope.kt | 19 + libraries/encrypted-db/build.gradle.kts | 30 + .../encrypted-db/consumer-proguard-rules.pro | 21 + .../encrypteddb/SqlCipherDriverFactory.kt | 38 + .../encrypteddb/crypto/EncryptedFile.kt | 83 + .../crypto/EncryptedFileInputStream.kt | 54 + .../crypto/EncryptedFileOutputStream.kt | 33 + .../passphrase/PassphraseProvider.kt | 19 + .../RandomSecretPassphraseProvider.kt | 43 + libraries/eventformatter/api/build.gradle.kts | 19 + .../api/PinnedMessagesBannerFormatter.kt | 15 + .../api/RoomLatestEventFormatter.kt | 16 + .../api/TimelineEventFormatter.kt | 26 + .../eventformatter/impl/build.gradle.kts | 40 + .../DefaultPinnedMessagesBannerFormatter.kt | 115 + .../impl/DefaultRoomLatestEventFormatter.kt | 188 + .../impl/DefaultTimelineEventFormatter.kt | 80 + .../eventformatter/impl/PrefixWith.kt | 25 + .../impl/ProfileChangeContentFormatter.kt | 70 + .../impl/RoomMembershipContentFormatter.kt | 137 + .../impl/StateContentFormatter.kt | 232 ++ .../eventformatter/impl/mode/RenderingMode.kt | 14 + .../src/main/res/values-be/translations.xml | 69 + .../src/main/res/values-bg/translations.xml | 61 + .../src/main/res/values-cs/translations.xml | 73 + .../src/main/res/values-cy/translations.xml | 73 + .../src/main/res/values-da/translations.xml | 73 + .../src/main/res/values-de/translations.xml | 73 + .../src/main/res/values-el/translations.xml | 73 + .../src/main/res/values-es/translations.xml | 73 + .../src/main/res/values-et/translations.xml | 73 + .../src/main/res/values-eu/translations.xml | 67 + .../src/main/res/values-fa/translations.xml | 69 + .../src/main/res/values-fi/translations.xml | 73 + .../src/main/res/values-fr/translations.xml | 73 + .../src/main/res/values-hu/translations.xml | 73 + .../src/main/res/values-in/translations.xml | 73 + .../src/main/res/values-it/translations.xml | 73 + .../src/main/res/values-ka/translations.xml | 63 + .../src/main/res/values-ko/translations.xml | 73 + .../src/main/res/values-lt/translations.xml | 57 + .../src/main/res/values-nb/translations.xml | 73 + .../src/main/res/values-nl/translations.xml | 69 + .../src/main/res/values-pl/translations.xml | 73 + .../main/res/values-pt-rBR/translations.xml | 73 + .../src/main/res/values-pt/translations.xml | 73 + .../src/main/res/values-ro/translations.xml | 73 + .../src/main/res/values-ru/translations.xml | 73 + .../src/main/res/values-sk/translations.xml | 73 + .../src/main/res/values-sv/translations.xml | 73 + .../src/main/res/values-tr/translations.xml | 69 + .../src/main/res/values-uk/translations.xml | 73 + .../src/main/res/values-ur/translations.xml | 69 + .../src/main/res/values-uz/translations.xml | 73 + .../main/res/values-zh-rTW/translations.xml | 73 + .../src/main/res/values-zh/translations.xml | 73 + .../impl/src/main/res/values/localazy.xml | 73 + ...efaultPinnedMessagesBannerFormatterTest.kt | 791 +++++ .../DefaultRoomLatestEventFormatterTest.kt | 944 +++++ .../eventformatter/test/build.gradle.kts | 20 + .../test/FakePinnedMessagesBannerFormatter.kt | 20 + .../test/FakeRoomLatestEventFormatter.kt | 28 + libraries/featureflag/api/build.gradle.kts | 21 + .../libraries/featureflag/api/Feature.kt | 46 + .../featureflag/api/FeatureFlagService.kt | 47 + .../libraries/featureflag/api/FeatureFlags.kt | 121 + libraries/featureflag/impl/build.gradle.kts | 36 + .../impl/DefaultFeatureFlagService.kt | 51 + .../featureflag/impl/FeatureFlagProvider.kt | 22 + .../featureflag/impl/FeaturesProvider.kt | 23 + .../impl/MutableFeatureFlagProvider.kt | 15 + .../impl/PreferencesFeatureFlagProvider.kt | 48 + .../featureflag/impl/di/FeatureFlagModule.kt | 32 + .../impl/DefaultFeatureFlagServiceTest.kt | 170 + .../impl/DefaultFeaturesProviderTest.kt | 25 + .../impl/FakeMutableFeatureFlagProvider.kt | 32 + libraries/featureflag/test/build.gradle.kts | 22 + .../libraries/featureflag/test/FakeFeature.kt | 21 + .../test/FakeFeatureFlagService.kt | 43 + libraries/featureflag/ui/build.gradle.kts | 20 + .../featureflag/ui/FeatureListView.kt | 60 + .../featureflag/ui/model/FeatureUiModel.kt | 19 + .../ui/model/FeatureUiModelProvider.kt | 19 + .../fullscreenintent/api/build.gradle.kts | 21 + .../api/FullScreenIntentPermissionsEvents.kt | 14 + .../api/FullScreenIntentPermissionsState.kt | 15 + ...ullScreenIntentPermissionsStateProvider.kt | 19 + .../fullscreenintent/impl/build.gradle.kts | 38 + .../FullScreenIntentPermissionsPresenter.kt | 98 + .../impl/di/FullScreenIntentModule.kt | 24 + ...ullScreenIntentPermissionsPresenterTest.kt | 135 + libraries/indicator/api/build.gradle.kts | 19 + .../indicator/api/IndicatorService.kt | 23 + libraries/indicator/impl/build.gradle.kts | 34 + .../indicator/impl/DefaultIndicatorService.kt | 60 + .../impl/DefaultIndicatorServiceTest.kt | 103 + libraries/indicator/test/build.gradle.kts | 20 + .../indicator/test/FakeIndicatorService.kt | 38 + libraries/maplibre-compose/build.gradle.kts | 28 + .../libraries/maplibre/compose/CameraMode.kt | 48 + .../compose/CameraMoveStartedReason.kt | 48 + .../maplibre/compose/CameraPositionState.kt | 179 + .../libraries/maplibre/compose/IconAnchor.kt | 39 + .../libraries/maplibre/compose/MapApplier.kt | 57 + .../libraries/maplibre/compose/MapLibreMap.kt | 247 ++ .../maplibre/compose/MapLibreMapComposable.kt | 30 + .../maplibre/compose/MapLocationSettings.kt | 31 + .../compose/MapSymbolManagerSettings.kt | 22 + .../maplibre/compose/MapUiSettings.kt | 32 + .../libraries/maplibre/compose/MapUpdater.kt | 153 + .../libraries/maplibre/compose/Symbol.kt | 114 + libraries/matrix/api/build.gradle.kts | 58 + .../matrix/api/src/main/AndroidManifest.xml | 12 + .../libraries/matrix/api/MatrixClient.kt | 208 ++ .../matrix/api/MatrixClientProvider.kt | 27 + .../libraries/matrix/api/SdkMetadata.kt | 13 + .../matrix/api/analytics/ViewRoomExt.kt | 32 + .../matrix/api/auth/AuthErrorCode.kt | 24 + .../api/auth/AuthenticationException.kt | 21 + .../HomeServerLoginCompatibilityChecker.kt | 20 + .../api/auth/MatrixAuthenticationService.kt | 64 + .../api/auth/MatrixHomeServerDetails.kt | 17 + .../libraries/matrix/api/auth/OidcConfig.kt | 29 + .../libraries/matrix/api/auth/OidcDetails.kt | 17 + .../libraries/matrix/api/auth/OidcPrompt.kt | 30 + .../api/auth/OidcRedirectUrlProvider.kt | 13 + .../api/auth/external/ExternalSession.kt | 20 + .../api/auth/qrlogin/MatrixQrCodeLoginData.kt | 13 + .../qrlogin/MatrixQrCodeLoginDataFactory.kt | 13 + .../api/auth/qrlogin/QrCodeDecodeException.kt | 27 + .../api/auth/qrlogin/QrCodeLoginStep.kt | 19 + .../api/auth/qrlogin/QrLoginException.kt | 24 + .../libraries/matrix/api/core/DeviceId.kt | 16 + .../libraries/matrix/api/core/EventId.kt | 25 + .../libraries/matrix/api/core/FlowId.kt | 16 + .../matrix/api/core/MatrixPatterns.kt | 176 + .../matrix/api/core/ProgressCallback.kt | 13 + .../libraries/matrix/api/core/RoomAlias.kt | 23 + .../libraries/matrix/api/core/RoomId.kt | 23 + .../matrix/api/core/RoomIdOrAlias.kt | 33 + .../libraries/matrix/api/core/SendHandle.kt | 13 + .../libraries/matrix/api/core/SessionId.kt | 14 + .../libraries/matrix/api/core/SpaceId.kt | 16 + .../libraries/matrix/api/core/ThreadId.kt | 29 + .../matrix/api/core/TransactionId.kt | 16 + .../libraries/matrix/api/core/UniqueId.kt | 16 + .../libraries/matrix/api/core/UserId.kt | 36 + .../api/createroom/CreateRoomParameters.kt | 29 + .../matrix/api/createroom/RoomPreset.kt | 14 + .../matrix/api/encryption/BackupState.kt | 27 + .../api/encryption/BackupUploadState.kt | 29 + .../api/encryption/EnableRecoveryProgress.kt | 18 + .../api/encryption/EncryptionService.kt | 130 + .../api/encryption/RecoveryException.kt | 18 + .../matrix/api/encryption/RecoveryState.kt | 24 + .../api/encryption/SteadyStateException.kt | 29 + .../api/encryption/identity/IdentityState.kt | 37 + .../identity/IdentityStateChange.kt | 16 + .../matrix/api/exception/ClientException.kt | 19 + .../matrix/api/exception/ErrorKind.kt | 458 +++ .../NotificationResolverException.kt | 29 + .../matrix/api/media/AudioDetails.kt | 17 + .../libraries/matrix/api/media/AudioInfo.kt | 17 + .../libraries/matrix/api/media/FileInfo.kt | 16 + .../libraries/matrix/api/media/ImageInfo.kt | 19 + .../matrix/api/media/MatrixMediaLoader.kt | 39 + .../libraries/matrix/api/media/MediaFile.kt | 30 + .../matrix/api/media/MediaPreviewConfig.kt | 27 + .../matrix/api/media/MediaPreviewService.kt | 36 + .../matrix/api/media/MediaPreviewValue.kt | 48 + .../libraries/matrix/api/media/MediaSource.kt | 24 + .../matrix/api/media/MediaUploadHandler.kt | 20 + .../matrix/api/media/ThumbnailInfo.kt | 16 + .../libraries/matrix/api/media/VideoInfo.kt | 22 + .../libraries/matrix/api/mxc/MxcTools.kt | 19 + .../api/notification/NotificationData.kt | 126 + .../api/notification/NotificationService.kt | 29 + .../NotificationSettingsService.kt | 38 + .../api/oidc/AccountManagementAction.kt | 18 + .../matrix/api/permalink/MatrixToConverter.kt | 25 + .../matrix/api/permalink/PermalinkBuilder.kt | 21 + .../matrix/api/permalink/PermalinkData.kt | 58 + .../matrix/api/permalink/PermalinkParser.kt | 24 + .../api/platform/InitPlatformService.kt | 22 + .../libraries/matrix/api/poll/PollAnswer.kt | 14 + .../libraries/matrix/api/poll/PollKind.kt | 19 + .../matrix/api/pusher/PushersService.kt | 14 + .../matrix/api/pusher/SetHttpPusherData.kt | 20 + .../matrix/api/pusher/UnsetHttpPusherData.kt | 14 + .../libraries/matrix/api/room/BaseRoom.kt | 261 ++ .../matrix/api/room/CreateTimelineParams.kt | 20 + .../matrix/api/room/CurrentUserMembership.kt | 17 + .../matrix/api/room/FilterRoomMembers.kt | 33 + .../matrix/api/room/ForwardEventException.kt | 17 + .../matrix/api/room/IntentionalMention.kt | 16 + .../libraries/matrix/api/room/JoinedRoom.kt | 180 + .../matrix/api/room/MessageEventType.kt | 39 + .../matrix/api/room/NotJoinedRoom.kt | 22 + .../libraries/matrix/api/room/RoomInfo.kt | 93 + .../matrix/api/room/RoomIsDmCheck.kt | 32 + .../libraries/matrix/api/room/RoomMember.kt | 104 + .../matrix/api/room/RoomMembersState.kt | 44 + .../matrix/api/room/RoomMembershipDetails.kt | 21 + .../matrix/api/room/RoomMembershipObserver.kt | 46 + .../api/room/RoomNotificationSettings.kt | 20 + .../api/room/RoomNotificationSettingsState.kt | 25 + .../libraries/matrix/api/room/RoomType.kt | 15 + .../libraries/matrix/api/room/StartDM.kt | 46 + .../matrix/api/room/StateEventType.kt | 34 + .../matrix/api/room/alias/MatrixRoomAlias.kt | 26 + .../api/room/alias/ResolvedRoomAlias.kt | 25 + .../matrix/api/room/alias/RoomAliasHelper.kt | 16 + .../matrix/api/room/draft/ComposerDraft.kt | 21 + .../api/room/draft/ComposerDraftType.kt | 17 + .../api/room/errors/FocusEventException.kt | 26 + .../api/room/history/RoomHistoryVisibility.kt | 48 + .../matrix/api/room/join/AllowRule.kt | 18 + .../matrix/api/room/join/JoinRoom.kt | 24 + .../matrix/api/room/join/JoinRule.kt | 23 + .../matrix/api/room/knock/KnockRequest.kt | 30 + .../matrix/api/room/location/AssetType.kt | 14 + .../powerlevels/MatrixRoomMembersWithRole.kt | 45 + .../api/room/powerlevels/RoomPowerLevels.kt | 60 + .../room/powerlevels/RoomPowerLevelsValues.kt | 73 + .../api/room/powerlevels/UserRoleChange.kt | 19 + .../api/room/preview/RoomPreviewInfo.kt | 38 + .../api/room/recent/RecentDirectRoom.kt | 58 + .../api/room/tombstone/PredecessorRoom.kt | 26 + .../api/room/tombstone/SuccessorRoom.kt | 31 + .../api/roomdirectory/RoomDescription.kt | 32 + .../api/roomdirectory/RoomDirectoryList.kt | 36 + .../api/roomdirectory/RoomDirectoryService.kt | 15 + .../api/roomdirectory/RoomVisibility.kt | 29 + .../matrix/api/roomlist/DynamicRoomList.kt | 71 + .../matrix/api/roomlist/LatestEventValue.kt | 31 + .../libraries/matrix/api/roomlist/RoomList.kt | 71 + .../matrix/api/roomlist/RoomListFilter.kt | 83 + .../matrix/api/roomlist/RoomListService.kt | 74 + .../matrix/api/roomlist/RoomSummary.kt | 24 + .../matrix/api/server/UserServerResolver.kt | 13 + .../matrix/api/spaces/LeaveSpaceHandle.kt | 35 + .../matrix/api/spaces/LeaveSpaceRoom.kt | 14 + .../libraries/matrix/api/spaces/SpaceRoom.kt | 43 + .../matrix/api/spaces/SpaceRoomList.kt | 31 + .../matrix/api/spaces/SpaceRoomVisibility.kt | 27 + .../matrix/api/spaces/SpaceService.kt | 21 + .../matrix/api/sync/SlidingSyncVersion.kt | 15 + .../libraries/matrix/api/sync/SyncService.kt | 30 + .../libraries/matrix/api/sync/SyncState.kt | 17 + .../matrix/api/timeline/MatrixTimelineItem.kt | 25 + .../matrix/api/timeline/ReceiptType.kt | 15 + .../libraries/matrix/api/timeline/Timeline.kt | 238 ++ .../matrix/api/timeline/TimelineException.kt | 14 + .../matrix/api/timeline/TimelineProvider.kt | 24 + .../matrix/api/timeline/item/ThreadSummary.kt | 34 + .../timeline/item/TimelineItemDebugInfo.kt | 19 + .../api/timeline/item/event/EventContent.kt | 106 + .../item/event/EventOrTransactionId.kt | 38 + .../api/timeline/item/event/EventReaction.kt | 16 + .../timeline/item/event/EventTimelineItem.kt | 60 + .../api/timeline/item/event/EventType.kt | 21 + .../api/timeline/item/event/FormattedBody.kt | 14 + .../api/timeline/item/event/InReplyTo.kt | 43 + .../item/event/LocalEventSendState.kt | 54 + .../timeline/item/event/MembershipChange.kt | 29 + .../api/timeline/item/event/MessageFormat.kt | 14 + .../api/timeline/item/event/MessageShield.kt | 46 + .../api/timeline/item/event/MessageType.kt | 106 + .../api/timeline/item/event/OtherState.kt | 44 + .../api/timeline/item/event/ProfileDetails.kt | 60 + .../api/timeline/item/event/ReactionSender.kt | 22 + .../matrix/api/timeline/item/event/Receipt.kt | 16 + .../item/event/TimelineItemEventOrigin.kt | 16 + .../api/timeline/item/event/UtdCause.kt | 41 + .../item/virtual/VirtualTimelineItem.kt | 30 + .../libraries/matrix/api/tracing/LogLevel.kt | 20 + .../matrix/api/tracing/TraceLogPack.kt | 26 + .../api/tracing/TracingConfiguration.kt | 17 + .../matrix/api/tracing/TracingService.kt | 17 + .../api/tracing/WriteToFilesConfiguration.kt | 21 + .../api/user/MatrixSearchUserResults.kt | 16 + .../libraries/matrix/api/user/MatrixUser.kt | 20 + .../verification/SessionVerificationData.kt | 29 + .../SessionVerificationRequestDetails.kt | 24 + .../SessionVerificationService.kt | 128 + .../api/verification/VerificationRequest.kt | 34 + .../widget/CallAnalyticCredentialsProvider.kt | 17 + .../api/widget/CallWidgetSettingsProvider.kt | 21 + .../matrix/api/widget/MatrixWidgetDriver.kt | 19 + .../matrix/api/widget/MatrixWidgetSettings.kt | 21 + .../matrix/api/auth/AuthErrorCodeTest.kt | 38 + .../api/auth/MatrixHomeServerDetailsTest.kt | 51 + .../matrix/api/core/MatrixPatternsTest.kt | 164 + .../api/notification/NotificationDataTest.kt | 43 + .../matrix/api/room/RoomIsDmCheckTest.kt | 54 + .../item/event/ProfileTimelineDetailsTest.kt | 66 + libraries/matrix/impl/build.gradle.kts | 54 + .../matrix/impl/src/main/AndroidManifest.xml | 12 + .../matrix/impl/ClientBuilderProvider.kt | 24 + .../matrix/impl/RustClientSessionDelegate.kt | 127 + .../libraries/matrix/impl/RustMatrixClient.kt | 769 +++++ .../matrix/impl/RustMatrixClientFactory.kt | 201 ++ .../libraries/matrix/impl/RustSdkMetadata.kt | 20 + .../matrix/impl/analytics/JoinedRoomExt.kt | 41 + .../matrix/impl/analytics/UtdTracker.kt | 52 + .../impl/auth/AuthenticationException.kt | 38 + .../matrix/impl/auth/HomeserverDetails.kt | 20 + .../impl/auth/OidcConfigurationProvider.kt | 31 + .../libraries/matrix/impl/auth/OidcPrompt.kt | 20 + ...RustHomeServerLoginCompatibilityChecker.kt | 38 + .../auth/RustMatrixAuthenticationService.kt | 358 ++ .../matrix/impl/auth/qrlogin/QrErrorMapper.kt | 50 + .../auth/qrlogin/QrLoginProgressExtensions.kt | 22 + .../qrlogin/RustQrCodeLoginDataFactory.kt | 23 + .../impl/auth/qrlogin/SdkQrCodeLoginData.kt | 20 + .../DefaultUserCertificatesProvider.kt | 77 + .../certificates/UserCertificatesProvider.kt | 13 + .../impl/core/ProgressWatcherWrapper.kt | 23 + .../matrix/impl/core/RustSendHandle.kt | 22 + .../libraries/matrix/impl/di/RoomModule.kt | 27 + .../matrix/impl/di/SessionMatrixModule.kt | 93 + .../impl/encryption/BackupStateMapper.kt | 26 + .../encryption/BackupUploadStateMapper.kt | 39 + .../EnableRecoveryProgressMapper.kt | 30 + .../impl/encryption/EncryptionExtension.kt | 41 + .../encryption/RecoveryExceptionMapper.kt | 36 + .../impl/encryption/RecoveryStateMapper.kt | 23 + .../impl/encryption/RustEncryptionService.kt | 272 ++ .../encryption/RustIdentityResetHandle.kt | 66 + .../encryption/SteadyStateExceptionMapper.kt | 28 + .../matrix/impl/exception/ClientException.kt | 29 + .../matrix/impl/exception/ErrorKind.kt | 64 + .../impl/keys/DefaultPassphraseGenerator.kt | 25 + .../matrix/impl/keys/PassphraseGenerator.kt | 17 + .../matrix/impl/mapper/IdentityState.kt | 19 + .../libraries/matrix/impl/mapper/Session.kt | 66 + .../matrix/impl/mapper/UserProfileMapper.kt | 19 + .../matrix/impl/media/AudioDetails.kt | 41 + .../libraries/matrix/impl/media/AudioInfo.kt | 26 + .../libraries/matrix/impl/media/FileInfo.kt | 26 + .../libraries/matrix/impl/media/ImageInfo.kt | 33 + .../matrix/impl/media/MediaSource.kt | 17 + .../impl/media/MediaUploadHandlerImpl.kt | 35 + .../matrix/impl/media/RustMediaFile.kt | 26 + .../matrix/impl/media/RustMediaLoader.kt | 97 + .../impl/media/RustMediaPreviewService.kt | 90 + .../matrix/impl/media/ThumbnailInfo.kt | 26 + .../libraries/matrix/impl/media/VideoInfo.kt | 36 + .../matrix/impl/mxc/DefaultMxcTools.kt | 36 + .../impl/notification/NotificationMapper.kt | 83 + .../notification/RustNotificationService.kt | 95 + ...imelineEventToNotificationContentMapper.kt | 113 + .../RoomNotificationSettingsMapper.kt | 36 + .../RustNotificationSettingsService.kt | 147 + .../impl/oidc/AccountManagementAction.kt | 21 + .../matrix/impl/paths/SessionPaths.kt | 29 + .../matrix/impl/paths/SessionPathsFactory.kt | 29 + .../permalink/DefaultMatrixToConverter.kt | 62 + .../impl/permalink/DefaultPermalinkBuilder.kt | 41 + .../impl/permalink/DefaultPermalinkParser.kt | 86 + .../impl/platform/RustInitPlatformService.kt | 26 + .../libraries/matrix/impl/poll/PollAnswer.kt | 17 + .../libraries/matrix/impl/poll/PollKind.kt | 22 + .../matrix/impl/proxy/DefaultProxyProvider.kt | 49 + .../matrix/impl/proxy/ProxyProvider.kt | 13 + .../matrix/impl/pushers/RustPushersService.kt | 66 + .../matrix/impl/room/FocusEventException.kt | 34 + .../matrix/impl/room/JoinedRustRoom.kt | 509 +++ .../libraries/matrix/impl/room/Mention.kt | 18 + .../matrix/impl/room/MessageEventType.kt | 66 + .../matrix/impl/room/NotJoinedRustRoom.kt | 35 + .../matrix/impl/room/RoomContentForwarder.kt | 73 + .../libraries/matrix/impl/room/RoomInfoExt.kt | 25 + .../matrix/impl/room/RoomInfoMapper.kt | 109 + .../matrix/impl/room/RoomSyncSubscriber.kt | 63 + .../libraries/matrix/impl/room/RoomType.kt | 20 + .../matrix/impl/room/RustBaseRoom.kt | 334 ++ .../matrix/impl/room/RustRoomFactory.kt | 209 ++ .../matrix/impl/room/StateEventType.kt | 62 + .../room/TimelineEventTypeFilterFactory.kt | 30 + .../impl/room/alias/DefaultRoomAliasHelper.kt | 25 + .../impl/room/draft/ComposerDraftMapper.kt | 49 + .../history/RoomHistoryVisibilityMapper.kt | 32 + .../matrix/impl/room/join/AllowRule.kt | 27 + .../matrix/impl/room/join/DefaultJoinRoom.kt | 59 + .../matrix/impl/room/join/JoinRule.kt | 37 + .../impl/room/knock/RustKnockRequest.kt | 43 + .../matrix/impl/room/location/AssetType.kt | 16 + .../impl/room/member/RoomMemberListFetcher.kt | 134 + .../impl/room/member/RoomMemberMapper.kt | 60 + .../RoomPowerLevelsValuesMapper.kt | 35 + .../room/preview/RoomPreviewInfoMapper.kt | 34 + .../impl/room/tombstone/PredecessorRoom.kt | 17 + .../impl/room/tombstone/SuccessorRoom.kt | 20 + .../roomdirectory/RoomDescriptionMapper.kt | 41 + .../RoomDirectorySearchExtension.kt | 37 + .../RoomDirectorySearchProcessor.kt | 91 + .../roomdirectory/RoomVisibilityMapper.kt | 28 + .../roomdirectory/RustRoomDirectoryList.kt | 85 + .../roomdirectory/RustRoomDirectoryService.kt | 24 + .../impl/roomlist/RoomListDynamicEvents.kt | 17 + .../impl/roomlist/RoomListEntriesUpdateExt.kt | 52 + .../impl/roomlist/RoomListExtensions.kt | 128 + .../matrix/impl/roomlist/RoomListFactory.kt | 149 + .../matrix/impl/roomlist/RoomListFilter.kt | 72 + .../impl/roomlist/RoomSummaryFactory.kt | 51 + .../impl/roomlist/RoomSummaryListProcessor.kt | 123 + .../impl/roomlist/RustRoomListService.kt | 106 + .../impl/server/DefaultUserServerResolver.kt | 23 + .../impl/spaces/RustLeaveSpaceHandle.kt | 69 + .../matrix/impl/spaces/RustSpaceRoomList.kt | 98 + .../matrix/impl/spaces/RustSpaceService.kt | 107 + .../impl/spaces/SpaceListUpdateProcessor.kt | 85 + .../impl/spaces/SpaceRoomListExtensions.kt | 79 + .../matrix/impl/spaces/SpaceRoomMapper.kt | 41 + .../matrix/impl/sync/AppStateMapper.kt | 22 + .../matrix/impl/sync/RustSyncService.kt | 81 + .../matrix/impl/sync/SlidingSyncVersion.kt | 19 + .../matrix/impl/sync/SyncServiceExtension.kt | 28 + .../impl/timeline/EventOrTransactionId.kt | 17 + .../timeline/MatrixTimelineDiffProcessor.kt | 173 + .../impl/timeline/MatrixTimelineItemMapper.kt | 48 + .../matrix/impl/timeline/ReceiptTypeMapper.kt | 18 + .../impl/timeline/RoomTimelineExtensions.kt | 68 + .../matrix/impl/timeline/RustTimeline.kt | 618 ++++ .../impl/timeline/TimelineItemsSubscriber.kt | 65 + .../timeline/item/event/EventMessageMapper.kt | 137 + .../event/EventOrTransactionIdExtension.kt | 19 + .../item/event/EventTimelineItemMapper.kt | 201 ++ .../item/event/TimelineEventContentMapper.kt | 243 ++ .../item/virtual/VirtualTimelineItemMapper.kt | 22 + .../LastForwardIndicatorsPostProcessor.kt | 66 + .../LoadingIndicatorsPostProcessor.kt | 49 + .../RoomBeginningPostProcessor.kt | 81 + .../TypingNotificationPostProcessor.kt | 35 + .../impl/timeline/reply/InReplyToMapper.kt | 45 + .../matrix/impl/tracing/LogEventLocation.kt | 30 + .../matrix/impl/tracing/RustTracingService.kt | 64 + .../matrix/impl/tracing/RustTracingTree.kt | 71 + .../impl/tracing/TraceLogPacksMapping.kt | 23 + .../impl/usersearch/UserSearchResultMapper.kt | 25 + .../matrix/impl/util/CallbackFlow.kt | 25 + .../libraries/matrix/impl/util/Disposables.kt | 16 + .../libraries/matrix/impl/util/Error.kt | 23 + .../matrix/impl/util/MessageEventContent.kt | 28 + .../matrix/impl/util/SessionPathsProvider.kt | 23 + .../libraries/matrix/impl/util/TaskHandle.kt | 31 + .../libraries/matrix/impl/util/Token.kt | 30 + .../RustSessionVerificationService.kt | 290 ++ .../SessionVerificationRequestDetails.kt | 34 + .../DefaultCallWidgetSettingsProvider.kt | 69 + .../impl/widget/MatrixWidgetSettings.kt | 42 + .../matrix/impl/widget/RustWidgetDriver.kt | 74 + .../matrix/impl/FakeClientBuilderProvider.kt | 20 + .../impl/RustClientSessionDelegateTest.kt | 55 + .../impl/RustMatrixClientFactoryTest.kt | 60 + .../matrix/impl/RustMatrixClientTest.kt | 122 + .../matrix/impl/analytics/JoinedExtKtTest.kt | 91 + .../matrix/impl/analytics/UtdTrackerTest.kt | 240 ++ .../AuthenticationExceptionMappingTest.kt | 79 + .../impl/auth/FakePassphraseGenerator.kt | 18 + .../matrix/impl/auth/FakeProxyProvider.kt | 17 + .../impl/auth/FakeUserCertificatesProvider.kt | 17 + .../impl/auth/HomeserverDetailsKtTest.kt | 40 + .../auth/OidcConfigurationProviderTest.kt | 29 + ...HomeserverLoginCompatibilityCheckerTest.kt | 56 + .../RustMatrixAuthenticationServiceTest.kt | 75 + .../impl/auth/qrlogin/QrErrorMapperTest.kt | 38 + .../QrLoginProgressExtensionsKtTest.kt | 28 + .../auth/qrlogin/SdkQrCodeLoginDataTest.kt | 38 + .../impl/core/ProgressWatcherWrapperKtTest.kt | 34 + .../impl/encryption/BackupStateMapperTest.kt | 28 + .../encryption/BackupUploadStateMapperTest.kt | 36 + .../EnableRecoveryProgressMapperTest.kt | 33 + .../encryption/RecoveryStateMapperTest.kt | 25 + .../fixtures/factories/EventTimelineItem.kt | 58 + .../factories/EventTimelineItemContent.kt | 33 + .../factories/EventTimelineItemDebugInfo.kt | 21 + .../fixtures/factories/NotificationItem.kt | 84 + .../fixtures/factories/RoomDescription.kt | 36 + .../impl/fixtures/factories/RoomHero.kt | 23 + .../impl/fixtures/factories/RoomInfo.kt | 97 + .../impl/fixtures/factories/RoomMember.kt | 37 + .../factories/RoomNotificationSettings.kt | 20 + .../fixtures/factories/RoomPowerLevels.kt | 37 + .../fixtures/factories/RoomPreviewInfo.kt | 38 + .../fixtures/factories/SearchUsersResults.kt | 20 + .../matrix/impl/fixtures/factories/Session.kt | 31 + .../impl/fixtures/factories/SpaceRoom.kt | 52 + .../fixtures/factories/TimelineEventType.kt | 46 + .../fixtures/factories/UnableToDecryptInfo.kt | 32 + .../impl/fixtures/factories/UserProfile.kt | 22 + .../impl/fixtures/fakes/FakeFfiClient.kt | 92 + .../fixtures/fakes/FakeFfiClientBuilder.kt | 48 + .../impl/fixtures/fakes/FakeFfiEncryption.kt | 51 + .../fakes/FakeFfiHomeserverLoginDetails.kt | 24 + .../fakes/FakeFfiLazyTimelineItemProvider.kt | 25 + .../fakes/FakeFfiNotificationClient.kt | 25 + .../fakes/FakeFfiNotificationSettings.kt | 31 + .../impl/fixtures/fakes/FakeFfiQrCodeData.kt | 21 + .../matrix/impl/fixtures/fakes/FakeFfiRoom.kt | 62 + .../fakes/FakeFfiRoomDirectorySearch.kt | 38 + .../impl/fixtures/fakes/FakeFfiRoomList.kt | 14 + .../fixtures/fakes/FakeFfiRoomListService.kt | 41 + .../fakes/FakeFfiRoomMembersIterator.kt | 32 + .../fixtures/fakes/FakeFfiRoomPowerLevels.kt | 35 + .../FakeFfiSessionVerificationController.kt | 17 + .../fixtures/fakes/FakeFfiSpaceRoomList.kt | 59 + .../fixtures/fakes/FakeFfiSpaceService.kt | 14 + .../impl/fixtures/fakes/FakeFfiSyncService.kt | 25 + .../fakes/FakeFfiSyncServiceBuilder.kt | 19 + .../impl/fixtures/fakes/FakeFfiTaskHandle.kt | 17 + .../impl/fixtures/fakes/FakeFfiTimeline.kt | 45 + .../fixtures/fakes/FakeFfiTimelineEvent.kt | 26 + .../fakes/FakeFfiTimelineEventTypeFilter.kt | 14 + .../fixtures/fakes/FakeFfiTimelineItem.kt | 24 + .../keys/DefaultPassphraseGeneratorTest.kt | 24 + .../matrix/impl/mapper/SessionKtTest.kt | 117 + .../impl/mapper/UserProfileMapperTest.kt | 23 + .../matrix/impl/mxc/DefaultMxcToolsTest.kt | 31 + .../RustNotificationServiceTest.kt | 126 + .../RustNotificationSettingsServiceTest.kt | 46 + .../oidc/AccountManagementActionKtTest.kt | 29 + .../permalink/DefaultMatrixToConverterTest.kt | 60 + .../matrix/impl/poll/PollKindKtTest.kt | 40 + .../impl/pushers/RustPushersServiceTest.kt | 70 + .../FakeTimelineEventTypeFilterFactory.kt | 19 + .../impl/room/MessageEventTypeKtTest.kt | 70 + .../matrix/impl/room/RoomInfoExtTest.kt | 69 + .../matrix/impl/room/RoomInfoMapperTest.kt | 235 ++ .../matrix/impl/room/RoomTypeKtTest.kt | 21 + .../matrix/impl/room/RustBaseRoomTest.kt | 185 + .../matrix/impl/room/StateEventTypeTest.kt | 68 + .../impl/room/join/DefaultJoinRoomTest.kt | 145 + .../impl/room/location/AssetTypeKtTest.kt | 21 + .../room/member/RoomMemberListFetcherTest.kt | 191 ++ .../impl/room/member/RoomMemberMapperTest.kt | 44 + .../RoomPowerLevelsValuesMapperTest.kt | 49 + .../room/preview/RoomPreviewInfoMapperTest.kt | 73 + .../RoomDescriptionMapperTest.kt | 48 + .../RoomDirectorySearchProcessorTest.kt | 75 + .../RustBaseRoomDirectoryListTest.kt | 90 + .../RustBaseRoomDirectoryServiceTest.kt | 28 + .../impl/roomlist/RoomListFactoryTest.kt | 35 + .../impl/roomlist/RoomListFilterTest.kt | 156 + .../roomlist/RoomSummaryListProcessorTest.kt | 197 ++ .../roomlist/RustBaseRoomListServiceTest.kt | 63 + .../server/DefaultUserServerResolverTest.kt | 29 + .../spaces/RoomSummaryListProcessorTest.kt | 203 ++ .../impl/spaces/RustSpaceRoomListTest.kt | 106 + .../matrix/impl/sync/AppStateMapperKtTest.kt | 25 + .../MatrixTimelineDiffProcessorTest.kt | 191 ++ .../impl/timeline/ReceiptTypeMapperKtTest.kt | 22 + .../matrix/impl/timeline/RustTimelineTest.kt | 112 + .../timeline/TimelineItemsSubscriberTest.kt | 132 + .../impl/timeline/postprocessor/Fixtures.kt | 50 + .../LastForwardIndicatorsPostProcessorTest.kt | 89 + .../LoadingIndicatorsPostProcessorTest.kt | 112 + .../RoomBeginningPostProcessorTest.kt | 134 + .../usersearch/UserSearchResultMapperTest.kt | 56 + .../impl/util/SessionPathsProviderTest.kt | 41 + libraries/matrix/test/build.gradle.kts | 26 + .../matrix/test/src/main/AndroidManifest.xml | 12 + .../libraries/matrix/test/FakeMatrixClient.kt | 354 ++ .../matrix/test/FakeMatrixClientProvider.kt | 21 + .../libraries/matrix/test/FakeSdkMetadata.kt | 13 + .../android/libraries/matrix/test/TestData.kt | 102 + ...FakeHomeServerLoginCompatibilityChecker.kt | 19 + .../auth/FakeMatrixAuthenticationService.kt | 111 + .../test/auth/FakeOidcRedirectUrlProvider.kt | 19 + .../test/auth/MatrixHomeServerDetails.kt | 22 + .../FakeMatrixQrCodeLoginDataFactory.kt | 29 + .../libraries/matrix/test/core/BuildMeta.kt | 44 + .../matrix/test/core/FakeSendHandle.kt | 20 + .../test/encryption/FakeEncryptionService.kt | 148 + .../encryption/FakeIdentityResetHandle.kt | 39 + .../test/media/FakeMatrixMediaLoader.kt | 48 + .../matrix/test/media/FakeMediaFile.kt | 24 + .../test/media/FakeMediaPreviewService.kt | 36 + .../test/media/FakeMediaUploadHandler.kt | 23 + .../matrix/test/media/MediaSource.kt | 16 + .../libraries/matrix/test/mxc/FakeMxcTools.kt | 15 + .../notification/FakeNotificationService.kt | 26 + .../test/notification/NotificationData.kt | 49 + .../FakeNotificationSettingsService.kt | 188 + .../test/permalink/FakePermalinkBuilder.kt | 27 + .../test/permalink/FakePermalinkParser.kt | 25 + .../matrix/test/pushers/FakePushersService.kt | 22 + .../matrix/test/room/FakeBaseRoom.kt | 265 ++ .../matrix/test/room/FakeJoinedRoom.kt | 232 ++ .../matrix/test/room/FakeNotJoinedRoom.kt | 28 + .../test/room/LatestEventValueFixture.kt | 48 + .../matrix/test/room/RoomInfoFixture.kt | 107 + .../matrix/test/room/RoomMemberFixture.kt | 64 + .../test/room/RoomPreviewInfoFixture.kt | 56 + .../matrix/test/room/RoomSummaryFixture.kt | 120 + .../test/room/alias/FakeRoomAliasHelper.kt | 27 + .../matrix/test/room/join/FakeJoinRoom.kt | 26 + .../test/room/knock/FakeKnockRequest.kt | 49 + .../roomdirectory/FakeRoomDirectoryList.kt | 23 + .../roomdirectory/FakeRoomDirectoryService.kt | 19 + .../roomdirectory/RoomDescriptionFixture.kt | 34 + .../test/roomlist/FakeRoomListService.kt | 67 + .../test/roomlist/SimplePagedRoomList.kt | 46 + .../test/spaces/FakeLeaveSpaceHandle.kt | 35 + .../matrix/test/spaces/FakeSpaceRoomList.kt | 58 + .../matrix/test/spaces/FakeSpaceService.kt | 46 + .../matrix/test/sync/FakeSyncService.kt | 39 + .../matrix/test/timeline/FakeTimeline.kt | 453 +++ .../test/timeline/FakeTimelineProvider.kt | 25 + .../test/timeline/LiveTimelineProvider.kt | 21 + .../matrix/test/timeline/TimelineFixture.kt | 159 + .../test/timeline/item/event/Fixture.kt | 26 + .../matrix/test/tracing/FakeTracingService.kt | 27 + .../FakeSessionVerificationService.kt | 97 + .../widget/FakeCallWidgetSettingsProvider.kt | 29 + .../test/widget/FakeMatrixWidgetDriver.kt | 43 + libraries/matrixmedia/api/build.gradle.kts | 21 + .../libraries/matrix/ui/media/Avatar.kt | 24 + .../matrix/ui/media/ImageLoaderHolder.kt | 18 + .../ui/media/InitialsAvatarBitmapGenerator.kt | 23 + .../matrix/ui/media/MediaRequestData.kt | 46 + libraries/matrixmedia/impl/build.gradle.kts | 33 + .../matrix/ui/media/AvatarDataExt.kt | 18 + .../ui/media/AvatarDataFetcherFactory.kt | 30 + .../matrix/ui/media/CoilMediaFetcher.kt | 105 + .../ui/media/DefaultImageLoaderHolder.kt | 61 + .../DefaultInitialsAvatarBitmapGenerator.kt | 127 + .../matrix/ui/media/ImageLoaderFactories.kt | 66 + .../media/MediaRequestDataFetcherFactory.kt | 29 + .../matrix/ui/media/MediaRequestDataKeyer.kt | 29 + .../ui/media/DefaultImageLoaderHolderTest.kt | 92 + .../matrix/ui/media/FakeImageLoaderFactory.kt | 25 + libraries/matrixmedia/test/build.gradle.kts | 22 + .../matrix/ui/media/test/FakeImageLoader.kt | 51 + .../ui/media/test/FakeImageLoaderHolder.kt | 30 + .../test/FakeInitialsAvatarBitmapGenerator.kt | 26 + libraries/matrixui/build.gradle.kts | 46 + .../ui/components/AttachmentThumbnail.kt | 152 + .../AttachmentThumbnailInfoProvider.kt | 42 + .../ui/components/AvatarActionBottomSheet.kt | 122 + .../matrix/ui/components/CheckableUserRow.kt | 161 + .../CreateDmConfirmationBottomSheet.kt | 109 + .../ui/components/EditableAvatarView.kt | 137 + .../matrix/ui/components/EditableOrgAvatar.kt | 161 + .../matrix/ui/components/InviteSenderView.kt | 70 + .../matrix/ui/components/JoinButton.kt | 36 + .../matrix/ui/components/MatrixUserHeader.kt | 103 + .../components/MatrixUserHeaderPlaceholder.kt | 64 + .../ui/components/MatrixUserProvider.kt | 61 + .../matrix/ui/components/MatrixUserRow.kt | 39 + .../ui/components/OrganizationHeader.kt | 79 + .../ui/components/SelectRoomInfoProvider.kt | 42 + .../matrix/ui/components/SelectedItem.kt | 149 + .../matrix/ui/components/SelectedRoom.kt | 75 + .../matrix/ui/components/SelectedUser.kt | 76 + .../ui/components/SelectedUsersRowList.kt | 149 + .../ui/components/SpaceHeaderRootView.kt | 72 + .../matrix/ui/components/SpaceHeaderView.kt | 115 + .../matrix/ui/components/SpaceInfoRow.kt | 123 + .../matrix/ui/components/SpaceMembersView.kt | 108 + .../matrix/ui/components/SpaceRoomItemView.kt | 278 ++ .../matrix/ui/components/SpaceRoomProvider.kt | 79 + .../matrix/ui/components/UnresolvedUserRow.kt | 103 + .../matrix/ui/components/UnsavedAvatar.kt | 93 + .../libraries/matrix/ui/components/UserRow.kt | 75 + .../libraries/matrix/ui/media/AvatarAction.kt | 38 + .../ui/messages/RoomMemberProfilesCache.kt | 34 + .../matrix/ui/messages/RoomNamesCache.kt | 44 + .../matrix/ui/messages/ToHtmlDocument.kt | 62 + .../matrix/ui/messages/ToPlainText.kt | 90 + .../ui/messages/reply/InReplyToDetails.kt | 66 + .../reply/InReplyToDetailsProvider.kt | 168 + .../ui/messages/reply/InReplyToMetadata.kt | 131 + .../matrix/ui/messages/reply/InReplyToView.kt | 214 ++ .../matrix/ui/messages/sender/SenderName.kt | 127 + .../messages/sender/SenderNameDataProvider.kt | 58 + .../ui/messages/sender/SenderNameMode.kt | 19 + .../libraries/matrix/ui/model/InviteSender.kt | 56 + .../matrix/ui/model/MatrixUserExtensions.kt | 38 + .../matrix/ui/model/RoomInfoExtension.kt | 36 + .../matrix/ui/model/RoomMemberExtension.kt | 20 + .../matrix/ui/model/SelectRoomInfo.kt | 42 + .../matrix/ui/model/SpaceExtension.kt | 48 + .../matrix/ui/room/LoadingRoomState.kt | 63 + .../matrix/ui/room/MatrixRoomMembers.kt | 55 + .../matrix/ui/room/MatrixRoomState.kt | 131 + .../ObserveRoomMemberIdentityStateChange.kt | 81 + .../ui/room/PowerLevelRoomMemberComparator.kt | 29 + .../matrix/ui/room/RoomMemberExtensions.kt | 21 + .../ui/room/address/RoomAddressField.kt | 81 + .../ui/room/address/RoomAddressValidity.kt | 23 + .../room/address/RoomAddressValidityEffect.kt | 53 + .../libraries/matrix/ui/safety/Avatars.kt | 25 + .../src/main/res/values-be/translations.xml | 4 + .../src/main/res/values-bg/translations.xml | 4 + .../src/main/res/values-cs/translations.xml | 7 + .../src/main/res/values-cy/translations.xml | 7 + .../src/main/res/values-da/translations.xml | 7 + .../src/main/res/values-de/translations.xml | 7 + .../src/main/res/values-el/translations.xml | 7 + .../src/main/res/values-es/translations.xml | 7 + .../src/main/res/values-et/translations.xml | 7 + .../src/main/res/values-eu/translations.xml | 6 + .../src/main/res/values-fa/translations.xml | 7 + .../src/main/res/values-fi/translations.xml | 7 + .../src/main/res/values-fr/translations.xml | 7 + .../src/main/res/values-hu/translations.xml | 7 + .../src/main/res/values-in/translations.xml | 7 + .../src/main/res/values-it/translations.xml | 7 + .../src/main/res/values-ka/translations.xml | 4 + .../src/main/res/values-ko/translations.xml | 7 + .../src/main/res/values-lt/translations.xml | 4 + .../src/main/res/values-nb/translations.xml | 7 + .../src/main/res/values-nl/translations.xml | 4 + .../src/main/res/values-pl/translations.xml | 7 + .../main/res/values-pt-rBR/translations.xml | 7 + .../src/main/res/values-pt/translations.xml | 7 + .../src/main/res/values-ro/translations.xml | 7 + .../src/main/res/values-ru/translations.xml | 7 + .../src/main/res/values-sk/translations.xml | 7 + .../src/main/res/values-sv/translations.xml | 7 + .../src/main/res/values-tr/translations.xml | 7 + .../src/main/res/values-uk/translations.xml | 7 + .../src/main/res/values-ur/translations.xml | 4 + .../src/main/res/values-uz/translations.xml | 7 + .../main/res/values-zh-rTW/translations.xml | 7 + .../src/main/res/values-zh/translations.xml | 7 + .../matrixui/src/main/res/values/localazy.xml | 7 + .../matrix/ui/messages/ToHtmlDocumentTest.kt | 108 + .../matrix/ui/messages/ToPlainTextTest.kt | 139 + .../ui/messages/reply/InReplyToDetailTest.kt | 109 + .../messages/reply/InReplyToMetadataKtTest.kt | 586 ++++ .../ui/model/MatrixUserExtensionsTest.kt | 102 + .../matrix/ui/model/RoomInfoExtensionTest.kt | 79 + ...bserveRoomMemberIdentityStateChangeTest.kt | 404 +++ .../PowerLevelRoomMemberComparatorTest.kt | 80 + .../matrix/ui/room/RoomMembersTest.kt | 192 ++ libraries/mediapickers/api/build.gradle.kts | 25 + .../mediapickers/api/PickerLauncher.kt | 53 + .../mediapickers/api/PickerProvider.kt | 37 + .../libraries/mediapickers/api/PickerType.kt | 59 + .../libraries/mediapickers/PickerTypeTest.kt | 56 + libraries/mediapickers/impl/build.gradle.kts | 25 + .../impl/DefaultPickerProvider.kt | 153 + libraries/mediapickers/test/build.gradle.kts | 21 + .../mediapickers/test/FakePickerProvider.kt | 55 + libraries/mediaplayer/api/build.gradle.kts | 19 + .../libraries/mediaplayer/api/MediaPlayer.kt | 84 + libraries/mediaplayer/impl/build.gradle.kts | 34 + .../mediaplayer/impl/DefaultMediaPlayer.kt | 180 + .../mediaplayer/impl/SimplePlayer.kt | 92 + .../impl/DefaultMediaPlayerTest.kt | 430 +++ .../mediaplayer/impl/FakeSimplePlayer.kt | 61 + libraries/mediaplayer/test/build.gradle.kts | 23 + .../mediaplayer/test/FakeMediaPlayer.kt | 102 + libraries/mediaupload/api/build.gradle.kts | 27 + .../mediaupload/api/MaxUploadSizeProvider.kt | 16 + .../api/MediaOptimizationConfig.kt | 23 + .../api/MediaOptimizationConfigProvider.kt | 13 + .../mediaupload/api/MediaPreProcessor.kt | 32 + .../libraries/mediaupload/api/MediaSender.kt | 65 + .../mediaupload/api/MediaUploadInfo.kt | 33 + libraries/mediaupload/impl/build.gradle.kts | 48 + .../impl/AndroidMediaPreProcessor.kt | 373 ++ .../impl/DefaultMaxUploadSizeProvider.kt | 26 + .../DefaultMediaOptimizationConfigProvider.kt | 26 + .../mediaupload/impl/DefaultMediaSender.kt | 264 ++ .../mediaupload/impl/ImageCompressor.kt | 121 + .../mediaupload/impl/MimeTypeUtil.kt | 27 + .../mediaupload/impl/ThumbnailFactory.kt | 144 + .../mediaupload/impl/VideoCompressor.kt | 196 ++ .../mediaupload/impl/VideoCompressorConfig.kt | 52 + .../impl/src/test/assets/animated_gif.gif | 3 + .../impl/src/test/assets/image.jpeg | 3 + .../impl/src/test/assets/image.png | 3 + .../impl/src/test/assets/sample3s.mp3 | 3 + .../mediaupload/impl/src/test/assets/text.txt | 3 + .../impl/src/test/assets/video.mp4 | 3 + .../impl/AndroidMediaPreProcessorTest.kt | 443 +++ .../libraries/mediaupload/impl/Asset.kt | 85 + .../impl/DefaultMediaSenderTest.kt | 171 + .../impl/VideoCompressorConfigFactoryTest.kt | 110 + libraries/mediaupload/test/build.gradle.kts | 21 + .../FakeMediaOptimizationConfigProvider.kt | 22 + .../mediaupload/test/FakeMediaPreProcessor.kt | 120 + .../mediaupload/test/FakeMediaSender.kt | 64 + libraries/mediaviewer/api/build.gradle.kts | 21 + .../mediaviewer/api/MediaGalleryEntryPoint.kt | 29 + .../libraries/mediaviewer/api/MediaInfo.kt | 188 + .../mediaviewer/api/MediaViewerEntryPoint.kt | 57 + .../helper/FileExtensionAndSizeFormatter.kt | 19 + .../mediaviewer/api/local/LocalMedia.kt | 22 + .../api/local/LocalMediaFactory.kt | 34 + .../api/local/LocalMediaRenderer.kt | 16 + .../api/util/FileExtensionExtractor.kt | 13 + libraries/mediaviewer/impl/build.gradle.kts | 68 + .../impl/DefaultMediaGalleryEntryPoint.kt | 31 + .../impl/DefaultMediaViewerEntryPoint.kt | 63 + .../impl/datasource/EventItemFactory.kt | 220 ++ ...edTimelineMediaGalleryDataSourceFactory.kt | 48 + .../impl/datasource/MediaGalleryDataSource.kt | 114 + .../datasource/MediaItemsPostProcessor.kt | 76 + .../impl/datasource/MediaTimeline.kt | 106 + .../datasource/TimelineMediaItemsFactory.kt | 89 + .../impl/datasource/VirtualItemFactory.kt | 43 + .../impl/details/MediaBottomSheetState.kt | 30 + .../MediaDeleteConfirmationBottomSheet.kt | 164 + .../impl/details/MediaDetailsBottomSheet.kt | 234 ++ .../mediaviewer/impl/details/Preview.kt | 37 + .../impl/gallery/MediaGalleryEvents.kt | 34 + .../impl/gallery/MediaGalleryNavigator.kt | 16 + .../impl/gallery/MediaGalleryNode.kt | 71 + .../impl/gallery/MediaGalleryPresenter.kt | 213 ++ .../impl/gallery/MediaGalleryState.kt | 29 + .../impl/gallery/MediaGalleryStateProvider.kt | 134 + .../impl/gallery/MediaGalleryView.kt | 534 +++ .../di/FakeTimelineItemPresenterFactories.kt | 26 + .../di/LocalMediaItemPresenterFactories.kt | 18 + .../gallery/di/MediaItemEventContentKey.kt | 21 + .../gallery/di/MediaItemPresenterFactories.kt | 93 + .../gallery/di/MediaItemPresenterFactory.kt | 25 + .../impl/gallery/root/MediaGalleryFlowNode.kt | 149 + .../impl/gallery/ui/AudioItemView.kt | 135 + .../impl/gallery/ui/CaptionView.kt | 35 + .../impl/gallery/ui/DateItemView.kt | 51 + .../impl/gallery/ui/FileItemView.kt | 135 + .../impl/gallery/ui/ImageItemView.kt | 74 + .../impl/gallery/ui/MediaItemAudioProvider.kt | 28 + .../ui/MediaItemDateSeparatorProvider.kt | 21 + .../impl/gallery/ui/MediaItemFileProvider.kt | 28 + .../impl/gallery/ui/MediaItemVideoProvider.kt | 23 + .../impl/gallery/ui/MediaItemVoiceProvider.kt | 31 + .../impl/gallery/ui/VideoItemView.kt | 125 + .../impl/gallery/ui/VoiceItemView.kt | 286 ++ .../gallery/voice/VoiceMessagePresenter.kt | 60 + .../impl/local/AndroidLocalMediaActions.kt | 206 ++ .../impl/local/AndroidLocalMediaFactory.kt | 112 + .../impl/local/DefaultLocalMediaRenderer.kt | 46 + .../impl/local/LocalMediaActions.kt | 35 + .../mediaviewer/impl/local/LocalMediaView.kt | 86 + .../impl/local/LocalMediaViewState.kt | 42 + .../impl/local/audio/MediaAudioView.kt | 381 +++ .../local/audio/MediaInfoAudioProvider.kt | 24 + .../impl/local/audio/MediaMetadata.kt | 36 + .../impl/local/file/MediaFileView.kt | 120 + .../impl/local/file/MediaInfoFileProvider.kt | 20 + .../impl/local/image/MediaImageView.kt | 65 + .../impl/local/pdf/MediaPdfView.kt | 33 + .../local/pdf/ParcelFileDescriptorFactory.kt | 25 + .../mediaviewer/impl/local/pdf/PdfPage.kt | 101 + .../impl/local/pdf/PdfRendererManager.kt | 79 + .../mediaviewer/impl/local/pdf/PdfViewer.kt | 177 + .../impl/local/pdf/PdfViewerState.kt | 80 + .../impl/local/player/ExoPlayerExtensions.kt | 31 + .../impl/local/player/ExoPlayerFactory.kt | 29 + .../impl/local/player/ExoPlayerForPreview.kt | 252 ++ .../player/MediaPlayerControllerState.kt | 24 + .../MediaPlayerControllerStateProvider.kt | 45 + .../local/player/MediaPlayerControllerView.kt | 196 ++ .../impl/local/txt/TextFileContentProvider.kt | 24 + .../impl/local/txt/TextFileView.kt | 112 + .../impl/local/video/MediaVideoView.kt | 324 ++ .../impl/model/GroupedMediaItems.kt | 31 + .../mediaviewer/impl/model/MediaItem.kt | 126 + .../impl/model/MediaItemFactories.kt | 129 + .../libraries/mediaviewer/impl/util/Colors.kt | 17 + .../FileExtensionExtractorWithValidation.kt | 27 + .../impl/viewer/MediaViewerDataSource.kt | 191 ++ .../impl/viewer/MediaViewerEvents.kt | 32 + .../impl/viewer/MediaViewerFlickToDismiss.kt | 104 + .../impl/viewer/MediaViewerNavigator.kt | 17 + .../impl/viewer/MediaViewerNode.kt | 156 + .../impl/viewer/MediaViewerPresenter.kt | 296 ++ .../impl/viewer/MediaViewerState.kt | 54 + .../impl/viewer/MediaViewerStateProvider.kt | 214 ++ .../impl/viewer/MediaViewerView.kt | 606 ++++ .../impl/viewer/PagerKeysHandler.kt | 88 + .../viewer/SingleMediaGalleryDataSource.kt | 90 + .../src/main/res/drawable/ic_apk_install.xml | 10 + .../src/main/res/values-bg/translations.xml | 7 + .../src/main/res/values-cs/translations.xml | 21 + .../src/main/res/values-cy/translations.xml | 21 + .../src/main/res/values-da/translations.xml | 21 + .../src/main/res/values-de/translations.xml | 21 + .../src/main/res/values-el/translations.xml | 21 + .../src/main/res/values-es/translations.xml | 21 + .../src/main/res/values-et/translations.xml | 21 + .../src/main/res/values-eu/translations.xml | 19 + .../src/main/res/values-fa/translations.xml | 18 + .../src/main/res/values-fi/translations.xml | 21 + .../src/main/res/values-fr/translations.xml | 21 + .../src/main/res/values-hu/translations.xml | 21 + .../src/main/res/values-in/translations.xml | 21 + .../src/main/res/values-it/translations.xml | 21 + .../src/main/res/values-ko/translations.xml | 21 + .../src/main/res/values-nb/translations.xml | 21 + .../src/main/res/values-nl/translations.xml | 4 + .../src/main/res/values-pl/translations.xml | 21 + .../main/res/values-pt-rBR/translations.xml | 21 + .../src/main/res/values-pt/translations.xml | 21 + .../src/main/res/values-ro/translations.xml | 21 + .../src/main/res/values-ru/translations.xml | 21 + .../src/main/res/values-sk/translations.xml | 21 + .../src/main/res/values-sv/translations.xml | 21 + .../src/main/res/values-tr/translations.xml | 21 + .../src/main/res/values-uk/translations.xml | 21 + .../src/main/res/values-uz/translations.xml | 21 + .../main/res/values-zh-rTW/translations.xml | 21 + .../src/main/res/values-zh/translations.xml | 21 + .../impl/src/main/res/values/localazy.xml | 21 + .../impl/DefaultMediaGalleryEntryPointTest.kt | 54 + .../impl/DefaultMediaViewerEntryPointTest.kt | 161 + .../datasource/DefaultEventItemFactoryTest.kt | 436 +++ ...melineMediaGalleryDataSourceFactoryTest.kt | 33 + .../datasource/FakeMediaGalleryDataSource.kt | 49 + .../datasource/FocusedMediaTimelineTest.kt | 124 + .../impl/datasource/LiveMediaTimelineTest.kt | 55 + .../datasource/MediaItemsPostProcessorTest.kt | 211 ++ .../TimelineMediaGalleryDataSourceTest.kt | 284 ++ .../MediaDeleteConfirmationBottomSheetTest.kt | 72 + .../details/MediaDetailsBottomSheetTest.kt | 133 + .../impl/gallery/FakeMediaGalleryNavigator.kt | 25 + .../impl/gallery/MediaGalleryPresenterTest.kt | 452 +++ .../local/AndroidLocalMediaActionsTest.kt | 72 + .../local/AndroidLocalMediaFactoryTest.kt | 72 + .../local/NoOpActivityResultRegistryOwner.kt | 28 + .../impl/model/GroupedMediaItemsTest.kt | 33 + ...ileExtensionExtractorWithValidationTest.kt | 29 + .../impl/viewer/FakeMediaViewerNavigator.kt | 30 + .../impl/viewer/MediaViewerDataSourceTest.kt | 282 ++ .../impl/viewer/MediaViewerPresenterTest.kt | 892 +++++ .../impl/viewer/MediaViewerViewTest.kt | 265 ++ .../impl/viewer/PagerKeysHandlerTest.kt | 77 + .../SingleMediaGalleryDataSourceTest.kt | 182 + libraries/mediaviewer/test/build.gradle.kts | 26 + .../mediaviewer/test/FakeLocalMediaActions.kt | 47 + .../mediaviewer/test/FakeLocalMediaFactory.kt | 57 + .../test/FakeMediaGalleryEntryPoint.kt | 22 + .../test/FakeMediaViewerEntryPoint.kt | 25 + ...FileExtensionExtractorWithoutValidation.kt | 17 + .../mediaviewer/test/viewer/LocalMedia.kt | 22 + ...ExtensionExtractorWithoutValidationTest.kt | 21 + libraries/network/build.gradle.kts | 39 + libraries/network/consumer-rules.pro | 9 + .../libraries/network/NetworkModule.kt | 45 + .../libraries/network/RetrofitFactory.kt | 30 + .../libraries/network/headers/HttpHeaders.kt | 15 + .../DynamicHttpLoggingInterceptor.kt | 37 + .../interceptors/FormattedJsonHttpLogger.kt | 72 + .../interceptors/UserAgentInterceptor.kt | 28 + .../useragent/DefaultUserAgentProvider.kt | 60 + .../useragent/SimpleUserAgentProvider.kt | 15 + .../network/useragent/UserAgentProvider.kt | 13 + libraries/oidc/api/build.gradle.kts | 19 + .../android/libraries/oidc/api/OidcAction.kt | 14 + .../libraries/oidc/api/OidcActionFlow.kt | 17 + .../libraries/oidc/api/OidcIntentResolver.kt | 15 + libraries/oidc/impl/build.gradle.kts | 47 + .../oidc/impl/DefaultOidcActionFlow.kt | 35 + .../oidc/impl/DefaultOidcIntentResolver.kt | 24 + .../libraries/oidc/impl/OidcUrlParser.kt | 44 + .../oidc/impl/DefaultOidcActionFlowTest.kt | 34 + .../impl/DefaultOidcIntentResolverTest.kt | 70 + .../oidc/impl/DefaultOidcUrlParserTest.kt | 59 + libraries/oidc/test/build.gradle.kts | 21 + .../oidc/test/FakeOidcIntentResolver.kt | 22 + .../oidc/test/customtab/FakeOidcActionFlow.kt | 33 + libraries/permissions/api/build.gradle.kts | 20 + .../api/PermissionStateProvider.kt | 20 + .../permissions/api/PermissionsEvents.kt | 15 + .../permissions/api/PermissionsPresenter.kt | 17 + .../permissions/api/PermissionsState.kt | 21 + .../api/PermissionsStateProvider.kt | 36 + .../permissions/api/PermissionsStore.kt | 24 + .../permissions/api/PermissionsView.kt | 62 + .../android/libraries/permissions/api/Util.kt | 19 + .../src/main/res/values-be/translations.xml | 7 + .../src/main/res/values-cs/translations.xml | 7 + .../src/main/res/values-cy/translations.xml | 7 + .../src/main/res/values-da/translations.xml | 7 + .../src/main/res/values-de/translations.xml | 7 + .../src/main/res/values-el/translations.xml | 7 + .../src/main/res/values-es/translations.xml | 7 + .../src/main/res/values-et/translations.xml | 7 + .../src/main/res/values-eu/translations.xml | 7 + .../src/main/res/values-fa/translations.xml | 7 + .../src/main/res/values-fi/translations.xml | 7 + .../src/main/res/values-fr/translations.xml | 7 + .../src/main/res/values-hu/translations.xml | 7 + .../src/main/res/values-in/translations.xml | 7 + .../src/main/res/values-it/translations.xml | 7 + .../src/main/res/values-ka/translations.xml | 7 + .../src/main/res/values-ko/translations.xml | 7 + .../src/main/res/values-nb/translations.xml | 7 + .../src/main/res/values-nl/translations.xml | 7 + .../src/main/res/values-pl/translations.xml | 7 + .../main/res/values-pt-rBR/translations.xml | 7 + .../src/main/res/values-pt/translations.xml | 7 + .../src/main/res/values-ro/translations.xml | 7 + .../src/main/res/values-ru/translations.xml | 7 + .../src/main/res/values-sk/translations.xml | 7 + .../src/main/res/values-sv/translations.xml | 7 + .../src/main/res/values-tr/translations.xml | 7 + .../src/main/res/values-uk/translations.xml | 7 + .../src/main/res/values-ur/translations.xml | 7 + .../src/main/res/values-uz/translations.xml | 7 + .../main/res/values-zh-rTW/translations.xml | 7 + .../src/main/res/values-zh/translations.xml | 7 + .../api/src/main/res/values/localazy.xml | 7 + libraries/permissions/impl/build.gradle.kts | 49 + .../AccompanistPermissionStateProvider.kt | 34 + .../impl/DefaultPermissionStateProvider.kt | 42 + .../impl/DefaultPermissionsPresenter.kt | 143 + .../impl/DefaultPermissionsStore.kt | 62 + .../impl/action/AndroidPermissionActions.kt | 24 + .../impl/action/PermissionActions.kt | 13 + ...ficationTroubleshootCheckPermissionTest.kt | 66 + .../src/main/res/values-be/translations.xml | 5 + .../src/main/res/values-bg/translations.xml | 5 + .../src/main/res/values-cs/translations.xml | 5 + .../src/main/res/values-cy/translations.xml | 5 + .../src/main/res/values-da/translations.xml | 5 + .../src/main/res/values-de/translations.xml | 5 + .../src/main/res/values-el/translations.xml | 5 + .../src/main/res/values-es/translations.xml | 5 + .../src/main/res/values-et/translations.xml | 5 + .../src/main/res/values-eu/translations.xml | 5 + .../src/main/res/values-fa/translations.xml | 4 + .../src/main/res/values-fi/translations.xml | 5 + .../src/main/res/values-fr/translations.xml | 5 + .../src/main/res/values-hu/translations.xml | 5 + .../src/main/res/values-in/translations.xml | 5 + .../src/main/res/values-it/translations.xml | 5 + .../src/main/res/values-ka/translations.xml | 5 + .../src/main/res/values-ko/translations.xml | 5 + .../src/main/res/values-nb/translations.xml | 5 + .../src/main/res/values-nl/translations.xml | 5 + .../src/main/res/values-pl/translations.xml | 5 + .../main/res/values-pt-rBR/translations.xml | 5 + .../src/main/res/values-pt/translations.xml | 5 + .../src/main/res/values-ro/translations.xml | 5 + .../src/main/res/values-ru/translations.xml | 5 + .../src/main/res/values-sk/translations.xml | 5 + .../src/main/res/values-sv/translations.xml | 5 + .../src/main/res/values-tr/translations.xml | 5 + .../src/main/res/values-uk/translations.xml | 5 + .../src/main/res/values-ur/translations.xml | 5 + .../src/main/res/values-uz/translations.xml | 5 + .../main/res/values-zh-rTW/translations.xml | 5 + .../src/main/res/values-zh/translations.xml | 5 + .../impl/src/main/res/values/localazy.xml | 5 + .../impl/DefaultPermissionsPresenterTest.kt | 271 ++ .../FakeComposablePermissionStateProvider.kt | 57 + .../impl/action/FakePermissionActions.kt | 21 + ...tionTroubleshootCheckPermissionTestTest.kt | 113 + libraries/permissions/noop/build.gradle.kts | 24 + .../noop/NoopPermissionsPresenter.kt | 30 + .../noop/NoopPermissionsPresenterTest.kt | 39 + libraries/permissions/test/build.gradle.kts | 20 + .../test/FakePermissionStateProvider.kt | 40 + .../test/FakePermissionsPresenter.kt | 43 + .../test/FakePermissionsPresenterFactory.kt | 19 + .../test/InMemoryPermissionsStore.kt | 40 + libraries/preferences/api/build.gradle.kts | 26 + .../api/store/AppPreferencesStore.kt | 42 + .../api/store/PreferenceDataStoreFactory.kt | 21 + .../api/store/SessionPreferencesStore.kt | 39 + .../store/SessionPreferencesStoreFactory.kt | 17 + .../api/store/VideoCompressionPreset.kt | 23 + libraries/preferences/impl/build.gradle.kts | 28 + .../impl/store/DefaultAppPreferencesStore.kt | 158 + .../DefaultPreferencesDataStoreFactory.kt | 45 + .../store/DefaultSessionPreferencesStore.kt | 108 + .../DefaultSessionPreferencesStoreFactory.kt | 48 + .../impl/store/SessionPreferencesModule.kt | 32 + .../store/SessionPreferencesStoreMigration.kt | 31 + libraries/preferences/test/build.gradle.kts | 23 + .../test/FakePreferenceDataStoreFactory.kt | 21 + .../FakeSessionPreferencesStoreFactory.kt | 31 + .../test/InMemoryAppPreferencesStore.kt | 98 + .../test/InMemorySessionPreferencesStore.kt | 91 + libraries/previewutils/build.gradle.kts | 22 + .../previewutils/room/RoomMemberFixture.kt | 64 + .../previewutils/room/SpaceRoomFixture.kt | 54 + libraries/push/api/build.gradle.kts | 24 + .../push/api/GetCurrentPushProvider.kt | 15 + .../android/libraries/push/api/PushService.kt | 91 + .../push/api/PusherRegistrationFailure.kt | 26 + .../api/battery/BatteryOptimizationEvents.kt | 14 + .../api/battery/BatteryOptimizationState.kt | 14 + .../BatteryOptimizationStateProvider.kt | 17 + .../push/api/gateway/PushGatewayFailure.kt | 13 + .../push/api/history/PushHistoryItem.kt | 35 + .../notifications/NotificationBitmapLoader.kt | 40 + .../api/notifications/NotificationCleaner.kt | 24 + .../notifications/NotificationIdProvider.kt | 56 + .../OnMissedCallNotificationHandler.kt | 27 + .../NotificationConversationService.kt | 41 + .../push/api/push/NotificationEventRequest.kt | 20 + .../push/api/push/SyncOnNotifiableEvent.kt | 13 + libraries/push/impl/build.gradle.kts | 101 + .../push/impl/src/debug/res/raw/message.mp3 | Bin 0 -> 8685 bytes .../push/impl/src/main/AndroidManifest.xml | 34 + .../impl/DefaultGetCurrentPushProvider.kt | 24 + .../libraries/push/impl/DefaultPushService.kt | 208 ++ .../push/impl/DefaultPusherSubscriber.kt | 116 + .../push/impl/battery/BatteryOptimization.kt | 85 + .../battery/BatteryOptimizationPresenter.kt | 73 + .../libraries/push/impl/di/PushModule.kt | 35 + .../impl/history/DefaultPushHistoryService.kt | 76 + .../push/impl/history/PushHistoryService.kt | 106 + .../push/impl/history/di/PushHistoryModule.kt | 44 + .../push/impl/intent/IntentProvider.kt | 29 + .../ActiveNotificationsProvider.kt | 82 + .../CallNotificationEventResolver.kt | 132 + .../DefaultNotifiableEventResolver.kt | 451 +++ .../DefaultNotificationBitmapLoader.kt | 104 + .../DefaultNotificationDrawerManager.kt | 193 ++ .../DefaultOnMissedCallNotificationHandler.kt | 47 + .../FallbackNotificationFactory.kt | 42 + .../impl/notifications/NotificationAction.kt | 32 + .../notifications/NotificationActionIds.kt | 29 + .../NotificationBroadcastReceiver.kt | 36 + .../NotificationBroadcastReceiverBindings.kt | 17 + .../NotificationBroadcastReceiverHandler.kt | 222 ++ .../notifications/NotificationDataFactory.kt | 260 ++ .../notifications/NotificationDisplayer.kt | 81 + .../notifications/NotificationMediaRepo.kt | 112 + .../notifications/NotificationRenderer.kt | 158 + .../NotificationResolverQueue.kt | 125 + .../NotificationsFileProvider.kt | 17 + .../notifications/ReplyMessageExtractor.kt | 27 + .../impl/notifications/RoomEventGroupInfo.kt | 29 + .../notifications/RoomGroupMessageCreator.kt | 109 + .../SummaryGroupMessageCreator.kt | 65 + .../notifications/TestNotificationReceiver.kt | 25 + .../TestNotificationReceiverBinding.kt | 17 + .../channels/NotificationChannels.kt | 194 ++ .../DefaultNotificationConversationService.kt | 196 ++ .../notifications/debug/DebugNotification.kt | 13 + .../factories/NotificationAccountParams.kt | 18 + .../factories/NotificationCreator.kt | 518 +++ .../factories/PendingIntentFactory.kt | 123 + .../action/AcceptInvitationActionFactory.kt | 55 + .../action/MarkAsReadActionFactory.kt | 61 + .../action/QuickReplyActionFactory.kt | 93 + .../action/RejectInvitationActionFactory.kt | 55 + .../model/FallbackNotifiableEvent.kt | 30 + .../model/InviteNotifiableEvent.kt | 29 + .../notifications/model/NotifiableEvent.kt | 29 + .../model/NotifiableMessageEvent.kt | 79 + .../model/NotifiableRingingCallEvent.kt | 34 + .../notifications/model/ResolvedPushEvent.kt | 34 + .../model/SimpleNotifiableEvent.kt | 28 + .../push/impl/notifications/shortcut/Utils.kt | 20 + .../push/impl/push/DefaultPushHandler.kt | 293 ++ .../impl/push/DefaultSyncOnNotifiableEvent.kt | 59 + .../push/impl/push/IncrementPushDataStore.kt | 26 + .../push/MutableBatteryOptimizationStore.kt | 36 + .../impl/push/OnNotifiableEventReceived.kt | 35 + .../push/impl/push/OnRedactedEventReceived.kt | 87 + .../push/impl/pushgateway/PushGatewayAPI.kt | 21 + .../impl/pushgateway/PushGatewayApiFactory.kt | 27 + .../impl/pushgateway/PushGatewayConfig.kt | 14 + .../impl/pushgateway/PushGatewayDevice.kt | 35 + .../pushgateway/PushGatewayNotification.kt | 25 + .../impl/pushgateway/PushGatewayNotifyBody.kt | 21 + .../pushgateway/PushGatewayNotifyRequest.kt | 58 + .../pushgateway/PushGatewayNotifyResponse.kt | 18 + .../push/impl/store/DefaultPushDataStore.kt | 116 + .../push/impl/store/PushDataStore.kt | 27 + .../libraries/push/impl/test/TestPush.kt | 43 + .../troubleshoot/CurrentPushProviderTest.kt | 94 + .../troubleshoot/DiagnosticPushHandler.kt | 26 + .../impl/troubleshoot/IgnoredUsersTest.kt | 70 + .../troubleshoot/NotificationClickHandler.kt | 26 + .../impl/troubleshoot/NotificationTest.kt | 103 + .../impl/troubleshoot/PushLoopbackTest.kt | 116 + .../impl/troubleshoot/PushProvidersTest.kt | 58 + .../ServiceUnregisteredHandler.kt | 47 + .../workmanager/DataForWorkManagerIsTooBig.kt | 10 + .../workmanager/FetchNotificationsWorker.kt | 123 + .../SyncNotificationWorkManagerRequest.kt | 68 + .../impl/workmanager/WorkerDataConverter.kt | 129 + .../push/impl/src/main/res/raw/message.mp3 | Bin 0 -> 8685 bytes .../src/main/res/values-be/translations.xml | 87 + .../src/main/res/values-bg/translations.xml | 64 + .../src/main/res/values-cs/translations.xml | 103 + .../src/main/res/values-cy/translations.xml | 122 + .../src/main/res/values-da/translations.xml | 94 + .../src/main/res/values-de/translations.xml | 94 + .../src/main/res/values-el/translations.xml | 82 + .../src/main/res/values-es/translations.xml | 81 + .../src/main/res/values-et/translations.xml | 95 + .../src/main/res/values-eu/translations.xml | 75 + .../src/main/res/values-fa/translations.xml | 63 + .../src/main/res/values-fi/translations.xml | 94 + .../src/main/res/values-fr/translations.xml | 95 + .../src/main/res/values-hu/translations.xml | 95 + .../src/main/res/values-in/translations.xml | 75 + .../src/main/res/values-it/translations.xml | 95 + .../src/main/res/values-ka/translations.xml | 74 + .../src/main/res/values-ko/translations.xml | 75 + .../src/main/res/values-lt/translations.xml | 51 + .../src/main/res/values-nb/translations.xml | 93 + .../src/main/res/values-nl/translations.xml | 80 + .../src/main/res/values-pl/translations.xml | 101 + .../main/res/values-pt-rBR/translations.xml | 95 + .../src/main/res/values-pt/translations.xml | 90 + .../src/main/res/values-ro/translations.xml | 95 + .../src/main/res/values-ru/translations.xml | 103 + .../src/main/res/values-sk/translations.xml | 102 + .../src/main/res/values-sv/translations.xml | 82 + .../src/main/res/values-tr/translations.xml | 81 + .../src/main/res/values-uk/translations.xml | 89 + .../src/main/res/values-ur/translations.xml | 81 + .../src/main/res/values-uz/translations.xml | 81 + .../main/res/values-zh-rTW/translations.xml | 87 + .../src/main/res/values-zh/translations.xml | 86 + .../impl/src/main/res/values/localazy.xml | 95 + .../res/xml/notifications_provider_paths.xml | 6 + .../libraries/push/impl/db/PushHistory.sq | 22 + .../push/impl/DefaultPushServiceTest.kt | 644 ++++ .../push/impl/DefaultPusherSubscriberTest.kt | 185 + .../battery/AndroidBatteryOptimizationTest.kt | 114 + .../BatteryOptimizationPresenterTest.kt | 171 + .../impl/battery/FakeBatteryOptimization.kt | 24 + .../impl/history/FakePushHistoryService.kt | 46 + .../DefaultActiveNotificationsProviderTest.kt | 173 + .../DefaultBaseRoomGroupMessageCreatorTest.kt | 243 ++ ...efaultCallNotificationEventResolverTest.kt | 173 + .../DefaultNotifiableEventResolverTest.kt | 863 +++++ .../DefaultNotificationDrawerManagerTest.kt | 239 ++ ...aultOnMissedCallNotificationHandlerTest.kt | 76 + .../DefaultSummaryGroupMessageCreatorTest.kt | 62 + .../FakeNotifiableEventResolver.kt | 26 + .../FakeReplyMessageExtractor.kt | 19 + ...otificationBroadcastReceiverHandlerTest.kt | 507 +++ .../NotificationDataFactoryTest.kt | 190 ++ .../NotificationIdProviderTest.kt | 29 + .../notifications/NotificationRendererTest.kt | 132 + .../channels/FakeNotificationChannels.kt | 27 + .../channels/NotificationChannelsTest.kt | 73 + ...aultNotificationConversationServiceTest.kt | 192 ++ .../DefaultNotificationCreatorTest.kt | 368 ++ .../factories/FakeIntentProvider.kt | 27 + .../factories/NotificationAccountParams.kt | 24 + .../fake/FakeActiveNotificationsProvider.kt | 53 + .../fake/FakeNotificationCreator.kt | 102 + .../fake/FakeNotificationDataFactory.kt | 94 + .../fake/FakeNotificationDisplayer.kt | 54 + .../fake/FakeNotificationMediaRepo.kt | 23 + .../fake/FakeRoomGroupMessageCreator.kt | 39 + .../fake/FakeSummaryGroupMessageCreator.kt | 40 + .../fixtures/NotifiableEventFixture.kt | 143 + .../NotificationEventRequestFixture.kt | 29 + .../fixtures/NotificationFixture.kt | 13 + .../DefaultOnRedactedEventReceivedTest.kt | 153 + .../push/impl/push/DefaultPushHandlerTest.kt | 733 ++++ .../FakeMutableBatteryOptimizationStore.kt | 29 + .../push/FakeOnNotifiableEventReceived.kt | 20 + .../impl/push/FakeOnRedactedEventReceived.kt | 20 + .../impl/push/SyncOnNotifiableEventTest.kt | 133 + .../DefaultPushGatewayNotifyRequestTest.kt | 94 + .../pushgateway/FakePushGatewayApiFactory.kt | 29 + .../push/impl/store/InMemoryPushDataStore.kt | 42 + .../push/impl/test/DefaultTestPushTest.kt | 44 + .../impl/test/FakePushGatewayNotifyRequest.kt | 20 + .../libraries/push/impl/test/FakeTestPush.kt | 20 + .../CurrentPushProviderTestTest.kt | 136 + .../impl/troubleshoot/IgnoredUsersTestTest.kt | 87 + .../impl/troubleshoot/NotificationTestTest.kt | 78 + .../impl/troubleshoot/PushLoopbackTestTest.kt | 154 + .../troubleshoot/PushProvidersTestTest.kt | 54 + .../DefaultServiceUnregisteredHandlerTest.kt | 118 + .../FakeServiceUnregisteredHandler.kt | 19 + .../FetchNotificationWorkerTest.kt | 209 ++ .../SyncNotificationWorkManagerRequestTest.kt | 98 + .../workmanager/WorkerDataConverterTest.kt | 141 + libraries/push/test/build.gradle.kts | 29 + .../push/test/FakeGetCurrentPushProvider.kt | 18 + .../libraries/push/test/FakePushService.kt | 112 + .../push/test/FakePusherSubscriber.kt | 26 + .../FakeCallNotificationEventResolver.kt | 25 + .../notifications/FakeNotificationCleaner.kt | 49 + .../FakeNotificationResolverQueue.kt | 24 + .../FakeOnMissedCallNotificationHandler.kt | 26 + .../FakeNotificationConversationService.kt | 27 + .../push/FakeNotificationBitmapLoader.kt | 28 + .../push/test/test/FakePushHandler.kt | 26 + libraries/pushproviders/api/build.gradle.kts | 19 + .../libraries/pushproviders/api/Config.kt | 14 + .../pushproviders/api/Distributor.kt | 24 + .../libraries/pushproviders/api/PushData.kt | 27 + .../pushproviders/api/PushHandler.kt | 21 + .../pushproviders/api/PushProvider.kt | 70 + .../pushproviders/api/PusherSubscriber.kt | 29 + libraries/pushproviders/firebase/README.md | 7 + .../pushproviders/firebase/build.gradle.kts | 82 + .../firebase/consumer-proguard-rules.pro | 4 + .../firebase/src/main/AndroidManifest.xml | 22 + .../pushproviders/firebase/FirebaseConfig.kt | 20 + .../firebase/FirebaseGatewayProvider.kt | 26 + .../firebase/FirebaseNewTokenHandler.kt | 70 + .../firebase/FirebasePushParser.kt | 25 + .../firebase/FirebasePushProvider.kt | 96 + .../pushproviders/firebase/FirebaseStore.kt | 62 + .../firebase/FirebaseTokenDeleter.kt | 49 + .../firebase/FirebaseTokenGetter.kt | 50 + .../firebase/FirebaseTokenRotator.kt | 33 + .../firebase/FirebaseTroubleshooter.kt | 33 + .../firebase/IsPlayServiceAvailable.kt | 44 + .../firebase/PushDataFirebase.kt | 45 + .../VectorFirebaseMessagingService.kt | 63 + .../VectorFirebaseMessagingServiceBindings.kt | 17 + .../troubleshoot/FirebaseAvailabilityTest.kt | 61 + .../troubleshoot/FirebaseTokenTest.kt | 84 + .../src/main/res/values-be/translations.xml | 11 + .../src/main/res/values-bg/translations.xml | 7 + .../src/main/res/values-cs/translations.xml | 11 + .../src/main/res/values-cy/translations.xml | 11 + .../src/main/res/values-da/translations.xml | 11 + .../src/main/res/values-de/translations.xml | 11 + .../src/main/res/values-el/translations.xml | 11 + .../src/main/res/values-es/translations.xml | 11 + .../src/main/res/values-et/translations.xml | 11 + .../src/main/res/values-eu/translations.xml | 11 + .../src/main/res/values-fi/translations.xml | 11 + .../src/main/res/values-fr/translations.xml | 11 + .../src/main/res/values-hu/translations.xml | 11 + .../src/main/res/values-in/translations.xml | 11 + .../src/main/res/values-it/translations.xml | 11 + .../src/main/res/values-ka/translations.xml | 11 + .../src/main/res/values-ko/translations.xml | 11 + .../src/main/res/values-nb/translations.xml | 11 + .../src/main/res/values-nl/translations.xml | 11 + .../src/main/res/values-pl/translations.xml | 11 + .../main/res/values-pt-rBR/translations.xml | 11 + .../src/main/res/values-pt/translations.xml | 11 + .../src/main/res/values-ro/translations.xml | 11 + .../src/main/res/values-ru/translations.xml | 11 + .../src/main/res/values-sk/translations.xml | 11 + .../src/main/res/values-sv/translations.xml | 11 + .../src/main/res/values-tr/translations.xml | 11 + .../src/main/res/values-uk/translations.xml | 11 + .../src/main/res/values-ur/translations.xml | 11 + .../src/main/res/values-uz/translations.xml | 11 + .../main/res/values-zh-rTW/translations.xml | 11 + .../src/main/res/values-zh/translations.xml | 11 + .../firebase/src/main/res/values/firebase.xml | 10 + .../firebase/src/main/res/values/localazy.xml | 11 + .../DefaultFirebaseNewTokenHandlerTest.kt | 155 + .../firebase/FakeFirebaseGatewayProvider.kt | 17 + .../firebase/FakeFirebaseNewTokenHandler.kt | 19 + .../firebase/FakeFirebaseTokenRotator.kt | 19 + .../firebase/FakeFirebaseTroubleshooter.kt | 19 + .../firebase/FakeIsPlayServiceAvailable.kt | 15 + .../firebase/FirebasePushParserTest.kt | 88 + .../firebase/FirebasePushProviderTest.kt | 208 ++ .../firebase/InMemoryFirebaseStore.kt | 24 + .../VectorFirebaseMessagingServiceTest.kt | 104 + .../FirebaseAvailabilityTestTest.kt | 61 + .../troubleshoot/FirebaseTokenTestTest.kt | 102 + libraries/pushproviders/test/build.gradle.kts | 20 + .../pushproviders/test/FakePushProvider.kt | 65 + .../libraries/pushproviders/test/Fixtures.kt | 19 + .../unifiedpush/build.gradle.kts | 57 + .../unifiedpush/src/main/AndroidManifest.xml | 38 + .../DefaultPushGatewayHttpUrlProvider.kt | 26 + .../unifiedpush/GuardServiceStarter.kt | 20 + .../unifiedpush/KeepInternalDistributor.kt | 22 + .../unifiedpush/PushDataUnifiedPush.kt | 60 + .../unifiedpush/RegisterUnifiedPushUseCase.kt | 49 + .../unifiedpush/UnifiedPushApiFactory.kt | 28 + .../unifiedpush/UnifiedPushConfig.kt | 22 + .../UnifiedPushDistributorProvider.kt | 38 + .../unifiedpush/UnifiedPushGatewayResolver.kt | 89 + .../UnifiedPushGatewayUrlResolver.kt | 44 + .../UnifiedPushNewGatewayHandler.kt | 61 + .../unifiedpush/UnifiedPushParser.kt | 23 + .../unifiedpush/UnifiedPushProvider.kt | 71 + .../UnifiedPushRemovedGatewayHandler.kt | 126 + .../UnifiedPushSessionPushConfigProvider.kt | 35 + .../unifiedpush/UnifiedPushStore.kt | 92 + .../UnregisterUnifiedPushUseCase.kt | 71 + .../VectorUnifiedPushMessagingReceiver.kt | 128 + ...torUnifiedPushMessagingReceiverBindings.kt | 22 + .../unifiedpush/network/DiscoveryResponse.kt | 17 + .../network/DiscoveryUnifiedPush.kt | 17 + .../unifiedpush/network/UnifiedPushApi.kt | 16 + .../EndpointRegistrationHandler.kt | 31 + .../OpenDistributorWebPageAction.kt | 32 + .../UnifiedPushMatrixGatewayTest.kt | 85 + .../troubleshoot/UnifiedPushTest.kt | 75 + .../src/main/res/values-be/translations.xml | 11 + .../src/main/res/values-cs/translations.xml | 11 + .../src/main/res/values-cy/translations.xml | 14 + .../src/main/res/values-da/translations.xml | 10 + .../src/main/res/values-de/translations.xml | 10 + .../src/main/res/values-el/translations.xml | 10 + .../src/main/res/values-es/translations.xml | 10 + .../src/main/res/values-et/translations.xml | 10 + .../src/main/res/values-eu/translations.xml | 9 + .../src/main/res/values-fi/translations.xml | 10 + .../src/main/res/values-fr/translations.xml | 10 + .../src/main/res/values-hu/translations.xml | 10 + .../src/main/res/values-in/translations.xml | 9 + .../src/main/res/values-it/translations.xml | 10 + .../src/main/res/values-ka/translations.xml | 10 + .../src/main/res/values-ko/translations.xml | 9 + .../src/main/res/values-nb/translations.xml | 10 + .../src/main/res/values-nl/translations.xml | 10 + .../src/main/res/values-pl/translations.xml | 11 + .../main/res/values-pt-rBR/translations.xml | 10 + .../src/main/res/values-pt/translations.xml | 10 + .../src/main/res/values-ro/translations.xml | 11 + .../src/main/res/values-ru/translations.xml | 11 + .../src/main/res/values-sk/translations.xml | 11 + .../src/main/res/values-sv/translations.xml | 10 + .../src/main/res/values-tr/translations.xml | 10 + .../src/main/res/values-uk/translations.xml | 11 + .../src/main/res/values-ur/translations.xml | 10 + .../src/main/res/values-uz/translations.xml | 10 + .../main/res/values-zh-rTW/translations.xml | 9 + .../src/main/res/values-zh/translations.xml | 9 + .../src/main/res/values/localazy.xml | 10 + .../DefaultRegisterUnifiedPushUseCaseTest.kt | 78 + ...edPushCurrentUserPushConfigProviderTest.kt | 74 + .../DefaultUnifiedPushGatewayResolverTest.kt | 200 ++ ...efaultUnifiedPushGatewayUrlResolverTest.kt | 86 + ...DefaultUnifiedPushNewGatewayHandlerTest.kt | 135 + ...ultUnifiedPushRemovedGatewayHandlerTest.kt | 298 ++ ...DefaultUnregisterUnifiedPushUseCaseTest.kt | 131 + .../FakeDefaultPushGatewayHttpUrlProvider.kt | 19 + .../FakeRegisterUnifiedPushUseCase.kt | 20 + .../unifiedpush/FakeUnifiedPushApiFactory.kt | 32 + .../FakeUnifiedPushGatewayResolver.kt | 19 + .../FakeUnifiedPushGatewayUrlResolver.kt | 19 + .../FakeUnifiedPushNewGatewayHandler.kt | 19 + .../unifiedpush/FakeUnifiedPushStore.kt | 45 + .../FakeUnregisterUnifiedPushUseCase.kt | 32 + .../unifiedpush/UnifiedPushParserTest.kt | 89 + .../unifiedpush/UnifiedPushProviderTest.kt | 263 ++ .../VectorUnifiedPushMessagingReceiverTest.kt | 243 ++ .../FakeOpenDistributorWebPageAction.kt | 15 + .../FakeUnifiedPushDistributorProvider.kt | 24 + ...akeUnifiedPushSessionPushConfigProvider.kt | 22 + .../UnifiedPushMatrixGatewayTestTest.kt | 110 + .../troubleshoot/UnifiedPushTestTest.kt | 110 + libraries/pushstore/api/build.gradle.kts | 19 + .../libraries/pushstore/api/UserPushStore.kt | 33 + .../pushstore/api/UserPushStoreFactory.kt | 18 + .../api/clientsecret/PushClientSecret.kt | 24 + .../clientsecret/PushClientSecretFactory.kt | 13 + .../api/clientsecret/PushClientSecretStore.kt | 18 + libraries/pushstore/impl/build.gradle.kts | 46 + .../impl/DefaultUserPushStoreFactoryTest.kt | 47 + .../impl/DefaultUserPushStoreFactory.kt | 39 + .../pushstore/impl/UserPushStoreDataStore.kt | 115 + .../DataStorePushClientSecretStore.kt | 51 + .../clientsecret/DefaultPushClientSecret.kt | 36 + .../DefaultPushClientSecretFactory.kt | 21 + .../impl/UserPushStoreDataStoreTest.kt | 99 + .../DefaultPushClientSecretTest.kt | 58 + .../FakePushClientSecretFactory.kt | 23 + libraries/pushstore/test/build.gradle.kts | 23 + .../test/userpushstore/FakeUserPushStore.kt | 60 + .../userpushstore/FakeUserPushStoreFactory.kt | 21 + .../clientsecret/FakePushClientSecret.kt | 26 + .../InMemoryPushClientSecretStore.kt | 34 + libraries/qrcode/build.gradle.kts | 22 + .../libraries/qrcode/QRCodeAnalyzer.kt | 42 + .../libraries/qrcode/QrCodeCameraView.kt | 166 + libraries/recentemojis/api/build.gradle.kts | 23 + .../recentemojis/api/AddRecentEmoji.kt | 13 + .../recentemojis/api/EmojibaseProvider.kt | 15 + .../recentemojis/api/GetRecentEmojis.kt | 18 + libraries/recentemojis/impl/build.gradle.kts | 36 + .../impl/DefaultAddRecentEmoji.kt | 26 + .../impl/DefaultEmojibaseProvider.kt | 20 + .../impl/DefaultGetRecentEmojis.kt | 38 + .../impl/DefaultGetRecentEmojisTest.kt | 69 + libraries/recentemojis/test/build.gradle.kts | 26 + .../test/FakeEmojibaseProvider.kt | 23 + libraries/roomselect/api/build.gradle.kts | 19 + .../roomselect/api/RoomSelectEntryPoint.kt | 33 + .../roomselect/api/RoomSelectMode.kt | 14 + libraries/roomselect/impl/build.gradle.kts | 35 + .../impl/DefaultRoomSelectEntryPoint.kt | 34 + .../roomselect/impl/RoomSelectEvents.kt | 20 + .../roomselect/impl/RoomSelectNode.kt | 51 + .../roomselect/impl/RoomSelectPresenter.kt | 94 + .../impl/RoomSelectSearchDataSource.kt | 66 + .../roomselect/impl/RoomSelectState.kt | 23 + .../impl/RoomSelectStateProvider.kt | 73 + .../roomselect/impl/RoomSelectView.kt | 271 ++ .../impl/DefaultRoomSelectEntryPointTest.kt | 56 + .../impl/RoomSelectPresenterTest.kt | 126 + libraries/roomselect/test/build.gradle.kts | 20 + .../test/FakeRoomSelectEntryPoint.kt | 23 + libraries/rustsdk/.gitignore | 2 + libraries/rustsdk/build.gradle.kts | 2 + .../session-storage/api/build.gradle.kts | 18 + .../sessionstorage/api/LoggedInState.kt | 20 + .../libraries/sessionstorage/api/LoginType.kt | 34 + .../sessionstorage/api/SessionData.kt | 49 + .../sessionstorage/api/SessionStore.kt | 93 + .../api/observer/SessionListener.kt | 14 + .../api/observer/SessionObserver.kt | 14 + .../session-storage/impl/build.gradle.kts | 49 + .../impl/DatabaseSessionStore.kt | 186 + .../sessionstorage/impl/SessionDataMapper.kt | 56 + .../impl/di/SessionStorageModule.kt | 44 + .../impl/observer/DefaultSessionObserver.kt | 85 + .../impl/src/main/sqldelight/databases/1.db | Bin 0 -> 12288 bytes .../impl/src/main/sqldelight/databases/10.db | Bin 0 -> 12288 bytes .../impl/src/main/sqldelight/databases/11.db | Bin 0 -> 12288 bytes .../impl/src/main/sqldelight/databases/2.db | Bin 0 -> 12288 bytes .../impl/src/main/sqldelight/databases/3.db | Bin 0 -> 12288 bytes .../impl/src/main/sqldelight/databases/4.db | Bin 0 -> 12288 bytes .../impl/src/main/sqldelight/databases/5.db | Bin 0 -> 12288 bytes .../impl/src/main/sqldelight/databases/6.db | Bin 0 -> 12288 bytes .../impl/src/main/sqldelight/databases/7.db | Bin 0 -> 12288 bytes .../impl/src/main/sqldelight/databases/8.db | Bin 0 -> 12288 bytes .../impl/src/main/sqldelight/databases/9.db | Bin 0 -> 12288 bytes .../libraries/matrix/session/SessionData.sq | 62 + .../impl/src/main/sqldelight/migrations/0.sqm | 11 + .../impl/src/main/sqldelight/migrations/1.sqm | 3 + .../src/main/sqldelight/migrations/10.sqm | 43 + .../impl/src/main/sqldelight/migrations/2.sqm | 3 + .../impl/src/main/sqldelight/migrations/3.sqm | 4 + .../impl/src/main/sqldelight/migrations/4.sqm | 3 + .../impl/src/main/sqldelight/migrations/5.sqm | 4 + .../impl/src/main/sqldelight/migrations/6.sqm | 20 + .../impl/src/main/sqldelight/migrations/7.sqm | 4 + .../impl/src/main/sqldelight/migrations/8.sqm | 4 + .../impl/src/main/sqldelight/migrations/9.sqm | 9 + .../impl/DatabaseSessionStoreTest.kt | 326 ++ .../libraries/sessionstorage/impl/Fixtures.kt | 33 + .../observer/DefaultSessionObserverTest.kt | 103 + .../impl/observer/TestSessionListener.kt | 33 + .../session-storage/test/build.gradle.kts | 19 + .../test/InMemorySessionStore.kt | 88 + .../sessionstorage/test/SessionData.kt | 45 + .../test/observer/FakeSessionObserver.kt | 35 + .../test/observer/NoOpSessionObserver.kt | 17 + libraries/testtags/build.gradle.kts | 14 + .../android/libraries/testtags/Compose.kt | 22 + .../android/libraries/testtags/TestTags.kt | 127 + libraries/textcomposer/impl/build.gradle.kts | 49 + .../textcomposer/CaptionWarningBottomSheet.kt | 74 + .../textcomposer/ComposerModeView.kt | 168 + .../ElementRichTextEditorStyle.kt | 85 + .../MessageComposerModeSpecialProvider.kt | 25 + .../textcomposer/SoftKeyboardEffect.kt | 54 + .../libraries/textcomposer/TextComposer.kt | 965 ++++++ .../textcomposer/TextComposerLinkDialog.kt | 228 ++ .../components/FormattingOption.kt | 126 + .../components/FormattingOptionState.kt | 15 + .../components/LiveWaveformView.kt | 98 + .../textcomposer/components/SendButton.kt | 125 + .../textcomposer/components/TextFormatting.kt | 218 ++ .../components/TextInputRoundedCornerShape.kt | 39 + .../components/VoiceMessageDeleteButton.kt | 63 + .../components/VoiceMessagePreview.kt | 209 ++ .../components/VoiceMessageRecorderButton.kt | 117 + .../components/VoiceMessageRecording.kt | 106 + .../components/markdown/MarkdownEditText.kt | 47 + .../components/markdown/MarkdownTextInput.kt | 195 ++ .../components/markdown/StableCharSequence.kt | 34 + .../textcomposer/mentions/MentionSpan.kt | 165 + .../mentions/MentionSpanFormatter.kt | 75 + .../mentions/MentionSpanProvider.kt | 125 + .../textcomposer/mentions/MentionSpanTheme.kt | 287 ++ .../mentions/MentionSpanUpdater.kt | 67 + .../mentions/ResolvedSuggestion.kt | 35 + .../libraries/textcomposer/model/Fixtures.kt | 66 + .../model/MarkdownTextEditorState.kt | 165 + .../libraries/textcomposer/model/Message.kt | 17 + .../textcomposer/model/MessageComposerMode.kt | 63 + .../textcomposer/model/Suggestion.kt | 46 + .../textcomposer/model/TextEditorState.kt | 81 + .../model/VoiceMessagePlayerEvent.kt | 18 + .../model/VoiceMessageRecorderEvent.kt | 15 + .../textcomposer/model/VoiceMessageState.kt | 34 + .../src/main/res/values-be/translations.xml | 25 + .../src/main/res/values-bg/translations.xml | 24 + .../src/main/res/values-cs/translations.xml | 33 + .../src/main/res/values-cy/translations.xml | 33 + .../src/main/res/values-da/translations.xml | 33 + .../src/main/res/values-de/translations.xml | 33 + .../src/main/res/values-el/translations.xml | 33 + .../src/main/res/values-es/translations.xml | 29 + .../src/main/res/values-et/translations.xml | 33 + .../src/main/res/values-eu/translations.xml | 30 + .../src/main/res/values-fa/translations.xml | 32 + .../src/main/res/values-fi/translations.xml | 33 + .../src/main/res/values-fr/translations.xml | 33 + .../src/main/res/values-hu/translations.xml | 33 + .../src/main/res/values-in/translations.xml | 33 + .../src/main/res/values-it/translations.xml | 33 + .../src/main/res/values-ka/translations.xml | 25 + .../src/main/res/values-ko/translations.xml | 33 + .../src/main/res/values-lt/translations.xml | 17 + .../src/main/res/values-nb/translations.xml | 33 + .../src/main/res/values-nl/translations.xml | 26 + .../src/main/res/values-pl/translations.xml | 33 + .../main/res/values-pt-rBR/translations.xml | 33 + .../src/main/res/values-pt/translations.xml | 33 + .../src/main/res/values-ro/translations.xml | 33 + .../src/main/res/values-ru/translations.xml | 33 + .../src/main/res/values-sk/translations.xml | 33 + .../src/main/res/values-sv/translations.xml | 33 + .../src/main/res/values-tr/translations.xml | 29 + .../src/main/res/values-uk/translations.xml | 33 + .../src/main/res/values-ur/translations.xml | 25 + .../src/main/res/values-uz/translations.xml | 33 + .../main/res/values-zh-rTW/translations.xml | 33 + .../src/main/res/values-zh/translations.xml | 33 + .../impl/src/main/res/values/localazy.xml | 33 + .../markdown/MarkdownTextInputTest.kt | 192 ++ .../IntentionalMentionSpanProviderTest.kt | 61 + .../impl/mentions/MentionSpanFormatterTest.kt | 136 + .../mentions/MentionSpanProviderFixture.kt | 33 + .../impl/model/MarkdownTextEditorStateTest.kt | 187 + libraries/textcomposer/lib/.gitignore | 2 + libraries/textcomposer/lib/build.gradle.kts | 3 + libraries/troubleshoot/api/build.gradle.kts | 21 + .../api/NotificationTroubleShootEntryPoint.kt | 27 + .../troubleshoot/api/PushHistoryEntryPoint.kt | 29 + .../test/NotificationTroubleshootNavigator.kt | 13 + .../api/test/NotificationTroubleshootTest.kt | 26 + .../NotificationTroubleshootTestDelegate.kt | 73 + .../test/NotificationTroubleshootTestState.kt | 30 + .../troubleshoot/api/test/TestFilterData.kt | 13 + libraries/troubleshoot/impl/build.gradle.kts | 42 + ...faultNotificationTroubleShootEntryPoint.kt | 27 + .../impl/TroubleshootNotificationsEvents.kt | 15 + .../impl/TroubleshootNotificationsNode.kt | 54 + .../TroubleshootNotificationsPresenter.kt | 64 + .../impl/TroubleshootNotificationsState.kt | 16 + .../TroubleshootNotificationsStateProvider.kt | 124 + .../impl/TroubleshootNotificationsView.kt | 216 ++ .../impl/TroubleshootTestSuite.kt | 122 + .../impl/TroubleshootTestSuiteState.kt | 18 + .../history/DefaultPushHistoryEntryPoint.kt | 27 + .../impl/history/PushHistoryEvents.kt | 20 + .../impl/history/PushHistoryNode.kt | 53 + .../impl/history/PushHistoryPresenter.kt | 104 + .../impl/history/PushHistoryState.kt | 22 + .../impl/history/PushHistoryStateProvider.kt | 86 + .../impl/history/PushHistoryView.kt | 278 ++ .../src/main/res/values-be/translations.xml | 11 + .../src/main/res/values-bg/translations.xml | 7 + .../src/main/res/values-cs/translations.xml | 12 + .../src/main/res/values-cy/translations.xml | 12 + .../src/main/res/values-da/translations.xml | 12 + .../src/main/res/values-de/translations.xml | 12 + .../src/main/res/values-el/translations.xml | 12 + .../src/main/res/values-es/translations.xml | 12 + .../src/main/res/values-et/translations.xml | 12 + .../src/main/res/values-eu/translations.xml | 9 + .../src/main/res/values-fa/translations.xml | 10 + .../src/main/res/values-fi/translations.xml | 12 + .../src/main/res/values-fr/translations.xml | 12 + .../src/main/res/values-hu/translations.xml | 12 + .../src/main/res/values-in/translations.xml | 12 + .../src/main/res/values-it/translations.xml | 12 + .../src/main/res/values-ka/translations.xml | 11 + .../src/main/res/values-ko/translations.xml | 12 + .../src/main/res/values-nb/translations.xml | 12 + .../src/main/res/values-nl/translations.xml | 11 + .../src/main/res/values-pl/translations.xml | 12 + .../main/res/values-pt-rBR/translations.xml | 12 + .../src/main/res/values-pt/translations.xml | 12 + .../src/main/res/values-ro/translations.xml | 12 + .../src/main/res/values-ru/translations.xml | 12 + .../src/main/res/values-sk/translations.xml | 12 + .../src/main/res/values-sv/translations.xml | 12 + .../src/main/res/values-tr/translations.xml | 11 + .../src/main/res/values-uk/translations.xml | 12 + .../src/main/res/values-ur/translations.xml | 11 + .../src/main/res/values-uz/translations.xml | 12 + .../main/res/values-zh-rTW/translations.xml | 12 + .../src/main/res/values-zh/translations.xml | 12 + .../impl/src/main/res/values/localazy.xml | 12 + ...tNotificationTroubleShootEntryPointTest.kt | 48 + .../impl/FakeNotificationTroubleshootTest.kt | 78 + .../TroubleshootNotificationsPresenterTest.kt | 192 ++ .../impl/TroubleshootNotificationsViewTest.kt | 115 + .../DefaultPushHistoryEntryPointTest.kt | 60 + .../impl/history/PushHistoryPresenterTest.kt | 187 + .../impl/history/PushHistoryViewTest.kt | 137 + libraries/troubleshoot/test/build.gradle.kts | 23 + .../FakeNotificationTroubleShootEntryPoint.kt | 22 + .../FakeNotificationTroubleshootNavigator.kt | 18 + .../test/FakePushHistoryEntryPoint.kt | 22 + .../libraries/troubleshoot/test/Utils.kt | 28 + libraries/ui-common/build.gradle.kts | 20 + .../libraries/ui/common/nodes/EmptyNode.kt | 45 + libraries/ui-strings/README.md | 5 + libraries/ui-strings/build.gradle.kts | 19 + .../libraries/ui/strings/CommonPlurals.kt | 11 + .../libraries/ui/strings/CommonStrings.kt | 11 + .../src/main/res/values-be/translations.xml | 330 ++ .../src/main/res/values-bg/translations.xml | 343 ++ .../src/main/res/values-cs/translations.xml | 493 +++ .../src/main/res/values-cy/translations.xml | 512 +++ .../src/main/res/values-da/translations.xml | 481 +++ .../src/main/res/values-de/translations.xml | 481 +++ .../src/main/res/values-el/translations.xml | 408 +++ .../main/res/values-en-rUS/translations.xml | 6 + .../src/main/res/values-es/translations.xml | 391 +++ .../src/main/res/values-et/translations.xml | 486 +++ .../src/main/res/values-eu/translations.xml | 383 +++ .../src/main/res/values-fa/translations.xml | 407 +++ .../src/main/res/values-fi/translations.xml | 486 +++ .../src/main/res/values-fr/translations.xml | 486 +++ .../src/main/res/values-hu/translations.xml | 485 +++ .../src/main/res/values-in/translations.xml | 413 +++ .../src/main/res/values-it/translations.xml | 486 +++ .../src/main/res/values-ka/translations.xml | 267 ++ .../src/main/res/values-ko/translations.xml | 454 +++ .../src/main/res/values-lt/translations.xml | 149 + .../src/main/res/values-nb/translations.xml | 479 +++ .../src/main/res/values-nl/translations.xml | 365 ++ .../src/main/res/values-pl/translations.xml | 489 +++ .../main/res/values-pt-rBR/translations.xml | 486 +++ .../src/main/res/values-pt/translations.xml | 475 +++ .../src/main/res/values-ro/translations.xml | 489 +++ .../src/main/res/values-ru/translations.xml | 495 +++ .../src/main/res/values-sk/translations.xml | 491 +++ .../src/main/res/values-sv/translations.xml | 459 +++ .../src/main/res/values-tr/translations.xml | 379 ++ .../src/main/res/values-uk/translations.xml | 475 +++ .../src/main/res/values-ur/translations.xml | 330 ++ .../src/main/res/values-uz/translations.xml | 468 +++ .../main/res/values-zh-rTW/translations.xml | 477 +++ .../src/main/res/values-zh/translations.xml | 473 +++ .../src/main/res/values/localazy.xml | 494 +++ libraries/ui-utils/build.gradle.kts | 24 + .../libraries/ui/utils/MultipleTapToUnlock.kt | 43 + .../ui/utils/formatter/FIleSizeFormatter.kt | 25 + .../libraries/ui/utils/time/DurationExt.kt | 33 + .../ui/utils/time/IsTalkbackEnabled.kt | 35 + .../libraries/ui/utils/time/KeyEventExt.kt | 35 + .../version/LocalSdkIntVersionProvider.kt | 15 + .../ui/utils/MultipleTapToUnlockTest.kt | 42 + .../ui/utils/time/DurationFormatTest.kt | 44 + libraries/usersearch/api/build.gradle.kts | 20 + .../usersearch/api/UserListDataSource.kt | 18 + .../usersearch/api/UserRepository.kt | 15 + .../usersearch/api/UserSearchResult.kt | 21 + libraries/usersearch/impl/build.gradle.kts | 34 + .../impl/MatrixUserListDataSource.kt | 30 + .../usersearch/impl/MatrixUserRepository.kt | 75 + .../impl/MatrixUserListDataSourceTest.kt | 93 + .../impl/MatrixUserRepositoryTest.kt | 206 ++ libraries/usersearch/test/build.gradle.kts | 22 + .../usersearch/test/FakeUserListDataSource.kt | 30 + .../usersearch/test/FakeUserRepository.kt | 30 + libraries/voiceplayer/api/build.gradle.kts | 20 + .../voiceplayer/api/VoiceMessageEvents.kt | 14 + .../voiceplayer/api/VoiceMessageException.kt | 26 + .../api/VoiceMessagePresenterFactory.kt | 24 + .../voiceplayer/api/VoiceMessageState.kt | 25 + .../api/VoiceMessageStateProvider.kt | 57 + libraries/voiceplayer/impl/build.gradle.kts | 40 + .../DefaultVoiceMessagePresenterFactory.kt | 52 + .../voiceplayer/impl/VoiceMessageMediaRepo.kt | 106 + .../voiceplayer/impl/VoiceMessagePlayer.kt | 226 ++ .../voiceplayer/impl/VoiceMessagePresenter.kt | 126 + .../impl/DefaultVoiceMessageMediaRepoTest.kt | 152 + .../impl/DefaultVoiceMessagePlayerTest.kt | 318 ++ .../impl/FakeVoiceMessageMediaRepo.kt | 27 + .../impl/VoiceMessagePresenterTest.kt | 251 ++ libraries/voicerecorder/api/build.gradle.kts | 19 + .../voicerecorder/api/VoiceRecorder.kt | 47 + .../voicerecorder/api/VoiceRecorderState.kt | 47 + libraries/voicerecorder/impl/build.gradle.kts | 35 + .../impl/DefaultVoiceRecorder.kt | 167 + .../impl/audio/AndroidAudioReader.kt | 132 + .../voicerecorder/impl/audio/Audio.kt | 38 + .../voicerecorder/impl/audio/AudioConfig.kt | 27 + .../impl/audio/AudioLevelCalculator.kt | 22 + .../voicerecorder/impl/audio/AudioReader.kt | 28 + .../impl/audio/DBovAudioLevelCalculator.kt | 52 + .../impl/audio/DefaultEncoder.kt | 53 + .../voicerecorder/impl/audio/Encoder.kt | 19 + .../voicerecorder/impl/audio/Resample.kt | 30 + .../voicerecorder/impl/audio/SampleRate.kt | 16 + .../impl/di/VoiceRecorderModule.kt | 52 + .../impl/file/DefaultVoiceFileManager.kt | 39 + .../impl/file/VoiceFileConfig.kt | 22 + .../impl/file/VoiceFileManager.kt | 17 + .../impl/DefaultVoiceRecorderTest.kt | 169 + .../audio/DBovAudioLevelCalculatorTest.kt | 41 + .../voicerecorder/impl/audio/ResampleTest.kt | 33 + .../test/FakeAudioLevelCalculator.kt | 18 + .../voicerecorder/test/FakeAudioReader.kt | 42 + .../test/FakeAudioReaderFactory.kt | 22 + .../voicerecorder/test/FakeEncoder.kt | 32 + .../voicerecorder/test/FakeFileSystem.kt | 35 + .../test/FakeVoiceFileManager.kt | 29 + libraries/voicerecorder/test/build.gradle.kts | 24 + .../voicerecorder/test/FakeVoiceRecorder.kt | 101 + libraries/wellknown/api/build.gradle.kts | 14 + .../wellknown/api/ElementWellKnown.kt | 16 + .../api/SessionWellknownRetriever.kt | 13 + .../wellknown/api/WellknownRetriever.kt | 13 + .../wellknown/api/WellknownRetrieverResult.kt | 32 + libraries/wellknown/impl/build.gradle.kts | 41 + .../impl/DefaultSessionWellknownRetriever.kt | 54 + .../impl/DefaultWellknownRetriever.kt | 58 + .../impl/InternalElementWellKnown.kt | 33 + .../wellknown/impl/InternalWellKnown.kt | 34 + .../impl/InternalWellKnownBaseConfig.kt | 27 + .../libraries/wellknown/impl/Mapper.kt | 18 + .../libraries/wellknown/impl/WellknownAPI.kt | 19 + .../DefaultSessionWellknownRetrieverTest.kt | 131 + libraries/wellknown/test/build.gradle.kts | 20 + .../test/FakeSessionWellknownRetriever.kt | 22 + .../wellknown/test/FakeWellknownRetriever.kt | 22 + .../features/wellknown/test/Fixtures.kt | 23 + libraries/workmanager/api/build.gradle.kts | 20 + .../workmanager/api/WorkManagerRequest.kt | 15 + .../workmanager/api/WorkManagerScheduler.kt | 27 + .../workmanager/api/di/MetroWorkerFactory.kt | 34 + .../libraries/workmanager/api/di/WorkerKey.kt | 19 + libraries/workmanager/impl/build.gradle.kts | 25 + .../impl/DefaultWorkManagerScheduler.kt | 46 + libraries/workmanager/test/build.gradle.kts | 20 + .../test/FakeWorkManagerScheduler.kt | 27 + plugins/build.gradle.kts | 29 + plugins/settings.gradle.kts | 20 + plugins/src/main/kotlin/Enterprise.kt | 14 + plugins/src/main/kotlin/Logger.kt | 47 + plugins/src/main/kotlin/ModulesConfig.kt | 42 + plugins/src/main/kotlin/Versions.kt | 108 + .../src/main/kotlin/config/AnalyticsConfig.kt | 24 + .../src/main/kotlin/config/BuildTimeConfig.kt | 37 + .../main/kotlin/config/PushProvidersConfig.kt | 20 + .../main/kotlin/extension/AssetCopyTask.kt | 47 + .../main/kotlin/extension/CommonExtension.kt | 75 + .../kotlin/extension/DependencyHandleScope.kt | 176 + .../DependencyInjectionExtensions.kt | 58 + .../main/kotlin/extension/KoverExtension.kt | 247 ++ plugins/src/main/kotlin/extension/Utils.kt | 58 + .../extension/VariantDimensionExtension.kt | 33 + .../main/kotlin/extension/VersionCatalog.kt | 19 + plugins/src/main/kotlin/extension/locales.kt | 42 + ...ent.android-compose-application.gradle.kts | 44 + ...element.android-compose-library.gradle.kts | 44 + .../io.element.android-library.gradle.kts | 39 + .../kotlin/io.element.android-root.gradle.kts | 7 + screenshots/README.md | 17 + .../appnav.loggedin_LoggedInView_Day_1_de.png | 3 + .../appnav.loggedin_LoggedInView_Day_2_de.png | 3 + .../appnav.loggedin_LoggedInView_Day_3_de.png | 3 + ...appnav.loggedin_SyncStateView_Day_0_de.png | 3 + ...om.joined_LoadingRoomNodeView_Day_1_de.png | 3 + .../de/appnav.root_RootView_Day_0_de.png | 3 + .../de/appnav.root_RootView_Day_1_de.png | 3 + .../de/appnav.root_RootView_Day_2_de.png | 3 + ...nces_AnalyticsPreferencesView_Day_0_de.png | 3 + ...nces_AnalyticsPreferencesView_Day_1_de.png | 3 + ...ytics.impl_AnalyticsOptInView_Day_0_de.png | 3 + ...ytics.impl_AnalyticsOptInView_Day_1_de.png | 3 + ....spaces_SpaceAnnouncementView_Day_0_de.png | 3 + ...s.call.impl.ui_CallScreenView_Day_1_de.png | 3 + ...s.call.impl.ui_CallScreenView_Day_2_de.png | 3 + ...s.call.impl.ui_CallScreenView_Day_3_de.png | 3 + ...ll.impl.ui_IncomingCallScreen_Day_0_de.png | 3 + ...l.ui_InvalidAudioDeviceDialog_Day_0_de.png | 3 + ....impl.addpeople_AddPeopleView_Day_0_de.png | 3 + ....impl.addpeople_AddPeopleView_Day_1_de.png | 3 + ....impl.addpeople_AddPeopleView_Day_2_de.png | 3 + ....impl.addpeople_AddPeopleView_Day_3_de.png | 3 + ...nfigureroom_ConfigureRoomViewDark_0_de.png | 3 + ...nfigureroom_ConfigureRoomViewDark_1_de.png | 3 + ...nfigureroom_ConfigureRoomViewDark_2_de.png | 3 + ...nfigureroom_ConfigureRoomViewDark_3_de.png | 3 + ...nfigureroom_ConfigureRoomViewDark_4_de.png | 3 + ...nfigureroom_ConfigureRoomViewDark_5_de.png | 3 + ...figureroom_ConfigureRoomViewLight_0_de.png | 3 + ...figureroom_ConfigureRoomViewLight_1_de.png | 3 + ...figureroom_ConfigureRoomViewLight_2_de.png | 3 + ...figureroom_ConfigureRoomViewLight_3_de.png | 3 + ...figureroom_ConfigureRoomViewLight_4_de.png | 3 + ...figureroom_ConfigureRoomViewLight_5_de.png | 3 + ...ward.impl_ForwardMessagesView_Day_3_de.png | 3 + ...ations_NotificationsOptInView_Day_0_de.png | 3 + ...hooseSelfVerificationModeView_Day_0_de.png | 3 + ...hooseSelfVerificationModeView_Day_1_de.png | 3 + ...hooseSelfVerificationModeView_Day_2_de.png | 3 + ...hooseSelfVerificationModeView_Day_3_de.png | 3 + ...hooseSelfVerificationModeView_Day_4_de.png | 3 + ...nts_BatteryOptimizationBanner_Day_0_de.png | 3 + ...ents_ConfirmRecoveryKeyBanner_Day_0_de.png | 3 + ...lScreenIntentPermissionBanner_Day_0_de.png | 3 + ...onents_HomeTopBarMultiAccount_Day_0_de.png | 3 + ...nents_HomeTopBarWithIndicator_Day_0_de.png | 3 + ...me.impl.components_HomeTopBar_Day_0_de.png | 3 + ...ts_NewNotificationSoundBanner_Day_0_de.png | 3 + ...omponents_RoomListContentView_Day_0_de.png | 3 + ...omponents_RoomListContentView_Day_1_de.png | 3 + ...omponents_RoomListContentView_Day_3_de.png | 3 + ...omponents_RoomListContentView_Day_4_de.png | 3 + ...omponents_RoomListContentView_Day_5_de.png | 3 + ...pl.components_RoomSummaryRow_Day_29_de.png | 3 + ...mpl.components_RoomSummaryRow_Day_2_de.png | 3 + ...pl.components_RoomSummaryRow_Day_30_de.png | 3 + ...pl.components_RoomSummaryRow_Day_31_de.png | 3 + ...pl.components_RoomSummaryRow_Day_32_de.png | 3 + ...pl.components_RoomSummaryRow_Day_33_de.png | 3 + ...pl.components_RoomSummaryRow_Day_34_de.png | 3 + ...pl.components_RoomSummaryRow_Day_35_de.png | 3 + ...onents_SetUpRecoveryKeyBanner_Day_0_de.png | 3 + ...l.filters_RoomListFiltersView_Day_0_de.png | 3 + ...l.filters_RoomListFiltersView_Day_1_de.png | 3 + ...mListDeclineInviteMenuContent_Day_0_de.png | 3 + ...omListModalBottomSheetContent_Day_0_de.png | 3 + ...omListModalBottomSheetContent_Day_1_de.png | 3 + ...omListModalBottomSheetContent_Day_2_de.png | 3 + ....search_RoomListSearchContent_Day_1_de.png | 3 + ...me.impl.spaces_HomeSpacesView_Day_0_de.png | 3 + ...me.impl.spaces_HomeSpacesView_Day_1_de.png | 3 + .../features.home.impl_HomeView_Day_0_de.png | 3 + .../features.home.impl_HomeView_Day_10_de.png | 3 + .../features.home.impl_HomeView_Day_13_de.png | 3 + .../features.home.impl_HomeView_Day_14_de.png | 3 + .../features.home.impl_HomeView_Day_15_de.png | 3 + .../features.home.impl_HomeView_Day_1_de.png | 3 + .../features.home.impl_HomeView_Day_2_de.png | 3 + .../features.home.impl_HomeView_Day_3_de.png | 3 + .../features.home.impl_HomeView_Day_4_de.png | 3 + .../features.home.impl_HomeView_Day_5_de.png | 3 + .../features.home.impl_HomeView_Day_6_de.png | 3 + .../features.home.impl_HomeView_Day_7_de.png | 3 + .../features.home.impl_HomeView_Day_8_de.png | 3 + .../features.home.impl_HomeView_Day_9_de.png | 3 + ...cline_AcceptDeclineInviteView_Day_1_de.png | 3 + ...cline_AcceptDeclineInviteView_Day_2_de.png | 3 + ...cline_AcceptDeclineInviteView_Day_3_de.png | 3 + ...cline_AcceptDeclineInviteView_Day_4_de.png | 3 + ...cline_AcceptDeclineInviteView_Day_5_de.png | 3 + ...eandblock_DeclineAndBlockView_Day_0_de.png | 3 + ...eandblock_DeclineAndBlockView_Day_1_de.png | 3 + ...eandblock_DeclineAndBlockView_Day_2_de.png | 3 + ...eandblock_DeclineAndBlockView_Day_3_de.png | 3 + ...eandblock_DeclineAndBlockView_Day_4_de.png | 3 + ...epeople.impl_InvitePeopleView_Day_0_de.png | 3 + ...epeople.impl_InvitePeopleView_Day_1_de.png | 3 + ...epeople.impl_InvitePeopleView_Day_4_de.png | 3 + ...epeople.impl_InvitePeopleView_Day_5_de.png | 3 + ...epeople.impl_InvitePeopleView_Day_6_de.png | 3 + ...epeople.impl_InvitePeopleView_Day_7_de.png | 3 + ...epeople.impl_InvitePeopleView_Day_9_de.png | 3 + ...s.joinroom.impl_JoinRoomView_Day_10_de.png | 3 + ...s.joinroom.impl_JoinRoomView_Day_11_de.png | 3 + ...s.joinroom.impl_JoinRoomView_Day_12_de.png | 3 + ...s.joinroom.impl_JoinRoomView_Day_13_de.png | 3 + ...s.joinroom.impl_JoinRoomView_Day_14_de.png | 3 + ...s.joinroom.impl_JoinRoomView_Day_15_de.png | 3 + ...s.joinroom.impl_JoinRoomView_Day_16_de.png | 3 + ...es.joinroom.impl_JoinRoomView_Day_1_de.png | 3 + ...es.joinroom.impl_JoinRoomView_Day_2_de.png | 3 + ...es.joinroom.impl_JoinRoomView_Day_3_de.png | 3 + ...es.joinroom.impl_JoinRoomView_Day_4_de.png | 3 + ...es.joinroom.impl_JoinRoomView_Day_5_de.png | 3 + ...es.joinroom.impl_JoinRoomView_Day_6_de.png | 3 + ...es.joinroom.impl_JoinRoomView_Day_7_de.png | 3 + ...es.joinroom.impl_JoinRoomView_Day_8_de.png | 3 + ...es.joinroom.impl_JoinRoomView_Day_9_de.png | 3 + ...anner_KnockRequestsBannerView_Day_0_de.png | 3 + ...anner_KnockRequestsBannerView_Day_1_de.png | 3 + ...anner_KnockRequestsBannerView_Day_2_de.png | 3 + ...anner_KnockRequestsBannerView_Day_3_de.png | 3 + ...anner_KnockRequestsBannerView_Day_4_de.png | 3 + ...anner_KnockRequestsBannerView_Day_5_de.png | 3 + ...anner_KnockRequestsBannerView_Day_6_de.png | 3 + ...pl.list_KnockRequestsListView_Day_0_de.png | 3 + ...l.list_KnockRequestsListView_Day_10_de.png | 3 + ...pl.list_KnockRequestsListView_Day_1_de.png | 3 + ...pl.list_KnockRequestsListView_Day_2_de.png | 3 + ...pl.list_KnockRequestsListView_Day_3_de.png | 3 + ...pl.list_KnockRequestsListView_Day_4_de.png | 3 + ...pl.list_KnockRequestsListView_Day_5_de.png | 3 + ...pl.list_KnockRequestsListView_Day_6_de.png | 3 + ...pl.list_KnockRequestsListView_Day_7_de.png | 3 + ...pl.list_KnockRequestsListView_Day_8_de.png | 3 + ...pl.list_KnockRequestsListView_Day_9_de.png | 3 + ....leaveroom.impl_LeaveRoomView_Day_1_de.png | 3 + ....leaveroom.impl_LeaveRoomView_Day_2_de.png | 3 + ....leaveroom.impl_LeaveRoomView_Day_3_de.png | 3 + ....leaveroom.impl_LeaveRoomView_Day_4_de.png | 3 + ....leaveroom.impl_LeaveRoomView_Day_5_de.png | 3 + ....leaveroom.impl_LeaveRoomView_Day_6_de.png | 3 + ....leaveroom.impl_LeaveRoomView_Day_7_de.png | 3 + ...st_DependencyLicensesListView_Day_0_de.png | 3 + ...st_DependencyLicensesListView_Day_1_de.png | 3 + ...st_DependencyLicensesListView_Day_2_de.png | 3 + ...st_DependencyLicensesListView_Day_3_de.png | 3 + ...internal_StaticMapPlaceholder_Day_0_de.png | 3 + ...on.impl.send_SendLocationView_Day_0_de.png | 3 + ...on.impl.send_SendLocationView_Day_1_de.png | 3 + ...on.impl.send_SendLocationView_Day_2_de.png | 3 + ...on.impl.send_SendLocationView_Day_3_de.png | 3 + ...on.impl.send_SendLocationView_Day_4_de.png | 3 + ...on.impl.show_ShowLocationView_Day_0_de.png | 3 + ...on.impl.show_ShowLocationView_Day_1_de.png | 3 + ...on.impl.show_ShowLocationView_Day_2_de.png | 3 + ...on.impl.show_ShowLocationView_Day_3_de.png | 3 + ...on.impl.show_ShowLocationView_Day_4_de.png | 3 + ...on.impl.show_ShowLocationView_Day_5_de.png | 3 + ...on.impl.show_ShowLocationView_Day_6_de.png | 3 + ...on.impl.show_ShowLocationView_Day_7_de.png | 3 + ...ttings_LockScreenSettingsView_Day_0_de.png | 3 + ...ttings_LockScreenSettingsView_Day_1_de.png | 3 + ...ttings_LockScreenSettingsView_Day_2_de.png | 3 + ....biometric_SetupBiometricView_Day_0_de.png | 3 + ...n.impl.setup.pin_SetupPinView_Day_0_de.png | 3 + ...n.impl.setup.pin_SetupPinView_Day_1_de.png | 3 + ...n.impl.setup.pin_SetupPinView_Day_2_de.png | 3 + ...n.impl.setup.pin_SetupPinView_Day_3_de.png | 3 + ...n.impl.setup.pin_SetupPinView_Day_4_de.png | 3 + ...mpl.unlock_PinUnlockViewInApp_Day_0_de.png | 3 + ...mpl.unlock_PinUnlockViewInApp_Day_1_de.png | 3 + ...mpl.unlock_PinUnlockViewInApp_Day_2_de.png | 3 + ...mpl.unlock_PinUnlockViewInApp_Day_3_de.png | 3 + ...mpl.unlock_PinUnlockViewInApp_Day_4_de.png | 3 + ...mpl.unlock_PinUnlockViewInApp_Day_5_de.png | 3 + ...mpl.unlock_PinUnlockViewInApp_Day_6_de.png | 3 + ...mpl.unlock_PinUnlockViewInApp_Day_7_de.png | 3 + ...een.impl.unlock_PinUnlockView_Day_0_de.png | 3 + ...een.impl.unlock_PinUnlockView_Day_1_de.png | 3 + ...een.impl.unlock_PinUnlockView_Day_2_de.png | 3 + ...een.impl.unlock_PinUnlockView_Day_3_de.png | 3 + ...een.impl.unlock_PinUnlockView_Day_4_de.png | 3 + ...een.impl.unlock_PinUnlockView_Day_5_de.png | 3 + ...een.impl.unlock_PinUnlockView_Day_6_de.png | 3 + ...een.impl.unlock_PinUnlockView_Day_7_de.png | 3 + ...ider_AccountProviderOtherView_Day_0_de.png | 3 + ...changeserver_ChangeServerView_Day_1_de.png | 3 + ...changeserver_ChangeServerView_Day_2_de.png | 3 + ...changeserver_ChangeServerView_Day_3_de.png | 3 + ...changeserver_ChangeServerView_Day_4_de.png | 3 + ...changeserver_ChangeServerView_Day_5_de.png | 3 + ...SlidingSyncNotSupportedDialog_Day_0_de.png | 3 + ...ogin.impl.login_LoginModeView_Day_0_de.png | 3 + ...ogin.impl.login_LoginModeView_Day_1_de.png | 3 + ...ogin.impl.login_LoginModeView_Day_2_de.png | 3 + ...ogin.impl.login_LoginModeView_Day_3_de.png | 3 + ...ogin.impl.login_LoginModeView_Day_4_de.png | 3 + ...ogin.impl.login_LoginModeView_Day_5_de.png | 3 + ...ogin.impl.login_LoginModeView_Day_6_de.png | 3 + ...der_ChangeAccountProviderView_Day_0_de.png | 3 + ...der_ChangeAccountProviderView_Day_1_de.png | 3 + ...der_ChooseAccountProviderView_Day_0_de.png | 3 + ...der_ChooseAccountProviderView_Day_1_de.png | 3 + ...der_ChooseAccountProviderView_Day_2_de.png | 3 + ...er_ConfirmAccountProviderView_Day_0_de.png | 3 + ...er_ConfirmAccountProviderView_Day_1_de.png | 3 + ...er_ConfirmAccountProviderView_Day_2_de.png | 3 + ...eateaccount_CreateAccountView_Day_0_de.png | 3 + ...eateaccount_CreateAccountView_Day_1_de.png | 3 + ...eateaccount_CreateAccountView_Day_2_de.png | 3 + ...eateaccount_CreateAccountView_Day_3_de.png | 3 + ...ginpassword_LoginPasswordView_Day_0_de.png | 3 + ...ginpassword_LoginPasswordView_Day_1_de.png | 3 + ...ginpassword_LoginPasswordView_Day_2_de.png | 3 + ...ens.onboarding_OnBoardingView_Day_0_de.png | 3 + ...ens.onboarding_OnBoardingView_Day_1_de.png | 3 + ...ens.onboarding_OnBoardingView_Day_2_de.png | 3 + ...ens.onboarding_OnBoardingView_Day_3_de.png | 3 + ...ens.onboarding_OnBoardingView_Day_4_de.png | 3 + ...ens.onboarding_OnBoardingView_Day_5_de.png | 3 + ...ens.onboarding_OnBoardingView_Day_6_de.png | 3 + ...ens.onboarding_OnBoardingView_Day_7_de.png | 3 + ...mation_QrCodeConfirmationView_Day_0_de.png | 3 + ...mation_QrCodeConfirmationView_Day_1_de.png | 3 + ...mation_QrCodeConfirmationView_Day_2_de.png | 3 + ....qrcode.error_QrCodeErrorView_Day_0_de.png | 3 + ....qrcode.error_QrCodeErrorView_Day_1_de.png | 3 + ....qrcode.error_QrCodeErrorView_Day_2_de.png | 3 + ....qrcode.error_QrCodeErrorView_Day_3_de.png | 3 + ....qrcode.error_QrCodeErrorView_Day_4_de.png | 3 + ....qrcode.error_QrCodeErrorView_Day_5_de.png | 3 + ....qrcode.error_QrCodeErrorView_Day_6_de.png | 3 + ....qrcode.intro_QrCodeIntroView_Day_0_de.png | 3 + ....qrcode.intro_QrCodeIntroView_Day_1_de.png | 3 + ...ns.qrcode.scan_QrCodeScanView_Day_0_de.png | 3 + ...ns.qrcode.scan_QrCodeScanView_Day_1_de.png | 3 + ...ns.qrcode.scan_QrCodeScanView_Day_2_de.png | 3 + ...ns.qrcode.scan_QrCodeScanView_Day_3_de.png | 3 + ...ns.qrcode.scan_QrCodeScanView_Day_4_de.png | 3 + ...ns.qrcode.scan_QrCodeScanView_Day_5_de.png | 3 + ...der_SearchAccountProviderView_Day_0_de.png | 3 + ...der_SearchAccountProviderView_Day_1_de.png | 3 + ...irect_DefaultDirectLogoutView_Day_1_de.png | 3 + ...irect_DefaultDirectLogoutView_Day_2_de.png | 3 + ...irect_DefaultDirectLogoutView_Day_3_de.png | 3 + ....impl_AccountDeactivationView_Day_0_de.png | 3 + ....impl_AccountDeactivationView_Day_1_de.png | 3 + ....impl_AccountDeactivationView_Day_2_de.png | 3 + ....impl_AccountDeactivationView_Day_3_de.png | 3 + ....impl_AccountDeactivationView_Day_4_de.png | 3 + ...atures.logout.impl_LogoutView_Day_0_de.png | 3 + ...tures.logout.impl_LogoutView_Day_10_de.png | 3 + ...tures.logout.impl_LogoutView_Day_11_de.png | 3 + ...atures.logout.impl_LogoutView_Day_1_de.png | 3 + ...atures.logout.impl_LogoutView_Day_2_de.png | 3 + ...atures.logout.impl_LogoutView_Day_3_de.png | 3 + ...atures.logout.impl_LogoutView_Day_4_de.png | 3 + ...atures.logout.impl_LogoutView_Day_5_de.png | 3 + ...atures.logout.impl_LogoutView_Day_6_de.png | 3 + ...atures.logout.impl_LogoutView_Day_7_de.png | 3 + ...atures.logout.impl_LogoutView_Day_8_de.png | 3 + ...atures.logout.impl_LogoutView_Day_9_de.png | 3 + ...onlist_ActionListViewContent_Day_10_de.png | 3 + ...onlist_ActionListViewContent_Day_11_de.png | 3 + ...onlist_ActionListViewContent_Day_12_de.png | 3 + ...ionlist_ActionListViewContent_Day_2_de.png | 3 + ...ionlist_ActionListViewContent_Day_3_de.png | 3 + ...ionlist_ActionListViewContent_Day_4_de.png | 3 + ...ionlist_ActionListViewContent_Day_5_de.png | 3 + ...ionlist_ActionListViewContent_Day_6_de.png | 3 + ...ionlist_ActionListViewContent_Day_7_de.png | 3 + ...ionlist_ActionListViewContent_Day_8_de.png | 3 + ...ionlist_ActionListViewContent_Day_9_de.png | 3 + ...tachments.preview_AttachmentsView_0_de.png | 3 + ...tachments.preview_AttachmentsView_1_de.png | 3 + ...tachments.preview_AttachmentsView_2_de.png | 3 + ...tachments.preview_AttachmentsView_3_de.png | 3 + ...tachments.preview_AttachmentsView_4_de.png | 3 + ...tachments.preview_AttachmentsView_5_de.png | 3 + ...tachments.preview_AttachmentsView_6_de.png | 3 + ...tachments.preview_AttachmentsView_7_de.png | 3 + ...tachments.preview_AttachmentsView_8_de.png | 3 + ...ew_VideoQualitySelectorDialog_Day_0_de.png | 3 + ...ntity_IdentityChangeStateView_Day_1_de.png | 3 + ...ntity_IdentityChangeStateView_Day_2_de.png | 3 + ...essagesViewWithIdentityChange_Day_0_de.png | 3 + ...essagesViewWithIdentityChange_Day_1_de.png | 3 + ...essagesViewWithIdentityChange_Day_2_de.png | 3 + ...veVerifiedUserSendFailureView_Day_1_de.png | 3 + ...veVerifiedUserSendFailureView_Day_2_de.png | 3 + ...s.messages.impl.link_LinkView_Day_1_de.png | 3 + ...estions_SuggestionsPickerView_Day_0_de.png | 3 + ...er_AttachmentSourcePickerMenu_Day_0_de.png | 3 + ...ecomposer_MessageComposerView_Day_0_de.png | 3 + ...ner_PinnedMessagesBannerView_Day_10_de.png | 3 + ...nner_PinnedMessagesBannerView_Day_1_de.png | 3 + ...nner_PinnedMessagesBannerView_Day_2_de.png | 3 + ...nner_PinnedMessagesBannerView_Day_3_de.png | 3 + ...nner_PinnedMessagesBannerView_Day_4_de.png | 3 + ...nner_PinnedMessagesBannerView_Day_5_de.png | 3 + ...nner_PinnedMessagesBannerView_Day_6_de.png | 3 + ...nner_PinnedMessagesBannerView_Day_7_de.png | 3 + ...nner_PinnedMessagesBannerView_Day_8_de.png | 3 + ...nner_PinnedMessagesBannerView_Day_9_de.png | 3 + ...d.list_PinnedMessagesListView_Day_0_de.png | 3 + ...d.list_PinnedMessagesListView_Day_1_de.png | 3 + ...d.list_PinnedMessagesListView_Day_2_de.png | 3 + ...d.list_PinnedMessagesListView_Day_3_de.png | 3 + ...impl.report_ReportMessageView_Day_0_de.png | 3 + ...impl.report_ReportMessageView_Day_1_de.png | 3 + ...impl.report_ReportMessageView_Day_2_de.png | 3 + ...impl.report_ReportMessageView_Day_3_de.png | 3 + ...impl.report_ReportMessageView_Day_4_de.png | 3 + ...impl.report_ReportMessageView_Day_5_de.png | 3 + ...omreaction.picker_EmojiPicker_Day_0_de.png | 3 + ...omreaction.picker_EmojiPicker_Day_1_de.png | 3 + ...ent_TimelineItemEncryptedView_Day_0_de.png | 3 + ...ent_TimelineItemEncryptedView_Day_1_de.png | 3 + ...ent_TimelineItemEncryptedView_Day_2_de.png | 3 + ...ent_TimelineItemEncryptedView_Day_3_de.png | 3 + ...ent_TimelineItemEncryptedView_Day_4_de.png | 3 + ...ent_TimelineItemEncryptedView_Day_5_de.png | 3 + ...ent_TimelineItemEncryptedView_Day_6_de.png | 3 + ...ent_TimelineItemEncryptedView_Day_7_de.png | 3 + ...ent_TimelineItemEncryptedView_Day_8_de.png | 3 + ...ItemImageViewHideMediaContent_Day_0_de.png | 3 + ...elineItemLegacyCallInviteView_Day_0_de.png | 3 + ...ts.event_TimelineItemPollView_Day_0_de.png | 3 + ...ts.event_TimelineItemPollView_Day_1_de.png | 3 + ...ts.event_TimelineItemPollView_Day_2_de.png | 3 + ...ts.event_TimelineItemPollView_Day_3_de.png | 3 + ...vent_TimelineItemRedactedView_Day_0_de.png | 3 + ...event_TimelineItemUnknownView_Day_0_de.png | 3 + ...ItemVideoViewHideMediaContent_Day_0_de.png | 3 + ...msheet_ReadReceiptBottomSheet_Day_0_de.png | 3 + ...msheet_ReadReceiptBottomSheet_Day_1_de.png | 3 + ...msheet_ReadReceiptBottomSheet_Day_2_de.png | 3 + ...msheet_ReadReceiptBottomSheet_Day_3_de.png | 3 + ...msheet_ReadReceiptBottomSheet_Day_4_de.png | 3 + ...msheet_ReadReceiptBottomSheet_Day_5_de.png | 3 + ...al_TimelineItemReadMarkerView_Day_0_de.png | 3 + ...TimelineItemRoomBeginningView_Day_0_de.png | 3 + ...eline.components_CallMenuItem_Day_2_de.png | 3 + ...eline.components_CallMenuItem_Day_3_de.png | 3 + ....components_MessageShieldView_Day_0_de.png | 3 + ....components_ThreadSummaryView_Day_0_de.png | 3 + ...ts_TimelineEventTimestampView_Day_3_de.png | 3 + ...ts_TimelineEventTimestampView_Day_4_de.png | 3 + ...ts_TimelineItemCallNotifyView_Day_0_de.png | 3 + ...TimelineItemEventRowTimestamp_Day_3_de.png | 3 + ...TimelineItemEventRowTimestamp_Day_4_de.png | 3 + ...TimelineItemEventRowTimestamp_Day_7_de.png | 3 + ...nents_TimelineItemEventRowUtd_Day_0_de.png | 3 + ...ItemEventRowWithManyReactions_Day_0_de.png | 3 + ...mEventRowWithReplyInformative_Day_0_de.png | 3 + ...mEventRowWithReplyInformative_Day_1_de.png | 3 + ...TimelineItemEventRowWithReply_Day_4_de.png | 3 + ...TimelineItemEventRowWithReply_Day_8_de.png | 3 + ...ItemEventRowWithThreadSummary_Day_0_de.png | 3 + ...nts_TimelineItemEventTimestampBelow_de.png | 3 + ...oupedEventsRowContentCollapse_Day_0_de.png | 3 + ...oupedEventsRowContentExpanded_Day_0_de.png | 3 + ...s_TimelineItemReactionsLayout_Day_0_de.png | 3 + ...lineItemReactionsViewIncoming_Day_0_de.png | 3 + ...lineItemReactionsViewOutgoing_Day_0_de.png | 3 + ...e.focus_FocusRequestStateView_Day_1_de.png | 3 + ...e.focus_FocusRequestStateView_Day_2_de.png | 3 + ...e.focus_FocusRequestStateView_Day_3_de.png | 3 + ...line.protection_ProtectedView_Day_0_de.png | 3 + ...line.protection_ProtectedView_Day_1_de.png | 3 + ...line.protection_ProtectedView_Day_2_de.png | 3 + ...line.protection_ProtectedView_Day_3_de.png | 3 + ...ine_TimelineViewMessageShield_Day_0_de.png | 3 + ...es.impl.timeline_TimelineView_Day_0_de.png | 3 + ...s.impl.timeline_TimelineView_Day_11_de.png | 3 + ...s.impl.timeline_TimelineView_Day_12_de.png | 3 + ...s.impl.timeline_TimelineView_Day_13_de.png | 3 + ...s.impl.timeline_TimelineView_Day_14_de.png | 3 + ...s.impl.timeline_TimelineView_Day_15_de.png | 3 + ...s.impl.timeline_TimelineView_Day_16_de.png | 3 + ...s.impl.timeline_TimelineView_Day_17_de.png | 3 + ...es.impl.timeline_TimelineView_Day_1_de.png | 3 + ...es.impl.timeline_TimelineView_Day_4_de.png | 3 + ...es.impl.timeline_TimelineView_Day_6_de.png | 3 + ...es.impl.timeline_TimelineView_Day_8_de.png | 3 + ...pl.topbars_MessagesViewTopBar_Day_0_de.png | 3 + ...ges.impl.topbars_ThreadTopBar_Day_0_de.png | 3 + ...typing_TypingNotificationView_Day_1_de.png | 3 + ...typing_TypingNotificationView_Day_2_de.png | 3 + ...typing_TypingNotificationView_Day_3_de.png | 3 + ...typing_TypingNotificationView_Day_4_de.png | 3 + ...typing_TypingNotificationView_Day_5_de.png | 3 + ...typing_TypingNotificationView_Day_6_de.png | 3 + ...es.messages.impl_MessagesView_Day_0_de.png | 3 + ...es.messages.impl_MessagesView_Day_1_de.png | 3 + ...es.messages.impl_MessagesView_Day_2_de.png | 3 + ...es.messages.impl_MessagesView_Day_3_de.png | 3 + ...es.messages.impl_MessagesView_Day_4_de.png | 3 + ...es.messages.impl_MessagesView_Day_5_de.png | 3 + ...es.messages.impl_MessagesView_Day_6_de.png | 3 + ...es.messages.impl_MessagesView_Day_7_de.png | 3 + ...es.messages.impl_MessagesView_Day_8_de.png | 3 + ...es.messages.impl_MessagesView_Day_9_de.png | 3 + ....migration.impl_MigrationView_Day_1_de.png | 3 + ...nswerViewDisclosedNotSelected_Day_0_de.png | 3 + ...llAnswerViewDisclosedSelected_Day_0_de.png | 3 + ...t_PollAnswerViewEndedSelected_Day_0_de.png | 3 + ...werViewEndedWinnerNotSelected_Day_0_de.png | 3 + ...AnswerViewEndedWinnerSelected_Day_0_de.png | 3 + ...ollContentViewCreatorEditable_Day_0_de.png | 3 + ...t_PollContentViewCreatorEnded_Day_0_de.png | 3 + ...ontent_PollContentViewCreator_Day_0_de.png | 3 + ...tent_PollContentViewDisclosed_Day_0_de.png | 3 + ...lcontent_PollContentViewEnded_Day_0_de.png | 3 + ...nt_PollContentViewUndisclosed_Day_0_de.png | 3 + ...ll.impl.create_CreatePollView_Day_0_de.png | 3 + ...ll.impl.create_CreatePollView_Day_1_de.png | 3 + ...ll.impl.create_CreatePollView_Day_2_de.png | 3 + ...ll.impl.create_CreatePollView_Day_3_de.png | 3 + ...ll.impl.create_CreatePollView_Day_4_de.png | 3 + ...ll.impl.create_CreatePollView_Day_5_de.png | 3 + ...ll.impl.create_CreatePollView_Day_6_de.png | 3 + ...ll.impl.create_CreatePollView_Day_7_de.png | 3 + ....impl.history_PollHistoryView_Day_0_de.png | 3 + ....impl.history_PollHistoryView_Day_1_de.png | 3 + ....impl.history_PollHistoryView_Day_2_de.png | 3 + ....impl.history_PollHistoryView_Day_3_de.png | 3 + ....impl.history_PollHistoryView_Day_4_de.png | 3 + ...ferences.impl.about_AboutView_Day_0_de.png | 3 + ...advanced_AdvancedSettingsViewDark_0_de.png | 3 + ...advanced_AdvancedSettingsViewDark_1_de.png | 3 + ...advanced_AdvancedSettingsViewDark_2_de.png | 3 + ...advanced_AdvancedSettingsViewDark_3_de.png | 3 + ...advanced_AdvancedSettingsViewDark_4_de.png | 3 + ...advanced_AdvancedSettingsViewDark_5_de.png | 3 + ...advanced_AdvancedSettingsViewDark_6_de.png | 3 + ...advanced_AdvancedSettingsViewDark_7_de.png | 3 + ...advanced_AdvancedSettingsViewDark_8_de.png | 3 + ...dvanced_AdvancedSettingsViewLight_0_de.png | 3 + ...dvanced_AdvancedSettingsViewLight_1_de.png | 3 + ...dvanced_AdvancedSettingsViewLight_2_de.png | 3 + ...dvanced_AdvancedSettingsViewLight_3_de.png | 3 + ...dvanced_AdvancedSettingsViewLight_4_de.png | 3 + ...dvanced_AdvancedSettingsViewLight_5_de.png | 3 + ...dvanced_AdvancedSettingsViewLight_6_de.png | 3 + ...dvanced_AdvancedSettingsViewLight_7_de.png | 3 + ...dvanced_AdvancedSettingsViewLight_8_de.png | 3 + ...ed_VideoQualitySelectorDialog_Day_0_de.png | 3 + ...alytics_AnalyticsSettingsView_Day_0_de.png | 3 + ...blockedusers_BlockedUsersView_Day_0_de.png | 3 + ...blockedusers_BlockedUsersView_Day_1_de.png | 3 + ...blockedusers_BlockedUsersView_Day_2_de.png | 3 + ...blockedusers_BlockedUsersView_Day_3_de.png | 3 + ...blockedusers_BlockedUsersView_Day_4_de.png | 3 + ...blockedusers_BlockedUsersView_Day_5_de.png | 3 + ...blockedusers_BlockedUsersView_Day_6_de.png | 3 + ...veloper_DeveloperSettingsView_Day_0_de.png | 3 + ...veloper_DeveloperSettingsView_Day_1_de.png | 3 + ...veloper_DeveloperSettingsView_Day_2_de.png | 3 + ...veloper_DeveloperSettingsView_Day_3_de.png | 3 + ...references.impl.labs_LabsView_Day_0_de.png | 3 + ...references.impl.labs_LabsView_Day_1_de.png | 3 + ...aultNotificationSettingOption_Day_0_de.png | 3 + ...efaultNotificationSettingView_Day_0_de.png | 3 + ...efaultNotificationSettingView_Day_1_de.png | 3 + ...efaultNotificationSettingView_Day_2_de.png | 3 + ...efaultNotificationSettingView_Day_3_de.png | 3 + ...efaultNotificationSettingView_Day_4_de.png | 3 + ...ions_NotificationSettingsView_Day_0_de.png | 3 + ...ons_NotificationSettingsView_Day_10_de.png | 3 + ...ons_NotificationSettingsView_Day_11_de.png | 3 + ...ons_NotificationSettingsView_Day_12_de.png | 3 + ...ons_NotificationSettingsView_Day_13_de.png | 3 + ...ions_NotificationSettingsView_Day_1_de.png | 3 + ...ions_NotificationSettingsView_Day_2_de.png | 3 + ...ions_NotificationSettingsView_Day_3_de.png | 3 + ...ions_NotificationSettingsView_Day_4_de.png | 3 + ...ions_NotificationSettingsView_Day_5_de.png | 3 + ...ions_NotificationSettingsView_Day_6_de.png | 3 + ...ions_NotificationSettingsView_Day_7_de.png | 3 + ...ions_NotificationSettingsView_Day_8_de.png | 3 + ...ions_NotificationSettingsView_Day_9_de.png | 3 + ...impl.root_MultiAccountSection_Day_0_de.png | 3 + ...impl.root_PreferencesRootViewDark_0_de.png | 3 + ...impl.root_PreferencesRootViewDark_1_de.png | 3 + ...mpl.root_PreferencesRootViewLight_0_de.png | 3 + ...mpl.root_PreferencesRootViewLight_1_de.png | 3 + ...itprofile_EditUserProfileView_Day_0_de.png | 3 + ...itprofile_EditUserProfileView_Day_1_de.png | 3 + ....api.crash_CrashDetectionView_Day_0_de.png | 3 + ...ection_RageshakeDialogContent_Day_0_de.png | 3 + ...nces_RageshakePreferencesView_Day_0_de.png | 3 + ...e.impl.bugreport_BugReportViewDay_0_de.png | 3 + ...e.impl.bugreport_BugReportViewDay_1_de.png | 3 + ...e.impl.bugreport_BugReportViewDay_2_de.png | 3 + ...e.impl.bugreport_BugReportViewDay_3_de.png | 3 + ...e.impl.bugreport_BugReportViewDay_4_de.png | 3 + ...eportroom.impl_ReportRoomView_Day_0_de.png | 3 + ...eportroom.impl_ReportRoomView_Day_1_de.png | 3 + ...eportroom.impl_ReportRoomView_Day_2_de.png | 3 + ...eportroom.impl_ReportRoomView_Day_3_de.png | 3 + ...eportroom.impl_ReportRoomView_Day_4_de.png | 3 + ...ons_ChangeRoomPermissionsView_Day_0_de.png | 3 + ...ons_ChangeRoomPermissionsView_Day_1_de.png | 3 + ...ons_ChangeRoomPermissionsView_Day_2_de.png | 3 + ...ons_ChangeRoomPermissionsView_Day_3_de.png | 3 + ...ons_ChangeRoomPermissionsView_Day_4_de.png | 3 + ...ns.impl.roles_ChangeRolesView_Day_0_de.png | 3 + ...s.impl.roles_ChangeRolesView_Day_10_de.png | 3 + ...s.impl.roles_ChangeRolesView_Day_11_de.png | 3 + ...s.impl.roles_ChangeRolesView_Day_12_de.png | 3 + ...s.impl.roles_ChangeRolesView_Day_13_de.png | 3 + ...ns.impl.roles_ChangeRolesView_Day_1_de.png | 3 + ...ns.impl.roles_ChangeRolesView_Day_2_de.png | 3 + ...ns.impl.roles_ChangeRolesView_Day_3_de.png | 3 + ...ns.impl.roles_ChangeRolesView_Day_4_de.png | 3 + ...ns.impl.roles_ChangeRolesView_Day_6_de.png | 3 + ...ns.impl.roles_ChangeRolesView_Day_7_de.png | 3 + ...ns.impl.roles_ChangeRolesView_Day_8_de.png | 3 + ...ns.impl.roles_ChangeRolesView_Day_9_de.png | 3 + ..._PendingMemberRowWithLongName_Day_0_de.png | 3 + ....root_RolesAndPermissionsView_Day_0_de.png | 3 + ....root_RolesAndPermissionsView_Day_1_de.png | 3 + ....root_RolesAndPermissionsView_Day_2_de.png | 3 + ....root_RolesAndPermissionsView_Day_3_de.png | 3 + ....root_RolesAndPermissionsView_Day_4_de.png | 3 + ....root_RolesAndPermissionsView_Day_5_de.png | 3 + ....root_RolesAndPermissionsView_Day_6_de.png | 3 + ....root_RolesAndPermissionsView_Day_7_de.png | 3 + ....root_RolesAndPermissionsView_Day_8_de.png | 3 + ...er.impl_RoomAliasResolverView_Day_1_de.png | 3 + ...er.impl_RoomAliasResolverView_Day_2_de.png | 3 + ...impl.edit_RoomDetailsEditView_Day_0_de.png | 3 + ...impl.edit_RoomDetailsEditView_Day_1_de.png | 3 + ...impl.edit_RoomDetailsEditView_Day_2_de.png | 3 + ...impl.edit_RoomDetailsEditView_Day_3_de.png | 3 + ...impl.edit_RoomDetailsEditView_Day_4_de.png | 3 + ...impl.edit_RoomDetailsEditView_Day_5_de.png | 3 + ...impl.edit_RoomDetailsEditView_Day_6_de.png | 3 + ...impl.edit_RoomDetailsEditView_Day_7_de.png | 3 + ...impl.edit_RoomDetailsEditView_Day_8_de.png | 3 + ....invite_RoomInviteMembersView_Day_0_de.png | 3 + ....invite_RoomInviteMembersView_Day_1_de.png | 3 + ....invite_RoomInviteMembersView_Day_2_de.png | 3 + ....invite_RoomInviteMembersView_Day_3_de.png | 3 + ...bers_RoomMemberListViewBanned_Day_0_de.png | 3 + ...bers_RoomMemberListViewBanned_Day_1_de.png | 3 + ...bers_RoomMemberListViewBanned_Day_2_de.png | 3 + ...pl.members_RoomMemberListView_Day_0_de.png | 3 + ...pl.members_RoomMemberListView_Day_1_de.png | 3 + ...pl.members_RoomMemberListView_Day_2_de.png | 3 + ...pl.members_RoomMemberListView_Day_3_de.png | 3 + ...pl.members_RoomMemberListView_Day_4_de.png | 3 + ...pl.members_RoomMemberListView_Day_5_de.png | 3 + ...pl.members_RoomMemberListView_Day_7_de.png | 3 + ...pl.members_RoomMemberListView_Day_8_de.png | 3 + ...pl.members_RoomMemberListView_Day_9_de.png | 3 + ...oomNotificationSettingsOption_Day_0_de.png | 3 + ..._RoomNotificationSettingsView_Day_0_de.png | 3 + ..._RoomNotificationSettingsView_Day_1_de.png | 3 + ..._RoomNotificationSettingsView_Day_2_de.png | 3 + ..._RoomNotificationSettingsView_Day_3_de.png | 3 + ..._RoomNotificationSettingsView_Day_4_de.png | 3 + ..._RoomNotificationSettingsView_Day_5_de.png | 3 + ..._RoomNotificationSettingsView_Day_6_de.png | 3 + ...dRoomNotificationSettingsView_Day_0_de.png | 3 + ...omaddress_EditRoomAddressView_Day_0_de.png | 3 + ...omaddress_EditRoomAddressView_Day_1_de.png | 3 + ...omaddress_EditRoomAddressView_Day_2_de.png | 3 + ...omaddress_EditRoomAddressView_Day_3_de.png | 3 + ...omaddress_EditRoomAddressView_Day_4_de.png | 3 + ...rivacy_SecurityAndPrivacyViewDark_0_de.png | 3 + ...rivacy_SecurityAndPrivacyViewDark_1_de.png | 3 + ...rivacy_SecurityAndPrivacyViewDark_2_de.png | 3 + ...rivacy_SecurityAndPrivacyViewDark_3_de.png | 3 + ...rivacy_SecurityAndPrivacyViewDark_4_de.png | 3 + ...rivacy_SecurityAndPrivacyViewDark_5_de.png | 3 + ...rivacy_SecurityAndPrivacyViewDark_6_de.png | 3 + ...rivacy_SecurityAndPrivacyViewDark_7_de.png | 3 + ...rivacy_SecurityAndPrivacyViewDark_8_de.png | 3 + ...rivacy_SecurityAndPrivacyViewDark_9_de.png | 3 + ...ivacy_SecurityAndPrivacyViewLight_0_de.png | 3 + ...ivacy_SecurityAndPrivacyViewLight_1_de.png | 3 + ...ivacy_SecurityAndPrivacyViewLight_2_de.png | 3 + ...ivacy_SecurityAndPrivacyViewLight_3_de.png | 3 + ...ivacy_SecurityAndPrivacyViewLight_4_de.png | 3 + ...ivacy_SecurityAndPrivacyViewLight_5_de.png | 3 + ...ivacy_SecurityAndPrivacyViewLight_6_de.png | 3 + ...ivacy_SecurityAndPrivacyViewLight_7_de.png | 3 + ...ivacy_SecurityAndPrivacyViewLight_8_de.png | 3 + ...ivacy_SecurityAndPrivacyViewLight_9_de.png | 3 + ....roomdetails.impl_RoomDetailsDark_0_de.png | 3 + ...roomdetails.impl_RoomDetailsDark_10_de.png | 3 + ...roomdetails.impl_RoomDetailsDark_11_de.png | 3 + ...roomdetails.impl_RoomDetailsDark_12_de.png | 3 + ...roomdetails.impl_RoomDetailsDark_13_de.png | 3 + ...roomdetails.impl_RoomDetailsDark_14_de.png | 3 + ...roomdetails.impl_RoomDetailsDark_15_de.png | 3 + ...roomdetails.impl_RoomDetailsDark_16_de.png | 3 + ...roomdetails.impl_RoomDetailsDark_17_de.png | 3 + ...roomdetails.impl_RoomDetailsDark_18_de.png | 3 + ...roomdetails.impl_RoomDetailsDark_19_de.png | 3 + ....roomdetails.impl_RoomDetailsDark_1_de.png | 3 + ....roomdetails.impl_RoomDetailsDark_2_de.png | 3 + ....roomdetails.impl_RoomDetailsDark_3_de.png | 3 + ....roomdetails.impl_RoomDetailsDark_4_de.png | 3 + ....roomdetails.impl_RoomDetailsDark_5_de.png | 3 + ....roomdetails.impl_RoomDetailsDark_6_de.png | 3 + ....roomdetails.impl_RoomDetailsDark_7_de.png | 3 + ....roomdetails.impl_RoomDetailsDark_8_de.png | 3 + ....roomdetails.impl_RoomDetailsDark_9_de.png | 3 + ...ures.roomdetails.impl_RoomDetails_0_de.png | 3 + ...res.roomdetails.impl_RoomDetails_10_de.png | 3 + ...res.roomdetails.impl_RoomDetails_11_de.png | 3 + ...res.roomdetails.impl_RoomDetails_12_de.png | 3 + ...res.roomdetails.impl_RoomDetails_13_de.png | 3 + ...res.roomdetails.impl_RoomDetails_14_de.png | 3 + ...res.roomdetails.impl_RoomDetails_15_de.png | 3 + ...res.roomdetails.impl_RoomDetails_16_de.png | 3 + ...res.roomdetails.impl_RoomDetails_17_de.png | 3 + ...res.roomdetails.impl_RoomDetails_18_de.png | 3 + ...res.roomdetails.impl_RoomDetails_19_de.png | 3 + ...ures.roomdetails.impl_RoomDetails_1_de.png | 3 + ...ures.roomdetails.impl_RoomDetails_2_de.png | 3 + ...ures.roomdetails.impl_RoomDetails_3_de.png | 3 + ...ures.roomdetails.impl_RoomDetails_4_de.png | 3 + ...ures.roomdetails.impl_RoomDetails_5_de.png | 3 + ...ures.roomdetails.impl_RoomDetails_6_de.png | 3 + ...ures.roomdetails.impl_RoomDetails_7_de.png | 3 + ...ures.roomdetails.impl_RoomDetails_8_de.png | 3 + ...ures.roomdetails.impl_RoomDetails_9_de.png | 3 + ...y.impl.root_RoomDirectoryView_Day_0_de.png | 3 + ...y.impl.root_RoomDirectoryView_Day_1_de.png | 3 + ...y.impl.root_RoomDirectoryView_Day_2_de.png | 3 + ...impl_RoomMemberModerationView_Day_0_de.png | 3 + ...impl_RoomMemberModerationView_Day_1_de.png | 3 + ...impl_RoomMemberModerationView_Day_2_de.png | 3 + ...impl_RoomMemberModerationView_Day_3_de.png | 3 + ...impl_RoomMemberModerationView_Day_4_de.png | 3 + ...impl_RoomMemberModerationView_Day_5_de.png | 3 + ...impl_RoomMemberModerationView_Day_6_de.png | 3 + ...impl_RoomMemberModerationView_Day_7_de.png | 3 + ...impl_RoomMemberModerationView_Day_8_de.png | 3 + ...sable_SecureBackupDisableView_Day_0_de.png | 3 + ...sable_SecureBackupDisableView_Day_1_de.png | 3 + ...sable_SecureBackupDisableView_Day_2_de.png | 3 + ...sable_SecureBackupDisableView_Day_3_de.png | 3 + ...ureBackupEnterRecoveryKeyView_Day_0_de.png | 3 + ...ureBackupEnterRecoveryKeyView_Day_1_de.png | 3 + ...ureBackupEnterRecoveryKeyView_Day_2_de.png | 3 + ...ureBackupEnterRecoveryKeyView_Day_3_de.png | 3 + ...ureBackupEnterRecoveryKeyView_Day_4_de.png | 3 + ...ord_ResetIdentityPasswordView_Day_0_de.png | 3 + ...ord_ResetIdentityPasswordView_Day_1_de.png | 3 + ...ord_ResetIdentityPasswordView_Day_2_de.png | 3 + ...ord_ResetIdentityPasswordView_Day_3_de.png | 3 + ...et.root_ResetIdentityRootView_Day_0_de.png | 3 + ...et.root_ResetIdentityRootView_Day_1_de.png | 3 + ...mpl.root_SecureBackupRootView_Day_0_de.png | 3 + ...pl.root_SecureBackupRootView_Day_10_de.png | 3 + ...pl.root_SecureBackupRootView_Day_11_de.png | 3 + ...pl.root_SecureBackupRootView_Day_12_de.png | 3 + ...pl.root_SecureBackupRootView_Day_13_de.png | 3 + ...pl.root_SecureBackupRootView_Day_14_de.png | 3 + ...pl.root_SecureBackupRootView_Day_15_de.png | 3 + ...pl.root_SecureBackupRootView_Day_16_de.png | 3 + ...pl.root_SecureBackupRootView_Day_17_de.png | 3 + ...mpl.root_SecureBackupRootView_Day_1_de.png | 3 + ...mpl.root_SecureBackupRootView_Day_2_de.png | 3 + ...mpl.root_SecureBackupRootView_Day_3_de.png | 3 + ...mpl.root_SecureBackupRootView_Day_4_de.png | 3 + ...mpl.root_SecureBackupRootView_Day_5_de.png | 3 + ...mpl.root_SecureBackupRootView_Day_6_de.png | 3 + ...mpl.root_SecureBackupRootView_Day_7_de.png | 3 + ...mpl.root_SecureBackupRootView_Day_8_de.png | 3 + ...mpl.root_SecureBackupRootView_Day_9_de.png | 3 + ...l.setup.views_RecoveryKeyView_Day_0_de.png | 3 + ....setup.views_RecoveryKeyView_Day_10_de.png | 3 + ....setup.views_RecoveryKeyView_Day_11_de.png | 3 + ....setup.views_RecoveryKeyView_Day_12_de.png | 3 + ....setup.views_RecoveryKeyView_Day_13_de.png | 3 + ....setup.views_RecoveryKeyView_Day_14_de.png | 3 + ...l.setup.views_RecoveryKeyView_Day_1_de.png | 3 + ...l.setup.views_RecoveryKeyView_Day_2_de.png | 3 + ...l.setup.views_RecoveryKeyView_Day_3_de.png | 3 + ...l.setup.views_RecoveryKeyView_Day_4_de.png | 3 + ...l.setup.views_RecoveryKeyView_Day_5_de.png | 3 + ...l.setup.views_RecoveryKeyView_Day_6_de.png | 3 + ...l.setup.views_RecoveryKeyView_Day_7_de.png | 3 + ...l.setup.views_RecoveryKeyView_Day_8_de.png | 3 + ...l.setup.views_RecoveryKeyView_Day_9_de.png | 3 + ...p_SecureBackupSetupViewChange_Day_0_de.png | 3 + ...p_SecureBackupSetupViewChange_Day_1_de.png | 3 + ...p_SecureBackupSetupViewChange_Day_2_de.png | 3 + ...p_SecureBackupSetupViewChange_Day_3_de.png | 3 + ...p_SecureBackupSetupViewChange_Day_4_de.png | 3 + ...p_SecureBackupSetupViewChange_Day_5_de.png | 3 + ...l.setup_SecureBackupSetupView_Day_0_de.png | 3 + ...l.setup_SecureBackupSetupView_Day_1_de.png | 3 + ...l.setup_SecureBackupSetupView_Day_2_de.png | 3 + ...l.setup_SecureBackupSetupView_Day_3_de.png | 3 + ...l.setup_SecureBackupSetupView_Day_4_de.png | 3 + ...l.setup_SecureBackupSetupView_Day_5_de.png | 3 + ...features.share.impl_ShareView_Day_3_de.png | 3 + ....signedout.impl_SignedOutView_Day_0_de.png | 3 + ...ace.impl.leave_LeaveSpaceView_Day_0_de.png | 3 + ...ace.impl.leave_LeaveSpaceView_Day_1_de.png | 3 + ...ace.impl.leave_LeaveSpaceView_Day_2_de.png | 3 + ...ace.impl.leave_LeaveSpaceView_Day_3_de.png | 3 + ...ace.impl.leave_LeaveSpaceView_Day_4_de.png | 3 + ...ace.impl.leave_LeaveSpaceView_Day_5_de.png | 3 + ...ace.impl.leave_LeaveSpaceView_Day_6_de.png | 3 + ...ace.impl.leave_LeaveSpaceView_Day_7_de.png | 3 + ...ace.impl.leave_LeaveSpaceView_Day_8_de.png | 3 + ...ace.impl.leave_LeaveSpaceView_Day_9_de.png | 3 + ...res.space.impl.root_SpaceView_Day_0_de.png | 3 + ...res.space.impl.root_SpaceView_Day_1_de.png | 3 + ...res.space.impl.root_SpaceView_Day_2_de.png | 3 + ...res.space.impl.root_SpaceView_Day_3_de.png | 3 + ...res.space.impl.root_SpaceView_Day_4_de.png | 3 + ...res.space.impl.root_SpaceView_Day_5_de.png | 3 + ...pl.settings_SpaceSettingsView_Day_0_de.png | 3 + ...pl.settings_SpaceSettingsView_Day_1_de.png | 3 + ...pl.settings_SpaceSettingsView_Day_2_de.png | 3 + ...pl.settings_SpaceSettingsView_Day_3_de.png | 3 + ...nents_SearchMultipleUsersResultItem_de.png | 3 + ...mponents_SearchSingleUserResultItem_de.png | 3 + ....impl.components_UserListView_Day_0_de.png | 3 + ....impl.components_UserListView_Day_1_de.png | 3 + ....impl.components_UserListView_Day_2_de.png | 3 + ....impl.components_UserListView_Day_7_de.png | 3 + ....impl.components_UserListView_Day_9_de.png | 3 + ...address_JoinRoomByAddressView_Day_0_de.png | 3 + ...address_JoinRoomByAddressView_Day_1_de.png | 3 + ...address_JoinRoomByAddressView_Day_2_de.png | 3 + ...address_JoinRoomByAddressView_Day_3_de.png | 3 + ...address_JoinRoomByAddressView_Day_4_de.png | 3 + ...address_JoinRoomByAddressView_Day_5_de.png | 3 + ...tchat.impl.root_StartChatView_Day_0_de.png | 3 + ...tchat.impl.root_StartChatView_Day_1_de.png | 3 + ...tchat.impl.root_StartChatView_Day_2_de.png | 3 + ...tchat.impl.root_StartChatView_Day_3_de.png | 3 + ...tchat.impl.root_StartChatView_Day_4_de.png | 3 + ...tchat.impl.root_StartChatView_Day_5_de.png | 3 + ...tionWithVerificationViolation_Day_0_de.png | 3 + ...ared_UserProfileHeaderSection_Day_0_de.png | 3 + ...rofile.shared_UserProfileView_Day_0_de.png | 3 + ...rofile.shared_UserProfileView_Day_1_de.png | 3 + ...rofile.shared_UserProfileView_Day_2_de.png | 3 + ...rofile.shared_UserProfileView_Day_3_de.png | 3 + ...rofile.shared_UserProfileView_Day_4_de.png | 3 + ...rofile.shared_UserProfileView_Day_5_de.png | 3 + ...rofile.shared_UserProfileView_Day_6_de.png | 3 + ...rofile.shared_UserProfileView_Day_7_de.png | 3 + ...rofile.shared_UserProfileView_Day_8_de.png | 3 + ...rofile.shared_UserProfileView_Day_9_de.png | 3 + ...ysession.impl.emoji_SasEmojis_Day_0_de.png | 3 + ...ncoming.ui_SessionDetailsView_Day_0_de.png | 3 + ...ming_IncomingVerificationView_Day_0_de.png | 3 + ...ing_IncomingVerificationView_Day_10_de.png | 3 + ...ing_IncomingVerificationView_Day_11_de.png | 3 + ...ing_IncomingVerificationView_Day_12_de.png | 3 + ...ing_IncomingVerificationView_Day_13_de.png | 3 + ...ming_IncomingVerificationView_Day_1_de.png | 3 + ...ming_IncomingVerificationView_Day_2_de.png | 3 + ...ming_IncomingVerificationView_Day_3_de.png | 3 + ...ming_IncomingVerificationView_Day_4_de.png | 3 + ...ming_IncomingVerificationView_Day_5_de.png | 3 + ...ming_IncomingVerificationView_Day_6_de.png | 3 + ...ming_IncomingVerificationView_Day_7_de.png | 3 + ...ming_IncomingVerificationView_Day_8_de.png | 3 + ...ming_IncomingVerificationView_Day_9_de.png | 3 + ...oing_OutgoingVerificationView_Day_0_de.png | 3 + ...ing_OutgoingVerificationView_Day_10_de.png | 3 + ...ing_OutgoingVerificationView_Day_11_de.png | 3 + ...oing_OutgoingVerificationView_Day_1_de.png | 3 + ...oing_OutgoingVerificationView_Day_2_de.png | 3 + ...oing_OutgoingVerificationView_Day_3_de.png | 3 + ...oing_OutgoingVerificationView_Day_4_de.png | 3 + ...oing_OutgoingVerificationView_Day_5_de.png | 3 + ...oing_OutgoingVerificationView_Day_6_de.png | 3 + ...oing_OutgoingVerificationView_Day_7_de.png | 3 + ...oing_OutgoingVerificationView_Day_8_de.png | 3 + ...oing_OutgoingVerificationView_Day_9_de.png | 3 + ...folder.impl.file_ViewFileView_Day_3_de.png | 3 + ...select.impl_AccountSelectView_Day_0_de.png | 3 + ...select.impl_AccountSelectView_Day_1_de.png | 3 + ...pl.previews_DateFormatterModeView_0_de.png | 3 + ...pl.previews_DateFormatterModeView_1_de.png | 3 + ...pl.previews_DateFormatterModeView_2_de.png | 3 + ...pl.previews_DateFormatterModeView_3_de.png | 3 + ...pl.previews_DateFormatterModeView_4_de.png | 3 + ...lecules_ComposerAlertMolecule_Day_0_de.png | 3 + ...lecules_ComposerAlertMolecule_Day_1_de.png | 3 + ...lecules_ComposerAlertMolecule_Day_2_de.png | 3 + ...lecules_ComposerAlertMolecule_Day_3_de.png | 3 + ...lecules_ComposerAlertMolecule_Day_4_de.png | 3 + ...lecules_ComposerAlertMolecule_Day_5_de.png | 3 + ...lecules_ComposerAlertMolecule_Day_6_de.png | 3 + ...lecules_ComposerAlertMolecule_Day_7_de.png | 3 + ...lecules_ComposerAlertMolecule_Day_8_de.png | 3 + ...ponents.async_AsyncActionView_Day_1_de.png | 3 + ...ponents.async_AsyncActionView_Day_3_de.png | 3 + ...components.async_AsyncFailure_Day_0_de.png | 3 + ....dialogs_AlertDialogContent_Dialogs_de.png | 3 + ...omponents.dialogs_AlertDialog_Day_0_de.png | 3 + ....dialogs_ErrorDialogContent_Dialogs_de.png | 3 + ...ErrorDialogWithDoNotShowAgain_Day_0_de.png | 3 + ...omponents.dialogs_ErrorDialog_Day_0_de.png | 3 + ....dialogs_RetryDialogContent_Dialogs_de.png | 3 + ...omponents.dialogs_RetryDialog_Day_0_de.png | 3 + ...nts.dialogs_SaveChangesDialog_Day_0_de.png | 3 + ...logs_TextFieldDialogWithError_Day_0_de.png | 3 + ...nents.dialogs_TextFieldDialog_Day_0_de.png | 3 + ...nents_ProgressDialogContent_Dialogs_de.png | 3 + ...nts_ProgressDialogWithContent_Day_0_de.png | 3 + ...tem.components_ProgressDialog_Day_0_de.png | 3 + ...ews_DatePickerDark_DateTime_pickers_de.png | 3 + ...ws_DatePickerLight_DateTime_pickers_de.png | 3 + ...mePickerHorizontal_DateTime_pickers_de.png | 3 + ...PickerVerticalDark_DateTime_pickers_de.png | 3 + ...ickerVerticalLight_DateTime_pickers_de.png | 3 + ...BarActiveWithNoResults_Search_views_de.png | 3 + ...nents_AvatarActionBottomSheet_Day_0_de.png | 3 + ...mponents_CheckableUnresolvedUserRow_de.png | 3 + ...eateDmConfirmationBottomSheet_Day_0_de.png | 3 + ...eateDmConfirmationBottomSheet_Day_1_de.png | 3 + ...i.components_InviteSenderView_Day_0_de.png | 3 + ...components_OrganizationHeader_Day_0_de.png | 3 + ...omponents_SpaceHeaderRootView_Day_0_de.png | 3 + ...ui.components_SpaceHeaderView_Day_0_de.png | 3 + ...ix.ui.components_SpaceInfoRow_Day_0_de.png | 3 + ....components_SpaceRoomItemView_Day_0_de.png | 3 + ....components_SpaceRoomItemView_Day_1_de.png | 3 + ....components_SpaceRoomItemView_Day_2_de.png | 3 + ....components_SpaceRoomItemView_Day_3_de.png | 3 + ....components_SpaceRoomItemView_Day_4_de.png | 3 + ....components_SpaceRoomItemView_Day_5_de.png | 3 + ....components_SpaceRoomItemView_Day_6_de.png | 3 + ....components_SpaceRoomItemView_Day_7_de.png | 3 + ....components_SpaceRoomItemView_Day_8_de.png | 3 + ...rix.ui.components_UnresolvedUserRow_de.png | 3 + ....messages.reply_InReplyToView_Day_4_de.png | 3 + ....messages.reply_InReplyToView_Day_8_de.png | 3 + ...DeleteConfirmationBottomSheet_Day_0_de.png | 3 + ...tails_MediaDetailsBottomSheet_Day_0_de.png | 3 + ...impl.gallery_MediaGalleryView_Day_0_de.png | 3 + ...mpl.gallery_MediaGalleryView_Day_10_de.png | 3 + ...mpl.gallery_MediaGalleryView_Day_11_de.png | 3 + ...mpl.gallery_MediaGalleryView_Day_12_de.png | 3 + ...impl.gallery_MediaGalleryView_Day_1_de.png | 3 + ...impl.gallery_MediaGalleryView_Day_2_de.png | 3 + ...impl.gallery_MediaGalleryView_Day_3_de.png | 3 + ...impl.gallery_MediaGalleryView_Day_4_de.png | 3 + ...impl.gallery_MediaGalleryView_Day_5_de.png | 3 + ...impl.gallery_MediaGalleryView_Day_6_de.png | 3 + ...impl.gallery_MediaGalleryView_Day_7_de.png | 3 + ...impl.gallery_MediaGalleryView_Day_8_de.png | 3 + ...impl.gallery_MediaGalleryView_Day_9_de.png | 3 + ...l.local.pdf_PdfPagesErrorView_Day_0_de.png | 3 + ...ewer.impl.viewer_MediaViewerView_11_de.png | 3 + ...ewer.impl.viewer_MediaViewerView_12_de.png | 3 + ...ewer.impl.viewer_MediaViewerView_14_de.png | 3 + ...iewer.impl.viewer_MediaViewerView_2_de.png | 3 + ...rmissions.api_PermissionsView_Day_0_de.png | 3 + ...rmissions.api_PermissionsView_Day_1_de.png | 3 + ...rmissions.api_PermissionsView_Day_2_de.png | 3 + ...rmissions.api_PermissionsView_Day_3_de.png | 3 + ...oomselect.impl_RoomSelectView_Day_0_de.png | 3 + ...oomselect.impl_RoomSelectView_Day_1_de.png | 3 + ...oomselect.impl_RoomSelectView_Day_2_de.png | 3 + ...oomselect.impl_RoomSelectView_Day_3_de.png | 3 + ...oomselect.impl_RoomSelectView_Day_4_de.png | 3 + ...oomselect.impl_RoomSelectView_Day_5_de.png | 3 + ...ser_CaptionWarningBottomSheet_Day_0_de.png | 3 + ...textcomposer_ComposerModeView_Day_0_de.png | 3 + ...oser_MarkdownTextComposerEdit_Day_0_de.png | 3 + ...mposer_TextComposerAddCaption_Day_0_de.png | 3 + ...tcomposer_TextComposerCaption_Day_0_de.png | 3 + ...poser_TextComposerEditCaption_Day_0_de.png | 3 + ..._TextComposerEditNotEncrypted_Day_0_de.png | 3 + ...textcomposer_TextComposerEdit_Day_0_de.png | 3 + ...omposerFormattingNotEncrypted_Day_0_de.png | 3 + ...mposer_TextComposerFormatting_Day_0_de.png | 3 + ...nkDialogCreateLinkWithoutText_Day_0_de.png | 3 + ...tComposerLinkDialogCreateLink_Day_0_de.png | 3 + ...extComposerLinkDialogEditLink_Day_0_de.png | 3 + ...TextComposerReplyNotEncrypted_Day_0_de.png | 3 + ...extComposerReplyNotEncrypted_Day_10_de.png | 3 + ...extComposerReplyNotEncrypted_Day_11_de.png | 3 + ...TextComposerReplyNotEncrypted_Day_1_de.png | 3 + ...TextComposerReplyNotEncrypted_Day_2_de.png | 3 + ...TextComposerReplyNotEncrypted_Day_3_de.png | 3 + ...TextComposerReplyNotEncrypted_Day_4_de.png | 3 + ...TextComposerReplyNotEncrypted_Day_5_de.png | 3 + ...TextComposerReplyNotEncrypted_Day_6_de.png | 3 + ...TextComposerReplyNotEncrypted_Day_7_de.png | 3 + ...TextComposerReplyNotEncrypted_Day_8_de.png | 3 + ...TextComposerReplyNotEncrypted_Day_9_de.png | 3 + ...extcomposer_TextComposerReply_Day_0_de.png | 3 + ...xtcomposer_TextComposerReply_Day_10_de.png | 3 + ...xtcomposer_TextComposerReply_Day_11_de.png | 3 + ...extcomposer_TextComposerReply_Day_1_de.png | 3 + ...extcomposer_TextComposerReply_Day_2_de.png | 3 + ...extcomposer_TextComposerReply_Day_3_de.png | 3 + ...extcomposer_TextComposerReply_Day_4_de.png | 3 + ...extcomposer_TextComposerReply_Day_5_de.png | 3 + ...extcomposer_TextComposerReply_Day_6_de.png | 3 + ...extcomposer_TextComposerReply_Day_7_de.png | 3 + ...extcomposer_TextComposerReply_Day_8_de.png | 3 + ...extcomposer_TextComposerReply_Day_9_de.png | 3 + ...extComposerSimpleNotEncrypted_Day_0_de.png | 3 + ...xtcomposer_TextComposerSimple_Day_0_de.png | 3 + ...TextComposerVoiceNotEncrypted_Day_0_de.png | 3 + ....impl.history_PushHistoryView_Day_0_de.png | 3 + ....impl.history_PushHistoryView_Day_1_de.png | 3 + ....impl.history_PushHistoryView_Day_2_de.png | 3 + ....impl.history_PushHistoryView_Day_3_de.png | 3 + ...TroubleshootNotificationsView_Day_0_de.png | 3 + ...TroubleshootNotificationsView_Day_1_de.png | 3 + ...TroubleshootNotificationsView_Day_2_de.png | 3 + ...TroubleshootNotificationsView_Day_3_de.png | 3 + ...TroubleshootNotificationsView_Day_4_de.png | 3 + ...TroubleshootNotificationsView_Day_5_de.png | 3 + ...TroubleshootNotificationsView_Day_6_de.png | 3 + ...TroubleshootNotificationsView_Day_7_de.png | 3 + ...es.apperror.impl_AppErrorView_Day_0_de.png | 3 + screenshots/html/data.js | 1543 +++++++++ screenshots/html/screenshots.css | 164 + screenshots/html/script.js | 309 ++ screenshots/index.html | 74 + services/analytics/api/build.gradle.kts | 21 + .../api/AnalyticsLongRunningTransaction.kt | 22 + .../analytics/api/AnalyticsService.kt | 112 + .../analytics/api/NoopAnalyticsTransaction.kt | 17 + .../services/analytics/api/ScreenTracker.kt | 19 + .../api/watchers/AnalyticsColdStartWatcher.kt | 18 + .../watchers/AnalyticsRoomListStateWatcher.kt | 17 + services/analytics/compose/build.gradle.kts | 18 + .../compose/LocalAnalyticsService.kt | 20 + services/analytics/impl/build.gradle.kts | 44 + .../analytics/impl/DefaultAnalyticsService.kt | 174 + .../analytics/impl/DefaultScreenTracker.kt | 50 + .../analytics/impl/log/AnalyticsLoggerTag.kt | 13 + .../analytics/impl/store/AnalyticsStore.kt | 83 + .../DefaultAnalyticsColdStartWatcher.kt | 63 + .../DefaultAnalyticsRoomListStateWatcher.kt | 78 + .../impl/DefaultAnalyticsServiceTest.kt | 300 ++ .../impl/DefaultScreenTrackerTest.kt | 62 + .../impl/store/FakeAnalyticsStore.kt | 39 + .../DefaultAnalyticsColdStartWatcherTest.kt | 107 + ...efaultAnalyticsRoomListStateWatcherTest.kt | 170 + services/analytics/noop/build.gradle.kts | 26 + .../analytics/noop/NoopAnalyticsService.kt | 48 + .../analytics/noop/NoopScreenTracker.kt | 21 + .../watchers/NoopAnalyticsColdStartWatcher.kt | 19 + .../NoopAnalyticsRoomListStateWatcher.kt | 18 + .../noop/NoopAnalyticsServiceTest.kt | 68 + .../analytics/noop/NoopScreenTrackerTest.kt | 29 + services/analytics/test/build.gradle.kts | 21 + .../analytics/test/FakeAnalyticsService.kt | 89 + .../analytics/test/FakeScreenTracker.kt | 26 + .../watchers/FakeAnalyticsColdStartWatcher.kt | 16 + .../analyticsproviders/api/build.gradle.kts | 18 + .../api/AnalyticsProvider.kt | 25 + .../api/AnalyticsTransaction.kt | 25 + .../api/trackers/AnalyticsTracker.kt | 42 + .../api/trackers/ErrorTracker.kt | 13 + .../posthog/build.gradle.kts | 48 + .../posthog/PostHogFactory.kt | 41 + .../posthog/PosthogAnalyticsProvider.kt | 139 + .../posthog/PosthogEndpointConfig.kt | 16 + .../posthog/PosthogEndpointConfigProvider.kt | 48 + .../posthog/extensions/InteractionExt.kt | 17 + .../posthog/log/AnalyticsLoggerTag.kt | 13 + .../posthog/PosthogAnalyticsProviderTest.kt | 219 ++ .../sentry/build.gradle.kts | 45 + .../sentry/src/main/AndroidManifest.xml | 17 + .../sentry/SentryAnalyticsProvider.kt | 102 + .../sentry/SentryAnalyticsTransaction.kt | 30 + .../analyticsproviders/sentry/SentryConfig.kt | 17 + .../sentry/log/AnalyticsLoggerTag.kt | 13 + .../analyticsproviders/test/build.gradle.kts | 19 + .../test/FakeAnalyticsProvider.kt | 37 + services/apperror/api/build.gradle.kts | 19 + .../services/apperror/api/AppErrorState.kt | 22 + .../apperror/api/AppErrorStateProvider.kt | 15 + .../apperror/api/AppErrorStateService.kt | 20 + services/apperror/impl/build.gradle.kts | 36 + .../services/apperror/impl/AppErrorView.kt | 50 + .../impl/DefaultAppErrorStateService.kt | 43 + .../impl/DefaultAppErrorStateServiceTest.kt | 78 + services/apperror/test/build.gradle.kts | 21 + .../apperror/test/FakeAppErrorStateService.kt | 37 + services/appnavstate/api/build.gradle.kts | 23 + .../appnavstate/api/ActiveRoomsHolder.kt | 43 + .../api/AppForegroundStateService.kt | 56 + .../appnavstate/api/AppNavigationState.kt | 17 + .../api/AppNavigationStateService.kt | 34 + .../appnavstate/api/IntentNavigationExtras.kt | 10 + .../appnavstate/api/NavigationState.kt | 50 + .../api/NavigationStateExtension.kt | 54 + services/appnavstate/impl/build.gradle.kts | 36 + .../impl/DefaultActiveRoomsHolder.kt | 53 + .../impl/DefaultAppForegroundStateService.kt | 44 + .../impl/DefaultAppNavigationStateService.kt | 172 + .../appnavstate/impl/di/AppNavStateModule.kt | 29 + .../AppForegroundStateServiceInitializer.kt | 25 + .../impl/DefaultNavigationStateServiceTest.kt | 340 ++ services/appnavstate/test/build.gradle.kts | 22 + .../appnavstate/test/AppNavStateFixture.kt | 45 + .../test/FakeAppForegroundStateService.kt | 44 + .../test/FakeAppNavigationStateService.kt | 42 + services/toolbox/api/build.gradle.kts | 18 + .../api/intent/ExternalIntentLauncher.kt | 18 + .../api/sdk/BuildVersionSdkIntProvider.kt | 34 + .../toolbox/api/strings/StringProvider.kt | 38 + .../toolbox/api/systemclock/SystemClock.kt | 13 + services/toolbox/impl/build.gradle.kts | 25 + .../intent/DefaultExternalIntentLauncher.kt | 25 + .../sdk/DefaultBuildVersionSdkIntProvider.kt | 20 + .../impl/strings/AndroidStringProvider.kt | 31 + .../impl/systemclock/DefaultSystemClock.kt | 26 + .../toolbox/impl/systemclock/TimeModule.kt | 24 + services/toolbox/test/build.gradle.kts | 19 + .../test/intent/FakeExternalIntentLauncher.kt | 21 + .../sdk/FakeBuildVersionSdkIntProvider.kt | 17 + .../test/strings/FakeStringProvider.kt | 31 + .../test/systemclock/FakeSystemClock.kt | 19 + settings.gradle.kts | 79 + tests/detekt-rules/.gitignore | 1 + tests/detekt-rules/build.gradle.kts | 20 + .../detektrules/ByPreferencesDataStoreRule.kt | 45 + .../detektrules/ElementRuleSetProvider.kt | 25 + .../android/detektrules/RunCatchingRule.kt | 44 + ...tlab.arturbosch.detekt.api.RuleSetProvider | 1 + .../detektrules/RunCatchingRuleTest.kt | 34 + tests/konsist/build.gradle.kts | 34 + ...mposableWithNonImmutableSealedInterface.kt | 21 + .../konsist/failures/FakeWrongClassName.kt | 23 + .../tests/konsist/KonsistArchitectureTest.kt | 111 + .../tests/konsist/KonsistCallbackTest.kt | 25 + .../tests/konsist/KonsistClassNameTest.kt | 180 + .../tests/konsist/KonsistComposableTest.kt | 66 + .../tests/konsist/KonsistConfigTest.kt | 37 + .../tests/konsist/KonsistContentTest.kt | 27 + .../android/tests/konsist/KonsistDiTest.kt | 49 + .../android/tests/konsist/KonsistFieldTest.kt | 28 + .../android/tests/konsist/KonsistFlowTest.kt | 38 + .../tests/konsist/KonsistImmutableTest.kt | 78 + .../tests/konsist/KonsistImportTest.kt | 54 + .../tests/konsist/KonsistLicenseTest.kt | 100 + .../tests/konsist/KonsistMethodNameTest.kt | 24 + .../tests/konsist/KonsistParameterNameTest.kt | 26 + .../tests/konsist/KonsistPresenterTest.kt | 32 + .../tests/konsist/KonsistPreviewTest.kt | 214 ++ .../android/tests/konsist/KonsistTestTest.kt | 122 + tests/testutils/build.gradle.kts | 33 + .../tests/testutils/AssertThrowInDebug.kt | 25 + .../tests/testutils/EnsureCalledOnce.kt | 126 + .../tests/testutils/EnsureNeverCalled.kt | 47 + .../android/tests/testutils/EventsRecorder.kt | 49 + .../InstrumentationStringProvider.kt | 27 + .../android/tests/testutils/LongTask.kt | 40 + .../tests/testutils/MutablePresenter.kt | 27 + .../android/tests/testutils/PresenterTest.kt | 40 + .../android/tests/testutils/ReceiveTurbine.kt | 70 + .../testutils/RobolectricDispatcherCleaner.kt | 67 + ...nticsNodeInteractionsProviderExtensions.kt | 63 + .../android/tests/testutils/TestComposable.kt | 28 + .../testutils/TestCoroutineDispatchers.kt | 38 + .../element/android/tests/testutils/Timber.kt | 19 + .../tests/testutils/WaitingForAssertion.kt | 23 + .../android/tests/testutils/WarmUpRule.kt | 45 + .../tests/testutils/WithFakeLifecycleOwner.kt | 67 + .../testutils/fake/FakeTemporaryUriDeleter.kt | 21 + .../tests/testutils/lambda/Assertions.kt | 72 + .../android/tests/testutils/lambda/Error.kt | 15 + .../tests/testutils/lambda/LambdaRecorder.kt | 200 ++ .../testutils/lambda/ParameterMatcher.kt | 56 + .../tests/testutils/node/TestParentNode.kt | 50 + tests/uitests/.gitignore | 1 + tests/uitests/build.gradle.kts | 59 + tests/uitests/consumer-rules.pro | 0 .../src/test/kotlin/base/BaseDeviceConfig.kt | 18 + .../kotlin/base/ComposablePreviewProvider.kt | 71 + .../src/test/kotlin/base/ScreenshotTest.kt | 139 + .../TranslationsScreenshotTest.kt | 49 + .../src/test/kotlin/ui/PreviewA11yTest.kt | 43 + .../src/test/kotlin/ui/PreviewShard1Test.kt | 38 + .../src/test/kotlin/ui/PreviewShard2Test.kt | 38 + .../src/test/kotlin/ui/PreviewShard3Test.kt | 38 + .../src/test/kotlin/ui/PreviewShard4Test.kt | 38 + .../images/appicon.element_Icon_en.png | 3 + .../appicon.element_MonochromeIcon_en.png | 3 + .../images/appicon.element_RoundIcon_en.png | 3 + .../images/appicon.enterprise_Icon_en.png | 3 + .../appicon.enterprise_RoundIcon_en.png | 3 + .../appnav.loggedin_LoggedInView_Day_0_en.png | 3 + .../appnav.loggedin_LoggedInView_Day_1_en.png | 3 + .../appnav.loggedin_LoggedInView_Day_2_en.png | 3 + .../appnav.loggedin_LoggedInView_Day_3_en.png | 3 + ...ppnav.loggedin_LoggedInView_Night_0_en.png | 3 + ...ppnav.loggedin_LoggedInView_Night_1_en.png | 3 + ...ppnav.loggedin_LoggedInView_Night_2_en.png | 3 + ...ppnav.loggedin_LoggedInView_Night_3_en.png | 3 + ...appnav.loggedin_SyncStateView_Day_0_en.png | 3 + ...pnav.loggedin_SyncStateView_Night_0_en.png | 3 + ...om.joined_LoadingRoomNodeView_Day_0_en.png | 3 + ...om.joined_LoadingRoomNodeView_Day_1_en.png | 3 + ....joined_LoadingRoomNodeView_Night_0_en.png | 3 + ....joined_LoadingRoomNodeView_Night_1_en.png | 3 + .../images/appnav.root_RootView_Day_0_en.png | 3 + .../images/appnav.root_RootView_Day_1_en.png | 3 + .../images/appnav.root_RootView_Day_2_en.png | 3 + .../appnav.root_RootView_Night_0_en.png | 3 + .../appnav.root_RootView_Night_1_en.png | 3 + .../appnav.root_RootView_Night_2_en.png | 3 + ...nces_AnalyticsPreferencesView_Day_0_en.png | 3 + ...nces_AnalyticsPreferencesView_Day_1_en.png | 3 + ...es_AnalyticsPreferencesView_Night_0_en.png | 3 + ...es_AnalyticsPreferencesView_Night_1_en.png | 3 + ...ytics.impl_AnalyticsOptInView_Day_0_en.png | 3 + ...ytics.impl_AnalyticsOptInView_Day_1_en.png | 3 + ...ics.impl_AnalyticsOptInView_Night_0_en.png | 3 + ...ics.impl_AnalyticsOptInView_Night_1_en.png | 3 + ....spaces_SpaceAnnouncementView_Day_0_en.png | 3 + ...paces_SpaceAnnouncementView_Night_0_en.png | 3 + ...s.call.impl.ui_CallScreenView_Day_0_en.png | 3 + ...s.call.impl.ui_CallScreenView_Day_1_en.png | 3 + ...s.call.impl.ui_CallScreenView_Day_2_en.png | 3 + ...s.call.impl.ui_CallScreenView_Day_3_en.png | 3 + ...call.impl.ui_CallScreenView_Night_0_en.png | 3 + ...call.impl.ui_CallScreenView_Night_1_en.png | 3 + ...call.impl.ui_CallScreenView_Night_2_en.png | 3 + ...call.impl.ui_CallScreenView_Night_3_en.png | 3 + ...ll.impl.ui_IncomingCallScreen_Day_0_en.png | 3 + ....impl.ui_IncomingCallScreen_Night_0_en.png | 3 + ...l.ui_InvalidAudioDeviceDialog_Day_0_en.png | 3 + ...ui_InvalidAudioDeviceDialog_Night_0_en.png | 3 + ....impl.addpeople_AddPeopleView_Day_0_en.png | 3 + ....impl.addpeople_AddPeopleView_Day_1_en.png | 3 + ....impl.addpeople_AddPeopleView_Day_2_en.png | 3 + ....impl.addpeople_AddPeopleView_Day_3_en.png | 3 + ...mpl.addpeople_AddPeopleView_Night_0_en.png | 3 + ...mpl.addpeople_AddPeopleView_Night_1_en.png | 3 + ...mpl.addpeople_AddPeopleView_Night_2_en.png | 3 + ...mpl.addpeople_AddPeopleView_Night_3_en.png | 3 + ...nfigureroom_ConfigureRoomViewDark_0_en.png | 3 + ...nfigureroom_ConfigureRoomViewDark_1_en.png | 3 + ...nfigureroom_ConfigureRoomViewDark_2_en.png | 3 + ...nfigureroom_ConfigureRoomViewDark_3_en.png | 3 + ...nfigureroom_ConfigureRoomViewDark_4_en.png | 3 + ...nfigureroom_ConfigureRoomViewDark_5_en.png | 3 + ...figureroom_ConfigureRoomViewLight_0_en.png | 3 + ...figureroom_ConfigureRoomViewLight_1_en.png | 3 + ...figureroom_ConfigureRoomViewLight_2_en.png | 3 + ...figureroom_ConfigureRoomViewLight_3_en.png | 3 + ...figureroom_ConfigureRoomViewLight_4_en.png | 3 + ...figureroom_ConfigureRoomViewLight_5_en.png | 3 + ...ward.impl_ForwardMessagesView_Day_0_en.png | 3 + ...ward.impl_ForwardMessagesView_Day_1_en.png | 3 + ...ward.impl_ForwardMessagesView_Day_2_en.png | 3 + ...ward.impl_ForwardMessagesView_Day_3_en.png | 3 + ...rd.impl_ForwardMessagesView_Night_0_en.png | 3 + ...rd.impl_ForwardMessagesView_Night_1_en.png | 3 + ...rd.impl_ForwardMessagesView_Night_2_en.png | 3 + ...rd.impl_ForwardMessagesView_Night_3_en.png | 3 + ...ations_NotificationsOptInView_Day_0_en.png | 3 + ...ions_NotificationsOptInView_Night_0_en.png | 3 + ...hooseSelfVerificationModeView_Day_0_en.png | 3 + ...hooseSelfVerificationModeView_Day_1_en.png | 3 + ...hooseSelfVerificationModeView_Day_2_en.png | 3 + ...hooseSelfVerificationModeView_Day_3_en.png | 3 + ...hooseSelfVerificationModeView_Day_4_en.png | 3 + ...oseSelfVerificationModeView_Night_0_en.png | 3 + ...oseSelfVerificationModeView_Night_1_en.png | 3 + ...oseSelfVerificationModeView_Night_2_en.png | 3 + ...oseSelfVerificationModeView_Night_3_en.png | 3 + ...oseSelfVerificationModeView_Night_4_en.png | 3 + ...nts_BatteryOptimizationBanner_Day_0_en.png | 3 + ...s_BatteryOptimizationBanner_Night_0_en.png | 3 + ...ents_ConfirmRecoveryKeyBanner_Day_0_en.png | 3 + ...ts_ConfirmRecoveryKeyBanner_Night_0_en.png | 3 + ...lScreenIntentPermissionBanner_Day_0_en.png | 3 + ...creenIntentPermissionBanner_Night_0_en.png | 3 + ...onents_HomeTopBarMultiAccount_Day_0_en.png | 3 + ...ents_HomeTopBarMultiAccount_Night_0_en.png | 3 + ...nents_HomeTopBarWithIndicator_Day_0_en.png | 3 + ...nts_HomeTopBarWithIndicator_Night_0_en.png | 3 + ...me.impl.components_HomeTopBar_Day_0_en.png | 3 + ....impl.components_HomeTopBar_Night_0_en.png | 3 + ...ts_NewNotificationSoundBanner_Day_0_en.png | 3 + ..._NewNotificationSoundBanner_Night_0_en.png | 3 + ...omponents_RoomListContentView_Day_0_en.png | 3 + ...omponents_RoomListContentView_Day_1_en.png | 3 + ...omponents_RoomListContentView_Day_2_en.png | 3 + ...omponents_RoomListContentView_Day_3_en.png | 3 + ...omponents_RoomListContentView_Day_4_en.png | 3 + ...omponents_RoomListContentView_Day_5_en.png | 3 + ...ponents_RoomListContentView_Night_0_en.png | 3 + ...ponents_RoomListContentView_Night_1_en.png | 3 + ...ponents_RoomListContentView_Night_2_en.png | 3 + ...ponents_RoomListContentView_Night_3_en.png | 3 + ...ponents_RoomListContentView_Night_4_en.png | 3 + ...ponents_RoomListContentView_Night_5_en.png | 3 + ...nts_RoomSummaryPlaceholderRow_Day_0_en.png | 3 + ...s_RoomSummaryPlaceholderRow_Night_0_en.png | 3 + ...mpl.components_RoomSummaryRow_Day_0_en.png | 3 + ...pl.components_RoomSummaryRow_Day_10_en.png | 3 + ...pl.components_RoomSummaryRow_Day_11_en.png | 3 + ...pl.components_RoomSummaryRow_Day_12_en.png | 3 + ...pl.components_RoomSummaryRow_Day_13_en.png | 3 + ...pl.components_RoomSummaryRow_Day_14_en.png | 3 + ...pl.components_RoomSummaryRow_Day_15_en.png | 3 + ...pl.components_RoomSummaryRow_Day_16_en.png | 3 + ...pl.components_RoomSummaryRow_Day_17_en.png | 3 + ...pl.components_RoomSummaryRow_Day_18_en.png | 3 + ...pl.components_RoomSummaryRow_Day_19_en.png | 3 + ...mpl.components_RoomSummaryRow_Day_1_en.png | 3 + ...pl.components_RoomSummaryRow_Day_20_en.png | 3 + ...pl.components_RoomSummaryRow_Day_21_en.png | 3 + ...pl.components_RoomSummaryRow_Day_22_en.png | 3 + ...pl.components_RoomSummaryRow_Day_23_en.png | 3 + ...pl.components_RoomSummaryRow_Day_24_en.png | 3 + ...pl.components_RoomSummaryRow_Day_25_en.png | 3 + ...pl.components_RoomSummaryRow_Day_26_en.png | 3 + ...pl.components_RoomSummaryRow_Day_27_en.png | 3 + ...pl.components_RoomSummaryRow_Day_28_en.png | 3 + ...pl.components_RoomSummaryRow_Day_29_en.png | 3 + ...mpl.components_RoomSummaryRow_Day_2_en.png | 3 + ...pl.components_RoomSummaryRow_Day_30_en.png | 3 + ...pl.components_RoomSummaryRow_Day_31_en.png | 3 + ...pl.components_RoomSummaryRow_Day_32_en.png | 3 + ...pl.components_RoomSummaryRow_Day_33_en.png | 3 + ...pl.components_RoomSummaryRow_Day_34_en.png | 3 + ...pl.components_RoomSummaryRow_Day_35_en.png | 3 + ...pl.components_RoomSummaryRow_Day_36_en.png | 3 + ...pl.components_RoomSummaryRow_Day_37_en.png | 3 + ...mpl.components_RoomSummaryRow_Day_3_en.png | 3 + ...mpl.components_RoomSummaryRow_Day_4_en.png | 3 + ...mpl.components_RoomSummaryRow_Day_5_en.png | 3 + ...mpl.components_RoomSummaryRow_Day_6_en.png | 3 + ...mpl.components_RoomSummaryRow_Day_7_en.png | 3 + ...mpl.components_RoomSummaryRow_Day_8_en.png | 3 + ...mpl.components_RoomSummaryRow_Day_9_en.png | 3 + ...l.components_RoomSummaryRow_Night_0_en.png | 3 + ....components_RoomSummaryRow_Night_10_en.png | 3 + ....components_RoomSummaryRow_Night_11_en.png | 3 + ....components_RoomSummaryRow_Night_12_en.png | 3 + ....components_RoomSummaryRow_Night_13_en.png | 3 + ....components_RoomSummaryRow_Night_14_en.png | 3 + ....components_RoomSummaryRow_Night_15_en.png | 3 + ....components_RoomSummaryRow_Night_16_en.png | 3 + ....components_RoomSummaryRow_Night_17_en.png | 3 + ....components_RoomSummaryRow_Night_18_en.png | 3 + ....components_RoomSummaryRow_Night_19_en.png | 3 + ...l.components_RoomSummaryRow_Night_1_en.png | 3 + ....components_RoomSummaryRow_Night_20_en.png | 3 + ....components_RoomSummaryRow_Night_21_en.png | 3 + ....components_RoomSummaryRow_Night_22_en.png | 3 + ....components_RoomSummaryRow_Night_23_en.png | 3 + ....components_RoomSummaryRow_Night_24_en.png | 3 + ....components_RoomSummaryRow_Night_25_en.png | 3 + ....components_RoomSummaryRow_Night_26_en.png | 3 + ....components_RoomSummaryRow_Night_27_en.png | 3 + ....components_RoomSummaryRow_Night_28_en.png | 3 + ....components_RoomSummaryRow_Night_29_en.png | 3 + ...l.components_RoomSummaryRow_Night_2_en.png | 3 + ....components_RoomSummaryRow_Night_30_en.png | 3 + ....components_RoomSummaryRow_Night_31_en.png | 3 + ....components_RoomSummaryRow_Night_32_en.png | 3 + ....components_RoomSummaryRow_Night_33_en.png | 3 + ....components_RoomSummaryRow_Night_34_en.png | 3 + ....components_RoomSummaryRow_Night_35_en.png | 3 + ....components_RoomSummaryRow_Night_36_en.png | 3 + ....components_RoomSummaryRow_Night_37_en.png | 3 + ...l.components_RoomSummaryRow_Night_3_en.png | 3 + ...l.components_RoomSummaryRow_Night_4_en.png | 3 + ...l.components_RoomSummaryRow_Night_5_en.png | 3 + ...l.components_RoomSummaryRow_Night_6_en.png | 3 + ...l.components_RoomSummaryRow_Night_7_en.png | 3 + ...l.components_RoomSummaryRow_Night_8_en.png | 3 + ...l.components_RoomSummaryRow_Night_9_en.png | 3 + ...onents_SetUpRecoveryKeyBanner_Day_0_en.png | 3 + ...ents_SetUpRecoveryKeyBanner_Night_0_en.png | 3 + ...l.filters_RoomListFiltersView_Day_0_en.png | 3 + ...l.filters_RoomListFiltersView_Day_1_en.png | 3 + ...filters_RoomListFiltersView_Night_0_en.png | 3 + ...filters_RoomListFiltersView_Night_1_en.png | 3 + ...mListDeclineInviteMenuContent_Day_0_en.png | 3 + ...istDeclineInviteMenuContent_Night_0_en.png | 3 + ...omListModalBottomSheetContent_Day_0_en.png | 3 + ...omListModalBottomSheetContent_Day_1_en.png | 3 + ...omListModalBottomSheetContent_Day_2_en.png | 3 + ...ListModalBottomSheetContent_Night_0_en.png | 3 + ...ListModalBottomSheetContent_Night_1_en.png | 3 + ...ListModalBottomSheetContent_Night_2_en.png | 3 + ....search_RoomListSearchContent_Day_0_en.png | 3 + ....search_RoomListSearchContent_Day_1_en.png | 3 + ...earch_RoomListSearchContent_Night_0_en.png | 3 + ...earch_RoomListSearchContent_Night_1_en.png | 3 + ...me.impl.spaces_HomeSpacesView_Day_0_en.png | 3 + ...me.impl.spaces_HomeSpacesView_Day_1_en.png | 3 + ....impl.spaces_HomeSpacesView_Night_0_en.png | 3 + ....impl.spaces_HomeSpacesView_Night_1_en.png | 3 + .../features.home.impl_HomeViewA11y_en.png | 3 + .../features.home.impl_HomeView_Day_0_en.png | 3 + .../features.home.impl_HomeView_Day_10_en.png | 3 + .../features.home.impl_HomeView_Day_11_en.png | 3 + .../features.home.impl_HomeView_Day_12_en.png | 3 + .../features.home.impl_HomeView_Day_13_en.png | 3 + .../features.home.impl_HomeView_Day_14_en.png | 3 + .../features.home.impl_HomeView_Day_15_en.png | 3 + .../features.home.impl_HomeView_Day_1_en.png | 3 + .../features.home.impl_HomeView_Day_2_en.png | 3 + .../features.home.impl_HomeView_Day_3_en.png | 3 + .../features.home.impl_HomeView_Day_4_en.png | 3 + .../features.home.impl_HomeView_Day_5_en.png | 3 + .../features.home.impl_HomeView_Day_6_en.png | 3 + .../features.home.impl_HomeView_Day_7_en.png | 3 + .../features.home.impl_HomeView_Day_8_en.png | 3 + .../features.home.impl_HomeView_Day_9_en.png | 3 + ...features.home.impl_HomeView_Night_0_en.png | 3 + ...eatures.home.impl_HomeView_Night_10_en.png | 3 + ...eatures.home.impl_HomeView_Night_11_en.png | 3 + ...eatures.home.impl_HomeView_Night_12_en.png | 3 + ...eatures.home.impl_HomeView_Night_13_en.png | 3 + ...eatures.home.impl_HomeView_Night_14_en.png | 3 + ...eatures.home.impl_HomeView_Night_15_en.png | 3 + ...features.home.impl_HomeView_Night_1_en.png | 3 + ...features.home.impl_HomeView_Night_2_en.png | 3 + ...features.home.impl_HomeView_Night_3_en.png | 3 + ...features.home.impl_HomeView_Night_4_en.png | 3 + ...features.home.impl_HomeView_Night_5_en.png | 3 + ...features.home.impl_HomeView_Night_6_en.png | 3 + ...features.home.impl_HomeView_Night_7_en.png | 3 + ...features.home.impl_HomeView_Night_8_en.png | 3 + ...features.home.impl_HomeView_Night_9_en.png | 3 + ...cline_AcceptDeclineInviteView_Day_0_en.png | 3 + ...cline_AcceptDeclineInviteView_Day_1_en.png | 3 + ...cline_AcceptDeclineInviteView_Day_2_en.png | 3 + ...cline_AcceptDeclineInviteView_Day_3_en.png | 3 + ...cline_AcceptDeclineInviteView_Day_4_en.png | 3 + ...cline_AcceptDeclineInviteView_Day_5_en.png | 3 + ...ine_AcceptDeclineInviteView_Night_0_en.png | 3 + ...ine_AcceptDeclineInviteView_Night_1_en.png | 3 + ...ine_AcceptDeclineInviteView_Night_2_en.png | 3 + ...ine_AcceptDeclineInviteView_Night_3_en.png | 3 + ...ine_AcceptDeclineInviteView_Night_4_en.png | 3 + ...ine_AcceptDeclineInviteView_Night_5_en.png | 3 + ...eandblock_DeclineAndBlockView_Day_0_en.png | 3 + ...eandblock_DeclineAndBlockView_Day_1_en.png | 3 + ...eandblock_DeclineAndBlockView_Day_2_en.png | 3 + ...eandblock_DeclineAndBlockView_Day_3_en.png | 3 + ...eandblock_DeclineAndBlockView_Day_4_en.png | 3 + ...ndblock_DeclineAndBlockView_Night_0_en.png | 3 + ...ndblock_DeclineAndBlockView_Night_1_en.png | 3 + ...ndblock_DeclineAndBlockView_Night_2_en.png | 3 + ...ndblock_DeclineAndBlockView_Night_3_en.png | 3 + ...ndblock_DeclineAndBlockView_Night_4_en.png | 3 + ...epeople.impl_InvitePeopleView_Day_0_en.png | 3 + ...epeople.impl_InvitePeopleView_Day_1_en.png | 3 + ...epeople.impl_InvitePeopleView_Day_2_en.png | 3 + ...epeople.impl_InvitePeopleView_Day_3_en.png | 3 + ...epeople.impl_InvitePeopleView_Day_4_en.png | 3 + ...epeople.impl_InvitePeopleView_Day_5_en.png | 3 + ...epeople.impl_InvitePeopleView_Day_6_en.png | 3 + ...epeople.impl_InvitePeopleView_Day_7_en.png | 3 + ...epeople.impl_InvitePeopleView_Day_8_en.png | 3 + ...epeople.impl_InvitePeopleView_Day_9_en.png | 3 + ...eople.impl_InvitePeopleView_Night_0_en.png | 3 + ...eople.impl_InvitePeopleView_Night_1_en.png | 3 + ...eople.impl_InvitePeopleView_Night_2_en.png | 3 + ...eople.impl_InvitePeopleView_Night_3_en.png | 3 + ...eople.impl_InvitePeopleView_Night_4_en.png | 3 + ...eople.impl_InvitePeopleView_Night_5_en.png | 3 + ...eople.impl_InvitePeopleView_Night_6_en.png | 3 + ...eople.impl_InvitePeopleView_Night_7_en.png | 3 + ...eople.impl_InvitePeopleView_Night_8_en.png | 3 + ...eople.impl_InvitePeopleView_Night_9_en.png | 3 + ...es.joinroom.impl_JoinRoomView_Day_0_en.png | 3 + ...s.joinroom.impl_JoinRoomView_Day_10_en.png | 3 + ...s.joinroom.impl_JoinRoomView_Day_11_en.png | 3 + ...s.joinroom.impl_JoinRoomView_Day_12_en.png | 3 + ...s.joinroom.impl_JoinRoomView_Day_13_en.png | 3 + ...s.joinroom.impl_JoinRoomView_Day_14_en.png | 3 + ...s.joinroom.impl_JoinRoomView_Day_15_en.png | 3 + ...s.joinroom.impl_JoinRoomView_Day_16_en.png | 3 + ...es.joinroom.impl_JoinRoomView_Day_1_en.png | 3 + ...es.joinroom.impl_JoinRoomView_Day_2_en.png | 3 + ...es.joinroom.impl_JoinRoomView_Day_3_en.png | 3 + ...es.joinroom.impl_JoinRoomView_Day_4_en.png | 3 + ...es.joinroom.impl_JoinRoomView_Day_5_en.png | 3 + ...es.joinroom.impl_JoinRoomView_Day_6_en.png | 3 + ...es.joinroom.impl_JoinRoomView_Day_7_en.png | 3 + ...es.joinroom.impl_JoinRoomView_Day_8_en.png | 3 + ...es.joinroom.impl_JoinRoomView_Day_9_en.png | 3 + ....joinroom.impl_JoinRoomView_Night_0_en.png | 3 + ...joinroom.impl_JoinRoomView_Night_10_en.png | 3 + ...joinroom.impl_JoinRoomView_Night_11_en.png | 3 + ...joinroom.impl_JoinRoomView_Night_12_en.png | 3 + ...joinroom.impl_JoinRoomView_Night_13_en.png | 3 + ...joinroom.impl_JoinRoomView_Night_14_en.png | 3 + ...joinroom.impl_JoinRoomView_Night_15_en.png | 3 + ...joinroom.impl_JoinRoomView_Night_16_en.png | 3 + ....joinroom.impl_JoinRoomView_Night_1_en.png | 3 + ....joinroom.impl_JoinRoomView_Night_2_en.png | 3 + ....joinroom.impl_JoinRoomView_Night_3_en.png | 3 + ....joinroom.impl_JoinRoomView_Night_4_en.png | 3 + ....joinroom.impl_JoinRoomView_Night_5_en.png | 3 + ....joinroom.impl_JoinRoomView_Night_6_en.png | 3 + ....joinroom.impl_JoinRoomView_Night_7_en.png | 3 + ....joinroom.impl_JoinRoomView_Night_8_en.png | 3 + ....joinroom.impl_JoinRoomView_Night_9_en.png | 3 + ...anner_KnockRequestsBannerView_Day_0_en.png | 3 + ...anner_KnockRequestsBannerView_Day_1_en.png | 3 + ...anner_KnockRequestsBannerView_Day_2_en.png | 3 + ...anner_KnockRequestsBannerView_Day_3_en.png | 3 + ...anner_KnockRequestsBannerView_Day_4_en.png | 3 + ...anner_KnockRequestsBannerView_Day_5_en.png | 3 + ...anner_KnockRequestsBannerView_Day_6_en.png | 3 + ...ner_KnockRequestsBannerView_Night_0_en.png | 3 + ...ner_KnockRequestsBannerView_Night_1_en.png | 3 + ...ner_KnockRequestsBannerView_Night_2_en.png | 3 + ...ner_KnockRequestsBannerView_Night_3_en.png | 3 + ...ner_KnockRequestsBannerView_Night_4_en.png | 3 + ...ner_KnockRequestsBannerView_Night_5_en.png | 3 + ...ner_KnockRequestsBannerView_Night_6_en.png | 3 + ...pl.list_KnockRequestsListView_Day_0_en.png | 3 + ...l.list_KnockRequestsListView_Day_10_en.png | 3 + ...pl.list_KnockRequestsListView_Day_1_en.png | 3 + ...pl.list_KnockRequestsListView_Day_2_en.png | 3 + ...pl.list_KnockRequestsListView_Day_3_en.png | 3 + ...pl.list_KnockRequestsListView_Day_4_en.png | 3 + ...pl.list_KnockRequestsListView_Day_5_en.png | 3 + ...pl.list_KnockRequestsListView_Day_6_en.png | 3 + ...pl.list_KnockRequestsListView_Day_7_en.png | 3 + ...pl.list_KnockRequestsListView_Day_8_en.png | 3 + ...pl.list_KnockRequestsListView_Day_9_en.png | 3 + ....list_KnockRequestsListView_Night_0_en.png | 3 + ...list_KnockRequestsListView_Night_10_en.png | 3 + ....list_KnockRequestsListView_Night_1_en.png | 3 + ....list_KnockRequestsListView_Night_2_en.png | 3 + ....list_KnockRequestsListView_Night_3_en.png | 3 + ....list_KnockRequestsListView_Night_4_en.png | 3 + ....list_KnockRequestsListView_Night_5_en.png | 3 + ....list_KnockRequestsListView_Night_6_en.png | 3 + ....list_KnockRequestsListView_Night_7_en.png | 3 + ....list_KnockRequestsListView_Night_8_en.png | 3 + ....list_KnockRequestsListView_Night_9_en.png | 3 + ....leaveroom.impl_LeaveRoomView_Day_0_en.png | 3 + ....leaveroom.impl_LeaveRoomView_Day_1_en.png | 3 + ....leaveroom.impl_LeaveRoomView_Day_2_en.png | 3 + ....leaveroom.impl_LeaveRoomView_Day_3_en.png | 3 + ....leaveroom.impl_LeaveRoomView_Day_4_en.png | 3 + ....leaveroom.impl_LeaveRoomView_Day_5_en.png | 3 + ....leaveroom.impl_LeaveRoomView_Day_6_en.png | 3 + ....leaveroom.impl_LeaveRoomView_Day_7_en.png | 3 + ...eaveroom.impl_LeaveRoomView_Night_0_en.png | 3 + ...eaveroom.impl_LeaveRoomView_Night_1_en.png | 3 + ...eaveroom.impl_LeaveRoomView_Night_2_en.png | 3 + ...eaveroom.impl_LeaveRoomView_Night_3_en.png | 3 + ...eaveroom.impl_LeaveRoomView_Night_4_en.png | 3 + ...eaveroom.impl_LeaveRoomView_Night_5_en.png | 3 + ...eaveroom.impl_LeaveRoomView_Night_6_en.png | 3 + ...eaveroom.impl_LeaveRoomView_Night_7_en.png | 3 + ...tails_DependenciesDetailsView_Day_0_en.png | 3 + ...ils_DependenciesDetailsView_Night_0_en.png | 3 + ...st_DependencyLicensesListView_Day_0_en.png | 3 + ...st_DependencyLicensesListView_Day_1_en.png | 3 + ...st_DependencyLicensesListView_Day_2_en.png | 3 + ...st_DependencyLicensesListView_Day_3_en.png | 3 + ..._DependencyLicensesListView_Night_0_en.png | 3 + ..._DependencyLicensesListView_Night_1_en.png | 3 + ..._DependencyLicensesListView_Night_2_en.png | 3 + ..._DependencyLicensesListView_Night_3_en.png | 3 + ...internal_StaticMapPlaceholder_Day_0_en.png | 3 + ...ternal_StaticMapPlaceholder_Night_0_en.png | 3 + ...es.location.api_StaticMapView_Day_0_en.png | 3 + ....location.api_StaticMapView_Night_0_en.png | 3 + ...on.impl.send_SendLocationView_Day_0_en.png | 3 + ...on.impl.send_SendLocationView_Day_1_en.png | 3 + ...on.impl.send_SendLocationView_Day_2_en.png | 3 + ...on.impl.send_SendLocationView_Day_3_en.png | 3 + ...on.impl.send_SendLocationView_Day_4_en.png | 3 + ....impl.send_SendLocationView_Night_0_en.png | 3 + ....impl.send_SendLocationView_Night_1_en.png | 3 + ....impl.send_SendLocationView_Night_2_en.png | 3 + ....impl.send_SendLocationView_Night_3_en.png | 3 + ....impl.send_SendLocationView_Night_4_en.png | 3 + ...on.impl.show_ShowLocationView_Day_0_en.png | 3 + ...on.impl.show_ShowLocationView_Day_1_en.png | 3 + ...on.impl.show_ShowLocationView_Day_2_en.png | 3 + ...on.impl.show_ShowLocationView_Day_3_en.png | 3 + ...on.impl.show_ShowLocationView_Day_4_en.png | 3 + ...on.impl.show_ShowLocationView_Day_5_en.png | 3 + ...on.impl.show_ShowLocationView_Day_6_en.png | 3 + ...on.impl.show_ShowLocationView_Day_7_en.png | 3 + ....impl.show_ShowLocationView_Night_0_en.png | 3 + ....impl.show_ShowLocationView_Night_1_en.png | 3 + ....impl.show_ShowLocationView_Night_2_en.png | 3 + ....impl.show_ShowLocationView_Night_3_en.png | 3 + ....impl.show_ShowLocationView_Night_4_en.png | 3 + ....impl.show_ShowLocationView_Night_5_en.png | 3 + ....impl.show_ShowLocationView_Night_6_en.png | 3 + ....impl.show_ShowLocationView_Night_7_en.png | 3 + ....components_PinEntryTextField_Day_0_en.png | 3 + ...omponents_PinEntryTextField_Night_0_en.png | 3 + ...ttings_LockScreenSettingsView_Day_0_en.png | 3 + ...ttings_LockScreenSettingsView_Day_1_en.png | 3 + ...ttings_LockScreenSettingsView_Day_2_en.png | 3 + ...ings_LockScreenSettingsView_Night_0_en.png | 3 + ...ings_LockScreenSettingsView_Night_1_en.png | 3 + ...ings_LockScreenSettingsView_Night_2_en.png | 3 + ....biometric_SetupBiometricView_Day_0_en.png | 3 + ...iometric_SetupBiometricView_Night_0_en.png | 3 + ...n.impl.setup.pin_SetupPinView_Day_0_en.png | 3 + ...n.impl.setup.pin_SetupPinView_Day_1_en.png | 3 + ...n.impl.setup.pin_SetupPinView_Day_2_en.png | 3 + ...n.impl.setup.pin_SetupPinView_Day_3_en.png | 3 + ...n.impl.setup.pin_SetupPinView_Day_4_en.png | 3 + ...impl.setup.pin_SetupPinView_Night_0_en.png | 3 + ...impl.setup.pin_SetupPinView_Night_1_en.png | 3 + ...impl.setup.pin_SetupPinView_Night_2_en.png | 3 + ...impl.setup.pin_SetupPinView_Night_3_en.png | 3 + ...impl.setup.pin_SetupPinView_Night_4_en.png | 3 + ....impl.unlock.keypad_PinKeypad_Day_0_en.png | 3 + ...mpl.unlock.keypad_PinKeypad_Night_0_en.png | 3 + ...mpl.unlock_PinUnlockViewInApp_Day_0_en.png | 3 + ...mpl.unlock_PinUnlockViewInApp_Day_1_en.png | 3 + ...mpl.unlock_PinUnlockViewInApp_Day_2_en.png | 3 + ...mpl.unlock_PinUnlockViewInApp_Day_3_en.png | 3 + ...mpl.unlock_PinUnlockViewInApp_Day_4_en.png | 3 + ...mpl.unlock_PinUnlockViewInApp_Day_5_en.png | 3 + ...mpl.unlock_PinUnlockViewInApp_Day_6_en.png | 3 + ...mpl.unlock_PinUnlockViewInApp_Day_7_en.png | 3 + ...l.unlock_PinUnlockViewInApp_Night_0_en.png | 3 + ...l.unlock_PinUnlockViewInApp_Night_1_en.png | 3 + ...l.unlock_PinUnlockViewInApp_Night_2_en.png | 3 + ...l.unlock_PinUnlockViewInApp_Night_3_en.png | 3 + ...l.unlock_PinUnlockViewInApp_Night_4_en.png | 3 + ...l.unlock_PinUnlockViewInApp_Night_5_en.png | 3 + ...l.unlock_PinUnlockViewInApp_Night_6_en.png | 3 + ...l.unlock_PinUnlockViewInApp_Night_7_en.png | 3 + ...een.impl.unlock_PinUnlockView_Day_0_en.png | 3 + ...een.impl.unlock_PinUnlockView_Day_1_en.png | 3 + ...een.impl.unlock_PinUnlockView_Day_2_en.png | 3 + ...een.impl.unlock_PinUnlockView_Day_3_en.png | 3 + ...een.impl.unlock_PinUnlockView_Day_4_en.png | 3 + ...een.impl.unlock_PinUnlockView_Day_5_en.png | 3 + ...een.impl.unlock_PinUnlockView_Day_6_en.png | 3 + ...een.impl.unlock_PinUnlockView_Day_7_en.png | 3 + ...n.impl.unlock_PinUnlockView_Night_0_en.png | 3 + ...n.impl.unlock_PinUnlockView_Night_1_en.png | 3 + ...n.impl.unlock_PinUnlockView_Night_2_en.png | 3 + ...n.impl.unlock_PinUnlockView_Night_3_en.png | 3 + ...n.impl.unlock_PinUnlockView_Night_4_en.png | 3 + ...n.impl.unlock_PinUnlockView_Night_5_en.png | 3 + ...n.impl.unlock_PinUnlockView_Night_6_en.png | 3 + ...n.impl.unlock_PinUnlockView_Night_7_en.png | 3 + ...ider_AccountProviderOtherView_Day_0_en.png | 3 + ...er_AccountProviderOtherView_Night_0_en.png | 3 + ...tprovider_AccountProviderView_Day_0_en.png | 3 + ...tprovider_AccountProviderView_Day_1_en.png | 3 + ...tprovider_AccountProviderView_Day_2_en.png | 3 + ...tprovider_AccountProviderView_Day_3_en.png | 3 + ...rovider_AccountProviderView_Night_0_en.png | 3 + ...rovider_AccountProviderView_Night_1_en.png | 3 + ...rovider_AccountProviderView_Night_2_en.png | 3 + ...rovider_AccountProviderView_Night_3_en.png | 3 + ...changeserver_ChangeServerView_Day_0_en.png | 3 + ...changeserver_ChangeServerView_Day_1_en.png | 3 + ...changeserver_ChangeServerView_Day_2_en.png | 3 + ...changeserver_ChangeServerView_Day_3_en.png | 3 + ...changeserver_ChangeServerView_Day_4_en.png | 3 + ...changeserver_ChangeServerView_Day_5_en.png | 3 + ...angeserver_ChangeServerView_Night_0_en.png | 3 + ...angeserver_ChangeServerView_Night_1_en.png | 3 + ...angeserver_ChangeServerView_Night_2_en.png | 3 + ...angeserver_ChangeServerView_Night_3_en.png | 3 + ...angeserver_ChangeServerView_Night_4_en.png | 3 + ...angeserver_ChangeServerView_Night_5_en.png | 3 + ...SlidingSyncNotSupportedDialog_Day_0_en.png | 3 + ...idingSyncNotSupportedDialog_Night_0_en.png | 3 + ...ogin.impl.login_LoginModeView_Day_0_en.png | 3 + ...ogin.impl.login_LoginModeView_Day_1_en.png | 3 + ...ogin.impl.login_LoginModeView_Day_2_en.png | 3 + ...ogin.impl.login_LoginModeView_Day_3_en.png | 3 + ...ogin.impl.login_LoginModeView_Day_4_en.png | 3 + ...ogin.impl.login_LoginModeView_Day_5_en.png | 3 + ...ogin.impl.login_LoginModeView_Day_6_en.png | 3 + ...in.impl.login_LoginModeView_Night_0_en.png | 3 + ...in.impl.login_LoginModeView_Night_1_en.png | 3 + ...in.impl.login_LoginModeView_Night_2_en.png | 3 + ...in.impl.login_LoginModeView_Night_3_en.png | 3 + ...in.impl.login_LoginModeView_Night_4_en.png | 3 + ...in.impl.login_LoginModeView_Night_5_en.png | 3 + ...in.impl.login_LoginModeView_Night_6_en.png | 3 + ...der_ChangeAccountProviderView_Day_0_en.png | 3 + ...der_ChangeAccountProviderView_Day_1_en.png | 3 + ...r_ChangeAccountProviderView_Night_0_en.png | 3 + ...r_ChangeAccountProviderView_Night_1_en.png | 3 + ...der_ChooseAccountProviderView_Day_0_en.png | 3 + ...der_ChooseAccountProviderView_Day_1_en.png | 3 + ...der_ChooseAccountProviderView_Day_2_en.png | 3 + ...r_ChooseAccountProviderView_Night_0_en.png | 3 + ...r_ChooseAccountProviderView_Night_1_en.png | 3 + ...r_ChooseAccountProviderView_Night_2_en.png | 3 + ...er_ConfirmAccountProviderView_Day_0_en.png | 3 + ...er_ConfirmAccountProviderView_Day_1_en.png | 3 + ...er_ConfirmAccountProviderView_Day_2_en.png | 3 + ..._ConfirmAccountProviderView_Night_0_en.png | 3 + ..._ConfirmAccountProviderView_Night_1_en.png | 3 + ..._ConfirmAccountProviderView_Night_2_en.png | 3 + ...eateaccount_CreateAccountView_Day_0_en.png | 3 + ...eateaccount_CreateAccountView_Day_1_en.png | 3 + ...eateaccount_CreateAccountView_Day_2_en.png | 3 + ...eateaccount_CreateAccountView_Day_3_en.png | 3 + ...teaccount_CreateAccountView_Night_0_en.png | 3 + ...teaccount_CreateAccountView_Night_1_en.png | 3 + ...teaccount_CreateAccountView_Night_2_en.png | 3 + ...teaccount_CreateAccountView_Night_3_en.png | 3 + ...ginpassword_LoginPasswordView_Day_0_en.png | 3 + ...ginpassword_LoginPasswordView_Day_1_en.png | 3 + ...ginpassword_LoginPasswordView_Day_2_en.png | 3 + ...npassword_LoginPasswordView_Night_0_en.png | 3 + ...npassword_LoginPasswordView_Night_1_en.png | 3 + ...npassword_LoginPasswordView_Night_2_en.png | 3 + ...ens.onboarding_OnBoardingView_Day_0_en.png | 3 + ...ens.onboarding_OnBoardingView_Day_1_en.png | 3 + ...ens.onboarding_OnBoardingView_Day_2_en.png | 3 + ...ens.onboarding_OnBoardingView_Day_3_en.png | 3 + ...ens.onboarding_OnBoardingView_Day_4_en.png | 3 + ...ens.onboarding_OnBoardingView_Day_5_en.png | 3 + ...ens.onboarding_OnBoardingView_Day_6_en.png | 3 + ...ens.onboarding_OnBoardingView_Day_7_en.png | 3 + ...s.onboarding_OnBoardingView_Night_0_en.png | 3 + ...s.onboarding_OnBoardingView_Night_1_en.png | 3 + ...s.onboarding_OnBoardingView_Night_2_en.png | 3 + ...s.onboarding_OnBoardingView_Night_3_en.png | 3 + ...s.onboarding_OnBoardingView_Night_4_en.png | 3 + ...s.onboarding_OnBoardingView_Night_5_en.png | 3 + ...s.onboarding_OnBoardingView_Night_6_en.png | 3 + ...s.onboarding_OnBoardingView_Night_7_en.png | 3 + ...mation_QrCodeConfirmationView_Day_0_en.png | 3 + ...mation_QrCodeConfirmationView_Day_1_en.png | 3 + ...mation_QrCodeConfirmationView_Day_2_en.png | 3 + ...tion_QrCodeConfirmationView_Night_0_en.png | 3 + ...tion_QrCodeConfirmationView_Night_1_en.png | 3 + ...tion_QrCodeConfirmationView_Night_2_en.png | 3 + ....qrcode.error_QrCodeErrorView_Day_0_en.png | 3 + ....qrcode.error_QrCodeErrorView_Day_1_en.png | 3 + ....qrcode.error_QrCodeErrorView_Day_2_en.png | 3 + ....qrcode.error_QrCodeErrorView_Day_3_en.png | 3 + ....qrcode.error_QrCodeErrorView_Day_4_en.png | 3 + ....qrcode.error_QrCodeErrorView_Day_5_en.png | 3 + ....qrcode.error_QrCodeErrorView_Day_6_en.png | 3 + ...rcode.error_QrCodeErrorView_Night_0_en.png | 3 + ...rcode.error_QrCodeErrorView_Night_1_en.png | 3 + ...rcode.error_QrCodeErrorView_Night_2_en.png | 3 + ...rcode.error_QrCodeErrorView_Night_3_en.png | 3 + ...rcode.error_QrCodeErrorView_Night_4_en.png | 3 + ...rcode.error_QrCodeErrorView_Night_5_en.png | 3 + ...rcode.error_QrCodeErrorView_Night_6_en.png | 3 + ....qrcode.intro_QrCodeIntroView_Day_0_en.png | 3 + ....qrcode.intro_QrCodeIntroView_Day_1_en.png | 3 + ...rcode.intro_QrCodeIntroView_Night_0_en.png | 3 + ...rcode.intro_QrCodeIntroView_Night_1_en.png | 3 + ...ns.qrcode.scan_QrCodeScanView_Day_0_en.png | 3 + ...ns.qrcode.scan_QrCodeScanView_Day_1_en.png | 3 + ...ns.qrcode.scan_QrCodeScanView_Day_2_en.png | 3 + ...ns.qrcode.scan_QrCodeScanView_Day_3_en.png | 3 + ...ns.qrcode.scan_QrCodeScanView_Day_4_en.png | 3 + ...ns.qrcode.scan_QrCodeScanView_Day_5_en.png | 3 + ....qrcode.scan_QrCodeScanView_Night_0_en.png | 3 + ....qrcode.scan_QrCodeScanView_Night_1_en.png | 3 + ....qrcode.scan_QrCodeScanView_Night_2_en.png | 3 + ....qrcode.scan_QrCodeScanView_Night_3_en.png | 3 + ....qrcode.scan_QrCodeScanView_Night_4_en.png | 3 + ....qrcode.scan_QrCodeScanView_Night_5_en.png | 3 + ...der_SearchAccountProviderView_Day_0_en.png | 3 + ...der_SearchAccountProviderView_Day_1_en.png | 3 + ...r_SearchAccountProviderView_Night_0_en.png | 3 + ...r_SearchAccountProviderView_Night_1_en.png | 3 + ...irect_DefaultDirectLogoutView_Day_0_en.png | 3 + ...irect_DefaultDirectLogoutView_Day_1_en.png | 3 + ...irect_DefaultDirectLogoutView_Day_2_en.png | 3 + ...irect_DefaultDirectLogoutView_Day_3_en.png | 3 + ...irect_DefaultDirectLogoutView_Day_4_en.png | 3 + ...ect_DefaultDirectLogoutView_Night_0_en.png | 3 + ...ect_DefaultDirectLogoutView_Night_1_en.png | 3 + ...ect_DefaultDirectLogoutView_Night_2_en.png | 3 + ...ect_DefaultDirectLogoutView_Night_3_en.png | 3 + ...ect_DefaultDirectLogoutView_Night_4_en.png | 3 + ....impl_AccountDeactivationView_Day_0_en.png | 3 + ....impl_AccountDeactivationView_Day_1_en.png | 3 + ....impl_AccountDeactivationView_Day_2_en.png | 3 + ....impl_AccountDeactivationView_Day_3_en.png | 3 + ....impl_AccountDeactivationView_Day_4_en.png | 3 + ...mpl_AccountDeactivationView_Night_0_en.png | 3 + ...mpl_AccountDeactivationView_Night_1_en.png | 3 + ...mpl_AccountDeactivationView_Night_2_en.png | 3 + ...mpl_AccountDeactivationView_Night_3_en.png | 3 + ...mpl_AccountDeactivationView_Night_4_en.png | 3 + ...atures.logout.impl_LogoutView_Day_0_en.png | 3 + ...tures.logout.impl_LogoutView_Day_10_en.png | 3 + ...tures.logout.impl_LogoutView_Day_11_en.png | 3 + ...atures.logout.impl_LogoutView_Day_1_en.png | 3 + ...atures.logout.impl_LogoutView_Day_2_en.png | 3 + ...atures.logout.impl_LogoutView_Day_3_en.png | 3 + ...atures.logout.impl_LogoutView_Day_4_en.png | 3 + ...atures.logout.impl_LogoutView_Day_5_en.png | 3 + ...atures.logout.impl_LogoutView_Day_6_en.png | 3 + ...atures.logout.impl_LogoutView_Day_7_en.png | 3 + ...atures.logout.impl_LogoutView_Day_8_en.png | 3 + ...atures.logout.impl_LogoutView_Day_9_en.png | 3 + ...ures.logout.impl_LogoutView_Night_0_en.png | 3 + ...res.logout.impl_LogoutView_Night_10_en.png | 3 + ...res.logout.impl_LogoutView_Night_11_en.png | 3 + ...ures.logout.impl_LogoutView_Night_1_en.png | 3 + ...ures.logout.impl_LogoutView_Night_2_en.png | 3 + ...ures.logout.impl_LogoutView_Night_3_en.png | 3 + ...ures.logout.impl_LogoutView_Night_4_en.png | 3 + ...ures.logout.impl_LogoutView_Night_5_en.png | 3 + ...ures.logout.impl_LogoutView_Night_6_en.png | 3 + ...ures.logout.impl_LogoutView_Night_7_en.png | 3 + ...ures.logout.impl_LogoutView_Night_8_en.png | 3 + ...ures.logout.impl_LogoutView_Night_9_en.png | 3 + ...ionlist_ActionListViewContent_Day_0_en.png | 3 + ...onlist_ActionListViewContent_Day_10_en.png | 3 + ...onlist_ActionListViewContent_Day_11_en.png | 3 + ...onlist_ActionListViewContent_Day_12_en.png | 3 + ...ionlist_ActionListViewContent_Day_1_en.png | 3 + ...ionlist_ActionListViewContent_Day_2_en.png | 3 + ...ionlist_ActionListViewContent_Day_3_en.png | 3 + ...ionlist_ActionListViewContent_Day_4_en.png | 3 + ...ionlist_ActionListViewContent_Day_5_en.png | 3 + ...ionlist_ActionListViewContent_Day_6_en.png | 3 + ...ionlist_ActionListViewContent_Day_7_en.png | 3 + ...ionlist_ActionListViewContent_Day_8_en.png | 3 + ...ionlist_ActionListViewContent_Day_9_en.png | 3 + ...nlist_ActionListViewContent_Night_0_en.png | 3 + ...list_ActionListViewContent_Night_10_en.png | 3 + ...list_ActionListViewContent_Night_11_en.png | 3 + ...list_ActionListViewContent_Night_12_en.png | 3 + ...nlist_ActionListViewContent_Night_1_en.png | 3 + ...nlist_ActionListViewContent_Night_2_en.png | 3 + ...nlist_ActionListViewContent_Night_3_en.png | 3 + ...nlist_ActionListViewContent_Night_4_en.png | 3 + ...nlist_ActionListViewContent_Night_5_en.png | 3 + ...nlist_ActionListViewContent_Night_6_en.png | 3 + ...nlist_ActionListViewContent_Night_7_en.png | 3 + ...nlist_ActionListViewContent_Night_8_en.png | 3 + ...nlist_ActionListViewContent_Night_9_en.png | 3 + ...tachments.preview_AttachmentsView_0_en.png | 3 + ...tachments.preview_AttachmentsView_1_en.png | 3 + ...tachments.preview_AttachmentsView_2_en.png | 3 + ...tachments.preview_AttachmentsView_3_en.png | 3 + ...tachments.preview_AttachmentsView_4_en.png | 3 + ...tachments.preview_AttachmentsView_5_en.png | 3 + ...tachments.preview_AttachmentsView_6_en.png | 3 + ...tachments.preview_AttachmentsView_7_en.png | 3 + ...tachments.preview_AttachmentsView_8_en.png | 3 + ...ew_VideoQualitySelectorDialog_Day_0_en.png | 3 + ..._VideoQualitySelectorDialog_Night_0_en.png | 3 + ...ntity_IdentityChangeStateView_Day_0_en.png | 3 + ...ntity_IdentityChangeStateView_Day_1_en.png | 3 + ...ntity_IdentityChangeStateView_Day_2_en.png | 3 + ...ity_IdentityChangeStateView_Night_0_en.png | 3 + ...ity_IdentityChangeStateView_Night_1_en.png | 3 + ...ity_IdentityChangeStateView_Night_2_en.png | 3 + ...essagesViewWithIdentityChange_Day_0_en.png | 3 + ...essagesViewWithIdentityChange_Day_1_en.png | 3 + ...essagesViewWithIdentityChange_Day_2_en.png | 3 + ...sagesViewWithIdentityChange_Night_0_en.png | 3 + ...sagesViewWithIdentityChange_Night_1_en.png | 3 + ...sagesViewWithIdentityChange_Night_2_en.png | 3 + ...veVerifiedUserSendFailureView_Day_0_en.png | 3 + ...veVerifiedUserSendFailureView_Day_1_en.png | 3 + ...veVerifiedUserSendFailureView_Day_2_en.png | 3 + ...VerifiedUserSendFailureView_Night_0_en.png | 3 + ...VerifiedUserSendFailureView_Night_1_en.png | 3 + ...VerifiedUserSendFailureView_Night_2_en.png | 3 + ...s.messages.impl.link_LinkView_Day_0_en.png | 3 + ...s.messages.impl.link_LinkView_Day_1_en.png | 3 + ...messages.impl.link_LinkView_Night_0_en.png | 3 + ...messages.impl.link_LinkView_Night_1_en.png | 3 + ...estions_SuggestionsPickerView_Day_0_en.png | 3 + ...tions_SuggestionsPickerView_Night_0_en.png | 3 + ...er_AttachmentSourcePickerMenu_Day_0_en.png | 3 + ..._AttachmentSourcePickerMenu_Night_0_en.png | 3 + ...composer_DisabledComposerView_Day_0_en.png | 3 + ...mposer_DisabledComposerView_Night_0_en.png | 3 + ...oser_MessageComposerViewVoice_Day_0_en.png | 3 + ...er_MessageComposerViewVoice_Night_0_en.png | 3 + ...ecomposer_MessageComposerView_Day_0_en.png | 3 + ...omposer_MessageComposerView_Night_0_en.png | 3 + ...nner_PinnedMessagesBannerView_Day_0_en.png | 3 + ...ner_PinnedMessagesBannerView_Day_10_en.png | 3 + ...nner_PinnedMessagesBannerView_Day_1_en.png | 3 + ...nner_PinnedMessagesBannerView_Day_2_en.png | 3 + ...nner_PinnedMessagesBannerView_Day_3_en.png | 3 + ...nner_PinnedMessagesBannerView_Day_4_en.png | 3 + ...nner_PinnedMessagesBannerView_Day_5_en.png | 3 + ...nner_PinnedMessagesBannerView_Day_6_en.png | 3 + ...nner_PinnedMessagesBannerView_Day_7_en.png | 3 + ...nner_PinnedMessagesBannerView_Day_8_en.png | 3 + ...nner_PinnedMessagesBannerView_Day_9_en.png | 3 + ...er_PinnedMessagesBannerView_Night_0_en.png | 3 + ...r_PinnedMessagesBannerView_Night_10_en.png | 3 + ...er_PinnedMessagesBannerView_Night_1_en.png | 3 + ...er_PinnedMessagesBannerView_Night_2_en.png | 3 + ...er_PinnedMessagesBannerView_Night_3_en.png | 3 + ...er_PinnedMessagesBannerView_Night_4_en.png | 3 + ...er_PinnedMessagesBannerView_Night_5_en.png | 3 + ...er_PinnedMessagesBannerView_Night_6_en.png | 3 + ...er_PinnedMessagesBannerView_Night_7_en.png | 3 + ...er_PinnedMessagesBannerView_Night_8_en.png | 3 + ...er_PinnedMessagesBannerView_Night_9_en.png | 3 + ...d.list_PinnedMessagesListView_Day_0_en.png | 3 + ...d.list_PinnedMessagesListView_Day_1_en.png | 3 + ...d.list_PinnedMessagesListView_Day_2_en.png | 3 + ...d.list_PinnedMessagesListView_Day_3_en.png | 3 + ...list_PinnedMessagesListView_Night_0_en.png | 3 + ...list_PinnedMessagesListView_Night_1_en.png | 3 + ...list_PinnedMessagesListView_Night_2_en.png | 3 + ...list_PinnedMessagesListView_Night_3_en.png | 3 + ...impl.report_ReportMessageView_Day_0_en.png | 3 + ...impl.report_ReportMessageView_Day_1_en.png | 3 + ...impl.report_ReportMessageView_Day_2_en.png | 3 + ...impl.report_ReportMessageView_Day_3_en.png | 3 + ...impl.report_ReportMessageView_Day_4_en.png | 3 + ...impl.report_ReportMessageView_Day_5_en.png | 3 + ...pl.report_ReportMessageView_Night_0_en.png | 3 + ...pl.report_ReportMessageView_Night_1_en.png | 3 + ...pl.report_ReportMessageView_Night_2_en.png | 3 + ...pl.report_ReportMessageView_Night_3_en.png | 3 + ...pl.report_ReportMessageView_Night_4_en.png | 3 + ...pl.report_ReportMessageView_Night_5_en.png | 3 + ...omreaction.picker_EmojiPicker_Day_0_en.png | 3 + ...omreaction.picker_EmojiPicker_Day_1_en.png | 3 + ...omreaction.picker_EmojiPicker_Day_2_en.png | 3 + ...omreaction.picker_EmojiPicker_Day_3_en.png | 3 + ...reaction.picker_EmojiPicker_Night_0_en.png | 3 + ...reaction.picker_EmojiPicker_Night_1_en.png | 3 + ...reaction.picker_EmojiPicker_Night_2_en.png | 3 + ...reaction.picker_EmojiPicker_Night_3_en.png | 3 + ...ents.customreaction_EmojiItem_Day_0_en.png | 3 + ...ts.customreaction_EmojiItem_Night_0_en.png | 3 + ...mponents.event_ProgressButton_Day_0_en.png | 3 + ...onents.event_ProgressButton_Night_0_en.png | 3 + ...t_TimelineImageWithCaptionRow_Day_0_en.png | 3 + ...TimelineImageWithCaptionRow_Night_0_en.png | 3 + ...s.event_TimelineItemAudioView_Day_0_en.png | 3 + ...s.event_TimelineItemAudioView_Day_1_en.png | 3 + ...s.event_TimelineItemAudioView_Day_2_en.png | 3 + ...s.event_TimelineItemAudioView_Day_3_en.png | 3 + ...s.event_TimelineItemAudioView_Day_4_en.png | 3 + ...event_TimelineItemAudioView_Night_0_en.png | 3 + ...event_TimelineItemAudioView_Night_1_en.png | 3 + ...event_TimelineItemAudioView_Night_2_en.png | 3 + ...event_TimelineItemAudioView_Night_3_en.png | 3 + ...event_TimelineItemAudioView_Night_4_en.png | 3 + ...ent_TimelineItemEncryptedView_Day_0_en.png | 3 + ...ent_TimelineItemEncryptedView_Day_1_en.png | 3 + ...ent_TimelineItemEncryptedView_Day_2_en.png | 3 + ...ent_TimelineItemEncryptedView_Day_3_en.png | 3 + ...ent_TimelineItemEncryptedView_Day_4_en.png | 3 + ...ent_TimelineItemEncryptedView_Day_5_en.png | 3 + ...ent_TimelineItemEncryptedView_Day_6_en.png | 3 + ...ent_TimelineItemEncryptedView_Day_7_en.png | 3 + ...ent_TimelineItemEncryptedView_Day_8_en.png | 3 + ...t_TimelineItemEncryptedView_Night_0_en.png | 3 + ...t_TimelineItemEncryptedView_Night_1_en.png | 3 + ...t_TimelineItemEncryptedView_Night_2_en.png | 3 + ...t_TimelineItemEncryptedView_Night_3_en.png | 3 + ...t_TimelineItemEncryptedView_Night_4_en.png | 3 + ...t_TimelineItemEncryptedView_Night_5_en.png | 3 + ...t_TimelineItemEncryptedView_Night_6_en.png | 3 + ...t_TimelineItemEncryptedView_Night_7_en.png | 3 + ...t_TimelineItemEncryptedView_Night_8_en.png | 3 + ...ts.event_TimelineItemFileView_Day_0_en.png | 3 + ...ts.event_TimelineItemFileView_Day_1_en.png | 3 + ...ts.event_TimelineItemFileView_Day_2_en.png | 3 + ...ts.event_TimelineItemFileView_Day_3_en.png | 3 + ...ts.event_TimelineItemFileView_Day_4_en.png | 3 + ....event_TimelineItemFileView_Night_0_en.png | 3 + ....event_TimelineItemFileView_Night_1_en.png | 3 + ....event_TimelineItemFileView_Night_2_en.png | 3 + ....event_TimelineItemFileView_Night_3_en.png | 3 + ....event_TimelineItemFileView_Night_4_en.png | 3 + ...ItemImageViewHideMediaContent_Day_0_en.png | 3 + ...emImageViewHideMediaContent_Night_0_en.png | 3 + ...s.event_TimelineItemImageView_Day_0_en.png | 3 + ...s.event_TimelineItemImageView_Day_1_en.png | 3 + ...s.event_TimelineItemImageView_Day_2_en.png | 3 + ...s.event_TimelineItemImageView_Day_3_en.png | 3 + ...event_TimelineItemImageView_Night_0_en.png | 3 + ...event_TimelineItemImageView_Night_1_en.png | 3 + ...event_TimelineItemImageView_Night_2_en.png | 3 + ...event_TimelineItemImageView_Night_3_en.png | 3 + ...t_TimelineItemInformativeView_Day_0_en.png | 3 + ...TimelineItemInformativeView_Night_0_en.png | 3 + ...elineItemLegacyCallInviteView_Day_0_en.png | 3 + ...ineItemLegacyCallInviteView_Night_0_en.png | 3 + ...vent_TimelineItemLocationView_Day_0_en.png | 3 + ...vent_TimelineItemLocationView_Day_1_en.png | 3 + ...nt_TimelineItemLocationView_Night_0_en.png | 3 + ...nt_TimelineItemLocationView_Night_1_en.png | 3 + ...ts.event_TimelineItemPollView_Day_0_en.png | 3 + ...ts.event_TimelineItemPollView_Day_1_en.png | 3 + ...ts.event_TimelineItemPollView_Day_2_en.png | 3 + ...ts.event_TimelineItemPollView_Day_3_en.png | 3 + ....event_TimelineItemPollView_Night_0_en.png | 3 + ....event_TimelineItemPollView_Night_1_en.png | 3 + ....event_TimelineItemPollView_Night_2_en.png | 3 + ....event_TimelineItemPollView_Night_3_en.png | 3 + ...vent_TimelineItemRedactedView_Day_0_en.png | 3 + ...nt_TimelineItemRedactedView_Night_0_en.png | 3 + ...s.event_TimelineItemStateView_Day_0_en.png | 3 + ...event_TimelineItemStateView_Night_0_en.png | 3 + ...event_TimelineItemStickerView_Day_0_en.png | 3 + ...event_TimelineItemStickerView_Day_1_en.png | 3 + ...event_TimelineItemStickerView_Day_2_en.png | 3 + ...event_TimelineItemStickerView_Day_3_en.png | 3 + ...ent_TimelineItemStickerView_Night_0_en.png | 3 + ...ent_TimelineItemStickerView_Night_1_en.png | 3 + ...ent_TimelineItemStickerView_Night_2_en.png | 3 + ...ent_TimelineItemStickerView_Night_3_en.png | 3 + ...ithLinkifiedUrlAndNestedParenthesis_en.png | 3 + ...imelineItemTextViewWithLinkifiedUrl_en.png | 3 + ...ts.event_TimelineItemTextView_Day_0_en.png | 3 + ...ts.event_TimelineItemTextView_Day_1_en.png | 3 + ...ts.event_TimelineItemTextView_Day_2_en.png | 3 + ...ts.event_TimelineItemTextView_Day_3_en.png | 3 + ...ts.event_TimelineItemTextView_Day_4_en.png | 3 + ...ts.event_TimelineItemTextView_Day_5_en.png | 3 + ....event_TimelineItemTextView_Night_0_en.png | 3 + ....event_TimelineItemTextView_Night_1_en.png | 3 + ....event_TimelineItemTextView_Night_2_en.png | 3 + ....event_TimelineItemTextView_Night_3_en.png | 3 + ....event_TimelineItemTextView_Night_4_en.png | 3 + ....event_TimelineItemTextView_Night_5_en.png | 3 + ...event_TimelineItemUnknownView_Day_0_en.png | 3 + ...ent_TimelineItemUnknownView_Night_0_en.png | 3 + ...ItemVideoViewHideMediaContent_Day_0_en.png | 3 + ...emVideoViewHideMediaContent_Night_0_en.png | 3 + ...s.event_TimelineItemVideoView_Day_0_en.png | 3 + ...s.event_TimelineItemVideoView_Day_1_en.png | 3 + ...s.event_TimelineItemVideoView_Day_2_en.png | 3 + ...s.event_TimelineItemVideoView_Day_3_en.png | 3 + ...event_TimelineItemVideoView_Night_0_en.png | 3 + ...event_TimelineItemVideoView_Night_1_en.png | 3 + ...event_TimelineItemVideoView_Night_2_en.png | 3 + ...event_TimelineItemVideoView_Night_3_en.png | 3 + ..._TimelineItemVoiceViewUnified_Day_0_en.png | 3 + ...imelineItemVoiceViewUnified_Night_0_en.png | 3 + ...s.event_TimelineItemVoiceView_Day_0_en.png | 3 + ....event_TimelineItemVoiceView_Day_10_en.png | 3 + ....event_TimelineItemVoiceView_Day_11_en.png | 3 + ....event_TimelineItemVoiceView_Day_12_en.png | 3 + ....event_TimelineItemVoiceView_Day_13_en.png | 3 + ....event_TimelineItemVoiceView_Day_14_en.png | 3 + ...s.event_TimelineItemVoiceView_Day_1_en.png | 3 + ...s.event_TimelineItemVoiceView_Day_2_en.png | 3 + ...s.event_TimelineItemVoiceView_Day_3_en.png | 3 + ...s.event_TimelineItemVoiceView_Day_4_en.png | 3 + ...s.event_TimelineItemVoiceView_Day_5_en.png | 3 + ...s.event_TimelineItemVoiceView_Day_6_en.png | 3 + ...s.event_TimelineItemVoiceView_Day_7_en.png | 3 + ...s.event_TimelineItemVoiceView_Day_8_en.png | 3 + ...s.event_TimelineItemVoiceView_Day_9_en.png | 3 + ...event_TimelineItemVoiceView_Night_0_en.png | 3 + ...vent_TimelineItemVoiceView_Night_10_en.png | 3 + ...vent_TimelineItemVoiceView_Night_11_en.png | 3 + ...vent_TimelineItemVoiceView_Night_12_en.png | 3 + ...vent_TimelineItemVoiceView_Night_13_en.png | 3 + ...vent_TimelineItemVoiceView_Night_14_en.png | 3 + ...event_TimelineItemVoiceView_Night_1_en.png | 3 + ...event_TimelineItemVoiceView_Night_2_en.png | 3 + ...event_TimelineItemVoiceView_Night_3_en.png | 3 + ...event_TimelineItemVoiceView_Night_4_en.png | 3 + ...event_TimelineItemVoiceView_Night_5_en.png | 3 + ...event_TimelineItemVoiceView_Night_6_en.png | 3 + ...event_TimelineItemVoiceView_Night_7_en.png | 3 + ...event_TimelineItemVoiceView_Night_8_en.png | 3 + ...event_TimelineItemVoiceView_Night_9_en.png | 3 + ...t_TimelineVideoWithCaptionRow_Day_0_en.png | 3 + ...TimelineVideoWithCaptionRow_Night_0_en.png | 3 + ...ponents.group_GroupHeaderView_Day_0_en.png | 3 + ...nents.group_GroupHeaderView_Night_0_en.png | 3 + ...ry_ReactionSummaryViewContent_Day_0_en.png | 3 + ..._ReactionSummaryViewContent_Night_0_en.png | 3 + ...msheet_ReadReceiptBottomSheet_Day_0_en.png | 3 + ...msheet_ReadReceiptBottomSheet_Day_1_en.png | 3 + ...msheet_ReadReceiptBottomSheet_Day_2_en.png | 3 + ...msheet_ReadReceiptBottomSheet_Day_3_en.png | 3 + ...msheet_ReadReceiptBottomSheet_Day_4_en.png | 3 + ...msheet_ReadReceiptBottomSheet_Day_5_en.png | 3 + ...heet_ReadReceiptBottomSheet_Night_0_en.png | 3 + ...heet_ReadReceiptBottomSheet_Night_1_en.png | 3 + ...heet_ReadReceiptBottomSheet_Night_2_en.png | 3 + ...heet_ReadReceiptBottomSheet_Night_3_en.png | 3 + ...heet_ReadReceiptBottomSheet_Night_4_en.png | 3 + ...heet_ReadReceiptBottomSheet_Night_5_en.png | 3 + ...t_TimelineItemReadReceiptView_Day_0_en.png | 3 + ...t_TimelineItemReadReceiptView_Day_1_en.png | 3 + ...t_TimelineItemReadReceiptView_Day_2_en.png | 3 + ...t_TimelineItemReadReceiptView_Day_3_en.png | 3 + ...t_TimelineItemReadReceiptView_Day_4_en.png | 3 + ...t_TimelineItemReadReceiptView_Day_5_en.png | 3 + ...t_TimelineItemReadReceiptView_Day_6_en.png | 3 + ...t_TimelineItemReadReceiptView_Day_7_en.png | 3 + ...TimelineItemReadReceiptView_Night_0_en.png | 3 + ...TimelineItemReadReceiptView_Night_1_en.png | 3 + ...TimelineItemReadReceiptView_Night_2_en.png | 3 + ...TimelineItemReadReceiptView_Night_3_en.png | 3 + ...TimelineItemReadReceiptView_Night_4_en.png | 3 + ...TimelineItemReadReceiptView_Night_5_en.png | 3 + ...TimelineItemReadReceiptView_Night_6_en.png | 3 + ...TimelineItemReadReceiptView_Night_7_en.png | 3 + ..._TimelineItemDaySeparatorView_Day_0_en.png | 3 + ..._TimelineItemDaySeparatorView_Day_1_en.png | 3 + ...imelineItemDaySeparatorView_Night_0_en.png | 3 + ...imelineItemDaySeparatorView_Night_1_en.png | 3 + ...al_TimelineItemReadMarkerView_Day_0_en.png | 3 + ..._TimelineItemReadMarkerView_Night_0_en.png | 3 + ...TimelineItemRoomBeginningView_Day_0_en.png | 3 + ...melineItemRoomBeginningView_Night_0_en.png | 3 + ..._TimelineLoadingMoreIndicator_Day_0_en.png | 3 + ...imelineLoadingMoreIndicator_Night_0_en.png | 3 + ...eline.components_CallMenuItem_Day_0_en.png | 3 + ...eline.components_CallMenuItem_Day_1_en.png | 3 + ...eline.components_CallMenuItem_Day_2_en.png | 3 + ...eline.components_CallMenuItem_Day_3_en.png | 3 + ...eline.components_CallMenuItem_Day_4_en.png | 3 + ...eline.components_CallMenuItem_Day_5_en.png | 3 + ...ine.components_CallMenuItem_Night_0_en.png | 3 + ...ine.components_CallMenuItem_Night_1_en.png | 3 + ...ine.components_CallMenuItem_Night_2_en.png | 3 + ...ine.components_CallMenuItem_Night_3_en.png | 3 + ...ine.components_CallMenuItem_Night_4_en.png | 3 + ...ine.components_CallMenuItem_Night_5_en.png | 3 + ...eline.components_FocusedEvent_Day_0_en.png | 3 + ...ine.components_FocusedEvent_Night_0_en.png | 3 + ...components_MessageEventBubble_Day_0_en.png | 3 + ...components_MessageEventBubble_Day_1_en.png | 3 + ...components_MessageEventBubble_Day_2_en.png | 3 + ...components_MessageEventBubble_Day_3_en.png | 3 + ...components_MessageEventBubble_Day_4_en.png | 3 + ...components_MessageEventBubble_Day_5_en.png | 3 + ...components_MessageEventBubble_Day_6_en.png | 3 + ...components_MessageEventBubble_Day_7_en.png | 3 + ...mponents_MessageEventBubble_Night_0_en.png | 3 + ...mponents_MessageEventBubble_Night_1_en.png | 3 + ...mponents_MessageEventBubble_Night_2_en.png | 3 + ...mponents_MessageEventBubble_Night_3_en.png | 3 + ...mponents_MessageEventBubble_Night_4_en.png | 3 + ...mponents_MessageEventBubble_Night_5_en.png | 3 + ...mponents_MessageEventBubble_Night_6_en.png | 3 + ...mponents_MessageEventBubble_Night_7_en.png | 3 + ....components_MessageShieldView_Day_0_en.png | 3 + ...omponents_MessageShieldView_Night_0_en.png | 3 + ...ts_MessageStateEventContainer_Day_0_en.png | 3 + ..._MessageStateEventContainer_Night_0_en.png | 3 + ...nts_MessagesReactionButtonAdd_Day_0_en.png | 3 + ...s_MessagesReactionButtonAdd_Night_0_en.png | 3 + ...s_MessagesReactionButtonExtra_Day_0_en.png | 3 + ...MessagesReactionButtonExtra_Night_0_en.png | 3 + ...onents_MessagesReactionButton_Day_0_en.png | 3 + ...onents_MessagesReactionButton_Day_1_en.png | 3 + ...onents_MessagesReactionButton_Day_2_en.png | 3 + ...onents_MessagesReactionButton_Day_3_en.png | 3 + ...ents_MessagesReactionButton_Night_0_en.png | 3 + ...ents_MessagesReactionButton_Night_1_en.png | 3 + ...ents_MessagesReactionButton_Night_2_en.png | 3 + ...ents_MessagesReactionButton_Night_3_en.png | 3 + ...omponents_ReplySwipeIndicator_Day_0_en.png | 3 + ...ponents_ReplySwipeIndicator_Night_0_en.png | 3 + ....components_ThreadSummaryView_Day_0_en.png | 3 + ...omponents_ThreadSummaryView_Night_0_en.png | 3 + ...ts_TimelineEventTimestampView_Day_0_en.png | 3 + ...ts_TimelineEventTimestampView_Day_1_en.png | 3 + ...ts_TimelineEventTimestampView_Day_2_en.png | 3 + ...ts_TimelineEventTimestampView_Day_3_en.png | 3 + ...ts_TimelineEventTimestampView_Day_4_en.png | 3 + ...ts_TimelineEventTimestampView_Day_5_en.png | 3 + ...ts_TimelineEventTimestampView_Day_6_en.png | 3 + ...ts_TimelineEventTimestampView_Day_7_en.png | 3 + ..._TimelineEventTimestampView_Night_0_en.png | 3 + ..._TimelineEventTimestampView_Night_1_en.png | 3 + ..._TimelineEventTimestampView_Night_2_en.png | 3 + ..._TimelineEventTimestampView_Night_3_en.png | 3 + ..._TimelineEventTimestampView_Night_4_en.png | 3 + ..._TimelineEventTimestampView_Night_5_en.png | 3 + ..._TimelineEventTimestampView_Night_6_en.png | 3 + ..._TimelineEventTimestampView_Night_7_en.png | 3 + ...ts_TimelineItemCallNotifyView_Day_0_en.png | 3 + ..._TimelineItemCallNotifyView_Night_0_en.png | 3 + ...lineItemEventRowDisambiguated_Day_0_en.png | 3 + ...neItemEventRowDisambiguated_Night_0_en.png | 3 + ...lineItemEventRowForDirectRoom_Day_0_en.png | 3 + ...neItemEventRowForDirectRoom_Night_0_en.png | 3 + ..._TimelineItemEventRowLongSenderName_en.png | 3 + ...ts_TimelineItemEventRowShield_Day_0_en.png | 3 + ..._TimelineItemEventRowShield_Night_0_en.png | 3 + ...TimelineItemEventRowTimestamp_Day_0_en.png | 3 + ...TimelineItemEventRowTimestamp_Day_1_en.png | 3 + ...TimelineItemEventRowTimestamp_Day_2_en.png | 3 + ...TimelineItemEventRowTimestamp_Day_3_en.png | 3 + ...TimelineItemEventRowTimestamp_Day_4_en.png | 3 + ...TimelineItemEventRowTimestamp_Day_5_en.png | 3 + ...TimelineItemEventRowTimestamp_Day_6_en.png | 3 + ...TimelineItemEventRowTimestamp_Day_7_en.png | 3 + ...melineItemEventRowTimestamp_Night_0_en.png | 3 + ...melineItemEventRowTimestamp_Night_1_en.png | 3 + ...melineItemEventRowTimestamp_Night_2_en.png | 3 + ...melineItemEventRowTimestamp_Night_3_en.png | 3 + ...melineItemEventRowTimestamp_Night_4_en.png | 3 + ...melineItemEventRowTimestamp_Night_5_en.png | 3 + ...melineItemEventRowTimestamp_Night_6_en.png | 3 + ...melineItemEventRowTimestamp_Night_7_en.png | 3 + ...nents_TimelineItemEventRowUtd_Day_0_en.png | 3 + ...nts_TimelineItemEventRowUtd_Night_0_en.png | 3 + ...ItemEventRowWithManyReactions_Day_0_en.png | 3 + ...emEventRowWithManyReactions_Night_0_en.png | 3 + ...ts_TimelineItemEventRowWithRR_Day_0_en.png | 3 + ...ts_TimelineItemEventRowWithRR_Day_1_en.png | 3 + ...ts_TimelineItemEventRowWithRR_Day_2_en.png | 3 + ..._TimelineItemEventRowWithRR_Night_0_en.png | 3 + ..._TimelineItemEventRowWithRR_Night_1_en.png | 3 + ..._TimelineItemEventRowWithRR_Night_2_en.png | 3 + ...mEventRowWithReplyInformative_Day_0_en.png | 3 + ...mEventRowWithReplyInformative_Day_1_en.png | 3 + ...ventRowWithReplyInformative_Night_0_en.png | 3 + ...ventRowWithReplyInformative_Night_1_en.png | 3 + ...ineItemEventRowWithReplyOther_Day_0_en.png | 3 + ...ineItemEventRowWithReplyOther_Day_1_en.png | 3 + ...eItemEventRowWithReplyOther_Night_0_en.png | 3 + ...eItemEventRowWithReplyOther_Night_1_en.png | 3 + ...TimelineItemEventRowWithReply_Day_0_en.png | 3 + ...imelineItemEventRowWithReply_Day_10_en.png | 3 + ...imelineItemEventRowWithReply_Day_11_en.png | 3 + ...TimelineItemEventRowWithReply_Day_1_en.png | 3 + ...TimelineItemEventRowWithReply_Day_2_en.png | 3 + ...TimelineItemEventRowWithReply_Day_3_en.png | 3 + ...TimelineItemEventRowWithReply_Day_4_en.png | 3 + ...TimelineItemEventRowWithReply_Day_5_en.png | 3 + ...TimelineItemEventRowWithReply_Day_6_en.png | 3 + ...TimelineItemEventRowWithReply_Day_7_en.png | 3 + ...TimelineItemEventRowWithReply_Day_8_en.png | 3 + ...TimelineItemEventRowWithReply_Day_9_en.png | 3 + ...melineItemEventRowWithReply_Night_0_en.png | 3 + ...elineItemEventRowWithReply_Night_10_en.png | 3 + ...elineItemEventRowWithReply_Night_11_en.png | 3 + ...melineItemEventRowWithReply_Night_1_en.png | 3 + ...melineItemEventRowWithReply_Night_2_en.png | 3 + ...melineItemEventRowWithReply_Night_3_en.png | 3 + ...melineItemEventRowWithReply_Night_4_en.png | 3 + ...melineItemEventRowWithReply_Night_5_en.png | 3 + ...melineItemEventRowWithReply_Night_6_en.png | 3 + ...melineItemEventRowWithReply_Night_7_en.png | 3 + ...melineItemEventRowWithReply_Night_8_en.png | 3 + ...melineItemEventRowWithReply_Night_9_en.png | 3 + ...ItemEventRowWithThreadSummary_Day_0_en.png | 3 + ...emEventRowWithThreadSummary_Night_0_en.png | 3 + ...mponents_TimelineItemEventRow_Day_0_en.png | 3 + ...onents_TimelineItemEventRow_Night_0_en.png | 3 + ...nts_TimelineItemEventTimestampBelow_en.png | 3 + ...oupedEventsRowContentCollapse_Day_0_en.png | 3 + ...pedEventsRowContentCollapse_Night_0_en.png | 3 + ...oupedEventsRowContentExpanded_Day_0_en.png | 3 + ...pedEventsRowContentExpanded_Night_0_en.png | 3 + ...s_TimelineItemReactionsLayout_Day_0_en.png | 3 + ...TimelineItemReactionsLayout_Night_0_en.png | 3 + ..._TimelineItemReactionsViewFew_Day_0_en.png | 3 + ...imelineItemReactionsViewFew_Night_0_en.png | 3 + ...lineItemReactionsViewIncoming_Day_0_en.png | 3 + ...neItemReactionsViewIncoming_Night_0_en.png | 3 + ...lineItemReactionsViewOutgoing_Day_0_en.png | 3 + ...neItemReactionsViewOutgoing_Night_0_en.png | 3 + ...nts_TimelineItemReactionsView_Day_0_en.png | 3 + ...s_TimelineItemReactionsView_Night_0_en.png | 3 + ...nts_TimelineItemStateEventRow_Day_0_en.png | 3 + ...s_TimelineItemStateEventRow_Night_0_en.png | 3 + ...line.debug_EventDebugInfoView_Day_0_en.png | 3 + ...ne.debug_EventDebugInfoView_Night_0_en.png | 3 + ...e.focus_FocusRequestStateView_Day_0_en.png | 3 + ...e.focus_FocusRequestStateView_Day_1_en.png | 3 + ...e.focus_FocusRequestStateView_Day_2_en.png | 3 + ...e.focus_FocusRequestStateView_Day_3_en.png | 3 + ...focus_FocusRequestStateView_Night_0_en.png | 3 + ...focus_FocusRequestStateView_Night_1_en.png | 3 + ...focus_FocusRequestStateView_Night_2_en.png | 3 + ...focus_FocusRequestStateView_Night_3_en.png | 3 + ...line.protection_ProtectedView_Day_0_en.png | 3 + ...line.protection_ProtectedView_Day_1_en.png | 3 + ...line.protection_ProtectedView_Day_2_en.png | 3 + ...line.protection_ProtectedView_Day_3_en.png | 3 + ...ne.protection_ProtectedView_Night_0_en.png | 3 + ...ne.protection_ProtectedView_Night_1_en.png | 3 + ...ne.protection_ProtectedView_Night_2_en.png | 3 + ...ne.protection_ProtectedView_Night_3_en.png | 3 + ...ine_TimelineViewMessageShield_Day_0_en.png | 3 + ...e_TimelineViewMessageShield_Night_0_en.png | 3 + ...es.impl.timeline_TimelineView_Day_0_en.png | 3 + ...s.impl.timeline_TimelineView_Day_10_en.png | 3 + ...s.impl.timeline_TimelineView_Day_11_en.png | 3 + ...s.impl.timeline_TimelineView_Day_12_en.png | 3 + ...s.impl.timeline_TimelineView_Day_13_en.png | 3 + ...s.impl.timeline_TimelineView_Day_14_en.png | 3 + ...s.impl.timeline_TimelineView_Day_15_en.png | 3 + ...s.impl.timeline_TimelineView_Day_16_en.png | 3 + ...s.impl.timeline_TimelineView_Day_17_en.png | 3 + ...es.impl.timeline_TimelineView_Day_1_en.png | 3 + ...es.impl.timeline_TimelineView_Day_2_en.png | 3 + ...es.impl.timeline_TimelineView_Day_3_en.png | 3 + ...es.impl.timeline_TimelineView_Day_4_en.png | 3 + ...es.impl.timeline_TimelineView_Day_5_en.png | 3 + ...es.impl.timeline_TimelineView_Day_6_en.png | 3 + ...es.impl.timeline_TimelineView_Day_7_en.png | 3 + ...es.impl.timeline_TimelineView_Day_8_en.png | 3 + ...es.impl.timeline_TimelineView_Day_9_en.png | 3 + ....impl.timeline_TimelineView_Night_0_en.png | 3 + ...impl.timeline_TimelineView_Night_10_en.png | 3 + ...impl.timeline_TimelineView_Night_11_en.png | 3 + ...impl.timeline_TimelineView_Night_12_en.png | 3 + ...impl.timeline_TimelineView_Night_13_en.png | 3 + ...impl.timeline_TimelineView_Night_14_en.png | 3 + ...impl.timeline_TimelineView_Night_15_en.png | 3 + ...impl.timeline_TimelineView_Night_16_en.png | 3 + ...impl.timeline_TimelineView_Night_17_en.png | 3 + ....impl.timeline_TimelineView_Night_1_en.png | 3 + ....impl.timeline_TimelineView_Night_2_en.png | 3 + ....impl.timeline_TimelineView_Night_3_en.png | 3 + ....impl.timeline_TimelineView_Night_4_en.png | 3 + ....impl.timeline_TimelineView_Night_5_en.png | 3 + ....impl.timeline_TimelineView_Night_6_en.png | 3 + ....impl.timeline_TimelineView_Night_7_en.png | 3 + ....impl.timeline_TimelineView_Night_8_en.png | 3 + ....impl.timeline_TimelineView_Night_9_en.png | 3 + ...pl.topbars_MessagesViewTopBar_Day_0_en.png | 3 + ....topbars_MessagesViewTopBar_Night_0_en.png | 3 + ...ges.impl.topbars_ThreadTopBar_Day_0_en.png | 3 + ...s.impl.topbars_ThreadTopBar_Night_0_en.png | 3 + ...typing_TypingNotificationView_Day_0_en.png | 3 + ...typing_TypingNotificationView_Day_1_en.png | 3 + ...typing_TypingNotificationView_Day_2_en.png | 3 + ...typing_TypingNotificationView_Day_3_en.png | 3 + ...typing_TypingNotificationView_Day_4_en.png | 3 + ...typing_TypingNotificationView_Day_5_en.png | 3 + ...typing_TypingNotificationView_Day_6_en.png | 3 + ...typing_TypingNotificationView_Day_7_en.png | 3 + ...typing_TypingNotificationView_Day_8_en.png | 3 + ...ping_TypingNotificationView_Night_0_en.png | 3 + ...ping_TypingNotificationView_Night_1_en.png | 3 + ...ping_TypingNotificationView_Night_2_en.png | 3 + ...ping_TypingNotificationView_Night_3_en.png | 3 + ...ping_TypingNotificationView_Night_4_en.png | 3 + ...ping_TypingNotificationView_Night_5_en.png | 3 + ...ping_TypingNotificationView_Night_6_en.png | 3 + ...ping_TypingNotificationView_Night_7_en.png | 3 + ...ping_TypingNotificationView_Night_8_en.png | 3 + ...es.messages.impl_MessagesView_Day_0_en.png | 3 + ...es.messages.impl_MessagesView_Day_1_en.png | 3 + ...es.messages.impl_MessagesView_Day_2_en.png | 3 + ...es.messages.impl_MessagesView_Day_3_en.png | 3 + ...es.messages.impl_MessagesView_Day_4_en.png | 3 + ...es.messages.impl_MessagesView_Day_5_en.png | 3 + ...es.messages.impl_MessagesView_Day_6_en.png | 3 + ...es.messages.impl_MessagesView_Day_7_en.png | 3 + ...es.messages.impl_MessagesView_Day_8_en.png | 3 + ...es.messages.impl_MessagesView_Day_9_en.png | 3 + ....messages.impl_MessagesView_Night_0_en.png | 3 + ....messages.impl_MessagesView_Night_1_en.png | 3 + ....messages.impl_MessagesView_Night_2_en.png | 3 + ....messages.impl_MessagesView_Night_3_en.png | 3 + ....messages.impl_MessagesView_Night_4_en.png | 3 + ....messages.impl_MessagesView_Night_5_en.png | 3 + ....messages.impl_MessagesView_Night_6_en.png | 3 + ....messages.impl_MessagesView_Night_7_en.png | 3 + ....messages.impl_MessagesView_Night_8_en.png | 3 + ....messages.impl_MessagesView_Night_9_en.png | 3 + ....migration.impl_MigrationView_Day_0_en.png | 3 + ....migration.impl_MigrationView_Day_1_en.png | 3 + ...igration.impl_MigrationView_Night_0_en.png | 3 + ...igration.impl_MigrationView_Night_1_en.png | 3 + ....api.ui_ConnectivityIndicator_Day_0_en.png | 3 + ...pi.ui_ConnectivityIndicator_Night_0_en.png | 3 + ...nswerViewDisclosedNotSelected_Day_0_en.png | 3 + ...werViewDisclosedNotSelected_Night_0_en.png | 3 + ...llAnswerViewDisclosedSelected_Day_0_en.png | 3 + ...AnswerViewDisclosedSelected_Night_0_en.png | 3 + ...t_PollAnswerViewEndedSelected_Day_0_en.png | 3 + ...PollAnswerViewEndedSelected_Night_0_en.png | 3 + ...werViewEndedWinnerNotSelected_Day_0_en.png | 3 + ...rViewEndedWinnerNotSelected_Night_0_en.png | 3 + ...AnswerViewEndedWinnerSelected_Day_0_en.png | 3 + ...swerViewEndedWinnerSelected_Night_0_en.png | 3 + ...werViewUndisclosedNotSelected_Day_0_en.png | 3 + ...rViewUndisclosedNotSelected_Night_0_en.png | 3 + ...AnswerViewUndisclosedSelected_Day_0_en.png | 3 + ...swerViewUndisclosedSelected_Night_0_en.png | 3 + ...ollContentViewCreatorEditable_Day_0_en.png | 3 + ...lContentViewCreatorEditable_Night_0_en.png | 3 + ...t_PollContentViewCreatorEnded_Day_0_en.png | 3 + ...PollContentViewCreatorEnded_Night_0_en.png | 3 + ...ontent_PollContentViewCreator_Day_0_en.png | 3 + ...tent_PollContentViewCreator_Night_0_en.png | 3 + ...tent_PollContentViewDisclosed_Day_0_en.png | 3 + ...nt_PollContentViewDisclosed_Night_0_en.png | 3 + ...lcontent_PollContentViewEnded_Day_0_en.png | 3 + ...ontent_PollContentViewEnded_Night_0_en.png | 3 + ...nt_PollContentViewUndisclosed_Day_0_en.png | 3 + ..._PollContentViewUndisclosed_Night_0_en.png | 3 + ...api.pollcontent_PollTitleView_Day_0_en.png | 3 + ...i.pollcontent_PollTitleView_Night_0_en.png | 3 + ...ll.impl.create_CreatePollView_Day_0_en.png | 3 + ...ll.impl.create_CreatePollView_Day_1_en.png | 3 + ...ll.impl.create_CreatePollView_Day_2_en.png | 3 + ...ll.impl.create_CreatePollView_Day_3_en.png | 3 + ...ll.impl.create_CreatePollView_Day_4_en.png | 3 + ...ll.impl.create_CreatePollView_Day_5_en.png | 3 + ...ll.impl.create_CreatePollView_Day_6_en.png | 3 + ...ll.impl.create_CreatePollView_Day_7_en.png | 3 + ....impl.create_CreatePollView_Night_0_en.png | 3 + ....impl.create_CreatePollView_Night_1_en.png | 3 + ....impl.create_CreatePollView_Night_2_en.png | 3 + ....impl.create_CreatePollView_Night_3_en.png | 3 + ....impl.create_CreatePollView_Night_4_en.png | 3 + ....impl.create_CreatePollView_Night_5_en.png | 3 + ....impl.create_CreatePollView_Night_6_en.png | 3 + ....impl.create_CreatePollView_Night_7_en.png | 3 + ....impl.history_PollHistoryView_Day_0_en.png | 3 + ....impl.history_PollHistoryView_Day_1_en.png | 3 + ....impl.history_PollHistoryView_Day_2_en.png | 3 + ....impl.history_PollHistoryView_Day_3_en.png | 3 + ....impl.history_PollHistoryView_Day_4_en.png | 3 + ...mpl.history_PollHistoryView_Night_0_en.png | 3 + ...mpl.history_PollHistoryView_Night_1_en.png | 3 + ...mpl.history_PollHistoryView_Night_2_en.png | 3 + ...mpl.history_PollHistoryView_Night_3_en.png | 3 + ...mpl.history_PollHistoryView_Night_4_en.png | 3 + ...ferences.impl.about_AboutView_Day_0_en.png | 3 + ...rences.impl.about_AboutView_Night_0_en.png | 3 + ...advanced_AdvancedSettingsViewDark_0_en.png | 3 + ...advanced_AdvancedSettingsViewDark_1_en.png | 3 + ...advanced_AdvancedSettingsViewDark_2_en.png | 3 + ...advanced_AdvancedSettingsViewDark_3_en.png | 3 + ...advanced_AdvancedSettingsViewDark_4_en.png | 3 + ...advanced_AdvancedSettingsViewDark_5_en.png | 3 + ...advanced_AdvancedSettingsViewDark_6_en.png | 3 + ...advanced_AdvancedSettingsViewDark_7_en.png | 3 + ...advanced_AdvancedSettingsViewDark_8_en.png | 3 + ...dvanced_AdvancedSettingsViewLight_0_en.png | 3 + ...dvanced_AdvancedSettingsViewLight_1_en.png | 3 + ...dvanced_AdvancedSettingsViewLight_2_en.png | 3 + ...dvanced_AdvancedSettingsViewLight_3_en.png | 3 + ...dvanced_AdvancedSettingsViewLight_4_en.png | 3 + ...dvanced_AdvancedSettingsViewLight_5_en.png | 3 + ...dvanced_AdvancedSettingsViewLight_6_en.png | 3 + ...dvanced_AdvancedSettingsViewLight_7_en.png | 3 + ...dvanced_AdvancedSettingsViewLight_8_en.png | 3 + ...ed_VideoQualitySelectorDialog_Day_0_en.png | 3 + ..._VideoQualitySelectorDialog_Night_0_en.png | 3 + ...alytics_AnalyticsSettingsView_Day_0_en.png | 3 + ...ytics_AnalyticsSettingsView_Night_0_en.png | 3 + ...blockedusers_BlockedUsersView_Day_0_en.png | 3 + ...blockedusers_BlockedUsersView_Day_1_en.png | 3 + ...blockedusers_BlockedUsersView_Day_2_en.png | 3 + ...blockedusers_BlockedUsersView_Day_3_en.png | 3 + ...blockedusers_BlockedUsersView_Day_4_en.png | 3 + ...blockedusers_BlockedUsersView_Day_5_en.png | 3 + ...blockedusers_BlockedUsersView_Day_6_en.png | 3 + ...ockedusers_BlockedUsersView_Night_0_en.png | 3 + ...ockedusers_BlockedUsersView_Night_1_en.png | 3 + ...ockedusers_BlockedUsersView_Night_2_en.png | 3 + ...ockedusers_BlockedUsersView_Night_3_en.png | 3 + ...ockedusers_BlockedUsersView_Night_4_en.png | 3 + ...ockedusers_BlockedUsersView_Night_5_en.png | 3 + ...ockedusers_BlockedUsersView_Night_6_en.png | 3 + ...veloper_DeveloperSettingsView_Day_0_en.png | 3 + ...veloper_DeveloperSettingsView_Day_1_en.png | 3 + ...veloper_DeveloperSettingsView_Day_2_en.png | 3 + ...veloper_DeveloperSettingsView_Day_3_en.png | 3 + ...loper_DeveloperSettingsView_Night_0_en.png | 3 + ...loper_DeveloperSettingsView_Night_1_en.png | 3 + ...loper_DeveloperSettingsView_Night_2_en.png | 3 + ...loper_DeveloperSettingsView_Night_3_en.png | 3 + ...references.impl.labs_LabsView_Day_0_en.png | 3 + ...references.impl.labs_LabsView_Day_1_en.png | 3 + ...ferences.impl.labs_LabsView_Night_0_en.png | 3 + ...ferences.impl.labs_LabsView_Night_1_en.png | 3 + ...aultNotificationSettingOption_Day_0_en.png | 3 + ...ltNotificationSettingOption_Night_0_en.png | 3 + ...efaultNotificationSettingView_Day_0_en.png | 3 + ...efaultNotificationSettingView_Day_1_en.png | 3 + ...efaultNotificationSettingView_Day_2_en.png | 3 + ...efaultNotificationSettingView_Day_3_en.png | 3 + ...efaultNotificationSettingView_Day_4_en.png | 3 + ...aultNotificationSettingView_Night_0_en.png | 3 + ...aultNotificationSettingView_Night_1_en.png | 3 + ...aultNotificationSettingView_Night_2_en.png | 3 + ...aultNotificationSettingView_Night_3_en.png | 3 + ...aultNotificationSettingView_Night_4_en.png | 3 + ...ions_NotificationSettingsView_Day_0_en.png | 3 + ...ons_NotificationSettingsView_Day_10_en.png | 3 + ...ons_NotificationSettingsView_Day_11_en.png | 3 + ...ons_NotificationSettingsView_Day_12_en.png | 3 + ...ons_NotificationSettingsView_Day_13_en.png | 3 + ...ions_NotificationSettingsView_Day_1_en.png | 3 + ...ions_NotificationSettingsView_Day_2_en.png | 3 + ...ions_NotificationSettingsView_Day_3_en.png | 3 + ...ions_NotificationSettingsView_Day_4_en.png | 3 + ...ions_NotificationSettingsView_Day_5_en.png | 3 + ...ions_NotificationSettingsView_Day_6_en.png | 3 + ...ions_NotificationSettingsView_Day_7_en.png | 3 + ...ions_NotificationSettingsView_Day_8_en.png | 3 + ...ions_NotificationSettingsView_Day_9_en.png | 3 + ...ns_NotificationSettingsView_Night_0_en.png | 3 + ...s_NotificationSettingsView_Night_10_en.png | 3 + ...s_NotificationSettingsView_Night_11_en.png | 3 + ...s_NotificationSettingsView_Night_12_en.png | 3 + ...s_NotificationSettingsView_Night_13_en.png | 3 + ...ns_NotificationSettingsView_Night_1_en.png | 3 + ...ns_NotificationSettingsView_Night_2_en.png | 3 + ...ns_NotificationSettingsView_Night_3_en.png | 3 + ...ns_NotificationSettingsView_Night_4_en.png | 3 + ...ns_NotificationSettingsView_Night_5_en.png | 3 + ...ns_NotificationSettingsView_Night_6_en.png | 3 + ...ns_NotificationSettingsView_Night_7_en.png | 3 + ...ns_NotificationSettingsView_Night_8_en.png | 3 + ...ns_NotificationSettingsView_Night_9_en.png | 3 + ...impl.root_MultiAccountSection_Day_0_en.png | 3 + ...pl.root_MultiAccountSection_Night_0_en.png | 3 + ...impl.root_PreferencesRootViewDark_0_en.png | 3 + ...impl.root_PreferencesRootViewDark_1_en.png | 3 + ...mpl.root_PreferencesRootViewLight_0_en.png | 3 + ...mpl.root_PreferencesRootViewLight_1_en.png | 3 + ...itprofile_EditUserProfileView_Day_0_en.png | 3 + ...itprofile_EditUserProfileView_Day_1_en.png | 3 + ...itprofile_EditUserProfileView_Day_2_en.png | 3 + ...profile_EditUserProfileView_Night_0_en.png | 3 + ...profile_EditUserProfileView_Night_1_en.png | 3 + ...profile_EditUserProfileView_Night_2_en.png | 3 + ...ces.impl.user_UserPreferences_Day_0_en.png | 3 + ...ces.impl.user_UserPreferences_Day_1_en.png | 3 + ...ces.impl.user_UserPreferences_Day_2_en.png | 3 + ...s.impl.user_UserPreferences_Night_0_en.png | 3 + ...s.impl.user_UserPreferences_Night_1_en.png | 3 + ...s.impl.user_UserPreferences_Night_2_en.png | 3 + ....api.crash_CrashDetectionView_Day_0_en.png | 3 + ...pi.crash_CrashDetectionView_Night_0_en.png | 3 + ...ection_RageshakeDialogContent_Day_0_en.png | 3 + ...tion_RageshakeDialogContent_Night_0_en.png | 3 + ...nces_RageshakePreferencesView_Day_0_en.png | 3 + ...nces_RageshakePreferencesView_Day_1_en.png | 3 + ...es_RageshakePreferencesView_Night_0_en.png | 3 + ...es_RageshakePreferencesView_Night_1_en.png | 3 + ...e.impl.bugreport_BugReportViewDay_0_en.png | 3 + ...e.impl.bugreport_BugReportViewDay_1_en.png | 3 + ...e.impl.bugreport_BugReportViewDay_2_en.png | 3 + ...e.impl.bugreport_BugReportViewDay_3_en.png | 3 + ...e.impl.bugreport_BugReportViewDay_4_en.png | 3 + ...impl.bugreport_BugReportViewNight_0_en.png | 3 + ...impl.bugreport_BugReportViewNight_1_en.png | 3 + ...impl.bugreport_BugReportViewNight_2_en.png | 3 + ...impl.bugreport_BugReportViewNight_3_en.png | 3 + ...impl.bugreport_BugReportViewNight_4_en.png | 3 + ...eportroom.impl_ReportRoomView_Day_0_en.png | 3 + ...eportroom.impl_ReportRoomView_Day_1_en.png | 3 + ...eportroom.impl_ReportRoomView_Day_2_en.png | 3 + ...eportroom.impl_ReportRoomView_Day_3_en.png | 3 + ...eportroom.impl_ReportRoomView_Day_4_en.png | 3 + ...ortroom.impl_ReportRoomView_Night_0_en.png | 3 + ...ortroom.impl_ReportRoomView_Night_1_en.png | 3 + ...ortroom.impl_ReportRoomView_Night_2_en.png | 3 + ...ortroom.impl_ReportRoomView_Night_3_en.png | 3 + ...ortroom.impl_ReportRoomView_Night_4_en.png | 3 + ...ons_ChangeRoomPermissionsView_Day_0_en.png | 3 + ...ons_ChangeRoomPermissionsView_Day_1_en.png | 3 + ...ons_ChangeRoomPermissionsView_Day_2_en.png | 3 + ...ons_ChangeRoomPermissionsView_Day_3_en.png | 3 + ...ons_ChangeRoomPermissionsView_Day_4_en.png | 3 + ...s_ChangeRoomPermissionsView_Night_0_en.png | 3 + ...s_ChangeRoomPermissionsView_Night_1_en.png | 3 + ...s_ChangeRoomPermissionsView_Night_2_en.png | 3 + ...s_ChangeRoomPermissionsView_Night_3_en.png | 3 + ...s_ChangeRoomPermissionsView_Night_4_en.png | 3 + ...ns.impl.roles_ChangeRolesView_Day_0_en.png | 3 + ...s.impl.roles_ChangeRolesView_Day_10_en.png | 3 + ...s.impl.roles_ChangeRolesView_Day_11_en.png | 3 + ...s.impl.roles_ChangeRolesView_Day_12_en.png | 3 + ...s.impl.roles_ChangeRolesView_Day_13_en.png | 3 + ...ns.impl.roles_ChangeRolesView_Day_1_en.png | 3 + ...ns.impl.roles_ChangeRolesView_Day_2_en.png | 3 + ...ns.impl.roles_ChangeRolesView_Day_3_en.png | 3 + ...ns.impl.roles_ChangeRolesView_Day_4_en.png | 3 + ...ns.impl.roles_ChangeRolesView_Day_5_en.png | 3 + ...ns.impl.roles_ChangeRolesView_Day_6_en.png | 3 + ...ns.impl.roles_ChangeRolesView_Day_7_en.png | 3 + ...ns.impl.roles_ChangeRolesView_Day_8_en.png | 3 + ...ns.impl.roles_ChangeRolesView_Day_9_en.png | 3 + ....impl.roles_ChangeRolesView_Night_0_en.png | 3 + ...impl.roles_ChangeRolesView_Night_10_en.png | 3 + ...impl.roles_ChangeRolesView_Night_11_en.png | 3 + ...impl.roles_ChangeRolesView_Night_12_en.png | 3 + ...impl.roles_ChangeRolesView_Night_13_en.png | 3 + ....impl.roles_ChangeRolesView_Night_1_en.png | 3 + ....impl.roles_ChangeRolesView_Night_2_en.png | 3 + ....impl.roles_ChangeRolesView_Night_3_en.png | 3 + ....impl.roles_ChangeRolesView_Night_4_en.png | 3 + ....impl.roles_ChangeRolesView_Night_5_en.png | 3 + ....impl.roles_ChangeRolesView_Night_6_en.png | 3 + ....impl.roles_ChangeRolesView_Night_7_en.png | 3 + ....impl.roles_ChangeRolesView_Night_8_en.png | 3 + ....impl.roles_ChangeRolesView_Night_9_en.png | 3 + ..._PendingMemberRowWithLongName_Day_0_en.png | 3 + ...endingMemberRowWithLongName_Night_0_en.png | 3 + ....root_RolesAndPermissionsView_Day_0_en.png | 3 + ....root_RolesAndPermissionsView_Day_1_en.png | 3 + ....root_RolesAndPermissionsView_Day_2_en.png | 3 + ....root_RolesAndPermissionsView_Day_3_en.png | 3 + ....root_RolesAndPermissionsView_Day_4_en.png | 3 + ....root_RolesAndPermissionsView_Day_5_en.png | 3 + ....root_RolesAndPermissionsView_Day_6_en.png | 3 + ....root_RolesAndPermissionsView_Day_7_en.png | 3 + ....root_RolesAndPermissionsView_Day_8_en.png | 3 + ...oot_RolesAndPermissionsView_Night_0_en.png | 3 + ...oot_RolesAndPermissionsView_Night_1_en.png | 3 + ...oot_RolesAndPermissionsView_Night_2_en.png | 3 + ...oot_RolesAndPermissionsView_Night_3_en.png | 3 + ...oot_RolesAndPermissionsView_Night_4_en.png | 3 + ...oot_RolesAndPermissionsView_Night_5_en.png | 3 + ...oot_RolesAndPermissionsView_Night_6_en.png | 3 + ...oot_RolesAndPermissionsView_Night_7_en.png | 3 + ...oot_RolesAndPermissionsView_Night_8_en.png | 3 + ...er.impl_RoomAliasResolverView_Day_0_en.png | 3 + ...er.impl_RoomAliasResolverView_Day_1_en.png | 3 + ...er.impl_RoomAliasResolverView_Day_2_en.png | 3 + ....impl_RoomAliasResolverView_Night_0_en.png | 3 + ....impl_RoomAliasResolverView_Night_1_en.png | 3 + ....impl_RoomAliasResolverView_Night_2_en.png | 3 + ...impl.edit_RoomDetailsEditView_Day_0_en.png | 3 + ...impl.edit_RoomDetailsEditView_Day_1_en.png | 3 + ...impl.edit_RoomDetailsEditView_Day_2_en.png | 3 + ...impl.edit_RoomDetailsEditView_Day_3_en.png | 3 + ...impl.edit_RoomDetailsEditView_Day_4_en.png | 3 + ...impl.edit_RoomDetailsEditView_Day_5_en.png | 3 + ...impl.edit_RoomDetailsEditView_Day_6_en.png | 3 + ...impl.edit_RoomDetailsEditView_Day_7_en.png | 3 + ...impl.edit_RoomDetailsEditView_Day_8_en.png | 3 + ...pl.edit_RoomDetailsEditView_Night_0_en.png | 3 + ...pl.edit_RoomDetailsEditView_Night_1_en.png | 3 + ...pl.edit_RoomDetailsEditView_Night_2_en.png | 3 + ...pl.edit_RoomDetailsEditView_Night_3_en.png | 3 + ...pl.edit_RoomDetailsEditView_Night_4_en.png | 3 + ...pl.edit_RoomDetailsEditView_Night_5_en.png | 3 + ...pl.edit_RoomDetailsEditView_Night_6_en.png | 3 + ...pl.edit_RoomDetailsEditView_Night_7_en.png | 3 + ...pl.edit_RoomDetailsEditView_Night_8_en.png | 3 + ....invite_RoomInviteMembersView_Day_0_en.png | 3 + ....invite_RoomInviteMembersView_Day_1_en.png | 3 + ....invite_RoomInviteMembersView_Day_2_en.png | 3 + ....invite_RoomInviteMembersView_Day_3_en.png | 3 + ...nvite_RoomInviteMembersView_Night_0_en.png | 3 + ...nvite_RoomInviteMembersView_Night_1_en.png | 3 + ...nvite_RoomInviteMembersView_Night_2_en.png | 3 + ...nvite_RoomInviteMembersView_Night_3_en.png | 3 + ...pl.members_RoomMemberListView_Day_0_en.png | 3 + ...pl.members_RoomMemberListView_Day_1_en.png | 3 + ...pl.members_RoomMemberListView_Day_2_en.png | 3 + ...pl.members_RoomMemberListView_Day_3_en.png | 3 + ...pl.members_RoomMemberListView_Day_4_en.png | 3 + ...pl.members_RoomMemberListView_Day_5_en.png | 3 + ...pl.members_RoomMemberListView_Day_6_en.png | 3 + ....members_RoomMemberListView_Night_0_en.png | 3 + ....members_RoomMemberListView_Night_1_en.png | 3 + ....members_RoomMemberListView_Night_2_en.png | 3 + ....members_RoomMemberListView_Night_3_en.png | 3 + ....members_RoomMemberListView_Night_4_en.png | 3 + ....members_RoomMemberListView_Night_5_en.png | 3 + ....members_RoomMemberListView_Night_6_en.png | 3 + ...oomNotificationSettingsOption_Day_0_en.png | 3 + ...mNotificationSettingsOption_Night_0_en.png | 3 + ..._RoomNotificationSettingsView_Day_0_en.png | 3 + ..._RoomNotificationSettingsView_Day_1_en.png | 3 + ..._RoomNotificationSettingsView_Day_2_en.png | 3 + ..._RoomNotificationSettingsView_Day_3_en.png | 3 + ..._RoomNotificationSettingsView_Day_4_en.png | 3 + ..._RoomNotificationSettingsView_Day_5_en.png | 3 + ..._RoomNotificationSettingsView_Day_6_en.png | 3 + ...oomNotificationSettingsView_Night_0_en.png | 3 + ...oomNotificationSettingsView_Night_1_en.png | 3 + ...oomNotificationSettingsView_Night_2_en.png | 3 + ...oomNotificationSettingsView_Night_3_en.png | 3 + ...oomNotificationSettingsView_Night_4_en.png | 3 + ...oomNotificationSettingsView_Night_5_en.png | 3 + ...oomNotificationSettingsView_Night_6_en.png | 3 + ...dRoomNotificationSettingsView_Day_0_en.png | 3 + ...oomNotificationSettingsView_Night_0_en.png | 3 + ....roomdetails.impl_RoomDetailsDark_0_en.png | 3 + ...roomdetails.impl_RoomDetailsDark_10_en.png | 3 + ...roomdetails.impl_RoomDetailsDark_11_en.png | 3 + ...roomdetails.impl_RoomDetailsDark_12_en.png | 3 + ...roomdetails.impl_RoomDetailsDark_13_en.png | 3 + ...roomdetails.impl_RoomDetailsDark_14_en.png | 3 + ...roomdetails.impl_RoomDetailsDark_15_en.png | 3 + ...roomdetails.impl_RoomDetailsDark_16_en.png | 3 + ...roomdetails.impl_RoomDetailsDark_17_en.png | 3 + ...roomdetails.impl_RoomDetailsDark_18_en.png | 3 + ...roomdetails.impl_RoomDetailsDark_19_en.png | 3 + ....roomdetails.impl_RoomDetailsDark_1_en.png | 3 + ....roomdetails.impl_RoomDetailsDark_2_en.png | 3 + ....roomdetails.impl_RoomDetailsDark_3_en.png | 3 + ....roomdetails.impl_RoomDetailsDark_4_en.png | 3 + ....roomdetails.impl_RoomDetailsDark_5_en.png | 3 + ....roomdetails.impl_RoomDetailsDark_6_en.png | 3 + ....roomdetails.impl_RoomDetailsDark_7_en.png | 3 + ....roomdetails.impl_RoomDetailsDark_8_en.png | 3 + ....roomdetails.impl_RoomDetailsDark_9_en.png | 3 + ...ures.roomdetails.impl_RoomDetails_0_en.png | 3 + ...res.roomdetails.impl_RoomDetails_10_en.png | 3 + ...res.roomdetails.impl_RoomDetails_11_en.png | 3 + ...res.roomdetails.impl_RoomDetails_12_en.png | 3 + ...res.roomdetails.impl_RoomDetails_13_en.png | 3 + ...res.roomdetails.impl_RoomDetails_14_en.png | 3 + ...res.roomdetails.impl_RoomDetails_15_en.png | 3 + ...res.roomdetails.impl_RoomDetails_16_en.png | 3 + ...res.roomdetails.impl_RoomDetails_17_en.png | 3 + ...res.roomdetails.impl_RoomDetails_18_en.png | 3 + ...res.roomdetails.impl_RoomDetails_19_en.png | 3 + ...ures.roomdetails.impl_RoomDetails_1_en.png | 3 + ...ures.roomdetails.impl_RoomDetails_2_en.png | 3 + ...ures.roomdetails.impl_RoomDetails_3_en.png | 3 + ...ures.roomdetails.impl_RoomDetails_4_en.png | 3 + ...ures.roomdetails.impl_RoomDetails_5_en.png | 3 + ...ures.roomdetails.impl_RoomDetails_6_en.png | 3 + ...ures.roomdetails.impl_RoomDetails_7_en.png | 3 + ...ures.roomdetails.impl_RoomDetails_8_en.png | 3 + ...ures.roomdetails.impl_RoomDetails_9_en.png | 3 + ...y.impl.root_RoomDirectoryView_Day_0_en.png | 3 + ...y.impl.root_RoomDirectoryView_Day_1_en.png | 3 + ...y.impl.root_RoomDirectoryView_Day_2_en.png | 3 + ...impl.root_RoomDirectoryView_Night_0_en.png | 3 + ...impl.root_RoomDirectoryView_Night_1_en.png | 3 + ...impl.root_RoomDirectoryView_Night_2_en.png | 3 + ...impl_RoomMemberModerationView_Day_0_en.png | 3 + ...impl_RoomMemberModerationView_Day_1_en.png | 3 + ...impl_RoomMemberModerationView_Day_2_en.png | 3 + ...impl_RoomMemberModerationView_Day_3_en.png | 3 + ...impl_RoomMemberModerationView_Day_4_en.png | 3 + ...impl_RoomMemberModerationView_Day_5_en.png | 3 + ...impl_RoomMemberModerationView_Day_6_en.png | 3 + ...impl_RoomMemberModerationView_Day_7_en.png | 3 + ...impl_RoomMemberModerationView_Day_8_en.png | 3 + ...impl_RoomMemberModerationView_Day_9_en.png | 3 + ...pl_RoomMemberModerationView_Night_0_en.png | 3 + ...pl_RoomMemberModerationView_Night_1_en.png | 3 + ...pl_RoomMemberModerationView_Night_2_en.png | 3 + ...pl_RoomMemberModerationView_Night_3_en.png | 3 + ...pl_RoomMemberModerationView_Night_4_en.png | 3 + ...pl_RoomMemberModerationView_Night_5_en.png | 3 + ...pl_RoomMemberModerationView_Night_6_en.png | 3 + ...pl_RoomMemberModerationView_Night_7_en.png | 3 + ...pl_RoomMemberModerationView_Night_8_en.png | 3 + ...pl_RoomMemberModerationView_Night_9_en.png | 3 + ...sable_SecureBackupDisableView_Day_0_en.png | 3 + ...sable_SecureBackupDisableView_Day_1_en.png | 3 + ...sable_SecureBackupDisableView_Day_2_en.png | 3 + ...sable_SecureBackupDisableView_Day_3_en.png | 3 + ...ble_SecureBackupDisableView_Night_0_en.png | 3 + ...ble_SecureBackupDisableView_Night_1_en.png | 3 + ...ble_SecureBackupDisableView_Night_2_en.png | 3 + ...ble_SecureBackupDisableView_Night_3_en.png | 3 + ...ureBackupEnterRecoveryKeyView_Day_0_en.png | 3 + ...ureBackupEnterRecoveryKeyView_Day_1_en.png | 3 + ...ureBackupEnterRecoveryKeyView_Day_2_en.png | 3 + ...ureBackupEnterRecoveryKeyView_Day_3_en.png | 3 + ...ureBackupEnterRecoveryKeyView_Day_4_en.png | 3 + ...eBackupEnterRecoveryKeyView_Night_0_en.png | 3 + ...eBackupEnterRecoveryKeyView_Night_1_en.png | 3 + ...eBackupEnterRecoveryKeyView_Night_2_en.png | 3 + ...eBackupEnterRecoveryKeyView_Night_3_en.png | 3 + ...eBackupEnterRecoveryKeyView_Night_4_en.png | 3 + ...ord_ResetIdentityPasswordView_Day_0_en.png | 3 + ...ord_ResetIdentityPasswordView_Day_1_en.png | 3 + ...ord_ResetIdentityPasswordView_Day_2_en.png | 3 + ...ord_ResetIdentityPasswordView_Day_3_en.png | 3 + ...d_ResetIdentityPasswordView_Night_0_en.png | 3 + ...d_ResetIdentityPasswordView_Night_1_en.png | 3 + ...d_ResetIdentityPasswordView_Night_2_en.png | 3 + ...d_ResetIdentityPasswordView_Night_3_en.png | 3 + ...et.root_ResetIdentityRootView_Day_0_en.png | 3 + ...et.root_ResetIdentityRootView_Day_1_en.png | 3 + ....root_ResetIdentityRootView_Night_0_en.png | 3 + ....root_ResetIdentityRootView_Night_1_en.png | 3 + ...mpl.root_SecureBackupRootView_Day_0_en.png | 3 + ...pl.root_SecureBackupRootView_Day_10_en.png | 3 + ...pl.root_SecureBackupRootView_Day_11_en.png | 3 + ...pl.root_SecureBackupRootView_Day_12_en.png | 3 + ...pl.root_SecureBackupRootView_Day_13_en.png | 3 + ...pl.root_SecureBackupRootView_Day_14_en.png | 3 + ...pl.root_SecureBackupRootView_Day_15_en.png | 3 + ...pl.root_SecureBackupRootView_Day_16_en.png | 3 + ...pl.root_SecureBackupRootView_Day_17_en.png | 3 + ...mpl.root_SecureBackupRootView_Day_1_en.png | 3 + ...mpl.root_SecureBackupRootView_Day_2_en.png | 3 + ...mpl.root_SecureBackupRootView_Day_3_en.png | 3 + ...mpl.root_SecureBackupRootView_Day_4_en.png | 3 + ...mpl.root_SecureBackupRootView_Day_5_en.png | 3 + ...mpl.root_SecureBackupRootView_Day_6_en.png | 3 + ...mpl.root_SecureBackupRootView_Day_7_en.png | 3 + ...mpl.root_SecureBackupRootView_Day_8_en.png | 3 + ...mpl.root_SecureBackupRootView_Day_9_en.png | 3 + ...l.root_SecureBackupRootView_Night_0_en.png | 3 + ....root_SecureBackupRootView_Night_10_en.png | 3 + ....root_SecureBackupRootView_Night_11_en.png | 3 + ....root_SecureBackupRootView_Night_12_en.png | 3 + ....root_SecureBackupRootView_Night_13_en.png | 3 + ....root_SecureBackupRootView_Night_14_en.png | 3 + ....root_SecureBackupRootView_Night_15_en.png | 3 + ....root_SecureBackupRootView_Night_16_en.png | 3 + ....root_SecureBackupRootView_Night_17_en.png | 3 + ...l.root_SecureBackupRootView_Night_1_en.png | 3 + ...l.root_SecureBackupRootView_Night_2_en.png | 3 + ...l.root_SecureBackupRootView_Night_3_en.png | 3 + ...l.root_SecureBackupRootView_Night_4_en.png | 3 + ...l.root_SecureBackupRootView_Night_5_en.png | 3 + ...l.root_SecureBackupRootView_Night_6_en.png | 3 + ...l.root_SecureBackupRootView_Night_7_en.png | 3 + ...l.root_SecureBackupRootView_Night_8_en.png | 3 + ...l.root_SecureBackupRootView_Night_9_en.png | 3 + ...l.setup.views_RecoveryKeyView_Day_0_en.png | 3 + ....setup.views_RecoveryKeyView_Day_10_en.png | 3 + ....setup.views_RecoveryKeyView_Day_11_en.png | 3 + ....setup.views_RecoveryKeyView_Day_12_en.png | 3 + ....setup.views_RecoveryKeyView_Day_13_en.png | 3 + ....setup.views_RecoveryKeyView_Day_14_en.png | 3 + ...l.setup.views_RecoveryKeyView_Day_1_en.png | 3 + ...l.setup.views_RecoveryKeyView_Day_2_en.png | 3 + ...l.setup.views_RecoveryKeyView_Day_3_en.png | 3 + ...l.setup.views_RecoveryKeyView_Day_4_en.png | 3 + ...l.setup.views_RecoveryKeyView_Day_5_en.png | 3 + ...l.setup.views_RecoveryKeyView_Day_6_en.png | 3 + ...l.setup.views_RecoveryKeyView_Day_7_en.png | 3 + ...l.setup.views_RecoveryKeyView_Day_8_en.png | 3 + ...l.setup.views_RecoveryKeyView_Day_9_en.png | 3 + ...setup.views_RecoveryKeyView_Night_0_en.png | 3 + ...etup.views_RecoveryKeyView_Night_10_en.png | 3 + ...etup.views_RecoveryKeyView_Night_11_en.png | 3 + ...etup.views_RecoveryKeyView_Night_12_en.png | 3 + ...etup.views_RecoveryKeyView_Night_13_en.png | 3 + ...etup.views_RecoveryKeyView_Night_14_en.png | 3 + ...setup.views_RecoveryKeyView_Night_1_en.png | 3 + ...setup.views_RecoveryKeyView_Night_2_en.png | 3 + ...setup.views_RecoveryKeyView_Night_3_en.png | 3 + ...setup.views_RecoveryKeyView_Night_4_en.png | 3 + ...setup.views_RecoveryKeyView_Night_5_en.png | 3 + ...setup.views_RecoveryKeyView_Night_6_en.png | 3 + ...setup.views_RecoveryKeyView_Night_7_en.png | 3 + ...setup.views_RecoveryKeyView_Night_8_en.png | 3 + ...setup.views_RecoveryKeyView_Night_9_en.png | 3 + ...p_SecureBackupSetupViewChange_Day_0_en.png | 3 + ...p_SecureBackupSetupViewChange_Day_1_en.png | 3 + ...p_SecureBackupSetupViewChange_Day_2_en.png | 3 + ...p_SecureBackupSetupViewChange_Day_3_en.png | 3 + ...p_SecureBackupSetupViewChange_Day_4_en.png | 3 + ...p_SecureBackupSetupViewChange_Day_5_en.png | 3 + ...SecureBackupSetupViewChange_Night_0_en.png | 3 + ...SecureBackupSetupViewChange_Night_1_en.png | 3 + ...SecureBackupSetupViewChange_Night_2_en.png | 3 + ...SecureBackupSetupViewChange_Night_3_en.png | 3 + ...SecureBackupSetupViewChange_Night_4_en.png | 3 + ...SecureBackupSetupViewChange_Night_5_en.png | 3 + ...l.setup_SecureBackupSetupView_Day_0_en.png | 3 + ...l.setup_SecureBackupSetupView_Day_1_en.png | 3 + ...l.setup_SecureBackupSetupView_Day_2_en.png | 3 + ...l.setup_SecureBackupSetupView_Day_3_en.png | 3 + ...l.setup_SecureBackupSetupView_Day_4_en.png | 3 + ...l.setup_SecureBackupSetupView_Day_5_en.png | 3 + ...setup_SecureBackupSetupView_Night_0_en.png | 3 + ...setup_SecureBackupSetupView_Night_1_en.png | 3 + ...setup_SecureBackupSetupView_Night_2_en.png | 3 + ...setup_SecureBackupSetupView_Night_3_en.png | 3 + ...setup_SecureBackupSetupView_Night_4_en.png | 3 + ...setup_SecureBackupSetupView_Night_5_en.png | 3 + ...omaddress_EditRoomAddressView_Day_0_en.png | 3 + ...omaddress_EditRoomAddressView_Day_1_en.png | 3 + ...omaddress_EditRoomAddressView_Day_2_en.png | 3 + ...omaddress_EditRoomAddressView_Day_3_en.png | 3 + ...omaddress_EditRoomAddressView_Day_4_en.png | 3 + ...address_EditRoomAddressView_Night_0_en.png | 3 + ...address_EditRoomAddressView_Night_1_en.png | 3 + ...address_EditRoomAddressView_Night_2_en.png | 3 + ...address_EditRoomAddressView_Night_3_en.png | 3 + ...address_EditRoomAddressView_Night_4_en.png | 3 + ...l.root_SecurityAndPrivacyViewDark_0_en.png | 3 + ....root_SecurityAndPrivacyViewDark_10_en.png | 3 + ....root_SecurityAndPrivacyViewDark_11_en.png | 3 + ....root_SecurityAndPrivacyViewDark_12_en.png | 3 + ....root_SecurityAndPrivacyViewDark_13_en.png | 3 + ....root_SecurityAndPrivacyViewDark_14_en.png | 3 + ....root_SecurityAndPrivacyViewDark_15_en.png | 3 + ....root_SecurityAndPrivacyViewDark_16_en.png | 3 + ....root_SecurityAndPrivacyViewDark_17_en.png | 3 + ....root_SecurityAndPrivacyViewDark_18_en.png | 3 + ....root_SecurityAndPrivacyViewDark_19_en.png | 3 + ...l.root_SecurityAndPrivacyViewDark_1_en.png | 3 + ...l.root_SecurityAndPrivacyViewDark_2_en.png | 3 + ...l.root_SecurityAndPrivacyViewDark_3_en.png | 3 + ...l.root_SecurityAndPrivacyViewDark_4_en.png | 3 + ...l.root_SecurityAndPrivacyViewDark_5_en.png | 3 + ...l.root_SecurityAndPrivacyViewDark_6_en.png | 3 + ...l.root_SecurityAndPrivacyViewDark_7_en.png | 3 + ...l.root_SecurityAndPrivacyViewDark_8_en.png | 3 + ...l.root_SecurityAndPrivacyViewDark_9_en.png | 3 + ....root_SecurityAndPrivacyViewLight_0_en.png | 3 + ...root_SecurityAndPrivacyViewLight_10_en.png | 3 + ...root_SecurityAndPrivacyViewLight_11_en.png | 3 + ...root_SecurityAndPrivacyViewLight_12_en.png | 3 + ...root_SecurityAndPrivacyViewLight_13_en.png | 3 + ...root_SecurityAndPrivacyViewLight_14_en.png | 3 + ...root_SecurityAndPrivacyViewLight_15_en.png | 3 + ...root_SecurityAndPrivacyViewLight_16_en.png | 3 + ...root_SecurityAndPrivacyViewLight_17_en.png | 3 + ...root_SecurityAndPrivacyViewLight_18_en.png | 3 + ...root_SecurityAndPrivacyViewLight_19_en.png | 3 + ....root_SecurityAndPrivacyViewLight_1_en.png | 3 + ....root_SecurityAndPrivacyViewLight_2_en.png | 3 + ....root_SecurityAndPrivacyViewLight_3_en.png | 3 + ....root_SecurityAndPrivacyViewLight_4_en.png | 3 + ....root_SecurityAndPrivacyViewLight_5_en.png | 3 + ....root_SecurityAndPrivacyViewLight_6_en.png | 3 + ....root_SecurityAndPrivacyViewLight_7_en.png | 3 + ....root_SecurityAndPrivacyViewLight_8_en.png | 3 + ....root_SecurityAndPrivacyViewLight_9_en.png | 3 + ...features.share.impl_ShareView_Day_0_en.png | 3 + ...features.share.impl_ShareView_Day_1_en.png | 3 + ...features.share.impl_ShareView_Day_2_en.png | 3 + ...features.share.impl_ShareView_Day_3_en.png | 3 + ...atures.share.impl_ShareView_Night_0_en.png | 3 + ...atures.share.impl_ShareView_Night_1_en.png | 3 + ...atures.share.impl_ShareView_Night_2_en.png | 3 + ...atures.share.impl_ShareView_Night_3_en.png | 3 + ....signedout.impl_SignedOutView_Day_0_en.png | 3 + ...ignedout.impl_SignedOutView_Night_0_en.png | 3 + ...ace.impl.leave_LeaveSpaceView_Day_0_en.png | 3 + ...ace.impl.leave_LeaveSpaceView_Day_1_en.png | 3 + ...ace.impl.leave_LeaveSpaceView_Day_2_en.png | 3 + ...ace.impl.leave_LeaveSpaceView_Day_3_en.png | 3 + ...ace.impl.leave_LeaveSpaceView_Day_4_en.png | 3 + ...ace.impl.leave_LeaveSpaceView_Day_5_en.png | 3 + ...ace.impl.leave_LeaveSpaceView_Day_6_en.png | 3 + ...ace.impl.leave_LeaveSpaceView_Day_7_en.png | 3 + ...ace.impl.leave_LeaveSpaceView_Day_8_en.png | 3 + ...ace.impl.leave_LeaveSpaceView_Day_9_en.png | 3 + ...e.impl.leave_LeaveSpaceView_Night_0_en.png | 3 + ...e.impl.leave_LeaveSpaceView_Night_1_en.png | 3 + ...e.impl.leave_LeaveSpaceView_Night_2_en.png | 3 + ...e.impl.leave_LeaveSpaceView_Night_3_en.png | 3 + ...e.impl.leave_LeaveSpaceView_Night_4_en.png | 3 + ...e.impl.leave_LeaveSpaceView_Night_5_en.png | 3 + ...e.impl.leave_LeaveSpaceView_Night_6_en.png | 3 + ...e.impl.leave_LeaveSpaceView_Night_7_en.png | 3 + ...e.impl.leave_LeaveSpaceView_Night_8_en.png | 3 + ...e.impl.leave_LeaveSpaceView_Night_9_en.png | 3 + ...res.space.impl.root_SpaceView_Day_0_en.png | 3 + ...res.space.impl.root_SpaceView_Day_1_en.png | 3 + ...res.space.impl.root_SpaceView_Day_2_en.png | 3 + ...res.space.impl.root_SpaceView_Day_3_en.png | 3 + ...res.space.impl.root_SpaceView_Day_4_en.png | 3 + ...res.space.impl.root_SpaceView_Day_5_en.png | 3 + ...s.space.impl.root_SpaceView_Night_0_en.png | 3 + ...s.space.impl.root_SpaceView_Night_1_en.png | 3 + ...s.space.impl.root_SpaceView_Night_2_en.png | 3 + ...s.space.impl.root_SpaceView_Night_3_en.png | 3 + ...s.space.impl.root_SpaceView_Night_4_en.png | 3 + ...s.space.impl.root_SpaceView_Night_5_en.png | 3 + ...pl.settings_SpaceSettingsView_Day_0_en.png | 3 + ...pl.settings_SpaceSettingsView_Day_1_en.png | 3 + ...pl.settings_SpaceSettingsView_Day_2_en.png | 3 + ...pl.settings_SpaceSettingsView_Day_3_en.png | 3 + ....settings_SpaceSettingsView_Night_0_en.png | 3 + ....settings_SpaceSettingsView_Night_1_en.png | 3 + ....settings_SpaceSettingsView_Night_2_en.png | 3 + ....settings_SpaceSettingsView_Night_3_en.png | 3 + ...nents_SearchMultipleUsersResultItem_en.png | 3 + ...mponents_SearchSingleUserResultItem_en.png | 3 + ....impl.components_UserListView_Day_0_en.png | 3 + ....impl.components_UserListView_Day_1_en.png | 3 + ....impl.components_UserListView_Day_2_en.png | 3 + ....impl.components_UserListView_Day_3_en.png | 3 + ....impl.components_UserListView_Day_4_en.png | 3 + ....impl.components_UserListView_Day_5_en.png | 3 + ....impl.components_UserListView_Day_6_en.png | 3 + ....impl.components_UserListView_Day_7_en.png | 3 + ....impl.components_UserListView_Day_8_en.png | 3 + ....impl.components_UserListView_Day_9_en.png | 3 + ...mpl.components_UserListView_Night_0_en.png | 3 + ...mpl.components_UserListView_Night_1_en.png | 3 + ...mpl.components_UserListView_Night_2_en.png | 3 + ...mpl.components_UserListView_Night_3_en.png | 3 + ...mpl.components_UserListView_Night_4_en.png | 3 + ...mpl.components_UserListView_Night_5_en.png | 3 + ...mpl.components_UserListView_Night_6_en.png | 3 + ...mpl.components_UserListView_Night_7_en.png | 3 + ...mpl.components_UserListView_Night_8_en.png | 3 + ...mpl.components_UserListView_Night_9_en.png | 3 + ...address_JoinRoomByAddressView_Day_0_en.png | 3 + ...address_JoinRoomByAddressView_Day_1_en.png | 3 + ...address_JoinRoomByAddressView_Day_2_en.png | 3 + ...address_JoinRoomByAddressView_Day_3_en.png | 3 + ...address_JoinRoomByAddressView_Day_4_en.png | 3 + ...address_JoinRoomByAddressView_Day_5_en.png | 3 + ...dress_JoinRoomByAddressView_Night_0_en.png | 3 + ...dress_JoinRoomByAddressView_Night_1_en.png | 3 + ...dress_JoinRoomByAddressView_Night_2_en.png | 3 + ...dress_JoinRoomByAddressView_Night_3_en.png | 3 + ...dress_JoinRoomByAddressView_Night_4_en.png | 3 + ...dress_JoinRoomByAddressView_Night_5_en.png | 3 + ...tchat.impl.root_StartChatView_Day_0_en.png | 3 + ...tchat.impl.root_StartChatView_Day_1_en.png | 3 + ...tchat.impl.root_StartChatView_Day_2_en.png | 3 + ...tchat.impl.root_StartChatView_Day_3_en.png | 3 + ...tchat.impl.root_StartChatView_Day_4_en.png | 3 + ...tchat.impl.root_StartChatView_Day_5_en.png | 3 + ...hat.impl.root_StartChatView_Night_0_en.png | 3 + ...hat.impl.root_StartChatView_Night_1_en.png | 3 + ...hat.impl.root_StartChatView_Night_2_en.png | 3 + ...hat.impl.root_StartChatView_Night_3_en.png | 3 + ...hat.impl.root_StartChatView_Night_4_en.png | 3 + ...hat.impl.root_StartChatView_Night_5_en.png | 3 + ...tionWithVerificationViolation_Day_0_en.png | 3 + ...onWithVerificationViolation_Night_0_en.png | 3 + ...ared_UserProfileHeaderSection_Day_0_en.png | 3 + ...ed_UserProfileHeaderSection_Night_0_en.png | 3 + ...rofile.shared_UserProfileView_Day_0_en.png | 3 + ...rofile.shared_UserProfileView_Day_1_en.png | 3 + ...rofile.shared_UserProfileView_Day_2_en.png | 3 + ...rofile.shared_UserProfileView_Day_3_en.png | 3 + ...rofile.shared_UserProfileView_Day_4_en.png | 3 + ...rofile.shared_UserProfileView_Day_5_en.png | 3 + ...rofile.shared_UserProfileView_Day_6_en.png | 3 + ...rofile.shared_UserProfileView_Day_7_en.png | 3 + ...rofile.shared_UserProfileView_Day_8_en.png | 3 + ...rofile.shared_UserProfileView_Day_9_en.png | 3 + ...file.shared_UserProfileView_Night_0_en.png | 3 + ...file.shared_UserProfileView_Night_1_en.png | 3 + ...file.shared_UserProfileView_Night_2_en.png | 3 + ...file.shared_UserProfileView_Night_3_en.png | 3 + ...file.shared_UserProfileView_Night_4_en.png | 3 + ...file.shared_UserProfileView_Night_5_en.png | 3 + ...file.shared_UserProfileView_Night_6_en.png | 3 + ...file.shared_UserProfileView_Night_7_en.png | 3 + ...file.shared_UserProfileView_Night_8_en.png | 3 + ...file.shared_UserProfileView_Night_9_en.png | 3 + ...ysession.impl.emoji_SasEmojis_Day_0_en.png | 3 + ...ession.impl.emoji_SasEmojis_Night_0_en.png | 3 + ...ncoming.ui_SessionDetailsView_Day_0_en.png | 3 + ...oming.ui_SessionDetailsView_Night_0_en.png | 3 + ...coming_IncomingVerificationViewA11y_en.png | 3 + ...ming_IncomingVerificationView_Day_0_en.png | 3 + ...ing_IncomingVerificationView_Day_10_en.png | 3 + ...ing_IncomingVerificationView_Day_11_en.png | 3 + ...ing_IncomingVerificationView_Day_12_en.png | 3 + ...ing_IncomingVerificationView_Day_13_en.png | 3 + ...ming_IncomingVerificationView_Day_1_en.png | 3 + ...ming_IncomingVerificationView_Day_2_en.png | 3 + ...ming_IncomingVerificationView_Day_3_en.png | 3 + ...ming_IncomingVerificationView_Day_4_en.png | 3 + ...ming_IncomingVerificationView_Day_5_en.png | 3 + ...ming_IncomingVerificationView_Day_6_en.png | 3 + ...ming_IncomingVerificationView_Day_7_en.png | 3 + ...ming_IncomingVerificationView_Day_8_en.png | 3 + ...ming_IncomingVerificationView_Day_9_en.png | 3 + ...ng_IncomingVerificationView_Night_0_en.png | 3 + ...g_IncomingVerificationView_Night_10_en.png | 3 + ...g_IncomingVerificationView_Night_11_en.png | 3 + ...g_IncomingVerificationView_Night_12_en.png | 3 + ...g_IncomingVerificationView_Night_13_en.png | 3 + ...ng_IncomingVerificationView_Night_1_en.png | 3 + ...ng_IncomingVerificationView_Night_2_en.png | 3 + ...ng_IncomingVerificationView_Night_3_en.png | 3 + ...ng_IncomingVerificationView_Night_4_en.png | 3 + ...ng_IncomingVerificationView_Night_5_en.png | 3 + ...ng_IncomingVerificationView_Night_6_en.png | 3 + ...ng_IncomingVerificationView_Night_7_en.png | 3 + ...ng_IncomingVerificationView_Night_8_en.png | 3 + ...ng_IncomingVerificationView_Night_9_en.png | 3 + ...oing_OutgoingVerificationView_Day_0_en.png | 3 + ...ing_OutgoingVerificationView_Day_10_en.png | 3 + ...ing_OutgoingVerificationView_Day_11_en.png | 3 + ...ing_OutgoingVerificationView_Day_12_en.png | 3 + ...ing_OutgoingVerificationView_Day_13_en.png | 3 + ...oing_OutgoingVerificationView_Day_1_en.png | 3 + ...oing_OutgoingVerificationView_Day_2_en.png | 3 + ...oing_OutgoingVerificationView_Day_3_en.png | 3 + ...oing_OutgoingVerificationView_Day_4_en.png | 3 + ...oing_OutgoingVerificationView_Day_5_en.png | 3 + ...oing_OutgoingVerificationView_Day_6_en.png | 3 + ...oing_OutgoingVerificationView_Day_7_en.png | 3 + ...oing_OutgoingVerificationView_Day_8_en.png | 3 + ...oing_OutgoingVerificationView_Day_9_en.png | 3 + ...ng_OutgoingVerificationView_Night_0_en.png | 3 + ...g_OutgoingVerificationView_Night_10_en.png | 3 + ...g_OutgoingVerificationView_Night_11_en.png | 3 + ...g_OutgoingVerificationView_Night_12_en.png | 3 + ...g_OutgoingVerificationView_Night_13_en.png | 3 + ...ng_OutgoingVerificationView_Night_1_en.png | 3 + ...ng_OutgoingVerificationView_Night_2_en.png | 3 + ...ng_OutgoingVerificationView_Night_3_en.png | 3 + ...ng_OutgoingVerificationView_Night_4_en.png | 3 + ...ng_OutgoingVerificationView_Night_5_en.png | 3 + ...ng_OutgoingVerificationView_Night_6_en.png | 3 + ...ng_OutgoingVerificationView_Night_7_en.png | 3 + ...ng_OutgoingVerificationView_Night_8_en.png | 3 + ...ng_OutgoingVerificationView_Night_9_en.png | 3 + ...erificationUserProfileContent_Day_0_en.png | 3 + ...ificationUserProfileContent_Night_0_en.png | 3 + ...folder.impl.file_ViewFileView_Day_0_en.png | 3 + ...folder.impl.file_ViewFileView_Day_1_en.png | 3 + ...folder.impl.file_ViewFileView_Day_2_en.png | 3 + ...folder.impl.file_ViewFileView_Day_3_en.png | 3 + ...folder.impl.file_ViewFileView_Day_4_en.png | 3 + ...folder.impl.file_ViewFileView_Day_5_en.png | 3 + ...lder.impl.file_ViewFileView_Night_0_en.png | 3 + ...lder.impl.file_ViewFileView_Night_1_en.png | 3 + ...lder.impl.file_ViewFileView_Night_2_en.png | 3 + ...lder.impl.file_ViewFileView_Night_3_en.png | 3 + ...lder.impl.file_ViewFileView_Night_4_en.png | 3 + ...lder.impl.file_ViewFileView_Night_5_en.png | 3 + ...er.impl.folder_ViewFolderView_Day_0_en.png | 3 + ...er.impl.folder_ViewFolderView_Day_1_en.png | 3 + ....impl.folder_ViewFolderView_Night_0_en.png | 3 + ....impl.folder_ViewFolderView_Night_1_en.png | 3 + ...select.impl_AccountSelectView_Day_0_en.png | 3 + ...select.impl_AccountSelectView_Day_1_en.png | 3 + ...lect.impl_AccountSelectView_Night_0_en.png | 3 + ...lect.impl_AccountSelectView_Night_1_en.png | 3 + ...pl.previews_DateFormatterModeView_0_en.png | 3 + ...pl.previews_DateFormatterModeView_1_en.png | 3 + ...pl.previews_DateFormatterModeView_2_en.png | 3 + ...pl.previews_DateFormatterModeView_3_en.png | 3 + ...pl.previews_DateFormatterModeView_4_en.png | 3 + ...system.atomic.atoms_BetaLabel_Day_0_en.png | 3 + ...stem.atomic.atoms_BetaLabel_Night_0_en.png | 3 + ...stem.atomic.atoms_CounterAtom_Day_0_en.png | 3 + ...em.atomic.atoms_CounterAtom_Night_0_en.png | 3 + ...mentLogoAtomLargeNoBlurShadow_Day_0_en.png | 3 + ...ntLogoAtomLargeNoBlurShadow_Night_0_en.png | 3 + ...ic.atoms_ElementLogoAtomLarge_Day_0_en.png | 3 + ....atoms_ElementLogoAtomLarge_Night_0_en.png | 3 + ...entLogoAtomMediumNoBlurShadow_Day_0_en.png | 3 + ...tLogoAtomMediumNoBlurShadow_Night_0_en.png | 3 + ...c.atoms_ElementLogoAtomMedium_Day_0_en.png | 3 + ...atoms_ElementLogoAtomMedium_Night_0_en.png | 3 + ...mic.atoms_MatrixBadgeAtomInfo_Day_0_en.png | 3 + ...c.atoms_MatrixBadgeAtomInfo_Night_0_en.png | 3 + ...atoms_MatrixBadgeAtomNegative_Day_0_en.png | 3 + ...oms_MatrixBadgeAtomNegative_Night_0_en.png | 3 + ....atoms_MatrixBadgeAtomNeutral_Day_0_en.png | 3 + ...toms_MatrixBadgeAtomNeutral_Night_0_en.png | 3 + ...atoms_MatrixBadgeAtomPositive_Day_0_en.png | 3 + ...oms_MatrixBadgeAtomPositive_Night_0_en.png | 3 + ....atomic.atoms_PlaceholderAtom_Day_0_en.png | 3 + ...tomic.atoms_PlaceholderAtom_Night_0_en.png | 3 + ...atomic.atoms_RedIndicatorAtom_Day_0_en.png | 3 + ...omic.atoms_RedIndicatorAtom_Night_0_en.png | 3 + ....atomic.atoms_RoundedIconAtom_Day_0_en.png | 3 + ...tomic.atoms_RoundedIconAtom_Night_0_en.png | 3 + ...c.atoms_SelectedIndicatorAtom_Day_0_en.png | 3 + ...atoms_SelectedIndicatorAtom_Night_0_en.png | 3 + ...mic.atoms_UnreadIndicatorAtom_Day_0_en.png | 3 + ...c.atoms_UnreadIndicatorAtom_Night_0_en.png | 3 + ...olecules_ButtonColumnMolecule_Day_0_en.png | 3 + ...ecules_ButtonColumnMolecule_Night_0_en.png | 3 + ...c.molecules_ButtonRowMolecule_Day_0_en.png | 3 + ...molecules_ButtonRowMolecule_Night_0_en.png | 3 + ...lecules_ComposerAlertMolecule_Day_0_en.png | 3 + ...lecules_ComposerAlertMolecule_Day_1_en.png | 3 + ...lecules_ComposerAlertMolecule_Day_2_en.png | 3 + ...lecules_ComposerAlertMolecule_Day_3_en.png | 3 + ...lecules_ComposerAlertMolecule_Day_4_en.png | 3 + ...lecules_ComposerAlertMolecule_Day_5_en.png | 3 + ...lecules_ComposerAlertMolecule_Day_6_en.png | 3 + ...lecules_ComposerAlertMolecule_Day_7_en.png | 3 + ...lecules_ComposerAlertMolecule_Day_8_en.png | 3 + ...cules_ComposerAlertMolecule_Night_0_en.png | 3 + ...cules_ComposerAlertMolecule_Night_1_en.png | 3 + ...cules_ComposerAlertMolecule_Night_2_en.png | 3 + ...cules_ComposerAlertMolecule_Night_3_en.png | 3 + ...cules_ComposerAlertMolecule_Night_4_en.png | 3 + ...cules_ComposerAlertMolecule_Night_5_en.png | 3 + ...cules_ComposerAlertMolecule_Night_6_en.png | 3 + ...cules_ComposerAlertMolecule_Night_7_en.png | 3 + ...cules_ComposerAlertMolecule_Night_8_en.png | 3 + ...nTitlePlaceholdersRowMolecule_Day_0_en.png | 3 + ...itlePlaceholdersRowMolecule_Night_0_en.png | 3 + ...les_IconTitleSubtitleMolecule_Day_0_en.png | 3 + ...s_IconTitleSubtitleMolecule_Night_0_en.png | 3 + ...olecules_InfoListItemMolecule_Day_0_en.png | 3 + ...ecules_InfoListItemMolecule_Night_0_en.png | 3 + ...olecules_MembersCountMolecule_Day_0_en.png | 3 + ...ecules_MembersCountMolecule_Night_0_en.png | 3 + ...ic.organisms_InfoListOrganism_Day_0_en.png | 3 + ....organisms_InfoListOrganism_Night_0_en.png | 3 + ...tem.atomic.pages_FlowStepPage_Day_0_en.png | 3 + ...m.atomic.pages_FlowStepPage_Night_0_en.png | 3 + ...es_HeaderFooterPageScrollable_Day_0_en.png | 3 + ..._HeaderFooterPageScrollable_Night_0_en.png | 3 + ...atomic.pages_HeaderFooterPage_Day_0_en.png | 3 + ...omic.pages_HeaderFooterPage_Night_0_en.png | 3 + ...m.atomic.pages_OnBoardingPage_Day_0_en.png | 3 + ...atomic.pages_OnBoardingPage_Night_0_en.png | 3 + ...ystem.atomic.pages_SunsetPage_Day_0_en.png | 3 + ...tem.atomic.pages_SunsetPage_Night_0_en.png | 3 + ...round_LightGradientBackground_Day_0_en.png | 3 + ...und_LightGradientBackground_Night_0_en.png | 3 + ...ckground_OnboardingBackground_Day_0_en.png | 3 + ...ground_OnboardingBackground_Night_0_en.png | 3 + ...ponents.async_AsyncActionView_Day_0_en.png | 3 + ...ponents.async_AsyncActionView_Day_1_en.png | 3 + ...ponents.async_AsyncActionView_Day_2_en.png | 3 + ...ponents.async_AsyncActionView_Day_3_en.png | 3 + ...ponents.async_AsyncActionView_Day_4_en.png | 3 + ...nents.async_AsyncActionView_Night_0_en.png | 3 + ...nents.async_AsyncActionView_Night_1_en.png | 3 + ...nents.async_AsyncActionView_Night_2_en.png | 3 + ...nents.async_AsyncActionView_Night_3_en.png | 3 + ...nents.async_AsyncActionView_Night_4_en.png | 3 + ...components.async_AsyncFailure_Day_0_en.png | 3 + ...mponents.async_AsyncFailure_Night_0_en.png | 3 + ...s.async_AsyncIndicatorFailure_Day_0_en.png | 3 + ...async_AsyncIndicatorFailure_Night_0_en.png | 3 + ...s.async_AsyncIndicatorLoading_Day_0_en.png | 3 + ...async_AsyncIndicatorLoading_Night_0_en.png | 3 + ...components.async_AsyncLoading_Day_0_en.png | 3 + ...mponents.async_AsyncLoading_Night_0_en.png | 3 + ...atar.internal_AvatarCluster_Avatars_en.png | 3 + ...avatar.internal_SpaceAvatar_Avatars_en.png | 3 + ....avatar.internal_TextAvatar_Avatars_en.png | 3 + ...ternal_TombstonedRoomAvatar_Avatars_en.png | 3 + ...tar.internal_UserAvatarColors_Day_0_en.png | 3 + ...r.internal_UserAvatarColors_Night_0_en.png | 3 + ....avatar_AvatarRowLastOnTopRtl_Day_0_en.png | 3 + ....avatar_AvatarRowLastOnTopRtl_Day_1_en.png | 3 + ....avatar_AvatarRowLastOnTopRtl_Day_2_en.png | 3 + ....avatar_AvatarRowLastOnTopRtl_Day_3_en.png | 3 + ....avatar_AvatarRowLastOnTopRtl_Day_4_en.png | 3 + ...vatar_AvatarRowLastOnTopRtl_Night_0_en.png | 3 + ...vatar_AvatarRowLastOnTopRtl_Night_1_en.png | 3 + ...vatar_AvatarRowLastOnTopRtl_Night_2_en.png | 3 + ...vatar_AvatarRowLastOnTopRtl_Night_3_en.png | 3 + ...vatar_AvatarRowLastOnTopRtl_Night_4_en.png | 3 + ...nts.avatar_AvatarRowLastOnTop_Day_0_en.png | 3 + ...nts.avatar_AvatarRowLastOnTop_Day_1_en.png | 3 + ...nts.avatar_AvatarRowLastOnTop_Day_2_en.png | 3 + ...nts.avatar_AvatarRowLastOnTop_Day_3_en.png | 3 + ...nts.avatar_AvatarRowLastOnTop_Day_4_en.png | 3 + ...s.avatar_AvatarRowLastOnTop_Night_0_en.png | 3 + ...s.avatar_AvatarRowLastOnTop_Night_1_en.png | 3 + ...s.avatar_AvatarRowLastOnTop_Night_2_en.png | 3 + ...s.avatar_AvatarRowLastOnTop_Night_3_en.png | 3 + ...s.avatar_AvatarRowLastOnTop_Night_4_en.png | 3 + ...omponents.avatar_AvatarRowRtl_Day_0_en.png | 3 + ...omponents.avatar_AvatarRowRtl_Day_1_en.png | 3 + ...omponents.avatar_AvatarRowRtl_Day_2_en.png | 3 + ...omponents.avatar_AvatarRowRtl_Day_3_en.png | 3 + ...omponents.avatar_AvatarRowRtl_Day_4_en.png | 3 + ...ponents.avatar_AvatarRowRtl_Night_0_en.png | 3 + ...ponents.avatar_AvatarRowRtl_Night_1_en.png | 3 + ...ponents.avatar_AvatarRowRtl_Night_2_en.png | 3 + ...ponents.avatar_AvatarRowRtl_Night_3_en.png | 3 + ...ponents.avatar_AvatarRowRtl_Night_4_en.png | 3 + ...m.components.avatar_AvatarRow_Day_0_en.png | 3 + ...m.components.avatar_AvatarRow_Day_1_en.png | 3 + ...m.components.avatar_AvatarRow_Day_2_en.png | 3 + ...m.components.avatar_AvatarRow_Day_3_en.png | 3 + ...m.components.avatar_AvatarRow_Day_4_en.png | 3 + ...components.avatar_AvatarRow_Night_0_en.png | 3 + ...components.avatar_AvatarRow_Night_1_en.png | 3 + ...components.avatar_AvatarRow_Night_2_en.png | 3 + ...components.avatar_AvatarRow_Night_3_en.png | 3 + ...components.avatar_AvatarRow_Night_4_en.png | 3 + ...em.components.avatar_Avatar_Avatars_en.png | 3 + ...ponents.avatar_DmAvatarsRtl_Avatars_en.png | 3 + ...components.avatar_DmAvatars_Avatars_en.png | 3 + ...omponents.button_BackButton_Buttons_en.png | 3 + ...oatingActionButtonCircleShape_Day_0_en.png | 3 + ...tingActionButtonCircleShape_Night_0_en.png | 3 + ..._GradientFloatingActionButton_Day_0_en.png | 3 + ...radientFloatingActionButton_Night_0_en.png | 3 + ...nts.button_MainActionButton_Buttons_en.png | 3 + ...components.button_SuperButton_Day_0_en.png | 3 + ...mponents.button_SuperButton_Night_0_en.png | 3 + ....dialogs_AlertDialogContent_Dialogs_en.png | 3 + ...omponents.dialogs_AlertDialog_Day_0_en.png | 3 + ...ponents.dialogs_AlertDialog_Night_0_en.png | 3 + ...s_ConfirmationDialogContent_Dialogs_en.png | 3 + ...ts.dialogs_ConfirmationDialog_Day_0_en.png | 3 + ....dialogs_ConfirmationDialog_Night_0_en.png | 3 + ....dialogs_ErrorDialogContent_Dialogs_en.png | 3 + ...ErrorDialogWithDoNotShowAgain_Day_0_en.png | 3 + ...rorDialogWithDoNotShowAgain_Night_0_en.png | 3 + ...omponents.dialogs_ErrorDialog_Day_0_en.png | 3 + ...ponents.dialogs_ErrorDialog_Night_0_en.png | 3 + ...s.dialogs_ListDialogContent_Dialogs_en.png | 3 + ...components.dialogs_ListDialog_Day_0_en.png | 3 + ...mponents.dialogs_ListDialog_Night_0_en.png | 3 + ...tipleSelectionDialogContent_Dialogs_en.png | 3 + ...alogs_MultipleSelectionDialog_Day_0_en.png | 3 + ...ogs_MultipleSelectionDialog_Night_0_en.png | 3 + ....dialogs_RetryDialogContent_Dialogs_en.png | 3 + ...omponents.dialogs_RetryDialog_Day_0_en.png | 3 + ...ponents.dialogs_RetryDialog_Night_0_en.png | 3 + ...nts.dialogs_SaveChangesDialog_Day_0_en.png | 3 + ...s.dialogs_SaveChangesDialog_Night_0_en.png | 3 + ...ingleSelectionDialogContent_Dialogs_en.png | 3 + ...dialogs_SingleSelectionDialog_Day_0_en.png | 3 + ...alogs_SingleSelectionDialog_Night_0_en.png | 3 + ...logs_TextFieldDialogWithError_Day_0_en.png | 3 + ...gs_TextFieldDialogWithError_Night_0_en.png | 3 + ...nents.dialogs_TextFieldDialog_Day_0_en.png | 3 + ...nts.dialogs_TextFieldDialog_Night_0_en.png | 3 + ...tion_in_trailing_content_List_items_en.png | 3 + ...ction_in_supporting_text_List_items_en.png | 3 + ...List_item_-_no_selection_List_items_en.png | 3 + ..._item_-_custom_formatter_List_items_en.png | 3 + ...ction_in_supporting_text_List_items_en.png | 3 + ...tion_in_trailing_content_List_items_en.png | 3 + ...lection,_supporting_text_List_items_en.png | 3 + ...List_item_-_no_selection_List_items_en.png | 3 + ..._field_List_item_-_empty_List_items_en.png | 3 + ...st_item_-_textfieldvalue_List_items_en.png | 3 + ...t_field_List_item_-_text_List_items_en.png | 3 + ...ts.media_WaveformPlaybackView_Day_0_en.png | 3 + ....media_WaveformPlaybackView_Night_0_en.png | 3 + ...eferenceIconWithBadge_Preferences_0_en.png | 3 + ...eferenceIconWithBadge_Preferences_1_en.png | 3 + ...onents_PreferenceIcon_Preferences_0_en.png | 3 + ...onents_PreferenceIcon_Preferences_1_en.png | 3 + ...nces_PreferenceCategory_Preferences_en.png | 3 + ...nces_PreferenceCheckbox_Preferences_en.png | 3 + ...ences_PreferenceDivider_Preferences_en.png | 3 + ...nces_PreferenceDropdown_Preferences_en.png | 3 + ...ts.preferences_PreferencePage_Day_0_en.png | 3 + ....preferences_PreferencePage_Night_0_en.png | 3 + ...eferences_PreferenceRow_Preferences_en.png | 3 + ...erences_PreferenceSlide_Preferences_en.png | 3 + ...rences_PreferenceSwitch_Preferences_en.png | 3 + ...ystem.components_Announcement_Day_0_en.png | 3 + ...tem.components_Announcement_Night_0_en.png | 3 + ...designsystem.components_Badge_Day_0_en.png | 3 + ...signsystem.components_Badge_Night_0_en.png | 3 + ...signsystem.components_BigIcon_Day_0_en.png | 3 + ...gnsystem.components_BigIcon_Night_0_en.png | 3 + ...m.components_ClickableLinkText_Text_en.png | 3 + ...ponents_ExpandableBottomSheetLayout_en.png | 3 + ...components_LabelledCheckbox_Toggles_en.png | 3 + ...signsystem.components_PinIcon_Day_0_en.png | 3 + ...gnsystem.components_PinIcon_Night_0_en.png | 3 + ...nents_ProgressDialogContent_Dialogs_en.png | 3 + ...nts_ProgressDialogWithContent_Day_0_en.png | 3 + ...s_ProgressDialogWithContent_Night_0_en.png | 3 + ...gressDialogWithTextAndContent_Day_0_en.png | 3 + ...essDialogWithTextAndContent_Night_0_en.png | 3 + ...tem.components_ProgressDialog_Day_0_en.png | 3 + ...m.components_ProgressDialog_Night_0_en.png | 3 + ...onents_SimpleModalBottomSheet_Day_0_en.png | 3 + ...ents_SimpleModalBottomSheet_Night_0_en.png | 3 + ...designsystem.icons_IconsOther_Day_0_en.png | 3 + ...signsystem.icons_IconsOther_Night_0_en.png | 3 + ...roundVerticalGradientDisabled_Day_0_en.png | 3 + ...undVerticalGradientDisabled_Night_0_en.png | 3 + ...rs_BackgroundVerticalGradient_Day_0_en.png | 3 + ..._BackgroundVerticalGradient_Night_0_en.png | 3 + ...iers_SquareSizeModifierInsideSquare_en.png | 3 + ...fiers_SquareSizeModifierLargeHeight_en.png | 3 + ...ifiers_SquareSizeModifierLargeWidth_en.png | 3 + ...nsystem.ruler_HorizontalRuler_Day_0_en.png | 3 + ...ystem.ruler_HorizontalRuler_Night_0_en.png | 3 + ...ignsystem.ruler_VerticalRuler_Day_0_en.png | 3 + ...nsystem.ruler_VerticalRuler_Night_0_en.png | 3 + ...designsystem.ruler_WithRulers_Day_0_en.png | 3 + ...signsystem.ruler_WithRulers_Night_0_en.png | 3 + ...es.designsystem.text_DpScale_0_75f__en.png | 3 + ...ies.designsystem.text_DpScale_1_0f__en.png | 3 + ...ies.designsystem.text_DpScale_1_5f__en.png | 3 + ...ews_DatePickerDark_DateTime_pickers_en.png | 3 + ...ws_DatePickerLight_DateTime_pickers_en.png | 3 + ...heme.components.previews_Menu_Menus_en.png | 3 + ...mePickerHorizontal_DateTime_pickers_en.png | 3 + ...PickerVerticalDark_DateTime_pickers_en.png | 3 + ...ickerVerticalLight_DateTime_pickers_en.png | 3 + ...tem.theme.components_AllIcons_Icons_en.png | 3 + ...ponents_BottomSheetDragHandle_Day_0_en.png | 3 + ...nents_BottomSheetDragHandle_Night_0_en.png | 3 + ...theme.components_Checkboxes_Toggles_en.png | 3 + ...ogressIndicator_Progress_Indicators_en.png | 3 + ...log_with_destructive_button_Dialogs_en.png | 3 + ..._only_message_and_ok_button_Dialogs_en.png | 3 + ...on_Dialog_with_third_button_Dialogs_en.png | 3 + ...og_with_title_and_ok_button_Dialogs_en.png | 3 + ...h_title,_icon_and_ok_button_Dialogs_en.png | 3 + ..._a_very_long_title_and_icon_Dialogs_en.png | 3 + ...alog_with_a_very_long_title_Dialogs_en.png | 3 + ...e.components_DropdownMenuItem_Menus_en.png | 3 + ...FilledButtonLargeLowPadding_Buttons_en.png | 3 + ...omponents_FilledButtonLarge_Buttons_en.png | 3 + ...illedButtonMediumLowPadding_Buttons_en.png | 3 + ...mponents_FilledButtonMedium_Buttons_en.png | 3 + ...omponents_FilledButtonSmall_Buttons_en.png | 3 + ...ents_FilledTextFieldDark_TextFields_en.png | 3 + ...nts_FilledTextFieldLight_TextFields_en.png | 3 + ...illedTextFieldValueLight_TextFields_en.png | 3 + ...tFieldValueTextFieldDark_TextFields_en.png | 3 + ...ctionButton_Floating_Action_Buttons_en.png | 3 + ...mponents_HorizontalDivider_Dividers_en.png | 3 + ...theme.components_IconButton_Buttons_en.png | 3 + ...me.components_IconColorButton_Day_0_en.png | 3 + ....components_IconColorButton_Night_0_en.png | 3 + ...me.components_IconImageVector_Icons_en.png | 3 + ...components_IconToggleButton_Toggles_en.png | 3 + ...ogressIndicator_Progress_Indicators_en.png | 3 + ..._-_Primary_action_&_Icon_List_items_en.png | 3 + ...em_(1_line)_-_Both_Icons_List_items_en.png | 3 + ...line)_-_Leading_Checkbox_List_items_en.png | 3 + ..._(1_line)_-_Leading_Icon_List_items_en.png | 3 + ...e)_-_Leading_RadioButton_List_items_en.png | 3 + ...1_line)_-_Leading_Switch_List_items_en.png | 3 + ...t_item_(1_line)_-_Simple_List_items_en.png | 3 + ...ine)_-_Trailing_Checkbox_List_items_en.png | 3 + ...(1_line)_-_Trailing_Icon_List_items_en.png | 3 + ...)_-_Trailing_RadioButton_List_items_en.png | 3 + ..._line)_-_Trailing_Switch_List_items_en.png | 3 + ...m_(3_lines)_-_Both_Icons_List_items_en.png | 3 + ...ines)_-_Leading_Checkbox_List_items_en.png | 3 + ...(3_lines)_-_Leading_Icon_List_items_en.png | 3 + ...s)_-_Leading_RadioButton_List_items_en.png | 3 + ..._lines)_-_Leading_Switch_List_items_en.png | 3 + ..._item_(3_lines)_-_Simple_List_items_en.png | 3 + ...nes)_-_Trailing_Checkbox_List_items_en.png | 3 + ...3_lines)_-_Trailing_Icon_List_items_en.png | 3 + ...)_-_Trailing_RadioButton_List_items_en.png | 3 + ...lines)_-_Trailing_Switch_List_items_en.png | 3 + ...es)_-_Both_Icons_-_Error_List_items_en.png | 3 + ...m_(2_lines)_-_Both_Icons_List_items_en.png | 3 + ...Leading_Checkbox_-_Error_List_items_en.png | 3 + ...ines)_-_Leading_Checkbox_List_items_en.png | 3 + ...)_-_Leading_Icon_-_Error_List_items_en.png | 3 + ...(2_lines)_-_Leading_Icon_List_items_en.png | 3 + ...ding_RadioButton_-_Error_List_items_en.png | 3 + ...s)_-_Leading_RadioButton_List_items_en.png | 3 + ...-_Leading_Switch_-_Error_List_items_en.png | 3 + ..._lines)_-_Leading_Switch_List_items_en.png | 3 + ..._lines)_-_Simple_-_Error_List_items_en.png | 3 + ..._item_(2_lines)_-_Simple_List_items_en.png | 3 + ...railing_Checkbox_-_Error_List_items_en.png | 3 + ...nes)_-_Trailing_Checkbox_List_items_en.png | 3 + ..._-_Trailing_Icon_-_Error_List_items_en.png | 3 + ...2_lines)_-_Trailing_Icon_List_items_en.png | 3 + ...ling_RadioButton_-_Error_List_items_en.png | 3 + ...)_-_Trailing_RadioButton_List_items_en.png | 3 + ..._Trailing_Switch_-_Error_List_items_en.png | 3 + ...lines)_-_Trailing_Switch_List_items_en.png | 3 + ...scription_and_divider_List_sections_en.png | 3 + ...ader_with_description_List_sections_en.png | 3 + ...n_header_with_divider_List_sections_en.png | 3 + ...r_List_section_header_List_sections_en.png | 3 + ...text_-_custom_padding_List_sections_en.png | 3 + ...ext_-_default_padding_List_sections_en.png | 3 + ..._text_-_large_padding_List_sections_en.png | 3 + ...ing_text_-_no_padding_List_sections_en.png | 3 + ..._text_-_small_padding_List_sections_en.png | 3 + ...components_MediumTopAppBar_App_Bars_en.png | 3 + ..._ModalBottomSheetDark_Bottom_Sheets_en.png | 3 + ...ModalBottomSheetLight_Bottom_Sheets_en.png | 3 + ...e.components_NavigationBar_App_Bars_en.png | 3 + ...tlinedButtonLargeLowPadding_Buttons_en.png | 3 + ...ponents_OutlinedButtonLarge_Buttons_en.png | 3 + ...linedButtonMediumLowPadding_Buttons_en.png | 3 + ...onents_OutlinedButtonMedium_Buttons_en.png | 3 + ...ponents_OutlinedButtonSmall_Buttons_en.png | 3 + ...heme.components_RadioButton_Toggles_en.png | 3 + ...archBarActiveNoneQuery_Search_views_en.png | 3 + ...chBarActiveWithContent_Search_views_en.png | 3 + ...BarActiveWithNoResults_Search_views_en.png | 3 + ...eWithQueryNoBackButton_Search_views_en.png | 3 + ...archBarActiveWithQuery_Search_views_en.png | 3 + ...ents_SearchBarInactive_Search_views_en.png | 3 + ...nents_SearchFieldsDark_Search_views_en.png | 3 + ...ents_SearchFieldsLight_Search_views_en.png | 3 + ...em.theme.components_Sliders_Sliders_en.png | 3 + ...h_action_and_close_button_Snackbars_en.png | 3 + ..._close_button_on_new_line_Snackbars_en.png | 3 + ...r_with_action_on_new_line_Snackbars_en.png | 3 + ...tion_Snackbar_with_action_Snackbars_en.png | 3 + ...ponents_Snackbar_Snackbar_Snackbars_en.png | 3 + ...signsystem.theme.components_Surface_en.png | 3 + ...tem.theme.components_Switch_Toggles_en.png | 3 + ...s_TextButtonLargeLowPadding_Buttons_en.png | 3 + ....components_TextButtonLarge_Buttons_en.png | 3 + ..._TextButtonMediumLowPadding_Buttons_en.png | 3 + ...components_TextButtonMedium_Buttons_en.png | 3 + ....components_TextButtonSmall_Buttons_en.png | 3 + ...stem.theme.components_TextDark_Text_en.png | 3 + ...omponents_TextFieldsDark_TextFields_en.png | 3 + ...mponents_TextFieldsLight_TextFields_en.png | 3 + ...tem.theme.components_TextLight_Text_en.png | 3 + ...me.components_TopAppBarStr_App_Bars_en.png | 3 + ...theme.components_TopAppBar_App_Bars_en.png | 3 + ...signsystem.theme_ColorAliases_Day_0_en.png | 3 + ...gnsystem.theme_ColorAliases_Night_0_en.png | 3 + ...eatureflag.ui_FeatureListView_Day_0_en.png | 3 + ...tureflag.ui_FeatureListView_Night_0_en.png | 3 + ...omponents_AttachmentThumbnail_Day_0_en.png | 3 + ...omponents_AttachmentThumbnail_Day_1_en.png | 3 + ...omponents_AttachmentThumbnail_Day_2_en.png | 3 + ...omponents_AttachmentThumbnail_Day_3_en.png | 3 + ...omponents_AttachmentThumbnail_Day_4_en.png | 3 + ...omponents_AttachmentThumbnail_Day_5_en.png | 3 + ...omponents_AttachmentThumbnail_Day_6_en.png | 3 + ...omponents_AttachmentThumbnail_Day_7_en.png | 3 + ...omponents_AttachmentThumbnail_Day_8_en.png | 3 + ...ponents_AttachmentThumbnail_Night_0_en.png | 3 + ...ponents_AttachmentThumbnail_Night_1_en.png | 3 + ...ponents_AttachmentThumbnail_Night_2_en.png | 3 + ...ponents_AttachmentThumbnail_Night_3_en.png | 3 + ...ponents_AttachmentThumbnail_Night_4_en.png | 3 + ...ponents_AttachmentThumbnail_Night_5_en.png | 3 + ...ponents_AttachmentThumbnail_Night_6_en.png | 3 + ...ponents_AttachmentThumbnail_Night_7_en.png | 3 + ...ponents_AttachmentThumbnail_Night_8_en.png | 3 + ...nents_AvatarActionBottomSheet_Day_0_en.png | 3 + ...nts_AvatarActionBottomSheet_Night_0_en.png | 3 + ...components_CheckableResolvedUserRow_en.png | 3 + ...mponents_CheckableUnresolvedUserRow_en.png | 3 + ...eateDmConfirmationBottomSheet_Day_0_en.png | 3 + ...eateDmConfirmationBottomSheet_Day_1_en.png | 3 + ...teDmConfirmationBottomSheet_Night_0_en.png | 3 + ...teDmConfirmationBottomSheet_Night_1_en.png | 3 + ...components_EditableAvatarView_Day_0_en.png | 3 + ...components_EditableAvatarView_Day_1_en.png | 3 + ...components_EditableAvatarView_Day_2_en.png | 3 + ...mponents_EditableAvatarView_Night_0_en.png | 3 + ...mponents_EditableAvatarView_Night_1_en.png | 3 + ...mponents_EditableAvatarView_Night_2_en.png | 3 + ...mponents_EditableOrgAvatarRtl_Day_0_en.png | 3 + ...onents_EditableOrgAvatarRtl_Night_0_en.png | 3 + ....components_EditableOrgAvatar_Day_0_en.png | 3 + ...omponents_EditableOrgAvatar_Night_0_en.png | 3 + ...i.components_InviteSenderView_Day_0_en.png | 3 + ...components_InviteSenderView_Night_0_en.png | 3 + ...s_MatrixUserHeaderPlaceholder_Day_0_en.png | 3 + ...MatrixUserHeaderPlaceholder_Night_0_en.png | 3 + ...i.components_MatrixUserHeader_Day_0_en.png | 3 + ...i.components_MatrixUserHeader_Day_1_en.png | 3 + ...components_MatrixUserHeader_Night_0_en.png | 3 + ...components_MatrixUserHeader_Night_1_en.png | 3 + ...x.ui.components_MatrixUserRow_Day_0_en.png | 3 + ...x.ui.components_MatrixUserRow_Day_1_en.png | 3 + ...ui.components_MatrixUserRow_Night_0_en.png | 3 + ...ui.components_MatrixUserRow_Night_1_en.png | 3 + ...components_OrganizationHeader_Day_0_en.png | 3 + ...mponents_OrganizationHeader_Night_0_en.png | 3 + ...ui.components_SelectedRoomRtl_Day_0_en.png | 3 + ...ui.components_SelectedRoomRtl_Day_1_en.png | 3 + ...ui.components_SelectedRoomRtl_Day_2_en.png | 3 + ....components_SelectedRoomRtl_Night_0_en.png | 3 + ....components_SelectedRoomRtl_Night_1_en.png | 3 + ....components_SelectedRoomRtl_Night_2_en.png | 3 + ...ix.ui.components_SelectedRoom_Day_0_en.png | 3 + ...ix.ui.components_SelectedRoom_Day_1_en.png | 3 + ...ix.ui.components_SelectedRoom_Day_2_en.png | 3 + ....ui.components_SelectedRoom_Night_0_en.png | 3 + ....ui.components_SelectedRoom_Night_1_en.png | 3 + ....ui.components_SelectedRoom_Night_2_en.png | 3 + ...ents_SelectedUserCannotRemove_Day_0_en.png | 3 + ...ts_SelectedUserCannotRemove_Night_0_en.png | 3 + ...ui.components_SelectedUserRtl_Day_0_en.png | 3 + ....components_SelectedUserRtl_Night_0_en.png | 3 + ...ix.ui.components_SelectedUser_Day_0_en.png | 3 + ...ix.ui.components_SelectedUser_Day_1_en.png | 3 + ....ui.components_SelectedUser_Night_0_en.png | 3 + ....ui.components_SelectedUser_Night_1_en.png | 3 + ...mponents_SelectedUsersRowList_Day_0_en.png | 3 + ...onents_SelectedUsersRowList_Night_0_en.png | 3 + ...omponents_SpaceHeaderRootView_Day_0_en.png | 3 + ...ponents_SpaceHeaderRootView_Night_0_en.png | 3 + ...ui.components_SpaceHeaderView_Day_0_en.png | 3 + ....components_SpaceHeaderView_Night_0_en.png | 3 + ...ix.ui.components_SpaceInfoRow_Day_0_en.png | 3 + ....ui.components_SpaceInfoRow_Night_0_en.png | 3 + ...ents_SpaceMembersViewNoHeroes_Day_0_en.png | 3 + ...ts_SpaceMembersViewNoHeroes_Night_0_en.png | 3 + ...i.components_SpaceMembersView_Day_0_en.png | 3 + ...components_SpaceMembersView_Night_0_en.png | 3 + ....components_SpaceRoomItemView_Day_0_en.png | 3 + ....components_SpaceRoomItemView_Day_1_en.png | 3 + ....components_SpaceRoomItemView_Day_2_en.png | 3 + ....components_SpaceRoomItemView_Day_3_en.png | 3 + ....components_SpaceRoomItemView_Day_4_en.png | 3 + ....components_SpaceRoomItemView_Day_5_en.png | 3 + ....components_SpaceRoomItemView_Day_6_en.png | 3 + ....components_SpaceRoomItemView_Day_7_en.png | 3 + ....components_SpaceRoomItemView_Day_8_en.png | 3 + ...omponents_SpaceRoomItemView_Night_0_en.png | 3 + ...omponents_SpaceRoomItemView_Night_1_en.png | 3 + ...omponents_SpaceRoomItemView_Night_2_en.png | 3 + ...omponents_SpaceRoomItemView_Night_3_en.png | 3 + ...omponents_SpaceRoomItemView_Night_4_en.png | 3 + ...omponents_SpaceRoomItemView_Night_5_en.png | 3 + ...omponents_SpaceRoomItemView_Night_6_en.png | 3 + ...omponents_SpaceRoomItemView_Night_7_en.png | 3 + ...omponents_SpaceRoomItemView_Night_8_en.png | 3 + ...rix.ui.components_UnresolvedUserRow_en.png | 3 + ...x.ui.components_UnsavedAvatar_Day_0_en.png | 3 + ...ui.components_UnsavedAvatar_Night_0_en.png | 3 + ...InitialsAvatarBitmapGenerator_Day_0_en.png | 3 + ...itialsAvatarBitmapGenerator_Night_0_en.png | 3 + ....messages.reply_InReplyToView_Day_0_en.png | 3 + ...messages.reply_InReplyToView_Day_10_en.png | 3 + ...messages.reply_InReplyToView_Day_11_en.png | 3 + ....messages.reply_InReplyToView_Day_1_en.png | 3 + ....messages.reply_InReplyToView_Day_2_en.png | 3 + ....messages.reply_InReplyToView_Day_3_en.png | 3 + ....messages.reply_InReplyToView_Day_4_en.png | 3 + ....messages.reply_InReplyToView_Day_5_en.png | 3 + ....messages.reply_InReplyToView_Day_6_en.png | 3 + ....messages.reply_InReplyToView_Day_7_en.png | 3 + ....messages.reply_InReplyToView_Day_8_en.png | 3 + ....messages.reply_InReplyToView_Day_9_en.png | 3 + ...essages.reply_InReplyToView_Night_0_en.png | 3 + ...ssages.reply_InReplyToView_Night_10_en.png | 3 + ...ssages.reply_InReplyToView_Night_11_en.png | 3 + ...essages.reply_InReplyToView_Night_1_en.png | 3 + ...essages.reply_InReplyToView_Night_2_en.png | 3 + ...essages.reply_InReplyToView_Night_3_en.png | 3 + ...essages.reply_InReplyToView_Night_4_en.png | 3 + ...essages.reply_InReplyToView_Night_5_en.png | 3 + ...essages.reply_InReplyToView_Night_6_en.png | 3 + ...essages.reply_InReplyToView_Night_7_en.png | 3 + ...essages.reply_InReplyToView_Night_8_en.png | 3 + ...essages.reply_InReplyToView_Night_9_en.png | 3 + ...ui.messages.sender_SenderName_Day_0_en.png | 3 + ...ui.messages.sender_SenderName_Day_1_en.png | 3 + ...ui.messages.sender_SenderName_Day_2_en.png | 3 + ...ui.messages.sender_SenderName_Day_3_en.png | 3 + ...ui.messages.sender_SenderName_Day_4_en.png | 3 + ...ui.messages.sender_SenderName_Day_5_en.png | 3 + ...ui.messages.sender_SenderName_Day_6_en.png | 3 + ...ui.messages.sender_SenderName_Day_7_en.png | 3 + ...ui.messages.sender_SenderName_Day_8_en.png | 3 + ....messages.sender_SenderName_Night_0_en.png | 3 + ....messages.sender_SenderName_Night_1_en.png | 3 + ....messages.sender_SenderName_Night_2_en.png | 3 + ....messages.sender_SenderName_Night_3_en.png | 3 + ....messages.sender_SenderName_Night_4_en.png | 3 + ....messages.sender_SenderName_Night_5_en.png | 3 + ....messages.sender_SenderName_Night_6_en.png | 3 + ....messages.sender_SenderName_Night_7_en.png | 3 + ....messages.sender_SenderName_Night_8_en.png | 3 + ...room.address_RoomAddressField_Day_0_en.png | 3 + ...om.address_RoomAddressField_Night_0_en.png | 3 + ...DeleteConfirmationBottomSheet_Day_0_en.png | 3 + ...leteConfirmationBottomSheet_Night_0_en.png | 3 + ...tails_MediaDetailsBottomSheet_Day_0_en.png | 3 + ...ils_MediaDetailsBottomSheet_Night_0_en.png | 3 + ...impl.gallery.ui_AudioItemView_Day_0_en.png | 3 + ...impl.gallery.ui_AudioItemView_Day_1_en.png | 3 + ...impl.gallery.ui_AudioItemView_Day_2_en.png | 3 + ...pl.gallery.ui_AudioItemView_Night_0_en.png | 3 + ...pl.gallery.ui_AudioItemView_Night_1_en.png | 3 + ...pl.gallery.ui_AudioItemView_Night_2_en.png | 3 + ....impl.gallery.ui_DateItemView_Day_0_en.png | 3 + ....impl.gallery.ui_DateItemView_Day_1_en.png | 3 + ...mpl.gallery.ui_DateItemView_Night_0_en.png | 3 + ...mpl.gallery.ui_DateItemView_Night_1_en.png | 3 + ....impl.gallery.ui_FileItemView_Day_0_en.png | 3 + ....impl.gallery.ui_FileItemView_Day_1_en.png | 3 + ....impl.gallery.ui_FileItemView_Day_2_en.png | 3 + ...mpl.gallery.ui_FileItemView_Night_0_en.png | 3 + ...mpl.gallery.ui_FileItemView_Night_1_en.png | 3 + ...mpl.gallery.ui_FileItemView_Night_2_en.png | 3 + ...impl.gallery.ui_ImageItemView_Day_0_en.png | 3 + ...pl.gallery.ui_ImageItemView_Night_0_en.png | 3 + ...impl.gallery.ui_VideoItemView_Day_0_en.png | 3 + ...impl.gallery.ui_VideoItemView_Day_1_en.png | 3 + ...pl.gallery.ui_VideoItemView_Night_0_en.png | 3 + ...pl.gallery.ui_VideoItemView_Night_1_en.png | 3 + ....gallery.ui_VoiceItemViewPlay_Day_0_en.png | 3 + ....gallery.ui_VoiceItemViewPlay_Day_1_en.png | 3 + ....gallery.ui_VoiceItemViewPlay_Day_2_en.png | 3 + ....gallery.ui_VoiceItemViewPlay_Day_3_en.png | 3 + ....gallery.ui_VoiceItemViewPlay_Day_4_en.png | 3 + ...allery.ui_VoiceItemViewPlay_Night_0_en.png | 3 + ...allery.ui_VoiceItemViewPlay_Night_1_en.png | 3 + ...allery.ui_VoiceItemViewPlay_Night_2_en.png | 3 + ...allery.ui_VoiceItemViewPlay_Night_3_en.png | 3 + ...allery.ui_VoiceItemViewPlay_Night_4_en.png | 3 + ...impl.gallery.ui_VoiceItemView_Day_0_en.png | 3 + ...impl.gallery.ui_VoiceItemView_Day_1_en.png | 3 + ...impl.gallery.ui_VoiceItemView_Day_2_en.png | 3 + ...impl.gallery.ui_VoiceItemView_Day_3_en.png | 3 + ...pl.gallery.ui_VoiceItemView_Night_0_en.png | 3 + ...pl.gallery.ui_VoiceItemView_Night_1_en.png | 3 + ...pl.gallery.ui_VoiceItemView_Night_2_en.png | 3 + ...pl.gallery.ui_VoiceItemView_Night_3_en.png | 3 + ...impl.gallery_MediaGalleryView_Day_0_en.png | 3 + ...mpl.gallery_MediaGalleryView_Day_10_en.png | 3 + ...mpl.gallery_MediaGalleryView_Day_11_en.png | 3 + ...mpl.gallery_MediaGalleryView_Day_12_en.png | 3 + ...impl.gallery_MediaGalleryView_Day_1_en.png | 3 + ...impl.gallery_MediaGalleryView_Day_2_en.png | 3 + ...impl.gallery_MediaGalleryView_Day_3_en.png | 3 + ...impl.gallery_MediaGalleryView_Day_4_en.png | 3 + ...impl.gallery_MediaGalleryView_Day_5_en.png | 3 + ...impl.gallery_MediaGalleryView_Day_6_en.png | 3 + ...impl.gallery_MediaGalleryView_Day_7_en.png | 3 + ...impl.gallery_MediaGalleryView_Day_8_en.png | 3 + ...impl.gallery_MediaGalleryView_Day_9_en.png | 3 + ...pl.gallery_MediaGalleryView_Night_0_en.png | 3 + ...l.gallery_MediaGalleryView_Night_10_en.png | 3 + ...l.gallery_MediaGalleryView_Night_11_en.png | 3 + ...l.gallery_MediaGalleryView_Night_12_en.png | 3 + ...pl.gallery_MediaGalleryView_Night_1_en.png | 3 + ...pl.gallery_MediaGalleryView_Night_2_en.png | 3 + ...pl.gallery_MediaGalleryView_Night_3_en.png | 3 + ...pl.gallery_MediaGalleryView_Night_4_en.png | 3 + ...pl.gallery_MediaGalleryView_Night_5_en.png | 3 + ...pl.gallery_MediaGalleryView_Night_6_en.png | 3 + ...pl.gallery_MediaGalleryView_Night_7_en.png | 3 + ...pl.gallery_MediaGalleryView_Night_8_en.png | 3 + ...pl.gallery_MediaGalleryView_Night_9_en.png | 3 + ...pl.local.audio_MediaAudioView_Day_0_en.png | 3 + ...pl.local.audio_MediaAudioView_Day_1_en.png | 3 + ....local.audio_MediaAudioView_Night_0_en.png | 3 + ....local.audio_MediaAudioView_Night_1_en.png | 3 + ...impl.local.file_MediaFileView_Day_0_en.png | 3 + ...pl.local.file_MediaFileView_Night_0_en.png | 3 + ...pl.local.image_MediaImageView_Day_0_en.png | 3 + ....local.image_MediaImageView_Night_0_en.png | 3 + ...l.local.pdf_PdfPagesErrorView_Day_0_en.png | 3 + ...local.pdf_PdfPagesErrorView_Night_0_en.png | 3 + ...yer_MediaPlayerControllerView_Day_0_en.png | 3 + ...yer_MediaPlayerControllerView_Day_1_en.png | 3 + ...yer_MediaPlayerControllerView_Day_2_en.png | 3 + ...r_MediaPlayerControllerView_Night_0_en.png | 3 + ...r_MediaPlayerControllerView_Night_1_en.png | 3 + ...r_MediaPlayerControllerView_Night_2_en.png | 3 + ...local.txt_TextFileContentView_Day_0_en.png | 3 + ...local.txt_TextFileContentView_Day_1_en.png | 3 + ...local.txt_TextFileContentView_Day_2_en.png | 3 + ...local.txt_TextFileContentView_Day_3_en.png | 3 + ...cal.txt_TextFileContentView_Night_0_en.png | 3 + ...cal.txt_TextFileContentView_Night_1_en.png | 3 + ...cal.txt_TextFileContentView_Night_2_en.png | 3 + ...cal.txt_TextFileContentView_Night_3_en.png | 3 + ...pl.local.video_MediaVideoView_Day_0_en.png | 3 + ....local.video_MediaVideoView_Night_0_en.png | 3 + ...iewer.impl.viewer_MediaViewerView_0_en.png | 3 + ...ewer.impl.viewer_MediaViewerView_10_en.png | 3 + ...ewer.impl.viewer_MediaViewerView_11_en.png | 3 + ...ewer.impl.viewer_MediaViewerView_12_en.png | 3 + ...ewer.impl.viewer_MediaViewerView_13_en.png | 3 + ...ewer.impl.viewer_MediaViewerView_14_en.png | 3 + ...ewer.impl.viewer_MediaViewerView_15_en.png | 3 + ...ewer.impl.viewer_MediaViewerView_16_en.png | 3 + ...iewer.impl.viewer_MediaViewerView_1_en.png | 3 + ...iewer.impl.viewer_MediaViewerView_2_en.png | 3 + ...iewer.impl.viewer_MediaViewerView_3_en.png | 3 + ...iewer.impl.viewer_MediaViewerView_4_en.png | 3 + ...iewer.impl.viewer_MediaViewerView_5_en.png | 3 + ...iewer.impl.viewer_MediaViewerView_6_en.png | 3 + ...iewer.impl.viewer_MediaViewerView_7_en.png | 3 + ...iewer.impl.viewer_MediaViewerView_8_en.png | 3 + ...iewer.impl.viewer_MediaViewerView_9_en.png | 3 + ...rmissions.api_PermissionsView_Day_0_en.png | 3 + ...rmissions.api_PermissionsView_Day_1_en.png | 3 + ...rmissions.api_PermissionsView_Day_2_en.png | 3 + ...rmissions.api_PermissionsView_Day_3_en.png | 3 + ...issions.api_PermissionsView_Night_0_en.png | 3 + ...issions.api_PermissionsView_Night_1_en.png | 3 + ...issions.api_PermissionsView_Night_2_en.png | 3 + ...issions.api_PermissionsView_Night_3_en.png | 3 + ...oomselect.impl_RoomSelectView_Day_0_en.png | 3 + ...oomselect.impl_RoomSelectView_Day_1_en.png | 3 + ...oomselect.impl_RoomSelectView_Day_2_en.png | 3 + ...oomselect.impl_RoomSelectView_Day_3_en.png | 3 + ...oomselect.impl_RoomSelectView_Day_4_en.png | 3 + ...oomselect.impl_RoomSelectView_Day_5_en.png | 3 + ...mselect.impl_RoomSelectView_Night_0_en.png | 3 + ...mselect.impl_RoomSelectView_Night_1_en.png | 3 + ...mselect.impl_RoomSelectView_Night_2_en.png | 3 + ...mselect.impl_RoomSelectView_Night_3_en.png | 3 + ...mselect.impl_RoomSelectView_Night_4_en.png | 3 + ...mselect.impl_RoomSelectView_Night_5_en.png | 3 + ...ts.markdown_MarkdownTextInput_Day_0_en.png | 3 + ....markdown_MarkdownTextInput_Night_0_en.png | 3 + ...r.components_FormattingOption_Day_0_en.png | 3 + ...components_FormattingOption_Night_0_en.png | 3 + ...r.components_LiveWaveformView_Day_0_en.png | 3 + ...components_LiveWaveformView_Night_0_en.png | 3 + ...omposer.components_SendButton_Day_0_en.png | 3 + ...poser.components_SendButton_Night_0_en.png | 3 + ...ser.components_TextFormatting_Day_0_en.png | 3 + ...r.components_TextFormatting_Night_0_en.png | 3 + ...ents_VoiceMessageDeleteButton_Day_0_en.png | 3 + ...ts_VoiceMessageDeleteButton_Night_0_en.png | 3 + ...ts_VoiceMessageRecorderButton_Day_0_en.png | 3 + ..._VoiceMessageRecorderButton_Night_0_en.png | 3 + ...ponents_VoiceMessageRecording_Day_0_en.png | 3 + ...nents_VoiceMessageRecording_Night_0_en.png | 3 + ...poser.components_VoiceMessage_Day_0_en.png | 3 + ...ser.components_VoiceMessage_Night_0_en.png | 3 + ...ns_MentionSpanThemeInTimeline_Day_0_en.png | 3 + ..._MentionSpanThemeInTimeline_Night_0_en.png | 3 + ...ser.mentions_MentionSpanTheme_Day_0_en.png | 3 + ...r.mentions_MentionSpanTheme_Night_0_en.png | 3 + ...ser_CaptionWarningBottomSheet_Day_0_en.png | 3 + ...r_CaptionWarningBottomSheet_Night_0_en.png | 3 + ...textcomposer_ComposerModeView_Day_0_en.png | 3 + ...textcomposer_ComposerModeView_Day_1_en.png | 3 + ...textcomposer_ComposerModeView_Day_2_en.png | 3 + ...textcomposer_ComposerModeView_Day_3_en.png | 3 + ...xtcomposer_ComposerModeView_Night_0_en.png | 3 + ...xtcomposer_ComposerModeView_Night_1_en.png | 3 + ...xtcomposer_ComposerModeView_Night_2_en.png | 3 + ...xtcomposer_ComposerModeView_Night_3_en.png | 3 + ...oser_MarkdownTextComposerEdit_Day_0_en.png | 3 + ...er_MarkdownTextComposerEdit_Night_0_en.png | 3 + ...mposer_TextComposerAddCaption_Day_0_en.png | 3 + ...oser_TextComposerAddCaption_Night_0_en.png | 3 + ...tcomposer_TextComposerCaption_Day_0_en.png | 3 + ...omposer_TextComposerCaption_Night_0_en.png | 3 + ...poser_TextComposerEditCaption_Day_0_en.png | 3 + ...ser_TextComposerEditCaption_Night_0_en.png | 3 + ..._TextComposerEditNotEncrypted_Day_0_en.png | 3 + ...extComposerEditNotEncrypted_Night_0_en.png | 3 + ...textcomposer_TextComposerEdit_Day_0_en.png | 3 + ...xtcomposer_TextComposerEdit_Night_0_en.png | 3 + ...omposerFormattingNotEncrypted_Day_0_en.png | 3 + ...poserFormattingNotEncrypted_Night_0_en.png | 3 + ...mposer_TextComposerFormatting_Day_0_en.png | 3 + ...oser_TextComposerFormatting_Night_0_en.png | 3 + ...nkDialogCreateLinkWithoutText_Day_0_en.png | 3 + ...DialogCreateLinkWithoutText_Night_0_en.png | 3 + ...tComposerLinkDialogCreateLink_Day_0_en.png | 3 + ...omposerLinkDialogCreateLink_Night_0_en.png | 3 + ...extComposerLinkDialogEditLink_Day_0_en.png | 3 + ...tComposerLinkDialogEditLink_Night_0_en.png | 3 + ...TextComposerReplyNotEncrypted_Day_0_en.png | 3 + ...extComposerReplyNotEncrypted_Day_10_en.png | 3 + ...extComposerReplyNotEncrypted_Day_11_en.png | 3 + ...TextComposerReplyNotEncrypted_Day_1_en.png | 3 + ...TextComposerReplyNotEncrypted_Day_2_en.png | 3 + ...TextComposerReplyNotEncrypted_Day_3_en.png | 3 + ...TextComposerReplyNotEncrypted_Day_4_en.png | 3 + ...TextComposerReplyNotEncrypted_Day_5_en.png | 3 + ...TextComposerReplyNotEncrypted_Day_6_en.png | 3 + ...TextComposerReplyNotEncrypted_Day_7_en.png | 3 + ...TextComposerReplyNotEncrypted_Day_8_en.png | 3 + ...TextComposerReplyNotEncrypted_Day_9_en.png | 3 + ...xtComposerReplyNotEncrypted_Night_0_en.png | 3 + ...tComposerReplyNotEncrypted_Night_10_en.png | 3 + ...tComposerReplyNotEncrypted_Night_11_en.png | 3 + ...xtComposerReplyNotEncrypted_Night_1_en.png | 3 + ...xtComposerReplyNotEncrypted_Night_2_en.png | 3 + ...xtComposerReplyNotEncrypted_Night_3_en.png | 3 + ...xtComposerReplyNotEncrypted_Night_4_en.png | 3 + ...xtComposerReplyNotEncrypted_Night_5_en.png | 3 + ...xtComposerReplyNotEncrypted_Night_6_en.png | 3 + ...xtComposerReplyNotEncrypted_Night_7_en.png | 3 + ...xtComposerReplyNotEncrypted_Night_8_en.png | 3 + ...xtComposerReplyNotEncrypted_Night_9_en.png | 3 + ...extcomposer_TextComposerReply_Day_0_en.png | 3 + ...xtcomposer_TextComposerReply_Day_10_en.png | 3 + ...xtcomposer_TextComposerReply_Day_11_en.png | 3 + ...extcomposer_TextComposerReply_Day_1_en.png | 3 + ...extcomposer_TextComposerReply_Day_2_en.png | 3 + ...extcomposer_TextComposerReply_Day_3_en.png | 3 + ...extcomposer_TextComposerReply_Day_4_en.png | 3 + ...extcomposer_TextComposerReply_Day_5_en.png | 3 + ...extcomposer_TextComposerReply_Day_6_en.png | 3 + ...extcomposer_TextComposerReply_Day_7_en.png | 3 + ...extcomposer_TextComposerReply_Day_8_en.png | 3 + ...extcomposer_TextComposerReply_Day_9_en.png | 3 + ...tcomposer_TextComposerReply_Night_0_en.png | 3 + ...composer_TextComposerReply_Night_10_en.png | 3 + ...composer_TextComposerReply_Night_11_en.png | 3 + ...tcomposer_TextComposerReply_Night_1_en.png | 3 + ...tcomposer_TextComposerReply_Night_2_en.png | 3 + ...tcomposer_TextComposerReply_Night_3_en.png | 3 + ...tcomposer_TextComposerReply_Night_4_en.png | 3 + ...tcomposer_TextComposerReply_Night_5_en.png | 3 + ...tcomposer_TextComposerReply_Night_6_en.png | 3 + ...tcomposer_TextComposerReply_Night_7_en.png | 3 + ...tcomposer_TextComposerReply_Night_8_en.png | 3 + ...tcomposer_TextComposerReply_Night_9_en.png | 3 + ...extComposerSimpleNotEncrypted_Day_0_en.png | 3 + ...tComposerSimpleNotEncrypted_Night_0_en.png | 3 + ...xtcomposer_TextComposerSimple_Day_0_en.png | 3 + ...composer_TextComposerSimple_Night_0_en.png | 3 + ...TextComposerVoiceNotEncrypted_Day_0_en.png | 3 + ...xtComposerVoiceNotEncrypted_Night_0_en.png | 3 + ...extcomposer_TextComposerVoice_Day_0_en.png | 3 + ...tcomposer_TextComposerVoice_Night_0_en.png | 3 + ....impl.history_PushHistoryView_Day_0_en.png | 3 + ....impl.history_PushHistoryView_Day_1_en.png | 3 + ....impl.history_PushHistoryView_Day_2_en.png | 3 + ....impl.history_PushHistoryView_Day_3_en.png | 3 + ...mpl.history_PushHistoryView_Night_0_en.png | 3 + ...mpl.history_PushHistoryView_Night_1_en.png | 3 + ...mpl.history_PushHistoryView_Night_2_en.png | 3 + ...mpl.history_PushHistoryView_Night_3_en.png | 3 + ...TroubleshootNotificationsView_Day_0_en.png | 3 + ...TroubleshootNotificationsView_Day_1_en.png | 3 + ...TroubleshootNotificationsView_Day_2_en.png | 3 + ...TroubleshootNotificationsView_Day_3_en.png | 3 + ...TroubleshootNotificationsView_Day_4_en.png | 3 + ...TroubleshootNotificationsView_Day_5_en.png | 3 + ...TroubleshootNotificationsView_Day_6_en.png | 3 + ...TroubleshootNotificationsView_Day_7_en.png | 3 + ...oubleshootNotificationsView_Night_0_en.png | 3 + ...oubleshootNotificationsView_Night_1_en.png | 3 + ...oubleshootNotificationsView_Night_2_en.png | 3 + ...oubleshootNotificationsView_Night_3_en.png | 3 + ...oubleshootNotificationsView_Night_4_en.png | 3 + ...oubleshootNotificationsView_Night_5_en.png | 3 + ...oubleshootNotificationsView_Night_6_en.png | 3 + ...oubleshootNotificationsView_Night_7_en.png | 3 + ...ies.ui.common.nodes_EmptyView_Day_0_en.png | 3 + ...s.ui.common.nodes_EmptyView_Night_0_en.png | 3 + ...es.apperror.impl_AppErrorView_Day_0_en.png | 3 + ....apperror.impl_AppErrorView_Night_0_en.png | 3 + tools/adb/callLinkCustomScheme.sh | 14 + tools/adb/callLinkCustomScheme2.sh | 14 + tools/adb/callLinkHttps.sh | 14 + tools/adb/deeplink.sh | 19 + tools/adb/deeplink_external.sh | 10 + tools/adb/deeplink_matrix.sh | 10 + tools/adb/deeplink_matrixto.sh | 10 + tools/adb/deeplink_mobile.sh | 13 + tools/adb/disable_app_standby.sh | 19 + tools/adb/disable_doze_mode.sh | 17 + tools/adb/disable_talkback.sh | 10 + tools/adb/enable_app_standby.sh | 19 + tools/adb/enable_doze_mode.sh | 17 + tools/adb/enable_talkback.sh | 9 + tools/adb/oidc.sh | 15 + tools/adb/print_device_state.sh | 19 + tools/check/check_code_quality.sh | 56 + tools/check/forbidden_strings_in_code.txt | 128 + tools/check/forbidden_strings_in_xml.txt | 28 + tools/compose/check_stability.sh | 24 + tools/compound/addAutoMirrored.py | 125 + tools/compound/import_tokens.sh | 45 + tools/danger/dangerfile-lint.js | 41 + tools/danger/dangerfile.js | 121 + tools/dependencies/checkDependencies.py | 88 + tools/detekt/detekt.yml | 275 ++ tools/docs/generateModuleGraph.sh | 13 + tools/git/validate_lfs.sh | 20 + tools/gitflow/gitflow-init.sh | 10 + tools/github/download_all_github_artifacts.py | 121 + tools/github/download_github_artifacts.py | 159 + tools/lint/lint.xml | 126 + tools/localazy/README.md | 76 + tools/localazy/checkForbiddenTerms.py | 79 + tools/localazy/config.json | 389 +++ tools/localazy/downloadStrings.sh | 48 + tools/localazy/formatXmlResourcesFile.py | 83 + tools/localazy/generateLocalazyConfig.py | 112 + .../importSupportedLocalesFromLocalazy.py | 85 + tools/quality/check.sh | 22 + tools/release/ReleaseNotesNightly.md | 3 + tools/release/fix-pg-map-id.py | 227 ++ tools/release/inplace-fix.py | 199 ++ tools/release/release.sh | 415 +++ tools/rte/build_rte.sh | 82 + tools/sas/import_sas_emojis.py | 75 + tools/sas/import_sas_strings.py | 105 + tools/sdk/build_rust_sdk.sh | 101 + tools/templates/FeatureModule.json | 1 + .../files/IntelliJ IDEA Global Settings | 0 ...mplate Module Feature Build Gradle API.kts | 11 + ...plate Module Feature Build Gradle Impl.kts | 25 + ...Template Module Feature Entry Point API.kt | 18 + ...te Module Feature Entry Point Flow Impl.kt | 21 + .../Template Module Feature Node Flow Impl.kt | 58 + .../Template Presentation Classes.kt | 23 + ...emplate Presentation Classes.kt.child.0.kt | 15 + ...emplate Presentation Classes.kt.child.1.kt | 30 + ...emplate Presentation Classes.kt.child.2.kt | 35 + ...emplate Presentation Classes.kt.child.3.kt | 6 + ...emplate Presentation Classes.kt.child.4.kt | 6 + .../files/options/file.template.settings.xml | 18 + tools/templates/generate_templates.sh | 17 + tools/test/checkInvalidScreenshots.py | 38 + tools/test/generateAllScreenshots.py | 193 ++ tools/test/generateWorldScreenshots.py | 32 + tools/test/invalid_screenshot.png | Bin 0 -> 4462 bytes tools/test/util.py | 23 + 9974 files changed, 396488 insertions(+) create mode 100644 .editorconfig create mode 100644 .gitattributes create mode 100644 .gitignore create mode 100644 .gitmodules create mode 100644 .idea/codeStyles/Project.xml create mode 100644 .idea/codeStyles/codeStyleConfig.xml create mode 100644 .idea/copyright/Element_Enterprise.xml create mode 100644 .idea/copyright/Element_FOSS.xml create mode 100644 .idea/copyright/profiles_settings.xml create mode 100644 .idea/dictionaries/shared.xml create mode 100644 .idea/icon.png create mode 100644 .idea/kotlinc.xml create mode 100644 .idea/migrations.xml create mode 100644 .idea/scopes/Enterprise.xml create mode 100644 .maestro/README.md create mode 100644 .maestro/allTests.yaml create mode 100644 .maestro/scripts/checkEnv.js create mode 100644 .maestro/tests/account/changeServer.yaml create mode 100644 .maestro/tests/account/login.yaml create mode 100644 .maestro/tests/account/logout.yaml create mode 100644 .maestro/tests/account/verifySession.yaml create mode 100644 .maestro/tests/assertions/assertAnalyticsDisplayed.yaml create mode 100644 .maestro/tests/assertions/assertHomeDisplayed.yaml create mode 100644 .maestro/tests/assertions/assertInitDisplayed.yaml create mode 100644 .maestro/tests/assertions/assertLoginDisplayed.yaml create mode 100644 .maestro/tests/assertions/assertRoomListSynced.yaml create mode 100644 .maestro/tests/assertions/assertSessionVerificationDisplayed.yaml create mode 100644 .maestro/tests/init.yaml create mode 100644 .maestro/tests/roomList/createAndDeleteDM.yaml create mode 100644 .maestro/tests/roomList/createAndDeleteRoom.yaml create mode 100644 .maestro/tests/roomList/roomContextMenu.yaml create mode 100644 .maestro/tests/roomList/roomList.yaml create mode 100644 .maestro/tests/roomList/searchRoomList.yaml create mode 100644 .maestro/tests/roomList/timeline/call/call.yaml create mode 100644 .maestro/tests/roomList/timeline/messages/location.yaml create mode 100644 .maestro/tests/roomList/timeline/messages/poll.yaml create mode 100644 .maestro/tests/roomList/timeline/messages/text.yaml create mode 100644 .maestro/tests/roomList/timeline/timeline.yaml create mode 100644 .maestro/tests/settings/settings.yaml create mode 100644 AUTHORS.md create mode 100644 CHANGES.md create mode 100644 CODEOWNERS create mode 100644 CONTRIBUTING.md create mode 100644 Gemfile create mode 100644 LICENSE create mode 100644 LICENSE-COMMERCIAL create mode 100644 README.md create mode 100644 annotations/.gitignore create mode 100644 annotations/build.gradle.kts create mode 100644 annotations/src/main/kotlin/io/element/android/annotations/ContributesNode.kt create mode 100644 app/build.gradle.kts create mode 100644 app/proguard-rules.pro create mode 100644 app/signature/debug.keystore create mode 100644 app/signature/nightly.keystore create mode 100644 app/src/main/AndroidManifest.xml create mode 100644 app/src/main/kotlin/io/element/android/x/ElementXApplication.kt create mode 100644 app/src/main/kotlin/io/element/android/x/MainActivity.kt create mode 100644 app/src/main/kotlin/io/element/android/x/MainNode.kt create mode 100644 app/src/main/kotlin/io/element/android/x/di/AppBindings.kt create mode 100644 app/src/main/kotlin/io/element/android/x/di/AppGraph.kt create mode 100644 app/src/main/kotlin/io/element/android/x/di/AppModule.kt create mode 100644 app/src/main/kotlin/io/element/android/x/di/DefaultRoomGraphFactory.kt create mode 100644 app/src/main/kotlin/io/element/android/x/di/DefaultSessionGraphFactory.kt create mode 100644 app/src/main/kotlin/io/element/android/x/di/RoomGraph.kt create mode 100644 app/src/main/kotlin/io/element/android/x/di/SessionGraph.kt create mode 100644 app/src/main/kotlin/io/element/android/x/info/Logs.kt create mode 100644 app/src/main/kotlin/io/element/android/x/initializer/CacheCleanerInitializer.kt create mode 100644 app/src/main/kotlin/io/element/android/x/initializer/CrashInitializer.kt create mode 100644 app/src/main/kotlin/io/element/android/x/initializer/PlatformInitializer.kt create mode 100644 app/src/main/kotlin/io/element/android/x/intent/DefaultIntentProvider.kt create mode 100644 app/src/main/kotlin/io/element/android/x/intent/SafeUriHandler.kt create mode 100644 app/src/main/kotlin/io/element/android/x/oidc/DefaultOidcRedirectUrlProvider.kt create mode 100644 app/src/main/res/drawable/transparent.xml create mode 100644 app/src/main/res/resources.properties create mode 100644 app/src/main/res/values-night/themes.xml create mode 100644 app/src/main/res/values/colors.xml create mode 100644 app/src/main/res/values/themes.xml create mode 100644 app/src/main/res/xml/automotive_app_desc.xml create mode 100644 app/src/main/res/xml/backup_rules.xml create mode 100644 app/src/main/res/xml/data_extraction_rules.xml create mode 100644 app/src/main/res/xml/file_providers.xml create mode 100644 app/src/main/res/xml/locales_config.xml create mode 100644 app/src/main/res/xml/network_security_config.xml create mode 100644 app/src/test/kotlin/io/element/android/x/intent/DefaultIntentProviderTest.kt create mode 100644 app/src/test/kotlin/io/element/android/x/oidc/DefaultOidcRedirectUrlProviderTest.kt create mode 100644 appconfig/build.gradle.kts create mode 100644 appconfig/src/main/kotlin/io/element/android/appconfig/AnalyticsConfig.kt create mode 100644 appconfig/src/main/kotlin/io/element/android/appconfig/ApplicationConfig.kt create mode 100644 appconfig/src/main/kotlin/io/element/android/appconfig/AuthenticationConfig.kt create mode 100644 appconfig/src/main/kotlin/io/element/android/appconfig/ElementCallConfig.kt create mode 100644 appconfig/src/main/kotlin/io/element/android/appconfig/LearnMoreConfig.kt create mode 100644 appconfig/src/main/kotlin/io/element/android/appconfig/LockScreenConfig.kt create mode 100644 appconfig/src/main/kotlin/io/element/android/appconfig/MatrixConfiguration.kt create mode 100644 appconfig/src/main/kotlin/io/element/android/appconfig/MessageComposerConfig.kt create mode 100644 appconfig/src/main/kotlin/io/element/android/appconfig/NotificationConfig.kt create mode 100644 appconfig/src/main/kotlin/io/element/android/appconfig/OnBoardingConfig.kt create mode 100644 appconfig/src/main/kotlin/io/element/android/appconfig/PushConfig.kt create mode 100644 appconfig/src/main/kotlin/io/element/android/appconfig/RageshakeConfig.kt create mode 100644 appconfig/src/main/kotlin/io/element/android/appconfig/RoomListConfig.kt create mode 100644 appconfig/src/main/kotlin/io/element/android/appconfig/TimelineConfig.kt create mode 100644 appconfig/src/main/kotlin/io/element/android/appconfig/VoiceMessageConfig.kt create mode 100644 appicon/element/build.gradle.kts create mode 100644 appicon/element/src/debug/res/drawable/ic_launcher_background.xml create mode 100644 appicon/element/src/main/ic_launcher-playstore.png create mode 100644 appicon/element/src/main/kotlin/io/element/android/appicon/element/IconPreview.kt create mode 100644 appicon/element/src/main/res/mipmap-anydpi-v26/ic_launcher.xml create mode 100644 appicon/element/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml create mode 100644 appicon/element/src/main/res/mipmap-hdpi/ic_launcher.webp create mode 100644 appicon/element/src/main/res/mipmap-hdpi/ic_launcher_foreground.webp create mode 100644 appicon/element/src/main/res/mipmap-hdpi/ic_launcher_monochrome.webp create mode 100644 appicon/element/src/main/res/mipmap-hdpi/ic_launcher_round.webp create mode 100644 appicon/element/src/main/res/mipmap-mdpi/ic_launcher.webp create mode 100644 appicon/element/src/main/res/mipmap-mdpi/ic_launcher_foreground.webp create mode 100644 appicon/element/src/main/res/mipmap-mdpi/ic_launcher_monochrome.webp create mode 100644 appicon/element/src/main/res/mipmap-mdpi/ic_launcher_round.webp create mode 100644 appicon/element/src/main/res/mipmap-xhdpi/ic_launcher.webp create mode 100644 appicon/element/src/main/res/mipmap-xhdpi/ic_launcher_foreground.webp create mode 100644 appicon/element/src/main/res/mipmap-xhdpi/ic_launcher_monochrome.webp create mode 100644 appicon/element/src/main/res/mipmap-xhdpi/ic_launcher_round.webp create mode 100644 appicon/element/src/main/res/mipmap-xxhdpi/ic_launcher.webp create mode 100644 appicon/element/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.webp create mode 100644 appicon/element/src/main/res/mipmap-xxhdpi/ic_launcher_monochrome.webp create mode 100644 appicon/element/src/main/res/mipmap-xxhdpi/ic_launcher_round.webp create mode 100644 appicon/element/src/main/res/mipmap-xxxhdpi/ic_launcher.webp create mode 100644 appicon/element/src/main/res/mipmap-xxxhdpi/ic_launcher_foreground.webp create mode 100644 appicon/element/src/main/res/mipmap-xxxhdpi/ic_launcher_monochrome.webp create mode 100644 appicon/element/src/main/res/mipmap-xxxhdpi/ic_launcher_round.webp create mode 100644 appicon/element/src/nightly/res/drawable/ic_launcher_background.xml create mode 100644 appicon/element/src/release/res/drawable/ic_launcher_background.xml create mode 100644 appicon/enterprise/build.gradle.kts create mode 100644 appicon/enterprise/src/debug/res/drawable/ic_launcher_background_enterprise.xml create mode 100644 appicon/enterprise/src/main/kotlin/io/element/android/appicon/enterprise/IconPreview.kt create mode 100644 appicon/enterprise/src/main/res/mipmap-anydpi/ic_launcher.xml create mode 100644 appicon/enterprise/src/main/res/mipmap-anydpi/ic_launcher_round.xml create mode 100644 appicon/enterprise/src/main/res/mipmap-hdpi/ic_launcher_background_enterprise.webp create mode 100644 appicon/enterprise/src/main/res/mipmap-mdpi/ic_launcher_background_enterprise.webp create mode 100644 appicon/enterprise/src/main/res/mipmap-xhdpi/ic_launcher_background_enterprise.webp create mode 100644 appicon/enterprise/src/main/res/mipmap-xxhdpi/ic_launcher_background_enterprise.webp create mode 100644 appicon/enterprise/src/main/res/mipmap-xxhdpi/ic_launcher_foreground_enterprise.webp create mode 100644 appicon/enterprise/src/main/res/mipmap-xxxhdpi/ic_launcher_background_enterprise.webp create mode 100644 appicon/enterprise/src/nightly/res/drawable/ic_launcher_background_enterprise.xml create mode 100644 appicon/enterprise/src/release/res/drawable/ic_launcher_background_enterprise.xml create mode 100644 appnav/build.gradle.kts create mode 100644 appnav/src/main/kotlin/io/element/android/appnav/BackstackExt.kt create mode 100644 appnav/src/main/kotlin/io/element/android/appnav/LoggedInAppScopeFlowNode.kt create mode 100644 appnav/src/main/kotlin/io/element/android/appnav/LoggedInEventProcessor.kt create mode 100644 appnav/src/main/kotlin/io/element/android/appnav/LoggedInFlowNode.kt create mode 100644 appnav/src/main/kotlin/io/element/android/appnav/NotLoggedInFlowNode.kt create mode 100644 appnav/src/main/kotlin/io/element/android/appnav/RootFlowNode.kt create mode 100644 appnav/src/main/kotlin/io/element/android/appnav/di/MatrixSessionCache.kt create mode 100644 appnav/src/main/kotlin/io/element/android/appnav/di/RoomGraphFactory.kt create mode 100644 appnav/src/main/kotlin/io/element/android/appnav/di/SessionGraphFactory.kt create mode 100644 appnav/src/main/kotlin/io/element/android/appnav/di/SyncOrchestrator.kt create mode 100644 appnav/src/main/kotlin/io/element/android/appnav/di/TimelineBindings.kt create mode 100644 appnav/src/main/kotlin/io/element/android/appnav/intent/IntentResolver.kt create mode 100644 appnav/src/main/kotlin/io/element/android/appnav/loggedin/AnalyticsVerificationStateExt.kt create mode 100644 appnav/src/main/kotlin/io/element/android/appnav/loggedin/LoggedInEvents.kt create mode 100644 appnav/src/main/kotlin/io/element/android/appnav/loggedin/LoggedInNode.kt create mode 100644 appnav/src/main/kotlin/io/element/android/appnav/loggedin/LoggedInPresenter.kt create mode 100644 appnav/src/main/kotlin/io/element/android/appnav/loggedin/LoggedInState.kt create mode 100644 appnav/src/main/kotlin/io/element/android/appnav/loggedin/LoggedInStateProvider.kt create mode 100644 appnav/src/main/kotlin/io/element/android/appnav/loggedin/LoggedInView.kt create mode 100644 appnav/src/main/kotlin/io/element/android/appnav/loggedin/MediaPreviewConfigMigration.kt create mode 100644 appnav/src/main/kotlin/io/element/android/appnav/loggedin/SendQueues.kt create mode 100644 appnav/src/main/kotlin/io/element/android/appnav/loggedin/SyncStateView.kt create mode 100644 appnav/src/main/kotlin/io/element/android/appnav/room/RoomFlowNode.kt create mode 100644 appnav/src/main/kotlin/io/element/android/appnav/room/RoomNavigationTarget.kt create mode 100644 appnav/src/main/kotlin/io/element/android/appnav/room/joined/JoinedRoomFlowNode.kt create mode 100644 appnav/src/main/kotlin/io/element/android/appnav/room/joined/JoinedRoomLoadedFlowNode.kt create mode 100644 appnav/src/main/kotlin/io/element/android/appnav/room/joined/LoadingRoomNodeView.kt create mode 100644 appnav/src/main/kotlin/io/element/android/appnav/root/RootNavState.kt create mode 100644 appnav/src/main/kotlin/io/element/android/appnav/root/RootNavStateFlowFactory.kt create mode 100644 appnav/src/main/kotlin/io/element/android/appnav/root/RootPresenter.kt create mode 100644 appnav/src/main/kotlin/io/element/android/appnav/root/RootState.kt create mode 100644 appnav/src/main/kotlin/io/element/android/appnav/root/RootStateProvider.kt create mode 100644 appnav/src/main/kotlin/io/element/android/appnav/root/RootView.kt create mode 100644 appnav/src/main/res/values-be/translations.xml create mode 100644 appnav/src/main/res/values-cs/translations.xml create mode 100644 appnav/src/main/res/values-cy/translations.xml create mode 100644 appnav/src/main/res/values-da/translations.xml create mode 100644 appnav/src/main/res/values-de/translations.xml create mode 100644 appnav/src/main/res/values-el/translations.xml create mode 100644 appnav/src/main/res/values-es/translations.xml create mode 100644 appnav/src/main/res/values-et/translations.xml create mode 100644 appnav/src/main/res/values-eu/translations.xml create mode 100644 appnav/src/main/res/values-fa/translations.xml create mode 100644 appnav/src/main/res/values-fi/translations.xml create mode 100644 appnav/src/main/res/values-fr/translations.xml create mode 100644 appnav/src/main/res/values-hu/translations.xml create mode 100644 appnav/src/main/res/values-in/translations.xml create mode 100644 appnav/src/main/res/values-it/translations.xml create mode 100644 appnav/src/main/res/values-ko/translations.xml create mode 100644 appnav/src/main/res/values-nb/translations.xml create mode 100644 appnav/src/main/res/values-nl/translations.xml create mode 100644 appnav/src/main/res/values-pl/translations.xml create mode 100644 appnav/src/main/res/values-pt-rBR/translations.xml create mode 100644 appnav/src/main/res/values-pt/translations.xml create mode 100644 appnav/src/main/res/values-ro/translations.xml create mode 100644 appnav/src/main/res/values-ru/translations.xml create mode 100644 appnav/src/main/res/values-sk/translations.xml create mode 100644 appnav/src/main/res/values-sv/translations.xml create mode 100644 appnav/src/main/res/values-tr/translations.xml create mode 100644 appnav/src/main/res/values-uk/translations.xml create mode 100644 appnav/src/main/res/values-ur/translations.xml create mode 100644 appnav/src/main/res/values-uz/translations.xml create mode 100644 appnav/src/main/res/values-zh-rTW/translations.xml create mode 100644 appnav/src/main/res/values-zh/translations.xml create mode 100644 appnav/src/main/res/values/localazy.xml create mode 100644 appnav/src/test/kotlin/io/element/android/appnav/JoinedRoomLoadedFlowNodeTest.kt create mode 100644 appnav/src/test/kotlin/io/element/android/appnav/RootPresenterTest.kt create mode 100644 appnav/src/test/kotlin/io/element/android/appnav/SyncOrchestratorTest.kt create mode 100644 appnav/src/test/kotlin/io/element/android/appnav/di/MatrixSessionCacheTest.kt create mode 100644 appnav/src/test/kotlin/io/element/android/appnav/intent/IntentResolverTest.kt create mode 100644 appnav/src/test/kotlin/io/element/android/appnav/loggedin/AnalyticsVerificationStateMappingTest.kt create mode 100644 appnav/src/test/kotlin/io/element/android/appnav/loggedin/LoggedInPresenterTest.kt create mode 100644 appnav/src/test/kotlin/io/element/android/appnav/loggedin/MediaPreviewConfigMigrationTest.kt create mode 100644 appnav/src/test/kotlin/io/element/android/appnav/loggedin/SendQueuesTest.kt create mode 100644 appnav/src/test/kotlin/io/element/android/appnav/room/LoadingBaseRoomStateFlowFactoryTest.kt create mode 100644 appnav/src/test/kotlin/io/element/android/appnav/room/joined/FakeJoinedRoomLoadedFlowNodeCallback.kt create mode 100644 build.gradle.kts create mode 100644 codegen/.gitignore create mode 100644 codegen/build.gradle.kts create mode 100644 codegen/src/main/kotlin/io/element/android/codegen/ContributesNodeProcessor.kt create mode 100644 codegen/src/main/kotlin/io/element/android/codegen/ContributesNodeProcessorProvider.kt create mode 100644 codegen/src/main/resources/META-INF/services/com.google.devtools.ksp.processing.SymbolProcessorProvider create mode 100644 docs/_developer_onboarding.md create mode 100644 docs/analytics.md create mode 100644 docs/continuous_integration.md create mode 100644 docs/danger.md create mode 100644 docs/debug_proxying.md create mode 100644 docs/deeplink.md create mode 100644 docs/design.md create mode 100644 docs/images-lfs/screen_1_dark.png create mode 100644 docs/images-lfs/screen_1_light.png create mode 100644 docs/images-lfs/screen_2_dark.png create mode 100644 docs/images-lfs/screen_2_light.png create mode 100644 docs/images-lfs/screen_3_dark.png create mode 100644 docs/images-lfs/screen_3_light.png create mode 100644 docs/images-lfs/screen_4_dark.png create mode 100644 docs/images-lfs/screen_4_light.png create mode 100644 docs/images/module_graph.png create mode 100644 docs/install_from_github_release.md create mode 100644 docs/installing_from_ci.md create mode 100644 docs/integration_tests.md create mode 100644 docs/maps.md create mode 100644 docs/migration_to_metro.md create mode 100644 docs/nightly_build.md create mode 100644 docs/notifications.md create mode 100644 docs/oidc.md create mode 100644 docs/pull_request.md create mode 100644 docs/screenshot_testing.md create mode 100644 fastlane/metadata/android/en-US/changelogs/1001000.txt create mode 100644 fastlane/metadata/android/en-US/changelogs/202502000.txt create mode 100644 fastlane/metadata/android/en-US/changelogs/202503000.txt create mode 100644 fastlane/metadata/android/en-US/changelogs/202503010.txt create mode 100644 fastlane/metadata/android/en-US/changelogs/202503020.txt create mode 100644 fastlane/metadata/android/en-US/changelogs/202503030.txt create mode 100644 fastlane/metadata/android/en-US/changelogs/202503040.txt create mode 100644 fastlane/metadata/android/en-US/changelogs/202504000.txt create mode 100644 fastlane/metadata/android/en-US/changelogs/202504010.txt create mode 100644 fastlane/metadata/android/en-US/changelogs/202504020.txt create mode 100644 fastlane/metadata/android/en-US/changelogs/202504030.txt create mode 100644 fastlane/metadata/android/en-US/changelogs/202505000.txt create mode 100644 fastlane/metadata/android/en-US/changelogs/202505010.txt create mode 100644 fastlane/metadata/android/en-US/changelogs/202505030.txt create mode 100644 fastlane/metadata/android/en-US/changelogs/202505040.txt create mode 100644 fastlane/metadata/android/en-US/changelogs/202506000.txt create mode 100644 fastlane/metadata/android/en-US/changelogs/202506010.txt create mode 100644 fastlane/metadata/android/en-US/changelogs/202506020.txt create mode 100644 fastlane/metadata/android/en-US/changelogs/202506030.txt create mode 100644 fastlane/metadata/android/en-US/changelogs/202507000.txt create mode 100644 fastlane/metadata/android/en-US/changelogs/202507010.txt create mode 100644 fastlane/metadata/android/en-US/changelogs/202508000.txt create mode 100644 fastlane/metadata/android/en-US/changelogs/202508010.txt create mode 100644 fastlane/metadata/android/en-US/changelogs/202508020.txt create mode 100644 fastlane/metadata/android/en-US/changelogs/202508030.txt create mode 100644 fastlane/metadata/android/en-US/changelogs/202508040.txt create mode 100644 fastlane/metadata/android/en-US/changelogs/202509000.txt create mode 100644 fastlane/metadata/android/en-US/changelogs/202509010.txt create mode 100644 fastlane/metadata/android/en-US/changelogs/202509020.txt create mode 100644 fastlane/metadata/android/en-US/changelogs/202510000.txt create mode 100644 fastlane/metadata/android/en-US/changelogs/202510010.txt create mode 100644 fastlane/metadata/android/en-US/changelogs/202511000.txt create mode 100644 fastlane/metadata/android/en-US/changelogs/202511020.txt create mode 100644 fastlane/metadata/android/en-US/changelogs/202511030.txt create mode 100644 fastlane/metadata/android/en-US/changelogs/202512000.txt create mode 100644 fastlane/metadata/android/en-US/changelogs/40001020.txt create mode 100644 fastlane/metadata/android/en-US/changelogs/40001040.txt create mode 100644 fastlane/metadata/android/en-US/changelogs/40001050.txt create mode 100644 fastlane/metadata/android/en-US/changelogs/40001060.txt create mode 100644 fastlane/metadata/android/en-US/changelogs/40002000.txt create mode 100644 fastlane/metadata/android/en-US/changelogs/40002010.txt create mode 100644 fastlane/metadata/android/en-US/changelogs/40002020.txt create mode 100644 fastlane/metadata/android/en-US/changelogs/40002030.txt create mode 100644 fastlane/metadata/android/en-US/changelogs/40002040.txt create mode 100644 fastlane/metadata/android/en-US/changelogs/40003000.txt create mode 100644 fastlane/metadata/android/en-US/changelogs/40003010.txt create mode 100644 fastlane/metadata/android/en-US/changelogs/40003020.txt create mode 100644 fastlane/metadata/android/en-US/changelogs/40004000.txt create mode 100644 fastlane/metadata/android/en-US/changelogs/40004010.txt create mode 100644 fastlane/metadata/android/en-US/changelogs/40004020.txt create mode 100644 fastlane/metadata/android/en-US/changelogs/40004030.txt create mode 100644 fastlane/metadata/android/en-US/changelogs/40004040.txt create mode 100644 fastlane/metadata/android/en-US/changelogs/40004050.txt create mode 100644 fastlane/metadata/android/en-US/changelogs/40004060.txt create mode 100644 fastlane/metadata/android/en-US/changelogs/40004070.txt create mode 100644 fastlane/metadata/android/en-US/changelogs/40004080.txt create mode 100644 fastlane/metadata/android/en-US/changelogs/40004090.txt create mode 100644 fastlane/metadata/android/en-US/changelogs/40004100.txt create mode 100644 fastlane/metadata/android/en-US/changelogs/40004120.txt create mode 100644 fastlane/metadata/android/en-US/changelogs/40004130.txt create mode 100644 fastlane/metadata/android/en-US/changelogs/40004140.txt create mode 100644 fastlane/metadata/android/en-US/changelogs/40004150.txt create mode 100644 fastlane/metadata/android/en-US/changelogs/40004160.txt create mode 100644 fastlane/metadata/android/en-US/changelogs/40005000.txt create mode 100644 fastlane/metadata/android/en-US/changelogs/40005010.txt create mode 100644 fastlane/metadata/android/en-US/changelogs/40005020.txt create mode 100644 fastlane/metadata/android/en-US/changelogs/40005030.txt create mode 100644 fastlane/metadata/android/en-US/changelogs/40006000.txt create mode 100644 fastlane/metadata/android/en-US/changelogs/40006010.txt create mode 100644 fastlane/metadata/android/en-US/changelogs/40006020.txt create mode 100644 fastlane/metadata/android/en-US/changelogs/40006030.txt create mode 100644 fastlane/metadata/android/en-US/changelogs/40006040.txt create mode 100644 fastlane/metadata/android/en-US/changelogs/40006050.txt create mode 100644 fastlane/metadata/android/en-US/changelogs/40007000.txt create mode 100644 fastlane/metadata/android/en-US/changelogs/40007010.txt create mode 100644 fastlane/metadata/android/en-US/changelogs/40007020.txt create mode 100644 fastlane/metadata/android/en-US/changelogs/40007030.txt create mode 100644 fastlane/metadata/android/en-US/changelogs/40007040.txt create mode 100644 fastlane/metadata/android/en-US/changelogs/40007050.txt create mode 100644 fastlane/metadata/android/en-US/changelogs/40007060.txt create mode 100644 fastlane/metadata/android/en-US/full_description.txt create mode 100644 fastlane/metadata/android/en-US/images/featureGraphic.png create mode 100644 fastlane/metadata/android/en-US/images/icon.png create mode 100644 fastlane/metadata/android/en-US/images/phoneScreenshots/1.png create mode 100644 fastlane/metadata/android/en-US/images/phoneScreenshots/2.png create mode 100644 fastlane/metadata/android/en-US/images/phoneScreenshots/3.png create mode 100644 fastlane/metadata/android/en-US/images/phoneScreenshots/4.png create mode 100644 fastlane/metadata/android/en-US/images/phoneScreenshots/5.png create mode 100644 fastlane/metadata/android/en-US/short_description.txt create mode 100644 fastlane/metadata/android/en-US/title.txt create mode 100644 features/analytics/api/build.gradle.kts create mode 100644 features/analytics/api/src/main/kotlin/io/element/android/features/analytics/api/AnalyticsEntryPoint.kt create mode 100644 features/analytics/api/src/main/kotlin/io/element/android/features/analytics/api/AnalyticsOptInEvents.kt create mode 100644 features/analytics/api/src/main/kotlin/io/element/android/features/analytics/api/preferences/AnalyticsPreferencesState.kt create mode 100644 features/analytics/api/src/main/kotlin/io/element/android/features/analytics/api/preferences/AnalyticsPreferencesStateProvider.kt create mode 100644 features/analytics/api/src/main/kotlin/io/element/android/features/analytics/api/preferences/AnalyticsPreferencesView.kt create mode 100644 features/analytics/api/src/main/res/values-be/translations.xml create mode 100644 features/analytics/api/src/main/res/values-bg/translations.xml create mode 100644 features/analytics/api/src/main/res/values-cs/translations.xml create mode 100644 features/analytics/api/src/main/res/values-cy/translations.xml create mode 100644 features/analytics/api/src/main/res/values-da/translations.xml create mode 100644 features/analytics/api/src/main/res/values-de/translations.xml create mode 100644 features/analytics/api/src/main/res/values-el/translations.xml create mode 100644 features/analytics/api/src/main/res/values-es/translations.xml create mode 100644 features/analytics/api/src/main/res/values-et/translations.xml create mode 100644 features/analytics/api/src/main/res/values-eu/translations.xml create mode 100644 features/analytics/api/src/main/res/values-fa/translations.xml create mode 100644 features/analytics/api/src/main/res/values-fi/translations.xml create mode 100644 features/analytics/api/src/main/res/values-fr/translations.xml create mode 100644 features/analytics/api/src/main/res/values-hu/translations.xml create mode 100644 features/analytics/api/src/main/res/values-in/translations.xml create mode 100644 features/analytics/api/src/main/res/values-it/translations.xml create mode 100644 features/analytics/api/src/main/res/values-ka/translations.xml create mode 100644 features/analytics/api/src/main/res/values-ko/translations.xml create mode 100644 features/analytics/api/src/main/res/values-lt/translations.xml create mode 100644 features/analytics/api/src/main/res/values-nb/translations.xml create mode 100644 features/analytics/api/src/main/res/values-nl/translations.xml create mode 100644 features/analytics/api/src/main/res/values-pl/translations.xml create mode 100644 features/analytics/api/src/main/res/values-pt-rBR/translations.xml create mode 100644 features/analytics/api/src/main/res/values-pt/translations.xml create mode 100644 features/analytics/api/src/main/res/values-ro/translations.xml create mode 100644 features/analytics/api/src/main/res/values-ru/translations.xml create mode 100644 features/analytics/api/src/main/res/values-sk/translations.xml create mode 100644 features/analytics/api/src/main/res/values-sv/translations.xml create mode 100644 features/analytics/api/src/main/res/values-tr/translations.xml create mode 100644 features/analytics/api/src/main/res/values-uk/translations.xml create mode 100644 features/analytics/api/src/main/res/values-ur/translations.xml create mode 100644 features/analytics/api/src/main/res/values-uz/translations.xml create mode 100644 features/analytics/api/src/main/res/values-zh-rTW/translations.xml create mode 100644 features/analytics/api/src/main/res/values-zh/translations.xml create mode 100644 features/analytics/api/src/main/res/values/localazy.xml create mode 100644 features/analytics/impl/build.gradle.kts create mode 100644 features/analytics/impl/src/main/kotlin/io/element/android/features/analytics/impl/AnalyticsOptInNode.kt create mode 100644 features/analytics/impl/src/main/kotlin/io/element/android/features/analytics/impl/AnalyticsOptInPresenter.kt create mode 100644 features/analytics/impl/src/main/kotlin/io/element/android/features/analytics/impl/AnalyticsOptInState.kt create mode 100644 features/analytics/impl/src/main/kotlin/io/element/android/features/analytics/impl/AnalyticsOptInStateProvider.kt create mode 100644 features/analytics/impl/src/main/kotlin/io/element/android/features/analytics/impl/AnalyticsOptInView.kt create mode 100644 features/analytics/impl/src/main/kotlin/io/element/android/features/analytics/impl/DefaultAnalyticsEntryPoint.kt create mode 100644 features/analytics/impl/src/main/kotlin/io/element/android/features/analytics/impl/di/AnalyticsModule.kt create mode 100644 features/analytics/impl/src/main/kotlin/io/element/android/features/analytics/impl/preferences/AnalyticsPreferencesPresenter.kt create mode 100644 features/analytics/impl/src/main/res/values-be/translations.xml create mode 100644 features/analytics/impl/src/main/res/values-bg/translations.xml create mode 100644 features/analytics/impl/src/main/res/values-cs/translations.xml create mode 100644 features/analytics/impl/src/main/res/values-cy/translations.xml create mode 100644 features/analytics/impl/src/main/res/values-da/translations.xml create mode 100644 features/analytics/impl/src/main/res/values-de/translations.xml create mode 100644 features/analytics/impl/src/main/res/values-el/translations.xml create mode 100644 features/analytics/impl/src/main/res/values-es/translations.xml create mode 100644 features/analytics/impl/src/main/res/values-et/translations.xml create mode 100644 features/analytics/impl/src/main/res/values-eu/translations.xml create mode 100644 features/analytics/impl/src/main/res/values-fa/translations.xml create mode 100644 features/analytics/impl/src/main/res/values-fi/translations.xml create mode 100644 features/analytics/impl/src/main/res/values-fr/translations.xml create mode 100644 features/analytics/impl/src/main/res/values-hu/translations.xml create mode 100644 features/analytics/impl/src/main/res/values-in/translations.xml create mode 100644 features/analytics/impl/src/main/res/values-it/translations.xml create mode 100644 features/analytics/impl/src/main/res/values-ka/translations.xml create mode 100644 features/analytics/impl/src/main/res/values-ko/translations.xml create mode 100644 features/analytics/impl/src/main/res/values-lt/translations.xml create mode 100644 features/analytics/impl/src/main/res/values-nb/translations.xml create mode 100644 features/analytics/impl/src/main/res/values-nl/translations.xml create mode 100644 features/analytics/impl/src/main/res/values-pl/translations.xml create mode 100644 features/analytics/impl/src/main/res/values-pt-rBR/translations.xml create mode 100644 features/analytics/impl/src/main/res/values-pt/translations.xml create mode 100644 features/analytics/impl/src/main/res/values-ro/translations.xml create mode 100644 features/analytics/impl/src/main/res/values-ru/translations.xml create mode 100644 features/analytics/impl/src/main/res/values-sk/translations.xml create mode 100644 features/analytics/impl/src/main/res/values-sv/translations.xml create mode 100644 features/analytics/impl/src/main/res/values-tr/translations.xml create mode 100644 features/analytics/impl/src/main/res/values-uk/translations.xml create mode 100644 features/analytics/impl/src/main/res/values-ur/translations.xml create mode 100644 features/analytics/impl/src/main/res/values-uz/translations.xml create mode 100644 features/analytics/impl/src/main/res/values-zh-rTW/translations.xml create mode 100644 features/analytics/impl/src/main/res/values-zh/translations.xml create mode 100644 features/analytics/impl/src/main/res/values/localazy.xml create mode 100644 features/analytics/impl/src/test/kotlin/io/element/android/features/analytics/impl/AnalyticsOptInPresenterTest.kt create mode 100644 features/analytics/impl/src/test/kotlin/io/element/android/features/analytics/impl/DefaultAnalyticsEntryPointTest.kt create mode 100644 features/analytics/impl/src/test/kotlin/io/element/android/features/analytics/impl/preferences/AnalyticsPreferencesPresenterTest.kt create mode 100644 features/announcement/api/build.gradle.kts create mode 100644 features/announcement/api/src/main/kotlin/io/element/android/features/announcement/api/Announcement.kt create mode 100644 features/announcement/api/src/main/kotlin/io/element/android/features/announcement/api/AnnouncementService.kt create mode 100644 features/announcement/impl/build.gradle.kts create mode 100644 features/announcement/impl/src/main/kotlin/io/element/android/features/announcement/impl/AnnouncementPresenter.kt create mode 100644 features/announcement/impl/src/main/kotlin/io/element/android/features/announcement/impl/AnnouncementState.kt create mode 100644 features/announcement/impl/src/main/kotlin/io/element/android/features/announcement/impl/DefaultAnnouncementService.kt create mode 100644 features/announcement/impl/src/main/kotlin/io/element/android/features/announcement/impl/di/AnnouncementModule.kt create mode 100644 features/announcement/impl/src/main/kotlin/io/element/android/features/announcement/impl/spaces/SpaceAnnouncementEvents.kt create mode 100644 features/announcement/impl/src/main/kotlin/io/element/android/features/announcement/impl/spaces/SpaceAnnouncementPresenter.kt create mode 100644 features/announcement/impl/src/main/kotlin/io/element/android/features/announcement/impl/spaces/SpaceAnnouncementState.kt create mode 100644 features/announcement/impl/src/main/kotlin/io/element/android/features/announcement/impl/spaces/SpaceAnnouncementStateProvider.kt create mode 100644 features/announcement/impl/src/main/kotlin/io/element/android/features/announcement/impl/spaces/SpaceAnnouncementView.kt create mode 100644 features/announcement/impl/src/main/kotlin/io/element/android/features/announcement/impl/store/AnnouncementStatus.kt create mode 100644 features/announcement/impl/src/main/kotlin/io/element/android/features/announcement/impl/store/AnnouncementStore.kt create mode 100644 features/announcement/impl/src/main/kotlin/io/element/android/features/announcement/impl/store/DefaultAnnouncementStore.kt create mode 100644 features/announcement/impl/src/main/res/values-bg/translations.xml create mode 100644 features/announcement/impl/src/main/res/values-cs/translations.xml create mode 100644 features/announcement/impl/src/main/res/values-da/translations.xml create mode 100644 features/announcement/impl/src/main/res/values-de/translations.xml create mode 100644 features/announcement/impl/src/main/res/values-et/translations.xml create mode 100644 features/announcement/impl/src/main/res/values-fa/translations.xml create mode 100644 features/announcement/impl/src/main/res/values-fi/translations.xml create mode 100644 features/announcement/impl/src/main/res/values-fr/translations.xml create mode 100644 features/announcement/impl/src/main/res/values-hu/translations.xml create mode 100644 features/announcement/impl/src/main/res/values-it/translations.xml create mode 100644 features/announcement/impl/src/main/res/values-nb/translations.xml create mode 100644 features/announcement/impl/src/main/res/values-pl/translations.xml create mode 100644 features/announcement/impl/src/main/res/values-pt-rBR/translations.xml create mode 100644 features/announcement/impl/src/main/res/values-ro/translations.xml create mode 100644 features/announcement/impl/src/main/res/values-ru/translations.xml create mode 100644 features/announcement/impl/src/main/res/values-sk/translations.xml create mode 100644 features/announcement/impl/src/main/res/values-zh-rTW/translations.xml create mode 100644 features/announcement/impl/src/main/res/values-zh/translations.xml create mode 100644 features/announcement/impl/src/main/res/values/localazy.xml create mode 100644 features/announcement/impl/src/test/kotlin/io/element/android/features/announcement/impl/AnnouncementPresenterTest.kt create mode 100644 features/announcement/impl/src/test/kotlin/io/element/android/features/announcement/impl/DefaultAnnouncementServiceTest.kt create mode 100644 features/announcement/impl/src/test/kotlin/io/element/android/features/announcement/impl/spaces/SpaceAnnouncementPresenterTest.kt create mode 100644 features/announcement/impl/src/test/kotlin/io/element/android/features/announcement/impl/spaces/SpaceAnnouncementViewTest.kt create mode 100644 features/announcement/impl/src/test/kotlin/io/element/android/features/announcement/impl/store/InMemoryAnnouncementStore.kt create mode 100644 features/announcement/test/build.gradle.kts create mode 100644 features/announcement/test/src/main/kotlin/io/element/android/features/rageshake/test/logs/FakeAnnouncementService.kt create mode 100644 features/cachecleaner/api/build.gradle.kts create mode 100644 features/cachecleaner/api/src/main/kotlin/io/element/android/features/cachecleaner/api/CacheCleaner.kt create mode 100644 features/cachecleaner/impl/build.gradle.kts create mode 100644 features/cachecleaner/impl/src/main/kotlin/io/element/android/features/cachecleaner/impl/CacheCleanerBindings.kt create mode 100644 features/cachecleaner/impl/src/main/kotlin/io/element/android/features/cachecleaner/impl/DefaultCacheCleaner.kt create mode 100644 features/cachecleaner/impl/src/test/kotlin/io/element/android/features/cachecleaner/impl/DefaultCacheCleanerTest.kt create mode 100644 features/call/api/build.gradle.kts create mode 100644 features/call/api/src/main/kotlin/io/element/android/features/call/api/CallType.kt create mode 100644 features/call/api/src/main/kotlin/io/element/android/features/call/api/CurrentCall.kt create mode 100644 features/call/api/src/main/kotlin/io/element/android/features/call/api/CurrentCallService.kt create mode 100644 features/call/api/src/main/kotlin/io/element/android/features/call/api/ElementCallEntryPoint.kt create mode 100644 features/call/impl/build.gradle.kts create mode 100644 features/call/impl/src/main/AndroidManifest.xml create mode 100644 features/call/impl/src/main/kotlin/io/element/android/features/call/impl/DefaultElementCallEntryPoint.kt create mode 100644 features/call/impl/src/main/kotlin/io/element/android/features/call/impl/data/WidgetMessage.kt create mode 100644 features/call/impl/src/main/kotlin/io/element/android/features/call/impl/di/CallBindings.kt create mode 100644 features/call/impl/src/main/kotlin/io/element/android/features/call/impl/notifications/CallNotificationData.kt create mode 100644 features/call/impl/src/main/kotlin/io/element/android/features/call/impl/notifications/RingingCallNotificationCreator.kt create mode 100644 features/call/impl/src/main/kotlin/io/element/android/features/call/impl/pip/PictureInPictureEvents.kt create mode 100644 features/call/impl/src/main/kotlin/io/element/android/features/call/impl/pip/PictureInPicturePresenter.kt create mode 100644 features/call/impl/src/main/kotlin/io/element/android/features/call/impl/pip/PictureInPictureState.kt create mode 100644 features/call/impl/src/main/kotlin/io/element/android/features/call/impl/pip/PictureInPictureStateProvider.kt create mode 100644 features/call/impl/src/main/kotlin/io/element/android/features/call/impl/pip/PipSupportProvider.kt create mode 100644 features/call/impl/src/main/kotlin/io/element/android/features/call/impl/pip/PipView.kt create mode 100644 features/call/impl/src/main/kotlin/io/element/android/features/call/impl/receivers/DeclineCallBroadcastReceiver.kt create mode 100644 features/call/impl/src/main/kotlin/io/element/android/features/call/impl/services/CallForegroundService.kt create mode 100644 features/call/impl/src/main/kotlin/io/element/android/features/call/impl/ui/CallScreenEvents.kt create mode 100644 features/call/impl/src/main/kotlin/io/element/android/features/call/impl/ui/CallScreenPresenter.kt create mode 100644 features/call/impl/src/main/kotlin/io/element/android/features/call/impl/ui/CallScreenState.kt create mode 100644 features/call/impl/src/main/kotlin/io/element/android/features/call/impl/ui/CallScreenStateProvider.kt create mode 100644 features/call/impl/src/main/kotlin/io/element/android/features/call/impl/ui/CallScreenView.kt create mode 100644 features/call/impl/src/main/kotlin/io/element/android/features/call/impl/ui/CallTypeExtension.kt create mode 100644 features/call/impl/src/main/kotlin/io/element/android/features/call/impl/ui/ElementCallActivity.kt create mode 100644 features/call/impl/src/main/kotlin/io/element/android/features/call/impl/ui/IncomingCallActivity.kt create mode 100644 features/call/impl/src/main/kotlin/io/element/android/features/call/impl/ui/IncomingCallScreen.kt create mode 100644 features/call/impl/src/main/kotlin/io/element/android/features/call/impl/ui/LanguageTagProvider.kt create mode 100644 features/call/impl/src/main/kotlin/io/element/android/features/call/impl/utils/ActiveCallManager.kt create mode 100644 features/call/impl/src/main/kotlin/io/element/android/features/call/impl/utils/CallIntentDataParser.kt create mode 100644 features/call/impl/src/main/kotlin/io/element/android/features/call/impl/utils/CallWidgetProvider.kt create mode 100644 features/call/impl/src/main/kotlin/io/element/android/features/call/impl/utils/DefaultCallAnalyticCredentialsProvider.kt create mode 100644 features/call/impl/src/main/kotlin/io/element/android/features/call/impl/utils/DefaultCallWidgetProvider.kt create mode 100644 features/call/impl/src/main/kotlin/io/element/android/features/call/impl/utils/DefaultCurrentCallService.kt create mode 100644 features/call/impl/src/main/kotlin/io/element/android/features/call/impl/utils/IntentProvider.kt create mode 100644 features/call/impl/src/main/kotlin/io/element/android/features/call/impl/utils/PipController.kt create mode 100644 features/call/impl/src/main/kotlin/io/element/android/features/call/impl/utils/WebViewAudioManager.kt create mode 100644 features/call/impl/src/main/kotlin/io/element/android/features/call/impl/utils/WebViewPipController.kt create mode 100644 features/call/impl/src/main/kotlin/io/element/android/features/call/impl/utils/WebViewWidgetMessageInterceptor.kt create mode 100644 features/call/impl/src/main/kotlin/io/element/android/features/call/impl/utils/WidgetMessageInterceptor.kt create mode 100644 features/call/impl/src/main/kotlin/io/element/android/features/call/impl/utils/WidgetMessageSerializer.kt create mode 100644 features/call/impl/src/main/res/values-be/translations.xml create mode 100644 features/call/impl/src/main/res/values-cs/translations.xml create mode 100644 features/call/impl/src/main/res/values-cy/translations.xml create mode 100644 features/call/impl/src/main/res/values-da/translations.xml create mode 100644 features/call/impl/src/main/res/values-de/translations.xml create mode 100644 features/call/impl/src/main/res/values-el/translations.xml create mode 100644 features/call/impl/src/main/res/values-es/translations.xml create mode 100644 features/call/impl/src/main/res/values-et/translations.xml create mode 100644 features/call/impl/src/main/res/values-eu/translations.xml create mode 100644 features/call/impl/src/main/res/values-fa/translations.xml create mode 100644 features/call/impl/src/main/res/values-fi/translations.xml create mode 100644 features/call/impl/src/main/res/values-fr/translations.xml create mode 100644 features/call/impl/src/main/res/values-hu/translations.xml create mode 100644 features/call/impl/src/main/res/values-in/translations.xml create mode 100644 features/call/impl/src/main/res/values-it/translations.xml create mode 100644 features/call/impl/src/main/res/values-ka/translations.xml create mode 100644 features/call/impl/src/main/res/values-ko/translations.xml create mode 100644 features/call/impl/src/main/res/values-nb/translations.xml create mode 100644 features/call/impl/src/main/res/values-nl/translations.xml create mode 100644 features/call/impl/src/main/res/values-pl/translations.xml create mode 100644 features/call/impl/src/main/res/values-pt-rBR/translations.xml create mode 100644 features/call/impl/src/main/res/values-pt/translations.xml create mode 100644 features/call/impl/src/main/res/values-ro/translations.xml create mode 100644 features/call/impl/src/main/res/values-ru/translations.xml create mode 100644 features/call/impl/src/main/res/values-sk/translations.xml create mode 100644 features/call/impl/src/main/res/values-sv/translations.xml create mode 100644 features/call/impl/src/main/res/values-tr/translations.xml create mode 100644 features/call/impl/src/main/res/values-uk/translations.xml create mode 100644 features/call/impl/src/main/res/values-ur/translations.xml create mode 100644 features/call/impl/src/main/res/values-uz/translations.xml create mode 100644 features/call/impl/src/main/res/values-zh-rTW/translations.xml create mode 100644 features/call/impl/src/main/res/values-zh/translations.xml create mode 100644 features/call/impl/src/main/res/values/do_not_translate.xml create mode 100644 features/call/impl/src/main/res/values/localazy.xml create mode 100644 features/call/impl/src/test/kotlin/io/element/android/features/call/DefaultElementCallEntryPointTest.kt create mode 100644 features/call/impl/src/test/kotlin/io/element/android/features/call/MapWebkitPermissionsTest.kt create mode 100644 features/call/impl/src/test/kotlin/io/element/android/features/call/impl/pip/FakePipController.kt create mode 100644 features/call/impl/src/test/kotlin/io/element/android/features/call/impl/pip/FakePipSupportProvider.kt create mode 100644 features/call/impl/src/test/kotlin/io/element/android/features/call/impl/pip/FakePipView.kt create mode 100644 features/call/impl/src/test/kotlin/io/element/android/features/call/impl/pip/PictureInPicturePresenterTest.kt create mode 100644 features/call/impl/src/test/kotlin/io/element/android/features/call/notifications/RingingCallNotificationCreatorTest.kt create mode 100644 features/call/impl/src/test/kotlin/io/element/android/features/call/ui/CallScreenPresenterTest.kt create mode 100644 features/call/impl/src/test/kotlin/io/element/android/features/call/ui/CallTypeTest.kt create mode 100644 features/call/impl/src/test/kotlin/io/element/android/features/call/ui/FakeCallScreenNavigator.kt create mode 100644 features/call/impl/src/test/kotlin/io/element/android/features/call/ui/FakeLanguageTagProvider.kt create mode 100644 features/call/impl/src/test/kotlin/io/element/android/features/call/utils/CallIntentDataParserTest.kt create mode 100644 features/call/impl/src/test/kotlin/io/element/android/features/call/utils/DefaultActiveCallManagerTest.kt create mode 100644 features/call/impl/src/test/kotlin/io/element/android/features/call/utils/DefaultCallWidgetProviderTest.kt create mode 100644 features/call/impl/src/test/kotlin/io/element/android/features/call/utils/FakeActiveCallManager.kt create mode 100644 features/call/impl/src/test/kotlin/io/element/android/features/call/utils/FakeCallWidgetProvider.kt create mode 100644 features/call/impl/src/test/kotlin/io/element/android/features/call/utils/FakeWidgetMessageInterceptor.kt create mode 100644 features/call/test/build.gradle.kts create mode 100644 features/call/test/src/main/kotlin/io/element/android/features/call/test/CallNotificationData.kt create mode 100644 features/call/test/src/main/kotlin/io/element/android/features/call/test/FakeCurrentCallService.kt create mode 100644 features/call/test/src/main/kotlin/io/element/android/features/call/test/FakeElementCallEntryPoint.kt create mode 100644 features/createroom/api/build.gradle.kts create mode 100644 features/createroom/api/src/main/kotlin/io/element/android/features/createroom/api/CreateRoomEntryPoint.kt create mode 100644 features/createroom/impl/build.gradle.kts create mode 100644 features/createroom/impl/src/main/kotlin/io/element/android/features/createroom/impl/CreateRoomFlowNode.kt create mode 100644 features/createroom/impl/src/main/kotlin/io/element/android/features/createroom/impl/DefaultCreateRoomEntryPoint.kt create mode 100644 features/createroom/impl/src/main/kotlin/io/element/android/features/createroom/impl/addpeople/AddPeopleNode.kt create mode 100644 features/createroom/impl/src/main/kotlin/io/element/android/features/createroom/impl/addpeople/AddPeopleView.kt create mode 100644 features/createroom/impl/src/main/kotlin/io/element/android/features/createroom/impl/configureroom/ConfigureRoomEvents.kt create mode 100644 features/createroom/impl/src/main/kotlin/io/element/android/features/createroom/impl/configureroom/ConfigureRoomNode.kt create mode 100644 features/createroom/impl/src/main/kotlin/io/element/android/features/createroom/impl/configureroom/ConfigureRoomPresenter.kt create mode 100644 features/createroom/impl/src/main/kotlin/io/element/android/features/createroom/impl/configureroom/ConfigureRoomState.kt create mode 100644 features/createroom/impl/src/main/kotlin/io/element/android/features/createroom/impl/configureroom/ConfigureRoomStateProvider.kt create mode 100644 features/createroom/impl/src/main/kotlin/io/element/android/features/createroom/impl/configureroom/ConfigureRoomView.kt create mode 100644 features/createroom/impl/src/main/kotlin/io/element/android/features/createroom/impl/configureroom/CreateRoomConfig.kt create mode 100644 features/createroom/impl/src/main/kotlin/io/element/android/features/createroom/impl/configureroom/CreateRoomConfigStore.kt create mode 100644 features/createroom/impl/src/main/kotlin/io/element/android/features/createroom/impl/configureroom/RoomAccess.kt create mode 100644 features/createroom/impl/src/main/kotlin/io/element/android/features/createroom/impl/configureroom/RoomAccessItem.kt create mode 100644 features/createroom/impl/src/main/kotlin/io/element/android/features/createroom/impl/configureroom/RoomAddress.kt create mode 100644 features/createroom/impl/src/main/kotlin/io/element/android/features/createroom/impl/configureroom/RoomVisibilityItem.kt create mode 100644 features/createroom/impl/src/main/kotlin/io/element/android/features/createroom/impl/configureroom/RoomVisibilityState.kt create mode 100644 features/createroom/impl/src/main/res/values-be/translations.xml create mode 100644 features/createroom/impl/src/main/res/values-bg/translations.xml create mode 100644 features/createroom/impl/src/main/res/values-cs/translations.xml create mode 100644 features/createroom/impl/src/main/res/values-cy/translations.xml create mode 100644 features/createroom/impl/src/main/res/values-da/translations.xml create mode 100644 features/createroom/impl/src/main/res/values-de/translations.xml create mode 100644 features/createroom/impl/src/main/res/values-el/translations.xml create mode 100644 features/createroom/impl/src/main/res/values-es/translations.xml create mode 100644 features/createroom/impl/src/main/res/values-et/translations.xml create mode 100644 features/createroom/impl/src/main/res/values-eu/translations.xml create mode 100644 features/createroom/impl/src/main/res/values-fa/translations.xml create mode 100644 features/createroom/impl/src/main/res/values-fi/translations.xml create mode 100644 features/createroom/impl/src/main/res/values-fr/translations.xml create mode 100644 features/createroom/impl/src/main/res/values-hu/translations.xml create mode 100644 features/createroom/impl/src/main/res/values-in/translations.xml create mode 100644 features/createroom/impl/src/main/res/values-it/translations.xml create mode 100644 features/createroom/impl/src/main/res/values-ka/translations.xml create mode 100644 features/createroom/impl/src/main/res/values-ko/translations.xml create mode 100644 features/createroom/impl/src/main/res/values-lt/translations.xml create mode 100644 features/createroom/impl/src/main/res/values-nb/translations.xml create mode 100644 features/createroom/impl/src/main/res/values-nl/translations.xml create mode 100644 features/createroom/impl/src/main/res/values-pl/translations.xml create mode 100644 features/createroom/impl/src/main/res/values-pt-rBR/translations.xml create mode 100644 features/createroom/impl/src/main/res/values-pt/translations.xml create mode 100644 features/createroom/impl/src/main/res/values-ro/translations.xml create mode 100644 features/createroom/impl/src/main/res/values-ru/translations.xml create mode 100644 features/createroom/impl/src/main/res/values-sk/translations.xml create mode 100644 features/createroom/impl/src/main/res/values-sv/translations.xml create mode 100644 features/createroom/impl/src/main/res/values-tr/translations.xml create mode 100644 features/createroom/impl/src/main/res/values-uk/translations.xml create mode 100644 features/createroom/impl/src/main/res/values-ur/translations.xml create mode 100644 features/createroom/impl/src/main/res/values-uz/translations.xml create mode 100644 features/createroom/impl/src/main/res/values-zh-rTW/translations.xml create mode 100644 features/createroom/impl/src/main/res/values-zh/translations.xml create mode 100644 features/createroom/impl/src/main/res/values/localazy.xml create mode 100644 features/createroom/impl/src/test/kotlin/io/element/android/features/createroom/impl/DefaultCreateRoomEntryPointTest.kt create mode 100644 features/createroom/impl/src/test/kotlin/io/element/android/features/startchat/impl/configureroom/ConfigureRoomPresenterTest.kt create mode 100644 features/createroom/test/build.gradle.kts create mode 100644 features/createroom/test/src/main/kotlin/io/element/android/features/createroom/api/FakeCreateRoomEntryPoint.kt create mode 100644 features/deactivation/api/build.gradle.kts create mode 100644 features/deactivation/api/src/main/kotlin/io/element/android/features/deactivation/api/AccountDeactivationEntryPoint.kt create mode 100644 features/deactivation/impl/build.gradle.kts create mode 100644 features/deactivation/impl/src/main/kotlin/io/element/android/features/logout/impl/AccountDeactivationEvents.kt create mode 100644 features/deactivation/impl/src/main/kotlin/io/element/android/features/logout/impl/AccountDeactivationNode.kt create mode 100644 features/deactivation/impl/src/main/kotlin/io/element/android/features/logout/impl/AccountDeactivationPresenter.kt create mode 100644 features/deactivation/impl/src/main/kotlin/io/element/android/features/logout/impl/AccountDeactivationState.kt create mode 100644 features/deactivation/impl/src/main/kotlin/io/element/android/features/logout/impl/AccountDeactivationStateProvider.kt create mode 100644 features/deactivation/impl/src/main/kotlin/io/element/android/features/logout/impl/AccountDeactivationView.kt create mode 100644 features/deactivation/impl/src/main/kotlin/io/element/android/features/logout/impl/DefaultAccountDeactivationEntryPoint.kt create mode 100644 features/deactivation/impl/src/main/kotlin/io/element/android/features/logout/impl/ui/AccountDeactivationActionDialog.kt create mode 100644 features/deactivation/impl/src/main/kotlin/io/element/android/features/logout/impl/ui/AccountDeactivationConfirmationDialog.kt create mode 100644 features/deactivation/impl/src/main/res/values-be/translations.xml create mode 100644 features/deactivation/impl/src/main/res/values-bg/translations.xml create mode 100644 features/deactivation/impl/src/main/res/values-cs/translations.xml create mode 100644 features/deactivation/impl/src/main/res/values-cy/translations.xml create mode 100644 features/deactivation/impl/src/main/res/values-da/translations.xml create mode 100644 features/deactivation/impl/src/main/res/values-de/translations.xml create mode 100644 features/deactivation/impl/src/main/res/values-el/translations.xml create mode 100644 features/deactivation/impl/src/main/res/values-es/translations.xml create mode 100644 features/deactivation/impl/src/main/res/values-et/translations.xml create mode 100644 features/deactivation/impl/src/main/res/values-eu/translations.xml create mode 100644 features/deactivation/impl/src/main/res/values-fa/translations.xml create mode 100644 features/deactivation/impl/src/main/res/values-fi/translations.xml create mode 100644 features/deactivation/impl/src/main/res/values-fr/translations.xml create mode 100644 features/deactivation/impl/src/main/res/values-hu/translations.xml create mode 100644 features/deactivation/impl/src/main/res/values-in/translations.xml create mode 100644 features/deactivation/impl/src/main/res/values-it/translations.xml create mode 100644 features/deactivation/impl/src/main/res/values-ko/translations.xml create mode 100644 features/deactivation/impl/src/main/res/values-nb/translations.xml create mode 100644 features/deactivation/impl/src/main/res/values-nl/translations.xml create mode 100644 features/deactivation/impl/src/main/res/values-pl/translations.xml create mode 100644 features/deactivation/impl/src/main/res/values-pt-rBR/translations.xml create mode 100644 features/deactivation/impl/src/main/res/values-pt/translations.xml create mode 100644 features/deactivation/impl/src/main/res/values-ro/translations.xml create mode 100644 features/deactivation/impl/src/main/res/values-ru/translations.xml create mode 100644 features/deactivation/impl/src/main/res/values-sk/translations.xml create mode 100644 features/deactivation/impl/src/main/res/values-sv/translations.xml create mode 100644 features/deactivation/impl/src/main/res/values-tr/translations.xml create mode 100644 features/deactivation/impl/src/main/res/values-uk/translations.xml create mode 100644 features/deactivation/impl/src/main/res/values-ur/translations.xml create mode 100644 features/deactivation/impl/src/main/res/values-uz/translations.xml create mode 100644 features/deactivation/impl/src/main/res/values-zh-rTW/translations.xml create mode 100644 features/deactivation/impl/src/main/res/values-zh/translations.xml create mode 100644 features/deactivation/impl/src/main/res/values/localazy.xml create mode 100644 features/deactivation/impl/src/test/kotlin/io/element/android/features/logout/impl/AccountDeactivationPresenterTest.kt create mode 100644 features/deactivation/impl/src/test/kotlin/io/element/android/features/logout/impl/AccountDeactivationViewTest.kt create mode 100644 features/deactivation/impl/src/test/kotlin/io/element/android/features/logout/impl/DefaultAccountDeactivationEntryPointTest.kt create mode 100644 features/deactivation/test/build.gradle.kts create mode 100644 features/deactivation/test/src/main/kotlin/io/element/android/features/deactivation/test/FakeAccountDeactivationEntryPoint.kt create mode 100644 features/enterprise/api/build.gradle.kts create mode 100644 features/enterprise/api/src/main/kotlin/io/element/android/features/enterprise/api/BugReportUrl.kt create mode 100644 features/enterprise/api/src/main/kotlin/io/element/android/features/enterprise/api/EnterpriseService.kt create mode 100644 features/enterprise/api/src/main/kotlin/io/element/android/features/enterprise/api/SessionEnterpriseService.kt create mode 100644 features/enterprise/impl-foss/build.gradle.kts create mode 100644 features/enterprise/impl-foss/src/main/kotlin/io/element/android/features/enterprise/impl/DefaultEnterpriseService.kt create mode 100644 features/enterprise/impl-foss/src/main/kotlin/io/element/android/features/enterprise/impl/DefaultSessionEnterpriseService.kt create mode 100644 features/enterprise/impl-foss/src/test/kotlin/io/element/android/features/enterprise/impl/DefaultEnterpriseServiceTest.kt create mode 100644 features/enterprise/impl-foss/src/test/kotlin/io/element/android/features/enterprise/impl/DefaultSessionEnterpriseServiceTest.kt create mode 100644 features/enterprise/test/build.gradle.kts create mode 100644 features/enterprise/test/src/main/kotlin/io/element/android/features/enterprise/test/FakeEnterpriseService.kt create mode 100644 features/enterprise/test/src/main/kotlin/io/element/android/features/enterprise/test/FakeSessionEnterpriseService.kt create mode 100644 features/forward/api/build.gradle.kts create mode 100644 features/forward/api/src/main/kotlin/io/element/android/features/forward/api/ForwardEntryPoint.kt create mode 100644 features/forward/impl/build.gradle.kts create mode 100644 features/forward/impl/src/main/kotlin/io/element/android/features/forward/impl/DefaultForwardEntryPoint.kt create mode 100644 features/forward/impl/src/main/kotlin/io/element/android/features/forward/impl/ForwardMessagesEvents.kt create mode 100644 features/forward/impl/src/main/kotlin/io/element/android/features/forward/impl/ForwardMessagesNode.kt create mode 100644 features/forward/impl/src/main/kotlin/io/element/android/features/forward/impl/ForwardMessagesPresenter.kt create mode 100644 features/forward/impl/src/main/kotlin/io/element/android/features/forward/impl/ForwardMessagesState.kt create mode 100644 features/forward/impl/src/main/kotlin/io/element/android/features/forward/impl/ForwardMessagesStateProvider.kt create mode 100644 features/forward/impl/src/main/kotlin/io/element/android/features/forward/impl/ForwardMessagesView.kt create mode 100644 features/forward/impl/src/test/kotlin/io/element/android/features/forward/impl/DefaultForwardEntryPointTest.kt create mode 100644 features/forward/impl/src/test/kotlin/io/element/android/features/forward/impl/ForwardMessagesPresenterTest.kt create mode 100644 features/forward/impl/src/test/kotlin/io/element/android/features/forward/impl/ForwardMessagesViewTest.kt create mode 100644 features/forward/test/build.gradle.kts create mode 100644 features/forward/test/src/main/kotlin/io/element/android/features/forward/test/FakeForwardEntryPoint.kt create mode 100644 features/ftue/api/build.gradle.kts create mode 100644 features/ftue/api/src/main/kotlin/io/element/android/features/ftue/api/FtueEntryPoint.kt create mode 100644 features/ftue/api/src/main/kotlin/io/element/android/features/ftue/api/state/FtueService.kt create mode 100644 features/ftue/impl/build.gradle.kts create mode 100644 features/ftue/impl/src/main/kotlin/io/element/android/features/ftue/impl/DefaultFtueEntryPoint.kt create mode 100644 features/ftue/impl/src/main/kotlin/io/element/android/features/ftue/impl/FtueFlowNode.kt create mode 100644 features/ftue/impl/src/main/kotlin/io/element/android/features/ftue/impl/di/FtueModule.kt create mode 100644 features/ftue/impl/src/main/kotlin/io/element/android/features/ftue/impl/notifications/NotificationsOptInEvents.kt create mode 100644 features/ftue/impl/src/main/kotlin/io/element/android/features/ftue/impl/notifications/NotificationsOptInNode.kt create mode 100644 features/ftue/impl/src/main/kotlin/io/element/android/features/ftue/impl/notifications/NotificationsOptInPresenter.kt create mode 100644 features/ftue/impl/src/main/kotlin/io/element/android/features/ftue/impl/notifications/NotificationsOptInState.kt create mode 100644 features/ftue/impl/src/main/kotlin/io/element/android/features/ftue/impl/notifications/NotificationsOptInStateProvider.kt create mode 100644 features/ftue/impl/src/main/kotlin/io/element/android/features/ftue/impl/notifications/NotificationsOptInView.kt create mode 100644 features/ftue/impl/src/main/kotlin/io/element/android/features/ftue/impl/sessionverification/FtueSessionVerificationFlowNode.kt create mode 100644 features/ftue/impl/src/main/kotlin/io/element/android/features/ftue/impl/sessionverification/choosemode/ChooseSelfVerificationModeEvent.kt create mode 100644 features/ftue/impl/src/main/kotlin/io/element/android/features/ftue/impl/sessionverification/choosemode/ChooseSelfVerificationModeNode.kt create mode 100644 features/ftue/impl/src/main/kotlin/io/element/android/features/ftue/impl/sessionverification/choosemode/ChooseSelfVerificationModePresenter.kt create mode 100644 features/ftue/impl/src/main/kotlin/io/element/android/features/ftue/impl/sessionverification/choosemode/ChooseSelfVerificationModeState.kt create mode 100644 features/ftue/impl/src/main/kotlin/io/element/android/features/ftue/impl/sessionverification/choosemode/ChooseSelfVerificationModeStateProvider.kt create mode 100644 features/ftue/impl/src/main/kotlin/io/element/android/features/ftue/impl/sessionverification/choosemode/ChooseSelfVerificationModeView.kt create mode 100644 features/ftue/impl/src/main/kotlin/io/element/android/features/ftue/impl/state/DefaultFtueService.kt create mode 100644 features/ftue/impl/src/main/kotlin/io/element/android/features/ftue/impl/state/InternalFtueState.kt create mode 100644 features/ftue/impl/src/main/res/values-be/translations.xml create mode 100644 features/ftue/impl/src/main/res/values-bg/translations.xml create mode 100644 features/ftue/impl/src/main/res/values-cs/translations.xml create mode 100644 features/ftue/impl/src/main/res/values-cy/translations.xml create mode 100644 features/ftue/impl/src/main/res/values-da/translations.xml create mode 100644 features/ftue/impl/src/main/res/values-de/translations.xml create mode 100644 features/ftue/impl/src/main/res/values-el/translations.xml create mode 100644 features/ftue/impl/src/main/res/values-es/translations.xml create mode 100644 features/ftue/impl/src/main/res/values-et/translations.xml create mode 100644 features/ftue/impl/src/main/res/values-eu/translations.xml create mode 100644 features/ftue/impl/src/main/res/values-fa/translations.xml create mode 100644 features/ftue/impl/src/main/res/values-fi/translations.xml create mode 100644 features/ftue/impl/src/main/res/values-fr/translations.xml create mode 100644 features/ftue/impl/src/main/res/values-hu/translations.xml create mode 100644 features/ftue/impl/src/main/res/values-in/translations.xml create mode 100644 features/ftue/impl/src/main/res/values-it/translations.xml create mode 100644 features/ftue/impl/src/main/res/values-ka/translations.xml create mode 100644 features/ftue/impl/src/main/res/values-ko/translations.xml create mode 100644 features/ftue/impl/src/main/res/values-nb/translations.xml create mode 100644 features/ftue/impl/src/main/res/values-nl/translations.xml create mode 100644 features/ftue/impl/src/main/res/values-pl/translations.xml create mode 100644 features/ftue/impl/src/main/res/values-pt-rBR/translations.xml create mode 100644 features/ftue/impl/src/main/res/values-pt/translations.xml create mode 100644 features/ftue/impl/src/main/res/values-ro/translations.xml create mode 100644 features/ftue/impl/src/main/res/values-ru/translations.xml create mode 100644 features/ftue/impl/src/main/res/values-sk/translations.xml create mode 100644 features/ftue/impl/src/main/res/values-sv/translations.xml create mode 100644 features/ftue/impl/src/main/res/values-tr/translations.xml create mode 100644 features/ftue/impl/src/main/res/values-uk/translations.xml create mode 100644 features/ftue/impl/src/main/res/values-ur/translations.xml create mode 100644 features/ftue/impl/src/main/res/values-uz/translations.xml create mode 100644 features/ftue/impl/src/main/res/values-zh-rTW/translations.xml create mode 100644 features/ftue/impl/src/main/res/values-zh/translations.xml create mode 100644 features/ftue/impl/src/main/res/values/localazy.xml create mode 100644 features/ftue/impl/src/test/kotlin/io/element/android/features/ftue/impl/DefaultFtueEntryPointTest.kt create mode 100644 features/ftue/impl/src/test/kotlin/io/element/android/features/ftue/impl/DefaultFtueServiceTest.kt create mode 100644 features/ftue/impl/src/test/kotlin/io/element/android/features/ftue/impl/notifications/NotificationsOptInPresenterTest.kt create mode 100644 features/ftue/impl/src/test/kotlin/io/element/android/features/ftue/impl/sessionverification/choosemode/ChooseSessionVerificationModePresenterTest.kt create mode 100644 features/ftue/impl/src/test/kotlin/io/element/android/features/ftue/impl/sessionverification/choosemode/ChooseSessionVerificationModeViewTest.kt create mode 100644 features/ftue/test/build.gradle.kts create mode 100644 features/ftue/test/src/main/kotlin/io/element/android/features/ftue/test/FakeFtueService.kt create mode 100644 features/home/api/build.gradle.kts create mode 100644 features/home/api/src/main/kotlin/io/element/android/features/home/api/HomeEntryPoint.kt create mode 100644 features/home/impl/build.gradle.kts create mode 100644 features/home/impl/src/main/kotlin/io/element/android/features/home/impl/CurrentUserWithNeighborsBuilder.kt create mode 100644 features/home/impl/src/main/kotlin/io/element/android/features/home/impl/DefaultHomeEntryPoint.kt create mode 100644 features/home/impl/src/main/kotlin/io/element/android/features/home/impl/HomeEvents.kt create mode 100644 features/home/impl/src/main/kotlin/io/element/android/features/home/impl/HomeFlowNode.kt create mode 100644 features/home/impl/src/main/kotlin/io/element/android/features/home/impl/HomeNavigationBarItem.kt create mode 100644 features/home/impl/src/main/kotlin/io/element/android/features/home/impl/HomePresenter.kt create mode 100644 features/home/impl/src/main/kotlin/io/element/android/features/home/impl/HomeState.kt create mode 100644 features/home/impl/src/main/kotlin/io/element/android/features/home/impl/HomeStateProvider.kt create mode 100644 features/home/impl/src/main/kotlin/io/element/android/features/home/impl/HomeView.kt create mode 100644 features/home/impl/src/main/kotlin/io/element/android/features/home/impl/components/BannerPadding.kt create mode 100644 features/home/impl/src/main/kotlin/io/element/android/features/home/impl/components/BatteryOptimizationBanner.kt create mode 100644 features/home/impl/src/main/kotlin/io/element/android/features/home/impl/components/ConfirmRecoveryKeyBanner.kt create mode 100644 features/home/impl/src/main/kotlin/io/element/android/features/home/impl/components/FullScreenIntentPermissionBanner.kt create mode 100644 features/home/impl/src/main/kotlin/io/element/android/features/home/impl/components/HomeTopBar.kt create mode 100644 features/home/impl/src/main/kotlin/io/element/android/features/home/impl/components/NewNotificationSoundBanner.kt create mode 100644 features/home/impl/src/main/kotlin/io/element/android/features/home/impl/components/RoomListContentView.kt create mode 100644 features/home/impl/src/main/kotlin/io/element/android/features/home/impl/components/RoomListMenuAction.kt create mode 100644 features/home/impl/src/main/kotlin/io/element/android/features/home/impl/components/RoomSummaryPlaceholderRow.kt create mode 100644 features/home/impl/src/main/kotlin/io/element/android/features/home/impl/components/RoomSummaryRow.kt create mode 100644 features/home/impl/src/main/kotlin/io/element/android/features/home/impl/components/SetUpRecoveryKeyBanner.kt create mode 100644 features/home/impl/src/main/kotlin/io/element/android/features/home/impl/datasource/RoomListDataSource.kt create mode 100644 features/home/impl/src/main/kotlin/io/element/android/features/home/impl/datasource/RoomListRoomSummaryFactory.kt create mode 100644 features/home/impl/src/main/kotlin/io/element/android/features/home/impl/di/HomeSpacesModule.kt create mode 100644 features/home/impl/src/main/kotlin/io/element/android/features/home/impl/di/RoomListModule.kt create mode 100644 features/home/impl/src/main/kotlin/io/element/android/features/home/impl/filters/RoomListFilter.kt create mode 100644 features/home/impl/src/main/kotlin/io/element/android/features/home/impl/filters/RoomListFiltersEmptyStateResources.kt create mode 100644 features/home/impl/src/main/kotlin/io/element/android/features/home/impl/filters/RoomListFiltersEvents.kt create mode 100644 features/home/impl/src/main/kotlin/io/element/android/features/home/impl/filters/RoomListFiltersPresenter.kt create mode 100644 features/home/impl/src/main/kotlin/io/element/android/features/home/impl/filters/RoomListFiltersState.kt create mode 100644 features/home/impl/src/main/kotlin/io/element/android/features/home/impl/filters/RoomListFiltersStateProvider.kt create mode 100644 features/home/impl/src/main/kotlin/io/element/android/features/home/impl/filters/RoomListFiltersView.kt create mode 100644 features/home/impl/src/main/kotlin/io/element/android/features/home/impl/filters/selection/DefaultFilterSelectionStrategy.kt create mode 100644 features/home/impl/src/main/kotlin/io/element/android/features/home/impl/filters/selection/FilterSelectionState.kt create mode 100644 features/home/impl/src/main/kotlin/io/element/android/features/home/impl/filters/selection/FilterSelectionStrategy.kt create mode 100644 features/home/impl/src/main/kotlin/io/element/android/features/home/impl/model/LatestEvent.kt create mode 100644 features/home/impl/src/main/kotlin/io/element/android/features/home/impl/model/RoomListRoomSummary.kt create mode 100644 features/home/impl/src/main/kotlin/io/element/android/features/home/impl/model/RoomListRoomSummaryProvider.kt create mode 100644 features/home/impl/src/main/kotlin/io/element/android/features/home/impl/model/RoomSummaryDisplayType.kt create mode 100644 features/home/impl/src/main/kotlin/io/element/android/features/home/impl/roomlist/RoomListContentStateProvider.kt create mode 100644 features/home/impl/src/main/kotlin/io/element/android/features/home/impl/roomlist/RoomListContextMenu.kt create mode 100644 features/home/impl/src/main/kotlin/io/element/android/features/home/impl/roomlist/RoomListDeclineInviteMenu.kt create mode 100644 features/home/impl/src/main/kotlin/io/element/android/features/home/impl/roomlist/RoomListEvents.kt create mode 100644 features/home/impl/src/main/kotlin/io/element/android/features/home/impl/roomlist/RoomListPresenter.kt create mode 100644 features/home/impl/src/main/kotlin/io/element/android/features/home/impl/roomlist/RoomListState.kt create mode 100644 features/home/impl/src/main/kotlin/io/element/android/features/home/impl/roomlist/RoomListStateContextMenuShownProvider.kt create mode 100644 features/home/impl/src/main/kotlin/io/element/android/features/home/impl/roomlist/RoomListStateProvider.kt create mode 100644 features/home/impl/src/main/kotlin/io/element/android/features/home/impl/search/RoomListSearchDataSource.kt create mode 100644 features/home/impl/src/main/kotlin/io/element/android/features/home/impl/search/RoomListSearchEvents.kt create mode 100644 features/home/impl/src/main/kotlin/io/element/android/features/home/impl/search/RoomListSearchPresenter.kt create mode 100644 features/home/impl/src/main/kotlin/io/element/android/features/home/impl/search/RoomListSearchState.kt create mode 100644 features/home/impl/src/main/kotlin/io/element/android/features/home/impl/search/RoomListSearchStateProvider.kt create mode 100644 features/home/impl/src/main/kotlin/io/element/android/features/home/impl/search/RoomListSearchView.kt create mode 100644 features/home/impl/src/main/kotlin/io/element/android/features/home/impl/spaces/HomeSpacesEvents.kt create mode 100644 features/home/impl/src/main/kotlin/io/element/android/features/home/impl/spaces/HomeSpacesPresenter.kt create mode 100644 features/home/impl/src/main/kotlin/io/element/android/features/home/impl/spaces/HomeSpacesState.kt create mode 100644 features/home/impl/src/main/kotlin/io/element/android/features/home/impl/spaces/HomeSpacesStateProvider.kt create mode 100644 features/home/impl/src/main/kotlin/io/element/android/features/home/impl/spaces/HomeSpacesView.kt create mode 100644 features/home/impl/src/main/kotlin/io/element/android/features/home/impl/spaces/SpaceRoomProvider.kt create mode 100644 features/home/impl/src/main/res/values-be/translations.xml create mode 100644 features/home/impl/src/main/res/values-bg/translations.xml create mode 100644 features/home/impl/src/main/res/values-cs/translations.xml create mode 100644 features/home/impl/src/main/res/values-cy/translations.xml create mode 100644 features/home/impl/src/main/res/values-da/translations.xml create mode 100644 features/home/impl/src/main/res/values-de/translations.xml create mode 100644 features/home/impl/src/main/res/values-el/translations.xml create mode 100644 features/home/impl/src/main/res/values-en-rUS/translations.xml create mode 100644 features/home/impl/src/main/res/values-es/translations.xml create mode 100644 features/home/impl/src/main/res/values-et/translations.xml create mode 100644 features/home/impl/src/main/res/values-eu/translations.xml create mode 100644 features/home/impl/src/main/res/values-fa/translations.xml create mode 100644 features/home/impl/src/main/res/values-fi/translations.xml create mode 100644 features/home/impl/src/main/res/values-fr/translations.xml create mode 100644 features/home/impl/src/main/res/values-hu/translations.xml create mode 100644 features/home/impl/src/main/res/values-in/translations.xml create mode 100644 features/home/impl/src/main/res/values-it/translations.xml create mode 100644 features/home/impl/src/main/res/values-ka/translations.xml create mode 100644 features/home/impl/src/main/res/values-ko/translations.xml create mode 100644 features/home/impl/src/main/res/values-lt/translations.xml create mode 100644 features/home/impl/src/main/res/values-nb/translations.xml create mode 100644 features/home/impl/src/main/res/values-nl/translations.xml create mode 100644 features/home/impl/src/main/res/values-pl/translations.xml create mode 100644 features/home/impl/src/main/res/values-pt-rBR/translations.xml create mode 100644 features/home/impl/src/main/res/values-pt/translations.xml create mode 100644 features/home/impl/src/main/res/values-ro/translations.xml create mode 100644 features/home/impl/src/main/res/values-ru/translations.xml create mode 100644 features/home/impl/src/main/res/values-sk/translations.xml create mode 100644 features/home/impl/src/main/res/values-sv/translations.xml create mode 100644 features/home/impl/src/main/res/values-tr/translations.xml create mode 100644 features/home/impl/src/main/res/values-uk/translations.xml create mode 100644 features/home/impl/src/main/res/values-ur/translations.xml create mode 100644 features/home/impl/src/main/res/values-uz/translations.xml create mode 100644 features/home/impl/src/main/res/values-zh-rTW/translations.xml create mode 100644 features/home/impl/src/main/res/values-zh/translations.xml create mode 100644 features/home/impl/src/main/res/values/localazy.xml create mode 100644 features/home/impl/src/test/kotlin/io/element/android/features/home/impl/CurrentUserWithNeighborsBuilderTest.kt create mode 100644 features/home/impl/src/test/kotlin/io/element/android/features/home/impl/DefaultHomeEntryPointTest.kt create mode 100644 features/home/impl/src/test/kotlin/io/element/android/features/home/impl/FakeDateTimeObserver.kt create mode 100644 features/home/impl/src/test/kotlin/io/element/android/features/home/impl/HomePresenterTest.kt create mode 100644 features/home/impl/src/test/kotlin/io/element/android/features/home/impl/datasource/RoomListDataSourceTest.kt create mode 100644 features/home/impl/src/test/kotlin/io/element/android/features/home/impl/datasource/RoomListRoomSummaryFactoryTest.kt create mode 100644 features/home/impl/src/test/kotlin/io/element/android/features/home/impl/filters/RoomListFiltersEmptyStateResourcesTest.kt create mode 100644 features/home/impl/src/test/kotlin/io/element/android/features/home/impl/filters/RoomListFiltersPresenterTest.kt create mode 100644 features/home/impl/src/test/kotlin/io/element/android/features/home/impl/filters/RoomListFiltersViewTest.kt create mode 100644 features/home/impl/src/test/kotlin/io/element/android/features/home/impl/model/RoomListBaseRoomSummaryTest.kt create mode 100644 features/home/impl/src/test/kotlin/io/element/android/features/home/impl/roomlist/RoomListContextMenuTest.kt create mode 100644 features/home/impl/src/test/kotlin/io/element/android/features/home/impl/roomlist/RoomListDeclineInviteMenuTest.kt create mode 100644 features/home/impl/src/test/kotlin/io/element/android/features/home/impl/roomlist/RoomListPresenterTest.kt create mode 100644 features/home/impl/src/test/kotlin/io/element/android/features/home/impl/roomlist/RoomListState.kt create mode 100644 features/home/impl/src/test/kotlin/io/element/android/features/home/impl/roomlist/RoomListViewTest.kt create mode 100644 features/home/impl/src/test/kotlin/io/element/android/features/home/impl/search/RoomListSearchPresenterTest.kt create mode 100644 features/home/impl/src/test/kotlin/io/element/android/features/home/impl/spaces/HomeSpacesPresenterTest.kt create mode 100644 features/invite/api/build.gradle.kts create mode 100644 features/invite/api/src/main/kotlin/io/element/android/features/invite/api/InviteData.kt create mode 100644 features/invite/api/src/main/kotlin/io/element/android/features/invite/api/SeenInvitesStore.kt create mode 100644 features/invite/api/src/main/kotlin/io/element/android/features/invite/api/acceptdecline/AcceptDeclineInviteEvents.kt create mode 100644 features/invite/api/src/main/kotlin/io/element/android/features/invite/api/acceptdecline/AcceptDeclineInviteState.kt create mode 100644 features/invite/api/src/main/kotlin/io/element/android/features/invite/api/acceptdecline/AcceptDeclineInviteStateProvider.kt create mode 100644 features/invite/api/src/main/kotlin/io/element/android/features/invite/api/acceptdecline/AcceptDeclineInviteView.kt create mode 100644 features/invite/api/src/main/kotlin/io/element/android/features/invite/api/acceptdecline/ConfirmingDeclineInvite.kt create mode 100644 features/invite/api/src/main/kotlin/io/element/android/features/invite/api/declineandblock/DeclineInviteAndBlockEntryPoint.kt create mode 100644 features/invite/impl/build.gradle.kts create mode 100644 features/invite/impl/src/main/kotlin/io/element/android/features/invite/impl/AcceptInvite.kt create mode 100644 features/invite/impl/src/main/kotlin/io/element/android/features/invite/impl/DeclineInvite.kt create mode 100644 features/invite/impl/src/main/kotlin/io/element/android/features/invite/impl/DefaultSeenInvitesStore.kt create mode 100644 features/invite/impl/src/main/kotlin/io/element/android/features/invite/impl/DefaultSeenInvitesStoreFactory.kt create mode 100644 features/invite/impl/src/main/kotlin/io/element/android/features/invite/impl/SeenInvitesStoreFactory.kt create mode 100644 features/invite/impl/src/main/kotlin/io/element/android/features/invite/impl/acceptdecline/AcceptDeclineInvitePresenter.kt create mode 100644 features/invite/impl/src/main/kotlin/io/element/android/features/invite/impl/acceptdecline/AcceptDeclineInviteStateProvider.kt create mode 100644 features/invite/impl/src/main/kotlin/io/element/android/features/invite/impl/acceptdecline/AcceptDeclineInviteView.kt create mode 100644 features/invite/impl/src/main/kotlin/io/element/android/features/invite/impl/acceptdecline/DefaultAcceptDeclineInviteView.kt create mode 100644 features/invite/impl/src/main/kotlin/io/element/android/features/invite/impl/acceptdecline/InternalAcceptDeclineInviteEvents.kt create mode 100644 features/invite/impl/src/main/kotlin/io/element/android/features/invite/impl/declineandblock/DeclineAndBlockEvents.kt create mode 100644 features/invite/impl/src/main/kotlin/io/element/android/features/invite/impl/declineandblock/DeclineAndBlockNode.kt create mode 100644 features/invite/impl/src/main/kotlin/io/element/android/features/invite/impl/declineandblock/DeclineAndBlockPresenter.kt create mode 100644 features/invite/impl/src/main/kotlin/io/element/android/features/invite/impl/declineandblock/DeclineAndBlockState.kt create mode 100644 features/invite/impl/src/main/kotlin/io/element/android/features/invite/impl/declineandblock/DeclineAndBlockStateProvider.kt create mode 100644 features/invite/impl/src/main/kotlin/io/element/android/features/invite/impl/declineandblock/DeclineAndBlockView.kt create mode 100644 features/invite/impl/src/main/kotlin/io/element/android/features/invite/impl/declineandblock/DefaultDeclineAndBlockEntryPoint.kt create mode 100644 features/invite/impl/src/main/kotlin/io/element/android/features/invite/impl/di/InviteModule.kt create mode 100644 features/invite/impl/src/main/res/values-be/translations.xml create mode 100644 features/invite/impl/src/main/res/values-bg/translations.xml create mode 100644 features/invite/impl/src/main/res/values-cs/translations.xml create mode 100644 features/invite/impl/src/main/res/values-cy/translations.xml create mode 100644 features/invite/impl/src/main/res/values-da/translations.xml create mode 100644 features/invite/impl/src/main/res/values-de/translations.xml create mode 100644 features/invite/impl/src/main/res/values-el/translations.xml create mode 100644 features/invite/impl/src/main/res/values-es/translations.xml create mode 100644 features/invite/impl/src/main/res/values-et/translations.xml create mode 100644 features/invite/impl/src/main/res/values-eu/translations.xml create mode 100644 features/invite/impl/src/main/res/values-fa/translations.xml create mode 100644 features/invite/impl/src/main/res/values-fi/translations.xml create mode 100644 features/invite/impl/src/main/res/values-fr/translations.xml create mode 100644 features/invite/impl/src/main/res/values-hu/translations.xml create mode 100644 features/invite/impl/src/main/res/values-in/translations.xml create mode 100644 features/invite/impl/src/main/res/values-it/translations.xml create mode 100644 features/invite/impl/src/main/res/values-ka/translations.xml create mode 100644 features/invite/impl/src/main/res/values-ko/translations.xml create mode 100644 features/invite/impl/src/main/res/values-lt/translations.xml create mode 100644 features/invite/impl/src/main/res/values-nb/translations.xml create mode 100644 features/invite/impl/src/main/res/values-nl/translations.xml create mode 100644 features/invite/impl/src/main/res/values-pl/translations.xml create mode 100644 features/invite/impl/src/main/res/values-pt-rBR/translations.xml create mode 100644 features/invite/impl/src/main/res/values-pt/translations.xml create mode 100644 features/invite/impl/src/main/res/values-ro/translations.xml create mode 100644 features/invite/impl/src/main/res/values-ru/translations.xml create mode 100644 features/invite/impl/src/main/res/values-sk/translations.xml create mode 100644 features/invite/impl/src/main/res/values-sv/translations.xml create mode 100644 features/invite/impl/src/main/res/values-tr/translations.xml create mode 100644 features/invite/impl/src/main/res/values-uk/translations.xml create mode 100644 features/invite/impl/src/main/res/values-ur/translations.xml create mode 100644 features/invite/impl/src/main/res/values-uz/translations.xml create mode 100644 features/invite/impl/src/main/res/values-zh-rTW/translations.xml create mode 100644 features/invite/impl/src/main/res/values-zh/translations.xml create mode 100644 features/invite/impl/src/main/res/values/localazy.xml create mode 100644 features/invite/impl/src/test/kotlin/io/element/android/features/invite/impl/DefaultAcceptInviteTest.kt create mode 100644 features/invite/impl/src/test/kotlin/io/element/android/features/invite/impl/DefaultDeclineInviteTest.kt create mode 100644 features/invite/impl/src/test/kotlin/io/element/android/features/invite/impl/acceptdecline/AcceptDeclineInvitePresenterTest.kt create mode 100644 features/invite/impl/src/test/kotlin/io/element/android/features/invite/impl/declineandblock/DeclineAndBlockPresenterTest.kt create mode 100644 features/invite/impl/src/test/kotlin/io/element/android/features/invite/impl/declineandblock/DeclineAndBlockViewTest.kt create mode 100644 features/invite/impl/src/test/kotlin/io/element/android/features/invite/impl/declineandblock/DefaultDeclineAndBlockEntryPointTest.kt create mode 100644 features/invite/impl/src/test/kotlin/io/element/android/features/invite/impl/fake/FakeAcceptInvite.kt create mode 100644 features/invite/impl/src/test/kotlin/io/element/android/features/invite/impl/fake/FakeDeclineInvite.kt create mode 100644 features/invite/test/build.gradle.kts create mode 100644 features/invite/test/src/main/kotlin/io/element/android/features/invite/test/InMemorySeenInvitesStore.kt create mode 100644 features/invite/test/src/main/kotlin/io/element/android/features/invite/test/InviteData.kt create mode 100644 features/invite/test/src/main/kotlin/io/element/android/features/invite/test/declineandblock/FakeDeclineInviteAndBlockEntryPoint.kt create mode 100644 features/invitepeople/api/build.gradle.kts create mode 100644 features/invitepeople/api/src/main/kotlin/io/element/android/features/invitepeople/api/InvitePeopleEvents.kt create mode 100644 features/invitepeople/api/src/main/kotlin/io/element/android/features/invitepeople/api/InvitePeoplePresenter.kt create mode 100644 features/invitepeople/api/src/main/kotlin/io/element/android/features/invitepeople/api/InvitePeopleRenderer.kt create mode 100644 features/invitepeople/api/src/main/kotlin/io/element/android/features/invitepeople/api/InvitePeopleState.kt create mode 100644 features/invitepeople/api/src/main/kotlin/io/element/android/features/invitepeople/api/InvitePeopleStateProvider.kt create mode 100644 features/invitepeople/impl/build.gradle.kts create mode 100644 features/invitepeople/impl/src/main/kotlin/io/element/android/features/invitepeople/impl/DefaultInvitePeopleEvents.kt create mode 100644 features/invitepeople/impl/src/main/kotlin/io/element/android/features/invitepeople/impl/DefaultInvitePeoplePresenter.kt create mode 100644 features/invitepeople/impl/src/main/kotlin/io/element/android/features/invitepeople/impl/DefaultInvitePeopleRenderer.kt create mode 100644 features/invitepeople/impl/src/main/kotlin/io/element/android/features/invitepeople/impl/DefaultInvitePeopleState.kt create mode 100644 features/invitepeople/impl/src/main/kotlin/io/element/android/features/invitepeople/impl/DefaultInvitePeopleStateProvider.kt create mode 100644 features/invitepeople/impl/src/main/kotlin/io/element/android/features/invitepeople/impl/InvitableUser.kt create mode 100644 features/invitepeople/impl/src/main/kotlin/io/element/android/features/invitepeople/impl/InvitePeopleView.kt create mode 100644 features/invitepeople/impl/src/main/res/values-be/translations.xml create mode 100644 features/invitepeople/impl/src/main/res/values-bg/translations.xml create mode 100644 features/invitepeople/impl/src/main/res/values-cs/translations.xml create mode 100644 features/invitepeople/impl/src/main/res/values-cy/translations.xml create mode 100644 features/invitepeople/impl/src/main/res/values-da/translations.xml create mode 100644 features/invitepeople/impl/src/main/res/values-de/translations.xml create mode 100644 features/invitepeople/impl/src/main/res/values-el/translations.xml create mode 100644 features/invitepeople/impl/src/main/res/values-es/translations.xml create mode 100644 features/invitepeople/impl/src/main/res/values-et/translations.xml create mode 100644 features/invitepeople/impl/src/main/res/values-eu/translations.xml create mode 100644 features/invitepeople/impl/src/main/res/values-fa/translations.xml create mode 100644 features/invitepeople/impl/src/main/res/values-fi/translations.xml create mode 100644 features/invitepeople/impl/src/main/res/values-fr/translations.xml create mode 100644 features/invitepeople/impl/src/main/res/values-hu/translations.xml create mode 100644 features/invitepeople/impl/src/main/res/values-in/translations.xml create mode 100644 features/invitepeople/impl/src/main/res/values-it/translations.xml create mode 100644 features/invitepeople/impl/src/main/res/values-ka/translations.xml create mode 100644 features/invitepeople/impl/src/main/res/values-ko/translations.xml create mode 100644 features/invitepeople/impl/src/main/res/values-lt/translations.xml create mode 100644 features/invitepeople/impl/src/main/res/values-nb/translations.xml create mode 100644 features/invitepeople/impl/src/main/res/values-nl/translations.xml create mode 100644 features/invitepeople/impl/src/main/res/values-pl/translations.xml create mode 100644 features/invitepeople/impl/src/main/res/values-pt-rBR/translations.xml create mode 100644 features/invitepeople/impl/src/main/res/values-pt/translations.xml create mode 100644 features/invitepeople/impl/src/main/res/values-ro/translations.xml create mode 100644 features/invitepeople/impl/src/main/res/values-ru/translations.xml create mode 100644 features/invitepeople/impl/src/main/res/values-sk/translations.xml create mode 100644 features/invitepeople/impl/src/main/res/values-sv/translations.xml create mode 100644 features/invitepeople/impl/src/main/res/values-tr/translations.xml create mode 100644 features/invitepeople/impl/src/main/res/values-uk/translations.xml create mode 100644 features/invitepeople/impl/src/main/res/values-ur/translations.xml create mode 100644 features/invitepeople/impl/src/main/res/values-uz/translations.xml create mode 100644 features/invitepeople/impl/src/main/res/values-zh-rTW/translations.xml create mode 100644 features/invitepeople/impl/src/main/res/values-zh/translations.xml create mode 100644 features/invitepeople/impl/src/main/res/values/localazy.xml create mode 100644 features/invitepeople/impl/src/test/kotlin/io/element/android/features/invitepeople/impl/DefaultInvitePeoplePresenterTest.kt create mode 100644 features/joinroom/api/build.gradle.kts create mode 100644 features/joinroom/api/src/main/kotlin/io/element/android/features/joinroom/api/JoinRoomEntryPoint.kt create mode 100644 features/joinroom/impl/build.gradle.kts create mode 100644 features/joinroom/impl/src/main/kotlin/io/element/android/features/joinroom/impl/DefaultJoinRoomEntryPoint.kt create mode 100644 features/joinroom/impl/src/main/kotlin/io/element/android/features/joinroom/impl/JoinRoomEvents.kt create mode 100644 features/joinroom/impl/src/main/kotlin/io/element/android/features/joinroom/impl/JoinRoomFlowNode.kt create mode 100644 features/joinroom/impl/src/main/kotlin/io/element/android/features/joinroom/impl/JoinRoomPresenter.kt create mode 100644 features/joinroom/impl/src/main/kotlin/io/element/android/features/joinroom/impl/JoinRoomState.kt create mode 100644 features/joinroom/impl/src/main/kotlin/io/element/android/features/joinroom/impl/JoinRoomStateProvider.kt create mode 100644 features/joinroom/impl/src/main/kotlin/io/element/android/features/joinroom/impl/JoinRoomView.kt create mode 100644 features/joinroom/impl/src/main/kotlin/io/element/android/features/joinroom/impl/di/CancelKnockRoom.kt create mode 100644 features/joinroom/impl/src/main/kotlin/io/element/android/features/joinroom/impl/di/ForgetRoom.kt create mode 100644 features/joinroom/impl/src/main/kotlin/io/element/android/features/joinroom/impl/di/JoinRoomModule.kt create mode 100644 features/joinroom/impl/src/main/kotlin/io/element/android/features/joinroom/impl/di/KnockRoom.kt create mode 100644 features/joinroom/impl/src/main/res/values-be/translations.xml create mode 100644 features/joinroom/impl/src/main/res/values-bg/translations.xml create mode 100644 features/joinroom/impl/src/main/res/values-cs/translations.xml create mode 100644 features/joinroom/impl/src/main/res/values-cy/translations.xml create mode 100644 features/joinroom/impl/src/main/res/values-da/translations.xml create mode 100644 features/joinroom/impl/src/main/res/values-de/translations.xml create mode 100644 features/joinroom/impl/src/main/res/values-el/translations.xml create mode 100644 features/joinroom/impl/src/main/res/values-es/translations.xml create mode 100644 features/joinroom/impl/src/main/res/values-et/translations.xml create mode 100644 features/joinroom/impl/src/main/res/values-eu/translations.xml create mode 100644 features/joinroom/impl/src/main/res/values-fa/translations.xml create mode 100644 features/joinroom/impl/src/main/res/values-fi/translations.xml create mode 100644 features/joinroom/impl/src/main/res/values-fr/translations.xml create mode 100644 features/joinroom/impl/src/main/res/values-hu/translations.xml create mode 100644 features/joinroom/impl/src/main/res/values-in/translations.xml create mode 100644 features/joinroom/impl/src/main/res/values-it/translations.xml create mode 100644 features/joinroom/impl/src/main/res/values-ka/translations.xml create mode 100644 features/joinroom/impl/src/main/res/values-ko/translations.xml create mode 100644 features/joinroom/impl/src/main/res/values-nb/translations.xml create mode 100644 features/joinroom/impl/src/main/res/values-nl/translations.xml create mode 100644 features/joinroom/impl/src/main/res/values-pl/translations.xml create mode 100644 features/joinroom/impl/src/main/res/values-pt-rBR/translations.xml create mode 100644 features/joinroom/impl/src/main/res/values-pt/translations.xml create mode 100644 features/joinroom/impl/src/main/res/values-ro/translations.xml create mode 100644 features/joinroom/impl/src/main/res/values-ru/translations.xml create mode 100644 features/joinroom/impl/src/main/res/values-sk/translations.xml create mode 100644 features/joinroom/impl/src/main/res/values-sv/translations.xml create mode 100644 features/joinroom/impl/src/main/res/values-tr/translations.xml create mode 100644 features/joinroom/impl/src/main/res/values-uk/translations.xml create mode 100644 features/joinroom/impl/src/main/res/values-ur/translations.xml create mode 100644 features/joinroom/impl/src/main/res/values-uz/translations.xml create mode 100644 features/joinroom/impl/src/main/res/values-zh-rTW/translations.xml create mode 100644 features/joinroom/impl/src/main/res/values-zh/translations.xml create mode 100644 features/joinroom/impl/src/main/res/values/localazy.xml create mode 100644 features/joinroom/impl/src/test/kotlin/io/element/android/features/joinroom/impl/DefaultJoinRoomEntryPointTest.kt create mode 100644 features/joinroom/impl/src/test/kotlin/io/element/android/features/joinroom/impl/FakeCancelKnockRoom.kt create mode 100644 features/joinroom/impl/src/test/kotlin/io/element/android/features/joinroom/impl/FakeForgetRoom.kt create mode 100644 features/joinroom/impl/src/test/kotlin/io/element/android/features/joinroom/impl/FakeKnockRoom.kt create mode 100644 features/joinroom/impl/src/test/kotlin/io/element/android/features/joinroom/impl/JoinRoomPresenterTest.kt create mode 100644 features/joinroom/impl/src/test/kotlin/io/element/android/features/joinroom/impl/JoinRoomViewTest.kt create mode 100644 features/knockrequests/api/build.gradle.kts create mode 100644 features/knockrequests/api/src/main/kotlin/io/element/android/features/knockrequests/api/banner/KnockRequestsBannerRenderer.kt create mode 100644 features/knockrequests/api/src/main/kotlin/io/element/android/features/knockrequests/api/list/KnockRequestsListEntryPoint.kt create mode 100644 features/knockrequests/impl/build.gradle.kts create mode 100644 features/knockrequests/impl/src/main/kotlin/io/element/android/features/knockrequests/impl/banner/DefaultKnockRequestsBannerRenderer.kt create mode 100644 features/knockrequests/impl/src/main/kotlin/io/element/android/features/knockrequests/impl/banner/KnockRequestsBannerEvents.kt create mode 100644 features/knockrequests/impl/src/main/kotlin/io/element/android/features/knockrequests/impl/banner/KnockRequestsBannerPresenter.kt create mode 100644 features/knockrequests/impl/src/main/kotlin/io/element/android/features/knockrequests/impl/banner/KnockRequestsBannerState.kt create mode 100644 features/knockrequests/impl/src/main/kotlin/io/element/android/features/knockrequests/impl/banner/KnockRequestsBannerStateProvider.kt create mode 100644 features/knockrequests/impl/src/main/kotlin/io/element/android/features/knockrequests/impl/banner/KnockRequestsBannerView.kt create mode 100644 features/knockrequests/impl/src/main/kotlin/io/element/android/features/knockrequests/impl/data/KnockRequestFixture.kt create mode 100644 features/knockrequests/impl/src/main/kotlin/io/element/android/features/knockrequests/impl/data/KnockRequestPermissions.kt create mode 100644 features/knockrequests/impl/src/main/kotlin/io/element/android/features/knockrequests/impl/data/KnockRequestPresentable.kt create mode 100644 features/knockrequests/impl/src/main/kotlin/io/element/android/features/knockrequests/impl/data/KnockRequestWrapper.kt create mode 100644 features/knockrequests/impl/src/main/kotlin/io/element/android/features/knockrequests/impl/data/KnockRequestsException.kt create mode 100644 features/knockrequests/impl/src/main/kotlin/io/element/android/features/knockrequests/impl/data/KnockRequestsModule.kt create mode 100644 features/knockrequests/impl/src/main/kotlin/io/element/android/features/knockrequests/impl/data/KnockRequestsService.kt create mode 100644 features/knockrequests/impl/src/main/kotlin/io/element/android/features/knockrequests/impl/list/DefaultKnockRequestsListEntryPoint.kt create mode 100644 features/knockrequests/impl/src/main/kotlin/io/element/android/features/knockrequests/impl/list/KnockRequestsListEvents.kt create mode 100644 features/knockrequests/impl/src/main/kotlin/io/element/android/features/knockrequests/impl/list/KnockRequestsListNode.kt create mode 100644 features/knockrequests/impl/src/main/kotlin/io/element/android/features/knockrequests/impl/list/KnockRequestsListPresenter.kt create mode 100644 features/knockrequests/impl/src/main/kotlin/io/element/android/features/knockrequests/impl/list/KnockRequestsListState.kt create mode 100644 features/knockrequests/impl/src/main/kotlin/io/element/android/features/knockrequests/impl/list/KnockRequestsListStateProvider.kt create mode 100644 features/knockrequests/impl/src/main/kotlin/io/element/android/features/knockrequests/impl/list/KnockRequestsListView.kt create mode 100644 features/knockrequests/impl/src/main/res/values-be/translations.xml create mode 100644 features/knockrequests/impl/src/main/res/values-bg/translations.xml create mode 100644 features/knockrequests/impl/src/main/res/values-cs/translations.xml create mode 100644 features/knockrequests/impl/src/main/res/values-cy/translations.xml create mode 100644 features/knockrequests/impl/src/main/res/values-da/translations.xml create mode 100644 features/knockrequests/impl/src/main/res/values-de/translations.xml create mode 100644 features/knockrequests/impl/src/main/res/values-el/translations.xml create mode 100644 features/knockrequests/impl/src/main/res/values-es/translations.xml create mode 100644 features/knockrequests/impl/src/main/res/values-et/translations.xml create mode 100644 features/knockrequests/impl/src/main/res/values-eu/translations.xml create mode 100644 features/knockrequests/impl/src/main/res/values-fa/translations.xml create mode 100644 features/knockrequests/impl/src/main/res/values-fi/translations.xml create mode 100644 features/knockrequests/impl/src/main/res/values-fr/translations.xml create mode 100644 features/knockrequests/impl/src/main/res/values-hu/translations.xml create mode 100644 features/knockrequests/impl/src/main/res/values-in/translations.xml create mode 100644 features/knockrequests/impl/src/main/res/values-it/translations.xml create mode 100644 features/knockrequests/impl/src/main/res/values-ka/translations.xml create mode 100644 features/knockrequests/impl/src/main/res/values-ko/translations.xml create mode 100644 features/knockrequests/impl/src/main/res/values-lt/translations.xml create mode 100644 features/knockrequests/impl/src/main/res/values-nb/translations.xml create mode 100644 features/knockrequests/impl/src/main/res/values-nl/translations.xml create mode 100644 features/knockrequests/impl/src/main/res/values-pl/translations.xml create mode 100644 features/knockrequests/impl/src/main/res/values-pt-rBR/translations.xml create mode 100644 features/knockrequests/impl/src/main/res/values-pt/translations.xml create mode 100644 features/knockrequests/impl/src/main/res/values-ro/translations.xml create mode 100644 features/knockrequests/impl/src/main/res/values-ru/translations.xml create mode 100644 features/knockrequests/impl/src/main/res/values-sk/translations.xml create mode 100644 features/knockrequests/impl/src/main/res/values-sv/translations.xml create mode 100644 features/knockrequests/impl/src/main/res/values-tr/translations.xml create mode 100644 features/knockrequests/impl/src/main/res/values-uk/translations.xml create mode 100644 features/knockrequests/impl/src/main/res/values-ur/translations.xml create mode 100644 features/knockrequests/impl/src/main/res/values-uz/translations.xml create mode 100644 features/knockrequests/impl/src/main/res/values-zh-rTW/translations.xml create mode 100644 features/knockrequests/impl/src/main/res/values-zh/translations.xml create mode 100644 features/knockrequests/impl/src/main/res/values/localazy.xml create mode 100644 features/knockrequests/impl/src/test/kotlin/io/element/android/features/knockrequests/impl/banner/KnockRequestsBannerPresenterTest.kt create mode 100644 features/knockrequests/impl/src/test/kotlin/io/element/android/features/knockrequests/impl/banner/KnockRequestsBannerViewTest.kt create mode 100644 features/knockrequests/impl/src/test/kotlin/io/element/android/features/knockrequests/impl/list/DefaultKnockRequestsListEntryPointTest.kt create mode 100644 features/knockrequests/impl/src/test/kotlin/io/element/android/features/knockrequests/impl/list/KnockRequestsListPresenterTest.kt create mode 100644 features/knockrequests/impl/src/test/kotlin/io/element/android/features/knockrequests/impl/list/KnockRequestsListViewTest.kt create mode 100644 features/knockrequests/test/build.gradle.kts create mode 100644 features/knockrequests/test/src/main/kotlin/io/element/android/features/knockrequests/test/FakeKnockRequestsListEntryPoint.kt create mode 100644 features/leaveroom/api/build.gradle.kts create mode 100644 features/leaveroom/api/src/main/kotlin/io/element/android/features/leaveroom/api/LeaveRoomEvent.kt create mode 100644 features/leaveroom/api/src/main/kotlin/io/element/android/features/leaveroom/api/LeaveRoomRenderer.kt create mode 100644 features/leaveroom/api/src/main/kotlin/io/element/android/features/leaveroom/api/LeaveRoomState.kt create mode 100644 features/leaveroom/api/src/main/res/values-be/translations.xml create mode 100644 features/leaveroom/api/src/main/res/values-bg/translations.xml create mode 100644 features/leaveroom/api/src/main/res/values-cs/translations.xml create mode 100644 features/leaveroom/api/src/main/res/values-cy/translations.xml create mode 100644 features/leaveroom/api/src/main/res/values-da/translations.xml create mode 100644 features/leaveroom/api/src/main/res/values-de/translations.xml create mode 100644 features/leaveroom/api/src/main/res/values-el/translations.xml create mode 100644 features/leaveroom/api/src/main/res/values-es/translations.xml create mode 100644 features/leaveroom/api/src/main/res/values-et/translations.xml create mode 100644 features/leaveroom/api/src/main/res/values-eu/translations.xml create mode 100644 features/leaveroom/api/src/main/res/values-fa/translations.xml create mode 100644 features/leaveroom/api/src/main/res/values-fi/translations.xml create mode 100644 features/leaveroom/api/src/main/res/values-fr/translations.xml create mode 100644 features/leaveroom/api/src/main/res/values-hu/translations.xml create mode 100644 features/leaveroom/api/src/main/res/values-in/translations.xml create mode 100644 features/leaveroom/api/src/main/res/values-it/translations.xml create mode 100644 features/leaveroom/api/src/main/res/values-ka/translations.xml create mode 100644 features/leaveroom/api/src/main/res/values-ko/translations.xml create mode 100644 features/leaveroom/api/src/main/res/values-lt/translations.xml create mode 100644 features/leaveroom/api/src/main/res/values-nb/translations.xml create mode 100644 features/leaveroom/api/src/main/res/values-nl/translations.xml create mode 100644 features/leaveroom/api/src/main/res/values-pl/translations.xml create mode 100644 features/leaveroom/api/src/main/res/values-pt-rBR/translations.xml create mode 100644 features/leaveroom/api/src/main/res/values-pt/translations.xml create mode 100644 features/leaveroom/api/src/main/res/values-ro/translations.xml create mode 100644 features/leaveroom/api/src/main/res/values-ru/translations.xml create mode 100644 features/leaveroom/api/src/main/res/values-sk/translations.xml create mode 100644 features/leaveroom/api/src/main/res/values-sv/translations.xml create mode 100644 features/leaveroom/api/src/main/res/values-tr/translations.xml create mode 100644 features/leaveroom/api/src/main/res/values-uk/translations.xml create mode 100644 features/leaveroom/api/src/main/res/values-ur/translations.xml create mode 100644 features/leaveroom/api/src/main/res/values-uz/translations.xml create mode 100644 features/leaveroom/api/src/main/res/values-zh-rTW/translations.xml create mode 100644 features/leaveroom/api/src/main/res/values-zh/translations.xml create mode 100644 features/leaveroom/api/src/main/res/values/localazy.xml create mode 100644 features/leaveroom/impl/build.gradle.kts create mode 100644 features/leaveroom/impl/src/main/kotlin/io/element/android/features/leaveroom/impl/InternalLeaveRoomEvent.kt create mode 100644 features/leaveroom/impl/src/main/kotlin/io/element/android/features/leaveroom/impl/InternalLeaveRoomRenderer.kt create mode 100644 features/leaveroom/impl/src/main/kotlin/io/element/android/features/leaveroom/impl/InternalLeaveRoomState.kt create mode 100644 features/leaveroom/impl/src/main/kotlin/io/element/android/features/leaveroom/impl/InternalLeaveRoomStateProvider.kt create mode 100644 features/leaveroom/impl/src/main/kotlin/io/element/android/features/leaveroom/impl/LeaveRoomPresenter.kt create mode 100644 features/leaveroom/impl/src/main/kotlin/io/element/android/features/leaveroom/impl/LeaveRoomView.kt create mode 100644 features/leaveroom/impl/src/main/kotlin/io/element/android/features/leaveroom/impl/di/LeaveRoomModule.kt create mode 100644 features/leaveroom/impl/src/test/kotlin/io/element/android/features/leaveroom/impl/LeaveBaseRoomPresenterTest.kt create mode 100644 features/licenses/api/build.gradle.kts create mode 100644 features/licenses/api/src/main/kotlin/io/element/android/features/licenses/api/OpenSourceLicensesEntryPoint.kt create mode 100644 features/licenses/impl/build.gradle.kts create mode 100644 features/licenses/impl/src/main/kotlin/io/element/android/features/licenses/impl/DefaultOpenSourcesLicensesEntryPoint.kt create mode 100644 features/licenses/impl/src/main/kotlin/io/element/android/features/licenses/impl/DependenciesFlowNode.kt create mode 100644 features/licenses/impl/src/main/kotlin/io/element/android/features/licenses/impl/LicensesProvider.kt create mode 100644 features/licenses/impl/src/main/kotlin/io/element/android/features/licenses/impl/details/DependenciesDetailsNode.kt create mode 100644 features/licenses/impl/src/main/kotlin/io/element/android/features/licenses/impl/details/DependenciesDetailsView.kt create mode 100644 features/licenses/impl/src/main/kotlin/io/element/android/features/licenses/impl/list/DependencyLicensesListEvent.kt create mode 100644 features/licenses/impl/src/main/kotlin/io/element/android/features/licenses/impl/list/DependencyLicensesListNode.kt create mode 100644 features/licenses/impl/src/main/kotlin/io/element/android/features/licenses/impl/list/DependencyLicensesListPresenter.kt create mode 100644 features/licenses/impl/src/main/kotlin/io/element/android/features/licenses/impl/list/DependencyLicensesListState.kt create mode 100644 features/licenses/impl/src/main/kotlin/io/element/android/features/licenses/impl/list/DependencyLicensesListStateProvider.kt create mode 100644 features/licenses/impl/src/main/kotlin/io/element/android/features/licenses/impl/list/DependencyLicensesListView.kt create mode 100644 features/licenses/impl/src/main/kotlin/io/element/android/features/licenses/impl/model/DependencyLicenseItem.kt create mode 100644 features/licenses/impl/src/test/kotlin/io/element/android/features/licenses/impl/DefaultOpenSourcesLicensesEntryPointTest.kt create mode 100644 features/licenses/impl/src/test/kotlin/io/element/android/features/licenses/impl/list/DependencyLicensesListPresenterTest.kt create mode 100644 features/licenses/impl/src/test/kotlin/io/element/android/features/licenses/impl/list/FakeLicensesProvider.kt create mode 100644 features/licenses/test/build.gradle.kts create mode 100644 features/licenses/test/src/main/kotlin/io/element/android/features/licenses/test/FakeOpenSourceLicensesEntryPoint.kt create mode 100644 features/location/api/build.gradle.kts create mode 100644 features/location/api/src/main/kotlin/io/element/android/features/location/api/Location.kt create mode 100644 features/location/api/src/main/kotlin/io/element/android/features/location/api/LocationService.kt create mode 100644 features/location/api/src/main/kotlin/io/element/android/features/location/api/SendLocationEntryPoint.kt create mode 100644 features/location/api/src/main/kotlin/io/element/android/features/location/api/ShowLocationEntryPoint.kt create mode 100644 features/location/api/src/main/kotlin/io/element/android/features/location/api/StaticMapView.kt create mode 100644 features/location/api/src/main/kotlin/io/element/android/features/location/api/internal/MapTilerStaticMapUrlBuilder.kt create mode 100644 features/location/api/src/main/kotlin/io/element/android/features/location/api/internal/MapTilerTileServerStyleUriBuilder.kt create mode 100644 features/location/api/src/main/kotlin/io/element/android/features/location/api/internal/ModifierCenterBottomEdge.kt create mode 100644 features/location/api/src/main/kotlin/io/element/android/features/location/api/internal/StaticMapPlaceholder.kt create mode 100644 features/location/api/src/main/kotlin/io/element/android/features/location/api/internal/StaticMapUrlBuilder.kt create mode 100644 features/location/api/src/main/kotlin/io/element/android/features/location/api/internal/TileServerStyleUriBuilder.kt create mode 100644 features/location/api/src/main/res/drawable-night/blurred_map.png create mode 100644 features/location/api/src/main/res/drawable/blurred_map.png create mode 100644 features/location/api/src/test/kotlin/io/element/android/features/location/api/LocationKtTest.kt create mode 100644 features/location/api/src/test/kotlin/io/element/android/features/location/api/internal/MapTilerStaticMapUrlBuilderTest.kt create mode 100644 features/location/api/src/test/kotlin/io/element/android/features/location/api/internal/MapTilerTileServerStyleUriBuilderTest.kt create mode 100644 features/location/impl/build.gradle.kts create mode 100644 features/location/impl/src/main/AndroidManifest.xml create mode 100644 features/location/impl/src/main/kotlin/io/element/android/features/location/impl/DefaultLocationService.kt create mode 100644 features/location/impl/src/main/kotlin/io/element/android/features/location/impl/common/MapDefaults.kt create mode 100644 features/location/impl/src/main/kotlin/io/element/android/features/location/impl/common/PermissionDeniedDialog.kt create mode 100644 features/location/impl/src/main/kotlin/io/element/android/features/location/impl/common/PermissionRationaleDialog.kt create mode 100644 features/location/impl/src/main/kotlin/io/element/android/features/location/impl/common/actions/AndroidLocationActions.kt create mode 100644 features/location/impl/src/main/kotlin/io/element/android/features/location/impl/common/actions/LocationActions.kt create mode 100644 features/location/impl/src/main/kotlin/io/element/android/features/location/impl/common/permissions/DefaultPermissionsPresenter.kt create mode 100644 features/location/impl/src/main/kotlin/io/element/android/features/location/impl/common/permissions/PermissionsEvents.kt create mode 100644 features/location/impl/src/main/kotlin/io/element/android/features/location/impl/common/permissions/PermissionsPresenter.kt create mode 100644 features/location/impl/src/main/kotlin/io/element/android/features/location/impl/common/permissions/PermissionsState.kt create mode 100644 features/location/impl/src/main/kotlin/io/element/android/features/location/impl/common/ui/LocationFloatingActionButton.kt create mode 100644 features/location/impl/src/main/kotlin/io/element/android/features/location/impl/send/DefaultSendLocationEntryPoint.kt create mode 100644 features/location/impl/src/main/kotlin/io/element/android/features/location/impl/send/SendLocationEvents.kt create mode 100644 features/location/impl/src/main/kotlin/io/element/android/features/location/impl/send/SendLocationNode.kt create mode 100644 features/location/impl/src/main/kotlin/io/element/android/features/location/impl/send/SendLocationPresenter.kt create mode 100644 features/location/impl/src/main/kotlin/io/element/android/features/location/impl/send/SendLocationState.kt create mode 100644 features/location/impl/src/main/kotlin/io/element/android/features/location/impl/send/SendLocationStateProvider.kt create mode 100644 features/location/impl/src/main/kotlin/io/element/android/features/location/impl/send/SendLocationView.kt create mode 100644 features/location/impl/src/main/kotlin/io/element/android/features/location/impl/show/DefaultShowLocationEntryPoint.kt create mode 100644 features/location/impl/src/main/kotlin/io/element/android/features/location/impl/show/ShowLocationEvents.kt create mode 100644 features/location/impl/src/main/kotlin/io/element/android/features/location/impl/show/ShowLocationNode.kt create mode 100644 features/location/impl/src/main/kotlin/io/element/android/features/location/impl/show/ShowLocationPresenter.kt create mode 100644 features/location/impl/src/main/kotlin/io/element/android/features/location/impl/show/ShowLocationState.kt create mode 100644 features/location/impl/src/main/kotlin/io/element/android/features/location/impl/show/ShowLocationStateProvider.kt create mode 100644 features/location/impl/src/main/kotlin/io/element/android/features/location/impl/show/ShowLocationView.kt create mode 100644 features/location/impl/src/main/res/drawable-night/pin_small.xml create mode 100644 features/location/impl/src/main/res/drawable/pin_small.xml create mode 100644 features/location/impl/src/test/kotlin/io/element/android/features/location/impl/DefaultLocationServiceTest.kt create mode 100644 features/location/impl/src/test/kotlin/io/element/android/features/location/impl/PermissionsStateFactory.kt create mode 100644 features/location/impl/src/test/kotlin/io/element/android/features/location/impl/common/actions/AndroidLocationActionsTest.kt create mode 100644 features/location/impl/src/test/kotlin/io/element/android/features/location/impl/common/actions/FakeLocationActions.kt create mode 100644 features/location/impl/src/test/kotlin/io/element/android/features/location/impl/common/permissions/FakePermissionsPresenter.kt create mode 100644 features/location/impl/src/test/kotlin/io/element/android/features/location/impl/send/DefaultSendLocationEntryPointTest.kt create mode 100644 features/location/impl/src/test/kotlin/io/element/android/features/location/impl/send/SendLocationPresenterTest.kt create mode 100644 features/location/impl/src/test/kotlin/io/element/android/features/location/impl/show/DefaultShowLocationEntryPointTest.kt create mode 100644 features/location/impl/src/test/kotlin/io/element/android/features/location/impl/show/ShowLocationPresenterTest.kt create mode 100644 features/location/impl/src/test/kotlin/io/element/android/features/location/impl/show/ShowLocationViewTest.kt create mode 100644 features/location/test/build.gradle.kts create mode 100644 features/location/test/src/main/kotlin/io/element/android/features/location/test/FakeLocationService.kt create mode 100644 features/location/test/src/main/kotlin/io/element/android/features/location/test/FakeSendLocationEntryPoint.kt create mode 100644 features/location/test/src/main/kotlin/io/element/android/features/location/test/FakeShowLocationEntryPoint.kt create mode 100644 features/lockscreen/api/build.gradle.kts create mode 100644 features/lockscreen/api/src/main/kotlin/io/element/android/features/lockscreen/api/LockScreenEntryPoint.kt create mode 100644 features/lockscreen/api/src/main/kotlin/io/element/android/features/lockscreen/api/LockScreenLockState.kt create mode 100644 features/lockscreen/api/src/main/kotlin/io/element/android/features/lockscreen/api/LockScreenService.kt create mode 100644 features/lockscreen/impl/build.gradle.kts create mode 100644 features/lockscreen/impl/src/main/AndroidManifest.xml create mode 100644 features/lockscreen/impl/src/main/kotlin/io/element/android/features/lockscreen/impl/DefaultLockScreenEntryPoint.kt create mode 100644 features/lockscreen/impl/src/main/kotlin/io/element/android/features/lockscreen/impl/DefaultLockScreenService.kt create mode 100644 features/lockscreen/impl/src/main/kotlin/io/element/android/features/lockscreen/impl/LockScreenConfig.kt create mode 100644 features/lockscreen/impl/src/main/kotlin/io/element/android/features/lockscreen/impl/LockScreenFlowNode.kt create mode 100644 features/lockscreen/impl/src/main/kotlin/io/element/android/features/lockscreen/impl/biometric/BiometricAuthenticator.kt create mode 100644 features/lockscreen/impl/src/main/kotlin/io/element/android/features/lockscreen/impl/biometric/BiometricAuthenticatorManager.kt create mode 100644 features/lockscreen/impl/src/main/kotlin/io/element/android/features/lockscreen/impl/biometric/BiometricUnlockError.kt create mode 100644 features/lockscreen/impl/src/main/kotlin/io/element/android/features/lockscreen/impl/biometric/DefaultBiometricAuthenticatorManager.kt create mode 100644 features/lockscreen/impl/src/main/kotlin/io/element/android/features/lockscreen/impl/biometric/DefaultBiometricUnlockCallback.kt create mode 100644 features/lockscreen/impl/src/main/kotlin/io/element/android/features/lockscreen/impl/components/PinEntryTextField.kt create mode 100644 features/lockscreen/impl/src/main/kotlin/io/element/android/features/lockscreen/impl/pin/DefaultPinCodeManager.kt create mode 100644 features/lockscreen/impl/src/main/kotlin/io/element/android/features/lockscreen/impl/pin/DefaultPinCodeManagerCallback.kt create mode 100644 features/lockscreen/impl/src/main/kotlin/io/element/android/features/lockscreen/impl/pin/PinCodeManager.kt create mode 100644 features/lockscreen/impl/src/main/kotlin/io/element/android/features/lockscreen/impl/pin/model/PinDigit.kt create mode 100644 features/lockscreen/impl/src/main/kotlin/io/element/android/features/lockscreen/impl/pin/model/PinEntry.kt create mode 100644 features/lockscreen/impl/src/main/kotlin/io/element/android/features/lockscreen/impl/settings/LockScreenSettingsEvents.kt create mode 100644 features/lockscreen/impl/src/main/kotlin/io/element/android/features/lockscreen/impl/settings/LockScreenSettingsFlowNode.kt create mode 100644 features/lockscreen/impl/src/main/kotlin/io/element/android/features/lockscreen/impl/settings/LockScreenSettingsNode.kt create mode 100644 features/lockscreen/impl/src/main/kotlin/io/element/android/features/lockscreen/impl/settings/LockScreenSettingsPresenter.kt create mode 100644 features/lockscreen/impl/src/main/kotlin/io/element/android/features/lockscreen/impl/settings/LockScreenSettingsState.kt create mode 100644 features/lockscreen/impl/src/main/kotlin/io/element/android/features/lockscreen/impl/settings/LockScreenSettingsStateProvider.kt create mode 100644 features/lockscreen/impl/src/main/kotlin/io/element/android/features/lockscreen/impl/settings/LockScreenSettingsView.kt create mode 100644 features/lockscreen/impl/src/main/kotlin/io/element/android/features/lockscreen/impl/setup/LockScreenSetupFlowNode.kt create mode 100644 features/lockscreen/impl/src/main/kotlin/io/element/android/features/lockscreen/impl/setup/biometric/SetupBiometricEvents.kt create mode 100644 features/lockscreen/impl/src/main/kotlin/io/element/android/features/lockscreen/impl/setup/biometric/SetupBiometricNode.kt create mode 100644 features/lockscreen/impl/src/main/kotlin/io/element/android/features/lockscreen/impl/setup/biometric/SetupBiometricPresenter.kt create mode 100644 features/lockscreen/impl/src/main/kotlin/io/element/android/features/lockscreen/impl/setup/biometric/SetupBiometricState.kt create mode 100644 features/lockscreen/impl/src/main/kotlin/io/element/android/features/lockscreen/impl/setup/biometric/SetupBiometricStateProvider.kt create mode 100644 features/lockscreen/impl/src/main/kotlin/io/element/android/features/lockscreen/impl/setup/biometric/SetupBiometricView.kt create mode 100644 features/lockscreen/impl/src/main/kotlin/io/element/android/features/lockscreen/impl/setup/pin/SetupPinEvents.kt create mode 100644 features/lockscreen/impl/src/main/kotlin/io/element/android/features/lockscreen/impl/setup/pin/SetupPinNode.kt create mode 100644 features/lockscreen/impl/src/main/kotlin/io/element/android/features/lockscreen/impl/setup/pin/SetupPinPresenter.kt create mode 100644 features/lockscreen/impl/src/main/kotlin/io/element/android/features/lockscreen/impl/setup/pin/SetupPinState.kt create mode 100644 features/lockscreen/impl/src/main/kotlin/io/element/android/features/lockscreen/impl/setup/pin/SetupPinStateProvider.kt create mode 100644 features/lockscreen/impl/src/main/kotlin/io/element/android/features/lockscreen/impl/setup/pin/SetupPinView.kt create mode 100644 features/lockscreen/impl/src/main/kotlin/io/element/android/features/lockscreen/impl/setup/pin/validation/PinValidator.kt create mode 100644 features/lockscreen/impl/src/main/kotlin/io/element/android/features/lockscreen/impl/setup/pin/validation/SetupPinFailure.kt create mode 100644 features/lockscreen/impl/src/main/kotlin/io/element/android/features/lockscreen/impl/storage/EncryptedPinCodeStorage.kt create mode 100644 features/lockscreen/impl/src/main/kotlin/io/element/android/features/lockscreen/impl/storage/LockScreenStore.kt create mode 100644 features/lockscreen/impl/src/main/kotlin/io/element/android/features/lockscreen/impl/storage/PreferencesLockScreenStore.kt create mode 100644 features/lockscreen/impl/src/main/kotlin/io/element/android/features/lockscreen/impl/unlock/PinUnlockEvents.kt create mode 100644 features/lockscreen/impl/src/main/kotlin/io/element/android/features/lockscreen/impl/unlock/PinUnlockHelper.kt create mode 100644 features/lockscreen/impl/src/main/kotlin/io/element/android/features/lockscreen/impl/unlock/PinUnlockNode.kt create mode 100644 features/lockscreen/impl/src/main/kotlin/io/element/android/features/lockscreen/impl/unlock/PinUnlockPresenter.kt create mode 100644 features/lockscreen/impl/src/main/kotlin/io/element/android/features/lockscreen/impl/unlock/PinUnlockState.kt create mode 100644 features/lockscreen/impl/src/main/kotlin/io/element/android/features/lockscreen/impl/unlock/PinUnlockStateProvider.kt create mode 100644 features/lockscreen/impl/src/main/kotlin/io/element/android/features/lockscreen/impl/unlock/PinUnlockView.kt create mode 100644 features/lockscreen/impl/src/main/kotlin/io/element/android/features/lockscreen/impl/unlock/activity/PinUnlockActivity.kt create mode 100644 features/lockscreen/impl/src/main/kotlin/io/element/android/features/lockscreen/impl/unlock/di/PinUnlockBindings.kt create mode 100644 features/lockscreen/impl/src/main/kotlin/io/element/android/features/lockscreen/impl/unlock/keypad/PinKeypad.kt create mode 100644 features/lockscreen/impl/src/main/kotlin/io/element/android/features/lockscreen/impl/unlock/keypad/PinKeypadModel.kt create mode 100644 features/lockscreen/impl/src/main/res/values-be/translations.xml create mode 100644 features/lockscreen/impl/src/main/res/values-bg/translations.xml create mode 100644 features/lockscreen/impl/src/main/res/values-cs/translations.xml create mode 100644 features/lockscreen/impl/src/main/res/values-cy/translations.xml create mode 100644 features/lockscreen/impl/src/main/res/values-da/translations.xml create mode 100644 features/lockscreen/impl/src/main/res/values-de/translations.xml create mode 100644 features/lockscreen/impl/src/main/res/values-el/translations.xml create mode 100644 features/lockscreen/impl/src/main/res/values-es/translations.xml create mode 100644 features/lockscreen/impl/src/main/res/values-et/translations.xml create mode 100644 features/lockscreen/impl/src/main/res/values-eu/translations.xml create mode 100644 features/lockscreen/impl/src/main/res/values-fa/translations.xml create mode 100644 features/lockscreen/impl/src/main/res/values-fi/translations.xml create mode 100644 features/lockscreen/impl/src/main/res/values-fr/translations.xml create mode 100644 features/lockscreen/impl/src/main/res/values-hu/translations.xml create mode 100644 features/lockscreen/impl/src/main/res/values-in/translations.xml create mode 100644 features/lockscreen/impl/src/main/res/values-it/translations.xml create mode 100644 features/lockscreen/impl/src/main/res/values-ka/translations.xml create mode 100644 features/lockscreen/impl/src/main/res/values-ko/translations.xml create mode 100644 features/lockscreen/impl/src/main/res/values-lt/translations.xml create mode 100644 features/lockscreen/impl/src/main/res/values-nb/translations.xml create mode 100644 features/lockscreen/impl/src/main/res/values-nl/translations.xml create mode 100644 features/lockscreen/impl/src/main/res/values-pl/translations.xml create mode 100644 features/lockscreen/impl/src/main/res/values-pt-rBR/translations.xml create mode 100644 features/lockscreen/impl/src/main/res/values-pt/translations.xml create mode 100644 features/lockscreen/impl/src/main/res/values-ro/translations.xml create mode 100644 features/lockscreen/impl/src/main/res/values-ru/translations.xml create mode 100644 features/lockscreen/impl/src/main/res/values-sk/translations.xml create mode 100644 features/lockscreen/impl/src/main/res/values-sv/translations.xml create mode 100644 features/lockscreen/impl/src/main/res/values-tr/translations.xml create mode 100644 features/lockscreen/impl/src/main/res/values-uk/translations.xml create mode 100644 features/lockscreen/impl/src/main/res/values-ur/translations.xml create mode 100644 features/lockscreen/impl/src/main/res/values-uz/translations.xml create mode 100644 features/lockscreen/impl/src/main/res/values-zh-rTW/translations.xml create mode 100644 features/lockscreen/impl/src/main/res/values-zh/translations.xml create mode 100644 features/lockscreen/impl/src/main/res/values/localazy.xml create mode 100644 features/lockscreen/impl/src/test/kotlin/io/element/android/features/lockscreen/impl/DefaultLockScreenEntryPointIntentTest.kt create mode 100644 features/lockscreen/impl/src/test/kotlin/io/element/android/features/lockscreen/impl/DefaultLockScreenEntryPointTest.kt create mode 100644 features/lockscreen/impl/src/test/kotlin/io/element/android/features/lockscreen/impl/DefaultLockScreenServiceTest.kt create mode 100644 features/lockscreen/impl/src/test/kotlin/io/element/android/features/lockscreen/impl/biometric/FakeBiometricAuthenticator.kt create mode 100644 features/lockscreen/impl/src/test/kotlin/io/element/android/features/lockscreen/impl/biometric/FakeBiometricAuthenticatorManager.kt create mode 100644 features/lockscreen/impl/src/test/kotlin/io/element/android/features/lockscreen/impl/fixtures/LockScreenConfig.kt create mode 100644 features/lockscreen/impl/src/test/kotlin/io/element/android/features/lockscreen/impl/fixtures/PinCodeManager.kt create mode 100644 features/lockscreen/impl/src/test/kotlin/io/element/android/features/lockscreen/impl/pin/DefaultPinCodeManagerTest.kt create mode 100644 features/lockscreen/impl/src/test/kotlin/io/element/android/features/lockscreen/impl/pin/model/PinEntryAssertions.kt create mode 100644 features/lockscreen/impl/src/test/kotlin/io/element/android/features/lockscreen/impl/pin/model/PinEntryTest.kt create mode 100644 features/lockscreen/impl/src/test/kotlin/io/element/android/features/lockscreen/impl/pin/storage/InMemoryLockScreenStore.kt create mode 100644 features/lockscreen/impl/src/test/kotlin/io/element/android/features/lockscreen/impl/settings/LockScreenSettingsPresenterTest.kt create mode 100644 features/lockscreen/impl/src/test/kotlin/io/element/android/features/lockscreen/impl/setup/biometric/SetupBiometricPresenterTest.kt create mode 100644 features/lockscreen/impl/src/test/kotlin/io/element/android/features/lockscreen/impl/setup/pin/SetupPinPresenterTest.kt create mode 100644 features/lockscreen/impl/src/test/kotlin/io/element/android/features/lockscreen/impl/unlock/PinUnlockPresenterTest.kt create mode 100644 features/lockscreen/impl/src/test/kotlin/io/element/android/features/lockscreen/impl/unlock/PinUnlockStateTest.kt create mode 100644 features/lockscreen/impl/src/test/kotlin/io/element/android/features/lockscreen/impl/unlock/keypad/PinKeypadTest.kt create mode 100644 features/lockscreen/test/build.gradle.kts create mode 100644 features/lockscreen/test/src/main/kotlin/io/element/android/features/lockscreen/test/FakeLockScreenEntryPoint.kt create mode 100644 features/lockscreen/test/src/main/kotlin/io/element/android/features/lockscreen/test/FakeLockScreenService.kt create mode 100644 features/login/api/build.gradle.kts create mode 100644 features/login/api/src/main/kotlin/io/element/android/features/login/api/LoginEntryPoint.kt create mode 100644 features/login/api/src/main/kotlin/io/element/android/features/login/api/LoginIntentResolver.kt create mode 100644 features/login/api/src/main/kotlin/io/element/android/features/login/api/LoginParams.kt create mode 100644 features/login/api/src/main/kotlin/io/element/android/features/login/api/accesscontrol/AccountProviderAccessControl.kt create mode 100644 features/login/impl/build.gradle.kts create mode 100644 features/login/impl/src/main/AndroidManifest.xml create mode 100644 features/login/impl/src/main/kotlin/io/element/android/features/login/impl/DefaultLoginEntryPoint.kt create mode 100644 features/login/impl/src/main/kotlin/io/element/android/features/login/impl/DefaultLoginIntentResolver.kt create mode 100644 features/login/impl/src/main/kotlin/io/element/android/features/login/impl/LoginFlowNode.kt create mode 100644 features/login/impl/src/main/kotlin/io/element/android/features/login/impl/accesscontrol/DefaultAccountProviderAccessControl.kt create mode 100644 features/login/impl/src/main/kotlin/io/element/android/features/login/impl/accountprovider/AccountProvider.kt create mode 100644 features/login/impl/src/main/kotlin/io/element/android/features/login/impl/accountprovider/AccountProviderDataSource.kt create mode 100644 features/login/impl/src/main/kotlin/io/element/android/features/login/impl/accountprovider/AccountProviderOtherView.kt create mode 100644 features/login/impl/src/main/kotlin/io/element/android/features/login/impl/accountprovider/AccountProviderProvider.kt create mode 100644 features/login/impl/src/main/kotlin/io/element/android/features/login/impl/accountprovider/AccountProviderView.kt create mode 100644 features/login/impl/src/main/kotlin/io/element/android/features/login/impl/changeserver/AccountProviderAccessException.kt create mode 100644 features/login/impl/src/main/kotlin/io/element/android/features/login/impl/changeserver/ChangeServerEvents.kt create mode 100644 features/login/impl/src/main/kotlin/io/element/android/features/login/impl/changeserver/ChangeServerPresenter.kt create mode 100644 features/login/impl/src/main/kotlin/io/element/android/features/login/impl/changeserver/ChangeServerState.kt create mode 100644 features/login/impl/src/main/kotlin/io/element/android/features/login/impl/changeserver/ChangeServerStateProvider.kt create mode 100644 features/login/impl/src/main/kotlin/io/element/android/features/login/impl/changeserver/ChangeServerView.kt create mode 100644 features/login/impl/src/main/kotlin/io/element/android/features/login/impl/di/LoginModule.kt create mode 100644 features/login/impl/src/main/kotlin/io/element/android/features/login/impl/di/QrCodeLoginBindings.kt create mode 100644 features/login/impl/src/main/kotlin/io/element/android/features/login/impl/di/QrCodeLoginGraph.kt create mode 100644 features/login/impl/src/main/kotlin/io/element/android/features/login/impl/di/QrCodeLoginScope.kt create mode 100644 features/login/impl/src/main/kotlin/io/element/android/features/login/impl/dialogs/SlidingSyncNotSupportedDialog.kt create mode 100644 features/login/impl/src/main/kotlin/io/element/android/features/login/impl/error/ChangeServerError.kt create mode 100644 features/login/impl/src/main/kotlin/io/element/android/features/login/impl/error/ChangeServerErrorProvider.kt create mode 100644 features/login/impl/src/main/kotlin/io/element/android/features/login/impl/error/ErrorFormatter.kt create mode 100644 features/login/impl/src/main/kotlin/io/element/android/features/login/impl/login/LoginHelper.kt create mode 100644 features/login/impl/src/main/kotlin/io/element/android/features/login/impl/login/LoginMode.kt create mode 100644 features/login/impl/src/main/kotlin/io/element/android/features/login/impl/login/LoginModeView.kt create mode 100644 features/login/impl/src/main/kotlin/io/element/android/features/login/impl/login/LoginModeViewErrorProvider.kt create mode 100644 features/login/impl/src/main/kotlin/io/element/android/features/login/impl/qrcode/DefaultQrCodeLoginManager.kt create mode 100644 features/login/impl/src/main/kotlin/io/element/android/features/login/impl/qrcode/QrCodeLoginFlowNode.kt create mode 100644 features/login/impl/src/main/kotlin/io/element/android/features/login/impl/qrcode/QrCodeLoginManager.kt create mode 100644 features/login/impl/src/main/kotlin/io/element/android/features/login/impl/resolver/HomeserverData.kt create mode 100644 features/login/impl/src/main/kotlin/io/element/android/features/login/impl/resolver/HomeserverResolver.kt create mode 100644 features/login/impl/src/main/kotlin/io/element/android/features/login/impl/screens/changeaccountprovider/ChangeAccountProviderNode.kt create mode 100644 features/login/impl/src/main/kotlin/io/element/android/features/login/impl/screens/changeaccountprovider/ChangeAccountProviderPresenter.kt create mode 100644 features/login/impl/src/main/kotlin/io/element/android/features/login/impl/screens/changeaccountprovider/ChangeAccountProviderState.kt create mode 100644 features/login/impl/src/main/kotlin/io/element/android/features/login/impl/screens/changeaccountprovider/ChangeAccountProviderStateProvider.kt create mode 100644 features/login/impl/src/main/kotlin/io/element/android/features/login/impl/screens/changeaccountprovider/ChangeAccountProviderView.kt create mode 100644 features/login/impl/src/main/kotlin/io/element/android/features/login/impl/screens/chooseaccountprovider/ChooseAccountProviderEvents.kt create mode 100644 features/login/impl/src/main/kotlin/io/element/android/features/login/impl/screens/chooseaccountprovider/ChooseAccountProviderNode.kt create mode 100644 features/login/impl/src/main/kotlin/io/element/android/features/login/impl/screens/chooseaccountprovider/ChooseAccountProviderPresenter.kt create mode 100644 features/login/impl/src/main/kotlin/io/element/android/features/login/impl/screens/chooseaccountprovider/ChooseAccountProviderState.kt create mode 100644 features/login/impl/src/main/kotlin/io/element/android/features/login/impl/screens/chooseaccountprovider/ChooseAccountProviderStateProvider.kt create mode 100644 features/login/impl/src/main/kotlin/io/element/android/features/login/impl/screens/chooseaccountprovider/ChooseAccountProviderView.kt create mode 100644 features/login/impl/src/main/kotlin/io/element/android/features/login/impl/screens/confirmaccountprovider/ConfirmAccountProviderEvents.kt create mode 100644 features/login/impl/src/main/kotlin/io/element/android/features/login/impl/screens/confirmaccountprovider/ConfirmAccountProviderNode.kt create mode 100644 features/login/impl/src/main/kotlin/io/element/android/features/login/impl/screens/confirmaccountprovider/ConfirmAccountProviderPresenter.kt create mode 100644 features/login/impl/src/main/kotlin/io/element/android/features/login/impl/screens/confirmaccountprovider/ConfirmAccountProviderState.kt create mode 100644 features/login/impl/src/main/kotlin/io/element/android/features/login/impl/screens/confirmaccountprovider/ConfirmAccountProviderStateProvider.kt create mode 100644 features/login/impl/src/main/kotlin/io/element/android/features/login/impl/screens/confirmaccountprovider/ConfirmAccountProviderView.kt create mode 100644 features/login/impl/src/main/kotlin/io/element/android/features/login/impl/screens/createaccount/AccountCreationNotSupported.kt create mode 100644 features/login/impl/src/main/kotlin/io/element/android/features/login/impl/screens/createaccount/CreateAccountEvents.kt create mode 100644 features/login/impl/src/main/kotlin/io/element/android/features/login/impl/screens/createaccount/CreateAccountNode.kt create mode 100644 features/login/impl/src/main/kotlin/io/element/android/features/login/impl/screens/createaccount/CreateAccountPresenter.kt create mode 100644 features/login/impl/src/main/kotlin/io/element/android/features/login/impl/screens/createaccount/CreateAccountState.kt create mode 100644 features/login/impl/src/main/kotlin/io/element/android/features/login/impl/screens/createaccount/CreateAccountStateProvider.kt create mode 100644 features/login/impl/src/main/kotlin/io/element/android/features/login/impl/screens/createaccount/CreateAccountView.kt create mode 100644 features/login/impl/src/main/kotlin/io/element/android/features/login/impl/screens/createaccount/MessageParser.kt create mode 100644 features/login/impl/src/main/kotlin/io/element/android/features/login/impl/screens/createaccount/MobileRegistrationResponse.kt create mode 100644 features/login/impl/src/main/kotlin/io/element/android/features/login/impl/screens/createaccount/WebViewMessageInterceptor.kt create mode 100644 features/login/impl/src/main/kotlin/io/element/android/features/login/impl/screens/loginpassword/LoginPasswordEvents.kt create mode 100644 features/login/impl/src/main/kotlin/io/element/android/features/login/impl/screens/loginpassword/LoginPasswordNode.kt create mode 100644 features/login/impl/src/main/kotlin/io/element/android/features/login/impl/screens/loginpassword/LoginPasswordPresenter.kt create mode 100644 features/login/impl/src/main/kotlin/io/element/android/features/login/impl/screens/loginpassword/LoginPasswordState.kt create mode 100644 features/login/impl/src/main/kotlin/io/element/android/features/login/impl/screens/loginpassword/LoginPasswordStateProvider.kt create mode 100644 features/login/impl/src/main/kotlin/io/element/android/features/login/impl/screens/loginpassword/LoginPasswordView.kt create mode 100644 features/login/impl/src/main/kotlin/io/element/android/features/login/impl/screens/onboarding/OnBoardingEvents.kt create mode 100644 features/login/impl/src/main/kotlin/io/element/android/features/login/impl/screens/onboarding/OnBoardingLogoResIdProvider.kt create mode 100644 features/login/impl/src/main/kotlin/io/element/android/features/login/impl/screens/onboarding/OnBoardingNode.kt create mode 100644 features/login/impl/src/main/kotlin/io/element/android/features/login/impl/screens/onboarding/OnBoardingPresenter.kt create mode 100644 features/login/impl/src/main/kotlin/io/element/android/features/login/impl/screens/onboarding/OnBoardingState.kt create mode 100644 features/login/impl/src/main/kotlin/io/element/android/features/login/impl/screens/onboarding/OnBoardingStateProvider.kt create mode 100644 features/login/impl/src/main/kotlin/io/element/android/features/login/impl/screens/onboarding/OnBoardingView.kt create mode 100644 features/login/impl/src/main/kotlin/io/element/android/features/login/impl/screens/qrcode/confirmation/QrCodeConfirmationNode.kt create mode 100644 features/login/impl/src/main/kotlin/io/element/android/features/login/impl/screens/qrcode/confirmation/QrCodeConfirmationStep.kt create mode 100644 features/login/impl/src/main/kotlin/io/element/android/features/login/impl/screens/qrcode/confirmation/QrCodeConfirmationStepProvider.kt create mode 100644 features/login/impl/src/main/kotlin/io/element/android/features/login/impl/screens/qrcode/confirmation/QrCodeConfirmationView.kt create mode 100644 features/login/impl/src/main/kotlin/io/element/android/features/login/impl/screens/qrcode/error/QrCodeErrorNode.kt create mode 100644 features/login/impl/src/main/kotlin/io/element/android/features/login/impl/screens/qrcode/error/QrCodeErrorView.kt create mode 100644 features/login/impl/src/main/kotlin/io/element/android/features/login/impl/screens/qrcode/intro/QrCodeIntroEvents.kt create mode 100644 features/login/impl/src/main/kotlin/io/element/android/features/login/impl/screens/qrcode/intro/QrCodeIntroNode.kt create mode 100644 features/login/impl/src/main/kotlin/io/element/android/features/login/impl/screens/qrcode/intro/QrCodeIntroPresenter.kt create mode 100644 features/login/impl/src/main/kotlin/io/element/android/features/login/impl/screens/qrcode/intro/QrCodeIntroState.kt create mode 100644 features/login/impl/src/main/kotlin/io/element/android/features/login/impl/screens/qrcode/intro/QrCodeIntroStateProvider.kt create mode 100644 features/login/impl/src/main/kotlin/io/element/android/features/login/impl/screens/qrcode/intro/QrCodeIntroView.kt create mode 100644 features/login/impl/src/main/kotlin/io/element/android/features/login/impl/screens/qrcode/scan/QrCodeScanEvents.kt create mode 100644 features/login/impl/src/main/kotlin/io/element/android/features/login/impl/screens/qrcode/scan/QrCodeScanNode.kt create mode 100644 features/login/impl/src/main/kotlin/io/element/android/features/login/impl/screens/qrcode/scan/QrCodeScanPresenter.kt create mode 100644 features/login/impl/src/main/kotlin/io/element/android/features/login/impl/screens/qrcode/scan/QrCodeScanState.kt create mode 100644 features/login/impl/src/main/kotlin/io/element/android/features/login/impl/screens/qrcode/scan/QrCodeScanStateProvider.kt create mode 100644 features/login/impl/src/main/kotlin/io/element/android/features/login/impl/screens/qrcode/scan/QrCodeScanView.kt create mode 100644 features/login/impl/src/main/kotlin/io/element/android/features/login/impl/screens/searchaccountprovider/SearchAccountProviderEvents.kt create mode 100644 features/login/impl/src/main/kotlin/io/element/android/features/login/impl/screens/searchaccountprovider/SearchAccountProviderNode.kt create mode 100644 features/login/impl/src/main/kotlin/io/element/android/features/login/impl/screens/searchaccountprovider/SearchAccountProviderPresenter.kt create mode 100644 features/login/impl/src/main/kotlin/io/element/android/features/login/impl/screens/searchaccountprovider/SearchAccountProviderState.kt create mode 100644 features/login/impl/src/main/kotlin/io/element/android/features/login/impl/screens/searchaccountprovider/SearchAccountProviderStateProvider.kt create mode 100644 features/login/impl/src/main/kotlin/io/element/android/features/login/impl/screens/searchaccountprovider/SearchAccountProviderView.kt create mode 100644 features/login/impl/src/main/kotlin/io/element/android/features/login/impl/util/Util.kt create mode 100644 features/login/impl/src/main/kotlin/io/element/android/features/login/impl/web/WebClientUrlForAuthenticationRetriever.kt create mode 100644 features/login/impl/src/main/res/drawable/ic_matrix.xml create mode 100644 features/login/impl/src/main/res/raw/keep.xml create mode 100644 features/login/impl/src/main/res/values-be/translations.xml create mode 100644 features/login/impl/src/main/res/values-bg/translations.xml create mode 100644 features/login/impl/src/main/res/values-cs/translations.xml create mode 100644 features/login/impl/src/main/res/values-cy/translations.xml create mode 100644 features/login/impl/src/main/res/values-da/translations.xml create mode 100644 features/login/impl/src/main/res/values-de/translations.xml create mode 100644 features/login/impl/src/main/res/values-el/translations.xml create mode 100644 features/login/impl/src/main/res/values-en-rUS/translations.xml create mode 100644 features/login/impl/src/main/res/values-es/translations.xml create mode 100644 features/login/impl/src/main/res/values-et/translations.xml create mode 100644 features/login/impl/src/main/res/values-eu/translations.xml create mode 100644 features/login/impl/src/main/res/values-fa/translations.xml create mode 100644 features/login/impl/src/main/res/values-fi/translations.xml create mode 100644 features/login/impl/src/main/res/values-fr/translations.xml create mode 100644 features/login/impl/src/main/res/values-hu/translations.xml create mode 100644 features/login/impl/src/main/res/values-in/translations.xml create mode 100644 features/login/impl/src/main/res/values-it/translations.xml create mode 100644 features/login/impl/src/main/res/values-ka/translations.xml create mode 100644 features/login/impl/src/main/res/values-ko/translations.xml create mode 100644 features/login/impl/src/main/res/values-lt/translations.xml create mode 100644 features/login/impl/src/main/res/values-nb/translations.xml create mode 100644 features/login/impl/src/main/res/values-nl/translations.xml create mode 100644 features/login/impl/src/main/res/values-pl/translations.xml create mode 100644 features/login/impl/src/main/res/values-pt-rBR/translations.xml create mode 100644 features/login/impl/src/main/res/values-pt/translations.xml create mode 100644 features/login/impl/src/main/res/values-ro/translations.xml create mode 100644 features/login/impl/src/main/res/values-ru/translations.xml create mode 100644 features/login/impl/src/main/res/values-sk/translations.xml create mode 100644 features/login/impl/src/main/res/values-sv/translations.xml create mode 100644 features/login/impl/src/main/res/values-tr/translations.xml create mode 100644 features/login/impl/src/main/res/values-uk/translations.xml create mode 100644 features/login/impl/src/main/res/values-ur/translations.xml create mode 100644 features/login/impl/src/main/res/values-uz/translations.xml create mode 100644 features/login/impl/src/main/res/values-zh-rTW/translations.xml create mode 100644 features/login/impl/src/main/res/values-zh/translations.xml create mode 100644 features/login/impl/src/main/res/values/localazy.xml create mode 100644 features/login/impl/src/test/kotlin/io/element/android/features/login/impl/DefaultLoginEntryPointTest.kt create mode 100644 features/login/impl/src/test/kotlin/io/element/android/features/login/impl/DefaultLoginIntentResolverTest.kt create mode 100644 features/login/impl/src/test/kotlin/io/element/android/features/login/impl/accesscontrol/DefaultAccountProviderAccessControlTest.kt create mode 100644 features/login/impl/src/test/kotlin/io/element/android/features/login/impl/accountprovider/AccountProviderDataSourceTest.kt create mode 100644 features/login/impl/src/test/kotlin/io/element/android/features/login/impl/changeserver/ChangeServerPresenterTest.kt create mode 100644 features/login/impl/src/test/kotlin/io/element/android/features/login/impl/di/FakeQrCodeLoginGraph.kt create mode 100644 features/login/impl/src/test/kotlin/io/element/android/features/login/impl/error/ErrorFormatterTest.kt create mode 100644 features/login/impl/src/test/kotlin/io/element/android/features/login/impl/qrcode/DefaultQrCodeLoginManagerTest.kt create mode 100644 features/login/impl/src/test/kotlin/io/element/android/features/login/impl/qrcode/FakeQrCodeLoginManager.kt create mode 100644 features/login/impl/src/test/kotlin/io/element/android/features/login/impl/qrcode/QrCodeLoginFlowNodeTest.kt create mode 100644 features/login/impl/src/test/kotlin/io/element/android/features/login/impl/screens/changeaccountprovider/ChangeAccountProviderPresenterTest.kt create mode 100644 features/login/impl/src/test/kotlin/io/element/android/features/login/impl/screens/chooseaccountprovider/ChooseAccountProviderPresenterTest.kt create mode 100644 features/login/impl/src/test/kotlin/io/element/android/features/login/impl/screens/chooseaccountprovider/ChooseAccountProviderStateTest.kt create mode 100644 features/login/impl/src/test/kotlin/io/element/android/features/login/impl/screens/chooseaccountprovider/ChooseAccountProviderViewTest.kt create mode 100644 features/login/impl/src/test/kotlin/io/element/android/features/login/impl/screens/confirmaccountprovider/ConfirmAccountProviderPresenterTest.kt create mode 100644 features/login/impl/src/test/kotlin/io/element/android/features/login/impl/screens/createaccount/CreateAccountPresenterTest.kt create mode 100644 features/login/impl/src/test/kotlin/io/element/android/features/login/impl/screens/createaccount/DefaultMessageParserTest.kt create mode 100644 features/login/impl/src/test/kotlin/io/element/android/features/login/impl/screens/createaccount/FakeMessageParser.kt create mode 100644 features/login/impl/src/test/kotlin/io/element/android/features/login/impl/screens/loginpassword/LoginPasswordPresenterTest.kt create mode 100644 features/login/impl/src/test/kotlin/io/element/android/features/login/impl/screens/loginpassword/LoginPasswordViewTest.kt create mode 100644 features/login/impl/src/test/kotlin/io/element/android/features/login/impl/screens/onboarding/DefaultOnBoardingLogoResIdProviderTest.kt create mode 100644 features/login/impl/src/test/kotlin/io/element/android/features/login/impl/screens/onboarding/OnBoardingPresenterTest.kt create mode 100644 features/login/impl/src/test/kotlin/io/element/android/features/login/impl/screens/onboarding/OnboardingViewTest.kt create mode 100644 features/login/impl/src/test/kotlin/io/element/android/features/login/impl/screens/qrcode/confirmation/QrCodeConfirmationViewTest.kt create mode 100644 features/login/impl/src/test/kotlin/io/element/android/features/login/impl/screens/qrcode/error/QrCodeErrorViewTest.kt create mode 100644 features/login/impl/src/test/kotlin/io/element/android/features/login/impl/screens/qrcode/intro/QrCodeIntroPresenterTest.kt create mode 100644 features/login/impl/src/test/kotlin/io/element/android/features/login/impl/screens/qrcode/intro/QrCodeIntroViewTest.kt create mode 100644 features/login/impl/src/test/kotlin/io/element/android/features/login/impl/screens/qrcode/scan/QrCodeScanPresenterTest.kt create mode 100644 features/login/impl/src/test/kotlin/io/element/android/features/login/impl/screens/qrcode/scan/QrCodeScanViewTest.kt create mode 100644 features/login/impl/src/test/kotlin/io/element/android/features/login/impl/screens/searchaccountprovider/SearchAccountProviderPresenterTest.kt create mode 100644 features/login/impl/src/test/kotlin/io/element/android/features/login/impl/web/FakeWebClientUrlForAuthenticationRetriever.kt create mode 100644 features/login/test/build.gradle.kts create mode 100644 features/login/test/src/main/kotlin/io/element/android/features/login/test/FakeLoginIntentResolver.kt create mode 100644 features/logout/api/build.gradle.kts create mode 100644 features/logout/api/src/main/kotlin/io/element/android/features/logout/api/LogoutEntryPoint.kt create mode 100644 features/logout/api/src/main/kotlin/io/element/android/features/logout/api/LogoutUseCase.kt create mode 100644 features/logout/api/src/main/kotlin/io/element/android/features/logout/api/direct/DirectLogoutEvents.kt create mode 100644 features/logout/api/src/main/kotlin/io/element/android/features/logout/api/direct/DirectLogoutState.kt create mode 100644 features/logout/api/src/main/kotlin/io/element/android/features/logout/api/direct/DirectLogoutStateProvider.kt create mode 100644 features/logout/api/src/main/kotlin/io/element/android/features/logout/api/direct/DirectLogoutView.kt create mode 100644 features/logout/impl/build.gradle.kts create mode 100644 features/logout/impl/src/main/kotlin/io/element/android/features/logout/impl/DefaultLogoutEntryPoint.kt create mode 100644 features/logout/impl/src/main/kotlin/io/element/android/features/logout/impl/DefaultLogoutUseCase.kt create mode 100644 features/logout/impl/src/main/kotlin/io/element/android/features/logout/impl/LogoutEvents.kt create mode 100644 features/logout/impl/src/main/kotlin/io/element/android/features/logout/impl/LogoutNode.kt create mode 100644 features/logout/impl/src/main/kotlin/io/element/android/features/logout/impl/LogoutPresenter.kt create mode 100644 features/logout/impl/src/main/kotlin/io/element/android/features/logout/impl/LogoutState.kt create mode 100644 features/logout/impl/src/main/kotlin/io/element/android/features/logout/impl/LogoutStateProvider.kt create mode 100644 features/logout/impl/src/main/kotlin/io/element/android/features/logout/impl/LogoutView.kt create mode 100644 features/logout/impl/src/main/kotlin/io/element/android/features/logout/impl/di/LogoutModule.kt create mode 100644 features/logout/impl/src/main/kotlin/io/element/android/features/logout/impl/direct/DefaultDirectLogoutView.kt create mode 100644 features/logout/impl/src/main/kotlin/io/element/android/features/logout/impl/direct/DirectLogoutPresenter.kt create mode 100644 features/logout/impl/src/main/kotlin/io/element/android/features/logout/impl/tools/Extensions.kt create mode 100644 features/logout/impl/src/main/kotlin/io/element/android/features/logout/impl/ui/LogoutActionDialog.kt create mode 100644 features/logout/impl/src/main/kotlin/io/element/android/features/logout/impl/ui/LogoutConfirmationDialog.kt create mode 100644 features/logout/impl/src/main/res/values-be/translations.xml create mode 100644 features/logout/impl/src/main/res/values-bg/translations.xml create mode 100644 features/logout/impl/src/main/res/values-cs/translations.xml create mode 100644 features/logout/impl/src/main/res/values-cy/translations.xml create mode 100644 features/logout/impl/src/main/res/values-da/translations.xml create mode 100644 features/logout/impl/src/main/res/values-de/translations.xml create mode 100644 features/logout/impl/src/main/res/values-el/translations.xml create mode 100644 features/logout/impl/src/main/res/values-es/translations.xml create mode 100644 features/logout/impl/src/main/res/values-et/translations.xml create mode 100644 features/logout/impl/src/main/res/values-eu/translations.xml create mode 100644 features/logout/impl/src/main/res/values-fa/translations.xml create mode 100644 features/logout/impl/src/main/res/values-fi/translations.xml create mode 100644 features/logout/impl/src/main/res/values-fr/translations.xml create mode 100644 features/logout/impl/src/main/res/values-hu/translations.xml create mode 100644 features/logout/impl/src/main/res/values-in/translations.xml create mode 100644 features/logout/impl/src/main/res/values-it/translations.xml create mode 100644 features/logout/impl/src/main/res/values-ka/translations.xml create mode 100644 features/logout/impl/src/main/res/values-ko/translations.xml create mode 100644 features/logout/impl/src/main/res/values-lt/translations.xml create mode 100644 features/logout/impl/src/main/res/values-nb/translations.xml create mode 100644 features/logout/impl/src/main/res/values-nl/translations.xml create mode 100644 features/logout/impl/src/main/res/values-pl/translations.xml create mode 100644 features/logout/impl/src/main/res/values-pt-rBR/translations.xml create mode 100644 features/logout/impl/src/main/res/values-pt/translations.xml create mode 100644 features/logout/impl/src/main/res/values-ro/translations.xml create mode 100644 features/logout/impl/src/main/res/values-ru/translations.xml create mode 100644 features/logout/impl/src/main/res/values-sk/translations.xml create mode 100644 features/logout/impl/src/main/res/values-sv/translations.xml create mode 100644 features/logout/impl/src/main/res/values-tr/translations.xml create mode 100644 features/logout/impl/src/main/res/values-uk/translations.xml create mode 100644 features/logout/impl/src/main/res/values-ur/translations.xml create mode 100644 features/logout/impl/src/main/res/values-uz/translations.xml create mode 100644 features/logout/impl/src/main/res/values-zh-rTW/translations.xml create mode 100644 features/logout/impl/src/main/res/values-zh/translations.xml create mode 100644 features/logout/impl/src/main/res/values/localazy.xml create mode 100644 features/logout/impl/src/test/kotlin/io/element/android/features/logout/impl/DefaultLogoutEntryPointTest.kt create mode 100644 features/logout/impl/src/test/kotlin/io/element/android/features/logout/impl/DefaultLogoutUseCaseTest.kt create mode 100644 features/logout/impl/src/test/kotlin/io/element/android/features/logout/impl/LogoutPresenterTest.kt create mode 100644 features/logout/impl/src/test/kotlin/io/element/android/features/logout/impl/LogoutViewTest.kt create mode 100644 features/logout/impl/src/test/kotlin/io/element/android/features/logout/impl/direct/DefaultDirectLogoutViewTest.kt create mode 100644 features/logout/impl/src/test/kotlin/io/element/android/features/logout/impl/direct/DirectLogoutPresenterTest.kt create mode 100644 features/logout/test/build.gradle.kts create mode 100644 features/logout/test/src/main/kotlin/io/element/android/features/logout/test/FakeLogoutEntryPoint.kt create mode 100644 features/logout/test/src/main/kotlin/io/element/android/features/logout/test/FakeLogoutUseCase.kt create mode 100644 features/messages/api/.gitignore create mode 100644 features/messages/api/build.gradle.kts create mode 100644 features/messages/api/src/main/kotlin/io/element/android/features/messages/api/MessageComposerContext.kt create mode 100644 features/messages/api/src/main/kotlin/io/element/android/features/messages/api/MessagesEntryPoint.kt create mode 100644 features/messages/api/src/main/kotlin/io/element/android/features/messages/api/pinned/PinnedEventsTimelineProvider.kt create mode 100644 features/messages/api/src/main/kotlin/io/element/android/features/messages/api/timeline/HtmlConverterProvider.kt create mode 100644 features/messages/api/src/main/kotlin/io/element/android/features/messages/api/timeline/voicemessages/composer/VoiceMessageComposerEvent.kt create mode 100644 features/messages/api/src/main/kotlin/io/element/android/features/messages/api/timeline/voicemessages/composer/VoiceMessageComposerPresenter.kt create mode 100644 features/messages/api/src/main/kotlin/io/element/android/features/messages/api/timeline/voicemessages/composer/VoiceMessageComposerState.kt create mode 100644 features/messages/api/src/main/kotlin/io/element/android/features/messages/api/timeline/voicemessages/composer/VoiceMessageComposerStateProvider.kt create mode 100644 features/messages/impl/.gitignore create mode 100644 features/messages/impl/build.gradle.kts create mode 100644 features/messages/impl/consumer-rules.pro create mode 100644 features/messages/impl/src/main/AndroidManifest.xml create mode 100644 features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/DefaultMessagesEntryPoint.kt create mode 100644 features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/MessagesEvents.kt create mode 100644 features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/MessagesFlowNode.kt create mode 100644 features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/MessagesNavigator.kt create mode 100644 features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/MessagesNode.kt create mode 100644 features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/MessagesPresenter.kt create mode 100644 features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/MessagesState.kt create mode 100644 features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/MessagesStateProvider.kt create mode 100644 features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/MessagesView.kt create mode 100644 features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/UserEventPermissions.kt create mode 100644 features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/actionlist/ActionListEvents.kt create mode 100644 features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/actionlist/ActionListPresenter.kt create mode 100644 features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/actionlist/ActionListState.kt create mode 100644 features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/actionlist/ActionListStateProvider.kt create mode 100644 features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/actionlist/ActionListView.kt create mode 100644 features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/actionlist/model/TimelineItemAction.kt create mode 100644 features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/actionlist/model/TimelineItemActionComparator.kt create mode 100644 features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/actionlist/model/TimelineItemActionPostProcessor.kt create mode 100644 features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/attachments/Attachment.kt create mode 100644 features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/attachments/preview/AttachmentsPreviewEvents.kt create mode 100644 features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/attachments/preview/AttachmentsPreviewNode.kt create mode 100644 features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/attachments/preview/AttachmentsPreviewPresenter.kt create mode 100644 features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/attachments/preview/AttachmentsPreviewState.kt create mode 100644 features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/attachments/preview/AttachmentsPreviewStateProvider.kt create mode 100644 features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/attachments/preview/AttachmentsPreviewView.kt create mode 100644 features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/attachments/preview/OnDoneListener.kt create mode 100644 features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/attachments/preview/error/ErrorFormatter.kt create mode 100644 features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/attachments/video/DefaultMediaOptimizationSelectorPresenter.kt create mode 100644 features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/attachments/video/MediaOptimizationSelectorEvent.kt create mode 100644 features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/attachments/video/MediaOptimizationSelectorPresenter.kt create mode 100644 features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/attachments/video/MediaOptimizationSelectorState.kt create mode 100644 features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/attachments/video/VideoMetadataExtractor.kt create mode 100644 features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/crypto/identity/IdentityChangeEvent.kt create mode 100644 features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/crypto/identity/IdentityChangeState.kt create mode 100644 features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/crypto/identity/IdentityChangeStatePresenter.kt create mode 100644 features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/crypto/identity/IdentityChangeStateProvider.kt create mode 100644 features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/crypto/identity/IdentityChangeStateView.kt create mode 100644 features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/crypto/identity/MessagesViewWithIdentityChangePreview.kt create mode 100644 features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/crypto/sendfailure/VerifiedUserSendFailure.kt create mode 100644 features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/crypto/sendfailure/VerifiedUserSendFailureFactory.kt create mode 100644 features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/crypto/sendfailure/resolve/ResolveVerifiedUserSendFailureEvents.kt create mode 100644 features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/crypto/sendfailure/resolve/ResolveVerifiedUserSendFailurePresenter.kt create mode 100644 features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/crypto/sendfailure/resolve/ResolveVerifiedUserSendFailureState.kt create mode 100644 features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/crypto/sendfailure/resolve/ResolveVerifiedUserSendFailureStateProvider.kt create mode 100644 features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/crypto/sendfailure/resolve/ResolveVerifiedUserSendFailureView.kt create mode 100644 features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/crypto/sendfailure/resolve/VerifiedUserSendFailureIterator.kt create mode 100644 features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/crypto/sendfailure/resolve/VerifiedUserSendFailureResolver.kt create mode 100644 features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/di/MessagesBindsModule.kt create mode 100644 features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/di/MessagesProvidesModule.kt create mode 100644 features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/draft/ComposerDraftService.kt create mode 100644 features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/draft/ComposerDraftStore.kt create mode 100644 features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/draft/DefaultComposerDraftService.kt create mode 100644 features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/draft/MatrixComposerDraftStore.kt create mode 100644 features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/draft/VolatileComposerDraftStore.kt create mode 100644 features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/link/ConfirmingLinkClick.kt create mode 100644 features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/link/LinkChecker.kt create mode 100644 features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/link/LinkEvents.kt create mode 100644 features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/link/LinkPresenter.kt create mode 100644 features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/link/LinkState.kt create mode 100644 features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/link/LinkStateProvider.kt create mode 100644 features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/link/LinkView.kt create mode 100644 features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/messagecomposer/AttachmentsBottomSheet.kt create mode 100644 features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/messagecomposer/DefaultMessageComposerContext.kt create mode 100644 features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/messagecomposer/DisabledComposerView.kt create mode 100644 features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/messagecomposer/MessageComposerEvent.kt create mode 100644 features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/messagecomposer/MessageComposerPresenter.kt create mode 100644 features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/messagecomposer/MessageComposerState.kt create mode 100644 features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/messagecomposer/MessageComposerStateProvider.kt create mode 100644 features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/messagecomposer/MessageComposerView.kt create mode 100644 features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/messagecomposer/RichTextEditorStateFactory.kt create mode 100644 features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/messagecomposer/suggestions/RoomAliasSuggestionsDataSource.kt create mode 100644 features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/messagecomposer/suggestions/SuggestionsPickerView.kt create mode 100644 features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/messagecomposer/suggestions/SuggestionsProcessor.kt create mode 100644 features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/pinned/DefaultPinnedEventsTimelineProvider.kt create mode 100644 features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/pinned/banner/PinnedMessagesBannerEvents.kt create mode 100644 features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/pinned/banner/PinnedMessagesBannerItem.kt create mode 100644 features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/pinned/banner/PinnedMessagesBannerItemFactory.kt create mode 100644 features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/pinned/banner/PinnedMessagesBannerPresenter.kt create mode 100644 features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/pinned/banner/PinnedMessagesBannerState.kt create mode 100644 features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/pinned/banner/PinnedMessagesBannerStateProvider.kt create mode 100644 features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/pinned/banner/PinnedMessagesBannerView.kt create mode 100644 features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/pinned/list/PinnedMessagesListEvents.kt create mode 100644 features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/pinned/list/PinnedMessagesListNavigator.kt create mode 100644 features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/pinned/list/PinnedMessagesListNode.kt create mode 100644 features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/pinned/list/PinnedMessagesListPresenter.kt create mode 100644 features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/pinned/list/PinnedMessagesListState.kt create mode 100644 features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/pinned/list/PinnedMessagesListStateProvider.kt create mode 100644 features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/pinned/list/PinnedMessagesListTimelineActionPostProcessor.kt create mode 100644 features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/pinned/list/PinnedMessagesListView.kt create mode 100644 features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/report/ReportMessageEvents.kt create mode 100644 features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/report/ReportMessageNode.kt create mode 100644 features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/report/ReportMessagePresenter.kt create mode 100644 features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/report/ReportMessageState.kt create mode 100644 features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/report/ReportMessageStateProvider.kt create mode 100644 features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/report/ReportMessageView.kt create mode 100644 features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/threads/ThreadedMessagesNode.kt create mode 100644 features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/DefaultHtmlConverterProvider.kt create mode 100644 features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/MarkAsFullyRead.kt create mode 100644 features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/TimelineController.kt create mode 100644 features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/TimelineEvents.kt create mode 100644 features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/TimelineItemIndexer.kt create mode 100644 features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/TimelinePresenter.kt create mode 100644 features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/TimelineState.kt create mode 100644 features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/TimelineStateProvider.kt create mode 100644 features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/TimelineView.kt create mode 100644 features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/TimelineViewMessageShieldPreview.kt create mode 100644 features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/a11y/Reactions.kt create mode 100644 features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/components/ATimelineItemEventRow.kt create mode 100644 features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/components/CallMenuItem.kt create mode 100644 features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/components/ContentPadding.kt create mode 100644 features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/components/MessageEventBubble.kt create mode 100644 features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/components/MessageShieldView.kt create mode 100644 features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/components/MessageStateEventContainer.kt create mode 100644 features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/components/MessagesReactionButton.kt create mode 100644 features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/components/ReplySwipeIndicator.kt create mode 100644 features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/components/TimelineEventTimestampView.kt create mode 100644 features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/components/TimelineItemCallNotifyView.kt create mode 100644 features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/components/TimelineItemEventForTimestampViewProvider.kt create mode 100644 features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/components/TimelineItemEventRow.kt create mode 100644 features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/components/TimelineItemEventRowDisambiguatedPreview.kt create mode 100644 features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/components/TimelineItemEventRowForDirectRoomPreview.kt create mode 100644 features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/components/TimelineItemEventRowLongSenderNamePreview.kt create mode 100644 features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/components/TimelineItemEventRowShieldPreview.kt create mode 100644 features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/components/TimelineItemEventRowTimestampPreview.kt create mode 100644 features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/components/TimelineItemEventRowUtdPreview.kt create mode 100644 features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/components/TimelineItemEventRowWithManyReactionsPreview.kt create mode 100644 features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/components/TimelineItemEventRowWithRRPreview.kt create mode 100644 features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/components/TimelineItemEventRowWithReplyInformativePreview.kt create mode 100644 features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/components/TimelineItemEventRowWithReplyOtherPreview.kt create mode 100644 features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/components/TimelineItemEventRowWithReplyPreview.kt create mode 100644 features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/components/TimelineItemEventTimestampBelowPreview.kt create mode 100644 features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/components/TimelineItemGroupedEventsRow.kt create mode 100644 features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/components/TimelineItemReactionsLayout.kt create mode 100644 features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/components/TimelineItemReactionsView.kt create mode 100644 features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/components/TimelineItemRow.kt create mode 100644 features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/components/TimelineItemStateEventRow.kt create mode 100644 features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/components/TimelineItemVirtualRow.kt create mode 100644 features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/components/TimestampPosition.kt create mode 100644 features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/components/customreaction/CustomReactionBottomSheet.kt create mode 100644 features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/components/customreaction/CustomReactionEvents.kt create mode 100644 features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/components/customreaction/CustomReactionPresenter.kt create mode 100644 features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/components/customreaction/CustomReactionState.kt create mode 100644 features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/components/customreaction/EmojiItem.kt create mode 100644 features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/components/customreaction/EmojibaseExtensions.kt create mode 100644 features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/components/customreaction/picker/EmojiPicker.kt create mode 100644 features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/components/customreaction/picker/EmojiPickerEvents.kt create mode 100644 features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/components/customreaction/picker/EmojiPickerPresenter.kt create mode 100644 features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/components/customreaction/picker/EmojiPickerState.kt create mode 100644 features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/components/customreaction/picker/EmojiPickerStateProvider.kt create mode 100644 features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/components/event/TimelineItemAspectRatioBox.kt create mode 100644 features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/components/event/TimelineItemAttachmentView.kt create mode 100644 features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/components/event/TimelineItemAudioView.kt create mode 100644 features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/components/event/TimelineItemEncryptedView.kt create mode 100644 features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/components/event/TimelineItemEventContentView.kt create mode 100644 features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/components/event/TimelineItemFileView.kt create mode 100644 features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/components/event/TimelineItemImageView.kt create mode 100644 features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/components/event/TimelineItemInformativeView.kt create mode 100644 features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/components/event/TimelineItemLegacyCallInviteView.kt create mode 100644 features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/components/event/TimelineItemLocationView.kt create mode 100644 features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/components/event/TimelineItemPollView.kt create mode 100644 features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/components/event/TimelineItemRedactedView.kt create mode 100644 features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/components/event/TimelineItemStateView.kt create mode 100644 features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/components/event/TimelineItemStickerView.kt create mode 100644 features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/components/event/TimelineItemTextView.kt create mode 100644 features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/components/event/TimelineItemUnknownView.kt create mode 100644 features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/components/event/TimelineItemVideoView.kt create mode 100644 features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/components/event/TimelineItemVoiceView.kt create mode 100644 features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/components/group/GroupHeaderView.kt create mode 100644 features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/components/layout/ContentAvoidingLayout.kt create mode 100644 features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/components/reactionsummary/ReactionSummaryEvents.kt create mode 100644 features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/components/reactionsummary/ReactionSummaryPresenter.kt create mode 100644 features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/components/reactionsummary/ReactionSummaryState.kt create mode 100644 features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/components/reactionsummary/ReactionSummaryStateProvider.kt create mode 100644 features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/components/reactionsummary/ReactionSummaryView.kt create mode 100644 features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/components/receipt/ReadReceiptViewState.kt create mode 100644 features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/components/receipt/ReadReceiptViewStateForTimelineItemEventRowProvider.kt create mode 100644 features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/components/receipt/ReadReceiptViewStateProvider.kt create mode 100644 features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/components/receipt/TimelineItemReadReceiptView.kt create mode 100644 features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/components/receipt/bottomsheet/ReadReceiptBottomSheet.kt create mode 100644 features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/components/receipt/bottomsheet/ReadReceiptBottomSheetEvents.kt create mode 100644 features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/components/receipt/bottomsheet/ReadReceiptBottomSheetPresenter.kt create mode 100644 features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/components/receipt/bottomsheet/ReadReceiptBottomSheetState.kt create mode 100644 features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/components/receipt/bottomsheet/ReadReceiptBottomSheetStateProvider.kt create mode 100644 features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/components/virtual/TimelineItemDaySeparatorView.kt create mode 100644 features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/components/virtual/TimelineItemReadMarkerView.kt create mode 100644 features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/components/virtual/TimelineItemRoomBeginningView.kt create mode 100644 features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/components/virtual/TimelineLoadingMoreIndicator.kt create mode 100644 features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/debug/EventDebugInfoNode.kt create mode 100644 features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/debug/EventDebugInfoView.kt create mode 100644 features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/di/FakeTimelineItemPresenterFactories.kt create mode 100644 features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/di/LiveTimeline.kt create mode 100644 features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/di/LocalTimelineItemPresenterFactories.kt create mode 100644 features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/di/TimelineItemEventContentKey.kt create mode 100644 features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/di/TimelineItemPresenterFactories.kt create mode 100644 features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/di/TimelineItemPresenterFactory.kt create mode 100644 features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/diff/TimelineItemsCacheInvalidator.kt create mode 100644 features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/factories/TimelineItemsFactory.kt create mode 100644 features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/factories/TimelineItemsFactoryConfig.kt create mode 100644 features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/factories/event/TimelineItemContentFactory.kt create mode 100644 features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/factories/event/TimelineItemContentFailedToParseMessageFactory.kt create mode 100644 features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/factories/event/TimelineItemContentFailedToParseStateFactory.kt create mode 100644 features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/factories/event/TimelineItemContentMessageFactory.kt create mode 100644 features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/factories/event/TimelineItemContentPollFactory.kt create mode 100644 features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/factories/event/TimelineItemContentProfileChangeFactory.kt create mode 100644 features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/factories/event/TimelineItemContentRedactedFactory.kt create mode 100644 features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/factories/event/TimelineItemContentRoomMembershipFactory.kt create mode 100644 features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/factories/event/TimelineItemContentStateFactory.kt create mode 100644 features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/factories/event/TimelineItemContentStickerFactory.kt create mode 100644 features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/factories/event/TimelineItemContentUTDFactory.kt create mode 100644 features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/factories/event/TimelineItemEventFactory.kt create mode 100644 features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/factories/virtual/TimelineItemDaySeparatorFactory.kt create mode 100644 features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/factories/virtual/TimelineItemVirtualFactory.kt create mode 100644 features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/focus/FocusRequestStateProvider.kt create mode 100644 features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/focus/FocusRequestStateView.kt create mode 100644 features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/groups/Groupability.kt create mode 100644 features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/groups/TimelineItemGrouper.kt create mode 100644 features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/model/AggregatedReaction.kt create mode 100644 features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/model/AggregatedReactionProvider.kt create mode 100644 features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/model/AggregatedReactionSender.kt create mode 100644 features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/model/NewEventState.kt create mode 100644 features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/model/TimelineItem.kt create mode 100644 features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/model/TimelineItemGroupPosition.kt create mode 100644 features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/model/TimelineItemReactions.kt create mode 100644 features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/model/TimelineItemReactionsProvider.kt create mode 100644 features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/model/TimelineItemReadReceipts.kt create mode 100644 features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/model/bubble/BubbleState.kt create mode 100644 features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/model/bubble/BubbleStateProvider.kt create mode 100644 features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/model/event/TimelineItemAudioContent.kt create mode 100644 features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/model/event/TimelineItemAudioContentProvider.kt create mode 100644 features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/model/event/TimelineItemEmoteContent.kt create mode 100644 features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/model/event/TimelineItemEncryptedContent.kt create mode 100644 features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/model/event/TimelineItemEncryptedContentProvider.kt create mode 100644 features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/model/event/TimelineItemEventContent.kt create mode 100644 features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/model/event/TimelineItemEventContentProvider.kt create mode 100644 features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/model/event/TimelineItemFileContent.kt create mode 100644 features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/model/event/TimelineItemFileContentProvider.kt create mode 100644 features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/model/event/TimelineItemImageContent.kt create mode 100644 features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/model/event/TimelineItemImageContentProvider.kt create mode 100644 features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/model/event/TimelineItemLegacyCallInviteContent.kt create mode 100644 features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/model/event/TimelineItemLocationContent.kt create mode 100644 features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/model/event/TimelineItemLocationContentProvider.kt create mode 100644 features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/model/event/TimelineItemNoticeContent.kt create mode 100644 features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/model/event/TimelineItemPollContent.kt create mode 100644 features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/model/event/TimelineItemPollContentProvider.kt create mode 100644 features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/model/event/TimelineItemProfileChangeContent.kt create mode 100644 features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/model/event/TimelineItemRedactedContent.kt create mode 100644 features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/model/event/TimelineItemRoomMembershipContent.kt create mode 100644 features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/model/event/TimelineItemRtcNotificationContent.kt create mode 100644 features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/model/event/TimelineItemStateContent.kt create mode 100644 features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/model/event/TimelineItemStateEventContent.kt create mode 100644 features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/model/event/TimelineItemStickerContent.kt create mode 100644 features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/model/event/TimelineItemStickerContentProvider.kt create mode 100644 features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/model/event/TimelineItemTextBasedContent.kt create mode 100644 features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/model/event/TimelineItemTextContent.kt create mode 100644 features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/model/event/TimelineItemUnknownContent.kt create mode 100644 features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/model/event/TimelineItemVideoContent.kt create mode 100644 features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/model/event/TimelineItemVideoContentProvider.kt create mode 100644 features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/model/event/TimelineItemVoiceContent.kt create mode 100644 features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/model/event/TimelineItemVoiceContentProvider.kt create mode 100644 features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/model/virtual/TimelineItemDaySeparatorModel.kt create mode 100644 features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/model/virtual/TimelineItemDaySeparatorModelProvider.kt create mode 100644 features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/model/virtual/TimelineItemLastForwardIndicatorModel.kt create mode 100644 features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/model/virtual/TimelineItemLoadingIndicatorModel.kt create mode 100644 features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/model/virtual/TimelineItemReadMarkerModel.kt create mode 100644 features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/model/virtual/TimelineItemRoomBeginningModel.kt create mode 100644 features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/model/virtual/TimelineItemTypingNotificationModel.kt create mode 100644 features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/model/virtual/TimelineItemVirtualModel.kt create mode 100644 features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/protection/AspectRatioProvider.kt create mode 100644 features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/protection/ProtectedView.kt create mode 100644 features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/protection/RatioHelper.kt create mode 100644 features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/protection/TimelineItem.kt create mode 100644 features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/protection/TimelineProtectionEvent.kt create mode 100644 features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/protection/TimelineProtectionPresenter.kt create mode 100644 features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/protection/TimelineProtectionState.kt create mode 100644 features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/protection/TimelineProtectionStateProvider.kt create mode 100644 features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/util/Modifiers.kt create mode 100644 features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/topbars/MessagesViewTopBar.kt create mode 100644 features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/topbars/ThreadTopBar.kt create mode 100644 features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/typing/TypingNotificationPresenter.kt create mode 100644 features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/typing/TypingNotificationState.kt create mode 100644 features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/typing/TypingNotificationStateProvider.kt create mode 100644 features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/typing/TypingNotificationView.kt create mode 100644 features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/typing/TypingRoomMember.kt create mode 100644 features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/utils/Emoji.kt create mode 100644 features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/utils/TextPillificationHelper.kt create mode 100644 features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/utils/messagesummary/DefaultMessageSummaryFormatter.kt create mode 100644 features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/utils/messagesummary/MessageSummaryFormatter.kt create mode 100644 features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/voicemessages/composer/DefaultVoiceMessageComposerPresenter.kt create mode 100644 features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/voicemessages/composer/VoiceMessageComposerPlayer.kt create mode 100644 features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/voicemessages/composer/VoiceMessagePermissionRationaleDialog.kt create mode 100644 features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/voicemessages/composer/VoiceMessageSendingFailedDialog.kt create mode 100644 features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/voicemessages/timeline/RedactedVoiceMessageManager.kt create mode 100644 features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/voicemessages/timeline/VoiceMessagePresenter.kt create mode 100644 features/messages/impl/src/main/res/values-be/translations.xml create mode 100644 features/messages/impl/src/main/res/values-bg/translations.xml create mode 100644 features/messages/impl/src/main/res/values-cs/translations.xml create mode 100644 features/messages/impl/src/main/res/values-cy/translations.xml create mode 100644 features/messages/impl/src/main/res/values-da/translations.xml create mode 100644 features/messages/impl/src/main/res/values-de/translations.xml create mode 100644 features/messages/impl/src/main/res/values-el/translations.xml create mode 100644 features/messages/impl/src/main/res/values-en-rUS/translations.xml create mode 100644 features/messages/impl/src/main/res/values-es/translations.xml create mode 100644 features/messages/impl/src/main/res/values-et/translations.xml create mode 100644 features/messages/impl/src/main/res/values-eu/translations.xml create mode 100644 features/messages/impl/src/main/res/values-fa/translations.xml create mode 100644 features/messages/impl/src/main/res/values-fi/translations.xml create mode 100644 features/messages/impl/src/main/res/values-fr/translations.xml create mode 100644 features/messages/impl/src/main/res/values-hu/translations.xml create mode 100644 features/messages/impl/src/main/res/values-in/translations.xml create mode 100644 features/messages/impl/src/main/res/values-it/translations.xml create mode 100644 features/messages/impl/src/main/res/values-ka/translations.xml create mode 100644 features/messages/impl/src/main/res/values-ko/translations.xml create mode 100644 features/messages/impl/src/main/res/values-lt/translations.xml create mode 100644 features/messages/impl/src/main/res/values-nb/translations.xml create mode 100644 features/messages/impl/src/main/res/values-nl/translations.xml create mode 100644 features/messages/impl/src/main/res/values-pl/translations.xml create mode 100644 features/messages/impl/src/main/res/values-pt-rBR/translations.xml create mode 100644 features/messages/impl/src/main/res/values-pt/translations.xml create mode 100644 features/messages/impl/src/main/res/values-ro/translations.xml create mode 100644 features/messages/impl/src/main/res/values-ru/translations.xml create mode 100644 features/messages/impl/src/main/res/values-sk/translations.xml create mode 100644 features/messages/impl/src/main/res/values-sv/translations.xml create mode 100644 features/messages/impl/src/main/res/values-tr/translations.xml create mode 100644 features/messages/impl/src/main/res/values-uk/translations.xml create mode 100644 features/messages/impl/src/main/res/values-ur/translations.xml create mode 100644 features/messages/impl/src/main/res/values-uz/translations.xml create mode 100644 features/messages/impl/src/main/res/values-zh-rTW/translations.xml create mode 100644 features/messages/impl/src/main/res/values-zh/translations.xml create mode 100644 features/messages/impl/src/main/res/values/localazy.xml create mode 100644 features/messages/impl/src/test/kotlin/io/element/android/features/messages/impl/DefaultMessagesEntryPointTest.kt create mode 100644 features/messages/impl/src/test/kotlin/io/element/android/features/messages/impl/FakeMessagesNavigator.kt create mode 100644 features/messages/impl/src/test/kotlin/io/element/android/features/messages/impl/MessagesPresenterTest.kt create mode 100644 features/messages/impl/src/test/kotlin/io/element/android/features/messages/impl/MessagesViewTest.kt create mode 100644 features/messages/impl/src/test/kotlin/io/element/android/features/messages/impl/actionlist/ActionListPresenterTest.kt create mode 100644 features/messages/impl/src/test/kotlin/io/element/android/features/messages/impl/actionlist/model/TimelineItemActionComparatorTest.kt create mode 100644 features/messages/impl/src/test/kotlin/io/element/android/features/messages/impl/attachments/AttachmentsPreviewPresenterTest.kt create mode 100644 features/messages/impl/src/test/kotlin/io/element/android/features/messages/impl/attachments/SendActionStateTest.kt create mode 100644 features/messages/impl/src/test/kotlin/io/element/android/features/messages/impl/attachments/video/DefaultMediaOptimizationSelectorPresenterTest.kt create mode 100644 features/messages/impl/src/test/kotlin/io/element/android/features/messages/impl/crypto/identity/IdentityChangeStatePresenterTest.kt create mode 100644 features/messages/impl/src/test/kotlin/io/element/android/features/messages/impl/crypto/identity/IdentityChangeStateViewTest.kt create mode 100644 features/messages/impl/src/test/kotlin/io/element/android/features/messages/impl/crypto/sendfailure/resolve/ResolveVerifiedUserSendFailurePresenterTest.kt create mode 100644 features/messages/impl/src/test/kotlin/io/element/android/features/messages/impl/crypto/sendfailure/resolve/ResolveVerifiedUserSendFailureViewTest.kt create mode 100644 features/messages/impl/src/test/kotlin/io/element/android/features/messages/impl/draft/FakeComposerDraftService.kt create mode 100644 features/messages/impl/src/test/kotlin/io/element/android/features/messages/impl/draft/VolatileComposerDraftStoreTest.kt create mode 100644 features/messages/impl/src/test/kotlin/io/element/android/features/messages/impl/fixtures/MediaAttachmentFixtures.kt create mode 100644 features/messages/impl/src/test/kotlin/io/element/android/features/messages/impl/fixtures/MessageEventFixtures.kt create mode 100644 features/messages/impl/src/test/kotlin/io/element/android/features/messages/impl/fixtures/TimelineItemsFactoryFixtures.kt create mode 100644 features/messages/impl/src/test/kotlin/io/element/android/features/messages/impl/link/DefaultLinkCheckerTest.kt create mode 100644 features/messages/impl/src/test/kotlin/io/element/android/features/messages/impl/link/FakeLinkChecker.kt create mode 100644 features/messages/impl/src/test/kotlin/io/element/android/features/messages/impl/link/LinkPresenterTest.kt create mode 100644 features/messages/impl/src/test/kotlin/io/element/android/features/messages/impl/link/LinkViewTest.kt create mode 100644 features/messages/impl/src/test/kotlin/io/element/android/features/messages/impl/messagecomposer/DefaultRoomAliasSuggestionsDataSourceTest.kt create mode 100644 features/messages/impl/src/test/kotlin/io/element/android/features/messages/impl/messagecomposer/FakeRoomAliasSuggestionsDataSource.kt create mode 100644 features/messages/impl/src/test/kotlin/io/element/android/features/messages/impl/messagecomposer/MessageComposerPresenterTest.kt create mode 100644 features/messages/impl/src/test/kotlin/io/element/android/features/messages/impl/messagecomposer/TestRichTextEditorStateFactory.kt create mode 100644 features/messages/impl/src/test/kotlin/io/element/android/features/messages/impl/messagecomposer/suggestions/SuggestionsProcessorTest.kt create mode 100644 features/messages/impl/src/test/kotlin/io/element/android/features/messages/impl/messagesummary/FakeMessageSummaryFormatter.kt create mode 100644 features/messages/impl/src/test/kotlin/io/element/android/features/messages/impl/pinned/banner/PinnedMessagesBannerPresenterTest.kt create mode 100644 features/messages/impl/src/test/kotlin/io/element/android/features/messages/impl/pinned/banner/PinnedMessagesBannerViewTest.kt create mode 100644 features/messages/impl/src/test/kotlin/io/element/android/features/messages/impl/pinned/list/FakePinnedMessagesListNavigator.kt create mode 100644 features/messages/impl/src/test/kotlin/io/element/android/features/messages/impl/pinned/list/PinnedMessagesListPresenterTest.kt create mode 100644 features/messages/impl/src/test/kotlin/io/element/android/features/messages/impl/pinned/list/PinnedMessagesListTimelineActionPostProcessorTest.kt create mode 100644 features/messages/impl/src/test/kotlin/io/element/android/features/messages/impl/pinned/list/PinnedMessagesListViewTest.kt create mode 100644 features/messages/impl/src/test/kotlin/io/element/android/features/messages/impl/report/ReportMessagePresenterTest.kt create mode 100644 features/messages/impl/src/test/kotlin/io/element/android/features/messages/impl/timeline/DefaultHtmlConverterProviderTest.kt create mode 100644 features/messages/impl/src/test/kotlin/io/element/android/features/messages/impl/timeline/DefaultMarkAsFullyReadTest.kt create mode 100644 features/messages/impl/src/test/kotlin/io/element/android/features/messages/impl/timeline/FakeMarkAsFullyRead.kt create mode 100644 features/messages/impl/src/test/kotlin/io/element/android/features/messages/impl/timeline/TimelineControllerTest.kt create mode 100644 features/messages/impl/src/test/kotlin/io/element/android/features/messages/impl/timeline/TimelineItemIndexerTest.kt create mode 100644 features/messages/impl/src/test/kotlin/io/element/android/features/messages/impl/timeline/TimelinePresenterTest.kt create mode 100644 features/messages/impl/src/test/kotlin/io/element/android/features/messages/impl/timeline/TimelineViewTest.kt create mode 100644 features/messages/impl/src/test/kotlin/io/element/android/features/messages/impl/timeline/components/customreaction/CustomReactionPresenterTest.kt create mode 100644 features/messages/impl/src/test/kotlin/io/element/android/features/messages/impl/timeline/components/customreaction/picker/EmojiPickerPresenterTest.kt create mode 100644 features/messages/impl/src/test/kotlin/io/element/android/features/messages/impl/timeline/components/event/TimelineItemPollViewTest.kt create mode 100644 features/messages/impl/src/test/kotlin/io/element/android/features/messages/impl/timeline/components/event/TimelineTextViewTest.kt create mode 100644 features/messages/impl/src/test/kotlin/io/element/android/features/messages/impl/timeline/components/reactionsummary/ReactionSummaryPresenterTest.kt create mode 100644 features/messages/impl/src/test/kotlin/io/element/android/features/messages/impl/timeline/components/receipt/bottomsheet/ReadReceiptBottomSheetPresenterTest.kt create mode 100644 features/messages/impl/src/test/kotlin/io/element/android/features/messages/impl/timeline/factories/event/TimelineItemContentMessageFactoryTest.kt create mode 100644 features/messages/impl/src/test/kotlin/io/element/android/features/messages/impl/timeline/groups/TimelineItemGrouperTest.kt create mode 100644 features/messages/impl/src/test/kotlin/io/element/android/features/messages/impl/timeline/model/AggregatedReactionTest.kt create mode 100644 features/messages/impl/src/test/kotlin/io/element/android/features/messages/impl/timeline/protection/ProtectedViewTest.kt create mode 100644 features/messages/impl/src/test/kotlin/io/element/android/features/messages/impl/timeline/protection/TimelineProtectionPresenterTest.kt create mode 100644 features/messages/impl/src/test/kotlin/io/element/android/features/messages/impl/timeline/protection/TimelineProtectionStateTest.kt create mode 100644 features/messages/impl/src/test/kotlin/io/element/android/features/messages/impl/typing/TypingNotificationPresenterTest.kt create mode 100644 features/messages/impl/src/test/kotlin/io/element/android/features/messages/impl/utils/DefaultTextPillificationHelperTest.kt create mode 100644 features/messages/impl/src/test/kotlin/io/element/android/features/messages/impl/utils/EmojiTest.kt create mode 100644 features/messages/impl/src/test/kotlin/io/element/android/features/messages/impl/utils/FakeMentionSpanFormatter.kt create mode 100644 features/messages/impl/src/test/kotlin/io/element/android/features/messages/impl/utils/FakeTextPillificationHelper.kt create mode 100644 features/messages/impl/src/test/kotlin/io/element/android/features/messages/impl/voicemessages/composer/DefaultVoiceMessageComposerPresenterTest.kt create mode 100644 features/messages/impl/src/test/kotlin/io/element/android/features/messages/impl/voicemessages/timeline/FakeRedactedVoiceMessageManager.kt create mode 100644 features/messages/impl/src/test/kotlin/io/element/android/features/messages/impl/voicemessages/timeline/RedactedVoiceMessageManagerTest.kt create mode 100644 features/messages/test/build.gradle.kts create mode 100644 features/messages/test/src/main/kotlin/io/element/android/features/messages/test/FakeMessageComposerContext.kt create mode 100644 features/messages/test/src/main/kotlin/io/element/android/features/messages/test/FakeMessagesEntryPoint.kt create mode 100644 features/messages/test/src/main/kotlin/io/element/android/features/messages/test/attachments/video/FakeMediaOptimizationSelectorPresenterFactory.kt create mode 100644 features/messages/test/src/main/kotlin/io/element/android/features/messages/test/attachments/video/FakeVideoMetadataExtractor.kt create mode 100644 features/messages/test/src/main/kotlin/io/element/android/features/messages/test/timeline/FakeHtmlConverterProvider.kt create mode 100644 features/messages/test/src/main/kotlin/io/element/android/features/messages/test/timeline/voicemessages/composer/FakeDefaultVoiceMessageComposerPresenterFactory.kt create mode 100644 features/migration/api/build.gradle.kts create mode 100644 features/migration/api/src/main/kotlin/io/element/android/features/api/MigrationEntryPoint.kt create mode 100644 features/migration/api/src/main/kotlin/io/element/android/features/api/MigrationState.kt create mode 100644 features/migration/impl/build.gradle.kts create mode 100644 features/migration/impl/src/main/kotlin/io/element/android/features/migration/impl/DefaultMigrationEntryPoint.kt create mode 100644 features/migration/impl/src/main/kotlin/io/element/android/features/migration/impl/DefaultMigrationStore.kt create mode 100644 features/migration/impl/src/main/kotlin/io/element/android/features/migration/impl/MigrationPresenter.kt create mode 100644 features/migration/impl/src/main/kotlin/io/element/android/features/migration/impl/MigrationStateProvider.kt create mode 100644 features/migration/impl/src/main/kotlin/io/element/android/features/migration/impl/MigrationStore.kt create mode 100644 features/migration/impl/src/main/kotlin/io/element/android/features/migration/impl/MigrationView.kt create mode 100644 features/migration/impl/src/main/kotlin/io/element/android/features/migration/impl/migrations/AppMigration.kt create mode 100644 features/migration/impl/src/main/kotlin/io/element/android/features/migration/impl/migrations/AppMigration01.kt create mode 100644 features/migration/impl/src/main/kotlin/io/element/android/features/migration/impl/migrations/AppMigration02.kt create mode 100644 features/migration/impl/src/main/kotlin/io/element/android/features/migration/impl/migrations/AppMigration03.kt create mode 100644 features/migration/impl/src/main/kotlin/io/element/android/features/migration/impl/migrations/AppMigration04.kt create mode 100644 features/migration/impl/src/main/kotlin/io/element/android/features/migration/impl/migrations/AppMigration05.kt create mode 100644 features/migration/impl/src/main/kotlin/io/element/android/features/migration/impl/migrations/AppMigration06.kt create mode 100644 features/migration/impl/src/main/kotlin/io/element/android/features/migration/impl/migrations/AppMigration07.kt create mode 100644 features/migration/impl/src/main/kotlin/io/element/android/features/migration/impl/migrations/AppMigration08.kt create mode 100644 features/migration/impl/src/test/kotlin/io/element/android/features/migration/impl/InMemoryMigrationStore.kt create mode 100644 features/migration/impl/src/test/kotlin/io/element/android/features/migration/impl/MigrationPresenterTest.kt create mode 100644 features/migration/impl/src/test/kotlin/io/element/android/features/migration/impl/migrations/AppMigration01Test.kt create mode 100644 features/migration/impl/src/test/kotlin/io/element/android/features/migration/impl/migrations/AppMigration02Test.kt create mode 100644 features/migration/impl/src/test/kotlin/io/element/android/features/migration/impl/migrations/AppMigration03Test.kt create mode 100644 features/migration/impl/src/test/kotlin/io/element/android/features/migration/impl/migrations/AppMigration04Test.kt create mode 100644 features/migration/impl/src/test/kotlin/io/element/android/features/migration/impl/migrations/AppMigration05Test.kt create mode 100644 features/migration/impl/src/test/kotlin/io/element/android/features/migration/impl/migrations/AppMigration06Test.kt create mode 100644 features/migration/impl/src/test/kotlin/io/element/android/features/migration/impl/migrations/AppMigration07Test.kt create mode 100644 features/migration/impl/src/test/kotlin/io/element/android/features/migration/impl/migrations/AppMigration08Test.kt create mode 100644 features/networkmonitor/api/build.gradle.kts create mode 100644 features/networkmonitor/api/src/main/kotlin/io/element/android/features/networkmonitor/api/NetworkMonitor.kt create mode 100644 features/networkmonitor/api/src/main/kotlin/io/element/android/features/networkmonitor/api/NetworkStatus.kt create mode 100644 features/networkmonitor/api/src/main/kotlin/io/element/android/features/networkmonitor/api/ui/ConnectivityIndicator.kt create mode 100644 features/networkmonitor/api/src/main/kotlin/io/element/android/features/networkmonitor/api/ui/ConnectivityIndicatorContainer.kt create mode 100644 features/networkmonitor/impl/build.gradle.kts create mode 100644 features/networkmonitor/impl/src/main/AndroidManifest.xml create mode 100644 features/networkmonitor/impl/src/main/kotlin/io/element/android/features/networkmonitor/impl/DefaultNetworkMonitor.kt create mode 100644 features/networkmonitor/test/build.gradle.kts create mode 100644 features/networkmonitor/test/src/main/kotlin/io/element/android/features/networkmonitor/test/FakeNetworkMonitor.kt create mode 100644 features/poll/api/build.gradle.kts create mode 100644 features/poll/api/src/main/kotlin/io/element/android/features/poll/api/actions/EndPollAction.kt create mode 100644 features/poll/api/src/main/kotlin/io/element/android/features/poll/api/actions/SendPollResponseAction.kt create mode 100644 features/poll/api/src/main/kotlin/io/element/android/features/poll/api/create/CreatePollEntryPoint.kt create mode 100644 features/poll/api/src/main/kotlin/io/element/android/features/poll/api/create/CreatePollMode.kt create mode 100644 features/poll/api/src/main/kotlin/io/element/android/features/poll/api/history/PollHistoryEntryPoint.kt create mode 100644 features/poll/api/src/main/kotlin/io/element/android/features/poll/api/pollcontent/PollAnswerItem.kt create mode 100644 features/poll/api/src/main/kotlin/io/element/android/features/poll/api/pollcontent/PollAnswerView.kt create mode 100644 features/poll/api/src/main/kotlin/io/element/android/features/poll/api/pollcontent/PollContentState.kt create mode 100644 features/poll/api/src/main/kotlin/io/element/android/features/poll/api/pollcontent/PollContentStateFactory.kt create mode 100644 features/poll/api/src/main/kotlin/io/element/android/features/poll/api/pollcontent/PollContentStateFixtures.kt create mode 100644 features/poll/api/src/main/kotlin/io/element/android/features/poll/api/pollcontent/PollContentView.kt create mode 100644 features/poll/api/src/main/kotlin/io/element/android/features/poll/api/pollcontent/PollTitleView.kt create mode 100644 features/poll/api/src/main/res/values-cs/translations.xml create mode 100644 features/poll/api/src/main/res/values-cy/translations.xml create mode 100644 features/poll/api/src/main/res/values-da/translations.xml create mode 100644 features/poll/api/src/main/res/values-de/translations.xml create mode 100644 features/poll/api/src/main/res/values-el/translations.xml create mode 100644 features/poll/api/src/main/res/values-et/translations.xml create mode 100644 features/poll/api/src/main/res/values-eu/translations.xml create mode 100644 features/poll/api/src/main/res/values-fa/translations.xml create mode 100644 features/poll/api/src/main/res/values-fi/translations.xml create mode 100644 features/poll/api/src/main/res/values-fr/translations.xml create mode 100644 features/poll/api/src/main/res/values-hu/translations.xml create mode 100644 features/poll/api/src/main/res/values-in/translations.xml create mode 100644 features/poll/api/src/main/res/values-it/translations.xml create mode 100644 features/poll/api/src/main/res/values-ko/translations.xml create mode 100644 features/poll/api/src/main/res/values-nb/translations.xml create mode 100644 features/poll/api/src/main/res/values-nl/translations.xml create mode 100644 features/poll/api/src/main/res/values-pl/translations.xml create mode 100644 features/poll/api/src/main/res/values-pt-rBR/translations.xml create mode 100644 features/poll/api/src/main/res/values-pt/translations.xml create mode 100644 features/poll/api/src/main/res/values-ro/translations.xml create mode 100644 features/poll/api/src/main/res/values-ru/translations.xml create mode 100644 features/poll/api/src/main/res/values-sk/translations.xml create mode 100644 features/poll/api/src/main/res/values-sv/translations.xml create mode 100644 features/poll/api/src/main/res/values-uk/translations.xml create mode 100644 features/poll/api/src/main/res/values-uz/translations.xml create mode 100644 features/poll/api/src/main/res/values-zh-rTW/translations.xml create mode 100644 features/poll/api/src/main/res/values-zh/translations.xml create mode 100644 features/poll/api/src/main/res/values/localazy.xml create mode 100644 features/poll/impl/build.gradle.kts create mode 100644 features/poll/impl/src/main/kotlin/io/element/android/features/poll/impl/PollConstants.kt create mode 100644 features/poll/impl/src/main/kotlin/io/element/android/features/poll/impl/actions/DefaultEndPollAction.kt create mode 100644 features/poll/impl/src/main/kotlin/io/element/android/features/poll/impl/actions/DefaultSendPollResponseAction.kt create mode 100644 features/poll/impl/src/main/kotlin/io/element/android/features/poll/impl/create/CreatePollEvents.kt create mode 100644 features/poll/impl/src/main/kotlin/io/element/android/features/poll/impl/create/CreatePollException.kt create mode 100644 features/poll/impl/src/main/kotlin/io/element/android/features/poll/impl/create/CreatePollNode.kt create mode 100644 features/poll/impl/src/main/kotlin/io/element/android/features/poll/impl/create/CreatePollPresenter.kt create mode 100644 features/poll/impl/src/main/kotlin/io/element/android/features/poll/impl/create/CreatePollState.kt create mode 100644 features/poll/impl/src/main/kotlin/io/element/android/features/poll/impl/create/CreatePollStateProvider.kt create mode 100644 features/poll/impl/src/main/kotlin/io/element/android/features/poll/impl/create/CreatePollView.kt create mode 100644 features/poll/impl/src/main/kotlin/io/element/android/features/poll/impl/create/DefaultCreatePollEntryPoint.kt create mode 100644 features/poll/impl/src/main/kotlin/io/element/android/features/poll/impl/create/PollFormState.kt create mode 100644 features/poll/impl/src/main/kotlin/io/element/android/features/poll/impl/data/PollRepository.kt create mode 100644 features/poll/impl/src/main/kotlin/io/element/android/features/poll/impl/history/DefaultPollHistoryEntryPoint.kt create mode 100644 features/poll/impl/src/main/kotlin/io/element/android/features/poll/impl/history/PollHistoryEvents.kt create mode 100644 features/poll/impl/src/main/kotlin/io/element/android/features/poll/impl/history/PollHistoryFlowNode.kt create mode 100644 features/poll/impl/src/main/kotlin/io/element/android/features/poll/impl/history/PollHistoryNode.kt create mode 100644 features/poll/impl/src/main/kotlin/io/element/android/features/poll/impl/history/PollHistoryPresenter.kt create mode 100644 features/poll/impl/src/main/kotlin/io/element/android/features/poll/impl/history/PollHistoryState.kt create mode 100644 features/poll/impl/src/main/kotlin/io/element/android/features/poll/impl/history/PollHistoryStateProvider.kt create mode 100644 features/poll/impl/src/main/kotlin/io/element/android/features/poll/impl/history/PollHistoryView.kt create mode 100644 features/poll/impl/src/main/kotlin/io/element/android/features/poll/impl/history/model/PollHistoryFilter.kt create mode 100644 features/poll/impl/src/main/kotlin/io/element/android/features/poll/impl/history/model/PollHistoryItem.kt create mode 100644 features/poll/impl/src/main/kotlin/io/element/android/features/poll/impl/history/model/PollHistoryItems.kt create mode 100644 features/poll/impl/src/main/kotlin/io/element/android/features/poll/impl/history/model/PollHistoryItemsFactory.kt create mode 100644 features/poll/impl/src/main/kotlin/io/element/android/features/poll/impl/model/DefaultPollContentStateFactory.kt create mode 100644 features/poll/impl/src/main/res/values-be/translations.xml create mode 100644 features/poll/impl/src/main/res/values-bg/translations.xml create mode 100644 features/poll/impl/src/main/res/values-cs/translations.xml create mode 100644 features/poll/impl/src/main/res/values-cy/translations.xml create mode 100644 features/poll/impl/src/main/res/values-da/translations.xml create mode 100644 features/poll/impl/src/main/res/values-de/translations.xml create mode 100644 features/poll/impl/src/main/res/values-el/translations.xml create mode 100644 features/poll/impl/src/main/res/values-es/translations.xml create mode 100644 features/poll/impl/src/main/res/values-et/translations.xml create mode 100644 features/poll/impl/src/main/res/values-eu/translations.xml create mode 100644 features/poll/impl/src/main/res/values-fa/translations.xml create mode 100644 features/poll/impl/src/main/res/values-fi/translations.xml create mode 100644 features/poll/impl/src/main/res/values-fr/translations.xml create mode 100644 features/poll/impl/src/main/res/values-hu/translations.xml create mode 100644 features/poll/impl/src/main/res/values-in/translations.xml create mode 100644 features/poll/impl/src/main/res/values-it/translations.xml create mode 100644 features/poll/impl/src/main/res/values-ka/translations.xml create mode 100644 features/poll/impl/src/main/res/values-ko/translations.xml create mode 100644 features/poll/impl/src/main/res/values-nb/translations.xml create mode 100644 features/poll/impl/src/main/res/values-nl/translations.xml create mode 100644 features/poll/impl/src/main/res/values-pl/translations.xml create mode 100644 features/poll/impl/src/main/res/values-pt-rBR/translations.xml create mode 100644 features/poll/impl/src/main/res/values-pt/translations.xml create mode 100644 features/poll/impl/src/main/res/values-ro/translations.xml create mode 100644 features/poll/impl/src/main/res/values-ru/translations.xml create mode 100644 features/poll/impl/src/main/res/values-sk/translations.xml create mode 100644 features/poll/impl/src/main/res/values-sv/translations.xml create mode 100644 features/poll/impl/src/main/res/values-tr/translations.xml create mode 100644 features/poll/impl/src/main/res/values-uk/translations.xml create mode 100644 features/poll/impl/src/main/res/values-ur/translations.xml create mode 100644 features/poll/impl/src/main/res/values-uz/translations.xml create mode 100644 features/poll/impl/src/main/res/values-zh-rTW/translations.xml create mode 100644 features/poll/impl/src/main/res/values-zh/translations.xml create mode 100644 features/poll/impl/src/main/res/values/localazy.xml create mode 100644 features/poll/impl/src/test/kotlin/io/element/android/features/poll/impl/PollFixtures.kt create mode 100644 features/poll/impl/src/test/kotlin/io/element/android/features/poll/impl/create/CreatePollPresenterTest.kt create mode 100644 features/poll/impl/src/test/kotlin/io/element/android/features/poll/impl/create/DefaultCreatePollEntryPointTest.kt create mode 100644 features/poll/impl/src/test/kotlin/io/element/android/features/poll/impl/create/PollFormStateSaverTest.kt create mode 100644 features/poll/impl/src/test/kotlin/io/element/android/features/poll/impl/create/PollFormStateTest.kt create mode 100644 features/poll/impl/src/test/kotlin/io/element/android/features/poll/impl/history/DefaultPollHistoryEntryPointTest.kt create mode 100644 features/poll/impl/src/test/kotlin/io/element/android/features/poll/impl/history/PollHistoryPresenterTest.kt create mode 100644 features/poll/impl/src/test/kotlin/io/element/android/features/poll/impl/history/PollHistoryViewTest.kt create mode 100644 features/poll/impl/src/test/kotlin/io/element/android/features/poll/impl/pollcontent/PollContentStateFactoryTest.kt create mode 100644 features/poll/test/build.gradle.kts create mode 100644 features/poll/test/src/main/kotlin/io/element/android/features/poll/test/actions/FakeEndPollAction.kt create mode 100644 features/poll/test/src/main/kotlin/io/element/android/features/poll/test/actions/FakeSendPollResponseAction.kt create mode 100644 features/poll/test/src/main/kotlin/io/element/android/features/poll/test/create/FakeCreatePollEntryPoint.kt create mode 100644 features/poll/test/src/main/kotlin/io/element/android/features/poll/test/history/FakePollHistoryEntryPoint.kt create mode 100644 features/poll/test/src/main/kotlin/io/element/android/features/poll/test/pollcontent/FakePollContentStateFactory.kt create mode 100644 features/preferences/api/build.gradle.kts create mode 100644 features/preferences/api/src/main/kotlin/io/element/android/features/preferences/api/CacheService.kt create mode 100644 features/preferences/api/src/main/kotlin/io/element/android/features/preferences/api/PreferencesEntryPoint.kt create mode 100644 features/preferences/impl/build.gradle.kts create mode 100644 features/preferences/impl/src/main/kotlin/io/element/android/features/preferences/impl/DefaultCacheService.kt create mode 100644 features/preferences/impl/src/main/kotlin/io/element/android/features/preferences/impl/DefaultPreferencesEntryPoint.kt create mode 100644 features/preferences/impl/src/main/kotlin/io/element/android/features/preferences/impl/PreferencesFlowNode.kt create mode 100644 features/preferences/impl/src/main/kotlin/io/element/android/features/preferences/impl/about/AboutNode.kt create mode 100644 features/preferences/impl/src/main/kotlin/io/element/android/features/preferences/impl/about/AboutPresenter.kt create mode 100644 features/preferences/impl/src/main/kotlin/io/element/android/features/preferences/impl/about/AboutState.kt create mode 100644 features/preferences/impl/src/main/kotlin/io/element/android/features/preferences/impl/about/AboutStateProvider.kt create mode 100644 features/preferences/impl/src/main/kotlin/io/element/android/features/preferences/impl/about/AboutView.kt create mode 100644 features/preferences/impl/src/main/kotlin/io/element/android/features/preferences/impl/about/ElementLegal.kt create mode 100644 features/preferences/impl/src/main/kotlin/io/element/android/features/preferences/impl/advanced/AdvancedSettingsEvents.kt create mode 100644 features/preferences/impl/src/main/kotlin/io/element/android/features/preferences/impl/advanced/AdvancedSettingsNode.kt create mode 100644 features/preferences/impl/src/main/kotlin/io/element/android/features/preferences/impl/advanced/AdvancedSettingsPresenter.kt create mode 100644 features/preferences/impl/src/main/kotlin/io/element/android/features/preferences/impl/advanced/AdvancedSettingsState.kt create mode 100644 features/preferences/impl/src/main/kotlin/io/element/android/features/preferences/impl/advanced/AdvancedSettingsStateProvider.kt create mode 100644 features/preferences/impl/src/main/kotlin/io/element/android/features/preferences/impl/advanced/AdvancedSettingsView.kt create mode 100644 features/preferences/impl/src/main/kotlin/io/element/android/features/preferences/impl/advanced/MediaPreviewConfigStateStore.kt create mode 100644 features/preferences/impl/src/main/kotlin/io/element/android/features/preferences/impl/analytics/AnalyticsSettingsNode.kt create mode 100644 features/preferences/impl/src/main/kotlin/io/element/android/features/preferences/impl/analytics/AnalyticsSettingsPresenter.kt create mode 100644 features/preferences/impl/src/main/kotlin/io/element/android/features/preferences/impl/analytics/AnalyticsSettingsState.kt create mode 100644 features/preferences/impl/src/main/kotlin/io/element/android/features/preferences/impl/analytics/AnalyticsSettingsStateProvider.kt create mode 100644 features/preferences/impl/src/main/kotlin/io/element/android/features/preferences/impl/analytics/AnalyticsSettingsView.kt create mode 100644 features/preferences/impl/src/main/kotlin/io/element/android/features/preferences/impl/blockedusers/BlockedUsersEvents.kt create mode 100644 features/preferences/impl/src/main/kotlin/io/element/android/features/preferences/impl/blockedusers/BlockedUsersNode.kt create mode 100644 features/preferences/impl/src/main/kotlin/io/element/android/features/preferences/impl/blockedusers/BlockedUsersPresenter.kt create mode 100644 features/preferences/impl/src/main/kotlin/io/element/android/features/preferences/impl/blockedusers/BlockedUsersState.kt create mode 100644 features/preferences/impl/src/main/kotlin/io/element/android/features/preferences/impl/blockedusers/BlockedUsersStateProvider.kt create mode 100644 features/preferences/impl/src/main/kotlin/io/element/android/features/preferences/impl/blockedusers/BlockedUsersView.kt create mode 100644 features/preferences/impl/src/main/kotlin/io/element/android/features/preferences/impl/developer/DeveloperSettingsEvents.kt create mode 100644 features/preferences/impl/src/main/kotlin/io/element/android/features/preferences/impl/developer/DeveloperSettingsNode.kt create mode 100644 features/preferences/impl/src/main/kotlin/io/element/android/features/preferences/impl/developer/DeveloperSettingsPresenter.kt create mode 100644 features/preferences/impl/src/main/kotlin/io/element/android/features/preferences/impl/developer/DeveloperSettingsState.kt create mode 100644 features/preferences/impl/src/main/kotlin/io/element/android/features/preferences/impl/developer/DeveloperSettingsStateProvider.kt create mode 100644 features/preferences/impl/src/main/kotlin/io/element/android/features/preferences/impl/developer/DeveloperSettingsView.kt create mode 100644 features/preferences/impl/src/main/kotlin/io/element/android/features/preferences/impl/developer/tracing/LogLevelItem.kt create mode 100644 features/preferences/impl/src/main/kotlin/io/element/android/features/preferences/impl/developer/tracing/LogLevelMapper.kt create mode 100644 features/preferences/impl/src/main/kotlin/io/element/android/features/preferences/impl/labs/LabsEvents.kt create mode 100644 features/preferences/impl/src/main/kotlin/io/element/android/features/preferences/impl/labs/LabsNode.kt create mode 100644 features/preferences/impl/src/main/kotlin/io/element/android/features/preferences/impl/labs/LabsPresenter.kt create mode 100644 features/preferences/impl/src/main/kotlin/io/element/android/features/preferences/impl/labs/LabsState.kt create mode 100644 features/preferences/impl/src/main/kotlin/io/element/android/features/preferences/impl/labs/LabsStateProvider.kt create mode 100644 features/preferences/impl/src/main/kotlin/io/element/android/features/preferences/impl/labs/LabsView.kt create mode 100644 features/preferences/impl/src/main/kotlin/io/element/android/features/preferences/impl/model/EnabledFeature.kt create mode 100644 features/preferences/impl/src/main/kotlin/io/element/android/features/preferences/impl/notifications/NotificationSettingsEvents.kt create mode 100644 features/preferences/impl/src/main/kotlin/io/element/android/features/preferences/impl/notifications/NotificationSettingsNode.kt create mode 100644 features/preferences/impl/src/main/kotlin/io/element/android/features/preferences/impl/notifications/NotificationSettingsPresenter.kt create mode 100644 features/preferences/impl/src/main/kotlin/io/element/android/features/preferences/impl/notifications/NotificationSettingsState.kt create mode 100644 features/preferences/impl/src/main/kotlin/io/element/android/features/preferences/impl/notifications/NotificationSettingsStateProvider.kt create mode 100644 features/preferences/impl/src/main/kotlin/io/element/android/features/preferences/impl/notifications/NotificationSettingsView.kt create mode 100644 features/preferences/impl/src/main/kotlin/io/element/android/features/preferences/impl/notifications/SystemNotificationsEnabledProvider.kt create mode 100644 features/preferences/impl/src/main/kotlin/io/element/android/features/preferences/impl/notifications/edit/DefaultNotificationSettingOption.kt create mode 100644 features/preferences/impl/src/main/kotlin/io/element/android/features/preferences/impl/notifications/edit/EditDefaultNotificationSettingNode.kt create mode 100644 features/preferences/impl/src/main/kotlin/io/element/android/features/preferences/impl/notifications/edit/EditDefaultNotificationSettingPresenter.kt create mode 100644 features/preferences/impl/src/main/kotlin/io/element/android/features/preferences/impl/notifications/edit/EditDefaultNotificationSettingState.kt create mode 100644 features/preferences/impl/src/main/kotlin/io/element/android/features/preferences/impl/notifications/edit/EditDefaultNotificationSettingStateEvents.kt create mode 100644 features/preferences/impl/src/main/kotlin/io/element/android/features/preferences/impl/notifications/edit/EditDefaultNotificationSettingStateProvider.kt create mode 100644 features/preferences/impl/src/main/kotlin/io/element/android/features/preferences/impl/notifications/edit/EditDefaultNotificationSettingView.kt create mode 100644 features/preferences/impl/src/main/kotlin/io/element/android/features/preferences/impl/notifications/edit/EditNotificationSettingRoomInfo.kt create mode 100644 features/preferences/impl/src/main/kotlin/io/element/android/features/preferences/impl/root/PreferencesRootEvents.kt create mode 100644 features/preferences/impl/src/main/kotlin/io/element/android/features/preferences/impl/root/PreferencesRootNode.kt create mode 100644 features/preferences/impl/src/main/kotlin/io/element/android/features/preferences/impl/root/PreferencesRootPresenter.kt create mode 100644 features/preferences/impl/src/main/kotlin/io/element/android/features/preferences/impl/root/PreferencesRootState.kt create mode 100644 features/preferences/impl/src/main/kotlin/io/element/android/features/preferences/impl/root/PreferencesRootStateProvider.kt create mode 100644 features/preferences/impl/src/main/kotlin/io/element/android/features/preferences/impl/root/PreferencesRootView.kt create mode 100644 features/preferences/impl/src/main/kotlin/io/element/android/features/preferences/impl/root/VersionFormatter.kt create mode 100644 features/preferences/impl/src/main/kotlin/io/element/android/features/preferences/impl/tasks/ClearCacheUseCase.kt create mode 100644 features/preferences/impl/src/main/kotlin/io/element/android/features/preferences/impl/tasks/ComputeCacheSizeUseCase.kt create mode 100644 features/preferences/impl/src/main/kotlin/io/element/android/features/preferences/impl/user/UserPreferences.kt create mode 100644 features/preferences/impl/src/main/kotlin/io/element/android/features/preferences/impl/user/editprofile/EditUserProfileEvents.kt create mode 100644 features/preferences/impl/src/main/kotlin/io/element/android/features/preferences/impl/user/editprofile/EditUserProfileNavigator.kt create mode 100644 features/preferences/impl/src/main/kotlin/io/element/android/features/preferences/impl/user/editprofile/EditUserProfileNode.kt create mode 100644 features/preferences/impl/src/main/kotlin/io/element/android/features/preferences/impl/user/editprofile/EditUserProfilePresenter.kt create mode 100644 features/preferences/impl/src/main/kotlin/io/element/android/features/preferences/impl/user/editprofile/EditUserProfileState.kt create mode 100644 features/preferences/impl/src/main/kotlin/io/element/android/features/preferences/impl/user/editprofile/EditUserProfileStateProvider.kt create mode 100644 features/preferences/impl/src/main/kotlin/io/element/android/features/preferences/impl/user/editprofile/EditUserProfileView.kt create mode 100644 features/preferences/impl/src/main/kotlin/io/element/android/features/preferences/impl/utils/ShowDeveloperSettingsProvider.kt create mode 100644 features/preferences/impl/src/main/res/values-be/translations.xml create mode 100644 features/preferences/impl/src/main/res/values-bg/translations.xml create mode 100644 features/preferences/impl/src/main/res/values-cs/translations.xml create mode 100644 features/preferences/impl/src/main/res/values-cy/translations.xml create mode 100644 features/preferences/impl/src/main/res/values-da/translations.xml create mode 100644 features/preferences/impl/src/main/res/values-de/translations.xml create mode 100644 features/preferences/impl/src/main/res/values-el/translations.xml create mode 100644 features/preferences/impl/src/main/res/values-en-rUS/translations.xml create mode 100644 features/preferences/impl/src/main/res/values-es/translations.xml create mode 100644 features/preferences/impl/src/main/res/values-et/translations.xml create mode 100644 features/preferences/impl/src/main/res/values-eu/translations.xml create mode 100644 features/preferences/impl/src/main/res/values-fa/translations.xml create mode 100644 features/preferences/impl/src/main/res/values-fi/translations.xml create mode 100644 features/preferences/impl/src/main/res/values-fr/translations.xml create mode 100644 features/preferences/impl/src/main/res/values-hu/translations.xml create mode 100644 features/preferences/impl/src/main/res/values-in/translations.xml create mode 100644 features/preferences/impl/src/main/res/values-it/translations.xml create mode 100644 features/preferences/impl/src/main/res/values-ka/translations.xml create mode 100644 features/preferences/impl/src/main/res/values-ko/translations.xml create mode 100644 features/preferences/impl/src/main/res/values-lt/translations.xml create mode 100644 features/preferences/impl/src/main/res/values-nb/translations.xml create mode 100644 features/preferences/impl/src/main/res/values-nl/translations.xml create mode 100644 features/preferences/impl/src/main/res/values-pl/translations.xml create mode 100644 features/preferences/impl/src/main/res/values-pt-rBR/translations.xml create mode 100644 features/preferences/impl/src/main/res/values-pt/translations.xml create mode 100644 features/preferences/impl/src/main/res/values-ro/translations.xml create mode 100644 features/preferences/impl/src/main/res/values-ru/translations.xml create mode 100644 features/preferences/impl/src/main/res/values-sk/translations.xml create mode 100644 features/preferences/impl/src/main/res/values-sv/translations.xml create mode 100644 features/preferences/impl/src/main/res/values-tr/translations.xml create mode 100644 features/preferences/impl/src/main/res/values-uk/translations.xml create mode 100644 features/preferences/impl/src/main/res/values-ur/translations.xml create mode 100644 features/preferences/impl/src/main/res/values-uz/translations.xml create mode 100644 features/preferences/impl/src/main/res/values-zh-rTW/translations.xml create mode 100644 features/preferences/impl/src/main/res/values-zh/translations.xml create mode 100644 features/preferences/impl/src/main/res/values/localazy.xml create mode 100644 features/preferences/impl/src/test/kotlin/io/element/android/features/preferences/impl/DefaultPreferencesEntryPointTest.kt create mode 100644 features/preferences/impl/src/test/kotlin/io/element/android/features/preferences/impl/about/AboutPresenterTest.kt create mode 100644 features/preferences/impl/src/test/kotlin/io/element/android/features/preferences/impl/about/AboutViewTest.kt create mode 100644 features/preferences/impl/src/test/kotlin/io/element/android/features/preferences/impl/advanced/AdvancedSettingsPresenterTest.kt create mode 100644 features/preferences/impl/src/test/kotlin/io/element/android/features/preferences/impl/advanced/AdvancedSettingsViewTest.kt create mode 100644 features/preferences/impl/src/test/kotlin/io/element/android/features/preferences/impl/advanced/FakeMediaPreviewConfigStateStore.kt create mode 100644 features/preferences/impl/src/test/kotlin/io/element/android/features/preferences/impl/advanced/MediaPreviewConfigStateStoreTest.kt create mode 100644 features/preferences/impl/src/test/kotlin/io/element/android/features/preferences/impl/analytics/AnalyticsSettingsPresenterTest.kt create mode 100644 features/preferences/impl/src/test/kotlin/io/element/android/features/preferences/impl/blockedusers/BlockedUserViewTest.kt create mode 100644 features/preferences/impl/src/test/kotlin/io/element/android/features/preferences/impl/blockedusers/BlockedUsersPresenterTest.kt create mode 100644 features/preferences/impl/src/test/kotlin/io/element/android/features/preferences/impl/developer/DeveloperSettingsPresenterTest.kt create mode 100644 features/preferences/impl/src/test/kotlin/io/element/android/features/preferences/impl/developer/DeveloperSettingsViewTest.kt create mode 100644 features/preferences/impl/src/test/kotlin/io/element/android/features/preferences/impl/labs/LabsPresenterTest.kt create mode 100644 features/preferences/impl/src/test/kotlin/io/element/android/features/preferences/impl/notifications/EditDefaultNotificationSettingsPresenterTest.kt create mode 100644 features/preferences/impl/src/test/kotlin/io/element/android/features/preferences/impl/notifications/FakeSystemNotificationsEnabledProvider.kt create mode 100644 features/preferences/impl/src/test/kotlin/io/element/android/features/preferences/impl/notifications/NotificationSettingsPresenterTest.kt create mode 100644 features/preferences/impl/src/test/kotlin/io/element/android/features/preferences/impl/notifications/NotificationSettingsViewTest.kt create mode 100644 features/preferences/impl/src/test/kotlin/io/element/android/features/preferences/impl/root/FakeVersionFormatter.kt create mode 100644 features/preferences/impl/src/test/kotlin/io/element/android/features/preferences/impl/root/PreferencesRootPresenterTest.kt create mode 100644 features/preferences/impl/src/test/kotlin/io/element/android/features/preferences/impl/root/VersionFormatterTest.kt create mode 100644 features/preferences/impl/src/test/kotlin/io/element/android/features/preferences/impl/tasks/DefaultClearCacheUseCaseTest.kt create mode 100644 features/preferences/impl/src/test/kotlin/io/element/android/features/preferences/impl/tasks/FakeClearCacheUseCase.kt create mode 100644 features/preferences/impl/src/test/kotlin/io/element/android/features/preferences/impl/tasks/FakeComputeCacheSizeUseCase.kt create mode 100644 features/preferences/impl/src/test/kotlin/io/element/android/features/preferences/impl/user/editprofile/EditUserProfilePresenterTest.kt create mode 100644 features/preferences/impl/src/test/kotlin/io/element/android/features/preferences/impl/user/editprofile/EditUserProfileViewTest.kt create mode 100644 features/preferences/impl/src/test/kotlin/io/element/android/features/preferences/impl/user/editprofile/FakeEditUserProfileNavigator.kt create mode 100644 features/rageshake/api/build.gradle.kts create mode 100644 features/rageshake/api/src/main/kotlin/io/element/android/features/rageshake/api/RageshakeFeatureAvailability.kt create mode 100644 features/rageshake/api/src/main/kotlin/io/element/android/features/rageshake/api/bugreport/BugReportEntryPoint.kt create mode 100644 features/rageshake/api/src/main/kotlin/io/element/android/features/rageshake/api/crash/CrashDetectionEvents.kt create mode 100644 features/rageshake/api/src/main/kotlin/io/element/android/features/rageshake/api/crash/CrashDetectionPresenter.kt create mode 100644 features/rageshake/api/src/main/kotlin/io/element/android/features/rageshake/api/crash/CrashDetectionState.kt create mode 100644 features/rageshake/api/src/main/kotlin/io/element/android/features/rageshake/api/crash/CrashDetectionStateProvider.kt create mode 100644 features/rageshake/api/src/main/kotlin/io/element/android/features/rageshake/api/crash/CrashDetectionView.kt create mode 100644 features/rageshake/api/src/main/kotlin/io/element/android/features/rageshake/api/detection/RageshakeDetectionEvents.kt create mode 100644 features/rageshake/api/src/main/kotlin/io/element/android/features/rageshake/api/detection/RageshakeDetectionPresenter.kt create mode 100644 features/rageshake/api/src/main/kotlin/io/element/android/features/rageshake/api/detection/RageshakeDetectionState.kt create mode 100644 features/rageshake/api/src/main/kotlin/io/element/android/features/rageshake/api/detection/RageshakeDetectionStateProvider.kt create mode 100644 features/rageshake/api/src/main/kotlin/io/element/android/features/rageshake/api/detection/RageshakeDetectionView.kt create mode 100644 features/rageshake/api/src/main/kotlin/io/element/android/features/rageshake/api/logs/LogFilesRemover.kt create mode 100644 features/rageshake/api/src/main/kotlin/io/element/android/features/rageshake/api/logs/WriteToFilesConfigurationFactory.kt create mode 100644 features/rageshake/api/src/main/kotlin/io/element/android/features/rageshake/api/preferences/RageshakePreferencesEvents.kt create mode 100644 features/rageshake/api/src/main/kotlin/io/element/android/features/rageshake/api/preferences/RageshakePreferencesPresenter.kt create mode 100644 features/rageshake/api/src/main/kotlin/io/element/android/features/rageshake/api/preferences/RageshakePreferencesState.kt create mode 100644 features/rageshake/api/src/main/kotlin/io/element/android/features/rageshake/api/preferences/RageshakePreferencesStateProvider.kt create mode 100644 features/rageshake/api/src/main/kotlin/io/element/android/features/rageshake/api/preferences/RageshakePreferencesView.kt create mode 100644 features/rageshake/api/src/main/kotlin/io/element/android/features/rageshake/api/reporter/BugReporter.kt create mode 100644 features/rageshake/api/src/main/kotlin/io/element/android/features/rageshake/api/reporter/BugReporterListener.kt create mode 100644 features/rageshake/api/src/main/kotlin/io/element/android/features/rageshake/api/screenshot/Screenshot.kt create mode 100644 features/rageshake/api/src/main/res/values-be/translations.xml create mode 100644 features/rageshake/api/src/main/res/values-bg/translations.xml create mode 100644 features/rageshake/api/src/main/res/values-cs/translations.xml create mode 100644 features/rageshake/api/src/main/res/values-cy/translations.xml create mode 100644 features/rageshake/api/src/main/res/values-da/translations.xml create mode 100644 features/rageshake/api/src/main/res/values-de/translations.xml create mode 100644 features/rageshake/api/src/main/res/values-el/translations.xml create mode 100644 features/rageshake/api/src/main/res/values-es/translations.xml create mode 100644 features/rageshake/api/src/main/res/values-et/translations.xml create mode 100644 features/rageshake/api/src/main/res/values-eu/translations.xml create mode 100644 features/rageshake/api/src/main/res/values-fa/translations.xml create mode 100644 features/rageshake/api/src/main/res/values-fi/translations.xml create mode 100644 features/rageshake/api/src/main/res/values-fr/translations.xml create mode 100644 features/rageshake/api/src/main/res/values-hu/translations.xml create mode 100644 features/rageshake/api/src/main/res/values-in/translations.xml create mode 100644 features/rageshake/api/src/main/res/values-it/translations.xml create mode 100644 features/rageshake/api/src/main/res/values-ka/translations.xml create mode 100644 features/rageshake/api/src/main/res/values-ko/translations.xml create mode 100644 features/rageshake/api/src/main/res/values-lt/translations.xml create mode 100644 features/rageshake/api/src/main/res/values-nb/translations.xml create mode 100644 features/rageshake/api/src/main/res/values-nl/translations.xml create mode 100644 features/rageshake/api/src/main/res/values-pl/translations.xml create mode 100644 features/rageshake/api/src/main/res/values-pt-rBR/translations.xml create mode 100644 features/rageshake/api/src/main/res/values-pt/translations.xml create mode 100644 features/rageshake/api/src/main/res/values-ro/translations.xml create mode 100644 features/rageshake/api/src/main/res/values-ru/translations.xml create mode 100644 features/rageshake/api/src/main/res/values-sk/translations.xml create mode 100644 features/rageshake/api/src/main/res/values-sv/translations.xml create mode 100644 features/rageshake/api/src/main/res/values-tr/translations.xml create mode 100644 features/rageshake/api/src/main/res/values-uk/translations.xml create mode 100644 features/rageshake/api/src/main/res/values-ur/translations.xml create mode 100644 features/rageshake/api/src/main/res/values-uz/translations.xml create mode 100644 features/rageshake/api/src/main/res/values-zh-rTW/translations.xml create mode 100644 features/rageshake/api/src/main/res/values-zh/translations.xml create mode 100644 features/rageshake/api/src/main/res/values/localazy.xml create mode 100644 features/rageshake/impl/build.gradle.kts create mode 100644 features/rageshake/impl/src/main/kotlin/io/element/android/features/rageshake/impl/DefaultRageshakeFeatureAvailability.kt create mode 100644 features/rageshake/impl/src/main/kotlin/io/element/android/features/rageshake/impl/bugreport/BugReportEvents.kt create mode 100644 features/rageshake/impl/src/main/kotlin/io/element/android/features/rageshake/impl/bugreport/BugReportFlowNode.kt create mode 100644 features/rageshake/impl/src/main/kotlin/io/element/android/features/rageshake/impl/bugreport/BugReportFormError.kt create mode 100644 features/rageshake/impl/src/main/kotlin/io/element/android/features/rageshake/impl/bugreport/BugReportNode.kt create mode 100644 features/rageshake/impl/src/main/kotlin/io/element/android/features/rageshake/impl/bugreport/BugReportPresenter.kt create mode 100644 features/rageshake/impl/src/main/kotlin/io/element/android/features/rageshake/impl/bugreport/BugReportState.kt create mode 100644 features/rageshake/impl/src/main/kotlin/io/element/android/features/rageshake/impl/bugreport/BugReportStateProvider.kt create mode 100644 features/rageshake/impl/src/main/kotlin/io/element/android/features/rageshake/impl/bugreport/BugReportView.kt create mode 100644 features/rageshake/impl/src/main/kotlin/io/element/android/features/rageshake/impl/bugreport/DefaultBugReportEntryPoint.kt create mode 100644 features/rageshake/impl/src/main/kotlin/io/element/android/features/rageshake/impl/crash/CrashDataStore.kt create mode 100644 features/rageshake/impl/src/main/kotlin/io/element/android/features/rageshake/impl/crash/DefaultCrashDetectionPresenter.kt create mode 100644 features/rageshake/impl/src/main/kotlin/io/element/android/features/rageshake/impl/crash/PreferencesCrashDataStore.kt create mode 100644 features/rageshake/impl/src/main/kotlin/io/element/android/features/rageshake/impl/crash/VectorUncaughtExceptionHandler.kt create mode 100644 features/rageshake/impl/src/main/kotlin/io/element/android/features/rageshake/impl/detection/DefaultRageshakeDetectionPresenter.kt create mode 100644 features/rageshake/impl/src/main/kotlin/io/element/android/features/rageshake/impl/di/RageshakeBindings.kt create mode 100644 features/rageshake/impl/src/main/kotlin/io/element/android/features/rageshake/impl/di/RageshakeModule.kt create mode 100644 features/rageshake/impl/src/main/kotlin/io/element/android/features/rageshake/impl/logs/DefaultLogFilesRemover.kt create mode 100644 features/rageshake/impl/src/main/kotlin/io/element/android/features/rageshake/impl/preferences/DefaultRageshakePreferencesPresenter.kt create mode 100644 features/rageshake/impl/src/main/kotlin/io/element/android/features/rageshake/impl/rageshake/DefaultRageShake.kt create mode 100644 features/rageshake/impl/src/main/kotlin/io/element/android/features/rageshake/impl/rageshake/PreferencesRageshakeDataStore.kt create mode 100644 features/rageshake/impl/src/main/kotlin/io/element/android/features/rageshake/impl/rageshake/RageShake.kt create mode 100644 features/rageshake/impl/src/main/kotlin/io/element/android/features/rageshake/impl/rageshake/RageshakeDataStore.kt create mode 100644 features/rageshake/impl/src/main/kotlin/io/element/android/features/rageshake/impl/reporter/BugReportAppNameProvider.kt create mode 100755 features/rageshake/impl/src/main/kotlin/io/element/android/features/rageshake/impl/reporter/BugReporterMultipartBody.kt create mode 100644 features/rageshake/impl/src/main/kotlin/io/element/android/features/rageshake/impl/reporter/BugReporterMultipartBodyListener.kt create mode 100644 features/rageshake/impl/src/main/kotlin/io/element/android/features/rageshake/impl/reporter/BugReporterUrlProvider.kt create mode 100755 features/rageshake/impl/src/main/kotlin/io/element/android/features/rageshake/impl/reporter/DefaultBugReporter.kt create mode 100644 features/rageshake/impl/src/main/kotlin/io/element/android/features/rageshake/impl/reporter/DefaultBugReporterUrlProvider.kt create mode 100644 features/rageshake/impl/src/main/kotlin/io/element/android/features/rageshake/impl/screenshot/DefaultScreenshotHolder.kt create mode 100644 features/rageshake/impl/src/main/kotlin/io/element/android/features/rageshake/impl/screenshot/ScreenshotHolder.kt create mode 100644 features/rageshake/impl/src/main/res/values-be/translations.xml create mode 100644 features/rageshake/impl/src/main/res/values-bg/translations.xml create mode 100644 features/rageshake/impl/src/main/res/values-cs/translations.xml create mode 100644 features/rageshake/impl/src/main/res/values-cy/translations.xml create mode 100644 features/rageshake/impl/src/main/res/values-da/translations.xml create mode 100644 features/rageshake/impl/src/main/res/values-de/translations.xml create mode 100644 features/rageshake/impl/src/main/res/values-el/translations.xml create mode 100644 features/rageshake/impl/src/main/res/values-es/translations.xml create mode 100644 features/rageshake/impl/src/main/res/values-et/translations.xml create mode 100644 features/rageshake/impl/src/main/res/values-eu/translations.xml create mode 100644 features/rageshake/impl/src/main/res/values-fa/translations.xml create mode 100644 features/rageshake/impl/src/main/res/values-fi/translations.xml create mode 100644 features/rageshake/impl/src/main/res/values-fr/translations.xml create mode 100644 features/rageshake/impl/src/main/res/values-hu/translations.xml create mode 100644 features/rageshake/impl/src/main/res/values-in/translations.xml create mode 100644 features/rageshake/impl/src/main/res/values-it/translations.xml create mode 100644 features/rageshake/impl/src/main/res/values-ka/translations.xml create mode 100644 features/rageshake/impl/src/main/res/values-ko/translations.xml create mode 100644 features/rageshake/impl/src/main/res/values-lt/translations.xml create mode 100644 features/rageshake/impl/src/main/res/values-nb/translations.xml create mode 100644 features/rageshake/impl/src/main/res/values-nl/translations.xml create mode 100644 features/rageshake/impl/src/main/res/values-pl/translations.xml create mode 100644 features/rageshake/impl/src/main/res/values-pt-rBR/translations.xml create mode 100644 features/rageshake/impl/src/main/res/values-pt/translations.xml create mode 100644 features/rageshake/impl/src/main/res/values-ro/translations.xml create mode 100644 features/rageshake/impl/src/main/res/values-ru/translations.xml create mode 100644 features/rageshake/impl/src/main/res/values-sk/translations.xml create mode 100644 features/rageshake/impl/src/main/res/values-sv/translations.xml create mode 100644 features/rageshake/impl/src/main/res/values-tr/translations.xml create mode 100644 features/rageshake/impl/src/main/res/values-uk/translations.xml create mode 100644 features/rageshake/impl/src/main/res/values-ur/translations.xml create mode 100644 features/rageshake/impl/src/main/res/values-uz/translations.xml create mode 100644 features/rageshake/impl/src/main/res/values-zh-rTW/translations.xml create mode 100644 features/rageshake/impl/src/main/res/values-zh/translations.xml create mode 100644 features/rageshake/impl/src/main/res/values/localazy.xml create mode 100644 features/rageshake/impl/src/test/kotlin/io/element/android/features/rageshake/impl/DefaultRageshakeFeatureAvailabilityTest.kt create mode 100644 features/rageshake/impl/src/test/kotlin/io/element/android/features/rageshake/impl/bugreport/BugReportPresenterTest.kt create mode 100644 features/rageshake/impl/src/test/kotlin/io/element/android/features/rageshake/impl/bugreport/DefaultBugReportEntryPointTest.kt create mode 100644 features/rageshake/impl/src/test/kotlin/io/element/android/features/rageshake/impl/bugreport/FakeBugReporter.kt create mode 100644 features/rageshake/impl/src/test/kotlin/io/element/android/features/rageshake/impl/crash/FakeCrashDataStore.kt create mode 100644 features/rageshake/impl/src/test/kotlin/io/element/android/features/rageshake/impl/crash/VectorUncaughtExceptionHandlerTest.kt create mode 100644 features/rageshake/impl/src/test/kotlin/io/element/android/features/rageshake/impl/crash/ui/CrashDetectionPresenterTest.kt create mode 100644 features/rageshake/impl/src/test/kotlin/io/element/android/features/rageshake/impl/detection/RageshakeDetectionPresenterTest.kt create mode 100644 features/rageshake/impl/src/test/kotlin/io/element/android/features/rageshake/impl/preferences/RageshakePreferencesPresenterTest.kt create mode 100644 features/rageshake/impl/src/test/kotlin/io/element/android/features/rageshake/impl/rageshake/FakeRageShake.kt create mode 100644 features/rageshake/impl/src/test/kotlin/io/element/android/features/rageshake/impl/rageshake/FakeRageshakeDataStore.kt create mode 100755 features/rageshake/impl/src/test/kotlin/io/element/android/features/rageshake/impl/reporter/DefaultBugReporterTest.kt create mode 100644 features/rageshake/impl/src/test/kotlin/io/element/android/features/rageshake/impl/reporter/DefaultBugReporterUrlProviderTest.kt create mode 100644 features/rageshake/impl/src/test/kotlin/io/element/android/features/rageshake/impl/reporter/NoopBugReporterListener.kt create mode 100644 features/rageshake/impl/src/test/kotlin/io/element/android/features/rageshake/impl/screenshot/FakeScreenshotHolder.kt create mode 100644 features/rageshake/test/build.gradle.kts create mode 100644 features/rageshake/test/src/main/kotlin/io/element/android/features/rageshake/test/logs/FakeLogFilesRemover.kt create mode 100644 features/reportroom/api/build.gradle.kts create mode 100644 features/reportroom/api/src/main/kotlin/io/element/android/features/reportroom/api/ReportRoomEntryPoint.kt create mode 100644 features/reportroom/impl/build.gradle.kts create mode 100644 features/reportroom/impl/src/main/kotlin/io/element/android/features/reportroom/impl/DefaultReportRoomEntryPoint.kt create mode 100644 features/reportroom/impl/src/main/kotlin/io/element/android/features/reportroom/impl/ReportRoom.kt create mode 100644 features/reportroom/impl/src/main/kotlin/io/element/android/features/reportroom/impl/ReportRoomEvents.kt create mode 100644 features/reportroom/impl/src/main/kotlin/io/element/android/features/reportroom/impl/ReportRoomNode.kt create mode 100644 features/reportroom/impl/src/main/kotlin/io/element/android/features/reportroom/impl/ReportRoomPresenter.kt create mode 100644 features/reportroom/impl/src/main/kotlin/io/element/android/features/reportroom/impl/ReportRoomState.kt create mode 100644 features/reportroom/impl/src/main/kotlin/io/element/android/features/reportroom/impl/ReportRoomStateProvider.kt create mode 100644 features/reportroom/impl/src/main/kotlin/io/element/android/features/reportroom/impl/ReportRoomView.kt create mode 100644 features/reportroom/impl/src/main/res/values-bg/translations.xml create mode 100644 features/reportroom/impl/src/main/res/values-cs/translations.xml create mode 100644 features/reportroom/impl/src/main/res/values-cy/translations.xml create mode 100644 features/reportroom/impl/src/main/res/values-da/translations.xml create mode 100644 features/reportroom/impl/src/main/res/values-de/translations.xml create mode 100644 features/reportroom/impl/src/main/res/values-el/translations.xml create mode 100644 features/reportroom/impl/src/main/res/values-es/translations.xml create mode 100644 features/reportroom/impl/src/main/res/values-et/translations.xml create mode 100644 features/reportroom/impl/src/main/res/values-eu/translations.xml create mode 100644 features/reportroom/impl/src/main/res/values-fa/translations.xml create mode 100644 features/reportroom/impl/src/main/res/values-fi/translations.xml create mode 100644 features/reportroom/impl/src/main/res/values-fr/translations.xml create mode 100644 features/reportroom/impl/src/main/res/values-hu/translations.xml create mode 100644 features/reportroom/impl/src/main/res/values-in/translations.xml create mode 100644 features/reportroom/impl/src/main/res/values-it/translations.xml create mode 100644 features/reportroom/impl/src/main/res/values-ko/translations.xml create mode 100644 features/reportroom/impl/src/main/res/values-nb/translations.xml create mode 100644 features/reportroom/impl/src/main/res/values-nl/translations.xml create mode 100644 features/reportroom/impl/src/main/res/values-pl/translations.xml create mode 100644 features/reportroom/impl/src/main/res/values-pt-rBR/translations.xml create mode 100644 features/reportroom/impl/src/main/res/values-pt/translations.xml create mode 100644 features/reportroom/impl/src/main/res/values-ro/translations.xml create mode 100644 features/reportroom/impl/src/main/res/values-ru/translations.xml create mode 100644 features/reportroom/impl/src/main/res/values-sk/translations.xml create mode 100644 features/reportroom/impl/src/main/res/values-sv/translations.xml create mode 100644 features/reportroom/impl/src/main/res/values-uk/translations.xml create mode 100644 features/reportroom/impl/src/main/res/values-uz/translations.xml create mode 100644 features/reportroom/impl/src/main/res/values-zh-rTW/translations.xml create mode 100644 features/reportroom/impl/src/main/res/values-zh/translations.xml create mode 100644 features/reportroom/impl/src/main/res/values/localazy.xml create mode 100644 features/reportroom/impl/src/test/kotlin/io/element/android/features/reportroom/impl/DefaultReportRoomEntryPointTest.kt create mode 100644 features/reportroom/impl/src/test/kotlin/io/element/android/features/reportroom/impl/DefaultReportRoomTest.kt create mode 100644 features/reportroom/impl/src/test/kotlin/io/element/android/features/reportroom/impl/ReportRoomPresenterTest.kt create mode 100644 features/reportroom/impl/src/test/kotlin/io/element/android/features/reportroom/impl/ReportRoomViewTest.kt create mode 100644 features/reportroom/impl/src/test/kotlin/io/element/android/features/reportroom/impl/fakes/FakeReportRoom.kt create mode 100644 features/reportroom/test/build.gradle.kts create mode 100644 features/reportroom/test/src/main/kotlin/io/element/android/features/reportroom/test/FakeReportRoomEntryPoint.kt create mode 100644 features/rolesandpermissions/api/build.gradle.kts create mode 100644 features/rolesandpermissions/api/src/main/kotlin/io/element/android/features/rolesandpermissions/api/ChangeRoomMemberRolesEntryPoint.kt create mode 100644 features/rolesandpermissions/api/src/main/kotlin/io/element/android/features/rolesandpermissions/api/RolesAndPermissionsEntryPoint.kt create mode 100644 features/rolesandpermissions/impl/build.gradle.kts create mode 100644 features/rolesandpermissions/impl/src/main/kotlin/io/element/android/features/rolesandpermissions/impl/DefaultRolesAndPermissionsEntryPoint.kt create mode 100644 features/rolesandpermissions/impl/src/main/kotlin/io/element/android/features/rolesandpermissions/impl/RolesAndPermissionsFlowNode.kt create mode 100644 features/rolesandpermissions/impl/src/main/kotlin/io/element/android/features/rolesandpermissions/impl/RoomMemberListDataSource.kt create mode 100644 features/rolesandpermissions/impl/src/main/kotlin/io/element/android/features/rolesandpermissions/impl/analytics/AnalyticUtils.kt create mode 100644 features/rolesandpermissions/impl/src/main/kotlin/io/element/android/features/rolesandpermissions/impl/permissions/ChangeRoomPermissionsEvent.kt create mode 100644 features/rolesandpermissions/impl/src/main/kotlin/io/element/android/features/rolesandpermissions/impl/permissions/ChangeRoomPermissionsNode.kt create mode 100644 features/rolesandpermissions/impl/src/main/kotlin/io/element/android/features/rolesandpermissions/impl/permissions/ChangeRoomPermissionsPresenter.kt create mode 100644 features/rolesandpermissions/impl/src/main/kotlin/io/element/android/features/rolesandpermissions/impl/permissions/ChangeRoomPermissionsState.kt create mode 100644 features/rolesandpermissions/impl/src/main/kotlin/io/element/android/features/rolesandpermissions/impl/permissions/ChangeRoomPermissionsStateProvider.kt create mode 100644 features/rolesandpermissions/impl/src/main/kotlin/io/element/android/features/rolesandpermissions/impl/permissions/ChangeRoomPermissionsView.kt create mode 100644 features/rolesandpermissions/impl/src/main/kotlin/io/element/android/features/rolesandpermissions/impl/roles/ChangeRolesEvent.kt create mode 100644 features/rolesandpermissions/impl/src/main/kotlin/io/element/android/features/rolesandpermissions/impl/roles/ChangeRolesNode.kt create mode 100644 features/rolesandpermissions/impl/src/main/kotlin/io/element/android/features/rolesandpermissions/impl/roles/ChangeRolesPresenter.kt create mode 100644 features/rolesandpermissions/impl/src/main/kotlin/io/element/android/features/rolesandpermissions/impl/roles/ChangeRolesState.kt create mode 100644 features/rolesandpermissions/impl/src/main/kotlin/io/element/android/features/rolesandpermissions/impl/roles/ChangeRolesStateProvider.kt create mode 100644 features/rolesandpermissions/impl/src/main/kotlin/io/element/android/features/rolesandpermissions/impl/roles/ChangeRolesView.kt create mode 100644 features/rolesandpermissions/impl/src/main/kotlin/io/element/android/features/rolesandpermissions/impl/roles/ChangeRoomMemberRolesRootNode.kt create mode 100644 features/rolesandpermissions/impl/src/main/kotlin/io/element/android/features/rolesandpermissions/impl/roles/ConfirmingModifyingAdmins.kt create mode 100644 features/rolesandpermissions/impl/src/main/kotlin/io/element/android/features/rolesandpermissions/impl/roles/ConfirmingModifyingOwners.kt create mode 100644 features/rolesandpermissions/impl/src/main/kotlin/io/element/android/features/rolesandpermissions/impl/roles/DefaultChangeRoomMemberRolesEntyPoint.kt create mode 100644 features/rolesandpermissions/impl/src/main/kotlin/io/element/android/features/rolesandpermissions/impl/root/RolesAndPermissionsEvents.kt create mode 100644 features/rolesandpermissions/impl/src/main/kotlin/io/element/android/features/rolesandpermissions/impl/root/RolesAndPermissionsNode.kt create mode 100644 features/rolesandpermissions/impl/src/main/kotlin/io/element/android/features/rolesandpermissions/impl/root/RolesAndPermissionsPresenter.kt create mode 100644 features/rolesandpermissions/impl/src/main/kotlin/io/element/android/features/rolesandpermissions/impl/root/RolesAndPermissionsState.kt create mode 100644 features/rolesandpermissions/impl/src/main/kotlin/io/element/android/features/rolesandpermissions/impl/root/RolesAndPermissionsStateProvider.kt create mode 100644 features/rolesandpermissions/impl/src/main/kotlin/io/element/android/features/rolesandpermissions/impl/root/RolesAndPermissionsView.kt create mode 100644 features/rolesandpermissions/impl/src/main/res/values-be/translations.xml create mode 100644 features/rolesandpermissions/impl/src/main/res/values-bg/translations.xml create mode 100644 features/rolesandpermissions/impl/src/main/res/values-cs/translations.xml create mode 100644 features/rolesandpermissions/impl/src/main/res/values-cy/translations.xml create mode 100644 features/rolesandpermissions/impl/src/main/res/values-da/translations.xml create mode 100644 features/rolesandpermissions/impl/src/main/res/values-de/translations.xml create mode 100644 features/rolesandpermissions/impl/src/main/res/values-el/translations.xml create mode 100644 features/rolesandpermissions/impl/src/main/res/values-es/translations.xml create mode 100644 features/rolesandpermissions/impl/src/main/res/values-et/translations.xml create mode 100644 features/rolesandpermissions/impl/src/main/res/values-eu/translations.xml create mode 100644 features/rolesandpermissions/impl/src/main/res/values-fa/translations.xml create mode 100644 features/rolesandpermissions/impl/src/main/res/values-fi/translations.xml create mode 100644 features/rolesandpermissions/impl/src/main/res/values-fr/translations.xml create mode 100644 features/rolesandpermissions/impl/src/main/res/values-hu/translations.xml create mode 100644 features/rolesandpermissions/impl/src/main/res/values-in/translations.xml create mode 100644 features/rolesandpermissions/impl/src/main/res/values-it/translations.xml create mode 100644 features/rolesandpermissions/impl/src/main/res/values-ka/translations.xml create mode 100644 features/rolesandpermissions/impl/src/main/res/values-ko/translations.xml create mode 100644 features/rolesandpermissions/impl/src/main/res/values-lt/translations.xml create mode 100644 features/rolesandpermissions/impl/src/main/res/values-nb/translations.xml create mode 100644 features/rolesandpermissions/impl/src/main/res/values-nl/translations.xml create mode 100644 features/rolesandpermissions/impl/src/main/res/values-pl/translations.xml create mode 100644 features/rolesandpermissions/impl/src/main/res/values-pt-rBR/translations.xml create mode 100644 features/rolesandpermissions/impl/src/main/res/values-pt/translations.xml create mode 100644 features/rolesandpermissions/impl/src/main/res/values-ro/translations.xml create mode 100644 features/rolesandpermissions/impl/src/main/res/values-ru/translations.xml create mode 100644 features/rolesandpermissions/impl/src/main/res/values-sk/translations.xml create mode 100644 features/rolesandpermissions/impl/src/main/res/values-sv/translations.xml create mode 100644 features/rolesandpermissions/impl/src/main/res/values-tr/translations.xml create mode 100644 features/rolesandpermissions/impl/src/main/res/values-uk/translations.xml create mode 100644 features/rolesandpermissions/impl/src/main/res/values-ur/translations.xml create mode 100644 features/rolesandpermissions/impl/src/main/res/values-uz/translations.xml create mode 100644 features/rolesandpermissions/impl/src/main/res/values-zh-rTW/translations.xml create mode 100644 features/rolesandpermissions/impl/src/main/res/values-zh/translations.xml create mode 100644 features/rolesandpermissions/impl/src/main/res/values/localazy.xml create mode 100644 features/rolesandpermissions/impl/src/test/kotlin/io/element/android/features/rolesandpermissions/impl/permissions/ChangeRoomPermissionsPresenterTest.kt create mode 100644 features/rolesandpermissions/impl/src/test/kotlin/io/element/android/features/rolesandpermissions/impl/permissions/ChangeRoomPermissionsViewTest.kt create mode 100644 features/rolesandpermissions/impl/src/test/kotlin/io/element/android/features/rolesandpermissions/impl/roles/ChangeRolesNodeTest.kt create mode 100644 features/rolesandpermissions/impl/src/test/kotlin/io/element/android/features/rolesandpermissions/impl/roles/ChangeRolesPresenterTest.kt create mode 100644 features/rolesandpermissions/impl/src/test/kotlin/io/element/android/features/rolesandpermissions/impl/roles/ChangeRolesViewTest.kt create mode 100644 features/rolesandpermissions/impl/src/test/kotlin/io/element/android/features/rolesandpermissions/impl/roles/DefaultChangeRoomMemberRolesEntyPointTest.kt create mode 100644 features/rolesandpermissions/impl/src/test/kotlin/io/element/android/features/rolesandpermissions/impl/roles/MembersByRoleTest.kt create mode 100644 features/rolesandpermissions/impl/src/test/kotlin/io/element/android/features/rolesandpermissions/impl/root/RolesAndPermissionPresenterTest.kt create mode 100644 features/rolesandpermissions/impl/src/test/kotlin/io/element/android/features/rolesandpermissions/impl/root/RolesAndPermissionsViewTest.kt create mode 100644 features/rolesandpermissions/test/build.gradle.kts create mode 100644 features/rolesandpermissions/test/src/main/kotlin/io/element/android/features/changeroommemberroles/test/FakeChangeRoomMemberRolesEntryPoint.kt create mode 100644 features/rolesandpermissions/test/src/main/kotlin/io/element/android/features/changeroommemberroles/test/FakeRolesAndPermissionsEntryPoint.kt create mode 100644 features/roomaliasresolver/api/build.gradle.kts create mode 100644 features/roomaliasresolver/api/src/main/kotlin/io/element/android/features/roomaliasesolver/api/RoomAliasResolverEntryPoint.kt create mode 100644 features/roomaliasresolver/impl/build.gradle.kts create mode 100644 features/roomaliasresolver/impl/src/main/kotlin/io/element/android/features/roomaliasresolver/impl/DefaultRoomAliasResolverEntryPoint.kt create mode 100644 features/roomaliasresolver/impl/src/main/kotlin/io/element/android/features/roomaliasresolver/impl/RoomAliasResolverEvents.kt create mode 100644 features/roomaliasresolver/impl/src/main/kotlin/io/element/android/features/roomaliasresolver/impl/RoomAliasResolverNode.kt create mode 100644 features/roomaliasresolver/impl/src/main/kotlin/io/element/android/features/roomaliasresolver/impl/RoomAliasResolverPresenter.kt create mode 100644 features/roomaliasresolver/impl/src/main/kotlin/io/element/android/features/roomaliasresolver/impl/RoomAliasResolverState.kt create mode 100644 features/roomaliasresolver/impl/src/main/kotlin/io/element/android/features/roomaliasresolver/impl/RoomAliasResolverStateProvider.kt create mode 100644 features/roomaliasresolver/impl/src/main/kotlin/io/element/android/features/roomaliasresolver/impl/RoomAliasResolverView.kt create mode 100644 features/roomaliasresolver/impl/src/main/kotlin/io/element/android/features/roomaliasresolver/impl/di/RoomAliasResolverModule.kt create mode 100644 features/roomaliasresolver/impl/src/main/res/values-be/translations.xml create mode 100644 features/roomaliasresolver/impl/src/main/res/values-cs/translations.xml create mode 100644 features/roomaliasresolver/impl/src/main/res/values-cy/translations.xml create mode 100644 features/roomaliasresolver/impl/src/main/res/values-da/translations.xml create mode 100644 features/roomaliasresolver/impl/src/main/res/values-de/translations.xml create mode 100644 features/roomaliasresolver/impl/src/main/res/values-el/translations.xml create mode 100644 features/roomaliasresolver/impl/src/main/res/values-es/translations.xml create mode 100644 features/roomaliasresolver/impl/src/main/res/values-et/translations.xml create mode 100644 features/roomaliasresolver/impl/src/main/res/values-fi/translations.xml create mode 100644 features/roomaliasresolver/impl/src/main/res/values-fr/translations.xml create mode 100644 features/roomaliasresolver/impl/src/main/res/values-hu/translations.xml create mode 100644 features/roomaliasresolver/impl/src/main/res/values-in/translations.xml create mode 100644 features/roomaliasresolver/impl/src/main/res/values-it/translations.xml create mode 100644 features/roomaliasresolver/impl/src/main/res/values-ko/translations.xml create mode 100644 features/roomaliasresolver/impl/src/main/res/values-nb/translations.xml create mode 100644 features/roomaliasresolver/impl/src/main/res/values-nl/translations.xml create mode 100644 features/roomaliasresolver/impl/src/main/res/values-pl/translations.xml create mode 100644 features/roomaliasresolver/impl/src/main/res/values-pt-rBR/translations.xml create mode 100644 features/roomaliasresolver/impl/src/main/res/values-pt/translations.xml create mode 100644 features/roomaliasresolver/impl/src/main/res/values-ro/translations.xml create mode 100644 features/roomaliasresolver/impl/src/main/res/values-ru/translations.xml create mode 100644 features/roomaliasresolver/impl/src/main/res/values-sk/translations.xml create mode 100644 features/roomaliasresolver/impl/src/main/res/values-sv/translations.xml create mode 100644 features/roomaliasresolver/impl/src/main/res/values-tr/translations.xml create mode 100644 features/roomaliasresolver/impl/src/main/res/values-uk/translations.xml create mode 100644 features/roomaliasresolver/impl/src/main/res/values-ur/translations.xml create mode 100644 features/roomaliasresolver/impl/src/main/res/values-uz/translations.xml create mode 100644 features/roomaliasresolver/impl/src/main/res/values-zh-rTW/translations.xml create mode 100644 features/roomaliasresolver/impl/src/main/res/values-zh/translations.xml create mode 100644 features/roomaliasresolver/impl/src/main/res/values/localazy.xml create mode 100644 features/roomaliasresolver/impl/src/test/kotlin/io/element/android/features/roomaliasresolver/impl/DefaultRoomAliasResolverEntryPointTest.kt create mode 100644 features/roomaliasresolver/impl/src/test/kotlin/io/element/android/features/roomaliasresolver/impl/RoomAliasHelperPresenterTest.kt create mode 100644 features/roomaliasresolver/impl/src/test/kotlin/io/element/android/features/roomaliasresolver/impl/RoomAliasHelperViewTest.kt create mode 100644 features/roomcall/api/build.gradle.kts create mode 100644 features/roomcall/api/src/main/kotlin/io/element/android/features/roomcall/api/RoomCallState.kt create mode 100644 features/roomcall/api/src/main/kotlin/io/element/android/features/roomcall/api/RoomCallStateProvider.kt create mode 100644 features/roomcall/impl/build.gradle.kts create mode 100644 features/roomcall/impl/src/main/kotlin/io/element/android/features/roomcall/impl/RoomCallStatePresenter.kt create mode 100644 features/roomcall/impl/src/main/kotlin/io/element/android/features/roomcall/impl/di/RoomCallModule.kt create mode 100644 features/roomcall/impl/src/test/kotlin/io/element/android/features/roomcall/impl/RoomCallStatePresenterTest.kt create mode 100644 features/roomdetails/api/.gitignore create mode 100644 features/roomdetails/api/build.gradle.kts create mode 100644 features/roomdetails/api/src/main/kotlin/io/element/android/features/roomdetails/api/RoomDetailsEntryPoint.kt create mode 100644 features/roomdetails/impl/.gitignore create mode 100644 features/roomdetails/impl/build.gradle.kts create mode 100644 features/roomdetails/impl/consumer-rules.pro create mode 100644 features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/DefaultRoomDetailsEntryPoint.kt create mode 100644 features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/RoomDetailsAction.kt create mode 100644 features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/RoomDetailsEvent.kt create mode 100644 features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/RoomDetailsFlowNode.kt create mode 100644 features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/RoomDetailsNode.kt create mode 100644 features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/RoomDetailsPresenter.kt create mode 100644 features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/RoomDetailsState.kt create mode 100644 features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/RoomDetailsStateProvider.kt create mode 100644 features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/RoomDetailsView.kt create mode 100644 features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/di/RoomMemberModule.kt create mode 100644 features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/edit/RoomDetailsEditEvents.kt create mode 100644 features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/edit/RoomDetailsEditNode.kt create mode 100644 features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/edit/RoomDetailsEditPresenter.kt create mode 100644 features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/edit/RoomDetailsEditState.kt create mode 100644 features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/edit/RoomDetailsEditStateProvider.kt create mode 100644 features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/edit/RoomDetailsEditView.kt create mode 100644 features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/invite/RoomInviteMembersNode.kt create mode 100644 features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/invite/RoomInviteMembersView.kt create mode 100644 features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/members/RoomMemberListEvents.kt create mode 100644 features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/members/RoomMemberListNode.kt create mode 100644 features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/members/RoomMemberListPresenter.kt create mode 100644 features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/members/RoomMemberListState.kt create mode 100644 features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/members/RoomMemberListStateProvider.kt create mode 100644 features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/members/RoomMemberListView.kt create mode 100644 features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/members/details/RoomMemberDetailsNode.kt create mode 100644 features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/members/details/RoomMemberDetailsPresenter.kt create mode 100644 features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/notificationsettings/RoomNotificationSettingsEvents.kt create mode 100644 features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/notificationsettings/RoomNotificationSettingsItem.kt create mode 100644 features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/notificationsettings/RoomNotificationSettingsNode.kt create mode 100644 features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/notificationsettings/RoomNotificationSettingsOption.kt create mode 100644 features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/notificationsettings/RoomNotificationSettingsOptions.kt create mode 100644 features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/notificationsettings/RoomNotificationSettingsPresenter.kt create mode 100644 features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/notificationsettings/RoomNotificationSettingsState.kt create mode 100644 features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/notificationsettings/RoomNotificationSettingsStateProvider.kt create mode 100644 features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/notificationsettings/RoomNotificationSettingsView.kt create mode 100644 features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/notificationsettings/UserDefinedRoomNotificationSettingsStateProvider.kt create mode 100644 features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/notificationsettings/UserDefinedRoomNotificationSettingsView.kt create mode 100644 features/roomdetails/impl/src/main/res/values-be/translations.xml create mode 100644 features/roomdetails/impl/src/main/res/values-bg/translations.xml create mode 100644 features/roomdetails/impl/src/main/res/values-cs/translations.xml create mode 100644 features/roomdetails/impl/src/main/res/values-cy/translations.xml create mode 100644 features/roomdetails/impl/src/main/res/values-da/translations.xml create mode 100644 features/roomdetails/impl/src/main/res/values-de/translations.xml create mode 100644 features/roomdetails/impl/src/main/res/values-el/translations.xml create mode 100644 features/roomdetails/impl/src/main/res/values-es/translations.xml create mode 100644 features/roomdetails/impl/src/main/res/values-et/translations.xml create mode 100644 features/roomdetails/impl/src/main/res/values-eu/translations.xml create mode 100644 features/roomdetails/impl/src/main/res/values-fa/translations.xml create mode 100644 features/roomdetails/impl/src/main/res/values-fi/translations.xml create mode 100644 features/roomdetails/impl/src/main/res/values-fr/translations.xml create mode 100644 features/roomdetails/impl/src/main/res/values-hu/translations.xml create mode 100644 features/roomdetails/impl/src/main/res/values-in/translations.xml create mode 100644 features/roomdetails/impl/src/main/res/values-it/translations.xml create mode 100644 features/roomdetails/impl/src/main/res/values-ka/translations.xml create mode 100644 features/roomdetails/impl/src/main/res/values-ko/translations.xml create mode 100644 features/roomdetails/impl/src/main/res/values-lt/translations.xml create mode 100644 features/roomdetails/impl/src/main/res/values-nb/translations.xml create mode 100644 features/roomdetails/impl/src/main/res/values-nl/translations.xml create mode 100644 features/roomdetails/impl/src/main/res/values-pl/translations.xml create mode 100644 features/roomdetails/impl/src/main/res/values-pt-rBR/translations.xml create mode 100644 features/roomdetails/impl/src/main/res/values-pt/translations.xml create mode 100644 features/roomdetails/impl/src/main/res/values-ro/translations.xml create mode 100644 features/roomdetails/impl/src/main/res/values-ru/translations.xml create mode 100644 features/roomdetails/impl/src/main/res/values-sk/translations.xml create mode 100644 features/roomdetails/impl/src/main/res/values-sv/translations.xml create mode 100644 features/roomdetails/impl/src/main/res/values-tr/translations.xml create mode 100644 features/roomdetails/impl/src/main/res/values-uk/translations.xml create mode 100644 features/roomdetails/impl/src/main/res/values-ur/translations.xml create mode 100644 features/roomdetails/impl/src/main/res/values-uz/translations.xml create mode 100644 features/roomdetails/impl/src/main/res/values-zh-rTW/translations.xml create mode 100644 features/roomdetails/impl/src/main/res/values-zh/translations.xml create mode 100644 features/roomdetails/impl/src/main/res/values/localazy.xml create mode 100644 features/roomdetails/impl/src/test/kotlin/io/element/android/features/roomdetails/impl/DefaultRoomDetailsEntryPointTest.kt create mode 100644 features/roomdetails/impl/src/test/kotlin/io/element/android/features/roomdetails/impl/MatrixRoomFixture.kt create mode 100644 features/roomdetails/impl/src/test/kotlin/io/element/android/features/roomdetails/impl/RoomDetailsPresenterTest.kt create mode 100644 features/roomdetails/impl/src/test/kotlin/io/element/android/features/roomdetails/impl/RoomDetailsStateTest.kt create mode 100644 features/roomdetails/impl/src/test/kotlin/io/element/android/features/roomdetails/impl/RoomDetailsViewTest.kt create mode 100644 features/roomdetails/impl/src/test/kotlin/io/element/android/features/roomdetails/impl/edit/RoomDetailsEditPresenterTest.kt create mode 100644 features/roomdetails/impl/src/test/kotlin/io/element/android/features/roomdetails/impl/edit/RoomDetailsEditViewTest.kt create mode 100644 features/roomdetails/impl/src/test/kotlin/io/element/android/features/roomdetails/impl/members/RoomMemberListPresenterTest.kt create mode 100644 features/roomdetails/impl/src/test/kotlin/io/element/android/features/roomdetails/impl/members/details/RoomMemberDetailsPresenterTest.kt create mode 100644 features/roomdetails/impl/src/test/kotlin/io/element/android/features/roomdetails/impl/notificationsettings/RoomNotificationSettingsPresenterTest.kt create mode 100644 features/roomdirectory/api/build.gradle.kts create mode 100644 features/roomdirectory/api/src/main/kotlin/io/element/android/features/roomdirectory/api/RoomDescription.kt create mode 100644 features/roomdirectory/api/src/main/kotlin/io/element/android/features/roomdirectory/api/RoomDirectoryEntryPoint.kt create mode 100644 features/roomdirectory/impl/build.gradle.kts create mode 100644 features/roomdirectory/impl/src/main/kotlin/io/element/android/features/roomdirectory/impl/DefaultRoomDirectoryEntryPoint.kt create mode 100644 features/roomdirectory/impl/src/main/kotlin/io/element/android/features/roomdirectory/impl/root/RoomDirectoryEvents.kt create mode 100644 features/roomdirectory/impl/src/main/kotlin/io/element/android/features/roomdirectory/impl/root/RoomDirectoryNode.kt create mode 100644 features/roomdirectory/impl/src/main/kotlin/io/element/android/features/roomdirectory/impl/root/RoomDirectoryPresenter.kt create mode 100644 features/roomdirectory/impl/src/main/kotlin/io/element/android/features/roomdirectory/impl/root/RoomDirectoryState.kt create mode 100644 features/roomdirectory/impl/src/main/kotlin/io/element/android/features/roomdirectory/impl/root/RoomDirectoryStateProvider.kt create mode 100644 features/roomdirectory/impl/src/main/kotlin/io/element/android/features/roomdirectory/impl/root/RoomDirectoryView.kt create mode 100644 features/roomdirectory/impl/src/main/kotlin/io/element/android/features/roomdirectory/impl/root/model/RoomDescription.kt create mode 100644 features/roomdirectory/impl/src/main/kotlin/io/element/android/features/roomdirectory/impl/root/model/RoomDirectoryListState.kt create mode 100644 features/roomdirectory/impl/src/main/res/values-be/translations.xml create mode 100644 features/roomdirectory/impl/src/main/res/values-cs/translations.xml create mode 100644 features/roomdirectory/impl/src/main/res/values-cy/translations.xml create mode 100644 features/roomdirectory/impl/src/main/res/values-da/translations.xml create mode 100644 features/roomdirectory/impl/src/main/res/values-de/translations.xml create mode 100644 features/roomdirectory/impl/src/main/res/values-el/translations.xml create mode 100644 features/roomdirectory/impl/src/main/res/values-es/translations.xml create mode 100644 features/roomdirectory/impl/src/main/res/values-et/translations.xml create mode 100644 features/roomdirectory/impl/src/main/res/values-eu/translations.xml create mode 100644 features/roomdirectory/impl/src/main/res/values-fa/translations.xml create mode 100644 features/roomdirectory/impl/src/main/res/values-fi/translations.xml create mode 100644 features/roomdirectory/impl/src/main/res/values-fr/translations.xml create mode 100644 features/roomdirectory/impl/src/main/res/values-hu/translations.xml create mode 100644 features/roomdirectory/impl/src/main/res/values-in/translations.xml create mode 100644 features/roomdirectory/impl/src/main/res/values-it/translations.xml create mode 100644 features/roomdirectory/impl/src/main/res/values-ka/translations.xml create mode 100644 features/roomdirectory/impl/src/main/res/values-ko/translations.xml create mode 100644 features/roomdirectory/impl/src/main/res/values-nb/translations.xml create mode 100644 features/roomdirectory/impl/src/main/res/values-nl/translations.xml create mode 100644 features/roomdirectory/impl/src/main/res/values-pl/translations.xml create mode 100644 features/roomdirectory/impl/src/main/res/values-pt-rBR/translations.xml create mode 100644 features/roomdirectory/impl/src/main/res/values-pt/translations.xml create mode 100644 features/roomdirectory/impl/src/main/res/values-ro/translations.xml create mode 100644 features/roomdirectory/impl/src/main/res/values-ru/translations.xml create mode 100644 features/roomdirectory/impl/src/main/res/values-sk/translations.xml create mode 100644 features/roomdirectory/impl/src/main/res/values-sv/translations.xml create mode 100644 features/roomdirectory/impl/src/main/res/values-tr/translations.xml create mode 100644 features/roomdirectory/impl/src/main/res/values-uk/translations.xml create mode 100644 features/roomdirectory/impl/src/main/res/values-ur/translations.xml create mode 100644 features/roomdirectory/impl/src/main/res/values-uz/translations.xml create mode 100644 features/roomdirectory/impl/src/main/res/values-zh-rTW/translations.xml create mode 100644 features/roomdirectory/impl/src/main/res/values-zh/translations.xml create mode 100644 features/roomdirectory/impl/src/main/res/values/localazy.xml create mode 100644 features/roomdirectory/impl/src/test/kotlin/io/element/android/features/roomdirectory/impl/DefaultRoomDirectoryEntryPointTest.kt create mode 100644 features/roomdirectory/impl/src/test/kotlin/io/element/android/features/roomdirectory/impl/root/RoomDirectoryPresenterTest.kt create mode 100644 features/roomdirectory/impl/src/test/kotlin/io/element/android/features/roomdirectory/impl/root/RoomDirectoryViewTest.kt create mode 100644 features/roommembermoderation/api/build.gradle.kts create mode 100644 features/roommembermoderation/api/src/main/kotlin/io/element/android/features/roommembermoderation/api/RoomMemberModerationEvents.kt create mode 100644 features/roommembermoderation/api/src/main/kotlin/io/element/android/features/roommembermoderation/api/RoomMemberModerationRenderer.kt create mode 100644 features/roommembermoderation/api/src/main/kotlin/io/element/android/features/roommembermoderation/api/RoomMemberModerationState.kt create mode 100644 features/roommembermoderation/impl/build.gradle.kts create mode 100644 features/roommembermoderation/impl/src/main/kotlin/io/element/android/features/roommembermoderation/impl/DefaultRoomMemberModerationRenderer.kt create mode 100644 features/roommembermoderation/impl/src/main/kotlin/io/element/android/features/roommembermoderation/impl/InternalRoomMemberModerationEvents.kt create mode 100644 features/roommembermoderation/impl/src/main/kotlin/io/element/android/features/roommembermoderation/impl/InternalRoomMemberModerationState.kt create mode 100644 features/roommembermoderation/impl/src/main/kotlin/io/element/android/features/roommembermoderation/impl/InternalRoomMemberModerationStateProvider.kt create mode 100644 features/roommembermoderation/impl/src/main/kotlin/io/element/android/features/roommembermoderation/impl/RoomMemberModerationPresenter.kt create mode 100644 features/roommembermoderation/impl/src/main/kotlin/io/element/android/features/roommembermoderation/impl/RoomMemberModerationView.kt create mode 100644 features/roommembermoderation/impl/src/main/kotlin/io/element/android/features/roommembermoderation/impl/di/RoomMemberModerationModule.kt create mode 100644 features/roommembermoderation/impl/src/main/res/values-be/translations.xml create mode 100644 features/roommembermoderation/impl/src/main/res/values-bg/translations.xml create mode 100644 features/roommembermoderation/impl/src/main/res/values-cs/translations.xml create mode 100644 features/roommembermoderation/impl/src/main/res/values-cy/translations.xml create mode 100644 features/roommembermoderation/impl/src/main/res/values-da/translations.xml create mode 100644 features/roommembermoderation/impl/src/main/res/values-de/translations.xml create mode 100644 features/roommembermoderation/impl/src/main/res/values-el/translations.xml create mode 100644 features/roommembermoderation/impl/src/main/res/values-es/translations.xml create mode 100644 features/roommembermoderation/impl/src/main/res/values-et/translations.xml create mode 100644 features/roommembermoderation/impl/src/main/res/values-eu/translations.xml create mode 100644 features/roommembermoderation/impl/src/main/res/values-fa/translations.xml create mode 100644 features/roommembermoderation/impl/src/main/res/values-fi/translations.xml create mode 100644 features/roommembermoderation/impl/src/main/res/values-fr/translations.xml create mode 100644 features/roommembermoderation/impl/src/main/res/values-hu/translations.xml create mode 100644 features/roommembermoderation/impl/src/main/res/values-in/translations.xml create mode 100644 features/roommembermoderation/impl/src/main/res/values-it/translations.xml create mode 100644 features/roommembermoderation/impl/src/main/res/values-ka/translations.xml create mode 100644 features/roommembermoderation/impl/src/main/res/values-ko/translations.xml create mode 100644 features/roommembermoderation/impl/src/main/res/values-nb/translations.xml create mode 100644 features/roommembermoderation/impl/src/main/res/values-nl/translations.xml create mode 100644 features/roommembermoderation/impl/src/main/res/values-pl/translations.xml create mode 100644 features/roommembermoderation/impl/src/main/res/values-pt-rBR/translations.xml create mode 100644 features/roommembermoderation/impl/src/main/res/values-pt/translations.xml create mode 100644 features/roommembermoderation/impl/src/main/res/values-ro/translations.xml create mode 100644 features/roommembermoderation/impl/src/main/res/values-ru/translations.xml create mode 100644 features/roommembermoderation/impl/src/main/res/values-sk/translations.xml create mode 100644 features/roommembermoderation/impl/src/main/res/values-sv/translations.xml create mode 100644 features/roommembermoderation/impl/src/main/res/values-tr/translations.xml create mode 100644 features/roommembermoderation/impl/src/main/res/values-uk/translations.xml create mode 100644 features/roommembermoderation/impl/src/main/res/values-ur/translations.xml create mode 100644 features/roommembermoderation/impl/src/main/res/values-uz/translations.xml create mode 100644 features/roommembermoderation/impl/src/main/res/values-zh-rTW/translations.xml create mode 100644 features/roommembermoderation/impl/src/main/res/values-zh/translations.xml create mode 100644 features/roommembermoderation/impl/src/main/res/values/localazy.xml create mode 100644 features/roommembermoderation/impl/src/test/kotlin/io/element/android/features/roommembermoderation/impl/RoomMemberModerationPresenterTest.kt create mode 100644 features/roommembermoderation/impl/src/test/kotlin/io/element/android/features/roommembermoderation/impl/RoomMemberModerationViewTest.kt create mode 100644 features/securebackup/api/build.gradle.kts create mode 100644 features/securebackup/api/src/main/kotlin/io/element/android/features/securebackup/api/SecureBackupEntryPoint.kt create mode 100644 features/securebackup/impl/build.gradle.kts create mode 100644 features/securebackup/impl/src/main/kotlin/io/element/android/features/securebackup/impl/DefaultSecureBackupEntryPoint.kt create mode 100644 features/securebackup/impl/src/main/kotlin/io/element/android/features/securebackup/impl/LoggerTag.kt create mode 100644 features/securebackup/impl/src/main/kotlin/io/element/android/features/securebackup/impl/SecureBackupFlowNode.kt create mode 100644 features/securebackup/impl/src/main/kotlin/io/element/android/features/securebackup/impl/disable/SecureBackupDisableEvents.kt create mode 100644 features/securebackup/impl/src/main/kotlin/io/element/android/features/securebackup/impl/disable/SecureBackupDisableNode.kt create mode 100644 features/securebackup/impl/src/main/kotlin/io/element/android/features/securebackup/impl/disable/SecureBackupDisablePresenter.kt create mode 100644 features/securebackup/impl/src/main/kotlin/io/element/android/features/securebackup/impl/disable/SecureBackupDisableState.kt create mode 100644 features/securebackup/impl/src/main/kotlin/io/element/android/features/securebackup/impl/disable/SecureBackupDisableStateProvider.kt create mode 100644 features/securebackup/impl/src/main/kotlin/io/element/android/features/securebackup/impl/disable/SecureBackupDisableView.kt create mode 100644 features/securebackup/impl/src/main/kotlin/io/element/android/features/securebackup/impl/enter/SecureBackupEnterRecoveryKeyEvents.kt create mode 100644 features/securebackup/impl/src/main/kotlin/io/element/android/features/securebackup/impl/enter/SecureBackupEnterRecoveryKeyNode.kt create mode 100644 features/securebackup/impl/src/main/kotlin/io/element/android/features/securebackup/impl/enter/SecureBackupEnterRecoveryKeyPresenter.kt create mode 100644 features/securebackup/impl/src/main/kotlin/io/element/android/features/securebackup/impl/enter/SecureBackupEnterRecoveryKeyState.kt create mode 100644 features/securebackup/impl/src/main/kotlin/io/element/android/features/securebackup/impl/enter/SecureBackupEnterRecoveryKeyStateProvider.kt create mode 100644 features/securebackup/impl/src/main/kotlin/io/element/android/features/securebackup/impl/enter/SecureBackupEnterRecoveryKeyView.kt create mode 100644 features/securebackup/impl/src/main/kotlin/io/element/android/features/securebackup/impl/reset/ResetIdentityFlowManager.kt create mode 100644 features/securebackup/impl/src/main/kotlin/io/element/android/features/securebackup/impl/reset/ResetIdentityFlowNode.kt create mode 100644 features/securebackup/impl/src/main/kotlin/io/element/android/features/securebackup/impl/reset/password/ResetIdentityPasswordEvent.kt create mode 100644 features/securebackup/impl/src/main/kotlin/io/element/android/features/securebackup/impl/reset/password/ResetIdentityPasswordNode.kt create mode 100644 features/securebackup/impl/src/main/kotlin/io/element/android/features/securebackup/impl/reset/password/ResetIdentityPasswordPresenter.kt create mode 100644 features/securebackup/impl/src/main/kotlin/io/element/android/features/securebackup/impl/reset/password/ResetIdentityPasswordState.kt create mode 100644 features/securebackup/impl/src/main/kotlin/io/element/android/features/securebackup/impl/reset/password/ResetIdentityPasswordStateProvider.kt create mode 100644 features/securebackup/impl/src/main/kotlin/io/element/android/features/securebackup/impl/reset/password/ResetIdentityPasswordView.kt create mode 100644 features/securebackup/impl/src/main/kotlin/io/element/android/features/securebackup/impl/reset/root/ResetIdentityRootEvent.kt create mode 100644 features/securebackup/impl/src/main/kotlin/io/element/android/features/securebackup/impl/reset/root/ResetIdentityRootNode.kt create mode 100644 features/securebackup/impl/src/main/kotlin/io/element/android/features/securebackup/impl/reset/root/ResetIdentityRootPresenter.kt create mode 100644 features/securebackup/impl/src/main/kotlin/io/element/android/features/securebackup/impl/reset/root/ResetIdentityRootState.kt create mode 100644 features/securebackup/impl/src/main/kotlin/io/element/android/features/securebackup/impl/reset/root/ResetIdentityRootStateProvider.kt create mode 100644 features/securebackup/impl/src/main/kotlin/io/element/android/features/securebackup/impl/reset/root/ResetIdentityRootView.kt create mode 100644 features/securebackup/impl/src/main/kotlin/io/element/android/features/securebackup/impl/root/SecureBackupRootEvents.kt create mode 100644 features/securebackup/impl/src/main/kotlin/io/element/android/features/securebackup/impl/root/SecureBackupRootNode.kt create mode 100644 features/securebackup/impl/src/main/kotlin/io/element/android/features/securebackup/impl/root/SecureBackupRootPresenter.kt create mode 100644 features/securebackup/impl/src/main/kotlin/io/element/android/features/securebackup/impl/root/SecureBackupRootState.kt create mode 100644 features/securebackup/impl/src/main/kotlin/io/element/android/features/securebackup/impl/root/SecureBackupRootStateProvider.kt create mode 100644 features/securebackup/impl/src/main/kotlin/io/element/android/features/securebackup/impl/root/SecureBackupRootView.kt create mode 100644 features/securebackup/impl/src/main/kotlin/io/element/android/features/securebackup/impl/setup/SecureBackupSetupEvents.kt create mode 100644 features/securebackup/impl/src/main/kotlin/io/element/android/features/securebackup/impl/setup/SecureBackupSetupNode.kt create mode 100644 features/securebackup/impl/src/main/kotlin/io/element/android/features/securebackup/impl/setup/SecureBackupSetupPresenter.kt create mode 100644 features/securebackup/impl/src/main/kotlin/io/element/android/features/securebackup/impl/setup/SecureBackupSetupState.kt create mode 100644 features/securebackup/impl/src/main/kotlin/io/element/android/features/securebackup/impl/setup/SecureBackupSetupStateMachine.kt create mode 100644 features/securebackup/impl/src/main/kotlin/io/element/android/features/securebackup/impl/setup/SecureBackupSetupStateProvider.kt create mode 100644 features/securebackup/impl/src/main/kotlin/io/element/android/features/securebackup/impl/setup/SecureBackupSetupView.kt create mode 100644 features/securebackup/impl/src/main/kotlin/io/element/android/features/securebackup/impl/setup/SecureBackupSetupViewChangePreview.kt create mode 100644 features/securebackup/impl/src/main/kotlin/io/element/android/features/securebackup/impl/setup/views/RecoveryKeyView.kt create mode 100644 features/securebackup/impl/src/main/kotlin/io/element/android/features/securebackup/impl/setup/views/RecoveryKeyViewState.kt create mode 100644 features/securebackup/impl/src/main/kotlin/io/element/android/features/securebackup/impl/setup/views/RecoveryKeyViewStateProvider.kt create mode 100644 features/securebackup/impl/src/main/kotlin/io/element/android/features/securebackup/impl/tools/RecoveryKeyTools.kt create mode 100644 features/securebackup/impl/src/main/kotlin/io/element/android/features/securebackup/impl/tools/RecoveryKeyVisualTransformation.kt create mode 100644 features/securebackup/impl/src/main/res/values-be/translations.xml create mode 100644 features/securebackup/impl/src/main/res/values-bg/translations.xml create mode 100644 features/securebackup/impl/src/main/res/values-cs/translations.xml create mode 100644 features/securebackup/impl/src/main/res/values-cy/translations.xml create mode 100644 features/securebackup/impl/src/main/res/values-da/translations.xml create mode 100644 features/securebackup/impl/src/main/res/values-de/translations.xml create mode 100644 features/securebackup/impl/src/main/res/values-el/translations.xml create mode 100644 features/securebackup/impl/src/main/res/values-es/translations.xml create mode 100644 features/securebackup/impl/src/main/res/values-et/translations.xml create mode 100644 features/securebackup/impl/src/main/res/values-eu/translations.xml create mode 100644 features/securebackup/impl/src/main/res/values-fa/translations.xml create mode 100644 features/securebackup/impl/src/main/res/values-fi/translations.xml create mode 100644 features/securebackup/impl/src/main/res/values-fr/translations.xml create mode 100644 features/securebackup/impl/src/main/res/values-hu/translations.xml create mode 100644 features/securebackup/impl/src/main/res/values-in/translations.xml create mode 100644 features/securebackup/impl/src/main/res/values-it/translations.xml create mode 100644 features/securebackup/impl/src/main/res/values-ka/translations.xml create mode 100644 features/securebackup/impl/src/main/res/values-ko/translations.xml create mode 100644 features/securebackup/impl/src/main/res/values-nb/translations.xml create mode 100644 features/securebackup/impl/src/main/res/values-nl/translations.xml create mode 100644 features/securebackup/impl/src/main/res/values-pl/translations.xml create mode 100644 features/securebackup/impl/src/main/res/values-pt-rBR/translations.xml create mode 100644 features/securebackup/impl/src/main/res/values-pt/translations.xml create mode 100644 features/securebackup/impl/src/main/res/values-ro/translations.xml create mode 100644 features/securebackup/impl/src/main/res/values-ru/translations.xml create mode 100644 features/securebackup/impl/src/main/res/values-sk/translations.xml create mode 100644 features/securebackup/impl/src/main/res/values-sv/translations.xml create mode 100644 features/securebackup/impl/src/main/res/values-tr/translations.xml create mode 100644 features/securebackup/impl/src/main/res/values-uk/translations.xml create mode 100644 features/securebackup/impl/src/main/res/values-ur/translations.xml create mode 100644 features/securebackup/impl/src/main/res/values-uz/translations.xml create mode 100644 features/securebackup/impl/src/main/res/values-zh-rTW/translations.xml create mode 100644 features/securebackup/impl/src/main/res/values-zh/translations.xml create mode 100644 features/securebackup/impl/src/main/res/values/localazy.xml create mode 100644 features/securebackup/impl/src/test/kotlin/io/element/android/features/securebackup/impl/DefaultSecureBackupEntryPointTest.kt create mode 100644 features/securebackup/impl/src/test/kotlin/io/element/android/features/securebackup/impl/disable/SecureBackupDisablePresenterTest.kt create mode 100644 features/securebackup/impl/src/test/kotlin/io/element/android/features/securebackup/impl/enter/SecureBackupEnterRecoveryKeyPresenterTest.kt create mode 100644 features/securebackup/impl/src/test/kotlin/io/element/android/features/securebackup/impl/enter/SecureBackupEnterRecoveryKeyViewTest.kt create mode 100644 features/securebackup/impl/src/test/kotlin/io/element/android/features/securebackup/impl/reset/ResetIdentityFlowManagerTest.kt create mode 100644 features/securebackup/impl/src/test/kotlin/io/element/android/features/securebackup/impl/reset/password/ResetIdentityPasswordPresenterTest.kt create mode 100644 features/securebackup/impl/src/test/kotlin/io/element/android/features/securebackup/impl/reset/password/ResetIdentityPasswordViewTest.kt create mode 100644 features/securebackup/impl/src/test/kotlin/io/element/android/features/securebackup/impl/reset/root/ResetIdentityRootPresenterTest.kt create mode 100644 features/securebackup/impl/src/test/kotlin/io/element/android/features/securebackup/impl/reset/root/ResetIdentityRootViewTest.kt create mode 100644 features/securebackup/impl/src/test/kotlin/io/element/android/features/securebackup/impl/root/SecureBackupRootPresenterTest.kt create mode 100644 features/securebackup/impl/src/test/kotlin/io/element/android/features/securebackup/impl/root/SecureBackupRootStateTest.kt create mode 100644 features/securebackup/impl/src/test/kotlin/io/element/android/features/securebackup/impl/setup/SecureBackupSetupPresenterTest.kt create mode 100644 features/securebackup/impl/src/test/kotlin/io/element/android/features/securebackup/impl/tools/RecoveryKeyToolsTest.kt create mode 100644 features/securebackup/impl/src/test/kotlin/io/element/android/features/securebackup/impl/tools/RecoveryKeyVisualTransformationTest.kt create mode 100644 features/securityandprivacy/api/build.gradle.kts create mode 100644 features/securityandprivacy/api/src/main/kotlin/io/element/android/features/securityandprivacy/api/SecurityAndPrivacyEntryPoint.kt create mode 100644 features/securityandprivacy/api/src/main/kotlin/io/element/android/features/securityandprivacy/api/SecurityAndPrivacyPermissions.kt create mode 100644 features/securityandprivacy/impl/build.gradle.kts create mode 100644 features/securityandprivacy/impl/src/main/kotlin/io/element/android/features/securityandprivacy/impl/DefaultSecurityAndPrivacyEntryPoint.kt create mode 100644 features/securityandprivacy/impl/src/main/kotlin/io/element/android/features/securityandprivacy/impl/SecurityAndPrivacyFlowNode.kt create mode 100644 features/securityandprivacy/impl/src/main/kotlin/io/element/android/features/securityandprivacy/impl/SecurityAndPrivacyNavigator.kt create mode 100644 features/securityandprivacy/impl/src/main/kotlin/io/element/android/features/securityandprivacy/impl/editroomaddress/EditRoomAddressEvents.kt create mode 100644 features/securityandprivacy/impl/src/main/kotlin/io/element/android/features/securityandprivacy/impl/editroomaddress/EditRoomAddressNode.kt create mode 100644 features/securityandprivacy/impl/src/main/kotlin/io/element/android/features/securityandprivacy/impl/editroomaddress/EditRoomAddressPresenter.kt create mode 100644 features/securityandprivacy/impl/src/main/kotlin/io/element/android/features/securityandprivacy/impl/editroomaddress/EditRoomAddressState.kt create mode 100644 features/securityandprivacy/impl/src/main/kotlin/io/element/android/features/securityandprivacy/impl/editroomaddress/EditRoomAddressStateProvider.kt create mode 100644 features/securityandprivacy/impl/src/main/kotlin/io/element/android/features/securityandprivacy/impl/editroomaddress/EditRoomAddressView.kt create mode 100644 features/securityandprivacy/impl/src/main/kotlin/io/element/android/features/securityandprivacy/impl/editroomaddress/RoomAlias.kt create mode 100644 features/securityandprivacy/impl/src/main/kotlin/io/element/android/features/securityandprivacy/impl/root/SecurityAndPrivacyEvents.kt create mode 100644 features/securityandprivacy/impl/src/main/kotlin/io/element/android/features/securityandprivacy/impl/root/SecurityAndPrivacyNode.kt create mode 100644 features/securityandprivacy/impl/src/main/kotlin/io/element/android/features/securityandprivacy/impl/root/SecurityAndPrivacyPresenter.kt create mode 100644 features/securityandprivacy/impl/src/main/kotlin/io/element/android/features/securityandprivacy/impl/root/SecurityAndPrivacyState.kt create mode 100644 features/securityandprivacy/impl/src/main/kotlin/io/element/android/features/securityandprivacy/impl/root/SecurityAndPrivacyStateProvider.kt create mode 100644 features/securityandprivacy/impl/src/main/kotlin/io/element/android/features/securityandprivacy/impl/root/SecurityAndPrivacyView.kt create mode 100644 features/securityandprivacy/impl/src/main/res/values-be/translations.xml create mode 100644 features/securityandprivacy/impl/src/main/res/values-bg/translations.xml create mode 100644 features/securityandprivacy/impl/src/main/res/values-cs/translations.xml create mode 100644 features/securityandprivacy/impl/src/main/res/values-cy/translations.xml create mode 100644 features/securityandprivacy/impl/src/main/res/values-da/translations.xml create mode 100644 features/securityandprivacy/impl/src/main/res/values-de/translations.xml create mode 100644 features/securityandprivacy/impl/src/main/res/values-el/translations.xml create mode 100644 features/securityandprivacy/impl/src/main/res/values-es/translations.xml create mode 100644 features/securityandprivacy/impl/src/main/res/values-et/translations.xml create mode 100644 features/securityandprivacy/impl/src/main/res/values-eu/translations.xml create mode 100644 features/securityandprivacy/impl/src/main/res/values-fa/translations.xml create mode 100644 features/securityandprivacy/impl/src/main/res/values-fi/translations.xml create mode 100644 features/securityandprivacy/impl/src/main/res/values-fr/translations.xml create mode 100644 features/securityandprivacy/impl/src/main/res/values-hu/translations.xml create mode 100644 features/securityandprivacy/impl/src/main/res/values-in/translations.xml create mode 100644 features/securityandprivacy/impl/src/main/res/values-it/translations.xml create mode 100644 features/securityandprivacy/impl/src/main/res/values-ko/translations.xml create mode 100644 features/securityandprivacy/impl/src/main/res/values-nb/translations.xml create mode 100644 features/securityandprivacy/impl/src/main/res/values-nl/translations.xml create mode 100644 features/securityandprivacy/impl/src/main/res/values-pl/translations.xml create mode 100644 features/securityandprivacy/impl/src/main/res/values-pt-rBR/translations.xml create mode 100644 features/securityandprivacy/impl/src/main/res/values-pt/translations.xml create mode 100644 features/securityandprivacy/impl/src/main/res/values-ro/translations.xml create mode 100644 features/securityandprivacy/impl/src/main/res/values-ru/translations.xml create mode 100644 features/securityandprivacy/impl/src/main/res/values-sk/translations.xml create mode 100644 features/securityandprivacy/impl/src/main/res/values-sv/translations.xml create mode 100644 features/securityandprivacy/impl/src/main/res/values-tr/translations.xml create mode 100644 features/securityandprivacy/impl/src/main/res/values-uk/translations.xml create mode 100644 features/securityandprivacy/impl/src/main/res/values-uz/translations.xml create mode 100644 features/securityandprivacy/impl/src/main/res/values-zh-rTW/translations.xml create mode 100644 features/securityandprivacy/impl/src/main/res/values-zh/translations.xml create mode 100644 features/securityandprivacy/impl/src/main/res/values/localazy.xml create mode 100644 features/securityandprivacy/impl/src/test/kotlin/io/element/android/features/securityandprivacy/impl/FakeSecurityAndPrivacyNavigator.kt create mode 100644 features/securityandprivacy/impl/src/test/kotlin/io/element/android/features/securityandprivacy/impl/SecurityAndPrivacyPresenterTest.kt create mode 100644 features/securityandprivacy/impl/src/test/kotlin/io/element/android/features/securityandprivacy/impl/SecurityAndPrivacyViewTest.kt create mode 100644 features/securityandprivacy/impl/src/test/kotlin/io/element/android/features/securityandprivacy/impl/editroomaddress/EditRoomAddressPresenterTest.kt create mode 100644 features/securityandprivacy/impl/src/test/kotlin/io/element/android/features/securityandprivacy/impl/editroomaddress/EditRoomAddressViewTest.kt create mode 100644 features/securityandprivacy/test/build.gradle.kts create mode 100644 features/securityandprivacy/test/src/main/kotlin/io/element/android/features/securityandprivacy/test/FakeSecurityAndPrivacyEntryPoint.kt create mode 100644 features/share/api/build.gradle.kts create mode 100644 features/share/api/src/main/kotlin/io/element/android/features/share/api/ShareEntryPoint.kt create mode 100644 features/share/impl/build.gradle.kts create mode 100644 features/share/impl/src/main/kotlin/io/element/android/features/share/impl/DefaultShareEntryPoint.kt create mode 100644 features/share/impl/src/main/kotlin/io/element/android/features/share/impl/ShareEvents.kt create mode 100644 features/share/impl/src/main/kotlin/io/element/android/features/share/impl/ShareIntentHandler.kt create mode 100644 features/share/impl/src/main/kotlin/io/element/android/features/share/impl/ShareNode.kt create mode 100644 features/share/impl/src/main/kotlin/io/element/android/features/share/impl/SharePresenter.kt create mode 100644 features/share/impl/src/main/kotlin/io/element/android/features/share/impl/ShareState.kt create mode 100644 features/share/impl/src/main/kotlin/io/element/android/features/share/impl/ShareStateProvider.kt create mode 100644 features/share/impl/src/main/kotlin/io/element/android/features/share/impl/ShareView.kt create mode 100644 features/share/impl/src/test/kotlin/io/element/android/features/share/impl/DefaultShareEntryPointTest.kt create mode 100644 features/share/impl/src/test/kotlin/io/element/android/features/share/impl/FakeShareIntentHandler.kt create mode 100644 features/share/impl/src/test/kotlin/io/element/android/features/share/impl/SharePresenterTest.kt create mode 100644 features/signedout/api/build.gradle.kts create mode 100644 features/signedout/api/src/main/kotlin/io/element/android/features/signedout/api/SignedOutEntryPoint.kt create mode 100644 features/signedout/impl/build.gradle.kts create mode 100644 features/signedout/impl/src/main/kotlin/io/element/android/features/signedout/impl/DefaultSignedOutEntryPoint.kt create mode 100644 features/signedout/impl/src/main/kotlin/io/element/android/features/signedout/impl/SignedOutEvents.kt create mode 100644 features/signedout/impl/src/main/kotlin/io/element/android/features/signedout/impl/SignedOutNode.kt create mode 100644 features/signedout/impl/src/main/kotlin/io/element/android/features/signedout/impl/SignedOutPresenter.kt create mode 100644 features/signedout/impl/src/main/kotlin/io/element/android/features/signedout/impl/SignedOutState.kt create mode 100644 features/signedout/impl/src/main/kotlin/io/element/android/features/signedout/impl/SignedOutStateProvider.kt create mode 100644 features/signedout/impl/src/main/kotlin/io/element/android/features/signedout/impl/SignedOutView.kt create mode 100644 features/signedout/impl/src/main/res/values-be/translations.xml create mode 100644 features/signedout/impl/src/main/res/values-bg/translations.xml create mode 100644 features/signedout/impl/src/main/res/values-cs/translations.xml create mode 100644 features/signedout/impl/src/main/res/values-cy/translations.xml create mode 100644 features/signedout/impl/src/main/res/values-da/translations.xml create mode 100644 features/signedout/impl/src/main/res/values-de/translations.xml create mode 100644 features/signedout/impl/src/main/res/values-el/translations.xml create mode 100644 features/signedout/impl/src/main/res/values-es/translations.xml create mode 100644 features/signedout/impl/src/main/res/values-et/translations.xml create mode 100644 features/signedout/impl/src/main/res/values-eu/translations.xml create mode 100644 features/signedout/impl/src/main/res/values-fa/translations.xml create mode 100644 features/signedout/impl/src/main/res/values-fi/translations.xml create mode 100644 features/signedout/impl/src/main/res/values-fr/translations.xml create mode 100644 features/signedout/impl/src/main/res/values-hu/translations.xml create mode 100644 features/signedout/impl/src/main/res/values-in/translations.xml create mode 100644 features/signedout/impl/src/main/res/values-it/translations.xml create mode 100644 features/signedout/impl/src/main/res/values-ka/translations.xml create mode 100644 features/signedout/impl/src/main/res/values-ko/translations.xml create mode 100644 features/signedout/impl/src/main/res/values-lt/translations.xml create mode 100644 features/signedout/impl/src/main/res/values-nb/translations.xml create mode 100644 features/signedout/impl/src/main/res/values-nl/translations.xml create mode 100644 features/signedout/impl/src/main/res/values-pl/translations.xml create mode 100644 features/signedout/impl/src/main/res/values-pt-rBR/translations.xml create mode 100644 features/signedout/impl/src/main/res/values-pt/translations.xml create mode 100644 features/signedout/impl/src/main/res/values-ro/translations.xml create mode 100644 features/signedout/impl/src/main/res/values-ru/translations.xml create mode 100644 features/signedout/impl/src/main/res/values-sk/translations.xml create mode 100644 features/signedout/impl/src/main/res/values-sv/translations.xml create mode 100644 features/signedout/impl/src/main/res/values-tr/translations.xml create mode 100644 features/signedout/impl/src/main/res/values-uk/translations.xml create mode 100644 features/signedout/impl/src/main/res/values-ur/translations.xml create mode 100644 features/signedout/impl/src/main/res/values-uz/translations.xml create mode 100644 features/signedout/impl/src/main/res/values-zh-rTW/translations.xml create mode 100644 features/signedout/impl/src/main/res/values-zh/translations.xml create mode 100644 features/signedout/impl/src/main/res/values/localazy.xml create mode 100644 features/signedout/impl/src/test/kotlin/io/element/android/features/signedout/impl/DefaultSignedOutEntryPointTest.kt create mode 100644 features/signedout/impl/src/test/kotlin/io/element/android/features/signedout/impl/SignedOutPresenterTest.kt create mode 100644 features/space/api/build.gradle.kts create mode 100644 features/space/api/src/main/kotlin/io/element/android/features/space/api/SpaceEntryPoint.kt create mode 100644 features/space/impl/build.gradle.kts create mode 100644 features/space/impl/src/main/kotlin/io/element/android/features/space/impl/DefaultSpaceEntryPoint.kt create mode 100644 features/space/impl/src/main/kotlin/io/element/android/features/space/impl/SpaceFlowNode.kt create mode 100644 features/space/impl/src/main/kotlin/io/element/android/features/space/impl/di/SpaceFlowGraph.kt create mode 100644 features/space/impl/src/main/kotlin/io/element/android/features/space/impl/di/SpaceFlowScope.kt create mode 100644 features/space/impl/src/main/kotlin/io/element/android/features/space/impl/leave/LeaveSpaceEvents.kt create mode 100644 features/space/impl/src/main/kotlin/io/element/android/features/space/impl/leave/LeaveSpaceNode.kt create mode 100644 features/space/impl/src/main/kotlin/io/element/android/features/space/impl/leave/LeaveSpacePresenter.kt create mode 100644 features/space/impl/src/main/kotlin/io/element/android/features/space/impl/leave/LeaveSpaceState.kt create mode 100644 features/space/impl/src/main/kotlin/io/element/android/features/space/impl/leave/LeaveSpaceStateProvider.kt create mode 100644 features/space/impl/src/main/kotlin/io/element/android/features/space/impl/leave/LeaveSpaceView.kt create mode 100644 features/space/impl/src/main/kotlin/io/element/android/features/space/impl/leave/SelectableSpaceRoom.kt create mode 100644 features/space/impl/src/main/kotlin/io/element/android/features/space/impl/root/SpaceEvents.kt create mode 100644 features/space/impl/src/main/kotlin/io/element/android/features/space/impl/root/SpaceNode.kt create mode 100644 features/space/impl/src/main/kotlin/io/element/android/features/space/impl/root/SpacePresenter.kt create mode 100644 features/space/impl/src/main/kotlin/io/element/android/features/space/impl/root/SpaceState.kt create mode 100644 features/space/impl/src/main/kotlin/io/element/android/features/space/impl/root/SpaceStateProvider.kt create mode 100644 features/space/impl/src/main/kotlin/io/element/android/features/space/impl/root/SpaceView.kt create mode 100644 features/space/impl/src/main/kotlin/io/element/android/features/space/impl/settings/SpaceSettingsEvents.kt create mode 100644 features/space/impl/src/main/kotlin/io/element/android/features/space/impl/settings/SpaceSettingsNode.kt create mode 100644 features/space/impl/src/main/kotlin/io/element/android/features/space/impl/settings/SpaceSettingsPresenter.kt create mode 100644 features/space/impl/src/main/kotlin/io/element/android/features/space/impl/settings/SpaceSettingsState.kt create mode 100644 features/space/impl/src/main/kotlin/io/element/android/features/space/impl/settings/SpaceSettingsStateProvider.kt create mode 100644 features/space/impl/src/main/kotlin/io/element/android/features/space/impl/settings/SpaceSettingsView.kt create mode 100644 features/space/impl/src/main/res/values-be/translations.xml create mode 100644 features/space/impl/src/main/res/values-bg/translations.xml create mode 100644 features/space/impl/src/main/res/values-cs/translations.xml create mode 100644 features/space/impl/src/main/res/values-cy/translations.xml create mode 100644 features/space/impl/src/main/res/values-da/translations.xml create mode 100644 features/space/impl/src/main/res/values-de/translations.xml create mode 100644 features/space/impl/src/main/res/values-el/translations.xml create mode 100644 features/space/impl/src/main/res/values-es/translations.xml create mode 100644 features/space/impl/src/main/res/values-et/translations.xml create mode 100644 features/space/impl/src/main/res/values-eu/translations.xml create mode 100644 features/space/impl/src/main/res/values-fa/translations.xml create mode 100644 features/space/impl/src/main/res/values-fi/translations.xml create mode 100644 features/space/impl/src/main/res/values-fr/translations.xml create mode 100644 features/space/impl/src/main/res/values-hu/translations.xml create mode 100644 features/space/impl/src/main/res/values-in/translations.xml create mode 100644 features/space/impl/src/main/res/values-it/translations.xml create mode 100644 features/space/impl/src/main/res/values-ka/translations.xml create mode 100644 features/space/impl/src/main/res/values-ko/translations.xml create mode 100644 features/space/impl/src/main/res/values-nb/translations.xml create mode 100644 features/space/impl/src/main/res/values-nl/translations.xml create mode 100644 features/space/impl/src/main/res/values-pl/translations.xml create mode 100644 features/space/impl/src/main/res/values-pt-rBR/translations.xml create mode 100644 features/space/impl/src/main/res/values-pt/translations.xml create mode 100644 features/space/impl/src/main/res/values-ro/translations.xml create mode 100644 features/space/impl/src/main/res/values-ru/translations.xml create mode 100644 features/space/impl/src/main/res/values-sk/translations.xml create mode 100644 features/space/impl/src/main/res/values-sv/translations.xml create mode 100644 features/space/impl/src/main/res/values-tr/translations.xml create mode 100644 features/space/impl/src/main/res/values-uk/translations.xml create mode 100644 features/space/impl/src/main/res/values-ur/translations.xml create mode 100644 features/space/impl/src/main/res/values-uz/translations.xml create mode 100644 features/space/impl/src/main/res/values-zh-rTW/translations.xml create mode 100644 features/space/impl/src/main/res/values-zh/translations.xml create mode 100644 features/space/impl/src/main/res/values/localazy.xml create mode 100644 features/space/impl/src/test/kotlin/io/element/android/features/space/impl/DefaultSpaceEntryPointTest.kt create mode 100644 features/space/impl/src/test/kotlin/io/element/android/features/space/impl/di/FakeSpaceFlowGraph.kt create mode 100644 features/space/impl/src/test/kotlin/io/element/android/features/space/impl/leave/LeaveSpacePresenterTest.kt create mode 100644 features/space/impl/src/test/kotlin/io/element/android/features/space/impl/leave/LeaveSpaceStateTest.kt create mode 100644 features/space/impl/src/test/kotlin/io/element/android/features/space/impl/root/SpacePresenterTest.kt create mode 100644 features/space/impl/src/test/kotlin/io/element/android/features/space/impl/root/SpaceStateTest.kt create mode 100644 features/space/impl/src/test/kotlin/io/element/android/features/space/impl/root/SpaceViewTest.kt create mode 100644 features/startchat/api/build.gradle.kts create mode 100644 features/startchat/api/src/main/kotlin/io/element/android/features/startchat/api/ConfirmingStartDmWithMatrixUser.kt create mode 100644 features/startchat/api/src/main/kotlin/io/element/android/features/startchat/api/StartChatEntryPoint.kt create mode 100644 features/startchat/api/src/main/kotlin/io/element/android/features/startchat/api/StartDMAction.kt create mode 100644 features/startchat/impl/build.gradle.kts create mode 100644 features/startchat/impl/src/main/kotlin/io/element/android/features/startchat/StartChatNavigator.kt create mode 100644 features/startchat/impl/src/main/kotlin/io/element/android/features/startchat/impl/DefaultStartChatEntryPoint.kt create mode 100644 features/startchat/impl/src/main/kotlin/io/element/android/features/startchat/impl/DefaultStartDMAction.kt create mode 100644 features/startchat/impl/src/main/kotlin/io/element/android/features/startchat/impl/StartChatFlowNode.kt create mode 100644 features/startchat/impl/src/main/kotlin/io/element/android/features/startchat/impl/components/SearchMultipleUsersResultItem.kt create mode 100644 features/startchat/impl/src/main/kotlin/io/element/android/features/startchat/impl/components/SearchSingleUserResultItem.kt create mode 100644 features/startchat/impl/src/main/kotlin/io/element/android/features/startchat/impl/components/SearchUserBar.kt create mode 100644 features/startchat/impl/src/main/kotlin/io/element/android/features/startchat/impl/components/UserListView.kt create mode 100644 features/startchat/impl/src/main/kotlin/io/element/android/features/startchat/impl/joinbyaddress/JoinRoomByAddressEvents.kt create mode 100644 features/startchat/impl/src/main/kotlin/io/element/android/features/startchat/impl/joinbyaddress/JoinRoomByAddressNode.kt create mode 100644 features/startchat/impl/src/main/kotlin/io/element/android/features/startchat/impl/joinbyaddress/JoinRoomByAddressPresenter.kt create mode 100644 features/startchat/impl/src/main/kotlin/io/element/android/features/startchat/impl/joinbyaddress/JoinRoomByAddressState.kt create mode 100644 features/startchat/impl/src/main/kotlin/io/element/android/features/startchat/impl/joinbyaddress/JoinRoomByAddressStateProvider.kt create mode 100644 features/startchat/impl/src/main/kotlin/io/element/android/features/startchat/impl/joinbyaddress/JoinRoomByAddressView.kt create mode 100644 features/startchat/impl/src/main/kotlin/io/element/android/features/startchat/impl/root/StartChatEvents.kt create mode 100644 features/startchat/impl/src/main/kotlin/io/element/android/features/startchat/impl/root/StartChatNode.kt create mode 100644 features/startchat/impl/src/main/kotlin/io/element/android/features/startchat/impl/root/StartChatPresenter.kt create mode 100644 features/startchat/impl/src/main/kotlin/io/element/android/features/startchat/impl/root/StartChatState.kt create mode 100644 features/startchat/impl/src/main/kotlin/io/element/android/features/startchat/impl/root/StartChatStateProvider.kt create mode 100644 features/startchat/impl/src/main/kotlin/io/element/android/features/startchat/impl/root/StartChatView.kt create mode 100644 features/startchat/impl/src/main/kotlin/io/element/android/features/startchat/impl/userlist/DefaultUserListPresenter.kt create mode 100644 features/startchat/impl/src/main/kotlin/io/element/android/features/startchat/impl/userlist/UserListDataStore.kt create mode 100644 features/startchat/impl/src/main/kotlin/io/element/android/features/startchat/impl/userlist/UserListEvents.kt create mode 100644 features/startchat/impl/src/main/kotlin/io/element/android/features/startchat/impl/userlist/UserListPresenter.kt create mode 100644 features/startchat/impl/src/main/kotlin/io/element/android/features/startchat/impl/userlist/UserListPresenterArgs.kt create mode 100644 features/startchat/impl/src/main/kotlin/io/element/android/features/startchat/impl/userlist/UserListState.kt create mode 100644 features/startchat/impl/src/main/kotlin/io/element/android/features/startchat/impl/userlist/UserListStateProvider.kt create mode 100644 features/startchat/impl/src/main/res/values-be/translations.xml create mode 100644 features/startchat/impl/src/main/res/values-bg/translations.xml create mode 100644 features/startchat/impl/src/main/res/values-cs/translations.xml create mode 100644 features/startchat/impl/src/main/res/values-cy/translations.xml create mode 100644 features/startchat/impl/src/main/res/values-da/translations.xml create mode 100644 features/startchat/impl/src/main/res/values-de/translations.xml create mode 100644 features/startchat/impl/src/main/res/values-el/translations.xml create mode 100644 features/startchat/impl/src/main/res/values-es/translations.xml create mode 100644 features/startchat/impl/src/main/res/values-et/translations.xml create mode 100644 features/startchat/impl/src/main/res/values-eu/translations.xml create mode 100644 features/startchat/impl/src/main/res/values-fa/translations.xml create mode 100644 features/startchat/impl/src/main/res/values-fi/translations.xml create mode 100644 features/startchat/impl/src/main/res/values-fr/translations.xml create mode 100644 features/startchat/impl/src/main/res/values-hu/translations.xml create mode 100644 features/startchat/impl/src/main/res/values-in/translations.xml create mode 100644 features/startchat/impl/src/main/res/values-it/translations.xml create mode 100644 features/startchat/impl/src/main/res/values-ka/translations.xml create mode 100644 features/startchat/impl/src/main/res/values-ko/translations.xml create mode 100644 features/startchat/impl/src/main/res/values-lt/translations.xml create mode 100644 features/startchat/impl/src/main/res/values-nb/translations.xml create mode 100644 features/startchat/impl/src/main/res/values-nl/translations.xml create mode 100644 features/startchat/impl/src/main/res/values-pl/translations.xml create mode 100644 features/startchat/impl/src/main/res/values-pt-rBR/translations.xml create mode 100644 features/startchat/impl/src/main/res/values-pt/translations.xml create mode 100644 features/startchat/impl/src/main/res/values-ro/translations.xml create mode 100644 features/startchat/impl/src/main/res/values-ru/translations.xml create mode 100644 features/startchat/impl/src/main/res/values-sk/translations.xml create mode 100644 features/startchat/impl/src/main/res/values-sv/translations.xml create mode 100644 features/startchat/impl/src/main/res/values-tr/translations.xml create mode 100644 features/startchat/impl/src/main/res/values-uk/translations.xml create mode 100644 features/startchat/impl/src/main/res/values-ur/translations.xml create mode 100644 features/startchat/impl/src/main/res/values-uz/translations.xml create mode 100644 features/startchat/impl/src/main/res/values-zh-rTW/translations.xml create mode 100644 features/startchat/impl/src/main/res/values-zh/translations.xml create mode 100644 features/startchat/impl/src/main/res/values/localazy.xml create mode 100644 features/startchat/impl/src/test/kotlin/io/element/android/features/startchat/impl/DefaultStartChatEntryPointTest.kt create mode 100644 features/startchat/impl/src/test/kotlin/io/element/android/features/startchat/impl/DefaultStartDMActionTest.kt create mode 100644 features/startchat/impl/src/test/kotlin/io/element/android/features/startchat/impl/FakeStartChatNavigator.kt create mode 100644 features/startchat/impl/src/test/kotlin/io/element/android/features/startchat/impl/joinbyaddress/JoinBaseRoomByAddressPresenterTest.kt create mode 100644 features/startchat/impl/src/test/kotlin/io/element/android/features/startchat/impl/joinbyaddress/JoinBaseRoomByAddressViewTest.kt create mode 100644 features/startchat/impl/src/test/kotlin/io/element/android/features/startchat/impl/root/StartChatPresenterTest.kt create mode 100644 features/startchat/impl/src/test/kotlin/io/element/android/features/startchat/impl/root/StartChatViewTest.kt create mode 100644 features/startchat/impl/src/test/kotlin/io/element/android/features/startchat/impl/userlist/DefaultUserListPresenterTest.kt create mode 100644 features/startchat/impl/src/test/kotlin/io/element/android/features/startchat/impl/userlist/FakeUserListPresenter.kt create mode 100644 features/startchat/impl/src/test/kotlin/io/element/android/features/startchat/impl/userlist/FakeUserListPresenterFactory.kt create mode 100644 features/startchat/test/build.gradle.kts create mode 100644 features/startchat/test/src/main/kotlin/io/element/android/features/invitepeople/test/FakeStartDMAction.kt create mode 100644 features/userprofile/api/build.gradle.kts create mode 100644 features/userprofile/api/src/main/kotlin/io/element/android/features/userprofile/api/UserProfileEntryPoint.kt create mode 100644 features/userprofile/api/src/main/kotlin/io/element/android/features/userprofile/api/UserProfileEvents.kt create mode 100644 features/userprofile/api/src/main/kotlin/io/element/android/features/userprofile/api/UserProfilePresenterFactory.kt create mode 100644 features/userprofile/api/src/main/kotlin/io/element/android/features/userprofile/api/UserProfileState.kt create mode 100644 features/userprofile/impl/build.gradle.kts create mode 100644 features/userprofile/impl/src/main/kotlin/io/element/android/features/userprofile/impl/DefaultUserProfileEntryPoint.kt create mode 100644 features/userprofile/impl/src/main/kotlin/io/element/android/features/userprofile/impl/DefaultUserProfilePresenterFactory.kt create mode 100644 features/userprofile/impl/src/main/kotlin/io/element/android/features/userprofile/impl/UserProfileFlowNode.kt create mode 100644 features/userprofile/impl/src/main/kotlin/io/element/android/features/userprofile/impl/root/UserProfileNode.kt create mode 100644 features/userprofile/impl/src/main/kotlin/io/element/android/features/userprofile/impl/root/UserProfilePresenter.kt create mode 100644 features/userprofile/impl/src/test/kotlin/io/element/android/features/userprofile/impl/DefaultUserProfileEntryPointTest.kt create mode 100644 features/userprofile/impl/src/test/kotlin/io/element/android/features/userprofile/impl/UserProfilePresenterTest.kt create mode 100644 features/userprofile/shared/build.gradle.kts create mode 100644 features/userprofile/shared/src/main/kotlin/io/element/android/features/userprofile/shared/UserProfileHeaderSection.kt create mode 100644 features/userprofile/shared/src/main/kotlin/io/element/android/features/userprofile/shared/UserProfileMainActionsSection.kt create mode 100644 features/userprofile/shared/src/main/kotlin/io/element/android/features/userprofile/shared/UserProfileNodeHelper.kt create mode 100644 features/userprofile/shared/src/main/kotlin/io/element/android/features/userprofile/shared/UserProfileStateProvider.kt create mode 100644 features/userprofile/shared/src/main/kotlin/io/element/android/features/userprofile/shared/UserProfileView.kt create mode 100644 features/userprofile/shared/src/main/kotlin/io/element/android/features/userprofile/shared/blockuser/BlockUserDialogs.kt create mode 100644 features/userprofile/shared/src/main/kotlin/io/element/android/features/userprofile/shared/blockuser/BlockUserSection.kt create mode 100644 features/userprofile/shared/src/main/res/values-be/translations.xml create mode 100644 features/userprofile/shared/src/main/res/values-bg/translations.xml create mode 100644 features/userprofile/shared/src/main/res/values-cs/translations.xml create mode 100644 features/userprofile/shared/src/main/res/values-cy/translations.xml create mode 100644 features/userprofile/shared/src/main/res/values-da/translations.xml create mode 100644 features/userprofile/shared/src/main/res/values-de/translations.xml create mode 100644 features/userprofile/shared/src/main/res/values-el/translations.xml create mode 100644 features/userprofile/shared/src/main/res/values-es/translations.xml create mode 100644 features/userprofile/shared/src/main/res/values-et/translations.xml create mode 100644 features/userprofile/shared/src/main/res/values-eu/translations.xml create mode 100644 features/userprofile/shared/src/main/res/values-fa/translations.xml create mode 100644 features/userprofile/shared/src/main/res/values-fi/translations.xml create mode 100644 features/userprofile/shared/src/main/res/values-fr/translations.xml create mode 100644 features/userprofile/shared/src/main/res/values-hu/translations.xml create mode 100644 features/userprofile/shared/src/main/res/values-in/translations.xml create mode 100644 features/userprofile/shared/src/main/res/values-it/translations.xml create mode 100644 features/userprofile/shared/src/main/res/values-ka/translations.xml create mode 100644 features/userprofile/shared/src/main/res/values-ko/translations.xml create mode 100644 features/userprofile/shared/src/main/res/values-lt/translations.xml create mode 100644 features/userprofile/shared/src/main/res/values-nb/translations.xml create mode 100644 features/userprofile/shared/src/main/res/values-nl/translations.xml create mode 100644 features/userprofile/shared/src/main/res/values-pl/translations.xml create mode 100644 features/userprofile/shared/src/main/res/values-pt-rBR/translations.xml create mode 100644 features/userprofile/shared/src/main/res/values-pt/translations.xml create mode 100644 features/userprofile/shared/src/main/res/values-ro/translations.xml create mode 100644 features/userprofile/shared/src/main/res/values-ru/translations.xml create mode 100644 features/userprofile/shared/src/main/res/values-sk/translations.xml create mode 100644 features/userprofile/shared/src/main/res/values-sv/translations.xml create mode 100644 features/userprofile/shared/src/main/res/values-tr/translations.xml create mode 100644 features/userprofile/shared/src/main/res/values-uk/translations.xml create mode 100644 features/userprofile/shared/src/main/res/values-ur/translations.xml create mode 100644 features/userprofile/shared/src/main/res/values-uz/translations.xml create mode 100644 features/userprofile/shared/src/main/res/values-zh-rTW/translations.xml create mode 100644 features/userprofile/shared/src/main/res/values-zh/translations.xml create mode 100644 features/userprofile/shared/src/main/res/values/localazy.xml create mode 100644 features/userprofile/shared/src/test/kotlin/io/element/android/features/userprofile/UserProfileViewTest.kt create mode 100644 features/userprofile/shared/src/test/kotlin/io/element/android/features/userprofile/shared/blockuser/BlockUserDialogsTest.kt create mode 100644 features/verifysession/api/build.gradle.kts create mode 100644 features/verifysession/api/src/main/kotlin/io/element/android/features/verifysession/api/IncomingVerificationEntryPoint.kt create mode 100644 features/verifysession/api/src/main/kotlin/io/element/android/features/verifysession/api/OutgoingVerificationEntryPoint.kt create mode 100644 features/verifysession/impl/.gitignore create mode 100644 features/verifysession/impl/build.gradle.kts create mode 100644 features/verifysession/impl/consumer-rules.pro create mode 100644 features/verifysession/impl/src/main/kotlin/io/element/android/features/verifysession/impl/emoji/EmojiResource.kt create mode 100644 features/verifysession/impl/src/main/kotlin/io/element/android/features/verifysession/impl/emoji/SasEmojisPreview.kt create mode 100644 features/verifysession/impl/src/main/kotlin/io/element/android/features/verifysession/impl/incoming/DefaultIncomingVerificationEntryPoint.kt create mode 100644 features/verifysession/impl/src/main/kotlin/io/element/android/features/verifysession/impl/incoming/IncomingVerificationNavigator.kt create mode 100644 features/verifysession/impl/src/main/kotlin/io/element/android/features/verifysession/impl/incoming/IncomingVerificationNode.kt create mode 100644 features/verifysession/impl/src/main/kotlin/io/element/android/features/verifysession/impl/incoming/IncomingVerificationPresenter.kt create mode 100644 features/verifysession/impl/src/main/kotlin/io/element/android/features/verifysession/impl/incoming/IncomingVerificationState.kt create mode 100644 features/verifysession/impl/src/main/kotlin/io/element/android/features/verifysession/impl/incoming/IncomingVerificationStateMachine.kt create mode 100644 features/verifysession/impl/src/main/kotlin/io/element/android/features/verifysession/impl/incoming/IncomingVerificationStateProvider.kt create mode 100644 features/verifysession/impl/src/main/kotlin/io/element/android/features/verifysession/impl/incoming/IncomingVerificationView.kt create mode 100644 features/verifysession/impl/src/main/kotlin/io/element/android/features/verifysession/impl/incoming/IncomingVerificationViewEvents.kt create mode 100644 features/verifysession/impl/src/main/kotlin/io/element/android/features/verifysession/impl/incoming/ui/SessionDetailsView.kt create mode 100644 features/verifysession/impl/src/main/kotlin/io/element/android/features/verifysession/impl/outgoing/DefaultOutgoingVerificationEntryPoint.kt create mode 100644 features/verifysession/impl/src/main/kotlin/io/element/android/features/verifysession/impl/outgoing/OutgoingVerificationNode.kt create mode 100644 features/verifysession/impl/src/main/kotlin/io/element/android/features/verifysession/impl/outgoing/OutgoingVerificationPresenter.kt create mode 100644 features/verifysession/impl/src/main/kotlin/io/element/android/features/verifysession/impl/outgoing/OutgoingVerificationState.kt create mode 100644 features/verifysession/impl/src/main/kotlin/io/element/android/features/verifysession/impl/outgoing/OutgoingVerificationStateMachine.kt create mode 100644 features/verifysession/impl/src/main/kotlin/io/element/android/features/verifysession/impl/outgoing/OutgoingVerificationStateProvider.kt create mode 100644 features/verifysession/impl/src/main/kotlin/io/element/android/features/verifysession/impl/outgoing/OutgoingVerificationView.kt create mode 100644 features/verifysession/impl/src/main/kotlin/io/element/android/features/verifysession/impl/outgoing/OutgoingVerificationViewEvents.kt create mode 100644 features/verifysession/impl/src/main/kotlin/io/element/android/features/verifysession/impl/ui/Common.kt create mode 100644 features/verifysession/impl/src/main/kotlin/io/element/android/features/verifysession/impl/ui/VerificationBottomMenu.kt create mode 100644 features/verifysession/impl/src/main/kotlin/io/element/android/features/verifysession/impl/ui/VerificationContentVerifying.kt create mode 100644 features/verifysession/impl/src/main/kotlin/io/element/android/features/verifysession/impl/ui/VerificationUserProfileContent.kt create mode 100644 features/verifysession/impl/src/main/kotlin/io/element/android/features/verifysession/impl/util/StateMachineUtil.kt create mode 100644 features/verifysession/impl/src/main/res/drawable/ic_verification_00.xml create mode 100644 features/verifysession/impl/src/main/res/drawable/ic_verification_01.xml create mode 100644 features/verifysession/impl/src/main/res/drawable/ic_verification_02.xml create mode 100644 features/verifysession/impl/src/main/res/drawable/ic_verification_03.xml create mode 100644 features/verifysession/impl/src/main/res/drawable/ic_verification_04.xml create mode 100644 features/verifysession/impl/src/main/res/drawable/ic_verification_05.xml create mode 100644 features/verifysession/impl/src/main/res/drawable/ic_verification_06.xml create mode 100644 features/verifysession/impl/src/main/res/drawable/ic_verification_07.xml create mode 100644 features/verifysession/impl/src/main/res/drawable/ic_verification_08.xml create mode 100644 features/verifysession/impl/src/main/res/drawable/ic_verification_09.xml create mode 100644 features/verifysession/impl/src/main/res/drawable/ic_verification_10.xml create mode 100644 features/verifysession/impl/src/main/res/drawable/ic_verification_11.xml create mode 100644 features/verifysession/impl/src/main/res/drawable/ic_verification_12.xml create mode 100644 features/verifysession/impl/src/main/res/drawable/ic_verification_13.xml create mode 100644 features/verifysession/impl/src/main/res/drawable/ic_verification_14.xml create mode 100644 features/verifysession/impl/src/main/res/drawable/ic_verification_15.xml create mode 100644 features/verifysession/impl/src/main/res/drawable/ic_verification_16.xml create mode 100644 features/verifysession/impl/src/main/res/drawable/ic_verification_17.xml create mode 100644 features/verifysession/impl/src/main/res/drawable/ic_verification_18.xml create mode 100644 features/verifysession/impl/src/main/res/drawable/ic_verification_19.xml create mode 100644 features/verifysession/impl/src/main/res/drawable/ic_verification_20.xml create mode 100644 features/verifysession/impl/src/main/res/drawable/ic_verification_21.xml create mode 100644 features/verifysession/impl/src/main/res/drawable/ic_verification_22.xml create mode 100644 features/verifysession/impl/src/main/res/drawable/ic_verification_23.xml create mode 100644 features/verifysession/impl/src/main/res/drawable/ic_verification_24.xml create mode 100644 features/verifysession/impl/src/main/res/drawable/ic_verification_25.xml create mode 100644 features/verifysession/impl/src/main/res/drawable/ic_verification_26.xml create mode 100644 features/verifysession/impl/src/main/res/drawable/ic_verification_27.xml create mode 100644 features/verifysession/impl/src/main/res/drawable/ic_verification_28.xml create mode 100644 features/verifysession/impl/src/main/res/drawable/ic_verification_29.xml create mode 100644 features/verifysession/impl/src/main/res/drawable/ic_verification_30.xml create mode 100644 features/verifysession/impl/src/main/res/drawable/ic_verification_31.xml create mode 100644 features/verifysession/impl/src/main/res/drawable/ic_verification_32.xml create mode 100644 features/verifysession/impl/src/main/res/drawable/ic_verification_33.xml create mode 100644 features/verifysession/impl/src/main/res/drawable/ic_verification_34.xml create mode 100644 features/verifysession/impl/src/main/res/drawable/ic_verification_35.xml create mode 100644 features/verifysession/impl/src/main/res/drawable/ic_verification_36.xml create mode 100644 features/verifysession/impl/src/main/res/drawable/ic_verification_37.xml create mode 100644 features/verifysession/impl/src/main/res/drawable/ic_verification_38.xml create mode 100644 features/verifysession/impl/src/main/res/drawable/ic_verification_39.xml create mode 100644 features/verifysession/impl/src/main/res/drawable/ic_verification_40.xml create mode 100644 features/verifysession/impl/src/main/res/drawable/ic_verification_41.xml create mode 100644 features/verifysession/impl/src/main/res/drawable/ic_verification_42.xml create mode 100644 features/verifysession/impl/src/main/res/drawable/ic_verification_43.xml create mode 100644 features/verifysession/impl/src/main/res/drawable/ic_verification_44.xml create mode 100644 features/verifysession/impl/src/main/res/drawable/ic_verification_45.xml create mode 100644 features/verifysession/impl/src/main/res/drawable/ic_verification_46.xml create mode 100644 features/verifysession/impl/src/main/res/drawable/ic_verification_47.xml create mode 100644 features/verifysession/impl/src/main/res/drawable/ic_verification_48.xml create mode 100644 features/verifysession/impl/src/main/res/drawable/ic_verification_49.xml create mode 100644 features/verifysession/impl/src/main/res/drawable/ic_verification_50.xml create mode 100644 features/verifysession/impl/src/main/res/drawable/ic_verification_51.xml create mode 100644 features/verifysession/impl/src/main/res/drawable/ic_verification_52.xml create mode 100644 features/verifysession/impl/src/main/res/drawable/ic_verification_53.xml create mode 100644 features/verifysession/impl/src/main/res/drawable/ic_verification_54.xml create mode 100644 features/verifysession/impl/src/main/res/drawable/ic_verification_55.xml create mode 100644 features/verifysession/impl/src/main/res/drawable/ic_verification_56.xml create mode 100644 features/verifysession/impl/src/main/res/drawable/ic_verification_57.xml create mode 100644 features/verifysession/impl/src/main/res/drawable/ic_verification_58.xml create mode 100644 features/verifysession/impl/src/main/res/drawable/ic_verification_59.xml create mode 100644 features/verifysession/impl/src/main/res/drawable/ic_verification_60.xml create mode 100644 features/verifysession/impl/src/main/res/drawable/ic_verification_61.xml create mode 100644 features/verifysession/impl/src/main/res/drawable/ic_verification_62.xml create mode 100644 features/verifysession/impl/src/main/res/drawable/ic_verification_63.xml create mode 100644 features/verifysession/impl/src/main/res/values-ar/strings_sas.xml create mode 100644 features/verifysession/impl/src/main/res/values-be/translations.xml create mode 100644 features/verifysession/impl/src/main/res/values-bg/strings_sas.xml create mode 100644 features/verifysession/impl/src/main/res/values-bg/translations.xml create mode 100644 features/verifysession/impl/src/main/res/values-ca/strings_sas.xml create mode 100644 features/verifysession/impl/src/main/res/values-cs/strings_sas.xml create mode 100644 features/verifysession/impl/src/main/res/values-cs/translations.xml create mode 100644 features/verifysession/impl/src/main/res/values-cy/translations.xml create mode 100644 features/verifysession/impl/src/main/res/values-da/translations.xml create mode 100644 features/verifysession/impl/src/main/res/values-de/strings_sas.xml create mode 100644 features/verifysession/impl/src/main/res/values-de/translations.xml create mode 100644 features/verifysession/impl/src/main/res/values-el/translations.xml create mode 100644 features/verifysession/impl/src/main/res/values-eo/strings_sas.xml create mode 100644 features/verifysession/impl/src/main/res/values-es/strings_sas.xml create mode 100644 features/verifysession/impl/src/main/res/values-es/translations.xml create mode 100644 features/verifysession/impl/src/main/res/values-et/strings_sas.xml create mode 100644 features/verifysession/impl/src/main/res/values-et/translations.xml create mode 100644 features/verifysession/impl/src/main/res/values-eu/translations.xml create mode 100644 features/verifysession/impl/src/main/res/values-fa/strings_sas.xml create mode 100644 features/verifysession/impl/src/main/res/values-fa/translations.xml create mode 100644 features/verifysession/impl/src/main/res/values-fi/strings_sas.xml create mode 100644 features/verifysession/impl/src/main/res/values-fi/translations.xml create mode 100644 features/verifysession/impl/src/main/res/values-fr/strings_sas.xml create mode 100644 features/verifysession/impl/src/main/res/values-fr/translations.xml create mode 100644 features/verifysession/impl/src/main/res/values-hr/strings_sas.xml create mode 100644 features/verifysession/impl/src/main/res/values-hu/strings_sas.xml create mode 100644 features/verifysession/impl/src/main/res/values-hu/translations.xml create mode 100644 features/verifysession/impl/src/main/res/values-in/strings_sas.xml create mode 100644 features/verifysession/impl/src/main/res/values-in/translations.xml create mode 100644 features/verifysession/impl/src/main/res/values-it/strings_sas.xml create mode 100644 features/verifysession/impl/src/main/res/values-it/translations.xml create mode 100644 features/verifysession/impl/src/main/res/values-ja/strings_sas.xml create mode 100644 features/verifysession/impl/src/main/res/values-ka/translations.xml create mode 100644 features/verifysession/impl/src/main/res/values-ko/translations.xml create mode 100644 features/verifysession/impl/src/main/res/values-lt/translations.xml create mode 100644 features/verifysession/impl/src/main/res/values-nb-rNO/strings_sas.xml create mode 100644 features/verifysession/impl/src/main/res/values-nb/translations.xml create mode 100644 features/verifysession/impl/src/main/res/values-nl/strings_sas.xml create mode 100644 features/verifysession/impl/src/main/res/values-nl/translations.xml create mode 100644 features/verifysession/impl/src/main/res/values-pl/translations.xml create mode 100644 features/verifysession/impl/src/main/res/values-pt-rBR/strings_sas.xml create mode 100644 features/verifysession/impl/src/main/res/values-pt-rBR/translations.xml create mode 100644 features/verifysession/impl/src/main/res/values-pt/strings_sas.xml create mode 100644 features/verifysession/impl/src/main/res/values-pt/translations.xml create mode 100644 features/verifysession/impl/src/main/res/values-ro/translations.xml create mode 100644 features/verifysession/impl/src/main/res/values-ru/strings_sas.xml create mode 100644 features/verifysession/impl/src/main/res/values-ru/translations.xml create mode 100644 features/verifysession/impl/src/main/res/values-si/strings_sas.xml create mode 100644 features/verifysession/impl/src/main/res/values-sk/strings_sas.xml create mode 100644 features/verifysession/impl/src/main/res/values-sk/translations.xml create mode 100644 features/verifysession/impl/src/main/res/values-sq/strings_sas.xml create mode 100644 features/verifysession/impl/src/main/res/values-sr/strings_sas.xml create mode 100644 features/verifysession/impl/src/main/res/values-sv/strings_sas.xml create mode 100644 features/verifysession/impl/src/main/res/values-sv/translations.xml create mode 100644 features/verifysession/impl/src/main/res/values-szl/strings_sas.xml create mode 100644 features/verifysession/impl/src/main/res/values-tr/translations.xml create mode 100644 features/verifysession/impl/src/main/res/values-tzm/strings_sas.xml create mode 100644 features/verifysession/impl/src/main/res/values-uk/strings_sas.xml create mode 100644 features/verifysession/impl/src/main/res/values-uk/translations.xml create mode 100644 features/verifysession/impl/src/main/res/values-ur/translations.xml create mode 100644 features/verifysession/impl/src/main/res/values-uz/translations.xml create mode 100644 features/verifysession/impl/src/main/res/values-vi/strings_sas.xml create mode 100644 features/verifysession/impl/src/main/res/values-zh-rCN/strings_sas.xml create mode 100644 features/verifysession/impl/src/main/res/values-zh-rTW/strings_sas.xml create mode 100644 features/verifysession/impl/src/main/res/values-zh-rTW/translations.xml create mode 100644 features/verifysession/impl/src/main/res/values-zh/translations.xml create mode 100644 features/verifysession/impl/src/main/res/values/localazy.xml create mode 100644 features/verifysession/impl/src/main/res/values/strings_sas.xml create mode 100644 features/verifysession/impl/src/test/kotlin/io/element/android/features/verifysession/impl/incoming/DefaultIncomingVerificationEntryPointTest.kt create mode 100644 features/verifysession/impl/src/test/kotlin/io/element/android/features/verifysession/impl/incoming/IncomingVerificationPresenterTest.kt create mode 100644 features/verifysession/impl/src/test/kotlin/io/element/android/features/verifysession/impl/incoming/IncomingVerificationViewTest.kt create mode 100644 features/verifysession/impl/src/test/kotlin/io/element/android/features/verifysession/impl/outgoing/DefaultOutgoingVerificationEntryPointTest.kt create mode 100644 features/verifysession/impl/src/test/kotlin/io/element/android/features/verifysession/impl/outgoing/OutgoingVerificationPresenterTest.kt create mode 100644 features/verifysession/impl/src/test/kotlin/io/element/android/features/verifysession/impl/outgoing/OutgoingVerificationViewTest.kt create mode 100644 features/verifysession/test/build.gradle.kts create mode 100644 features/verifysession/test/src/main/kotlin/io/element/android/features/verifysession/test/FakeIncomingVerificationEntryPoint.kt create mode 100644 features/verifysession/test/src/main/kotlin/io/element/android/features/verifysession/test/FakeOutgoingVerificationEntryPoint.kt create mode 100644 features/viewfolder/api/build.gradle.kts create mode 100644 features/viewfolder/api/src/main/kotlin/io/element/android/features/viewfolder/api/TextFileViewer.kt create mode 100644 features/viewfolder/api/src/main/kotlin/io/element/android/features/viewfolder/api/ViewFolderEntryPoint.kt create mode 100644 features/viewfolder/impl/build.gradle.kts create mode 100644 features/viewfolder/impl/src/main/kotlin/io/element/android/features/viewfolder/impl/DefaultTextFileViewer.kt create mode 100644 features/viewfolder/impl/src/main/kotlin/io/element/android/features/viewfolder/impl/DefaultViewFolderEntryPoint.kt create mode 100644 features/viewfolder/impl/src/main/kotlin/io/element/android/features/viewfolder/impl/file/FileContent.kt create mode 100644 features/viewfolder/impl/src/main/kotlin/io/element/android/features/viewfolder/impl/file/FileContentReader.kt create mode 100644 features/viewfolder/impl/src/main/kotlin/io/element/android/features/viewfolder/impl/file/FileSave.kt create mode 100644 features/viewfolder/impl/src/main/kotlin/io/element/android/features/viewfolder/impl/file/FileShare.kt create mode 100644 features/viewfolder/impl/src/main/kotlin/io/element/android/features/viewfolder/impl/file/ViewFileEvents.kt create mode 100644 features/viewfolder/impl/src/main/kotlin/io/element/android/features/viewfolder/impl/file/ViewFileNode.kt create mode 100644 features/viewfolder/impl/src/main/kotlin/io/element/android/features/viewfolder/impl/file/ViewFilePresenter.kt create mode 100644 features/viewfolder/impl/src/main/kotlin/io/element/android/features/viewfolder/impl/file/ViewFileState.kt create mode 100644 features/viewfolder/impl/src/main/kotlin/io/element/android/features/viewfolder/impl/file/ViewFileStateProvider.kt create mode 100644 features/viewfolder/impl/src/main/kotlin/io/element/android/features/viewfolder/impl/file/ViewFileView.kt create mode 100644 features/viewfolder/impl/src/main/kotlin/io/element/android/features/viewfolder/impl/folder/FolderExplorer.kt create mode 100644 features/viewfolder/impl/src/main/kotlin/io/element/android/features/viewfolder/impl/folder/ViewFolderNode.kt create mode 100644 features/viewfolder/impl/src/main/kotlin/io/element/android/features/viewfolder/impl/folder/ViewFolderPresenter.kt create mode 100644 features/viewfolder/impl/src/main/kotlin/io/element/android/features/viewfolder/impl/folder/ViewFolderState.kt create mode 100644 features/viewfolder/impl/src/main/kotlin/io/element/android/features/viewfolder/impl/folder/ViewFolderStateProvider.kt create mode 100644 features/viewfolder/impl/src/main/kotlin/io/element/android/features/viewfolder/impl/folder/ViewFolderView.kt create mode 100644 features/viewfolder/impl/src/main/kotlin/io/element/android/features/viewfolder/impl/model/Item.kt create mode 100644 features/viewfolder/impl/src/main/kotlin/io/element/android/features/viewfolder/impl/root/ViewFolderFlowNode.kt create mode 100644 features/viewfolder/impl/src/test/kotlin/io/element/android/features/viewfolder/impl/DefaultViewFolderEntryPointTest.kt create mode 100644 features/viewfolder/impl/src/test/kotlin/io/element/android/features/viewfolder/test/file/FakeFileContentReader.kt create mode 100644 features/viewfolder/impl/src/test/kotlin/io/element/android/features/viewfolder/test/file/FakeFileSave.kt create mode 100644 features/viewfolder/impl/src/test/kotlin/io/element/android/features/viewfolder/test/file/FakeFileShare.kt create mode 100644 features/viewfolder/impl/src/test/kotlin/io/element/android/features/viewfolder/test/file/ViewFilePresenterTest.kt create mode 100644 features/viewfolder/impl/src/test/kotlin/io/element/android/features/viewfolder/test/folder/FakeFolderExplorer.kt create mode 100644 features/viewfolder/impl/src/test/kotlin/io/element/android/features/viewfolder/test/folder/ViewFolderPresenterTest.kt create mode 100644 features/viewfolder/test/build.gradle.kts create mode 100644 features/viewfolder/test/src/main/kotlin/io/element/android/features/viewfolder/test/FakeViewFolderEntryPoint.kt create mode 100644 gradle.properties create mode 100644 gradle/libs.versions.toml create mode 100644 gradle/wrapper/gradle-wrapper.jar create mode 100644 gradle/wrapper/gradle-wrapper.properties create mode 100755 gradlew create mode 100644 gradlew.bat create mode 100644 libraries/accountselect/api/build.gradle.kts create mode 100644 libraries/accountselect/api/src/main/kotlin/io/element/android/libraries/accountselect/api/AccountSelectEntryPoint.kt create mode 100644 libraries/accountselect/impl/build.gradle.kts create mode 100644 libraries/accountselect/impl/src/main/kotlin/io/element/android/libraries/accountselect/impl/AccountSelectNode.kt create mode 100644 libraries/accountselect/impl/src/main/kotlin/io/element/android/libraries/accountselect/impl/AccountSelectPresenter.kt create mode 100644 libraries/accountselect/impl/src/main/kotlin/io/element/android/libraries/accountselect/impl/AccountSelectState.kt create mode 100644 libraries/accountselect/impl/src/main/kotlin/io/element/android/libraries/accountselect/impl/AccountSelectStateProvider.kt create mode 100644 libraries/accountselect/impl/src/main/kotlin/io/element/android/libraries/accountselect/impl/AccountSelectView.kt create mode 100644 libraries/accountselect/impl/src/main/kotlin/io/element/android/libraries/accountselect/impl/DefaultAccountSelectEntryPoint.kt create mode 100644 libraries/accountselect/impl/src/test/kotlin/io/element/android/libraries/accountselect/impl/AccountSelectPresenterTest.kt create mode 100644 libraries/accountselect/impl/src/test/kotlin/io/element/android/libraries/accountselect/impl/DefaultAccountSelectEntryPointTest.kt create mode 100644 libraries/androidutils/.gitignore create mode 100644 libraries/androidutils/build.gradle.kts create mode 100644 libraries/androidutils/consumer-rules.pro create mode 100644 libraries/androidutils/src/main/AndroidManifest.xml create mode 100644 libraries/androidutils/src/main/kotlin/io/element/android/libraries/androidutils/assets/AssetReader.kt create mode 100644 libraries/androidutils/src/main/kotlin/io/element/android/libraries/androidutils/bitmap/Bitmap.kt create mode 100644 libraries/androidutils/src/main/kotlin/io/element/android/libraries/androidutils/browser/ChromeCustomTab.kt create mode 100644 libraries/androidutils/src/main/kotlin/io/element/android/libraries/androidutils/browser/ConsoleMessageLogger.kt create mode 100644 libraries/androidutils/src/main/kotlin/io/element/android/libraries/androidutils/clipboard/AndroidClipboardHelper.kt create mode 100644 libraries/androidutils/src/main/kotlin/io/element/android/libraries/androidutils/clipboard/ClipboardHelper.kt create mode 100644 libraries/androidutils/src/main/kotlin/io/element/android/libraries/androidutils/clipboard/FakeClipboardHelper.kt create mode 100644 libraries/androidutils/src/main/kotlin/io/element/android/libraries/androidutils/compat/Compat.kt create mode 100644 libraries/androidutils/src/main/kotlin/io/element/android/libraries/androidutils/diff/DefaultDiffCallback.kt create mode 100644 libraries/androidutils/src/main/kotlin/io/element/android/libraries/androidutils/diff/DiffCache.kt create mode 100644 libraries/androidutils/src/main/kotlin/io/element/android/libraries/androidutils/diff/DiffCacheInvalidator.kt create mode 100644 libraries/androidutils/src/main/kotlin/io/element/android/libraries/androidutils/diff/DiffCacheUpdater.kt create mode 100644 libraries/androidutils/src/main/kotlin/io/element/android/libraries/androidutils/file/Context.kt create mode 100644 libraries/androidutils/src/main/kotlin/io/element/android/libraries/androidutils/file/File.kt create mode 100644 libraries/androidutils/src/main/kotlin/io/element/android/libraries/androidutils/file/FileCompression.kt create mode 100644 libraries/androidutils/src/main/kotlin/io/element/android/libraries/androidutils/file/TemporaryUriDeleter.kt create mode 100644 libraries/androidutils/src/main/kotlin/io/element/android/libraries/androidutils/filesize/AndroidFileSizeFormatter.kt create mode 100644 libraries/androidutils/src/main/kotlin/io/element/android/libraries/androidutils/filesize/FakeFileSizeFormatter.kt create mode 100644 libraries/androidutils/src/main/kotlin/io/element/android/libraries/androidutils/filesize/FileSizeFormatter.kt create mode 100644 libraries/androidutils/src/main/kotlin/io/element/android/libraries/androidutils/hardware/VibratorTools.kt create mode 100644 libraries/androidutils/src/main/kotlin/io/element/android/libraries/androidutils/hash/Hash.kt create mode 100644 libraries/androidutils/src/main/kotlin/io/element/android/libraries/androidutils/json/JsonProvider.kt create mode 100644 libraries/androidutils/src/main/kotlin/io/element/android/libraries/androidutils/media/MediaMetaDataRetriever.kt create mode 100644 libraries/androidutils/src/main/kotlin/io/element/android/libraries/androidutils/media/VideoCompressorHelper.kt create mode 100644 libraries/androidutils/src/main/kotlin/io/element/android/libraries/androidutils/metadata/IsInDebug.kt create mode 100644 libraries/androidutils/src/main/kotlin/io/element/android/libraries/androidutils/preferences/DefaultPreferencesCorruptionHandlerFactory.kt create mode 100644 libraries/androidutils/src/main/kotlin/io/element/android/libraries/androidutils/system/Accessibility.kt create mode 100644 libraries/androidutils/src/main/kotlin/io/element/android/libraries/androidutils/system/CopyToClipboardUseCase.kt create mode 100644 libraries/androidutils/src/main/kotlin/io/element/android/libraries/androidutils/system/DateTimeObserver.kt create mode 100644 libraries/androidutils/src/main/kotlin/io/element/android/libraries/androidutils/system/SystemUtils.kt create mode 100644 libraries/androidutils/src/main/kotlin/io/element/android/libraries/androidutils/text/LinkifyHelper.kt create mode 100644 libraries/androidutils/src/main/kotlin/io/element/android/libraries/androidutils/throttler/FirstThrottler.kt create mode 100644 libraries/androidutils/src/main/kotlin/io/element/android/libraries/androidutils/ui/View.kt create mode 100644 libraries/androidutils/src/main/kotlin/io/element/android/libraries/androidutils/uri/UriExtensions.kt create mode 100644 libraries/androidutils/src/main/res/values-be/translations.xml create mode 100644 libraries/androidutils/src/main/res/values-cs/translations.xml create mode 100644 libraries/androidutils/src/main/res/values-cy/translations.xml create mode 100644 libraries/androidutils/src/main/res/values-da/translations.xml create mode 100644 libraries/androidutils/src/main/res/values-de/translations.xml create mode 100644 libraries/androidutils/src/main/res/values-el/translations.xml create mode 100644 libraries/androidutils/src/main/res/values-es/translations.xml create mode 100644 libraries/androidutils/src/main/res/values-et/translations.xml create mode 100644 libraries/androidutils/src/main/res/values-eu/translations.xml create mode 100644 libraries/androidutils/src/main/res/values-fa/translations.xml create mode 100644 libraries/androidutils/src/main/res/values-fi/translations.xml create mode 100644 libraries/androidutils/src/main/res/values-fr/translations.xml create mode 100644 libraries/androidutils/src/main/res/values-hu/translations.xml create mode 100644 libraries/androidutils/src/main/res/values-in/translations.xml create mode 100644 libraries/androidutils/src/main/res/values-it/translations.xml create mode 100644 libraries/androidutils/src/main/res/values-ka/translations.xml create mode 100644 libraries/androidutils/src/main/res/values-ko/translations.xml create mode 100644 libraries/androidutils/src/main/res/values-ldrtl/integers.xml create mode 100644 libraries/androidutils/src/main/res/values-lt/translations.xml create mode 100644 libraries/androidutils/src/main/res/values-nb/translations.xml create mode 100644 libraries/androidutils/src/main/res/values-nl/translations.xml create mode 100644 libraries/androidutils/src/main/res/values-pl/translations.xml create mode 100644 libraries/androidutils/src/main/res/values-pt-rBR/translations.xml create mode 100644 libraries/androidutils/src/main/res/values-pt/translations.xml create mode 100644 libraries/androidutils/src/main/res/values-ro/translations.xml create mode 100644 libraries/androidutils/src/main/res/values-ru/translations.xml create mode 100644 libraries/androidutils/src/main/res/values-sk/translations.xml create mode 100644 libraries/androidutils/src/main/res/values-sv/translations.xml create mode 100644 libraries/androidutils/src/main/res/values-tr/translations.xml create mode 100644 libraries/androidutils/src/main/res/values-uk/translations.xml create mode 100644 libraries/androidutils/src/main/res/values-ur/translations.xml create mode 100644 libraries/androidutils/src/main/res/values-uz/translations.xml create mode 100644 libraries/androidutils/src/main/res/values-zh-rTW/translations.xml create mode 100644 libraries/androidutils/src/main/res/values-zh/translations.xml create mode 100644 libraries/androidutils/src/main/res/values/integers.xml create mode 100644 libraries/androidutils/src/main/res/values/localazy.xml create mode 100644 libraries/androidutils/src/test/kotlin/io/element/android/libraries/androidutils/filesize/AndroidFileSizeFormatterTest.kt create mode 100644 libraries/androidutils/src/test/kotlin/io/element/android/libraries/androidutils/media/VideoCompressorHelperTest.kt create mode 100644 libraries/androidutils/src/test/kotlin/io/element/android/libraries/androidutils/text/LinkifierHelperTest.kt create mode 100644 libraries/androidutils/src/test/kotlin/io/element/android/libraries/androidutils/throttler/FirstThrottlerTest.kt create mode 100644 libraries/architecture/.gitignore create mode 100644 libraries/architecture/build.gradle.kts create mode 100644 libraries/architecture/src/main/kotlin/io/element/android/libraries/architecture/AssistedNodeFactory.kt create mode 100644 libraries/architecture/src/main/kotlin/io/element/android/libraries/architecture/AsyncAction.kt create mode 100644 libraries/architecture/src/main/kotlin/io/element/android/libraries/architecture/AsyncData.kt create mode 100644 libraries/architecture/src/main/kotlin/io/element/android/libraries/architecture/BaseFlowNode.kt create mode 100644 libraries/architecture/src/main/kotlin/io/element/android/libraries/architecture/Bindings.kt create mode 100644 libraries/architecture/src/main/kotlin/io/element/android/libraries/architecture/FeatureEntryPoint.kt create mode 100644 libraries/architecture/src/main/kotlin/io/element/android/libraries/architecture/LifecycleExt.kt create mode 100644 libraries/architecture/src/main/kotlin/io/element/android/libraries/architecture/NodeCallback.kt create mode 100644 libraries/architecture/src/main/kotlin/io/element/android/libraries/architecture/NodeFactories.kt create mode 100644 libraries/architecture/src/main/kotlin/io/element/android/libraries/architecture/NodeInputs.kt create mode 100644 libraries/architecture/src/main/kotlin/io/element/android/libraries/architecture/NodeKey.kt create mode 100644 libraries/architecture/src/main/kotlin/io/element/android/libraries/architecture/ParentNodeExt.kt create mode 100644 libraries/architecture/src/main/kotlin/io/element/android/libraries/architecture/Presenter.kt create mode 100644 libraries/architecture/src/main/kotlin/io/element/android/libraries/architecture/animation/ScreenTransition.kt create mode 100644 libraries/architecture/src/main/kotlin/io/element/android/libraries/architecture/appyx/BackStackExt.kt create mode 100644 libraries/architecture/src/main/kotlin/io/element/android/libraries/architecture/appyx/DelegateTransitionHandler.kt create mode 100644 libraries/architecture/src/main/kotlin/io/element/android/libraries/architecture/appyx/NodeExt.kt create mode 100644 libraries/architecture/src/main/kotlin/io/element/android/libraries/architecture/coverage/ExcludeFromCoverage.kt create mode 100644 libraries/architecture/src/main/kotlin/io/element/android/libraries/architecture/overlay/HideOverlayBackPressHandler.kt create mode 100644 libraries/architecture/src/main/kotlin/io/element/android/libraries/architecture/overlay/Overlay.kt create mode 100644 libraries/architecture/src/main/kotlin/io/element/android/libraries/architecture/overlay/operation/Hide.kt create mode 100644 libraries/architecture/src/main/kotlin/io/element/android/libraries/architecture/overlay/operation/OverlayOperation.kt create mode 100644 libraries/architecture/src/main/kotlin/io/element/android/libraries/architecture/overlay/operation/Show.kt create mode 100644 libraries/architecture/src/test/kotlin/io/element/android/libraries/architecture/AsyncActionTest.kt create mode 100644 libraries/architecture/src/test/kotlin/io/element/android/libraries/architecture/AsyncDataKtTest.kt create mode 100644 libraries/audio/api/build.gradle.kts create mode 100644 libraries/audio/api/src/main/kotlin/io/element/android/libraries/audio/api/AudioFocus.kt create mode 100644 libraries/audio/impl/build.gradle.kts create mode 100644 libraries/audio/impl/src/main/kotlin/io/element/android/libraries/audio/impl/DefaultAudioFocus.kt create mode 100644 libraries/audio/test/build.gradle.kts create mode 100644 libraries/audio/test/src/main/kotlin/io/element/android/libraries/mediaplayer/test/FakeAudioFocus.kt create mode 100644 libraries/compound/build.gradle.kts create mode 100644 libraries/compound/screenshots/Avatar Colors - Dark.png create mode 100644 libraries/compound/screenshots/Avatar Colors - Light.png create mode 100644 libraries/compound/screenshots/Compound Icons - Dark.png create mode 100644 libraries/compound/screenshots/Compound Icons - Light.png create mode 100644 libraries/compound/screenshots/Compound Icons - Rtl.png create mode 100644 libraries/compound/screenshots/Compound Semantic Colors - Dark HC.png create mode 100644 libraries/compound/screenshots/Compound Semantic Colors - Dark.png create mode 100644 libraries/compound/screenshots/Compound Semantic Colors - Light HC.png create mode 100644 libraries/compound/screenshots/Compound Semantic Colors - Light.png create mode 100644 libraries/compound/screenshots/Compound Typography.png create mode 100644 libraries/compound/screenshots/Compound Vector Icons - Dark.png create mode 100644 libraries/compound/screenshots/Compound Vector Icons - Light.png create mode 100644 libraries/compound/screenshots/ForcedDarkElementTheme.png create mode 100644 libraries/compound/screenshots/Legacy Colors.png create mode 100644 libraries/compound/screenshots/Material Typography.png create mode 100644 libraries/compound/screenshots/Material3 Colors - Dark HC.png create mode 100644 libraries/compound/screenshots/Material3 Colors - Dark.png create mode 100644 libraries/compound/screenshots/Material3 Colors - Light HC.png create mode 100644 libraries/compound/screenshots/Material3 Colors - Light.png create mode 100644 libraries/compound/screenshots/MaterialText Colors.png create mode 100644 libraries/compound/screenshots/MaterialYou Theme - Dark.png create mode 100644 libraries/compound/screenshots/MaterialYou Theme - Light.png create mode 100644 libraries/compound/src/main/assets/theme.iife.js create mode 100644 libraries/compound/src/main/kotlin/io/element/android/compound/annotations/CoreColorToken.kt create mode 100644 libraries/compound/src/main/kotlin/io/element/android/compound/colors/SemanticColorsLightDark.kt create mode 100644 libraries/compound/src/main/kotlin/io/element/android/compound/previews/ColorListPreview.kt create mode 100644 libraries/compound/src/main/kotlin/io/element/android/compound/previews/ColorPreview.kt create mode 100644 libraries/compound/src/main/kotlin/io/element/android/compound/previews/ColorsSchemePreview.kt create mode 100644 libraries/compound/src/main/kotlin/io/element/android/compound/previews/CompoundIconsPreview.kt create mode 100644 libraries/compound/src/main/kotlin/io/element/android/compound/previews/SemanticColorsPreview.kt create mode 100644 libraries/compound/src/main/kotlin/io/element/android/compound/previews/Typography.kt create mode 100644 libraries/compound/src/main/kotlin/io/element/android/compound/showkase/CompoundShowkaseRootModule.kt create mode 100644 libraries/compound/src/main/kotlin/io/element/android/compound/theme/AvatarColors.kt create mode 100644 libraries/compound/src/main/kotlin/io/element/android/compound/theme/ElementTheme.kt create mode 100644 libraries/compound/src/main/kotlin/io/element/android/compound/theme/ForcedDarkElementTheme.kt create mode 100644 libraries/compound/src/main/kotlin/io/element/android/compound/theme/LegacyColors.kt create mode 100644 libraries/compound/src/main/kotlin/io/element/android/compound/theme/MaterialColorSchemeDark.kt create mode 100644 libraries/compound/src/main/kotlin/io/element/android/compound/theme/MaterialColorSchemeLight.kt create mode 100644 libraries/compound/src/main/kotlin/io/element/android/compound/theme/MaterialTextPreview.kt create mode 100644 libraries/compound/src/main/kotlin/io/element/android/compound/theme/MaterialThemeColors.kt create mode 100644 libraries/compound/src/main/kotlin/io/element/android/compound/theme/Theme.kt create mode 100644 libraries/compound/src/main/kotlin/io/element/android/compound/tokens/CompoundTypography.kt create mode 100644 libraries/compound/src/main/kotlin/io/element/android/compound/tokens/generated/CompoundIcons.kt create mode 100644 libraries/compound/src/main/kotlin/io/element/android/compound/tokens/generated/DO_NOT_MODIFY.txt create mode 100644 libraries/compound/src/main/kotlin/io/element/android/compound/tokens/generated/SemanticColors.kt create mode 100644 libraries/compound/src/main/kotlin/io/element/android/compound/tokens/generated/SemanticColorsDark.kt create mode 100644 libraries/compound/src/main/kotlin/io/element/android/compound/tokens/generated/SemanticColorsDarkHc.kt create mode 100644 libraries/compound/src/main/kotlin/io/element/android/compound/tokens/generated/SemanticColorsLight.kt create mode 100644 libraries/compound/src/main/kotlin/io/element/android/compound/tokens/generated/SemanticColorsLightHc.kt create mode 100644 libraries/compound/src/main/kotlin/io/element/android/compound/tokens/generated/TypographyTokens.kt create mode 100644 libraries/compound/src/main/kotlin/io/element/android/compound/tokens/generated/internal/DarkColorTokens.kt create mode 100644 libraries/compound/src/main/kotlin/io/element/android/compound/tokens/generated/internal/DarkHcColorTokens.kt create mode 100644 libraries/compound/src/main/kotlin/io/element/android/compound/tokens/generated/internal/LightColorTokens.kt create mode 100644 libraries/compound/src/main/kotlin/io/element/android/compound/tokens/generated/internal/LightHcColorTokens.kt create mode 100644 libraries/compound/src/main/kotlin/io/element/android/compound/utils/ColorUtils.kt create mode 100644 libraries/compound/src/main/res/drawable/ic_compound_admin.xml create mode 100644 libraries/compound/src/main/res/drawable/ic_compound_arrow_down.xml create mode 100644 libraries/compound/src/main/res/drawable/ic_compound_arrow_left.xml create mode 100644 libraries/compound/src/main/res/drawable/ic_compound_arrow_right.xml create mode 100644 libraries/compound/src/main/res/drawable/ic_compound_arrow_up.xml create mode 100644 libraries/compound/src/main/res/drawable/ic_compound_arrow_up_right.xml create mode 100644 libraries/compound/src/main/res/drawable/ic_compound_ask_to_join.xml create mode 100644 libraries/compound/src/main/res/drawable/ic_compound_ask_to_join_solid.xml create mode 100644 libraries/compound/src/main/res/drawable/ic_compound_attachment.xml create mode 100644 libraries/compound/src/main/res/drawable/ic_compound_audio.xml create mode 100644 libraries/compound/src/main/res/drawable/ic_compound_block.xml create mode 100644 libraries/compound/src/main/res/drawable/ic_compound_bold.xml create mode 100644 libraries/compound/src/main/res/drawable/ic_compound_calendar.xml create mode 100644 libraries/compound/src/main/res/drawable/ic_compound_chart.xml create mode 100644 libraries/compound/src/main/res/drawable/ic_compound_chat.xml create mode 100644 libraries/compound/src/main/res/drawable/ic_compound_chat_new.xml create mode 100644 libraries/compound/src/main/res/drawable/ic_compound_chat_problem.xml create mode 100644 libraries/compound/src/main/res/drawable/ic_compound_chat_solid.xml create mode 100644 libraries/compound/src/main/res/drawable/ic_compound_check.xml create mode 100644 libraries/compound/src/main/res/drawable/ic_compound_check_circle.xml create mode 100644 libraries/compound/src/main/res/drawable/ic_compound_check_circle_solid.xml create mode 100644 libraries/compound/src/main/res/drawable/ic_compound_chevron_down.xml create mode 100644 libraries/compound/src/main/res/drawable/ic_compound_chevron_left.xml create mode 100644 libraries/compound/src/main/res/drawable/ic_compound_chevron_right.xml create mode 100644 libraries/compound/src/main/res/drawable/ic_compound_chevron_up.xml create mode 100644 libraries/compound/src/main/res/drawable/ic_compound_chevron_up_down.xml create mode 100644 libraries/compound/src/main/res/drawable/ic_compound_circle.xml create mode 100644 libraries/compound/src/main/res/drawable/ic_compound_close.xml create mode 100644 libraries/compound/src/main/res/drawable/ic_compound_cloud.xml create mode 100644 libraries/compound/src/main/res/drawable/ic_compound_cloud_solid.xml create mode 100644 libraries/compound/src/main/res/drawable/ic_compound_code.xml create mode 100644 libraries/compound/src/main/res/drawable/ic_compound_collapse.xml create mode 100644 libraries/compound/src/main/res/drawable/ic_compound_company.xml create mode 100644 libraries/compound/src/main/res/drawable/ic_compound_compose.xml create mode 100644 libraries/compound/src/main/res/drawable/ic_compound_computer.xml create mode 100644 libraries/compound/src/main/res/drawable/ic_compound_copy.xml create mode 100644 libraries/compound/src/main/res/drawable/ic_compound_dark_mode.xml create mode 100644 libraries/compound/src/main/res/drawable/ic_compound_delete.xml create mode 100644 libraries/compound/src/main/res/drawable/ic_compound_devices.xml create mode 100644 libraries/compound/src/main/res/drawable/ic_compound_dial_pad.xml create mode 100644 libraries/compound/src/main/res/drawable/ic_compound_document.xml create mode 100644 libraries/compound/src/main/res/drawable/ic_compound_download.xml create mode 100644 libraries/compound/src/main/res/drawable/ic_compound_download_ios.xml create mode 100644 libraries/compound/src/main/res/drawable/ic_compound_drag_grid.xml create mode 100644 libraries/compound/src/main/res/drawable/ic_compound_drag_list.xml create mode 100644 libraries/compound/src/main/res/drawable/ic_compound_earpiece.xml create mode 100644 libraries/compound/src/main/res/drawable/ic_compound_edit.xml create mode 100644 libraries/compound/src/main/res/drawable/ic_compound_edit_solid.xml create mode 100644 libraries/compound/src/main/res/drawable/ic_compound_email.xml create mode 100644 libraries/compound/src/main/res/drawable/ic_compound_email_solid.xml create mode 100644 libraries/compound/src/main/res/drawable/ic_compound_end_call.xml create mode 100644 libraries/compound/src/main/res/drawable/ic_compound_error.xml create mode 100644 libraries/compound/src/main/res/drawable/ic_compound_error_solid.xml create mode 100644 libraries/compound/src/main/res/drawable/ic_compound_expand.xml create mode 100644 libraries/compound/src/main/res/drawable/ic_compound_explore.xml create mode 100644 libraries/compound/src/main/res/drawable/ic_compound_export_archive.xml create mode 100644 libraries/compound/src/main/res/drawable/ic_compound_extensions.xml create mode 100644 libraries/compound/src/main/res/drawable/ic_compound_extensions_solid.xml create mode 100644 libraries/compound/src/main/res/drawable/ic_compound_favourite.xml create mode 100644 libraries/compound/src/main/res/drawable/ic_compound_favourite_solid.xml create mode 100644 libraries/compound/src/main/res/drawable/ic_compound_file_error.xml create mode 100644 libraries/compound/src/main/res/drawable/ic_compound_files.xml create mode 100644 libraries/compound/src/main/res/drawable/ic_compound_filter.xml create mode 100644 libraries/compound/src/main/res/drawable/ic_compound_forward.xml create mode 100644 libraries/compound/src/main/res/drawable/ic_compound_grid.xml create mode 100644 libraries/compound/src/main/res/drawable/ic_compound_group.xml create mode 100644 libraries/compound/src/main/res/drawable/ic_compound_guest.xml create mode 100644 libraries/compound/src/main/res/drawable/ic_compound_headphones_off_solid.xml create mode 100644 libraries/compound/src/main/res/drawable/ic_compound_headphones_solid.xml create mode 100644 libraries/compound/src/main/res/drawable/ic_compound_help.xml create mode 100644 libraries/compound/src/main/res/drawable/ic_compound_help_solid.xml create mode 100644 libraries/compound/src/main/res/drawable/ic_compound_history.xml create mode 100644 libraries/compound/src/main/res/drawable/ic_compound_home.xml create mode 100644 libraries/compound/src/main/res/drawable/ic_compound_home_solid.xml create mode 100644 libraries/compound/src/main/res/drawable/ic_compound_host.xml create mode 100644 libraries/compound/src/main/res/drawable/ic_compound_image.xml create mode 100644 libraries/compound/src/main/res/drawable/ic_compound_image_error.xml create mode 100644 libraries/compound/src/main/res/drawable/ic_compound_indent_decrease.xml create mode 100644 libraries/compound/src/main/res/drawable/ic_compound_indent_increase.xml create mode 100644 libraries/compound/src/main/res/drawable/ic_compound_info.xml create mode 100644 libraries/compound/src/main/res/drawable/ic_compound_info_solid.xml create mode 100644 libraries/compound/src/main/res/drawable/ic_compound_inline_code.xml create mode 100644 libraries/compound/src/main/res/drawable/ic_compound_italic.xml create mode 100644 libraries/compound/src/main/res/drawable/ic_compound_key.xml create mode 100644 libraries/compound/src/main/res/drawable/ic_compound_key_off.xml create mode 100644 libraries/compound/src/main/res/drawable/ic_compound_key_off_solid.xml create mode 100644 libraries/compound/src/main/res/drawable/ic_compound_key_solid.xml create mode 100644 libraries/compound/src/main/res/drawable/ic_compound_keyboard.xml create mode 100644 libraries/compound/src/main/res/drawable/ic_compound_labs.xml create mode 100644 libraries/compound/src/main/res/drawable/ic_compound_leave.xml create mode 100644 libraries/compound/src/main/res/drawable/ic_compound_link.xml create mode 100644 libraries/compound/src/main/res/drawable/ic_compound_linux.xml create mode 100644 libraries/compound/src/main/res/drawable/ic_compound_list_bulleted.xml create mode 100644 libraries/compound/src/main/res/drawable/ic_compound_list_numbered.xml create mode 100644 libraries/compound/src/main/res/drawable/ic_compound_list_view.xml create mode 100644 libraries/compound/src/main/res/drawable/ic_compound_location_navigator.xml create mode 100644 libraries/compound/src/main/res/drawable/ic_compound_location_navigator_centred.xml create mode 100644 libraries/compound/src/main/res/drawable/ic_compound_location_pin.xml create mode 100644 libraries/compound/src/main/res/drawable/ic_compound_location_pin_solid.xml create mode 100644 libraries/compound/src/main/res/drawable/ic_compound_lock.xml create mode 100644 libraries/compound/src/main/res/drawable/ic_compound_lock_off.xml create mode 100644 libraries/compound/src/main/res/drawable/ic_compound_lock_solid.xml create mode 100644 libraries/compound/src/main/res/drawable/ic_compound_mac.xml create mode 100644 libraries/compound/src/main/res/drawable/ic_compound_mark_as_read.xml create mode 100644 libraries/compound/src/main/res/drawable/ic_compound_mark_as_unread.xml create mode 100644 libraries/compound/src/main/res/drawable/ic_compound_mark_threads_as_read.xml create mode 100644 libraries/compound/src/main/res/drawable/ic_compound_marker_read_receipts.xml create mode 100644 libraries/compound/src/main/res/drawable/ic_compound_mention.xml create mode 100644 libraries/compound/src/main/res/drawable/ic_compound_menu.xml create mode 100644 libraries/compound/src/main/res/drawable/ic_compound_mic_off.xml create mode 100644 libraries/compound/src/main/res/drawable/ic_compound_mic_off_solid.xml create mode 100644 libraries/compound/src/main/res/drawable/ic_compound_mic_on.xml create mode 100644 libraries/compound/src/main/res/drawable/ic_compound_mic_on_solid.xml create mode 100644 libraries/compound/src/main/res/drawable/ic_compound_minus.xml create mode 100644 libraries/compound/src/main/res/drawable/ic_compound_mobile.xml create mode 100644 libraries/compound/src/main/res/drawable/ic_compound_notifications.xml create mode 100644 libraries/compound/src/main/res/drawable/ic_compound_notifications_off.xml create mode 100644 libraries/compound/src/main/res/drawable/ic_compound_notifications_off_solid.xml create mode 100644 libraries/compound/src/main/res/drawable/ic_compound_notifications_solid.xml create mode 100644 libraries/compound/src/main/res/drawable/ic_compound_offline.xml create mode 100644 libraries/compound/src/main/res/drawable/ic_compound_overflow_horizontal.xml create mode 100644 libraries/compound/src/main/res/drawable/ic_compound_overflow_vertical.xml create mode 100644 libraries/compound/src/main/res/drawable/ic_compound_pause.xml create mode 100644 libraries/compound/src/main/res/drawable/ic_compound_pause_solid.xml create mode 100644 libraries/compound/src/main/res/drawable/ic_compound_pin.xml create mode 100644 libraries/compound/src/main/res/drawable/ic_compound_pin_solid.xml create mode 100644 libraries/compound/src/main/res/drawable/ic_compound_play.xml create mode 100644 libraries/compound/src/main/res/drawable/ic_compound_play_solid.xml create mode 100644 libraries/compound/src/main/res/drawable/ic_compound_plus.xml create mode 100644 libraries/compound/src/main/res/drawable/ic_compound_polls.xml create mode 100644 libraries/compound/src/main/res/drawable/ic_compound_polls_end.xml create mode 100644 libraries/compound/src/main/res/drawable/ic_compound_pop_out.xml create mode 100644 libraries/compound/src/main/res/drawable/ic_compound_preferences.xml create mode 100644 libraries/compound/src/main/res/drawable/ic_compound_presence_outline_8_x_8.xml create mode 100644 libraries/compound/src/main/res/drawable/ic_compound_presence_solid_8_x_8.xml create mode 100644 libraries/compound/src/main/res/drawable/ic_compound_presence_strikethrough_8_x_8.xml create mode 100644 libraries/compound/src/main/res/drawable/ic_compound_public.xml create mode 100644 libraries/compound/src/main/res/drawable/ic_compound_qr_code.xml create mode 100644 libraries/compound/src/main/res/drawable/ic_compound_quote.xml create mode 100644 libraries/compound/src/main/res/drawable/ic_compound_raised_hand_solid.xml create mode 100644 libraries/compound/src/main/res/drawable/ic_compound_reaction.xml create mode 100644 libraries/compound/src/main/res/drawable/ic_compound_reaction_add.xml create mode 100644 libraries/compound/src/main/res/drawable/ic_compound_reaction_solid.xml create mode 100644 libraries/compound/src/main/res/drawable/ic_compound_reply.xml create mode 100644 libraries/compound/src/main/res/drawable/ic_compound_restart.xml create mode 100644 libraries/compound/src/main/res/drawable/ic_compound_room.xml create mode 100644 libraries/compound/src/main/res/drawable/ic_compound_search.xml create mode 100644 libraries/compound/src/main/res/drawable/ic_compound_send.xml create mode 100644 libraries/compound/src/main/res/drawable/ic_compound_send_solid.xml create mode 100644 libraries/compound/src/main/res/drawable/ic_compound_settings.xml create mode 100644 libraries/compound/src/main/res/drawable/ic_compound_settings_solid.xml create mode 100644 libraries/compound/src/main/res/drawable/ic_compound_share.xml create mode 100644 libraries/compound/src/main/res/drawable/ic_compound_share_android.xml create mode 100644 libraries/compound/src/main/res/drawable/ic_compound_share_ios.xml create mode 100644 libraries/compound/src/main/res/drawable/ic_compound_share_screen.xml create mode 100644 libraries/compound/src/main/res/drawable/ic_compound_share_screen_solid.xml create mode 100644 libraries/compound/src/main/res/drawable/ic_compound_shield.xml create mode 100644 libraries/compound/src/main/res/drawable/ic_compound_sidebar.xml create mode 100644 libraries/compound/src/main/res/drawable/ic_compound_sign_out.xml create mode 100644 libraries/compound/src/main/res/drawable/ic_compound_spinner.xml create mode 100644 libraries/compound/src/main/res/drawable/ic_compound_spotlight.xml create mode 100644 libraries/compound/src/main/res/drawable/ic_compound_spotlight_view.xml create mode 100644 libraries/compound/src/main/res/drawable/ic_compound_strikethrough.xml create mode 100644 libraries/compound/src/main/res/drawable/ic_compound_switch_camera_solid.xml create mode 100644 libraries/compound/src/main/res/drawable/ic_compound_take_photo.xml create mode 100644 libraries/compound/src/main/res/drawable/ic_compound_take_photo_solid.xml create mode 100644 libraries/compound/src/main/res/drawable/ic_compound_text_formatting.xml create mode 100644 libraries/compound/src/main/res/drawable/ic_compound_threads.xml create mode 100644 libraries/compound/src/main/res/drawable/ic_compound_threads_solid.xml create mode 100644 libraries/compound/src/main/res/drawable/ic_compound_time.xml create mode 100644 libraries/compound/src/main/res/drawable/ic_compound_underline.xml create mode 100644 libraries/compound/src/main/res/drawable/ic_compound_unknown.xml create mode 100644 libraries/compound/src/main/res/drawable/ic_compound_unknown_solid.xml create mode 100644 libraries/compound/src/main/res/drawable/ic_compound_unpin.xml create mode 100644 libraries/compound/src/main/res/drawable/ic_compound_user.xml create mode 100644 libraries/compound/src/main/res/drawable/ic_compound_user_add.xml create mode 100644 libraries/compound/src/main/res/drawable/ic_compound_user_add_solid.xml create mode 100644 libraries/compound/src/main/res/drawable/ic_compound_user_profile.xml create mode 100644 libraries/compound/src/main/res/drawable/ic_compound_user_profile_solid.xml create mode 100644 libraries/compound/src/main/res/drawable/ic_compound_user_solid.xml create mode 100644 libraries/compound/src/main/res/drawable/ic_compound_verified.xml create mode 100644 libraries/compound/src/main/res/drawable/ic_compound_video_call.xml create mode 100644 libraries/compound/src/main/res/drawable/ic_compound_video_call_declined_solid.xml create mode 100644 libraries/compound/src/main/res/drawable/ic_compound_video_call_missed_solid.xml create mode 100644 libraries/compound/src/main/res/drawable/ic_compound_video_call_off.xml create mode 100644 libraries/compound/src/main/res/drawable/ic_compound_video_call_off_solid.xml create mode 100644 libraries/compound/src/main/res/drawable/ic_compound_video_call_solid.xml create mode 100644 libraries/compound/src/main/res/drawable/ic_compound_visibility_off.xml create mode 100644 libraries/compound/src/main/res/drawable/ic_compound_visibility_on.xml create mode 100644 libraries/compound/src/main/res/drawable/ic_compound_voice_call.xml create mode 100644 libraries/compound/src/main/res/drawable/ic_compound_voice_call_solid.xml create mode 100644 libraries/compound/src/main/res/drawable/ic_compound_volume_off.xml create mode 100644 libraries/compound/src/main/res/drawable/ic_compound_volume_off_solid.xml create mode 100644 libraries/compound/src/main/res/drawable/ic_compound_volume_on.xml create mode 100644 libraries/compound/src/main/res/drawable/ic_compound_volume_on_solid.xml create mode 100644 libraries/compound/src/main/res/drawable/ic_compound_warning.xml create mode 100644 libraries/compound/src/main/res/drawable/ic_compound_web_browser.xml create mode 100644 libraries/compound/src/main/res/drawable/ic_compound_windows.xml create mode 100644 libraries/compound/src/main/res/drawable/ic_compound_workspace.xml create mode 100644 libraries/compound/src/main/res/drawable/ic_compound_workspace_solid.xml create mode 100644 libraries/compound/src/test/kotlin/io/element/android/compound/screenshot/AvatarColorsTest.kt create mode 100644 libraries/compound/src/test/kotlin/io/element/android/compound/screenshot/CompoundIconTest.kt create mode 100644 libraries/compound/src/test/kotlin/io/element/android/compound/screenshot/CompoundTypographyTest.kt create mode 100644 libraries/compound/src/test/kotlin/io/element/android/compound/screenshot/ForcedDarkElementThemeTest.kt create mode 100644 libraries/compound/src/test/kotlin/io/element/android/compound/screenshot/LegacyColorsTest.kt create mode 100644 libraries/compound/src/test/kotlin/io/element/android/compound/screenshot/MaterialColorSchemeTest.kt create mode 100644 libraries/compound/src/test/kotlin/io/element/android/compound/screenshot/MaterialTextTest.kt create mode 100644 libraries/compound/src/test/kotlin/io/element/android/compound/screenshot/MaterialTypographyTest.kt create mode 100644 libraries/compound/src/test/kotlin/io/element/android/compound/screenshot/MaterialYouThemeTest.kt create mode 100644 libraries/compound/src/test/kotlin/io/element/android/compound/screenshot/SemanticColorsTest.kt create mode 100644 libraries/compound/src/test/kotlin/io/element/android/compound/screenshot/utils/ScreenshotUtils.kt create mode 100644 libraries/compound/src/test/kotlin/io/element/android/compound/theme/ThemeTest.kt create mode 100644 libraries/core/build.gradle.kts create mode 100644 libraries/core/src/main/kotlin/io/element/android/libraries/core/bool/Booleans.kt create mode 100644 libraries/core/src/main/kotlin/io/element/android/libraries/core/cache/CircularCache.kt create mode 100644 libraries/core/src/main/kotlin/io/element/android/libraries/core/coroutine/ChildScopeOf.kt create mode 100644 libraries/core/src/main/kotlin/io/element/android/libraries/core/coroutine/CoroutineDispatchers.kt create mode 100644 libraries/core/src/main/kotlin/io/element/android/libraries/core/coroutine/DerivedStateFlow.kt create mode 100644 libraries/core/src/main/kotlin/io/element/android/libraries/core/coroutine/ErrorFlow.kt create mode 100644 libraries/core/src/main/kotlin/io/element/android/libraries/core/coroutine/Flow.kt create mode 100644 libraries/core/src/main/kotlin/io/element/android/libraries/core/coroutine/ParallelMap.kt create mode 100644 libraries/core/src/main/kotlin/io/element/android/libraries/core/coroutine/Suspend.kt create mode 100644 libraries/core/src/main/kotlin/io/element/android/libraries/core/coroutine/SuspendLazy.kt create mode 100644 libraries/core/src/main/kotlin/io/element/android/libraries/core/data/ByteSize.kt create mode 100644 libraries/core/src/main/kotlin/io/element/android/libraries/core/data/FilterUpTo.kt create mode 100644 libraries/core/src/main/kotlin/io/element/android/libraries/core/data/Try.kt create mode 100644 libraries/core/src/main/kotlin/io/element/android/libraries/core/extensions/BasicExtensions.kt create mode 100644 libraries/core/src/main/kotlin/io/element/android/libraries/core/extensions/BuildMeta.kt create mode 100644 libraries/core/src/main/kotlin/io/element/android/libraries/core/extensions/Result.kt create mode 100644 libraries/core/src/main/kotlin/io/element/android/libraries/core/hash/Hash.kt create mode 100644 libraries/core/src/main/kotlin/io/element/android/libraries/core/log/logger/LoggerTag.kt create mode 100644 libraries/core/src/main/kotlin/io/element/android/libraries/core/meta/BuildMeta.kt create mode 100644 libraries/core/src/main/kotlin/io/element/android/libraries/core/meta/BuildType.kt create mode 100644 libraries/core/src/main/kotlin/io/element/android/libraries/core/mimetype/MimeTypes.kt create mode 100644 libraries/core/src/main/kotlin/io/element/android/libraries/core/preview/PreviewUtil.kt create mode 100644 libraries/core/src/main/kotlin/io/element/android/libraries/core/uri/UrlUtils.kt create mode 100644 libraries/core/src/test/kotlin/io/element/android/libraries/core/cache/CircularCacheTest.kt create mode 100644 libraries/core/src/test/kotlin/io/element/android/libraries/core/data/ByteSizeTest.kt create mode 100644 libraries/core/src/test/kotlin/io/element/android/libraries/core/extensions/BasicExtensionsTest.kt create mode 100644 libraries/core/src/test/kotlin/io/element/android/libraries/core/extensions/ResultTest.kt create mode 100644 libraries/cryptography/api/build.gradle.kts create mode 100644 libraries/cryptography/api/src/main/kotlin/io/element/android/libraries/cryptography/api/AESEncryptionSpecs.kt create mode 100644 libraries/cryptography/api/src/main/kotlin/io/element/android/libraries/cryptography/api/EncryptionDecryptionService.kt create mode 100644 libraries/cryptography/api/src/main/kotlin/io/element/android/libraries/cryptography/api/EncryptionResult.kt create mode 100644 libraries/cryptography/api/src/main/kotlin/io/element/android/libraries/cryptography/api/SecretKeyRepository.kt create mode 100644 libraries/cryptography/impl/build.gradle.kts create mode 100644 libraries/cryptography/impl/src/main/kotlin/io/element/android/libraries/cryptography/impl/AESEncryptionDecryptionService.kt create mode 100644 libraries/cryptography/impl/src/main/kotlin/io/element/android/libraries/cryptography/impl/CryptographyModule.kt create mode 100644 libraries/cryptography/impl/src/main/kotlin/io/element/android/libraries/cryptography/impl/KeyStoreSecretKeyRepository.kt create mode 100644 libraries/cryptography/impl/src/test/kotlin/io/element/android/libraries/cryptography/impl/AESEncryptionDecryptionServiceTest.kt create mode 100644 libraries/cryptography/test/build.gradle.kts create mode 100644 libraries/cryptography/test/src/main/kotlin/io/element/android/libraries/cryptography/test/SimpleSecretKeyRepository.kt create mode 100644 libraries/dateformatter/api/.gitignore create mode 100644 libraries/dateformatter/api/build.gradle.kts create mode 100644 libraries/dateformatter/api/consumer-rules.pro create mode 100644 libraries/dateformatter/api/src/main/kotlin/io/element/android/libraries/dateformatter/api/DateFormatter.kt create mode 100644 libraries/dateformatter/api/src/main/kotlin/io/element/android/libraries/dateformatter/api/DurationFormatter.kt create mode 100644 libraries/dateformatter/api/src/test/kotlin/io/element/android/libraries/dateformatter/api/DurationFormatterTest.kt create mode 100644 libraries/dateformatter/impl/.gitignore create mode 100644 libraries/dateformatter/impl/build.gradle.kts create mode 100644 libraries/dateformatter/impl/consumer-rules.pro create mode 100644 libraries/dateformatter/impl/src/main/kotlin/io/element/android/libraries/dateformatter/impl/DateFormatterDay.kt create mode 100644 libraries/dateformatter/impl/src/main/kotlin/io/element/android/libraries/dateformatter/impl/DateFormatterFull.kt create mode 100644 libraries/dateformatter/impl/src/main/kotlin/io/element/android/libraries/dateformatter/impl/DateFormatterMonth.kt create mode 100644 libraries/dateformatter/impl/src/main/kotlin/io/element/android/libraries/dateformatter/impl/DateFormatterTime.kt create mode 100644 libraries/dateformatter/impl/src/main/kotlin/io/element/android/libraries/dateformatter/impl/DateFormatterTimeOnly.kt create mode 100644 libraries/dateformatter/impl/src/main/kotlin/io/element/android/libraries/dateformatter/impl/DateFormatters.kt create mode 100644 libraries/dateformatter/impl/src/main/kotlin/io/element/android/libraries/dateformatter/impl/DateTimeFormatters.kt create mode 100644 libraries/dateformatter/impl/src/main/kotlin/io/element/android/libraries/dateformatter/impl/DefaultDateFormatter.kt create mode 100644 libraries/dateformatter/impl/src/main/kotlin/io/element/android/libraries/dateformatter/impl/LocalDateTimeProvider.kt create mode 100644 libraries/dateformatter/impl/src/main/kotlin/io/element/android/libraries/dateformatter/impl/LocaleChangeObserver.kt create mode 100644 libraries/dateformatter/impl/src/main/kotlin/io/element/android/libraries/dateformatter/impl/TimezoneProvider.kt create mode 100644 libraries/dateformatter/impl/src/main/kotlin/io/element/android/libraries/dateformatter/impl/di/DateFormatterModule.kt create mode 100644 libraries/dateformatter/impl/src/main/kotlin/io/element/android/libraries/dateformatter/impl/previews/DateForPreview.kt create mode 100644 libraries/dateformatter/impl/src/main/kotlin/io/element/android/libraries/dateformatter/impl/previews/DateFormatterModeProvider.kt create mode 100644 libraries/dateformatter/impl/src/main/kotlin/io/element/android/libraries/dateformatter/impl/previews/DateFormatterModeViewPreview.kt create mode 100644 libraries/dateformatter/impl/src/main/kotlin/io/element/android/libraries/dateformatter/impl/previews/Factory.kt create mode 100644 libraries/dateformatter/impl/src/main/kotlin/io/element/android/libraries/dateformatter/impl/previews/PreviewClock.kt create mode 100644 libraries/dateformatter/impl/src/main/kotlin/io/element/android/libraries/dateformatter/impl/previews/PreviewStringProvider.kt create mode 100644 libraries/dateformatter/impl/src/main/res/values-bg/translations.xml create mode 100644 libraries/dateformatter/impl/src/main/res/values-cs/translations.xml create mode 100644 libraries/dateformatter/impl/src/main/res/values-cy/translations.xml create mode 100644 libraries/dateformatter/impl/src/main/res/values-da/translations.xml create mode 100644 libraries/dateformatter/impl/src/main/res/values-de/translations.xml create mode 100644 libraries/dateformatter/impl/src/main/res/values-el/translations.xml create mode 100644 libraries/dateformatter/impl/src/main/res/values-es/translations.xml create mode 100644 libraries/dateformatter/impl/src/main/res/values-et/translations.xml create mode 100644 libraries/dateformatter/impl/src/main/res/values-eu/translations.xml create mode 100644 libraries/dateformatter/impl/src/main/res/values-fa/translations.xml create mode 100644 libraries/dateformatter/impl/src/main/res/values-fi/translations.xml create mode 100644 libraries/dateformatter/impl/src/main/res/values-fr/translations.xml create mode 100644 libraries/dateformatter/impl/src/main/res/values-hu/translations.xml create mode 100644 libraries/dateformatter/impl/src/main/res/values-in/translations.xml create mode 100644 libraries/dateformatter/impl/src/main/res/values-it/translations.xml create mode 100644 libraries/dateformatter/impl/src/main/res/values-ko/translations.xml create mode 100644 libraries/dateformatter/impl/src/main/res/values-nb/translations.xml create mode 100644 libraries/dateformatter/impl/src/main/res/values-pl/translations.xml create mode 100644 libraries/dateformatter/impl/src/main/res/values-pt-rBR/translations.xml create mode 100644 libraries/dateformatter/impl/src/main/res/values-pt/translations.xml create mode 100644 libraries/dateformatter/impl/src/main/res/values-ro/translations.xml create mode 100644 libraries/dateformatter/impl/src/main/res/values-ru/translations.xml create mode 100644 libraries/dateformatter/impl/src/main/res/values-sk/translations.xml create mode 100644 libraries/dateformatter/impl/src/main/res/values-sv/translations.xml create mode 100644 libraries/dateformatter/impl/src/main/res/values-tr/translations.xml create mode 100644 libraries/dateformatter/impl/src/main/res/values-uk/translations.xml create mode 100644 libraries/dateformatter/impl/src/main/res/values-uz/translations.xml create mode 100644 libraries/dateformatter/impl/src/main/res/values-zh-rTW/translations.xml create mode 100644 libraries/dateformatter/impl/src/main/res/values-zh/translations.xml create mode 100644 libraries/dateformatter/impl/src/main/res/values/localazy.xml create mode 100644 libraries/dateformatter/impl/src/test/kotlin/io/element/android/libraries/dateformatter/impl/DefaultDateFormatterFrTest.kt create mode 100644 libraries/dateformatter/impl/src/test/kotlin/io/element/android/libraries/dateformatter/impl/DefaultDateFormatterTest.kt create mode 100644 libraries/dateformatter/impl/src/test/kotlin/io/element/android/libraries/dateformatter/impl/Factory.kt create mode 100644 libraries/dateformatter/impl/src/test/kotlin/io/element/android/libraries/dateformatter/impl/FakeClock.kt create mode 100644 libraries/dateformatter/test/.gitignore create mode 100644 libraries/dateformatter/test/build.gradle.kts create mode 100644 libraries/dateformatter/test/consumer-rules.pro create mode 100644 libraries/dateformatter/test/src/main/kotlin/io/element/android/libraries/dateformatter/test/FakeDateFormatter.kt create mode 100644 libraries/deeplink/api/build.gradle.kts create mode 100644 libraries/deeplink/api/src/main/kotlin/io/element/android/libraries/deeplink/api/DeepLinkCreator.kt create mode 100644 libraries/deeplink/api/src/main/kotlin/io/element/android/libraries/deeplink/api/DeeplinkData.kt create mode 100644 libraries/deeplink/api/src/main/kotlin/io/element/android/libraries/deeplink/api/DeeplinkParser.kt create mode 100644 libraries/deeplink/api/src/main/kotlin/io/element/android/libraries/deeplink/api/usecase/InviteFriendsUseCase.kt create mode 100644 libraries/deeplink/impl/build.gradle.kts create mode 100644 libraries/deeplink/impl/src/main/kotlin/io/element/android/libraries/deeplink/impl/Constants.kt create mode 100644 libraries/deeplink/impl/src/main/kotlin/io/element/android/libraries/deeplink/impl/DefaultDeepLinkCreator.kt create mode 100644 libraries/deeplink/impl/src/main/kotlin/io/element/android/libraries/deeplink/impl/DefaultDeeplinkParser.kt create mode 100644 libraries/deeplink/impl/src/main/kotlin/io/element/android/libraries/deeplink/impl/usecase/DefaultInviteFriendsUseCase.kt create mode 100644 libraries/deeplink/impl/src/test/kotlin/io/element/android/libraries/deeplink/impl/DefaultDeepLinkCreatorTest.kt create mode 100644 libraries/deeplink/impl/src/test/kotlin/io/element/android/libraries/deeplink/impl/DefaultDeeplinkParserTest.kt create mode 100644 libraries/designsystem/.gitignore create mode 100644 libraries/designsystem/build.gradle.kts create mode 100644 libraries/designsystem/consumer-rules.pro create mode 100644 libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/ColorUtil.kt create mode 100644 libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/animation/AlphaAnimation.kt create mode 100644 libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/atomic/atoms/BetaLabel.kt create mode 100644 libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/atomic/atoms/CounterAtom.kt create mode 100644 libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/atomic/atoms/ElementLogoAtom.kt create mode 100644 libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/atomic/atoms/MatrixBadgeAtom.kt create mode 100644 libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/atomic/atoms/PlaceholderAtom.kt create mode 100644 libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/atomic/atoms/RedIndicatorAtom.kt create mode 100644 libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/atomic/atoms/RoomPreviewDescriptionAtom.kt create mode 100644 libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/atomic/atoms/RoomPreviewSubtitleAtom.kt create mode 100644 libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/atomic/atoms/RoomPreviewTitleAtom.kt create mode 100644 libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/atomic/atoms/RoundedIconAtom.kt create mode 100644 libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/atomic/atoms/SelectedIndicatorAtom.kt create mode 100644 libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/atomic/atoms/UnreadIndicatorAtom.kt create mode 100644 libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/atomic/molecules/ButtonColumnMolecule.kt create mode 100644 libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/atomic/molecules/ButtonRowMolecule.kt create mode 100644 libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/atomic/molecules/ComposerAlertMolecule.kt create mode 100644 libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/atomic/molecules/ComposerAlertMoleculeParamsProvider.kt create mode 100644 libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/atomic/molecules/IconTitlePlaceholdersRowMolecule.kt create mode 100644 libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/atomic/molecules/IconTitleSubtitleMolecule.kt create mode 100644 libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/atomic/molecules/InfoListItemMolecule.kt create mode 100644 libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/atomic/molecules/InviteButtonsRowMolecule.kt create mode 100644 libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/atomic/molecules/MatrixBadgeRowMolecule.kt create mode 100644 libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/atomic/molecules/MembersCountMolecule.kt create mode 100644 libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/atomic/molecules/NumberedListMolecule.kt create mode 100644 libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/atomic/molecules/TextWithLabelMolecule.kt create mode 100644 libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/atomic/organisms/InfoListOrganism.kt create mode 100644 libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/atomic/organisms/NumberedListOrganism.kt create mode 100644 libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/atomic/organisms/RoomPreviewOrganism.kt create mode 100644 libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/atomic/pages/FlowStepPage.kt create mode 100644 libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/atomic/pages/HeaderFooterPage.kt create mode 100644 libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/atomic/pages/OnBoardingPage.kt create mode 100644 libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/atomic/pages/SunsetPage.kt create mode 100644 libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/background/LightGradientBackground.kt create mode 100644 libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/background/OnboardingBackground.kt create mode 100644 libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/colors/AvatarColorsProvider.kt create mode 100644 libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/colors/Gradient.kt create mode 100644 libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/components/Announcement.kt create mode 100644 libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/components/Badge.kt create mode 100644 libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/components/BigIcon.kt create mode 100644 libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/components/ClickableLinkText.kt create mode 100644 libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/components/EqualWidthColumn.kt create mode 100644 libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/components/ExpandableBottomSheetLayout.kt create mode 100644 libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/components/ExpandableBottomSheetLayoutState.kt create mode 100644 libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/components/LabelledCheckbox.kt create mode 100644 libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/components/PinIcon.kt create mode 100644 libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/components/ProgressDialog.kt create mode 100644 libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/components/SimpleModalBottomSheet.kt create mode 100644 libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/components/TopAppBarScrollBehaviorLayout.kt create mode 100644 libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/components/async/AsyncActionProvider.kt create mode 100644 libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/components/async/AsyncActionView.kt create mode 100644 libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/components/async/AsyncFailure.kt create mode 100644 libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/components/async/AsyncIndicator.kt create mode 100644 libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/components/async/AsyncIndicatorHost.kt create mode 100644 libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/components/async/AsyncIndicatorView.kt create mode 100644 libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/components/async/AsyncLoading.kt create mode 100644 libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/components/avatar/Avatar.kt create mode 100644 libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/components/avatar/AvatarData.kt create mode 100644 libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/components/avatar/AvatarDataProvider.kt create mode 100644 libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/components/avatar/AvatarRow.kt create mode 100644 libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/components/avatar/AvatarShape.kt create mode 100644 libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/components/avatar/AvatarSize.kt create mode 100644 libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/components/avatar/AvatarType.kt create mode 100644 libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/components/avatar/DmAvatars.kt create mode 100644 libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/components/avatar/internal/AvatarCluster.kt create mode 100644 libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/components/avatar/internal/ImageAvatar.kt create mode 100644 libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/components/avatar/internal/InitialLetterAvatar.kt create mode 100644 libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/components/avatar/internal/InitialOrImageAvatar.kt create mode 100644 libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/components/avatar/internal/OverlapRatioProvider.kt create mode 100644 libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/components/avatar/internal/RoomAvatar.kt create mode 100644 libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/components/avatar/internal/SpaceAvatar.kt create mode 100644 libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/components/avatar/internal/TextAvatar.kt create mode 100644 libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/components/avatar/internal/TombstonedRoomAvatar.kt create mode 100644 libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/components/avatar/internal/UserAvatar.kt create mode 100644 libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/components/avatar/internal/UserAvatarPreview.kt create mode 100644 libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/components/blurhash/BlurHashAsyncImage.kt create mode 100644 libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/components/blurhash/BlurHashBackgroundModifier.kt create mode 100644 libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/components/blurhash/BlurHashImage.kt create mode 100644 libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/components/button/BackButton.kt create mode 100644 libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/components/button/ButtonVisuals.kt create mode 100644 libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/components/button/GradientFloatingActionButton.kt create mode 100644 libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/components/button/MainActionButton.kt create mode 100644 libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/components/button/SuperButton.kt create mode 100644 libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/components/dialogs/AlertDialog.kt create mode 100644 libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/components/dialogs/ConfirmationDialog.kt create mode 100644 libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/components/dialogs/ErrorDialog.kt create mode 100644 libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/components/dialogs/ErrorDialogWithDoNotShowAgain.kt create mode 100644 libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/components/dialogs/ListDialog.kt create mode 100644 libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/components/dialogs/ListOption.kt create mode 100644 libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/components/dialogs/MultipleSelectionDialog.kt create mode 100644 libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/components/dialogs/RetryDialog.kt create mode 100644 libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/components/dialogs/SaveChangesDialog.kt create mode 100644 libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/components/dialogs/SingleSelectionDialog.kt create mode 100644 libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/components/dialogs/TextFieldDialog.kt create mode 100644 libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/components/form/TextFieldLocalState.kt create mode 100644 libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/components/list/CheckboxListItem.kt create mode 100644 libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/components/list/ListItemContent.kt create mode 100644 libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/components/list/MultipleSelectionListItem.kt create mode 100644 libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/components/list/RadioButtonListItem.kt create mode 100644 libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/components/list/SingleSelectionListItem.kt create mode 100644 libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/components/list/SwitchListItem.kt create mode 100644 libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/components/list/TextFieldListItem.kt create mode 100644 libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/components/media/DrawScopeWaveformExtensions.kt create mode 100644 libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/components/media/WaveFormSamples.kt create mode 100644 libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/components/media/WaveformPlaybackView.kt create mode 100644 libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/components/preferences/PreferenceCategory.kt create mode 100644 libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/components/preferences/PreferenceCheckbox.kt create mode 100644 libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/components/preferences/PreferenceDivider.kt create mode 100644 libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/components/preferences/PreferenceDropdown.kt create mode 100644 libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/components/preferences/PreferencePage.kt create mode 100644 libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/components/preferences/PreferenceRow.kt create mode 100644 libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/components/preferences/PreferenceSlide.kt create mode 100644 libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/components/preferences/PreferenceSwitch.kt create mode 100644 libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/components/preferences/PreferenceTextField.kt create mode 100644 libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/components/preferences/components/ImageVectorProvider.kt create mode 100644 libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/components/preferences/components/PreferenceIcon.kt create mode 100644 libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/components/tooltip/ElementTooltipDefaults.kt create mode 100644 libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/components/tooltip/PlainTooltip.kt create mode 100644 libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/components/tooltip/TooltipBox.kt create mode 100644 libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/icons/CompoundDrawables.kt create mode 100644 libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/icons/IconsList.kt create mode 100644 libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/icons/IconsPreview.kt create mode 100644 libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/modifiers/ApplyIf.kt create mode 100644 libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/modifiers/Blur.kt create mode 100644 libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/modifiers/ClearFocusOnTap.kt create mode 100644 libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/modifiers/Clickable.kt create mode 100644 libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/modifiers/CornerBorder.kt create mode 100644 libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/modifiers/FadingEdge.kt create mode 100644 libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/modifiers/Gradient.kt create mode 100644 libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/modifiers/Keyboard.kt create mode 100644 libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/modifiers/OnTabOrEnterKeyFocusNext.kt create mode 100644 libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/modifiers/RoundedBackground.kt create mode 100644 libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/modifiers/SquareSizeModifier.kt create mode 100644 libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/preview/ElementPreview.kt create mode 100644 libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/preview/ElementPreviewDark.kt create mode 100644 libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/preview/ElementPreviewLight.kt create mode 100644 libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/preview/ElementThemedPreview.kt create mode 100644 libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/preview/PreviewGroup.kt create mode 100644 libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/preview/PreviewWithLargeHeight.kt create mode 100644 libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/preview/PreviewsDayNight.kt create mode 100644 libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/preview/SheetState.kt create mode 100644 libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/preview/WithFontScale.kt create mode 100644 libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/ruler/HorizontalRuler.kt create mode 100644 libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/ruler/VerticalRuler.kt create mode 100644 libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/ruler/WithRulers.kt create mode 100644 libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/showkase/DesignSystemShowkaseRootModule.kt create mode 100644 libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/swipe/SwipeableActionsState.kt create mode 100644 libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/text/AnnotatedStrings.kt create mode 100644 libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/text/DpScale.kt create mode 100644 libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/text/TextSyleToTypeface.kt create mode 100644 libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/text/UnitConverters.kt create mode 100644 libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/theme/ColorAliases.kt create mode 100644 libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/theme/ElementThemeApp.kt create mode 100644 libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/theme/ElementTypography.kt create mode 100644 libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/theme/TypographyAliases.kt create mode 100644 libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/theme/components/AlertDialogContent.kt create mode 100644 libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/theme/components/BottomSheetDragHandle.kt create mode 100644 libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/theme/components/BottomSheetScaffold.kt create mode 100644 libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/theme/components/Button.kt create mode 100644 libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/theme/components/Checkbox.kt create mode 100644 libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/theme/components/CircularProgressIndicator.kt create mode 100644 libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/theme/components/DropdownMenu.kt create mode 100644 libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/theme/components/DropdownMenuItem.kt create mode 100644 libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/theme/components/FilledTextField.kt create mode 100644 libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/theme/components/FloatingActionButton.kt create mode 100644 libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/theme/components/HorizontalDivider.kt create mode 100644 libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/theme/components/Icon.kt create mode 100644 libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/theme/components/IconButton.kt create mode 100644 libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/theme/components/IconColorButton.kt create mode 100644 libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/theme/components/IconToggleButton.kt create mode 100644 libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/theme/components/LinearProgressIndicator.kt create mode 100644 libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/theme/components/ListItem.kt create mode 100644 libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/theme/components/ListSectionHeader.kt create mode 100644 libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/theme/components/ListSupportingText.kt create mode 100644 libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/theme/components/MediumTopAppBar.kt create mode 100644 libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/theme/components/ModalBottomSheet.kt create mode 100644 libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/theme/components/NavigationBar.kt create mode 100644 libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/theme/components/NavigationBarIcon.kt create mode 100644 libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/theme/components/NavigationBarItem.kt create mode 100644 libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/theme/components/NavigationBarText.kt create mode 100644 libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/theme/components/RadioButton.kt create mode 100644 libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/theme/components/Scaffold.kt create mode 100644 libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/theme/components/SearchBar.kt create mode 100644 libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/theme/components/SearchField.kt create mode 100644 libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/theme/components/SegmentedButton.kt create mode 100644 libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/theme/components/Slider.kt create mode 100644 libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/theme/components/Snackbar.kt create mode 100644 libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/theme/components/Surface.kt create mode 100644 libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/theme/components/Switch.kt create mode 100644 libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/theme/components/Text.kt create mode 100644 libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/theme/components/TextField.kt create mode 100644 libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/theme/components/TopAppBar.kt create mode 100644 libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/theme/components/previews/DatePickerPreview.kt create mode 100644 libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/theme/components/previews/MenuPreview.kt create mode 100644 libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/theme/components/previews/TimePickerPreview.kt create mode 100644 libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/utils/AnnotatedString.kt create mode 100644 libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/utils/BooleanProvider.kt create mode 100644 libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/utils/CommonDrawables.kt create mode 100644 libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/utils/DelayedVisibility.kt create mode 100644 libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/utils/DrawScope.kt create mode 100644 libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/utils/Extensions.kt create mode 100644 libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/utils/ForceOrientation.kt create mode 100644 libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/utils/ForceOrientationInMobileDevices.kt create mode 100644 libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/utils/HideKeyboardWhenDisposed.kt create mode 100644 libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/utils/KeepScreenOn.kt create mode 100644 libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/utils/LazyListState.kt create mode 100644 libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/utils/LocalUiTestMode.kt create mode 100644 libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/utils/OnLifecycleEvent.kt create mode 100644 libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/utils/OpenUrlInTabView.kt create mode 100644 libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/utils/WindowInsetsExtension.kt create mode 100644 libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/utils/snackbar/SnackbarDispatcher.kt create mode 100644 libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/utils/snackbar/SnackbarHost.kt create mode 100644 libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/utils/snackbar/SnackbarMessage.kt create mode 100644 libraries/designsystem/src/main/res/drawable-night-xxhdpi/element_logo.png create mode 100644 libraries/designsystem/src/main/res/drawable-night/bg_migration.png create mode 100644 libraries/designsystem/src/main/res/drawable-night/onboarding_bg.png create mode 100644 libraries/designsystem/src/main/res/drawable-night/pin.xml create mode 100644 libraries/designsystem/src/main/res/drawable-xxhdpi/element_logo.png create mode 100644 libraries/designsystem/src/main/res/drawable/bg_migration.png create mode 100644 libraries/designsystem/src/main/res/drawable/ic_notification.xml create mode 100644 libraries/designsystem/src/main/res/drawable/ic_stop.xml create mode 100644 libraries/designsystem/src/main/res/drawable/ic_winner.xml create mode 100644 libraries/designsystem/src/main/res/drawable/onboarding_bg.png create mode 100644 libraries/designsystem/src/main/res/drawable/pin.xml create mode 100644 libraries/designsystem/src/main/res/drawable/sample_avatar.xml create mode 100644 libraries/designsystem/src/main/res/drawable/sample_background.webp create mode 100644 libraries/designsystem/src/test/kotlin/io/element/android/libraries/designsystem/colors/AvatarColorsTest.kt create mode 100644 libraries/designsystem/src/test/kotlin/io/element/android/libraries/designsystem/component/async/AsyncIndicatorTest.kt create mode 100644 libraries/designsystem/src/test/kotlin/io/element/android/libraries/designsystem/components/avatar/AvatarDataTest.kt create mode 100644 libraries/designsystem/src/test/kotlin/io/element/android/libraries/designsystem/utils/snackbar/SnackbarDispatcherTest.kt create mode 100644 libraries/di/.gitignore create mode 100644 libraries/di/build.gradle.kts create mode 100644 libraries/di/src/main/kotlin/io/element/android/libraries/di/BaseDirectory.kt create mode 100644 libraries/di/src/main/kotlin/io/element/android/libraries/di/CacheDirectory.kt create mode 100644 libraries/di/src/main/kotlin/io/element/android/libraries/di/DependencyInjectionGraphOwner.kt create mode 100644 libraries/di/src/main/kotlin/io/element/android/libraries/di/RoomScope.kt create mode 100644 libraries/di/src/main/kotlin/io/element/android/libraries/di/SessionScope.kt create mode 100644 libraries/di/src/main/kotlin/io/element/android/libraries/di/annotations/AppCoroutineScope.kt create mode 100644 libraries/di/src/main/kotlin/io/element/android/libraries/di/annotations/ApplicationContext.kt create mode 100644 libraries/di/src/main/kotlin/io/element/android/libraries/di/annotations/RoomCoroutineScope.kt create mode 100644 libraries/di/src/main/kotlin/io/element/android/libraries/di/annotations/SessionCoroutineScope.kt create mode 100644 libraries/encrypted-db/build.gradle.kts create mode 100644 libraries/encrypted-db/consumer-proguard-rules.pro create mode 100644 libraries/encrypted-db/src/main/kotlin/io/element/encrypteddb/SqlCipherDriverFactory.kt create mode 100644 libraries/encrypted-db/src/main/kotlin/io/element/encrypteddb/crypto/EncryptedFile.kt create mode 100644 libraries/encrypted-db/src/main/kotlin/io/element/encrypteddb/crypto/EncryptedFileInputStream.kt create mode 100644 libraries/encrypted-db/src/main/kotlin/io/element/encrypteddb/crypto/EncryptedFileOutputStream.kt create mode 100644 libraries/encrypted-db/src/main/kotlin/io/element/encrypteddb/passphrase/PassphraseProvider.kt create mode 100644 libraries/encrypted-db/src/main/kotlin/io/element/encrypteddb/passphrase/RandomSecretPassphraseProvider.kt create mode 100644 libraries/eventformatter/api/build.gradle.kts create mode 100644 libraries/eventformatter/api/src/main/kotlin/io/element/android/libraries/eventformatter/api/PinnedMessagesBannerFormatter.kt create mode 100644 libraries/eventformatter/api/src/main/kotlin/io/element/android/libraries/eventformatter/api/RoomLatestEventFormatter.kt create mode 100644 libraries/eventformatter/api/src/main/kotlin/io/element/android/libraries/eventformatter/api/TimelineEventFormatter.kt create mode 100644 libraries/eventformatter/impl/build.gradle.kts create mode 100644 libraries/eventformatter/impl/src/main/kotlin/io/element/android/libraries/eventformatter/impl/DefaultPinnedMessagesBannerFormatter.kt create mode 100644 libraries/eventformatter/impl/src/main/kotlin/io/element/android/libraries/eventformatter/impl/DefaultRoomLatestEventFormatter.kt create mode 100644 libraries/eventformatter/impl/src/main/kotlin/io/element/android/libraries/eventformatter/impl/DefaultTimelineEventFormatter.kt create mode 100644 libraries/eventformatter/impl/src/main/kotlin/io/element/android/libraries/eventformatter/impl/PrefixWith.kt create mode 100644 libraries/eventformatter/impl/src/main/kotlin/io/element/android/libraries/eventformatter/impl/ProfileChangeContentFormatter.kt create mode 100644 libraries/eventformatter/impl/src/main/kotlin/io/element/android/libraries/eventformatter/impl/RoomMembershipContentFormatter.kt create mode 100644 libraries/eventformatter/impl/src/main/kotlin/io/element/android/libraries/eventformatter/impl/StateContentFormatter.kt create mode 100644 libraries/eventformatter/impl/src/main/kotlin/io/element/android/libraries/eventformatter/impl/mode/RenderingMode.kt create mode 100644 libraries/eventformatter/impl/src/main/res/values-be/translations.xml create mode 100644 libraries/eventformatter/impl/src/main/res/values-bg/translations.xml create mode 100644 libraries/eventformatter/impl/src/main/res/values-cs/translations.xml create mode 100644 libraries/eventformatter/impl/src/main/res/values-cy/translations.xml create mode 100644 libraries/eventformatter/impl/src/main/res/values-da/translations.xml create mode 100644 libraries/eventformatter/impl/src/main/res/values-de/translations.xml create mode 100644 libraries/eventformatter/impl/src/main/res/values-el/translations.xml create mode 100644 libraries/eventformatter/impl/src/main/res/values-es/translations.xml create mode 100644 libraries/eventformatter/impl/src/main/res/values-et/translations.xml create mode 100644 libraries/eventformatter/impl/src/main/res/values-eu/translations.xml create mode 100644 libraries/eventformatter/impl/src/main/res/values-fa/translations.xml create mode 100644 libraries/eventformatter/impl/src/main/res/values-fi/translations.xml create mode 100644 libraries/eventformatter/impl/src/main/res/values-fr/translations.xml create mode 100644 libraries/eventformatter/impl/src/main/res/values-hu/translations.xml create mode 100644 libraries/eventformatter/impl/src/main/res/values-in/translations.xml create mode 100644 libraries/eventformatter/impl/src/main/res/values-it/translations.xml create mode 100644 libraries/eventformatter/impl/src/main/res/values-ka/translations.xml create mode 100644 libraries/eventformatter/impl/src/main/res/values-ko/translations.xml create mode 100644 libraries/eventformatter/impl/src/main/res/values-lt/translations.xml create mode 100644 libraries/eventformatter/impl/src/main/res/values-nb/translations.xml create mode 100644 libraries/eventformatter/impl/src/main/res/values-nl/translations.xml create mode 100644 libraries/eventformatter/impl/src/main/res/values-pl/translations.xml create mode 100644 libraries/eventformatter/impl/src/main/res/values-pt-rBR/translations.xml create mode 100644 libraries/eventformatter/impl/src/main/res/values-pt/translations.xml create mode 100644 libraries/eventformatter/impl/src/main/res/values-ro/translations.xml create mode 100644 libraries/eventformatter/impl/src/main/res/values-ru/translations.xml create mode 100644 libraries/eventformatter/impl/src/main/res/values-sk/translations.xml create mode 100644 libraries/eventformatter/impl/src/main/res/values-sv/translations.xml create mode 100644 libraries/eventformatter/impl/src/main/res/values-tr/translations.xml create mode 100644 libraries/eventformatter/impl/src/main/res/values-uk/translations.xml create mode 100644 libraries/eventformatter/impl/src/main/res/values-ur/translations.xml create mode 100644 libraries/eventformatter/impl/src/main/res/values-uz/translations.xml create mode 100644 libraries/eventformatter/impl/src/main/res/values-zh-rTW/translations.xml create mode 100644 libraries/eventformatter/impl/src/main/res/values-zh/translations.xml create mode 100644 libraries/eventformatter/impl/src/main/res/values/localazy.xml create mode 100644 libraries/eventformatter/impl/src/test/kotlin/io/element/android/libraries/eventformatter/impl/DefaultPinnedMessagesBannerFormatterTest.kt create mode 100644 libraries/eventformatter/impl/src/test/kotlin/io/element/android/libraries/eventformatter/impl/DefaultRoomLatestEventFormatterTest.kt create mode 100644 libraries/eventformatter/test/build.gradle.kts create mode 100644 libraries/eventformatter/test/src/main/kotlin/io/element/android/libraries/eventformatter/test/FakePinnedMessagesBannerFormatter.kt create mode 100644 libraries/eventformatter/test/src/main/kotlin/io/element/android/libraries/eventformatter/test/FakeRoomLatestEventFormatter.kt create mode 100644 libraries/featureflag/api/build.gradle.kts create mode 100644 libraries/featureflag/api/src/main/kotlin/io/element/android/libraries/featureflag/api/Feature.kt create mode 100644 libraries/featureflag/api/src/main/kotlin/io/element/android/libraries/featureflag/api/FeatureFlagService.kt create mode 100644 libraries/featureflag/api/src/main/kotlin/io/element/android/libraries/featureflag/api/FeatureFlags.kt create mode 100644 libraries/featureflag/impl/build.gradle.kts create mode 100644 libraries/featureflag/impl/src/main/kotlin/io/element/android/libraries/featureflag/impl/DefaultFeatureFlagService.kt create mode 100644 libraries/featureflag/impl/src/main/kotlin/io/element/android/libraries/featureflag/impl/FeatureFlagProvider.kt create mode 100644 libraries/featureflag/impl/src/main/kotlin/io/element/android/libraries/featureflag/impl/FeaturesProvider.kt create mode 100644 libraries/featureflag/impl/src/main/kotlin/io/element/android/libraries/featureflag/impl/MutableFeatureFlagProvider.kt create mode 100644 libraries/featureflag/impl/src/main/kotlin/io/element/android/libraries/featureflag/impl/PreferencesFeatureFlagProvider.kt create mode 100644 libraries/featureflag/impl/src/main/kotlin/io/element/android/libraries/featureflag/impl/di/FeatureFlagModule.kt create mode 100644 libraries/featureflag/impl/src/test/kotlin/io/element/android/libraries/featureflag/impl/DefaultFeatureFlagServiceTest.kt create mode 100644 libraries/featureflag/impl/src/test/kotlin/io/element/android/libraries/featureflag/impl/DefaultFeaturesProviderTest.kt create mode 100644 libraries/featureflag/impl/src/test/kotlin/io/element/android/libraries/featureflag/impl/FakeMutableFeatureFlagProvider.kt create mode 100644 libraries/featureflag/test/build.gradle.kts create mode 100644 libraries/featureflag/test/src/main/java/io/element/android/libraries/featureflag/test/FakeFeature.kt create mode 100644 libraries/featureflag/test/src/main/java/io/element/android/libraries/featureflag/test/FakeFeatureFlagService.kt create mode 100644 libraries/featureflag/ui/build.gradle.kts create mode 100644 libraries/featureflag/ui/src/main/kotlin/io/element/android/libraries/featureflag/ui/FeatureListView.kt create mode 100644 libraries/featureflag/ui/src/main/kotlin/io/element/android/libraries/featureflag/ui/model/FeatureUiModel.kt create mode 100644 libraries/featureflag/ui/src/main/kotlin/io/element/android/libraries/featureflag/ui/model/FeatureUiModelProvider.kt create mode 100644 libraries/fullscreenintent/api/build.gradle.kts create mode 100644 libraries/fullscreenintent/api/src/main/kotlin/io/element/android/libraries/fullscreenintent/api/FullScreenIntentPermissionsEvents.kt create mode 100644 libraries/fullscreenintent/api/src/main/kotlin/io/element/android/libraries/fullscreenintent/api/FullScreenIntentPermissionsState.kt create mode 100644 libraries/fullscreenintent/api/src/main/kotlin/io/element/android/libraries/fullscreenintent/api/FullScreenIntentPermissionsStateProvider.kt create mode 100644 libraries/fullscreenintent/impl/build.gradle.kts create mode 100644 libraries/fullscreenintent/impl/src/main/kotlin/io/element/android/libraries/fullscreenintent/impl/FullScreenIntentPermissionsPresenter.kt create mode 100644 libraries/fullscreenintent/impl/src/main/kotlin/io/element/android/libraries/fullscreenintent/impl/di/FullScreenIntentModule.kt create mode 100644 libraries/fullscreenintent/impl/src/test/kotlin/io/element/android/libraries/fullscreenintent/test/FullScreenIntentPermissionsPresenterTest.kt create mode 100644 libraries/indicator/api/build.gradle.kts create mode 100644 libraries/indicator/api/src/main/kotlin/io/element/android/libraries/indicator/api/IndicatorService.kt create mode 100644 libraries/indicator/impl/build.gradle.kts create mode 100644 libraries/indicator/impl/src/main/kotlin/io/element/android/libraries/indicator/impl/DefaultIndicatorService.kt create mode 100644 libraries/indicator/impl/src/test/kotlin/io/element/android/libraries/indicator/impl/DefaultIndicatorServiceTest.kt create mode 100644 libraries/indicator/test/build.gradle.kts create mode 100644 libraries/indicator/test/src/main/kotlin/io/element/android/libraries/indicator/test/FakeIndicatorService.kt create mode 100644 libraries/maplibre-compose/build.gradle.kts create mode 100644 libraries/maplibre-compose/src/main/kotlin/io/element/android/libraries/maplibre/compose/CameraMode.kt create mode 100644 libraries/maplibre-compose/src/main/kotlin/io/element/android/libraries/maplibre/compose/CameraMoveStartedReason.kt create mode 100644 libraries/maplibre-compose/src/main/kotlin/io/element/android/libraries/maplibre/compose/CameraPositionState.kt create mode 100644 libraries/maplibre-compose/src/main/kotlin/io/element/android/libraries/maplibre/compose/IconAnchor.kt create mode 100644 libraries/maplibre-compose/src/main/kotlin/io/element/android/libraries/maplibre/compose/MapApplier.kt create mode 100644 libraries/maplibre-compose/src/main/kotlin/io/element/android/libraries/maplibre/compose/MapLibreMap.kt create mode 100644 libraries/maplibre-compose/src/main/kotlin/io/element/android/libraries/maplibre/compose/MapLibreMapComposable.kt create mode 100644 libraries/maplibre-compose/src/main/kotlin/io/element/android/libraries/maplibre/compose/MapLocationSettings.kt create mode 100644 libraries/maplibre-compose/src/main/kotlin/io/element/android/libraries/maplibre/compose/MapSymbolManagerSettings.kt create mode 100644 libraries/maplibre-compose/src/main/kotlin/io/element/android/libraries/maplibre/compose/MapUiSettings.kt create mode 100644 libraries/maplibre-compose/src/main/kotlin/io/element/android/libraries/maplibre/compose/MapUpdater.kt create mode 100644 libraries/maplibre-compose/src/main/kotlin/io/element/android/libraries/maplibre/compose/Symbol.kt create mode 100644 libraries/matrix/api/build.gradle.kts create mode 100644 libraries/matrix/api/src/main/AndroidManifest.xml create mode 100644 libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/MatrixClient.kt create mode 100644 libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/MatrixClientProvider.kt create mode 100644 libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/SdkMetadata.kt create mode 100644 libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/analytics/ViewRoomExt.kt create mode 100644 libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/auth/AuthErrorCode.kt create mode 100644 libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/auth/AuthenticationException.kt create mode 100644 libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/auth/HomeServerLoginCompatibilityChecker.kt create mode 100644 libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/auth/MatrixAuthenticationService.kt create mode 100644 libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/auth/MatrixHomeServerDetails.kt create mode 100644 libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/auth/OidcConfig.kt create mode 100644 libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/auth/OidcDetails.kt create mode 100644 libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/auth/OidcPrompt.kt create mode 100644 libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/auth/OidcRedirectUrlProvider.kt create mode 100644 libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/auth/external/ExternalSession.kt create mode 100644 libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/auth/qrlogin/MatrixQrCodeLoginData.kt create mode 100644 libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/auth/qrlogin/MatrixQrCodeLoginDataFactory.kt create mode 100644 libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/auth/qrlogin/QrCodeDecodeException.kt create mode 100644 libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/auth/qrlogin/QrCodeLoginStep.kt create mode 100644 libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/auth/qrlogin/QrLoginException.kt create mode 100644 libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/core/DeviceId.kt create mode 100644 libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/core/EventId.kt create mode 100644 libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/core/FlowId.kt create mode 100644 libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/core/MatrixPatterns.kt create mode 100644 libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/core/ProgressCallback.kt create mode 100644 libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/core/RoomAlias.kt create mode 100644 libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/core/RoomId.kt create mode 100644 libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/core/RoomIdOrAlias.kt create mode 100644 libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/core/SendHandle.kt create mode 100644 libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/core/SessionId.kt create mode 100644 libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/core/SpaceId.kt create mode 100644 libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/core/ThreadId.kt create mode 100644 libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/core/TransactionId.kt create mode 100644 libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/core/UniqueId.kt create mode 100644 libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/core/UserId.kt create mode 100644 libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/createroom/CreateRoomParameters.kt create mode 100644 libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/createroom/RoomPreset.kt create mode 100644 libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/encryption/BackupState.kt create mode 100644 libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/encryption/BackupUploadState.kt create mode 100644 libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/encryption/EnableRecoveryProgress.kt create mode 100644 libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/encryption/EncryptionService.kt create mode 100644 libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/encryption/RecoveryException.kt create mode 100644 libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/encryption/RecoveryState.kt create mode 100644 libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/encryption/SteadyStateException.kt create mode 100644 libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/encryption/identity/IdentityState.kt create mode 100644 libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/encryption/identity/IdentityStateChange.kt create mode 100644 libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/exception/ClientException.kt create mode 100644 libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/exception/ErrorKind.kt create mode 100644 libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/exception/NotificationResolverException.kt create mode 100644 libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/media/AudioDetails.kt create mode 100644 libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/media/AudioInfo.kt create mode 100644 libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/media/FileInfo.kt create mode 100644 libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/media/ImageInfo.kt create mode 100644 libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/media/MatrixMediaLoader.kt create mode 100644 libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/media/MediaFile.kt create mode 100644 libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/media/MediaPreviewConfig.kt create mode 100644 libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/media/MediaPreviewService.kt create mode 100644 libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/media/MediaPreviewValue.kt create mode 100644 libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/media/MediaSource.kt create mode 100644 libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/media/MediaUploadHandler.kt create mode 100644 libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/media/ThumbnailInfo.kt create mode 100644 libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/media/VideoInfo.kt create mode 100644 libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/mxc/MxcTools.kt create mode 100644 libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/notification/NotificationData.kt create mode 100644 libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/notification/NotificationService.kt create mode 100644 libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/notificationsettings/NotificationSettingsService.kt create mode 100644 libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/oidc/AccountManagementAction.kt create mode 100644 libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/permalink/MatrixToConverter.kt create mode 100644 libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/permalink/PermalinkBuilder.kt create mode 100644 libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/permalink/PermalinkData.kt create mode 100644 libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/permalink/PermalinkParser.kt create mode 100644 libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/platform/InitPlatformService.kt create mode 100644 libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/poll/PollAnswer.kt create mode 100644 libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/poll/PollKind.kt create mode 100644 libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/pusher/PushersService.kt create mode 100644 libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/pusher/SetHttpPusherData.kt create mode 100644 libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/pusher/UnsetHttpPusherData.kt create mode 100644 libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/room/BaseRoom.kt create mode 100644 libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/room/CreateTimelineParams.kt create mode 100644 libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/room/CurrentUserMembership.kt create mode 100644 libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/room/FilterRoomMembers.kt create mode 100644 libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/room/ForwardEventException.kt create mode 100644 libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/room/IntentionalMention.kt create mode 100644 libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/room/JoinedRoom.kt create mode 100644 libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/room/MessageEventType.kt create mode 100644 libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/room/NotJoinedRoom.kt create mode 100644 libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/room/RoomInfo.kt create mode 100644 libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/room/RoomIsDmCheck.kt create mode 100644 libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/room/RoomMember.kt create mode 100644 libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/room/RoomMembersState.kt create mode 100644 libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/room/RoomMembershipDetails.kt create mode 100644 libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/room/RoomMembershipObserver.kt create mode 100644 libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/room/RoomNotificationSettings.kt create mode 100644 libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/room/RoomNotificationSettingsState.kt create mode 100644 libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/room/RoomType.kt create mode 100644 libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/room/StartDM.kt create mode 100644 libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/room/StateEventType.kt create mode 100644 libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/room/alias/MatrixRoomAlias.kt create mode 100644 libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/room/alias/ResolvedRoomAlias.kt create mode 100644 libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/room/alias/RoomAliasHelper.kt create mode 100644 libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/room/draft/ComposerDraft.kt create mode 100644 libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/room/draft/ComposerDraftType.kt create mode 100644 libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/room/errors/FocusEventException.kt create mode 100644 libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/room/history/RoomHistoryVisibility.kt create mode 100644 libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/room/join/AllowRule.kt create mode 100644 libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/room/join/JoinRoom.kt create mode 100644 libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/room/join/JoinRule.kt create mode 100644 libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/room/knock/KnockRequest.kt create mode 100644 libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/room/location/AssetType.kt create mode 100644 libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/room/powerlevels/MatrixRoomMembersWithRole.kt create mode 100644 libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/room/powerlevels/RoomPowerLevels.kt create mode 100644 libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/room/powerlevels/RoomPowerLevelsValues.kt create mode 100644 libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/room/powerlevels/UserRoleChange.kt create mode 100644 libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/room/preview/RoomPreviewInfo.kt create mode 100644 libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/room/recent/RecentDirectRoom.kt create mode 100644 libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/room/tombstone/PredecessorRoom.kt create mode 100644 libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/room/tombstone/SuccessorRoom.kt create mode 100644 libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/roomdirectory/RoomDescription.kt create mode 100644 libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/roomdirectory/RoomDirectoryList.kt create mode 100644 libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/roomdirectory/RoomDirectoryService.kt create mode 100644 libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/roomdirectory/RoomVisibility.kt create mode 100644 libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/roomlist/DynamicRoomList.kt create mode 100644 libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/roomlist/LatestEventValue.kt create mode 100644 libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/roomlist/RoomList.kt create mode 100644 libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/roomlist/RoomListFilter.kt create mode 100644 libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/roomlist/RoomListService.kt create mode 100644 libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/roomlist/RoomSummary.kt create mode 100644 libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/server/UserServerResolver.kt create mode 100644 libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/spaces/LeaveSpaceHandle.kt create mode 100644 libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/spaces/LeaveSpaceRoom.kt create mode 100644 libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/spaces/SpaceRoom.kt create mode 100644 libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/spaces/SpaceRoomList.kt create mode 100644 libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/spaces/SpaceRoomVisibility.kt create mode 100644 libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/spaces/SpaceService.kt create mode 100644 libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/sync/SlidingSyncVersion.kt create mode 100644 libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/sync/SyncService.kt create mode 100644 libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/sync/SyncState.kt create mode 100644 libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/timeline/MatrixTimelineItem.kt create mode 100644 libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/timeline/ReceiptType.kt create mode 100644 libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/timeline/Timeline.kt create mode 100644 libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/timeline/TimelineException.kt create mode 100644 libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/timeline/TimelineProvider.kt create mode 100644 libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/timeline/item/ThreadSummary.kt create mode 100644 libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/timeline/item/TimelineItemDebugInfo.kt create mode 100644 libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/timeline/item/event/EventContent.kt create mode 100644 libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/timeline/item/event/EventOrTransactionId.kt create mode 100644 libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/timeline/item/event/EventReaction.kt create mode 100644 libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/timeline/item/event/EventTimelineItem.kt create mode 100644 libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/timeline/item/event/EventType.kt create mode 100644 libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/timeline/item/event/FormattedBody.kt create mode 100644 libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/timeline/item/event/InReplyTo.kt create mode 100644 libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/timeline/item/event/LocalEventSendState.kt create mode 100644 libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/timeline/item/event/MembershipChange.kt create mode 100644 libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/timeline/item/event/MessageFormat.kt create mode 100644 libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/timeline/item/event/MessageShield.kt create mode 100644 libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/timeline/item/event/MessageType.kt create mode 100644 libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/timeline/item/event/OtherState.kt create mode 100644 libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/timeline/item/event/ProfileDetails.kt create mode 100644 libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/timeline/item/event/ReactionSender.kt create mode 100644 libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/timeline/item/event/Receipt.kt create mode 100644 libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/timeline/item/event/TimelineItemEventOrigin.kt create mode 100644 libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/timeline/item/event/UtdCause.kt create mode 100644 libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/timeline/item/virtual/VirtualTimelineItem.kt create mode 100644 libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/tracing/LogLevel.kt create mode 100644 libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/tracing/TraceLogPack.kt create mode 100644 libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/tracing/TracingConfiguration.kt create mode 100644 libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/tracing/TracingService.kt create mode 100644 libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/tracing/WriteToFilesConfiguration.kt create mode 100644 libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/user/MatrixSearchUserResults.kt create mode 100644 libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/user/MatrixUser.kt create mode 100644 libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/verification/SessionVerificationData.kt create mode 100644 libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/verification/SessionVerificationRequestDetails.kt create mode 100644 libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/verification/SessionVerificationService.kt create mode 100644 libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/verification/VerificationRequest.kt create mode 100644 libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/widget/CallAnalyticCredentialsProvider.kt create mode 100644 libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/widget/CallWidgetSettingsProvider.kt create mode 100644 libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/widget/MatrixWidgetDriver.kt create mode 100644 libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/widget/MatrixWidgetSettings.kt create mode 100644 libraries/matrix/api/src/test/kotlin/io/element/android/libraries/matrix/api/auth/AuthErrorCodeTest.kt create mode 100644 libraries/matrix/api/src/test/kotlin/io/element/android/libraries/matrix/api/auth/MatrixHomeServerDetailsTest.kt create mode 100644 libraries/matrix/api/src/test/kotlin/io/element/android/libraries/matrix/api/core/MatrixPatternsTest.kt create mode 100644 libraries/matrix/api/src/test/kotlin/io/element/android/libraries/matrix/api/notification/NotificationDataTest.kt create mode 100644 libraries/matrix/api/src/test/kotlin/io/element/android/libraries/matrix/api/room/RoomIsDmCheckTest.kt create mode 100644 libraries/matrix/api/src/test/kotlin/io/element/android/libraries/matrix/api/timeline/item/event/ProfileTimelineDetailsTest.kt create mode 100644 libraries/matrix/impl/build.gradle.kts create mode 100644 libraries/matrix/impl/src/main/AndroidManifest.xml create mode 100644 libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/ClientBuilderProvider.kt create mode 100644 libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/RustClientSessionDelegate.kt create mode 100644 libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/RustMatrixClient.kt create mode 100644 libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/RustMatrixClientFactory.kt create mode 100644 libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/RustSdkMetadata.kt create mode 100644 libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/analytics/JoinedRoomExt.kt create mode 100644 libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/analytics/UtdTracker.kt create mode 100644 libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/auth/AuthenticationException.kt create mode 100644 libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/auth/HomeserverDetails.kt create mode 100644 libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/auth/OidcConfigurationProvider.kt create mode 100644 libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/auth/OidcPrompt.kt create mode 100644 libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/auth/RustHomeServerLoginCompatibilityChecker.kt create mode 100644 libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/auth/RustMatrixAuthenticationService.kt create mode 100644 libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/auth/qrlogin/QrErrorMapper.kt create mode 100644 libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/auth/qrlogin/QrLoginProgressExtensions.kt create mode 100644 libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/auth/qrlogin/RustQrCodeLoginDataFactory.kt create mode 100644 libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/auth/qrlogin/SdkQrCodeLoginData.kt create mode 100644 libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/certificates/DefaultUserCertificatesProvider.kt create mode 100644 libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/certificates/UserCertificatesProvider.kt create mode 100644 libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/core/ProgressWatcherWrapper.kt create mode 100644 libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/core/RustSendHandle.kt create mode 100644 libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/di/RoomModule.kt create mode 100644 libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/di/SessionMatrixModule.kt create mode 100644 libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/encryption/BackupStateMapper.kt create mode 100644 libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/encryption/BackupUploadStateMapper.kt create mode 100644 libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/encryption/EnableRecoveryProgressMapper.kt create mode 100644 libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/encryption/EncryptionExtension.kt create mode 100644 libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/encryption/RecoveryExceptionMapper.kt create mode 100644 libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/encryption/RecoveryStateMapper.kt create mode 100644 libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/encryption/RustEncryptionService.kt create mode 100644 libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/encryption/RustIdentityResetHandle.kt create mode 100644 libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/encryption/SteadyStateExceptionMapper.kt create mode 100644 libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/exception/ClientException.kt create mode 100644 libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/exception/ErrorKind.kt create mode 100644 libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/keys/DefaultPassphraseGenerator.kt create mode 100644 libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/keys/PassphraseGenerator.kt create mode 100644 libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/mapper/IdentityState.kt create mode 100644 libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/mapper/Session.kt create mode 100644 libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/mapper/UserProfileMapper.kt create mode 100644 libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/media/AudioDetails.kt create mode 100644 libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/media/AudioInfo.kt create mode 100644 libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/media/FileInfo.kt create mode 100644 libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/media/ImageInfo.kt create mode 100644 libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/media/MediaSource.kt create mode 100644 libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/media/MediaUploadHandlerImpl.kt create mode 100644 libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/media/RustMediaFile.kt create mode 100644 libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/media/RustMediaLoader.kt create mode 100644 libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/media/RustMediaPreviewService.kt create mode 100644 libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/media/ThumbnailInfo.kt create mode 100644 libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/media/VideoInfo.kt create mode 100644 libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/mxc/DefaultMxcTools.kt create mode 100644 libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/notification/NotificationMapper.kt create mode 100644 libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/notification/RustNotificationService.kt create mode 100644 libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/notification/TimelineEventToNotificationContentMapper.kt create mode 100644 libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/notificationsettings/RoomNotificationSettingsMapper.kt create mode 100644 libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/notificationsettings/RustNotificationSettingsService.kt create mode 100644 libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/oidc/AccountManagementAction.kt create mode 100644 libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/paths/SessionPaths.kt create mode 100644 libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/paths/SessionPathsFactory.kt create mode 100644 libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/permalink/DefaultMatrixToConverter.kt create mode 100644 libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/permalink/DefaultPermalinkBuilder.kt create mode 100644 libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/permalink/DefaultPermalinkParser.kt create mode 100644 libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/platform/RustInitPlatformService.kt create mode 100644 libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/poll/PollAnswer.kt create mode 100644 libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/poll/PollKind.kt create mode 100644 libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/proxy/DefaultProxyProvider.kt create mode 100644 libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/proxy/ProxyProvider.kt create mode 100644 libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/pushers/RustPushersService.kt create mode 100644 libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/room/FocusEventException.kt create mode 100644 libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/room/JoinedRustRoom.kt create mode 100644 libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/room/Mention.kt create mode 100644 libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/room/MessageEventType.kt create mode 100644 libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/room/NotJoinedRustRoom.kt create mode 100644 libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/room/RoomContentForwarder.kt create mode 100644 libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/room/RoomInfoExt.kt create mode 100644 libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/room/RoomInfoMapper.kt create mode 100644 libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/room/RoomSyncSubscriber.kt create mode 100644 libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/room/RoomType.kt create mode 100644 libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/room/RustBaseRoom.kt create mode 100644 libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/room/RustRoomFactory.kt create mode 100644 libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/room/StateEventType.kt create mode 100644 libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/room/TimelineEventTypeFilterFactory.kt create mode 100644 libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/room/alias/DefaultRoomAliasHelper.kt create mode 100644 libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/room/draft/ComposerDraftMapper.kt create mode 100644 libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/room/history/RoomHistoryVisibilityMapper.kt create mode 100644 libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/room/join/AllowRule.kt create mode 100644 libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/room/join/DefaultJoinRoom.kt create mode 100644 libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/room/join/JoinRule.kt create mode 100644 libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/room/knock/RustKnockRequest.kt create mode 100644 libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/room/location/AssetType.kt create mode 100644 libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/room/member/RoomMemberListFetcher.kt create mode 100644 libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/room/member/RoomMemberMapper.kt create mode 100644 libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/room/powerlevels/RoomPowerLevelsValuesMapper.kt create mode 100644 libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/room/preview/RoomPreviewInfoMapper.kt create mode 100644 libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/room/tombstone/PredecessorRoom.kt create mode 100644 libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/room/tombstone/SuccessorRoom.kt create mode 100644 libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/roomdirectory/RoomDescriptionMapper.kt create mode 100644 libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/roomdirectory/RoomDirectorySearchExtension.kt create mode 100644 libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/roomdirectory/RoomDirectorySearchProcessor.kt create mode 100644 libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/roomdirectory/RoomVisibilityMapper.kt create mode 100644 libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/roomdirectory/RustRoomDirectoryList.kt create mode 100644 libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/roomdirectory/RustRoomDirectoryService.kt create mode 100644 libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/roomlist/RoomListDynamicEvents.kt create mode 100644 libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/roomlist/RoomListEntriesUpdateExt.kt create mode 100644 libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/roomlist/RoomListExtensions.kt create mode 100644 libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/roomlist/RoomListFactory.kt create mode 100644 libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/roomlist/RoomListFilter.kt create mode 100644 libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/roomlist/RoomSummaryFactory.kt create mode 100644 libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/roomlist/RoomSummaryListProcessor.kt create mode 100644 libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/roomlist/RustRoomListService.kt create mode 100644 libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/server/DefaultUserServerResolver.kt create mode 100644 libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/spaces/RustLeaveSpaceHandle.kt create mode 100644 libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/spaces/RustSpaceRoomList.kt create mode 100644 libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/spaces/RustSpaceService.kt create mode 100644 libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/spaces/SpaceListUpdateProcessor.kt create mode 100644 libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/spaces/SpaceRoomListExtensions.kt create mode 100644 libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/spaces/SpaceRoomMapper.kt create mode 100644 libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/sync/AppStateMapper.kt create mode 100644 libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/sync/RustSyncService.kt create mode 100644 libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/sync/SlidingSyncVersion.kt create mode 100644 libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/sync/SyncServiceExtension.kt create mode 100644 libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/timeline/EventOrTransactionId.kt create mode 100644 libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/timeline/MatrixTimelineDiffProcessor.kt create mode 100644 libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/timeline/MatrixTimelineItemMapper.kt create mode 100644 libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/timeline/ReceiptTypeMapper.kt create mode 100644 libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/timeline/RoomTimelineExtensions.kt create mode 100644 libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/timeline/RustTimeline.kt create mode 100644 libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/timeline/TimelineItemsSubscriber.kt create mode 100644 libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/timeline/item/event/EventMessageMapper.kt create mode 100644 libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/timeline/item/event/EventOrTransactionIdExtension.kt create mode 100644 libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/timeline/item/event/EventTimelineItemMapper.kt create mode 100644 libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/timeline/item/event/TimelineEventContentMapper.kt create mode 100644 libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/timeline/item/virtual/VirtualTimelineItemMapper.kt create mode 100644 libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/timeline/postprocessor/LastForwardIndicatorsPostProcessor.kt create mode 100644 libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/timeline/postprocessor/LoadingIndicatorsPostProcessor.kt create mode 100644 libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/timeline/postprocessor/RoomBeginningPostProcessor.kt create mode 100644 libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/timeline/postprocessor/TypingNotificationPostProcessor.kt create mode 100644 libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/timeline/reply/InReplyToMapper.kt create mode 100644 libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/tracing/LogEventLocation.kt create mode 100644 libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/tracing/RustTracingService.kt create mode 100644 libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/tracing/RustTracingTree.kt create mode 100644 libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/tracing/TraceLogPacksMapping.kt create mode 100644 libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/usersearch/UserSearchResultMapper.kt create mode 100644 libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/util/CallbackFlow.kt create mode 100644 libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/util/Disposables.kt create mode 100644 libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/util/Error.kt create mode 100644 libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/util/MessageEventContent.kt create mode 100644 libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/util/SessionPathsProvider.kt create mode 100644 libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/util/TaskHandle.kt create mode 100644 libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/util/Token.kt create mode 100644 libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/verification/RustSessionVerificationService.kt create mode 100644 libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/verification/SessionVerificationRequestDetails.kt create mode 100644 libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/widget/DefaultCallWidgetSettingsProvider.kt create mode 100644 libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/widget/MatrixWidgetSettings.kt create mode 100644 libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/widget/RustWidgetDriver.kt create mode 100644 libraries/matrix/impl/src/test/kotlin/io/element/android/libraries/matrix/impl/FakeClientBuilderProvider.kt create mode 100644 libraries/matrix/impl/src/test/kotlin/io/element/android/libraries/matrix/impl/RustClientSessionDelegateTest.kt create mode 100644 libraries/matrix/impl/src/test/kotlin/io/element/android/libraries/matrix/impl/RustMatrixClientFactoryTest.kt create mode 100644 libraries/matrix/impl/src/test/kotlin/io/element/android/libraries/matrix/impl/RustMatrixClientTest.kt create mode 100644 libraries/matrix/impl/src/test/kotlin/io/element/android/libraries/matrix/impl/analytics/JoinedExtKtTest.kt create mode 100644 libraries/matrix/impl/src/test/kotlin/io/element/android/libraries/matrix/impl/analytics/UtdTrackerTest.kt create mode 100644 libraries/matrix/impl/src/test/kotlin/io/element/android/libraries/matrix/impl/auth/AuthenticationExceptionMappingTest.kt create mode 100644 libraries/matrix/impl/src/test/kotlin/io/element/android/libraries/matrix/impl/auth/FakePassphraseGenerator.kt create mode 100644 libraries/matrix/impl/src/test/kotlin/io/element/android/libraries/matrix/impl/auth/FakeProxyProvider.kt create mode 100644 libraries/matrix/impl/src/test/kotlin/io/element/android/libraries/matrix/impl/auth/FakeUserCertificatesProvider.kt create mode 100644 libraries/matrix/impl/src/test/kotlin/io/element/android/libraries/matrix/impl/auth/HomeserverDetailsKtTest.kt create mode 100644 libraries/matrix/impl/src/test/kotlin/io/element/android/libraries/matrix/impl/auth/OidcConfigurationProviderTest.kt create mode 100644 libraries/matrix/impl/src/test/kotlin/io/element/android/libraries/matrix/impl/auth/RustHomeserverLoginCompatibilityCheckerTest.kt create mode 100644 libraries/matrix/impl/src/test/kotlin/io/element/android/libraries/matrix/impl/auth/RustMatrixAuthenticationServiceTest.kt create mode 100644 libraries/matrix/impl/src/test/kotlin/io/element/android/libraries/matrix/impl/auth/qrlogin/QrErrorMapperTest.kt create mode 100644 libraries/matrix/impl/src/test/kotlin/io/element/android/libraries/matrix/impl/auth/qrlogin/QrLoginProgressExtensionsKtTest.kt create mode 100644 libraries/matrix/impl/src/test/kotlin/io/element/android/libraries/matrix/impl/auth/qrlogin/SdkQrCodeLoginDataTest.kt create mode 100644 libraries/matrix/impl/src/test/kotlin/io/element/android/libraries/matrix/impl/core/ProgressWatcherWrapperKtTest.kt create mode 100644 libraries/matrix/impl/src/test/kotlin/io/element/android/libraries/matrix/impl/encryption/BackupStateMapperTest.kt create mode 100644 libraries/matrix/impl/src/test/kotlin/io/element/android/libraries/matrix/impl/encryption/BackupUploadStateMapperTest.kt create mode 100644 libraries/matrix/impl/src/test/kotlin/io/element/android/libraries/matrix/impl/encryption/EnableRecoveryProgressMapperTest.kt create mode 100644 libraries/matrix/impl/src/test/kotlin/io/element/android/libraries/matrix/impl/encryption/RecoveryStateMapperTest.kt create mode 100644 libraries/matrix/impl/src/test/kotlin/io/element/android/libraries/matrix/impl/fixtures/factories/EventTimelineItem.kt create mode 100644 libraries/matrix/impl/src/test/kotlin/io/element/android/libraries/matrix/impl/fixtures/factories/EventTimelineItemContent.kt create mode 100644 libraries/matrix/impl/src/test/kotlin/io/element/android/libraries/matrix/impl/fixtures/factories/EventTimelineItemDebugInfo.kt create mode 100644 libraries/matrix/impl/src/test/kotlin/io/element/android/libraries/matrix/impl/fixtures/factories/NotificationItem.kt create mode 100644 libraries/matrix/impl/src/test/kotlin/io/element/android/libraries/matrix/impl/fixtures/factories/RoomDescription.kt create mode 100644 libraries/matrix/impl/src/test/kotlin/io/element/android/libraries/matrix/impl/fixtures/factories/RoomHero.kt create mode 100644 libraries/matrix/impl/src/test/kotlin/io/element/android/libraries/matrix/impl/fixtures/factories/RoomInfo.kt create mode 100644 libraries/matrix/impl/src/test/kotlin/io/element/android/libraries/matrix/impl/fixtures/factories/RoomMember.kt create mode 100644 libraries/matrix/impl/src/test/kotlin/io/element/android/libraries/matrix/impl/fixtures/factories/RoomNotificationSettings.kt create mode 100644 libraries/matrix/impl/src/test/kotlin/io/element/android/libraries/matrix/impl/fixtures/factories/RoomPowerLevels.kt create mode 100644 libraries/matrix/impl/src/test/kotlin/io/element/android/libraries/matrix/impl/fixtures/factories/RoomPreviewInfo.kt create mode 100644 libraries/matrix/impl/src/test/kotlin/io/element/android/libraries/matrix/impl/fixtures/factories/SearchUsersResults.kt create mode 100644 libraries/matrix/impl/src/test/kotlin/io/element/android/libraries/matrix/impl/fixtures/factories/Session.kt create mode 100644 libraries/matrix/impl/src/test/kotlin/io/element/android/libraries/matrix/impl/fixtures/factories/SpaceRoom.kt create mode 100644 libraries/matrix/impl/src/test/kotlin/io/element/android/libraries/matrix/impl/fixtures/factories/TimelineEventType.kt create mode 100644 libraries/matrix/impl/src/test/kotlin/io/element/android/libraries/matrix/impl/fixtures/factories/UnableToDecryptInfo.kt create mode 100644 libraries/matrix/impl/src/test/kotlin/io/element/android/libraries/matrix/impl/fixtures/factories/UserProfile.kt create mode 100644 libraries/matrix/impl/src/test/kotlin/io/element/android/libraries/matrix/impl/fixtures/fakes/FakeFfiClient.kt create mode 100644 libraries/matrix/impl/src/test/kotlin/io/element/android/libraries/matrix/impl/fixtures/fakes/FakeFfiClientBuilder.kt create mode 100644 libraries/matrix/impl/src/test/kotlin/io/element/android/libraries/matrix/impl/fixtures/fakes/FakeFfiEncryption.kt create mode 100644 libraries/matrix/impl/src/test/kotlin/io/element/android/libraries/matrix/impl/fixtures/fakes/FakeFfiHomeserverLoginDetails.kt create mode 100644 libraries/matrix/impl/src/test/kotlin/io/element/android/libraries/matrix/impl/fixtures/fakes/FakeFfiLazyTimelineItemProvider.kt create mode 100644 libraries/matrix/impl/src/test/kotlin/io/element/android/libraries/matrix/impl/fixtures/fakes/FakeFfiNotificationClient.kt create mode 100644 libraries/matrix/impl/src/test/kotlin/io/element/android/libraries/matrix/impl/fixtures/fakes/FakeFfiNotificationSettings.kt create mode 100644 libraries/matrix/impl/src/test/kotlin/io/element/android/libraries/matrix/impl/fixtures/fakes/FakeFfiQrCodeData.kt create mode 100644 libraries/matrix/impl/src/test/kotlin/io/element/android/libraries/matrix/impl/fixtures/fakes/FakeFfiRoom.kt create mode 100644 libraries/matrix/impl/src/test/kotlin/io/element/android/libraries/matrix/impl/fixtures/fakes/FakeFfiRoomDirectorySearch.kt create mode 100644 libraries/matrix/impl/src/test/kotlin/io/element/android/libraries/matrix/impl/fixtures/fakes/FakeFfiRoomList.kt create mode 100644 libraries/matrix/impl/src/test/kotlin/io/element/android/libraries/matrix/impl/fixtures/fakes/FakeFfiRoomListService.kt create mode 100644 libraries/matrix/impl/src/test/kotlin/io/element/android/libraries/matrix/impl/fixtures/fakes/FakeFfiRoomMembersIterator.kt create mode 100644 libraries/matrix/impl/src/test/kotlin/io/element/android/libraries/matrix/impl/fixtures/fakes/FakeFfiRoomPowerLevels.kt create mode 100644 libraries/matrix/impl/src/test/kotlin/io/element/android/libraries/matrix/impl/fixtures/fakes/FakeFfiSessionVerificationController.kt create mode 100644 libraries/matrix/impl/src/test/kotlin/io/element/android/libraries/matrix/impl/fixtures/fakes/FakeFfiSpaceRoomList.kt create mode 100644 libraries/matrix/impl/src/test/kotlin/io/element/android/libraries/matrix/impl/fixtures/fakes/FakeFfiSpaceService.kt create mode 100644 libraries/matrix/impl/src/test/kotlin/io/element/android/libraries/matrix/impl/fixtures/fakes/FakeFfiSyncService.kt create mode 100644 libraries/matrix/impl/src/test/kotlin/io/element/android/libraries/matrix/impl/fixtures/fakes/FakeFfiSyncServiceBuilder.kt create mode 100644 libraries/matrix/impl/src/test/kotlin/io/element/android/libraries/matrix/impl/fixtures/fakes/FakeFfiTaskHandle.kt create mode 100644 libraries/matrix/impl/src/test/kotlin/io/element/android/libraries/matrix/impl/fixtures/fakes/FakeFfiTimeline.kt create mode 100644 libraries/matrix/impl/src/test/kotlin/io/element/android/libraries/matrix/impl/fixtures/fakes/FakeFfiTimelineEvent.kt create mode 100644 libraries/matrix/impl/src/test/kotlin/io/element/android/libraries/matrix/impl/fixtures/fakes/FakeFfiTimelineEventTypeFilter.kt create mode 100644 libraries/matrix/impl/src/test/kotlin/io/element/android/libraries/matrix/impl/fixtures/fakes/FakeFfiTimelineItem.kt create mode 100644 libraries/matrix/impl/src/test/kotlin/io/element/android/libraries/matrix/impl/keys/DefaultPassphraseGeneratorTest.kt create mode 100644 libraries/matrix/impl/src/test/kotlin/io/element/android/libraries/matrix/impl/mapper/SessionKtTest.kt create mode 100644 libraries/matrix/impl/src/test/kotlin/io/element/android/libraries/matrix/impl/mapper/UserProfileMapperTest.kt create mode 100644 libraries/matrix/impl/src/test/kotlin/io/element/android/libraries/matrix/impl/mxc/DefaultMxcToolsTest.kt create mode 100644 libraries/matrix/impl/src/test/kotlin/io/element/android/libraries/matrix/impl/notification/RustNotificationServiceTest.kt create mode 100644 libraries/matrix/impl/src/test/kotlin/io/element/android/libraries/matrix/impl/notificationsettings/RustNotificationSettingsServiceTest.kt create mode 100644 libraries/matrix/impl/src/test/kotlin/io/element/android/libraries/matrix/impl/oidc/AccountManagementActionKtTest.kt create mode 100644 libraries/matrix/impl/src/test/kotlin/io/element/android/libraries/matrix/impl/permalink/DefaultMatrixToConverterTest.kt create mode 100644 libraries/matrix/impl/src/test/kotlin/io/element/android/libraries/matrix/impl/poll/PollKindKtTest.kt create mode 100644 libraries/matrix/impl/src/test/kotlin/io/element/android/libraries/matrix/impl/pushers/RustPushersServiceTest.kt create mode 100644 libraries/matrix/impl/src/test/kotlin/io/element/android/libraries/matrix/impl/room/FakeTimelineEventTypeFilterFactory.kt create mode 100644 libraries/matrix/impl/src/test/kotlin/io/element/android/libraries/matrix/impl/room/MessageEventTypeKtTest.kt create mode 100644 libraries/matrix/impl/src/test/kotlin/io/element/android/libraries/matrix/impl/room/RoomInfoExtTest.kt create mode 100644 libraries/matrix/impl/src/test/kotlin/io/element/android/libraries/matrix/impl/room/RoomInfoMapperTest.kt create mode 100644 libraries/matrix/impl/src/test/kotlin/io/element/android/libraries/matrix/impl/room/RoomTypeKtTest.kt create mode 100644 libraries/matrix/impl/src/test/kotlin/io/element/android/libraries/matrix/impl/room/RustBaseRoomTest.kt create mode 100644 libraries/matrix/impl/src/test/kotlin/io/element/android/libraries/matrix/impl/room/StateEventTypeTest.kt create mode 100644 libraries/matrix/impl/src/test/kotlin/io/element/android/libraries/matrix/impl/room/join/DefaultJoinRoomTest.kt create mode 100644 libraries/matrix/impl/src/test/kotlin/io/element/android/libraries/matrix/impl/room/location/AssetTypeKtTest.kt create mode 100644 libraries/matrix/impl/src/test/kotlin/io/element/android/libraries/matrix/impl/room/member/RoomMemberListFetcherTest.kt create mode 100644 libraries/matrix/impl/src/test/kotlin/io/element/android/libraries/matrix/impl/room/member/RoomMemberMapperTest.kt create mode 100644 libraries/matrix/impl/src/test/kotlin/io/element/android/libraries/matrix/impl/room/powerlevels/RoomPowerLevelsValuesMapperTest.kt create mode 100644 libraries/matrix/impl/src/test/kotlin/io/element/android/libraries/matrix/impl/room/preview/RoomPreviewInfoMapperTest.kt create mode 100644 libraries/matrix/impl/src/test/kotlin/io/element/android/libraries/matrix/impl/roomdirectory/RoomDescriptionMapperTest.kt create mode 100644 libraries/matrix/impl/src/test/kotlin/io/element/android/libraries/matrix/impl/roomdirectory/RoomDirectorySearchProcessorTest.kt create mode 100644 libraries/matrix/impl/src/test/kotlin/io/element/android/libraries/matrix/impl/roomdirectory/RustBaseRoomDirectoryListTest.kt create mode 100644 libraries/matrix/impl/src/test/kotlin/io/element/android/libraries/matrix/impl/roomdirectory/RustBaseRoomDirectoryServiceTest.kt create mode 100644 libraries/matrix/impl/src/test/kotlin/io/element/android/libraries/matrix/impl/roomlist/RoomListFactoryTest.kt create mode 100644 libraries/matrix/impl/src/test/kotlin/io/element/android/libraries/matrix/impl/roomlist/RoomListFilterTest.kt create mode 100644 libraries/matrix/impl/src/test/kotlin/io/element/android/libraries/matrix/impl/roomlist/RoomSummaryListProcessorTest.kt create mode 100644 libraries/matrix/impl/src/test/kotlin/io/element/android/libraries/matrix/impl/roomlist/RustBaseRoomListServiceTest.kt create mode 100644 libraries/matrix/impl/src/test/kotlin/io/element/android/libraries/matrix/impl/server/DefaultUserServerResolverTest.kt create mode 100644 libraries/matrix/impl/src/test/kotlin/io/element/android/libraries/matrix/impl/spaces/RoomSummaryListProcessorTest.kt create mode 100644 libraries/matrix/impl/src/test/kotlin/io/element/android/libraries/matrix/impl/spaces/RustSpaceRoomListTest.kt create mode 100644 libraries/matrix/impl/src/test/kotlin/io/element/android/libraries/matrix/impl/sync/AppStateMapperKtTest.kt create mode 100644 libraries/matrix/impl/src/test/kotlin/io/element/android/libraries/matrix/impl/timeline/MatrixTimelineDiffProcessorTest.kt create mode 100644 libraries/matrix/impl/src/test/kotlin/io/element/android/libraries/matrix/impl/timeline/ReceiptTypeMapperKtTest.kt create mode 100644 libraries/matrix/impl/src/test/kotlin/io/element/android/libraries/matrix/impl/timeline/RustTimelineTest.kt create mode 100644 libraries/matrix/impl/src/test/kotlin/io/element/android/libraries/matrix/impl/timeline/TimelineItemsSubscriberTest.kt create mode 100644 libraries/matrix/impl/src/test/kotlin/io/element/android/libraries/matrix/impl/timeline/postprocessor/Fixtures.kt create mode 100644 libraries/matrix/impl/src/test/kotlin/io/element/android/libraries/matrix/impl/timeline/postprocessor/LastForwardIndicatorsPostProcessorTest.kt create mode 100644 libraries/matrix/impl/src/test/kotlin/io/element/android/libraries/matrix/impl/timeline/postprocessor/LoadingIndicatorsPostProcessorTest.kt create mode 100644 libraries/matrix/impl/src/test/kotlin/io/element/android/libraries/matrix/impl/timeline/postprocessor/RoomBeginningPostProcessorTest.kt create mode 100644 libraries/matrix/impl/src/test/kotlin/io/element/android/libraries/matrix/impl/usersearch/UserSearchResultMapperTest.kt create mode 100644 libraries/matrix/impl/src/test/kotlin/io/element/android/libraries/matrix/impl/util/SessionPathsProviderTest.kt create mode 100644 libraries/matrix/test/build.gradle.kts create mode 100644 libraries/matrix/test/src/main/AndroidManifest.xml create mode 100644 libraries/matrix/test/src/main/kotlin/io/element/android/libraries/matrix/test/FakeMatrixClient.kt create mode 100644 libraries/matrix/test/src/main/kotlin/io/element/android/libraries/matrix/test/FakeMatrixClientProvider.kt create mode 100644 libraries/matrix/test/src/main/kotlin/io/element/android/libraries/matrix/test/FakeSdkMetadata.kt create mode 100644 libraries/matrix/test/src/main/kotlin/io/element/android/libraries/matrix/test/TestData.kt create mode 100644 libraries/matrix/test/src/main/kotlin/io/element/android/libraries/matrix/test/auth/FakeHomeServerLoginCompatibilityChecker.kt create mode 100644 libraries/matrix/test/src/main/kotlin/io/element/android/libraries/matrix/test/auth/FakeMatrixAuthenticationService.kt create mode 100644 libraries/matrix/test/src/main/kotlin/io/element/android/libraries/matrix/test/auth/FakeOidcRedirectUrlProvider.kt create mode 100644 libraries/matrix/test/src/main/kotlin/io/element/android/libraries/matrix/test/auth/MatrixHomeServerDetails.kt create mode 100644 libraries/matrix/test/src/main/kotlin/io/element/android/libraries/matrix/test/auth/qrlogin/FakeMatrixQrCodeLoginDataFactory.kt create mode 100644 libraries/matrix/test/src/main/kotlin/io/element/android/libraries/matrix/test/core/BuildMeta.kt create mode 100644 libraries/matrix/test/src/main/kotlin/io/element/android/libraries/matrix/test/core/FakeSendHandle.kt create mode 100644 libraries/matrix/test/src/main/kotlin/io/element/android/libraries/matrix/test/encryption/FakeEncryptionService.kt create mode 100644 libraries/matrix/test/src/main/kotlin/io/element/android/libraries/matrix/test/encryption/FakeIdentityResetHandle.kt create mode 100644 libraries/matrix/test/src/main/kotlin/io/element/android/libraries/matrix/test/media/FakeMatrixMediaLoader.kt create mode 100644 libraries/matrix/test/src/main/kotlin/io/element/android/libraries/matrix/test/media/FakeMediaFile.kt create mode 100644 libraries/matrix/test/src/main/kotlin/io/element/android/libraries/matrix/test/media/FakeMediaPreviewService.kt create mode 100644 libraries/matrix/test/src/main/kotlin/io/element/android/libraries/matrix/test/media/FakeMediaUploadHandler.kt create mode 100644 libraries/matrix/test/src/main/kotlin/io/element/android/libraries/matrix/test/media/MediaSource.kt create mode 100644 libraries/matrix/test/src/main/kotlin/io/element/android/libraries/matrix/test/mxc/FakeMxcTools.kt create mode 100644 libraries/matrix/test/src/main/kotlin/io/element/android/libraries/matrix/test/notification/FakeNotificationService.kt create mode 100644 libraries/matrix/test/src/main/kotlin/io/element/android/libraries/matrix/test/notification/NotificationData.kt create mode 100644 libraries/matrix/test/src/main/kotlin/io/element/android/libraries/matrix/test/notificationsettings/FakeNotificationSettingsService.kt create mode 100644 libraries/matrix/test/src/main/kotlin/io/element/android/libraries/matrix/test/permalink/FakePermalinkBuilder.kt create mode 100644 libraries/matrix/test/src/main/kotlin/io/element/android/libraries/matrix/test/permalink/FakePermalinkParser.kt create mode 100644 libraries/matrix/test/src/main/kotlin/io/element/android/libraries/matrix/test/pushers/FakePushersService.kt create mode 100644 libraries/matrix/test/src/main/kotlin/io/element/android/libraries/matrix/test/room/FakeBaseRoom.kt create mode 100644 libraries/matrix/test/src/main/kotlin/io/element/android/libraries/matrix/test/room/FakeJoinedRoom.kt create mode 100644 libraries/matrix/test/src/main/kotlin/io/element/android/libraries/matrix/test/room/FakeNotJoinedRoom.kt create mode 100644 libraries/matrix/test/src/main/kotlin/io/element/android/libraries/matrix/test/room/LatestEventValueFixture.kt create mode 100644 libraries/matrix/test/src/main/kotlin/io/element/android/libraries/matrix/test/room/RoomInfoFixture.kt create mode 100644 libraries/matrix/test/src/main/kotlin/io/element/android/libraries/matrix/test/room/RoomMemberFixture.kt create mode 100644 libraries/matrix/test/src/main/kotlin/io/element/android/libraries/matrix/test/room/RoomPreviewInfoFixture.kt create mode 100644 libraries/matrix/test/src/main/kotlin/io/element/android/libraries/matrix/test/room/RoomSummaryFixture.kt create mode 100644 libraries/matrix/test/src/main/kotlin/io/element/android/libraries/matrix/test/room/alias/FakeRoomAliasHelper.kt create mode 100644 libraries/matrix/test/src/main/kotlin/io/element/android/libraries/matrix/test/room/join/FakeJoinRoom.kt create mode 100644 libraries/matrix/test/src/main/kotlin/io/element/android/libraries/matrix/test/room/knock/FakeKnockRequest.kt create mode 100644 libraries/matrix/test/src/main/kotlin/io/element/android/libraries/matrix/test/roomdirectory/FakeRoomDirectoryList.kt create mode 100644 libraries/matrix/test/src/main/kotlin/io/element/android/libraries/matrix/test/roomdirectory/FakeRoomDirectoryService.kt create mode 100644 libraries/matrix/test/src/main/kotlin/io/element/android/libraries/matrix/test/roomdirectory/RoomDescriptionFixture.kt create mode 100644 libraries/matrix/test/src/main/kotlin/io/element/android/libraries/matrix/test/roomlist/FakeRoomListService.kt create mode 100644 libraries/matrix/test/src/main/kotlin/io/element/android/libraries/matrix/test/roomlist/SimplePagedRoomList.kt create mode 100644 libraries/matrix/test/src/main/kotlin/io/element/android/libraries/matrix/test/spaces/FakeLeaveSpaceHandle.kt create mode 100644 libraries/matrix/test/src/main/kotlin/io/element/android/libraries/matrix/test/spaces/FakeSpaceRoomList.kt create mode 100644 libraries/matrix/test/src/main/kotlin/io/element/android/libraries/matrix/test/spaces/FakeSpaceService.kt create mode 100644 libraries/matrix/test/src/main/kotlin/io/element/android/libraries/matrix/test/sync/FakeSyncService.kt create mode 100644 libraries/matrix/test/src/main/kotlin/io/element/android/libraries/matrix/test/timeline/FakeTimeline.kt create mode 100644 libraries/matrix/test/src/main/kotlin/io/element/android/libraries/matrix/test/timeline/FakeTimelineProvider.kt create mode 100644 libraries/matrix/test/src/main/kotlin/io/element/android/libraries/matrix/test/timeline/LiveTimelineProvider.kt create mode 100644 libraries/matrix/test/src/main/kotlin/io/element/android/libraries/matrix/test/timeline/TimelineFixture.kt create mode 100644 libraries/matrix/test/src/main/kotlin/io/element/android/libraries/matrix/test/timeline/item/event/Fixture.kt create mode 100644 libraries/matrix/test/src/main/kotlin/io/element/android/libraries/matrix/test/tracing/FakeTracingService.kt create mode 100644 libraries/matrix/test/src/main/kotlin/io/element/android/libraries/matrix/test/verification/FakeSessionVerificationService.kt create mode 100644 libraries/matrix/test/src/main/kotlin/io/element/android/libraries/matrix/test/widget/FakeCallWidgetSettingsProvider.kt create mode 100644 libraries/matrix/test/src/main/kotlin/io/element/android/libraries/matrix/test/widget/FakeMatrixWidgetDriver.kt create mode 100644 libraries/matrixmedia/api/build.gradle.kts create mode 100644 libraries/matrixmedia/api/src/main/kotlin/io/element/android/libraries/matrix/ui/media/Avatar.kt create mode 100644 libraries/matrixmedia/api/src/main/kotlin/io/element/android/libraries/matrix/ui/media/ImageLoaderHolder.kt create mode 100644 libraries/matrixmedia/api/src/main/kotlin/io/element/android/libraries/matrix/ui/media/InitialsAvatarBitmapGenerator.kt create mode 100644 libraries/matrixmedia/api/src/main/kotlin/io/element/android/libraries/matrix/ui/media/MediaRequestData.kt create mode 100644 libraries/matrixmedia/impl/build.gradle.kts create mode 100644 libraries/matrixmedia/impl/src/main/kotlin/io/element/android/libraries/matrix/ui/media/AvatarDataExt.kt create mode 100644 libraries/matrixmedia/impl/src/main/kotlin/io/element/android/libraries/matrix/ui/media/AvatarDataFetcherFactory.kt create mode 100644 libraries/matrixmedia/impl/src/main/kotlin/io/element/android/libraries/matrix/ui/media/CoilMediaFetcher.kt create mode 100644 libraries/matrixmedia/impl/src/main/kotlin/io/element/android/libraries/matrix/ui/media/DefaultImageLoaderHolder.kt create mode 100644 libraries/matrixmedia/impl/src/main/kotlin/io/element/android/libraries/matrix/ui/media/DefaultInitialsAvatarBitmapGenerator.kt create mode 100644 libraries/matrixmedia/impl/src/main/kotlin/io/element/android/libraries/matrix/ui/media/ImageLoaderFactories.kt create mode 100644 libraries/matrixmedia/impl/src/main/kotlin/io/element/android/libraries/matrix/ui/media/MediaRequestDataFetcherFactory.kt create mode 100644 libraries/matrixmedia/impl/src/main/kotlin/io/element/android/libraries/matrix/ui/media/MediaRequestDataKeyer.kt create mode 100644 libraries/matrixmedia/impl/src/test/kotlin/io/element/android/libraries/matrix/ui/media/DefaultImageLoaderHolderTest.kt create mode 100644 libraries/matrixmedia/impl/src/test/kotlin/io/element/android/libraries/matrix/ui/media/FakeImageLoaderFactory.kt create mode 100644 libraries/matrixmedia/test/build.gradle.kts create mode 100644 libraries/matrixmedia/test/src/main/kotlin/io/element/android/libraries/matrix/ui/media/test/FakeImageLoader.kt create mode 100644 libraries/matrixmedia/test/src/main/kotlin/io/element/android/libraries/matrix/ui/media/test/FakeImageLoaderHolder.kt create mode 100644 libraries/matrixmedia/test/src/main/kotlin/io/element/android/libraries/matrix/ui/media/test/FakeInitialsAvatarBitmapGenerator.kt create mode 100644 libraries/matrixui/build.gradle.kts create mode 100644 libraries/matrixui/src/main/kotlin/io/element/android/libraries/matrix/ui/components/AttachmentThumbnail.kt create mode 100644 libraries/matrixui/src/main/kotlin/io/element/android/libraries/matrix/ui/components/AttachmentThumbnailInfoProvider.kt create mode 100644 libraries/matrixui/src/main/kotlin/io/element/android/libraries/matrix/ui/components/AvatarActionBottomSheet.kt create mode 100644 libraries/matrixui/src/main/kotlin/io/element/android/libraries/matrix/ui/components/CheckableUserRow.kt create mode 100644 libraries/matrixui/src/main/kotlin/io/element/android/libraries/matrix/ui/components/CreateDmConfirmationBottomSheet.kt create mode 100644 libraries/matrixui/src/main/kotlin/io/element/android/libraries/matrix/ui/components/EditableAvatarView.kt create mode 100644 libraries/matrixui/src/main/kotlin/io/element/android/libraries/matrix/ui/components/EditableOrgAvatar.kt create mode 100644 libraries/matrixui/src/main/kotlin/io/element/android/libraries/matrix/ui/components/InviteSenderView.kt create mode 100644 libraries/matrixui/src/main/kotlin/io/element/android/libraries/matrix/ui/components/JoinButton.kt create mode 100644 libraries/matrixui/src/main/kotlin/io/element/android/libraries/matrix/ui/components/MatrixUserHeader.kt create mode 100644 libraries/matrixui/src/main/kotlin/io/element/android/libraries/matrix/ui/components/MatrixUserHeaderPlaceholder.kt create mode 100644 libraries/matrixui/src/main/kotlin/io/element/android/libraries/matrix/ui/components/MatrixUserProvider.kt create mode 100644 libraries/matrixui/src/main/kotlin/io/element/android/libraries/matrix/ui/components/MatrixUserRow.kt create mode 100644 libraries/matrixui/src/main/kotlin/io/element/android/libraries/matrix/ui/components/OrganizationHeader.kt create mode 100644 libraries/matrixui/src/main/kotlin/io/element/android/libraries/matrix/ui/components/SelectRoomInfoProvider.kt create mode 100644 libraries/matrixui/src/main/kotlin/io/element/android/libraries/matrix/ui/components/SelectedItem.kt create mode 100644 libraries/matrixui/src/main/kotlin/io/element/android/libraries/matrix/ui/components/SelectedRoom.kt create mode 100644 libraries/matrixui/src/main/kotlin/io/element/android/libraries/matrix/ui/components/SelectedUser.kt create mode 100644 libraries/matrixui/src/main/kotlin/io/element/android/libraries/matrix/ui/components/SelectedUsersRowList.kt create mode 100644 libraries/matrixui/src/main/kotlin/io/element/android/libraries/matrix/ui/components/SpaceHeaderRootView.kt create mode 100644 libraries/matrixui/src/main/kotlin/io/element/android/libraries/matrix/ui/components/SpaceHeaderView.kt create mode 100644 libraries/matrixui/src/main/kotlin/io/element/android/libraries/matrix/ui/components/SpaceInfoRow.kt create mode 100644 libraries/matrixui/src/main/kotlin/io/element/android/libraries/matrix/ui/components/SpaceMembersView.kt create mode 100644 libraries/matrixui/src/main/kotlin/io/element/android/libraries/matrix/ui/components/SpaceRoomItemView.kt create mode 100644 libraries/matrixui/src/main/kotlin/io/element/android/libraries/matrix/ui/components/SpaceRoomProvider.kt create mode 100644 libraries/matrixui/src/main/kotlin/io/element/android/libraries/matrix/ui/components/UnresolvedUserRow.kt create mode 100644 libraries/matrixui/src/main/kotlin/io/element/android/libraries/matrix/ui/components/UnsavedAvatar.kt create mode 100644 libraries/matrixui/src/main/kotlin/io/element/android/libraries/matrix/ui/components/UserRow.kt create mode 100644 libraries/matrixui/src/main/kotlin/io/element/android/libraries/matrix/ui/media/AvatarAction.kt create mode 100644 libraries/matrixui/src/main/kotlin/io/element/android/libraries/matrix/ui/messages/RoomMemberProfilesCache.kt create mode 100644 libraries/matrixui/src/main/kotlin/io/element/android/libraries/matrix/ui/messages/RoomNamesCache.kt create mode 100644 libraries/matrixui/src/main/kotlin/io/element/android/libraries/matrix/ui/messages/ToHtmlDocument.kt create mode 100644 libraries/matrixui/src/main/kotlin/io/element/android/libraries/matrix/ui/messages/ToPlainText.kt create mode 100644 libraries/matrixui/src/main/kotlin/io/element/android/libraries/matrix/ui/messages/reply/InReplyToDetails.kt create mode 100644 libraries/matrixui/src/main/kotlin/io/element/android/libraries/matrix/ui/messages/reply/InReplyToDetailsProvider.kt create mode 100644 libraries/matrixui/src/main/kotlin/io/element/android/libraries/matrix/ui/messages/reply/InReplyToMetadata.kt create mode 100644 libraries/matrixui/src/main/kotlin/io/element/android/libraries/matrix/ui/messages/reply/InReplyToView.kt create mode 100644 libraries/matrixui/src/main/kotlin/io/element/android/libraries/matrix/ui/messages/sender/SenderName.kt create mode 100644 libraries/matrixui/src/main/kotlin/io/element/android/libraries/matrix/ui/messages/sender/SenderNameDataProvider.kt create mode 100644 libraries/matrixui/src/main/kotlin/io/element/android/libraries/matrix/ui/messages/sender/SenderNameMode.kt create mode 100644 libraries/matrixui/src/main/kotlin/io/element/android/libraries/matrix/ui/model/InviteSender.kt create mode 100644 libraries/matrixui/src/main/kotlin/io/element/android/libraries/matrix/ui/model/MatrixUserExtensions.kt create mode 100644 libraries/matrixui/src/main/kotlin/io/element/android/libraries/matrix/ui/model/RoomInfoExtension.kt create mode 100644 libraries/matrixui/src/main/kotlin/io/element/android/libraries/matrix/ui/model/RoomMemberExtension.kt create mode 100644 libraries/matrixui/src/main/kotlin/io/element/android/libraries/matrix/ui/model/SelectRoomInfo.kt create mode 100644 libraries/matrixui/src/main/kotlin/io/element/android/libraries/matrix/ui/model/SpaceExtension.kt create mode 100644 libraries/matrixui/src/main/kotlin/io/element/android/libraries/matrix/ui/room/LoadingRoomState.kt create mode 100644 libraries/matrixui/src/main/kotlin/io/element/android/libraries/matrix/ui/room/MatrixRoomMembers.kt create mode 100644 libraries/matrixui/src/main/kotlin/io/element/android/libraries/matrix/ui/room/MatrixRoomState.kt create mode 100644 libraries/matrixui/src/main/kotlin/io/element/android/libraries/matrix/ui/room/ObserveRoomMemberIdentityStateChange.kt create mode 100644 libraries/matrixui/src/main/kotlin/io/element/android/libraries/matrix/ui/room/PowerLevelRoomMemberComparator.kt create mode 100644 libraries/matrixui/src/main/kotlin/io/element/android/libraries/matrix/ui/room/RoomMemberExtensions.kt create mode 100644 libraries/matrixui/src/main/kotlin/io/element/android/libraries/matrix/ui/room/address/RoomAddressField.kt create mode 100644 libraries/matrixui/src/main/kotlin/io/element/android/libraries/matrix/ui/room/address/RoomAddressValidity.kt create mode 100644 libraries/matrixui/src/main/kotlin/io/element/android/libraries/matrix/ui/room/address/RoomAddressValidityEffect.kt create mode 100644 libraries/matrixui/src/main/kotlin/io/element/android/libraries/matrix/ui/safety/Avatars.kt create mode 100644 libraries/matrixui/src/main/res/values-be/translations.xml create mode 100644 libraries/matrixui/src/main/res/values-bg/translations.xml create mode 100644 libraries/matrixui/src/main/res/values-cs/translations.xml create mode 100644 libraries/matrixui/src/main/res/values-cy/translations.xml create mode 100644 libraries/matrixui/src/main/res/values-da/translations.xml create mode 100644 libraries/matrixui/src/main/res/values-de/translations.xml create mode 100644 libraries/matrixui/src/main/res/values-el/translations.xml create mode 100644 libraries/matrixui/src/main/res/values-es/translations.xml create mode 100644 libraries/matrixui/src/main/res/values-et/translations.xml create mode 100644 libraries/matrixui/src/main/res/values-eu/translations.xml create mode 100644 libraries/matrixui/src/main/res/values-fa/translations.xml create mode 100644 libraries/matrixui/src/main/res/values-fi/translations.xml create mode 100644 libraries/matrixui/src/main/res/values-fr/translations.xml create mode 100644 libraries/matrixui/src/main/res/values-hu/translations.xml create mode 100644 libraries/matrixui/src/main/res/values-in/translations.xml create mode 100644 libraries/matrixui/src/main/res/values-it/translations.xml create mode 100644 libraries/matrixui/src/main/res/values-ka/translations.xml create mode 100644 libraries/matrixui/src/main/res/values-ko/translations.xml create mode 100644 libraries/matrixui/src/main/res/values-lt/translations.xml create mode 100644 libraries/matrixui/src/main/res/values-nb/translations.xml create mode 100644 libraries/matrixui/src/main/res/values-nl/translations.xml create mode 100644 libraries/matrixui/src/main/res/values-pl/translations.xml create mode 100644 libraries/matrixui/src/main/res/values-pt-rBR/translations.xml create mode 100644 libraries/matrixui/src/main/res/values-pt/translations.xml create mode 100644 libraries/matrixui/src/main/res/values-ro/translations.xml create mode 100644 libraries/matrixui/src/main/res/values-ru/translations.xml create mode 100644 libraries/matrixui/src/main/res/values-sk/translations.xml create mode 100644 libraries/matrixui/src/main/res/values-sv/translations.xml create mode 100644 libraries/matrixui/src/main/res/values-tr/translations.xml create mode 100644 libraries/matrixui/src/main/res/values-uk/translations.xml create mode 100644 libraries/matrixui/src/main/res/values-ur/translations.xml create mode 100644 libraries/matrixui/src/main/res/values-uz/translations.xml create mode 100644 libraries/matrixui/src/main/res/values-zh-rTW/translations.xml create mode 100644 libraries/matrixui/src/main/res/values-zh/translations.xml create mode 100644 libraries/matrixui/src/main/res/values/localazy.xml create mode 100644 libraries/matrixui/src/test/kotlin/io/element/android/libraries/matrix/ui/messages/ToHtmlDocumentTest.kt create mode 100644 libraries/matrixui/src/test/kotlin/io/element/android/libraries/matrix/ui/messages/ToPlainTextTest.kt create mode 100644 libraries/matrixui/src/test/kotlin/io/element/android/libraries/matrix/ui/messages/reply/InReplyToDetailTest.kt create mode 100644 libraries/matrixui/src/test/kotlin/io/element/android/libraries/matrix/ui/messages/reply/InReplyToMetadataKtTest.kt create mode 100644 libraries/matrixui/src/test/kotlin/io/element/android/libraries/matrix/ui/model/MatrixUserExtensionsTest.kt create mode 100644 libraries/matrixui/src/test/kotlin/io/element/android/libraries/matrix/ui/model/RoomInfoExtensionTest.kt create mode 100644 libraries/matrixui/src/test/kotlin/io/element/android/libraries/matrix/ui/room/ObserveRoomMemberIdentityStateChangeTest.kt create mode 100644 libraries/matrixui/src/test/kotlin/io/element/android/libraries/matrix/ui/room/PowerLevelRoomMemberComparatorTest.kt create mode 100644 libraries/matrixui/src/test/kotlin/io/element/android/libraries/matrix/ui/room/RoomMembersTest.kt create mode 100644 libraries/mediapickers/api/build.gradle.kts create mode 100644 libraries/mediapickers/api/src/main/kotlin/io/element/android/libraries/mediapickers/api/PickerLauncher.kt create mode 100644 libraries/mediapickers/api/src/main/kotlin/io/element/android/libraries/mediapickers/api/PickerProvider.kt create mode 100644 libraries/mediapickers/api/src/main/kotlin/io/element/android/libraries/mediapickers/api/PickerType.kt create mode 100644 libraries/mediapickers/api/src/test/kotlin/io/element/android/libraries/mediapickers/PickerTypeTest.kt create mode 100644 libraries/mediapickers/impl/build.gradle.kts create mode 100644 libraries/mediapickers/impl/src/main/kotlin/io/element/android/libraries/mediapickers/impl/DefaultPickerProvider.kt create mode 100644 libraries/mediapickers/test/build.gradle.kts create mode 100644 libraries/mediapickers/test/src/main/kotlin/io/element/android/libraries/mediapickers/test/FakePickerProvider.kt create mode 100644 libraries/mediaplayer/api/build.gradle.kts create mode 100644 libraries/mediaplayer/api/src/main/kotlin/io/element/android/libraries/mediaplayer/api/MediaPlayer.kt create mode 100644 libraries/mediaplayer/impl/build.gradle.kts create mode 100644 libraries/mediaplayer/impl/src/main/kotlin/io/element/android/libraries/mediaplayer/impl/DefaultMediaPlayer.kt create mode 100644 libraries/mediaplayer/impl/src/main/kotlin/io/element/android/libraries/mediaplayer/impl/SimplePlayer.kt create mode 100644 libraries/mediaplayer/impl/src/test/kotlin/io/element/android/libraries/mediaplayer/impl/DefaultMediaPlayerTest.kt create mode 100644 libraries/mediaplayer/impl/src/test/kotlin/io/element/android/libraries/mediaplayer/impl/FakeSimplePlayer.kt create mode 100644 libraries/mediaplayer/test/build.gradle.kts create mode 100644 libraries/mediaplayer/test/src/main/kotlin/io/element/android/libraries/mediaplayer/test/FakeMediaPlayer.kt create mode 100644 libraries/mediaupload/api/build.gradle.kts create mode 100644 libraries/mediaupload/api/src/main/kotlin/io/element/android/libraries/mediaupload/api/MaxUploadSizeProvider.kt create mode 100644 libraries/mediaupload/api/src/main/kotlin/io/element/android/libraries/mediaupload/api/MediaOptimizationConfig.kt create mode 100644 libraries/mediaupload/api/src/main/kotlin/io/element/android/libraries/mediaupload/api/MediaOptimizationConfigProvider.kt create mode 100644 libraries/mediaupload/api/src/main/kotlin/io/element/android/libraries/mediaupload/api/MediaPreProcessor.kt create mode 100644 libraries/mediaupload/api/src/main/kotlin/io/element/android/libraries/mediaupload/api/MediaSender.kt create mode 100644 libraries/mediaupload/api/src/main/kotlin/io/element/android/libraries/mediaupload/api/MediaUploadInfo.kt create mode 100644 libraries/mediaupload/impl/build.gradle.kts create mode 100644 libraries/mediaupload/impl/src/main/kotlin/io/element/android/libraries/mediaupload/impl/AndroidMediaPreProcessor.kt create mode 100644 libraries/mediaupload/impl/src/main/kotlin/io/element/android/libraries/mediaupload/impl/DefaultMaxUploadSizeProvider.kt create mode 100644 libraries/mediaupload/impl/src/main/kotlin/io/element/android/libraries/mediaupload/impl/DefaultMediaOptimizationConfigProvider.kt create mode 100644 libraries/mediaupload/impl/src/main/kotlin/io/element/android/libraries/mediaupload/impl/DefaultMediaSender.kt create mode 100644 libraries/mediaupload/impl/src/main/kotlin/io/element/android/libraries/mediaupload/impl/ImageCompressor.kt create mode 100644 libraries/mediaupload/impl/src/main/kotlin/io/element/android/libraries/mediaupload/impl/MimeTypeUtil.kt create mode 100644 libraries/mediaupload/impl/src/main/kotlin/io/element/android/libraries/mediaupload/impl/ThumbnailFactory.kt create mode 100644 libraries/mediaupload/impl/src/main/kotlin/io/element/android/libraries/mediaupload/impl/VideoCompressor.kt create mode 100644 libraries/mediaupload/impl/src/main/kotlin/io/element/android/libraries/mediaupload/impl/VideoCompressorConfig.kt create mode 100644 libraries/mediaupload/impl/src/test/assets/animated_gif.gif create mode 100644 libraries/mediaupload/impl/src/test/assets/image.jpeg create mode 100644 libraries/mediaupload/impl/src/test/assets/image.png create mode 100644 libraries/mediaupload/impl/src/test/assets/sample3s.mp3 create mode 100644 libraries/mediaupload/impl/src/test/assets/text.txt create mode 100644 libraries/mediaupload/impl/src/test/assets/video.mp4 create mode 100644 libraries/mediaupload/impl/src/test/kotlin/io/element/android/libraries/mediaupload/impl/AndroidMediaPreProcessorTest.kt create mode 100644 libraries/mediaupload/impl/src/test/kotlin/io/element/android/libraries/mediaupload/impl/Asset.kt create mode 100644 libraries/mediaupload/impl/src/test/kotlin/io/element/android/libraries/mediaupload/impl/DefaultMediaSenderTest.kt create mode 100644 libraries/mediaupload/impl/src/test/kotlin/io/element/android/libraries/mediaupload/impl/VideoCompressorConfigFactoryTest.kt create mode 100644 libraries/mediaupload/test/build.gradle.kts create mode 100644 libraries/mediaupload/test/src/main/kotlin/io/element/android/libraries/mediaupload/test/FakeMediaOptimizationConfigProvider.kt create mode 100644 libraries/mediaupload/test/src/main/kotlin/io/element/android/libraries/mediaupload/test/FakeMediaPreProcessor.kt create mode 100644 libraries/mediaupload/test/src/main/kotlin/io/element/android/libraries/mediaupload/test/FakeMediaSender.kt create mode 100644 libraries/mediaviewer/api/build.gradle.kts create mode 100644 libraries/mediaviewer/api/src/main/kotlin/io/element/android/libraries/mediaviewer/api/MediaGalleryEntryPoint.kt create mode 100644 libraries/mediaviewer/api/src/main/kotlin/io/element/android/libraries/mediaviewer/api/MediaInfo.kt create mode 100644 libraries/mediaviewer/api/src/main/kotlin/io/element/android/libraries/mediaviewer/api/MediaViewerEntryPoint.kt create mode 100644 libraries/mediaviewer/api/src/main/kotlin/io/element/android/libraries/mediaviewer/api/helper/FileExtensionAndSizeFormatter.kt create mode 100644 libraries/mediaviewer/api/src/main/kotlin/io/element/android/libraries/mediaviewer/api/local/LocalMedia.kt create mode 100644 libraries/mediaviewer/api/src/main/kotlin/io/element/android/libraries/mediaviewer/api/local/LocalMediaFactory.kt create mode 100644 libraries/mediaviewer/api/src/main/kotlin/io/element/android/libraries/mediaviewer/api/local/LocalMediaRenderer.kt create mode 100644 libraries/mediaviewer/api/src/main/kotlin/io/element/android/libraries/mediaviewer/api/util/FileExtensionExtractor.kt create mode 100644 libraries/mediaviewer/impl/build.gradle.kts create mode 100644 libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/DefaultMediaGalleryEntryPoint.kt create mode 100644 libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/DefaultMediaViewerEntryPoint.kt create mode 100644 libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/datasource/EventItemFactory.kt create mode 100644 libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/datasource/FocusedTimelineMediaGalleryDataSourceFactory.kt create mode 100644 libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/datasource/MediaGalleryDataSource.kt create mode 100644 libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/datasource/MediaItemsPostProcessor.kt create mode 100644 libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/datasource/MediaTimeline.kt create mode 100644 libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/datasource/TimelineMediaItemsFactory.kt create mode 100644 libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/datasource/VirtualItemFactory.kt create mode 100644 libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/details/MediaBottomSheetState.kt create mode 100644 libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/details/MediaDeleteConfirmationBottomSheet.kt create mode 100644 libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/details/MediaDetailsBottomSheet.kt create mode 100644 libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/details/Preview.kt create mode 100644 libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/gallery/MediaGalleryEvents.kt create mode 100644 libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/gallery/MediaGalleryNavigator.kt create mode 100644 libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/gallery/MediaGalleryNode.kt create mode 100644 libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/gallery/MediaGalleryPresenter.kt create mode 100644 libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/gallery/MediaGalleryState.kt create mode 100644 libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/gallery/MediaGalleryStateProvider.kt create mode 100644 libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/gallery/MediaGalleryView.kt create mode 100644 libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/gallery/di/FakeTimelineItemPresenterFactories.kt create mode 100644 libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/gallery/di/LocalMediaItemPresenterFactories.kt create mode 100644 libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/gallery/di/MediaItemEventContentKey.kt create mode 100644 libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/gallery/di/MediaItemPresenterFactories.kt create mode 100644 libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/gallery/di/MediaItemPresenterFactory.kt create mode 100644 libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/gallery/root/MediaGalleryFlowNode.kt create mode 100644 libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/gallery/ui/AudioItemView.kt create mode 100644 libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/gallery/ui/CaptionView.kt create mode 100644 libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/gallery/ui/DateItemView.kt create mode 100644 libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/gallery/ui/FileItemView.kt create mode 100644 libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/gallery/ui/ImageItemView.kt create mode 100644 libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/gallery/ui/MediaItemAudioProvider.kt create mode 100644 libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/gallery/ui/MediaItemDateSeparatorProvider.kt create mode 100644 libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/gallery/ui/MediaItemFileProvider.kt create mode 100644 libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/gallery/ui/MediaItemVideoProvider.kt create mode 100644 libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/gallery/ui/MediaItemVoiceProvider.kt create mode 100644 libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/gallery/ui/VideoItemView.kt create mode 100644 libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/gallery/ui/VoiceItemView.kt create mode 100644 libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/gallery/voice/VoiceMessagePresenter.kt create mode 100644 libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/local/AndroidLocalMediaActions.kt create mode 100644 libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/local/AndroidLocalMediaFactory.kt create mode 100644 libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/local/DefaultLocalMediaRenderer.kt create mode 100644 libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/local/LocalMediaActions.kt create mode 100644 libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/local/LocalMediaView.kt create mode 100644 libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/local/LocalMediaViewState.kt create mode 100644 libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/local/audio/MediaAudioView.kt create mode 100644 libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/local/audio/MediaInfoAudioProvider.kt create mode 100644 libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/local/audio/MediaMetadata.kt create mode 100644 libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/local/file/MediaFileView.kt create mode 100644 libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/local/file/MediaInfoFileProvider.kt create mode 100644 libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/local/image/MediaImageView.kt create mode 100644 libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/local/pdf/MediaPdfView.kt create mode 100644 libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/local/pdf/ParcelFileDescriptorFactory.kt create mode 100644 libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/local/pdf/PdfPage.kt create mode 100644 libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/local/pdf/PdfRendererManager.kt create mode 100644 libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/local/pdf/PdfViewer.kt create mode 100644 libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/local/pdf/PdfViewerState.kt create mode 100644 libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/local/player/ExoPlayerExtensions.kt create mode 100644 libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/local/player/ExoPlayerFactory.kt create mode 100644 libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/local/player/ExoPlayerForPreview.kt create mode 100644 libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/local/player/MediaPlayerControllerState.kt create mode 100644 libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/local/player/MediaPlayerControllerStateProvider.kt create mode 100644 libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/local/player/MediaPlayerControllerView.kt create mode 100644 libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/local/txt/TextFileContentProvider.kt create mode 100644 libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/local/txt/TextFileView.kt create mode 100644 libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/local/video/MediaVideoView.kt create mode 100644 libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/model/GroupedMediaItems.kt create mode 100644 libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/model/MediaItem.kt create mode 100644 libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/model/MediaItemFactories.kt create mode 100644 libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/util/Colors.kt create mode 100644 libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/util/FileExtensionExtractorWithValidation.kt create mode 100644 libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/viewer/MediaViewerDataSource.kt create mode 100644 libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/viewer/MediaViewerEvents.kt create mode 100644 libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/viewer/MediaViewerFlickToDismiss.kt create mode 100644 libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/viewer/MediaViewerNavigator.kt create mode 100644 libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/viewer/MediaViewerNode.kt create mode 100644 libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/viewer/MediaViewerPresenter.kt create mode 100644 libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/viewer/MediaViewerState.kt create mode 100644 libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/viewer/MediaViewerStateProvider.kt create mode 100644 libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/viewer/MediaViewerView.kt create mode 100644 libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/viewer/PagerKeysHandler.kt create mode 100644 libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/viewer/SingleMediaGalleryDataSource.kt create mode 100644 libraries/mediaviewer/impl/src/main/res/drawable/ic_apk_install.xml create mode 100644 libraries/mediaviewer/impl/src/main/res/values-bg/translations.xml create mode 100644 libraries/mediaviewer/impl/src/main/res/values-cs/translations.xml create mode 100644 libraries/mediaviewer/impl/src/main/res/values-cy/translations.xml create mode 100644 libraries/mediaviewer/impl/src/main/res/values-da/translations.xml create mode 100644 libraries/mediaviewer/impl/src/main/res/values-de/translations.xml create mode 100644 libraries/mediaviewer/impl/src/main/res/values-el/translations.xml create mode 100644 libraries/mediaviewer/impl/src/main/res/values-es/translations.xml create mode 100644 libraries/mediaviewer/impl/src/main/res/values-et/translations.xml create mode 100644 libraries/mediaviewer/impl/src/main/res/values-eu/translations.xml create mode 100644 libraries/mediaviewer/impl/src/main/res/values-fa/translations.xml create mode 100644 libraries/mediaviewer/impl/src/main/res/values-fi/translations.xml create mode 100644 libraries/mediaviewer/impl/src/main/res/values-fr/translations.xml create mode 100644 libraries/mediaviewer/impl/src/main/res/values-hu/translations.xml create mode 100644 libraries/mediaviewer/impl/src/main/res/values-in/translations.xml create mode 100644 libraries/mediaviewer/impl/src/main/res/values-it/translations.xml create mode 100644 libraries/mediaviewer/impl/src/main/res/values-ko/translations.xml create mode 100644 libraries/mediaviewer/impl/src/main/res/values-nb/translations.xml create mode 100644 libraries/mediaviewer/impl/src/main/res/values-nl/translations.xml create mode 100644 libraries/mediaviewer/impl/src/main/res/values-pl/translations.xml create mode 100644 libraries/mediaviewer/impl/src/main/res/values-pt-rBR/translations.xml create mode 100644 libraries/mediaviewer/impl/src/main/res/values-pt/translations.xml create mode 100644 libraries/mediaviewer/impl/src/main/res/values-ro/translations.xml create mode 100644 libraries/mediaviewer/impl/src/main/res/values-ru/translations.xml create mode 100644 libraries/mediaviewer/impl/src/main/res/values-sk/translations.xml create mode 100644 libraries/mediaviewer/impl/src/main/res/values-sv/translations.xml create mode 100644 libraries/mediaviewer/impl/src/main/res/values-tr/translations.xml create mode 100644 libraries/mediaviewer/impl/src/main/res/values-uk/translations.xml create mode 100644 libraries/mediaviewer/impl/src/main/res/values-uz/translations.xml create mode 100644 libraries/mediaviewer/impl/src/main/res/values-zh-rTW/translations.xml create mode 100644 libraries/mediaviewer/impl/src/main/res/values-zh/translations.xml create mode 100644 libraries/mediaviewer/impl/src/main/res/values/localazy.xml create mode 100644 libraries/mediaviewer/impl/src/test/kotlin/io/element/android/libraries/mediaviewer/impl/DefaultMediaGalleryEntryPointTest.kt create mode 100644 libraries/mediaviewer/impl/src/test/kotlin/io/element/android/libraries/mediaviewer/impl/DefaultMediaViewerEntryPointTest.kt create mode 100644 libraries/mediaviewer/impl/src/test/kotlin/io/element/android/libraries/mediaviewer/impl/datasource/DefaultEventItemFactoryTest.kt create mode 100644 libraries/mediaviewer/impl/src/test/kotlin/io/element/android/libraries/mediaviewer/impl/datasource/DefaultFocusedTimelineMediaGalleryDataSourceFactoryTest.kt create mode 100644 libraries/mediaviewer/impl/src/test/kotlin/io/element/android/libraries/mediaviewer/impl/datasource/FakeMediaGalleryDataSource.kt create mode 100644 libraries/mediaviewer/impl/src/test/kotlin/io/element/android/libraries/mediaviewer/impl/datasource/FocusedMediaTimelineTest.kt create mode 100644 libraries/mediaviewer/impl/src/test/kotlin/io/element/android/libraries/mediaviewer/impl/datasource/LiveMediaTimelineTest.kt create mode 100644 libraries/mediaviewer/impl/src/test/kotlin/io/element/android/libraries/mediaviewer/impl/datasource/MediaItemsPostProcessorTest.kt create mode 100644 libraries/mediaviewer/impl/src/test/kotlin/io/element/android/libraries/mediaviewer/impl/datasource/TimelineMediaGalleryDataSourceTest.kt create mode 100644 libraries/mediaviewer/impl/src/test/kotlin/io/element/android/libraries/mediaviewer/impl/details/MediaDeleteConfirmationBottomSheetTest.kt create mode 100644 libraries/mediaviewer/impl/src/test/kotlin/io/element/android/libraries/mediaviewer/impl/details/MediaDetailsBottomSheetTest.kt create mode 100644 libraries/mediaviewer/impl/src/test/kotlin/io/element/android/libraries/mediaviewer/impl/gallery/FakeMediaGalleryNavigator.kt create mode 100644 libraries/mediaviewer/impl/src/test/kotlin/io/element/android/libraries/mediaviewer/impl/gallery/MediaGalleryPresenterTest.kt create mode 100644 libraries/mediaviewer/impl/src/test/kotlin/io/element/android/libraries/mediaviewer/impl/local/AndroidLocalMediaActionsTest.kt create mode 100644 libraries/mediaviewer/impl/src/test/kotlin/io/element/android/libraries/mediaviewer/impl/local/AndroidLocalMediaFactoryTest.kt create mode 100644 libraries/mediaviewer/impl/src/test/kotlin/io/element/android/libraries/mediaviewer/impl/local/NoOpActivityResultRegistryOwner.kt create mode 100644 libraries/mediaviewer/impl/src/test/kotlin/io/element/android/libraries/mediaviewer/impl/model/GroupedMediaItemsTest.kt create mode 100644 libraries/mediaviewer/impl/src/test/kotlin/io/element/android/libraries/mediaviewer/impl/util/FileExtensionExtractorWithValidationTest.kt create mode 100644 libraries/mediaviewer/impl/src/test/kotlin/io/element/android/libraries/mediaviewer/impl/viewer/FakeMediaViewerNavigator.kt create mode 100644 libraries/mediaviewer/impl/src/test/kotlin/io/element/android/libraries/mediaviewer/impl/viewer/MediaViewerDataSourceTest.kt create mode 100644 libraries/mediaviewer/impl/src/test/kotlin/io/element/android/libraries/mediaviewer/impl/viewer/MediaViewerPresenterTest.kt create mode 100644 libraries/mediaviewer/impl/src/test/kotlin/io/element/android/libraries/mediaviewer/impl/viewer/MediaViewerViewTest.kt create mode 100644 libraries/mediaviewer/impl/src/test/kotlin/io/element/android/libraries/mediaviewer/impl/viewer/PagerKeysHandlerTest.kt create mode 100644 libraries/mediaviewer/impl/src/test/kotlin/io/element/android/libraries/mediaviewer/impl/viewer/SingleMediaGalleryDataSourceTest.kt create mode 100644 libraries/mediaviewer/test/build.gradle.kts create mode 100644 libraries/mediaviewer/test/src/main/kotlin/io/element/android/libraries/mediaviewer/test/FakeLocalMediaActions.kt create mode 100644 libraries/mediaviewer/test/src/main/kotlin/io/element/android/libraries/mediaviewer/test/FakeLocalMediaFactory.kt create mode 100644 libraries/mediaviewer/test/src/main/kotlin/io/element/android/libraries/mediaviewer/test/FakeMediaGalleryEntryPoint.kt create mode 100644 libraries/mediaviewer/test/src/main/kotlin/io/element/android/libraries/mediaviewer/test/FakeMediaViewerEntryPoint.kt create mode 100644 libraries/mediaviewer/test/src/main/kotlin/io/element/android/libraries/mediaviewer/test/util/FileExtensionExtractorWithoutValidation.kt create mode 100644 libraries/mediaviewer/test/src/main/kotlin/io/element/android/libraries/mediaviewer/test/viewer/LocalMedia.kt create mode 100644 libraries/mediaviewer/test/src/test/kotlin/io/element/android/libraries/mediaviewer/test/util/FileExtensionExtractorWithoutValidationTest.kt create mode 100644 libraries/network/build.gradle.kts create mode 100644 libraries/network/consumer-rules.pro create mode 100644 libraries/network/src/main/kotlin/io/element/android/libraries/network/NetworkModule.kt create mode 100644 libraries/network/src/main/kotlin/io/element/android/libraries/network/RetrofitFactory.kt create mode 100644 libraries/network/src/main/kotlin/io/element/android/libraries/network/headers/HttpHeaders.kt create mode 100644 libraries/network/src/main/kotlin/io/element/android/libraries/network/interceptors/DynamicHttpLoggingInterceptor.kt create mode 100644 libraries/network/src/main/kotlin/io/element/android/libraries/network/interceptors/FormattedJsonHttpLogger.kt create mode 100644 libraries/network/src/main/kotlin/io/element/android/libraries/network/interceptors/UserAgentInterceptor.kt create mode 100644 libraries/network/src/main/kotlin/io/element/android/libraries/network/useragent/DefaultUserAgentProvider.kt create mode 100644 libraries/network/src/main/kotlin/io/element/android/libraries/network/useragent/SimpleUserAgentProvider.kt create mode 100644 libraries/network/src/main/kotlin/io/element/android/libraries/network/useragent/UserAgentProvider.kt create mode 100644 libraries/oidc/api/build.gradle.kts create mode 100644 libraries/oidc/api/src/main/kotlin/io/element/android/libraries/oidc/api/OidcAction.kt create mode 100644 libraries/oidc/api/src/main/kotlin/io/element/android/libraries/oidc/api/OidcActionFlow.kt create mode 100644 libraries/oidc/api/src/main/kotlin/io/element/android/libraries/oidc/api/OidcIntentResolver.kt create mode 100644 libraries/oidc/impl/build.gradle.kts create mode 100644 libraries/oidc/impl/src/main/kotlin/io/element/android/libraries/oidc/impl/DefaultOidcActionFlow.kt create mode 100644 libraries/oidc/impl/src/main/kotlin/io/element/android/libraries/oidc/impl/DefaultOidcIntentResolver.kt create mode 100644 libraries/oidc/impl/src/main/kotlin/io/element/android/libraries/oidc/impl/OidcUrlParser.kt create mode 100644 libraries/oidc/impl/src/test/kotlin/io/element/android/libraries/oidc/impl/DefaultOidcActionFlowTest.kt create mode 100644 libraries/oidc/impl/src/test/kotlin/io/element/android/libraries/oidc/impl/DefaultOidcIntentResolverTest.kt create mode 100644 libraries/oidc/impl/src/test/kotlin/io/element/android/libraries/oidc/impl/DefaultOidcUrlParserTest.kt create mode 100644 libraries/oidc/test/build.gradle.kts create mode 100644 libraries/oidc/test/src/main/kotlin/io/element/android/libraries/oidc/test/FakeOidcIntentResolver.kt create mode 100644 libraries/oidc/test/src/main/kotlin/io/element/android/libraries/oidc/test/customtab/FakeOidcActionFlow.kt create mode 100644 libraries/permissions/api/build.gradle.kts create mode 100644 libraries/permissions/api/src/main/kotlin/io/element/android/libraries/permissions/api/PermissionStateProvider.kt create mode 100644 libraries/permissions/api/src/main/kotlin/io/element/android/libraries/permissions/api/PermissionsEvents.kt create mode 100644 libraries/permissions/api/src/main/kotlin/io/element/android/libraries/permissions/api/PermissionsPresenter.kt create mode 100644 libraries/permissions/api/src/main/kotlin/io/element/android/libraries/permissions/api/PermissionsState.kt create mode 100644 libraries/permissions/api/src/main/kotlin/io/element/android/libraries/permissions/api/PermissionsStateProvider.kt create mode 100644 libraries/permissions/api/src/main/kotlin/io/element/android/libraries/permissions/api/PermissionsStore.kt create mode 100644 libraries/permissions/api/src/main/kotlin/io/element/android/libraries/permissions/api/PermissionsView.kt create mode 100644 libraries/permissions/api/src/main/kotlin/io/element/android/libraries/permissions/api/Util.kt create mode 100644 libraries/permissions/api/src/main/res/values-be/translations.xml create mode 100644 libraries/permissions/api/src/main/res/values-cs/translations.xml create mode 100644 libraries/permissions/api/src/main/res/values-cy/translations.xml create mode 100644 libraries/permissions/api/src/main/res/values-da/translations.xml create mode 100644 libraries/permissions/api/src/main/res/values-de/translations.xml create mode 100644 libraries/permissions/api/src/main/res/values-el/translations.xml create mode 100644 libraries/permissions/api/src/main/res/values-es/translations.xml create mode 100644 libraries/permissions/api/src/main/res/values-et/translations.xml create mode 100644 libraries/permissions/api/src/main/res/values-eu/translations.xml create mode 100644 libraries/permissions/api/src/main/res/values-fa/translations.xml create mode 100644 libraries/permissions/api/src/main/res/values-fi/translations.xml create mode 100644 libraries/permissions/api/src/main/res/values-fr/translations.xml create mode 100644 libraries/permissions/api/src/main/res/values-hu/translations.xml create mode 100644 libraries/permissions/api/src/main/res/values-in/translations.xml create mode 100644 libraries/permissions/api/src/main/res/values-it/translations.xml create mode 100644 libraries/permissions/api/src/main/res/values-ka/translations.xml create mode 100644 libraries/permissions/api/src/main/res/values-ko/translations.xml create mode 100644 libraries/permissions/api/src/main/res/values-nb/translations.xml create mode 100644 libraries/permissions/api/src/main/res/values-nl/translations.xml create mode 100644 libraries/permissions/api/src/main/res/values-pl/translations.xml create mode 100644 libraries/permissions/api/src/main/res/values-pt-rBR/translations.xml create mode 100644 libraries/permissions/api/src/main/res/values-pt/translations.xml create mode 100644 libraries/permissions/api/src/main/res/values-ro/translations.xml create mode 100644 libraries/permissions/api/src/main/res/values-ru/translations.xml create mode 100644 libraries/permissions/api/src/main/res/values-sk/translations.xml create mode 100644 libraries/permissions/api/src/main/res/values-sv/translations.xml create mode 100644 libraries/permissions/api/src/main/res/values-tr/translations.xml create mode 100644 libraries/permissions/api/src/main/res/values-uk/translations.xml create mode 100644 libraries/permissions/api/src/main/res/values-ur/translations.xml create mode 100644 libraries/permissions/api/src/main/res/values-uz/translations.xml create mode 100644 libraries/permissions/api/src/main/res/values-zh-rTW/translations.xml create mode 100644 libraries/permissions/api/src/main/res/values-zh/translations.xml create mode 100644 libraries/permissions/api/src/main/res/values/localazy.xml create mode 100644 libraries/permissions/impl/build.gradle.kts create mode 100644 libraries/permissions/impl/src/main/kotlin/io/element/android/libraries/permissions/impl/AccompanistPermissionStateProvider.kt create mode 100644 libraries/permissions/impl/src/main/kotlin/io/element/android/libraries/permissions/impl/DefaultPermissionStateProvider.kt create mode 100644 libraries/permissions/impl/src/main/kotlin/io/element/android/libraries/permissions/impl/DefaultPermissionsPresenter.kt create mode 100644 libraries/permissions/impl/src/main/kotlin/io/element/android/libraries/permissions/impl/DefaultPermissionsStore.kt create mode 100644 libraries/permissions/impl/src/main/kotlin/io/element/android/libraries/permissions/impl/action/AndroidPermissionActions.kt create mode 100644 libraries/permissions/impl/src/main/kotlin/io/element/android/libraries/permissions/impl/action/PermissionActions.kt create mode 100644 libraries/permissions/impl/src/main/kotlin/io/element/android/libraries/permissions/impl/troubleshoot/NotificationTroubleshootCheckPermissionTest.kt create mode 100644 libraries/permissions/impl/src/main/res/values-be/translations.xml create mode 100644 libraries/permissions/impl/src/main/res/values-bg/translations.xml create mode 100644 libraries/permissions/impl/src/main/res/values-cs/translations.xml create mode 100644 libraries/permissions/impl/src/main/res/values-cy/translations.xml create mode 100644 libraries/permissions/impl/src/main/res/values-da/translations.xml create mode 100644 libraries/permissions/impl/src/main/res/values-de/translations.xml create mode 100644 libraries/permissions/impl/src/main/res/values-el/translations.xml create mode 100644 libraries/permissions/impl/src/main/res/values-es/translations.xml create mode 100644 libraries/permissions/impl/src/main/res/values-et/translations.xml create mode 100644 libraries/permissions/impl/src/main/res/values-eu/translations.xml create mode 100644 libraries/permissions/impl/src/main/res/values-fa/translations.xml create mode 100644 libraries/permissions/impl/src/main/res/values-fi/translations.xml create mode 100644 libraries/permissions/impl/src/main/res/values-fr/translations.xml create mode 100644 libraries/permissions/impl/src/main/res/values-hu/translations.xml create mode 100644 libraries/permissions/impl/src/main/res/values-in/translations.xml create mode 100644 libraries/permissions/impl/src/main/res/values-it/translations.xml create mode 100644 libraries/permissions/impl/src/main/res/values-ka/translations.xml create mode 100644 libraries/permissions/impl/src/main/res/values-ko/translations.xml create mode 100644 libraries/permissions/impl/src/main/res/values-nb/translations.xml create mode 100644 libraries/permissions/impl/src/main/res/values-nl/translations.xml create mode 100644 libraries/permissions/impl/src/main/res/values-pl/translations.xml create mode 100644 libraries/permissions/impl/src/main/res/values-pt-rBR/translations.xml create mode 100644 libraries/permissions/impl/src/main/res/values-pt/translations.xml create mode 100644 libraries/permissions/impl/src/main/res/values-ro/translations.xml create mode 100644 libraries/permissions/impl/src/main/res/values-ru/translations.xml create mode 100644 libraries/permissions/impl/src/main/res/values-sk/translations.xml create mode 100644 libraries/permissions/impl/src/main/res/values-sv/translations.xml create mode 100644 libraries/permissions/impl/src/main/res/values-tr/translations.xml create mode 100644 libraries/permissions/impl/src/main/res/values-uk/translations.xml create mode 100644 libraries/permissions/impl/src/main/res/values-ur/translations.xml create mode 100644 libraries/permissions/impl/src/main/res/values-uz/translations.xml create mode 100644 libraries/permissions/impl/src/main/res/values-zh-rTW/translations.xml create mode 100644 libraries/permissions/impl/src/main/res/values-zh/translations.xml create mode 100644 libraries/permissions/impl/src/main/res/values/localazy.xml create mode 100644 libraries/permissions/impl/src/test/kotlin/io/element/android/libraries/permissions/impl/DefaultPermissionsPresenterTest.kt create mode 100644 libraries/permissions/impl/src/test/kotlin/io/element/android/libraries/permissions/impl/FakeComposablePermissionStateProvider.kt create mode 100644 libraries/permissions/impl/src/test/kotlin/io/element/android/libraries/permissions/impl/action/FakePermissionActions.kt create mode 100644 libraries/permissions/impl/src/test/kotlin/io/element/android/libraries/permissions/impl/troubleshoot/NotificationTroubleshootCheckPermissionTestTest.kt create mode 100644 libraries/permissions/noop/build.gradle.kts create mode 100644 libraries/permissions/noop/src/main/kotlin/io/element/android/libraries/permissions/noop/NoopPermissionsPresenter.kt create mode 100644 libraries/permissions/noop/src/test/kotlin/io/element/android/libraries/permissions/noop/NoopPermissionsPresenterTest.kt create mode 100644 libraries/permissions/test/build.gradle.kts create mode 100644 libraries/permissions/test/src/main/kotlin/io/element/android/libraries/permissions/test/FakePermissionStateProvider.kt create mode 100644 libraries/permissions/test/src/main/kotlin/io/element/android/libraries/permissions/test/FakePermissionsPresenter.kt create mode 100644 libraries/permissions/test/src/main/kotlin/io/element/android/libraries/permissions/test/FakePermissionsPresenterFactory.kt create mode 100644 libraries/permissions/test/src/main/kotlin/io/element/android/libraries/permissions/test/InMemoryPermissionsStore.kt create mode 100644 libraries/preferences/api/build.gradle.kts create mode 100644 libraries/preferences/api/src/main/kotlin/io/element/android/libraries/preferences/api/store/AppPreferencesStore.kt create mode 100644 libraries/preferences/api/src/main/kotlin/io/element/android/libraries/preferences/api/store/PreferenceDataStoreFactory.kt create mode 100644 libraries/preferences/api/src/main/kotlin/io/element/android/libraries/preferences/api/store/SessionPreferencesStore.kt create mode 100644 libraries/preferences/api/src/main/kotlin/io/element/android/libraries/preferences/api/store/SessionPreferencesStoreFactory.kt create mode 100644 libraries/preferences/api/src/main/kotlin/io/element/android/libraries/preferences/api/store/VideoCompressionPreset.kt create mode 100644 libraries/preferences/impl/build.gradle.kts create mode 100644 libraries/preferences/impl/src/main/kotlin/io/element/android/libraries/preferences/impl/store/DefaultAppPreferencesStore.kt create mode 100644 libraries/preferences/impl/src/main/kotlin/io/element/android/libraries/preferences/impl/store/DefaultPreferencesDataStoreFactory.kt create mode 100644 libraries/preferences/impl/src/main/kotlin/io/element/android/libraries/preferences/impl/store/DefaultSessionPreferencesStore.kt create mode 100644 libraries/preferences/impl/src/main/kotlin/io/element/android/libraries/preferences/impl/store/DefaultSessionPreferencesStoreFactory.kt create mode 100644 libraries/preferences/impl/src/main/kotlin/io/element/android/libraries/preferences/impl/store/SessionPreferencesModule.kt create mode 100644 libraries/preferences/impl/src/main/kotlin/io/element/android/libraries/preferences/impl/store/SessionPreferencesStoreMigration.kt create mode 100644 libraries/preferences/test/build.gradle.kts create mode 100644 libraries/preferences/test/src/main/kotlin/io/element/android/libraries/preferences/test/FakePreferenceDataStoreFactory.kt create mode 100644 libraries/preferences/test/src/main/kotlin/io/element/android/libraries/preferences/test/FakeSessionPreferencesStoreFactory.kt create mode 100644 libraries/preferences/test/src/main/kotlin/io/element/android/libraries/preferences/test/InMemoryAppPreferencesStore.kt create mode 100644 libraries/preferences/test/src/main/kotlin/io/element/android/libraries/preferences/test/InMemorySessionPreferencesStore.kt create mode 100644 libraries/previewutils/build.gradle.kts create mode 100644 libraries/previewutils/src/main/kotlin/io/element/android/libraries/previewutils/room/RoomMemberFixture.kt create mode 100644 libraries/previewutils/src/main/kotlin/io/element/android/libraries/previewutils/room/SpaceRoomFixture.kt create mode 100644 libraries/push/api/build.gradle.kts create mode 100644 libraries/push/api/src/main/kotlin/io/element/android/libraries/push/api/GetCurrentPushProvider.kt create mode 100644 libraries/push/api/src/main/kotlin/io/element/android/libraries/push/api/PushService.kt create mode 100644 libraries/push/api/src/main/kotlin/io/element/android/libraries/push/api/PusherRegistrationFailure.kt create mode 100644 libraries/push/api/src/main/kotlin/io/element/android/libraries/push/api/battery/BatteryOptimizationEvents.kt create mode 100644 libraries/push/api/src/main/kotlin/io/element/android/libraries/push/api/battery/BatteryOptimizationState.kt create mode 100644 libraries/push/api/src/main/kotlin/io/element/android/libraries/push/api/battery/BatteryOptimizationStateProvider.kt create mode 100644 libraries/push/api/src/main/kotlin/io/element/android/libraries/push/api/gateway/PushGatewayFailure.kt create mode 100644 libraries/push/api/src/main/kotlin/io/element/android/libraries/push/api/history/PushHistoryItem.kt create mode 100644 libraries/push/api/src/main/kotlin/io/element/android/libraries/push/api/notifications/NotificationBitmapLoader.kt create mode 100644 libraries/push/api/src/main/kotlin/io/element/android/libraries/push/api/notifications/NotificationCleaner.kt create mode 100644 libraries/push/api/src/main/kotlin/io/element/android/libraries/push/api/notifications/NotificationIdProvider.kt create mode 100644 libraries/push/api/src/main/kotlin/io/element/android/libraries/push/api/notifications/OnMissedCallNotificationHandler.kt create mode 100644 libraries/push/api/src/main/kotlin/io/element/android/libraries/push/api/notifications/conversations/NotificationConversationService.kt create mode 100644 libraries/push/api/src/main/kotlin/io/element/android/libraries/push/api/push/NotificationEventRequest.kt create mode 100644 libraries/push/api/src/main/kotlin/io/element/android/libraries/push/api/push/SyncOnNotifiableEvent.kt create mode 100644 libraries/push/impl/build.gradle.kts create mode 100644 libraries/push/impl/src/debug/res/raw/message.mp3 create mode 100644 libraries/push/impl/src/main/AndroidManifest.xml create mode 100644 libraries/push/impl/src/main/kotlin/io/element/android/libraries/push/impl/DefaultGetCurrentPushProvider.kt create mode 100644 libraries/push/impl/src/main/kotlin/io/element/android/libraries/push/impl/DefaultPushService.kt create mode 100644 libraries/push/impl/src/main/kotlin/io/element/android/libraries/push/impl/DefaultPusherSubscriber.kt create mode 100644 libraries/push/impl/src/main/kotlin/io/element/android/libraries/push/impl/battery/BatteryOptimization.kt create mode 100644 libraries/push/impl/src/main/kotlin/io/element/android/libraries/push/impl/battery/BatteryOptimizationPresenter.kt create mode 100644 libraries/push/impl/src/main/kotlin/io/element/android/libraries/push/impl/di/PushModule.kt create mode 100644 libraries/push/impl/src/main/kotlin/io/element/android/libraries/push/impl/history/DefaultPushHistoryService.kt create mode 100644 libraries/push/impl/src/main/kotlin/io/element/android/libraries/push/impl/history/PushHistoryService.kt create mode 100644 libraries/push/impl/src/main/kotlin/io/element/android/libraries/push/impl/history/di/PushHistoryModule.kt create mode 100644 libraries/push/impl/src/main/kotlin/io/element/android/libraries/push/impl/intent/IntentProvider.kt create mode 100644 libraries/push/impl/src/main/kotlin/io/element/android/libraries/push/impl/notifications/ActiveNotificationsProvider.kt create mode 100644 libraries/push/impl/src/main/kotlin/io/element/android/libraries/push/impl/notifications/CallNotificationEventResolver.kt create mode 100644 libraries/push/impl/src/main/kotlin/io/element/android/libraries/push/impl/notifications/DefaultNotifiableEventResolver.kt create mode 100644 libraries/push/impl/src/main/kotlin/io/element/android/libraries/push/impl/notifications/DefaultNotificationBitmapLoader.kt create mode 100644 libraries/push/impl/src/main/kotlin/io/element/android/libraries/push/impl/notifications/DefaultNotificationDrawerManager.kt create mode 100644 libraries/push/impl/src/main/kotlin/io/element/android/libraries/push/impl/notifications/DefaultOnMissedCallNotificationHandler.kt create mode 100644 libraries/push/impl/src/main/kotlin/io/element/android/libraries/push/impl/notifications/FallbackNotificationFactory.kt create mode 100644 libraries/push/impl/src/main/kotlin/io/element/android/libraries/push/impl/notifications/NotificationAction.kt create mode 100644 libraries/push/impl/src/main/kotlin/io/element/android/libraries/push/impl/notifications/NotificationActionIds.kt create mode 100644 libraries/push/impl/src/main/kotlin/io/element/android/libraries/push/impl/notifications/NotificationBroadcastReceiver.kt create mode 100644 libraries/push/impl/src/main/kotlin/io/element/android/libraries/push/impl/notifications/NotificationBroadcastReceiverBindings.kt create mode 100644 libraries/push/impl/src/main/kotlin/io/element/android/libraries/push/impl/notifications/NotificationBroadcastReceiverHandler.kt create mode 100644 libraries/push/impl/src/main/kotlin/io/element/android/libraries/push/impl/notifications/NotificationDataFactory.kt create mode 100644 libraries/push/impl/src/main/kotlin/io/element/android/libraries/push/impl/notifications/NotificationDisplayer.kt create mode 100644 libraries/push/impl/src/main/kotlin/io/element/android/libraries/push/impl/notifications/NotificationMediaRepo.kt create mode 100644 libraries/push/impl/src/main/kotlin/io/element/android/libraries/push/impl/notifications/NotificationRenderer.kt create mode 100644 libraries/push/impl/src/main/kotlin/io/element/android/libraries/push/impl/notifications/NotificationResolverQueue.kt create mode 100644 libraries/push/impl/src/main/kotlin/io/element/android/libraries/push/impl/notifications/NotificationsFileProvider.kt create mode 100644 libraries/push/impl/src/main/kotlin/io/element/android/libraries/push/impl/notifications/ReplyMessageExtractor.kt create mode 100644 libraries/push/impl/src/main/kotlin/io/element/android/libraries/push/impl/notifications/RoomEventGroupInfo.kt create mode 100644 libraries/push/impl/src/main/kotlin/io/element/android/libraries/push/impl/notifications/RoomGroupMessageCreator.kt create mode 100644 libraries/push/impl/src/main/kotlin/io/element/android/libraries/push/impl/notifications/SummaryGroupMessageCreator.kt create mode 100644 libraries/push/impl/src/main/kotlin/io/element/android/libraries/push/impl/notifications/TestNotificationReceiver.kt create mode 100644 libraries/push/impl/src/main/kotlin/io/element/android/libraries/push/impl/notifications/TestNotificationReceiverBinding.kt create mode 100644 libraries/push/impl/src/main/kotlin/io/element/android/libraries/push/impl/notifications/channels/NotificationChannels.kt create mode 100644 libraries/push/impl/src/main/kotlin/io/element/android/libraries/push/impl/notifications/conversations/DefaultNotificationConversationService.kt create mode 100644 libraries/push/impl/src/main/kotlin/io/element/android/libraries/push/impl/notifications/debug/DebugNotification.kt create mode 100644 libraries/push/impl/src/main/kotlin/io/element/android/libraries/push/impl/notifications/factories/NotificationAccountParams.kt create mode 100755 libraries/push/impl/src/main/kotlin/io/element/android/libraries/push/impl/notifications/factories/NotificationCreator.kt create mode 100644 libraries/push/impl/src/main/kotlin/io/element/android/libraries/push/impl/notifications/factories/PendingIntentFactory.kt create mode 100644 libraries/push/impl/src/main/kotlin/io/element/android/libraries/push/impl/notifications/factories/action/AcceptInvitationActionFactory.kt create mode 100644 libraries/push/impl/src/main/kotlin/io/element/android/libraries/push/impl/notifications/factories/action/MarkAsReadActionFactory.kt create mode 100644 libraries/push/impl/src/main/kotlin/io/element/android/libraries/push/impl/notifications/factories/action/QuickReplyActionFactory.kt create mode 100644 libraries/push/impl/src/main/kotlin/io/element/android/libraries/push/impl/notifications/factories/action/RejectInvitationActionFactory.kt create mode 100644 libraries/push/impl/src/main/kotlin/io/element/android/libraries/push/impl/notifications/model/FallbackNotifiableEvent.kt create mode 100644 libraries/push/impl/src/main/kotlin/io/element/android/libraries/push/impl/notifications/model/InviteNotifiableEvent.kt create mode 100644 libraries/push/impl/src/main/kotlin/io/element/android/libraries/push/impl/notifications/model/NotifiableEvent.kt create mode 100644 libraries/push/impl/src/main/kotlin/io/element/android/libraries/push/impl/notifications/model/NotifiableMessageEvent.kt create mode 100644 libraries/push/impl/src/main/kotlin/io/element/android/libraries/push/impl/notifications/model/NotifiableRingingCallEvent.kt create mode 100644 libraries/push/impl/src/main/kotlin/io/element/android/libraries/push/impl/notifications/model/ResolvedPushEvent.kt create mode 100644 libraries/push/impl/src/main/kotlin/io/element/android/libraries/push/impl/notifications/model/SimpleNotifiableEvent.kt create mode 100644 libraries/push/impl/src/main/kotlin/io/element/android/libraries/push/impl/notifications/shortcut/Utils.kt create mode 100644 libraries/push/impl/src/main/kotlin/io/element/android/libraries/push/impl/push/DefaultPushHandler.kt create mode 100644 libraries/push/impl/src/main/kotlin/io/element/android/libraries/push/impl/push/DefaultSyncOnNotifiableEvent.kt create mode 100644 libraries/push/impl/src/main/kotlin/io/element/android/libraries/push/impl/push/IncrementPushDataStore.kt create mode 100644 libraries/push/impl/src/main/kotlin/io/element/android/libraries/push/impl/push/MutableBatteryOptimizationStore.kt create mode 100644 libraries/push/impl/src/main/kotlin/io/element/android/libraries/push/impl/push/OnNotifiableEventReceived.kt create mode 100644 libraries/push/impl/src/main/kotlin/io/element/android/libraries/push/impl/push/OnRedactedEventReceived.kt create mode 100644 libraries/push/impl/src/main/kotlin/io/element/android/libraries/push/impl/pushgateway/PushGatewayAPI.kt create mode 100644 libraries/push/impl/src/main/kotlin/io/element/android/libraries/push/impl/pushgateway/PushGatewayApiFactory.kt create mode 100644 libraries/push/impl/src/main/kotlin/io/element/android/libraries/push/impl/pushgateway/PushGatewayConfig.kt create mode 100644 libraries/push/impl/src/main/kotlin/io/element/android/libraries/push/impl/pushgateway/PushGatewayDevice.kt create mode 100644 libraries/push/impl/src/main/kotlin/io/element/android/libraries/push/impl/pushgateway/PushGatewayNotification.kt create mode 100644 libraries/push/impl/src/main/kotlin/io/element/android/libraries/push/impl/pushgateway/PushGatewayNotifyBody.kt create mode 100644 libraries/push/impl/src/main/kotlin/io/element/android/libraries/push/impl/pushgateway/PushGatewayNotifyRequest.kt create mode 100644 libraries/push/impl/src/main/kotlin/io/element/android/libraries/push/impl/pushgateway/PushGatewayNotifyResponse.kt create mode 100644 libraries/push/impl/src/main/kotlin/io/element/android/libraries/push/impl/store/DefaultPushDataStore.kt create mode 100644 libraries/push/impl/src/main/kotlin/io/element/android/libraries/push/impl/store/PushDataStore.kt create mode 100644 libraries/push/impl/src/main/kotlin/io/element/android/libraries/push/impl/test/TestPush.kt create mode 100644 libraries/push/impl/src/main/kotlin/io/element/android/libraries/push/impl/troubleshoot/CurrentPushProviderTest.kt create mode 100644 libraries/push/impl/src/main/kotlin/io/element/android/libraries/push/impl/troubleshoot/DiagnosticPushHandler.kt create mode 100644 libraries/push/impl/src/main/kotlin/io/element/android/libraries/push/impl/troubleshoot/IgnoredUsersTest.kt create mode 100644 libraries/push/impl/src/main/kotlin/io/element/android/libraries/push/impl/troubleshoot/NotificationClickHandler.kt create mode 100644 libraries/push/impl/src/main/kotlin/io/element/android/libraries/push/impl/troubleshoot/NotificationTest.kt create mode 100644 libraries/push/impl/src/main/kotlin/io/element/android/libraries/push/impl/troubleshoot/PushLoopbackTest.kt create mode 100644 libraries/push/impl/src/main/kotlin/io/element/android/libraries/push/impl/troubleshoot/PushProvidersTest.kt create mode 100644 libraries/push/impl/src/main/kotlin/io/element/android/libraries/push/impl/unregistration/ServiceUnregisteredHandler.kt create mode 100644 libraries/push/impl/src/main/kotlin/io/element/android/libraries/push/impl/workmanager/DataForWorkManagerIsTooBig.kt create mode 100644 libraries/push/impl/src/main/kotlin/io/element/android/libraries/push/impl/workmanager/FetchNotificationsWorker.kt create mode 100644 libraries/push/impl/src/main/kotlin/io/element/android/libraries/push/impl/workmanager/SyncNotificationWorkManagerRequest.kt create mode 100644 libraries/push/impl/src/main/kotlin/io/element/android/libraries/push/impl/workmanager/WorkerDataConverter.kt create mode 100644 libraries/push/impl/src/main/res/raw/message.mp3 create mode 100644 libraries/push/impl/src/main/res/values-be/translations.xml create mode 100644 libraries/push/impl/src/main/res/values-bg/translations.xml create mode 100644 libraries/push/impl/src/main/res/values-cs/translations.xml create mode 100644 libraries/push/impl/src/main/res/values-cy/translations.xml create mode 100644 libraries/push/impl/src/main/res/values-da/translations.xml create mode 100644 libraries/push/impl/src/main/res/values-de/translations.xml create mode 100644 libraries/push/impl/src/main/res/values-el/translations.xml create mode 100644 libraries/push/impl/src/main/res/values-es/translations.xml create mode 100644 libraries/push/impl/src/main/res/values-et/translations.xml create mode 100644 libraries/push/impl/src/main/res/values-eu/translations.xml create mode 100644 libraries/push/impl/src/main/res/values-fa/translations.xml create mode 100644 libraries/push/impl/src/main/res/values-fi/translations.xml create mode 100644 libraries/push/impl/src/main/res/values-fr/translations.xml create mode 100644 libraries/push/impl/src/main/res/values-hu/translations.xml create mode 100644 libraries/push/impl/src/main/res/values-in/translations.xml create mode 100644 libraries/push/impl/src/main/res/values-it/translations.xml create mode 100644 libraries/push/impl/src/main/res/values-ka/translations.xml create mode 100644 libraries/push/impl/src/main/res/values-ko/translations.xml create mode 100644 libraries/push/impl/src/main/res/values-lt/translations.xml create mode 100644 libraries/push/impl/src/main/res/values-nb/translations.xml create mode 100644 libraries/push/impl/src/main/res/values-nl/translations.xml create mode 100644 libraries/push/impl/src/main/res/values-pl/translations.xml create mode 100644 libraries/push/impl/src/main/res/values-pt-rBR/translations.xml create mode 100644 libraries/push/impl/src/main/res/values-pt/translations.xml create mode 100644 libraries/push/impl/src/main/res/values-ro/translations.xml create mode 100644 libraries/push/impl/src/main/res/values-ru/translations.xml create mode 100644 libraries/push/impl/src/main/res/values-sk/translations.xml create mode 100644 libraries/push/impl/src/main/res/values-sv/translations.xml create mode 100644 libraries/push/impl/src/main/res/values-tr/translations.xml create mode 100644 libraries/push/impl/src/main/res/values-uk/translations.xml create mode 100644 libraries/push/impl/src/main/res/values-ur/translations.xml create mode 100644 libraries/push/impl/src/main/res/values-uz/translations.xml create mode 100644 libraries/push/impl/src/main/res/values-zh-rTW/translations.xml create mode 100644 libraries/push/impl/src/main/res/values-zh/translations.xml create mode 100644 libraries/push/impl/src/main/res/values/localazy.xml create mode 100644 libraries/push/impl/src/main/res/xml/notifications_provider_paths.xml create mode 100644 libraries/push/impl/src/main/sqldelight/io/element/android/libraries/push/impl/db/PushHistory.sq create mode 100644 libraries/push/impl/src/test/kotlin/io/element/android/libraries/push/impl/DefaultPushServiceTest.kt create mode 100644 libraries/push/impl/src/test/kotlin/io/element/android/libraries/push/impl/DefaultPusherSubscriberTest.kt create mode 100644 libraries/push/impl/src/test/kotlin/io/element/android/libraries/push/impl/battery/AndroidBatteryOptimizationTest.kt create mode 100644 libraries/push/impl/src/test/kotlin/io/element/android/libraries/push/impl/battery/BatteryOptimizationPresenterTest.kt create mode 100644 libraries/push/impl/src/test/kotlin/io/element/android/libraries/push/impl/battery/FakeBatteryOptimization.kt create mode 100644 libraries/push/impl/src/test/kotlin/io/element/android/libraries/push/impl/history/FakePushHistoryService.kt create mode 100644 libraries/push/impl/src/test/kotlin/io/element/android/libraries/push/impl/notifications/DefaultActiveNotificationsProviderTest.kt create mode 100644 libraries/push/impl/src/test/kotlin/io/element/android/libraries/push/impl/notifications/DefaultBaseRoomGroupMessageCreatorTest.kt create mode 100644 libraries/push/impl/src/test/kotlin/io/element/android/libraries/push/impl/notifications/DefaultCallNotificationEventResolverTest.kt create mode 100644 libraries/push/impl/src/test/kotlin/io/element/android/libraries/push/impl/notifications/DefaultNotifiableEventResolverTest.kt create mode 100644 libraries/push/impl/src/test/kotlin/io/element/android/libraries/push/impl/notifications/DefaultNotificationDrawerManagerTest.kt create mode 100644 libraries/push/impl/src/test/kotlin/io/element/android/libraries/push/impl/notifications/DefaultOnMissedCallNotificationHandlerTest.kt create mode 100644 libraries/push/impl/src/test/kotlin/io/element/android/libraries/push/impl/notifications/DefaultSummaryGroupMessageCreatorTest.kt create mode 100644 libraries/push/impl/src/test/kotlin/io/element/android/libraries/push/impl/notifications/FakeNotifiableEventResolver.kt create mode 100644 libraries/push/impl/src/test/kotlin/io/element/android/libraries/push/impl/notifications/FakeReplyMessageExtractor.kt create mode 100644 libraries/push/impl/src/test/kotlin/io/element/android/libraries/push/impl/notifications/NotificationBroadcastReceiverHandlerTest.kt create mode 100644 libraries/push/impl/src/test/kotlin/io/element/android/libraries/push/impl/notifications/NotificationDataFactoryTest.kt create mode 100644 libraries/push/impl/src/test/kotlin/io/element/android/libraries/push/impl/notifications/NotificationIdProviderTest.kt create mode 100644 libraries/push/impl/src/test/kotlin/io/element/android/libraries/push/impl/notifications/NotificationRendererTest.kt create mode 100644 libraries/push/impl/src/test/kotlin/io/element/android/libraries/push/impl/notifications/channels/FakeNotificationChannels.kt create mode 100644 libraries/push/impl/src/test/kotlin/io/element/android/libraries/push/impl/notifications/channels/NotificationChannelsTest.kt create mode 100644 libraries/push/impl/src/test/kotlin/io/element/android/libraries/push/impl/notifications/conversations/DefaultNotificationConversationServiceTest.kt create mode 100644 libraries/push/impl/src/test/kotlin/io/element/android/libraries/push/impl/notifications/factories/DefaultNotificationCreatorTest.kt create mode 100644 libraries/push/impl/src/test/kotlin/io/element/android/libraries/push/impl/notifications/factories/FakeIntentProvider.kt create mode 100644 libraries/push/impl/src/test/kotlin/io/element/android/libraries/push/impl/notifications/factories/NotificationAccountParams.kt create mode 100644 libraries/push/impl/src/test/kotlin/io/element/android/libraries/push/impl/notifications/fake/FakeActiveNotificationsProvider.kt create mode 100644 libraries/push/impl/src/test/kotlin/io/element/android/libraries/push/impl/notifications/fake/FakeNotificationCreator.kt create mode 100644 libraries/push/impl/src/test/kotlin/io/element/android/libraries/push/impl/notifications/fake/FakeNotificationDataFactory.kt create mode 100644 libraries/push/impl/src/test/kotlin/io/element/android/libraries/push/impl/notifications/fake/FakeNotificationDisplayer.kt create mode 100644 libraries/push/impl/src/test/kotlin/io/element/android/libraries/push/impl/notifications/fake/FakeNotificationMediaRepo.kt create mode 100644 libraries/push/impl/src/test/kotlin/io/element/android/libraries/push/impl/notifications/fake/FakeRoomGroupMessageCreator.kt create mode 100644 libraries/push/impl/src/test/kotlin/io/element/android/libraries/push/impl/notifications/fake/FakeSummaryGroupMessageCreator.kt create mode 100644 libraries/push/impl/src/test/kotlin/io/element/android/libraries/push/impl/notifications/fixtures/NotifiableEventFixture.kt create mode 100644 libraries/push/impl/src/test/kotlin/io/element/android/libraries/push/impl/notifications/fixtures/NotificationEventRequestFixture.kt create mode 100644 libraries/push/impl/src/test/kotlin/io/element/android/libraries/push/impl/notifications/fixtures/NotificationFixture.kt create mode 100644 libraries/push/impl/src/test/kotlin/io/element/android/libraries/push/impl/push/DefaultOnRedactedEventReceivedTest.kt create mode 100644 libraries/push/impl/src/test/kotlin/io/element/android/libraries/push/impl/push/DefaultPushHandlerTest.kt create mode 100644 libraries/push/impl/src/test/kotlin/io/element/android/libraries/push/impl/push/FakeMutableBatteryOptimizationStore.kt create mode 100644 libraries/push/impl/src/test/kotlin/io/element/android/libraries/push/impl/push/FakeOnNotifiableEventReceived.kt create mode 100644 libraries/push/impl/src/test/kotlin/io/element/android/libraries/push/impl/push/FakeOnRedactedEventReceived.kt create mode 100644 libraries/push/impl/src/test/kotlin/io/element/android/libraries/push/impl/push/SyncOnNotifiableEventTest.kt create mode 100644 libraries/push/impl/src/test/kotlin/io/element/android/libraries/push/impl/pushgateway/DefaultPushGatewayNotifyRequestTest.kt create mode 100644 libraries/push/impl/src/test/kotlin/io/element/android/libraries/push/impl/pushgateway/FakePushGatewayApiFactory.kt create mode 100644 libraries/push/impl/src/test/kotlin/io/element/android/libraries/push/impl/store/InMemoryPushDataStore.kt create mode 100644 libraries/push/impl/src/test/kotlin/io/element/android/libraries/push/impl/test/DefaultTestPushTest.kt create mode 100644 libraries/push/impl/src/test/kotlin/io/element/android/libraries/push/impl/test/FakePushGatewayNotifyRequest.kt create mode 100644 libraries/push/impl/src/test/kotlin/io/element/android/libraries/push/impl/test/FakeTestPush.kt create mode 100644 libraries/push/impl/src/test/kotlin/io/element/android/libraries/push/impl/troubleshoot/CurrentPushProviderTestTest.kt create mode 100644 libraries/push/impl/src/test/kotlin/io/element/android/libraries/push/impl/troubleshoot/IgnoredUsersTestTest.kt create mode 100644 libraries/push/impl/src/test/kotlin/io/element/android/libraries/push/impl/troubleshoot/NotificationTestTest.kt create mode 100644 libraries/push/impl/src/test/kotlin/io/element/android/libraries/push/impl/troubleshoot/PushLoopbackTestTest.kt create mode 100644 libraries/push/impl/src/test/kotlin/io/element/android/libraries/push/impl/troubleshoot/PushProvidersTestTest.kt create mode 100644 libraries/push/impl/src/test/kotlin/io/element/android/libraries/push/impl/unregistration/DefaultServiceUnregisteredHandlerTest.kt create mode 100644 libraries/push/impl/src/test/kotlin/io/element/android/libraries/push/impl/unregistration/FakeServiceUnregisteredHandler.kt create mode 100644 libraries/push/impl/src/test/kotlin/io/element/android/libraries/push/impl/workmanager/FetchNotificationWorkerTest.kt create mode 100644 libraries/push/impl/src/test/kotlin/io/element/android/libraries/push/impl/workmanager/SyncNotificationWorkManagerRequestTest.kt create mode 100644 libraries/push/impl/src/test/kotlin/io/element/android/libraries/push/impl/workmanager/WorkerDataConverterTest.kt create mode 100644 libraries/push/test/build.gradle.kts create mode 100644 libraries/push/test/src/main/kotlin/io/element/android/libraries/push/test/FakeGetCurrentPushProvider.kt create mode 100644 libraries/push/test/src/main/kotlin/io/element/android/libraries/push/test/FakePushService.kt create mode 100644 libraries/push/test/src/main/kotlin/io/element/android/libraries/push/test/FakePusherSubscriber.kt create mode 100644 libraries/push/test/src/main/kotlin/io/element/android/libraries/push/test/notifications/FakeCallNotificationEventResolver.kt create mode 100644 libraries/push/test/src/main/kotlin/io/element/android/libraries/push/test/notifications/FakeNotificationCleaner.kt create mode 100644 libraries/push/test/src/main/kotlin/io/element/android/libraries/push/test/notifications/FakeNotificationResolverQueue.kt create mode 100644 libraries/push/test/src/main/kotlin/io/element/android/libraries/push/test/notifications/FakeOnMissedCallNotificationHandler.kt create mode 100644 libraries/push/test/src/main/kotlin/io/element/android/libraries/push/test/notifications/conversations/FakeNotificationConversationService.kt create mode 100644 libraries/push/test/src/main/kotlin/io/element/android/libraries/push/test/notifications/push/FakeNotificationBitmapLoader.kt create mode 100644 libraries/push/test/src/main/kotlin/io/element/android/libraries/push/test/test/FakePushHandler.kt create mode 100644 libraries/pushproviders/api/build.gradle.kts create mode 100644 libraries/pushproviders/api/src/main/kotlin/io/element/android/libraries/pushproviders/api/Config.kt create mode 100644 libraries/pushproviders/api/src/main/kotlin/io/element/android/libraries/pushproviders/api/Distributor.kt create mode 100644 libraries/pushproviders/api/src/main/kotlin/io/element/android/libraries/pushproviders/api/PushData.kt create mode 100644 libraries/pushproviders/api/src/main/kotlin/io/element/android/libraries/pushproviders/api/PushHandler.kt create mode 100644 libraries/pushproviders/api/src/main/kotlin/io/element/android/libraries/pushproviders/api/PushProvider.kt create mode 100644 libraries/pushproviders/api/src/main/kotlin/io/element/android/libraries/pushproviders/api/PusherSubscriber.kt create mode 100644 libraries/pushproviders/firebase/README.md create mode 100644 libraries/pushproviders/firebase/build.gradle.kts create mode 100644 libraries/pushproviders/firebase/consumer-proguard-rules.pro create mode 100644 libraries/pushproviders/firebase/src/main/AndroidManifest.xml create mode 100644 libraries/pushproviders/firebase/src/main/kotlin/io/element/android/libraries/pushproviders/firebase/FirebaseConfig.kt create mode 100644 libraries/pushproviders/firebase/src/main/kotlin/io/element/android/libraries/pushproviders/firebase/FirebaseGatewayProvider.kt create mode 100644 libraries/pushproviders/firebase/src/main/kotlin/io/element/android/libraries/pushproviders/firebase/FirebaseNewTokenHandler.kt create mode 100644 libraries/pushproviders/firebase/src/main/kotlin/io/element/android/libraries/pushproviders/firebase/FirebasePushParser.kt create mode 100644 libraries/pushproviders/firebase/src/main/kotlin/io/element/android/libraries/pushproviders/firebase/FirebasePushProvider.kt create mode 100644 libraries/pushproviders/firebase/src/main/kotlin/io/element/android/libraries/pushproviders/firebase/FirebaseStore.kt create mode 100644 libraries/pushproviders/firebase/src/main/kotlin/io/element/android/libraries/pushproviders/firebase/FirebaseTokenDeleter.kt create mode 100644 libraries/pushproviders/firebase/src/main/kotlin/io/element/android/libraries/pushproviders/firebase/FirebaseTokenGetter.kt create mode 100644 libraries/pushproviders/firebase/src/main/kotlin/io/element/android/libraries/pushproviders/firebase/FirebaseTokenRotator.kt create mode 100644 libraries/pushproviders/firebase/src/main/kotlin/io/element/android/libraries/pushproviders/firebase/FirebaseTroubleshooter.kt create mode 100644 libraries/pushproviders/firebase/src/main/kotlin/io/element/android/libraries/pushproviders/firebase/IsPlayServiceAvailable.kt create mode 100644 libraries/pushproviders/firebase/src/main/kotlin/io/element/android/libraries/pushproviders/firebase/PushDataFirebase.kt create mode 100644 libraries/pushproviders/firebase/src/main/kotlin/io/element/android/libraries/pushproviders/firebase/VectorFirebaseMessagingService.kt create mode 100644 libraries/pushproviders/firebase/src/main/kotlin/io/element/android/libraries/pushproviders/firebase/VectorFirebaseMessagingServiceBindings.kt create mode 100644 libraries/pushproviders/firebase/src/main/kotlin/io/element/android/libraries/pushproviders/firebase/troubleshoot/FirebaseAvailabilityTest.kt create mode 100644 libraries/pushproviders/firebase/src/main/kotlin/io/element/android/libraries/pushproviders/firebase/troubleshoot/FirebaseTokenTest.kt create mode 100644 libraries/pushproviders/firebase/src/main/res/values-be/translations.xml create mode 100644 libraries/pushproviders/firebase/src/main/res/values-bg/translations.xml create mode 100644 libraries/pushproviders/firebase/src/main/res/values-cs/translations.xml create mode 100644 libraries/pushproviders/firebase/src/main/res/values-cy/translations.xml create mode 100644 libraries/pushproviders/firebase/src/main/res/values-da/translations.xml create mode 100644 libraries/pushproviders/firebase/src/main/res/values-de/translations.xml create mode 100644 libraries/pushproviders/firebase/src/main/res/values-el/translations.xml create mode 100644 libraries/pushproviders/firebase/src/main/res/values-es/translations.xml create mode 100644 libraries/pushproviders/firebase/src/main/res/values-et/translations.xml create mode 100644 libraries/pushproviders/firebase/src/main/res/values-eu/translations.xml create mode 100644 libraries/pushproviders/firebase/src/main/res/values-fi/translations.xml create mode 100644 libraries/pushproviders/firebase/src/main/res/values-fr/translations.xml create mode 100644 libraries/pushproviders/firebase/src/main/res/values-hu/translations.xml create mode 100644 libraries/pushproviders/firebase/src/main/res/values-in/translations.xml create mode 100644 libraries/pushproviders/firebase/src/main/res/values-it/translations.xml create mode 100644 libraries/pushproviders/firebase/src/main/res/values-ka/translations.xml create mode 100644 libraries/pushproviders/firebase/src/main/res/values-ko/translations.xml create mode 100644 libraries/pushproviders/firebase/src/main/res/values-nb/translations.xml create mode 100644 libraries/pushproviders/firebase/src/main/res/values-nl/translations.xml create mode 100644 libraries/pushproviders/firebase/src/main/res/values-pl/translations.xml create mode 100644 libraries/pushproviders/firebase/src/main/res/values-pt-rBR/translations.xml create mode 100644 libraries/pushproviders/firebase/src/main/res/values-pt/translations.xml create mode 100644 libraries/pushproviders/firebase/src/main/res/values-ro/translations.xml create mode 100644 libraries/pushproviders/firebase/src/main/res/values-ru/translations.xml create mode 100644 libraries/pushproviders/firebase/src/main/res/values-sk/translations.xml create mode 100644 libraries/pushproviders/firebase/src/main/res/values-sv/translations.xml create mode 100644 libraries/pushproviders/firebase/src/main/res/values-tr/translations.xml create mode 100644 libraries/pushproviders/firebase/src/main/res/values-uk/translations.xml create mode 100644 libraries/pushproviders/firebase/src/main/res/values-ur/translations.xml create mode 100644 libraries/pushproviders/firebase/src/main/res/values-uz/translations.xml create mode 100644 libraries/pushproviders/firebase/src/main/res/values-zh-rTW/translations.xml create mode 100644 libraries/pushproviders/firebase/src/main/res/values-zh/translations.xml create mode 100644 libraries/pushproviders/firebase/src/main/res/values/firebase.xml create mode 100644 libraries/pushproviders/firebase/src/main/res/values/localazy.xml create mode 100644 libraries/pushproviders/firebase/src/test/kotlin/io/element/android/libraries/pushproviders/firebase/DefaultFirebaseNewTokenHandlerTest.kt create mode 100644 libraries/pushproviders/firebase/src/test/kotlin/io/element/android/libraries/pushproviders/firebase/FakeFirebaseGatewayProvider.kt create mode 100644 libraries/pushproviders/firebase/src/test/kotlin/io/element/android/libraries/pushproviders/firebase/FakeFirebaseNewTokenHandler.kt create mode 100644 libraries/pushproviders/firebase/src/test/kotlin/io/element/android/libraries/pushproviders/firebase/FakeFirebaseTokenRotator.kt create mode 100644 libraries/pushproviders/firebase/src/test/kotlin/io/element/android/libraries/pushproviders/firebase/FakeFirebaseTroubleshooter.kt create mode 100644 libraries/pushproviders/firebase/src/test/kotlin/io/element/android/libraries/pushproviders/firebase/FakeIsPlayServiceAvailable.kt create mode 100644 libraries/pushproviders/firebase/src/test/kotlin/io/element/android/libraries/pushproviders/firebase/FirebasePushParserTest.kt create mode 100644 libraries/pushproviders/firebase/src/test/kotlin/io/element/android/libraries/pushproviders/firebase/FirebasePushProviderTest.kt create mode 100644 libraries/pushproviders/firebase/src/test/kotlin/io/element/android/libraries/pushproviders/firebase/InMemoryFirebaseStore.kt create mode 100644 libraries/pushproviders/firebase/src/test/kotlin/io/element/android/libraries/pushproviders/firebase/VectorFirebaseMessagingServiceTest.kt create mode 100644 libraries/pushproviders/firebase/src/test/kotlin/io/element/android/libraries/pushproviders/firebase/troubleshoot/FirebaseAvailabilityTestTest.kt create mode 100644 libraries/pushproviders/firebase/src/test/kotlin/io/element/android/libraries/pushproviders/firebase/troubleshoot/FirebaseTokenTestTest.kt create mode 100644 libraries/pushproviders/test/build.gradle.kts create mode 100644 libraries/pushproviders/test/src/main/kotlin/io/element/android/libraries/pushproviders/test/FakePushProvider.kt create mode 100644 libraries/pushproviders/test/src/main/kotlin/io/element/android/libraries/pushproviders/test/Fixtures.kt create mode 100644 libraries/pushproviders/unifiedpush/build.gradle.kts create mode 100644 libraries/pushproviders/unifiedpush/src/main/AndroidManifest.xml create mode 100644 libraries/pushproviders/unifiedpush/src/main/kotlin/io/element/android/libraries/pushproviders/unifiedpush/DefaultPushGatewayHttpUrlProvider.kt create mode 100644 libraries/pushproviders/unifiedpush/src/main/kotlin/io/element/android/libraries/pushproviders/unifiedpush/GuardServiceStarter.kt create mode 100644 libraries/pushproviders/unifiedpush/src/main/kotlin/io/element/android/libraries/pushproviders/unifiedpush/KeepInternalDistributor.kt create mode 100644 libraries/pushproviders/unifiedpush/src/main/kotlin/io/element/android/libraries/pushproviders/unifiedpush/PushDataUnifiedPush.kt create mode 100644 libraries/pushproviders/unifiedpush/src/main/kotlin/io/element/android/libraries/pushproviders/unifiedpush/RegisterUnifiedPushUseCase.kt create mode 100644 libraries/pushproviders/unifiedpush/src/main/kotlin/io/element/android/libraries/pushproviders/unifiedpush/UnifiedPushApiFactory.kt create mode 100644 libraries/pushproviders/unifiedpush/src/main/kotlin/io/element/android/libraries/pushproviders/unifiedpush/UnifiedPushConfig.kt create mode 100644 libraries/pushproviders/unifiedpush/src/main/kotlin/io/element/android/libraries/pushproviders/unifiedpush/UnifiedPushDistributorProvider.kt create mode 100644 libraries/pushproviders/unifiedpush/src/main/kotlin/io/element/android/libraries/pushproviders/unifiedpush/UnifiedPushGatewayResolver.kt create mode 100644 libraries/pushproviders/unifiedpush/src/main/kotlin/io/element/android/libraries/pushproviders/unifiedpush/UnifiedPushGatewayUrlResolver.kt create mode 100644 libraries/pushproviders/unifiedpush/src/main/kotlin/io/element/android/libraries/pushproviders/unifiedpush/UnifiedPushNewGatewayHandler.kt create mode 100644 libraries/pushproviders/unifiedpush/src/main/kotlin/io/element/android/libraries/pushproviders/unifiedpush/UnifiedPushParser.kt create mode 100644 libraries/pushproviders/unifiedpush/src/main/kotlin/io/element/android/libraries/pushproviders/unifiedpush/UnifiedPushProvider.kt create mode 100644 libraries/pushproviders/unifiedpush/src/main/kotlin/io/element/android/libraries/pushproviders/unifiedpush/UnifiedPushRemovedGatewayHandler.kt create mode 100644 libraries/pushproviders/unifiedpush/src/main/kotlin/io/element/android/libraries/pushproviders/unifiedpush/UnifiedPushSessionPushConfigProvider.kt create mode 100644 libraries/pushproviders/unifiedpush/src/main/kotlin/io/element/android/libraries/pushproviders/unifiedpush/UnifiedPushStore.kt create mode 100644 libraries/pushproviders/unifiedpush/src/main/kotlin/io/element/android/libraries/pushproviders/unifiedpush/UnregisterUnifiedPushUseCase.kt create mode 100644 libraries/pushproviders/unifiedpush/src/main/kotlin/io/element/android/libraries/pushproviders/unifiedpush/VectorUnifiedPushMessagingReceiver.kt create mode 100644 libraries/pushproviders/unifiedpush/src/main/kotlin/io/element/android/libraries/pushproviders/unifiedpush/VectorUnifiedPushMessagingReceiverBindings.kt create mode 100644 libraries/pushproviders/unifiedpush/src/main/kotlin/io/element/android/libraries/pushproviders/unifiedpush/network/DiscoveryResponse.kt create mode 100644 libraries/pushproviders/unifiedpush/src/main/kotlin/io/element/android/libraries/pushproviders/unifiedpush/network/DiscoveryUnifiedPush.kt create mode 100644 libraries/pushproviders/unifiedpush/src/main/kotlin/io/element/android/libraries/pushproviders/unifiedpush/network/UnifiedPushApi.kt create mode 100644 libraries/pushproviders/unifiedpush/src/main/kotlin/io/element/android/libraries/pushproviders/unifiedpush/registration/EndpointRegistrationHandler.kt create mode 100644 libraries/pushproviders/unifiedpush/src/main/kotlin/io/element/android/libraries/pushproviders/unifiedpush/troubleshoot/OpenDistributorWebPageAction.kt create mode 100644 libraries/pushproviders/unifiedpush/src/main/kotlin/io/element/android/libraries/pushproviders/unifiedpush/troubleshoot/UnifiedPushMatrixGatewayTest.kt create mode 100644 libraries/pushproviders/unifiedpush/src/main/kotlin/io/element/android/libraries/pushproviders/unifiedpush/troubleshoot/UnifiedPushTest.kt create mode 100644 libraries/pushproviders/unifiedpush/src/main/res/values-be/translations.xml create mode 100644 libraries/pushproviders/unifiedpush/src/main/res/values-cs/translations.xml create mode 100644 libraries/pushproviders/unifiedpush/src/main/res/values-cy/translations.xml create mode 100644 libraries/pushproviders/unifiedpush/src/main/res/values-da/translations.xml create mode 100644 libraries/pushproviders/unifiedpush/src/main/res/values-de/translations.xml create mode 100644 libraries/pushproviders/unifiedpush/src/main/res/values-el/translations.xml create mode 100644 libraries/pushproviders/unifiedpush/src/main/res/values-es/translations.xml create mode 100644 libraries/pushproviders/unifiedpush/src/main/res/values-et/translations.xml create mode 100644 libraries/pushproviders/unifiedpush/src/main/res/values-eu/translations.xml create mode 100644 libraries/pushproviders/unifiedpush/src/main/res/values-fi/translations.xml create mode 100644 libraries/pushproviders/unifiedpush/src/main/res/values-fr/translations.xml create mode 100644 libraries/pushproviders/unifiedpush/src/main/res/values-hu/translations.xml create mode 100644 libraries/pushproviders/unifiedpush/src/main/res/values-in/translations.xml create mode 100644 libraries/pushproviders/unifiedpush/src/main/res/values-it/translations.xml create mode 100644 libraries/pushproviders/unifiedpush/src/main/res/values-ka/translations.xml create mode 100644 libraries/pushproviders/unifiedpush/src/main/res/values-ko/translations.xml create mode 100644 libraries/pushproviders/unifiedpush/src/main/res/values-nb/translations.xml create mode 100644 libraries/pushproviders/unifiedpush/src/main/res/values-nl/translations.xml create mode 100644 libraries/pushproviders/unifiedpush/src/main/res/values-pl/translations.xml create mode 100644 libraries/pushproviders/unifiedpush/src/main/res/values-pt-rBR/translations.xml create mode 100644 libraries/pushproviders/unifiedpush/src/main/res/values-pt/translations.xml create mode 100644 libraries/pushproviders/unifiedpush/src/main/res/values-ro/translations.xml create mode 100644 libraries/pushproviders/unifiedpush/src/main/res/values-ru/translations.xml create mode 100644 libraries/pushproviders/unifiedpush/src/main/res/values-sk/translations.xml create mode 100644 libraries/pushproviders/unifiedpush/src/main/res/values-sv/translations.xml create mode 100644 libraries/pushproviders/unifiedpush/src/main/res/values-tr/translations.xml create mode 100644 libraries/pushproviders/unifiedpush/src/main/res/values-uk/translations.xml create mode 100644 libraries/pushproviders/unifiedpush/src/main/res/values-ur/translations.xml create mode 100644 libraries/pushproviders/unifiedpush/src/main/res/values-uz/translations.xml create mode 100644 libraries/pushproviders/unifiedpush/src/main/res/values-zh-rTW/translations.xml create mode 100644 libraries/pushproviders/unifiedpush/src/main/res/values-zh/translations.xml create mode 100644 libraries/pushproviders/unifiedpush/src/main/res/values/localazy.xml create mode 100644 libraries/pushproviders/unifiedpush/src/test/kotlin/io/element/android/libraries/pushproviders/unifiedpush/DefaultRegisterUnifiedPushUseCaseTest.kt create mode 100644 libraries/pushproviders/unifiedpush/src/test/kotlin/io/element/android/libraries/pushproviders/unifiedpush/DefaultUnifiedPushCurrentUserPushConfigProviderTest.kt create mode 100644 libraries/pushproviders/unifiedpush/src/test/kotlin/io/element/android/libraries/pushproviders/unifiedpush/DefaultUnifiedPushGatewayResolverTest.kt create mode 100644 libraries/pushproviders/unifiedpush/src/test/kotlin/io/element/android/libraries/pushproviders/unifiedpush/DefaultUnifiedPushGatewayUrlResolverTest.kt create mode 100644 libraries/pushproviders/unifiedpush/src/test/kotlin/io/element/android/libraries/pushproviders/unifiedpush/DefaultUnifiedPushNewGatewayHandlerTest.kt create mode 100644 libraries/pushproviders/unifiedpush/src/test/kotlin/io/element/android/libraries/pushproviders/unifiedpush/DefaultUnifiedPushRemovedGatewayHandlerTest.kt create mode 100644 libraries/pushproviders/unifiedpush/src/test/kotlin/io/element/android/libraries/pushproviders/unifiedpush/DefaultUnregisterUnifiedPushUseCaseTest.kt create mode 100644 libraries/pushproviders/unifiedpush/src/test/kotlin/io/element/android/libraries/pushproviders/unifiedpush/FakeDefaultPushGatewayHttpUrlProvider.kt create mode 100644 libraries/pushproviders/unifiedpush/src/test/kotlin/io/element/android/libraries/pushproviders/unifiedpush/FakeRegisterUnifiedPushUseCase.kt create mode 100644 libraries/pushproviders/unifiedpush/src/test/kotlin/io/element/android/libraries/pushproviders/unifiedpush/FakeUnifiedPushApiFactory.kt create mode 100644 libraries/pushproviders/unifiedpush/src/test/kotlin/io/element/android/libraries/pushproviders/unifiedpush/FakeUnifiedPushGatewayResolver.kt create mode 100644 libraries/pushproviders/unifiedpush/src/test/kotlin/io/element/android/libraries/pushproviders/unifiedpush/FakeUnifiedPushGatewayUrlResolver.kt create mode 100644 libraries/pushproviders/unifiedpush/src/test/kotlin/io/element/android/libraries/pushproviders/unifiedpush/FakeUnifiedPushNewGatewayHandler.kt create mode 100644 libraries/pushproviders/unifiedpush/src/test/kotlin/io/element/android/libraries/pushproviders/unifiedpush/FakeUnifiedPushStore.kt create mode 100644 libraries/pushproviders/unifiedpush/src/test/kotlin/io/element/android/libraries/pushproviders/unifiedpush/FakeUnregisterUnifiedPushUseCase.kt create mode 100644 libraries/pushproviders/unifiedpush/src/test/kotlin/io/element/android/libraries/pushproviders/unifiedpush/UnifiedPushParserTest.kt create mode 100644 libraries/pushproviders/unifiedpush/src/test/kotlin/io/element/android/libraries/pushproviders/unifiedpush/UnifiedPushProviderTest.kt create mode 100644 libraries/pushproviders/unifiedpush/src/test/kotlin/io/element/android/libraries/pushproviders/unifiedpush/VectorUnifiedPushMessagingReceiverTest.kt create mode 100644 libraries/pushproviders/unifiedpush/src/test/kotlin/io/element/android/libraries/pushproviders/unifiedpush/troubleshoot/FakeOpenDistributorWebPageAction.kt create mode 100644 libraries/pushproviders/unifiedpush/src/test/kotlin/io/element/android/libraries/pushproviders/unifiedpush/troubleshoot/FakeUnifiedPushDistributorProvider.kt create mode 100644 libraries/pushproviders/unifiedpush/src/test/kotlin/io/element/android/libraries/pushproviders/unifiedpush/troubleshoot/FakeUnifiedPushSessionPushConfigProvider.kt create mode 100644 libraries/pushproviders/unifiedpush/src/test/kotlin/io/element/android/libraries/pushproviders/unifiedpush/troubleshoot/UnifiedPushMatrixGatewayTestTest.kt create mode 100644 libraries/pushproviders/unifiedpush/src/test/kotlin/io/element/android/libraries/pushproviders/unifiedpush/troubleshoot/UnifiedPushTestTest.kt create mode 100644 libraries/pushstore/api/build.gradle.kts create mode 100644 libraries/pushstore/api/src/main/kotlin/io/element/android/libraries/pushstore/api/UserPushStore.kt create mode 100644 libraries/pushstore/api/src/main/kotlin/io/element/android/libraries/pushstore/api/UserPushStoreFactory.kt create mode 100644 libraries/pushstore/api/src/main/kotlin/io/element/android/libraries/pushstore/api/clientsecret/PushClientSecret.kt create mode 100644 libraries/pushstore/api/src/main/kotlin/io/element/android/libraries/pushstore/api/clientsecret/PushClientSecretFactory.kt create mode 100644 libraries/pushstore/api/src/main/kotlin/io/element/android/libraries/pushstore/api/clientsecret/PushClientSecretStore.kt create mode 100644 libraries/pushstore/impl/build.gradle.kts create mode 100644 libraries/pushstore/impl/src/androidTest/kotlin/io/element/android/libraries/pushstore/impl/DefaultUserPushStoreFactoryTest.kt create mode 100644 libraries/pushstore/impl/src/main/kotlin/io/element/android/libraries/pushstore/impl/DefaultUserPushStoreFactory.kt create mode 100644 libraries/pushstore/impl/src/main/kotlin/io/element/android/libraries/pushstore/impl/UserPushStoreDataStore.kt create mode 100644 libraries/pushstore/impl/src/main/kotlin/io/element/android/libraries/pushstore/impl/clientsecret/DataStorePushClientSecretStore.kt create mode 100644 libraries/pushstore/impl/src/main/kotlin/io/element/android/libraries/pushstore/impl/clientsecret/DefaultPushClientSecret.kt create mode 100644 libraries/pushstore/impl/src/main/kotlin/io/element/android/libraries/pushstore/impl/clientsecret/DefaultPushClientSecretFactory.kt create mode 100644 libraries/pushstore/impl/src/test/kotlin/io/element/android/libraries/pushstore/impl/UserPushStoreDataStoreTest.kt create mode 100644 libraries/pushstore/impl/src/test/kotlin/io/element/android/libraries/pushstore/impl/clientsecret/DefaultPushClientSecretTest.kt create mode 100644 libraries/pushstore/impl/src/test/kotlin/io/element/android/libraries/pushstore/impl/clientsecret/FakePushClientSecretFactory.kt create mode 100644 libraries/pushstore/test/build.gradle.kts create mode 100644 libraries/pushstore/test/src/main/kotlin/io/element/android/libraries/pushstore/test/userpushstore/FakeUserPushStore.kt create mode 100644 libraries/pushstore/test/src/main/kotlin/io/element/android/libraries/pushstore/test/userpushstore/FakeUserPushStoreFactory.kt create mode 100644 libraries/pushstore/test/src/main/kotlin/io/element/android/libraries/pushstore/test/userpushstore/clientsecret/FakePushClientSecret.kt create mode 100644 libraries/pushstore/test/src/main/kotlin/io/element/android/libraries/pushstore/test/userpushstore/clientsecret/InMemoryPushClientSecretStore.kt create mode 100644 libraries/qrcode/build.gradle.kts create mode 100644 libraries/qrcode/src/main/kotlin/io/element/android/libraries/qrcode/QRCodeAnalyzer.kt create mode 100644 libraries/qrcode/src/main/kotlin/io/element/android/libraries/qrcode/QrCodeCameraView.kt create mode 100644 libraries/recentemojis/api/build.gradle.kts create mode 100644 libraries/recentemojis/api/src/main/kotlin/io/element/android/libraries/recentemojis/api/AddRecentEmoji.kt create mode 100644 libraries/recentemojis/api/src/main/kotlin/io/element/android/libraries/recentemojis/api/EmojibaseProvider.kt create mode 100644 libraries/recentemojis/api/src/main/kotlin/io/element/android/libraries/recentemojis/api/GetRecentEmojis.kt create mode 100644 libraries/recentemojis/impl/build.gradle.kts create mode 100644 libraries/recentemojis/impl/src/main/kotlin/io/element/android/libraries/recentemojis/impl/DefaultAddRecentEmoji.kt create mode 100644 libraries/recentemojis/impl/src/main/kotlin/io/element/android/libraries/recentemojis/impl/DefaultEmojibaseProvider.kt create mode 100644 libraries/recentemojis/impl/src/main/kotlin/io/element/android/libraries/recentemojis/impl/DefaultGetRecentEmojis.kt create mode 100644 libraries/recentemojis/impl/src/test/kotlin/io/element/android/libraries/recentemojis/impl/DefaultGetRecentEmojisTest.kt create mode 100644 libraries/recentemojis/test/build.gradle.kts create mode 100644 libraries/recentemojis/test/src/main/kotlin/io/element/android/libraries/recentemojis/test/FakeEmojibaseProvider.kt create mode 100644 libraries/roomselect/api/build.gradle.kts create mode 100644 libraries/roomselect/api/src/main/kotlin/io/element/android/libraries/roomselect/api/RoomSelectEntryPoint.kt create mode 100644 libraries/roomselect/api/src/main/kotlin/io/element/android/libraries/roomselect/api/RoomSelectMode.kt create mode 100644 libraries/roomselect/impl/build.gradle.kts create mode 100644 libraries/roomselect/impl/src/main/kotlin/io/element/android/libraries/roomselect/impl/DefaultRoomSelectEntryPoint.kt create mode 100644 libraries/roomselect/impl/src/main/kotlin/io/element/android/libraries/roomselect/impl/RoomSelectEvents.kt create mode 100644 libraries/roomselect/impl/src/main/kotlin/io/element/android/libraries/roomselect/impl/RoomSelectNode.kt create mode 100644 libraries/roomselect/impl/src/main/kotlin/io/element/android/libraries/roomselect/impl/RoomSelectPresenter.kt create mode 100644 libraries/roomselect/impl/src/main/kotlin/io/element/android/libraries/roomselect/impl/RoomSelectSearchDataSource.kt create mode 100644 libraries/roomselect/impl/src/main/kotlin/io/element/android/libraries/roomselect/impl/RoomSelectState.kt create mode 100644 libraries/roomselect/impl/src/main/kotlin/io/element/android/libraries/roomselect/impl/RoomSelectStateProvider.kt create mode 100644 libraries/roomselect/impl/src/main/kotlin/io/element/android/libraries/roomselect/impl/RoomSelectView.kt create mode 100644 libraries/roomselect/impl/src/test/kotlin/io/element/android/libraries/roomselect/impl/DefaultRoomSelectEntryPointTest.kt create mode 100644 libraries/roomselect/impl/src/test/kotlin/io/element/android/libraries/roomselect/impl/RoomSelectPresenterTest.kt create mode 100644 libraries/roomselect/test/build.gradle.kts create mode 100644 libraries/roomselect/test/src/main/kotlin/io/element/android/libraries/roomselect/test/FakeRoomSelectEntryPoint.kt create mode 100644 libraries/rustsdk/.gitignore create mode 100644 libraries/rustsdk/build.gradle.kts create mode 100644 libraries/session-storage/api/build.gradle.kts create mode 100644 libraries/session-storage/api/src/main/kotlin/io/element/android/libraries/sessionstorage/api/LoggedInState.kt create mode 100644 libraries/session-storage/api/src/main/kotlin/io/element/android/libraries/sessionstorage/api/LoginType.kt create mode 100644 libraries/session-storage/api/src/main/kotlin/io/element/android/libraries/sessionstorage/api/SessionData.kt create mode 100644 libraries/session-storage/api/src/main/kotlin/io/element/android/libraries/sessionstorage/api/SessionStore.kt create mode 100644 libraries/session-storage/api/src/main/kotlin/io/element/android/libraries/sessionstorage/api/observer/SessionListener.kt create mode 100644 libraries/session-storage/api/src/main/kotlin/io/element/android/libraries/sessionstorage/api/observer/SessionObserver.kt create mode 100644 libraries/session-storage/impl/build.gradle.kts create mode 100644 libraries/session-storage/impl/src/main/kotlin/io/element/android/libraries/sessionstorage/impl/DatabaseSessionStore.kt create mode 100644 libraries/session-storage/impl/src/main/kotlin/io/element/android/libraries/sessionstorage/impl/SessionDataMapper.kt create mode 100644 libraries/session-storage/impl/src/main/kotlin/io/element/android/libraries/sessionstorage/impl/di/SessionStorageModule.kt create mode 100644 libraries/session-storage/impl/src/main/kotlin/io/element/android/libraries/sessionstorage/impl/observer/DefaultSessionObserver.kt create mode 100644 libraries/session-storage/impl/src/main/sqldelight/databases/1.db create mode 100644 libraries/session-storage/impl/src/main/sqldelight/databases/10.db create mode 100644 libraries/session-storage/impl/src/main/sqldelight/databases/11.db create mode 100644 libraries/session-storage/impl/src/main/sqldelight/databases/2.db create mode 100644 libraries/session-storage/impl/src/main/sqldelight/databases/3.db create mode 100644 libraries/session-storage/impl/src/main/sqldelight/databases/4.db create mode 100644 libraries/session-storage/impl/src/main/sqldelight/databases/5.db create mode 100644 libraries/session-storage/impl/src/main/sqldelight/databases/6.db create mode 100644 libraries/session-storage/impl/src/main/sqldelight/databases/7.db create mode 100644 libraries/session-storage/impl/src/main/sqldelight/databases/8.db create mode 100644 libraries/session-storage/impl/src/main/sqldelight/databases/9.db create mode 100644 libraries/session-storage/impl/src/main/sqldelight/io/element/android/libraries/matrix/session/SessionData.sq create mode 100644 libraries/session-storage/impl/src/main/sqldelight/migrations/0.sqm create mode 100644 libraries/session-storage/impl/src/main/sqldelight/migrations/1.sqm create mode 100644 libraries/session-storage/impl/src/main/sqldelight/migrations/10.sqm create mode 100644 libraries/session-storage/impl/src/main/sqldelight/migrations/2.sqm create mode 100644 libraries/session-storage/impl/src/main/sqldelight/migrations/3.sqm create mode 100644 libraries/session-storage/impl/src/main/sqldelight/migrations/4.sqm create mode 100644 libraries/session-storage/impl/src/main/sqldelight/migrations/5.sqm create mode 100644 libraries/session-storage/impl/src/main/sqldelight/migrations/6.sqm create mode 100644 libraries/session-storage/impl/src/main/sqldelight/migrations/7.sqm create mode 100644 libraries/session-storage/impl/src/main/sqldelight/migrations/8.sqm create mode 100644 libraries/session-storage/impl/src/main/sqldelight/migrations/9.sqm create mode 100644 libraries/session-storage/impl/src/test/kotlin/io/element/android/libraries/sessionstorage/impl/DatabaseSessionStoreTest.kt create mode 100644 libraries/session-storage/impl/src/test/kotlin/io/element/android/libraries/sessionstorage/impl/Fixtures.kt create mode 100644 libraries/session-storage/impl/src/test/kotlin/io/element/android/libraries/sessionstorage/impl/observer/DefaultSessionObserverTest.kt create mode 100644 libraries/session-storage/impl/src/test/kotlin/io/element/android/libraries/sessionstorage/impl/observer/TestSessionListener.kt create mode 100644 libraries/session-storage/test/build.gradle.kts create mode 100644 libraries/session-storage/test/src/main/kotlin/io/element/android/libraries/sessionstorage/test/InMemorySessionStore.kt create mode 100644 libraries/session-storage/test/src/main/kotlin/io/element/android/libraries/sessionstorage/test/SessionData.kt create mode 100644 libraries/session-storage/test/src/main/kotlin/io/element/android/libraries/sessionstorage/test/observer/FakeSessionObserver.kt create mode 100644 libraries/session-storage/test/src/main/kotlin/io/element/android/libraries/sessionstorage/test/observer/NoOpSessionObserver.kt create mode 100644 libraries/testtags/build.gradle.kts create mode 100644 libraries/testtags/src/main/kotlin/io/element/android/libraries/testtags/Compose.kt create mode 100644 libraries/testtags/src/main/kotlin/io/element/android/libraries/testtags/TestTags.kt create mode 100644 libraries/textcomposer/impl/build.gradle.kts create mode 100644 libraries/textcomposer/impl/src/main/kotlin/io/element/android/libraries/textcomposer/CaptionWarningBottomSheet.kt create mode 100644 libraries/textcomposer/impl/src/main/kotlin/io/element/android/libraries/textcomposer/ComposerModeView.kt create mode 100644 libraries/textcomposer/impl/src/main/kotlin/io/element/android/libraries/textcomposer/ElementRichTextEditorStyle.kt create mode 100644 libraries/textcomposer/impl/src/main/kotlin/io/element/android/libraries/textcomposer/MessageComposerModeSpecialProvider.kt create mode 100644 libraries/textcomposer/impl/src/main/kotlin/io/element/android/libraries/textcomposer/SoftKeyboardEffect.kt create mode 100644 libraries/textcomposer/impl/src/main/kotlin/io/element/android/libraries/textcomposer/TextComposer.kt create mode 100644 libraries/textcomposer/impl/src/main/kotlin/io/element/android/libraries/textcomposer/TextComposerLinkDialog.kt create mode 100644 libraries/textcomposer/impl/src/main/kotlin/io/element/android/libraries/textcomposer/components/FormattingOption.kt create mode 100644 libraries/textcomposer/impl/src/main/kotlin/io/element/android/libraries/textcomposer/components/FormattingOptionState.kt create mode 100644 libraries/textcomposer/impl/src/main/kotlin/io/element/android/libraries/textcomposer/components/LiveWaveformView.kt create mode 100644 libraries/textcomposer/impl/src/main/kotlin/io/element/android/libraries/textcomposer/components/SendButton.kt create mode 100644 libraries/textcomposer/impl/src/main/kotlin/io/element/android/libraries/textcomposer/components/TextFormatting.kt create mode 100644 libraries/textcomposer/impl/src/main/kotlin/io/element/android/libraries/textcomposer/components/TextInputRoundedCornerShape.kt create mode 100644 libraries/textcomposer/impl/src/main/kotlin/io/element/android/libraries/textcomposer/components/VoiceMessageDeleteButton.kt create mode 100644 libraries/textcomposer/impl/src/main/kotlin/io/element/android/libraries/textcomposer/components/VoiceMessagePreview.kt create mode 100644 libraries/textcomposer/impl/src/main/kotlin/io/element/android/libraries/textcomposer/components/VoiceMessageRecorderButton.kt create mode 100644 libraries/textcomposer/impl/src/main/kotlin/io/element/android/libraries/textcomposer/components/VoiceMessageRecording.kt create mode 100644 libraries/textcomposer/impl/src/main/kotlin/io/element/android/libraries/textcomposer/components/markdown/MarkdownEditText.kt create mode 100644 libraries/textcomposer/impl/src/main/kotlin/io/element/android/libraries/textcomposer/components/markdown/MarkdownTextInput.kt create mode 100644 libraries/textcomposer/impl/src/main/kotlin/io/element/android/libraries/textcomposer/components/markdown/StableCharSequence.kt create mode 100644 libraries/textcomposer/impl/src/main/kotlin/io/element/android/libraries/textcomposer/mentions/MentionSpan.kt create mode 100644 libraries/textcomposer/impl/src/main/kotlin/io/element/android/libraries/textcomposer/mentions/MentionSpanFormatter.kt create mode 100644 libraries/textcomposer/impl/src/main/kotlin/io/element/android/libraries/textcomposer/mentions/MentionSpanProvider.kt create mode 100644 libraries/textcomposer/impl/src/main/kotlin/io/element/android/libraries/textcomposer/mentions/MentionSpanTheme.kt create mode 100644 libraries/textcomposer/impl/src/main/kotlin/io/element/android/libraries/textcomposer/mentions/MentionSpanUpdater.kt create mode 100644 libraries/textcomposer/impl/src/main/kotlin/io/element/android/libraries/textcomposer/mentions/ResolvedSuggestion.kt create mode 100644 libraries/textcomposer/impl/src/main/kotlin/io/element/android/libraries/textcomposer/model/Fixtures.kt create mode 100644 libraries/textcomposer/impl/src/main/kotlin/io/element/android/libraries/textcomposer/model/MarkdownTextEditorState.kt create mode 100644 libraries/textcomposer/impl/src/main/kotlin/io/element/android/libraries/textcomposer/model/Message.kt create mode 100644 libraries/textcomposer/impl/src/main/kotlin/io/element/android/libraries/textcomposer/model/MessageComposerMode.kt create mode 100644 libraries/textcomposer/impl/src/main/kotlin/io/element/android/libraries/textcomposer/model/Suggestion.kt create mode 100644 libraries/textcomposer/impl/src/main/kotlin/io/element/android/libraries/textcomposer/model/TextEditorState.kt create mode 100644 libraries/textcomposer/impl/src/main/kotlin/io/element/android/libraries/textcomposer/model/VoiceMessagePlayerEvent.kt create mode 100644 libraries/textcomposer/impl/src/main/kotlin/io/element/android/libraries/textcomposer/model/VoiceMessageRecorderEvent.kt create mode 100644 libraries/textcomposer/impl/src/main/kotlin/io/element/android/libraries/textcomposer/model/VoiceMessageState.kt create mode 100644 libraries/textcomposer/impl/src/main/res/values-be/translations.xml create mode 100644 libraries/textcomposer/impl/src/main/res/values-bg/translations.xml create mode 100644 libraries/textcomposer/impl/src/main/res/values-cs/translations.xml create mode 100644 libraries/textcomposer/impl/src/main/res/values-cy/translations.xml create mode 100644 libraries/textcomposer/impl/src/main/res/values-da/translations.xml create mode 100644 libraries/textcomposer/impl/src/main/res/values-de/translations.xml create mode 100644 libraries/textcomposer/impl/src/main/res/values-el/translations.xml create mode 100644 libraries/textcomposer/impl/src/main/res/values-es/translations.xml create mode 100644 libraries/textcomposer/impl/src/main/res/values-et/translations.xml create mode 100644 libraries/textcomposer/impl/src/main/res/values-eu/translations.xml create mode 100644 libraries/textcomposer/impl/src/main/res/values-fa/translations.xml create mode 100644 libraries/textcomposer/impl/src/main/res/values-fi/translations.xml create mode 100644 libraries/textcomposer/impl/src/main/res/values-fr/translations.xml create mode 100644 libraries/textcomposer/impl/src/main/res/values-hu/translations.xml create mode 100644 libraries/textcomposer/impl/src/main/res/values-in/translations.xml create mode 100644 libraries/textcomposer/impl/src/main/res/values-it/translations.xml create mode 100644 libraries/textcomposer/impl/src/main/res/values-ka/translations.xml create mode 100644 libraries/textcomposer/impl/src/main/res/values-ko/translations.xml create mode 100644 libraries/textcomposer/impl/src/main/res/values-lt/translations.xml create mode 100644 libraries/textcomposer/impl/src/main/res/values-nb/translations.xml create mode 100644 libraries/textcomposer/impl/src/main/res/values-nl/translations.xml create mode 100644 libraries/textcomposer/impl/src/main/res/values-pl/translations.xml create mode 100644 libraries/textcomposer/impl/src/main/res/values-pt-rBR/translations.xml create mode 100644 libraries/textcomposer/impl/src/main/res/values-pt/translations.xml create mode 100644 libraries/textcomposer/impl/src/main/res/values-ro/translations.xml create mode 100644 libraries/textcomposer/impl/src/main/res/values-ru/translations.xml create mode 100644 libraries/textcomposer/impl/src/main/res/values-sk/translations.xml create mode 100644 libraries/textcomposer/impl/src/main/res/values-sv/translations.xml create mode 100644 libraries/textcomposer/impl/src/main/res/values-tr/translations.xml create mode 100644 libraries/textcomposer/impl/src/main/res/values-uk/translations.xml create mode 100644 libraries/textcomposer/impl/src/main/res/values-ur/translations.xml create mode 100644 libraries/textcomposer/impl/src/main/res/values-uz/translations.xml create mode 100644 libraries/textcomposer/impl/src/main/res/values-zh-rTW/translations.xml create mode 100644 libraries/textcomposer/impl/src/main/res/values-zh/translations.xml create mode 100644 libraries/textcomposer/impl/src/main/res/values/localazy.xml create mode 100644 libraries/textcomposer/impl/src/test/kotlin/io/element/android/libraries/textcomposer/impl/components/markdown/MarkdownTextInputTest.kt create mode 100644 libraries/textcomposer/impl/src/test/kotlin/io/element/android/libraries/textcomposer/impl/mentions/IntentionalMentionSpanProviderTest.kt create mode 100644 libraries/textcomposer/impl/src/test/kotlin/io/element/android/libraries/textcomposer/impl/mentions/MentionSpanFormatterTest.kt create mode 100644 libraries/textcomposer/impl/src/test/kotlin/io/element/android/libraries/textcomposer/impl/mentions/MentionSpanProviderFixture.kt create mode 100644 libraries/textcomposer/impl/src/test/kotlin/io/element/android/libraries/textcomposer/impl/model/MarkdownTextEditorStateTest.kt create mode 100644 libraries/textcomposer/lib/.gitignore create mode 100644 libraries/textcomposer/lib/build.gradle.kts create mode 100644 libraries/troubleshoot/api/build.gradle.kts create mode 100644 libraries/troubleshoot/api/src/main/kotlin/io/element/android/libraries/troubleshoot/api/NotificationTroubleShootEntryPoint.kt create mode 100644 libraries/troubleshoot/api/src/main/kotlin/io/element/android/libraries/troubleshoot/api/PushHistoryEntryPoint.kt create mode 100644 libraries/troubleshoot/api/src/main/kotlin/io/element/android/libraries/troubleshoot/api/test/NotificationTroubleshootNavigator.kt create mode 100644 libraries/troubleshoot/api/src/main/kotlin/io/element/android/libraries/troubleshoot/api/test/NotificationTroubleshootTest.kt create mode 100644 libraries/troubleshoot/api/src/main/kotlin/io/element/android/libraries/troubleshoot/api/test/NotificationTroubleshootTestDelegate.kt create mode 100644 libraries/troubleshoot/api/src/main/kotlin/io/element/android/libraries/troubleshoot/api/test/NotificationTroubleshootTestState.kt create mode 100644 libraries/troubleshoot/api/src/main/kotlin/io/element/android/libraries/troubleshoot/api/test/TestFilterData.kt create mode 100644 libraries/troubleshoot/impl/build.gradle.kts create mode 100644 libraries/troubleshoot/impl/src/main/kotlin/io/element/android/libraries/troubleshoot/impl/DefaultNotificationTroubleShootEntryPoint.kt create mode 100644 libraries/troubleshoot/impl/src/main/kotlin/io/element/android/libraries/troubleshoot/impl/TroubleshootNotificationsEvents.kt create mode 100644 libraries/troubleshoot/impl/src/main/kotlin/io/element/android/libraries/troubleshoot/impl/TroubleshootNotificationsNode.kt create mode 100644 libraries/troubleshoot/impl/src/main/kotlin/io/element/android/libraries/troubleshoot/impl/TroubleshootNotificationsPresenter.kt create mode 100644 libraries/troubleshoot/impl/src/main/kotlin/io/element/android/libraries/troubleshoot/impl/TroubleshootNotificationsState.kt create mode 100644 libraries/troubleshoot/impl/src/main/kotlin/io/element/android/libraries/troubleshoot/impl/TroubleshootNotificationsStateProvider.kt create mode 100644 libraries/troubleshoot/impl/src/main/kotlin/io/element/android/libraries/troubleshoot/impl/TroubleshootNotificationsView.kt create mode 100644 libraries/troubleshoot/impl/src/main/kotlin/io/element/android/libraries/troubleshoot/impl/TroubleshootTestSuite.kt create mode 100644 libraries/troubleshoot/impl/src/main/kotlin/io/element/android/libraries/troubleshoot/impl/TroubleshootTestSuiteState.kt create mode 100644 libraries/troubleshoot/impl/src/main/kotlin/io/element/android/libraries/troubleshoot/impl/history/DefaultPushHistoryEntryPoint.kt create mode 100644 libraries/troubleshoot/impl/src/main/kotlin/io/element/android/libraries/troubleshoot/impl/history/PushHistoryEvents.kt create mode 100644 libraries/troubleshoot/impl/src/main/kotlin/io/element/android/libraries/troubleshoot/impl/history/PushHistoryNode.kt create mode 100644 libraries/troubleshoot/impl/src/main/kotlin/io/element/android/libraries/troubleshoot/impl/history/PushHistoryPresenter.kt create mode 100644 libraries/troubleshoot/impl/src/main/kotlin/io/element/android/libraries/troubleshoot/impl/history/PushHistoryState.kt create mode 100644 libraries/troubleshoot/impl/src/main/kotlin/io/element/android/libraries/troubleshoot/impl/history/PushHistoryStateProvider.kt create mode 100644 libraries/troubleshoot/impl/src/main/kotlin/io/element/android/libraries/troubleshoot/impl/history/PushHistoryView.kt create mode 100644 libraries/troubleshoot/impl/src/main/res/values-be/translations.xml create mode 100644 libraries/troubleshoot/impl/src/main/res/values-bg/translations.xml create mode 100644 libraries/troubleshoot/impl/src/main/res/values-cs/translations.xml create mode 100644 libraries/troubleshoot/impl/src/main/res/values-cy/translations.xml create mode 100644 libraries/troubleshoot/impl/src/main/res/values-da/translations.xml create mode 100644 libraries/troubleshoot/impl/src/main/res/values-de/translations.xml create mode 100644 libraries/troubleshoot/impl/src/main/res/values-el/translations.xml create mode 100644 libraries/troubleshoot/impl/src/main/res/values-es/translations.xml create mode 100644 libraries/troubleshoot/impl/src/main/res/values-et/translations.xml create mode 100644 libraries/troubleshoot/impl/src/main/res/values-eu/translations.xml create mode 100644 libraries/troubleshoot/impl/src/main/res/values-fa/translations.xml create mode 100644 libraries/troubleshoot/impl/src/main/res/values-fi/translations.xml create mode 100644 libraries/troubleshoot/impl/src/main/res/values-fr/translations.xml create mode 100644 libraries/troubleshoot/impl/src/main/res/values-hu/translations.xml create mode 100644 libraries/troubleshoot/impl/src/main/res/values-in/translations.xml create mode 100644 libraries/troubleshoot/impl/src/main/res/values-it/translations.xml create mode 100644 libraries/troubleshoot/impl/src/main/res/values-ka/translations.xml create mode 100644 libraries/troubleshoot/impl/src/main/res/values-ko/translations.xml create mode 100644 libraries/troubleshoot/impl/src/main/res/values-nb/translations.xml create mode 100644 libraries/troubleshoot/impl/src/main/res/values-nl/translations.xml create mode 100644 libraries/troubleshoot/impl/src/main/res/values-pl/translations.xml create mode 100644 libraries/troubleshoot/impl/src/main/res/values-pt-rBR/translations.xml create mode 100644 libraries/troubleshoot/impl/src/main/res/values-pt/translations.xml create mode 100644 libraries/troubleshoot/impl/src/main/res/values-ro/translations.xml create mode 100644 libraries/troubleshoot/impl/src/main/res/values-ru/translations.xml create mode 100644 libraries/troubleshoot/impl/src/main/res/values-sk/translations.xml create mode 100644 libraries/troubleshoot/impl/src/main/res/values-sv/translations.xml create mode 100644 libraries/troubleshoot/impl/src/main/res/values-tr/translations.xml create mode 100644 libraries/troubleshoot/impl/src/main/res/values-uk/translations.xml create mode 100644 libraries/troubleshoot/impl/src/main/res/values-ur/translations.xml create mode 100644 libraries/troubleshoot/impl/src/main/res/values-uz/translations.xml create mode 100644 libraries/troubleshoot/impl/src/main/res/values-zh-rTW/translations.xml create mode 100644 libraries/troubleshoot/impl/src/main/res/values-zh/translations.xml create mode 100644 libraries/troubleshoot/impl/src/main/res/values/localazy.xml create mode 100644 libraries/troubleshoot/impl/src/test/kotlin/io/element/android/libraries/troubleshoot/impl/DefaultNotificationTroubleShootEntryPointTest.kt create mode 100644 libraries/troubleshoot/impl/src/test/kotlin/io/element/android/libraries/troubleshoot/impl/FakeNotificationTroubleshootTest.kt create mode 100644 libraries/troubleshoot/impl/src/test/kotlin/io/element/android/libraries/troubleshoot/impl/TroubleshootNotificationsPresenterTest.kt create mode 100644 libraries/troubleshoot/impl/src/test/kotlin/io/element/android/libraries/troubleshoot/impl/TroubleshootNotificationsViewTest.kt create mode 100644 libraries/troubleshoot/impl/src/test/kotlin/io/element/android/libraries/troubleshoot/impl/history/DefaultPushHistoryEntryPointTest.kt create mode 100644 libraries/troubleshoot/impl/src/test/kotlin/io/element/android/libraries/troubleshoot/impl/history/PushHistoryPresenterTest.kt create mode 100644 libraries/troubleshoot/impl/src/test/kotlin/io/element/android/libraries/troubleshoot/impl/history/PushHistoryViewTest.kt create mode 100644 libraries/troubleshoot/test/build.gradle.kts create mode 100644 libraries/troubleshoot/test/src/main/kotlin/io/element/android/libraries/troubleshoot/test/FakeNotificationTroubleShootEntryPoint.kt create mode 100644 libraries/troubleshoot/test/src/main/kotlin/io/element/android/libraries/troubleshoot/test/FakeNotificationTroubleshootNavigator.kt create mode 100644 libraries/troubleshoot/test/src/main/kotlin/io/element/android/libraries/troubleshoot/test/FakePushHistoryEntryPoint.kt create mode 100644 libraries/troubleshoot/test/src/main/kotlin/io/element/android/libraries/troubleshoot/test/Utils.kt create mode 100644 libraries/ui-common/build.gradle.kts create mode 100644 libraries/ui-common/src/main/kotlin/io/element/android/libraries/ui/common/nodes/EmptyNode.kt create mode 100644 libraries/ui-strings/README.md create mode 100644 libraries/ui-strings/build.gradle.kts create mode 100644 libraries/ui-strings/src/main/kotlin/io/element/android/libraries/ui/strings/CommonPlurals.kt create mode 100644 libraries/ui-strings/src/main/kotlin/io/element/android/libraries/ui/strings/CommonStrings.kt create mode 100644 libraries/ui-strings/src/main/res/values-be/translations.xml create mode 100644 libraries/ui-strings/src/main/res/values-bg/translations.xml create mode 100644 libraries/ui-strings/src/main/res/values-cs/translations.xml create mode 100644 libraries/ui-strings/src/main/res/values-cy/translations.xml create mode 100644 libraries/ui-strings/src/main/res/values-da/translations.xml create mode 100644 libraries/ui-strings/src/main/res/values-de/translations.xml create mode 100644 libraries/ui-strings/src/main/res/values-el/translations.xml create mode 100644 libraries/ui-strings/src/main/res/values-en-rUS/translations.xml create mode 100644 libraries/ui-strings/src/main/res/values-es/translations.xml create mode 100644 libraries/ui-strings/src/main/res/values-et/translations.xml create mode 100644 libraries/ui-strings/src/main/res/values-eu/translations.xml create mode 100644 libraries/ui-strings/src/main/res/values-fa/translations.xml create mode 100644 libraries/ui-strings/src/main/res/values-fi/translations.xml create mode 100644 libraries/ui-strings/src/main/res/values-fr/translations.xml create mode 100644 libraries/ui-strings/src/main/res/values-hu/translations.xml create mode 100644 libraries/ui-strings/src/main/res/values-in/translations.xml create mode 100644 libraries/ui-strings/src/main/res/values-it/translations.xml create mode 100644 libraries/ui-strings/src/main/res/values-ka/translations.xml create mode 100644 libraries/ui-strings/src/main/res/values-ko/translations.xml create mode 100644 libraries/ui-strings/src/main/res/values-lt/translations.xml create mode 100644 libraries/ui-strings/src/main/res/values-nb/translations.xml create mode 100644 libraries/ui-strings/src/main/res/values-nl/translations.xml create mode 100644 libraries/ui-strings/src/main/res/values-pl/translations.xml create mode 100644 libraries/ui-strings/src/main/res/values-pt-rBR/translations.xml create mode 100644 libraries/ui-strings/src/main/res/values-pt/translations.xml create mode 100644 libraries/ui-strings/src/main/res/values-ro/translations.xml create mode 100644 libraries/ui-strings/src/main/res/values-ru/translations.xml create mode 100644 libraries/ui-strings/src/main/res/values-sk/translations.xml create mode 100644 libraries/ui-strings/src/main/res/values-sv/translations.xml create mode 100644 libraries/ui-strings/src/main/res/values-tr/translations.xml create mode 100644 libraries/ui-strings/src/main/res/values-uk/translations.xml create mode 100644 libraries/ui-strings/src/main/res/values-ur/translations.xml create mode 100644 libraries/ui-strings/src/main/res/values-uz/translations.xml create mode 100644 libraries/ui-strings/src/main/res/values-zh-rTW/translations.xml create mode 100644 libraries/ui-strings/src/main/res/values-zh/translations.xml create mode 100644 libraries/ui-strings/src/main/res/values/localazy.xml create mode 100644 libraries/ui-utils/build.gradle.kts create mode 100644 libraries/ui-utils/src/main/kotlin/io/element/android/libraries/ui/utils/MultipleTapToUnlock.kt create mode 100644 libraries/ui-utils/src/main/kotlin/io/element/android/libraries/ui/utils/formatter/FIleSizeFormatter.kt create mode 100644 libraries/ui-utils/src/main/kotlin/io/element/android/libraries/ui/utils/time/DurationExt.kt create mode 100644 libraries/ui-utils/src/main/kotlin/io/element/android/libraries/ui/utils/time/IsTalkbackEnabled.kt create mode 100644 libraries/ui-utils/src/main/kotlin/io/element/android/libraries/ui/utils/time/KeyEventExt.kt create mode 100644 libraries/ui-utils/src/main/kotlin/io/element/android/libraries/ui/utils/version/LocalSdkIntVersionProvider.kt create mode 100644 libraries/ui-utils/src/test/kotlin/io/element/android/libraries/ui/utils/MultipleTapToUnlockTest.kt create mode 100644 libraries/ui-utils/src/test/kotlin/io/element/android/libraries/ui/utils/time/DurationFormatTest.kt create mode 100644 libraries/usersearch/api/build.gradle.kts create mode 100644 libraries/usersearch/api/src/main/kotlin/io/element/android/libraries/usersearch/api/UserListDataSource.kt create mode 100644 libraries/usersearch/api/src/main/kotlin/io/element/android/libraries/usersearch/api/UserRepository.kt create mode 100644 libraries/usersearch/api/src/main/kotlin/io/element/android/libraries/usersearch/api/UserSearchResult.kt create mode 100644 libraries/usersearch/impl/build.gradle.kts create mode 100644 libraries/usersearch/impl/src/main/kotlin/io/element/android/libraries/usersearch/impl/MatrixUserListDataSource.kt create mode 100644 libraries/usersearch/impl/src/main/kotlin/io/element/android/libraries/usersearch/impl/MatrixUserRepository.kt create mode 100644 libraries/usersearch/impl/src/test/kotlin/io/element/android/libraries/usersearch/impl/MatrixUserListDataSourceTest.kt create mode 100644 libraries/usersearch/impl/src/test/kotlin/io/element/android/libraries/usersearch/impl/MatrixUserRepositoryTest.kt create mode 100644 libraries/usersearch/test/build.gradle.kts create mode 100644 libraries/usersearch/test/src/main/kotlin/io/element/android/libraries/usersearch/test/FakeUserListDataSource.kt create mode 100644 libraries/usersearch/test/src/main/kotlin/io/element/android/libraries/usersearch/test/FakeUserRepository.kt create mode 100644 libraries/voiceplayer/api/build.gradle.kts create mode 100644 libraries/voiceplayer/api/src/main/kotlin/io/element/android/libraries/voiceplayer/api/VoiceMessageEvents.kt create mode 100644 libraries/voiceplayer/api/src/main/kotlin/io/element/android/libraries/voiceplayer/api/VoiceMessageException.kt create mode 100644 libraries/voiceplayer/api/src/main/kotlin/io/element/android/libraries/voiceplayer/api/VoiceMessagePresenterFactory.kt create mode 100644 libraries/voiceplayer/api/src/main/kotlin/io/element/android/libraries/voiceplayer/api/VoiceMessageState.kt create mode 100644 libraries/voiceplayer/api/src/main/kotlin/io/element/android/libraries/voiceplayer/api/VoiceMessageStateProvider.kt create mode 100644 libraries/voiceplayer/impl/build.gradle.kts create mode 100644 libraries/voiceplayer/impl/src/main/kotlin/io/element/android/libraries/voiceplayer/impl/DefaultVoiceMessagePresenterFactory.kt create mode 100644 libraries/voiceplayer/impl/src/main/kotlin/io/element/android/libraries/voiceplayer/impl/VoiceMessageMediaRepo.kt create mode 100644 libraries/voiceplayer/impl/src/main/kotlin/io/element/android/libraries/voiceplayer/impl/VoiceMessagePlayer.kt create mode 100644 libraries/voiceplayer/impl/src/main/kotlin/io/element/android/libraries/voiceplayer/impl/VoiceMessagePresenter.kt create mode 100644 libraries/voiceplayer/impl/src/test/kotlin/io/element/android/libraries/voiceplayer/impl/DefaultVoiceMessageMediaRepoTest.kt create mode 100644 libraries/voiceplayer/impl/src/test/kotlin/io/element/android/libraries/voiceplayer/impl/DefaultVoiceMessagePlayerTest.kt create mode 100644 libraries/voiceplayer/impl/src/test/kotlin/io/element/android/libraries/voiceplayer/impl/FakeVoiceMessageMediaRepo.kt create mode 100644 libraries/voiceplayer/impl/src/test/kotlin/io/element/android/libraries/voiceplayer/impl/VoiceMessagePresenterTest.kt create mode 100644 libraries/voicerecorder/api/build.gradle.kts create mode 100644 libraries/voicerecorder/api/src/main/kotlin/io/element/android/libraries/voicerecorder/api/VoiceRecorder.kt create mode 100644 libraries/voicerecorder/api/src/main/kotlin/io/element/android/libraries/voicerecorder/api/VoiceRecorderState.kt create mode 100644 libraries/voicerecorder/impl/build.gradle.kts create mode 100644 libraries/voicerecorder/impl/src/main/kotlin/io/element/android/libraries/voicerecorder/impl/DefaultVoiceRecorder.kt create mode 100644 libraries/voicerecorder/impl/src/main/kotlin/io/element/android/libraries/voicerecorder/impl/audio/AndroidAudioReader.kt create mode 100644 libraries/voicerecorder/impl/src/main/kotlin/io/element/android/libraries/voicerecorder/impl/audio/Audio.kt create mode 100644 libraries/voicerecorder/impl/src/main/kotlin/io/element/android/libraries/voicerecorder/impl/audio/AudioConfig.kt create mode 100644 libraries/voicerecorder/impl/src/main/kotlin/io/element/android/libraries/voicerecorder/impl/audio/AudioLevelCalculator.kt create mode 100644 libraries/voicerecorder/impl/src/main/kotlin/io/element/android/libraries/voicerecorder/impl/audio/AudioReader.kt create mode 100644 libraries/voicerecorder/impl/src/main/kotlin/io/element/android/libraries/voicerecorder/impl/audio/DBovAudioLevelCalculator.kt create mode 100644 libraries/voicerecorder/impl/src/main/kotlin/io/element/android/libraries/voicerecorder/impl/audio/DefaultEncoder.kt create mode 100644 libraries/voicerecorder/impl/src/main/kotlin/io/element/android/libraries/voicerecorder/impl/audio/Encoder.kt create mode 100644 libraries/voicerecorder/impl/src/main/kotlin/io/element/android/libraries/voicerecorder/impl/audio/Resample.kt create mode 100644 libraries/voicerecorder/impl/src/main/kotlin/io/element/android/libraries/voicerecorder/impl/audio/SampleRate.kt create mode 100644 libraries/voicerecorder/impl/src/main/kotlin/io/element/android/libraries/voicerecorder/impl/di/VoiceRecorderModule.kt create mode 100644 libraries/voicerecorder/impl/src/main/kotlin/io/element/android/libraries/voicerecorder/impl/file/DefaultVoiceFileManager.kt create mode 100644 libraries/voicerecorder/impl/src/main/kotlin/io/element/android/libraries/voicerecorder/impl/file/VoiceFileConfig.kt create mode 100644 libraries/voicerecorder/impl/src/main/kotlin/io/element/android/libraries/voicerecorder/impl/file/VoiceFileManager.kt create mode 100644 libraries/voicerecorder/impl/src/test/kotlin/io/element/android/libraries/voicerecorder/impl/DefaultVoiceRecorderTest.kt create mode 100644 libraries/voicerecorder/impl/src/test/kotlin/io/element/android/libraries/voicerecorder/impl/audio/DBovAudioLevelCalculatorTest.kt create mode 100644 libraries/voicerecorder/impl/src/test/kotlin/io/element/android/libraries/voicerecorder/impl/audio/ResampleTest.kt create mode 100644 libraries/voicerecorder/impl/src/test/kotlin/io/element/android/libraries/voicerecorder/test/FakeAudioLevelCalculator.kt create mode 100644 libraries/voicerecorder/impl/src/test/kotlin/io/element/android/libraries/voicerecorder/test/FakeAudioReader.kt create mode 100644 libraries/voicerecorder/impl/src/test/kotlin/io/element/android/libraries/voicerecorder/test/FakeAudioReaderFactory.kt create mode 100644 libraries/voicerecorder/impl/src/test/kotlin/io/element/android/libraries/voicerecorder/test/FakeEncoder.kt create mode 100644 libraries/voicerecorder/impl/src/test/kotlin/io/element/android/libraries/voicerecorder/test/FakeFileSystem.kt create mode 100644 libraries/voicerecorder/impl/src/test/kotlin/io/element/android/libraries/voicerecorder/test/FakeVoiceFileManager.kt create mode 100644 libraries/voicerecorder/test/build.gradle.kts create mode 100644 libraries/voicerecorder/test/src/main/kotlin/io/element/android/libraries/voicerecorder/test/FakeVoiceRecorder.kt create mode 100644 libraries/wellknown/api/build.gradle.kts create mode 100644 libraries/wellknown/api/src/main/kotlin/io/element/android/libraries/wellknown/api/ElementWellKnown.kt create mode 100644 libraries/wellknown/api/src/main/kotlin/io/element/android/libraries/wellknown/api/SessionWellknownRetriever.kt create mode 100644 libraries/wellknown/api/src/main/kotlin/io/element/android/libraries/wellknown/api/WellknownRetriever.kt create mode 100644 libraries/wellknown/api/src/main/kotlin/io/element/android/libraries/wellknown/api/WellknownRetrieverResult.kt create mode 100644 libraries/wellknown/impl/build.gradle.kts create mode 100644 libraries/wellknown/impl/src/main/kotlin/io/element/android/libraries/wellknown/impl/DefaultSessionWellknownRetriever.kt create mode 100644 libraries/wellknown/impl/src/main/kotlin/io/element/android/libraries/wellknown/impl/DefaultWellknownRetriever.kt create mode 100644 libraries/wellknown/impl/src/main/kotlin/io/element/android/libraries/wellknown/impl/InternalElementWellKnown.kt create mode 100644 libraries/wellknown/impl/src/main/kotlin/io/element/android/libraries/wellknown/impl/InternalWellKnown.kt create mode 100644 libraries/wellknown/impl/src/main/kotlin/io/element/android/libraries/wellknown/impl/InternalWellKnownBaseConfig.kt create mode 100644 libraries/wellknown/impl/src/main/kotlin/io/element/android/libraries/wellknown/impl/Mapper.kt create mode 100644 libraries/wellknown/impl/src/main/kotlin/io/element/android/libraries/wellknown/impl/WellknownAPI.kt create mode 100644 libraries/wellknown/impl/src/test/kotlin/io/element/android/libraries/wellknown/impl/DefaultSessionWellknownRetrieverTest.kt create mode 100644 libraries/wellknown/test/build.gradle.kts create mode 100644 libraries/wellknown/test/src/main/kotlin/io/element/android/features/wellknown/test/FakeSessionWellknownRetriever.kt create mode 100644 libraries/wellknown/test/src/main/kotlin/io/element/android/features/wellknown/test/FakeWellknownRetriever.kt create mode 100644 libraries/wellknown/test/src/main/kotlin/io/element/android/features/wellknown/test/Fixtures.kt create mode 100644 libraries/workmanager/api/build.gradle.kts create mode 100644 libraries/workmanager/api/src/main/kotlin/io/element/android/libraries/workmanager/api/WorkManagerRequest.kt create mode 100644 libraries/workmanager/api/src/main/kotlin/io/element/android/libraries/workmanager/api/WorkManagerScheduler.kt create mode 100644 libraries/workmanager/api/src/main/kotlin/io/element/android/libraries/workmanager/api/di/MetroWorkerFactory.kt create mode 100644 libraries/workmanager/api/src/main/kotlin/io/element/android/libraries/workmanager/api/di/WorkerKey.kt create mode 100644 libraries/workmanager/impl/build.gradle.kts create mode 100644 libraries/workmanager/impl/src/main/kotlin/io/element/android/libraries/workmanager/impl/DefaultWorkManagerScheduler.kt create mode 100644 libraries/workmanager/test/build.gradle.kts create mode 100644 libraries/workmanager/test/src/main/kotlin/io/element/android/libraries/workmanager/test/FakeWorkManagerScheduler.kt create mode 100644 plugins/build.gradle.kts create mode 100644 plugins/settings.gradle.kts create mode 100644 plugins/src/main/kotlin/Enterprise.kt create mode 100644 plugins/src/main/kotlin/Logger.kt create mode 100644 plugins/src/main/kotlin/ModulesConfig.kt create mode 100644 plugins/src/main/kotlin/Versions.kt create mode 100644 plugins/src/main/kotlin/config/AnalyticsConfig.kt create mode 100644 plugins/src/main/kotlin/config/BuildTimeConfig.kt create mode 100644 plugins/src/main/kotlin/config/PushProvidersConfig.kt create mode 100644 plugins/src/main/kotlin/extension/AssetCopyTask.kt create mode 100644 plugins/src/main/kotlin/extension/CommonExtension.kt create mode 100644 plugins/src/main/kotlin/extension/DependencyHandleScope.kt create mode 100644 plugins/src/main/kotlin/extension/DependencyInjectionExtensions.kt create mode 100644 plugins/src/main/kotlin/extension/KoverExtension.kt create mode 100644 plugins/src/main/kotlin/extension/Utils.kt create mode 100644 plugins/src/main/kotlin/extension/VariantDimensionExtension.kt create mode 100644 plugins/src/main/kotlin/extension/VersionCatalog.kt create mode 100644 plugins/src/main/kotlin/extension/locales.kt create mode 100644 plugins/src/main/kotlin/io.element.android-compose-application.gradle.kts create mode 100644 plugins/src/main/kotlin/io.element.android-compose-library.gradle.kts create mode 100644 plugins/src/main/kotlin/io.element.android-library.gradle.kts create mode 100644 plugins/src/main/kotlin/io.element.android-root.gradle.kts create mode 100644 screenshots/README.md create mode 100644 screenshots/de/appnav.loggedin_LoggedInView_Day_1_de.png create mode 100644 screenshots/de/appnav.loggedin_LoggedInView_Day_2_de.png create mode 100644 screenshots/de/appnav.loggedin_LoggedInView_Day_3_de.png create mode 100644 screenshots/de/appnav.loggedin_SyncStateView_Day_0_de.png create mode 100644 screenshots/de/appnav.room.joined_LoadingRoomNodeView_Day_1_de.png create mode 100644 screenshots/de/appnav.root_RootView_Day_0_de.png create mode 100644 screenshots/de/appnav.root_RootView_Day_1_de.png create mode 100644 screenshots/de/appnav.root_RootView_Day_2_de.png create mode 100644 screenshots/de/features.analytics.api.preferences_AnalyticsPreferencesView_Day_0_de.png create mode 100644 screenshots/de/features.analytics.api.preferences_AnalyticsPreferencesView_Day_1_de.png create mode 100644 screenshots/de/features.analytics.impl_AnalyticsOptInView_Day_0_de.png create mode 100644 screenshots/de/features.analytics.impl_AnalyticsOptInView_Day_1_de.png create mode 100644 screenshots/de/features.announcement.impl.spaces_SpaceAnnouncementView_Day_0_de.png create mode 100644 screenshots/de/features.call.impl.ui_CallScreenView_Day_1_de.png create mode 100644 screenshots/de/features.call.impl.ui_CallScreenView_Day_2_de.png create mode 100644 screenshots/de/features.call.impl.ui_CallScreenView_Day_3_de.png create mode 100644 screenshots/de/features.call.impl.ui_IncomingCallScreen_Day_0_de.png create mode 100644 screenshots/de/features.call.impl.ui_InvalidAudioDeviceDialog_Day_0_de.png create mode 100644 screenshots/de/features.createroom.impl.addpeople_AddPeopleView_Day_0_de.png create mode 100644 screenshots/de/features.createroom.impl.addpeople_AddPeopleView_Day_1_de.png create mode 100644 screenshots/de/features.createroom.impl.addpeople_AddPeopleView_Day_2_de.png create mode 100644 screenshots/de/features.createroom.impl.addpeople_AddPeopleView_Day_3_de.png create mode 100644 screenshots/de/features.createroom.impl.configureroom_ConfigureRoomViewDark_0_de.png create mode 100644 screenshots/de/features.createroom.impl.configureroom_ConfigureRoomViewDark_1_de.png create mode 100644 screenshots/de/features.createroom.impl.configureroom_ConfigureRoomViewDark_2_de.png create mode 100644 screenshots/de/features.createroom.impl.configureroom_ConfigureRoomViewDark_3_de.png create mode 100644 screenshots/de/features.createroom.impl.configureroom_ConfigureRoomViewDark_4_de.png create mode 100644 screenshots/de/features.createroom.impl.configureroom_ConfigureRoomViewDark_5_de.png create mode 100644 screenshots/de/features.createroom.impl.configureroom_ConfigureRoomViewLight_0_de.png create mode 100644 screenshots/de/features.createroom.impl.configureroom_ConfigureRoomViewLight_1_de.png create mode 100644 screenshots/de/features.createroom.impl.configureroom_ConfigureRoomViewLight_2_de.png create mode 100644 screenshots/de/features.createroom.impl.configureroom_ConfigureRoomViewLight_3_de.png create mode 100644 screenshots/de/features.createroom.impl.configureroom_ConfigureRoomViewLight_4_de.png create mode 100644 screenshots/de/features.createroom.impl.configureroom_ConfigureRoomViewLight_5_de.png create mode 100644 screenshots/de/features.forward.impl_ForwardMessagesView_Day_3_de.png create mode 100644 screenshots/de/features.ftue.impl.notifications_NotificationsOptInView_Day_0_de.png create mode 100644 screenshots/de/features.ftue.impl.sessionverification.choosemode_ChooseSelfVerificationModeView_Day_0_de.png create mode 100644 screenshots/de/features.ftue.impl.sessionverification.choosemode_ChooseSelfVerificationModeView_Day_1_de.png create mode 100644 screenshots/de/features.ftue.impl.sessionverification.choosemode_ChooseSelfVerificationModeView_Day_2_de.png create mode 100644 screenshots/de/features.ftue.impl.sessionverification.choosemode_ChooseSelfVerificationModeView_Day_3_de.png create mode 100644 screenshots/de/features.ftue.impl.sessionverification.choosemode_ChooseSelfVerificationModeView_Day_4_de.png create mode 100644 screenshots/de/features.home.impl.components_BatteryOptimizationBanner_Day_0_de.png create mode 100644 screenshots/de/features.home.impl.components_ConfirmRecoveryKeyBanner_Day_0_de.png create mode 100644 screenshots/de/features.home.impl.components_FullScreenIntentPermissionBanner_Day_0_de.png create mode 100644 screenshots/de/features.home.impl.components_HomeTopBarMultiAccount_Day_0_de.png create mode 100644 screenshots/de/features.home.impl.components_HomeTopBarWithIndicator_Day_0_de.png create mode 100644 screenshots/de/features.home.impl.components_HomeTopBar_Day_0_de.png create mode 100644 screenshots/de/features.home.impl.components_NewNotificationSoundBanner_Day_0_de.png create mode 100644 screenshots/de/features.home.impl.components_RoomListContentView_Day_0_de.png create mode 100644 screenshots/de/features.home.impl.components_RoomListContentView_Day_1_de.png create mode 100644 screenshots/de/features.home.impl.components_RoomListContentView_Day_3_de.png create mode 100644 screenshots/de/features.home.impl.components_RoomListContentView_Day_4_de.png create mode 100644 screenshots/de/features.home.impl.components_RoomListContentView_Day_5_de.png create mode 100644 screenshots/de/features.home.impl.components_RoomSummaryRow_Day_29_de.png create mode 100644 screenshots/de/features.home.impl.components_RoomSummaryRow_Day_2_de.png create mode 100644 screenshots/de/features.home.impl.components_RoomSummaryRow_Day_30_de.png create mode 100644 screenshots/de/features.home.impl.components_RoomSummaryRow_Day_31_de.png create mode 100644 screenshots/de/features.home.impl.components_RoomSummaryRow_Day_32_de.png create mode 100644 screenshots/de/features.home.impl.components_RoomSummaryRow_Day_33_de.png create mode 100644 screenshots/de/features.home.impl.components_RoomSummaryRow_Day_34_de.png create mode 100644 screenshots/de/features.home.impl.components_RoomSummaryRow_Day_35_de.png create mode 100644 screenshots/de/features.home.impl.components_SetUpRecoveryKeyBanner_Day_0_de.png create mode 100644 screenshots/de/features.home.impl.filters_RoomListFiltersView_Day_0_de.png create mode 100644 screenshots/de/features.home.impl.filters_RoomListFiltersView_Day_1_de.png create mode 100644 screenshots/de/features.home.impl.roomlist_RoomListDeclineInviteMenuContent_Day_0_de.png create mode 100644 screenshots/de/features.home.impl.roomlist_RoomListModalBottomSheetContent_Day_0_de.png create mode 100644 screenshots/de/features.home.impl.roomlist_RoomListModalBottomSheetContent_Day_1_de.png create mode 100644 screenshots/de/features.home.impl.roomlist_RoomListModalBottomSheetContent_Day_2_de.png create mode 100644 screenshots/de/features.home.impl.search_RoomListSearchContent_Day_1_de.png create mode 100644 screenshots/de/features.home.impl.spaces_HomeSpacesView_Day_0_de.png create mode 100644 screenshots/de/features.home.impl.spaces_HomeSpacesView_Day_1_de.png create mode 100644 screenshots/de/features.home.impl_HomeView_Day_0_de.png create mode 100644 screenshots/de/features.home.impl_HomeView_Day_10_de.png create mode 100644 screenshots/de/features.home.impl_HomeView_Day_13_de.png create mode 100644 screenshots/de/features.home.impl_HomeView_Day_14_de.png create mode 100644 screenshots/de/features.home.impl_HomeView_Day_15_de.png create mode 100644 screenshots/de/features.home.impl_HomeView_Day_1_de.png create mode 100644 screenshots/de/features.home.impl_HomeView_Day_2_de.png create mode 100644 screenshots/de/features.home.impl_HomeView_Day_3_de.png create mode 100644 screenshots/de/features.home.impl_HomeView_Day_4_de.png create mode 100644 screenshots/de/features.home.impl_HomeView_Day_5_de.png create mode 100644 screenshots/de/features.home.impl_HomeView_Day_6_de.png create mode 100644 screenshots/de/features.home.impl_HomeView_Day_7_de.png create mode 100644 screenshots/de/features.home.impl_HomeView_Day_8_de.png create mode 100644 screenshots/de/features.home.impl_HomeView_Day_9_de.png create mode 100644 screenshots/de/features.invite.impl.acceptdecline_AcceptDeclineInviteView_Day_1_de.png create mode 100644 screenshots/de/features.invite.impl.acceptdecline_AcceptDeclineInviteView_Day_2_de.png create mode 100644 screenshots/de/features.invite.impl.acceptdecline_AcceptDeclineInviteView_Day_3_de.png create mode 100644 screenshots/de/features.invite.impl.acceptdecline_AcceptDeclineInviteView_Day_4_de.png create mode 100644 screenshots/de/features.invite.impl.acceptdecline_AcceptDeclineInviteView_Day_5_de.png create mode 100644 screenshots/de/features.invite.impl.declineandblock_DeclineAndBlockView_Day_0_de.png create mode 100644 screenshots/de/features.invite.impl.declineandblock_DeclineAndBlockView_Day_1_de.png create mode 100644 screenshots/de/features.invite.impl.declineandblock_DeclineAndBlockView_Day_2_de.png create mode 100644 screenshots/de/features.invite.impl.declineandblock_DeclineAndBlockView_Day_3_de.png create mode 100644 screenshots/de/features.invite.impl.declineandblock_DeclineAndBlockView_Day_4_de.png create mode 100644 screenshots/de/features.invitepeople.impl_InvitePeopleView_Day_0_de.png create mode 100644 screenshots/de/features.invitepeople.impl_InvitePeopleView_Day_1_de.png create mode 100644 screenshots/de/features.invitepeople.impl_InvitePeopleView_Day_4_de.png create mode 100644 screenshots/de/features.invitepeople.impl_InvitePeopleView_Day_5_de.png create mode 100644 screenshots/de/features.invitepeople.impl_InvitePeopleView_Day_6_de.png create mode 100644 screenshots/de/features.invitepeople.impl_InvitePeopleView_Day_7_de.png create mode 100644 screenshots/de/features.invitepeople.impl_InvitePeopleView_Day_9_de.png create mode 100644 screenshots/de/features.joinroom.impl_JoinRoomView_Day_10_de.png create mode 100644 screenshots/de/features.joinroom.impl_JoinRoomView_Day_11_de.png create mode 100644 screenshots/de/features.joinroom.impl_JoinRoomView_Day_12_de.png create mode 100644 screenshots/de/features.joinroom.impl_JoinRoomView_Day_13_de.png create mode 100644 screenshots/de/features.joinroom.impl_JoinRoomView_Day_14_de.png create mode 100644 screenshots/de/features.joinroom.impl_JoinRoomView_Day_15_de.png create mode 100644 screenshots/de/features.joinroom.impl_JoinRoomView_Day_16_de.png create mode 100644 screenshots/de/features.joinroom.impl_JoinRoomView_Day_1_de.png create mode 100644 screenshots/de/features.joinroom.impl_JoinRoomView_Day_2_de.png create mode 100644 screenshots/de/features.joinroom.impl_JoinRoomView_Day_3_de.png create mode 100644 screenshots/de/features.joinroom.impl_JoinRoomView_Day_4_de.png create mode 100644 screenshots/de/features.joinroom.impl_JoinRoomView_Day_5_de.png create mode 100644 screenshots/de/features.joinroom.impl_JoinRoomView_Day_6_de.png create mode 100644 screenshots/de/features.joinroom.impl_JoinRoomView_Day_7_de.png create mode 100644 screenshots/de/features.joinroom.impl_JoinRoomView_Day_8_de.png create mode 100644 screenshots/de/features.joinroom.impl_JoinRoomView_Day_9_de.png create mode 100644 screenshots/de/features.knockrequests.impl.banner_KnockRequestsBannerView_Day_0_de.png create mode 100644 screenshots/de/features.knockrequests.impl.banner_KnockRequestsBannerView_Day_1_de.png create mode 100644 screenshots/de/features.knockrequests.impl.banner_KnockRequestsBannerView_Day_2_de.png create mode 100644 screenshots/de/features.knockrequests.impl.banner_KnockRequestsBannerView_Day_3_de.png create mode 100644 screenshots/de/features.knockrequests.impl.banner_KnockRequestsBannerView_Day_4_de.png create mode 100644 screenshots/de/features.knockrequests.impl.banner_KnockRequestsBannerView_Day_5_de.png create mode 100644 screenshots/de/features.knockrequests.impl.banner_KnockRequestsBannerView_Day_6_de.png create mode 100644 screenshots/de/features.knockrequests.impl.list_KnockRequestsListView_Day_0_de.png create mode 100644 screenshots/de/features.knockrequests.impl.list_KnockRequestsListView_Day_10_de.png create mode 100644 screenshots/de/features.knockrequests.impl.list_KnockRequestsListView_Day_1_de.png create mode 100644 screenshots/de/features.knockrequests.impl.list_KnockRequestsListView_Day_2_de.png create mode 100644 screenshots/de/features.knockrequests.impl.list_KnockRequestsListView_Day_3_de.png create mode 100644 screenshots/de/features.knockrequests.impl.list_KnockRequestsListView_Day_4_de.png create mode 100644 screenshots/de/features.knockrequests.impl.list_KnockRequestsListView_Day_5_de.png create mode 100644 screenshots/de/features.knockrequests.impl.list_KnockRequestsListView_Day_6_de.png create mode 100644 screenshots/de/features.knockrequests.impl.list_KnockRequestsListView_Day_7_de.png create mode 100644 screenshots/de/features.knockrequests.impl.list_KnockRequestsListView_Day_8_de.png create mode 100644 screenshots/de/features.knockrequests.impl.list_KnockRequestsListView_Day_9_de.png create mode 100644 screenshots/de/features.leaveroom.impl_LeaveRoomView_Day_1_de.png create mode 100644 screenshots/de/features.leaveroom.impl_LeaveRoomView_Day_2_de.png create mode 100644 screenshots/de/features.leaveroom.impl_LeaveRoomView_Day_3_de.png create mode 100644 screenshots/de/features.leaveroom.impl_LeaveRoomView_Day_4_de.png create mode 100644 screenshots/de/features.leaveroom.impl_LeaveRoomView_Day_5_de.png create mode 100644 screenshots/de/features.leaveroom.impl_LeaveRoomView_Day_6_de.png create mode 100644 screenshots/de/features.leaveroom.impl_LeaveRoomView_Day_7_de.png create mode 100644 screenshots/de/features.licenses.impl.list_DependencyLicensesListView_Day_0_de.png create mode 100644 screenshots/de/features.licenses.impl.list_DependencyLicensesListView_Day_1_de.png create mode 100644 screenshots/de/features.licenses.impl.list_DependencyLicensesListView_Day_2_de.png create mode 100644 screenshots/de/features.licenses.impl.list_DependencyLicensesListView_Day_3_de.png create mode 100644 screenshots/de/features.location.api.internal_StaticMapPlaceholder_Day_0_de.png create mode 100644 screenshots/de/features.location.impl.send_SendLocationView_Day_0_de.png create mode 100644 screenshots/de/features.location.impl.send_SendLocationView_Day_1_de.png create mode 100644 screenshots/de/features.location.impl.send_SendLocationView_Day_2_de.png create mode 100644 screenshots/de/features.location.impl.send_SendLocationView_Day_3_de.png create mode 100644 screenshots/de/features.location.impl.send_SendLocationView_Day_4_de.png create mode 100644 screenshots/de/features.location.impl.show_ShowLocationView_Day_0_de.png create mode 100644 screenshots/de/features.location.impl.show_ShowLocationView_Day_1_de.png create mode 100644 screenshots/de/features.location.impl.show_ShowLocationView_Day_2_de.png create mode 100644 screenshots/de/features.location.impl.show_ShowLocationView_Day_3_de.png create mode 100644 screenshots/de/features.location.impl.show_ShowLocationView_Day_4_de.png create mode 100644 screenshots/de/features.location.impl.show_ShowLocationView_Day_5_de.png create mode 100644 screenshots/de/features.location.impl.show_ShowLocationView_Day_6_de.png create mode 100644 screenshots/de/features.location.impl.show_ShowLocationView_Day_7_de.png create mode 100644 screenshots/de/features.lockscreen.impl.settings_LockScreenSettingsView_Day_0_de.png create mode 100644 screenshots/de/features.lockscreen.impl.settings_LockScreenSettingsView_Day_1_de.png create mode 100644 screenshots/de/features.lockscreen.impl.settings_LockScreenSettingsView_Day_2_de.png create mode 100644 screenshots/de/features.lockscreen.impl.setup.biometric_SetupBiometricView_Day_0_de.png create mode 100644 screenshots/de/features.lockscreen.impl.setup.pin_SetupPinView_Day_0_de.png create mode 100644 screenshots/de/features.lockscreen.impl.setup.pin_SetupPinView_Day_1_de.png create mode 100644 screenshots/de/features.lockscreen.impl.setup.pin_SetupPinView_Day_2_de.png create mode 100644 screenshots/de/features.lockscreen.impl.setup.pin_SetupPinView_Day_3_de.png create mode 100644 screenshots/de/features.lockscreen.impl.setup.pin_SetupPinView_Day_4_de.png create mode 100644 screenshots/de/features.lockscreen.impl.unlock_PinUnlockViewInApp_Day_0_de.png create mode 100644 screenshots/de/features.lockscreen.impl.unlock_PinUnlockViewInApp_Day_1_de.png create mode 100644 screenshots/de/features.lockscreen.impl.unlock_PinUnlockViewInApp_Day_2_de.png create mode 100644 screenshots/de/features.lockscreen.impl.unlock_PinUnlockViewInApp_Day_3_de.png create mode 100644 screenshots/de/features.lockscreen.impl.unlock_PinUnlockViewInApp_Day_4_de.png create mode 100644 screenshots/de/features.lockscreen.impl.unlock_PinUnlockViewInApp_Day_5_de.png create mode 100644 screenshots/de/features.lockscreen.impl.unlock_PinUnlockViewInApp_Day_6_de.png create mode 100644 screenshots/de/features.lockscreen.impl.unlock_PinUnlockViewInApp_Day_7_de.png create mode 100644 screenshots/de/features.lockscreen.impl.unlock_PinUnlockView_Day_0_de.png create mode 100644 screenshots/de/features.lockscreen.impl.unlock_PinUnlockView_Day_1_de.png create mode 100644 screenshots/de/features.lockscreen.impl.unlock_PinUnlockView_Day_2_de.png create mode 100644 screenshots/de/features.lockscreen.impl.unlock_PinUnlockView_Day_3_de.png create mode 100644 screenshots/de/features.lockscreen.impl.unlock_PinUnlockView_Day_4_de.png create mode 100644 screenshots/de/features.lockscreen.impl.unlock_PinUnlockView_Day_5_de.png create mode 100644 screenshots/de/features.lockscreen.impl.unlock_PinUnlockView_Day_6_de.png create mode 100644 screenshots/de/features.lockscreen.impl.unlock_PinUnlockView_Day_7_de.png create mode 100644 screenshots/de/features.login.impl.accountprovider_AccountProviderOtherView_Day_0_de.png create mode 100644 screenshots/de/features.login.impl.changeserver_ChangeServerView_Day_1_de.png create mode 100644 screenshots/de/features.login.impl.changeserver_ChangeServerView_Day_2_de.png create mode 100644 screenshots/de/features.login.impl.changeserver_ChangeServerView_Day_3_de.png create mode 100644 screenshots/de/features.login.impl.changeserver_ChangeServerView_Day_4_de.png create mode 100644 screenshots/de/features.login.impl.changeserver_ChangeServerView_Day_5_de.png create mode 100644 screenshots/de/features.login.impl.dialogs_SlidingSyncNotSupportedDialog_Day_0_de.png create mode 100644 screenshots/de/features.login.impl.login_LoginModeView_Day_0_de.png create mode 100644 screenshots/de/features.login.impl.login_LoginModeView_Day_1_de.png create mode 100644 screenshots/de/features.login.impl.login_LoginModeView_Day_2_de.png create mode 100644 screenshots/de/features.login.impl.login_LoginModeView_Day_3_de.png create mode 100644 screenshots/de/features.login.impl.login_LoginModeView_Day_4_de.png create mode 100644 screenshots/de/features.login.impl.login_LoginModeView_Day_5_de.png create mode 100644 screenshots/de/features.login.impl.login_LoginModeView_Day_6_de.png create mode 100644 screenshots/de/features.login.impl.screens.changeaccountprovider_ChangeAccountProviderView_Day_0_de.png create mode 100644 screenshots/de/features.login.impl.screens.changeaccountprovider_ChangeAccountProviderView_Day_1_de.png create mode 100644 screenshots/de/features.login.impl.screens.chooseaccountprovider_ChooseAccountProviderView_Day_0_de.png create mode 100644 screenshots/de/features.login.impl.screens.chooseaccountprovider_ChooseAccountProviderView_Day_1_de.png create mode 100644 screenshots/de/features.login.impl.screens.chooseaccountprovider_ChooseAccountProviderView_Day_2_de.png create mode 100644 screenshots/de/features.login.impl.screens.confirmaccountprovider_ConfirmAccountProviderView_Day_0_de.png create mode 100644 screenshots/de/features.login.impl.screens.confirmaccountprovider_ConfirmAccountProviderView_Day_1_de.png create mode 100644 screenshots/de/features.login.impl.screens.confirmaccountprovider_ConfirmAccountProviderView_Day_2_de.png create mode 100644 screenshots/de/features.login.impl.screens.createaccount_CreateAccountView_Day_0_de.png create mode 100644 screenshots/de/features.login.impl.screens.createaccount_CreateAccountView_Day_1_de.png create mode 100644 screenshots/de/features.login.impl.screens.createaccount_CreateAccountView_Day_2_de.png create mode 100644 screenshots/de/features.login.impl.screens.createaccount_CreateAccountView_Day_3_de.png create mode 100644 screenshots/de/features.login.impl.screens.loginpassword_LoginPasswordView_Day_0_de.png create mode 100644 screenshots/de/features.login.impl.screens.loginpassword_LoginPasswordView_Day_1_de.png create mode 100644 screenshots/de/features.login.impl.screens.loginpassword_LoginPasswordView_Day_2_de.png create mode 100644 screenshots/de/features.login.impl.screens.onboarding_OnBoardingView_Day_0_de.png create mode 100644 screenshots/de/features.login.impl.screens.onboarding_OnBoardingView_Day_1_de.png create mode 100644 screenshots/de/features.login.impl.screens.onboarding_OnBoardingView_Day_2_de.png create mode 100644 screenshots/de/features.login.impl.screens.onboarding_OnBoardingView_Day_3_de.png create mode 100644 screenshots/de/features.login.impl.screens.onboarding_OnBoardingView_Day_4_de.png create mode 100644 screenshots/de/features.login.impl.screens.onboarding_OnBoardingView_Day_5_de.png create mode 100644 screenshots/de/features.login.impl.screens.onboarding_OnBoardingView_Day_6_de.png create mode 100644 screenshots/de/features.login.impl.screens.onboarding_OnBoardingView_Day_7_de.png create mode 100644 screenshots/de/features.login.impl.screens.qrcode.confirmation_QrCodeConfirmationView_Day_0_de.png create mode 100644 screenshots/de/features.login.impl.screens.qrcode.confirmation_QrCodeConfirmationView_Day_1_de.png create mode 100644 screenshots/de/features.login.impl.screens.qrcode.confirmation_QrCodeConfirmationView_Day_2_de.png create mode 100644 screenshots/de/features.login.impl.screens.qrcode.error_QrCodeErrorView_Day_0_de.png create mode 100644 screenshots/de/features.login.impl.screens.qrcode.error_QrCodeErrorView_Day_1_de.png create mode 100644 screenshots/de/features.login.impl.screens.qrcode.error_QrCodeErrorView_Day_2_de.png create mode 100644 screenshots/de/features.login.impl.screens.qrcode.error_QrCodeErrorView_Day_3_de.png create mode 100644 screenshots/de/features.login.impl.screens.qrcode.error_QrCodeErrorView_Day_4_de.png create mode 100644 screenshots/de/features.login.impl.screens.qrcode.error_QrCodeErrorView_Day_5_de.png create mode 100644 screenshots/de/features.login.impl.screens.qrcode.error_QrCodeErrorView_Day_6_de.png create mode 100644 screenshots/de/features.login.impl.screens.qrcode.intro_QrCodeIntroView_Day_0_de.png create mode 100644 screenshots/de/features.login.impl.screens.qrcode.intro_QrCodeIntroView_Day_1_de.png create mode 100644 screenshots/de/features.login.impl.screens.qrcode.scan_QrCodeScanView_Day_0_de.png create mode 100644 screenshots/de/features.login.impl.screens.qrcode.scan_QrCodeScanView_Day_1_de.png create mode 100644 screenshots/de/features.login.impl.screens.qrcode.scan_QrCodeScanView_Day_2_de.png create mode 100644 screenshots/de/features.login.impl.screens.qrcode.scan_QrCodeScanView_Day_3_de.png create mode 100644 screenshots/de/features.login.impl.screens.qrcode.scan_QrCodeScanView_Day_4_de.png create mode 100644 screenshots/de/features.login.impl.screens.qrcode.scan_QrCodeScanView_Day_5_de.png create mode 100644 screenshots/de/features.login.impl.screens.searchaccountprovider_SearchAccountProviderView_Day_0_de.png create mode 100644 screenshots/de/features.login.impl.screens.searchaccountprovider_SearchAccountProviderView_Day_1_de.png create mode 100644 screenshots/de/features.logout.impl.direct_DefaultDirectLogoutView_Day_1_de.png create mode 100644 screenshots/de/features.logout.impl.direct_DefaultDirectLogoutView_Day_2_de.png create mode 100644 screenshots/de/features.logout.impl.direct_DefaultDirectLogoutView_Day_3_de.png create mode 100644 screenshots/de/features.logout.impl_AccountDeactivationView_Day_0_de.png create mode 100644 screenshots/de/features.logout.impl_AccountDeactivationView_Day_1_de.png create mode 100644 screenshots/de/features.logout.impl_AccountDeactivationView_Day_2_de.png create mode 100644 screenshots/de/features.logout.impl_AccountDeactivationView_Day_3_de.png create mode 100644 screenshots/de/features.logout.impl_AccountDeactivationView_Day_4_de.png create mode 100644 screenshots/de/features.logout.impl_LogoutView_Day_0_de.png create mode 100644 screenshots/de/features.logout.impl_LogoutView_Day_10_de.png create mode 100644 screenshots/de/features.logout.impl_LogoutView_Day_11_de.png create mode 100644 screenshots/de/features.logout.impl_LogoutView_Day_1_de.png create mode 100644 screenshots/de/features.logout.impl_LogoutView_Day_2_de.png create mode 100644 screenshots/de/features.logout.impl_LogoutView_Day_3_de.png create mode 100644 screenshots/de/features.logout.impl_LogoutView_Day_4_de.png create mode 100644 screenshots/de/features.logout.impl_LogoutView_Day_5_de.png create mode 100644 screenshots/de/features.logout.impl_LogoutView_Day_6_de.png create mode 100644 screenshots/de/features.logout.impl_LogoutView_Day_7_de.png create mode 100644 screenshots/de/features.logout.impl_LogoutView_Day_8_de.png create mode 100644 screenshots/de/features.logout.impl_LogoutView_Day_9_de.png create mode 100644 screenshots/de/features.messages.impl.actionlist_ActionListViewContent_Day_10_de.png create mode 100644 screenshots/de/features.messages.impl.actionlist_ActionListViewContent_Day_11_de.png create mode 100644 screenshots/de/features.messages.impl.actionlist_ActionListViewContent_Day_12_de.png create mode 100644 screenshots/de/features.messages.impl.actionlist_ActionListViewContent_Day_2_de.png create mode 100644 screenshots/de/features.messages.impl.actionlist_ActionListViewContent_Day_3_de.png create mode 100644 screenshots/de/features.messages.impl.actionlist_ActionListViewContent_Day_4_de.png create mode 100644 screenshots/de/features.messages.impl.actionlist_ActionListViewContent_Day_5_de.png create mode 100644 screenshots/de/features.messages.impl.actionlist_ActionListViewContent_Day_6_de.png create mode 100644 screenshots/de/features.messages.impl.actionlist_ActionListViewContent_Day_7_de.png create mode 100644 screenshots/de/features.messages.impl.actionlist_ActionListViewContent_Day_8_de.png create mode 100644 screenshots/de/features.messages.impl.actionlist_ActionListViewContent_Day_9_de.png create mode 100644 screenshots/de/features.messages.impl.attachments.preview_AttachmentsView_0_de.png create mode 100644 screenshots/de/features.messages.impl.attachments.preview_AttachmentsView_1_de.png create mode 100644 screenshots/de/features.messages.impl.attachments.preview_AttachmentsView_2_de.png create mode 100644 screenshots/de/features.messages.impl.attachments.preview_AttachmentsView_3_de.png create mode 100644 screenshots/de/features.messages.impl.attachments.preview_AttachmentsView_4_de.png create mode 100644 screenshots/de/features.messages.impl.attachments.preview_AttachmentsView_5_de.png create mode 100644 screenshots/de/features.messages.impl.attachments.preview_AttachmentsView_6_de.png create mode 100644 screenshots/de/features.messages.impl.attachments.preview_AttachmentsView_7_de.png create mode 100644 screenshots/de/features.messages.impl.attachments.preview_AttachmentsView_8_de.png create mode 100644 screenshots/de/features.messages.impl.attachments.preview_VideoQualitySelectorDialog_Day_0_de.png create mode 100644 screenshots/de/features.messages.impl.crypto.identity_IdentityChangeStateView_Day_1_de.png create mode 100644 screenshots/de/features.messages.impl.crypto.identity_IdentityChangeStateView_Day_2_de.png create mode 100644 screenshots/de/features.messages.impl.crypto.identity_MessagesViewWithIdentityChange_Day_0_de.png create mode 100644 screenshots/de/features.messages.impl.crypto.identity_MessagesViewWithIdentityChange_Day_1_de.png create mode 100644 screenshots/de/features.messages.impl.crypto.identity_MessagesViewWithIdentityChange_Day_2_de.png create mode 100644 screenshots/de/features.messages.impl.crypto.sendfailure.resolve_ResolveVerifiedUserSendFailureView_Day_1_de.png create mode 100644 screenshots/de/features.messages.impl.crypto.sendfailure.resolve_ResolveVerifiedUserSendFailureView_Day_2_de.png create mode 100644 screenshots/de/features.messages.impl.link_LinkView_Day_1_de.png create mode 100644 screenshots/de/features.messages.impl.messagecomposer.suggestions_SuggestionsPickerView_Day_0_de.png create mode 100644 screenshots/de/features.messages.impl.messagecomposer_AttachmentSourcePickerMenu_Day_0_de.png create mode 100644 screenshots/de/features.messages.impl.messagecomposer_MessageComposerView_Day_0_de.png create mode 100644 screenshots/de/features.messages.impl.pinned.banner_PinnedMessagesBannerView_Day_10_de.png create mode 100644 screenshots/de/features.messages.impl.pinned.banner_PinnedMessagesBannerView_Day_1_de.png create mode 100644 screenshots/de/features.messages.impl.pinned.banner_PinnedMessagesBannerView_Day_2_de.png create mode 100644 screenshots/de/features.messages.impl.pinned.banner_PinnedMessagesBannerView_Day_3_de.png create mode 100644 screenshots/de/features.messages.impl.pinned.banner_PinnedMessagesBannerView_Day_4_de.png create mode 100644 screenshots/de/features.messages.impl.pinned.banner_PinnedMessagesBannerView_Day_5_de.png create mode 100644 screenshots/de/features.messages.impl.pinned.banner_PinnedMessagesBannerView_Day_6_de.png create mode 100644 screenshots/de/features.messages.impl.pinned.banner_PinnedMessagesBannerView_Day_7_de.png create mode 100644 screenshots/de/features.messages.impl.pinned.banner_PinnedMessagesBannerView_Day_8_de.png create mode 100644 screenshots/de/features.messages.impl.pinned.banner_PinnedMessagesBannerView_Day_9_de.png create mode 100644 screenshots/de/features.messages.impl.pinned.list_PinnedMessagesListView_Day_0_de.png create mode 100644 screenshots/de/features.messages.impl.pinned.list_PinnedMessagesListView_Day_1_de.png create mode 100644 screenshots/de/features.messages.impl.pinned.list_PinnedMessagesListView_Day_2_de.png create mode 100644 screenshots/de/features.messages.impl.pinned.list_PinnedMessagesListView_Day_3_de.png create mode 100644 screenshots/de/features.messages.impl.report_ReportMessageView_Day_0_de.png create mode 100644 screenshots/de/features.messages.impl.report_ReportMessageView_Day_1_de.png create mode 100644 screenshots/de/features.messages.impl.report_ReportMessageView_Day_2_de.png create mode 100644 screenshots/de/features.messages.impl.report_ReportMessageView_Day_3_de.png create mode 100644 screenshots/de/features.messages.impl.report_ReportMessageView_Day_4_de.png create mode 100644 screenshots/de/features.messages.impl.report_ReportMessageView_Day_5_de.png create mode 100644 screenshots/de/features.messages.impl.timeline.components.customreaction.picker_EmojiPicker_Day_0_de.png create mode 100644 screenshots/de/features.messages.impl.timeline.components.customreaction.picker_EmojiPicker_Day_1_de.png create mode 100644 screenshots/de/features.messages.impl.timeline.components.event_TimelineItemEncryptedView_Day_0_de.png create mode 100644 screenshots/de/features.messages.impl.timeline.components.event_TimelineItemEncryptedView_Day_1_de.png create mode 100644 screenshots/de/features.messages.impl.timeline.components.event_TimelineItemEncryptedView_Day_2_de.png create mode 100644 screenshots/de/features.messages.impl.timeline.components.event_TimelineItemEncryptedView_Day_3_de.png create mode 100644 screenshots/de/features.messages.impl.timeline.components.event_TimelineItemEncryptedView_Day_4_de.png create mode 100644 screenshots/de/features.messages.impl.timeline.components.event_TimelineItemEncryptedView_Day_5_de.png create mode 100644 screenshots/de/features.messages.impl.timeline.components.event_TimelineItemEncryptedView_Day_6_de.png create mode 100644 screenshots/de/features.messages.impl.timeline.components.event_TimelineItemEncryptedView_Day_7_de.png create mode 100644 screenshots/de/features.messages.impl.timeline.components.event_TimelineItemEncryptedView_Day_8_de.png create mode 100644 screenshots/de/features.messages.impl.timeline.components.event_TimelineItemImageViewHideMediaContent_Day_0_de.png create mode 100644 screenshots/de/features.messages.impl.timeline.components.event_TimelineItemLegacyCallInviteView_Day_0_de.png create mode 100644 screenshots/de/features.messages.impl.timeline.components.event_TimelineItemPollView_Day_0_de.png create mode 100644 screenshots/de/features.messages.impl.timeline.components.event_TimelineItemPollView_Day_1_de.png create mode 100644 screenshots/de/features.messages.impl.timeline.components.event_TimelineItemPollView_Day_2_de.png create mode 100644 screenshots/de/features.messages.impl.timeline.components.event_TimelineItemPollView_Day_3_de.png create mode 100644 screenshots/de/features.messages.impl.timeline.components.event_TimelineItemRedactedView_Day_0_de.png create mode 100644 screenshots/de/features.messages.impl.timeline.components.event_TimelineItemUnknownView_Day_0_de.png create mode 100644 screenshots/de/features.messages.impl.timeline.components.event_TimelineItemVideoViewHideMediaContent_Day_0_de.png create mode 100644 screenshots/de/features.messages.impl.timeline.components.receipt.bottomsheet_ReadReceiptBottomSheet_Day_0_de.png create mode 100644 screenshots/de/features.messages.impl.timeline.components.receipt.bottomsheet_ReadReceiptBottomSheet_Day_1_de.png create mode 100644 screenshots/de/features.messages.impl.timeline.components.receipt.bottomsheet_ReadReceiptBottomSheet_Day_2_de.png create mode 100644 screenshots/de/features.messages.impl.timeline.components.receipt.bottomsheet_ReadReceiptBottomSheet_Day_3_de.png create mode 100644 screenshots/de/features.messages.impl.timeline.components.receipt.bottomsheet_ReadReceiptBottomSheet_Day_4_de.png create mode 100644 screenshots/de/features.messages.impl.timeline.components.receipt.bottomsheet_ReadReceiptBottomSheet_Day_5_de.png create mode 100644 screenshots/de/features.messages.impl.timeline.components.virtual_TimelineItemReadMarkerView_Day_0_de.png create mode 100644 screenshots/de/features.messages.impl.timeline.components.virtual_TimelineItemRoomBeginningView_Day_0_de.png create mode 100644 screenshots/de/features.messages.impl.timeline.components_CallMenuItem_Day_2_de.png create mode 100644 screenshots/de/features.messages.impl.timeline.components_CallMenuItem_Day_3_de.png create mode 100644 screenshots/de/features.messages.impl.timeline.components_MessageShieldView_Day_0_de.png create mode 100644 screenshots/de/features.messages.impl.timeline.components_ThreadSummaryView_Day_0_de.png create mode 100644 screenshots/de/features.messages.impl.timeline.components_TimelineEventTimestampView_Day_3_de.png create mode 100644 screenshots/de/features.messages.impl.timeline.components_TimelineEventTimestampView_Day_4_de.png create mode 100644 screenshots/de/features.messages.impl.timeline.components_TimelineItemCallNotifyView_Day_0_de.png create mode 100644 screenshots/de/features.messages.impl.timeline.components_TimelineItemEventRowTimestamp_Day_3_de.png create mode 100644 screenshots/de/features.messages.impl.timeline.components_TimelineItemEventRowTimestamp_Day_4_de.png create mode 100644 screenshots/de/features.messages.impl.timeline.components_TimelineItemEventRowTimestamp_Day_7_de.png create mode 100644 screenshots/de/features.messages.impl.timeline.components_TimelineItemEventRowUtd_Day_0_de.png create mode 100644 screenshots/de/features.messages.impl.timeline.components_TimelineItemEventRowWithManyReactions_Day_0_de.png create mode 100644 screenshots/de/features.messages.impl.timeline.components_TimelineItemEventRowWithReplyInformative_Day_0_de.png create mode 100644 screenshots/de/features.messages.impl.timeline.components_TimelineItemEventRowWithReplyInformative_Day_1_de.png create mode 100644 screenshots/de/features.messages.impl.timeline.components_TimelineItemEventRowWithReply_Day_4_de.png create mode 100644 screenshots/de/features.messages.impl.timeline.components_TimelineItemEventRowWithReply_Day_8_de.png create mode 100644 screenshots/de/features.messages.impl.timeline.components_TimelineItemEventRowWithThreadSummary_Day_0_de.png create mode 100644 screenshots/de/features.messages.impl.timeline.components_TimelineItemEventTimestampBelow_de.png create mode 100644 screenshots/de/features.messages.impl.timeline.components_TimelineItemGroupedEventsRowContentCollapse_Day_0_de.png create mode 100644 screenshots/de/features.messages.impl.timeline.components_TimelineItemGroupedEventsRowContentExpanded_Day_0_de.png create mode 100644 screenshots/de/features.messages.impl.timeline.components_TimelineItemReactionsLayout_Day_0_de.png create mode 100644 screenshots/de/features.messages.impl.timeline.components_TimelineItemReactionsViewIncoming_Day_0_de.png create mode 100644 screenshots/de/features.messages.impl.timeline.components_TimelineItemReactionsViewOutgoing_Day_0_de.png create mode 100644 screenshots/de/features.messages.impl.timeline.focus_FocusRequestStateView_Day_1_de.png create mode 100644 screenshots/de/features.messages.impl.timeline.focus_FocusRequestStateView_Day_2_de.png create mode 100644 screenshots/de/features.messages.impl.timeline.focus_FocusRequestStateView_Day_3_de.png create mode 100644 screenshots/de/features.messages.impl.timeline.protection_ProtectedView_Day_0_de.png create mode 100644 screenshots/de/features.messages.impl.timeline.protection_ProtectedView_Day_1_de.png create mode 100644 screenshots/de/features.messages.impl.timeline.protection_ProtectedView_Day_2_de.png create mode 100644 screenshots/de/features.messages.impl.timeline.protection_ProtectedView_Day_3_de.png create mode 100644 screenshots/de/features.messages.impl.timeline_TimelineViewMessageShield_Day_0_de.png create mode 100644 screenshots/de/features.messages.impl.timeline_TimelineView_Day_0_de.png create mode 100644 screenshots/de/features.messages.impl.timeline_TimelineView_Day_11_de.png create mode 100644 screenshots/de/features.messages.impl.timeline_TimelineView_Day_12_de.png create mode 100644 screenshots/de/features.messages.impl.timeline_TimelineView_Day_13_de.png create mode 100644 screenshots/de/features.messages.impl.timeline_TimelineView_Day_14_de.png create mode 100644 screenshots/de/features.messages.impl.timeline_TimelineView_Day_15_de.png create mode 100644 screenshots/de/features.messages.impl.timeline_TimelineView_Day_16_de.png create mode 100644 screenshots/de/features.messages.impl.timeline_TimelineView_Day_17_de.png create mode 100644 screenshots/de/features.messages.impl.timeline_TimelineView_Day_1_de.png create mode 100644 screenshots/de/features.messages.impl.timeline_TimelineView_Day_4_de.png create mode 100644 screenshots/de/features.messages.impl.timeline_TimelineView_Day_6_de.png create mode 100644 screenshots/de/features.messages.impl.timeline_TimelineView_Day_8_de.png create mode 100644 screenshots/de/features.messages.impl.topbars_MessagesViewTopBar_Day_0_de.png create mode 100644 screenshots/de/features.messages.impl.topbars_ThreadTopBar_Day_0_de.png create mode 100644 screenshots/de/features.messages.impl.typing_TypingNotificationView_Day_1_de.png create mode 100644 screenshots/de/features.messages.impl.typing_TypingNotificationView_Day_2_de.png create mode 100644 screenshots/de/features.messages.impl.typing_TypingNotificationView_Day_3_de.png create mode 100644 screenshots/de/features.messages.impl.typing_TypingNotificationView_Day_4_de.png create mode 100644 screenshots/de/features.messages.impl.typing_TypingNotificationView_Day_5_de.png create mode 100644 screenshots/de/features.messages.impl.typing_TypingNotificationView_Day_6_de.png create mode 100644 screenshots/de/features.messages.impl_MessagesView_Day_0_de.png create mode 100644 screenshots/de/features.messages.impl_MessagesView_Day_1_de.png create mode 100644 screenshots/de/features.messages.impl_MessagesView_Day_2_de.png create mode 100644 screenshots/de/features.messages.impl_MessagesView_Day_3_de.png create mode 100644 screenshots/de/features.messages.impl_MessagesView_Day_4_de.png create mode 100644 screenshots/de/features.messages.impl_MessagesView_Day_5_de.png create mode 100644 screenshots/de/features.messages.impl_MessagesView_Day_6_de.png create mode 100644 screenshots/de/features.messages.impl_MessagesView_Day_7_de.png create mode 100644 screenshots/de/features.messages.impl_MessagesView_Day_8_de.png create mode 100644 screenshots/de/features.messages.impl_MessagesView_Day_9_de.png create mode 100644 screenshots/de/features.migration.impl_MigrationView_Day_1_de.png create mode 100644 screenshots/de/features.poll.api.pollcontent_PollAnswerViewDisclosedNotSelected_Day_0_de.png create mode 100644 screenshots/de/features.poll.api.pollcontent_PollAnswerViewDisclosedSelected_Day_0_de.png create mode 100644 screenshots/de/features.poll.api.pollcontent_PollAnswerViewEndedSelected_Day_0_de.png create mode 100644 screenshots/de/features.poll.api.pollcontent_PollAnswerViewEndedWinnerNotSelected_Day_0_de.png create mode 100644 screenshots/de/features.poll.api.pollcontent_PollAnswerViewEndedWinnerSelected_Day_0_de.png create mode 100644 screenshots/de/features.poll.api.pollcontent_PollContentViewCreatorEditable_Day_0_de.png create mode 100644 screenshots/de/features.poll.api.pollcontent_PollContentViewCreatorEnded_Day_0_de.png create mode 100644 screenshots/de/features.poll.api.pollcontent_PollContentViewCreator_Day_0_de.png create mode 100644 screenshots/de/features.poll.api.pollcontent_PollContentViewDisclosed_Day_0_de.png create mode 100644 screenshots/de/features.poll.api.pollcontent_PollContentViewEnded_Day_0_de.png create mode 100644 screenshots/de/features.poll.api.pollcontent_PollContentViewUndisclosed_Day_0_de.png create mode 100644 screenshots/de/features.poll.impl.create_CreatePollView_Day_0_de.png create mode 100644 screenshots/de/features.poll.impl.create_CreatePollView_Day_1_de.png create mode 100644 screenshots/de/features.poll.impl.create_CreatePollView_Day_2_de.png create mode 100644 screenshots/de/features.poll.impl.create_CreatePollView_Day_3_de.png create mode 100644 screenshots/de/features.poll.impl.create_CreatePollView_Day_4_de.png create mode 100644 screenshots/de/features.poll.impl.create_CreatePollView_Day_5_de.png create mode 100644 screenshots/de/features.poll.impl.create_CreatePollView_Day_6_de.png create mode 100644 screenshots/de/features.poll.impl.create_CreatePollView_Day_7_de.png create mode 100644 screenshots/de/features.poll.impl.history_PollHistoryView_Day_0_de.png create mode 100644 screenshots/de/features.poll.impl.history_PollHistoryView_Day_1_de.png create mode 100644 screenshots/de/features.poll.impl.history_PollHistoryView_Day_2_de.png create mode 100644 screenshots/de/features.poll.impl.history_PollHistoryView_Day_3_de.png create mode 100644 screenshots/de/features.poll.impl.history_PollHistoryView_Day_4_de.png create mode 100644 screenshots/de/features.preferences.impl.about_AboutView_Day_0_de.png create mode 100644 screenshots/de/features.preferences.impl.advanced_AdvancedSettingsViewDark_0_de.png create mode 100644 screenshots/de/features.preferences.impl.advanced_AdvancedSettingsViewDark_1_de.png create mode 100644 screenshots/de/features.preferences.impl.advanced_AdvancedSettingsViewDark_2_de.png create mode 100644 screenshots/de/features.preferences.impl.advanced_AdvancedSettingsViewDark_3_de.png create mode 100644 screenshots/de/features.preferences.impl.advanced_AdvancedSettingsViewDark_4_de.png create mode 100644 screenshots/de/features.preferences.impl.advanced_AdvancedSettingsViewDark_5_de.png create mode 100644 screenshots/de/features.preferences.impl.advanced_AdvancedSettingsViewDark_6_de.png create mode 100644 screenshots/de/features.preferences.impl.advanced_AdvancedSettingsViewDark_7_de.png create mode 100644 screenshots/de/features.preferences.impl.advanced_AdvancedSettingsViewDark_8_de.png create mode 100644 screenshots/de/features.preferences.impl.advanced_AdvancedSettingsViewLight_0_de.png create mode 100644 screenshots/de/features.preferences.impl.advanced_AdvancedSettingsViewLight_1_de.png create mode 100644 screenshots/de/features.preferences.impl.advanced_AdvancedSettingsViewLight_2_de.png create mode 100644 screenshots/de/features.preferences.impl.advanced_AdvancedSettingsViewLight_3_de.png create mode 100644 screenshots/de/features.preferences.impl.advanced_AdvancedSettingsViewLight_4_de.png create mode 100644 screenshots/de/features.preferences.impl.advanced_AdvancedSettingsViewLight_5_de.png create mode 100644 screenshots/de/features.preferences.impl.advanced_AdvancedSettingsViewLight_6_de.png create mode 100644 screenshots/de/features.preferences.impl.advanced_AdvancedSettingsViewLight_7_de.png create mode 100644 screenshots/de/features.preferences.impl.advanced_AdvancedSettingsViewLight_8_de.png create mode 100644 screenshots/de/features.preferences.impl.advanced_VideoQualitySelectorDialog_Day_0_de.png create mode 100644 screenshots/de/features.preferences.impl.analytics_AnalyticsSettingsView_Day_0_de.png create mode 100644 screenshots/de/features.preferences.impl.blockedusers_BlockedUsersView_Day_0_de.png create mode 100644 screenshots/de/features.preferences.impl.blockedusers_BlockedUsersView_Day_1_de.png create mode 100644 screenshots/de/features.preferences.impl.blockedusers_BlockedUsersView_Day_2_de.png create mode 100644 screenshots/de/features.preferences.impl.blockedusers_BlockedUsersView_Day_3_de.png create mode 100644 screenshots/de/features.preferences.impl.blockedusers_BlockedUsersView_Day_4_de.png create mode 100644 screenshots/de/features.preferences.impl.blockedusers_BlockedUsersView_Day_5_de.png create mode 100644 screenshots/de/features.preferences.impl.blockedusers_BlockedUsersView_Day_6_de.png create mode 100644 screenshots/de/features.preferences.impl.developer_DeveloperSettingsView_Day_0_de.png create mode 100644 screenshots/de/features.preferences.impl.developer_DeveloperSettingsView_Day_1_de.png create mode 100644 screenshots/de/features.preferences.impl.developer_DeveloperSettingsView_Day_2_de.png create mode 100644 screenshots/de/features.preferences.impl.developer_DeveloperSettingsView_Day_3_de.png create mode 100644 screenshots/de/features.preferences.impl.labs_LabsView_Day_0_de.png create mode 100644 screenshots/de/features.preferences.impl.labs_LabsView_Day_1_de.png create mode 100644 screenshots/de/features.preferences.impl.notifications.edit_DefaultNotificationSettingOption_Day_0_de.png create mode 100644 screenshots/de/features.preferences.impl.notifications.edit_EditDefaultNotificationSettingView_Day_0_de.png create mode 100644 screenshots/de/features.preferences.impl.notifications.edit_EditDefaultNotificationSettingView_Day_1_de.png create mode 100644 screenshots/de/features.preferences.impl.notifications.edit_EditDefaultNotificationSettingView_Day_2_de.png create mode 100644 screenshots/de/features.preferences.impl.notifications.edit_EditDefaultNotificationSettingView_Day_3_de.png create mode 100644 screenshots/de/features.preferences.impl.notifications.edit_EditDefaultNotificationSettingView_Day_4_de.png create mode 100644 screenshots/de/features.preferences.impl.notifications_NotificationSettingsView_Day_0_de.png create mode 100644 screenshots/de/features.preferences.impl.notifications_NotificationSettingsView_Day_10_de.png create mode 100644 screenshots/de/features.preferences.impl.notifications_NotificationSettingsView_Day_11_de.png create mode 100644 screenshots/de/features.preferences.impl.notifications_NotificationSettingsView_Day_12_de.png create mode 100644 screenshots/de/features.preferences.impl.notifications_NotificationSettingsView_Day_13_de.png create mode 100644 screenshots/de/features.preferences.impl.notifications_NotificationSettingsView_Day_1_de.png create mode 100644 screenshots/de/features.preferences.impl.notifications_NotificationSettingsView_Day_2_de.png create mode 100644 screenshots/de/features.preferences.impl.notifications_NotificationSettingsView_Day_3_de.png create mode 100644 screenshots/de/features.preferences.impl.notifications_NotificationSettingsView_Day_4_de.png create mode 100644 screenshots/de/features.preferences.impl.notifications_NotificationSettingsView_Day_5_de.png create mode 100644 screenshots/de/features.preferences.impl.notifications_NotificationSettingsView_Day_6_de.png create mode 100644 screenshots/de/features.preferences.impl.notifications_NotificationSettingsView_Day_7_de.png create mode 100644 screenshots/de/features.preferences.impl.notifications_NotificationSettingsView_Day_8_de.png create mode 100644 screenshots/de/features.preferences.impl.notifications_NotificationSettingsView_Day_9_de.png create mode 100644 screenshots/de/features.preferences.impl.root_MultiAccountSection_Day_0_de.png create mode 100644 screenshots/de/features.preferences.impl.root_PreferencesRootViewDark_0_de.png create mode 100644 screenshots/de/features.preferences.impl.root_PreferencesRootViewDark_1_de.png create mode 100644 screenshots/de/features.preferences.impl.root_PreferencesRootViewLight_0_de.png create mode 100644 screenshots/de/features.preferences.impl.root_PreferencesRootViewLight_1_de.png create mode 100644 screenshots/de/features.preferences.impl.user.editprofile_EditUserProfileView_Day_0_de.png create mode 100644 screenshots/de/features.preferences.impl.user.editprofile_EditUserProfileView_Day_1_de.png create mode 100644 screenshots/de/features.rageshake.api.crash_CrashDetectionView_Day_0_de.png create mode 100644 screenshots/de/features.rageshake.api.detection_RageshakeDialogContent_Day_0_de.png create mode 100644 screenshots/de/features.rageshake.api.preferences_RageshakePreferencesView_Day_0_de.png create mode 100644 screenshots/de/features.rageshake.impl.bugreport_BugReportViewDay_0_de.png create mode 100644 screenshots/de/features.rageshake.impl.bugreport_BugReportViewDay_1_de.png create mode 100644 screenshots/de/features.rageshake.impl.bugreport_BugReportViewDay_2_de.png create mode 100644 screenshots/de/features.rageshake.impl.bugreport_BugReportViewDay_3_de.png create mode 100644 screenshots/de/features.rageshake.impl.bugreport_BugReportViewDay_4_de.png create mode 100644 screenshots/de/features.reportroom.impl_ReportRoomView_Day_0_de.png create mode 100644 screenshots/de/features.reportroom.impl_ReportRoomView_Day_1_de.png create mode 100644 screenshots/de/features.reportroom.impl_ReportRoomView_Day_2_de.png create mode 100644 screenshots/de/features.reportroom.impl_ReportRoomView_Day_3_de.png create mode 100644 screenshots/de/features.reportroom.impl_ReportRoomView_Day_4_de.png create mode 100644 screenshots/de/features.rolesandpermissions.impl.permissions_ChangeRoomPermissionsView_Day_0_de.png create mode 100644 screenshots/de/features.rolesandpermissions.impl.permissions_ChangeRoomPermissionsView_Day_1_de.png create mode 100644 screenshots/de/features.rolesandpermissions.impl.permissions_ChangeRoomPermissionsView_Day_2_de.png create mode 100644 screenshots/de/features.rolesandpermissions.impl.permissions_ChangeRoomPermissionsView_Day_3_de.png create mode 100644 screenshots/de/features.rolesandpermissions.impl.permissions_ChangeRoomPermissionsView_Day_4_de.png create mode 100644 screenshots/de/features.rolesandpermissions.impl.roles_ChangeRolesView_Day_0_de.png create mode 100644 screenshots/de/features.rolesandpermissions.impl.roles_ChangeRolesView_Day_10_de.png create mode 100644 screenshots/de/features.rolesandpermissions.impl.roles_ChangeRolesView_Day_11_de.png create mode 100644 screenshots/de/features.rolesandpermissions.impl.roles_ChangeRolesView_Day_12_de.png create mode 100644 screenshots/de/features.rolesandpermissions.impl.roles_ChangeRolesView_Day_13_de.png create mode 100644 screenshots/de/features.rolesandpermissions.impl.roles_ChangeRolesView_Day_1_de.png create mode 100644 screenshots/de/features.rolesandpermissions.impl.roles_ChangeRolesView_Day_2_de.png create mode 100644 screenshots/de/features.rolesandpermissions.impl.roles_ChangeRolesView_Day_3_de.png create mode 100644 screenshots/de/features.rolesandpermissions.impl.roles_ChangeRolesView_Day_4_de.png create mode 100644 screenshots/de/features.rolesandpermissions.impl.roles_ChangeRolesView_Day_6_de.png create mode 100644 screenshots/de/features.rolesandpermissions.impl.roles_ChangeRolesView_Day_7_de.png create mode 100644 screenshots/de/features.rolesandpermissions.impl.roles_ChangeRolesView_Day_8_de.png create mode 100644 screenshots/de/features.rolesandpermissions.impl.roles_ChangeRolesView_Day_9_de.png create mode 100644 screenshots/de/features.rolesandpermissions.impl.roles_PendingMemberRowWithLongName_Day_0_de.png create mode 100644 screenshots/de/features.rolesandpermissions.impl.root_RolesAndPermissionsView_Day_0_de.png create mode 100644 screenshots/de/features.rolesandpermissions.impl.root_RolesAndPermissionsView_Day_1_de.png create mode 100644 screenshots/de/features.rolesandpermissions.impl.root_RolesAndPermissionsView_Day_2_de.png create mode 100644 screenshots/de/features.rolesandpermissions.impl.root_RolesAndPermissionsView_Day_3_de.png create mode 100644 screenshots/de/features.rolesandpermissions.impl.root_RolesAndPermissionsView_Day_4_de.png create mode 100644 screenshots/de/features.rolesandpermissions.impl.root_RolesAndPermissionsView_Day_5_de.png create mode 100644 screenshots/de/features.rolesandpermissions.impl.root_RolesAndPermissionsView_Day_6_de.png create mode 100644 screenshots/de/features.rolesandpermissions.impl.root_RolesAndPermissionsView_Day_7_de.png create mode 100644 screenshots/de/features.rolesandpermissions.impl.root_RolesAndPermissionsView_Day_8_de.png create mode 100644 screenshots/de/features.roomaliasresolver.impl_RoomAliasResolverView_Day_1_de.png create mode 100644 screenshots/de/features.roomaliasresolver.impl_RoomAliasResolverView_Day_2_de.png create mode 100644 screenshots/de/features.roomdetails.impl.edit_RoomDetailsEditView_Day_0_de.png create mode 100644 screenshots/de/features.roomdetails.impl.edit_RoomDetailsEditView_Day_1_de.png create mode 100644 screenshots/de/features.roomdetails.impl.edit_RoomDetailsEditView_Day_2_de.png create mode 100644 screenshots/de/features.roomdetails.impl.edit_RoomDetailsEditView_Day_3_de.png create mode 100644 screenshots/de/features.roomdetails.impl.edit_RoomDetailsEditView_Day_4_de.png create mode 100644 screenshots/de/features.roomdetails.impl.edit_RoomDetailsEditView_Day_5_de.png create mode 100644 screenshots/de/features.roomdetails.impl.edit_RoomDetailsEditView_Day_6_de.png create mode 100644 screenshots/de/features.roomdetails.impl.edit_RoomDetailsEditView_Day_7_de.png create mode 100644 screenshots/de/features.roomdetails.impl.edit_RoomDetailsEditView_Day_8_de.png create mode 100644 screenshots/de/features.roomdetails.impl.invite_RoomInviteMembersView_Day_0_de.png create mode 100644 screenshots/de/features.roomdetails.impl.invite_RoomInviteMembersView_Day_1_de.png create mode 100644 screenshots/de/features.roomdetails.impl.invite_RoomInviteMembersView_Day_2_de.png create mode 100644 screenshots/de/features.roomdetails.impl.invite_RoomInviteMembersView_Day_3_de.png create mode 100644 screenshots/de/features.roomdetails.impl.members_RoomMemberListViewBanned_Day_0_de.png create mode 100644 screenshots/de/features.roomdetails.impl.members_RoomMemberListViewBanned_Day_1_de.png create mode 100644 screenshots/de/features.roomdetails.impl.members_RoomMemberListViewBanned_Day_2_de.png create mode 100644 screenshots/de/features.roomdetails.impl.members_RoomMemberListView_Day_0_de.png create mode 100644 screenshots/de/features.roomdetails.impl.members_RoomMemberListView_Day_1_de.png create mode 100644 screenshots/de/features.roomdetails.impl.members_RoomMemberListView_Day_2_de.png create mode 100644 screenshots/de/features.roomdetails.impl.members_RoomMemberListView_Day_3_de.png create mode 100644 screenshots/de/features.roomdetails.impl.members_RoomMemberListView_Day_4_de.png create mode 100644 screenshots/de/features.roomdetails.impl.members_RoomMemberListView_Day_5_de.png create mode 100644 screenshots/de/features.roomdetails.impl.members_RoomMemberListView_Day_7_de.png create mode 100644 screenshots/de/features.roomdetails.impl.members_RoomMemberListView_Day_8_de.png create mode 100644 screenshots/de/features.roomdetails.impl.members_RoomMemberListView_Day_9_de.png create mode 100644 screenshots/de/features.roomdetails.impl.notificationsettings_RoomNotificationSettingsOption_Day_0_de.png create mode 100644 screenshots/de/features.roomdetails.impl.notificationsettings_RoomNotificationSettingsView_Day_0_de.png create mode 100644 screenshots/de/features.roomdetails.impl.notificationsettings_RoomNotificationSettingsView_Day_1_de.png create mode 100644 screenshots/de/features.roomdetails.impl.notificationsettings_RoomNotificationSettingsView_Day_2_de.png create mode 100644 screenshots/de/features.roomdetails.impl.notificationsettings_RoomNotificationSettingsView_Day_3_de.png create mode 100644 screenshots/de/features.roomdetails.impl.notificationsettings_RoomNotificationSettingsView_Day_4_de.png create mode 100644 screenshots/de/features.roomdetails.impl.notificationsettings_RoomNotificationSettingsView_Day_5_de.png create mode 100644 screenshots/de/features.roomdetails.impl.notificationsettings_RoomNotificationSettingsView_Day_6_de.png create mode 100644 screenshots/de/features.roomdetails.impl.notificationsettings_UserDefinedRoomNotificationSettingsView_Day_0_de.png create mode 100644 screenshots/de/features.roomdetails.impl.securityandprivacy.editroomaddress_EditRoomAddressView_Day_0_de.png create mode 100644 screenshots/de/features.roomdetails.impl.securityandprivacy.editroomaddress_EditRoomAddressView_Day_1_de.png create mode 100644 screenshots/de/features.roomdetails.impl.securityandprivacy.editroomaddress_EditRoomAddressView_Day_2_de.png create mode 100644 screenshots/de/features.roomdetails.impl.securityandprivacy.editroomaddress_EditRoomAddressView_Day_3_de.png create mode 100644 screenshots/de/features.roomdetails.impl.securityandprivacy.editroomaddress_EditRoomAddressView_Day_4_de.png create mode 100644 screenshots/de/features.roomdetails.impl.securityandprivacy_SecurityAndPrivacyViewDark_0_de.png create mode 100644 screenshots/de/features.roomdetails.impl.securityandprivacy_SecurityAndPrivacyViewDark_1_de.png create mode 100644 screenshots/de/features.roomdetails.impl.securityandprivacy_SecurityAndPrivacyViewDark_2_de.png create mode 100644 screenshots/de/features.roomdetails.impl.securityandprivacy_SecurityAndPrivacyViewDark_3_de.png create mode 100644 screenshots/de/features.roomdetails.impl.securityandprivacy_SecurityAndPrivacyViewDark_4_de.png create mode 100644 screenshots/de/features.roomdetails.impl.securityandprivacy_SecurityAndPrivacyViewDark_5_de.png create mode 100644 screenshots/de/features.roomdetails.impl.securityandprivacy_SecurityAndPrivacyViewDark_6_de.png create mode 100644 screenshots/de/features.roomdetails.impl.securityandprivacy_SecurityAndPrivacyViewDark_7_de.png create mode 100644 screenshots/de/features.roomdetails.impl.securityandprivacy_SecurityAndPrivacyViewDark_8_de.png create mode 100644 screenshots/de/features.roomdetails.impl.securityandprivacy_SecurityAndPrivacyViewDark_9_de.png create mode 100644 screenshots/de/features.roomdetails.impl.securityandprivacy_SecurityAndPrivacyViewLight_0_de.png create mode 100644 screenshots/de/features.roomdetails.impl.securityandprivacy_SecurityAndPrivacyViewLight_1_de.png create mode 100644 screenshots/de/features.roomdetails.impl.securityandprivacy_SecurityAndPrivacyViewLight_2_de.png create mode 100644 screenshots/de/features.roomdetails.impl.securityandprivacy_SecurityAndPrivacyViewLight_3_de.png create mode 100644 screenshots/de/features.roomdetails.impl.securityandprivacy_SecurityAndPrivacyViewLight_4_de.png create mode 100644 screenshots/de/features.roomdetails.impl.securityandprivacy_SecurityAndPrivacyViewLight_5_de.png create mode 100644 screenshots/de/features.roomdetails.impl.securityandprivacy_SecurityAndPrivacyViewLight_6_de.png create mode 100644 screenshots/de/features.roomdetails.impl.securityandprivacy_SecurityAndPrivacyViewLight_7_de.png create mode 100644 screenshots/de/features.roomdetails.impl.securityandprivacy_SecurityAndPrivacyViewLight_8_de.png create mode 100644 screenshots/de/features.roomdetails.impl.securityandprivacy_SecurityAndPrivacyViewLight_9_de.png create mode 100644 screenshots/de/features.roomdetails.impl_RoomDetailsDark_0_de.png create mode 100644 screenshots/de/features.roomdetails.impl_RoomDetailsDark_10_de.png create mode 100644 screenshots/de/features.roomdetails.impl_RoomDetailsDark_11_de.png create mode 100644 screenshots/de/features.roomdetails.impl_RoomDetailsDark_12_de.png create mode 100644 screenshots/de/features.roomdetails.impl_RoomDetailsDark_13_de.png create mode 100644 screenshots/de/features.roomdetails.impl_RoomDetailsDark_14_de.png create mode 100644 screenshots/de/features.roomdetails.impl_RoomDetailsDark_15_de.png create mode 100644 screenshots/de/features.roomdetails.impl_RoomDetailsDark_16_de.png create mode 100644 screenshots/de/features.roomdetails.impl_RoomDetailsDark_17_de.png create mode 100644 screenshots/de/features.roomdetails.impl_RoomDetailsDark_18_de.png create mode 100644 screenshots/de/features.roomdetails.impl_RoomDetailsDark_19_de.png create mode 100644 screenshots/de/features.roomdetails.impl_RoomDetailsDark_1_de.png create mode 100644 screenshots/de/features.roomdetails.impl_RoomDetailsDark_2_de.png create mode 100644 screenshots/de/features.roomdetails.impl_RoomDetailsDark_3_de.png create mode 100644 screenshots/de/features.roomdetails.impl_RoomDetailsDark_4_de.png create mode 100644 screenshots/de/features.roomdetails.impl_RoomDetailsDark_5_de.png create mode 100644 screenshots/de/features.roomdetails.impl_RoomDetailsDark_6_de.png create mode 100644 screenshots/de/features.roomdetails.impl_RoomDetailsDark_7_de.png create mode 100644 screenshots/de/features.roomdetails.impl_RoomDetailsDark_8_de.png create mode 100644 screenshots/de/features.roomdetails.impl_RoomDetailsDark_9_de.png create mode 100644 screenshots/de/features.roomdetails.impl_RoomDetails_0_de.png create mode 100644 screenshots/de/features.roomdetails.impl_RoomDetails_10_de.png create mode 100644 screenshots/de/features.roomdetails.impl_RoomDetails_11_de.png create mode 100644 screenshots/de/features.roomdetails.impl_RoomDetails_12_de.png create mode 100644 screenshots/de/features.roomdetails.impl_RoomDetails_13_de.png create mode 100644 screenshots/de/features.roomdetails.impl_RoomDetails_14_de.png create mode 100644 screenshots/de/features.roomdetails.impl_RoomDetails_15_de.png create mode 100644 screenshots/de/features.roomdetails.impl_RoomDetails_16_de.png create mode 100644 screenshots/de/features.roomdetails.impl_RoomDetails_17_de.png create mode 100644 screenshots/de/features.roomdetails.impl_RoomDetails_18_de.png create mode 100644 screenshots/de/features.roomdetails.impl_RoomDetails_19_de.png create mode 100644 screenshots/de/features.roomdetails.impl_RoomDetails_1_de.png create mode 100644 screenshots/de/features.roomdetails.impl_RoomDetails_2_de.png create mode 100644 screenshots/de/features.roomdetails.impl_RoomDetails_3_de.png create mode 100644 screenshots/de/features.roomdetails.impl_RoomDetails_4_de.png create mode 100644 screenshots/de/features.roomdetails.impl_RoomDetails_5_de.png create mode 100644 screenshots/de/features.roomdetails.impl_RoomDetails_6_de.png create mode 100644 screenshots/de/features.roomdetails.impl_RoomDetails_7_de.png create mode 100644 screenshots/de/features.roomdetails.impl_RoomDetails_8_de.png create mode 100644 screenshots/de/features.roomdetails.impl_RoomDetails_9_de.png create mode 100644 screenshots/de/features.roomdirectory.impl.root_RoomDirectoryView_Day_0_de.png create mode 100644 screenshots/de/features.roomdirectory.impl.root_RoomDirectoryView_Day_1_de.png create mode 100644 screenshots/de/features.roomdirectory.impl.root_RoomDirectoryView_Day_2_de.png create mode 100644 screenshots/de/features.roommembermoderation.impl_RoomMemberModerationView_Day_0_de.png create mode 100644 screenshots/de/features.roommembermoderation.impl_RoomMemberModerationView_Day_1_de.png create mode 100644 screenshots/de/features.roommembermoderation.impl_RoomMemberModerationView_Day_2_de.png create mode 100644 screenshots/de/features.roommembermoderation.impl_RoomMemberModerationView_Day_3_de.png create mode 100644 screenshots/de/features.roommembermoderation.impl_RoomMemberModerationView_Day_4_de.png create mode 100644 screenshots/de/features.roommembermoderation.impl_RoomMemberModerationView_Day_5_de.png create mode 100644 screenshots/de/features.roommembermoderation.impl_RoomMemberModerationView_Day_6_de.png create mode 100644 screenshots/de/features.roommembermoderation.impl_RoomMemberModerationView_Day_7_de.png create mode 100644 screenshots/de/features.roommembermoderation.impl_RoomMemberModerationView_Day_8_de.png create mode 100644 screenshots/de/features.securebackup.impl.disable_SecureBackupDisableView_Day_0_de.png create mode 100644 screenshots/de/features.securebackup.impl.disable_SecureBackupDisableView_Day_1_de.png create mode 100644 screenshots/de/features.securebackup.impl.disable_SecureBackupDisableView_Day_2_de.png create mode 100644 screenshots/de/features.securebackup.impl.disable_SecureBackupDisableView_Day_3_de.png create mode 100644 screenshots/de/features.securebackup.impl.enter_SecureBackupEnterRecoveryKeyView_Day_0_de.png create mode 100644 screenshots/de/features.securebackup.impl.enter_SecureBackupEnterRecoveryKeyView_Day_1_de.png create mode 100644 screenshots/de/features.securebackup.impl.enter_SecureBackupEnterRecoveryKeyView_Day_2_de.png create mode 100644 screenshots/de/features.securebackup.impl.enter_SecureBackupEnterRecoveryKeyView_Day_3_de.png create mode 100644 screenshots/de/features.securebackup.impl.enter_SecureBackupEnterRecoveryKeyView_Day_4_de.png create mode 100644 screenshots/de/features.securebackup.impl.reset.password_ResetIdentityPasswordView_Day_0_de.png create mode 100644 screenshots/de/features.securebackup.impl.reset.password_ResetIdentityPasswordView_Day_1_de.png create mode 100644 screenshots/de/features.securebackup.impl.reset.password_ResetIdentityPasswordView_Day_2_de.png create mode 100644 screenshots/de/features.securebackup.impl.reset.password_ResetIdentityPasswordView_Day_3_de.png create mode 100644 screenshots/de/features.securebackup.impl.reset.root_ResetIdentityRootView_Day_0_de.png create mode 100644 screenshots/de/features.securebackup.impl.reset.root_ResetIdentityRootView_Day_1_de.png create mode 100644 screenshots/de/features.securebackup.impl.root_SecureBackupRootView_Day_0_de.png create mode 100644 screenshots/de/features.securebackup.impl.root_SecureBackupRootView_Day_10_de.png create mode 100644 screenshots/de/features.securebackup.impl.root_SecureBackupRootView_Day_11_de.png create mode 100644 screenshots/de/features.securebackup.impl.root_SecureBackupRootView_Day_12_de.png create mode 100644 screenshots/de/features.securebackup.impl.root_SecureBackupRootView_Day_13_de.png create mode 100644 screenshots/de/features.securebackup.impl.root_SecureBackupRootView_Day_14_de.png create mode 100644 screenshots/de/features.securebackup.impl.root_SecureBackupRootView_Day_15_de.png create mode 100644 screenshots/de/features.securebackup.impl.root_SecureBackupRootView_Day_16_de.png create mode 100644 screenshots/de/features.securebackup.impl.root_SecureBackupRootView_Day_17_de.png create mode 100644 screenshots/de/features.securebackup.impl.root_SecureBackupRootView_Day_1_de.png create mode 100644 screenshots/de/features.securebackup.impl.root_SecureBackupRootView_Day_2_de.png create mode 100644 screenshots/de/features.securebackup.impl.root_SecureBackupRootView_Day_3_de.png create mode 100644 screenshots/de/features.securebackup.impl.root_SecureBackupRootView_Day_4_de.png create mode 100644 screenshots/de/features.securebackup.impl.root_SecureBackupRootView_Day_5_de.png create mode 100644 screenshots/de/features.securebackup.impl.root_SecureBackupRootView_Day_6_de.png create mode 100644 screenshots/de/features.securebackup.impl.root_SecureBackupRootView_Day_7_de.png create mode 100644 screenshots/de/features.securebackup.impl.root_SecureBackupRootView_Day_8_de.png create mode 100644 screenshots/de/features.securebackup.impl.root_SecureBackupRootView_Day_9_de.png create mode 100644 screenshots/de/features.securebackup.impl.setup.views_RecoveryKeyView_Day_0_de.png create mode 100644 screenshots/de/features.securebackup.impl.setup.views_RecoveryKeyView_Day_10_de.png create mode 100644 screenshots/de/features.securebackup.impl.setup.views_RecoveryKeyView_Day_11_de.png create mode 100644 screenshots/de/features.securebackup.impl.setup.views_RecoveryKeyView_Day_12_de.png create mode 100644 screenshots/de/features.securebackup.impl.setup.views_RecoveryKeyView_Day_13_de.png create mode 100644 screenshots/de/features.securebackup.impl.setup.views_RecoveryKeyView_Day_14_de.png create mode 100644 screenshots/de/features.securebackup.impl.setup.views_RecoveryKeyView_Day_1_de.png create mode 100644 screenshots/de/features.securebackup.impl.setup.views_RecoveryKeyView_Day_2_de.png create mode 100644 screenshots/de/features.securebackup.impl.setup.views_RecoveryKeyView_Day_3_de.png create mode 100644 screenshots/de/features.securebackup.impl.setup.views_RecoveryKeyView_Day_4_de.png create mode 100644 screenshots/de/features.securebackup.impl.setup.views_RecoveryKeyView_Day_5_de.png create mode 100644 screenshots/de/features.securebackup.impl.setup.views_RecoveryKeyView_Day_6_de.png create mode 100644 screenshots/de/features.securebackup.impl.setup.views_RecoveryKeyView_Day_7_de.png create mode 100644 screenshots/de/features.securebackup.impl.setup.views_RecoveryKeyView_Day_8_de.png create mode 100644 screenshots/de/features.securebackup.impl.setup.views_RecoveryKeyView_Day_9_de.png create mode 100644 screenshots/de/features.securebackup.impl.setup_SecureBackupSetupViewChange_Day_0_de.png create mode 100644 screenshots/de/features.securebackup.impl.setup_SecureBackupSetupViewChange_Day_1_de.png create mode 100644 screenshots/de/features.securebackup.impl.setup_SecureBackupSetupViewChange_Day_2_de.png create mode 100644 screenshots/de/features.securebackup.impl.setup_SecureBackupSetupViewChange_Day_3_de.png create mode 100644 screenshots/de/features.securebackup.impl.setup_SecureBackupSetupViewChange_Day_4_de.png create mode 100644 screenshots/de/features.securebackup.impl.setup_SecureBackupSetupViewChange_Day_5_de.png create mode 100644 screenshots/de/features.securebackup.impl.setup_SecureBackupSetupView_Day_0_de.png create mode 100644 screenshots/de/features.securebackup.impl.setup_SecureBackupSetupView_Day_1_de.png create mode 100644 screenshots/de/features.securebackup.impl.setup_SecureBackupSetupView_Day_2_de.png create mode 100644 screenshots/de/features.securebackup.impl.setup_SecureBackupSetupView_Day_3_de.png create mode 100644 screenshots/de/features.securebackup.impl.setup_SecureBackupSetupView_Day_4_de.png create mode 100644 screenshots/de/features.securebackup.impl.setup_SecureBackupSetupView_Day_5_de.png create mode 100644 screenshots/de/features.share.impl_ShareView_Day_3_de.png create mode 100644 screenshots/de/features.signedout.impl_SignedOutView_Day_0_de.png create mode 100644 screenshots/de/features.space.impl.leave_LeaveSpaceView_Day_0_de.png create mode 100644 screenshots/de/features.space.impl.leave_LeaveSpaceView_Day_1_de.png create mode 100644 screenshots/de/features.space.impl.leave_LeaveSpaceView_Day_2_de.png create mode 100644 screenshots/de/features.space.impl.leave_LeaveSpaceView_Day_3_de.png create mode 100644 screenshots/de/features.space.impl.leave_LeaveSpaceView_Day_4_de.png create mode 100644 screenshots/de/features.space.impl.leave_LeaveSpaceView_Day_5_de.png create mode 100644 screenshots/de/features.space.impl.leave_LeaveSpaceView_Day_6_de.png create mode 100644 screenshots/de/features.space.impl.leave_LeaveSpaceView_Day_7_de.png create mode 100644 screenshots/de/features.space.impl.leave_LeaveSpaceView_Day_8_de.png create mode 100644 screenshots/de/features.space.impl.leave_LeaveSpaceView_Day_9_de.png create mode 100644 screenshots/de/features.space.impl.root_SpaceView_Day_0_de.png create mode 100644 screenshots/de/features.space.impl.root_SpaceView_Day_1_de.png create mode 100644 screenshots/de/features.space.impl.root_SpaceView_Day_2_de.png create mode 100644 screenshots/de/features.space.impl.root_SpaceView_Day_3_de.png create mode 100644 screenshots/de/features.space.impl.root_SpaceView_Day_4_de.png create mode 100644 screenshots/de/features.space.impl.root_SpaceView_Day_5_de.png create mode 100644 screenshots/de/features.space.impl.settings_SpaceSettingsView_Day_0_de.png create mode 100644 screenshots/de/features.space.impl.settings_SpaceSettingsView_Day_1_de.png create mode 100644 screenshots/de/features.space.impl.settings_SpaceSettingsView_Day_2_de.png create mode 100644 screenshots/de/features.space.impl.settings_SpaceSettingsView_Day_3_de.png create mode 100644 screenshots/de/features.startchat.impl.components_SearchMultipleUsersResultItem_de.png create mode 100644 screenshots/de/features.startchat.impl.components_SearchSingleUserResultItem_de.png create mode 100644 screenshots/de/features.startchat.impl.components_UserListView_Day_0_de.png create mode 100644 screenshots/de/features.startchat.impl.components_UserListView_Day_1_de.png create mode 100644 screenshots/de/features.startchat.impl.components_UserListView_Day_2_de.png create mode 100644 screenshots/de/features.startchat.impl.components_UserListView_Day_7_de.png create mode 100644 screenshots/de/features.startchat.impl.components_UserListView_Day_9_de.png create mode 100644 screenshots/de/features.startchat.impl.joinbyaddress_JoinRoomByAddressView_Day_0_de.png create mode 100644 screenshots/de/features.startchat.impl.joinbyaddress_JoinRoomByAddressView_Day_1_de.png create mode 100644 screenshots/de/features.startchat.impl.joinbyaddress_JoinRoomByAddressView_Day_2_de.png create mode 100644 screenshots/de/features.startchat.impl.joinbyaddress_JoinRoomByAddressView_Day_3_de.png create mode 100644 screenshots/de/features.startchat.impl.joinbyaddress_JoinRoomByAddressView_Day_4_de.png create mode 100644 screenshots/de/features.startchat.impl.joinbyaddress_JoinRoomByAddressView_Day_5_de.png create mode 100644 screenshots/de/features.startchat.impl.root_StartChatView_Day_0_de.png create mode 100644 screenshots/de/features.startchat.impl.root_StartChatView_Day_1_de.png create mode 100644 screenshots/de/features.startchat.impl.root_StartChatView_Day_2_de.png create mode 100644 screenshots/de/features.startchat.impl.root_StartChatView_Day_3_de.png create mode 100644 screenshots/de/features.startchat.impl.root_StartChatView_Day_4_de.png create mode 100644 screenshots/de/features.startchat.impl.root_StartChatView_Day_5_de.png create mode 100644 screenshots/de/features.userprofile.shared_UserProfileHeaderSectionWithVerificationViolation_Day_0_de.png create mode 100644 screenshots/de/features.userprofile.shared_UserProfileHeaderSection_Day_0_de.png create mode 100644 screenshots/de/features.userprofile.shared_UserProfileView_Day_0_de.png create mode 100644 screenshots/de/features.userprofile.shared_UserProfileView_Day_1_de.png create mode 100644 screenshots/de/features.userprofile.shared_UserProfileView_Day_2_de.png create mode 100644 screenshots/de/features.userprofile.shared_UserProfileView_Day_3_de.png create mode 100644 screenshots/de/features.userprofile.shared_UserProfileView_Day_4_de.png create mode 100644 screenshots/de/features.userprofile.shared_UserProfileView_Day_5_de.png create mode 100644 screenshots/de/features.userprofile.shared_UserProfileView_Day_6_de.png create mode 100644 screenshots/de/features.userprofile.shared_UserProfileView_Day_7_de.png create mode 100644 screenshots/de/features.userprofile.shared_UserProfileView_Day_8_de.png create mode 100644 screenshots/de/features.userprofile.shared_UserProfileView_Day_9_de.png create mode 100644 screenshots/de/features.verifysession.impl.emoji_SasEmojis_Day_0_de.png create mode 100644 screenshots/de/features.verifysession.impl.incoming.ui_SessionDetailsView_Day_0_de.png create mode 100644 screenshots/de/features.verifysession.impl.incoming_IncomingVerificationView_Day_0_de.png create mode 100644 screenshots/de/features.verifysession.impl.incoming_IncomingVerificationView_Day_10_de.png create mode 100644 screenshots/de/features.verifysession.impl.incoming_IncomingVerificationView_Day_11_de.png create mode 100644 screenshots/de/features.verifysession.impl.incoming_IncomingVerificationView_Day_12_de.png create mode 100644 screenshots/de/features.verifysession.impl.incoming_IncomingVerificationView_Day_13_de.png create mode 100644 screenshots/de/features.verifysession.impl.incoming_IncomingVerificationView_Day_1_de.png create mode 100644 screenshots/de/features.verifysession.impl.incoming_IncomingVerificationView_Day_2_de.png create mode 100644 screenshots/de/features.verifysession.impl.incoming_IncomingVerificationView_Day_3_de.png create mode 100644 screenshots/de/features.verifysession.impl.incoming_IncomingVerificationView_Day_4_de.png create mode 100644 screenshots/de/features.verifysession.impl.incoming_IncomingVerificationView_Day_5_de.png create mode 100644 screenshots/de/features.verifysession.impl.incoming_IncomingVerificationView_Day_6_de.png create mode 100644 screenshots/de/features.verifysession.impl.incoming_IncomingVerificationView_Day_7_de.png create mode 100644 screenshots/de/features.verifysession.impl.incoming_IncomingVerificationView_Day_8_de.png create mode 100644 screenshots/de/features.verifysession.impl.incoming_IncomingVerificationView_Day_9_de.png create mode 100644 screenshots/de/features.verifysession.impl.outgoing_OutgoingVerificationView_Day_0_de.png create mode 100644 screenshots/de/features.verifysession.impl.outgoing_OutgoingVerificationView_Day_10_de.png create mode 100644 screenshots/de/features.verifysession.impl.outgoing_OutgoingVerificationView_Day_11_de.png create mode 100644 screenshots/de/features.verifysession.impl.outgoing_OutgoingVerificationView_Day_1_de.png create mode 100644 screenshots/de/features.verifysession.impl.outgoing_OutgoingVerificationView_Day_2_de.png create mode 100644 screenshots/de/features.verifysession.impl.outgoing_OutgoingVerificationView_Day_3_de.png create mode 100644 screenshots/de/features.verifysession.impl.outgoing_OutgoingVerificationView_Day_4_de.png create mode 100644 screenshots/de/features.verifysession.impl.outgoing_OutgoingVerificationView_Day_5_de.png create mode 100644 screenshots/de/features.verifysession.impl.outgoing_OutgoingVerificationView_Day_6_de.png create mode 100644 screenshots/de/features.verifysession.impl.outgoing_OutgoingVerificationView_Day_7_de.png create mode 100644 screenshots/de/features.verifysession.impl.outgoing_OutgoingVerificationView_Day_8_de.png create mode 100644 screenshots/de/features.verifysession.impl.outgoing_OutgoingVerificationView_Day_9_de.png create mode 100644 screenshots/de/features.viewfolder.impl.file_ViewFileView_Day_3_de.png create mode 100644 screenshots/de/libraries.accountselect.impl_AccountSelectView_Day_0_de.png create mode 100644 screenshots/de/libraries.accountselect.impl_AccountSelectView_Day_1_de.png create mode 100644 screenshots/de/libraries.dateformatter.impl.previews_DateFormatterModeView_0_de.png create mode 100644 screenshots/de/libraries.dateformatter.impl.previews_DateFormatterModeView_1_de.png create mode 100644 screenshots/de/libraries.dateformatter.impl.previews_DateFormatterModeView_2_de.png create mode 100644 screenshots/de/libraries.dateformatter.impl.previews_DateFormatterModeView_3_de.png create mode 100644 screenshots/de/libraries.dateformatter.impl.previews_DateFormatterModeView_4_de.png create mode 100644 screenshots/de/libraries.designsystem.atomic.molecules_ComposerAlertMolecule_Day_0_de.png create mode 100644 screenshots/de/libraries.designsystem.atomic.molecules_ComposerAlertMolecule_Day_1_de.png create mode 100644 screenshots/de/libraries.designsystem.atomic.molecules_ComposerAlertMolecule_Day_2_de.png create mode 100644 screenshots/de/libraries.designsystem.atomic.molecules_ComposerAlertMolecule_Day_3_de.png create mode 100644 screenshots/de/libraries.designsystem.atomic.molecules_ComposerAlertMolecule_Day_4_de.png create mode 100644 screenshots/de/libraries.designsystem.atomic.molecules_ComposerAlertMolecule_Day_5_de.png create mode 100644 screenshots/de/libraries.designsystem.atomic.molecules_ComposerAlertMolecule_Day_6_de.png create mode 100644 screenshots/de/libraries.designsystem.atomic.molecules_ComposerAlertMolecule_Day_7_de.png create mode 100644 screenshots/de/libraries.designsystem.atomic.molecules_ComposerAlertMolecule_Day_8_de.png create mode 100644 screenshots/de/libraries.designsystem.components.async_AsyncActionView_Day_1_de.png create mode 100644 screenshots/de/libraries.designsystem.components.async_AsyncActionView_Day_3_de.png create mode 100644 screenshots/de/libraries.designsystem.components.async_AsyncFailure_Day_0_de.png create mode 100644 screenshots/de/libraries.designsystem.components.dialogs_AlertDialogContent_Dialogs_de.png create mode 100644 screenshots/de/libraries.designsystem.components.dialogs_AlertDialog_Day_0_de.png create mode 100644 screenshots/de/libraries.designsystem.components.dialogs_ErrorDialogContent_Dialogs_de.png create mode 100644 screenshots/de/libraries.designsystem.components.dialogs_ErrorDialogWithDoNotShowAgain_Day_0_de.png create mode 100644 screenshots/de/libraries.designsystem.components.dialogs_ErrorDialog_Day_0_de.png create mode 100644 screenshots/de/libraries.designsystem.components.dialogs_RetryDialogContent_Dialogs_de.png create mode 100644 screenshots/de/libraries.designsystem.components.dialogs_RetryDialog_Day_0_de.png create mode 100644 screenshots/de/libraries.designsystem.components.dialogs_SaveChangesDialog_Day_0_de.png create mode 100644 screenshots/de/libraries.designsystem.components.dialogs_TextFieldDialogWithError_Day_0_de.png create mode 100644 screenshots/de/libraries.designsystem.components.dialogs_TextFieldDialog_Day_0_de.png create mode 100644 screenshots/de/libraries.designsystem.components_ProgressDialogContent_Dialogs_de.png create mode 100644 screenshots/de/libraries.designsystem.components_ProgressDialogWithContent_Day_0_de.png create mode 100644 screenshots/de/libraries.designsystem.components_ProgressDialog_Day_0_de.png create mode 100644 screenshots/de/libraries.designsystem.theme.components.previews_DatePickerDark_DateTime_pickers_de.png create mode 100644 screenshots/de/libraries.designsystem.theme.components.previews_DatePickerLight_DateTime_pickers_de.png create mode 100644 screenshots/de/libraries.designsystem.theme.components.previews_TimePickerHorizontal_DateTime_pickers_de.png create mode 100644 screenshots/de/libraries.designsystem.theme.components.previews_TimePickerVerticalDark_DateTime_pickers_de.png create mode 100644 screenshots/de/libraries.designsystem.theme.components.previews_TimePickerVerticalLight_DateTime_pickers_de.png create mode 100644 screenshots/de/libraries.designsystem.theme.components_SearchBarActiveWithNoResults_Search_views_de.png create mode 100644 screenshots/de/libraries.matrix.ui.components_AvatarActionBottomSheet_Day_0_de.png create mode 100644 screenshots/de/libraries.matrix.ui.components_CheckableUnresolvedUserRow_de.png create mode 100644 screenshots/de/libraries.matrix.ui.components_CreateDmConfirmationBottomSheet_Day_0_de.png create mode 100644 screenshots/de/libraries.matrix.ui.components_CreateDmConfirmationBottomSheet_Day_1_de.png create mode 100644 screenshots/de/libraries.matrix.ui.components_InviteSenderView_Day_0_de.png create mode 100644 screenshots/de/libraries.matrix.ui.components_OrganizationHeader_Day_0_de.png create mode 100644 screenshots/de/libraries.matrix.ui.components_SpaceHeaderRootView_Day_0_de.png create mode 100644 screenshots/de/libraries.matrix.ui.components_SpaceHeaderView_Day_0_de.png create mode 100644 screenshots/de/libraries.matrix.ui.components_SpaceInfoRow_Day_0_de.png create mode 100644 screenshots/de/libraries.matrix.ui.components_SpaceRoomItemView_Day_0_de.png create mode 100644 screenshots/de/libraries.matrix.ui.components_SpaceRoomItemView_Day_1_de.png create mode 100644 screenshots/de/libraries.matrix.ui.components_SpaceRoomItemView_Day_2_de.png create mode 100644 screenshots/de/libraries.matrix.ui.components_SpaceRoomItemView_Day_3_de.png create mode 100644 screenshots/de/libraries.matrix.ui.components_SpaceRoomItemView_Day_4_de.png create mode 100644 screenshots/de/libraries.matrix.ui.components_SpaceRoomItemView_Day_5_de.png create mode 100644 screenshots/de/libraries.matrix.ui.components_SpaceRoomItemView_Day_6_de.png create mode 100644 screenshots/de/libraries.matrix.ui.components_SpaceRoomItemView_Day_7_de.png create mode 100644 screenshots/de/libraries.matrix.ui.components_SpaceRoomItemView_Day_8_de.png create mode 100644 screenshots/de/libraries.matrix.ui.components_UnresolvedUserRow_de.png create mode 100644 screenshots/de/libraries.matrix.ui.messages.reply_InReplyToView_Day_4_de.png create mode 100644 screenshots/de/libraries.matrix.ui.messages.reply_InReplyToView_Day_8_de.png create mode 100644 screenshots/de/libraries.mediaviewer.impl.details_MediaDeleteConfirmationBottomSheet_Day_0_de.png create mode 100644 screenshots/de/libraries.mediaviewer.impl.details_MediaDetailsBottomSheet_Day_0_de.png create mode 100644 screenshots/de/libraries.mediaviewer.impl.gallery_MediaGalleryView_Day_0_de.png create mode 100644 screenshots/de/libraries.mediaviewer.impl.gallery_MediaGalleryView_Day_10_de.png create mode 100644 screenshots/de/libraries.mediaviewer.impl.gallery_MediaGalleryView_Day_11_de.png create mode 100644 screenshots/de/libraries.mediaviewer.impl.gallery_MediaGalleryView_Day_12_de.png create mode 100644 screenshots/de/libraries.mediaviewer.impl.gallery_MediaGalleryView_Day_1_de.png create mode 100644 screenshots/de/libraries.mediaviewer.impl.gallery_MediaGalleryView_Day_2_de.png create mode 100644 screenshots/de/libraries.mediaviewer.impl.gallery_MediaGalleryView_Day_3_de.png create mode 100644 screenshots/de/libraries.mediaviewer.impl.gallery_MediaGalleryView_Day_4_de.png create mode 100644 screenshots/de/libraries.mediaviewer.impl.gallery_MediaGalleryView_Day_5_de.png create mode 100644 screenshots/de/libraries.mediaviewer.impl.gallery_MediaGalleryView_Day_6_de.png create mode 100644 screenshots/de/libraries.mediaviewer.impl.gallery_MediaGalleryView_Day_7_de.png create mode 100644 screenshots/de/libraries.mediaviewer.impl.gallery_MediaGalleryView_Day_8_de.png create mode 100644 screenshots/de/libraries.mediaviewer.impl.gallery_MediaGalleryView_Day_9_de.png create mode 100644 screenshots/de/libraries.mediaviewer.impl.local.pdf_PdfPagesErrorView_Day_0_de.png create mode 100644 screenshots/de/libraries.mediaviewer.impl.viewer_MediaViewerView_11_de.png create mode 100644 screenshots/de/libraries.mediaviewer.impl.viewer_MediaViewerView_12_de.png create mode 100644 screenshots/de/libraries.mediaviewer.impl.viewer_MediaViewerView_14_de.png create mode 100644 screenshots/de/libraries.mediaviewer.impl.viewer_MediaViewerView_2_de.png create mode 100644 screenshots/de/libraries.permissions.api_PermissionsView_Day_0_de.png create mode 100644 screenshots/de/libraries.permissions.api_PermissionsView_Day_1_de.png create mode 100644 screenshots/de/libraries.permissions.api_PermissionsView_Day_2_de.png create mode 100644 screenshots/de/libraries.permissions.api_PermissionsView_Day_3_de.png create mode 100644 screenshots/de/libraries.roomselect.impl_RoomSelectView_Day_0_de.png create mode 100644 screenshots/de/libraries.roomselect.impl_RoomSelectView_Day_1_de.png create mode 100644 screenshots/de/libraries.roomselect.impl_RoomSelectView_Day_2_de.png create mode 100644 screenshots/de/libraries.roomselect.impl_RoomSelectView_Day_3_de.png create mode 100644 screenshots/de/libraries.roomselect.impl_RoomSelectView_Day_4_de.png create mode 100644 screenshots/de/libraries.roomselect.impl_RoomSelectView_Day_5_de.png create mode 100644 screenshots/de/libraries.textcomposer_CaptionWarningBottomSheet_Day_0_de.png create mode 100644 screenshots/de/libraries.textcomposer_ComposerModeView_Day_0_de.png create mode 100644 screenshots/de/libraries.textcomposer_MarkdownTextComposerEdit_Day_0_de.png create mode 100644 screenshots/de/libraries.textcomposer_TextComposerAddCaption_Day_0_de.png create mode 100644 screenshots/de/libraries.textcomposer_TextComposerCaption_Day_0_de.png create mode 100644 screenshots/de/libraries.textcomposer_TextComposerEditCaption_Day_0_de.png create mode 100644 screenshots/de/libraries.textcomposer_TextComposerEditNotEncrypted_Day_0_de.png create mode 100644 screenshots/de/libraries.textcomposer_TextComposerEdit_Day_0_de.png create mode 100644 screenshots/de/libraries.textcomposer_TextComposerFormattingNotEncrypted_Day_0_de.png create mode 100644 screenshots/de/libraries.textcomposer_TextComposerFormatting_Day_0_de.png create mode 100644 screenshots/de/libraries.textcomposer_TextComposerLinkDialogCreateLinkWithoutText_Day_0_de.png create mode 100644 screenshots/de/libraries.textcomposer_TextComposerLinkDialogCreateLink_Day_0_de.png create mode 100644 screenshots/de/libraries.textcomposer_TextComposerLinkDialogEditLink_Day_0_de.png create mode 100644 screenshots/de/libraries.textcomposer_TextComposerReplyNotEncrypted_Day_0_de.png create mode 100644 screenshots/de/libraries.textcomposer_TextComposerReplyNotEncrypted_Day_10_de.png create mode 100644 screenshots/de/libraries.textcomposer_TextComposerReplyNotEncrypted_Day_11_de.png create mode 100644 screenshots/de/libraries.textcomposer_TextComposerReplyNotEncrypted_Day_1_de.png create mode 100644 screenshots/de/libraries.textcomposer_TextComposerReplyNotEncrypted_Day_2_de.png create mode 100644 screenshots/de/libraries.textcomposer_TextComposerReplyNotEncrypted_Day_3_de.png create mode 100644 screenshots/de/libraries.textcomposer_TextComposerReplyNotEncrypted_Day_4_de.png create mode 100644 screenshots/de/libraries.textcomposer_TextComposerReplyNotEncrypted_Day_5_de.png create mode 100644 screenshots/de/libraries.textcomposer_TextComposerReplyNotEncrypted_Day_6_de.png create mode 100644 screenshots/de/libraries.textcomposer_TextComposerReplyNotEncrypted_Day_7_de.png create mode 100644 screenshots/de/libraries.textcomposer_TextComposerReplyNotEncrypted_Day_8_de.png create mode 100644 screenshots/de/libraries.textcomposer_TextComposerReplyNotEncrypted_Day_9_de.png create mode 100644 screenshots/de/libraries.textcomposer_TextComposerReply_Day_0_de.png create mode 100644 screenshots/de/libraries.textcomposer_TextComposerReply_Day_10_de.png create mode 100644 screenshots/de/libraries.textcomposer_TextComposerReply_Day_11_de.png create mode 100644 screenshots/de/libraries.textcomposer_TextComposerReply_Day_1_de.png create mode 100644 screenshots/de/libraries.textcomposer_TextComposerReply_Day_2_de.png create mode 100644 screenshots/de/libraries.textcomposer_TextComposerReply_Day_3_de.png create mode 100644 screenshots/de/libraries.textcomposer_TextComposerReply_Day_4_de.png create mode 100644 screenshots/de/libraries.textcomposer_TextComposerReply_Day_5_de.png create mode 100644 screenshots/de/libraries.textcomposer_TextComposerReply_Day_6_de.png create mode 100644 screenshots/de/libraries.textcomposer_TextComposerReply_Day_7_de.png create mode 100644 screenshots/de/libraries.textcomposer_TextComposerReply_Day_8_de.png create mode 100644 screenshots/de/libraries.textcomposer_TextComposerReply_Day_9_de.png create mode 100644 screenshots/de/libraries.textcomposer_TextComposerSimpleNotEncrypted_Day_0_de.png create mode 100644 screenshots/de/libraries.textcomposer_TextComposerSimple_Day_0_de.png create mode 100644 screenshots/de/libraries.textcomposer_TextComposerVoiceNotEncrypted_Day_0_de.png create mode 100644 screenshots/de/libraries.troubleshoot.impl.history_PushHistoryView_Day_0_de.png create mode 100644 screenshots/de/libraries.troubleshoot.impl.history_PushHistoryView_Day_1_de.png create mode 100644 screenshots/de/libraries.troubleshoot.impl.history_PushHistoryView_Day_2_de.png create mode 100644 screenshots/de/libraries.troubleshoot.impl.history_PushHistoryView_Day_3_de.png create mode 100644 screenshots/de/libraries.troubleshoot.impl_TroubleshootNotificationsView_Day_0_de.png create mode 100644 screenshots/de/libraries.troubleshoot.impl_TroubleshootNotificationsView_Day_1_de.png create mode 100644 screenshots/de/libraries.troubleshoot.impl_TroubleshootNotificationsView_Day_2_de.png create mode 100644 screenshots/de/libraries.troubleshoot.impl_TroubleshootNotificationsView_Day_3_de.png create mode 100644 screenshots/de/libraries.troubleshoot.impl_TroubleshootNotificationsView_Day_4_de.png create mode 100644 screenshots/de/libraries.troubleshoot.impl_TroubleshootNotificationsView_Day_5_de.png create mode 100644 screenshots/de/libraries.troubleshoot.impl_TroubleshootNotificationsView_Day_6_de.png create mode 100644 screenshots/de/libraries.troubleshoot.impl_TroubleshootNotificationsView_Day_7_de.png create mode 100644 screenshots/de/services.apperror.impl_AppErrorView_Day_0_de.png create mode 100644 screenshots/html/data.js create mode 100644 screenshots/html/screenshots.css create mode 100644 screenshots/html/script.js create mode 100644 screenshots/index.html create mode 100644 services/analytics/api/build.gradle.kts create mode 100644 services/analytics/api/src/main/kotlin/io/element/android/services/analytics/api/AnalyticsLongRunningTransaction.kt create mode 100644 services/analytics/api/src/main/kotlin/io/element/android/services/analytics/api/AnalyticsService.kt create mode 100644 services/analytics/api/src/main/kotlin/io/element/android/services/analytics/api/NoopAnalyticsTransaction.kt create mode 100644 services/analytics/api/src/main/kotlin/io/element/android/services/analytics/api/ScreenTracker.kt create mode 100644 services/analytics/api/src/main/kotlin/io/element/android/services/analytics/api/watchers/AnalyticsColdStartWatcher.kt create mode 100644 services/analytics/api/src/main/kotlin/io/element/android/services/analytics/api/watchers/AnalyticsRoomListStateWatcher.kt create mode 100644 services/analytics/compose/build.gradle.kts create mode 100644 services/analytics/compose/src/main/kotlin/io/element/android/services/analytics/compose/LocalAnalyticsService.kt create mode 100644 services/analytics/impl/build.gradle.kts create mode 100644 services/analytics/impl/src/main/kotlin/io/element/android/services/analytics/impl/DefaultAnalyticsService.kt create mode 100644 services/analytics/impl/src/main/kotlin/io/element/android/services/analytics/impl/DefaultScreenTracker.kt create mode 100644 services/analytics/impl/src/main/kotlin/io/element/android/services/analytics/impl/log/AnalyticsLoggerTag.kt create mode 100644 services/analytics/impl/src/main/kotlin/io/element/android/services/analytics/impl/store/AnalyticsStore.kt create mode 100644 services/analytics/impl/src/main/kotlin/io/element/android/services/analytics/impl/watchers/DefaultAnalyticsColdStartWatcher.kt create mode 100644 services/analytics/impl/src/main/kotlin/io/element/android/services/analytics/impl/watchers/DefaultAnalyticsRoomListStateWatcher.kt create mode 100644 services/analytics/impl/src/test/kotlin/io/element/android/services/analytics/impl/DefaultAnalyticsServiceTest.kt create mode 100644 services/analytics/impl/src/test/kotlin/io/element/android/services/analytics/impl/DefaultScreenTrackerTest.kt create mode 100644 services/analytics/impl/src/test/kotlin/io/element/android/services/analytics/impl/store/FakeAnalyticsStore.kt create mode 100644 services/analytics/impl/src/test/kotlin/io/element/android/services/analytics/impl/watchers/DefaultAnalyticsColdStartWatcherTest.kt create mode 100644 services/analytics/impl/src/test/kotlin/io/element/android/services/analytics/impl/watchers/DefaultAnalyticsRoomListStateWatcherTest.kt create mode 100644 services/analytics/noop/build.gradle.kts create mode 100644 services/analytics/noop/src/main/kotlin/io/element/android/services/analytics/noop/NoopAnalyticsService.kt create mode 100644 services/analytics/noop/src/main/kotlin/io/element/android/services/analytics/noop/NoopScreenTracker.kt create mode 100644 services/analytics/noop/src/main/kotlin/io/element/android/services/analytics/noop/watchers/NoopAnalyticsColdStartWatcher.kt create mode 100644 services/analytics/noop/src/main/kotlin/io/element/android/services/analytics/noop/watchers/NoopAnalyticsRoomListStateWatcher.kt create mode 100644 services/analytics/noop/src/test/kotlin/io/element/android/services/analytics/noop/NoopAnalyticsServiceTest.kt create mode 100644 services/analytics/noop/src/test/kotlin/io/element/android/services/analytics/noop/NoopScreenTrackerTest.kt create mode 100644 services/analytics/test/build.gradle.kts create mode 100644 services/analytics/test/src/main/kotlin/io/element/android/services/analytics/test/FakeAnalyticsService.kt create mode 100644 services/analytics/test/src/main/kotlin/io/element/android/services/analytics/test/FakeScreenTracker.kt create mode 100644 services/analytics/test/src/main/kotlin/io/element/android/services/analytics/test/watchers/FakeAnalyticsColdStartWatcher.kt create mode 100644 services/analyticsproviders/api/build.gradle.kts create mode 100644 services/analyticsproviders/api/src/main/kotlin/io/element/android/services/analyticsproviders/api/AnalyticsProvider.kt create mode 100644 services/analyticsproviders/api/src/main/kotlin/io/element/android/services/analyticsproviders/api/AnalyticsTransaction.kt create mode 100644 services/analyticsproviders/api/src/main/kotlin/io/element/android/services/analyticsproviders/api/trackers/AnalyticsTracker.kt create mode 100644 services/analyticsproviders/api/src/main/kotlin/io/element/android/services/analyticsproviders/api/trackers/ErrorTracker.kt create mode 100644 services/analyticsproviders/posthog/build.gradle.kts create mode 100644 services/analyticsproviders/posthog/src/main/kotlin/io/element/android/services/analyticsproviders/posthog/PostHogFactory.kt create mode 100644 services/analyticsproviders/posthog/src/main/kotlin/io/element/android/services/analyticsproviders/posthog/PosthogAnalyticsProvider.kt create mode 100644 services/analyticsproviders/posthog/src/main/kotlin/io/element/android/services/analyticsproviders/posthog/PosthogEndpointConfig.kt create mode 100644 services/analyticsproviders/posthog/src/main/kotlin/io/element/android/services/analyticsproviders/posthog/PosthogEndpointConfigProvider.kt create mode 100644 services/analyticsproviders/posthog/src/main/kotlin/io/element/android/services/analyticsproviders/posthog/extensions/InteractionExt.kt create mode 100644 services/analyticsproviders/posthog/src/main/kotlin/io/element/android/services/analyticsproviders/posthog/log/AnalyticsLoggerTag.kt create mode 100644 services/analyticsproviders/posthog/src/test/kotlin/io/element/android/services/analyticsproviders/posthog/PosthogAnalyticsProviderTest.kt create mode 100644 services/analyticsproviders/sentry/build.gradle.kts create mode 100644 services/analyticsproviders/sentry/src/main/AndroidManifest.xml create mode 100644 services/analyticsproviders/sentry/src/main/kotlin/io/element/android/services/analyticsproviders/sentry/SentryAnalyticsProvider.kt create mode 100644 services/analyticsproviders/sentry/src/main/kotlin/io/element/android/services/analyticsproviders/sentry/SentryAnalyticsTransaction.kt create mode 100644 services/analyticsproviders/sentry/src/main/kotlin/io/element/android/services/analyticsproviders/sentry/SentryConfig.kt create mode 100644 services/analyticsproviders/sentry/src/main/kotlin/io/element/android/services/analyticsproviders/sentry/log/AnalyticsLoggerTag.kt create mode 100644 services/analyticsproviders/test/build.gradle.kts create mode 100644 services/analyticsproviders/test/src/main/kotlin/io/element/android/services/analyticsproviders/test/FakeAnalyticsProvider.kt create mode 100644 services/apperror/api/build.gradle.kts create mode 100644 services/apperror/api/src/main/kotlin/io/element/android/services/apperror/api/AppErrorState.kt create mode 100644 services/apperror/api/src/main/kotlin/io/element/android/services/apperror/api/AppErrorStateProvider.kt create mode 100644 services/apperror/api/src/main/kotlin/io/element/android/services/apperror/api/AppErrorStateService.kt create mode 100644 services/apperror/impl/build.gradle.kts create mode 100644 services/apperror/impl/src/main/kotlin/io/element/android/services/apperror/impl/AppErrorView.kt create mode 100644 services/apperror/impl/src/main/kotlin/io/element/android/services/apperror/impl/DefaultAppErrorStateService.kt create mode 100644 services/apperror/impl/src/test/kotlin/io/element/android/services/apperror/impl/DefaultAppErrorStateServiceTest.kt create mode 100644 services/apperror/test/build.gradle.kts create mode 100644 services/apperror/test/src/main/kotlin/io/element/android/services/apperror/test/FakeAppErrorStateService.kt create mode 100644 services/appnavstate/api/build.gradle.kts create mode 100644 services/appnavstate/api/src/main/kotlin/io/element/android/services/appnavstate/api/ActiveRoomsHolder.kt create mode 100644 services/appnavstate/api/src/main/kotlin/io/element/android/services/appnavstate/api/AppForegroundStateService.kt create mode 100644 services/appnavstate/api/src/main/kotlin/io/element/android/services/appnavstate/api/AppNavigationState.kt create mode 100644 services/appnavstate/api/src/main/kotlin/io/element/android/services/appnavstate/api/AppNavigationStateService.kt create mode 100644 services/appnavstate/api/src/main/kotlin/io/element/android/services/appnavstate/api/IntentNavigationExtras.kt create mode 100644 services/appnavstate/api/src/main/kotlin/io/element/android/services/appnavstate/api/NavigationState.kt create mode 100644 services/appnavstate/api/src/main/kotlin/io/element/android/services/appnavstate/api/NavigationStateExtension.kt create mode 100644 services/appnavstate/impl/build.gradle.kts create mode 100644 services/appnavstate/impl/src/main/kotlin/io/element/android/services/appnavstate/impl/DefaultActiveRoomsHolder.kt create mode 100644 services/appnavstate/impl/src/main/kotlin/io/element/android/services/appnavstate/impl/DefaultAppForegroundStateService.kt create mode 100644 services/appnavstate/impl/src/main/kotlin/io/element/android/services/appnavstate/impl/DefaultAppNavigationStateService.kt create mode 100644 services/appnavstate/impl/src/main/kotlin/io/element/android/services/appnavstate/impl/di/AppNavStateModule.kt create mode 100644 services/appnavstate/impl/src/main/kotlin/io/element/android/services/appnavstate/impl/initializer/AppForegroundStateServiceInitializer.kt create mode 100644 services/appnavstate/impl/src/test/kotlin/io/element/android/services/appnavstate/impl/DefaultNavigationStateServiceTest.kt create mode 100644 services/appnavstate/test/build.gradle.kts create mode 100644 services/appnavstate/test/src/main/kotlin/io/element/android/services/appnavstate/test/AppNavStateFixture.kt create mode 100644 services/appnavstate/test/src/main/kotlin/io/element/android/services/appnavstate/test/FakeAppForegroundStateService.kt create mode 100644 services/appnavstate/test/src/main/kotlin/io/element/android/services/appnavstate/test/FakeAppNavigationStateService.kt create mode 100644 services/toolbox/api/build.gradle.kts create mode 100644 services/toolbox/api/src/main/kotlin/io/element/android/services/toolbox/api/intent/ExternalIntentLauncher.kt create mode 100644 services/toolbox/api/src/main/kotlin/io/element/android/services/toolbox/api/sdk/BuildVersionSdkIntProvider.kt create mode 100644 services/toolbox/api/src/main/kotlin/io/element/android/services/toolbox/api/strings/StringProvider.kt create mode 100644 services/toolbox/api/src/main/kotlin/io/element/android/services/toolbox/api/systemclock/SystemClock.kt create mode 100644 services/toolbox/impl/build.gradle.kts create mode 100644 services/toolbox/impl/src/main/kotlin/io/element/android/services/toolbox/impl/intent/DefaultExternalIntentLauncher.kt create mode 100644 services/toolbox/impl/src/main/kotlin/io/element/android/services/toolbox/impl/sdk/DefaultBuildVersionSdkIntProvider.kt create mode 100644 services/toolbox/impl/src/main/kotlin/io/element/android/services/toolbox/impl/strings/AndroidStringProvider.kt create mode 100644 services/toolbox/impl/src/main/kotlin/io/element/android/services/toolbox/impl/systemclock/DefaultSystemClock.kt create mode 100644 services/toolbox/impl/src/main/kotlin/io/element/android/services/toolbox/impl/systemclock/TimeModule.kt create mode 100644 services/toolbox/test/build.gradle.kts create mode 100644 services/toolbox/test/src/main/kotlin/io/element/android/services/toolbox/test/intent/FakeExternalIntentLauncher.kt create mode 100644 services/toolbox/test/src/main/kotlin/io/element/android/services/toolbox/test/sdk/FakeBuildVersionSdkIntProvider.kt create mode 100644 services/toolbox/test/src/main/kotlin/io/element/android/services/toolbox/test/strings/FakeStringProvider.kt create mode 100644 services/toolbox/test/src/main/kotlin/io/element/android/services/toolbox/test/systemclock/FakeSystemClock.kt create mode 100644 settings.gradle.kts create mode 100644 tests/detekt-rules/.gitignore create mode 100644 tests/detekt-rules/build.gradle.kts create mode 100644 tests/detekt-rules/src/main/kotlin/io/element/android/detektrules/ByPreferencesDataStoreRule.kt create mode 100644 tests/detekt-rules/src/main/kotlin/io/element/android/detektrules/ElementRuleSetProvider.kt create mode 100644 tests/detekt-rules/src/main/kotlin/io/element/android/detektrules/RunCatchingRule.kt create mode 100644 tests/detekt-rules/src/main/resources/META-INF/services/io.gitlab.arturbosch.detekt.api.RuleSetProvider create mode 100644 tests/detekt-rules/src/test/kotlin/io/element/android/detektrules/RunCatchingRuleTest.kt create mode 100644 tests/konsist/build.gradle.kts create mode 100644 tests/konsist/src/main/kotlin/io/element/android/tests/konsist/failures/FailingComposableWithNonImmutableSealedInterface.kt create mode 100644 tests/konsist/src/main/kotlin/io/element/android/tests/konsist/failures/FakeWrongClassName.kt create mode 100644 tests/konsist/src/test/kotlin/io/element/android/tests/konsist/KonsistArchitectureTest.kt create mode 100644 tests/konsist/src/test/kotlin/io/element/android/tests/konsist/KonsistCallbackTest.kt create mode 100644 tests/konsist/src/test/kotlin/io/element/android/tests/konsist/KonsistClassNameTest.kt create mode 100644 tests/konsist/src/test/kotlin/io/element/android/tests/konsist/KonsistComposableTest.kt create mode 100644 tests/konsist/src/test/kotlin/io/element/android/tests/konsist/KonsistConfigTest.kt create mode 100644 tests/konsist/src/test/kotlin/io/element/android/tests/konsist/KonsistContentTest.kt create mode 100644 tests/konsist/src/test/kotlin/io/element/android/tests/konsist/KonsistDiTest.kt create mode 100644 tests/konsist/src/test/kotlin/io/element/android/tests/konsist/KonsistFieldTest.kt create mode 100644 tests/konsist/src/test/kotlin/io/element/android/tests/konsist/KonsistFlowTest.kt create mode 100644 tests/konsist/src/test/kotlin/io/element/android/tests/konsist/KonsistImmutableTest.kt create mode 100644 tests/konsist/src/test/kotlin/io/element/android/tests/konsist/KonsistImportTest.kt create mode 100644 tests/konsist/src/test/kotlin/io/element/android/tests/konsist/KonsistLicenseTest.kt create mode 100644 tests/konsist/src/test/kotlin/io/element/android/tests/konsist/KonsistMethodNameTest.kt create mode 100644 tests/konsist/src/test/kotlin/io/element/android/tests/konsist/KonsistParameterNameTest.kt create mode 100644 tests/konsist/src/test/kotlin/io/element/android/tests/konsist/KonsistPresenterTest.kt create mode 100644 tests/konsist/src/test/kotlin/io/element/android/tests/konsist/KonsistPreviewTest.kt create mode 100644 tests/konsist/src/test/kotlin/io/element/android/tests/konsist/KonsistTestTest.kt create mode 100644 tests/testutils/build.gradle.kts create mode 100644 tests/testutils/src/main/kotlin/io/element/android/tests/testutils/AssertThrowInDebug.kt create mode 100644 tests/testutils/src/main/kotlin/io/element/android/tests/testutils/EnsureCalledOnce.kt create mode 100644 tests/testutils/src/main/kotlin/io/element/android/tests/testutils/EnsureNeverCalled.kt create mode 100644 tests/testutils/src/main/kotlin/io/element/android/tests/testutils/EventsRecorder.kt create mode 100644 tests/testutils/src/main/kotlin/io/element/android/tests/testutils/InstrumentationStringProvider.kt create mode 100644 tests/testutils/src/main/kotlin/io/element/android/tests/testutils/LongTask.kt create mode 100644 tests/testutils/src/main/kotlin/io/element/android/tests/testutils/MutablePresenter.kt create mode 100644 tests/testutils/src/main/kotlin/io/element/android/tests/testutils/PresenterTest.kt create mode 100644 tests/testutils/src/main/kotlin/io/element/android/tests/testutils/ReceiveTurbine.kt create mode 100644 tests/testutils/src/main/kotlin/io/element/android/tests/testutils/RobolectricDispatcherCleaner.kt create mode 100644 tests/testutils/src/main/kotlin/io/element/android/tests/testutils/SemanticsNodeInteractionsProviderExtensions.kt create mode 100644 tests/testutils/src/main/kotlin/io/element/android/tests/testutils/TestComposable.kt create mode 100644 tests/testutils/src/main/kotlin/io/element/android/tests/testutils/TestCoroutineDispatchers.kt create mode 100644 tests/testutils/src/main/kotlin/io/element/android/tests/testutils/Timber.kt create mode 100644 tests/testutils/src/main/kotlin/io/element/android/tests/testutils/WaitingForAssertion.kt create mode 100644 tests/testutils/src/main/kotlin/io/element/android/tests/testutils/WarmUpRule.kt create mode 100644 tests/testutils/src/main/kotlin/io/element/android/tests/testutils/WithFakeLifecycleOwner.kt create mode 100644 tests/testutils/src/main/kotlin/io/element/android/tests/testutils/fake/FakeTemporaryUriDeleter.kt create mode 100644 tests/testutils/src/main/kotlin/io/element/android/tests/testutils/lambda/Assertions.kt create mode 100644 tests/testutils/src/main/kotlin/io/element/android/tests/testutils/lambda/Error.kt create mode 100644 tests/testutils/src/main/kotlin/io/element/android/tests/testutils/lambda/LambdaRecorder.kt create mode 100644 tests/testutils/src/main/kotlin/io/element/android/tests/testutils/lambda/ParameterMatcher.kt create mode 100644 tests/testutils/src/main/kotlin/io/element/android/tests/testutils/node/TestParentNode.kt create mode 100644 tests/uitests/.gitignore create mode 100644 tests/uitests/build.gradle.kts create mode 100644 tests/uitests/consumer-rules.pro create mode 100644 tests/uitests/src/test/kotlin/base/BaseDeviceConfig.kt create mode 100644 tests/uitests/src/test/kotlin/base/ComposablePreviewProvider.kt create mode 100644 tests/uitests/src/test/kotlin/base/ScreenshotTest.kt create mode 100644 tests/uitests/src/test/kotlin/translations/TranslationsScreenshotTest.kt create mode 100644 tests/uitests/src/test/kotlin/ui/PreviewA11yTest.kt create mode 100644 tests/uitests/src/test/kotlin/ui/PreviewShard1Test.kt create mode 100644 tests/uitests/src/test/kotlin/ui/PreviewShard2Test.kt create mode 100644 tests/uitests/src/test/kotlin/ui/PreviewShard3Test.kt create mode 100644 tests/uitests/src/test/kotlin/ui/PreviewShard4Test.kt create mode 100644 tests/uitests/src/test/snapshots/images/appicon.element_Icon_en.png create mode 100644 tests/uitests/src/test/snapshots/images/appicon.element_MonochromeIcon_en.png create mode 100644 tests/uitests/src/test/snapshots/images/appicon.element_RoundIcon_en.png create mode 100644 tests/uitests/src/test/snapshots/images/appicon.enterprise_Icon_en.png create mode 100644 tests/uitests/src/test/snapshots/images/appicon.enterprise_RoundIcon_en.png create mode 100644 tests/uitests/src/test/snapshots/images/appnav.loggedin_LoggedInView_Day_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/appnav.loggedin_LoggedInView_Day_1_en.png create mode 100644 tests/uitests/src/test/snapshots/images/appnav.loggedin_LoggedInView_Day_2_en.png create mode 100644 tests/uitests/src/test/snapshots/images/appnav.loggedin_LoggedInView_Day_3_en.png create mode 100644 tests/uitests/src/test/snapshots/images/appnav.loggedin_LoggedInView_Night_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/appnav.loggedin_LoggedInView_Night_1_en.png create mode 100644 tests/uitests/src/test/snapshots/images/appnav.loggedin_LoggedInView_Night_2_en.png create mode 100644 tests/uitests/src/test/snapshots/images/appnav.loggedin_LoggedInView_Night_3_en.png create mode 100644 tests/uitests/src/test/snapshots/images/appnav.loggedin_SyncStateView_Day_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/appnav.loggedin_SyncStateView_Night_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/appnav.room.joined_LoadingRoomNodeView_Day_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/appnav.room.joined_LoadingRoomNodeView_Day_1_en.png create mode 100644 tests/uitests/src/test/snapshots/images/appnav.room.joined_LoadingRoomNodeView_Night_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/appnav.room.joined_LoadingRoomNodeView_Night_1_en.png create mode 100644 tests/uitests/src/test/snapshots/images/appnav.root_RootView_Day_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/appnav.root_RootView_Day_1_en.png create mode 100644 tests/uitests/src/test/snapshots/images/appnav.root_RootView_Day_2_en.png create mode 100644 tests/uitests/src/test/snapshots/images/appnav.root_RootView_Night_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/appnav.root_RootView_Night_1_en.png create mode 100644 tests/uitests/src/test/snapshots/images/appnav.root_RootView_Night_2_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.analytics.api.preferences_AnalyticsPreferencesView_Day_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.analytics.api.preferences_AnalyticsPreferencesView_Day_1_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.analytics.api.preferences_AnalyticsPreferencesView_Night_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.analytics.api.preferences_AnalyticsPreferencesView_Night_1_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.analytics.impl_AnalyticsOptInView_Day_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.analytics.impl_AnalyticsOptInView_Day_1_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.analytics.impl_AnalyticsOptInView_Night_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.analytics.impl_AnalyticsOptInView_Night_1_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.announcement.impl.spaces_SpaceAnnouncementView_Day_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.announcement.impl.spaces_SpaceAnnouncementView_Night_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.call.impl.ui_CallScreenView_Day_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.call.impl.ui_CallScreenView_Day_1_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.call.impl.ui_CallScreenView_Day_2_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.call.impl.ui_CallScreenView_Day_3_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.call.impl.ui_CallScreenView_Night_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.call.impl.ui_CallScreenView_Night_1_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.call.impl.ui_CallScreenView_Night_2_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.call.impl.ui_CallScreenView_Night_3_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.call.impl.ui_IncomingCallScreen_Day_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.call.impl.ui_IncomingCallScreen_Night_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.call.impl.ui_InvalidAudioDeviceDialog_Day_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.call.impl.ui_InvalidAudioDeviceDialog_Night_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.createroom.impl.addpeople_AddPeopleView_Day_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.createroom.impl.addpeople_AddPeopleView_Day_1_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.createroom.impl.addpeople_AddPeopleView_Day_2_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.createroom.impl.addpeople_AddPeopleView_Day_3_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.createroom.impl.addpeople_AddPeopleView_Night_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.createroom.impl.addpeople_AddPeopleView_Night_1_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.createroom.impl.addpeople_AddPeopleView_Night_2_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.createroom.impl.addpeople_AddPeopleView_Night_3_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.createroom.impl.configureroom_ConfigureRoomViewDark_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.createroom.impl.configureroom_ConfigureRoomViewDark_1_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.createroom.impl.configureroom_ConfigureRoomViewDark_2_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.createroom.impl.configureroom_ConfigureRoomViewDark_3_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.createroom.impl.configureroom_ConfigureRoomViewDark_4_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.createroom.impl.configureroom_ConfigureRoomViewDark_5_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.createroom.impl.configureroom_ConfigureRoomViewLight_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.createroom.impl.configureroom_ConfigureRoomViewLight_1_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.createroom.impl.configureroom_ConfigureRoomViewLight_2_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.createroom.impl.configureroom_ConfigureRoomViewLight_3_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.createroom.impl.configureroom_ConfigureRoomViewLight_4_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.createroom.impl.configureroom_ConfigureRoomViewLight_5_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.forward.impl_ForwardMessagesView_Day_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.forward.impl_ForwardMessagesView_Day_1_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.forward.impl_ForwardMessagesView_Day_2_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.forward.impl_ForwardMessagesView_Day_3_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.forward.impl_ForwardMessagesView_Night_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.forward.impl_ForwardMessagesView_Night_1_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.forward.impl_ForwardMessagesView_Night_2_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.forward.impl_ForwardMessagesView_Night_3_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.ftue.impl.notifications_NotificationsOptInView_Day_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.ftue.impl.notifications_NotificationsOptInView_Night_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.ftue.impl.sessionverification.choosemode_ChooseSelfVerificationModeView_Day_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.ftue.impl.sessionverification.choosemode_ChooseSelfVerificationModeView_Day_1_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.ftue.impl.sessionverification.choosemode_ChooseSelfVerificationModeView_Day_2_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.ftue.impl.sessionverification.choosemode_ChooseSelfVerificationModeView_Day_3_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.ftue.impl.sessionverification.choosemode_ChooseSelfVerificationModeView_Day_4_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.ftue.impl.sessionverification.choosemode_ChooseSelfVerificationModeView_Night_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.ftue.impl.sessionverification.choosemode_ChooseSelfVerificationModeView_Night_1_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.ftue.impl.sessionverification.choosemode_ChooseSelfVerificationModeView_Night_2_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.ftue.impl.sessionverification.choosemode_ChooseSelfVerificationModeView_Night_3_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.ftue.impl.sessionverification.choosemode_ChooseSelfVerificationModeView_Night_4_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.home.impl.components_BatteryOptimizationBanner_Day_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.home.impl.components_BatteryOptimizationBanner_Night_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.home.impl.components_ConfirmRecoveryKeyBanner_Day_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.home.impl.components_ConfirmRecoveryKeyBanner_Night_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.home.impl.components_FullScreenIntentPermissionBanner_Day_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.home.impl.components_FullScreenIntentPermissionBanner_Night_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.home.impl.components_HomeTopBarMultiAccount_Day_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.home.impl.components_HomeTopBarMultiAccount_Night_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.home.impl.components_HomeTopBarWithIndicator_Day_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.home.impl.components_HomeTopBarWithIndicator_Night_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.home.impl.components_HomeTopBar_Day_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.home.impl.components_HomeTopBar_Night_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.home.impl.components_NewNotificationSoundBanner_Day_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.home.impl.components_NewNotificationSoundBanner_Night_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.home.impl.components_RoomListContentView_Day_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.home.impl.components_RoomListContentView_Day_1_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.home.impl.components_RoomListContentView_Day_2_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.home.impl.components_RoomListContentView_Day_3_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.home.impl.components_RoomListContentView_Day_4_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.home.impl.components_RoomListContentView_Day_5_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.home.impl.components_RoomListContentView_Night_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.home.impl.components_RoomListContentView_Night_1_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.home.impl.components_RoomListContentView_Night_2_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.home.impl.components_RoomListContentView_Night_3_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.home.impl.components_RoomListContentView_Night_4_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.home.impl.components_RoomListContentView_Night_5_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.home.impl.components_RoomSummaryPlaceholderRow_Day_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.home.impl.components_RoomSummaryPlaceholderRow_Night_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.home.impl.components_RoomSummaryRow_Day_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.home.impl.components_RoomSummaryRow_Day_10_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.home.impl.components_RoomSummaryRow_Day_11_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.home.impl.components_RoomSummaryRow_Day_12_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.home.impl.components_RoomSummaryRow_Day_13_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.home.impl.components_RoomSummaryRow_Day_14_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.home.impl.components_RoomSummaryRow_Day_15_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.home.impl.components_RoomSummaryRow_Day_16_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.home.impl.components_RoomSummaryRow_Day_17_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.home.impl.components_RoomSummaryRow_Day_18_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.home.impl.components_RoomSummaryRow_Day_19_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.home.impl.components_RoomSummaryRow_Day_1_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.home.impl.components_RoomSummaryRow_Day_20_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.home.impl.components_RoomSummaryRow_Day_21_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.home.impl.components_RoomSummaryRow_Day_22_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.home.impl.components_RoomSummaryRow_Day_23_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.home.impl.components_RoomSummaryRow_Day_24_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.home.impl.components_RoomSummaryRow_Day_25_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.home.impl.components_RoomSummaryRow_Day_26_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.home.impl.components_RoomSummaryRow_Day_27_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.home.impl.components_RoomSummaryRow_Day_28_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.home.impl.components_RoomSummaryRow_Day_29_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.home.impl.components_RoomSummaryRow_Day_2_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.home.impl.components_RoomSummaryRow_Day_30_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.home.impl.components_RoomSummaryRow_Day_31_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.home.impl.components_RoomSummaryRow_Day_32_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.home.impl.components_RoomSummaryRow_Day_33_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.home.impl.components_RoomSummaryRow_Day_34_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.home.impl.components_RoomSummaryRow_Day_35_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.home.impl.components_RoomSummaryRow_Day_36_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.home.impl.components_RoomSummaryRow_Day_37_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.home.impl.components_RoomSummaryRow_Day_3_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.home.impl.components_RoomSummaryRow_Day_4_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.home.impl.components_RoomSummaryRow_Day_5_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.home.impl.components_RoomSummaryRow_Day_6_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.home.impl.components_RoomSummaryRow_Day_7_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.home.impl.components_RoomSummaryRow_Day_8_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.home.impl.components_RoomSummaryRow_Day_9_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.home.impl.components_RoomSummaryRow_Night_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.home.impl.components_RoomSummaryRow_Night_10_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.home.impl.components_RoomSummaryRow_Night_11_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.home.impl.components_RoomSummaryRow_Night_12_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.home.impl.components_RoomSummaryRow_Night_13_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.home.impl.components_RoomSummaryRow_Night_14_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.home.impl.components_RoomSummaryRow_Night_15_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.home.impl.components_RoomSummaryRow_Night_16_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.home.impl.components_RoomSummaryRow_Night_17_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.home.impl.components_RoomSummaryRow_Night_18_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.home.impl.components_RoomSummaryRow_Night_19_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.home.impl.components_RoomSummaryRow_Night_1_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.home.impl.components_RoomSummaryRow_Night_20_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.home.impl.components_RoomSummaryRow_Night_21_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.home.impl.components_RoomSummaryRow_Night_22_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.home.impl.components_RoomSummaryRow_Night_23_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.home.impl.components_RoomSummaryRow_Night_24_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.home.impl.components_RoomSummaryRow_Night_25_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.home.impl.components_RoomSummaryRow_Night_26_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.home.impl.components_RoomSummaryRow_Night_27_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.home.impl.components_RoomSummaryRow_Night_28_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.home.impl.components_RoomSummaryRow_Night_29_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.home.impl.components_RoomSummaryRow_Night_2_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.home.impl.components_RoomSummaryRow_Night_30_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.home.impl.components_RoomSummaryRow_Night_31_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.home.impl.components_RoomSummaryRow_Night_32_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.home.impl.components_RoomSummaryRow_Night_33_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.home.impl.components_RoomSummaryRow_Night_34_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.home.impl.components_RoomSummaryRow_Night_35_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.home.impl.components_RoomSummaryRow_Night_36_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.home.impl.components_RoomSummaryRow_Night_37_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.home.impl.components_RoomSummaryRow_Night_3_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.home.impl.components_RoomSummaryRow_Night_4_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.home.impl.components_RoomSummaryRow_Night_5_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.home.impl.components_RoomSummaryRow_Night_6_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.home.impl.components_RoomSummaryRow_Night_7_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.home.impl.components_RoomSummaryRow_Night_8_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.home.impl.components_RoomSummaryRow_Night_9_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.home.impl.components_SetUpRecoveryKeyBanner_Day_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.home.impl.components_SetUpRecoveryKeyBanner_Night_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.home.impl.filters_RoomListFiltersView_Day_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.home.impl.filters_RoomListFiltersView_Day_1_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.home.impl.filters_RoomListFiltersView_Night_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.home.impl.filters_RoomListFiltersView_Night_1_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.home.impl.roomlist_RoomListDeclineInviteMenuContent_Day_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.home.impl.roomlist_RoomListDeclineInviteMenuContent_Night_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.home.impl.roomlist_RoomListModalBottomSheetContent_Day_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.home.impl.roomlist_RoomListModalBottomSheetContent_Day_1_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.home.impl.roomlist_RoomListModalBottomSheetContent_Day_2_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.home.impl.roomlist_RoomListModalBottomSheetContent_Night_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.home.impl.roomlist_RoomListModalBottomSheetContent_Night_1_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.home.impl.roomlist_RoomListModalBottomSheetContent_Night_2_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.home.impl.search_RoomListSearchContent_Day_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.home.impl.search_RoomListSearchContent_Day_1_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.home.impl.search_RoomListSearchContent_Night_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.home.impl.search_RoomListSearchContent_Night_1_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.home.impl.spaces_HomeSpacesView_Day_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.home.impl.spaces_HomeSpacesView_Day_1_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.home.impl.spaces_HomeSpacesView_Night_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.home.impl.spaces_HomeSpacesView_Night_1_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.home.impl_HomeViewA11y_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.home.impl_HomeView_Day_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.home.impl_HomeView_Day_10_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.home.impl_HomeView_Day_11_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.home.impl_HomeView_Day_12_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.home.impl_HomeView_Day_13_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.home.impl_HomeView_Day_14_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.home.impl_HomeView_Day_15_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.home.impl_HomeView_Day_1_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.home.impl_HomeView_Day_2_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.home.impl_HomeView_Day_3_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.home.impl_HomeView_Day_4_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.home.impl_HomeView_Day_5_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.home.impl_HomeView_Day_6_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.home.impl_HomeView_Day_7_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.home.impl_HomeView_Day_8_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.home.impl_HomeView_Day_9_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.home.impl_HomeView_Night_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.home.impl_HomeView_Night_10_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.home.impl_HomeView_Night_11_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.home.impl_HomeView_Night_12_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.home.impl_HomeView_Night_13_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.home.impl_HomeView_Night_14_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.home.impl_HomeView_Night_15_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.home.impl_HomeView_Night_1_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.home.impl_HomeView_Night_2_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.home.impl_HomeView_Night_3_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.home.impl_HomeView_Night_4_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.home.impl_HomeView_Night_5_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.home.impl_HomeView_Night_6_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.home.impl_HomeView_Night_7_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.home.impl_HomeView_Night_8_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.home.impl_HomeView_Night_9_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.invite.impl.acceptdecline_AcceptDeclineInviteView_Day_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.invite.impl.acceptdecline_AcceptDeclineInviteView_Day_1_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.invite.impl.acceptdecline_AcceptDeclineInviteView_Day_2_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.invite.impl.acceptdecline_AcceptDeclineInviteView_Day_3_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.invite.impl.acceptdecline_AcceptDeclineInviteView_Day_4_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.invite.impl.acceptdecline_AcceptDeclineInviteView_Day_5_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.invite.impl.acceptdecline_AcceptDeclineInviteView_Night_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.invite.impl.acceptdecline_AcceptDeclineInviteView_Night_1_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.invite.impl.acceptdecline_AcceptDeclineInviteView_Night_2_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.invite.impl.acceptdecline_AcceptDeclineInviteView_Night_3_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.invite.impl.acceptdecline_AcceptDeclineInviteView_Night_4_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.invite.impl.acceptdecline_AcceptDeclineInviteView_Night_5_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.invite.impl.declineandblock_DeclineAndBlockView_Day_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.invite.impl.declineandblock_DeclineAndBlockView_Day_1_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.invite.impl.declineandblock_DeclineAndBlockView_Day_2_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.invite.impl.declineandblock_DeclineAndBlockView_Day_3_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.invite.impl.declineandblock_DeclineAndBlockView_Day_4_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.invite.impl.declineandblock_DeclineAndBlockView_Night_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.invite.impl.declineandblock_DeclineAndBlockView_Night_1_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.invite.impl.declineandblock_DeclineAndBlockView_Night_2_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.invite.impl.declineandblock_DeclineAndBlockView_Night_3_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.invite.impl.declineandblock_DeclineAndBlockView_Night_4_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.invitepeople.impl_InvitePeopleView_Day_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.invitepeople.impl_InvitePeopleView_Day_1_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.invitepeople.impl_InvitePeopleView_Day_2_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.invitepeople.impl_InvitePeopleView_Day_3_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.invitepeople.impl_InvitePeopleView_Day_4_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.invitepeople.impl_InvitePeopleView_Day_5_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.invitepeople.impl_InvitePeopleView_Day_6_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.invitepeople.impl_InvitePeopleView_Day_7_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.invitepeople.impl_InvitePeopleView_Day_8_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.invitepeople.impl_InvitePeopleView_Day_9_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.invitepeople.impl_InvitePeopleView_Night_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.invitepeople.impl_InvitePeopleView_Night_1_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.invitepeople.impl_InvitePeopleView_Night_2_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.invitepeople.impl_InvitePeopleView_Night_3_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.invitepeople.impl_InvitePeopleView_Night_4_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.invitepeople.impl_InvitePeopleView_Night_5_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.invitepeople.impl_InvitePeopleView_Night_6_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.invitepeople.impl_InvitePeopleView_Night_7_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.invitepeople.impl_InvitePeopleView_Night_8_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.invitepeople.impl_InvitePeopleView_Night_9_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.joinroom.impl_JoinRoomView_Day_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.joinroom.impl_JoinRoomView_Day_10_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.joinroom.impl_JoinRoomView_Day_11_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.joinroom.impl_JoinRoomView_Day_12_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.joinroom.impl_JoinRoomView_Day_13_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.joinroom.impl_JoinRoomView_Day_14_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.joinroom.impl_JoinRoomView_Day_15_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.joinroom.impl_JoinRoomView_Day_16_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.joinroom.impl_JoinRoomView_Day_1_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.joinroom.impl_JoinRoomView_Day_2_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.joinroom.impl_JoinRoomView_Day_3_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.joinroom.impl_JoinRoomView_Day_4_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.joinroom.impl_JoinRoomView_Day_5_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.joinroom.impl_JoinRoomView_Day_6_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.joinroom.impl_JoinRoomView_Day_7_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.joinroom.impl_JoinRoomView_Day_8_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.joinroom.impl_JoinRoomView_Day_9_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.joinroom.impl_JoinRoomView_Night_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.joinroom.impl_JoinRoomView_Night_10_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.joinroom.impl_JoinRoomView_Night_11_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.joinroom.impl_JoinRoomView_Night_12_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.joinroom.impl_JoinRoomView_Night_13_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.joinroom.impl_JoinRoomView_Night_14_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.joinroom.impl_JoinRoomView_Night_15_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.joinroom.impl_JoinRoomView_Night_16_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.joinroom.impl_JoinRoomView_Night_1_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.joinroom.impl_JoinRoomView_Night_2_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.joinroom.impl_JoinRoomView_Night_3_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.joinroom.impl_JoinRoomView_Night_4_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.joinroom.impl_JoinRoomView_Night_5_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.joinroom.impl_JoinRoomView_Night_6_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.joinroom.impl_JoinRoomView_Night_7_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.joinroom.impl_JoinRoomView_Night_8_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.joinroom.impl_JoinRoomView_Night_9_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.knockrequests.impl.banner_KnockRequestsBannerView_Day_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.knockrequests.impl.banner_KnockRequestsBannerView_Day_1_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.knockrequests.impl.banner_KnockRequestsBannerView_Day_2_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.knockrequests.impl.banner_KnockRequestsBannerView_Day_3_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.knockrequests.impl.banner_KnockRequestsBannerView_Day_4_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.knockrequests.impl.banner_KnockRequestsBannerView_Day_5_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.knockrequests.impl.banner_KnockRequestsBannerView_Day_6_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.knockrequests.impl.banner_KnockRequestsBannerView_Night_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.knockrequests.impl.banner_KnockRequestsBannerView_Night_1_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.knockrequests.impl.banner_KnockRequestsBannerView_Night_2_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.knockrequests.impl.banner_KnockRequestsBannerView_Night_3_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.knockrequests.impl.banner_KnockRequestsBannerView_Night_4_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.knockrequests.impl.banner_KnockRequestsBannerView_Night_5_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.knockrequests.impl.banner_KnockRequestsBannerView_Night_6_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.knockrequests.impl.list_KnockRequestsListView_Day_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.knockrequests.impl.list_KnockRequestsListView_Day_10_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.knockrequests.impl.list_KnockRequestsListView_Day_1_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.knockrequests.impl.list_KnockRequestsListView_Day_2_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.knockrequests.impl.list_KnockRequestsListView_Day_3_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.knockrequests.impl.list_KnockRequestsListView_Day_4_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.knockrequests.impl.list_KnockRequestsListView_Day_5_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.knockrequests.impl.list_KnockRequestsListView_Day_6_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.knockrequests.impl.list_KnockRequestsListView_Day_7_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.knockrequests.impl.list_KnockRequestsListView_Day_8_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.knockrequests.impl.list_KnockRequestsListView_Day_9_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.knockrequests.impl.list_KnockRequestsListView_Night_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.knockrequests.impl.list_KnockRequestsListView_Night_10_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.knockrequests.impl.list_KnockRequestsListView_Night_1_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.knockrequests.impl.list_KnockRequestsListView_Night_2_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.knockrequests.impl.list_KnockRequestsListView_Night_3_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.knockrequests.impl.list_KnockRequestsListView_Night_4_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.knockrequests.impl.list_KnockRequestsListView_Night_5_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.knockrequests.impl.list_KnockRequestsListView_Night_6_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.knockrequests.impl.list_KnockRequestsListView_Night_7_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.knockrequests.impl.list_KnockRequestsListView_Night_8_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.knockrequests.impl.list_KnockRequestsListView_Night_9_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.leaveroom.impl_LeaveRoomView_Day_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.leaveroom.impl_LeaveRoomView_Day_1_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.leaveroom.impl_LeaveRoomView_Day_2_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.leaveroom.impl_LeaveRoomView_Day_3_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.leaveroom.impl_LeaveRoomView_Day_4_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.leaveroom.impl_LeaveRoomView_Day_5_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.leaveroom.impl_LeaveRoomView_Day_6_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.leaveroom.impl_LeaveRoomView_Day_7_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.leaveroom.impl_LeaveRoomView_Night_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.leaveroom.impl_LeaveRoomView_Night_1_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.leaveroom.impl_LeaveRoomView_Night_2_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.leaveroom.impl_LeaveRoomView_Night_3_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.leaveroom.impl_LeaveRoomView_Night_4_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.leaveroom.impl_LeaveRoomView_Night_5_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.leaveroom.impl_LeaveRoomView_Night_6_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.leaveroom.impl_LeaveRoomView_Night_7_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.licenses.impl.details_DependenciesDetailsView_Day_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.licenses.impl.details_DependenciesDetailsView_Night_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.licenses.impl.list_DependencyLicensesListView_Day_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.licenses.impl.list_DependencyLicensesListView_Day_1_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.licenses.impl.list_DependencyLicensesListView_Day_2_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.licenses.impl.list_DependencyLicensesListView_Day_3_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.licenses.impl.list_DependencyLicensesListView_Night_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.licenses.impl.list_DependencyLicensesListView_Night_1_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.licenses.impl.list_DependencyLicensesListView_Night_2_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.licenses.impl.list_DependencyLicensesListView_Night_3_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.location.api.internal_StaticMapPlaceholder_Day_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.location.api.internal_StaticMapPlaceholder_Night_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.location.api_StaticMapView_Day_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.location.api_StaticMapView_Night_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.location.impl.send_SendLocationView_Day_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.location.impl.send_SendLocationView_Day_1_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.location.impl.send_SendLocationView_Day_2_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.location.impl.send_SendLocationView_Day_3_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.location.impl.send_SendLocationView_Day_4_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.location.impl.send_SendLocationView_Night_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.location.impl.send_SendLocationView_Night_1_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.location.impl.send_SendLocationView_Night_2_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.location.impl.send_SendLocationView_Night_3_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.location.impl.send_SendLocationView_Night_4_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.location.impl.show_ShowLocationView_Day_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.location.impl.show_ShowLocationView_Day_1_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.location.impl.show_ShowLocationView_Day_2_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.location.impl.show_ShowLocationView_Day_3_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.location.impl.show_ShowLocationView_Day_4_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.location.impl.show_ShowLocationView_Day_5_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.location.impl.show_ShowLocationView_Day_6_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.location.impl.show_ShowLocationView_Day_7_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.location.impl.show_ShowLocationView_Night_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.location.impl.show_ShowLocationView_Night_1_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.location.impl.show_ShowLocationView_Night_2_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.location.impl.show_ShowLocationView_Night_3_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.location.impl.show_ShowLocationView_Night_4_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.location.impl.show_ShowLocationView_Night_5_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.location.impl.show_ShowLocationView_Night_6_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.location.impl.show_ShowLocationView_Night_7_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.lockscreen.impl.components_PinEntryTextField_Day_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.lockscreen.impl.components_PinEntryTextField_Night_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.lockscreen.impl.settings_LockScreenSettingsView_Day_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.lockscreen.impl.settings_LockScreenSettingsView_Day_1_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.lockscreen.impl.settings_LockScreenSettingsView_Day_2_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.lockscreen.impl.settings_LockScreenSettingsView_Night_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.lockscreen.impl.settings_LockScreenSettingsView_Night_1_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.lockscreen.impl.settings_LockScreenSettingsView_Night_2_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.lockscreen.impl.setup.biometric_SetupBiometricView_Day_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.lockscreen.impl.setup.biometric_SetupBiometricView_Night_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.lockscreen.impl.setup.pin_SetupPinView_Day_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.lockscreen.impl.setup.pin_SetupPinView_Day_1_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.lockscreen.impl.setup.pin_SetupPinView_Day_2_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.lockscreen.impl.setup.pin_SetupPinView_Day_3_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.lockscreen.impl.setup.pin_SetupPinView_Day_4_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.lockscreen.impl.setup.pin_SetupPinView_Night_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.lockscreen.impl.setup.pin_SetupPinView_Night_1_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.lockscreen.impl.setup.pin_SetupPinView_Night_2_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.lockscreen.impl.setup.pin_SetupPinView_Night_3_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.lockscreen.impl.setup.pin_SetupPinView_Night_4_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.lockscreen.impl.unlock.keypad_PinKeypad_Day_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.lockscreen.impl.unlock.keypad_PinKeypad_Night_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.lockscreen.impl.unlock_PinUnlockViewInApp_Day_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.lockscreen.impl.unlock_PinUnlockViewInApp_Day_1_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.lockscreen.impl.unlock_PinUnlockViewInApp_Day_2_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.lockscreen.impl.unlock_PinUnlockViewInApp_Day_3_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.lockscreen.impl.unlock_PinUnlockViewInApp_Day_4_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.lockscreen.impl.unlock_PinUnlockViewInApp_Day_5_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.lockscreen.impl.unlock_PinUnlockViewInApp_Day_6_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.lockscreen.impl.unlock_PinUnlockViewInApp_Day_7_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.lockscreen.impl.unlock_PinUnlockViewInApp_Night_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.lockscreen.impl.unlock_PinUnlockViewInApp_Night_1_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.lockscreen.impl.unlock_PinUnlockViewInApp_Night_2_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.lockscreen.impl.unlock_PinUnlockViewInApp_Night_3_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.lockscreen.impl.unlock_PinUnlockViewInApp_Night_4_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.lockscreen.impl.unlock_PinUnlockViewInApp_Night_5_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.lockscreen.impl.unlock_PinUnlockViewInApp_Night_6_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.lockscreen.impl.unlock_PinUnlockViewInApp_Night_7_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.lockscreen.impl.unlock_PinUnlockView_Day_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.lockscreen.impl.unlock_PinUnlockView_Day_1_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.lockscreen.impl.unlock_PinUnlockView_Day_2_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.lockscreen.impl.unlock_PinUnlockView_Day_3_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.lockscreen.impl.unlock_PinUnlockView_Day_4_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.lockscreen.impl.unlock_PinUnlockView_Day_5_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.lockscreen.impl.unlock_PinUnlockView_Day_6_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.lockscreen.impl.unlock_PinUnlockView_Day_7_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.lockscreen.impl.unlock_PinUnlockView_Night_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.lockscreen.impl.unlock_PinUnlockView_Night_1_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.lockscreen.impl.unlock_PinUnlockView_Night_2_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.lockscreen.impl.unlock_PinUnlockView_Night_3_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.lockscreen.impl.unlock_PinUnlockView_Night_4_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.lockscreen.impl.unlock_PinUnlockView_Night_5_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.lockscreen.impl.unlock_PinUnlockView_Night_6_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.lockscreen.impl.unlock_PinUnlockView_Night_7_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.login.impl.accountprovider_AccountProviderOtherView_Day_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.login.impl.accountprovider_AccountProviderOtherView_Night_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.login.impl.accountprovider_AccountProviderView_Day_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.login.impl.accountprovider_AccountProviderView_Day_1_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.login.impl.accountprovider_AccountProviderView_Day_2_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.login.impl.accountprovider_AccountProviderView_Day_3_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.login.impl.accountprovider_AccountProviderView_Night_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.login.impl.accountprovider_AccountProviderView_Night_1_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.login.impl.accountprovider_AccountProviderView_Night_2_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.login.impl.accountprovider_AccountProviderView_Night_3_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.login.impl.changeserver_ChangeServerView_Day_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.login.impl.changeserver_ChangeServerView_Day_1_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.login.impl.changeserver_ChangeServerView_Day_2_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.login.impl.changeserver_ChangeServerView_Day_3_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.login.impl.changeserver_ChangeServerView_Day_4_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.login.impl.changeserver_ChangeServerView_Day_5_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.login.impl.changeserver_ChangeServerView_Night_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.login.impl.changeserver_ChangeServerView_Night_1_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.login.impl.changeserver_ChangeServerView_Night_2_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.login.impl.changeserver_ChangeServerView_Night_3_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.login.impl.changeserver_ChangeServerView_Night_4_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.login.impl.changeserver_ChangeServerView_Night_5_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.login.impl.dialogs_SlidingSyncNotSupportedDialog_Day_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.login.impl.dialogs_SlidingSyncNotSupportedDialog_Night_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.login.impl.login_LoginModeView_Day_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.login.impl.login_LoginModeView_Day_1_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.login.impl.login_LoginModeView_Day_2_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.login.impl.login_LoginModeView_Day_3_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.login.impl.login_LoginModeView_Day_4_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.login.impl.login_LoginModeView_Day_5_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.login.impl.login_LoginModeView_Day_6_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.login.impl.login_LoginModeView_Night_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.login.impl.login_LoginModeView_Night_1_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.login.impl.login_LoginModeView_Night_2_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.login.impl.login_LoginModeView_Night_3_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.login.impl.login_LoginModeView_Night_4_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.login.impl.login_LoginModeView_Night_5_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.login.impl.login_LoginModeView_Night_6_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.login.impl.screens.changeaccountprovider_ChangeAccountProviderView_Day_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.login.impl.screens.changeaccountprovider_ChangeAccountProviderView_Day_1_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.login.impl.screens.changeaccountprovider_ChangeAccountProviderView_Night_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.login.impl.screens.changeaccountprovider_ChangeAccountProviderView_Night_1_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.login.impl.screens.chooseaccountprovider_ChooseAccountProviderView_Day_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.login.impl.screens.chooseaccountprovider_ChooseAccountProviderView_Day_1_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.login.impl.screens.chooseaccountprovider_ChooseAccountProviderView_Day_2_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.login.impl.screens.chooseaccountprovider_ChooseAccountProviderView_Night_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.login.impl.screens.chooseaccountprovider_ChooseAccountProviderView_Night_1_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.login.impl.screens.chooseaccountprovider_ChooseAccountProviderView_Night_2_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.login.impl.screens.confirmaccountprovider_ConfirmAccountProviderView_Day_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.login.impl.screens.confirmaccountprovider_ConfirmAccountProviderView_Day_1_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.login.impl.screens.confirmaccountprovider_ConfirmAccountProviderView_Day_2_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.login.impl.screens.confirmaccountprovider_ConfirmAccountProviderView_Night_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.login.impl.screens.confirmaccountprovider_ConfirmAccountProviderView_Night_1_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.login.impl.screens.confirmaccountprovider_ConfirmAccountProviderView_Night_2_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.login.impl.screens.createaccount_CreateAccountView_Day_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.login.impl.screens.createaccount_CreateAccountView_Day_1_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.login.impl.screens.createaccount_CreateAccountView_Day_2_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.login.impl.screens.createaccount_CreateAccountView_Day_3_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.login.impl.screens.createaccount_CreateAccountView_Night_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.login.impl.screens.createaccount_CreateAccountView_Night_1_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.login.impl.screens.createaccount_CreateAccountView_Night_2_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.login.impl.screens.createaccount_CreateAccountView_Night_3_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.login.impl.screens.loginpassword_LoginPasswordView_Day_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.login.impl.screens.loginpassword_LoginPasswordView_Day_1_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.login.impl.screens.loginpassword_LoginPasswordView_Day_2_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.login.impl.screens.loginpassword_LoginPasswordView_Night_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.login.impl.screens.loginpassword_LoginPasswordView_Night_1_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.login.impl.screens.loginpassword_LoginPasswordView_Night_2_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.login.impl.screens.onboarding_OnBoardingView_Day_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.login.impl.screens.onboarding_OnBoardingView_Day_1_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.login.impl.screens.onboarding_OnBoardingView_Day_2_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.login.impl.screens.onboarding_OnBoardingView_Day_3_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.login.impl.screens.onboarding_OnBoardingView_Day_4_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.login.impl.screens.onboarding_OnBoardingView_Day_5_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.login.impl.screens.onboarding_OnBoardingView_Day_6_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.login.impl.screens.onboarding_OnBoardingView_Day_7_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.login.impl.screens.onboarding_OnBoardingView_Night_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.login.impl.screens.onboarding_OnBoardingView_Night_1_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.login.impl.screens.onboarding_OnBoardingView_Night_2_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.login.impl.screens.onboarding_OnBoardingView_Night_3_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.login.impl.screens.onboarding_OnBoardingView_Night_4_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.login.impl.screens.onboarding_OnBoardingView_Night_5_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.login.impl.screens.onboarding_OnBoardingView_Night_6_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.login.impl.screens.onboarding_OnBoardingView_Night_7_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.login.impl.screens.qrcode.confirmation_QrCodeConfirmationView_Day_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.login.impl.screens.qrcode.confirmation_QrCodeConfirmationView_Day_1_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.login.impl.screens.qrcode.confirmation_QrCodeConfirmationView_Day_2_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.login.impl.screens.qrcode.confirmation_QrCodeConfirmationView_Night_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.login.impl.screens.qrcode.confirmation_QrCodeConfirmationView_Night_1_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.login.impl.screens.qrcode.confirmation_QrCodeConfirmationView_Night_2_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.login.impl.screens.qrcode.error_QrCodeErrorView_Day_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.login.impl.screens.qrcode.error_QrCodeErrorView_Day_1_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.login.impl.screens.qrcode.error_QrCodeErrorView_Day_2_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.login.impl.screens.qrcode.error_QrCodeErrorView_Day_3_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.login.impl.screens.qrcode.error_QrCodeErrorView_Day_4_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.login.impl.screens.qrcode.error_QrCodeErrorView_Day_5_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.login.impl.screens.qrcode.error_QrCodeErrorView_Day_6_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.login.impl.screens.qrcode.error_QrCodeErrorView_Night_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.login.impl.screens.qrcode.error_QrCodeErrorView_Night_1_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.login.impl.screens.qrcode.error_QrCodeErrorView_Night_2_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.login.impl.screens.qrcode.error_QrCodeErrorView_Night_3_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.login.impl.screens.qrcode.error_QrCodeErrorView_Night_4_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.login.impl.screens.qrcode.error_QrCodeErrorView_Night_5_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.login.impl.screens.qrcode.error_QrCodeErrorView_Night_6_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.login.impl.screens.qrcode.intro_QrCodeIntroView_Day_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.login.impl.screens.qrcode.intro_QrCodeIntroView_Day_1_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.login.impl.screens.qrcode.intro_QrCodeIntroView_Night_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.login.impl.screens.qrcode.intro_QrCodeIntroView_Night_1_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.login.impl.screens.qrcode.scan_QrCodeScanView_Day_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.login.impl.screens.qrcode.scan_QrCodeScanView_Day_1_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.login.impl.screens.qrcode.scan_QrCodeScanView_Day_2_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.login.impl.screens.qrcode.scan_QrCodeScanView_Day_3_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.login.impl.screens.qrcode.scan_QrCodeScanView_Day_4_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.login.impl.screens.qrcode.scan_QrCodeScanView_Day_5_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.login.impl.screens.qrcode.scan_QrCodeScanView_Night_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.login.impl.screens.qrcode.scan_QrCodeScanView_Night_1_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.login.impl.screens.qrcode.scan_QrCodeScanView_Night_2_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.login.impl.screens.qrcode.scan_QrCodeScanView_Night_3_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.login.impl.screens.qrcode.scan_QrCodeScanView_Night_4_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.login.impl.screens.qrcode.scan_QrCodeScanView_Night_5_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.login.impl.screens.searchaccountprovider_SearchAccountProviderView_Day_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.login.impl.screens.searchaccountprovider_SearchAccountProviderView_Day_1_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.login.impl.screens.searchaccountprovider_SearchAccountProviderView_Night_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.login.impl.screens.searchaccountprovider_SearchAccountProviderView_Night_1_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.logout.impl.direct_DefaultDirectLogoutView_Day_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.logout.impl.direct_DefaultDirectLogoutView_Day_1_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.logout.impl.direct_DefaultDirectLogoutView_Day_2_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.logout.impl.direct_DefaultDirectLogoutView_Day_3_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.logout.impl.direct_DefaultDirectLogoutView_Day_4_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.logout.impl.direct_DefaultDirectLogoutView_Night_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.logout.impl.direct_DefaultDirectLogoutView_Night_1_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.logout.impl.direct_DefaultDirectLogoutView_Night_2_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.logout.impl.direct_DefaultDirectLogoutView_Night_3_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.logout.impl.direct_DefaultDirectLogoutView_Night_4_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.logout.impl_AccountDeactivationView_Day_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.logout.impl_AccountDeactivationView_Day_1_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.logout.impl_AccountDeactivationView_Day_2_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.logout.impl_AccountDeactivationView_Day_3_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.logout.impl_AccountDeactivationView_Day_4_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.logout.impl_AccountDeactivationView_Night_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.logout.impl_AccountDeactivationView_Night_1_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.logout.impl_AccountDeactivationView_Night_2_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.logout.impl_AccountDeactivationView_Night_3_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.logout.impl_AccountDeactivationView_Night_4_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.logout.impl_LogoutView_Day_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.logout.impl_LogoutView_Day_10_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.logout.impl_LogoutView_Day_11_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.logout.impl_LogoutView_Day_1_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.logout.impl_LogoutView_Day_2_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.logout.impl_LogoutView_Day_3_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.logout.impl_LogoutView_Day_4_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.logout.impl_LogoutView_Day_5_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.logout.impl_LogoutView_Day_6_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.logout.impl_LogoutView_Day_7_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.logout.impl_LogoutView_Day_8_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.logout.impl_LogoutView_Day_9_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.logout.impl_LogoutView_Night_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.logout.impl_LogoutView_Night_10_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.logout.impl_LogoutView_Night_11_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.logout.impl_LogoutView_Night_1_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.logout.impl_LogoutView_Night_2_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.logout.impl_LogoutView_Night_3_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.logout.impl_LogoutView_Night_4_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.logout.impl_LogoutView_Night_5_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.logout.impl_LogoutView_Night_6_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.logout.impl_LogoutView_Night_7_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.logout.impl_LogoutView_Night_8_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.logout.impl_LogoutView_Night_9_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.messages.impl.actionlist_ActionListViewContent_Day_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.messages.impl.actionlist_ActionListViewContent_Day_10_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.messages.impl.actionlist_ActionListViewContent_Day_11_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.messages.impl.actionlist_ActionListViewContent_Day_12_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.messages.impl.actionlist_ActionListViewContent_Day_1_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.messages.impl.actionlist_ActionListViewContent_Day_2_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.messages.impl.actionlist_ActionListViewContent_Day_3_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.messages.impl.actionlist_ActionListViewContent_Day_4_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.messages.impl.actionlist_ActionListViewContent_Day_5_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.messages.impl.actionlist_ActionListViewContent_Day_6_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.messages.impl.actionlist_ActionListViewContent_Day_7_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.messages.impl.actionlist_ActionListViewContent_Day_8_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.messages.impl.actionlist_ActionListViewContent_Day_9_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.messages.impl.actionlist_ActionListViewContent_Night_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.messages.impl.actionlist_ActionListViewContent_Night_10_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.messages.impl.actionlist_ActionListViewContent_Night_11_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.messages.impl.actionlist_ActionListViewContent_Night_12_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.messages.impl.actionlist_ActionListViewContent_Night_1_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.messages.impl.actionlist_ActionListViewContent_Night_2_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.messages.impl.actionlist_ActionListViewContent_Night_3_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.messages.impl.actionlist_ActionListViewContent_Night_4_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.messages.impl.actionlist_ActionListViewContent_Night_5_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.messages.impl.actionlist_ActionListViewContent_Night_6_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.messages.impl.actionlist_ActionListViewContent_Night_7_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.messages.impl.actionlist_ActionListViewContent_Night_8_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.messages.impl.actionlist_ActionListViewContent_Night_9_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.messages.impl.attachments.preview_AttachmentsView_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.messages.impl.attachments.preview_AttachmentsView_1_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.messages.impl.attachments.preview_AttachmentsView_2_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.messages.impl.attachments.preview_AttachmentsView_3_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.messages.impl.attachments.preview_AttachmentsView_4_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.messages.impl.attachments.preview_AttachmentsView_5_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.messages.impl.attachments.preview_AttachmentsView_6_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.messages.impl.attachments.preview_AttachmentsView_7_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.messages.impl.attachments.preview_AttachmentsView_8_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.messages.impl.attachments.preview_VideoQualitySelectorDialog_Day_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.messages.impl.attachments.preview_VideoQualitySelectorDialog_Night_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.messages.impl.crypto.identity_IdentityChangeStateView_Day_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.messages.impl.crypto.identity_IdentityChangeStateView_Day_1_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.messages.impl.crypto.identity_IdentityChangeStateView_Day_2_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.messages.impl.crypto.identity_IdentityChangeStateView_Night_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.messages.impl.crypto.identity_IdentityChangeStateView_Night_1_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.messages.impl.crypto.identity_IdentityChangeStateView_Night_2_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.messages.impl.crypto.identity_MessagesViewWithIdentityChange_Day_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.messages.impl.crypto.identity_MessagesViewWithIdentityChange_Day_1_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.messages.impl.crypto.identity_MessagesViewWithIdentityChange_Day_2_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.messages.impl.crypto.identity_MessagesViewWithIdentityChange_Night_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.messages.impl.crypto.identity_MessagesViewWithIdentityChange_Night_1_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.messages.impl.crypto.identity_MessagesViewWithIdentityChange_Night_2_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.messages.impl.crypto.sendfailure.resolve_ResolveVerifiedUserSendFailureView_Day_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.messages.impl.crypto.sendfailure.resolve_ResolveVerifiedUserSendFailureView_Day_1_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.messages.impl.crypto.sendfailure.resolve_ResolveVerifiedUserSendFailureView_Day_2_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.messages.impl.crypto.sendfailure.resolve_ResolveVerifiedUserSendFailureView_Night_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.messages.impl.crypto.sendfailure.resolve_ResolveVerifiedUserSendFailureView_Night_1_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.messages.impl.crypto.sendfailure.resolve_ResolveVerifiedUserSendFailureView_Night_2_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.messages.impl.link_LinkView_Day_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.messages.impl.link_LinkView_Day_1_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.messages.impl.link_LinkView_Night_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.messages.impl.link_LinkView_Night_1_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.messages.impl.messagecomposer.suggestions_SuggestionsPickerView_Day_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.messages.impl.messagecomposer.suggestions_SuggestionsPickerView_Night_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.messages.impl.messagecomposer_AttachmentSourcePickerMenu_Day_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.messages.impl.messagecomposer_AttachmentSourcePickerMenu_Night_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.messages.impl.messagecomposer_DisabledComposerView_Day_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.messages.impl.messagecomposer_DisabledComposerView_Night_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.messages.impl.messagecomposer_MessageComposerViewVoice_Day_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.messages.impl.messagecomposer_MessageComposerViewVoice_Night_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.messages.impl.messagecomposer_MessageComposerView_Day_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.messages.impl.messagecomposer_MessageComposerView_Night_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.messages.impl.pinned.banner_PinnedMessagesBannerView_Day_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.messages.impl.pinned.banner_PinnedMessagesBannerView_Day_10_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.messages.impl.pinned.banner_PinnedMessagesBannerView_Day_1_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.messages.impl.pinned.banner_PinnedMessagesBannerView_Day_2_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.messages.impl.pinned.banner_PinnedMessagesBannerView_Day_3_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.messages.impl.pinned.banner_PinnedMessagesBannerView_Day_4_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.messages.impl.pinned.banner_PinnedMessagesBannerView_Day_5_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.messages.impl.pinned.banner_PinnedMessagesBannerView_Day_6_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.messages.impl.pinned.banner_PinnedMessagesBannerView_Day_7_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.messages.impl.pinned.banner_PinnedMessagesBannerView_Day_8_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.messages.impl.pinned.banner_PinnedMessagesBannerView_Day_9_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.messages.impl.pinned.banner_PinnedMessagesBannerView_Night_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.messages.impl.pinned.banner_PinnedMessagesBannerView_Night_10_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.messages.impl.pinned.banner_PinnedMessagesBannerView_Night_1_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.messages.impl.pinned.banner_PinnedMessagesBannerView_Night_2_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.messages.impl.pinned.banner_PinnedMessagesBannerView_Night_3_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.messages.impl.pinned.banner_PinnedMessagesBannerView_Night_4_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.messages.impl.pinned.banner_PinnedMessagesBannerView_Night_5_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.messages.impl.pinned.banner_PinnedMessagesBannerView_Night_6_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.messages.impl.pinned.banner_PinnedMessagesBannerView_Night_7_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.messages.impl.pinned.banner_PinnedMessagesBannerView_Night_8_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.messages.impl.pinned.banner_PinnedMessagesBannerView_Night_9_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.messages.impl.pinned.list_PinnedMessagesListView_Day_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.messages.impl.pinned.list_PinnedMessagesListView_Day_1_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.messages.impl.pinned.list_PinnedMessagesListView_Day_2_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.messages.impl.pinned.list_PinnedMessagesListView_Day_3_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.messages.impl.pinned.list_PinnedMessagesListView_Night_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.messages.impl.pinned.list_PinnedMessagesListView_Night_1_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.messages.impl.pinned.list_PinnedMessagesListView_Night_2_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.messages.impl.pinned.list_PinnedMessagesListView_Night_3_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.messages.impl.report_ReportMessageView_Day_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.messages.impl.report_ReportMessageView_Day_1_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.messages.impl.report_ReportMessageView_Day_2_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.messages.impl.report_ReportMessageView_Day_3_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.messages.impl.report_ReportMessageView_Day_4_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.messages.impl.report_ReportMessageView_Day_5_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.messages.impl.report_ReportMessageView_Night_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.messages.impl.report_ReportMessageView_Night_1_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.messages.impl.report_ReportMessageView_Night_2_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.messages.impl.report_ReportMessageView_Night_3_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.messages.impl.report_ReportMessageView_Night_4_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.messages.impl.report_ReportMessageView_Night_5_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components.customreaction.picker_EmojiPicker_Day_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components.customreaction.picker_EmojiPicker_Day_1_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components.customreaction.picker_EmojiPicker_Day_2_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components.customreaction.picker_EmojiPicker_Day_3_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components.customreaction.picker_EmojiPicker_Night_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components.customreaction.picker_EmojiPicker_Night_1_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components.customreaction.picker_EmojiPicker_Night_2_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components.customreaction.picker_EmojiPicker_Night_3_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components.customreaction_EmojiItem_Day_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components.customreaction_EmojiItem_Night_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components.event_ProgressButton_Day_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components.event_ProgressButton_Night_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components.event_TimelineImageWithCaptionRow_Day_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components.event_TimelineImageWithCaptionRow_Night_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components.event_TimelineItemAudioView_Day_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components.event_TimelineItemAudioView_Day_1_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components.event_TimelineItemAudioView_Day_2_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components.event_TimelineItemAudioView_Day_3_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components.event_TimelineItemAudioView_Day_4_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components.event_TimelineItemAudioView_Night_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components.event_TimelineItemAudioView_Night_1_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components.event_TimelineItemAudioView_Night_2_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components.event_TimelineItemAudioView_Night_3_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components.event_TimelineItemAudioView_Night_4_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components.event_TimelineItemEncryptedView_Day_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components.event_TimelineItemEncryptedView_Day_1_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components.event_TimelineItemEncryptedView_Day_2_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components.event_TimelineItemEncryptedView_Day_3_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components.event_TimelineItemEncryptedView_Day_4_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components.event_TimelineItemEncryptedView_Day_5_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components.event_TimelineItemEncryptedView_Day_6_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components.event_TimelineItemEncryptedView_Day_7_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components.event_TimelineItemEncryptedView_Day_8_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components.event_TimelineItemEncryptedView_Night_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components.event_TimelineItemEncryptedView_Night_1_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components.event_TimelineItemEncryptedView_Night_2_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components.event_TimelineItemEncryptedView_Night_3_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components.event_TimelineItemEncryptedView_Night_4_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components.event_TimelineItemEncryptedView_Night_5_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components.event_TimelineItemEncryptedView_Night_6_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components.event_TimelineItemEncryptedView_Night_7_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components.event_TimelineItemEncryptedView_Night_8_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components.event_TimelineItemFileView_Day_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components.event_TimelineItemFileView_Day_1_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components.event_TimelineItemFileView_Day_2_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components.event_TimelineItemFileView_Day_3_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components.event_TimelineItemFileView_Day_4_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components.event_TimelineItemFileView_Night_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components.event_TimelineItemFileView_Night_1_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components.event_TimelineItemFileView_Night_2_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components.event_TimelineItemFileView_Night_3_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components.event_TimelineItemFileView_Night_4_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components.event_TimelineItemImageViewHideMediaContent_Day_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components.event_TimelineItemImageViewHideMediaContent_Night_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components.event_TimelineItemImageView_Day_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components.event_TimelineItemImageView_Day_1_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components.event_TimelineItemImageView_Day_2_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components.event_TimelineItemImageView_Day_3_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components.event_TimelineItemImageView_Night_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components.event_TimelineItemImageView_Night_1_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components.event_TimelineItemImageView_Night_2_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components.event_TimelineItemImageView_Night_3_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components.event_TimelineItemInformativeView_Day_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components.event_TimelineItemInformativeView_Night_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components.event_TimelineItemLegacyCallInviteView_Day_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components.event_TimelineItemLegacyCallInviteView_Night_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components.event_TimelineItemLocationView_Day_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components.event_TimelineItemLocationView_Day_1_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components.event_TimelineItemLocationView_Night_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components.event_TimelineItemLocationView_Night_1_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components.event_TimelineItemPollView_Day_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components.event_TimelineItemPollView_Day_1_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components.event_TimelineItemPollView_Day_2_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components.event_TimelineItemPollView_Day_3_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components.event_TimelineItemPollView_Night_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components.event_TimelineItemPollView_Night_1_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components.event_TimelineItemPollView_Night_2_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components.event_TimelineItemPollView_Night_3_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components.event_TimelineItemRedactedView_Day_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components.event_TimelineItemRedactedView_Night_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components.event_TimelineItemStateView_Day_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components.event_TimelineItemStateView_Night_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components.event_TimelineItemStickerView_Day_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components.event_TimelineItemStickerView_Day_1_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components.event_TimelineItemStickerView_Day_2_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components.event_TimelineItemStickerView_Day_3_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components.event_TimelineItemStickerView_Night_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components.event_TimelineItemStickerView_Night_1_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components.event_TimelineItemStickerView_Night_2_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components.event_TimelineItemStickerView_Night_3_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components.event_TimelineItemTextViewWithLinkifiedUrlAndNestedParenthesis_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components.event_TimelineItemTextViewWithLinkifiedUrl_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components.event_TimelineItemTextView_Day_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components.event_TimelineItemTextView_Day_1_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components.event_TimelineItemTextView_Day_2_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components.event_TimelineItemTextView_Day_3_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components.event_TimelineItemTextView_Day_4_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components.event_TimelineItemTextView_Day_5_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components.event_TimelineItemTextView_Night_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components.event_TimelineItemTextView_Night_1_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components.event_TimelineItemTextView_Night_2_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components.event_TimelineItemTextView_Night_3_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components.event_TimelineItemTextView_Night_4_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components.event_TimelineItemTextView_Night_5_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components.event_TimelineItemUnknownView_Day_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components.event_TimelineItemUnknownView_Night_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components.event_TimelineItemVideoViewHideMediaContent_Day_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components.event_TimelineItemVideoViewHideMediaContent_Night_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components.event_TimelineItemVideoView_Day_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components.event_TimelineItemVideoView_Day_1_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components.event_TimelineItemVideoView_Day_2_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components.event_TimelineItemVideoView_Day_3_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components.event_TimelineItemVideoView_Night_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components.event_TimelineItemVideoView_Night_1_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components.event_TimelineItemVideoView_Night_2_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components.event_TimelineItemVideoView_Night_3_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components.event_TimelineItemVoiceViewUnified_Day_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components.event_TimelineItemVoiceViewUnified_Night_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components.event_TimelineItemVoiceView_Day_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components.event_TimelineItemVoiceView_Day_10_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components.event_TimelineItemVoiceView_Day_11_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components.event_TimelineItemVoiceView_Day_12_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components.event_TimelineItemVoiceView_Day_13_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components.event_TimelineItemVoiceView_Day_14_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components.event_TimelineItemVoiceView_Day_1_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components.event_TimelineItemVoiceView_Day_2_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components.event_TimelineItemVoiceView_Day_3_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components.event_TimelineItemVoiceView_Day_4_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components.event_TimelineItemVoiceView_Day_5_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components.event_TimelineItemVoiceView_Day_6_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components.event_TimelineItemVoiceView_Day_7_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components.event_TimelineItemVoiceView_Day_8_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components.event_TimelineItemVoiceView_Day_9_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components.event_TimelineItemVoiceView_Night_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components.event_TimelineItemVoiceView_Night_10_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components.event_TimelineItemVoiceView_Night_11_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components.event_TimelineItemVoiceView_Night_12_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components.event_TimelineItemVoiceView_Night_13_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components.event_TimelineItemVoiceView_Night_14_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components.event_TimelineItemVoiceView_Night_1_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components.event_TimelineItemVoiceView_Night_2_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components.event_TimelineItemVoiceView_Night_3_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components.event_TimelineItemVoiceView_Night_4_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components.event_TimelineItemVoiceView_Night_5_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components.event_TimelineItemVoiceView_Night_6_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components.event_TimelineItemVoiceView_Night_7_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components.event_TimelineItemVoiceView_Night_8_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components.event_TimelineItemVoiceView_Night_9_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components.event_TimelineVideoWithCaptionRow_Day_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components.event_TimelineVideoWithCaptionRow_Night_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components.group_GroupHeaderView_Day_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components.group_GroupHeaderView_Night_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components.reactionsummary_ReactionSummaryViewContent_Day_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components.reactionsummary_ReactionSummaryViewContent_Night_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components.receipt.bottomsheet_ReadReceiptBottomSheet_Day_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components.receipt.bottomsheet_ReadReceiptBottomSheet_Day_1_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components.receipt.bottomsheet_ReadReceiptBottomSheet_Day_2_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components.receipt.bottomsheet_ReadReceiptBottomSheet_Day_3_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components.receipt.bottomsheet_ReadReceiptBottomSheet_Day_4_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components.receipt.bottomsheet_ReadReceiptBottomSheet_Day_5_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components.receipt.bottomsheet_ReadReceiptBottomSheet_Night_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components.receipt.bottomsheet_ReadReceiptBottomSheet_Night_1_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components.receipt.bottomsheet_ReadReceiptBottomSheet_Night_2_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components.receipt.bottomsheet_ReadReceiptBottomSheet_Night_3_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components.receipt.bottomsheet_ReadReceiptBottomSheet_Night_4_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components.receipt.bottomsheet_ReadReceiptBottomSheet_Night_5_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components.receipt_TimelineItemReadReceiptView_Day_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components.receipt_TimelineItemReadReceiptView_Day_1_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components.receipt_TimelineItemReadReceiptView_Day_2_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components.receipt_TimelineItemReadReceiptView_Day_3_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components.receipt_TimelineItemReadReceiptView_Day_4_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components.receipt_TimelineItemReadReceiptView_Day_5_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components.receipt_TimelineItemReadReceiptView_Day_6_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components.receipt_TimelineItemReadReceiptView_Day_7_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components.receipt_TimelineItemReadReceiptView_Night_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components.receipt_TimelineItemReadReceiptView_Night_1_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components.receipt_TimelineItemReadReceiptView_Night_2_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components.receipt_TimelineItemReadReceiptView_Night_3_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components.receipt_TimelineItemReadReceiptView_Night_4_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components.receipt_TimelineItemReadReceiptView_Night_5_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components.receipt_TimelineItemReadReceiptView_Night_6_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components.receipt_TimelineItemReadReceiptView_Night_7_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components.virtual_TimelineItemDaySeparatorView_Day_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components.virtual_TimelineItemDaySeparatorView_Day_1_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components.virtual_TimelineItemDaySeparatorView_Night_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components.virtual_TimelineItemDaySeparatorView_Night_1_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components.virtual_TimelineItemReadMarkerView_Day_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components.virtual_TimelineItemReadMarkerView_Night_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components.virtual_TimelineItemRoomBeginningView_Day_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components.virtual_TimelineItemRoomBeginningView_Night_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components.virtual_TimelineLoadingMoreIndicator_Day_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components.virtual_TimelineLoadingMoreIndicator_Night_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components_CallMenuItem_Day_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components_CallMenuItem_Day_1_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components_CallMenuItem_Day_2_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components_CallMenuItem_Day_3_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components_CallMenuItem_Day_4_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components_CallMenuItem_Day_5_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components_CallMenuItem_Night_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components_CallMenuItem_Night_1_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components_CallMenuItem_Night_2_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components_CallMenuItem_Night_3_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components_CallMenuItem_Night_4_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components_CallMenuItem_Night_5_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components_FocusedEvent_Day_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components_FocusedEvent_Night_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components_MessageEventBubble_Day_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components_MessageEventBubble_Day_1_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components_MessageEventBubble_Day_2_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components_MessageEventBubble_Day_3_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components_MessageEventBubble_Day_4_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components_MessageEventBubble_Day_5_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components_MessageEventBubble_Day_6_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components_MessageEventBubble_Day_7_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components_MessageEventBubble_Night_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components_MessageEventBubble_Night_1_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components_MessageEventBubble_Night_2_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components_MessageEventBubble_Night_3_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components_MessageEventBubble_Night_4_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components_MessageEventBubble_Night_5_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components_MessageEventBubble_Night_6_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components_MessageEventBubble_Night_7_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components_MessageShieldView_Day_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components_MessageShieldView_Night_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components_MessageStateEventContainer_Day_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components_MessageStateEventContainer_Night_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components_MessagesReactionButtonAdd_Day_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components_MessagesReactionButtonAdd_Night_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components_MessagesReactionButtonExtra_Day_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components_MessagesReactionButtonExtra_Night_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components_MessagesReactionButton_Day_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components_MessagesReactionButton_Day_1_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components_MessagesReactionButton_Day_2_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components_MessagesReactionButton_Day_3_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components_MessagesReactionButton_Night_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components_MessagesReactionButton_Night_1_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components_MessagesReactionButton_Night_2_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components_MessagesReactionButton_Night_3_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components_ReplySwipeIndicator_Day_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components_ReplySwipeIndicator_Night_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components_ThreadSummaryView_Day_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components_ThreadSummaryView_Night_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components_TimelineEventTimestampView_Day_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components_TimelineEventTimestampView_Day_1_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components_TimelineEventTimestampView_Day_2_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components_TimelineEventTimestampView_Day_3_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components_TimelineEventTimestampView_Day_4_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components_TimelineEventTimestampView_Day_5_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components_TimelineEventTimestampView_Day_6_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components_TimelineEventTimestampView_Day_7_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components_TimelineEventTimestampView_Night_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components_TimelineEventTimestampView_Night_1_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components_TimelineEventTimestampView_Night_2_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components_TimelineEventTimestampView_Night_3_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components_TimelineEventTimestampView_Night_4_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components_TimelineEventTimestampView_Night_5_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components_TimelineEventTimestampView_Night_6_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components_TimelineEventTimestampView_Night_7_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components_TimelineItemCallNotifyView_Day_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components_TimelineItemCallNotifyView_Night_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components_TimelineItemEventRowDisambiguated_Day_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components_TimelineItemEventRowDisambiguated_Night_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components_TimelineItemEventRowForDirectRoom_Day_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components_TimelineItemEventRowForDirectRoom_Night_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components_TimelineItemEventRowLongSenderName_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components_TimelineItemEventRowShield_Day_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components_TimelineItemEventRowShield_Night_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components_TimelineItemEventRowTimestamp_Day_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components_TimelineItemEventRowTimestamp_Day_1_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components_TimelineItemEventRowTimestamp_Day_2_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components_TimelineItemEventRowTimestamp_Day_3_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components_TimelineItemEventRowTimestamp_Day_4_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components_TimelineItemEventRowTimestamp_Day_5_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components_TimelineItemEventRowTimestamp_Day_6_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components_TimelineItemEventRowTimestamp_Day_7_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components_TimelineItemEventRowTimestamp_Night_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components_TimelineItemEventRowTimestamp_Night_1_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components_TimelineItemEventRowTimestamp_Night_2_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components_TimelineItemEventRowTimestamp_Night_3_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components_TimelineItemEventRowTimestamp_Night_4_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components_TimelineItemEventRowTimestamp_Night_5_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components_TimelineItemEventRowTimestamp_Night_6_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components_TimelineItemEventRowTimestamp_Night_7_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components_TimelineItemEventRowUtd_Day_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components_TimelineItemEventRowUtd_Night_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components_TimelineItemEventRowWithManyReactions_Day_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components_TimelineItemEventRowWithManyReactions_Night_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components_TimelineItemEventRowWithRR_Day_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components_TimelineItemEventRowWithRR_Day_1_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components_TimelineItemEventRowWithRR_Day_2_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components_TimelineItemEventRowWithRR_Night_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components_TimelineItemEventRowWithRR_Night_1_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components_TimelineItemEventRowWithRR_Night_2_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components_TimelineItemEventRowWithReplyInformative_Day_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components_TimelineItemEventRowWithReplyInformative_Day_1_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components_TimelineItemEventRowWithReplyInformative_Night_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components_TimelineItemEventRowWithReplyInformative_Night_1_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components_TimelineItemEventRowWithReplyOther_Day_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components_TimelineItemEventRowWithReplyOther_Day_1_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components_TimelineItemEventRowWithReplyOther_Night_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components_TimelineItemEventRowWithReplyOther_Night_1_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components_TimelineItemEventRowWithReply_Day_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components_TimelineItemEventRowWithReply_Day_10_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components_TimelineItemEventRowWithReply_Day_11_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components_TimelineItemEventRowWithReply_Day_1_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components_TimelineItemEventRowWithReply_Day_2_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components_TimelineItemEventRowWithReply_Day_3_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components_TimelineItemEventRowWithReply_Day_4_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components_TimelineItemEventRowWithReply_Day_5_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components_TimelineItemEventRowWithReply_Day_6_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components_TimelineItemEventRowWithReply_Day_7_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components_TimelineItemEventRowWithReply_Day_8_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components_TimelineItemEventRowWithReply_Day_9_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components_TimelineItemEventRowWithReply_Night_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components_TimelineItemEventRowWithReply_Night_10_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components_TimelineItemEventRowWithReply_Night_11_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components_TimelineItemEventRowWithReply_Night_1_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components_TimelineItemEventRowWithReply_Night_2_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components_TimelineItemEventRowWithReply_Night_3_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components_TimelineItemEventRowWithReply_Night_4_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components_TimelineItemEventRowWithReply_Night_5_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components_TimelineItemEventRowWithReply_Night_6_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components_TimelineItemEventRowWithReply_Night_7_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components_TimelineItemEventRowWithReply_Night_8_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components_TimelineItemEventRowWithReply_Night_9_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components_TimelineItemEventRowWithThreadSummary_Day_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components_TimelineItemEventRowWithThreadSummary_Night_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components_TimelineItemEventRow_Day_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components_TimelineItemEventRow_Night_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components_TimelineItemEventTimestampBelow_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components_TimelineItemGroupedEventsRowContentCollapse_Day_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components_TimelineItemGroupedEventsRowContentCollapse_Night_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components_TimelineItemGroupedEventsRowContentExpanded_Day_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components_TimelineItemGroupedEventsRowContentExpanded_Night_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components_TimelineItemReactionsLayout_Day_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components_TimelineItemReactionsLayout_Night_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components_TimelineItemReactionsViewFew_Day_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components_TimelineItemReactionsViewFew_Night_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components_TimelineItemReactionsViewIncoming_Day_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components_TimelineItemReactionsViewIncoming_Night_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components_TimelineItemReactionsViewOutgoing_Day_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components_TimelineItemReactionsViewOutgoing_Night_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components_TimelineItemReactionsView_Day_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components_TimelineItemReactionsView_Night_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components_TimelineItemStateEventRow_Day_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components_TimelineItemStateEventRow_Night_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.debug_EventDebugInfoView_Day_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.debug_EventDebugInfoView_Night_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.focus_FocusRequestStateView_Day_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.focus_FocusRequestStateView_Day_1_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.focus_FocusRequestStateView_Day_2_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.focus_FocusRequestStateView_Day_3_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.focus_FocusRequestStateView_Night_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.focus_FocusRequestStateView_Night_1_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.focus_FocusRequestStateView_Night_2_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.focus_FocusRequestStateView_Night_3_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.protection_ProtectedView_Day_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.protection_ProtectedView_Day_1_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.protection_ProtectedView_Day_2_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.protection_ProtectedView_Day_3_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.protection_ProtectedView_Night_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.protection_ProtectedView_Night_1_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.protection_ProtectedView_Night_2_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.protection_ProtectedView_Night_3_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.messages.impl.timeline_TimelineViewMessageShield_Day_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.messages.impl.timeline_TimelineViewMessageShield_Night_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.messages.impl.timeline_TimelineView_Day_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.messages.impl.timeline_TimelineView_Day_10_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.messages.impl.timeline_TimelineView_Day_11_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.messages.impl.timeline_TimelineView_Day_12_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.messages.impl.timeline_TimelineView_Day_13_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.messages.impl.timeline_TimelineView_Day_14_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.messages.impl.timeline_TimelineView_Day_15_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.messages.impl.timeline_TimelineView_Day_16_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.messages.impl.timeline_TimelineView_Day_17_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.messages.impl.timeline_TimelineView_Day_1_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.messages.impl.timeline_TimelineView_Day_2_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.messages.impl.timeline_TimelineView_Day_3_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.messages.impl.timeline_TimelineView_Day_4_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.messages.impl.timeline_TimelineView_Day_5_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.messages.impl.timeline_TimelineView_Day_6_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.messages.impl.timeline_TimelineView_Day_7_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.messages.impl.timeline_TimelineView_Day_8_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.messages.impl.timeline_TimelineView_Day_9_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.messages.impl.timeline_TimelineView_Night_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.messages.impl.timeline_TimelineView_Night_10_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.messages.impl.timeline_TimelineView_Night_11_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.messages.impl.timeline_TimelineView_Night_12_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.messages.impl.timeline_TimelineView_Night_13_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.messages.impl.timeline_TimelineView_Night_14_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.messages.impl.timeline_TimelineView_Night_15_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.messages.impl.timeline_TimelineView_Night_16_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.messages.impl.timeline_TimelineView_Night_17_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.messages.impl.timeline_TimelineView_Night_1_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.messages.impl.timeline_TimelineView_Night_2_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.messages.impl.timeline_TimelineView_Night_3_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.messages.impl.timeline_TimelineView_Night_4_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.messages.impl.timeline_TimelineView_Night_5_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.messages.impl.timeline_TimelineView_Night_6_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.messages.impl.timeline_TimelineView_Night_7_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.messages.impl.timeline_TimelineView_Night_8_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.messages.impl.timeline_TimelineView_Night_9_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.messages.impl.topbars_MessagesViewTopBar_Day_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.messages.impl.topbars_MessagesViewTopBar_Night_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.messages.impl.topbars_ThreadTopBar_Day_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.messages.impl.topbars_ThreadTopBar_Night_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.messages.impl.typing_TypingNotificationView_Day_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.messages.impl.typing_TypingNotificationView_Day_1_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.messages.impl.typing_TypingNotificationView_Day_2_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.messages.impl.typing_TypingNotificationView_Day_3_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.messages.impl.typing_TypingNotificationView_Day_4_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.messages.impl.typing_TypingNotificationView_Day_5_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.messages.impl.typing_TypingNotificationView_Day_6_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.messages.impl.typing_TypingNotificationView_Day_7_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.messages.impl.typing_TypingNotificationView_Day_8_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.messages.impl.typing_TypingNotificationView_Night_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.messages.impl.typing_TypingNotificationView_Night_1_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.messages.impl.typing_TypingNotificationView_Night_2_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.messages.impl.typing_TypingNotificationView_Night_3_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.messages.impl.typing_TypingNotificationView_Night_4_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.messages.impl.typing_TypingNotificationView_Night_5_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.messages.impl.typing_TypingNotificationView_Night_6_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.messages.impl.typing_TypingNotificationView_Night_7_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.messages.impl.typing_TypingNotificationView_Night_8_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.messages.impl_MessagesView_Day_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.messages.impl_MessagesView_Day_1_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.messages.impl_MessagesView_Day_2_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.messages.impl_MessagesView_Day_3_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.messages.impl_MessagesView_Day_4_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.messages.impl_MessagesView_Day_5_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.messages.impl_MessagesView_Day_6_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.messages.impl_MessagesView_Day_7_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.messages.impl_MessagesView_Day_8_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.messages.impl_MessagesView_Day_9_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.messages.impl_MessagesView_Night_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.messages.impl_MessagesView_Night_1_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.messages.impl_MessagesView_Night_2_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.messages.impl_MessagesView_Night_3_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.messages.impl_MessagesView_Night_4_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.messages.impl_MessagesView_Night_5_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.messages.impl_MessagesView_Night_6_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.messages.impl_MessagesView_Night_7_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.messages.impl_MessagesView_Night_8_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.messages.impl_MessagesView_Night_9_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.migration.impl_MigrationView_Day_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.migration.impl_MigrationView_Day_1_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.migration.impl_MigrationView_Night_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.migration.impl_MigrationView_Night_1_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.networkmonitor.api.ui_ConnectivityIndicator_Day_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.networkmonitor.api.ui_ConnectivityIndicator_Night_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.poll.api.pollcontent_PollAnswerViewDisclosedNotSelected_Day_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.poll.api.pollcontent_PollAnswerViewDisclosedNotSelected_Night_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.poll.api.pollcontent_PollAnswerViewDisclosedSelected_Day_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.poll.api.pollcontent_PollAnswerViewDisclosedSelected_Night_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.poll.api.pollcontent_PollAnswerViewEndedSelected_Day_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.poll.api.pollcontent_PollAnswerViewEndedSelected_Night_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.poll.api.pollcontent_PollAnswerViewEndedWinnerNotSelected_Day_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.poll.api.pollcontent_PollAnswerViewEndedWinnerNotSelected_Night_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.poll.api.pollcontent_PollAnswerViewEndedWinnerSelected_Day_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.poll.api.pollcontent_PollAnswerViewEndedWinnerSelected_Night_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.poll.api.pollcontent_PollAnswerViewUndisclosedNotSelected_Day_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.poll.api.pollcontent_PollAnswerViewUndisclosedNotSelected_Night_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.poll.api.pollcontent_PollAnswerViewUndisclosedSelected_Day_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.poll.api.pollcontent_PollAnswerViewUndisclosedSelected_Night_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.poll.api.pollcontent_PollContentViewCreatorEditable_Day_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.poll.api.pollcontent_PollContentViewCreatorEditable_Night_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.poll.api.pollcontent_PollContentViewCreatorEnded_Day_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.poll.api.pollcontent_PollContentViewCreatorEnded_Night_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.poll.api.pollcontent_PollContentViewCreator_Day_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.poll.api.pollcontent_PollContentViewCreator_Night_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.poll.api.pollcontent_PollContentViewDisclosed_Day_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.poll.api.pollcontent_PollContentViewDisclosed_Night_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.poll.api.pollcontent_PollContentViewEnded_Day_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.poll.api.pollcontent_PollContentViewEnded_Night_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.poll.api.pollcontent_PollContentViewUndisclosed_Day_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.poll.api.pollcontent_PollContentViewUndisclosed_Night_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.poll.api.pollcontent_PollTitleView_Day_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.poll.api.pollcontent_PollTitleView_Night_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.poll.impl.create_CreatePollView_Day_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.poll.impl.create_CreatePollView_Day_1_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.poll.impl.create_CreatePollView_Day_2_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.poll.impl.create_CreatePollView_Day_3_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.poll.impl.create_CreatePollView_Day_4_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.poll.impl.create_CreatePollView_Day_5_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.poll.impl.create_CreatePollView_Day_6_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.poll.impl.create_CreatePollView_Day_7_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.poll.impl.create_CreatePollView_Night_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.poll.impl.create_CreatePollView_Night_1_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.poll.impl.create_CreatePollView_Night_2_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.poll.impl.create_CreatePollView_Night_3_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.poll.impl.create_CreatePollView_Night_4_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.poll.impl.create_CreatePollView_Night_5_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.poll.impl.create_CreatePollView_Night_6_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.poll.impl.create_CreatePollView_Night_7_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.poll.impl.history_PollHistoryView_Day_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.poll.impl.history_PollHistoryView_Day_1_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.poll.impl.history_PollHistoryView_Day_2_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.poll.impl.history_PollHistoryView_Day_3_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.poll.impl.history_PollHistoryView_Day_4_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.poll.impl.history_PollHistoryView_Night_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.poll.impl.history_PollHistoryView_Night_1_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.poll.impl.history_PollHistoryView_Night_2_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.poll.impl.history_PollHistoryView_Night_3_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.poll.impl.history_PollHistoryView_Night_4_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.preferences.impl.about_AboutView_Day_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.preferences.impl.about_AboutView_Night_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.preferences.impl.advanced_AdvancedSettingsViewDark_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.preferences.impl.advanced_AdvancedSettingsViewDark_1_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.preferences.impl.advanced_AdvancedSettingsViewDark_2_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.preferences.impl.advanced_AdvancedSettingsViewDark_3_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.preferences.impl.advanced_AdvancedSettingsViewDark_4_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.preferences.impl.advanced_AdvancedSettingsViewDark_5_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.preferences.impl.advanced_AdvancedSettingsViewDark_6_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.preferences.impl.advanced_AdvancedSettingsViewDark_7_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.preferences.impl.advanced_AdvancedSettingsViewDark_8_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.preferences.impl.advanced_AdvancedSettingsViewLight_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.preferences.impl.advanced_AdvancedSettingsViewLight_1_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.preferences.impl.advanced_AdvancedSettingsViewLight_2_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.preferences.impl.advanced_AdvancedSettingsViewLight_3_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.preferences.impl.advanced_AdvancedSettingsViewLight_4_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.preferences.impl.advanced_AdvancedSettingsViewLight_5_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.preferences.impl.advanced_AdvancedSettingsViewLight_6_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.preferences.impl.advanced_AdvancedSettingsViewLight_7_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.preferences.impl.advanced_AdvancedSettingsViewLight_8_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.preferences.impl.advanced_VideoQualitySelectorDialog_Day_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.preferences.impl.advanced_VideoQualitySelectorDialog_Night_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.preferences.impl.analytics_AnalyticsSettingsView_Day_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.preferences.impl.analytics_AnalyticsSettingsView_Night_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.preferences.impl.blockedusers_BlockedUsersView_Day_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.preferences.impl.blockedusers_BlockedUsersView_Day_1_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.preferences.impl.blockedusers_BlockedUsersView_Day_2_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.preferences.impl.blockedusers_BlockedUsersView_Day_3_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.preferences.impl.blockedusers_BlockedUsersView_Day_4_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.preferences.impl.blockedusers_BlockedUsersView_Day_5_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.preferences.impl.blockedusers_BlockedUsersView_Day_6_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.preferences.impl.blockedusers_BlockedUsersView_Night_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.preferences.impl.blockedusers_BlockedUsersView_Night_1_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.preferences.impl.blockedusers_BlockedUsersView_Night_2_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.preferences.impl.blockedusers_BlockedUsersView_Night_3_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.preferences.impl.blockedusers_BlockedUsersView_Night_4_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.preferences.impl.blockedusers_BlockedUsersView_Night_5_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.preferences.impl.blockedusers_BlockedUsersView_Night_6_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.preferences.impl.developer_DeveloperSettingsView_Day_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.preferences.impl.developer_DeveloperSettingsView_Day_1_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.preferences.impl.developer_DeveloperSettingsView_Day_2_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.preferences.impl.developer_DeveloperSettingsView_Day_3_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.preferences.impl.developer_DeveloperSettingsView_Night_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.preferences.impl.developer_DeveloperSettingsView_Night_1_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.preferences.impl.developer_DeveloperSettingsView_Night_2_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.preferences.impl.developer_DeveloperSettingsView_Night_3_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.preferences.impl.labs_LabsView_Day_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.preferences.impl.labs_LabsView_Day_1_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.preferences.impl.labs_LabsView_Night_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.preferences.impl.labs_LabsView_Night_1_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.preferences.impl.notifications.edit_DefaultNotificationSettingOption_Day_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.preferences.impl.notifications.edit_DefaultNotificationSettingOption_Night_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.preferences.impl.notifications.edit_EditDefaultNotificationSettingView_Day_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.preferences.impl.notifications.edit_EditDefaultNotificationSettingView_Day_1_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.preferences.impl.notifications.edit_EditDefaultNotificationSettingView_Day_2_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.preferences.impl.notifications.edit_EditDefaultNotificationSettingView_Day_3_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.preferences.impl.notifications.edit_EditDefaultNotificationSettingView_Day_4_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.preferences.impl.notifications.edit_EditDefaultNotificationSettingView_Night_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.preferences.impl.notifications.edit_EditDefaultNotificationSettingView_Night_1_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.preferences.impl.notifications.edit_EditDefaultNotificationSettingView_Night_2_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.preferences.impl.notifications.edit_EditDefaultNotificationSettingView_Night_3_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.preferences.impl.notifications.edit_EditDefaultNotificationSettingView_Night_4_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.preferences.impl.notifications_NotificationSettingsView_Day_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.preferences.impl.notifications_NotificationSettingsView_Day_10_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.preferences.impl.notifications_NotificationSettingsView_Day_11_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.preferences.impl.notifications_NotificationSettingsView_Day_12_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.preferences.impl.notifications_NotificationSettingsView_Day_13_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.preferences.impl.notifications_NotificationSettingsView_Day_1_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.preferences.impl.notifications_NotificationSettingsView_Day_2_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.preferences.impl.notifications_NotificationSettingsView_Day_3_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.preferences.impl.notifications_NotificationSettingsView_Day_4_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.preferences.impl.notifications_NotificationSettingsView_Day_5_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.preferences.impl.notifications_NotificationSettingsView_Day_6_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.preferences.impl.notifications_NotificationSettingsView_Day_7_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.preferences.impl.notifications_NotificationSettingsView_Day_8_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.preferences.impl.notifications_NotificationSettingsView_Day_9_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.preferences.impl.notifications_NotificationSettingsView_Night_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.preferences.impl.notifications_NotificationSettingsView_Night_10_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.preferences.impl.notifications_NotificationSettingsView_Night_11_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.preferences.impl.notifications_NotificationSettingsView_Night_12_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.preferences.impl.notifications_NotificationSettingsView_Night_13_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.preferences.impl.notifications_NotificationSettingsView_Night_1_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.preferences.impl.notifications_NotificationSettingsView_Night_2_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.preferences.impl.notifications_NotificationSettingsView_Night_3_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.preferences.impl.notifications_NotificationSettingsView_Night_4_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.preferences.impl.notifications_NotificationSettingsView_Night_5_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.preferences.impl.notifications_NotificationSettingsView_Night_6_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.preferences.impl.notifications_NotificationSettingsView_Night_7_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.preferences.impl.notifications_NotificationSettingsView_Night_8_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.preferences.impl.notifications_NotificationSettingsView_Night_9_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.preferences.impl.root_MultiAccountSection_Day_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.preferences.impl.root_MultiAccountSection_Night_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.preferences.impl.root_PreferencesRootViewDark_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.preferences.impl.root_PreferencesRootViewDark_1_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.preferences.impl.root_PreferencesRootViewLight_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.preferences.impl.root_PreferencesRootViewLight_1_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.preferences.impl.user.editprofile_EditUserProfileView_Day_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.preferences.impl.user.editprofile_EditUserProfileView_Day_1_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.preferences.impl.user.editprofile_EditUserProfileView_Day_2_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.preferences.impl.user.editprofile_EditUserProfileView_Night_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.preferences.impl.user.editprofile_EditUserProfileView_Night_1_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.preferences.impl.user.editprofile_EditUserProfileView_Night_2_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.preferences.impl.user_UserPreferences_Day_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.preferences.impl.user_UserPreferences_Day_1_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.preferences.impl.user_UserPreferences_Day_2_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.preferences.impl.user_UserPreferences_Night_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.preferences.impl.user_UserPreferences_Night_1_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.preferences.impl.user_UserPreferences_Night_2_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.rageshake.api.crash_CrashDetectionView_Day_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.rageshake.api.crash_CrashDetectionView_Night_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.rageshake.api.detection_RageshakeDialogContent_Day_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.rageshake.api.detection_RageshakeDialogContent_Night_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.rageshake.api.preferences_RageshakePreferencesView_Day_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.rageshake.api.preferences_RageshakePreferencesView_Day_1_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.rageshake.api.preferences_RageshakePreferencesView_Night_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.rageshake.api.preferences_RageshakePreferencesView_Night_1_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.rageshake.impl.bugreport_BugReportViewDay_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.rageshake.impl.bugreport_BugReportViewDay_1_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.rageshake.impl.bugreport_BugReportViewDay_2_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.rageshake.impl.bugreport_BugReportViewDay_3_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.rageshake.impl.bugreport_BugReportViewDay_4_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.rageshake.impl.bugreport_BugReportViewNight_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.rageshake.impl.bugreport_BugReportViewNight_1_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.rageshake.impl.bugreport_BugReportViewNight_2_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.rageshake.impl.bugreport_BugReportViewNight_3_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.rageshake.impl.bugreport_BugReportViewNight_4_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.reportroom.impl_ReportRoomView_Day_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.reportroom.impl_ReportRoomView_Day_1_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.reportroom.impl_ReportRoomView_Day_2_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.reportroom.impl_ReportRoomView_Day_3_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.reportroom.impl_ReportRoomView_Day_4_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.reportroom.impl_ReportRoomView_Night_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.reportroom.impl_ReportRoomView_Night_1_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.reportroom.impl_ReportRoomView_Night_2_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.reportroom.impl_ReportRoomView_Night_3_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.reportroom.impl_ReportRoomView_Night_4_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.rolesandpermissions.impl.permissions_ChangeRoomPermissionsView_Day_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.rolesandpermissions.impl.permissions_ChangeRoomPermissionsView_Day_1_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.rolesandpermissions.impl.permissions_ChangeRoomPermissionsView_Day_2_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.rolesandpermissions.impl.permissions_ChangeRoomPermissionsView_Day_3_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.rolesandpermissions.impl.permissions_ChangeRoomPermissionsView_Day_4_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.rolesandpermissions.impl.permissions_ChangeRoomPermissionsView_Night_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.rolesandpermissions.impl.permissions_ChangeRoomPermissionsView_Night_1_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.rolesandpermissions.impl.permissions_ChangeRoomPermissionsView_Night_2_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.rolesandpermissions.impl.permissions_ChangeRoomPermissionsView_Night_3_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.rolesandpermissions.impl.permissions_ChangeRoomPermissionsView_Night_4_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.rolesandpermissions.impl.roles_ChangeRolesView_Day_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.rolesandpermissions.impl.roles_ChangeRolesView_Day_10_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.rolesandpermissions.impl.roles_ChangeRolesView_Day_11_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.rolesandpermissions.impl.roles_ChangeRolesView_Day_12_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.rolesandpermissions.impl.roles_ChangeRolesView_Day_13_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.rolesandpermissions.impl.roles_ChangeRolesView_Day_1_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.rolesandpermissions.impl.roles_ChangeRolesView_Day_2_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.rolesandpermissions.impl.roles_ChangeRolesView_Day_3_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.rolesandpermissions.impl.roles_ChangeRolesView_Day_4_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.rolesandpermissions.impl.roles_ChangeRolesView_Day_5_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.rolesandpermissions.impl.roles_ChangeRolesView_Day_6_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.rolesandpermissions.impl.roles_ChangeRolesView_Day_7_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.rolesandpermissions.impl.roles_ChangeRolesView_Day_8_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.rolesandpermissions.impl.roles_ChangeRolesView_Day_9_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.rolesandpermissions.impl.roles_ChangeRolesView_Night_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.rolesandpermissions.impl.roles_ChangeRolesView_Night_10_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.rolesandpermissions.impl.roles_ChangeRolesView_Night_11_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.rolesandpermissions.impl.roles_ChangeRolesView_Night_12_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.rolesandpermissions.impl.roles_ChangeRolesView_Night_13_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.rolesandpermissions.impl.roles_ChangeRolesView_Night_1_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.rolesandpermissions.impl.roles_ChangeRolesView_Night_2_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.rolesandpermissions.impl.roles_ChangeRolesView_Night_3_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.rolesandpermissions.impl.roles_ChangeRolesView_Night_4_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.rolesandpermissions.impl.roles_ChangeRolesView_Night_5_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.rolesandpermissions.impl.roles_ChangeRolesView_Night_6_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.rolesandpermissions.impl.roles_ChangeRolesView_Night_7_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.rolesandpermissions.impl.roles_ChangeRolesView_Night_8_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.rolesandpermissions.impl.roles_ChangeRolesView_Night_9_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.rolesandpermissions.impl.roles_PendingMemberRowWithLongName_Day_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.rolesandpermissions.impl.roles_PendingMemberRowWithLongName_Night_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.rolesandpermissions.impl.root_RolesAndPermissionsView_Day_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.rolesandpermissions.impl.root_RolesAndPermissionsView_Day_1_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.rolesandpermissions.impl.root_RolesAndPermissionsView_Day_2_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.rolesandpermissions.impl.root_RolesAndPermissionsView_Day_3_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.rolesandpermissions.impl.root_RolesAndPermissionsView_Day_4_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.rolesandpermissions.impl.root_RolesAndPermissionsView_Day_5_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.rolesandpermissions.impl.root_RolesAndPermissionsView_Day_6_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.rolesandpermissions.impl.root_RolesAndPermissionsView_Day_7_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.rolesandpermissions.impl.root_RolesAndPermissionsView_Day_8_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.rolesandpermissions.impl.root_RolesAndPermissionsView_Night_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.rolesandpermissions.impl.root_RolesAndPermissionsView_Night_1_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.rolesandpermissions.impl.root_RolesAndPermissionsView_Night_2_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.rolesandpermissions.impl.root_RolesAndPermissionsView_Night_3_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.rolesandpermissions.impl.root_RolesAndPermissionsView_Night_4_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.rolesandpermissions.impl.root_RolesAndPermissionsView_Night_5_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.rolesandpermissions.impl.root_RolesAndPermissionsView_Night_6_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.rolesandpermissions.impl.root_RolesAndPermissionsView_Night_7_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.rolesandpermissions.impl.root_RolesAndPermissionsView_Night_8_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.roomaliasresolver.impl_RoomAliasResolverView_Day_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.roomaliasresolver.impl_RoomAliasResolverView_Day_1_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.roomaliasresolver.impl_RoomAliasResolverView_Day_2_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.roomaliasresolver.impl_RoomAliasResolverView_Night_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.roomaliasresolver.impl_RoomAliasResolverView_Night_1_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.roomaliasresolver.impl_RoomAliasResolverView_Night_2_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.roomdetails.impl.edit_RoomDetailsEditView_Day_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.roomdetails.impl.edit_RoomDetailsEditView_Day_1_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.roomdetails.impl.edit_RoomDetailsEditView_Day_2_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.roomdetails.impl.edit_RoomDetailsEditView_Day_3_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.roomdetails.impl.edit_RoomDetailsEditView_Day_4_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.roomdetails.impl.edit_RoomDetailsEditView_Day_5_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.roomdetails.impl.edit_RoomDetailsEditView_Day_6_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.roomdetails.impl.edit_RoomDetailsEditView_Day_7_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.roomdetails.impl.edit_RoomDetailsEditView_Day_8_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.roomdetails.impl.edit_RoomDetailsEditView_Night_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.roomdetails.impl.edit_RoomDetailsEditView_Night_1_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.roomdetails.impl.edit_RoomDetailsEditView_Night_2_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.roomdetails.impl.edit_RoomDetailsEditView_Night_3_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.roomdetails.impl.edit_RoomDetailsEditView_Night_4_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.roomdetails.impl.edit_RoomDetailsEditView_Night_5_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.roomdetails.impl.edit_RoomDetailsEditView_Night_6_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.roomdetails.impl.edit_RoomDetailsEditView_Night_7_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.roomdetails.impl.edit_RoomDetailsEditView_Night_8_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.roomdetails.impl.invite_RoomInviteMembersView_Day_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.roomdetails.impl.invite_RoomInviteMembersView_Day_1_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.roomdetails.impl.invite_RoomInviteMembersView_Day_2_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.roomdetails.impl.invite_RoomInviteMembersView_Day_3_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.roomdetails.impl.invite_RoomInviteMembersView_Night_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.roomdetails.impl.invite_RoomInviteMembersView_Night_1_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.roomdetails.impl.invite_RoomInviteMembersView_Night_2_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.roomdetails.impl.invite_RoomInviteMembersView_Night_3_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.roomdetails.impl.members_RoomMemberListView_Day_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.roomdetails.impl.members_RoomMemberListView_Day_1_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.roomdetails.impl.members_RoomMemberListView_Day_2_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.roomdetails.impl.members_RoomMemberListView_Day_3_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.roomdetails.impl.members_RoomMemberListView_Day_4_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.roomdetails.impl.members_RoomMemberListView_Day_5_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.roomdetails.impl.members_RoomMemberListView_Day_6_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.roomdetails.impl.members_RoomMemberListView_Night_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.roomdetails.impl.members_RoomMemberListView_Night_1_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.roomdetails.impl.members_RoomMemberListView_Night_2_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.roomdetails.impl.members_RoomMemberListView_Night_3_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.roomdetails.impl.members_RoomMemberListView_Night_4_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.roomdetails.impl.members_RoomMemberListView_Night_5_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.roomdetails.impl.members_RoomMemberListView_Night_6_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.roomdetails.impl.notificationsettings_RoomNotificationSettingsOption_Day_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.roomdetails.impl.notificationsettings_RoomNotificationSettingsOption_Night_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.roomdetails.impl.notificationsettings_RoomNotificationSettingsView_Day_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.roomdetails.impl.notificationsettings_RoomNotificationSettingsView_Day_1_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.roomdetails.impl.notificationsettings_RoomNotificationSettingsView_Day_2_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.roomdetails.impl.notificationsettings_RoomNotificationSettingsView_Day_3_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.roomdetails.impl.notificationsettings_RoomNotificationSettingsView_Day_4_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.roomdetails.impl.notificationsettings_RoomNotificationSettingsView_Day_5_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.roomdetails.impl.notificationsettings_RoomNotificationSettingsView_Day_6_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.roomdetails.impl.notificationsettings_RoomNotificationSettingsView_Night_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.roomdetails.impl.notificationsettings_RoomNotificationSettingsView_Night_1_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.roomdetails.impl.notificationsettings_RoomNotificationSettingsView_Night_2_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.roomdetails.impl.notificationsettings_RoomNotificationSettingsView_Night_3_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.roomdetails.impl.notificationsettings_RoomNotificationSettingsView_Night_4_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.roomdetails.impl.notificationsettings_RoomNotificationSettingsView_Night_5_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.roomdetails.impl.notificationsettings_RoomNotificationSettingsView_Night_6_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.roomdetails.impl.notificationsettings_UserDefinedRoomNotificationSettingsView_Day_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.roomdetails.impl.notificationsettings_UserDefinedRoomNotificationSettingsView_Night_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.roomdetails.impl_RoomDetailsDark_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.roomdetails.impl_RoomDetailsDark_10_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.roomdetails.impl_RoomDetailsDark_11_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.roomdetails.impl_RoomDetailsDark_12_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.roomdetails.impl_RoomDetailsDark_13_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.roomdetails.impl_RoomDetailsDark_14_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.roomdetails.impl_RoomDetailsDark_15_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.roomdetails.impl_RoomDetailsDark_16_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.roomdetails.impl_RoomDetailsDark_17_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.roomdetails.impl_RoomDetailsDark_18_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.roomdetails.impl_RoomDetailsDark_19_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.roomdetails.impl_RoomDetailsDark_1_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.roomdetails.impl_RoomDetailsDark_2_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.roomdetails.impl_RoomDetailsDark_3_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.roomdetails.impl_RoomDetailsDark_4_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.roomdetails.impl_RoomDetailsDark_5_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.roomdetails.impl_RoomDetailsDark_6_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.roomdetails.impl_RoomDetailsDark_7_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.roomdetails.impl_RoomDetailsDark_8_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.roomdetails.impl_RoomDetailsDark_9_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.roomdetails.impl_RoomDetails_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.roomdetails.impl_RoomDetails_10_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.roomdetails.impl_RoomDetails_11_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.roomdetails.impl_RoomDetails_12_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.roomdetails.impl_RoomDetails_13_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.roomdetails.impl_RoomDetails_14_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.roomdetails.impl_RoomDetails_15_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.roomdetails.impl_RoomDetails_16_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.roomdetails.impl_RoomDetails_17_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.roomdetails.impl_RoomDetails_18_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.roomdetails.impl_RoomDetails_19_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.roomdetails.impl_RoomDetails_1_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.roomdetails.impl_RoomDetails_2_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.roomdetails.impl_RoomDetails_3_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.roomdetails.impl_RoomDetails_4_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.roomdetails.impl_RoomDetails_5_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.roomdetails.impl_RoomDetails_6_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.roomdetails.impl_RoomDetails_7_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.roomdetails.impl_RoomDetails_8_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.roomdetails.impl_RoomDetails_9_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.roomdirectory.impl.root_RoomDirectoryView_Day_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.roomdirectory.impl.root_RoomDirectoryView_Day_1_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.roomdirectory.impl.root_RoomDirectoryView_Day_2_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.roomdirectory.impl.root_RoomDirectoryView_Night_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.roomdirectory.impl.root_RoomDirectoryView_Night_1_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.roomdirectory.impl.root_RoomDirectoryView_Night_2_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.roommembermoderation.impl_RoomMemberModerationView_Day_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.roommembermoderation.impl_RoomMemberModerationView_Day_1_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.roommembermoderation.impl_RoomMemberModerationView_Day_2_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.roommembermoderation.impl_RoomMemberModerationView_Day_3_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.roommembermoderation.impl_RoomMemberModerationView_Day_4_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.roommembermoderation.impl_RoomMemberModerationView_Day_5_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.roommembermoderation.impl_RoomMemberModerationView_Day_6_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.roommembermoderation.impl_RoomMemberModerationView_Day_7_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.roommembermoderation.impl_RoomMemberModerationView_Day_8_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.roommembermoderation.impl_RoomMemberModerationView_Day_9_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.roommembermoderation.impl_RoomMemberModerationView_Night_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.roommembermoderation.impl_RoomMemberModerationView_Night_1_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.roommembermoderation.impl_RoomMemberModerationView_Night_2_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.roommembermoderation.impl_RoomMemberModerationView_Night_3_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.roommembermoderation.impl_RoomMemberModerationView_Night_4_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.roommembermoderation.impl_RoomMemberModerationView_Night_5_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.roommembermoderation.impl_RoomMemberModerationView_Night_6_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.roommembermoderation.impl_RoomMemberModerationView_Night_7_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.roommembermoderation.impl_RoomMemberModerationView_Night_8_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.roommembermoderation.impl_RoomMemberModerationView_Night_9_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.securebackup.impl.disable_SecureBackupDisableView_Day_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.securebackup.impl.disable_SecureBackupDisableView_Day_1_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.securebackup.impl.disable_SecureBackupDisableView_Day_2_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.securebackup.impl.disable_SecureBackupDisableView_Day_3_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.securebackup.impl.disable_SecureBackupDisableView_Night_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.securebackup.impl.disable_SecureBackupDisableView_Night_1_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.securebackup.impl.disable_SecureBackupDisableView_Night_2_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.securebackup.impl.disable_SecureBackupDisableView_Night_3_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.securebackup.impl.enter_SecureBackupEnterRecoveryKeyView_Day_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.securebackup.impl.enter_SecureBackupEnterRecoveryKeyView_Day_1_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.securebackup.impl.enter_SecureBackupEnterRecoveryKeyView_Day_2_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.securebackup.impl.enter_SecureBackupEnterRecoveryKeyView_Day_3_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.securebackup.impl.enter_SecureBackupEnterRecoveryKeyView_Day_4_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.securebackup.impl.enter_SecureBackupEnterRecoveryKeyView_Night_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.securebackup.impl.enter_SecureBackupEnterRecoveryKeyView_Night_1_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.securebackup.impl.enter_SecureBackupEnterRecoveryKeyView_Night_2_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.securebackup.impl.enter_SecureBackupEnterRecoveryKeyView_Night_3_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.securebackup.impl.enter_SecureBackupEnterRecoveryKeyView_Night_4_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.securebackup.impl.reset.password_ResetIdentityPasswordView_Day_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.securebackup.impl.reset.password_ResetIdentityPasswordView_Day_1_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.securebackup.impl.reset.password_ResetIdentityPasswordView_Day_2_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.securebackup.impl.reset.password_ResetIdentityPasswordView_Day_3_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.securebackup.impl.reset.password_ResetIdentityPasswordView_Night_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.securebackup.impl.reset.password_ResetIdentityPasswordView_Night_1_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.securebackup.impl.reset.password_ResetIdentityPasswordView_Night_2_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.securebackup.impl.reset.password_ResetIdentityPasswordView_Night_3_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.securebackup.impl.reset.root_ResetIdentityRootView_Day_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.securebackup.impl.reset.root_ResetIdentityRootView_Day_1_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.securebackup.impl.reset.root_ResetIdentityRootView_Night_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.securebackup.impl.reset.root_ResetIdentityRootView_Night_1_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.securebackup.impl.root_SecureBackupRootView_Day_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.securebackup.impl.root_SecureBackupRootView_Day_10_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.securebackup.impl.root_SecureBackupRootView_Day_11_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.securebackup.impl.root_SecureBackupRootView_Day_12_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.securebackup.impl.root_SecureBackupRootView_Day_13_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.securebackup.impl.root_SecureBackupRootView_Day_14_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.securebackup.impl.root_SecureBackupRootView_Day_15_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.securebackup.impl.root_SecureBackupRootView_Day_16_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.securebackup.impl.root_SecureBackupRootView_Day_17_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.securebackup.impl.root_SecureBackupRootView_Day_1_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.securebackup.impl.root_SecureBackupRootView_Day_2_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.securebackup.impl.root_SecureBackupRootView_Day_3_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.securebackup.impl.root_SecureBackupRootView_Day_4_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.securebackup.impl.root_SecureBackupRootView_Day_5_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.securebackup.impl.root_SecureBackupRootView_Day_6_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.securebackup.impl.root_SecureBackupRootView_Day_7_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.securebackup.impl.root_SecureBackupRootView_Day_8_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.securebackup.impl.root_SecureBackupRootView_Day_9_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.securebackup.impl.root_SecureBackupRootView_Night_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.securebackup.impl.root_SecureBackupRootView_Night_10_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.securebackup.impl.root_SecureBackupRootView_Night_11_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.securebackup.impl.root_SecureBackupRootView_Night_12_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.securebackup.impl.root_SecureBackupRootView_Night_13_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.securebackup.impl.root_SecureBackupRootView_Night_14_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.securebackup.impl.root_SecureBackupRootView_Night_15_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.securebackup.impl.root_SecureBackupRootView_Night_16_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.securebackup.impl.root_SecureBackupRootView_Night_17_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.securebackup.impl.root_SecureBackupRootView_Night_1_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.securebackup.impl.root_SecureBackupRootView_Night_2_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.securebackup.impl.root_SecureBackupRootView_Night_3_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.securebackup.impl.root_SecureBackupRootView_Night_4_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.securebackup.impl.root_SecureBackupRootView_Night_5_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.securebackup.impl.root_SecureBackupRootView_Night_6_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.securebackup.impl.root_SecureBackupRootView_Night_7_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.securebackup.impl.root_SecureBackupRootView_Night_8_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.securebackup.impl.root_SecureBackupRootView_Night_9_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.securebackup.impl.setup.views_RecoveryKeyView_Day_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.securebackup.impl.setup.views_RecoveryKeyView_Day_10_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.securebackup.impl.setup.views_RecoveryKeyView_Day_11_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.securebackup.impl.setup.views_RecoveryKeyView_Day_12_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.securebackup.impl.setup.views_RecoveryKeyView_Day_13_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.securebackup.impl.setup.views_RecoveryKeyView_Day_14_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.securebackup.impl.setup.views_RecoveryKeyView_Day_1_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.securebackup.impl.setup.views_RecoveryKeyView_Day_2_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.securebackup.impl.setup.views_RecoveryKeyView_Day_3_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.securebackup.impl.setup.views_RecoveryKeyView_Day_4_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.securebackup.impl.setup.views_RecoveryKeyView_Day_5_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.securebackup.impl.setup.views_RecoveryKeyView_Day_6_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.securebackup.impl.setup.views_RecoveryKeyView_Day_7_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.securebackup.impl.setup.views_RecoveryKeyView_Day_8_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.securebackup.impl.setup.views_RecoveryKeyView_Day_9_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.securebackup.impl.setup.views_RecoveryKeyView_Night_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.securebackup.impl.setup.views_RecoveryKeyView_Night_10_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.securebackup.impl.setup.views_RecoveryKeyView_Night_11_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.securebackup.impl.setup.views_RecoveryKeyView_Night_12_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.securebackup.impl.setup.views_RecoveryKeyView_Night_13_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.securebackup.impl.setup.views_RecoveryKeyView_Night_14_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.securebackup.impl.setup.views_RecoveryKeyView_Night_1_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.securebackup.impl.setup.views_RecoveryKeyView_Night_2_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.securebackup.impl.setup.views_RecoveryKeyView_Night_3_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.securebackup.impl.setup.views_RecoveryKeyView_Night_4_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.securebackup.impl.setup.views_RecoveryKeyView_Night_5_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.securebackup.impl.setup.views_RecoveryKeyView_Night_6_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.securebackup.impl.setup.views_RecoveryKeyView_Night_7_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.securebackup.impl.setup.views_RecoveryKeyView_Night_8_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.securebackup.impl.setup.views_RecoveryKeyView_Night_9_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.securebackup.impl.setup_SecureBackupSetupViewChange_Day_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.securebackup.impl.setup_SecureBackupSetupViewChange_Day_1_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.securebackup.impl.setup_SecureBackupSetupViewChange_Day_2_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.securebackup.impl.setup_SecureBackupSetupViewChange_Day_3_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.securebackup.impl.setup_SecureBackupSetupViewChange_Day_4_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.securebackup.impl.setup_SecureBackupSetupViewChange_Day_5_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.securebackup.impl.setup_SecureBackupSetupViewChange_Night_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.securebackup.impl.setup_SecureBackupSetupViewChange_Night_1_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.securebackup.impl.setup_SecureBackupSetupViewChange_Night_2_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.securebackup.impl.setup_SecureBackupSetupViewChange_Night_3_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.securebackup.impl.setup_SecureBackupSetupViewChange_Night_4_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.securebackup.impl.setup_SecureBackupSetupViewChange_Night_5_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.securebackup.impl.setup_SecureBackupSetupView_Day_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.securebackup.impl.setup_SecureBackupSetupView_Day_1_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.securebackup.impl.setup_SecureBackupSetupView_Day_2_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.securebackup.impl.setup_SecureBackupSetupView_Day_3_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.securebackup.impl.setup_SecureBackupSetupView_Day_4_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.securebackup.impl.setup_SecureBackupSetupView_Day_5_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.securebackup.impl.setup_SecureBackupSetupView_Night_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.securebackup.impl.setup_SecureBackupSetupView_Night_1_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.securebackup.impl.setup_SecureBackupSetupView_Night_2_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.securebackup.impl.setup_SecureBackupSetupView_Night_3_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.securebackup.impl.setup_SecureBackupSetupView_Night_4_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.securebackup.impl.setup_SecureBackupSetupView_Night_5_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.securityandprivacy.impl.editroomaddress_EditRoomAddressView_Day_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.securityandprivacy.impl.editroomaddress_EditRoomAddressView_Day_1_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.securityandprivacy.impl.editroomaddress_EditRoomAddressView_Day_2_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.securityandprivacy.impl.editroomaddress_EditRoomAddressView_Day_3_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.securityandprivacy.impl.editroomaddress_EditRoomAddressView_Day_4_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.securityandprivacy.impl.editroomaddress_EditRoomAddressView_Night_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.securityandprivacy.impl.editroomaddress_EditRoomAddressView_Night_1_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.securityandprivacy.impl.editroomaddress_EditRoomAddressView_Night_2_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.securityandprivacy.impl.editroomaddress_EditRoomAddressView_Night_3_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.securityandprivacy.impl.editroomaddress_EditRoomAddressView_Night_4_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.securityandprivacy.impl.root_SecurityAndPrivacyViewDark_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.securityandprivacy.impl.root_SecurityAndPrivacyViewDark_10_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.securityandprivacy.impl.root_SecurityAndPrivacyViewDark_11_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.securityandprivacy.impl.root_SecurityAndPrivacyViewDark_12_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.securityandprivacy.impl.root_SecurityAndPrivacyViewDark_13_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.securityandprivacy.impl.root_SecurityAndPrivacyViewDark_14_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.securityandprivacy.impl.root_SecurityAndPrivacyViewDark_15_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.securityandprivacy.impl.root_SecurityAndPrivacyViewDark_16_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.securityandprivacy.impl.root_SecurityAndPrivacyViewDark_17_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.securityandprivacy.impl.root_SecurityAndPrivacyViewDark_18_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.securityandprivacy.impl.root_SecurityAndPrivacyViewDark_19_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.securityandprivacy.impl.root_SecurityAndPrivacyViewDark_1_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.securityandprivacy.impl.root_SecurityAndPrivacyViewDark_2_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.securityandprivacy.impl.root_SecurityAndPrivacyViewDark_3_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.securityandprivacy.impl.root_SecurityAndPrivacyViewDark_4_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.securityandprivacy.impl.root_SecurityAndPrivacyViewDark_5_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.securityandprivacy.impl.root_SecurityAndPrivacyViewDark_6_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.securityandprivacy.impl.root_SecurityAndPrivacyViewDark_7_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.securityandprivacy.impl.root_SecurityAndPrivacyViewDark_8_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.securityandprivacy.impl.root_SecurityAndPrivacyViewDark_9_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.securityandprivacy.impl.root_SecurityAndPrivacyViewLight_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.securityandprivacy.impl.root_SecurityAndPrivacyViewLight_10_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.securityandprivacy.impl.root_SecurityAndPrivacyViewLight_11_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.securityandprivacy.impl.root_SecurityAndPrivacyViewLight_12_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.securityandprivacy.impl.root_SecurityAndPrivacyViewLight_13_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.securityandprivacy.impl.root_SecurityAndPrivacyViewLight_14_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.securityandprivacy.impl.root_SecurityAndPrivacyViewLight_15_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.securityandprivacy.impl.root_SecurityAndPrivacyViewLight_16_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.securityandprivacy.impl.root_SecurityAndPrivacyViewLight_17_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.securityandprivacy.impl.root_SecurityAndPrivacyViewLight_18_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.securityandprivacy.impl.root_SecurityAndPrivacyViewLight_19_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.securityandprivacy.impl.root_SecurityAndPrivacyViewLight_1_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.securityandprivacy.impl.root_SecurityAndPrivacyViewLight_2_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.securityandprivacy.impl.root_SecurityAndPrivacyViewLight_3_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.securityandprivacy.impl.root_SecurityAndPrivacyViewLight_4_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.securityandprivacy.impl.root_SecurityAndPrivacyViewLight_5_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.securityandprivacy.impl.root_SecurityAndPrivacyViewLight_6_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.securityandprivacy.impl.root_SecurityAndPrivacyViewLight_7_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.securityandprivacy.impl.root_SecurityAndPrivacyViewLight_8_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.securityandprivacy.impl.root_SecurityAndPrivacyViewLight_9_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.share.impl_ShareView_Day_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.share.impl_ShareView_Day_1_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.share.impl_ShareView_Day_2_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.share.impl_ShareView_Day_3_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.share.impl_ShareView_Night_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.share.impl_ShareView_Night_1_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.share.impl_ShareView_Night_2_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.share.impl_ShareView_Night_3_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.signedout.impl_SignedOutView_Day_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.signedout.impl_SignedOutView_Night_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.space.impl.leave_LeaveSpaceView_Day_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.space.impl.leave_LeaveSpaceView_Day_1_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.space.impl.leave_LeaveSpaceView_Day_2_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.space.impl.leave_LeaveSpaceView_Day_3_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.space.impl.leave_LeaveSpaceView_Day_4_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.space.impl.leave_LeaveSpaceView_Day_5_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.space.impl.leave_LeaveSpaceView_Day_6_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.space.impl.leave_LeaveSpaceView_Day_7_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.space.impl.leave_LeaveSpaceView_Day_8_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.space.impl.leave_LeaveSpaceView_Day_9_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.space.impl.leave_LeaveSpaceView_Night_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.space.impl.leave_LeaveSpaceView_Night_1_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.space.impl.leave_LeaveSpaceView_Night_2_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.space.impl.leave_LeaveSpaceView_Night_3_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.space.impl.leave_LeaveSpaceView_Night_4_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.space.impl.leave_LeaveSpaceView_Night_5_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.space.impl.leave_LeaveSpaceView_Night_6_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.space.impl.leave_LeaveSpaceView_Night_7_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.space.impl.leave_LeaveSpaceView_Night_8_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.space.impl.leave_LeaveSpaceView_Night_9_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.space.impl.root_SpaceView_Day_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.space.impl.root_SpaceView_Day_1_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.space.impl.root_SpaceView_Day_2_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.space.impl.root_SpaceView_Day_3_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.space.impl.root_SpaceView_Day_4_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.space.impl.root_SpaceView_Day_5_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.space.impl.root_SpaceView_Night_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.space.impl.root_SpaceView_Night_1_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.space.impl.root_SpaceView_Night_2_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.space.impl.root_SpaceView_Night_3_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.space.impl.root_SpaceView_Night_4_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.space.impl.root_SpaceView_Night_5_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.space.impl.settings_SpaceSettingsView_Day_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.space.impl.settings_SpaceSettingsView_Day_1_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.space.impl.settings_SpaceSettingsView_Day_2_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.space.impl.settings_SpaceSettingsView_Day_3_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.space.impl.settings_SpaceSettingsView_Night_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.space.impl.settings_SpaceSettingsView_Night_1_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.space.impl.settings_SpaceSettingsView_Night_2_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.space.impl.settings_SpaceSettingsView_Night_3_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.startchat.impl.components_SearchMultipleUsersResultItem_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.startchat.impl.components_SearchSingleUserResultItem_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.startchat.impl.components_UserListView_Day_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.startchat.impl.components_UserListView_Day_1_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.startchat.impl.components_UserListView_Day_2_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.startchat.impl.components_UserListView_Day_3_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.startchat.impl.components_UserListView_Day_4_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.startchat.impl.components_UserListView_Day_5_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.startchat.impl.components_UserListView_Day_6_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.startchat.impl.components_UserListView_Day_7_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.startchat.impl.components_UserListView_Day_8_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.startchat.impl.components_UserListView_Day_9_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.startchat.impl.components_UserListView_Night_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.startchat.impl.components_UserListView_Night_1_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.startchat.impl.components_UserListView_Night_2_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.startchat.impl.components_UserListView_Night_3_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.startchat.impl.components_UserListView_Night_4_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.startchat.impl.components_UserListView_Night_5_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.startchat.impl.components_UserListView_Night_6_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.startchat.impl.components_UserListView_Night_7_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.startchat.impl.components_UserListView_Night_8_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.startchat.impl.components_UserListView_Night_9_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.startchat.impl.joinbyaddress_JoinRoomByAddressView_Day_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.startchat.impl.joinbyaddress_JoinRoomByAddressView_Day_1_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.startchat.impl.joinbyaddress_JoinRoomByAddressView_Day_2_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.startchat.impl.joinbyaddress_JoinRoomByAddressView_Day_3_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.startchat.impl.joinbyaddress_JoinRoomByAddressView_Day_4_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.startchat.impl.joinbyaddress_JoinRoomByAddressView_Day_5_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.startchat.impl.joinbyaddress_JoinRoomByAddressView_Night_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.startchat.impl.joinbyaddress_JoinRoomByAddressView_Night_1_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.startchat.impl.joinbyaddress_JoinRoomByAddressView_Night_2_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.startchat.impl.joinbyaddress_JoinRoomByAddressView_Night_3_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.startchat.impl.joinbyaddress_JoinRoomByAddressView_Night_4_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.startchat.impl.joinbyaddress_JoinRoomByAddressView_Night_5_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.startchat.impl.root_StartChatView_Day_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.startchat.impl.root_StartChatView_Day_1_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.startchat.impl.root_StartChatView_Day_2_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.startchat.impl.root_StartChatView_Day_3_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.startchat.impl.root_StartChatView_Day_4_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.startchat.impl.root_StartChatView_Day_5_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.startchat.impl.root_StartChatView_Night_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.startchat.impl.root_StartChatView_Night_1_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.startchat.impl.root_StartChatView_Night_2_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.startchat.impl.root_StartChatView_Night_3_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.startchat.impl.root_StartChatView_Night_4_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.startchat.impl.root_StartChatView_Night_5_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.userprofile.shared_UserProfileHeaderSectionWithVerificationViolation_Day_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.userprofile.shared_UserProfileHeaderSectionWithVerificationViolation_Night_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.userprofile.shared_UserProfileHeaderSection_Day_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.userprofile.shared_UserProfileHeaderSection_Night_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.userprofile.shared_UserProfileView_Day_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.userprofile.shared_UserProfileView_Day_1_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.userprofile.shared_UserProfileView_Day_2_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.userprofile.shared_UserProfileView_Day_3_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.userprofile.shared_UserProfileView_Day_4_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.userprofile.shared_UserProfileView_Day_5_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.userprofile.shared_UserProfileView_Day_6_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.userprofile.shared_UserProfileView_Day_7_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.userprofile.shared_UserProfileView_Day_8_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.userprofile.shared_UserProfileView_Day_9_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.userprofile.shared_UserProfileView_Night_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.userprofile.shared_UserProfileView_Night_1_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.userprofile.shared_UserProfileView_Night_2_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.userprofile.shared_UserProfileView_Night_3_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.userprofile.shared_UserProfileView_Night_4_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.userprofile.shared_UserProfileView_Night_5_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.userprofile.shared_UserProfileView_Night_6_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.userprofile.shared_UserProfileView_Night_7_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.userprofile.shared_UserProfileView_Night_8_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.userprofile.shared_UserProfileView_Night_9_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.verifysession.impl.emoji_SasEmojis_Day_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.verifysession.impl.emoji_SasEmojis_Night_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.verifysession.impl.incoming.ui_SessionDetailsView_Day_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.verifysession.impl.incoming.ui_SessionDetailsView_Night_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.verifysession.impl.incoming_IncomingVerificationViewA11y_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.verifysession.impl.incoming_IncomingVerificationView_Day_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.verifysession.impl.incoming_IncomingVerificationView_Day_10_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.verifysession.impl.incoming_IncomingVerificationView_Day_11_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.verifysession.impl.incoming_IncomingVerificationView_Day_12_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.verifysession.impl.incoming_IncomingVerificationView_Day_13_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.verifysession.impl.incoming_IncomingVerificationView_Day_1_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.verifysession.impl.incoming_IncomingVerificationView_Day_2_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.verifysession.impl.incoming_IncomingVerificationView_Day_3_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.verifysession.impl.incoming_IncomingVerificationView_Day_4_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.verifysession.impl.incoming_IncomingVerificationView_Day_5_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.verifysession.impl.incoming_IncomingVerificationView_Day_6_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.verifysession.impl.incoming_IncomingVerificationView_Day_7_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.verifysession.impl.incoming_IncomingVerificationView_Day_8_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.verifysession.impl.incoming_IncomingVerificationView_Day_9_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.verifysession.impl.incoming_IncomingVerificationView_Night_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.verifysession.impl.incoming_IncomingVerificationView_Night_10_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.verifysession.impl.incoming_IncomingVerificationView_Night_11_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.verifysession.impl.incoming_IncomingVerificationView_Night_12_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.verifysession.impl.incoming_IncomingVerificationView_Night_13_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.verifysession.impl.incoming_IncomingVerificationView_Night_1_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.verifysession.impl.incoming_IncomingVerificationView_Night_2_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.verifysession.impl.incoming_IncomingVerificationView_Night_3_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.verifysession.impl.incoming_IncomingVerificationView_Night_4_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.verifysession.impl.incoming_IncomingVerificationView_Night_5_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.verifysession.impl.incoming_IncomingVerificationView_Night_6_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.verifysession.impl.incoming_IncomingVerificationView_Night_7_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.verifysession.impl.incoming_IncomingVerificationView_Night_8_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.verifysession.impl.incoming_IncomingVerificationView_Night_9_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.verifysession.impl.outgoing_OutgoingVerificationView_Day_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.verifysession.impl.outgoing_OutgoingVerificationView_Day_10_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.verifysession.impl.outgoing_OutgoingVerificationView_Day_11_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.verifysession.impl.outgoing_OutgoingVerificationView_Day_12_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.verifysession.impl.outgoing_OutgoingVerificationView_Day_13_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.verifysession.impl.outgoing_OutgoingVerificationView_Day_1_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.verifysession.impl.outgoing_OutgoingVerificationView_Day_2_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.verifysession.impl.outgoing_OutgoingVerificationView_Day_3_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.verifysession.impl.outgoing_OutgoingVerificationView_Day_4_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.verifysession.impl.outgoing_OutgoingVerificationView_Day_5_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.verifysession.impl.outgoing_OutgoingVerificationView_Day_6_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.verifysession.impl.outgoing_OutgoingVerificationView_Day_7_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.verifysession.impl.outgoing_OutgoingVerificationView_Day_8_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.verifysession.impl.outgoing_OutgoingVerificationView_Day_9_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.verifysession.impl.outgoing_OutgoingVerificationView_Night_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.verifysession.impl.outgoing_OutgoingVerificationView_Night_10_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.verifysession.impl.outgoing_OutgoingVerificationView_Night_11_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.verifysession.impl.outgoing_OutgoingVerificationView_Night_12_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.verifysession.impl.outgoing_OutgoingVerificationView_Night_13_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.verifysession.impl.outgoing_OutgoingVerificationView_Night_1_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.verifysession.impl.outgoing_OutgoingVerificationView_Night_2_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.verifysession.impl.outgoing_OutgoingVerificationView_Night_3_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.verifysession.impl.outgoing_OutgoingVerificationView_Night_4_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.verifysession.impl.outgoing_OutgoingVerificationView_Night_5_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.verifysession.impl.outgoing_OutgoingVerificationView_Night_6_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.verifysession.impl.outgoing_OutgoingVerificationView_Night_7_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.verifysession.impl.outgoing_OutgoingVerificationView_Night_8_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.verifysession.impl.outgoing_OutgoingVerificationView_Night_9_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.verifysession.impl.ui_VerificationUserProfileContent_Day_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.verifysession.impl.ui_VerificationUserProfileContent_Night_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.viewfolder.impl.file_ViewFileView_Day_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.viewfolder.impl.file_ViewFileView_Day_1_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.viewfolder.impl.file_ViewFileView_Day_2_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.viewfolder.impl.file_ViewFileView_Day_3_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.viewfolder.impl.file_ViewFileView_Day_4_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.viewfolder.impl.file_ViewFileView_Day_5_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.viewfolder.impl.file_ViewFileView_Night_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.viewfolder.impl.file_ViewFileView_Night_1_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.viewfolder.impl.file_ViewFileView_Night_2_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.viewfolder.impl.file_ViewFileView_Night_3_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.viewfolder.impl.file_ViewFileView_Night_4_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.viewfolder.impl.file_ViewFileView_Night_5_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.viewfolder.impl.folder_ViewFolderView_Day_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.viewfolder.impl.folder_ViewFolderView_Day_1_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.viewfolder.impl.folder_ViewFolderView_Night_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.viewfolder.impl.folder_ViewFolderView_Night_1_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.accountselect.impl_AccountSelectView_Day_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.accountselect.impl_AccountSelectView_Day_1_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.accountselect.impl_AccountSelectView_Night_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.accountselect.impl_AccountSelectView_Night_1_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.dateformatter.impl.previews_DateFormatterModeView_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.dateformatter.impl.previews_DateFormatterModeView_1_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.dateformatter.impl.previews_DateFormatterModeView_2_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.dateformatter.impl.previews_DateFormatterModeView_3_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.dateformatter.impl.previews_DateFormatterModeView_4_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.designsystem.atomic.atoms_BetaLabel_Day_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.designsystem.atomic.atoms_BetaLabel_Night_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.designsystem.atomic.atoms_CounterAtom_Day_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.designsystem.atomic.atoms_CounterAtom_Night_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.designsystem.atomic.atoms_ElementLogoAtomLargeNoBlurShadow_Day_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.designsystem.atomic.atoms_ElementLogoAtomLargeNoBlurShadow_Night_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.designsystem.atomic.atoms_ElementLogoAtomLarge_Day_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.designsystem.atomic.atoms_ElementLogoAtomLarge_Night_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.designsystem.atomic.atoms_ElementLogoAtomMediumNoBlurShadow_Day_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.designsystem.atomic.atoms_ElementLogoAtomMediumNoBlurShadow_Night_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.designsystem.atomic.atoms_ElementLogoAtomMedium_Day_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.designsystem.atomic.atoms_ElementLogoAtomMedium_Night_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.designsystem.atomic.atoms_MatrixBadgeAtomInfo_Day_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.designsystem.atomic.atoms_MatrixBadgeAtomInfo_Night_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.designsystem.atomic.atoms_MatrixBadgeAtomNegative_Day_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.designsystem.atomic.atoms_MatrixBadgeAtomNegative_Night_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.designsystem.atomic.atoms_MatrixBadgeAtomNeutral_Day_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.designsystem.atomic.atoms_MatrixBadgeAtomNeutral_Night_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.designsystem.atomic.atoms_MatrixBadgeAtomPositive_Day_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.designsystem.atomic.atoms_MatrixBadgeAtomPositive_Night_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.designsystem.atomic.atoms_PlaceholderAtom_Day_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.designsystem.atomic.atoms_PlaceholderAtom_Night_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.designsystem.atomic.atoms_RedIndicatorAtom_Day_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.designsystem.atomic.atoms_RedIndicatorAtom_Night_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.designsystem.atomic.atoms_RoundedIconAtom_Day_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.designsystem.atomic.atoms_RoundedIconAtom_Night_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.designsystem.atomic.atoms_SelectedIndicatorAtom_Day_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.designsystem.atomic.atoms_SelectedIndicatorAtom_Night_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.designsystem.atomic.atoms_UnreadIndicatorAtom_Day_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.designsystem.atomic.atoms_UnreadIndicatorAtom_Night_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.designsystem.atomic.molecules_ButtonColumnMolecule_Day_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.designsystem.atomic.molecules_ButtonColumnMolecule_Night_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.designsystem.atomic.molecules_ButtonRowMolecule_Day_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.designsystem.atomic.molecules_ButtonRowMolecule_Night_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.designsystem.atomic.molecules_ComposerAlertMolecule_Day_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.designsystem.atomic.molecules_ComposerAlertMolecule_Day_1_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.designsystem.atomic.molecules_ComposerAlertMolecule_Day_2_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.designsystem.atomic.molecules_ComposerAlertMolecule_Day_3_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.designsystem.atomic.molecules_ComposerAlertMolecule_Day_4_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.designsystem.atomic.molecules_ComposerAlertMolecule_Day_5_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.designsystem.atomic.molecules_ComposerAlertMolecule_Day_6_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.designsystem.atomic.molecules_ComposerAlertMolecule_Day_7_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.designsystem.atomic.molecules_ComposerAlertMolecule_Day_8_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.designsystem.atomic.molecules_ComposerAlertMolecule_Night_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.designsystem.atomic.molecules_ComposerAlertMolecule_Night_1_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.designsystem.atomic.molecules_ComposerAlertMolecule_Night_2_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.designsystem.atomic.molecules_ComposerAlertMolecule_Night_3_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.designsystem.atomic.molecules_ComposerAlertMolecule_Night_4_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.designsystem.atomic.molecules_ComposerAlertMolecule_Night_5_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.designsystem.atomic.molecules_ComposerAlertMolecule_Night_6_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.designsystem.atomic.molecules_ComposerAlertMolecule_Night_7_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.designsystem.atomic.molecules_ComposerAlertMolecule_Night_8_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.designsystem.atomic.molecules_IconTitlePlaceholdersRowMolecule_Day_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.designsystem.atomic.molecules_IconTitlePlaceholdersRowMolecule_Night_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.designsystem.atomic.molecules_IconTitleSubtitleMolecule_Day_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.designsystem.atomic.molecules_IconTitleSubtitleMolecule_Night_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.designsystem.atomic.molecules_InfoListItemMolecule_Day_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.designsystem.atomic.molecules_InfoListItemMolecule_Night_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.designsystem.atomic.molecules_MembersCountMolecule_Day_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.designsystem.atomic.molecules_MembersCountMolecule_Night_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.designsystem.atomic.organisms_InfoListOrganism_Day_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.designsystem.atomic.organisms_InfoListOrganism_Night_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.designsystem.atomic.pages_FlowStepPage_Day_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.designsystem.atomic.pages_FlowStepPage_Night_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.designsystem.atomic.pages_HeaderFooterPageScrollable_Day_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.designsystem.atomic.pages_HeaderFooterPageScrollable_Night_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.designsystem.atomic.pages_HeaderFooterPage_Day_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.designsystem.atomic.pages_HeaderFooterPage_Night_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.designsystem.atomic.pages_OnBoardingPage_Day_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.designsystem.atomic.pages_OnBoardingPage_Night_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.designsystem.atomic.pages_SunsetPage_Day_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.designsystem.atomic.pages_SunsetPage_Night_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.designsystem.background_LightGradientBackground_Day_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.designsystem.background_LightGradientBackground_Night_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.designsystem.background_OnboardingBackground_Day_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.designsystem.background_OnboardingBackground_Night_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.designsystem.components.async_AsyncActionView_Day_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.designsystem.components.async_AsyncActionView_Day_1_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.designsystem.components.async_AsyncActionView_Day_2_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.designsystem.components.async_AsyncActionView_Day_3_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.designsystem.components.async_AsyncActionView_Day_4_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.designsystem.components.async_AsyncActionView_Night_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.designsystem.components.async_AsyncActionView_Night_1_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.designsystem.components.async_AsyncActionView_Night_2_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.designsystem.components.async_AsyncActionView_Night_3_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.designsystem.components.async_AsyncActionView_Night_4_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.designsystem.components.async_AsyncFailure_Day_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.designsystem.components.async_AsyncFailure_Night_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.designsystem.components.async_AsyncIndicatorFailure_Day_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.designsystem.components.async_AsyncIndicatorFailure_Night_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.designsystem.components.async_AsyncIndicatorLoading_Day_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.designsystem.components.async_AsyncIndicatorLoading_Night_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.designsystem.components.async_AsyncLoading_Day_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.designsystem.components.async_AsyncLoading_Night_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.designsystem.components.avatar.internal_AvatarCluster_Avatars_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.designsystem.components.avatar.internal_SpaceAvatar_Avatars_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.designsystem.components.avatar.internal_TextAvatar_Avatars_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.designsystem.components.avatar.internal_TombstonedRoomAvatar_Avatars_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.designsystem.components.avatar.internal_UserAvatarColors_Day_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.designsystem.components.avatar.internal_UserAvatarColors_Night_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.designsystem.components.avatar_AvatarRowLastOnTopRtl_Day_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.designsystem.components.avatar_AvatarRowLastOnTopRtl_Day_1_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.designsystem.components.avatar_AvatarRowLastOnTopRtl_Day_2_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.designsystem.components.avatar_AvatarRowLastOnTopRtl_Day_3_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.designsystem.components.avatar_AvatarRowLastOnTopRtl_Day_4_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.designsystem.components.avatar_AvatarRowLastOnTopRtl_Night_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.designsystem.components.avatar_AvatarRowLastOnTopRtl_Night_1_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.designsystem.components.avatar_AvatarRowLastOnTopRtl_Night_2_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.designsystem.components.avatar_AvatarRowLastOnTopRtl_Night_3_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.designsystem.components.avatar_AvatarRowLastOnTopRtl_Night_4_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.designsystem.components.avatar_AvatarRowLastOnTop_Day_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.designsystem.components.avatar_AvatarRowLastOnTop_Day_1_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.designsystem.components.avatar_AvatarRowLastOnTop_Day_2_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.designsystem.components.avatar_AvatarRowLastOnTop_Day_3_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.designsystem.components.avatar_AvatarRowLastOnTop_Day_4_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.designsystem.components.avatar_AvatarRowLastOnTop_Night_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.designsystem.components.avatar_AvatarRowLastOnTop_Night_1_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.designsystem.components.avatar_AvatarRowLastOnTop_Night_2_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.designsystem.components.avatar_AvatarRowLastOnTop_Night_3_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.designsystem.components.avatar_AvatarRowLastOnTop_Night_4_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.designsystem.components.avatar_AvatarRowRtl_Day_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.designsystem.components.avatar_AvatarRowRtl_Day_1_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.designsystem.components.avatar_AvatarRowRtl_Day_2_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.designsystem.components.avatar_AvatarRowRtl_Day_3_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.designsystem.components.avatar_AvatarRowRtl_Day_4_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.designsystem.components.avatar_AvatarRowRtl_Night_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.designsystem.components.avatar_AvatarRowRtl_Night_1_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.designsystem.components.avatar_AvatarRowRtl_Night_2_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.designsystem.components.avatar_AvatarRowRtl_Night_3_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.designsystem.components.avatar_AvatarRowRtl_Night_4_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.designsystem.components.avatar_AvatarRow_Day_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.designsystem.components.avatar_AvatarRow_Day_1_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.designsystem.components.avatar_AvatarRow_Day_2_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.designsystem.components.avatar_AvatarRow_Day_3_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.designsystem.components.avatar_AvatarRow_Day_4_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.designsystem.components.avatar_AvatarRow_Night_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.designsystem.components.avatar_AvatarRow_Night_1_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.designsystem.components.avatar_AvatarRow_Night_2_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.designsystem.components.avatar_AvatarRow_Night_3_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.designsystem.components.avatar_AvatarRow_Night_4_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.designsystem.components.avatar_Avatar_Avatars_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.designsystem.components.avatar_DmAvatarsRtl_Avatars_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.designsystem.components.avatar_DmAvatars_Avatars_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.designsystem.components.button_BackButton_Buttons_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.designsystem.components.button_GradientFloatingActionButtonCircleShape_Day_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.designsystem.components.button_GradientFloatingActionButtonCircleShape_Night_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.designsystem.components.button_GradientFloatingActionButton_Day_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.designsystem.components.button_GradientFloatingActionButton_Night_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.designsystem.components.button_MainActionButton_Buttons_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.designsystem.components.button_SuperButton_Day_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.designsystem.components.button_SuperButton_Night_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.designsystem.components.dialogs_AlertDialogContent_Dialogs_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.designsystem.components.dialogs_AlertDialog_Day_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.designsystem.components.dialogs_AlertDialog_Night_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.designsystem.components.dialogs_ConfirmationDialogContent_Dialogs_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.designsystem.components.dialogs_ConfirmationDialog_Day_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.designsystem.components.dialogs_ConfirmationDialog_Night_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.designsystem.components.dialogs_ErrorDialogContent_Dialogs_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.designsystem.components.dialogs_ErrorDialogWithDoNotShowAgain_Day_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.designsystem.components.dialogs_ErrorDialogWithDoNotShowAgain_Night_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.designsystem.components.dialogs_ErrorDialog_Day_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.designsystem.components.dialogs_ErrorDialog_Night_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.designsystem.components.dialogs_ListDialogContent_Dialogs_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.designsystem.components.dialogs_ListDialog_Day_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.designsystem.components.dialogs_ListDialog_Night_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.designsystem.components.dialogs_MultipleSelectionDialogContent_Dialogs_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.designsystem.components.dialogs_MultipleSelectionDialog_Day_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.designsystem.components.dialogs_MultipleSelectionDialog_Night_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.designsystem.components.dialogs_RetryDialogContent_Dialogs_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.designsystem.components.dialogs_RetryDialog_Day_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.designsystem.components.dialogs_RetryDialog_Night_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.designsystem.components.dialogs_SaveChangesDialog_Day_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.designsystem.components.dialogs_SaveChangesDialog_Night_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.designsystem.components.dialogs_SingleSelectionDialogContent_Dialogs_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.designsystem.components.dialogs_SingleSelectionDialog_Day_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.designsystem.components.dialogs_SingleSelectionDialog_Night_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.designsystem.components.dialogs_TextFieldDialogWithError_Day_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.designsystem.components.dialogs_TextFieldDialogWithError_Night_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.designsystem.components.dialogs_TextFieldDialog_Day_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.designsystem.components.dialogs_TextFieldDialog_Night_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.designsystem.components.list_MutipleSelectionListItemSelectedTrailingContent_Multiple_selection_List_item_-_selection_in_trailing_content_List_items_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.designsystem.components.list_MutipleSelectionListItemSelected_Multiple_selection_List_item_-_selection_in_supporting_text_List_items_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.designsystem.components.list_MutipleSelectionListItem_Multiple_selection_List_item_-_no_selection_List_items_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.designsystem.components.list_SingleSelectionListItemCustomFormattert_Single_selection_List_item_-_custom_formatter_List_items_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.designsystem.components.list_SingleSelectionListItemSelectedInSupportingText_Single_selection_List_item_-_selection_in_supporting_text_List_items_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.designsystem.components.list_SingleSelectionListItemSelectedInTrailingContent_Single_selection_List_item_-_selection_in_trailing_content_List_items_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.designsystem.components.list_SingleSelectionListItemUnselectedWithSupportingText_Single_selection_List_item_-_no_selection,_supporting_text_List_items_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.designsystem.components.list_SingleSelectionListItem_Single_selection_List_item_-_no_selection_List_items_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.designsystem.components.list_TextFieldListItemEmpty_Text_field_List_item_-_empty_List_items_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.designsystem.components.list_TextFieldListItemTextFieldValue_Text_field_List_item_-_textfieldvalue_List_items_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.designsystem.components.list_TextFieldListItem_Text_field_List_item_-_text_List_items_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.designsystem.components.media_WaveformPlaybackView_Day_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.designsystem.components.media_WaveformPlaybackView_Night_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.designsystem.components.preferences.components_PreferenceIconWithBadge_Preferences_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.designsystem.components.preferences.components_PreferenceIconWithBadge_Preferences_1_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.designsystem.components.preferences.components_PreferenceIcon_Preferences_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.designsystem.components.preferences.components_PreferenceIcon_Preferences_1_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.designsystem.components.preferences_PreferenceCategory_Preferences_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.designsystem.components.preferences_PreferenceCheckbox_Preferences_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.designsystem.components.preferences_PreferenceDivider_Preferences_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.designsystem.components.preferences_PreferenceDropdown_Preferences_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.designsystem.components.preferences_PreferencePage_Day_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.designsystem.components.preferences_PreferencePage_Night_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.designsystem.components.preferences_PreferenceRow_Preferences_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.designsystem.components.preferences_PreferenceSlide_Preferences_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.designsystem.components.preferences_PreferenceSwitch_Preferences_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.designsystem.components_Announcement_Day_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.designsystem.components_Announcement_Night_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.designsystem.components_Badge_Day_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.designsystem.components_Badge_Night_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.designsystem.components_BigIcon_Day_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.designsystem.components_BigIcon_Night_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.designsystem.components_ClickableLinkText_Text_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.designsystem.components_ExpandableBottomSheetLayout_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.designsystem.components_LabelledCheckbox_Toggles_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.designsystem.components_PinIcon_Day_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.designsystem.components_PinIcon_Night_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.designsystem.components_ProgressDialogContent_Dialogs_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.designsystem.components_ProgressDialogWithContent_Day_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.designsystem.components_ProgressDialogWithContent_Night_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.designsystem.components_ProgressDialogWithTextAndContent_Day_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.designsystem.components_ProgressDialogWithTextAndContent_Night_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.designsystem.components_ProgressDialog_Day_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.designsystem.components_ProgressDialog_Night_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.designsystem.components_SimpleModalBottomSheet_Day_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.designsystem.components_SimpleModalBottomSheet_Night_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.designsystem.icons_IconsOther_Day_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.designsystem.icons_IconsOther_Night_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.designsystem.modifiers_BackgroundVerticalGradientDisabled_Day_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.designsystem.modifiers_BackgroundVerticalGradientDisabled_Night_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.designsystem.modifiers_BackgroundVerticalGradient_Day_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.designsystem.modifiers_BackgroundVerticalGradient_Night_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.designsystem.modifiers_SquareSizeModifierInsideSquare_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.designsystem.modifiers_SquareSizeModifierLargeHeight_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.designsystem.modifiers_SquareSizeModifierLargeWidth_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.designsystem.ruler_HorizontalRuler_Day_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.designsystem.ruler_HorizontalRuler_Night_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.designsystem.ruler_VerticalRuler_Day_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.designsystem.ruler_VerticalRuler_Night_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.designsystem.ruler_WithRulers_Day_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.designsystem.ruler_WithRulers_Night_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.designsystem.text_DpScale_0_75f__en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.designsystem.text_DpScale_1_0f__en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.designsystem.text_DpScale_1_5f__en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.designsystem.theme.components.previews_DatePickerDark_DateTime_pickers_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.designsystem.theme.components.previews_DatePickerLight_DateTime_pickers_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.designsystem.theme.components.previews_Menu_Menus_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.designsystem.theme.components.previews_TimePickerHorizontal_DateTime_pickers_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.designsystem.theme.components.previews_TimePickerVerticalDark_DateTime_pickers_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.designsystem.theme.components.previews_TimePickerVerticalLight_DateTime_pickers_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.designsystem.theme.components_AllIcons_Icons_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.designsystem.theme.components_BottomSheetDragHandle_Day_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.designsystem.theme.components_BottomSheetDragHandle_Night_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.designsystem.theme.components_Checkboxes_Toggles_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.designsystem.theme.components_CircularProgressIndicator_Progress_Indicators_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.designsystem.theme.components_DialogWithDestructiveButton_Dialog_with_destructive_button_Dialogs_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.designsystem.theme.components_DialogWithOnlyMessageAndOkButton_Dialog_with_only_message_and_ok_button_Dialogs_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.designsystem.theme.components_DialogWithThirdButton_Dialog_with_third_button_Dialogs_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.designsystem.theme.components_DialogWithTitleAndOkButton_Dialog_with_title_and_ok_button_Dialogs_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.designsystem.theme.components_DialogWithTitleIconAndOkButton_Dialog_with_title,_icon_and_ok_button_Dialogs_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.designsystem.theme.components_DialogWithVeryLongTitleAndIcon_Dialog_with_a_very_long_title_and_icon_Dialogs_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.designsystem.theme.components_DialogWithVeryLongTitle_Dialog_with_a_very_long_title_Dialogs_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.designsystem.theme.components_DropdownMenuItem_Menus_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.designsystem.theme.components_FilledButtonLargeLowPadding_Buttons_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.designsystem.theme.components_FilledButtonLarge_Buttons_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.designsystem.theme.components_FilledButtonMediumLowPadding_Buttons_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.designsystem.theme.components_FilledButtonMedium_Buttons_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.designsystem.theme.components_FilledButtonSmall_Buttons_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.designsystem.theme.components_FilledTextFieldDark_TextFields_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.designsystem.theme.components_FilledTextFieldLight_TextFields_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.designsystem.theme.components_FilledTextFieldValueLight_TextFields_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.designsystem.theme.components_FilledTextFieldValueTextFieldDark_TextFields_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.designsystem.theme.components_FloatingActionButton_Floating_Action_Buttons_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.designsystem.theme.components_HorizontalDivider_Dividers_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.designsystem.theme.components_IconButton_Buttons_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.designsystem.theme.components_IconColorButton_Day_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.designsystem.theme.components_IconColorButton_Night_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.designsystem.theme.components_IconImageVector_Icons_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.designsystem.theme.components_IconToggleButton_Toggles_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.designsystem.theme.components_LinearProgressIndicator_Progress_Indicators_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.designsystem.theme.components_ListItemPrimaryActionWithIcon_List_item_-_Primary_action_&_Icon_List_items_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.designsystem.theme.components_ListItemSingleLineBothIcons_List_item_(1_line)_-_Both_Icons_List_items_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.designsystem.theme.components_ListItemSingleLineLeadingCheckbox_List_item_(1_line)_-_Leading_Checkbox_List_items_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.designsystem.theme.components_ListItemSingleLineLeadingIcon_List_item_(1_line)_-_Leading_Icon_List_items_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.designsystem.theme.components_ListItemSingleLineLeadingRadioButton_List_item_(1_line)_-_Leading_RadioButton_List_items_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.designsystem.theme.components_ListItemSingleLineLeadingSwitch_List_item_(1_line)_-_Leading_Switch_List_items_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.designsystem.theme.components_ListItemSingleLineSimple_List_item_(1_line)_-_Simple_List_items_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.designsystem.theme.components_ListItemSingleLineTrailingCheckBox_List_item_(1_line)_-_Trailing_Checkbox_List_items_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.designsystem.theme.components_ListItemSingleLineTrailingIcon_List_item_(1_line)_-_Trailing_Icon_List_items_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.designsystem.theme.components_ListItemSingleLineTrailingRadioButton_List_item_(1_line)_-_Trailing_RadioButton_List_items_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.designsystem.theme.components_ListItemSingleLineTrailingSwitch_List_item_(1_line)_-_Trailing_Switch_List_items_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.designsystem.theme.components_ListItemThreeLinesBothIcons_List_item_(3_lines)_-_Both_Icons_List_items_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.designsystem.theme.components_ListItemThreeLinesLeadingCheckbox_List_item_(3_lines)_-_Leading_Checkbox_List_items_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.designsystem.theme.components_ListItemThreeLinesLeadingIcon_List_item_(3_lines)_-_Leading_Icon_List_items_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.designsystem.theme.components_ListItemThreeLinesLeadingRadioButton_List_item_(3_lines)_-_Leading_RadioButton_List_items_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.designsystem.theme.components_ListItemThreeLinesLeadingSwitch_List_item_(3_lines)_-_Leading_Switch_List_items_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.designsystem.theme.components_ListItemThreeLinesSimple_List_item_(3_lines)_-_Simple_List_items_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.designsystem.theme.components_ListItemThreeLinesTrailingCheckBox_List_item_(3_lines)_-_Trailing_Checkbox_List_items_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.designsystem.theme.components_ListItemThreeLinesTrailingIcon_List_item_(3_lines)_-_Trailing_Icon_List_items_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.designsystem.theme.components_ListItemThreeLinesTrailingRadioButton_List_item_(3_lines)_-_Trailing_RadioButton_List_items_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.designsystem.theme.components_ListItemThreeLinesTrailingSwitch_List_item_(3_lines)_-_Trailing_Switch_List_items_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.designsystem.theme.components_ListItemTwoLinesBothIconsError_List_item_(2_lines)_-_Both_Icons_-_Error_List_items_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.designsystem.theme.components_ListItemTwoLinesBothIcons_List_item_(2_lines)_-_Both_Icons_List_items_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.designsystem.theme.components_ListItemTwoLinesLeadingCheckboxError_List_item_(2_lines)_-_Leading_Checkbox_-_Error_List_items_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.designsystem.theme.components_ListItemTwoLinesLeadingCheckbox_List_item_(2_lines)_-_Leading_Checkbox_List_items_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.designsystem.theme.components_ListItemTwoLinesLeadingIconError_List_item_(2_lines)_-_Leading_Icon_-_Error_List_items_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.designsystem.theme.components_ListItemTwoLinesLeadingIcon_List_item_(2_lines)_-_Leading_Icon_List_items_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.designsystem.theme.components_ListItemTwoLinesLeadingRadioButtonError_List_item_(2_lines)_-_Leading_RadioButton_-_Error_List_items_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.designsystem.theme.components_ListItemTwoLinesLeadingRadioButton_List_item_(2_lines)_-_Leading_RadioButton_List_items_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.designsystem.theme.components_ListItemTwoLinesLeadingSwitchError_List_item_(2_lines)_-_Leading_Switch_-_Error_List_items_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.designsystem.theme.components_ListItemTwoLinesLeadingSwitch_List_item_(2_lines)_-_Leading_Switch_List_items_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.designsystem.theme.components_ListItemTwoLinesSimpleError_List_item_(2_lines)_-_Simple_-_Error_List_items_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.designsystem.theme.components_ListItemTwoLinesSimple_List_item_(2_lines)_-_Simple_List_items_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.designsystem.theme.components_ListItemTwoLinesTrailingCheckBoxError_List_item_(2_lines)_-_Trailing_Checkbox_-_Error_List_items_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.designsystem.theme.components_ListItemTwoLinesTrailingCheckBox_List_item_(2_lines)_-_Trailing_Checkbox_List_items_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.designsystem.theme.components_ListItemTwoLinesTrailingIconError_List_item_(2_lines)_-_Trailing_Icon_-_Error_List_items_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.designsystem.theme.components_ListItemTwoLinesTrailingIcon_List_item_(2_lines)_-_Trailing_Icon_List_items_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.designsystem.theme.components_ListItemTwoLinesTrailingRadioButtonError_List_item_(2_lines)_-_Trailing_RadioButton_-_Error_List_items_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.designsystem.theme.components_ListItemTwoLinesTrailingRadioButton_List_item_(2_lines)_-_Trailing_RadioButton_List_items_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.designsystem.theme.components_ListItemTwoLinesTrailingSwitchError_List_item_(2_lines)_-_Trailing_Switch_-_Error_List_items_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.designsystem.theme.components_ListItemTwoLinesTrailingSwitch_List_item_(2_lines)_-_Trailing_Switch_List_items_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.designsystem.theme.components_ListSectionHeaderWithDescriptionAndDivider_List_section_header_with_description_and_divider_List_sections_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.designsystem.theme.components_ListSectionHeaderWithDescription_List_section_header_with_description_List_sections_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.designsystem.theme.components_ListSectionHeaderWithDivider_List_section_header_with_divider_List_sections_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.designsystem.theme.components_ListSectionHeader_List_section_header_List_sections_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.designsystem.theme.components_ListSupportingTextCustomPadding_List_supporting_text_-_custom_padding_List_sections_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.designsystem.theme.components_ListSupportingTextDefaultPadding_List_supporting_text_-_default_padding_List_sections_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.designsystem.theme.components_ListSupportingTextLargePadding_List_supporting_text_-_large_padding_List_sections_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.designsystem.theme.components_ListSupportingTextNoPadding_List_supporting_text_-_no_padding_List_sections_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.designsystem.theme.components_ListSupportingTextSmallPadding_List_supporting_text_-_small_padding_List_sections_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.designsystem.theme.components_MediumTopAppBar_App_Bars_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.designsystem.theme.components_ModalBottomSheetDark_Bottom_Sheets_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.designsystem.theme.components_ModalBottomSheetLight_Bottom_Sheets_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.designsystem.theme.components_NavigationBar_App_Bars_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.designsystem.theme.components_OutlinedButtonLargeLowPadding_Buttons_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.designsystem.theme.components_OutlinedButtonLarge_Buttons_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.designsystem.theme.components_OutlinedButtonMediumLowPadding_Buttons_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.designsystem.theme.components_OutlinedButtonMedium_Buttons_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.designsystem.theme.components_OutlinedButtonSmall_Buttons_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.designsystem.theme.components_RadioButton_Toggles_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.designsystem.theme.components_SearchBarActiveNoneQuery_Search_views_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.designsystem.theme.components_SearchBarActiveWithContent_Search_views_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.designsystem.theme.components_SearchBarActiveWithNoResults_Search_views_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.designsystem.theme.components_SearchBarActiveWithQueryNoBackButton_Search_views_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.designsystem.theme.components_SearchBarActiveWithQuery_Search_views_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.designsystem.theme.components_SearchBarInactive_Search_views_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.designsystem.theme.components_SearchFieldsDark_Search_views_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.designsystem.theme.components_SearchFieldsLight_Search_views_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.designsystem.theme.components_Sliders_Sliders_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.designsystem.theme.components_SnackbarWithActionAndCloseButton_Snackbar_with_action_and_close_button_Snackbars_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.designsystem.theme.components_SnackbarWithActionOnNewLineAndCloseButton_Snackbar_with_action_and_close_button_on_new_line_Snackbars_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.designsystem.theme.components_SnackbarWithActionOnNewLine_Snackbar_with_action_on_new_line_Snackbars_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.designsystem.theme.components_SnackbarWithAction_Snackbar_with_action_Snackbars_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.designsystem.theme.components_Snackbar_Snackbar_Snackbars_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.designsystem.theme.components_Surface_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.designsystem.theme.components_Switch_Toggles_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.designsystem.theme.components_TextButtonLargeLowPadding_Buttons_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.designsystem.theme.components_TextButtonLarge_Buttons_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.designsystem.theme.components_TextButtonMediumLowPadding_Buttons_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.designsystem.theme.components_TextButtonMedium_Buttons_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.designsystem.theme.components_TextButtonSmall_Buttons_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.designsystem.theme.components_TextDark_Text_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.designsystem.theme.components_TextFieldsDark_TextFields_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.designsystem.theme.components_TextFieldsLight_TextFields_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.designsystem.theme.components_TextLight_Text_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.designsystem.theme.components_TopAppBarStr_App_Bars_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.designsystem.theme.components_TopAppBar_App_Bars_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.designsystem.theme_ColorAliases_Day_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.designsystem.theme_ColorAliases_Night_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.featureflag.ui_FeatureListView_Day_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.featureflag.ui_FeatureListView_Night_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.matrix.ui.components_AttachmentThumbnail_Day_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.matrix.ui.components_AttachmentThumbnail_Day_1_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.matrix.ui.components_AttachmentThumbnail_Day_2_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.matrix.ui.components_AttachmentThumbnail_Day_3_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.matrix.ui.components_AttachmentThumbnail_Day_4_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.matrix.ui.components_AttachmentThumbnail_Day_5_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.matrix.ui.components_AttachmentThumbnail_Day_6_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.matrix.ui.components_AttachmentThumbnail_Day_7_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.matrix.ui.components_AttachmentThumbnail_Day_8_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.matrix.ui.components_AttachmentThumbnail_Night_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.matrix.ui.components_AttachmentThumbnail_Night_1_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.matrix.ui.components_AttachmentThumbnail_Night_2_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.matrix.ui.components_AttachmentThumbnail_Night_3_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.matrix.ui.components_AttachmentThumbnail_Night_4_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.matrix.ui.components_AttachmentThumbnail_Night_5_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.matrix.ui.components_AttachmentThumbnail_Night_6_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.matrix.ui.components_AttachmentThumbnail_Night_7_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.matrix.ui.components_AttachmentThumbnail_Night_8_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.matrix.ui.components_AvatarActionBottomSheet_Day_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.matrix.ui.components_AvatarActionBottomSheet_Night_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.matrix.ui.components_CheckableResolvedUserRow_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.matrix.ui.components_CheckableUnresolvedUserRow_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.matrix.ui.components_CreateDmConfirmationBottomSheet_Day_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.matrix.ui.components_CreateDmConfirmationBottomSheet_Day_1_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.matrix.ui.components_CreateDmConfirmationBottomSheet_Night_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.matrix.ui.components_CreateDmConfirmationBottomSheet_Night_1_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.matrix.ui.components_EditableAvatarView_Day_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.matrix.ui.components_EditableAvatarView_Day_1_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.matrix.ui.components_EditableAvatarView_Day_2_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.matrix.ui.components_EditableAvatarView_Night_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.matrix.ui.components_EditableAvatarView_Night_1_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.matrix.ui.components_EditableAvatarView_Night_2_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.matrix.ui.components_EditableOrgAvatarRtl_Day_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.matrix.ui.components_EditableOrgAvatarRtl_Night_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.matrix.ui.components_EditableOrgAvatar_Day_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.matrix.ui.components_EditableOrgAvatar_Night_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.matrix.ui.components_InviteSenderView_Day_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.matrix.ui.components_InviteSenderView_Night_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.matrix.ui.components_MatrixUserHeaderPlaceholder_Day_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.matrix.ui.components_MatrixUserHeaderPlaceholder_Night_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.matrix.ui.components_MatrixUserHeader_Day_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.matrix.ui.components_MatrixUserHeader_Day_1_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.matrix.ui.components_MatrixUserHeader_Night_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.matrix.ui.components_MatrixUserHeader_Night_1_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.matrix.ui.components_MatrixUserRow_Day_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.matrix.ui.components_MatrixUserRow_Day_1_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.matrix.ui.components_MatrixUserRow_Night_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.matrix.ui.components_MatrixUserRow_Night_1_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.matrix.ui.components_OrganizationHeader_Day_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.matrix.ui.components_OrganizationHeader_Night_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.matrix.ui.components_SelectedRoomRtl_Day_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.matrix.ui.components_SelectedRoomRtl_Day_1_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.matrix.ui.components_SelectedRoomRtl_Day_2_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.matrix.ui.components_SelectedRoomRtl_Night_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.matrix.ui.components_SelectedRoomRtl_Night_1_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.matrix.ui.components_SelectedRoomRtl_Night_2_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.matrix.ui.components_SelectedRoom_Day_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.matrix.ui.components_SelectedRoom_Day_1_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.matrix.ui.components_SelectedRoom_Day_2_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.matrix.ui.components_SelectedRoom_Night_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.matrix.ui.components_SelectedRoom_Night_1_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.matrix.ui.components_SelectedRoom_Night_2_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.matrix.ui.components_SelectedUserCannotRemove_Day_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.matrix.ui.components_SelectedUserCannotRemove_Night_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.matrix.ui.components_SelectedUserRtl_Day_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.matrix.ui.components_SelectedUserRtl_Night_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.matrix.ui.components_SelectedUser_Day_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.matrix.ui.components_SelectedUser_Day_1_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.matrix.ui.components_SelectedUser_Night_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.matrix.ui.components_SelectedUser_Night_1_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.matrix.ui.components_SelectedUsersRowList_Day_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.matrix.ui.components_SelectedUsersRowList_Night_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.matrix.ui.components_SpaceHeaderRootView_Day_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.matrix.ui.components_SpaceHeaderRootView_Night_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.matrix.ui.components_SpaceHeaderView_Day_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.matrix.ui.components_SpaceHeaderView_Night_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.matrix.ui.components_SpaceInfoRow_Day_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.matrix.ui.components_SpaceInfoRow_Night_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.matrix.ui.components_SpaceMembersViewNoHeroes_Day_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.matrix.ui.components_SpaceMembersViewNoHeroes_Night_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.matrix.ui.components_SpaceMembersView_Day_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.matrix.ui.components_SpaceMembersView_Night_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.matrix.ui.components_SpaceRoomItemView_Day_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.matrix.ui.components_SpaceRoomItemView_Day_1_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.matrix.ui.components_SpaceRoomItemView_Day_2_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.matrix.ui.components_SpaceRoomItemView_Day_3_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.matrix.ui.components_SpaceRoomItemView_Day_4_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.matrix.ui.components_SpaceRoomItemView_Day_5_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.matrix.ui.components_SpaceRoomItemView_Day_6_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.matrix.ui.components_SpaceRoomItemView_Day_7_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.matrix.ui.components_SpaceRoomItemView_Day_8_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.matrix.ui.components_SpaceRoomItemView_Night_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.matrix.ui.components_SpaceRoomItemView_Night_1_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.matrix.ui.components_SpaceRoomItemView_Night_2_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.matrix.ui.components_SpaceRoomItemView_Night_3_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.matrix.ui.components_SpaceRoomItemView_Night_4_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.matrix.ui.components_SpaceRoomItemView_Night_5_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.matrix.ui.components_SpaceRoomItemView_Night_6_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.matrix.ui.components_SpaceRoomItemView_Night_7_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.matrix.ui.components_SpaceRoomItemView_Night_8_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.matrix.ui.components_UnresolvedUserRow_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.matrix.ui.components_UnsavedAvatar_Day_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.matrix.ui.components_UnsavedAvatar_Night_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.matrix.ui.media_InitialsAvatarBitmapGenerator_Day_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.matrix.ui.media_InitialsAvatarBitmapGenerator_Night_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.matrix.ui.messages.reply_InReplyToView_Day_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.matrix.ui.messages.reply_InReplyToView_Day_10_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.matrix.ui.messages.reply_InReplyToView_Day_11_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.matrix.ui.messages.reply_InReplyToView_Day_1_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.matrix.ui.messages.reply_InReplyToView_Day_2_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.matrix.ui.messages.reply_InReplyToView_Day_3_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.matrix.ui.messages.reply_InReplyToView_Day_4_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.matrix.ui.messages.reply_InReplyToView_Day_5_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.matrix.ui.messages.reply_InReplyToView_Day_6_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.matrix.ui.messages.reply_InReplyToView_Day_7_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.matrix.ui.messages.reply_InReplyToView_Day_8_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.matrix.ui.messages.reply_InReplyToView_Day_9_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.matrix.ui.messages.reply_InReplyToView_Night_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.matrix.ui.messages.reply_InReplyToView_Night_10_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.matrix.ui.messages.reply_InReplyToView_Night_11_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.matrix.ui.messages.reply_InReplyToView_Night_1_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.matrix.ui.messages.reply_InReplyToView_Night_2_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.matrix.ui.messages.reply_InReplyToView_Night_3_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.matrix.ui.messages.reply_InReplyToView_Night_4_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.matrix.ui.messages.reply_InReplyToView_Night_5_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.matrix.ui.messages.reply_InReplyToView_Night_6_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.matrix.ui.messages.reply_InReplyToView_Night_7_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.matrix.ui.messages.reply_InReplyToView_Night_8_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.matrix.ui.messages.reply_InReplyToView_Night_9_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.matrix.ui.messages.sender_SenderName_Day_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.matrix.ui.messages.sender_SenderName_Day_1_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.matrix.ui.messages.sender_SenderName_Day_2_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.matrix.ui.messages.sender_SenderName_Day_3_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.matrix.ui.messages.sender_SenderName_Day_4_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.matrix.ui.messages.sender_SenderName_Day_5_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.matrix.ui.messages.sender_SenderName_Day_6_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.matrix.ui.messages.sender_SenderName_Day_7_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.matrix.ui.messages.sender_SenderName_Day_8_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.matrix.ui.messages.sender_SenderName_Night_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.matrix.ui.messages.sender_SenderName_Night_1_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.matrix.ui.messages.sender_SenderName_Night_2_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.matrix.ui.messages.sender_SenderName_Night_3_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.matrix.ui.messages.sender_SenderName_Night_4_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.matrix.ui.messages.sender_SenderName_Night_5_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.matrix.ui.messages.sender_SenderName_Night_6_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.matrix.ui.messages.sender_SenderName_Night_7_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.matrix.ui.messages.sender_SenderName_Night_8_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.matrix.ui.room.address_RoomAddressField_Day_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.matrix.ui.room.address_RoomAddressField_Night_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.mediaviewer.impl.details_MediaDeleteConfirmationBottomSheet_Day_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.mediaviewer.impl.details_MediaDeleteConfirmationBottomSheet_Night_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.mediaviewer.impl.details_MediaDetailsBottomSheet_Day_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.mediaviewer.impl.details_MediaDetailsBottomSheet_Night_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.mediaviewer.impl.gallery.ui_AudioItemView_Day_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.mediaviewer.impl.gallery.ui_AudioItemView_Day_1_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.mediaviewer.impl.gallery.ui_AudioItemView_Day_2_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.mediaviewer.impl.gallery.ui_AudioItemView_Night_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.mediaviewer.impl.gallery.ui_AudioItemView_Night_1_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.mediaviewer.impl.gallery.ui_AudioItemView_Night_2_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.mediaviewer.impl.gallery.ui_DateItemView_Day_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.mediaviewer.impl.gallery.ui_DateItemView_Day_1_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.mediaviewer.impl.gallery.ui_DateItemView_Night_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.mediaviewer.impl.gallery.ui_DateItemView_Night_1_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.mediaviewer.impl.gallery.ui_FileItemView_Day_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.mediaviewer.impl.gallery.ui_FileItemView_Day_1_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.mediaviewer.impl.gallery.ui_FileItemView_Day_2_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.mediaviewer.impl.gallery.ui_FileItemView_Night_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.mediaviewer.impl.gallery.ui_FileItemView_Night_1_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.mediaviewer.impl.gallery.ui_FileItemView_Night_2_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.mediaviewer.impl.gallery.ui_ImageItemView_Day_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.mediaviewer.impl.gallery.ui_ImageItemView_Night_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.mediaviewer.impl.gallery.ui_VideoItemView_Day_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.mediaviewer.impl.gallery.ui_VideoItemView_Day_1_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.mediaviewer.impl.gallery.ui_VideoItemView_Night_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.mediaviewer.impl.gallery.ui_VideoItemView_Night_1_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.mediaviewer.impl.gallery.ui_VoiceItemViewPlay_Day_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.mediaviewer.impl.gallery.ui_VoiceItemViewPlay_Day_1_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.mediaviewer.impl.gallery.ui_VoiceItemViewPlay_Day_2_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.mediaviewer.impl.gallery.ui_VoiceItemViewPlay_Day_3_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.mediaviewer.impl.gallery.ui_VoiceItemViewPlay_Day_4_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.mediaviewer.impl.gallery.ui_VoiceItemViewPlay_Night_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.mediaviewer.impl.gallery.ui_VoiceItemViewPlay_Night_1_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.mediaviewer.impl.gallery.ui_VoiceItemViewPlay_Night_2_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.mediaviewer.impl.gallery.ui_VoiceItemViewPlay_Night_3_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.mediaviewer.impl.gallery.ui_VoiceItemViewPlay_Night_4_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.mediaviewer.impl.gallery.ui_VoiceItemView_Day_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.mediaviewer.impl.gallery.ui_VoiceItemView_Day_1_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.mediaviewer.impl.gallery.ui_VoiceItemView_Day_2_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.mediaviewer.impl.gallery.ui_VoiceItemView_Day_3_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.mediaviewer.impl.gallery.ui_VoiceItemView_Night_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.mediaviewer.impl.gallery.ui_VoiceItemView_Night_1_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.mediaviewer.impl.gallery.ui_VoiceItemView_Night_2_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.mediaviewer.impl.gallery.ui_VoiceItemView_Night_3_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.mediaviewer.impl.gallery_MediaGalleryView_Day_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.mediaviewer.impl.gallery_MediaGalleryView_Day_10_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.mediaviewer.impl.gallery_MediaGalleryView_Day_11_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.mediaviewer.impl.gallery_MediaGalleryView_Day_12_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.mediaviewer.impl.gallery_MediaGalleryView_Day_1_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.mediaviewer.impl.gallery_MediaGalleryView_Day_2_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.mediaviewer.impl.gallery_MediaGalleryView_Day_3_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.mediaviewer.impl.gallery_MediaGalleryView_Day_4_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.mediaviewer.impl.gallery_MediaGalleryView_Day_5_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.mediaviewer.impl.gallery_MediaGalleryView_Day_6_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.mediaviewer.impl.gallery_MediaGalleryView_Day_7_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.mediaviewer.impl.gallery_MediaGalleryView_Day_8_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.mediaviewer.impl.gallery_MediaGalleryView_Day_9_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.mediaviewer.impl.gallery_MediaGalleryView_Night_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.mediaviewer.impl.gallery_MediaGalleryView_Night_10_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.mediaviewer.impl.gallery_MediaGalleryView_Night_11_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.mediaviewer.impl.gallery_MediaGalleryView_Night_12_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.mediaviewer.impl.gallery_MediaGalleryView_Night_1_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.mediaviewer.impl.gallery_MediaGalleryView_Night_2_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.mediaviewer.impl.gallery_MediaGalleryView_Night_3_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.mediaviewer.impl.gallery_MediaGalleryView_Night_4_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.mediaviewer.impl.gallery_MediaGalleryView_Night_5_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.mediaviewer.impl.gallery_MediaGalleryView_Night_6_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.mediaviewer.impl.gallery_MediaGalleryView_Night_7_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.mediaviewer.impl.gallery_MediaGalleryView_Night_8_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.mediaviewer.impl.gallery_MediaGalleryView_Night_9_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.mediaviewer.impl.local.audio_MediaAudioView_Day_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.mediaviewer.impl.local.audio_MediaAudioView_Day_1_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.mediaviewer.impl.local.audio_MediaAudioView_Night_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.mediaviewer.impl.local.audio_MediaAudioView_Night_1_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.mediaviewer.impl.local.file_MediaFileView_Day_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.mediaviewer.impl.local.file_MediaFileView_Night_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.mediaviewer.impl.local.image_MediaImageView_Day_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.mediaviewer.impl.local.image_MediaImageView_Night_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.mediaviewer.impl.local.pdf_PdfPagesErrorView_Day_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.mediaviewer.impl.local.pdf_PdfPagesErrorView_Night_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.mediaviewer.impl.local.player_MediaPlayerControllerView_Day_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.mediaviewer.impl.local.player_MediaPlayerControllerView_Day_1_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.mediaviewer.impl.local.player_MediaPlayerControllerView_Day_2_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.mediaviewer.impl.local.player_MediaPlayerControllerView_Night_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.mediaviewer.impl.local.player_MediaPlayerControllerView_Night_1_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.mediaviewer.impl.local.player_MediaPlayerControllerView_Night_2_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.mediaviewer.impl.local.txt_TextFileContentView_Day_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.mediaviewer.impl.local.txt_TextFileContentView_Day_1_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.mediaviewer.impl.local.txt_TextFileContentView_Day_2_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.mediaviewer.impl.local.txt_TextFileContentView_Day_3_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.mediaviewer.impl.local.txt_TextFileContentView_Night_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.mediaviewer.impl.local.txt_TextFileContentView_Night_1_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.mediaviewer.impl.local.txt_TextFileContentView_Night_2_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.mediaviewer.impl.local.txt_TextFileContentView_Night_3_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.mediaviewer.impl.local.video_MediaVideoView_Day_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.mediaviewer.impl.local.video_MediaVideoView_Night_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.mediaviewer.impl.viewer_MediaViewerView_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.mediaviewer.impl.viewer_MediaViewerView_10_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.mediaviewer.impl.viewer_MediaViewerView_11_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.mediaviewer.impl.viewer_MediaViewerView_12_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.mediaviewer.impl.viewer_MediaViewerView_13_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.mediaviewer.impl.viewer_MediaViewerView_14_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.mediaviewer.impl.viewer_MediaViewerView_15_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.mediaviewer.impl.viewer_MediaViewerView_16_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.mediaviewer.impl.viewer_MediaViewerView_1_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.mediaviewer.impl.viewer_MediaViewerView_2_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.mediaviewer.impl.viewer_MediaViewerView_3_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.mediaviewer.impl.viewer_MediaViewerView_4_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.mediaviewer.impl.viewer_MediaViewerView_5_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.mediaviewer.impl.viewer_MediaViewerView_6_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.mediaviewer.impl.viewer_MediaViewerView_7_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.mediaviewer.impl.viewer_MediaViewerView_8_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.mediaviewer.impl.viewer_MediaViewerView_9_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.permissions.api_PermissionsView_Day_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.permissions.api_PermissionsView_Day_1_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.permissions.api_PermissionsView_Day_2_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.permissions.api_PermissionsView_Day_3_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.permissions.api_PermissionsView_Night_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.permissions.api_PermissionsView_Night_1_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.permissions.api_PermissionsView_Night_2_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.permissions.api_PermissionsView_Night_3_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.roomselect.impl_RoomSelectView_Day_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.roomselect.impl_RoomSelectView_Day_1_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.roomselect.impl_RoomSelectView_Day_2_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.roomselect.impl_RoomSelectView_Day_3_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.roomselect.impl_RoomSelectView_Day_4_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.roomselect.impl_RoomSelectView_Day_5_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.roomselect.impl_RoomSelectView_Night_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.roomselect.impl_RoomSelectView_Night_1_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.roomselect.impl_RoomSelectView_Night_2_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.roomselect.impl_RoomSelectView_Night_3_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.roomselect.impl_RoomSelectView_Night_4_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.roomselect.impl_RoomSelectView_Night_5_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.textcomposer.components.markdown_MarkdownTextInput_Day_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.textcomposer.components.markdown_MarkdownTextInput_Night_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.textcomposer.components_FormattingOption_Day_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.textcomposer.components_FormattingOption_Night_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.textcomposer.components_LiveWaveformView_Day_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.textcomposer.components_LiveWaveformView_Night_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.textcomposer.components_SendButton_Day_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.textcomposer.components_SendButton_Night_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.textcomposer.components_TextFormatting_Day_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.textcomposer.components_TextFormatting_Night_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.textcomposer.components_VoiceMessageDeleteButton_Day_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.textcomposer.components_VoiceMessageDeleteButton_Night_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.textcomposer.components_VoiceMessageRecorderButton_Day_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.textcomposer.components_VoiceMessageRecorderButton_Night_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.textcomposer.components_VoiceMessageRecording_Day_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.textcomposer.components_VoiceMessageRecording_Night_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.textcomposer.components_VoiceMessage_Day_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.textcomposer.components_VoiceMessage_Night_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.textcomposer.mentions_MentionSpanThemeInTimeline_Day_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.textcomposer.mentions_MentionSpanThemeInTimeline_Night_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.textcomposer.mentions_MentionSpanTheme_Day_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.textcomposer.mentions_MentionSpanTheme_Night_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.textcomposer_CaptionWarningBottomSheet_Day_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.textcomposer_CaptionWarningBottomSheet_Night_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.textcomposer_ComposerModeView_Day_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.textcomposer_ComposerModeView_Day_1_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.textcomposer_ComposerModeView_Day_2_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.textcomposer_ComposerModeView_Day_3_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.textcomposer_ComposerModeView_Night_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.textcomposer_ComposerModeView_Night_1_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.textcomposer_ComposerModeView_Night_2_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.textcomposer_ComposerModeView_Night_3_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.textcomposer_MarkdownTextComposerEdit_Day_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.textcomposer_MarkdownTextComposerEdit_Night_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.textcomposer_TextComposerAddCaption_Day_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.textcomposer_TextComposerAddCaption_Night_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.textcomposer_TextComposerCaption_Day_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.textcomposer_TextComposerCaption_Night_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.textcomposer_TextComposerEditCaption_Day_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.textcomposer_TextComposerEditCaption_Night_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.textcomposer_TextComposerEditNotEncrypted_Day_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.textcomposer_TextComposerEditNotEncrypted_Night_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.textcomposer_TextComposerEdit_Day_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.textcomposer_TextComposerEdit_Night_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.textcomposer_TextComposerFormattingNotEncrypted_Day_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.textcomposer_TextComposerFormattingNotEncrypted_Night_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.textcomposer_TextComposerFormatting_Day_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.textcomposer_TextComposerFormatting_Night_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.textcomposer_TextComposerLinkDialogCreateLinkWithoutText_Day_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.textcomposer_TextComposerLinkDialogCreateLinkWithoutText_Night_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.textcomposer_TextComposerLinkDialogCreateLink_Day_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.textcomposer_TextComposerLinkDialogCreateLink_Night_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.textcomposer_TextComposerLinkDialogEditLink_Day_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.textcomposer_TextComposerLinkDialogEditLink_Night_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.textcomposer_TextComposerReplyNotEncrypted_Day_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.textcomposer_TextComposerReplyNotEncrypted_Day_10_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.textcomposer_TextComposerReplyNotEncrypted_Day_11_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.textcomposer_TextComposerReplyNotEncrypted_Day_1_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.textcomposer_TextComposerReplyNotEncrypted_Day_2_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.textcomposer_TextComposerReplyNotEncrypted_Day_3_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.textcomposer_TextComposerReplyNotEncrypted_Day_4_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.textcomposer_TextComposerReplyNotEncrypted_Day_5_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.textcomposer_TextComposerReplyNotEncrypted_Day_6_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.textcomposer_TextComposerReplyNotEncrypted_Day_7_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.textcomposer_TextComposerReplyNotEncrypted_Day_8_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.textcomposer_TextComposerReplyNotEncrypted_Day_9_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.textcomposer_TextComposerReplyNotEncrypted_Night_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.textcomposer_TextComposerReplyNotEncrypted_Night_10_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.textcomposer_TextComposerReplyNotEncrypted_Night_11_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.textcomposer_TextComposerReplyNotEncrypted_Night_1_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.textcomposer_TextComposerReplyNotEncrypted_Night_2_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.textcomposer_TextComposerReplyNotEncrypted_Night_3_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.textcomposer_TextComposerReplyNotEncrypted_Night_4_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.textcomposer_TextComposerReplyNotEncrypted_Night_5_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.textcomposer_TextComposerReplyNotEncrypted_Night_6_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.textcomposer_TextComposerReplyNotEncrypted_Night_7_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.textcomposer_TextComposerReplyNotEncrypted_Night_8_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.textcomposer_TextComposerReplyNotEncrypted_Night_9_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.textcomposer_TextComposerReply_Day_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.textcomposer_TextComposerReply_Day_10_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.textcomposer_TextComposerReply_Day_11_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.textcomposer_TextComposerReply_Day_1_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.textcomposer_TextComposerReply_Day_2_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.textcomposer_TextComposerReply_Day_3_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.textcomposer_TextComposerReply_Day_4_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.textcomposer_TextComposerReply_Day_5_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.textcomposer_TextComposerReply_Day_6_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.textcomposer_TextComposerReply_Day_7_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.textcomposer_TextComposerReply_Day_8_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.textcomposer_TextComposerReply_Day_9_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.textcomposer_TextComposerReply_Night_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.textcomposer_TextComposerReply_Night_10_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.textcomposer_TextComposerReply_Night_11_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.textcomposer_TextComposerReply_Night_1_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.textcomposer_TextComposerReply_Night_2_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.textcomposer_TextComposerReply_Night_3_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.textcomposer_TextComposerReply_Night_4_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.textcomposer_TextComposerReply_Night_5_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.textcomposer_TextComposerReply_Night_6_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.textcomposer_TextComposerReply_Night_7_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.textcomposer_TextComposerReply_Night_8_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.textcomposer_TextComposerReply_Night_9_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.textcomposer_TextComposerSimpleNotEncrypted_Day_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.textcomposer_TextComposerSimpleNotEncrypted_Night_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.textcomposer_TextComposerSimple_Day_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.textcomposer_TextComposerSimple_Night_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.textcomposer_TextComposerVoiceNotEncrypted_Day_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.textcomposer_TextComposerVoiceNotEncrypted_Night_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.textcomposer_TextComposerVoice_Day_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.textcomposer_TextComposerVoice_Night_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.troubleshoot.impl.history_PushHistoryView_Day_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.troubleshoot.impl.history_PushHistoryView_Day_1_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.troubleshoot.impl.history_PushHistoryView_Day_2_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.troubleshoot.impl.history_PushHistoryView_Day_3_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.troubleshoot.impl.history_PushHistoryView_Night_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.troubleshoot.impl.history_PushHistoryView_Night_1_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.troubleshoot.impl.history_PushHistoryView_Night_2_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.troubleshoot.impl.history_PushHistoryView_Night_3_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.troubleshoot.impl_TroubleshootNotificationsView_Day_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.troubleshoot.impl_TroubleshootNotificationsView_Day_1_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.troubleshoot.impl_TroubleshootNotificationsView_Day_2_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.troubleshoot.impl_TroubleshootNotificationsView_Day_3_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.troubleshoot.impl_TroubleshootNotificationsView_Day_4_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.troubleshoot.impl_TroubleshootNotificationsView_Day_5_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.troubleshoot.impl_TroubleshootNotificationsView_Day_6_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.troubleshoot.impl_TroubleshootNotificationsView_Day_7_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.troubleshoot.impl_TroubleshootNotificationsView_Night_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.troubleshoot.impl_TroubleshootNotificationsView_Night_1_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.troubleshoot.impl_TroubleshootNotificationsView_Night_2_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.troubleshoot.impl_TroubleshootNotificationsView_Night_3_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.troubleshoot.impl_TroubleshootNotificationsView_Night_4_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.troubleshoot.impl_TroubleshootNotificationsView_Night_5_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.troubleshoot.impl_TroubleshootNotificationsView_Night_6_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.troubleshoot.impl_TroubleshootNotificationsView_Night_7_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.ui.common.nodes_EmptyView_Day_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.ui.common.nodes_EmptyView_Night_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/services.apperror.impl_AppErrorView_Day_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/services.apperror.impl_AppErrorView_Night_0_en.png create mode 100755 tools/adb/callLinkCustomScheme.sh create mode 100755 tools/adb/callLinkCustomScheme2.sh create mode 100755 tools/adb/callLinkHttps.sh create mode 100755 tools/adb/deeplink.sh create mode 100755 tools/adb/deeplink_external.sh create mode 100755 tools/adb/deeplink_matrix.sh create mode 100755 tools/adb/deeplink_matrixto.sh create mode 100755 tools/adb/deeplink_mobile.sh create mode 100755 tools/adb/disable_app_standby.sh create mode 100755 tools/adb/disable_doze_mode.sh create mode 100755 tools/adb/disable_talkback.sh create mode 100755 tools/adb/enable_app_standby.sh create mode 100755 tools/adb/enable_doze_mode.sh create mode 100755 tools/adb/enable_talkback.sh create mode 100755 tools/adb/oidc.sh create mode 100755 tools/adb/print_device_state.sh create mode 100755 tools/check/check_code_quality.sh create mode 100755 tools/check/forbidden_strings_in_code.txt create mode 100755 tools/check/forbidden_strings_in_xml.txt create mode 100755 tools/compose/check_stability.sh create mode 100644 tools/compound/addAutoMirrored.py create mode 100755 tools/compound/import_tokens.sh create mode 100644 tools/danger/dangerfile-lint.js create mode 100644 tools/danger/dangerfile.js create mode 100755 tools/dependencies/checkDependencies.py create mode 100644 tools/detekt/detekt.yml create mode 100755 tools/docs/generateModuleGraph.sh create mode 100755 tools/git/validate_lfs.sh create mode 100755 tools/gitflow/gitflow-init.sh create mode 100755 tools/github/download_all_github_artifacts.py create mode 100755 tools/github/download_github_artifacts.py create mode 100644 tools/lint/lint.xml create mode 100644 tools/localazy/README.md create mode 100755 tools/localazy/checkForbiddenTerms.py create mode 100644 tools/localazy/config.json create mode 100755 tools/localazy/downloadStrings.sh create mode 100755 tools/localazy/formatXmlResourcesFile.py create mode 100755 tools/localazy/generateLocalazyConfig.py create mode 100755 tools/localazy/importSupportedLocalesFromLocalazy.py create mode 100755 tools/quality/check.sh create mode 100644 tools/release/ReleaseNotesNightly.md create mode 100644 tools/release/fix-pg-map-id.py create mode 100644 tools/release/inplace-fix.py create mode 100755 tools/release/release.sh create mode 100755 tools/rte/build_rte.sh create mode 100755 tools/sas/import_sas_emojis.py create mode 100755 tools/sas/import_sas_strings.py create mode 100755 tools/sdk/build_rust_sdk.sh create mode 100644 tools/templates/FeatureModule.json create mode 100644 tools/templates/files/IntelliJ IDEA Global Settings create mode 100644 tools/templates/files/fileTemplates/Template Module Feature Build Gradle API.kts create mode 100644 tools/templates/files/fileTemplates/Template Module Feature Build Gradle Impl.kts create mode 100644 tools/templates/files/fileTemplates/Template Module Feature Entry Point API.kt create mode 100644 tools/templates/files/fileTemplates/Template Module Feature Entry Point Flow Impl.kt create mode 100644 tools/templates/files/fileTemplates/Template Module Feature Node Flow Impl.kt create mode 100644 tools/templates/files/fileTemplates/Template Presentation Classes.kt create mode 100644 tools/templates/files/fileTemplates/Template Presentation Classes.kt.child.0.kt create mode 100644 tools/templates/files/fileTemplates/Template Presentation Classes.kt.child.1.kt create mode 100644 tools/templates/files/fileTemplates/Template Presentation Classes.kt.child.2.kt create mode 100644 tools/templates/files/fileTemplates/Template Presentation Classes.kt.child.3.kt create mode 100644 tools/templates/files/fileTemplates/Template Presentation Classes.kt.child.4.kt create mode 100644 tools/templates/files/options/file.template.settings.xml create mode 100755 tools/templates/generate_templates.sh create mode 100755 tools/test/checkInvalidScreenshots.py create mode 100755 tools/test/generateAllScreenshots.py create mode 100755 tools/test/generateWorldScreenshots.py create mode 100644 tools/test/invalid_screenshot.png create mode 100644 tools/test/util.py diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 0000000..d2f2892 --- /dev/null +++ b/.editorconfig @@ -0,0 +1,928 @@ +[*] +charset = utf-8 +end_of_line = lf +indent_size = 4 +indent_style = space +insert_final_newline = true +max_line_length = 160 +tab_width = 4 +ij_continuation_indent_size = 4 +ij_formatter_off_tag = @formatter:off +ij_formatter_on_tag = @formatter:on +ij_formatter_tags_enabled = false +ij_smart_tabs = false +ij_visual_guides = none +ij_wrap_on_typing = false + +# Ktlint rule, for more information see https://pinterest.github.io/ktlint/latest/faq/#how-do-i-enable-or-disable-a-rule +ktlint_standard_wrapping = disabled +ktlint_standard_trailing-comma-on-call-site = disabled +ktlint_standard_trailing-comma-on-declaration-site = disabled +ktlint_standard_multiline-expression-wrapping = disabled +ktlint_standard_string-template-indent = disabled +ktlint_standard_spacing-between-declarations-with-annotations = disabled +ktlint_standard_function-signature = disabled +ktlint_standard_annotation = disabled +ktlint_standard_parameter-list-wrapping = disabled +ktlint_standard_indent = disabled +ktlint_standard_blank-line-before-declaration = disabled +ktlint_function_naming_ignore_when_annotated_with = Composable +# Added when upgrading to 1.7.1 +ktlint_standard_function-expression-body = disabled +ktlint_standard_chain-method-continuation = disabled +ktlint_standard_class-signature = disabled +# Added when upgrading to 1.8.0 +ktlint_standard_when-entry-bracing = disabled +ktlint_standard_blank-line-between-when-conditions = disabled +ktlint_standard_mixed-condition-operators = disabled + +[*.java] +ij_java_align_consecutive_assignments = false +ij_java_align_consecutive_variable_declarations = false +ij_java_align_group_field_declarations = false +ij_java_align_multiline_annotation_parameters = false +ij_java_align_multiline_array_initializer_expression = false +ij_java_align_multiline_assignment = false +ij_java_align_multiline_binary_operation = false +ij_java_align_multiline_chained_methods = false +ij_java_align_multiline_extends_list = false +ij_java_align_multiline_for = true +ij_java_align_multiline_method_parentheses = false +ij_java_align_multiline_parameters = true +ij_java_align_multiline_parameters_in_calls = false +ij_java_align_multiline_parenthesized_expression = false +ij_java_align_multiline_records = true +ij_java_align_multiline_resources = true +ij_java_align_multiline_ternary_operation = false +ij_java_align_multiline_text_blocks = false +ij_java_align_multiline_throws_list = false +ij_java_align_subsequent_simple_methods = false +ij_java_align_throws_keyword = false +ij_java_annotation_parameter_wrap = off +ij_java_array_initializer_new_line_after_left_brace = false +ij_java_array_initializer_right_brace_on_new_line = false +ij_java_array_initializer_wrap = off +ij_java_assert_statement_colon_on_next_line = false +ij_java_assert_statement_wrap = off +ij_java_assignment_wrap = off +ij_java_binary_operation_sign_on_next_line = false +ij_java_binary_operation_wrap = off +ij_java_blank_lines_after_anonymous_class_header = 0 +ij_java_blank_lines_after_class_header = 0 +ij_java_blank_lines_after_imports = 1 +ij_java_blank_lines_after_package = 1 +ij_java_blank_lines_around_class = 1 +ij_java_blank_lines_around_field = 0 +ij_java_blank_lines_around_field_in_interface = 0 +ij_java_blank_lines_around_initializer = 1 +ij_java_blank_lines_around_method = 1 +ij_java_blank_lines_around_method_in_interface = 1 +ij_java_blank_lines_before_class_end = 0 +ij_java_blank_lines_before_imports = 1 +ij_java_blank_lines_before_method_body = 0 +ij_java_blank_lines_before_package = 0 +ij_java_block_brace_style = end_of_line +ij_java_block_comment_at_first_column = true +ij_java_builder_methods = none +ij_java_call_parameters_new_line_after_left_paren = false +ij_java_call_parameters_right_paren_on_new_line = false +ij_java_call_parameters_wrap = off +ij_java_case_statement_on_separate_line = true +ij_java_catch_on_new_line = false +ij_java_class_annotation_wrap = split_into_lines +ij_java_class_brace_style = end_of_line +ij_java_class_count_to_use_import_on_demand = 99 +ij_java_class_names_in_javadoc = 1 +ij_java_do_not_indent_top_level_class_members = false +ij_java_do_not_wrap_after_single_annotation = false +ij_java_do_while_brace_force = never +ij_java_doc_add_blank_line_after_description = true +ij_java_doc_add_blank_line_after_param_comments = false +ij_java_doc_add_blank_line_after_return = false +ij_java_doc_add_p_tag_on_empty_lines = true +ij_java_doc_align_exception_comments = true +ij_java_doc_align_param_comments = true +ij_java_doc_do_not_wrap_if_one_line = false +ij_java_doc_enable_formatting = true +ij_java_doc_enable_leading_asterisks = true +ij_java_doc_indent_on_continuation = false +ij_java_doc_keep_empty_lines = true +ij_java_doc_keep_empty_parameter_tag = true +ij_java_doc_keep_empty_return_tag = true +ij_java_doc_keep_empty_throws_tag = true +ij_java_doc_keep_invalid_tags = true +ij_java_doc_param_description_on_new_line = false +ij_java_doc_preserve_line_breaks = false +ij_java_doc_use_throws_not_exception_tag = true +ij_java_else_on_new_line = false +ij_java_enum_constants_wrap = off +ij_java_extends_keyword_wrap = off +ij_java_extends_list_wrap = off +ij_java_field_annotation_wrap = split_into_lines +ij_java_finally_on_new_line = false +ij_java_for_brace_force = never +ij_java_for_statement_new_line_after_left_paren = false +ij_java_for_statement_right_paren_on_new_line = false +ij_java_for_statement_wrap = off +ij_java_generate_final_locals = false +ij_java_generate_final_parameters = false +ij_java_if_brace_force = never +ij_java_imports_layout = $android.**, $androidx.**, $com.**, $junit.**, $net.**, $org.**, $java.**, $javax.**, $*, |, android.**, |, androidx.**, |, com.**, |, junit.**, |, net.**, |, org.**, |, java.**, |, javax.**, |, *, | +ij_java_indent_case_from_switch = true +ij_java_insert_inner_class_imports = false +ij_java_insert_override_annotation = true +ij_java_keep_blank_lines_before_right_brace = 2 +ij_java_keep_blank_lines_between_package_declaration_and_header = 2 +ij_java_keep_blank_lines_in_code = 2 +ij_java_keep_blank_lines_in_declarations = 2 +ij_java_keep_builder_methods_indents = false +ij_java_keep_control_statement_in_one_line = true +ij_java_keep_first_column_comment = true +ij_java_keep_indents_on_empty_lines = false +ij_java_keep_line_breaks = true +ij_java_keep_multiple_expressions_in_one_line = false +ij_java_keep_simple_blocks_in_one_line = false +ij_java_keep_simple_classes_in_one_line = false +ij_java_keep_simple_lambdas_in_one_line = false +ij_java_keep_simple_methods_in_one_line = false +ij_java_label_indent_absolute = false +ij_java_label_indent_size = 0 +ij_java_lambda_brace_style = end_of_line +ij_java_layout_static_imports_separately = true +ij_java_line_comment_add_space = false +ij_java_line_comment_at_first_column = true +ij_java_method_annotation_wrap = split_into_lines +ij_java_method_brace_style = end_of_line +ij_java_method_call_chain_wrap = off +ij_java_method_parameters_new_line_after_left_paren = false +ij_java_method_parameters_right_paren_on_new_line = false +ij_java_method_parameters_wrap = off +ij_java_modifier_list_wrap = false +ij_java_names_count_to_use_import_on_demand = 99 +ij_java_new_line_after_lparen_in_record_header = false +ij_java_parameter_annotation_wrap = off +ij_java_parentheses_expression_new_line_after_left_paren = false +ij_java_parentheses_expression_right_paren_on_new_line = false +ij_java_place_assignment_sign_on_next_line = false +ij_java_prefer_longer_names = true +ij_java_prefer_parameters_wrap = false +ij_java_record_components_wrap = normal +ij_java_repeat_synchronized = true +ij_java_replace_instanceof_and_cast = false +ij_java_replace_null_check = true +ij_java_replace_sum_lambda_with_method_ref = true +ij_java_resource_list_new_line_after_left_paren = false +ij_java_resource_list_right_paren_on_new_line = false +ij_java_resource_list_wrap = off +ij_java_rparen_on_new_line_in_record_header = false +ij_java_space_after_closing_angle_bracket_in_type_argument = false +ij_java_space_after_colon = true +ij_java_space_after_comma = true +ij_java_space_after_comma_in_type_arguments = true +ij_java_space_after_for_semicolon = true +ij_java_space_after_quest = true +ij_java_space_after_type_cast = true +ij_java_space_before_annotation_array_initializer_left_brace = false +ij_java_space_before_annotation_parameter_list = false +ij_java_space_before_array_initializer_left_brace = false +ij_java_space_before_catch_keyword = true +ij_java_space_before_catch_left_brace = true +ij_java_space_before_catch_parentheses = true +ij_java_space_before_class_left_brace = true +ij_java_space_before_colon = true +ij_java_space_before_colon_in_foreach = true +ij_java_space_before_comma = false +ij_java_space_before_do_left_brace = true +ij_java_space_before_else_keyword = true +ij_java_space_before_else_left_brace = true +ij_java_space_before_finally_keyword = true +ij_java_space_before_finally_left_brace = true +ij_java_space_before_for_left_brace = true +ij_java_space_before_for_parentheses = true +ij_java_space_before_for_semicolon = false +ij_java_space_before_if_left_brace = true +ij_java_space_before_if_parentheses = true +ij_java_space_before_method_call_parentheses = false +ij_java_space_before_method_left_brace = true +ij_java_space_before_method_parentheses = false +ij_java_space_before_opening_angle_bracket_in_type_parameter = false +ij_java_space_before_quest = true +ij_java_space_before_switch_left_brace = true +ij_java_space_before_switch_parentheses = true +ij_java_space_before_synchronized_left_brace = true +ij_java_space_before_synchronized_parentheses = true +ij_java_space_before_try_left_brace = true +ij_java_space_before_try_parentheses = true +ij_java_space_before_type_parameter_list = false +ij_java_space_before_while_keyword = true +ij_java_space_before_while_left_brace = true +ij_java_space_before_while_parentheses = true +ij_java_space_inside_one_line_enum_braces = false +ij_java_space_within_empty_array_initializer_braces = false +ij_java_space_within_empty_method_call_parentheses = false +ij_java_space_within_empty_method_parentheses = false +ij_java_spaces_around_additive_operators = true +ij_java_spaces_around_assignment_operators = true +ij_java_spaces_around_bitwise_operators = true +ij_java_spaces_around_equality_operators = true +ij_java_spaces_around_lambda_arrow = true +ij_java_spaces_around_logical_operators = true +ij_java_spaces_around_method_ref_dbl_colon = false +ij_java_spaces_around_multiplicative_operators = true +ij_java_spaces_around_relational_operators = true +ij_java_spaces_around_shift_operators = true +ij_java_spaces_around_type_bounds_in_type_parameters = true +ij_java_spaces_around_unary_operator = false +ij_java_spaces_within_angle_brackets = false +ij_java_spaces_within_annotation_parentheses = false +ij_java_spaces_within_array_initializer_braces = false +ij_java_spaces_within_braces = false +ij_java_spaces_within_brackets = false +ij_java_spaces_within_cast_parentheses = false +ij_java_spaces_within_catch_parentheses = false +ij_java_spaces_within_for_parentheses = false +ij_java_spaces_within_if_parentheses = false +ij_java_spaces_within_method_call_parentheses = false +ij_java_spaces_within_method_parentheses = false +ij_java_spaces_within_parentheses = false +ij_java_spaces_within_record_header = false +ij_java_spaces_within_switch_parentheses = false +ij_java_spaces_within_synchronized_parentheses = false +ij_java_spaces_within_try_parentheses = false +ij_java_spaces_within_while_parentheses = false +ij_java_special_else_if_treatment = true +ij_java_subclass_name_suffix = Impl +ij_java_ternary_operation_signs_on_next_line = false +ij_java_ternary_operation_wrap = off +ij_java_test_name_suffix = Test +ij_java_throws_keyword_wrap = off +ij_java_throws_list_wrap = off +ij_java_use_external_annotations = false +ij_java_use_fq_class_names = false +ij_java_use_relative_indents = false +ij_java_use_single_class_imports = true +ij_java_variable_annotation_wrap = off +ij_java_visibility = public +ij_java_while_brace_force = never +ij_java_while_on_new_line = false +ij_java_wrap_comments = false +ij_java_wrap_first_method_in_call_chain = false +ij_java_wrap_long_lines = false + +[*.properties] +ij_properties_align_group_field_declarations = false +ij_properties_keep_blank_lines = false +ij_properties_key_value_delimiter = equals +ij_properties_spaces_around_key_value_delimiter = false + +[.editorconfig] +ij_editorconfig_align_group_field_declarations = false +ij_editorconfig_space_after_colon = false +ij_editorconfig_space_after_comma = true +ij_editorconfig_space_before_colon = false +ij_editorconfig_space_before_comma = false +ij_editorconfig_spaces_around_assignment_operators = true + +[{*.ant,*.fxml,*.jhm,*.jnlp,*.jrxml,*.rng,*.tld,*.wsdl,*.xml,*.xsd,*.xsl,*.xslt,*.xul}] +ij_continuation_indent_size = 4 +ij_xml_align_attributes = false +ij_xml_align_text = false +ij_xml_attribute_wrap = normal +ij_xml_block_comment_at_first_column = true +ij_xml_keep_blank_lines = 2 +ij_xml_keep_indents_on_empty_lines = false +ij_xml_keep_line_breaks = false +ij_xml_keep_line_breaks_in_text = true +ij_xml_keep_whitespaces = false +ij_xml_keep_whitespaces_around_cdata = preserve +ij_xml_keep_whitespaces_inside_cdata = false +ij_xml_line_comment_at_first_column = true +ij_xml_space_after_tag_name = false +ij_xml_space_around_equals_in_attribute = false +ij_xml_space_inside_empty_tag = true +ij_xml_text_wrap = normal +ij_xml_use_custom_settings = true + +[{*.bash,*.sh,*.zsh}] +indent_size = 2 +tab_width = 2 +ij_shell_binary_ops_start_line = false +ij_shell_keep_column_alignment_padding = false +ij_shell_minify_program = false +ij_shell_redirect_followed_by_space = false +ij_shell_switch_cases_indented = false +ij_shell_use_unix_line_separator = true + +[{*.c,*.c++,*.cc,*.cp,*.cpp,*.cu,*.cuh,*.cxx,*.h,*.h++,*.hh,*.hp,*.hpp,*.hxx,*.i,*.icc,*.ii,*.inl,*.ino,*.ipp,*.m,*.mm,*.pch,*.tcc,*.tpp}] +ij_c_add_brief_tag = false +ij_c_add_getter_prefix = true +ij_c_add_setter_prefix = true +ij_c_align_dictionary_pair_values = false +ij_c_align_group_field_declarations = false +ij_c_align_init_list_in_columns = true +ij_c_align_multiline_array_initializer_expression = true +ij_c_align_multiline_assignment = true +ij_c_align_multiline_binary_operation = true +ij_c_align_multiline_chained_methods = false +ij_c_align_multiline_for = true +ij_c_align_multiline_ternary_operation = true +ij_c_array_initializer_comma_on_next_line = false +ij_c_array_initializer_new_line_after_left_brace = false +ij_c_array_initializer_right_brace_on_new_line = false +ij_c_array_initializer_wrap = normal +ij_c_assignment_wrap = off +ij_c_binary_operation_sign_on_next_line = false +ij_c_binary_operation_wrap = normal +ij_c_blank_lines_after_class_header = 0 +ij_c_blank_lines_after_imports = 1 +ij_c_blank_lines_around_class = 1 +ij_c_blank_lines_around_field = 0 +ij_c_blank_lines_around_field_in_interface = 0 +ij_c_blank_lines_around_method = 1 +ij_c_blank_lines_around_method_in_interface = 1 +ij_c_blank_lines_around_namespace = 0 +ij_c_blank_lines_around_properties_in_declaration = 0 +ij_c_blank_lines_around_properties_in_interface = 0 +ij_c_blank_lines_before_imports = 1 +ij_c_blank_lines_before_method_body = 0 +ij_c_block_brace_placement = end_of_line +ij_c_block_brace_style = end_of_line +ij_c_block_comment_at_first_column = true +ij_c_catch_on_new_line = false +ij_c_class_brace_style = end_of_line +ij_c_class_constructor_init_list_align_multiline = true +ij_c_class_constructor_init_list_comma_on_next_line = false +ij_c_class_constructor_init_list_new_line_after_colon = never +ij_c_class_constructor_init_list_new_line_before_colon = if_long +ij_c_class_constructor_init_list_wrap = normal +ij_c_copy_is_deep = false +ij_c_create_interface_for_categories = true +ij_c_declare_generated_methods = true +ij_c_description_include_member_names = true +ij_c_discharged_short_ternary_operator = false +ij_c_do_not_add_breaks = false +ij_c_do_while_brace_force = never +ij_c_else_on_new_line = false +ij_c_enum_constants_comma_on_next_line = false +ij_c_enum_constants_wrap = on_every_item +ij_c_for_brace_force = never +ij_c_for_statement_new_line_after_left_paren = false +ij_c_for_statement_right_paren_on_new_line = false +ij_c_for_statement_wrap = off +ij_c_function_brace_placement = end_of_line +ij_c_function_call_arguments_align_multiline = true +ij_c_function_call_arguments_align_multiline_pars = false +ij_c_function_call_arguments_comma_on_next_line = false +ij_c_function_call_arguments_new_line_after_lpar = false +ij_c_function_call_arguments_new_line_before_rpar = false +ij_c_function_call_arguments_wrap = normal +ij_c_function_non_top_after_return_type_wrap = normal +ij_c_function_parameters_align_multiline = true +ij_c_function_parameters_align_multiline_pars = false +ij_c_function_parameters_comma_on_next_line = false +ij_c_function_parameters_new_line_after_lpar = false +ij_c_function_parameters_new_line_before_rpar = false +ij_c_function_parameters_wrap = normal +ij_c_function_top_after_return_type_wrap = normal +ij_c_generate_additional_eq_operators = true +ij_c_generate_additional_rel_operators = true +ij_c_generate_class_constructor = true +ij_c_generate_comparison_operators_use_std_tie = false +ij_c_generate_instance_variables_for_properties = ask +ij_c_generate_operators_as_members = true +ij_c_header_guard_style_pattern = ${PROJECT_NAME}_${FILE_NAME}_${EXT} +ij_c_if_brace_force = never +ij_c_in_line_short_ternary_operator = true +ij_c_indent_block_comment = true +ij_c_indent_c_struct_members = 4 +ij_c_indent_case_from_switch = true +ij_c_indent_class_members = 4 +ij_c_indent_directive_as_code = false +ij_c_indent_implementation_members = 0 +ij_c_indent_inside_code_block = 4 +ij_c_indent_interface_members = 0 +ij_c_indent_interface_members_except_ivars_block = false +ij_c_indent_namespace_members = 4 +ij_c_indent_preprocessor_directive = 0 +ij_c_indent_visibility_keywords = 0 +ij_c_insert_override = true +ij_c_insert_virtual_with_override = false +ij_c_introduce_auto_vars = false +ij_c_introduce_const_params = false +ij_c_introduce_const_vars = false +ij_c_introduce_generate_property = false +ij_c_introduce_generate_synthesize = true +ij_c_introduce_globals_to_header = true +ij_c_introduce_prop_to_private_category = false +ij_c_introduce_static_consts = true +ij_c_introduce_use_ns_types = false +ij_c_ivars_prefix = _ +ij_c_keep_blank_lines_before_end = 2 +ij_c_keep_blank_lines_before_right_brace = 2 +ij_c_keep_blank_lines_in_code = 2 +ij_c_keep_blank_lines_in_declarations = 2 +ij_c_keep_case_expressions_in_one_line = false +ij_c_keep_control_statement_in_one_line = true +ij_c_keep_directive_at_first_column = true +ij_c_keep_first_column_comment = true +ij_c_keep_line_breaks = true +ij_c_keep_nested_namespaces_in_one_line = false +ij_c_keep_simple_blocks_in_one_line = true +ij_c_keep_simple_methods_in_one_line = true +ij_c_keep_structures_in_one_line = false +ij_c_lambda_capture_list_align_multiline = false +ij_c_lambda_capture_list_align_multiline_bracket = false +ij_c_lambda_capture_list_comma_on_next_line = false +ij_c_lambda_capture_list_new_line_after_lbracket = false +ij_c_lambda_capture_list_new_line_before_rbracket = false +ij_c_lambda_capture_list_wrap = off +ij_c_line_comment_add_space = false +ij_c_line_comment_at_first_column = true +ij_c_method_brace_placement = end_of_line +ij_c_method_call_arguments_align_by_colons = true +ij_c_method_call_arguments_align_multiline = false +ij_c_method_call_arguments_special_dictionary_pairs_treatment = true +ij_c_method_call_arguments_wrap = off +ij_c_method_call_chain_wrap = off +ij_c_method_parameters_align_by_colons = true +ij_c_method_parameters_align_multiline = false +ij_c_method_parameters_wrap = off +ij_c_namespace_brace_placement = end_of_line +ij_c_parentheses_expression_new_line_after_left_paren = false +ij_c_parentheses_expression_right_paren_on_new_line = false +ij_c_place_assignment_sign_on_next_line = false +ij_c_property_nonatomic = true +ij_c_put_ivars_to_implementation = true +ij_c_refactor_compatibility_aliases_and_classes = true +ij_c_refactor_properties_and_ivars = true +ij_c_release_style = ivar +ij_c_retain_object_parameters_in_constructor = true +ij_c_semicolon_after_method_signature = false +ij_c_shift_operation_align_multiline = true +ij_c_shift_operation_wrap = normal +ij_c_show_non_virtual_functions = false +ij_c_space_after_colon = true +ij_c_space_after_colon_in_selector = false +ij_c_space_after_comma = true +ij_c_space_after_cup_in_blocks = false +ij_c_space_after_dictionary_literal_colon = true +ij_c_space_after_for_semicolon = true +ij_c_space_after_init_list_colon = true +ij_c_space_after_method_parameter_type_parentheses = false +ij_c_space_after_method_return_type_parentheses = false +ij_c_space_after_pointer_in_declaration = false +ij_c_space_after_quest = true +ij_c_space_after_reference_in_declaration = false +ij_c_space_after_reference_in_rvalue = false +ij_c_space_after_structures_rbrace = true +ij_c_space_after_superclass_colon = true +ij_c_space_after_type_cast = true +ij_c_space_after_visibility_sign_in_method_declaration = true +ij_c_space_before_autorelease_pool_lbrace = true +ij_c_space_before_catch_keyword = true +ij_c_space_before_catch_left_brace = true +ij_c_space_before_catch_parentheses = true +ij_c_space_before_category_parentheses = true +ij_c_space_before_chained_send_message = true +ij_c_space_before_class_left_brace = true +ij_c_space_before_colon = true +ij_c_space_before_comma = false +ij_c_space_before_dictionary_literal_colon = false +ij_c_space_before_do_left_brace = true +ij_c_space_before_else_keyword = true +ij_c_space_before_else_left_brace = true +ij_c_space_before_for_left_brace = true +ij_c_space_before_for_parentheses = true +ij_c_space_before_for_semicolon = false +ij_c_space_before_if_left_brace = true +ij_c_space_before_if_parentheses = true +ij_c_space_before_init_list = false +ij_c_space_before_init_list_colon = true +ij_c_space_before_method_call_parentheses = false +ij_c_space_before_method_left_brace = true +ij_c_space_before_method_parentheses = false +ij_c_space_before_namespace_lbrace = true +ij_c_space_before_pointer_in_declaration = true +ij_c_space_before_property_attributes_parentheses = false +ij_c_space_before_protocols_brackets = true +ij_c_space_before_quest = true +ij_c_space_before_reference_in_declaration = true +ij_c_space_before_superclass_colon = true +ij_c_space_before_switch_left_brace = true +ij_c_space_before_switch_parentheses = true +ij_c_space_before_template_call_lt = false +ij_c_space_before_template_declaration_lt = false +ij_c_space_before_try_left_brace = true +ij_c_space_before_while_keyword = true +ij_c_space_before_while_left_brace = true +ij_c_space_before_while_parentheses = true +ij_c_space_between_adjacent_brackets = false +ij_c_space_between_operator_and_punctuator = false +ij_c_space_within_empty_array_initializer_braces = false +ij_c_spaces_around_additive_operators = true +ij_c_spaces_around_assignment_operators = true +ij_c_spaces_around_bitwise_operators = true +ij_c_spaces_around_equality_operators = true +ij_c_spaces_around_lambda_arrow = true +ij_c_spaces_around_logical_operators = true +ij_c_spaces_around_multiplicative_operators = true +ij_c_spaces_around_pm_operators = false +ij_c_spaces_around_relational_operators = true +ij_c_spaces_around_shift_operators = true +ij_c_spaces_around_unary_operator = false +ij_c_spaces_within_array_initializer_braces = false +ij_c_spaces_within_braces = true +ij_c_spaces_within_brackets = false +ij_c_spaces_within_cast_parentheses = false +ij_c_spaces_within_catch_parentheses = false +ij_c_spaces_within_category_parentheses = false +ij_c_spaces_within_empty_braces = false +ij_c_spaces_within_empty_function_call_parentheses = false +ij_c_spaces_within_empty_function_declaration_parentheses = false +ij_c_spaces_within_empty_lambda_capture_list_bracket = false +ij_c_spaces_within_empty_template_call_ltgt = false +ij_c_spaces_within_empty_template_declaration_ltgt = false +ij_c_spaces_within_for_parentheses = false +ij_c_spaces_within_function_call_parentheses = false +ij_c_spaces_within_function_declaration_parentheses = false +ij_c_spaces_within_if_parentheses = false +ij_c_spaces_within_lambda_capture_list_bracket = false +ij_c_spaces_within_method_parameter_type_parentheses = false +ij_c_spaces_within_method_return_type_parentheses = false +ij_c_spaces_within_parentheses = false +ij_c_spaces_within_property_attributes_parentheses = false +ij_c_spaces_within_protocols_brackets = false +ij_c_spaces_within_send_message_brackets = false +ij_c_spaces_within_switch_parentheses = false +ij_c_spaces_within_template_call_ltgt = false +ij_c_spaces_within_template_declaration_ltgt = false +ij_c_spaces_within_template_double_gt = true +ij_c_spaces_within_while_parentheses = false +ij_c_special_else_if_treatment = true +ij_c_superclass_list_after_colon = never +ij_c_superclass_list_align_multiline = true +ij_c_superclass_list_before_colon = if_long +ij_c_superclass_list_comma_on_next_line = false +ij_c_superclass_list_wrap = on_every_item +ij_c_tag_prefix_of_block_comment = at +ij_c_tag_prefix_of_line_comment = back_slash +ij_c_template_call_arguments_align_multiline = false +ij_c_template_call_arguments_align_multiline_pars = false +ij_c_template_call_arguments_comma_on_next_line = false +ij_c_template_call_arguments_new_line_after_lt = false +ij_c_template_call_arguments_new_line_before_gt = false +ij_c_template_call_arguments_wrap = off +ij_c_template_declaration_function_body_indent = false +ij_c_template_declaration_function_wrap = split_into_lines +ij_c_template_declaration_struct_body_indent = false +ij_c_template_declaration_struct_wrap = split_into_lines +ij_c_template_parameters_align_multiline = false +ij_c_template_parameters_align_multiline_pars = false +ij_c_template_parameters_comma_on_next_line = false +ij_c_template_parameters_new_line_after_lt = false +ij_c_template_parameters_new_line_before_gt = false +ij_c_template_parameters_wrap = off +ij_c_ternary_operation_signs_on_next_line = true +ij_c_ternary_operation_wrap = normal +ij_c_type_qualifiers_placement = before +ij_c_use_modern_casts = true +ij_c_use_setters_in_constructor = true +ij_c_while_brace_force = never +ij_c_while_on_new_line = false +ij_c_wrap_property_declaration = off + +[{*.cmake,CMakeLists.txt}] +ij_cmake_align_multiline_parameters_in_calls = false +ij_cmake_force_commands_case = 2 +ij_cmake_keep_blank_lines_in_code = 2 +ij_cmake_space_before_for_parentheses = true +ij_cmake_space_before_if_parentheses = true +ij_cmake_space_before_method_call_parentheses = false +ij_cmake_space_before_method_parentheses = false +ij_cmake_space_before_while_parentheses = true +ij_cmake_spaces_within_for_parentheses = false +ij_cmake_spaces_within_if_parentheses = false +ij_cmake_spaces_within_method_call_parentheses = false +ij_cmake_spaces_within_method_parentheses = false +ij_cmake_spaces_within_while_parentheses = false + +[{*.gant,*.gradle,*.groovy,*.gy}] +ij_groovy_align_group_field_declarations = false +ij_groovy_align_multiline_array_initializer_expression = false +ij_groovy_align_multiline_assignment = false +ij_groovy_align_multiline_binary_operation = false +ij_groovy_align_multiline_chained_methods = false +ij_groovy_align_multiline_extends_list = false +ij_groovy_align_multiline_for = true +ij_groovy_align_multiline_list_or_map = true +ij_groovy_align_multiline_method_parentheses = false +ij_groovy_align_multiline_parameters = true +ij_groovy_align_multiline_parameters_in_calls = false +ij_groovy_align_multiline_resources = true +ij_groovy_align_multiline_ternary_operation = false +ij_groovy_align_multiline_throws_list = false +ij_groovy_align_named_args_in_map = true +ij_groovy_align_throws_keyword = false +ij_groovy_array_initializer_new_line_after_left_brace = false +ij_groovy_array_initializer_right_brace_on_new_line = false +ij_groovy_array_initializer_wrap = off +ij_groovy_assert_statement_wrap = off +ij_groovy_assignment_wrap = off +ij_groovy_binary_operation_wrap = off +ij_groovy_blank_lines_after_class_header = 0 +ij_groovy_blank_lines_after_imports = 1 +ij_groovy_blank_lines_after_package = 1 +ij_groovy_blank_lines_around_class = 1 +ij_groovy_blank_lines_around_field = 0 +ij_groovy_blank_lines_around_field_in_interface = 0 +ij_groovy_blank_lines_around_method = 1 +ij_groovy_blank_lines_around_method_in_interface = 1 +ij_groovy_blank_lines_before_imports = 1 +ij_groovy_blank_lines_before_method_body = 0 +ij_groovy_blank_lines_before_package = 0 +ij_groovy_block_brace_style = end_of_line +ij_groovy_block_comment_at_first_column = true +ij_groovy_call_parameters_new_line_after_left_paren = false +ij_groovy_call_parameters_right_paren_on_new_line = false +ij_groovy_call_parameters_wrap = off +ij_groovy_catch_on_new_line = false +ij_groovy_class_annotation_wrap = split_into_lines +ij_groovy_class_brace_style = end_of_line +ij_groovy_class_count_to_use_import_on_demand = 5 +ij_groovy_do_while_brace_force = never +ij_groovy_else_on_new_line = false +ij_groovy_enum_constants_wrap = off +ij_groovy_extends_keyword_wrap = off +ij_groovy_extends_list_wrap = off +ij_groovy_field_annotation_wrap = split_into_lines +ij_groovy_finally_on_new_line = false +ij_groovy_for_brace_force = never +ij_groovy_for_statement_new_line_after_left_paren = false +ij_groovy_for_statement_right_paren_on_new_line = false +ij_groovy_for_statement_wrap = off +ij_groovy_if_brace_force = never +ij_groovy_import_annotation_wrap = 2 +ij_groovy_imports_layout = *, |, javax.**, java.**, |, $* +ij_groovy_indent_case_from_switch = true +ij_groovy_indent_label_blocks = true +ij_groovy_insert_inner_class_imports = false +ij_groovy_keep_blank_lines_before_right_brace = 2 +ij_groovy_keep_blank_lines_in_code = 2 +ij_groovy_keep_blank_lines_in_declarations = 2 +ij_groovy_keep_control_statement_in_one_line = true +ij_groovy_keep_first_column_comment = true +ij_groovy_keep_indents_on_empty_lines = false +ij_groovy_keep_line_breaks = true +ij_groovy_keep_multiple_expressions_in_one_line = false +ij_groovy_keep_simple_blocks_in_one_line = false +ij_groovy_keep_simple_classes_in_one_line = true +ij_groovy_keep_simple_lambdas_in_one_line = true +ij_groovy_keep_simple_methods_in_one_line = true +ij_groovy_label_indent_absolute = false +ij_groovy_label_indent_size = 0 +ij_groovy_lambda_brace_style = end_of_line +ij_groovy_layout_static_imports_separately = true +ij_groovy_line_comment_add_space = false +ij_groovy_line_comment_at_first_column = true +ij_groovy_method_annotation_wrap = split_into_lines +ij_groovy_method_brace_style = end_of_line +ij_groovy_method_call_chain_wrap = off +ij_groovy_method_parameters_new_line_after_left_paren = false +ij_groovy_method_parameters_right_paren_on_new_line = false +ij_groovy_method_parameters_wrap = off +ij_groovy_modifier_list_wrap = false +ij_groovy_names_count_to_use_import_on_demand = 3 +ij_groovy_parameter_annotation_wrap = off +ij_groovy_parentheses_expression_new_line_after_left_paren = false +ij_groovy_parentheses_expression_right_paren_on_new_line = false +ij_groovy_prefer_parameters_wrap = false +ij_groovy_resource_list_new_line_after_left_paren = false +ij_groovy_resource_list_right_paren_on_new_line = false +ij_groovy_resource_list_wrap = off +ij_groovy_space_after_assert_separator = true +ij_groovy_space_after_colon = true +ij_groovy_space_after_comma = true +ij_groovy_space_after_comma_in_type_arguments = true +ij_groovy_space_after_for_semicolon = true +ij_groovy_space_after_quest = true +ij_groovy_space_after_type_cast = true +ij_groovy_space_before_annotation_parameter_list = false +ij_groovy_space_before_array_initializer_left_brace = false +ij_groovy_space_before_assert_separator = false +ij_groovy_space_before_catch_keyword = true +ij_groovy_space_before_catch_left_brace = true +ij_groovy_space_before_catch_parentheses = true +ij_groovy_space_before_class_left_brace = true +ij_groovy_space_before_closure_left_brace = true +ij_groovy_space_before_colon = true +ij_groovy_space_before_comma = false +ij_groovy_space_before_do_left_brace = true +ij_groovy_space_before_else_keyword = true +ij_groovy_space_before_else_left_brace = true +ij_groovy_space_before_finally_keyword = true +ij_groovy_space_before_finally_left_brace = true +ij_groovy_space_before_for_left_brace = true +ij_groovy_space_before_for_parentheses = true +ij_groovy_space_before_for_semicolon = false +ij_groovy_space_before_if_left_brace = true +ij_groovy_space_before_if_parentheses = true +ij_groovy_space_before_method_call_parentheses = false +ij_groovy_space_before_method_left_brace = true +ij_groovy_space_before_method_parentheses = false +ij_groovy_space_before_quest = true +ij_groovy_space_before_switch_left_brace = true +ij_groovy_space_before_switch_parentheses = true +ij_groovy_space_before_synchronized_left_brace = true +ij_groovy_space_before_synchronized_parentheses = true +ij_groovy_space_before_try_left_brace = true +ij_groovy_space_before_try_parentheses = true +ij_groovy_space_before_while_keyword = true +ij_groovy_space_before_while_left_brace = true +ij_groovy_space_before_while_parentheses = true +ij_groovy_space_in_named_argument = true +ij_groovy_space_in_named_argument_before_colon = false +ij_groovy_space_within_empty_array_initializer_braces = false +ij_groovy_space_within_empty_method_call_parentheses = false +ij_groovy_spaces_around_additive_operators = true +ij_groovy_spaces_around_assignment_operators = true +ij_groovy_spaces_around_bitwise_operators = true +ij_groovy_spaces_around_equality_operators = true +ij_groovy_spaces_around_lambda_arrow = true +ij_groovy_spaces_around_logical_operators = true +ij_groovy_spaces_around_multiplicative_operators = true +ij_groovy_spaces_around_regex_operators = true +ij_groovy_spaces_around_relational_operators = true +ij_groovy_spaces_around_shift_operators = true +ij_groovy_spaces_within_annotation_parentheses = false +ij_groovy_spaces_within_array_initializer_braces = false +ij_groovy_spaces_within_braces = true +ij_groovy_spaces_within_brackets = false +ij_groovy_spaces_within_cast_parentheses = false +ij_groovy_spaces_within_catch_parentheses = false +ij_groovy_spaces_within_for_parentheses = false +ij_groovy_spaces_within_gstring_injection_braces = false +ij_groovy_spaces_within_if_parentheses = false +ij_groovy_spaces_within_list_or_map = false +ij_groovy_spaces_within_method_call_parentheses = false +ij_groovy_spaces_within_method_parentheses = false +ij_groovy_spaces_within_parentheses = false +ij_groovy_spaces_within_switch_parentheses = false +ij_groovy_spaces_within_synchronized_parentheses = false +ij_groovy_spaces_within_try_parentheses = false +ij_groovy_spaces_within_tuple_expression = false +ij_groovy_spaces_within_while_parentheses = false +ij_groovy_special_else_if_treatment = true +ij_groovy_ternary_operation_wrap = off +ij_groovy_throws_keyword_wrap = off +ij_groovy_throws_list_wrap = off +ij_groovy_use_flying_geese_braces = false +ij_groovy_use_fq_class_names = false +ij_groovy_use_fq_class_names_in_javadoc = true +ij_groovy_use_relative_indents = false +ij_groovy_use_single_class_imports = true +ij_groovy_variable_annotation_wrap = off +ij_groovy_while_brace_force = never +ij_groovy_while_on_new_line = false +ij_groovy_wrap_long_lines = false + +[{*.gradle.kts,*.kt,*.kts,*.main.kts}] +ij_kotlin_align_in_columns_case_branch = false +ij_kotlin_align_multiline_binary_operation = false +ij_kotlin_align_multiline_extends_list = false +ij_kotlin_align_multiline_method_parentheses = false +ij_kotlin_align_multiline_parameters = true +ij_kotlin_align_multiline_parameters_in_calls = false +ij_kotlin_allow_trailing_comma = true +ij_kotlin_allow_trailing_comma_on_call_site = false +ij_kotlin_assignment_wrap = off +ij_kotlin_blank_lines_after_class_header = 0 +ij_kotlin_blank_lines_around_block_when_branches = 0 +ij_kotlin_blank_lines_before_declaration_with_comment_or_annotation_on_separate_line = 1 +ij_kotlin_block_comment_at_first_column = true +ij_kotlin_call_parameters_new_line_after_left_paren = false +ij_kotlin_call_parameters_right_paren_on_new_line = false +ij_kotlin_call_parameters_wrap = off +ij_kotlin_catch_on_new_line = false +ij_kotlin_class_annotation_wrap = off +ij_kotlin_code_style_defaults = KOTLIN_OFFICIAL +ij_kotlin_continuation_indent_for_chained_calls = true +ij_kotlin_continuation_indent_for_expression_bodies = true +ij_kotlin_continuation_indent_in_argument_lists = true +ij_kotlin_continuation_indent_in_elvis = true +ij_kotlin_continuation_indent_in_if_conditions = true +ij_kotlin_continuation_indent_in_parameter_lists = true +ij_kotlin_continuation_indent_in_supertype_lists = true +ij_kotlin_else_on_new_line = false +ij_kotlin_enum_constants_wrap = off +ij_kotlin_extends_list_wrap = off +ij_kotlin_field_annotation_wrap = normal +ij_kotlin_finally_on_new_line = false +ij_kotlin_if_rparen_on_new_line = false +ij_kotlin_import_nested_classes = false +ij_kotlin_imports_layout = *, java.**, javax.**, kotlin.**, ^ +ij_kotlin_insert_whitespaces_in_simple_one_line_method = true +ij_kotlin_keep_blank_lines_before_right_brace = 0 +ij_kotlin_keep_blank_lines_in_code = 1 +ij_kotlin_keep_blank_lines_in_declarations = 1 +ij_kotlin_keep_first_column_comment = true +ij_kotlin_keep_indents_on_empty_lines = false +ij_kotlin_keep_line_breaks = true +ij_kotlin_lbrace_on_next_line = false +ij_kotlin_line_comment_add_space = false +ij_kotlin_line_comment_at_first_column = true +ij_kotlin_method_annotation_wrap = split_into_lines +ij_kotlin_method_call_chain_wrap = off +ij_kotlin_method_parameters_new_line_after_left_paren = true +ij_kotlin_method_parameters_right_paren_on_new_line = true +ij_kotlin_method_parameters_wrap = off +ij_kotlin_name_count_to_use_star_import = 2147483647 +ij_kotlin_name_count_to_use_star_import_for_members = 2147483647 +ij_kotlin_packages_to_use_import_on_demand = kotlinx.android.synthetic.** +ij_kotlin_parameter_annotation_wrap = off +ij_kotlin_space_after_comma = true +ij_kotlin_space_after_extend_colon = true +ij_kotlin_space_after_type_colon = true +ij_kotlin_space_before_catch_parentheses = true +ij_kotlin_space_before_comma = false +ij_kotlin_space_before_extend_colon = true +ij_kotlin_space_before_for_parentheses = true +ij_kotlin_space_before_if_parentheses = true +ij_kotlin_space_before_lambda_arrow = true +ij_kotlin_space_before_type_colon = false +ij_kotlin_space_before_when_parentheses = true +ij_kotlin_space_before_while_parentheses = true +ij_kotlin_spaces_around_additive_operators = true +ij_kotlin_spaces_around_assignment_operators = true +ij_kotlin_spaces_around_equality_operators = true +ij_kotlin_spaces_around_function_type_arrow = true +ij_kotlin_spaces_around_logical_operators = true +ij_kotlin_spaces_around_multiplicative_operators = true +ij_kotlin_spaces_around_range = false +ij_kotlin_spaces_around_relational_operators = true +ij_kotlin_spaces_around_unary_operator = false +ij_kotlin_spaces_around_when_arrow = true +ij_kotlin_use_custom_formatting_for_modifiers = true +ij_kotlin_variable_annotation_wrap = off +ij_kotlin_while_on_new_line = false +ij_kotlin_wrap_elvis_expressions = 1 +ij_kotlin_wrap_expression_body_functions = 0 +ij_kotlin_wrap_first_method_in_call_chain = false + +[{*.har,*.json}] +indent_size = 2 +ij_json_keep_blank_lines_in_code = 0 +ij_json_keep_indents_on_empty_lines = false +ij_json_keep_line_breaks = true +ij_json_space_after_colon = true +ij_json_space_after_comma = true +ij_json_space_before_colon = true +ij_json_space_before_comma = false +ij_json_spaces_within_braces = false +ij_json_spaces_within_brackets = false +ij_json_wrap_long_lines = false + +[{*.htm,*.html,*.sht,*.shtm,*.shtml}] +ij_html_add_new_line_before_tags = body, div, p, form, h1, h2, h3 +ij_html_align_attributes = true +ij_html_align_text = false +ij_html_attribute_wrap = normal +ij_html_block_comment_at_first_column = true +ij_html_do_not_align_children_of_min_lines = 0 +ij_html_do_not_break_if_inline_tags = title, h1, h2, h3, h4, h5, h6, p +ij_html_do_not_indent_children_of_tags = html, body, thead, tbody, tfoot +ij_html_enforce_quotes = false +ij_html_inline_tags = a, abbr, acronym, b, basefont, bdo, big, br, cite, cite, code, dfn, em, font, i, img, input, kbd, label, q, s, samp, select, small, span, strike, strong, sub, sup, textarea, tt, u, var +ij_html_keep_blank_lines = 2 +ij_html_keep_indents_on_empty_lines = false +ij_html_keep_line_breaks = true +ij_html_keep_line_breaks_in_text = true +ij_html_keep_whitespaces = false +ij_html_keep_whitespaces_inside = span, pre, textarea +ij_html_line_comment_at_first_column = true +ij_html_new_line_after_last_attribute = never +ij_html_new_line_before_first_attribute = never +ij_html_quote_style = double +ij_html_remove_new_line_before_tags = br +ij_html_space_after_tag_name = false +ij_html_space_around_equality_in_attribute = false +ij_html_space_inside_empty_tag = false +ij_html_text_wrap = normal +ij_html_uniform_ident = false + +[{*.yaml,*.yml}] +indent_size = 2 +ij_yaml_align_values_properties = do_not_align +ij_yaml_autoinsert_sequence_marker = true +ij_yaml_block_mapping_on_new_line = false +ij_yaml_indent_sequence_value = true +ij_yaml_keep_indents_on_empty_lines = false +ij_yaml_keep_line_breaks = true +ij_yaml_sequence_on_new_line = false +ij_yaml_space_before_colon = false +ij_yaml_spaces_within_braces = true +ij_yaml_spaces_within_brackets = true + +[**/generated/**] +generated_code = true +ij_formatter_enabled = false +ktlint = disabled \ No newline at end of file diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 0000000..0a1fc86 --- /dev/null +++ b/.gitattributes @@ -0,0 +1,5 @@ +screenshots/**/*.png filter=lfs diff=lfs merge=lfs -text +libraries/compound/screenshots/** filter=lfs diff=lfs merge=lfs -text +**/snapshots/**/*.png filter=lfs diff=lfs merge=lfs -text +**/docs/images-lfs/*.png filter=lfs diff=lfs merge=lfs -text +libraries/mediaupload/impl/src/test/assets/* filter=lfs diff=lfs merge=lfs -text diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..77acaad --- /dev/null +++ b/.gitignore @@ -0,0 +1,117 @@ +# Copyright (c) 2025 Element Creations Ltd. +# +# SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial. +# Please see LICENSE files in the repository root for full details. + +# Built application files +*.apk +*.ap_ +*.aab + +# Files for the ART/Dalvik VM +*.dex + +# Java class files +*.class + +# Generated files +bin/ +gen/ +out/ +# Uncomment the following line in case you need and you don't have the release build type files in your app +# release/ + +# Gradle files +.gradle/ +build/ + +# Python cache +__pycache__/ + +# Local configuration file (sdk path, etc) +local.properties + +# Proguard folder generated by Eclipse +proguard/ + +# Log Files +*.log + +# Android Studio Navigation editor temp files +.navigation/ + +# Android Studio captures folder +captures/ + +# IntelliJ +*.iml +.idea/.name +.idea/androidTestResultsUserPreferences.xml +.idea/assetWizardSettings.xml +.idea/AndroidProjectSystem.xml +.idea/compiler.xml +.idea/deploymentTargetDropDown.xml +.idea/deploymentTargetSelector.xml +.idea/deviceManager.xml +.idea/gradle.xml +.idea/jarRepositories.xml +.idea/markdown.xml +.idea/misc.xml +.idea/modules.xml +# Comment next line if keeping position of elements in Navigation Editor is relevant for you +.idea/navEditor.xml +.idea/other.xml +.idea/runConfigurations.xml +.idea/tasks.xml +.idea/workspace.xml +.idea/libraries +# Android Studio 3 in .gitignore file. +.idea/caches +.idea/copilot +.idea/copilot.* +.idea/inspectionProfiles +# Shelved changes in the IDE +.idea/shelf +.idea/sonarlint + +# .kotlin folder +.kotlin + +# Keystore files +# Uncomment the following lines if you do not want to check your keystore files in. +#*.jks +#*.keystore + +# External native build folder generated in Android Studio 2.2 and later +.externalNativeBuild +.cxx/ + +# Google Services (e.g. APIs or Firebase) +# google-services.json + +# Freeline +freeline.py +freeline/ +freeline_project_description.json + +# fastlane +fastlane/report.xml +fastlane/Preview.html +fastlane/screenshots +fastlane/test_output +fastlane/readme.md + +# Version control +vcs.xml + +# lint +lint/intermediates/ +lint/generated/ +lint/outputs/ +lint/tmp/ +# lint/reports/ + +/tmp +.DS_Store + +checkouts/** diff --git a/.gitmodules b/.gitmodules new file mode 100644 index 0000000..aa54a9d --- /dev/null +++ b/.gitmodules @@ -0,0 +1,3 @@ +[submodule "enterprise"] + path = enterprise + url = git@github.com:element-hq/element-android-enterprise.git diff --git a/.idea/codeStyles/Project.xml b/.idea/codeStyles/Project.xml new file mode 100644 index 0000000..cdef735 --- /dev/null +++ b/.idea/codeStyles/Project.xml @@ -0,0 +1,124 @@ + + + + + + + + + + \ No newline at end of file diff --git a/.idea/codeStyles/codeStyleConfig.xml b/.idea/codeStyles/codeStyleConfig.xml new file mode 100644 index 0000000..79ee123 --- /dev/null +++ b/.idea/codeStyles/codeStyleConfig.xml @@ -0,0 +1,5 @@ + + + + \ No newline at end of file diff --git a/.idea/copyright/Element_Enterprise.xml b/.idea/copyright/Element_Enterprise.xml new file mode 100644 index 0000000..b556049 --- /dev/null +++ b/.idea/copyright/Element_Enterprise.xml @@ -0,0 +1,6 @@ + + + + \ No newline at end of file diff --git a/.idea/copyright/Element_FOSS.xml b/.idea/copyright/Element_FOSS.xml new file mode 100644 index 0000000..bfc80c4 --- /dev/null +++ b/.idea/copyright/Element_FOSS.xml @@ -0,0 +1,6 @@ + + + + diff --git a/.idea/copyright/profiles_settings.xml b/.idea/copyright/profiles_settings.xml new file mode 100644 index 0000000..2e68dd3 --- /dev/null +++ b/.idea/copyright/profiles_settings.xml @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff --git a/.idea/dictionaries/shared.xml b/.idea/dictionaries/shared.xml new file mode 100644 index 0000000..6770828 --- /dev/null +++ b/.idea/dictionaries/shared.xml @@ -0,0 +1,27 @@ + + + + agpl + backstack + blurhash + fdroid + ftue + gplay + homeserver + konsist + kover + measurables + onboarding + placeables + posthog + rageshake + securebackup + showkase + snackbar + spdx + swipeable + textfields + tombstoned + + + diff --git a/.idea/icon.png b/.idea/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..6f7872211b0f603c5340b3d0d2eae6c878e89233 GIT binary patch literal 14783 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 m^)TQraD%6$?{oGQ*iN4;K3w;V0r + + + + \ No newline at end of file diff --git a/.idea/migrations.xml b/.idea/migrations.xml new file mode 100644 index 0000000..f8051a6 --- /dev/null +++ b/.idea/migrations.xml @@ -0,0 +1,10 @@ + + + + + + \ No newline at end of file diff --git a/.idea/scopes/Enterprise.xml b/.idea/scopes/Enterprise.xml new file mode 100644 index 0000000..83599ae --- /dev/null +++ b/.idea/scopes/Enterprise.xml @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/.maestro/README.md b/.maestro/README.md new file mode 100644 index 0000000..c0ee525 --- /dev/null +++ b/.maestro/README.md @@ -0,0 +1,74 @@ +# Maestro + +Maestro is a framework that we are using to test navigation across the application. +To setup, please refer at [https://maestro.mobile.dev](https://maestro.mobile.dev) + + + +* [Run test](#run-test) + * [Output](#output) +* [Write test](#write-test) +* [CI](#ci) +* [iOS](#ios) +* [Future](#future) + + + +## Run test + +From root dir of the project + +*Note: Since Element X does not allow account creation, we have to use an existing account to run maestro test suite. So to run locally, please replace `user` and `123` with your test matrix.org account credentials, and `my room` with one of a room this account has joined. Note that the test will send messages to this room.* + +```shell +maestro test \ + -e MAESTRO_APP_ID=io.element.android.x.debug \ + -e MAESTRO_USERNAME=user1 \ + -e MAESTRO_PASSWORD=123 \ + -e MAESTRO_RECOVERY_KEY=ABC \ + -e MAESTRO_ROOM_NAME="MyRoom" \ + -e MAESTRO_INVITEE1_MXID=user2 \ + -e MAESTRO_INVITEE2_MXID=user3 \ + .maestro/allTests.yaml +``` + +### Output + +Test result will be printed on the console, and screenshots will be generated at `./build/maestro` + +## Write test + +Tests are yaml files. Generally each yaml file should leave the app in the same screen than at the beginning. + +Start the Element X app and run this command to help writing test. + +```shell +maestro studio +``` + +Note that sometimes, this prevent running the test. So kill the `maestro studio` process to be able to run the test again. + +Also, if updating the application code, do not forget to deploy again the application before running the maestro tests. + +## CI + +The CI is running maestro using the workflow `.github/worflow/maestro.yaml` and [maestro cloud](https://cloud.mobile.dev/). For now we are limited to 100 runs a month. +Some GitHub secrets are used to be able to do that: `MAESTRO_CLOUD_API_KEY`, for now api key from `benoitm@element.io` maestro cloud account, and `MATRIX_MAESTRO_ACCOUNT_PASSWORD` which is the password of the account `@maestroelement:matrix.org`. This account contains a room `MyRoom` to be able to run the maestro test suite. + +## iOS + +Need to install `idb-companion` first + +```shell +brew install idb-companion +``` + +Also: +https://github.com/mobile-dev-inc/maestro/issues/146 +https://github.com/mobile-dev-inc/maestro/issues/107 +So you have to change your input keyboard to QWERTY for it to work properly. + +## Future + +- run on Element X iOS. This is already working but it need some change on the test to make it works. Could pass a PLATFORM parameter to have unique test and use conditional test. +- run specific test on both iOS and Android devices to make them communicate together. Could be possible to test room invite and join, verification, call, etc. To be done when Element X will be able to create account and create room. A main script would be able to detect the Android device and the iOS device, and run several maestro tests sequentially, using `--device` parameter to perform a global test. diff --git a/.maestro/allTests.yaml b/.maestro/allTests.yaml new file mode 100644 index 0000000..ecbde4d --- /dev/null +++ b/.maestro/allTests.yaml @@ -0,0 +1,10 @@ +appId: ${MAESTRO_APP_ID} +androidWebViewHierarchy: devtools +--- +## Check that all env variables required in the whole test suite are declared (to fail faster) +- runScript: ./scripts/checkEnv.js +- runFlow: tests/init.yaml +- runFlow: tests/account/login.yaml +- runFlow: tests/settings/settings.yaml +- runFlow: tests/roomList/roomList.yaml +- runFlow: tests/account/logout.yaml diff --git a/.maestro/scripts/checkEnv.js b/.maestro/scripts/checkEnv.js new file mode 100644 index 0000000..fa61d3c --- /dev/null +++ b/.maestro/scripts/checkEnv.js @@ -0,0 +1,10 @@ +// This array contains all the required environment variable. When adding a variable, add it here also. +// If a variable is missing, an error will occur. + +if (MAESTRO_APP_ID == null) throw "Fatal: missing env variable MAESTRO_APP_ID" +if (MAESTRO_USERNAME == null) throw "Fatal: missing env variable MAESTRO_USERNAME" +if (MAESTRO_PASSWORD == null) throw "Fatal: missing env variable MAESTRO_PASSWORD" +if (MAESTRO_RECOVERY_KEY == null) throw "Fatal: missing env variable MAESTRO_RECOVERY_KEY" +if (MAESTRO_ROOM_NAME == null) throw "Fatal: missing env variable MAESTRO_ROOM_NAME" +if (MAESTRO_INVITEE1_MXID == null) throw "Fatal: missing env variable MAESTRO_INVITEE1_MXID" +if (MAESTRO_INVITEE2_MXID == null) throw "Fatal: missing env variable MAESTRO_INVITEE2_MXID" diff --git a/.maestro/tests/account/changeServer.yaml b/.maestro/tests/account/changeServer.yaml new file mode 100644 index 0000000..b07fa5c --- /dev/null +++ b/.maestro/tests/account/changeServer.yaml @@ -0,0 +1,21 @@ +appId: ${MAESTRO_APP_ID} +--- +- tapOn: + id: "login-change_server" +- takeScreenshot: build/maestro/200-ChangeServer +- tapOn: "matrix.org" +- tapOn: + id: "login-change_server" +- tapOn: "Other" +- tapOn: + id: "change_server-server" +- inputText: "element" +- hideKeyboard +- extendedWaitUntil: + visible: "element.io" + timeout: 10000 +- tapOn: "element.io" +# Revert to matrix.org +- tapOn: + id: "login-change_server" +- tapOn: "matrix.org" diff --git a/.maestro/tests/account/login.yaml b/.maestro/tests/account/login.yaml new file mode 100644 index 0000000..f3f584e --- /dev/null +++ b/.maestro/tests/account/login.yaml @@ -0,0 +1,47 @@ +appId: ${MAESTRO_APP_ID} +--- +- tapOn: "Sign in manually" +- runFlow: ../assertions/assertLoginDisplayed.yaml +- takeScreenshot: build/maestro/100-SignIn +- runFlow: changeServer.yaml +- runFlow: ../assertions/assertLoginDisplayed.yaml +- tapOn: + id: "login-continue" +## MAS page +## Conditional workflow to pass the Chrome first launch welcome page. +- runFlow: + when: + visible: 'Use without an account' + commands: + - tapOn: "Use without an account" +## For older chrome versions +- runFlow: + when: + visible: 'Accept & continue' + commands: + - tapOn: "Accept & continue" +- runFlow: + when: + visible: 'No thanks' + commands: + - tapOn: "No thanks" +## Working when running Maestro locally, but not on the CI yet. +- extendedWaitUntil: + visible: + id: "form-1" + timeout: 10000 +- tapOn: + id: "form-1" +- inputText: ${MAESTRO_USERNAME} +- pressKey: Enter +- tapOn: + id: "form-3" +- inputText: ${MAESTRO_PASSWORD} +- pressKey: Enter +- tapOn: "Continue" +## Back to native world +- runFlow: ../assertions/assertSessionVerificationDisplayed.yaml +- runFlow: ./verifySession.yaml +- runFlow: ../assertions/assertAnalyticsDisplayed.yaml +- tapOn: "Not now" +- runFlow: ../assertions/assertHomeDisplayed.yaml diff --git a/.maestro/tests/account/logout.yaml b/.maestro/tests/account/logout.yaml new file mode 100644 index 0000000..f27f5da --- /dev/null +++ b/.maestro/tests/account/logout.yaml @@ -0,0 +1,15 @@ +appId: ${MAESTRO_APP_ID} +--- +- tapOn: + id: "home_screen-settings" +- tapOn: "Sign out" +- takeScreenshot: build/maestro/900-SignOutScreen +- back +- tapOn: "Sign out" +# Ensure cancel cancels +- tapOn: + id: "dialog-negative" +- tapOn: "Sign out" +- tapOn: + id: "dialog-positive" +- runFlow: ../assertions/assertInitDisplayed.yaml diff --git a/.maestro/tests/account/verifySession.yaml b/.maestro/tests/account/verifySession.yaml new file mode 100644 index 0000000..a163225 --- /dev/null +++ b/.maestro/tests/account/verifySession.yaml @@ -0,0 +1,13 @@ +appId: ${MAESTRO_APP_ID} +--- +- takeScreenshot: build/maestro/150-Verify +- tapOn: "Enter recovery key" +- tapOn: + id: "verification-recovery_key" +- inputText: ${MAESTRO_RECOVERY_KEY} +- hideKeyboard +- tapOn: "Continue" +- extendedWaitUntil: + visible: "Device verified" + timeout: 30000 +- tapOn: "Continue" diff --git a/.maestro/tests/assertions/assertAnalyticsDisplayed.yaml b/.maestro/tests/assertions/assertAnalyticsDisplayed.yaml new file mode 100644 index 0000000..516dcc8 --- /dev/null +++ b/.maestro/tests/assertions/assertAnalyticsDisplayed.yaml @@ -0,0 +1,5 @@ +appId: ${MAESTRO_APP_ID} +--- +- extendedWaitUntil: + visible: "Help improve Element X dbg" + timeout: 10000 diff --git a/.maestro/tests/assertions/assertHomeDisplayed.yaml b/.maestro/tests/assertions/assertHomeDisplayed.yaml new file mode 100644 index 0000000..c371d3b --- /dev/null +++ b/.maestro/tests/assertions/assertHomeDisplayed.yaml @@ -0,0 +1,5 @@ +appId: ${MAESTRO_APP_ID} +--- +- extendedWaitUntil: + visible: "Chats" + timeout: 10000 diff --git a/.maestro/tests/assertions/assertInitDisplayed.yaml b/.maestro/tests/assertions/assertInitDisplayed.yaml new file mode 100644 index 0000000..6e895d9 --- /dev/null +++ b/.maestro/tests/assertions/assertInitDisplayed.yaml @@ -0,0 +1,5 @@ +appId: ${MAESTRO_APP_ID} +--- +- extendedWaitUntil: + visible: "Be in your element" + timeout: 10000 diff --git a/.maestro/tests/assertions/assertLoginDisplayed.yaml b/.maestro/tests/assertions/assertLoginDisplayed.yaml new file mode 100644 index 0000000..6d8558c --- /dev/null +++ b/.maestro/tests/assertions/assertLoginDisplayed.yaml @@ -0,0 +1,5 @@ +appId: ${MAESTRO_APP_ID} +--- +- extendedWaitUntil: + visible: "Change account provider" + timeout: 10000 diff --git a/.maestro/tests/assertions/assertRoomListSynced.yaml b/.maestro/tests/assertions/assertRoomListSynced.yaml new file mode 100644 index 0000000..0eb1c52 --- /dev/null +++ b/.maestro/tests/assertions/assertRoomListSynced.yaml @@ -0,0 +1,5 @@ +appId: ${MAESTRO_APP_ID} +--- +- extendedWaitUntil: + visible: ${MAESTRO_ROOM_NAME} + timeout: 10000 diff --git a/.maestro/tests/assertions/assertSessionVerificationDisplayed.yaml b/.maestro/tests/assertions/assertSessionVerificationDisplayed.yaml new file mode 100644 index 0000000..f983ced --- /dev/null +++ b/.maestro/tests/assertions/assertSessionVerificationDisplayed.yaml @@ -0,0 +1,5 @@ +appId: ${MAESTRO_APP_ID} +--- +- extendedWaitUntil: + visible: "Confirm your identity" + timeout: 20000 diff --git a/.maestro/tests/init.yaml b/.maestro/tests/init.yaml new file mode 100644 index 0000000..6cb056d --- /dev/null +++ b/.maestro/tests/init.yaml @@ -0,0 +1,7 @@ +appId: ${MAESTRO_APP_ID} +--- +- clearState +- launchApp: + clearKeychain: true +- runFlow: ./assertions/assertInitDisplayed.yaml +- takeScreenshot: build/maestro/000-FirstScreen diff --git a/.maestro/tests/roomList/createAndDeleteDM.yaml b/.maestro/tests/roomList/createAndDeleteDM.yaml new file mode 100644 index 0000000..7e33fd1 --- /dev/null +++ b/.maestro/tests/roomList/createAndDeleteDM.yaml @@ -0,0 +1,15 @@ +appId: ${MAESTRO_APP_ID} +--- +# Purpose: Test the creation and deletion of a DM room. +- tapOn: "Create a new conversation or room" +- tapOn: "Search for someone" +- inputText: ${MAESTRO_INVITEE1_MXID} +- tapOn: + text: ${MAESTRO_INVITEE1_MXID} + index: 1 +- tapOn: "Send invite" +- takeScreenshot: build/maestro/330-createAndDeleteDM +- tapOn: "maestroelement2" +- scroll +- tapOn: "Leave room" +- tapOn: "Leave" diff --git a/.maestro/tests/roomList/createAndDeleteRoom.yaml b/.maestro/tests/roomList/createAndDeleteRoom.yaml new file mode 100644 index 0000000..a72fb80 --- /dev/null +++ b/.maestro/tests/roomList/createAndDeleteRoom.yaml @@ -0,0 +1,39 @@ +appId: ${MAESTRO_APP_ID} +--- +# Purpose: Test the creation and deletion of a room +- tapOn: "Create a new conversation or room" +- tapOn: "New room" +- tapOn: "e.g. your project name" +- inputText: "aRoomName" +- tapOn: "What is this room about?" +- inputText: "aRoomTopic" +- tapOn: "Create" +- takeScreenshot: build/maestro/320-createAndDeleteRoom +- tapOn: "Search for someone" +- inputText: ${MAESTRO_INVITEE1_MXID} +- tapOn: + text: ${MAESTRO_INVITEE1_MXID} + index: 1 +- tapOn: "Finish" +- tapOn: "aRoomName" +- tapOn: "Invite" +# assert there's 1 member and 1 invitee +- tapOn: "Search for someone" +- inputText: ${MAESTRO_INVITEE2_MXID} +- tapOn: + text: ${MAESTRO_INVITEE2_MXID} + index: 1 +- tapOn: "Invite" +- tapOn: "Back" +- tapOn: "aRoomName" +- scrollUntilVisible: + direction: DOWN + element: + text: "People" +- tapOn: "People" +# assert there's 1 member and 2 invitees +- tapOn: "Back" +- scroll +- scroll +- tapOn: "Leave room" +- tapOn: "Leave" diff --git a/.maestro/tests/roomList/roomContextMenu.yaml b/.maestro/tests/roomList/roomContextMenu.yaml new file mode 100644 index 0000000..160f8a3 --- /dev/null +++ b/.maestro/tests/roomList/roomContextMenu.yaml @@ -0,0 +1,14 @@ +appId: ${MAESTRO_APP_ID} +--- +# Purpose: Test the context menu of a room in the room list +- longPressOn: ${MAESTRO_ROOM_NAME} +- takeScreenshot: build/maestro/310-RoomList-ContextMenu +- tapOn: + text: "Settings" + index: 0 +- tapOn: "Back" +- longPressOn: ${MAESTRO_ROOM_NAME} +- tapOn: + text: "Leave room" + index: 0 +- tapOn: "Cancel" diff --git a/.maestro/tests/roomList/roomList.yaml b/.maestro/tests/roomList/roomList.yaml new file mode 100644 index 0000000..5cc9e26 --- /dev/null +++ b/.maestro/tests/roomList/roomList.yaml @@ -0,0 +1,8 @@ +appId: ${MAESTRO_APP_ID} +--- +- runFlow: searchRoomList.yaml +- takeScreenshot: build/maestro/300-RoomList +- runFlow: timeline/timeline.yaml +- runFlow: roomContextMenu.yaml +- runFlow: createAndDeleteRoom.yaml +- runFlow: createAndDeleteDM.yaml diff --git a/.maestro/tests/roomList/searchRoomList.yaml b/.maestro/tests/roomList/searchRoomList.yaml new file mode 100644 index 0000000..09197f0 --- /dev/null +++ b/.maestro/tests/roomList/searchRoomList.yaml @@ -0,0 +1,18 @@ +appId: ${MAESTRO_APP_ID} +--- +- runFlow: ../assertions/assertRoomListSynced.yaml +- tapOn: "search" +- inputText: ${MAESTRO_ROOM_NAME.substring(0, 3)} +- takeScreenshot: build/maestro/400-SearchRoom +- tapOn: ${MAESTRO_ROOM_NAME} +# Back from timeline to search +- back +- extendedWaitUntil: + visible: ${MAESTRO_ROOM_NAME.substring(0, 3)} + timeout: 10000 +# Back to close the keyboard +- back +- waitForAnimationToEnd +# Back to close the home screen +- back +- runFlow: ../assertions/assertHomeDisplayed.yaml diff --git a/.maestro/tests/roomList/timeline/call/call.yaml b/.maestro/tests/roomList/timeline/call/call.yaml new file mode 100644 index 0000000..e390d0a --- /dev/null +++ b/.maestro/tests/roomList/timeline/call/call.yaml @@ -0,0 +1,13 @@ +appId: ${MAESTRO_APP_ID} +--- +- tapOn: "Start a call" +- takeScreenshot: build/maestro/700-Call +- extendedWaitUntil: + visible: "maestroelement" + timeout: 10000 +- takeScreenshot: build/maestro/710-Call +# Hangup +- tapOn: "End call" +- extendedWaitUntil: + visible: "MyRoom" + timeout: 10000 diff --git a/.maestro/tests/roomList/timeline/messages/location.yaml b/.maestro/tests/roomList/timeline/messages/location.yaml new file mode 100644 index 0000000..c9382bd --- /dev/null +++ b/.maestro/tests/roomList/timeline/messages/location.yaml @@ -0,0 +1,7 @@ +appId: ${MAESTRO_APP_ID} +--- +- takeScreenshot: build/maestro/520-Timeline +- tapOn: "Add attachment" +- tapOn: "Location" +- tapOn: "Share my location" +- takeScreenshot: build/maestro/521-Timeline diff --git a/.maestro/tests/roomList/timeline/messages/poll.yaml b/.maestro/tests/roomList/timeline/messages/poll.yaml new file mode 100644 index 0000000..c6fffeb --- /dev/null +++ b/.maestro/tests/roomList/timeline/messages/poll.yaml @@ -0,0 +1,13 @@ +appId: ${MAESTRO_APP_ID} +--- +- takeScreenshot: build/maestro/530-Timeline +- tapOn: "Add attachment" +- tapOn: "Poll" +- tapOn: "What is the poll about?" +- inputText: "I am a poll" +- tapOn: "Option 1" +- inputText: "Answer 1" +- tapOn: "Option 2" +- inputText: "Answer 2" +- tapOn: "Create" +- takeScreenshot: build/maestro/531-Timeline diff --git a/.maestro/tests/roomList/timeline/messages/text.yaml b/.maestro/tests/roomList/timeline/messages/text.yaml new file mode 100644 index 0000000..4e1f4bc --- /dev/null +++ b/.maestro/tests/roomList/timeline/messages/text.yaml @@ -0,0 +1,9 @@ +appId: ${MAESTRO_APP_ID} +--- +- takeScreenshot: build/maestro/510-Timeline +- tapOn: + id: "text_editor" +- inputText: "Hello world!" +- tapOn: "Send message" +- hideKeyboard +- takeScreenshot: build/maestro/511-Timeline diff --git a/.maestro/tests/roomList/timeline/timeline.yaml b/.maestro/tests/roomList/timeline/timeline.yaml new file mode 100644 index 0000000..0ad9231 --- /dev/null +++ b/.maestro/tests/roomList/timeline/timeline.yaml @@ -0,0 +1,14 @@ +appId: ${MAESTRO_APP_ID} +--- +# This is the name of one room +- tapOn: ${MAESTRO_ROOM_NAME} +- takeScreenshot: build/maestro/500-Timeline +- runFlow: messages/text.yaml +- runFlow: messages/location.yaml +- runFlow: messages/poll.yaml + +# Restore once the call flow is fixed +#- runFlow: call/call.yaml + +- back +- runFlow: ../../assertions/assertHomeDisplayed.yaml diff --git a/.maestro/tests/settings/settings.yaml b/.maestro/tests/settings/settings.yaml new file mode 100644 index 0000000..15181a4 --- /dev/null +++ b/.maestro/tests/settings/settings.yaml @@ -0,0 +1,46 @@ +appId: ${MAESTRO_APP_ID} +--- +- tapOn: + id: "home_screen-settings" +- assertVisible: "Settings" +- takeScreenshot: build/maestro/600-Settings +- tapOn: + text: "Analytics" +- assertVisible: "Share analytics data" +- back + +- tapOn: + text: "Notifications" +- assertVisible: "Enable notifications on this device" +- back + +- tapOn: + text: "Report a problem" +- assertVisible: "Report a problem" +- back + +- tapOn: + text: "About" +- assertVisible: "Copyright" +- assertVisible: "Acceptable use policy" +- assertVisible: "Privacy policy" +- back + +- tapOn: + text: "Screen lock" +- assertVisible: "Choose PIN" +- hideKeyboard +- back + +- tapOn: + text: "Advanced settings" +- assertVisible: "View source" +- back + +- tapOn: + text: "Developer options" +- assertVisible: "Feature flags" +- back + +- back +- runFlow: ../assertions/assertHomeDisplayed.yaml diff --git a/AUTHORS.md b/AUTHORS.md new file mode 100644 index 0000000..b3c2de6 --- /dev/null +++ b/AUTHORS.md @@ -0,0 +1,17 @@ +A full developer contributors list can be found [here](https://github.com/element-hq/element-x-android/graphs/contributors). + +# Core team: + +The element.io Android developer team. + +# Other contributors + +First of all, we thank all contributors who use Element and report problems on this GitHub project or via the integrated rageshake function. + +We do not forget all translators, for their work of translating Element into many languages. They are also the authors of Element. + +Feel free to add your name below, when you contribute to the project! + +Name | Matrix ID | GitHub +----------|-----------------------------|-------------------------------------- +name | @name:matrix.org | [githubID](https://github.com/githubID) diff --git a/CHANGES.md b/CHANGES.md new file mode 100644 index 0000000..01a83c0 --- /dev/null +++ b/CHANGES.md @@ -0,0 +1,3034 @@ +Changes in Element X v25.11.3 +============================= + + + +## What's Changed +### 🙌 Improvements +* Improve rendering notification for multi account by @bmarty in https://github.com/element-hq/element-x-android/pull/5645 +* Change : roles and permissions by @ganfra in https://github.com/element-hq/element-x-android/pull/5685 +* Improve account provider selection during the login flow by @bmarty in https://github.com/element-hq/element-x-android/pull/5692 +* Let notifications use avatar fallback. by @bmarty in https://github.com/element-hq/element-x-android/pull/5721 +* Changes : member list improvements by @ganfra in https://github.com/element-hq/element-x-android/pull/5728 +### 🐛 Bugfixes +* Do not use the bestDescription but the caption for images, when available by @bmarty in https://github.com/element-hq/element-x-android/pull/5684 +* Add the user certificate if any when creating Matrix Client. by @bmarty in https://github.com/element-hq/element-x-android/pull/5686 +* Ensure the form data are not lost when opening the log viewer. by @bmarty in https://github.com/element-hq/element-x-android/pull/5695 +* Fix password flow when using a login link by @bmarty in https://github.com/element-hq/element-x-android/pull/5693 +* Fix layout issue in text composer by @bmarty in https://github.com/element-hq/element-x-android/pull/5710 +* Fix navigation stack overflow when sharing media by @jmartinesp in https://github.com/element-hq/element-x-android/pull/5724 +* Notification robustness by @bmarty in https://github.com/element-hq/element-x-android/pull/5726 +* Send read receipts using the current timeline, not the live timeline by @jmartinesp in https://github.com/element-hq/element-x-android/pull/5731 +* Render Owner in the horizontal list when editing Admins. by @bmarty in https://github.com/element-hq/element-x-android/pull/5736 +* Stop overriding the homeserver when restoring a `Client` by @jmartinesp in https://github.com/element-hq/element-x-android/pull/5753 +* Revert "Stop overriding the homeserver when restoring a `Client`" by @jmartinesp in https://github.com/element-hq/element-x-android/pull/5754 +* Try fixing forced dark mode issues on MIUI on Android 10 by @jmartinesp in https://github.com/element-hq/element-x-android/pull/5708 +* Fix crash at startup by @bmarty in https://github.com/element-hq/element-x-android/pull/5761 +* Fix null pointer exception on room notification settings. by @bmarty in https://github.com/element-hq/element-x-android/pull/5758 +* Fix crash when viewing Pinned events by @bmarty in https://github.com/element-hq/element-x-android/pull/5764 +* Fix crash when pressing back from the showkase Activity by @bmarty in https://github.com/element-hq/element-x-android/pull/5772 +* Fix navigation issue once incoming share is handled by @bmarty in https://github.com/element-hq/element-x-android/pull/5773 +* Fix crash in work manager by @bmarty in https://github.com/element-hq/element-x-android/pull/5768 +### 🗣 Translations +* Sync Strings by @ElementBot in https://github.com/element-hq/element-x-android/pull/5704 +* Sync Strings by @ElementBot in https://github.com/element-hq/element-x-android/pull/5747 +* Sync Strings by @ElementBot in https://github.com/element-hq/element-x-android/pull/5782 +### 🧱 Build +* Module cleanup by @bmarty in https://github.com/element-hq/element-x-android/pull/5722 +* Add `NIGHTLY` env for Sentry by @jmartinesp in https://github.com/element-hq/element-x-android/pull/5779 +### 🚧 In development 🚧 +* Space : prepare Space Settings screen by @ganfra in https://github.com/element-hq/element-x-android/pull/5668 +### Dependency upgrades +* fix(deps): update dependency androidx.core:core-splashscreen to v1.2.0 by @renovate[bot] in https://github.com/element-hq/element-x-android/pull/5687 +* fix(deps): update dependency com.posthog:posthog-android to v3.26.0 by @renovate[bot] in https://github.com/element-hq/element-x-android/pull/5696 +* fix(deps): update metro to v0.7.5 by @renovate[bot] in https://github.com/element-hq/element-x-android/pull/5697 +* Update dependency org.matrix.rustcomponents:sdk-android to v25.11.11 by @renovate[bot] in https://github.com/element-hq/element-x-android/pull/5716 +* Update plugin ktlint to v14 by @renovate[bot] in https://github.com/element-hq/element-x-android/pull/5713 +* Update plugin dependencycheck to v12.1.9 by @renovate[bot] in https://github.com/element-hq/element-x-android/pull/5717 +* Update dependency org.maplibre.gl:android-sdk to v12.1.0 by @renovate[bot] in https://github.com/element-hq/element-x-android/pull/5714 +* Update dependency io.sentry:sentry-android to v8.26.0 by @renovate[bot] in https://github.com/element-hq/element-x-android/pull/5720 +* Update sqldelight to v2.2.1 by @renovate[bot] in https://github.com/element-hq/element-x-android/pull/5730 +* fix(deps): update dependency com.squareup.okhttp3:okhttp-bom to v5.3.1 by @renovate[bot] in https://github.com/element-hq/element-x-android/pull/5746 +* fix(deps): update dependency com.google.firebase:firebase-bom to v34.6.0 by @renovate[bot] in https://github.com/element-hq/element-x-android/pull/5737 +* fix(deps): update metro to v0.7.6 by @renovate[bot] in https://github.com/element-hq/element-x-android/pull/5752 +* fix(deps): update dependency org.maplibre.gl:android-sdk to v12.1.3 by @renovate[bot] in https://github.com/element-hq/element-x-android/pull/5743 +* Update dependency com.squareup.okhttp3:okhttp-bom to v5.3.2 by @renovate[bot] in https://github.com/element-hq/element-x-android/pull/5757 +* fix(deps): update dependency com.pinterest.ktlint:ktlint-cli to v1.8.0 by @renovate[bot] in https://github.com/element-hq/element-x-android/pull/5738 +* fix(deps): update dependency org.matrix.rustcomponents:sdk-android to v25.11.19 by @renovate[bot] in https://github.com/element-hq/element-x-android/pull/5762 +* fix(deps): update dependencyanalysis to v3.5.0 by @renovate[bot] in https://github.com/element-hq/element-x-android/pull/5776 +### Others +* Extract save change dialog by @bmarty in https://github.com/element-hq/element-x-android/pull/5679 +* Use the dedicated subdomain for the bug report URL by default by @benbz in https://github.com/element-hq/element-x-android/pull/5689 +* Convert `ComposerAlertMolecule` to use alert levels. by @kaylendog in https://github.com/element-hq/element-x-android/pull/5691 +* Improve composer alert molecule by @bmarty in https://github.com/element-hq/element-x-android/pull/5701 +* Code consistency around view event handling by @bmarty in https://github.com/element-hq/element-x-android/pull/5698 +* Update copyright holders by @bmarty in https://github.com/element-hq/element-x-android/pull/5706 +* Fix rendering notifications after receiving redundant push by @SpiritCroc in https://github.com/element-hq/element-x-android/pull/5711 +* Fix push gateway with some push provider (Sunup/autopush) by @p1gp1g in https://github.com/element-hq/element-x-android/pull/5741 +* Use new notification sound in release. by @bmarty in https://github.com/element-hq/element-x-android/pull/5748 +* Fix issue on brand color override by @bmarty in https://github.com/element-hq/element-x-android/pull/5626 +* Add media retention policy by @jmartinesp in https://github.com/element-hq/element-x-android/pull/5749 +* Enable logging OkHttp traffic based on the current log level by @jmartinesp in https://github.com/element-hq/element-x-android/pull/5750 +* Remove unused `slidingSyncProxy` from DB. by @bmarty in https://github.com/element-hq/element-x-android/pull/5755 +* Add some performance metrics for Sentry by @jmartinesp in https://github.com/element-hq/element-x-android/pull/5760 + +## New Contributors +* @benbz made their first contribution in https://github.com/element-hq/element-x-android/pull/5689 +* @kaylendog made their first contribution in https://github.com/element-hq/element-x-android/pull/5691 + +**Full Changelog**: https://github.com/element-hq/element-x-android/compare/v25.11.2...v25.11.3 + +Changes in Element X v25.11.2 +============================= + + + +## What's Changed +### ✨ Features +* Enable access to security and privacy by @bmarty in https://github.com/element-hq/element-x-android/pull/5566 +* Add ability to forward a media from the media viewer and the gallery by @bmarty in https://github.com/element-hq/element-x-android/pull/5622 +* Split notifications for messages in threads by @jmartinesp in https://github.com/element-hq/element-x-android/pull/5595 +### 🙌 Improvements +* Enable `SyncNotificationsWithWorkManager` in nightly and debug builds by @jmartinesp in https://github.com/element-hq/element-x-android/pull/5573 +* Confirm exit without saving change in room details edit screen by @bmarty in https://github.com/element-hq/element-x-android/pull/5618 +* Space : add view members entry by @ganfra in https://github.com/element-hq/element-x-android/pull/5619 +* Update notification sound by @bmarty in https://github.com/element-hq/element-x-android/pull/5667 +* Use the new notification sound only on debug and nightly build by @bmarty in https://github.com/element-hq/element-x-android/pull/5673 +* Make sure we know the session verification state before showing the options to verify the session by @bmarty in https://github.com/element-hq/element-x-android/pull/5677 +### 🐛 Bugfixes +* Improve how brand color is applied. by @bmarty in https://github.com/element-hq/element-x-android/pull/5584 +* Improve wellknown retrieval API by @bmarty in https://github.com/element-hq/element-x-android/pull/5587 +* Clearing the room list search clears the search term too by @jmartinesp in https://github.com/element-hq/element-x-android/pull/5603 +* Delete pin code only when the last session is deleted by @bmarty in https://github.com/element-hq/element-x-android/pull/5600 +* Fix issues with WorkManager on Android 12 and below by @jmartinesp in https://github.com/element-hq/element-x-android/pull/5606 +* Fix marking a room as read re-instantiates its timeline by @jmartinesp in https://github.com/element-hq/element-x-android/pull/5628 +* Display only valid emojis in recent emoji list by @jmartinesp in https://github.com/element-hq/element-x-android/pull/5612 +* Fix navigation issue. by @bmarty in https://github.com/element-hq/element-x-android/pull/5666 +* Fix forward events from media viewer from pinned media timeline by @bmarty in https://github.com/element-hq/element-x-android/pull/5669 +* Try fixing 'Timeline Event object has already been destroyed' by @jmartinesp in https://github.com/element-hq/element-x-android/pull/5675 +* Use the SDK Client to check whether a homeserver is compatible by @jmartinesp in https://github.com/element-hq/element-x-android/pull/5664 +### 🗣 Translations +* Sync Strings by @ElementBot in https://github.com/element-hq/element-x-android/pull/5610 +* Sync Strings by @ElementBot in https://github.com/element-hq/element-x-android/pull/5662 +### 🧱 Build +* Remove `@Inject`, not necessary anymore when class is annotated with `@ContributesBinding` by @bmarty in https://github.com/element-hq/element-x-android/pull/5589 +* Upgrade ktlint to 1.7.1 and ensure Renovate will upgrade the version by @bmarty in https://github.com/element-hq/element-x-android/pull/5638 +* Improve architecture around Nodes by @bmarty in https://github.com/element-hq/element-x-android/pull/5641 +* Move dependencies block out of the android block. by @bmarty in https://github.com/element-hq/element-x-android/pull/5674 +* Always use the handleEvent(s) function the same way. by @bmarty in https://github.com/element-hq/element-x-android/pull/5672 +### Dependency upgrades +* fix(deps): update metro to v0.7.2 by @renovate[bot] in https://github.com/element-hq/element-x-android/pull/5576 +* fix(deps): update dependencyanalysis to v3.2.0 by @renovate[bot] in https://github.com/element-hq/element-x-android/pull/5577 +* fix(deps): update dependency io.sentry:sentry-android to v8.24.0 by @renovate[bot] in https://github.com/element-hq/element-x-android/pull/5586 +* fix(deps): update dependency androidx.work:work-runtime-ktx to v2.11.0 by @renovate[bot] in https://github.com/element-hq/element-x-android/pull/5590 +* fix(deps): update dependency com.posthog:posthog-android to v3.25.0 by @renovate[bot] in https://github.com/element-hq/element-x-android/pull/5594 +* fix(deps): update dependency com.google.crypto.tink:tink-android to v1.19.0 by @renovate[bot] in https://github.com/element-hq/element-x-android/pull/5572 +* Update plugin sonarqube to v7.0.1.6134 by @renovate[bot] in https://github.com/element-hq/element-x-android/pull/5605 +* fix(deps): update dependency org.matrix.rustcomponents:sdk-android to v25.10.28 by @renovate[bot] in https://github.com/element-hq/element-x-android/pull/5620 +* fix(deps): update dependencyanalysis to v3.3.0 by @renovate[bot] in https://github.com/element-hq/element-x-android/pull/5602 +* fix(deps): update dependency com.github.matrix-org:matrix-analytics-events to v0.29.2 by @renovate[bot] in https://github.com/element-hq/element-x-android/pull/5621 +* fix(deps): update dependencyanalysis to v3.4.0 by @renovate[bot] in https://github.com/element-hq/element-x-android/pull/5624 +* fix(deps): update dependency org.matrix.rustcomponents:sdk-android to v25.10.29 by @renovate[bot] in https://github.com/element-hq/element-x-android/pull/5625 +* fix(deps): update dependency io.sentry:sentry-android to v8.25.0 by @renovate[bot] in https://github.com/element-hq/element-x-android/pull/5629 +* fix(deps): update dependencyanalysis to v3.4.1 by @renovate[bot] in https://github.com/element-hq/element-x-android/pull/5642 +* fix(deps): update dependency com.squareup.okhttp3:okhttp-bom to v5.3.0 by @renovate[bot] in https://github.com/element-hq/element-x-android/pull/5644 +* chore(deps): update danger/danger-js action to v13.0.5 by @renovate[bot] in https://github.com/element-hq/element-x-android/pull/5652 +* fix(deps): update dependency com.google.firebase:firebase-bom to v34.5.0 by @renovate[bot] in https://github.com/element-hq/element-x-android/pull/5643 +* fix(deps): update firebaseappdistribution to v5.2.0 by @renovate[bot] in https://github.com/element-hq/element-x-android/pull/5640 +* fix(deps): update metro to v0.7.3 by @renovate[bot] in https://github.com/element-hq/element-x-android/pull/5663 +* fix(deps): update dependency org.matrix.rustcomponents:sdk-android to v25.10.31 by @renovate[bot] in https://github.com/element-hq/element-x-android/pull/5657 +* Update GitHub Artifact Actions (major) by @renovate[bot] in https://github.com/element-hq/element-x-android/pull/5609 +* Update dependency io.element.android:element-call-embedded to v0.16.1 by @renovate[bot] in https://github.com/element-hq/element-x-android/pull/5598 +* Update roborazzi to v1.51.0 by @renovate[bot] in https://github.com/element-hq/element-x-android/pull/5676 +* fix(deps): update dependency org.matrix.rustcomponents:sdk-android to v25.11.4 by @renovate[bot] in https://github.com/element-hq/element-x-android/pull/5681 +* fix(deps): update metro to v0.7.4 by @renovate[bot] in https://github.com/element-hq/element-x-android/pull/5683 +### Others +* Improve code around Element .well-known configuration by @bmarty in https://github.com/element-hq/element-x-android/pull/5565 +* misc: display offline banner for all LoggedIn screens by @ganfra in https://github.com/element-hq/element-x-android/pull/5574 +* Remove icon preview duplicate by @bmarty in https://github.com/element-hq/element-x-android/pull/5588 +* Remove application navigation state usage in the push module by @bmarty in https://github.com/element-hq/element-x-android/pull/5596 +* Design : update Home TopBar and RoomList Filters by @ganfra in https://github.com/element-hq/element-x-android/pull/5599 +* Add missing tests on the analytic modules by @bmarty in https://github.com/element-hq/element-x-android/pull/5604 +* design(space): let SpaceRoomItemView divider be full width by @ganfra in https://github.com/element-hq/element-x-android/pull/5597 +* Update notification style by @bmarty in https://github.com/element-hq/element-x-android/pull/5607 +* Improve how data is handled for the WorkManager. by @bmarty in https://github.com/element-hq/element-x-android/pull/5592 +* Revert "Make sure declining a call stops observing the ringing call state" by @jmartinesp in https://github.com/element-hq/element-x-android/pull/5615 +* Misc : space flow inject room by @ganfra in https://github.com/element-hq/element-x-android/pull/5614 +* Enable `SyncNotificationsWithWorkManager` by default in release mode apps too by @jmartinesp in https://github.com/element-hq/element-x-android/pull/5646 +* Revert "Update notification sound" by @bmarty in https://github.com/element-hq/element-x-android/pull/5671 +* Introduce new query to count accounts by @bmarty in https://github.com/element-hq/element-x-android/pull/5678 + + +**Full Changelog**: https://github.com/element-hq/element-x-android/compare/v25.11.0...v25.11.2 + +Changes in Element X v25.11.0 +============================= + +Hotfix release. + +Includes https://github.com/element-hq/element-x-android/pull/5615, which fixes an issue that prevented Element Call notifications from being displayed sometimes. + +**Full Changelog**: https://github.com/element-hq/element-x-android/compare/v25.10.1...v25.11.0 + +Changes in Element X v25.10.1 +============================= + + + +## What's Changed +### ✨ Features +* Sync notifications using WorkManager by @jmartinesp in https://github.com/element-hq/element-x-android/pull/5545 +### 🙌 Improvements +* Sort feature flags by @bmarty in https://github.com/element-hq/element-x-android/pull/5557 +### 🐛 Bugfixes +* Makes sure images are loaded when cancelling multiaccount flow by @ganfra in https://github.com/element-hq/element-x-android/pull/5502 +* Fix 'test push loop back' notification check by @jmartinesp in https://github.com/element-hq/element-x-android/pull/5541 +* Display 'join anyway' button on room preview when the state can't be loaded by @ShadowRZ in https://github.com/element-hq/element-x-android/pull/5514 +* Fix media viewer not being dismissed with reduced motion enabled by @jmartinesp in https://github.com/element-hq/element-x-android/pull/5555 +* Keep the cursor position in room list search when going back by @jmartinesp in https://github.com/element-hq/element-x-android/pull/5570 +* Make sure declining a call stops observing the ringing call state by @jmartinesp in https://github.com/element-hq/element-x-android/pull/5563 +### 🗣 Translations +* Sync Strings by @ElementBot in https://github.com/element-hq/element-x-android/pull/5515 +* Sync Strings by @ElementBot in https://github.com/element-hq/element-x-android/pull/5562 +### 🧱 Build +* Do some cleanup on our immutable annotation usage by @bmarty in https://github.com/element-hq/element-x-android/pull/5503 +* `interface TestParameterValuesProvider` is deprecated. by @bmarty in https://github.com/element-hq/element-x-android/pull/5568 +### Dependency upgrades +* fix(deps): update metro to v0.6.9 by @renovate[bot] in https://github.com/element-hq/element-x-android/pull/5480 +* fix(deps): update dependency org.unifiedpush.android:connector to v3.1.0 by @renovate[bot] in https://github.com/element-hq/element-x-android/pull/5443 +* fix(deps): update wysiwyg to v2.40.0 by @renovate[bot] in https://github.com/element-hq/element-x-android/pull/5400 +* fix(deps): update dependency io.github.sergio-sastre.composablepreviewscanner:android to v0.7.1 by @renovate[bot] in https://github.com/element-hq/element-x-android/pull/5510 +* fix(deps): update camera to v1.5.1 - autoclosed by @renovate[bot] in https://github.com/element-hq/element-x-android/pull/5509 +* chore(deps): update plugin dependencycheck to v12.1.7 by @renovate[bot] in https://github.com/element-hq/element-x-android/pull/5518 +* chore(deps): update plugin licensee to v1.14.1 by @renovate[bot] in https://github.com/element-hq/element-x-android/pull/5477 +* chore(deps): update dependency python to 3.14 by @renovate[bot] in https://github.com/element-hq/element-x-android/pull/5475 +* fix(deps): update metro to v0.6.10 by @renovate[bot] in https://github.com/element-hq/element-x-android/pull/5520 +* fix(deps): update dependency org.unifiedpush.android:connector to v3.1.2 by @renovate[bot] in https://github.com/element-hq/element-x-android/pull/5519 +* chore(deps): update plugin gms_google_services to v4.4.4 by @renovate[bot] in https://github.com/element-hq/element-x-android/pull/5507 +* fix(deps): update dependency com.google.firebase:firebase-bom to v34.4.0 by @renovate[bot] in https://github.com/element-hq/element-x-android/pull/5522 +* fix(deps): update dependency com.squareup.okhttp3:okhttp-bom to v5.2.1 by @renovate[bot] in https://github.com/element-hq/element-x-android/pull/5524 +* fix(deps): update dependency net.zetetic:sqlcipher-android to v4.11.0 by @renovate[bot] in https://github.com/element-hq/element-x-android/pull/5525 +* fix(deps): update dependencyanalysis to v3.1.0 by @renovate[bot] in https://github.com/element-hq/element-x-android/pull/5523 +* fix(deps): update dependency org.matrix.rustcomponents:sdk-android to v25.10.13 by @renovate[bot] in https://github.com/element-hq/element-x-android/pull/5527 +* chore(deps): update plugin dependencycheck to v12.1.8 by @renovate[bot] in https://github.com/element-hq/element-x-android/pull/5531 +* chore(deps): update rnkdsh/action-upload-diawi action to v1.5.12 by @renovate[bot] in https://github.com/element-hq/element-x-android/pull/5533 +* fix(deps): update dependency org.maplibre.gl:android-sdk to v12.0.1 by @renovate[bot] in https://github.com/element-hq/element-x-android/pull/5548 +* fix(deps): update metro to v0.7.0 by @renovate[bot] in https://github.com/element-hq/element-x-android/pull/5554 +* fix(deps): update dependency com.posthog:posthog-android to v3.24.0 by @renovate[bot] in https://github.com/element-hq/element-x-android/pull/5564 +* chore(deps): update plugin sonarqube to v7 by @renovate[bot] in https://github.com/element-hq/element-x-android/pull/5535 +### Others +* Import Compound tokens - fixed icons by @jmartinesp in https://github.com/element-hq/element-x-android/pull/5506 +* Replace Uri by String in States that are used in Composable function. by @bmarty in https://github.com/element-hq/element-x-android/pull/5508 +* Let room filters follow the design. by @bmarty in https://github.com/element-hq/element-x-android/pull/5526 +* Allow uploading notification push rules in bug reports by @jmartinesp in https://github.com/element-hq/element-x-android/pull/5538 +* Add number of accounts info in the rageshake data. by @bmarty in https://github.com/element-hq/element-x-android/pull/5532 +* design(space): match figma for Space views by @ganfra in https://github.com/element-hq/element-x-android/pull/5540 +* Extract console message logger and mutualize instance of Json by @bmarty in https://github.com/element-hq/element-x-android/pull/5552 +* Improve colors customization by @bmarty in https://github.com/element-hq/element-x-android/pull/5542 +* Fix test warning by @bmarty in https://github.com/element-hq/element-x-android/pull/5558 + + +**Full Changelog**: https://github.com/element-hq/element-x-android/compare/v25.10.0...v25.10.1 + +Changes in Element X v25.10.0 +============================= + + + +## What's Changed +### ✨ Features +* Use shared recent emoji reactions from account data by @jmartinesp in https://github.com/element-hq/element-x-android/pull/5402 +* Follow permalinks to and from threads by @jmartinesp in https://github.com/element-hq/element-x-android/pull/5414 +* Add support for Spaces by @bmarty in https://github.com/element-hq/element-x-android/pull/5462 +* Add Labs screen for beta testing of public features by @jmartinesp in https://github.com/element-hq/element-x-android/pull/5465 +### 🙌 Improvements +* Update the strings for the device verification flow by @andybalaam in https://github.com/element-hq/element-x-android/pull/5419 +* Set a notification sound by @bmarty in https://github.com/element-hq/element-x-android/pull/5469 +* Improve current push provider test: give info about the distributor. by @bmarty in https://github.com/element-hq/element-x-android/pull/5471 +* Improve AnnouncementService. by @bmarty in https://github.com/element-hq/element-x-android/pull/5482 +### 🐛 Bugfixes +* Improvement and bugfix on incoming verification request screen by @bmarty in https://github.com/element-hq/element-x-android/pull/5426 +* Space : makes sure to use room heroes for avatar by @ganfra in https://github.com/element-hq/element-x-android/pull/5488 +* Filter out direct room in the leave space screen. by @bmarty in https://github.com/element-hq/element-x-android/pull/5498 +### 🗣 Translations +* Sync Strings by @ElementBot in https://github.com/element-hq/element-x-android/pull/5427 +* Sync Strings by @ElementBot in https://github.com/element-hq/element-x-android/pull/5460 +* Sync Strings by @ElementBot in https://github.com/element-hq/element-x-android/pull/5486 +### 🧱 Build +* Remove unused dependency on `javax.inject:javax.inject` by @bmarty in https://github.com/element-hq/element-x-android/pull/5445 +* Internalize compound-android by @bmarty in https://github.com/element-hq/element-x-android/pull/5457 +### 🚧 In development 🚧 +* Sdk : use latest apis for space by @ganfra in https://github.com/element-hq/element-x-android/pull/5404 +* Multi accounts - experimental first implementation by @bmarty in https://github.com/element-hq/element-x-android/pull/5285 +* Leave space - UI by @bmarty in https://github.com/element-hq/element-x-android/pull/5354 +* Leave spave: iteration on string value. by @bmarty in https://github.com/element-hq/element-x-android/pull/5425 +* Feature : space list join action by @ganfra in https://github.com/element-hq/element-x-android/pull/5431 +* Room list space invite by @ganfra in https://github.com/element-hq/element-x-android/pull/5449 +* Leave space: use SDK API. by @bmarty in https://github.com/element-hq/element-x-android/pull/5432 +* Space annoucement by @bmarty in https://github.com/element-hq/element-x-android/pull/5451 +* feature(space) : keep space children in the presenter by @ganfra in https://github.com/element-hq/element-x-android/pull/5456 +* Spaces : some tweaks around ui by @ganfra in https://github.com/element-hq/element-x-android/pull/5468 +* Use "BETA" word from Localazy and ensure layout is correct by @bmarty in https://github.com/element-hq/element-x-android/pull/5470 +* Disable avatar cluster for now by @bmarty in https://github.com/element-hq/element-x-android/pull/5492 +### Dependency upgrades +* Update dependency com.posthog:posthog-android to v3.21.3 by @renovate[bot] in https://github.com/element-hq/element-x-android/pull/5360 +* Update dependency io.element.android:element-call-embedded to v0.16.0 by @renovate[bot] in https://github.com/element-hq/element-x-android/pull/5408 +* Update dependency net.java.dev.jna:jna to v5.18.0 by @renovate[bot] in https://github.com/element-hq/element-x-android/pull/5398 +* Update plugin dependencycheck to v12.1.6 by @renovate[bot] in https://github.com/element-hq/element-x-android/pull/5405 +* Update dependency org.matrix.rustcomponents:sdk-android to v25.9.25 by @renovate[bot] in https://github.com/element-hq/element-x-android/pull/5412 +* Update dependency androidx.sqlite:sqlite-ktx to v2.6.1 by @renovate[bot] in https://github.com/element-hq/element-x-android/pull/5409 +* Update kotlin by @renovate[bot] in https://github.com/element-hq/element-x-android/pull/5317 +* Update metro to v0.6.7 by @renovate[bot] in https://github.com/element-hq/element-x-android/pull/5416 +* Update dependency app.cash.molecule:molecule-runtime to v2.2.0 by @renovate[bot] in https://github.com/element-hq/element-x-android/pull/5413 +* Update dependency com.posthog:posthog-android to v3.22.0 by @renovate[bot] in https://github.com/element-hq/element-x-android/pull/5415 +* Update metro to v0.6.8 by @renovate[bot] in https://github.com/element-hq/element-x-android/pull/5422 +* fix(deps): update dependency org.matrix.rustcomponents:sdk-android to v25.10.1 by @renovate[bot] in https://github.com/element-hq/element-x-android/pull/5438 +* fix(deps): update dependency net.java.dev.jna:jna to v5.18.1 by @renovate[bot] in https://github.com/element-hq/element-x-android/pull/5437 +* fix(deps): update dependency io.mockk:mockk to v1.14.6 by @renovate[bot] in https://github.com/element-hq/element-x-android/pull/5441 +* Update gradle/actions action to v5 by @renovate[bot] in https://github.com/element-hq/element-x-android/pull/5444 +* fix(deps): update dependency io.sentry:sentry-android to v8.23.0 by @renovate[bot] in https://github.com/element-hq/element-x-android/pull/5442 +* fix(deps): update dependency org.maplibre.gl:android-sdk to v12 by @renovate[bot] in https://github.com/element-hq/element-x-android/pull/5455 +* fix(deps): update dependency com.posthog:posthog-android to v3.23.0 by @renovate[bot] in https://github.com/element-hq/element-x-android/pull/5463 +* fix(deps): update roborazzi to v1.50.0 by @renovate[bot] in https://github.com/element-hq/element-x-android/pull/5464 +* fix(deps): update telephoto to v0.18.0 by @renovate[bot] in https://github.com/element-hq/element-x-android/pull/5459 +### Others +* Ensure Metro `@AssistedInject` is used. by @bmarty in https://github.com/element-hq/element-x-android/pull/5420 +* Misc : destroy SpaceRoomList by @ganfra in https://github.com/element-hq/element-x-android/pull/5436 +* Remove CurrentSessionIdHolder and inject SessionId instead. by @bmarty in https://github.com/element-hq/element-x-android/pull/5440 +* Only offer to verify if a cross-signed device is available by @uhoreg in https://github.com/element-hq/element-x-android/pull/5433 +* Replace fun by val in MatrixClient by @bmarty in https://github.com/element-hq/element-x-android/pull/5466 +* Space : makes sure to use SpaceRoom.displayName from sdk by @ganfra in https://github.com/element-hq/element-x-android/pull/5476 +* Add preview with all icons in the Showkase browser by @bmarty in https://github.com/element-hq/element-x-android/pull/5485 +* Ensure that we are using Immutable instead of Persistent by @bmarty in https://github.com/element-hq/element-x-android/pull/5490 +* Reduce number of Previews for Avatar. by @bmarty in https://github.com/element-hq/element-x-android/pull/5495 +* Fix error when attempting to verify with recovery key with missing backup key by @uhoreg in https://github.com/element-hq/element-x-android/pull/5314 +* Sync strings by @bmarty in https://github.com/element-hq/element-x-android/pull/5499 +* feature(space): make sure to handle topic properly by @ganfra in https://github.com/element-hq/element-x-android/pull/5493 + +## New Contributors +* @uhoreg made their first contribution in https://github.com/element-hq/element-x-android/pull/5433 + +**Full Changelog**: https://github.com/element-hq/element-x-android/compare/v25.09.2...v25.10.0 + +Changes in Element X v25.09.2 +============================= + +## What's Changed +### ✨ Features +* Show progress dialog while we are sending invites in a room by @richvdh in https://github.com/element-hq/element-x-android/pull/5342 +* Call: RTC decline event support by @BillCarsonFr in https://github.com/element-hq/element-x-android/pull/5305 +* Add room info to the thread's top app bar by @jmartinesp in https://github.com/element-hq/element-x-android/pull/5374 +### 🙌 Improvements +* Use the new RtcNotification event instead of the now deprecated CallNotify by @BillCarsonFr in https://github.com/element-hq/element-x-android/pull/5357 +### 🐛 Bugfixes +* Increase Element Call audio init delay ensuring the right audio device is used by @jmartinesp in https://github.com/element-hq/element-x-android/pull/5315 +* Do not center the dialog title text for dialogs with no icon by @jmartinesp in https://github.com/element-hq/element-x-android/pull/5332 +* Media viewer: release the `ExoPlayers` when the hosting composables are disposed by @jmartinesp in https://github.com/element-hq/element-x-android/pull/5351 +* Make PushData.clientSecret mandatory. by @bmarty in https://github.com/element-hq/element-x-android/pull/5369 +* Cleanup ftue code and ensure verification confirmation is displayed by @bmarty in https://github.com/element-hq/element-x-android/pull/5379 +* Change in clear cache behavior by @bmarty in https://github.com/element-hq/element-x-android/pull/5388 +* fix (room navigation) : fix navigation when leaving room/space by @ganfra in https://github.com/element-hq/element-x-android/pull/5376 +* fix (timeline) : forward pagination regression by @ganfra in https://github.com/element-hq/element-x-android/pull/5389 +* When joining a call, wait for the `content_loaded` action by @jmartinesp in https://github.com/element-hq/element-x-android/pull/5399 +* Ensure the thread summary sender's display name won't wrap to the next line by @jmartinesp in https://github.com/element-hq/element-x-android/pull/5403 +### 🗣 Translations +* Sync Strings by @ElementBot in https://github.com/element-hq/element-x-android/pull/5349 +* Sync Strings by @ElementBot in https://github.com/element-hq/element-x-android/pull/5385 +### 🧱 Build +* Improve release script and the file Versions.kt by @bmarty in https://github.com/element-hq/element-x-android/pull/5318 +* Dependency: extract the Matrix SDK and add instructions for upgrading the library by @bmarty in https://github.com/element-hq/element-x-android/pull/5363 +* Add test on DefaultSpaceEntryPoint by @bmarty in https://github.com/element-hq/element-x-android/pull/5343 +### 🚧 In development 🚧 +* Space list by @bmarty in https://github.com/element-hq/element-x-android/pull/5320 +* Feature : Join Space (WIP) by @ganfra in https://github.com/element-hq/element-x-android/pull/5378 +### Dependency upgrades +* Update activity to v1.11.0 by @renovate[bot] in https://github.com/element-hq/element-x-android/pull/5324 +* Update dependency com.google.truth:truth to v1.4.5 by @renovate[bot] in https://github.com/element-hq/element-x-android/pull/5322 +* Update dependency io.sentry:sentry-android to v8.21.1 by @renovate[bot] in https://github.com/element-hq/element-x-android/pull/5310 +* Update dependency org.matrix.rustcomponents:sdk-android to v25.9.10 by @renovate[bot] in https://github.com/element-hq/element-x-android/pull/5323 +* Update dependency androidx.sqlite:sqlite-ktx to v2.6.0 by @renovate[bot] in https://github.com/element-hq/element-x-android/pull/5337 +* Update camera to v1.5.0 by @renovate[bot] in https://github.com/element-hq/element-x-android/pull/5336 +* Update dependency com.posthog:posthog-android to v3.21.2 by @renovate[bot] in https://github.com/element-hq/element-x-android/pull/5333 +* Update dependency com.google.testparameterinjector:test-parameter-injector to v1.19 by @renovate[bot] in https://github.com/element-hq/element-x-android/pull/5341 +* Upgrade Rust SDK bindings to v25.09.15 by @jmartinesp in https://github.com/element-hq/element-x-android/pull/5353 +* Update dependency org.matrix.rustcomponents:sdk-android to v25.9.16 by @renovate[bot] in https://github.com/element-hq/element-x-android/pull/5359 +* Update dependency org.matrix.rustcomponents:sdk-android to v25.9.18 by @renovate[bot] in https://github.com/element-hq/element-x-android/pull/5365 +* Update telephoto to v0.17.0 by @renovate[bot] in https://github.com/element-hq/element-x-android/pull/5350 +* Update dependency org.matrix.rustcomponents:sdk-android to v25.9.19 by @renovate[bot] in https://github.com/element-hq/element-x-android/pull/5377 +* Update dependency com.google.firebase:firebase-bom to v34.3.0 by @renovate[bot] in https://github.com/element-hq/element-x-android/pull/5367 +* Upgrade Element Call embedded dependency to `v0.16.0-rc.4` by @jmartinesp in https://github.com/element-hq/element-x-android/pull/5391 +* Update dependencyAnalysis to v3 (major) by @renovate[bot] in https://github.com/element-hq/element-x-android/pull/5194 +* Update dependency org.maplibre.gl:android-sdk to v11.13.5 by @renovate[bot] in https://github.com/element-hq/element-x-android/pull/5381 +* Update dependency org.matrix.rustcomponents:sdk-android to v25.9.23 by @renovate[bot] in https://github.com/element-hq/element-x-android/pull/5396 +* Update plugin dependencycheck to v12.1.5 by @renovate[bot] in https://github.com/element-hq/element-x-android/pull/5382 +* Update dependency io.sentry:sentry-android to v8.22.0 by @renovate[bot] in https://github.com/element-hq/element-x-android/pull/5397 +### Others +* Cleanup nodes by @bmarty in https://github.com/element-hq/element-x-android/pull/5358 +* Complete test on MediaGalleryPresenter by @bmarty in https://github.com/element-hq/element-x-android/pull/5361 +* Remove dead code by @bmarty in https://github.com/element-hq/element-x-android/pull/5306 +* Introduce BugReportFlowNode, and remove NavTarget.ViewLogs from RootFlowNode by @bmarty in https://github.com/element-hq/element-x-android/pull/5370 +* When logging out from Pin code screen, logout from all the sessions. by @bmarty in https://github.com/element-hq/element-x-android/pull/5372 +* Clean MatrixAuthenticationService and SessionStore API by @bmarty in https://github.com/element-hq/element-x-android/pull/5371 +* Add logs to detect duplicates in the room list by @jmartinesp in https://github.com/element-hq/element-x-android/pull/5364 +* Add troubleshoot notification test about blocked users by @bmarty in https://github.com/element-hq/element-x-android/pull/5394 +* Add thread decoration with latest event details by @jmartinesp in https://github.com/element-hq/element-x-android/pull/5355 +* Rework on messages view top bars by @bmarty in https://github.com/element-hq/element-x-android/pull/5401 +* Put developer settings at the end of the view by @p1gp1g in https://github.com/element-hq/element-x-android/pull/5387 + +## New Contributors +* @p1gp1g made their first contribution in https://github.com/element-hq/element-x-android/pull/5387 + +**Full Changelog**: https://github.com/element-hq/element-x-android/compare/v25.09.1...v25.09.2 + +Changes in Element X v25.09.1 +============================= + +## What's Changed + +We have migrated our DI libraries from Dagger and Anvil to Metro. If you need more details on the migration steps, please read the [documentation](https://github.com/element-hq/element-x-android/blob/develop/docs/migration_to_metro.md). + +### ✨ Features +* Allow replying to a message with an attachment by @jmartinesp in https://github.com/element-hq/element-x-android/pull/5261 +* Add emoji search to the reaction emoji picker by @jmartinesp in https://github.com/element-hq/element-x-android/pull/5255 +### 🙌 Improvements +* Spelling correction in Update FeatureFlags.kt by @escix in https://github.com/element-hq/element-x-android/pull/5232 +* [a11y] Add content descriptions to room list item indicators by @jmartinesp in https://github.com/element-hq/element-x-android/pull/5236 +* [a11y] Add click action to the message bottom sheet handle by @jmartinesp in https://github.com/element-hq/element-x-android/pull/5228 +### 🐛 Bugfixes +* Reload member list after moderation actions by @jmartinesp in https://github.com/element-hq/element-x-android/pull/5268 +* Restore view log code by @bmarty in https://github.com/element-hq/element-x-android/pull/5294 +* Detect mime type when picking a file by @bmarty in https://github.com/element-hq/element-x-android/pull/5291 +### 🗣 Translations +* Sync Strings by @ElementBot in https://github.com/element-hq/element-x-android/pull/5249 +* Sync Strings - new translations to Korean by @ElementBot in https://github.com/element-hq/element-x-android/pull/5286 +* Sync Strings by @ElementBot in https://github.com/element-hq/element-x-android/pull/5290 +### 🧱 Build +* Iterate on build chain by @bmarty in https://github.com/element-hq/element-x-android/pull/5272 +* Cleanup our DI solution and add documentation about the migration to Metro by @bmarty in https://github.com/element-hq/element-x-android/pull/5287 +* Revert agp to 8.11 by @bmarty in https://github.com/element-hq/element-x-android/pull/5311 +### 🚧 In development 🚧 +* Space: add content in home screen by @bmarty in https://github.com/element-hq/element-x-android/pull/5273 +* Hide the home navigation bar if the user is not a member of any Space. by @bmarty in https://github.com/element-hq/element-x-android/pull/5292 +### Dependency upgrades +* Update dependency org.maplibre.gl:android-sdk to v11.13.1 by @renovate[bot] in https://github.com/element-hq/element-x-android/pull/5239 +* Update dependency com.google.firebase:firebase-bom to v34.2.0 by @renovate[bot] in https://github.com/element-hq/element-x-android/pull/5245 +* Update dependency com.posthog:posthog-android to v3.21.0 by @renovate[bot] in https://github.com/element-hq/element-x-android/pull/5238 +* Update dependency org.matrix.rustcomponents:sdk-android to v25.9.1 by @renovate[bot] in https://github.com/element-hq/element-x-android/pull/5251 +* Update plugin sonarqube to v6.3.1.5724 by @renovate[bot] in https://github.com/element-hq/element-x-android/pull/5235 +* Update android.gradle.plugin to v8.12.2 by @renovate[bot] in https://github.com/element-hq/element-x-android/pull/5244 +* Update dependency io.element.android:emojibase-bindings to v1.4.3 by @renovate[bot] in https://github.com/element-hq/element-x-android/pull/5250 +* Update actions/setup-python action to v6 by @renovate[bot] in https://github.com/element-hq/element-x-android/pull/5270 +* Update dependency com.posthog:posthog-android to v3.21.1 by @renovate[bot] in https://github.com/element-hq/element-x-android/pull/5275 +* Migrate Anvil KSP to Metro by @jmartinesp in https://github.com/element-hq/element-x-android/pull/5253 +* Update actions/github-script action to v8 by @renovate[bot] in https://github.com/element-hq/element-x-android/pull/5284 +* Update codecov/codecov-action action to v5.5.1 by @renovate[bot] in https://github.com/element-hq/element-x-android/pull/5274 +* Update dependency io.sentry:sentry-android to v8.21.0 by @renovate[bot] in https://github.com/element-hq/element-x-android/pull/5293 +### Others +* Remove LoginUserStory. by @bmarty in https://github.com/element-hq/element-x-android/pull/5237 +* Update state in runUpdatingState when CancellationException occurs by @jbrenorv in https://github.com/element-hq/element-x-android/pull/5243 +* Refactor: Move InMemorySessionStore to test module by @bmarty in https://github.com/element-hq/element-x-android/pull/5252 +* Enable `largeHeap` option to have a larger max heap size by @jmartinesp in https://github.com/element-hq/element-x-android/pull/5258 +* Set a custom request config for the Client by @jmartinesp in https://github.com/element-hq/element-x-android/pull/5266 +* Set shortcut ID on received notifications to make them appear as a Conversation by @frebib in https://github.com/element-hq/element-x-android/pull/5192 +* Improve management of shortcut ids. by @bmarty in https://github.com/element-hq/element-x-android/pull/5303 + +## New Contributors +* @escix made their first contribution in https://github.com/element-hq/element-x-android/pull/5232 +* @jbrenorv made their first contribution in https://github.com/element-hq/element-x-android/pull/5243 + +**Full Changelog**: https://github.com/element-hq/element-x-android/compare/v25.09.0...v25.09.1 + +Changes in Element X v25.09.0 +============================= + +This release is the same as `25.08.4` but it includes performance fixes for the timeline load times, included in the Rust SDK version upgrade and internal changes for Element Call. + +## What's Changed +### 🧱 Build +* Revert "Try following KSP incremental best practices on `anvilcodegen`" by @bmarty in https://github.com/element-hq/element-x-android/pull/5233 +### Dependency upgrades +* Update dependency io.element.android:element-call-embedded to v0.15.0 by @renovate[bot] in https://github.com/element-hq/element-x-android/pull/5229 +* Update dependency org.matrix.rustcomponents:sdk-android to v25.8.26 by @renovate[bot] in https://github.com/element-hq/element-x-android/pull/5230 +* Downgrade sonar scanner gradle plugin to `v6.2.0.5505` by @jmartinesp in https://github.com/element-hq/element-x-android/pull/5234 + + +**Full Changelog**: https://github.com/element-hq/element-x-android/compare/v25.08.4...v25.09.0 + +Changes in Element X v25.08.4 +============================= + +## What's Changed +### ✨ Features +* Threads - first iteration by @jmartinesp in https://github.com/element-hq/element-x-android/pull/5165 +* Add shortcut suggestions for rooms, remove then when leaving by @jmartinesp in https://github.com/element-hq/element-x-android/pull/5180 +* Allow replying to any remote message in a thread by @jmartinesp in https://github.com/element-hq/element-x-android/pull/5201 +### 🙌 Improvements +* Create room flow rework by @bmarty in https://github.com/element-hq/element-x-android/pull/5166 +### 🐛 Bugfixes +* Fix bitrate value used for video transcoding by @jmartinesp in https://github.com/element-hq/element-x-android/pull/5183 +* Fix sending videos in Android 11 and lower by @jmartinesp in https://github.com/element-hq/element-x-android/pull/5186 +* Ensure that only one DataStore is active for the same file. by @bmarty in https://github.com/element-hq/element-x-android/pull/5198 +* Handle preference stores corruption by clearing them by @jmartinesp in https://github.com/element-hq/element-x-android/pull/5086 +* Use variable bitrate mode when transcoding to ensure compatibility with old devices by @jmartinesp in https://github.com/element-hq/element-x-android/pull/5223 +### 🗣 Translations +* Sync Strings by @ElementBot in https://github.com/element-hq/element-x-android/pull/5178 +* Sync Strings by @ElementBot in https://github.com/element-hq/element-x-android/pull/5211 +### 🧱 Build +* Build release with the latest build tools 36.0.0 by @bmarty in https://github.com/element-hq/element-x-android/pull/5173 +* Try following KSP incremental best practices on `anvilcodegen` by @jmartinesp in https://github.com/element-hq/element-x-android/pull/5205 +* Split deeplink module and remove setupAnvil from api modules by @bmarty in https://github.com/element-hq/element-x-android/pull/5210 +* Introduce a11y screenshot test by @bmarty in https://github.com/element-hq/element-x-android/pull/5214 +* Custom logo on on boarding screen. by @bmarty in https://github.com/element-hq/element-x-android/pull/5217 +### 🚧 In development 🚧 +* Space UI component by @bmarty in https://github.com/element-hq/element-x-android/pull/5197 +* Add UI components for spaces. by @bmarty in https://github.com/element-hq/element-x-android/pull/5207 +### Dependency upgrades +* Update core to v1.17.0 by @renovate[bot] in https://github.com/element-hq/element-x-android/pull/5168 +* Update kotlin by @renovate[bot] in https://github.com/element-hq/element-x-android/pull/5169 +* Update dependency org.matrix.rustcomponents:sdk-android to v25.8.18 by @renovate[bot] in https://github.com/element-hq/element-x-android/pull/5182 +* Update android.gradle.plugin to v8.12.1 by @renovate[bot] in https://github.com/element-hq/element-x-android/pull/5184 +* Update dagger to v2.57.1 by @renovate[bot] in https://github.com/element-hq/element-x-android/pull/5193 +* Update actions/setup-java action to v5 by @renovate[bot] in https://github.com/element-hq/element-x-android/pull/5196 +* Update codecov/codecov-action action to v5.5.0 by @renovate[bot] in https://github.com/element-hq/element-x-android/pull/5191 +* Update plugin ktlint to v13.1.0 by @renovate[bot] in https://github.com/element-hq/element-x-android/pull/5204 +* Update dependency com.posthog:posthog-android to v3.20.3 by @renovate[bot] in https://github.com/element-hq/element-x-android/pull/5206 +* Update dependency org.jsoup:jsoup to v1.21.2 by @renovate[bot] in https://github.com/element-hq/element-x-android/pull/5212 +* Update dependency com.posthog:posthog-android to v3.20.4 by @renovate[bot] in https://github.com/element-hq/element-x-android/pull/5213 +* Update plugin sonarqube to v6.3.0.5676 by @renovate[bot] in https://github.com/element-hq/element-x-android/pull/5220 +* Update dependency io.sentry:sentry-android to v8.20.0 by @renovate[bot] in https://github.com/element-hq/element-x-android/pull/5216 +* Update dependency org.matrix.rustcomponents:sdk-android to v25.8.25 by @renovate[bot] in https://github.com/element-hq/element-x-android/pull/5219 +### Others +* Iterate on invite people UI by @bmarty in https://github.com/element-hq/element-x-android/pull/5185 +* AnalyticsOptInStateProvider does not need to have an injected constructor by @bmarty in https://github.com/element-hq/element-x-android/pull/5215 +* Add extra logs for sending media by @jmartinesp in https://github.com/element-hq/element-x-android/pull/5218 +* Rename custom_logo to onboarding_logo by @bmarty in https://github.com/element-hq/element-x-android/pull/5226 +* Add unit test on VideoCompressorHelper by @bmarty in https://github.com/element-hq/element-x-android/pull/5227 + + +**Full Changelog**: https://github.com/element-hq/element-x-android/compare/v25.08.3...v25.08.4 + +Changes in Element X v25.08.3 +============================= + +## What's Changed +### ✨ Features +* Add media file limit size warning and media quality selection by @jmartinesp in https://github.com/element-hq/element-x-android/pull/5131 +### 🐛 Bugfixes +* Fix cursor position in room list search by @jmartinesp in https://github.com/element-hq/element-x-android/pull/5138 +* Fix leaving the room not always dismissing the room screen by @jmartinesp in https://github.com/element-hq/element-x-android/pull/5089 +* Do not automatically initialize `DefaultVideoMetadataExtractor`'s data source by @jmartinesp in https://github.com/element-hq/element-x-android/pull/5157 +* Provide calculated server names when opening a room from another by @jmartinesp in https://github.com/element-hq/element-x-android/pull/5155 +### 🗣 Translations +* Sync Strings by @ElementBot in https://github.com/element-hq/element-x-android/pull/5146 +### 🧱 Build +* Compile and target sdk36 by @bmarty in https://github.com/element-hq/element-x-android/pull/5150 +* Fix Maestro regression when coming back from room to the search screen by @jmartinesp in https://github.com/element-hq/element-x-android/pull/5156 +### Dependency upgrades +* Update android.gradle.plugin to v8.12.0 by @renovate[bot] in https://github.com/element-hq/element-x-android/pull/5106 +* Update wysiwyg to v2.39.0 by @renovate[bot] in https://github.com/element-hq/element-x-android/pull/5080 +* Update dependency python to 3.13 by @renovate[bot] in https://github.com/element-hq/element-x-android/pull/5144 +* Update rnkdsh/action-upload-diawi action to v1.5.11 by @renovate[bot] in https://github.com/element-hq/element-x-android/pull/5141 +* Update dependency io.github.sergio-sastre.ComposablePreviewScanner:android to v0.7.0 by @renovate[bot] in https://github.com/element-hq/element-x-android/pull/5143 +* Update actions/checkout action to v5 by @renovate[bot] in https://github.com/element-hq/element-x-android/pull/5148 +* Update dependency io.sentry:sentry-android to v8.19.0 by @renovate[bot] in https://github.com/element-hq/element-x-android/pull/5149 +* Update dependency io.sentry:sentry-android to v8.19.1 by @renovate[bot] in https://github.com/element-hq/element-x-android/pull/5158 +* Update dependency androidx.browser:browser to v1.9.0 by @renovate[bot] in https://github.com/element-hq/element-x-android/pull/5096 +* Update Compose bom to 2025.07.00 by @bmarty in https://github.com/element-hq/element-x-android/pull/5164 +* Update showkase to v1.0.5 by @renovate[bot] in https://github.com/element-hq/element-x-android/pull/5117 +* Update haze to v1.6.10 by @renovate[bot] in https://github.com/element-hq/element-x-android/pull/5167 +### Others +* Let enterprise build be able to override (or disable) the bug report URL. by @bmarty in https://github.com/element-hq/element-x-android/pull/5139 +* Hide the recovery key while we are entering it by @jmartinesp in https://github.com/element-hq/element-x-android/pull/5147 +* Remove old feature flags by @bmarty in https://github.com/element-hq/element-x-android/pull/5160 +* Move push history entry point from notification settings to developer settings by @bmarty in https://github.com/element-hq/element-x-android/pull/5161 + + +**Full Changelog**: https://github.com/element-hq/element-x-android/compare/v25.08.2...v25.08.3 + +Changes in Element X v25.08.2 +============================= + + + +## 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 +============================= + + + +## What's Changed +### 🙌 Improvements +* Force last owner of a room to pass ownership when leaving by @jmartinesp in https://github.com/element-hq/element-x-android/pull/5094 +### 🐛 Bugfixes +* Reload room member list when active members count changes by @jmartinesp in https://github.com/element-hq/element-x-android/pull/5129 +* Delegate call notifications to Element Call, upgrade SDK and EC embedded by @jmartinesp in https://github.com/element-hq/element-x-android/pull/5119 +### 🗣 Translations +* Sync Strings by @ElementBot in https://github.com/element-hq/element-x-android/pull/5112 +### Dependency upgrades +* Update media3 to v1.8.0 by @renovate[bot] in https://github.com/element-hq/element-x-android/pull/5101 + + +**Full Changelog**: https://github.com/element-hq/element-x-android/compare/v25.08.0...v25.08.1 + +Changes in Element X v25.08.0 +============================= + + + +## What's Changed +### 🐛 Bugfixes +* Fix `toPlainText` where `
    ` tags appear by @jmartinesp in https://github.com/element-hq/element-x-android/pull/5044 +* Remove the scaling added in `Player.Listener.onVideoSizeChanged` by @jmartinesp in https://github.com/element-hq/element-x-android/pull/5055 +* Make sure we clean up the pre-processed and uploaded media by @jmartinesp in https://github.com/element-hq/element-x-android/pull/5039 +* Calculate video output size taking into account portrait mode by @jmartinesp in https://github.com/element-hq/element-x-android/pull/5068 +* Prevent loop when exiting the attachments preview screen by @jmartinesp in https://github.com/element-hq/element-x-android/pull/5078 +* Prevent crash caused by re-release of wakelock in calls by @jmartinesp in https://github.com/element-hq/element-x-android/pull/5077 +* Make sure we display errors when we create a recovery key and it fails by @jmartinesp in https://github.com/element-hq/element-x-android/pull/5079 +* Fix crash when trying to get active notifications by @jmartinesp in https://github.com/element-hq/element-x-android/pull/5085 +* Adapt 'change roles' screens to the new creator/owner role by @jmartinesp in https://github.com/element-hq/element-x-android/pull/5076 +### 🗣 Translations +* Sync Strings by @ElementBot in https://github.com/element-hq/element-x-android/pull/5021 +* Sync Strings by @ElementBot in https://github.com/element-hq/element-x-android/pull/5054 +* Sync Strings by @ElementBot in https://github.com/element-hq/element-x-android/pull/5083 +### 🧱 Build +* Disable Element Call Maestro tests for the time being by @jmartinesp in https://github.com/element-hq/element-x-android/pull/5064 +### 📄 Documentation +* Grammar fixes for docs and comments by @andybalaam in https://github.com/element-hq/element-x-android/pull/5043 +* Note how to switch back to the published SDK after building locally by @andybalaam in https://github.com/element-hq/element-x-android/pull/5042 +### Dependency upgrades +* Update dependency io.mockk:mockk to v1.14.5 by @renovate[bot] in https://github.com/element-hq/element-x-android/pull/5037 +* Update dependency androidx.lifecycle:lifecycle-process to v2.9.2 by @renovate[bot] in https://github.com/element-hq/element-x-android/pull/5036 +* Update dagger to v2.57 by @renovate[bot] in https://github.com/element-hq/element-x-android/pull/5038 +* Update haze to v1.6.9 by @renovate[bot] in https://github.com/element-hq/element-x-android/pull/5045 +* Update dependency io.nlopez.compose.rules:detekt to v0.4.24 by @renovate[bot] in https://github.com/element-hq/element-x-android/pull/5053 +* Update dependency io.nlopez.compose.rules:detekt to v0.4.25 by @renovate[bot] in https://github.com/element-hq/element-x-android/pull/5058 +* Update coil to v3.3.0 by @renovate[bot] in https://github.com/element-hq/element-x-android/pull/5063 +* Update dependency io.nlopez.compose.rules:detekt to v0.4.26 by @renovate[bot] in https://github.com/element-hq/element-x-android/pull/5065 +* Update dependency com.posthog:posthog-android to v3.20.0 by @renovate[bot] in https://github.com/element-hq/element-x-android/pull/5067 +* Update dependency com.google.firebase:firebase-bom to v34 by @renovate[bot] in https://github.com/element-hq/element-x-android/pull/5061 +* Update dependency org.matrix.rustcomponents:sdk-android to v25.7.23 by @renovate[bot] in https://github.com/element-hq/element-x-android/pull/5073 +* Update dependency com.posthog:posthog-android to v3.20.1 by @renovate[bot] in https://github.com/element-hq/element-x-android/pull/5087 +* Update dependency org.matrix.rustcomponents:sdk-android to v25.7.28 by @renovate[bot] in https://github.com/element-hq/element-x-android/pull/5088 +* Update dependency org.maplibre.gl:android-sdk to v11.13.0 by @renovate[bot] in https://github.com/element-hq/element-x-android/pull/5093 +* Update dependency androidx.test:runner to v1.7.0 by @renovate[bot] in https://github.com/element-hq/element-x-android/pull/5102 +* Update test.core to v1.7.0 by @renovate[bot] in https://github.com/element-hq/element-x-android/pull/5104 +* Update dependency androidx.test.ext:junit to v1.3.0 by @renovate[bot] in https://github.com/element-hq/element-x-android/pull/5103 +* Update dependency io.sentry:sentry-android to v8.18.0 by @renovate[bot] in https://github.com/element-hq/element-x-android/pull/5097 +### Others +* Iterate on FloatingActionButton shape and colors. by @bmarty in https://github.com/element-hq/element-x-android/pull/5033 +* [a11y] Improve session verification screens by @bmarty in https://github.com/element-hq/element-x-android/pull/5017 +* misc (room id) : add room id regex pattern to match new versions by @ganfra in https://github.com/element-hq/element-x-android/pull/5040 +* Use lower level APIs to draw the message bubbles by @jmartinesp in https://github.com/element-hq/element-x-android/pull/5056 +* misc (store description) : update store description for fastlane by @ganfra in https://github.com/element-hq/element-x-android/pull/5060 +* [a11y] Improve accessibility on avatar when creating a room. by @bmarty in https://github.com/element-hq/element-x-android/pull/5046 +* Add fallback notifications from UTDs to the push history by @jmartinesp in https://github.com/element-hq/element-x-android/pull/5047 +* feature (media send queue) : enable send queue by default by @ganfra in https://github.com/element-hq/element-x-android/pull/5098 +* misc : re-enable share pos by default by @ganfra in https://github.com/element-hq/element-x-android/pull/5108 + + +**Full Changelog**: https://github.com/element-hq/element-x-android/compare/v25.07.1...v25.08.0 + +Changes in Element X v25.07.1 +============================= + + + +## What's Changed +### 🐛 Bugfixes +* fix ( room list) : rebuild with filteredSummaries to avoid bad state by @ganfra in https://github.com/element-hq/element-x-android/pull/4993 +* Keep video rotation metadata when transcoding by @jmartinesp in https://github.com/element-hq/element-x-android/pull/5008 +### 🗣 Translations +* Sync Strings by @ElementBot in https://github.com/element-hq/element-x-android/pull/4988 +### 🧱 Build +* Update Gradle Wrapper from 8.14.2 to 8.14.3 by @ElementBot in https://github.com/element-hq/element-x-android/pull/4985 +* Stop ignoring dependencies, but instead set `open-pull-requests-limit to 0 by @bmarty in https://github.com/element-hq/element-x-android/pull/5013 +### 📄 Documentation +* Update to the status and clarifications with respect to the legacy app. by @mxandreas in https://github.com/element-hq/element-x-android/pull/5016 +### 🚧 In development 🚧 +* Home navigation bar fixes by @bmarty in https://github.com/element-hq/element-x-android/pull/4990 +* Home screen iteration by @bmarty in https://github.com/element-hq/element-x-android/pull/5003 +### Dependency upgrades +* Update dependency io.element.android:compound-android to v25.7.4 by @renovate[bot] in https://github.com/element-hq/element-x-android/pull/4984 +* Update dependency org.matrix.rustcomponents:sdk-android to v25.7.7 by @renovate[bot] in https://github.com/element-hq/element-x-android/pull/4989 +* Update plugin ktlint to v13 by @renovate[bot] in https://github.com/element-hq/element-x-android/pull/4992 +* Update dependency org.jetbrains.kotlinx:kotlinx-datetime to v0.7.1-0.6.x-compat by @renovate[bot] in https://github.com/element-hq/element-x-android/pull/4991 +* Update haze to v1.6.7 by @renovate[bot] in https://github.com/element-hq/element-x-android/pull/4987 +* Update dependency com.squareup.okhttp3:okhttp-bom to v5 by @renovate[bot] in https://github.com/element-hq/element-x-android/pull/4979 +* Update dependency io.sentry:sentry-android to v8.17.0 by @renovate[bot] in https://github.com/element-hq/element-x-android/pull/4998 +* Update dependency com.squareup.okhttp3:okhttp-bom to v5.1.0 by @renovate[bot] in https://github.com/element-hq/element-x-android/pull/4997 +* Update dependency org.maplibre.gl:android-sdk to v11.12.0 by @renovate[bot] in https://github.com/element-hq/element-x-android/pull/5001 +* Update dependency com.posthog:posthog-android to v3.19.2 by @renovate[bot] in https://github.com/element-hq/element-x-android/pull/5009 +* Update dependency org.maplibre.gl:android-sdk to v11.12.1 by @renovate[bot] in https://github.com/element-hq/element-x-android/pull/5006 +* Update android.gradle.plugin to v8.11.1 by @renovate[bot] in https://github.com/element-hq/element-x-android/pull/5014 +* Update rnkdsh/action-upload-diawi action to v1.5.10 by @renovate[bot] in https://github.com/element-hq/element-x-android/pull/5019 +* Update wysiwyg to v2.38.5 by @renovate[bot] in https://github.com/element-hq/element-x-android/pull/5025 +* Update haze to v1.6.8 by @renovate[bot] in https://github.com/element-hq/element-x-android/pull/5026 +* Update dependency org.matrix.rustcomponents:sdk-android to v25.7.15 by @renovate[bot] in https://github.com/element-hq/element-x-android/pull/5011 +### Others +* Remove bloom effect and replace by linear gradient by @bmarty in https://github.com/element-hq/element-x-android/pull/4926 +* misc (a11y) : mark MainActionButton icon as decorative by @ganfra in https://github.com/element-hq/element-x-android/pull/4996 +* Make `ContentAvoidingLayoutData` an immutable data class by @jmartinesp in https://github.com/element-hq/element-x-android/pull/4999 +* Remove unused composable and cleanup colors by @bmarty in https://github.com/element-hq/element-x-android/pull/5000 +* Add a feature flag to reuse the last `pos` value for initial syncs by @jmartinesp in https://github.com/element-hq/element-x-android/pull/5010 +* [a11y] Fix several issues around accessibility by @bmarty in https://github.com/element-hq/element-x-android/pull/5007 +* Replace video transcoder with Media3 Transformer by @jmartinesp in https://github.com/element-hq/element-x-android/pull/5018 + + +**Full Changelog**: https://github.com/element-hq/element-x-android/compare/v25.07.0...v25.07.1 + +Changes in Element X v25.07.0 +============================= + + + +## What's Changed +### 🙌 Improvements +* Change : handle invalid invite error by @ganfra in https://github.com/element-hq/element-x-android/pull/4909 +* Add ability to zoom on video. by @bmarty in https://github.com/element-hq/element-x-android/pull/4916 +* Change : sync moderation and safety preferences with server by @ganfra in https://github.com/element-hq/element-x-android/pull/4962 +### 🐛 Bugfixes +* Restore `MarkdownEditText.focusSearch` override by @jmartinesp in https://github.com/element-hq/element-x-android/pull/4908 +* Fix duplicate usage of a `modifier` variable in `TextInputBox` by @jmartinesp in https://github.com/element-hq/element-x-android/pull/4928 +### 🗣 Translations +* Sync Strings - new translations to Danish by @ElementBot in https://github.com/element-hq/element-x-android/pull/4913 +* Sync Strings by @ElementBot in https://github.com/element-hq/element-x-android/pull/4983 +### 🧱 Build +* a11y: Add scripts to enable and disable the talkback service by @jmartinesp in https://github.com/element-hq/element-x-android/pull/4906 +* Update min api level to 33 for Element enterprise by @bmarty in https://github.com/element-hq/element-x-android/pull/4960 +### 🚧 In development 🚧 +* Rename module roomlist to home by @bmarty in https://github.com/element-hq/element-x-android/pull/4955 +* Home navigation bar by @bmarty in https://github.com/element-hq/element-x-android/pull/4964 +### Dependency upgrades +* fix(deps): update dependency org.unifiedpush.android:connector to v3.0.10 by @renovate in https://github.com/element-hq/element-x-android/pull/4871 +* fix(deps): update dependency io.sentry:sentry-android to v8.14.0 by @renovate in https://github.com/element-hq/element-x-android/pull/4892 +* fix(deps): update dependency com.google.crypto.tink:tink-android to v1.18.0 by @renovate in https://github.com/element-hq/element-x-android/pull/4897 +* fix(deps): update wysiwyg to v2.38.4 by @renovate in https://github.com/element-hq/element-x-android/pull/4907 +* fix(deps): update dependency org.robolectric:robolectric to v4.15 by @renovate in https://github.com/element-hq/element-x-android/pull/4901 +* fix(deps): update dependency androidx.sqlite:sqlite-ktx to v2.5.2 by @renovate in https://github.com/element-hq/element-x-android/pull/4898 +* fix(deps): update dependency io.mockk:mockk to v1.14.4 by @renovate in https://github.com/element-hq/element-x-android/pull/4912 +* fix(deps): update dependency org.robolectric:robolectric to v4.15.1 by @renovate in https://github.com/element-hq/element-x-android/pull/4911 +* fix(deps): update dependency org.matrix.rustcomponents:sdk-android to v25.6.23 by @renovate in https://github.com/element-hq/element-x-android/pull/4917 +* fix(deps): update dependencyanalysis to v2.19.0 by @renovate in https://github.com/element-hq/element-x-android/pull/4932 +* fix(deps): update dependency org.jsoup:jsoup to v1.21.1 by @renovate in https://github.com/element-hq/element-x-android/pull/4914 +* fix(deps): update dependency org.matrix.rustcomponents:sdk-android to v25.6.25 by @renovate in https://github.com/element-hq/element-x-android/pull/4936 +* fix(deps): update dependency io.sentry:sentry-android to v8.15.0 by @renovate in https://github.com/element-hq/element-x-android/pull/4938 +* fix(deps): update dependency org.maplibre.gl:android-sdk to v11.11.0 by @renovate in https://github.com/element-hq/element-x-android/pull/4939 +* fix(deps): update dependency com.google.firebase:firebase-bom to v33.16.0 by @renovate in https://github.com/element-hq/element-x-android/pull/4945 +* fix(deps): update dependency io.sentry:sentry-android to v8.16.0 by @renovate in https://github.com/element-hq/element-x-android/pull/4941 +* Update sdk to version 25.7.1 by @bmarty in https://github.com/element-hq/element-x-android/pull/4966 +* Update haze to v1.6.6 by @renovate in https://github.com/element-hq/element-x-android/pull/4968 +* Update dependency com.google.gms:google-services to v4.4.3 by @renovate in https://github.com/element-hq/element-x-android/pull/4946 +* Update android.gradle.plugin to v8.11.0 by @renovate in https://github.com/element-hq/element-x-android/pull/4931 +* Update dependency io.element.android:element-call-embedded to v0.13.0 by @renovate in https://github.com/element-hq/element-x-android/pull/4969 +* Update dependency org.matrix.rustcomponents:sdk-android to v25.7.2 by @renovate in https://github.com/element-hq/element-x-android/pull/4967 +* Upgrade compose bom to 2025.06.01 by @bmarty in https://github.com/element-hq/element-x-android/pull/4970 +* Update kotlin by @renovate in https://github.com/element-hq/element-x-android/pull/4918 +* Update dependency io.element.android:element-call-embedded to v0.13.1 by @renovate in https://github.com/element-hq/element-x-android/pull/4977 +* Update dependency org.matrix.rustcomponents:sdk-android to v25.7.3 by @ganfra in https://github.com/element-hq/element-x-android/pull/4976 +### Others +* a11y: Make isTalkbackActive() live. by @bmarty in https://github.com/element-hq/element-x-android/pull/4903 +* a11y: improve accessibility on grouped state events header. by @bmarty in https://github.com/element-hq/element-x-android/pull/4902 +* Room debug info by @bmarty in https://github.com/element-hq/element-x-android/pull/4904 +* [a11y] Improve accessibility of message composer by @bmarty in https://github.com/element-hq/element-x-android/pull/4900 +* refactor: Migrate SQLCipher Android to new API by @ShadowRZ in https://github.com/element-hq/element-x-android/pull/4874 +* Iterate on avatar to be able to render Space avatar. by @bmarty in https://github.com/element-hq/element-x-android/pull/4921 +* Simplify syncing the room list when receiving a push by @jmartinesp in https://github.com/element-hq/element-x-android/pull/4915 +* Add unit test on ChooseAccountProviderState so that the coverage is above 90% by @bmarty in https://github.com/element-hq/element-x-android/pull/4924 +* Iterate on avatar to be able to render Space avatar Part2 by @bmarty in https://github.com/element-hq/element-x-android/pull/4923 +* Introduce SessionEnterpriseService. by @bmarty in https://github.com/element-hq/element-x-android/pull/4925 +* Simplify message composer layout by @jmartinesp in https://github.com/element-hq/element-x-android/pull/4884 +* Display error dialog if Element Call can't be joined by @jmartinesp in https://github.com/element-hq/element-x-android/pull/4919 +* misc : simplify timeline diff logic by @ganfra in https://github.com/element-hq/element-x-android/pull/4930 +* Navigation bar component by @bmarty in https://github.com/element-hq/element-x-android/pull/4940 +* a11y: improve content description of the close buttons by @bmarty in https://github.com/element-hq/element-x-android/pull/4943 +* Element Call: remove top app bar and add it inside the webview instead by @jmartinesp in https://github.com/element-hq/element-x-android/pull/4927 +* Replace the Report a problem button with the app's version on the on boading screen. by @bmarty in https://github.com/element-hq/element-x-android/pull/4944 +* Split RoomListPresenter and introduce HomePresenter by @bmarty in https://github.com/element-hq/element-x-android/pull/4958 +* Add "View avatar" content description to all clickable Avatar that will open the avatar preview. by @bmarty in https://github.com/element-hq/element-x-android/pull/4948 +* [a11y] Ensure that the focus is not lost when the send button state change by @bmarty in https://github.com/element-hq/element-x-android/pull/4975 +* [a11y] add missing heading() qualifier on screen titles and other headers by @bmarty in https://github.com/element-hq/element-x-android/pull/4980 +* misc (tracing) : add new TraceLogPack.Notification by @ganfra in https://github.com/element-hq/element-x-android/pull/4981 + + +**Full Changelog**: https://github.com/element-hq/element-x-android/compare/v25.06.3...v25.07.0 + +Changes in Element X v25.06.3 +============================= + +## What's Changed +### ✨ Features +* Feature : room version upgrade by @ganfra in https://github.com/element-hq/element-x-android/pull/4862 +* Add a developer option for history sharing on invite by @richvdh in https://github.com/element-hq/element-x-android/pull/4821 +### 🙌 Improvements +* Change : add tombstoned room decoration by @ganfra in https://github.com/element-hq/element-x-android/pull/4891 +* Show generic notification when Event cannot be resolved by @bmarty in https://github.com/element-hq/element-x-android/pull/4889 +### 🐛 Bugfixes +* [a11y] Improve screen reader on polls by @bmarty in https://github.com/element-hq/element-x-android/pull/4875 +* fix (event action): allow to edit only if permission to send message by @ganfra in https://github.com/element-hq/element-x-android/pull/4895 +* fix (room upgrade) : room predecessor banner on DM room by @ganfra in https://github.com/element-hq/element-x-android/pull/4896 +* fix (join room) : do not navigate up when join is successful by @ganfra in https://github.com/element-hq/element-x-android/pull/4899 +### 🗣 Translations +* Sync Strings by @ElementBot in https://github.com/element-hq/element-x-android/pull/4842 +* Sync Strings by @ElementBot in https://github.com/element-hq/element-x-android/pull/4881 +### Dependency upgrades +* chore(deps): update plugin dependencycheck to v12.1.3 by @renovate in https://github.com/element-hq/element-x-android/pull/4856 +* fix(deps): update dependency org.maplibre.gl:android-sdk to v11.10.2 by @renovate in https://github.com/element-hq/element-x-android/pull/4858 +* fix(deps): update kotlin to v2.1.21-2.0.2 by @renovate in https://github.com/element-hq/element-x-android/pull/4850 +* fix(deps): update dependency app.cash.turbine:turbine to v1.2.1 by @renovate in https://github.com/element-hq/element-x-android/pull/4865 +* Update dependency com.posthog:posthog-android to v3.18.0 by @renovate in https://github.com/element-hq/element-x-android/pull/4873 +* Update dependency org.maplibre.gl:android-sdk to v11.10.3 by @renovate in https://github.com/element-hq/element-x-android/pull/4879 +* fix(deps): update dependency com.posthog:posthog-android to v3.19.0 by @renovate in https://github.com/element-hq/element-x-android/pull/4882 +* fix(deps): update dependency io.sentry:sentry-android to v8.13.3 by @renovate in https://github.com/element-hq/element-x-android/pull/4870 +* fix(deps): update showkase to v1.0.4 by @renovate in https://github.com/element-hq/element-x-android/pull/4878 +* fix(deps): update dependency org.matrix.rustcomponents:sdk-android to v25.6.18 by @renovate in https://github.com/element-hq/element-x-android/pull/4894 +### Others +* Annotate Composable functions with `@ReadOnlyComposable` where it's possible by @bmarty in https://github.com/element-hq/element-x-android/pull/4859 +* Add documentation on WebViewPipController by @bmarty in https://github.com/element-hq/element-x-android/pull/4861 +* Small cleanup around log tag. by @bmarty in https://github.com/element-hq/element-x-android/pull/4860 +* Another cleanup by @bmarty in https://github.com/element-hq/element-x-android/pull/4869 +* Disable BT audio devices for Element Call on Android < 12 by @jmartinesp in https://github.com/element-hq/element-x-android/pull/4876 +* Add a banner to ask the user to disable battery optimization when Event cannot be resolved from Push by @bmarty in https://github.com/element-hq/element-x-android/pull/4845 +* a11y: improve accessibility on rich text editor options. by @bmarty in https://github.com/element-hq/element-x-android/pull/4886 +* A11Y: improve accessibility on event reactions. by @bmarty in https://github.com/element-hq/element-x-android/pull/4877 + + +**Full Changelog**: https://github.com/element-hq/element-x-android/compare/v25.06.2...v25.06.3 + +Changes in Element X v25.06.2 +============================= + +## What's Changed +### 🐛 Bugfixes +* Fix crash when using Element Call on API <= 30 by @jmartinesp in https://github.com/element-hq/element-x-android/pull/4847 +* Element Call: add delay before selecting the default audio device by @jmartinesp in https://github.com/element-hq/element-x-android/pull/4854 +* Fix for message composer losing focus in Compose 1.8.0 by @jmartinesp in https://github.com/element-hq/element-x-android/pull/4853 +### Dependency upgrades +* chore(deps): update plugin dependencycheck to v12.1.2 by @renovate in https://github.com/element-hq/element-x-android/pull/4840 +* deps (matrix rust sdk) : bump version to 25.06.10 by @ganfra in https://github.com/element-hq/element-x-android/pull/4855 +### Others +* feat: Support matrix: links by @ShadowRZ in https://github.com/element-hq/element-x-android/pull/4839 + + +**Full Changelog**: https://github.com/element-hq/element-x-android/compare/v25.06.1...v25.06.2 + +## What's Changed +### ✨ Features +* Enable support for Android Auto. by @bmarty in https://github.com/element-hq/element-x-android/pull/4818 +* Element Call: Add audio output selector handled by Android by @jmartinesp in https://github.com/element-hq/element-x-android/pull/4663 +### 🙌 Improvements +* Oidc: Fallback to external browser instead of using Webview by @bmarty in https://github.com/element-hq/element-x-android/pull/4808 +* change (room member moderation) : update icon to match figma by @ganfra in https://github.com/element-hq/element-x-android/pull/4837 +### 🐛 Bugfixes +* Fix login flow by @bmarty in https://github.com/element-hq/element-x-android/pull/4813 +* fix: When sending media as files use the `octet-stream` type by @jmartinesp in https://github.com/element-hq/element-x-android/pull/4815 +* fix: Make `Client.findDM` return a `Result` by @jmartinesp in https://github.com/element-hq/element-x-android/pull/4816 +* Mark room as fully read when user goes back to the room list. by @bmarty in https://github.com/element-hq/element-x-android/pull/2687 +* fix (identity change) : RoomMemberIdentityStateChange in non encrypted room by @ganfra in https://github.com/element-hq/element-x-android/pull/4824 +* Fix room and user avatar downloaded with a `.bin` extension. by @bmarty in https://github.com/element-hq/element-x-android/pull/4830 +* Log the push resolving failure reason if available by @jmartinesp in https://github.com/element-hq/element-x-android/pull/4835 +### 🧱 Build +* Update Gradle Wrapper from 8.14.1 to 8.14.2 by @ElementBot in https://github.com/element-hq/element-x-android/pull/4831 +### Dependency upgrades +* fix(deps): update dependency androidx.compose:compose-bom to v2025.04.01 by @renovate in https://github.com/element-hq/element-x-android/pull/4631 +* fix(deps): update dependency androidx.compose:compose-bom to v2025.05.01 by @renovate in https://github.com/element-hq/element-x-android/pull/4814 +* fix(deps): update dependency io.sentry:sentry-android to v8.13.2 by @renovate in https://github.com/element-hq/element-x-android/pull/4780 +* fix(deps): update appyx to v1.7.1 by @renovate in https://github.com/element-hq/element-x-android/pull/4672 +* fix(deps): update telephoto to v0.16.0 by @renovate in https://github.com/element-hq/element-x-android/pull/4749 +* fix(deps): update coil to v3.2.0 by @renovate in https://github.com/element-hq/element-x-android/pull/4712 +* fix(deps): update dependency androidx.webkit:webkit to v1.14.0 by @renovate in https://github.com/element-hq/element-x-android/pull/4823 +* fix(deps): update dependency com.posthog:posthog-android to v3.17.0 by @renovate in https://github.com/element-hq/element-x-android/pull/4827 +* fix(deps): update dependency io.element.android:element-call-embedded to v0.12.2 by @renovate in https://github.com/element-hq/element-x-android/pull/4832 +* fix(deps): update dependency com.google.firebase:firebase-bom to v33.15.0 by @renovate in https://github.com/element-hq/element-x-android/pull/4833 +* fix(deps): update dependency org.maplibre.gl:android-sdk to v11.10.1 by @renovate in https://github.com/element-hq/element-x-android/pull/4825 +* fix(deps): update lifecycle to v2.9.1 by @renovate in https://github.com/element-hq/element-x-android/pull/4822 +* fix(deps): update dependency org.matrix.rustcomponents:sdk-android to v25.6.6 by @renovate in https://github.com/element-hq/element-x-android/pull/4834 +* fix(deps): update dependency io.element.android:opusencoder to v1.2.0 by @renovate in https://github.com/element-hq/element-x-android/pull/4836 +### Others +* Add `catchingExceptions` method to replace `runCatching` by @jmartinesp in https://github.com/element-hq/element-x-android/pull/4797 +* Rename classes overriding classes from the FFI layer. by @bmarty in https://github.com/element-hq/element-x-android/pull/4817 +* Fix coroutine scope by @bmarty in https://github.com/element-hq/element-x-android/pull/4820 +* Add extra logs the 'send call notification' flow by @jmartinesp in https://github.com/element-hq/element-x-android/pull/4819 +* misc (matrix) : use innerClient.subscribeToRoomInfo sdk method by @ganfra in https://github.com/element-hq/element-x-android/pull/4838 + + +**Full Changelog**: https://github.com/element-hq/element-x-android/compare/v25.06.0...v25.06.1 + +Changes in Element X v25.06.0 +============================= + +Rust SDK: https://github.com/matrix-org/matrix-rust-sdk/releases/tag/matrix-sdk-ffi%2F20250603 + +## What's Changed +### ✨ Features +* Add support for login link by @bmarty in https://github.com/element-hq/element-x-android/pull/4752 +### 🙌 Improvements +* On boarding flow: add a screen to select account provider among a fixed list by @bmarty in https://github.com/element-hq/element-x-android/pull/4769 +* Change : RoomMember moderation by @ganfra in https://github.com/element-hq/element-x-android/pull/4779 +### 🐛 Bugfixes +* Fix left room membership change by @ganfra in https://github.com/element-hq/element-x-android/pull/4765 +* fix: exclude more domains from being backed up by the system by @lucasmz-dev in https://github.com/element-hq/element-x-android/pull/4773 +* Make sure HeaderFooterPage contents can be scrolled by @jmartinesp in https://github.com/element-hq/element-x-android/pull/4704 +* Fix mobile link by @bmarty in https://github.com/element-hq/element-x-android/pull/4805 +### 🗣 Translations +* Sync Strings by @ElementBot in https://github.com/element-hq/element-x-android/pull/4775 +* Sync Strings by @ElementBot in https://github.com/element-hq/element-x-android/pull/4804 +### 🧱 Build +* Maestro: fix MAS and EC breaking the tests by @jmartinesp in https://github.com/element-hq/element-x-android/pull/4762 +* Update Gradle Wrapper from 8.14 to 8.14.1 by @ElementBot in https://github.com/element-hq/element-x-android/pull/4766 +* Stronger lambda error by @bmarty in https://github.com/element-hq/element-x-android/pull/4771 +* Use Localazy's `langAliases` for Indonesian language by @jmartinesp in https://github.com/element-hq/element-x-android/pull/4801 +### Dependency upgrades +* fix(deps): update datastore to v1.1.7 by @renovate in https://github.com/element-hq/element-x-android/pull/4754 +* fix(deps): update dependency org.maplibre.gl:android-sdk to v11.8.8 by @renovate in https://github.com/element-hq/element-x-android/pull/4721 +* chore(deps): update plugin ktlint to v12.3.0 by @renovate in https://github.com/element-hq/element-x-android/pull/4767 +* fix(deps): update dependency com.google.firebase:firebase-bom to v33.14.0 by @renovate in https://github.com/element-hq/element-x-android/pull/4755 +* Update UnifiedPush library by @bmarty in https://github.com/element-hq/element-x-android/pull/4358 +* fix(deps): update sqldelight to v2.1.0 by @renovate in https://github.com/element-hq/element-x-android/pull/4735 +* fix(deps): update dependency org.matrix.rustcomponents:sdk-android to v25.5.26 by @renovate in https://github.com/element-hq/element-x-android/pull/4781 +* fix(deps): update dependency com.posthog:posthog-android to v3.15.1 by @renovate in https://github.com/element-hq/element-x-android/pull/4787 +* fix(deps): update dependency com.posthog:posthog-android to v3.16.0 by @renovate in https://github.com/element-hq/element-x-android/pull/4789 +* fix(deps): update dependency io.element.android:element-call-embedded to v0.12.0 by @renovate in https://github.com/element-hq/element-x-android/pull/4743 +* fix(deps): update dependencyanalysis to v2.18.0 by @renovate in https://github.com/element-hq/element-x-android/pull/4796 +* fix(deps): update android.gradle.plugin to v8.10.1 by @renovate in https://github.com/element-hq/element-x-android/pull/4795 +* fix(deps): update dependency org.matrix.rustcomponents:sdk-android to v25.5.29 by @renovate in https://github.com/element-hq/element-x-android/pull/4799 +* fix(deps): update dependency org.matrix.rustcomponents:sdk-android to v25.6.3 by @renovate in https://github.com/element-hq/element-x-android/pull/4810 +### Others +* fix(deps): update media3 to v1.7.1 by @renovate in https://github.com/element-hq/element-x-android/pull/4733 +* fix: Ignore global proxy settings if system thinks there's none by @ShadowRZ in https://github.com/element-hq/element-x-android/pull/4744 +* Add `ActiveRoomHolder` to manage the active room for a session by @jmartinesp in https://github.com/element-hq/element-x-android/pull/4758 +* Notification events resolving and rendering in batches by @jmartinesp in https://github.com/element-hq/element-x-android/pull/4722 +* Hide Element Call entry point if Element Call service is not available. by @bmarty in https://github.com/element-hq/element-x-android/pull/4783 +* Fix dependencies on test by @bmarty in https://github.com/element-hq/element-x-android/pull/4790 +* Update _developer_onboarding.md by @lex-neufeld in https://github.com/element-hq/element-x-android/pull/4570 + +## New Contributors +* @lucasmz-dev made their first contribution in https://github.com/element-hq/element-x-android/pull/4773 +* @lex-neufeld made their first contribution in https://github.com/element-hq/element-x-android/pull/4570 + +**Full Changelog**: https://github.com/element-hq/element-x-android/compare/v25.05.4...v25.06.0 + + + +Changes in Element X v25.05.4 +============================= + +Rust SDK: https://github.com/matrix-org/matrix-rust-sdk/releases/tag/matrix-sdk-ffi%2F20250521 + +## What's Changed +### 🙌 Improvements +* Change (report room) : check if server supports the report room api by @ganfra in https://github.com/element-hq/element-x-android/pull/4718 +### 🐛 Bugfixes +* Improve audio focus management by @bmarty in https://github.com/element-hq/element-x-android/pull/4707 +* When transcoding a video fails, send it as a file by @jmartinesp in https://github.com/element-hq/element-x-android/pull/4257 +* Disable mutliple click (parallel or serial) on a room by @bmarty in https://github.com/element-hq/element-x-android/pull/4683 +* Fix generic mime type used when externally sharing several files by @jmartinesp in https://github.com/element-hq/element-x-android/pull/4715 +* Fix issues on JoinedRoom / BaseRoom by @bmarty in https://github.com/element-hq/element-x-android/pull/4724 +* Use the right live timeline instance in `RustRoomFactory` by @jmartinesp in https://github.com/element-hq/element-x-android/pull/4745 +### 🗣 Translations +* Sync Strings by @ElementBot in https://github.com/element-hq/element-x-android/pull/4739 +### 🧱 Build +* Ensure the CI is marked as failed when Maestro test is failing by @bmarty in https://github.com/element-hq/element-x-android/pull/4700 +* Trigger pipeline build when a release tag is pushed by @bmarty in https://github.com/element-hq/element-x-android/pull/4741 +* Fix compilation issues. by @bmarty in https://github.com/element-hq/element-x-android/pull/4750 +### 📄 Documentation +* README.md: fix broken link by @richvdh in https://github.com/element-hq/element-x-android/pull/4728 +### Dependency upgrades +* chore(config): migrate renovate config by @renovate in https://github.com/element-hq/element-x-android/pull/4688 +* fix(deps): update dependency org.matrix.rustcomponents:sdk-android to v25.5.13 by @renovate in https://github.com/element-hq/element-x-android/pull/4716 +* fix(deps): update dependency io.sentry:sentry-android to v8.12.0 by @renovate in https://github.com/element-hq/element-x-android/pull/4717 +* chore(deps): update plugin sonarqube to v6.2.0.5505 by @renovate in https://github.com/element-hq/element-x-android/pull/4725 +* fix(deps): update dependency com.posthog:posthog-android to v3.15.0 by @renovate in https://github.com/element-hq/element-x-android/pull/4723 +* fix(deps): update dependency com.squareup.retrofit2:retrofit-bom to v2.12.0 by @renovate in https://github.com/element-hq/element-x-android/pull/4727 +* chore(deps): update codecov/codecov-action action to v5.4.3 by @renovate in https://github.com/element-hq/element-x-android/pull/4730 +* fix(deps): update kotlin by @renovate in https://github.com/element-hq/element-x-android/pull/4713 +* fix(deps): update dependency com.squareup.retrofit2:retrofit-bom to v3 by @renovate in https://github.com/element-hq/element-x-android/pull/4729 +* fix(deps): update kotlinpoet to v2.2.0 by @renovate in https://github.com/element-hq/element-x-android/pull/4732 +* fix(deps): update dependency org.matrix.rustcomponents:sdk-android to v25.5.21 by @renovate in https://github.com/element-hq/element-x-android/pull/4759 +### Others +* Remove event cache feature flag by @jmartinesp in https://github.com/element-hq/element-x-android/pull/4719 +* Check homeserver when login using qr code by @bmarty in https://github.com/element-hq/element-x-android/pull/4708 +* Merge on boarding module to login module by @bmarty in https://github.com/element-hq/element-x-android/pull/4746 +* Allow configuration to provide multiple account providers. by @bmarty in https://github.com/element-hq/element-x-android/pull/4742 +* Reduce API of JoinedRoom, caller must use the Timeline API from liveTimeline instead by @bmarty in https://github.com/element-hq/element-x-android/pull/4731 + + +**Full Changelog**: https://github.com/element-hq/element-x-android/compare/v25.05.3...v25.05.4 + +Changes in Element X v25.05.3 +============================= + +Version 25.05.2 was skipped. + +## What's Changed +### 🐛 Bugfixes +* Disable Continue button when the login field is cleared. by @bmarty in https://github.com/element-hq/element-x-android/pull/4699 +* Revert "fix(deps): update dependency io.element.android:element-call-embedded to v0.10.0", which caused an issue with to-device events in the latest version by @jmartinesp in https://github.com/element-hq/element-x-android/pull/4706 +### 🗣 Translations +* Sync Strings by @ElementBot in https://github.com/element-hq/element-x-android/pull/4703 +### 🧱 Build +* Update Gradle Wrapper from 8.13 to 8.14 by @ElementBot in https://github.com/element-hq/element-x-android/pull/4645 +### Dependency upgrades +* fix(deps): update datastore to v1.1.6 by @renovate in https://github.com/element-hq/element-x-android/pull/4630 +* fix(deps): update lifecycle to v2.9.0 by @renovate in https://github.com/element-hq/element-x-android/pull/4693 +* fix(deps): update dependency androidx.sqlite:sqlite-ktx to v2.5.1 by @renovate in https://github.com/element-hq/element-x-android/pull/4692 +### Others +* Update "Learn more" link by @bmarty in https://github.com/element-hq/element-x-android/pull/4686 +* Keep call notification ringing while a call is present in the room by @jmartinesp in https://github.com/element-hq/element-x-android/pull/4634 + + +**Full Changelog**: https://github.com/element-hq/element-x-android/compare/v25.05.1...v25.05.3 + +Changes in Element X v25.05.1 +============================= + +## What's Changed +### 🐛 Bugfixes +* Fix broken Element Call in 25.05.0 by @bmarty in https://github.com/element-hq/element-x-android/pull/4694 +### Dependency upgrades +* fix(deps): update android.gradle.plugin to v8.10.0 by @renovate in https://github.com/element-hq/element-x-android/pull/4687 +* fix(deps): update dependency org.matrix.rustcomponents:sdk-android to v25.5.8 by @renovate in https://github.com/element-hq/element-x-android/pull/4696 +### Others +* Let EnterpriseService prevent usage of homeserver by @bmarty in https://github.com/element-hq/element-x-android/pull/4682 + + +**Full Changelog**: https://github.com/element-hq/element-x-android/compare/v25.05.0...v25.05.1 + +Changes in Element X v25.05.0 +============================= + +## What's Changed +### ✨ Features +* Feature : Report room by @ganfra in https://github.com/element-hq/element-x-android/pull/4654 +### 🙌 Improvements +* Render kick and ban reason in the timeline when available by @bmarty in https://github.com/element-hq/element-x-android/pull/4642 +### 🐛 Bugfixes +* Accessibility: improve behavior of list items by @bmarty in https://github.com/element-hq/element-x-android/pull/4626 +* Render caller avatar on Incoming call screen by @bmarty in https://github.com/element-hq/element-x-android/pull/4635 +* Fix `Client.getJoinedRoom` crash when a room doesn't exist locally by @jmartinesp in https://github.com/element-hq/element-x-android/pull/4656 +* Fix wrong member count in join room screen for invitation by @bmarty in https://github.com/element-hq/element-x-android/pull/4651 +* Make sure any `JoinedRustRoom` is destroyed after being used by @jmartinesp in https://github.com/element-hq/element-x-android/pull/4678 +* Fix read receipt behavior when the timeline is opened. by @bmarty in https://github.com/element-hq/element-x-android/pull/4679 +### 🗣 Translations +* Sync Strings by @ElementBot in https://github.com/element-hq/element-x-android/pull/4648 +* Sync Strings by @ElementBot in https://github.com/element-hq/element-x-android/pull/4677 +### 🧱 Build +* OIDC configuration by @bmarty in https://github.com/element-hq/element-x-android/pull/4623 +* Pin commit sha on GitHub actions by @bmarty in https://github.com/element-hq/element-x-android/pull/4653 +### Dependency upgrades +* fix(deps): update dependency io.sentry:sentry-android to v8.9.0 by @renovate in https://github.com/element-hq/element-x-android/pull/4624 +* fix(deps): update dependency com.posthog:posthog-android to v3.14.1 by @renovate in https://github.com/element-hq/element-x-android/pull/4628 +* fix(deps): update dependency androidx.exifinterface:exifinterface to v1.4.1 by @renovate in https://github.com/element-hq/element-x-android/pull/4632 +* fix(deps): update dependencyanalysis to v2.17.0 by @renovate in https://github.com/element-hq/element-x-android/pull/4638 +* fix(deps): update dependency com.google.firebase:firebase-bom to v33.13.0 - autoclosed by @renovate in https://github.com/element-hq/element-x-android/pull/4637 +* fix(deps): update dependency io.sentry:sentry-android to v8.10.0 by @renovate in https://github.com/element-hq/element-x-android/pull/4644 +* fix(deps): update dependency org.jsoup:jsoup to v1.20.1 by @renovate in https://github.com/element-hq/element-x-android/pull/4655 +* fix(deps): update dependency com.google.accompanist:accompanist-permissions to v0.37.3 by @renovate in https://github.com/element-hq/element-x-android/pull/4649 +* fix(deps): update dependency io.sentry:sentry-android to v8.11.0 by @renovate in https://github.com/element-hq/element-x-android/pull/4660 +* fix(deps): update dependency io.mockk:mockk to v1.14.2 by @renovate in https://github.com/element-hq/element-x-android/pull/4658 +* fix(deps): update dependency io.github.sergio-sastre.composablepreviewscanner:android to v0.6.1 by @renovate in https://github.com/element-hq/element-x-android/pull/4647 +* fix(deps): update dependency org.matrix.rustcomponents:sdk-android to v25.4.30 by @renovate in https://github.com/element-hq/element-x-android/pull/4665 +* fix(deps): update kotlin to v2.1.20-2.0.1 by @renovate in https://github.com/element-hq/element-x-android/pull/4670 +* fix(deps): update dependency io.sentry:sentry-android to v8.11.1 by @renovate in https://github.com/element-hq/element-x-android/pull/4668 +* fix(deps): update dependency io.element.android:element-call-embedded to v0.10.0 by @renovate in https://github.com/element-hq/element-x-android/pull/4667 +* chore(deps): update rnkdsh/action-upload-diawi action to v1.5.9 by @renovate in https://github.com/element-hq/element-x-android/pull/4674 +* fix(deps): update dependency org.maplibre.gl:android-sdk to v11.8.7 by @renovate in https://github.com/element-hq/element-x-android/pull/4673 +* fix(deps): update dependency org.matrix.rustcomponents:sdk-android to v25.5.6 by @renovate in https://github.com/element-hq/element-x-android/pull/4681 +### Others +* Split `MatrixRoom` into `MatrixRoom` and `JoinedMatrixRoom` by @jmartinesp in https://github.com/element-hq/element-x-android/pull/4561 +* Cleanup element call and UI by @bmarty in https://github.com/element-hq/element-x-android/pull/4641 +* Take change of screen_change_server_error_no_sliding_sync_message into account by @bmarty in https://github.com/element-hq/element-x-android/pull/4650 +* Improve the callback uri format and customization. by @bmarty in https://github.com/element-hq/element-x-android/pull/4664 + + +**Full Changelog**: https://github.com/element-hq/element-x-android/compare/v25.04.3...v25.05.0 + +Changes in Element X v25.04.3 +============================= + +### 🙌 Improvements +* Use PreferenceDropdown for appearance by @ganfra in https://github.com/element-hq/element-x-android/pull/4581 +### 🐛 Bugfixes +* Use in-call volume and mode for EC by @jmartinesp in https://github.com/element-hq/element-x-android/pull/4481 +* Send SVG images as files by @jmartinesp in https://github.com/element-hq/element-x-android/pull/4595 +* Fetch the initial ignored user list manually when subscribing by @jmartinesp in https://github.com/element-hq/element-x-android/pull/4598 +* Fix audio output selection for Element Call by @bmarty in https://github.com/element-hq/element-x-android/pull/4602 +* [a11y] Make more items focusable by @bmarty in https://github.com/element-hq/element-x-android/pull/4605 +* Fix ringing calls not stopping when the other user cancels the call by @jmartinesp in https://github.com/element-hq/element-x-android/pull/4613 +* Ensure that pinning an event makes the pinned messages banner appear by @bmarty in https://github.com/element-hq/element-x-android/pull/4606 +### 🗣 Translations +* Sync Strings by @ElementBot in https://github.com/element-hq/element-x-android/pull/4590 +* Sync Strings by @ElementBot in https://github.com/element-hq/element-x-android/pull/4612 +### 📄 Documentation +* Improve onboarding docs: by @jmartinesp in https://github.com/element-hq/element-x-android/pull/4578 +### Dependency upgrades +* Upgrade Rust bindings to `v25.04.11` by @jmartinesp in https://github.com/element-hq/element-x-android/pull/4580 +* fix(deps): update dependency androidx.sqlite:sqlite-ktx to v2.5.0 by @renovate in https://github.com/element-hq/element-x-android/pull/4568 +* fix(deps): update dependency app.cash.molecule:molecule-runtime to v2.1.0 by @renovate in https://github.com/element-hq/element-x-android/pull/4585 +* fix(deps): update core to v1.16.0 by @renovate in https://github.com/element-hq/element-x-android/pull/4564 +* Upate datastore to 1.1.4 by @bmarty in https://github.com/element-hq/element-x-android/pull/4551 +* fix(deps): update media3 to v1.6.1 by @renovate in https://github.com/element-hq/element-x-android/pull/4592 +* chore(deps): update danger/danger-js action to v13 by @renovate in https://github.com/element-hq/element-x-android/pull/4596 +* fix(deps): update dependency io.element.android:emojibase-bindings to v1.4.2 by @renovate in https://github.com/element-hq/element-x-android/pull/4591 +* fix(deps): update dagger to v2.56.2 by @renovate in https://github.com/element-hq/element-x-android/pull/4603 +* fix(deps): update dependency io.sentry:sentry-android to v8.8.0 by @renovate in https://github.com/element-hq/element-x-android/pull/4557 +* fix(deps): update dependency androidx.compose:compose-bom to v2025.04.00 - autoclosed by @renovate in https://github.com/element-hq/element-x-android/pull/4565 +* fix(deps): update dependency com.posthog:posthog-android to v3.14.0 by @renovate in https://github.com/element-hq/element-x-android/pull/4616 +* fix(deps): update android.gradle.plugin to v8.9.2 by @renovate in https://github.com/element-hq/element-x-android/pull/4615 +* fix(deps): update dependency org.matrix.rustcomponents:sdk-android to v25.4.22 by @renovate in https://github.com/element-hq/element-x-android/pull/4622 +### Others +* Improve accessibility of the timeline by @jmartinesp in https://github.com/element-hq/element-x-android/pull/4579 +* Push: improve Push history screen, log and stored data by @bmarty in https://github.com/element-hq/element-x-android/pull/4601 +* Push gateway config by @bmarty in https://github.com/element-hq/element-x-android/pull/4608 + + +**Full Changelog**: https://github.com/element-hq/element-x-android/compare/v25.04.2...v25.04.3 + +Changes in Element X v25.04.2 +============================= + +Security fixes 🔐 +----------------- +- Fix for [GHSA-m5px-pwq3-4p5m](https://github.com/element-hq/element-x-android/security/advisories/GHSA-m5px-pwq3-4p5m) / [CVE-2025-27599](https://www.cve.org/CVERecord?id=CVE-2025-27599) + +Changes in Element X v25.04.1 +============================= + + + +## What's Changed +### ✨ Features +* Introduce PushHistoryService to store data about the received push by @bmarty in https://github.com/element-hq/element-x-android/pull/4573 +### 🙌 Improvements +* change (preferences) : new moderation and safety settings by @ganfra in https://github.com/element-hq/element-x-android/pull/4574 +### 🐛 Bugfixes +* Ensure that we have only one single instance of SeenInviteStore per session by @bmarty in https://github.com/element-hq/element-x-android/pull/4577 +### Dependency upgrades +* fix(deps): update dependencyanalysis to v2.15.0 by @renovate in https://github.com/element-hq/element-x-android/pull/4558 +* fix(deps): update dependency io.mockk:mockk to v1.14.0 by @renovate in https://github.com/element-hq/element-x-android/pull/4562 +* fix(deps): update kotlin by @renovate in https://github.com/element-hq/element-x-android/pull/4552 +* fix(deps): update dependency org.maplibre.gl:android-sdk to v11.8.6 by @renovate in https://github.com/element-hq/element-x-android/pull/4567 +* fix(deps): update dependencyanalysis to v2.16.0 by @renovate in https://github.com/element-hq/element-x-android/pull/4575 + + +**Full Changelog**: https://github.com/element-hq/element-x-android/compare/v25.04.0...v25.04.1 + +Changes in Element X v25.04.0 +============================= + + + +## What's Changed +### ✨ Features +* Enable Rust trace log packs by @jmartinesp in https://github.com/element-hq/element-x-android/pull/4514 +* Allow using a hardware keyboard to unlock the app using a pin code by @jmartinesp in https://github.com/element-hq/element-x-android/pull/4530 +### 🙌 Improvements +* Change (mention span) : rework and add more cases by @ganfra in https://github.com/element-hq/element-x-android/pull/4476 +* Add kick (remove) confirmation and reason by @bmarty in https://github.com/element-hq/element-x-android/pull/4507 +* Remove the green badge on a pending invite after a first preview by @bmarty in https://github.com/element-hq/element-x-android/pull/4532 +### 🐛 Bugfixes +* Improve touch indicators for the user info UI in the timeline by @jmartinesp in https://github.com/element-hq/element-x-android/pull/4482 +* Limit the text length in the 'in reply to' preview by @jmartinesp in https://github.com/element-hq/element-x-android/pull/4491 +* Timeline header: ensure that the decoration is clickable by @bmarty in https://github.com/element-hq/element-x-android/pull/4495 +* Add video autoplay to media gallery by @jmartinesp in https://github.com/element-hq/element-x-android/pull/4499 +* Add `WakeLock` to dismiss ringing call screen when call is cancelled by @jmartinesp in https://github.com/element-hq/element-x-android/pull/4478 +* Make sure the live timeline is destroyed before clearing a room's cache by @jmartinesp in https://github.com/element-hq/element-x-android/pull/4515 +* Fix bullet points not having leading margin on timeline items by @jmartinesp in https://github.com/element-hq/element-x-android/pull/4536 +* Fix the share location URI by @jmartinesp in https://github.com/element-hq/element-x-android/pull/4544 +* Add a inderminate progress bar when loging out and in Waiting state. by @bmarty in https://github.com/element-hq/element-x-android/pull/4538 +### 🗣 Translations +* Sync Strings by @ElementBot in https://github.com/element-hq/element-x-android/pull/4506 +* Sync Strings by @ElementBot in https://github.com/element-hq/element-x-android/pull/4543 +### 🧱 Build +* Element config by @bmarty in https://github.com/element-hq/element-x-android/pull/4471 +* Check if Manifest.permission.REQUEST_INSTALL_PACKAGES is in the manifest by @bmarty in https://github.com/element-hq/element-x-android/pull/4490 +* Remove nightly_enterprise.yml. by @bmarty in https://github.com/element-hq/element-x-android/pull/4492 +* Log the packageId which is currently built. by @bmarty in https://github.com/element-hq/element-x-android/pull/4494 +* Use handy buildConfigFieldStr. by @bmarty in https://github.com/element-hq/element-x-android/pull/4501 +* Fix warnings in InMemoryAppPreferencesStore by @bmarty in https://github.com/element-hq/element-x-android/pull/4523 +### Dependency upgrades +* fix(deps): update camera to v1.4.2 by @renovate in https://github.com/element-hq/element-x-android/pull/4483 +* fix(deps): update dependency org.maplibre.gl:android-sdk to v11.8.5 by @renovate in https://github.com/element-hq/element-x-android/pull/4487 +* fix(deps): update dependency com.posthog:posthog-android to v3.13.0 by @renovate in https://github.com/element-hq/element-x-android/pull/4469 +* fix(deps): update dependency androidx.compose:compose-bom to v2025.03.01 by @renovate in https://github.com/element-hq/element-x-android/pull/4484 +* fix(deps): update dependencyanalysis to v2.13.3 by @renovate in https://github.com/element-hq/element-x-android/pull/4493 +* fix(deps): update media3 to v1.6.0 by @renovate in https://github.com/element-hq/element-x-android/pull/4488 +* fix(deps): update dependency io.element.android:element-call-embedded to v0.9.0 by @renovate in https://github.com/element-hq/element-x-android/pull/4498 +* fix(deps): update dependency com.google.firebase:firebase-bom to v33.12.0 by @renovate in https://github.com/element-hq/element-x-android/pull/4508 +* fix(deps): update dependency com.posthog:posthog-android to v3.13.1 by @renovate in https://github.com/element-hq/element-x-android/pull/4516 +* fix(deps): update dependency io.sentry:sentry-android to v8.6.0 by @renovate in https://github.com/element-hq/element-x-android/pull/4509 +* fix(deps): update kotlin by @renovate in https://github.com/element-hq/element-x-android/pull/4444 +* fix(deps): update kotlin by @renovate in https://github.com/element-hq/element-x-android/pull/4522 +* fix(deps): update dependencyanalysis to v2.14.0 by @renovate in https://github.com/element-hq/element-x-android/pull/4527 +* fix(deps): update dependency io.element.android:compound-android to v25.4.4 by @renovate in https://github.com/element-hq/element-x-android/pull/4537 +* chore(deps): update plugin dependencycheck to v12.1.1 by @renovate in https://github.com/element-hq/element-x-android/pull/4540 +* fix(deps): update appyx to v1.7.0 by @renovate in https://github.com/element-hq/element-x-android/pull/4547 +* fix(deps): update dependency org.matrix.rustcomponents:sdk-android to v25.4.7 by @renovate in https://github.com/element-hq/element-x-android/pull/4548 +### Others +* Update screenshots by @bmarty in https://github.com/element-hq/element-x-android/pull/4497 +* Update store description. by @bmarty in https://github.com/element-hq/element-x-android/pull/4496 +* Improve TextFieldDialog by @bmarty in https://github.com/element-hq/element-x-android/pull/4512 +* Make `RustMatrixClient.close` asynchronous by @jmartinesp in https://github.com/element-hq/element-x-android/pull/4513 +* Replace OutlinedTextField by our TextField by @bmarty in https://github.com/element-hq/element-x-android/pull/4521 +* Remove alias from room invite item by @bmarty in https://github.com/element-hq/element-x-android/pull/4531 +* Remember flows by @bmarty in https://github.com/element-hq/element-x-android/pull/4533 +* Use colors from compound for badges by @bmarty in https://github.com/element-hq/element-x-android/pull/4545 +* Update app icon by @bmarty in https://github.com/element-hq/element-x-android/pull/4534 +* Click on userId / room alias to copy value to clipboard. by @bmarty in https://github.com/element-hq/element-x-android/pull/4549 +* Run the 'prevent blocked' workflow even if PR has conflicts by @robintown in https://github.com/element-hq/element-x-android/pull/4432 +* Update wording for push provider support test. (#4079) by @bmarty in https://github.com/element-hq/element-x-android/pull/4553 + + +**Full Changelog**: https://github.com/element-hq/element-x-android/compare/v25.03.4...v25.04.0 + +Changes in Element X v25.03.4 +============================= + + + +## What's Changed +### 🙌 Improvements +* Change : composer suggestions by @ganfra in https://github.com/element-hq/element-x-android/pull/4485 +### 🧱 Build +* Fix flaky incoming verification tests by @jmartinesp in https://github.com/element-hq/element-x-android/pull/4479 +### Dependency upgrades +* fix(deps): update dagger to v2.56.1 by @renovate in https://github.com/element-hq/element-x-android/pull/4472 +* fix(deps): update dependencyanalysis to v2.13.2 by @renovate in https://github.com/element-hq/element-x-android/pull/4473 +* Upgrade embedded EC version to `v0.9.0-rc.4` by @jmartinesp in https://github.com/element-hq/element-x-android/pull/4489 + + +**Full Changelog**: https://github.com/element-hq/element-x-android/compare/v25.03.3...v25.03.4 + +Changes in Element X v25.03.3 +============================= + + + +## What's Changed +### ✨ Features +* Add 'unencrypted room' badges and labels by @jmartinesp in https://github.com/element-hq/element-x-android/pull/4445 +* Use embedded version of Element Call by @jmartinesp in https://github.com/element-hq/element-x-android/pull/4470 +### 🐛 Bugfixes +* Fix 'unverified session' flow displayed when creating account by @jmartinesp in https://github.com/element-hq/element-x-android/pull/4467 +### 🗣 Translations +* Sync Strings by @ElementBot in https://github.com/element-hq/element-x-android/pull/4461 +### 🧱 Build +* Let element enterprise be able to configure id for mapTiler. by @bmarty in https://github.com/element-hq/element-x-android/pull/4446 +### Dependency upgrades +* chore(deps): update rnkdsh/action-upload-diawi action to v1.5.8 by @renovate in https://github.com/element-hq/element-x-android/pull/4457 +* chore(deps): update plugin licensee to v1.13.0 by @renovate in https://github.com/element-hq/element-x-android/pull/4447 +* fix(deps): update dependency org.maplibre.gl:android-sdk to v11.8.4 by @renovate in https://github.com/element-hq/element-x-android/pull/4450 +* fix(deps): update dependency com.google.firebase:firebase-bom to v33.11.0 by @renovate in https://github.com/element-hq/element-x-android/pull/4448 +* fix(deps): update dependency org.matrix.rustcomponents:sdk-android to v25.3.24 by @renovate in https://github.com/element-hq/element-x-android/pull/4394 +* fix(deps): update dependencyanalysis to v2.13.1 by @renovate in https://github.com/element-hq/element-x-android/pull/4464 +* chore(deps): update plugin sonarqube to v6.1.0.5360 by @renovate in https://github.com/element-hq/element-x-android/pull/4468 +* fix(deps): update android.gradle.plugin to v8.9.1 by @renovate in https://github.com/element-hq/element-x-android/pull/4465 +### Others +* Sync Strings - tweaks to identity change messages by @andybalaam in https://github.com/element-hq/element-x-android/pull/4454 +* Check link click by @bmarty in https://github.com/element-hq/element-x-android/pull/4463 + + +**Full Changelog**: https://github.com/element-hq/element-x-android/compare/v25.03.2...v25.03.3 + +Changes in Element X v25.03.2 +============================= + + + +## What's Changed +### ✨ Features +* Implement user verification by @jmartinesp in https://github.com/element-hq/element-x-android/pull/4294 +* Add user verification and verification state violation badges by @jmartinesp in https://github.com/element-hq/element-x-android/pull/4392 +* Open txt document inside the application by @bmarty in https://github.com/element-hq/element-x-android/pull/4414 +* Add timeline item prefetching by @jmartinesp in https://github.com/element-hq/element-x-android/pull/4399 +### 🐛 Bugfixes +* fix(read receipt): track read receipts for focused timeline by @ganfra in https://github.com/element-hq/element-x-android/pull/4374 +* Discard timed out verification requests by @jmartinesp in https://github.com/element-hq/element-x-android/pull/4385 +* Ensure the snackbar "No more media to show" is not rendered when opening the media viewer. by @bmarty in https://github.com/element-hq/element-x-android/pull/4397 +* Disable click effect on Stickers by @bmarty in https://github.com/element-hq/element-x-android/pull/4401 +* Ensure that a click on a media open the correct media. by @bmarty in https://github.com/element-hq/element-x-android/pull/4413 +* Display user verification violation icon in DM rooms too by @jmartinesp in https://github.com/element-hq/element-x-android/pull/4423 +* Add a filter to avoid stack overflow when pressing the back button several times. by @bmarty in https://github.com/element-hq/element-x-android/pull/4430 +* Make verification screens scrollable and emoji labels multiline by @jmartinesp in https://github.com/element-hq/element-x-android/pull/4449 +### 🗣 Translations +* Sync Strings - New translations in Basque by @ElementBot in https://github.com/element-hq/element-x-android/pull/4381 +* Sync Strings by @ElementBot in https://github.com/element-hq/element-x-android/pull/4421 +### 🧱 Build +* More PR checks by @bmarty in https://github.com/element-hq/element-x-android/pull/4384 +* "Core Team" is a team of matrix-org. Use team "Vector Core" instead. by @bmarty in https://github.com/element-hq/element-x-android/pull/4393 +* Fix warnings in tests for push provider modules by @jmartinesp in https://github.com/element-hq/element-x-android/pull/4398 +* Update Gradle Wrapper from 8.12.1 to 8.13 by @ElementBot in https://github.com/element-hq/element-x-android/pull/4308 +* Revert agp to 8.8.1 by @bmarty in https://github.com/element-hq/element-x-android/pull/4451 +### Dependency upgrades +* Update rnkdsh/action-upload-diawi action to v1.5.7 by @renovate in https://github.com/element-hq/element-x-android/pull/4354 +* fix(deps): update dependency com.posthog:posthog-android to v3.12.0 by @renovate in https://github.com/element-hq/element-x-android/pull/4387 +* fix(deps): update dependencyanalysis to v2.11.0 by @renovate in https://github.com/element-hq/element-x-android/pull/4395 +* fix(deps): update dependency androidx.compose:compose-bom to v2025.03.00 by @renovate in https://github.com/element-hq/element-x-android/pull/4407 +* fix(deps): update dependency androidx.webkit:webkit to v1.13.0 by @renovate in https://github.com/element-hq/element-x-android/pull/4408 +* fix(deps): update dependency net.java.dev.jna:jna to v5.17.0 by @renovate in https://github.com/element-hq/element-x-android/pull/4419 +* fix(deps): update dependencyanalysis to v2.12.0 by @renovate in https://github.com/element-hq/element-x-android/pull/4409 +* Add Google Tink dependency, replacing `androidx.security.crypto` by @jmartinesp in https://github.com/element-hq/element-x-android/pull/4405 +* fix(deps): update dependency io.sentry:sentry-android to v8.4.0 by @renovate in https://github.com/element-hq/element-x-android/pull/4411 +* fix(deps): update dependency org.maplibre.gl:android-sdk to v11.8.3 by @renovate in https://github.com/element-hq/element-x-android/pull/4427 +* chore(deps): update webfactory/ssh-agent action to v0.9.1 by @renovate in https://github.com/element-hq/element-x-android/pull/4426 +* fix(deps): update android.gradle.plugin to v8.9.0 by @renovate in https://github.com/element-hq/element-x-android/pull/4320 +* Update SDK version to `25.03.13` and fix breaking changes by @jmartinesp in https://github.com/element-hq/element-x-android/pull/4406 +* Update dagger to v2.56 by @renovate in https://github.com/element-hq/element-x-android/pull/4440 +* Update dependency io.sentry:sentry-android to v8.5.0 by @renovate in https://github.com/element-hq/element-x-android/pull/4433 +* Update dependencyAnalysis to v2.13.0 by @renovate in https://github.com/element-hq/element-x-android/pull/4442 +* Update dependency com.google.crypto.tink:tink-android to v1.17.0 by @renovate in https://github.com/element-hq/element-x-android/pull/4422 +* deps(rust sdk) : update to 25.03.20 and fix api change by @ganfra in https://github.com/element-hq/element-x-android/pull/4452 +### Others +* Migrate some icons to Compound icon by @bmarty in https://github.com/element-hq/element-x-android/pull/4375 +* Long press link to copy URL to clipboard by @ShadowRZ in https://github.com/element-hq/element-x-android/pull/4376 +* Use public icon from Compound by @bmarty in https://github.com/element-hq/element-x-android/pull/4386 +* Be able to correctly render the UI with other colors. by @bmarty in https://github.com/element-hq/element-x-android/pull/4378 +* Let EnterpriseService provides push gateways by @bmarty in https://github.com/element-hq/element-x-android/pull/4400 +* Add feature flag to let the application prints logs to logcat in release builds. by @jmartinesp in https://github.com/element-hq/element-x-android/pull/4402 +* Hide "unencrypted" lock for redacted messages by @Xant3s in https://github.com/element-hq/element-x-android/pull/4410 +* Hide unencrypted lock for redacted msgs by @bmarty in https://github.com/element-hq/element-x-android/pull/4429 +* Clear SDK cache properly by @bmarty in https://github.com/element-hq/element-x-android/pull/4396 + +## New Contributors +* @ShadowRZ made their first contribution in https://github.com/element-hq/element-x-android/pull/4376 +* @Xant3s made their first contribution in https://github.com/element-hq/element-x-android/pull/4410 + +**Full Changelog**: https://github.com/element-hq/element-x-android/compare/v25.03.1...v25.03.2 + +Changes in Element X v25.03.1 +============================= + + + +## What's Changed +### ✨ Features +* Enable the Event cache by default. by @bmarty in https://github.com/element-hq/element-x-android/pull/4373 +### 🙌 Improvements +* change(create room) : use history visibility "invited" by @ganfra in https://github.com/element-hq/element-x-android/pull/4335 +* change(room directory) : move the the room directory entry by @ganfra in https://github.com/element-hq/element-x-android/pull/4348 +* [Change] Invited state room preview by @ganfra in https://github.com/element-hq/element-x-android/pull/4353 +* change(left room snackbar) : manage cancel knock and decline invite by @ganfra in https://github.com/element-hq/element-x-android/pull/4360 +### 🐛 Bugfixes +* Restore manual `Client` cleanup on session logout by @jmartinesp in https://github.com/element-hq/element-x-android/pull/4333 +### 🗣 Translations +* Sync Strings by @ElementBot in https://github.com/element-hq/element-x-android/pull/4346 +### 🧱 Build +* Fix typo on job name. by @bmarty in https://github.com/element-hq/element-x-android/pull/4352 +### Dependency upgrades +* chore(deps): update plugin ktlint to v12.2.0 by @renovate in https://github.com/element-hq/element-x-android/pull/4338 +* fix(deps): update dependency org.maplibre.gl:android-sdk to v11.8.2 by @renovate in https://github.com/element-hq/element-x-android/pull/4340 +* fix(deps): update dependency io.mockk:mockk to v1.13.17 by @renovate in https://github.com/element-hq/element-x-android/pull/4334 +* fix(deps): update kotlin to v2.1.10-1.0.31 by @renovate in https://github.com/element-hq/element-x-android/pull/4337 +* fix(deps): update dependency com.google.firebase:firebase-bom to v33.10.0 by @renovate in https://github.com/element-hq/element-x-android/pull/4339 +* Migrate to coil3 by @bmarty in https://github.com/element-hq/element-x-android/pull/4347 +* fix(deps): update dependency org.jsoup:jsoup to v1.19.1 by @renovate in https://github.com/element-hq/element-x-android/pull/4351 +* deps(rust sdk) : update to 25.03.05 by @ganfra in https://github.com/element-hq/element-x-android/pull/4370 +* Update dependency org.matrix.rustcomponents:sdk-android to v25.3.6 by @renovate in https://github.com/element-hq/element-x-android/pull/4371 +### Others +* Prevent PRs with the X-Blocked label from being merged by @robintown in https://github.com/element-hq/element-x-android/pull/4350 +* Fix some icon colors by @bmarty in https://github.com/element-hq/element-x-android/pull/4365 +* Remove PreferenceText, replace by ListItem. by @bmarty in https://github.com/element-hq/element-x-android/pull/4369 +* Show error screens in group calls by @robintown in https://github.com/element-hq/element-x-android/pull/4297 + +## New Contributors +* @robintown made their first contribution in https://github.com/element-hq/element-x-android/pull/4350 + +**Full Changelog**: https://github.com/element-hq/element-x-android/compare/v25.03.0...v25.03.1 + +Changes in Element X v25.03.0 +============================= + + + +## What's Changed +### ✨ Features +* Create `SyncOrchestrator` by @jmartinesp in https://github.com/element-hq/element-x-android/pull/4176 +* feature(crypto): verification violation handling and block sending by @BillCarsonFr in https://github.com/element-hq/element-x-android/pull/4126 +* Update Matrix Room API and allow media swipe on pinned event only. by @bmarty in https://github.com/element-hq/element-x-android/pull/4274 +* Feature : join room by address by @ganfra in https://github.com/element-hq/element-x-android/pull/4302 +### 🙌 Improvements +* Change : Room Preview by @ganfra in https://github.com/element-hq/element-x-android/pull/4250 +### 🐛 Bugfixes +* SyncOrchestrator: restore the initial sync step by @jmartinesp in https://github.com/element-hq/element-x-android/pull/4242 +* When an emoji is used as the 'initial' for an avatar, use the whole emoji by @jmartinesp in https://github.com/element-hq/element-x-android/pull/4277 +* Try avoiding trailing punctuation inside linkified URLs by @jmartinesp in https://github.com/element-hq/element-x-android/pull/4214 +* Preload account urls by @bmarty in https://github.com/element-hq/element-x-android/pull/4301 +* Fix issues due to multiple ntfy applications with the same name. by @bmarty in https://github.com/element-hq/element-x-android/pull/4312 +* Use `Settings.System.DEFAULT_RINGTONE_URI` for ringing notifications by @jmartinesp in https://github.com/element-hq/element-x-android/pull/4310 +### 🗣 Translations +* Sync Strings - New translations to turkish by @ElementBot in https://github.com/element-hq/element-x-android/pull/4253 +* Sync Strings by @ElementBot in https://github.com/element-hq/element-x-android/pull/4298 +### 🧱 Build +* Fix nightly reports by @bmarty in https://github.com/element-hq/element-x-android/pull/4235 +* Fix nightly reports - next step by @bmarty in https://github.com/element-hq/element-x-android/pull/4239 +* Prepare application for being configurable by @bmarty in https://github.com/element-hq/element-x-android/pull/4285 +* runQualityChecks task shouldn't fail fast by @jmartinesp in https://github.com/element-hq/element-x-android/pull/4309 +* Get library ComposablePreviewScanner from maven and update to the latest version by @bmarty in https://github.com/element-hq/element-x-android/pull/4327 +### Dependency upgrades +* Update dependency com.posthog:posthog-android to v3.11.2 by @renovate in https://github.com/element-hq/element-x-android/pull/4230 +* Update dependency org.matrix.rustcomponents:sdk-android to v0.2.78 by @renovate in https://github.com/element-hq/element-x-android/pull/4234 +* Update dependency org.maplibre.gl:android-sdk to v11.8.1 by @renovate in https://github.com/element-hq/element-x-android/pull/4245 +* fix(deps): update dependency org.jetbrains.kotlinx:kotlinx-datetime to v0.6.2 by @renovate in https://github.com/element-hq/element-x-android/pull/4258 +* fix(deps): update dependency io.sentry:sentry-android to v8.2.0 by @renovate in https://github.com/element-hq/element-x-android/pull/4262 +* fix(deps): update telephoto to v0.15.1 by @renovate in https://github.com/element-hq/element-x-android/pull/4270 +* fix(deps): update dependency com.google.firebase:firebase-bom to v33.9.0 by @renovate in https://github.com/element-hq/element-x-android/pull/4249 +* chore(deps): update danger/danger-js action to v12.3.4 by @renovate in https://github.com/element-hq/element-x-android/pull/4259 +* fix(deps): update android.gradle.plugin to v8.8.1 by @renovate in https://github.com/element-hq/element-x-android/pull/4263 +* chore(deps): update plugin dependencycheck to v12.1.0 by @renovate in https://github.com/element-hq/element-x-android/pull/4272 +* fix(deps): update dependency org.matrix.rustcomponents:sdk-android to v25 by @renovate in https://github.com/element-hq/element-x-android/pull/4273 +* fix(deps): update dependency androidx.compose:compose-bom to v2025.02.00 by @renovate in https://github.com/element-hq/element-x-android/pull/4261 +* fix(deps): update kotlin to v2.1.10-1.0.30 by @renovate in https://github.com/element-hq/element-x-android/pull/4265 +* fix(deps): update dependency io.github.zxing-cpp:android to v2.3.0 by @renovate in https://github.com/element-hq/element-x-android/pull/4282 +* fix(deps): update firebaseappdistribution to v5.1.1 by @renovate in https://github.com/element-hq/element-x-android/pull/4246 +* fix(deps): update dependencyanalysis to v2.8.2 by @renovate in https://github.com/element-hq/element-x-android/pull/4251 +* fix(deps): update dependency com.google.accompanist:accompanist-permissions to v0.37.1 by @renovate in https://github.com/element-hq/element-x-android/pull/4283 +* fix(deps): update dependency com.google.accompanist:accompanist-permissions to v0.37.2 by @renovate in https://github.com/element-hq/element-x-android/pull/4287 +* fix(deps): update dependencyanalysis to v2.10.0 by @renovate in https://github.com/element-hq/element-x-android/pull/4288 +* fix(deps): update dependencyanalysis to v2.10.1 by @renovate in https://github.com/element-hq/element-x-android/pull/4295 +* Upgrade SDK version to 25.02.26 by @jmartinesp in https://github.com/element-hq/element-x-android/pull/4305 +* fix(deps): update kotlinpoet to v2.1.0 by @renovate in https://github.com/element-hq/element-x-android/pull/4304 +* Update compound by @bmarty in https://github.com/element-hq/element-x-android/pull/4319 +* fix(deps): update dependency androidx.constraintlayout:constraintlayout-compose to v1.1.1 by @renovate in https://github.com/element-hq/element-x-android/pull/4324 +* fix(deps): update activity to v1.10.1 by @renovate in https://github.com/element-hq/element-x-android/pull/4321 +* fix(deps): update dependency androidx.exifinterface:exifinterface to v1.4.0 - autoclosed by @renovate in https://github.com/element-hq/element-x-android/pull/4325 +* fix(deps): update dependency androidx.constraintlayout:constraintlayout to v2.2.1 by @renovate in https://github.com/element-hq/element-x-android/pull/4322 +* fix(deps): update dependency io.sentry:sentry-android to v8.3.0 by @renovate in https://github.com/element-hq/element-x-android/pull/4316 +* fix(deps): update dependency com.posthog:posthog-android to v3.11.3 by @renovate in https://github.com/element-hq/element-x-android/pull/4313 +* fix(deps): update dependency com.android.tools:desugar_jdk_libs to v2.1.5 by @renovate in https://github.com/element-hq/element-x-android/pull/4299 +* chore(deps): update plugin detekt to v1.23.8 by @renovate in https://github.com/element-hq/element-x-android/pull/4292 +### Others +* Update incoming call notification content to "📹 Incoming call" by @bmarty in https://github.com/element-hq/element-x-android/pull/4231 +* Display a bottom sheet to let user confirm the DM creation by @bmarty in https://github.com/element-hq/element-x-android/pull/4233 +* Open chat links in regular browser tabs by @cbs228 in https://github.com/element-hq/element-x-android/pull/4198 +* Theme override by @bmarty in https://github.com/element-hq/element-x-android/pull/4226 +* Allow user certificate in production builds. by @bmarty in https://github.com/element-hq/element-x-android/pull/4275 +* Replace Material icons with Compound icons wherever it's possible by @bmarty in https://github.com/element-hq/element-x-android/pull/4323 + +## New Contributors +* @cbs228 made their first contribution in https://github.com/element-hq/element-x-android/pull/4198 + +**Full Changelog**: https://github.com/element-hq/element-x-android/compare/v25.02.0...v25.03.0 + +Changes in Element X v25.02.0 (2025-02-04) +========================================== + + + +## What's Changed +### ✨ Features +* Media navigation with swipe gesture by @bmarty in https://github.com/element-hq/element-x-android/pull/4161 +* Add ability to swipe between media when opened from the timeline. by @bmarty in https://github.com/element-hq/element-x-android/pull/4205 +### 🙌 Improvements +* change(design) : use ElementTheme.typography.fontBodyLgMedium by @ganfra in https://github.com/element-hq/element-x-android/pull/4145 +* change(design) : New component Announcement by @ganfra in https://github.com/element-hq/element-x-android/pull/4140 +* update rust sdk 0.2.75 by @ganfra in https://github.com/element-hq/element-x-android/pull/4158 +### 🐛 Bugfixes +* Fix dm avatar rtl by @bmarty in https://github.com/element-hq/element-x-android/pull/4103 +* Unified push gateway resolver improvement by @bmarty in https://github.com/element-hq/element-x-android/pull/4101 +* Close the media preview screen ASAP with sending queue enabled by @jmartinesp in https://github.com/element-hq/element-x-android/pull/4089 +* fix(coroutine) : make sure to switch coroutine context by @ganfra in https://github.com/element-hq/element-x-android/pull/4146 +* Fix snack bar not displayed in MediaViewer by @bmarty in https://github.com/element-hq/element-x-android/pull/4195 +* Let the SDK provide the "network is available information" by @bmarty in https://github.com/element-hq/element-x-android/pull/4215 +### 🗣 Translations +* Sync Strings by @ElementBot in https://github.com/element-hq/element-x-android/pull/4088 +* Sync Strings by @ElementBot in https://github.com/element-hq/element-x-android/pull/4100 +* Sync Strings by @ElementBot in https://github.com/element-hq/element-x-android/pull/4114 +* Fix import of en-US translations. by @bmarty in https://github.com/element-hq/element-x-android/pull/4135 +* Sync Strings by @ElementBot in https://github.com/element-hq/element-x-android/pull/4139 +* Sync Strings by @ElementBot in https://github.com/element-hq/element-x-android/pull/4172 +* Sync Strings by @ElementBot in https://github.com/element-hq/element-x-android/pull/4199 +* Sync Strings - new (partial) language: Norwegian by @ElementBot in https://github.com/element-hq/element-x-android/pull/4227 +### 🧱 Build +* Update Gradle Wrapper from 8.11.1 to 8.12 by @ElementBot in https://github.com/element-hq/element-x-android/pull/4085 +* Test using Maestro CLI + emulator instead of Cloud by @jmartinesp in https://github.com/element-hq/element-x-android/pull/4092 +* Make Maestro run for each PR push by @jmartinesp in https://github.com/element-hq/element-x-android/pull/4121 +* Migrate to CalVer like versioning by @bmarty in https://github.com/element-hq/element-x-android/pull/4187 +* Kover: include back :libraries:matrix:impl module. by @bmarty in https://github.com/element-hq/element-x-android/pull/4193 +* Update Gradle Wrapper from 8.12 to 8.12.1 by @ElementBot in https://github.com/element-hq/element-x-android/pull/4196 +* Use secret Sentry DSN value by @jmartinesp in https://github.com/element-hq/element-x-android/pull/4210 +* Use Sentry breadcrumbs instead of logging new events by @jmartinesp in https://github.com/element-hq/element-x-android/pull/4223 +### 🚧 In development 🚧 +* Media Viewer: show snackbar when reaching end of timeline. by @bmarty in https://github.com/element-hq/element-x-android/pull/4201 +* Feature : room settings - security and privacy by @ganfra in https://github.com/element-hq/element-x-android/pull/4212 +### Dependency upgrades +* Update dependency io.mockk:mockk to v1.13.14 by @renovate in https://github.com/element-hq/element-x-android/pull/4083 +* Update dependency net.java.dev.jna:jna to v5.16.0 by @renovate in https://github.com/element-hq/element-x-android/pull/4087 +* Update kotlin to v1.10.1 by @renovate in https://github.com/element-hq/element-x-android/pull/4073 +* Update dagger to v2.54 by @renovate in https://github.com/element-hq/element-x-android/pull/4084 +* Update dependency io.sentry:sentry-android to v7.19.1 by @renovate in https://github.com/element-hq/element-x-android/pull/4090 +* Update dependency com.android.tools:desugar_jdk_libs to v2.1.4 by @renovate in https://github.com/element-hq/element-x-android/pull/4077 +* Update dependency com.posthog:posthog-android to v3.10.0 by @renovate in https://github.com/element-hq/element-x-android/pull/4120 +* Update appyx to v1.6.0 by @renovate in https://github.com/element-hq/element-x-android/pull/4129 +* Update dagger to v2.55 by @renovate in https://github.com/element-hq/element-x-android/pull/4131 +* Update android.gradle.plugin to v8.8.0 by @renovate in https://github.com/element-hq/element-x-android/pull/4130 +* Update dependency org.maplibre.gl:android-sdk to v11.8.0 by @renovate in https://github.com/element-hq/element-x-android/pull/4132 +* Update dependency io.mockk:mockk to v1.13.16 by @renovate in https://github.com/element-hq/element-x-android/pull/4134 +* Update dependencyAnalysis to v2.7.0 by @renovate in https://github.com/element-hq/element-x-android/pull/4136 +* Update anvil to v0.4.1 by @renovate in https://github.com/element-hq/element-x-android/pull/4144 +* Update kotlin by @renovate in https://github.com/element-hq/element-x-android/pull/4117 +* Update plugin dependencycheck to v12 by @renovate in https://github.com/element-hq/element-x-android/pull/4137 +* Update dependency io.sentry:sentry-android to v7.20.0 by @renovate in https://github.com/element-hq/element-x-android/pull/4107 +* Update wysiwyg to v2.38.0 by @renovate in https://github.com/element-hq/element-x-android/pull/4104 +* Update dependency androidx.recyclerview:recyclerview to v1.4.0 by @renovate in https://github.com/element-hq/element-x-android/pull/4154 +* Update activity to v1.10.0 by @renovate in https://github.com/element-hq/element-x-android/pull/4152 +* Update firebaseAppDistribution to v5.1.0 by @renovate in https://github.com/element-hq/element-x-android/pull/4159 +* Update dependency com.google.firebase:firebase-bom to v33.8.0 by @renovate in https://github.com/element-hq/element-x-android/pull/4160 +* Update dependency androidx.compose:compose-bom to v2025 by @renovate in https://github.com/element-hq/element-x-android/pull/4155 +* Update dependency io.sentry:sentry-android to v7.20.1 by @renovate in https://github.com/element-hq/element-x-android/pull/4178 +* Update dependency io.sentry:sentry-android to v8 by @renovate in https://github.com/element-hq/element-x-android/pull/4180 +* Update wysiwyg to v2.38.1 by @renovate in https://github.com/element-hq/element-x-android/pull/4177 +* Update dependency org.matrix.rustcomponents:sdk-android to v0.2.76 by @renovate in https://github.com/element-hq/element-x-android/pull/4183 +* Update wysiwyg to v2.38.2 by @renovate in https://github.com/element-hq/element-x-android/pull/4186 +* Update dependency com.posthog:posthog-android to v3.11.0 by @renovate in https://github.com/element-hq/element-x-android/pull/4204 +* Update kotlin by @renovate in https://github.com/element-hq/element-x-android/pull/4200 +* Update dependency org.matrix.rustcomponents:sdk-android to v0.2.77 by @renovate in https://github.com/element-hq/element-x-android/pull/4228 +* Update dependency com.posthog:posthog-android to v3.11.1 by @renovate in https://github.com/element-hq/element-x-android/pull/4222 +* Update dependency io.element.android:emojibase-bindings to v1.3.4 by @renovate in https://github.com/element-hq/element-x-android/pull/4213 +* Update dependencyAnalysis to v2.8.0 by @renovate in https://github.com/element-hq/element-x-android/pull/4218 +* Update dependency androidx.compose:compose-bom to v2025.01.01 by @renovate in https://github.com/element-hq/element-x-android/pull/4217 +* Update dependency io.sentry:sentry-android to v8.1.0 by @renovate in https://github.com/element-hq/element-x-android/pull/4221 +* Update rnkdsh/action-upload-diawi action to v1.5.6 by @renovate in https://github.com/element-hq/element-x-android/pull/4173 +* Update plugin dependencycheck to v12.0.2 by @renovate in https://github.com/element-hq/element-x-android/pull/4170 +### Others +* Improve gallery loading state by @bmarty in https://github.com/element-hq/element-x-android/pull/4080 +* Show more detail about the error when pusher registration fails. by @bmarty in https://github.com/element-hq/element-x-android/pull/4081 +* Update pull request template and CI automation by @bmarty in https://github.com/element-hq/element-x-android/pull/4037 +* Add a log function for handling complex values to the WebView client. by @Half-Shot in https://github.com/element-hq/element-x-android/pull/4098 +* design : CounterAtom by @ganfra in https://github.com/element-hq/element-x-android/pull/4108 +* Change sticker mimetype fallback to image by @surakin in https://github.com/element-hq/element-x-android/pull/4111 +* Dual licensing: AGPL + Element Commercial by @bmarty in https://github.com/element-hq/element-x-android/pull/4118 +* Replace the InfoListOrganism default bg color by @jmartinesp in https://github.com/element-hq/element-x-android/pull/4091 +* Ignore dependency that are not third-party licenses to us. by @bmarty in https://github.com/element-hq/element-x-android/pull/4122 +* misc(send queue) : do not disable send queue when Network is Offline by @ganfra in https://github.com/element-hq/element-x-android/pull/4105 +* Remove or replace unnecessary `BackHandler` calls by @jmartinesp in https://github.com/element-hq/element-x-android/pull/4148 +* Replace our firstIfSingle extension with singleOrNull from the Kotlin library by @bmarty in https://github.com/element-hq/element-x-android/pull/4184 +* Remove log. by @bmarty in https://github.com/element-hq/element-x-android/pull/4203 +* Remove unused types / code. by @bmarty in https://github.com/element-hq/element-x-android/pull/4185 +* Consider that the topic of a room has been removed when it's blank. by @bmarty in https://github.com/element-hq/element-x-android/pull/4209 +* CalVer: use 2 digits for the year and 2 digits for the month. by @bmarty in https://github.com/element-hq/element-x-android/pull/4192 +* Always display encryption badge by @bmarty in https://github.com/element-hq/element-x-android/pull/4219 + +## New Contributors +* @Half-Shot made their first contribution in https://github.com/element-hq/element-x-android/pull/4098 + +**Full Changelog**: https://github.com/element-hq/element-x-android/compare/v0.7.6...v25.02.0 + +Changes in Element X v0.7.6 (2024-12-20) +======================================== + +## What's Changed +### ✨ Features +* Media gallery UI by @bmarty in https://github.com/element-hq/element-x-android/pull/4010 +* Render audio file in the files list and improve media viewer for audio/voice files by @bmarty in https://github.com/element-hq/element-x-android/pull/4031 +* Media gallery UI update by @bmarty in https://github.com/element-hq/element-x-android/pull/4071 +### 🙌 Improvements +* Support new properties in posthog UTD reports by @richvdh in https://github.com/element-hq/element-x-android/pull/4020 +### 🐛 Bugfixes +* fix(dm) : remove duplicate LaunchedEffect when opening DM by @ganfra in https://github.com/element-hq/element-x-android/pull/4012 +* Always attempt to start the sync when starting the application. by @bmarty in https://github.com/element-hq/element-x-android/pull/4069 +* Fix rendering issue in the toolbar. by @bmarty in https://github.com/element-hq/element-x-android/pull/4075 +* fix(timeline) : dispatch timeline creations trying to avoid ANRs by @ganfra in https://github.com/element-hq/element-x-android/pull/4076 +### 🗣 Translations +* Sync Strings by @ElementBot in https://github.com/element-hq/element-x-android/pull/4007 +* Sync Strings by @ElementBot in https://github.com/element-hq/element-x-android/pull/4043 +* Add Accept-Language to extra header when opening CustomChromeTab by @bmarty in https://github.com/element-hq/element-x-android/pull/4051 +### 🧱 Build +* Update Gradle Wrapper from 8.10.2 to 8.11.1 by @ElementBot in https://github.com/element-hq/element-x-android/pull/4019 +### 📄 Documentation +* [Doc] Improve instructions for building Rust SDK locally by @richvdh in https://github.com/element-hq/element-x-android/pull/4015 +* Build SDK for the local hardware by @richvdh in https://github.com/element-hq/element-x-android/pull/4021 +### 🚧 In development 🚧 +* feat(knock_requests_list) : implement design by @ganfra in https://github.com/element-hq/element-x-android/pull/3995 +* feat(knock) : Knock Requests Banner UI by @ganfra in https://github.com/element-hq/element-x-android/pull/4005 +* Add a feature flag to be able to enable the event cache by @bmarty in https://github.com/element-hq/element-x-android/pull/4029 +* Improve title and subtitle for empty states in the gallery. by @bmarty in https://github.com/element-hq/element-x-android/pull/4038 +* Inline voice message player in the files gallery. by @bmarty in https://github.com/element-hq/element-x-android/pull/4045 +* Media gallery update by @bmarty in https://github.com/element-hq/element-x-android/pull/4059 +* feat(knock requests) : branch logic for handling knock requests by @ganfra in https://github.com/element-hq/element-x-android/pull/4067 +### Dependency upgrades +* Update dependency io.sentry:sentry-android to v7.18.1 by @renovate in https://github.com/element-hq/element-x-android/pull/3972 +* Update dependency com.google.firebase:firebase-bom to v33.7.0 by @renovate in https://github.com/element-hq/element-x-android/pull/4001 +* Update nschloe/action-cached-lfs-checkout action to v1.2.3 by @renovate in https://github.com/element-hq/element-x-android/pull/4017 +* Update dependency com.posthog:posthog-android to v3.9.3 by @renovate in https://github.com/element-hq/element-x-android/pull/3960 +* Update dependency org.matrix.rustcomponents:sdk-android to v0.2.70 by @renovate in https://github.com/element-hq/element-x-android/pull/4018 +* Update dependency org.matrix.rustcomponents:sdk-android to v0.2.71 by @renovate in https://github.com/element-hq/element-x-android/pull/4024 +* Update camera to v1.4.1 by @renovate in https://github.com/element-hq/element-x-android/pull/4022 +* Update dependency org.maplibre.gl:android-sdk to v11.7.0 by @renovate in https://github.com/element-hq/element-x-android/pull/4028 +* Update dependency io.nlopez.compose.rules:detekt to v0.4.22 by @renovate in https://github.com/element-hq/element-x-android/pull/4016 +* Update dependencyAnalysis to v2.6.0 by @renovate in https://github.com/element-hq/element-x-android/pull/3996 +* Update kotlin by @renovate in https://github.com/element-hq/element-x-android/pull/3955 +* Update dependency org.jsoup:jsoup to v1.18.3 by @renovate in https://github.com/element-hq/element-x-android/pull/3951 +* Update dagger to v2.53.1 by @renovate in https://github.com/element-hq/element-x-android/pull/4013 +* Update dependency io.sentry:sentry-android to v7.19.0 by @renovate in https://github.com/element-hq/element-x-android/pull/4030 +* Update dependency org.jetbrains.kotlinx:kover-gradle-plugin to v0.9.0 by @renovate in https://github.com/element-hq/element-x-android/pull/4032 +* Update dependencyAnalysis to v2.6.1 by @renovate in https://github.com/element-hq/element-x-android/pull/4041 +* Update dependency androidx.compose:compose-bom to v2024.12.01 by @renovate in https://github.com/element-hq/element-x-android/pull/4023 +* Update android.gradle.plugin to v8.7.3 by @renovate in https://github.com/element-hq/element-x-android/pull/3982 +* Update dependency com.lemonappdev:konsist to v0.17.3 by @renovate in https://github.com/element-hq/element-x-android/pull/3997 +* Update dependency com.google.accompanist:accompanist-permissions to v0.37.0 by @renovate in https://github.com/element-hq/element-x-android/pull/4035 +* depencies(sdk) : update rust sdk 0.2.72 by @ganfra in https://github.com/element-hq/element-x-android/pull/4060 +* Update dependency org.maplibre.gl:android-sdk to v11.7.1 by @renovate in https://github.com/element-hq/element-x-android/pull/4066 +* Update dependency org.matrix.rustcomponents:sdk-android to v0.2.73 by @renovate in https://github.com/element-hq/element-x-android/pull/4070 +* Update media3 to v1.5.1 by @renovate in https://github.com/element-hq/element-x-android/pull/4072 +### Others +* Add destructive param to BigIcon.Style.Default to be able to render icons with red tint by @bmarty in https://github.com/element-hq/element-x-android/pull/4004 +* UI: knock avatars by @bmarty in https://github.com/element-hq/element-x-android/pull/4014 +* Implement month separator for the Gallery, and improve date rendering. by @bmarty in https://github.com/element-hq/element-x-android/pull/4026 +* Extract voice message player to its own module by @bmarty in https://github.com/element-hq/element-x-android/pull/4036 +* Add a quick filter on the open source licence screen. by @bmarty in https://github.com/element-hq/element-x-android/pull/4052 +* Make the room filter use normalized strings. by @bmarty in https://github.com/element-hq/element-x-android/pull/4050 +* Add test on DefaultMediaPlayer. by @bmarty in https://github.com/element-hq/element-x-android/pull/4054 +* Fix flaky test by using CompletableDeferred by @bmarty in https://github.com/element-hq/element-x-android/pull/4057 +* feat(crypto): Support for new UtdCause for historical messages by @BillCarsonFr in https://github.com/element-hq/element-x-android/pull/4044 +* Update message action list by @bmarty in https://github.com/element-hq/element-x-android/pull/4056 +* Update recovery key UI by @bmarty in https://github.com/element-hq/element-x-android/pull/4065 +* Fix gallery title by @bmarty in https://github.com/element-hq/element-x-android/pull/4078 + +Changes in Element X v0.7.5 (2024-12-06) +======================================== + +## What's Changed +### ✨ Features +* Allow to set caption when uploading file and audio files, and allow adding / edit / remove caption on Event with attachment (also works on local echo) by @bmarty in https://github.com/element-hq/element-x-android/pull/3902 +* Enable all notification actions: quick reply, accept/decline invite, mark as read from notification. by @bmarty in https://github.com/element-hq/element-x-android/pull/3916 +* Video player controller by @bmarty in https://github.com/element-hq/element-x-android/pull/3959 +### 🙌 Improvements +* change : confirm biometric before allowing biometric unlock. by @ganfra in https://github.com/element-hq/element-x-android/pull/3930 +* Hide media preprocessing by @bmarty in https://github.com/element-hq/element-x-android/pull/3943 +* changes: iterate on room create screen by @ganfra in https://github.com/element-hq/element-x-android/pull/3966 +* change : knock message supporting text display number of characters by @ganfra in https://github.com/element-hq/element-x-android/pull/3970 +* feat(design) : update send button background by @ganfra in https://github.com/element-hq/element-x-android/pull/4000 +### 🐛 Bugfixes +* Min size for hidden media by @bmarty in https://github.com/element-hq/element-x-android/pull/3906 +* fix : use RoomMembershipObserver to close room screen when leaving by @ganfra in https://github.com/element-hq/element-x-android/pull/3887 +* fix : protect some usages of client to avoid crashes by @bmarty in https://github.com/element-hq/element-x-android/pull/3886 +* Fix long click not working on pinned events timeline by @jmartinesp in https://github.com/element-hq/element-x-android/pull/3940 +* Element Call: display error dialog only when loading the main URL by @jmartinesp in https://github.com/element-hq/element-x-android/pull/3962 +* Fix navigation issue when entering recovery key after navigating from the banner by @bmarty in https://github.com/element-hq/element-x-android/pull/3961 +* navigation : clear backstack when opening room from outer node by @ganfra in https://github.com/element-hq/element-x-android/pull/3984 +* fix : hide keyboard when TextComposer is removed from composition by @ganfra in https://github.com/element-hq/element-x-android/pull/3985 +* fix(room_preview) : catch all exception instead by @ganfra in https://github.com/element-hq/element-x-android/pull/3989 +* fix(room_detail) : hide room avatar preview by @ganfra in https://github.com/element-hq/element-x-android/pull/3992 +* fix(composer) : use HideKeyboardWhenDisposed only in MessagesView by @ganfra in https://github.com/element-hq/element-x-android/pull/3993 +### 🗣 Translations +* Sync Strings by @ElementBot in https://github.com/element-hq/element-x-android/pull/3936 +* Sync Strings by @ElementBot in https://github.com/element-hq/element-x-android/pull/3975 +### Dependency upgrades +* Update dependency io.sentry:sentry-android to v7.18.0 by @renovate in https://github.com/element-hq/element-x-android/pull/3891 +* Update plugin sonarqube to v6 - autoclosed by @renovate in https://github.com/element-hq/element-x-android/pull/3895 +* Update dependency org.matrix.rustcomponents:sdk-android to v0.2.64 by @renovate in https://github.com/element-hq/element-x-android/pull/3907 +* Update dependency com.autonomousapps.dependency-analysis to v2.5.0 by @renovate in https://github.com/element-hq/element-x-android/pull/3909 +* Update dependency org.robolectric:robolectric to v4.14.1 by @renovate in https://github.com/element-hq/element-x-android/pull/3924 +* Update dependency io.element.android:compound-android to v0.2.0 by @renovate in https://github.com/element-hq/element-x-android/pull/3915 +* Update dependency org.matrix.rustcomponents:sdk-android to v0.2.65 by @renovate in https://github.com/element-hq/element-x-android/pull/3932 +* Update media3 to v1.5.0 by @renovate in https://github.com/element-hq/element-x-android/pull/3942 +* Update plugin ktlint to v12.1.2 by @renovate in https://github.com/element-hq/element-x-android/pull/3944 +* Update wysiwyg to v2.37.14 by @renovate in https://github.com/element-hq/element-x-android/pull/3948 +* Update mobile-dev-inc/action-maestro-cloud action to v1.9.7 by @renovate in https://github.com/element-hq/element-x-android/pull/3914 +* Update dependency com.lemonappdev:konsist to v0.17.0 by @renovate in https://github.com/element-hq/element-x-android/pull/3947 +* deps : update rust sdk to 0.2.67 and fix breaking changes by @ganfra in https://github.com/element-hq/element-x-android/pull/3957 +* Update dependency com.lemonappdev:konsist to v0.17.1 by @renovate in https://github.com/element-hq/element-x-android/pull/3983 +* Update plugin sonarqube to v6.0.1.5171 by @renovate in https://github.com/element-hq/element-x-android/pull/3958 +* Update dagger to v2.53 by @renovate in https://github.com/element-hq/element-x-android/pull/3986 +* Update dependency com.sigpwned:emoji4j-core to v16 by @renovate in https://github.com/element-hq/element-x-android/pull/3899 +* dependencies : update rust sdk to 0.2.68 by @ganfra in https://github.com/element-hq/element-x-android/pull/3988 +* Update plugin dependencycheck to v11.1.1 by @renovate in https://github.com/element-hq/element-x-android/pull/3994 +* chore(dependencies) : update rust sdk to 0.2.69 by @ganfra in https://github.com/element-hq/element-x-android/pull/3999 +### Others +* Send button iteration by @bmarty in https://github.com/element-hq/element-x-android/pull/3901 +* Fix photo / video name by @bmarty in https://github.com/element-hq/element-x-android/pull/3903 +* Render edited caption. by @bmarty in https://github.com/element-hq/element-x-android/pull/3904 +* Rely on the SDK to decide if a caption is editable or not by @bmarty in https://github.com/element-hq/element-x-android/pull/3917 +* Remove AttachmentsState and use the MessagesNavigator by @bmarty in https://github.com/element-hq/element-x-android/pull/3918 +* Fix element call crash when resuming from notification by @bmarty in https://github.com/element-hq/element-x-android/pull/3926 +* Ensure that the SDK is syncing during an incoming call so that the app can cancel the notification by @bmarty in https://github.com/element-hq/element-x-android/pull/3931 +* Add feature flag to temporary disable sending caption by default in production by @bmarty in https://github.com/element-hq/element-x-android/pull/3953 +* Add timeline action item to copy caption by @bmarty in https://github.com/element-hq/element-x-android/pull/3963 +* Fix wrong name of classes and method by @bmarty in https://github.com/element-hq/element-x-android/pull/3971 +* Rework on media module by @bmarty in https://github.com/element-hq/element-x-android/pull/3967 +* Add warning when adding a caption. by @bmarty in https://github.com/element-hq/element-x-android/pull/3977 +* Do not auto-play videos. by @bmarty in https://github.com/element-hq/element-x-android/pull/3978 +* MediaViewer: iterate on design by @bmarty in https://github.com/element-hq/element-x-android/pull/3979 +* feat(crypto): Support new expected UTD causes UX + Analytics by @BillCarsonFr in https://github.com/element-hq/element-x-android/pull/3980 +* increase ringing timeout from 15 seconds to 90 seconds by @fkwp in https://github.com/element-hq/element-x-android/pull/3991 +* MediaViewer: Align title to left and move action bottom to top bar. by @bmarty in https://github.com/element-hq/element-x-android/pull/4003 + +Changes in Element X v0.7.4 (2024-11-20) +======================================== + +## What's Changed +### 🙌 Improvements +* Update the strings for unsupported calls by @bmarty in https://github.com/element-hq/element-x-android/pull/3857 +### 🐛 Bugfixes +* Stop incoming call ringing if answered on another device. by @bmarty in https://github.com/element-hq/element-x-android/pull/3842 +* Use formatted captions for images and video by @jmartinesp in https://github.com/element-hq/element-x-android/pull/3864 +* Fix unified push unregister by @bmarty in https://github.com/element-hq/element-x-android/pull/3877 +* Hide the keyboard when navigating from the chat room screen by @jmartinesp in https://github.com/element-hq/element-x-android/pull/3878 +* Fix long click not working for media timeline items by @jmartinesp in https://github.com/element-hq/element-x-android/pull/3879 +* Instantiate the verification controller ASAP by @jmartinesp in https://github.com/element-hq/element-x-android/pull/3893 +* fix : display security banner for room list empty state by @ganfra in https://github.com/element-hq/element-x-android/pull/3892 +### 🗣 Translations +* Sync Strings by @ElementBot in https://github.com/element-hq/element-x-android/pull/3852 +* Sync Strings - add translations to Finnish by @ElementBot in https://github.com/element-hq/element-x-android/pull/3883 +### 🚧 In development 🚧 +* Create room : improve handling of room address by @ganfra in https://github.com/element-hq/element-x-android/pull/3868 +### Dependency upgrades +* Update anvil to v0.4.0 by @renovate in https://github.com/element-hq/element-x-android/pull/3792 +* Update kotlin to v2.0.21-1.0.27 by @renovate in https://github.com/element-hq/element-x-android/pull/3836 +* Update dependency org.maplibre.gl:android-sdk to v11.6.1 by @renovate in https://github.com/element-hq/element-x-android/pull/3793 +* Update android.gradle.plugin to v8.7.2 by @renovate in https://github.com/element-hq/element-x-android/pull/3785 +* Update lifecycle to v2.8.7 by @renovate in https://github.com/element-hq/element-x-android/pull/3763 +* Update plugin dependencycheck to v11 by @renovate in https://github.com/element-hq/element-x-android/pull/3723 +* Update dependency org.matrix.rustcomponents:sdk-android to v0.2.61 by @renovate in https://github.com/element-hq/element-x-android/pull/3841 +* Update mobile-dev-inc/action-maestro-cloud action to v1.9.6 by @renovate in https://github.com/element-hq/element-x-android/pull/3846 +* Update dependency com.posthog:posthog-android to v3.9.1 by @renovate in https://github.com/element-hq/element-x-android/pull/3856 +* Update core to v1.15.0 by @renovate in https://github.com/element-hq/element-x-android/pull/3766 +* Update dependency com.android.tools:desugar_jdk_libs to v2.1.3 by @renovate in https://github.com/element-hq/element-x-android/pull/3825 +* Update dependency io.nlopez.compose.rules:detekt to v0.4.18 by @renovate in https://github.com/element-hq/element-x-android/pull/3860 +* Update dependency com.posthog:posthog-android to v3.9.2 by @renovate in https://github.com/element-hq/element-x-android/pull/3861 +* Update dependency io.sentry:sentry-android to v7.17.0 by @renovate in https://github.com/element-hq/element-x-android/pull/3862 +* Update dependency androidx.compose:compose-bom to v2024.11.00 by @renovate in https://github.com/element-hq/element-x-android/pull/3869 +* Update telephoto to v0.14.0 by @renovate in https://github.com/element-hq/element-x-android/pull/3870 +* Update SDK bindings version to `0.2.62` and fix `SendHandle` usages by @jmartinesp in https://github.com/element-hq/element-x-android/pull/3876 +* Update codecov/codecov-action action to v5 by @renovate in https://github.com/element-hq/element-x-android/pull/3874 +* Update dependency com.google.firebase:firebase-bom to v33.6.0 by @renovate in https://github.com/element-hq/element-x-android/pull/3880 +* Update kotlin to v2.0.21-1.0.28 by @renovate in https://github.com/element-hq/element-x-android/pull/3881 +* Update dependency org.robolectric:robolectric to v4.14 by @renovate in https://github.com/element-hq/element-x-android/pull/3882 +* Update appyx to v1.5.1 by @renovate in https://github.com/element-hq/element-x-android/pull/3889 +* Update dependency io.nlopez.compose.rules:detekt to v0.4.19 by @renovate in https://github.com/element-hq/element-x-android/pull/3900 +* Update dependency org.matrix.rustcomponents:sdk-android to v0.2.63 by @renovate in https://github.com/element-hq/element-x-android/pull/3898 +### Others +* Design system : implement new TextField by @ganfra in https://github.com/element-hq/element-x-android/pull/3834 +* Remove :samples:minimal module by @bmarty in https://github.com/element-hq/element-x-android/pull/3871 +* Replace `textPlaceholder` color usages with `textSecondary` by @jmartinesp in https://github.com/element-hq/element-x-android/pull/3873 +* Room Preview API changes by @ganfra in https://github.com/element-hq/element-x-android/pull/3875 + +Changes in Element X v0.7.3 (2024-11-08) +======================================== + +## What's Changed +### ✨ Features +* Incoming session verification by @bmarty in https://github.com/element-hq/element-x-android/pull/3733 +* Remove all GPS metadata from images uploaded as media by @jmartinesp in https://github.com/element-hq/element-x-android/pull/3781 +* Send caption with image and video by @bmarty in https://github.com/element-hq/element-x-android/pull/3803 +### 🙌 Improvements +* UI iteration on the encryption settings by @bmarty in https://github.com/element-hq/element-x-android/pull/3750 +* Rotate firebase token in case of error by @bmarty in https://github.com/element-hq/element-x-android/pull/3755 +* Optimize media upload by @bmarty in https://github.com/element-hq/element-x-android/pull/3779 +* Iteration on caption by @bmarty in https://github.com/element-hq/element-x-android/pull/3816 +* Hide join call button when the user is already in the call by @bmarty in https://github.com/element-hq/element-x-android/pull/3815 +* Disable button during the "verifying" step. by @bmarty in https://github.com/element-hq/element-x-android/pull/3832 +### 🐛 Bugfixes +* Fix oversize padding on captioned images/videos by @frebib in https://github.com/element-hq/element-x-android/pull/3732 +* Fix the onboarding flow getting stuck in some cases by @jmartinesp in https://github.com/element-hq/element-x-android/pull/3778 +* bugfix: do not remove logs after sending them by @ganfra in https://github.com/element-hq/element-x-android/pull/3780 +* Use in-memory thumbnail APIs when possible by @jmartinesp in https://github.com/element-hq/element-x-android/pull/3817 +* ElementCall: allow user to switch to another call. by @bmarty in https://github.com/element-hq/element-x-android/pull/3833 +* Do not delete the original file if it's not a temporary file when sending it to a room. by @bmarty in https://github.com/element-hq/element-x-android/pull/3819 +* Fix verification failed issue, simplify verification logic by @jmartinesp in https://github.com/element-hq/element-x-android/pull/3830 +### 🗣 Translations +* Sync Strings by @ElementBot in https://github.com/element-hq/element-x-android/pull/3798 +### 🧱 Build +* Target api 35 by @bmarty in https://github.com/element-hq/element-x-android/pull/3776 +### 🚧 In development 🚧 +* Knocking : update create room flow by @ganfra in https://github.com/element-hq/element-x-android/pull/3804 +### Dependency upgrades +* Update dependency io.nlopez.compose.rules:detekt to v0.4.17 by @renovate in https://github.com/element-hq/element-x-android/pull/3746 +* Update dependency com.posthog:posthog-android to v3.8.3 - autoclosed by @renovate in https://github.com/element-hq/element-x-android/pull/3742 +* Update dependency org.maplibre.gl:android-plugin-annotation-v9 to v3.0.2 by @renovate in https://github.com/element-hq/element-x-android/pull/3702 +* Update dependency com.posthog:posthog-android to v3.9.0 by @renovate in https://github.com/element-hq/element-x-android/pull/3754 +* Update kotlin by @renovate in https://github.com/element-hq/element-x-android/pull/3283 +* Update camera to v1.4.0 by @renovate in https://github.com/element-hq/element-x-android/pull/3765 +* Update dependencyAnalysis to v2.4.0 by @renovate in https://github.com/element-hq/element-x-android/pull/3773 +* Update kotlin to v2.0.21-1.0.26 by @renovate in https://github.com/element-hq/element-x-android/pull/3774 +* Update dependency androidx.annotation:annotation-jvm to v1.9.1 - autoclosed by @renovate in https://github.com/element-hq/element-x-android/pull/3762 +* chore(deps): update dependencyanalysis to v2.4.2 by @renovate in https://github.com/element-hq/element-x-android/pull/3791 +* fix(deps): update dependency androidx.compose:compose-bom to v2024.10.01 by @renovate in https://github.com/element-hq/element-x-android/pull/3782 +* Update dependency androidx.constraintlayout:constraintlayout-compose to v1.1.0 by @renovate in https://github.com/element-hq/element-x-android/pull/3770 +* fix(deps): update dependency androidx.constraintlayout:constraintlayout to v2.2.0 by @renovate in https://github.com/element-hq/element-x-android/pull/3784 +* fix(deps): update dependency org.matrix.rustcomponents:sdk-android to v0.2.59 by @renovate in https://github.com/element-hq/element-x-android/pull/3809 +* Update mobile-dev-inc/action-maestro-cloud action to v1.9.4 by @renovate in https://github.com/element-hq/element-x-android/pull/3820 +* Update dependency com.otaliastudios:transcoder to v0.11.2 by @renovate in https://github.com/element-hq/element-x-android/pull/3805 +* Update plugin paparazzi to v1.3.5 by @renovate in https://github.com/element-hq/element-x-android/pull/3826 +* Update dependency org.matrix.rustcomponents:sdk-android to v0.2.60 by @renovate in https://github.com/element-hq/element-x-android/pull/3827 +### Others +* Change wording to "Verify identity" by @bmarty in https://github.com/element-hq/element-x-android/pull/3751 +* Improve FakeMatrixRoom to be able to check all the parameters. by @bmarty in https://github.com/element-hq/element-x-android/pull/3761 +* Editor state fixture and preview improvement by @bmarty in https://github.com/element-hq/element-x-android/pull/3758 +* Enable identity pinning violation notifications unconditionally by @andybalaam in https://github.com/element-hq/element-x-android/pull/3745 +* Enable predictive back gesture by @frebib in https://github.com/element-hq/element-x-android/pull/3797 +* Update project status by @mxandreas in https://github.com/element-hq/element-x-android/pull/3806 +* Remove code duplication - no behavior change. by @bmarty in https://github.com/element-hq/element-x-android/pull/3823 +* Verification UI / UX iteration by @bmarty in https://github.com/element-hq/element-x-android/pull/3829 + +## New Contributors +* @andybalaam made their first contribution in https://github.com/element-hq/element-x-android/pull/3745 +* @mxandreas made their first contribution in https://github.com/element-hq/element-x-android/pull/3806 + +Changes in Element X v0.7.2 (2024-10-29) +======================================== + +## What's Changed +### 🙌 Improvements +* Add setting to compress image and video by @bmarty in https://github.com/element-hq/element-x-android/pull/3744 +### 🗣 Translations +* Sync Strings by @ElementBot in https://github.com/element-hq/element-x-android/pull/3743 +### 🧱 Build +* Release script improvement by @bmarty in https://github.com/element-hq/element-x-android/pull/3741 +### Dependency upgrades +* Update dependency org.maplibre.gl:android-sdk to v11.5.2 by @renovate in https://github.com/element-hq/element-x-android/pull/3720 +* Update dependency io.sentry:sentry-android to v7.16.0 by @renovate in https://github.com/element-hq/element-x-android/pull/3726 +* Update dependencyAnalysis to v2.3.0 by @renovate in https://github.com/element-hq/element-x-android/pull/3740 +* Update dependency org.matrix.rustcomponents:sdk-android to v0.2.58 by @renovate in https://github.com/element-hq/element-x-android/pull/3749 + +Changes in Element X v0.7.1 (2024-10-25) +======================================== + +## What's Changed +### ✨ Features +* Verified user badge by @bmarty in https://github.com/element-hq/element-x-android/pull/3718 +### 🙌 Improvements +* Add userId in identity change warning banner by @bmarty in https://github.com/element-hq/element-x-android/pull/3686 +* OIDC prompt by @bmarty in https://github.com/element-hq/element-x-android/pull/3694 +* Bump rust-sdk version to rust-sdk 0.2.57 by @BillCarsonFr in https://github.com/element-hq/element-x-android/pull/3735 +### 🐛 Bugfixes +* Refresh room summaries when date or time changes in the device by @jmartinesp in https://github.com/element-hq/element-x-android/pull/3683 +* Call: ensure that the microphone is working when the application is backgrounded. by @bmarty in https://github.com/element-hq/element-x-android/pull/3685 +* RTL: ensure sender information are correctly rendered in the timeline by @bmarty in https://github.com/element-hq/element-x-android/pull/3681 +* Improve composer paddings by @bmarty in https://github.com/element-hq/element-x-android/pull/3695 +* UI: fix list item colors by @bmarty in https://github.com/element-hq/element-x-android/pull/3706 +* Small UI iteration on pin feature. by @bmarty in https://github.com/element-hq/element-x-android/pull/3714 +* Use BigIcon and fix colors by @bmarty in https://github.com/element-hq/element-x-android/pull/3719 +### 🗣 Translations +* Sync Strings by @ElementBot in https://github.com/element-hq/element-x-android/pull/3665 +* Sync Strings by @ElementBot in https://github.com/element-hq/element-x-android/pull/3713 +### 🧱 Build +* Update Gradle Wrapper from 8.10 to 8.10.2 by @ElementBot in https://github.com/element-hq/element-x-android/pull/3663 +* fix: import path broken in module template by @torrybr in https://github.com/element-hq/element-x-android/pull/3710 +### 📄 Documentation +* Update store description by @bmarty in https://github.com/element-hq/element-x-android/pull/3680 +### 🚧 In development 🚧 +* Feature: knock request to join by @ganfra in https://github.com/element-hq/element-x-android/pull/3725 +### Dependency upgrades +* Update anvil to v0.3.2 by @renovate in https://github.com/element-hq/element-x-android/pull/3662 +* Update dependency io.nlopez.compose.rules:detekt to v0.4.16 by @renovate in https://github.com/element-hq/element-x-android/pull/3675 +* Update dependency com.posthog:posthog-android to v3.8.2 by @renovate in https://github.com/element-hq/element-x-android/pull/3674 +* Update dependency io.element.android:compound-android to v0.1.1 - Better support for RTL icons. by @renovate in https://github.com/element-hq/element-x-android/pull/3676 +* Update android.gradle.plugin to v8.7.1 by @renovate in https://github.com/element-hq/element-x-android/pull/3677 +* Update dependency io.sentry:sentry-android to v7.15.0 by @renovate in https://github.com/element-hq/element-x-android/pull/3640 +* Update mobile-dev-inc/action-maestro-cloud action to v1.9.2 by @renovate in https://github.com/element-hq/element-x-android/pull/3641 +* Update plugin licensee to v1.12.0 by @renovate in https://github.com/element-hq/element-x-android/pull/3687 +* Update dependency app.cash.turbine:turbine to v1.2.0 by @renovate in https://github.com/element-hq/element-x-android/pull/3696 +* Update activity to v1.9.3 by @renovate in https://github.com/element-hq/element-x-android/pull/3697 +* Update dependency androidx.compose:compose-bom to v2024.10.00 by @renovate in https://github.com/element-hq/element-x-android/pull/3699 +* Update dependency org.matrix.rustcomponents:sdk-android to v0.2.55 by @renovate in https://github.com/element-hq/element-x-android/pull/3701 +* Update dependencyAnalysis to v2.2.0 by @renovate in https://github.com/element-hq/element-x-android/pull/3707 +* Update anvil to v0.3.3 by @renovate in https://github.com/element-hq/element-x-android/pull/3711 +* Update dependency androidx.annotation:annotation-jvm to v1.9.0 by @renovate in https://github.com/element-hq/element-x-android/pull/3698 +* Update dependency com.google.firebase:firebase-bom to v33.5.0 by @renovate in https://github.com/element-hq/element-x-android/pull/3716 +* Update dependency org.matrix.rustcomponents:sdk-android to v0.2.56 by @renovate in https://github.com/element-hq/element-x-android/pull/3715 +* Update dependency com.squareup:kotlinpoet-ksp to v2 by @renovate in https://github.com/element-hq/element-x-android/pull/3722 +* Update dependency org.maplibre.gl:android-sdk-ktx-v7 to v3.0.2 by @renovate in https://github.com/element-hq/element-x-android/pull/3703 +* Dependencies : makes sure to use same version for all kotlinpoet dependencies by @ganfra in https://github.com/element-hq/element-x-android/pull/3727 +* Update dependency com.google.firebase:firebase-bom to v33.5.1 by @renovate in https://github.com/element-hq/element-x-android/pull/3731 +### Others +* No need to launch a coroutine here. by @bmarty in https://github.com/element-hq/element-x-android/pull/3668 +* Fix issue on canInvite refresh. by @bmarty in https://github.com/element-hq/element-x-android/pull/3670 +* AsyncAction confirming with param by @bmarty in https://github.com/element-hq/element-x-android/pull/3667 +* Cleanup tests by @bmarty in https://github.com/element-hq/element-x-android/pull/3672 +* Ensure selectedRoomMember is not null to reduce code indentation. by @bmarty in https://github.com/element-hq/element-x-android/pull/3669 +* Improve preview provider name consistency by @bmarty in https://github.com/element-hq/element-x-android/pull/3673 +* Clarify model for Event with attachment by @bmarty in https://github.com/element-hq/element-x-android/pull/3574 +* Improve room moderation by @bmarty in https://github.com/element-hq/element-x-android/pull/3671 +* Remove duplicated code regarding user (room member and user profile) screens by @bmarty in https://github.com/element-hq/element-x-android/pull/3700 +* Rename some function to avoid name clash by @bmarty in https://github.com/element-hq/element-x-android/pull/3705 +* Fix flaky tests. by @bmarty in https://github.com/element-hq/element-x-android/pull/3717 +* Update accent color for `Checkbox`, `RadioButton` and `Switch` components by @jmartinesp in https://github.com/element-hq/element-x-android/pull/3728 + +Changes in Element X v0.7.0 (2024-10-10) +======================================== + +## What's Changed +### 🙌 Improvements +* Enable Login with QR code in release builds. by @bmarty in https://github.com/element-hq/element-x-android/pull/3646 +* Remove unused `RoomSummary` cache by @jmartinesp in https://github.com/element-hq/element-x-android/pull/3647 +### 🐛 Bugfixes +* Add the `CallWebView` logs to our logging stack by @jmartinesp in https://github.com/element-hq/element-x-android/pull/3637 +### Dependency upgrades +* Update dependency io.element.android:emojibase-bindings to v1.3.3 by @renovate in https://github.com/element-hq/element-x-android/pull/3620 +* fix(deps): update dependency androidx.compose:compose-bom to v2024.09.03 by @renovate in https://github.com/element-hq/element-x-android/pull/3583 +* fix(deps): update dependency io.mockk:mockk to v1.13.13 by @renovate in https://github.com/element-hq/element-x-android/pull/3634 +* chore(deps): update dependencyanalysis to v2.1.4 by @renovate in https://github.com/element-hq/element-x-android/pull/3610 +* fix(deps): update dependency androidx.webkit:webkit to v1.12.1 by @renovate in https://github.com/element-hq/element-x-android/pull/3584 +* fix(deps): update dependency com.posthog:posthog-android to v3.8.1 by @renovate in https://github.com/element-hq/element-x-android/pull/3638 +* Upgrade Kotlin to v2.0 by @jmartinesp in https://github.com/element-hq/element-x-android/pull/3594 +### Others +* Rework room summary by @ganfra in https://github.com/element-hq/element-x-android/pull/3631 +* QrCode intro screen: add subtitle and fix button wording #3632 by @bmarty in https://github.com/element-hq/element-x-android/pull/3633 +* Improve avatar rendering by @ganfra in https://github.com/element-hq/element-x-android/pull/3642 +* Add feature flag IdentityPinningViolationNotifications. by @bmarty in https://github.com/element-hq/element-x-android/pull/3648 +* Crypto copy adjustment by @bmarty in https://github.com/element-hq/element-x-android/pull/3649 + + +Changes in Element X v0.6.5 (2024-10-09) +======================================== + +## What's Changed +### ✨ Features +* Add developer setting to hide images in the timeline by @bmarty in https://github.com/element-hq/element-x-android/pull/3592 +* Warn the user when unverified user has changed their identity by @bmarty in https://github.com/element-hq/element-x-android/pull/3621 +### 🙌 Improvements +* Handle no network error when starting Element Call. by @bmarty in https://github.com/element-hq/element-x-android/pull/3527 +### 🐛 Bugfixes +* Fix room settings not treating unencrypted DMs as DMs by @jmartinesp in https://github.com/element-hq/element-x-android/pull/3545 +* Fix crash when aspectRatio is null. by @bmarty in https://github.com/element-hq/element-x-android/pull/3561 +* Don't delete uploaded logs by @jmartinesp in https://github.com/element-hq/element-x-android/pull/3540 +* Don't display security banner for unknown RecoveryState by @jmartinesp in https://github.com/element-hq/element-x-android/pull/3579 +* Fix the logic of the room list banner state by @jmartinesp in https://github.com/element-hq/element-x-android/pull/3615 +### 🗣 Translations +* Sync Strings by @ElementBot in https://github.com/element-hq/element-x-android/pull/3560 +* Sync Strings - import translations to Persian by @ElementBot in https://github.com/element-hq/element-x-android/pull/3612 +### 🧱 Build +* Introduce ModulesConfig by @bmarty in https://github.com/element-hq/element-x-android/pull/3530 +* Centralise the DI code generation logic by @jmartinesp in https://github.com/element-hq/element-x-android/pull/3562 +* Update Gradle impl module template with `setupAnvil()` call by @jmartinesp in https://github.com/element-hq/element-x-android/pull/3563 +* Use Anvil KSP instead of the Square KAPT one by @jmartinesp in https://github.com/element-hq/element-x-android/pull/3564 +* Upgrade the used JDK in the project to v21 by @jmartinesp in https://github.com/element-hq/element-x-android/pull/3582 +* Merge unit, screenshot tests and coverage in a single CI call by @jmartinesp in https://github.com/element-hq/element-x-android/pull/3593 +* Disable configuration cache in the CI by default by @jmartinesp in https://github.com/element-hq/element-x-android/pull/3601 +* Fix screenshot recording in CI by @jmartinesp in https://github.com/element-hq/element-x-android/pull/3607 +* Ensure the CI compile and execute all the unit tests. by @bmarty in https://github.com/element-hq/element-x-android/pull/3617 +### Dependency upgrades +* Update dependency androidx.compose:compose-bom to v2024.09.00 by @renovate in https://github.com/element-hq/element-x-android/pull/3399 +* Update dependency androidx.compose:compose-bom to v2024.09.02 by @renovate in https://github.com/element-hq/element-x-android/pull/3544 +* Update dependency io.element.android:compound-android to v0.1.0 by @renovate in https://github.com/element-hq/element-x-android/pull/3524 +* Update dependency com.google.firebase:firebase-bom to v33.3.0 by @renovate in https://github.com/element-hq/element-x-android/pull/3549 +* Update dependency org.maplibre.gl:android-sdk to v11.5.0 by @renovate in https://github.com/element-hq/element-x-android/pull/3550 +* Update dependency org.maplibre.gl:android-plugin-annotation-v9 to v3.0.1 by @renovate in https://github.com/element-hq/element-x-android/pull/3505 +* Update dependency androidx.webkit:webkit to v1.12.0 by @renovate in https://github.com/element-hq/element-x-android/pull/3520 +* Update dependency com.posthog:posthog-android to v3.7.5 by @renovate in https://github.com/element-hq/element-x-android/pull/3546 +* Update gradle-update/update-gradle-wrapper-action action to v2 by @renovate in https://github.com/element-hq/element-x-android/pull/3551 +* Update dependency com.lemonappdev:konsist to v0.16.1 by @renovate in https://github.com/element-hq/element-x-android/pull/3371 +* Update android.gradle.plugin to v8.6.1 by @renovate in https://github.com/element-hq/element-x-android/pull/3504 +* Update dependency org.matrix.rustcomponents:sdk-android to v0.2.49 by @renovate in https://github.com/element-hq/element-x-android/pull/3553 +* Update lifecycle to v2.8.6 by @renovate in https://github.com/element-hq/element-x-android/pull/3398 +* Update dependency com.google.accompanist:accompanist-permissions to v0.36.0 by @renovate in https://github.com/element-hq/element-x-android/pull/3400 +* Update dependency org.matrix.rustcomponents:sdk-android to v0.2.50 by @renovate in https://github.com/element-hq/element-x-android/pull/3565 +* Update dependency com.google.firebase:firebase-bom to v33.4.0 by @renovate in https://github.com/element-hq/element-x-android/pull/3578 +* Update android.gradle.plugin to v8.7.0 by @renovate in https://github.com/element-hq/element-x-android/pull/3577 +* Update dependency com.posthog:posthog-android to v3.8.0 by @renovate in https://github.com/element-hq/element-x-android/pull/3591 +* dependency: Bump rust sdk to 0.2.51 by @BillCarsonFr in https://github.com/element-hq/element-x-android/pull/3602 +* chore(deps): update dependencyanalysis to v2.1.3 by @renovate in https://github.com/element-hq/element-x-android/pull/3559 +* Update wysiwyg to v2.37.13 by @renovate in https://github.com/element-hq/element-x-android/pull/3596 +* fix(deps): update dependency io.nlopez.compose.rules:detekt to v0.4.15 by @renovate in https://github.com/element-hq/element-x-android/pull/3595 +* fix(deps): update dependency com.google.testparameterinjector:test-parameter-injector to v1.18 by @renovate in https://github.com/element-hq/element-x-android/pull/3606 +* fix(deps): update dependency com.squareup:kotlinpoet-ksp to v1.18.1 by @renovate in https://github.com/element-hq/element-x-android/pull/3580 +* Update dependency org.matrix.rustcomponents:sdk-android to v0.2.52 by @renovate in https://github.com/element-hq/element-x-android/pull/3619 +* SDK 0.2.53 19b9a73ecc3e31d502dbf0c5850bfdfaddf02afe by @bmarty in https://github.com/element-hq/element-x-android/pull/3622 +* Update dependency org.maplibre.gl:android-sdk to v11.5.1 by @renovate in https://github.com/element-hq/element-x-android/pull/3608 +### Others +* rename invisible flag to onlySignedDeviceIsolation flag by @BillCarsonFr in https://github.com/element-hq/element-x-android/pull/3542 +* Fix image viewer glitch by @ganfra in https://github.com/element-hq/element-x-android/pull/3537 +* Prefix message sent by the current user by `You` instead of the sender name. by @bmarty in https://github.com/element-hq/element-x-android/pull/3547 +* timeline : remove animateItem by @ganfra in https://github.com/element-hq/element-x-android/pull/3548 +* Fix a couple of build-time warnings in Gradle output by @frebib in https://github.com/element-hq/element-x-android/pull/3349 +* Use MSC2530 filename when loading media by @frebib in https://github.com/element-hq/element-x-android/pull/3567 +* Prevent crash with duplicate room suggestion by @frebib in https://github.com/element-hq/element-x-android/pull/3576 +* Add unit tests on TimelineItemsSubscriber by @bmarty in https://github.com/element-hq/element-x-android/pull/3554 +* Fix tests on develop by @bmarty in https://github.com/element-hq/element-x-android/pull/3585 +* Timeline better jump to behaviours by @ganfra in https://github.com/element-hq/element-x-android/pull/3597 +* Fix building the app using a local SDK. by @bmarty in https://github.com/element-hq/element-x-android/pull/3604 +* crypto: Use OnlySigned isolation flag to setup decryption trust req. by @BillCarsonFr in https://github.com/element-hq/element-x-android/pull/3569 +* Fix black-on-black status bars with hidden media by @frebib in https://github.com/element-hq/element-x-android/pull/3611 +* Remove supportSlidingSync boolean. by @bmarty in https://github.com/element-hq/element-x-android/pull/3609 +* Ensure that `Presenter`s do not depend on other presenters. by @bmarty in https://github.com/element-hq/element-x-android/pull/3618 +* Do not render pin violation in clear rooms. by @bmarty in https://github.com/element-hq/element-x-android/pull/3630 + +Changes in Element X v0.6.4 (2024-09-25) +======================================== + +### 🙌 Improvements +* Pinned messages : add pin icon in timeline for pinned events. by @ganfra in https://github.com/element-hq/element-x-android/pull/3500 +* Include inviter in the notification for invitation by @bmarty in https://github.com/element-hq/element-x-android/pull/3503 + +### 🐛 Bugfixes +* Fix crash when session is deleted on another client by @bmarty in https://github.com/element-hq/element-x-android/pull/3515 +* Fix pinned events banner reappearing when loading by @jmartinesp in https://github.com/element-hq/element-x-android/pull/3519 +* Fix various crashes by @bmarty in https://github.com/element-hq/element-x-android/pull/3533 +* Perform the migration, even if the current version is not known. by @bmarty in https://github.com/element-hq/element-x-android/pull/3535 +* timeline : makes sure to emit empty list if initial reset has no item. by @ganfra in https://github.com/element-hq/element-x-android/pull/3538 + +### 🗣 Translations +* Sync Strings by @ElementBot in https://github.com/element-hq/element-x-android/pull/3513 +* Sync Strings by @ElementBot in https://github.com/element-hq/element-x-android/pull/3517 + +### Dependency upgrades +* Update dependency io.nlopez.compose.rules:detekt to v0.4.12 by @renovate in https://github.com/element-hq/element-x-android/pull/3436 +* Update dependency com.posthog:posthog-android to v3.7.3 by @renovate in https://github.com/element-hq/element-x-android/pull/3443 +* Update dependency com.otaliastudios:transcoder to v0.11.1 by @renovate in https://github.com/element-hq/element-x-android/pull/3440 +* Update dependency org.maplibre.gl:android-sdk to v11.4.0 by @renovate in https://github.com/element-hq/element-x-android/pull/3408 +* Update dependencyAnalysis to v2.0.2 by @renovate in https://github.com/element-hq/element-x-android/pull/3508 +* Update dependency org.maplibre.gl:android-sdk-ktx-v7 to v3.0.1 by @renovate in https://github.com/element-hq/element-x-android/pull/3507 +* Update dependencyAnalysis to v2.1.0 by @renovate in https://github.com/element-hq/element-x-android/pull/3526 +* Update dependency net.java.dev.jna:jna to v5.15.0 by @renovate in https://github.com/element-hq/element-x-android/pull/3525 +* Update dependency androidx.startup:startup-runtime to v1.2.0 by @renovate in https://github.com/element-hq/element-x-android/pull/3516 +* dependencies : update rust sdk to 0.2.48 by @ganfra in https://github.com/element-hq/element-x-android/pull/3532 + +### Others +* Change ElementBot mail to android@element.io by @bmarty in https://github.com/element-hq/element-x-android/pull/3497 +* Test RustMatrixClient and other classes in the matrix module by @bmarty in https://github.com/element-hq/element-x-android/pull/3501 +* Pinned messages analytics by @ganfra in https://github.com/element-hq/element-x-android/pull/3523 +* Remove ability to configure default log level by @bmarty in https://github.com/element-hq/element-x-android/pull/3531 + +Changes in Element X v0.6.3 (2024-09-19) +======================================== + +## What's Changed +### 🙌 Improvements +* Iterate send failure verification by @ganfra in https://github.com/element-hq/element-x-android/pull/3485 +### 🐛 Bugfixes +* Make sure the logout action doesn't cause a crash by @jmartinesp in https://github.com/element-hq/element-x-android/pull/3480 +* Distinguish between roomId and roomAlias. by @bmarty in https://github.com/element-hq/element-x-android/pull/3486 +* Fix sliding sync proxy login not working after native SS failure by @jmartinesp in https://github.com/element-hq/element-x-android/pull/3489 +### Dependency upgrades +* SDK 0.2.47 by @ganfra in https://github.com/element-hq/element-x-android/pull/3490 +### Others +* Add tests on AccountDeactivationView by @bmarty in https://github.com/element-hq/element-x-android/pull/3481 +* Cleanup and fixtures for SDK classes. by @bmarty in https://github.com/element-hq/element-x-android/pull/3488 +* Timeline related improvements by @ganfra in https://github.com/element-hq/element-x-android/pull/3487 +* Room list : debounce subscribe to visible rooms. by @ganfra in https://github.com/element-hq/element-x-android/pull/3491 +* Improve code coverage metrics by @bmarty in https://github.com/element-hq/element-x-android/pull/3450 + +### ✨ Features +* Account deactivation. by @bmarty in https://github.com/element-hq/element-x-android/pull/3479 + +Changes in Element X v0.6.1 (2024-09-17) +======================================== + +### ✨ Features +* Add forced logout flow when the proxy is no longer available by @jmartinesp in https://github.com/element-hq/element-x-android/pull/3458 +* Temporary account creation using Element Web. by @bmarty in https://github.com/element-hq/element-x-android/pull/3467 + +### 🙌 Improvements +* Feature/valere/invisible crypto feature flag by @BillCarsonFr in https://github.com/element-hq/element-x-android/pull/3451 +* Require acknowledgement to send to a verified user if their identity changed or if a device is unverified. by @ganfra in https://github.com/element-hq/element-x-android/pull/3461 +* Update pinned message actions by @ganfra in https://github.com/element-hq/element-x-android/pull/3438 + +### 🐛 Bugfixes +* Fix events blinking at the beginning of DM by @bmarty in https://github.com/element-hq/element-x-android/pull/3449 +* Fix not being able to decline an invite from the room list by @jmartinesp in https://github.com/element-hq/element-x-android/pull/3466 + +### 🗣 Translations +* Sync Strings by @ElementBot in https://github.com/element-hq/element-x-android/pull/3464 +* Sync Strings by @ElementBot in https://github.com/element-hq/element-x-android/pull/3469 +* Sync Strings by @ElementBot in https://github.com/element-hq/element-x-android/pull/3476 +* Sync Strings by @ElementBot in https://github.com/element-hq/element-x-android/pull/3477 + +### Others +* Upgrade Rust sdk to 0.2.45 by @bmarty in https://github.com/element-hq/element-x-android/pull/3472 +* SDK 0.2.46 by @bmarty in https://github.com/element-hq/element-x-android/pull/3475 + +Changes in Element X v0.6.0 (2024-09-12) +======================================== + +### 🙌 Improvements +* Enables pinned messages feature by default. by @ganfra in https://github.com/element-hq/element-x-android/pull/3439 +* Pinned messages list : hide reactions by @ganfra in https://github.com/element-hq/element-x-android/pull/3430 + +### 🐛 Bugfixes +* Feature/fga/pinned messages fix timeline provider by @ganfra in https://github.com/element-hq/element-x-android/pull/3432 + +### Dependency upgrades +* Update activity to v1.9.2 by @renovate in https://github.com/element-hq/element-x-android/pull/3397 +* Update peter-evans/create-pull-request action to v7 by @renovate in https://github.com/element-hq/element-x-android/pull/3383 +* Rust sdk upgrade to 0.2.43 by @bmarty in https://github.com/element-hq/element-x-android/pull/3446 + +### Others +* DeviceId and cleanup. by @bmarty in https://github.com/element-hq/element-x-android/pull/3442 +* Update application store assets by @bmarty in https://github.com/element-hq/element-x-android/pull/3441 + +Changes in Element X v0.5.3 (2024-09-10) +======================================== + +### ✨ Features +* Add banner for optional migration to simplified sliding sync by @jmartinesp in https://github.com/element-hq/element-x-android/pull/3429 + +### 🙌 Improvements +* Timeline : remove the encrypted history banner by @ganfra in https://github.com/element-hq/element-x-android/pull/3410 + +### 🐛 Bugfixes +* Fix new logins with Simplified SS using the proxy by @jmartinesp in https://github.com/element-hq/element-x-android/pull/3417 +* Ensure Call is not hang up when user is asked to grant system permissions by @bmarty in https://github.com/element-hq/element-x-android/pull/3419 +* Wait for a room with joined state in `/sync` after creating it by @jmartinesp in https://github.com/element-hq/element-x-android/pull/3421 +* [Bugfix] : fix self verification flow by @ganfra in https://github.com/element-hq/element-x-android/pull/3426 + +### 🗣 Translations +* Sync Strings by @ElementBot in https://github.com/element-hq/element-x-android/pull/3425 + +### 🚧 In development 🚧 +* [Feature] Pinned messages list by @ganfra in https://github.com/element-hq/element-x-android/pull/3392 +* Pinned messages banner : adjust indicator to match design. by @ganfra in https://github.com/element-hq/element-x-android/pull/3415 + +### Dependency upgrades +* Update plugin dependencycheck to v10.0.4 by @renovate in https://github.com/element-hq/element-x-android/pull/3372 +* Update plugin detekt to v1.23.7 by @renovate in https://github.com/element-hq/element-x-android/pull/3424 + +### Others +* Delete old log files by @bmarty in https://github.com/element-hq/element-x-android/pull/3413 +* Recovery key formatting and wording iteration by @bmarty in https://github.com/element-hq/element-x-android/pull/3409 +* Change license to AGPL by @bmarty in https://github.com/element-hq/element-x-android/pull/3422 +* Remove Wait list screen by @bmarty in https://github.com/element-hq/element-x-android/pull/3428 + +Changes in Element X v0.5.2 (2024-09-05) +========================================= + +### 🙌 Improvements +* [Identity reset] Remove instruction to reset identity on another client. by @bmarty in https://github.com/element-hq/element-x-android/pull/3355 +* Redact message on displayed notification by @bmarty in https://github.com/element-hq/element-x-android/pull/3320 +* Add a way to sign out when the user is asked to verify the session. by @bmarty in https://github.com/element-hq/element-x-android/pull/3359 +* Add banner entry point to set up recovery by @bmarty in https://github.com/element-hq/element-x-android/pull/3360 +* Replace OSS licenses plugin with Licensee and some manually done UI. by @bmarty in https://github.com/element-hq/element-x-android/pull/3381 + +### 🐛 Bugfixes +* Small fixes around logging out. by @bmarty in https://github.com/element-hq/element-x-android/pull/3356 +* Ensure starting PinUnlockActivity does not crash the application. by @bmarty in https://github.com/element-hq/element-x-android/pull/3369 +* Use the right colors for `@room` mention pills by @jmartinesp in https://github.com/element-hq/element-x-android/pull/3376 +* Fix avatar sometimes not loading by @bmarty in https://github.com/element-hq/element-x-android/pull/3366 +* Make pinned events required state in SlidingSync by @jmartinesp in https://github.com/element-hq/element-x-android/pull/3385 +* Make sure to save the tokens the Client might return when its session is restored by @jmartinesp in https://github.com/element-hq/element-x-android/pull/3378 +* Fix Element Call closing automatically on API 34 by @jmartinesp in https://github.com/element-hq/element-x-android/pull/3402 + +### 🗣 Translations +* Sync Strings by @ElementBot in https://github.com/element-hq/element-x-android/pull/3373 + +### 🧱 Build +* Try adding a memory limit for the kotlin compiler by @jmartinesp in https://github.com/element-hq/element-x-android/pull/3377 + +### Dependency upgrades +* Update dependency com.google.testparameterinjector:test-parameter-injector to v1.17 by @renovate in https://github.com/element-hq/element-x-android/pull/3357 +* Update dependencyAnalysis to v2.0.1 by @renovate in https://github.com/element-hq/element-x-android/pull/3362 +* Update android.gradle.plugin to v8.6.0 by @renovate in https://github.com/element-hq/element-x-android/pull/3363 +* Update dependency io.nlopez.compose.rules:detekt to v0.4.11 by @renovate in https://github.com/element-hq/element-x-android/pull/3364 +* Update dependency com.posthog:posthog-android to v3.6.0 by @renovate in https://github.com/element-hq/element-x-android/pull/3358 +* Update mobile-dev-inc/action-maestro-cloud action to v1.9.1 by @renovate in https://github.com/element-hq/element-x-android/pull/3367 +* Update dependency com.posthog:posthog-android to v3.6.1 by @renovate in https://github.com/element-hq/element-x-android/pull/3368 +* Update dependency org.matrix.rustcomponents:sdk-android to v0.2.41 by @renovate in https://github.com/element-hq/element-x-android/pull/3384 +* Rust sdk : update to 0.2.42 by @ganfra in https://github.com/element-hq/element-x-android/pull/3393 +* Update dependency com.android.tools:desugar_jdk_libs to v2.1.2 by @renovate in https://github.com/element-hq/element-x-android/pull/3350 +* Update dependency com.sigpwned:emoji4j-core to v15.1.2 by @renovate in https://github.com/element-hq/element-x-android/pull/3396 + +### Others +* Release : use a different concurrency group for enterprise build by @ganfra in https://github.com/element-hq/element-x-android/pull/3351 +* Provide distinct cache directory to the Rust SDK. by @bmarty in https://github.com/element-hq/element-x-android/pull/3370 +* Remove the migration screen by @bmarty in https://github.com/element-hq/element-x-android/pull/3389 +* Unified push endpoint: do not fallback to default endpoint in case of failure and add troubleshoot test. by @bmarty in https://github.com/element-hq/element-x-android/pull/3388 +* Skip device verification screen when creating a new account using OIDC by @bmarty in https://github.com/element-hq/element-x-android/pull/3395 +* Big emoji-only messages by @frebib in https://github.com/element-hq/element-x-android/pull/3295 + +Changes in Element X v0.5.1 (2024-08-28) +========================================= + +### ✨ Features +* Add simplified sliding sync toggle to developer options by @jmartinesp in https://github.com/element-hq/element-x-android/pull/3222 +* Feature: identity reset by @jmartinesp in https://github.com/element-hq/element-x-android/pull/3298 +* Timeline UI | MessageShield Support by @BillCarsonFr in https://github.com/element-hq/element-x-android/pull/3240 +* Suggestion for room alias (disabled for now) by @bmarty in https://github.com/element-hq/element-x-android/pull/3322 +* Allow `PictureInPicture` mode for Element Call. by @bmarty in https://github.com/element-hq/element-x-android/pull/3345 + +### 🙌 Improvements +* Join Room : allow to join by alias (and getPreview) by @ganfra in https://github.com/element-hq/element-x-android/pull/3241 +* [Feature] Pinned message : render m.room.pinned events in timeline by @ganfra in https://github.com/element-hq/element-x-android/pull/3276 +* Enable sync on push feature flag to partially sync when notifications arrive by @jmartinesp in https://github.com/element-hq/element-x-android/pull/3290 +* Improve the text for mentions and replies in notifications by @jmartinesp in https://github.com/element-hq/element-x-android/pull/3328 +* Use new functions exposed by Element Call about PiP by @bmarty in https://github.com/element-hq/element-x-android/pull/3334 + +### 🐛 Bugfixes +* Ensure sessionPath is not reused for different homeserver. Fixes not loading media issue. by @bmarty in https://github.com/element-hq/element-x-android/pull/3299 +* Fix reset identity with password stuck in loading state. by @jmartinesp in https://github.com/element-hq/element-x-android/pull/3317 + +### 🗣 Translations +* Sync Strings by @ElementBot in https://github.com/element-hq/element-x-android/pull/3252 +* Sync Strings by @ElementBot in https://github.com/element-hq/element-x-android/pull/3267 +* Sync Strings by @ElementBot in https://github.com/element-hq/element-x-android/pull/3297 +* Sync Strings - New language: Dutch. by @ElementBot in https://github.com/element-hq/element-x-android/pull/3308 +* Sync Strings by @ElementBot in https://github.com/element-hq/element-x-android/pull/3339 + +### 🧱 Build +* Update sonarcloud project key by @guillaumevillemont in https://github.com/element-hq/element-x-android/pull/3264 +* Fix `build_rust_sdk.sh` script to work on linux by @erikjohnston in https://github.com/element-hq/element-x-android/pull/3291 +* Fix proguard config for nightly and release builds by @jmartinesp in https://github.com/element-hq/element-x-android/pull/3294 +* Gradle update action: Use JDK 17 and skip early in forks. by @bmarty in https://github.com/element-hq/element-x-android/pull/3311 +* Gradle update action: add label and use other token. by @bmarty in https://github.com/element-hq/element-x-android/pull/3313 +* Update Gradle Wrapper from 8.9 to 8.10 by @ElementBot in https://github.com/element-hq/element-x-android/pull/3314 + +### 🚧 In development 🚧 +* WIP Pinned events : add feature flag and pin/unpin actions by @ganfra in https://github.com/element-hq/element-x-android/pull/3255 +* WIP Pinned events : start creating the banner ui, no logic. by @ganfra in https://github.com/element-hq/element-x-android/pull/3259 +* WIP Pinned events : banner logic by @ganfra in https://github.com/element-hq/element-x-android/pull/3275 + +### Dependency upgrades +* Update dependency org.maplibre.gl:android-sdk to v11.1.0 by @renovate in https://github.com/element-hq/element-x-android/pull/3244 +* Update activity to v1.9.1 by @renovate in https://github.com/element-hq/element-x-android/pull/3242 +* Update media3 to v1.4.0 by @renovate in https://github.com/element-hq/element-x-android/pull/3247 +* Update dependency androidx.annotation:annotation-jvm to v1.8.1 by @renovate in https://github.com/element-hq/element-x-android/pull/3243 +* Update dependencyAnalysis to v1.33.0 by @renovate in https://github.com/element-hq/element-x-android/pull/3250 +* Update dependency org.matrix.rustcomponents:sdk-android to v0.2.35 by @renovate in https://github.com/element-hq/element-x-android/pull/3249 +* Update dependency io.sentry:sentry-android to v7.12.1 by @renovate in https://github.com/element-hq/element-x-android/pull/3246 +* Update dependency io.nlopez.compose.rules:detekt to v0.4.8 by @renovate in https://github.com/element-hq/element-x-android/pull/3254 +* Update dependency org.matrix.rustcomponents:sdk-android to v0.2.36 by @renovate in https://github.com/element-hq/element-x-android/pull/3269 +* Update wysiwyg to v2.37.8 by @renovate in https://github.com/element-hq/element-x-android/pull/3263 +* Update dependency io.sentry:sentry-android to v7.13.0 by @renovate in https://github.com/element-hq/element-x-android/pull/3258 +* Update dependency io.nlopez.compose.rules:detekt to v0.4.9 by @renovate in https://github.com/element-hq/element-x-android/pull/3277 +* Update dependency org.matrix.rustcomponents:sdk-android to v0.2.38 by @renovate in https://github.com/element-hq/element-x-android/pull/3280 +* Update dependency androidx.annotation:annotation-jvm to v1.8.2 by @renovate in https://github.com/element-hq/element-x-android/pull/3282 +* Update kotlin by @renovate in https://github.com/element-hq/element-x-android/pull/2990 +* Update dependency io.nlopez.compose.rules:detekt to v0.4.10 by @renovate in https://github.com/element-hq/element-x-android/pull/3281 +* Update dependency com.posthog:posthog-android to v3.5.0 by @renovate in https://github.com/element-hq/element-x-android/pull/3287 +* Update wysiwyg to v2.37.8 by @renovate in https://github.com/element-hq/element-x-android/pull/3284 +* Update the SDK bindings to `v0.2.39` by @jmartinesp in https://github.com/element-hq/element-x-android/pull/3288 +* Update gradle/actions action to v4 by @renovate in https://github.com/element-hq/element-x-android/pull/3265 +* Update android.gradle.plugin to v8.5.2 by @renovate in https://github.com/element-hq/element-x-android/pull/3004 +* Update dependency io.sentry:sentry-android to v7.13.0 by @renovate in https://github.com/element-hq/element-x-android/pull/3285 +* Update dependency io.sentry:sentry-android to v7.14.0 by @renovate in https://github.com/element-hq/element-x-android/pull/3302 +* Update dependency androidx.test:runner to v1.6.2 by @renovate in https://github.com/element-hq/element-x-android/pull/3304 +* Update dependency com.otaliastudios:transcoder to v0.11.0 by @renovate in https://github.com/element-hq/element-x-android/pull/3306 +* Update lifecycle to v2.8.0 by @renovate in https://github.com/element-hq/element-x-android/pull/2848 +* Update lifecycle to v2.8.4 by @renovate in https://github.com/element-hq/element-x-android/pull/3315 +* Update dagger to v2.52 by @renovate in https://github.com/element-hq/element-x-android/pull/3270 +* Update telephoto to v0.13.0 by @renovate in https://github.com/element-hq/element-x-android/pull/3325 +* Update dependency androidx.compose:compose-bom to v2024.08.00 by @renovate in https://github.com/element-hq/element-x-android/pull/3323 +* Update dependency com.google.firebase:firebase-bom to v33.2.0 by @renovate in https://github.com/element-hq/element-x-android/pull/3331 +* Update dependency com.posthog:posthog-android to v3.5.1 by @renovate in https://github.com/element-hq/element-x-android/pull/3340 +* Update dependency com.android.tools:desugar_jdk_libs to v2.1.0 by @renovate in https://github.com/element-hq/element-x-android/pull/3341 +* Update dependencyAnalysis to v2 (major) by @renovate in https://github.com/element-hq/element-x-android/pull/3346 +* Update dependency org.maplibre.gl:android-sdk to v11.2.0 by @renovate in https://github.com/element-hq/element-x-android/pull/3347 +* Update media3 to v1.4.1 by @renovate in https://github.com/element-hq/element-x-android/pull/3344 +* Update dependency org.matrix.rustcomponents:sdk-android to v0.2.40 by @renovate in https://github.com/element-hq/element-x-android/pull/3343 + +### Others +* Feature/fga/push subscribe to room by @ganfra in https://github.com/element-hq/element-x-android/pull/3257 +* Feature/fga/start sync on push by @ganfra in https://github.com/element-hq/element-x-android/pull/3260 +* Cleanup and add unit test for DefaultPinnedMessagesBannerFormatter by @bmarty in https://github.com/element-hq/element-x-android/pull/3307 +* Add test on function name which may start or end with spaces by @bmarty in https://github.com/element-hq/element-x-android/pull/3318 +* Fix broken direct room member for rooms with old users that left by @networkException in https://github.com/element-hq/element-x-android/pull/3324 +* Add unit test on MatrixRoom extension by @bmarty in https://github.com/element-hq/element-x-android/pull/3327 +* Fix login navigation getting stuck when the app was compiled with no-op analytics provider by @SpiritCroc in https://github.com/element-hq/element-x-android/pull/3337 + +Changes in Element X v0.5.0 (2024-07-24) +========================================= + +### 🙌 Improvements +* Add icon for "Mark as read" and "Mark as unread" actions. by @bmarty in https://github.com/element-hq/element-x-android/pull/3144 +* Add support for Picture In Picture for Element Call by @bmarty in https://github.com/element-hq/element-x-android/pull/3159 +* Set pin grace period to 2 minutes by @bmarty in https://github.com/element-hq/element-x-android/pull/3172 +* Unify the way we decide whether a room is a DM or a group room by @jmartinesp in https://github.com/element-hq/element-x-android/pull/3100 +* Subscribe to `RoomListItems` in the visible range by @jmartinesp in https://github.com/element-hq/element-x-android/pull/3169 +* Improve pip and add feature flag. by @bmarty in https://github.com/element-hq/element-x-android/pull/3199 +* Open Source licenses: add color for links. by @bmarty in https://github.com/element-hq/element-x-android/pull/3215 +* Cancel ringing call notification on call cancellation by @jmartinesp in https://github.com/element-hq/element-x-android/pull/3047 + +### 🐛 Bugfixes +* Fix `MainActionButton` layout for long texts by @jmartinesp in https://github.com/element-hq/element-x-android/pull/3158 +* Always follow the desired theme for Pin, Incoming Call and Element Call screens by @bmarty in https://github.com/element-hq/element-x-android/pull/3165 +* Fix empty screen issue after clearing the cache by @bmarty in https://github.com/element-hq/element-x-android/pull/3163 +* Restore intentional mentions in the markdown/plain text editor by @jmartinesp in https://github.com/element-hq/element-x-android/pull/3193 +* Fix crash in the room list after a forced log out in background by @jmartinesp in https://github.com/element-hq/element-x-android/pull/3180 +* Clear existing notification when a room is marked as read by @bmarty in https://github.com/element-hq/element-x-android/pull/3203 +* Fix crash when Pin code screen is displayed by @bmarty in https://github.com/element-hq/element-x-android/pull/3205 +* Fix pillification not working for non formatted message bodies by @jmartinesp in https://github.com/element-hq/element-x-android/pull/3201 +* Update grammar on Matrix Ids to be more spec compliant and render error instead of infinite loading in room member list screen by @bmarty in https://github.com/element-hq/element-x-android/pull/3206 +* Reduce the risk of text truncation in buttons. by @bmarty in https://github.com/element-hq/element-x-android/pull/3209 +* Ensure that the manual dark theme is rendering correctly regarding -night resource and keyboard by @bmarty in https://github.com/element-hq/element-x-android/pull/3216 +* Fix rendering issue of SunsetPage in dark mode by @bmarty in https://github.com/element-hq/element-x-android/pull/3217 +* Fix linkification not working for `Spanned` strings in text messages by @jmartinesp in https://github.com/element-hq/element-x-android/pull/3233 +* Edit : fallback to room.edit when timeline item is not found. by @ganfra in https://github.com/element-hq/element-x-android/pull/3239 + +### 🗣 Translations +* Sync Strings by @ElementBot in https://github.com/element-hq/element-x-android/pull/3156 +* Sync Strings by @ElementBot in https://github.com/element-hq/element-x-android/pull/3192 +* Sync Strings by @ElementBot in https://github.com/element-hq/element-x-android/pull/3232 + +### 🧱 Build +* Remove Showkase processor not found warning from Danger by @jmartinesp in https://github.com/element-hq/element-x-android/pull/3148 +* Set targetSDK to 34 by @bmarty in https://github.com/element-hq/element-x-android/pull/3149 +* Add a local copy of `inplace-fix.py` and `fix-pg-map-id.py` by @bmarty in https://github.com/element-hq/element-x-android/pull/3167 +* Only add private SSH keys and clone submodules in the original repo by @jmartinesp in https://github.com/element-hq/element-x-android/pull/3225 +* Fix CI for forks by @jmartinesp in https://github.com/element-hq/element-x-android/pull/3226 + +### Dependency upgrades +* Update dependency io.element.android:compound-android to v0.0.7 by @renovate in https://github.com/element-hq/element-x-android/pull/3143 +* Update dependency org.matrix.rustcomponents:sdk-android to v0.2.31 by @renovate in https://github.com/element-hq/element-x-android/pull/3145 +* Update dependency com.squareup:kotlinpoet to v1.18.0 by @renovate in https://github.com/element-hq/element-x-android/pull/3150 +* Update dependency org.robolectric:robolectric to v4.13 by @renovate in https://github.com/element-hq/element-x-android/pull/3157 +* Update plugin dependencycheck to v10.0.2 by @renovate in https://github.com/element-hq/element-x-android/pull/3154 +* Update wysiwyg to v2.37.5 by @renovate in https://github.com/element-hq/element-x-android/pull/3162 +* Update plugin sonarqube to v5.1.0.4882 by @renovate in https://github.com/element-hq/element-x-android/pull/3139 +* Update dependency org.jsoup:jsoup to v1.18.1 by @renovate in https://github.com/element-hq/element-x-android/pull/3171 +* Update dependency com.google.firebase:firebase-bom to v33.1.2 by @renovate in https://github.com/element-hq/element-x-android/pull/3178 +* Update telephoto to v0.12.0 by @renovate in https://github.com/element-hq/element-x-android/pull/3191 +* Update dependency com.google.truth:truth to v1.4.4 by @renovate in https://github.com/element-hq/element-x-android/pull/3187 +* Update dependency com.squareup:kotlinpoet to v1.18.1 by @renovate in https://github.com/element-hq/element-x-android/pull/3194 +* Update dependency io.mockk:mockk to v1.13.12 by @renovate in https://github.com/element-hq/element-x-android/pull/3198 +* Update dependency io.sentry:sentry-android to v7.12.0 by @renovate in https://github.com/element-hq/element-x-android/pull/3200 +* Update plugin dependencycheck to v10.0.3 by @renovate in https://github.com/element-hq/element-x-android/pull/3204 +* Update dependency gradle to v8.9 by @renovate in https://github.com/element-hq/element-x-android/pull/3177 +* Update dependency org.matrix.rustcomponents:sdk-android to v0.2.32 by @renovate in https://github.com/element-hq/element-x-android/pull/3202 +* Update coil to v2.7.0 by @renovate in https://github.com/element-hq/element-x-android/pull/3210 +* Update dependency org.matrix.rustcomponents:sdk-android to v0.2.33 by @renovate in https://github.com/element-hq/element-x-android/pull/3220 +* Update wysiwyg to v2.37.7 by @renovate in https://github.com/element-hq/element-x-android/pull/3218 +* Update telephoto to v0.12.1 by @renovate in https://github.com/element-hq/element-x-android/pull/3230 +* Update dependency org.matrix.rustcomponents:sdk-android to v0.2.34 by @renovate in https://github.com/element-hq/element-x-android/pull/3237 + +### Others +* Reduce delay when selecting room list filters by @jmartinesp in https://github.com/element-hq/element-x-android/pull/3160 +* Add `--alignment-preserved true` when signing APK for F-Droid. by @bmarty in https://github.com/element-hq/element-x-android/pull/3161 +* Ensure that all callback plugins are invoked. by @bmarty in https://github.com/element-hq/element-x-android/pull/3146 +* Add generated screen to show open source licenses in Gplay variant by @bmarty in https://github.com/element-hq/element-x-android/pull/3207 +* Performance : improve time to open a room. by @ganfra in https://github.com/element-hq/element-x-android/pull/3186 +* Add logging to help debug forced logout issues by @jmartinesp in https://github.com/element-hq/element-x-android/pull/3208 +* Use the right filename for log files so they're sorted in rageshakes by @jmartinesp in https://github.com/element-hq/element-x-android/pull/3219 +* Compose : add immutability to some Reaction classes by @ganfra in https://github.com/element-hq/element-x-android/pull/3224 +* Fix stickers display text on room summary by @surakin in https://github.com/element-hq/element-x-android/pull/3221 +* Rework FakeMatrixRoom so that it contains only lambdas. by @bmarty in https://github.com/element-hq/element-x-android/pull/3229 + +Changes in Element X v0.4.16 (2024-07-05) +========================================= + +### ✨ Features +* Avatar cluster for DM by @bmarty in https://github.com/element-hq/element-x-android/pull/3069 +* Feature : Draft support by @ganfra in https://github.com/element-hq/element-x-android/pull/3099 +* Timeline : re-enable edition of local echo by @ganfra in https://github.com/element-hq/element-x-android/pull/3126 +* Draft : add volatile storage when moving to edit mode. by @ganfra in https://github.com/element-hq/element-x-android/pull/3132 + +### 🙌 Improvements +* Give locale and theme to Element Call by @bmarty in https://github.com/element-hq/element-x-android/pull/3118 +* Let the SDK retrieve and parse Element well known content by @bmarty in https://github.com/element-hq/element-x-android/pull/3127 + +### 🐛 Bugfixes +* Let role and permissions screens works for invited room members too. by @bmarty in https://github.com/element-hq/element-x-android/pull/3081 +* Fix image rendering after clear cache by @bmarty in https://github.com/element-hq/element-x-android/pull/3082 +* Replace the 'answer' PendingIntent in ringing call notifications by @jmartinesp in https://github.com/element-hq/element-x-android/pull/3093 +* Use IO dispatcher for cleanup in bug reporter by @jmartinesp in https://github.com/element-hq/element-x-android/pull/3092 +* Fix `@room` mentions crashing in debug builds by @jmartinesp in https://github.com/element-hq/element-x-android/pull/3107 +* Auth : fix restore session when there is no network. by @ganfra in https://github.com/element-hq/element-x-android/pull/3109 +* Alert for incoming call even if notifications are disabled - WAITING FOR FINAL PRODUCT DECISION by @bmarty in https://github.com/element-hq/element-x-android/pull/3053 +* Fix incorrect 'device verified' screen when app was opened with no network connection by @jmartinesp in https://github.com/element-hq/element-x-android/pull/3110 +* Draft : also clear draft when composer is blank by @ganfra in https://github.com/element-hq/element-x-android/pull/3115 +* Timeline : fix text item not refreshed when content change by @ganfra in https://github.com/element-hq/element-x-android/pull/3123 +* FFs can now be toggled in release builds too by @jmartinesp in https://github.com/element-hq/element-x-android/pull/3101 +* Fix crash when getting the system ringtone for ringing calls by @jmartinesp in https://github.com/element-hq/element-x-android/pull/3131 +* Bugfix : avoid potential NPE on verification service. by @ganfra in https://github.com/element-hq/element-x-android/pull/3140 + +### 🗣 Translations +* Sync Strings by @ElementBot in https://github.com/element-hq/element-x-android/pull/3114 +* Sync Strings - Add Greek translations by @ElementBot in https://github.com/element-hq/element-x-android/pull/3133 + +### 🧱 Build +* Let GitHub generates the release notes by @bmarty in https://github.com/element-hq/element-x-android/pull/3105 +* Fix F-Droid reproducible build. by @bmarty in https://github.com/element-hq/element-x-android/pull/3106 +* Element enterprise (EE) foundations by @bmarty in https://github.com/element-hq/element-x-android/pull/3025 +* Fix Element Enterprise nightly build and publication using App Distribution by @bmarty in https://github.com/element-hq/element-x-android/pull/3130 +* Improve screenshot testing with ComposablePreviewScanner by @jmartinesp in https://github.com/element-hq/element-x-android/pull/3125 + +### Dependency upgrades +* Update dependency com.posthog:posthog-android to v3.4.0 by @renovate in https://github.com/element-hq/element-x-android/pull/3060 +* Update danger/danger-js action to v12.3.3 by @renovate in https://github.com/element-hq/element-x-android/pull/3059 +* Update dependency com.freeletics.flowredux:compose to v1.2.2 by @renovate in https://github.com/element-hq/element-x-android/pull/3067 +* Update dependency com.google.firebase:firebase-bom to v33.1.1 by @renovate in https://github.com/element-hq/element-x-android/pull/3062 +* Update dependency androidx.test.ext:junit to v1.2.0 by @renovate in https://github.com/element-hq/element-x-android/pull/3088 +* Update test.core to v1.6.0 by @renovate in https://github.com/element-hq/element-x-android/pull/3090 +* Remove dependencies androidx.test.espresso:espresso-core and androidx.appcompat:appcompat by @renovate in https://github.com/element-hq/element-x-android/pull/3087 +* Update wysiwyg to v2.37.4 by @renovate in https://github.com/element-hq/element-x-android/pull/3094 +* Update dependency androidx.test:runner to v1.6.0 by @renovate in https://github.com/element-hq/element-x-android/pull/3089 +* Update test.core to v1.6.1 by @renovate in https://github.com/element-hq/element-x-android/pull/3104 +* Update dependency androidx.test:runner to v1.6.1 by @renovate in https://github.com/element-hq/element-x-android/pull/3103 +* Update dependency androidx.test.ext:junit to v1.2.1 by @renovate in https://github.com/element-hq/element-x-android/pull/3102 +* Update dependency com.google.truth:truth to v1.4.3 by @renovate in https://github.com/element-hq/element-x-android/pull/3108 +* Update dependency com.posthog:posthog-android to v3.4.2 by @renovate in https://github.com/element-hq/element-x-android/pull/3111 +* Update dependency io.nlopez.compose.rules:detekt to v0.4.5 by @renovate in https://github.com/element-hq/element-x-android/pull/3116 +* Update dependency org.matrix.rustcomponents:sdk-android to v0.2.29 by @renovate in https://github.com/element-hq/element-x-android/pull/3119 +* Update plugin dependencycheck to v10 by @renovate in https://github.com/element-hq/element-x-android/pull/3128 +* Update plugin dependencycheck to v10.0.1 by @renovate in https://github.com/element-hq/element-x-android/pull/3129 +* Update dependency io.sentry:sentry-android to v7.11.0 by @renovate in https://github.com/element-hq/element-x-android/pull/3122 +* Update dependency org.matrix.rustcomponents:sdk-android to v0.2.30 by @renovate in https://github.com/element-hq/element-x-android/pull/3138 + +### Others +* Feature/fga/sending queue iteration by @ganfra in https://github.com/element-hq/element-x-android/pull/3054 +* Use full date format for day dividers in timeline by @jmartinesp in https://github.com/element-hq/element-x-android/pull/3057 +* Let Dms use other member color. by @bmarty in https://github.com/element-hq/element-x-android/pull/3058 +* Resolve display names in mentions in real time by @jmartinesp in https://github.com/element-hq/element-x-android/pull/3051 +* Sync Strings by @ElementBot in https://github.com/element-hq/element-x-android/pull/3077 +* Improve the way we cut the bubble layout to give space for the sender Avatar by @bmarty in https://github.com/element-hq/element-x-android/pull/3080 +* Upgrade build tools and fix `pg-map-id` for F-Droid by @bmarty in https://github.com/element-hq/element-x-android/pull/3084 +* Improve room filtering behavior. by @bmarty in https://github.com/element-hq/element-x-android/pull/3083 +* Adapt our code to the new authentication APIs in the Rust SDK by @jmartinesp in https://github.com/element-hq/element-x-android/pull/3068 +* Add temporary icon for Element Enterprise by @bmarty in https://github.com/element-hq/element-x-android/pull/3134 +* Improve click behavior on room timeline title by @bmarty in https://github.com/element-hq/element-x-android/pull/3064 + +Changes in Element X v0.4.15 (2024-06-19) +========================================= + +Features ✨ +---------- + - Ringing call notifications and full screen ringing screen for DMs when the device is locked. ([#2894](https://github.com/element-hq/element-x-android/issues/2894)) + +Bugfixes 🐛 +---------- + - Improve UX on notification setting changes. ([#1647](https://github.com/element-hq/element-x-android/issues/1647)) + - Fix tracing configuration in debug and nightlies: + - Debug will now write the logs to disk too. + - Nightly will be able to customise tracing filters. + - Improved the configure tracing and bug report screens. ([#3016](https://github.com/element-hq/element-x-android/issues/3016)) + +Other changes +------------- + - Allow cancelling jump to event in timeline. ([#2876](https://github.com/element-hq/element-x-android/issues/2876)) + - Make Element Call widget URL configurable ([#3009](https://github.com/element-hq/element-x-android/issues/3009)) + - Enable hidden access to developer options in release mode apps. ([#3020](https://github.com/element-hq/element-x-android/issues/3020)) + - Improve how active calls work by also taking into account external url calls and waiting for the sync process to start before sending the `m.call.notify` event. ([#3029](https://github.com/element-hq/element-x-android/issues/3029)) + + +Changes in Element X v0.4.14 (2024-06-07) +========================================= + +Features ✨ +---------- + - Add support for incoming share (text or files) from other apps ([#1980](https://github.com/element-hq/element-x-android/issues/1980)) + +Bugfixes 🐛 +---------- + - Render selected/deselected room list filters on top ([#2809](https://github.com/element-hq/element-x-android/issues/2809)) + - Set auto captilization, multiline and autocompletion flags for the markdown EditText. ([#2896](https://github.com/element-hq/element-x-android/issues/2896)) + - Restore Markdown text input contents when returning to the room screen. ([#2898](https://github.com/element-hq/element-x-android/issues/2898)) + - Fixed sending rich content from android keyboards on the markdown text input ([#2917](https://github.com/element-hq/element-x-android/issues/2917)) + - Fix crash when restoring the selection values in the plain text editor. ([#2959](https://github.com/element-hq/element-x-android/issues/2959)) + +Other changes +------------- + - BugReporting | Add public device keys to rageshakes ([#2893](https://github.com/element-hq/element-x-android/issues/2893)) + - Move push provider setting to the "Notifications" screen and display it only when several push provider are available. ([#2912](https://github.com/element-hq/element-x-android/issues/2912)) + - Simplify notifications by removing the custom persistence layer. + - Bump minSdk to 24 (Android 7). ([#2924](https://github.com/element-hq/element-x-android/issues/2924)) + - Add a feature flag ShowBlockedUsersDetails, disabled by default to render display name and avatar of blocked users in the blocked users list. ([#2930](https://github.com/element-hq/element-x-android/issues/2930)) + - Be more specific with the widget permissions ([#2932](https://github.com/element-hq/element-x-android/issues/2932)) + - Analytics | Add support for SuperProperties ([#2953](https://github.com/element-hq/element-x-android/issues/2953)) + - Track when the user starts a room call and when they enable formatting options on the message composer ([#2969](https://github.com/element-hq/element-x-android/issues/2969)) + + +Changes in Element X v0.4.13 (2024-05-22) +========================================= + +Features ✨ +---------- + - Add plain text editor based on Markdown input. ([#2840](https://github.com/element-hq/element-x-android/issues/2840)) + +Bugfixes 🐛 +---------- + - Use members display names for their membership state events. ([#2286](https://github.com/element-hq/element-x-android/issues/2286)) + - Make sure explicit links in messages take priority over links found by linkification (urls, emails, phone numbers, etc.) ([#2291](https://github.com/element-hq/element-x-android/issues/2291)) + - Fix modal contents overlapping screen lock pin. ([#2692](https://github.com/element-hq/element-x-android/issues/2692)) + - Fix a crash when trying to create an `EncryptedFile` in Android 6. ([#2846](https://github.com/element-hq/element-x-android/issues/2846)) + - Session falsely displayed as 'verified' with no internet connection. ([#2884](https://github.com/element-hq/element-x-android/issues/2884)) + +Other changes +------------- + - Allow configuring push notification provider ([#2340](https://github.com/element-hq/element-x-android/issues/2340)) + - UX cleanup: reorder text composer actions to prioritise camera ones. ([#2803](https://github.com/element-hq/element-x-android/issues/2803)) + - Translation added into Portuguese and Simplified Chinese ([#2834](https://github.com/element-hq/element-x-android/issues/2834)) + - Use via parameters when joining a room from permalink. ([#2843](https://github.com/element-hq/element-x-android/issues/2843)) + + +Changes in Element X v0.4.12 (2024-05-13) +========================================= + +Features ✨ +---------- +- Add support for expected decryption errors due to membership (UX and analytics). ([#2754](https://github.com/element-hq/element-x-android/issues/2754)) +- Handle permalink navigation to Events. ([#2759](https://github.com/element-hq/element-x-android/issues/2759)) +- Pretty-print event JSON in debug viewer ([#2771](https://github.com/element-hq/element-x-android/issues/2771)) +- Add support for external permalinks. ([#2776](https://github.com/element-hq/element-x-android/issues/2776)) +- Enable support for Android per-app language preferences ([#2795](https://github.com/element-hq/element-x-android/issues/2795)) + +Bugfixes 🐛 +---------- +- Fix session verification being asked again for already verified users. ([#2718](https://github.com/element-hq/element-x-android/issues/2718)) +- Instead of displaying 'create new recovery key' on the session verification screen when there is no other session active, display it always under the 'enter recovery key' screen. ([#2740](https://github.com/element-hq/element-x-android/issues/2740)) +- Adjust the typography used in the selected user component so a user's display name fits better. ([#2760](https://github.com/element-hq/element-x-android/issues/2760)) +- User display name overflows in timeline messages when it's way too long. ([#2761](https://github.com/element-hq/element-x-android/issues/2761)) +- Ensure the application open the room when a notification is clicked. ([#2778](https://github.com/element-hq/element-x-android/issues/2778)) +- Enforce mandatory session verification only for new logins. ([#2810](https://github.com/element-hq/element-x-android/issues/2810)) +- Make log less verbose, make sure we upload as many log files as possible before reaching the request size limit of the bug reporting service, discard older logs if they don't fit. ([#2825](https://github.com/element-hq/element-x-android/issues/2825)) +- Remove 'Join' button in room directory search results. ([#2827](https://github.com/element-hq/element-x-android/issues/2827)) +- Add missing `app_id` and `Version` properties to bug reports. ([#2829](https://github.com/element-hq/element-x-android/issues/2829)) + +Other changes +------------- +- RoomMember screen: fallback to userProfile data, if the member is not a user of the room. ([#2721](https://github.com/element-hq/element-x-android/issues/2721)) +- Migrate application data. ([#2749](https://github.com/element-hq/element-x-android/issues/2749)) +- Let the SDK manage the file log cleanup, and keep one week of log. ([#2758](https://github.com/element-hq/element-x-android/issues/2758)) +- UX cleanup: reorder options in the main settings screen. ([#2801](https://github.com/element-hq/element-x-android/issues/2801)) +- Analytics: Add support to report current session verification and recovery state ([#2806](https://github.com/element-hq/element-x-android/issues/2806)) +- UX cleanup: room details screen, add new CTA buttons for Invite and Call actions. ([#2814](https://github.com/element-hq/element-x-android/issues/2814)) +- UX cleanup: user profile. Move send DM to a call to action button, add 'Call' CTA too. ([#2818](https://github.com/element-hq/element-x-android/issues/2818)) +- Add room badges to room details screen. ([#2822](https://github.com/element-hq/element-x-android/issues/2822)) + +Security +------------- +- Bump the Rust SDK to `v0.2.18` to remediate [CVE-2024-34353 / GHSA-9ggc-845v-gcgv](https://github.com/matrix-org/matrix-rust-sdk/security/advisories/GHSA-9ggc-845v-gcgv). + +Changes in Element X v0.4.10 (2024-04-17) +========================================= + +Matrix Rust SDK 0.2.14 + +Features ✨ +---------- +- Rework room navigation to handle unknown room and prepare work on permalink. ([#2695](https://github.com/element-hq/element-x-android/issues/2695)) + +Other changes +------------- +- Encrypt new session data with a passphrase ([#2703](https://github.com/element-hq/element-x-android/issues/2703)) +- Use sdk API to build permalinks ([#2708](https://github.com/element-hq/element-x-android/issues/2708)) +- Parse permalink using parseMatrixEntityFrom from the SDK ([#2709](https://github.com/element-hq/element-x-android/issues/2709)) +- Fix compile for forks that use the `noop` analytics module ([#2698](https://github.com/element-hq/element-x-android/issues/2698)) + + +Changes in Element X v0.4.9 (2024-04-12) +======================================== + +- Synchronize Localazy Strings. + +Security +---------- +- Fix crash while processing a room message containing a malformed pill. + +Changes in Element X v0.4.8 (2024-04-10) +======================================== + +Features ✨ +---------- +- Move session recovery to the login flow. ([#2579](https://github.com/element-hq/element-x-android/issues/2579)) +- Move session verification to the after login flow and make it mandatory. ([#2580](https://github.com/element-hq/element-x-android/issues/2580)) +- Add a notification troubleshoot screen ([#2601](https://github.com/element-hq/element-x-android/issues/2601)) +- Add action to copy permalink ([#2650](https://github.com/element-hq/element-x-android/issues/2650)) + +Bugfixes 🐛 +---------- +- Fix analytics issue around room considered as space by mistake. ([#2612](https://github.com/element-hq/element-x-android/issues/2612)) +- Fix crash observed when going back to the room list. ([#2619](https://github.com/element-hq/element-x-android/issues/2619)) +- Hide Event org.matrix.msc3401.call.member on the timeline. ([#2625](https://github.com/element-hq/element-x-android/issues/2625)) +- Fall back to name-based generated avatars when image avatars don't load. ([#2667](https://github.com/element-hq/element-x-android/issues/2667)) + +Other changes +------------- +- Improve UI for notification permission screen in onboarding. ([#2581](https://github.com/element-hq/element-x-android/issues/2581)) +- Categorise members by role in change roles screen. ([#2593](https://github.com/element-hq/element-x-android/issues/2593)) +- Make completed poll more clearly visible ([#2608](https://github.com/element-hq/element-x-android/issues/2608)) +- Show users from last visited DM as suggestion when starting a Chat or when creating a Room. ([#2634](https://github.com/element-hq/element-x-android/issues/2634)) +- Enable room moderation feature. ([#2678](https://github.com/element-hq/element-x-android/issues/2678)) +- Improve analytics opt-in screen UI. ([#2684](https://github.com/element-hq/element-x-android/issues/2684)) + + +Changes in Element X v0.4.7 (2024-03-26) +======================================== + +Features ✨ +---------- +- Enable the feature "RoomList filters". ([#2603](https://github.com/element-hq/element-x-android/issues/2603)) +- Enable the feature "Mark as unread" ([#2261](https://github.com/element-hq/element-x-android/issues/2261)) +- Implement MSC2530 (Body field as media caption) ([#2521](https://github.com/element-hq/element-x-android/issues/2521)) + +Bugfixes 🐛 +---------- +- Use user avatar from cache if available. ([#2488](https://github.com/element-hq/element-x-android/issues/2488)) +- Update member list after changing member roles and when the room member list is opened. ([#2590](https://github.com/element-hq/element-x-android/issues/2590)) + +Other changes +------------- +- Compound: add `BigIcon`, `BigCheckmark` and `PageTitle` components. ([#2574](https://github.com/element-hq/element-x-android/issues/2574)) +- Remove Welcome screen from the FTUE. ([#2584](https://github.com/element-hq/element-x-android/issues/2584)) + + +Changes in Element X v0.4.6 (2024-03-15) +======================================== + +Features ✨ +---------- +- Admins can now change user roles in rooms. ([#2257](https://github.com/element-hq/element-x-android/issues/2257)) +- Room member moderation: remove, ban and unban users from a room. ([#2258](https://github.com/element-hq/element-x-android/issues/2258)) +- Change a room's permissions power levels. ([#2259](https://github.com/element-hq/element-x-android/issues/2259)) +- Add state timeline events and notifications for legacy call invites. ([#2485](https://github.com/element-hq/element-x-android/issues/2485)) + +Bugfixes 🐛 +---------- +- Added empty state to banned member list. ([#+add-empty-state-to-banned-members-list](https://github.com/element-hq/element-x-android/issues/+add-empty-state-to-banned-members-list)) +- Prevent sending empty messages. ([#995](https://github.com/element-hq/element-x-android/issues/995)) +- Use the display name only once in display name change events. The user should be referenced by `userId` instead. ([#2125](https://github.com/element-hq/element-x-android/issues/2125)) +- Hide blocked users list when there are no blocked users. ([#2198](https://github.com/element-hq/element-x-android/issues/2198)) +- Fix timeline not showing sender info when room is marked as direct but not a 1:1 room. ([#2530](https://github.com/element-hq/element-x-android/issues/2530)) + +Other changes +------------- +- Add `local_time`, `utc_time` and `sdk_sha` params to bug reports so they're easier to investigate. ([#+add-time-and-sdk-sha-params-to-bugreports](https://github.com/element-hq/element-x-android/issues/+add-time-and-sdk-sha-params-to-bugreports)) +- Improve room member list loading times, increase chunk size ([#2322](https://github.com/element-hq/element-x-android/issues/2322)) +- Improve room member list loading UX. ([#2452](https://github.com/element-hq/element-x-android/issues/2452)) +- Remove the special log level for the Rust SDK read receipts. ([#2511](https://github.com/element-hq/element-x-android/issues/2511)) +- Track UTD errors. ([#2544](https://github.com/element-hq/element-x-android/issues/2544)) + + +Changes in Element X v0.4.5 (2024-02-28) +======================================== + +Features ✨ +---------- +- Mark a room or dm as favourite. ([#2208](https://github.com/element-hq/element-x-android/issues/2208)) +- Add moderation to rooms: + - Sort member in room member list by powerlevel, display their roles. + - Display banner users in room member list for users with enough power level to ban/unban. ([#2256](https://github.com/element-hq/element-x-android/issues/2256)) +- MediaViewer : introduce fullscreen and flick to dismiss behavior. ([#2390](https://github.com/element-hq/element-x-android/issues/2390)) +- Allow user-installed certificates to be used by the HTTP client ([#2992](https://github.com/element-hq/element-x-android/issues/2992)) + +Bugfixes 🐛 +---------- +- Do not display empty room list state before the loading one when we still don't have any items ([#+do-not-display-empty-state-before-loading-roomlist](https://github.com/element-hq/element-x-android/issues/+do-not-display-empty-state-before-loading-roomlist)) +- Improve how Talkback works with the timeline. Sadly, it's still not 100% working, but there is some issue with the `LazyColumn` using `reverseLayout` that only Google can fix. ([#+improve-accessibility-in-timeline](https://github.com/element-hq/element-x-android/issues/+improve-accessibility-in-timeline)) +- Add ability to enter a recovery key to verify the session. Also fixes some refresh issues with the verification session state. ([#2421](https://github.com/element-hq/element-x-android/issues/2421)) + +Other changes +------------- +- Provide the current system proxy setting to the Rust SDK. ([#2420](https://github.com/element-hq/element-x-android/issues/2420)) + + +Changes in Element X v0.4.4 (2024-02-15) +======================================== + +Bugfixes 🐛 +---------- + +- Fix decryption of previous messages after session verification not working. + +Changes in Element X v0.4.3 (2024-02-14) +======================================== + +Features ✨ +---------- +- Change "Read receipts" advanced setting used to send private Read Receipt to "Share presence" settings. When disabled, private Read Receipts will be sent, and no typing notification will be sent. Also Read Receipts and typing notifications will not be rendered in the timeline. ([#2241](https://github.com/element-hq/element-x-android/issues/2241)) +- Render typing notifications. ([#2242](https://github.com/element-hq/element-x-android/issues/2242)) +- Manually mark a room as unread. ([#2261](https://github.com/element-hq/element-x-android/issues/2261)) +- Add empty state to the room list. ([#2330](https://github.com/element-hq/element-x-android/issues/2330)) +- Allow joining unencrypted video calls in non encrypted rooms. ([#2333](https://github.com/element-hq/element-x-android/issues/2333)) + +Bugfixes 🐛 +---------- +- Fix crash after unregistering UnifiedPush distributor ([#2304](https://github.com/element-hq/element-x-android/issues/2304)) +- Add missing device id to settings screen. ([#2316](https://github.com/element-hq/element-x-android/issues/2316)) +- Open the keyboard (and keep it opened) when creating a poll. ([#2329](https://github.com/element-hq/element-x-android/issues/2329)) +- Fix message forwarding after SDK API change related to Timeline intitialization. + +Other changes +------------- +- Adjusted the login flow buttons so the continue button is always at the same height ([#825](https://github.com/element-hq/element-x-android/issues/825)) +- Move migration screen to within the room list ([#2310](https://github.com/element-hq/element-x-android/issues/2310)) +- Render correctly in reply to data when Event cannot be decrypted or has been redacted ([#2318](https://github.com/element-hq/element-x-android/issues/2318)) +- Remove Compose Foundation version pinning workaround. This was done to avoid a bug introduced in the default foundation version used by the material3 library, but that has already been fixed. +- Remove `FilterHiddenStateEventsProcessor`, as this is already handled by the Rust SDK. +- Remove session preferences on user log out. + +Breaking changes 🚨 +------------------- +- Update Compound icons in the project. Since the icon prefix changed to `ic_compound_` and the `CompoundIcons` helper now contains the vector icons as composable functions. + +Changes in Element X v0.4.2 (2024-01-31) +======================================== + +Matrix SDK 🦀 v0.1.95 + +Features ✨ +---------- +- Add 'send private read receipts' option in advanced settings ([#2204](https://github.com/element-hq/element-x-android/issues/2204)) +- Send typing notification ([#2240](https://github.com/element-hq/element-x-android/issues/2240)). Disabling the sending of typing notification and rendering typing notification will come soon. + +Bugfixes 🐛 +---------- +- Make the room settings screen update automatically when new room info (name, avatar, topic) is available. ([#921](https://github.com/element-hq/element-x-android/issues/921)) +- Update timeline items' read receipts when the room members info is loaded. ([#2176](https://github.com/element-hq/element-x-android/issues/2176)) +- Edited text message bubbles should resize when edited ([#2260](https://github.com/element-hq/element-x-android/issues/2260)) +- Ensure login and password exclude `\n` ([#2263](https://github.com/element-hq/element-x-android/issues/2263)) +- Room list Ensure the indicators stay grey if the global setting is set to mention only and a regular message is received. ([#2282](https://github.com/element-hq/element-x-android/issues/2282)) + +Other changes +------------- +- Add a special logging configuration for nightlies so we can get more detailed info for existing issues. ([#+add-special-tracing-configuration-for-nightlies](https://github.com/element-hq/element-x-android/issues/+add-special-tracing-configuration-for-nightlies)) +- Try mitigating unexpected logouts by making getting/storing session data use a Mutex for synchronization. + Also added some more logs so we can understand exactly where it's failing. ([#+try-mitigating-unexpected-logouts](https://github.com/element-hq/element-x-android/issues/+try-mitigating-unexpected-logouts)) +- Upgrade Material3 Compose to `1.2.0-beta02`. + There is also a constraint on a transitive Compose Foundation dependency version (1.6.0-beta02) that fixes the timeline scrolling issue. ([#0-beta02](https://github.com/element-hq/element-x-android/issues/0-beta02)) +- Disambiguate display name in the timeline. ([#2215](https://github.com/element-hq/element-x-android/issues/2215)) +- Disambiguate display name in notifications ([#2224](https://github.com/element-hq/element-x-android/issues/2224)) +- Remove room creation, self-join of room creator and 'this is the beginning of X' timeline items for DMs. ([#2217](https://github.com/element-hq/element-x-android/issues/2217)) +- Encrypt databases used by the Rust SDK on Nightly and Debug builds. ([#2219](https://github.com/element-hq/element-x-android/issues/2219)) +- Fallback to UnifiedPush (if available) if the PlayServices are not installed on the device. ([#2248](https://github.com/element-hq/element-x-android/issues/2248)) +- Add "Report a problem" button to the onboarding screen ([#2275](https://github.com/element-hq/element-x-android/issues/2275)) +- Add in app logs viewer to the "Report a problem" screen. ([#2276](https://github.com/element-hq/element-x-android/issues/2276)) + + +Changes in Element X v0.4.1 (2024-01-17) +======================================== + +Features ✨ +---------- +- Render m.sticker events ([#1949](https://github.com/element-hq/element-x-android/issues/1949)) +- Add support for sending images from the keyboard ([#1977](https://github.com/element-hq/element-x-android/issues/1977)) +- Added support for MSC4027 (render custom images in reactions) ([#2159](https://github.com/element-hq/element-x-android/issues/2159)) + +Bugfixes 🐛 +---------- +- Fix crash sending image with latest Posthog because of an usage of an internal Android method. ([#+crash-sending-image-with-latest-posthog](https://github.com/element-hq/element-x-android/issues/+crash-sending-image-with-latest-posthog)) +- Make sure the media viewer tries the main url first (if not empty) then the thumbnail url and then not open if both are missing instead of failing with an error dialog ([#1949](https://github.com/element-hq/element-x-android/issues/1949)) +- Fix room transition animation happens twice. ([#2084](https://github.com/element-hq/element-x-android/issues/2084)) +- Disable ability to send reaction if the user does not have the permission to. ([#2093](https://github.com/element-hq/element-x-android/issues/2093)) +- Trim whitespace at the end of messages to ensure we render the right content. ([#2099](https://github.com/element-hq/element-x-android/issues/2099)) +- Fix crashes in room list when the last message for a room was an extremely long one (several thousands of characters) with no line breaks. ([#2105](https://github.com/element-hq/element-x-android/issues/2105)) +- Disable rasterisation of Vector XMLs, which was causing crashes on API 23. ([#2124](https://github.com/element-hq/element-x-android/issues/2124)) +- Use `SubomposeLayout` for `ContentAvoidingLayout` to prevent wrong measurements in the layout process, leading to cut-off text messages in the timeline. ([#2155](https://github.com/element-hq/element-x-android/issues/2155)) +- Improve rendering of voice messages in the timeline in large displays ([#2156](https://github.com/element-hq/element-x-android/issues/2156)) +- Fix no indication that user list is loading when inviting to room. ([#2172](https://github.com/element-hq/element-x-android/issues/2172)) +- Hide keyboard when tapping on a message in the timeline. ([#2182](https://github.com/element-hq/element-x-android/issues/2182)) +- Mention selector gets stuck when quickly deleting the prompt. ([#2192](https://github.com/element-hq/element-x-android/issues/2192)) +- Hide verbose state events from the timeline ([#2216](https://github.com/element-hq/element-x-android/issues/2216)) + +Other changes +------------- +- Only apply `com.autonomousapps.dependency-analysis` plugin in those modules that need it. ([#+only-apply-dependency-analysis-plugin-where-needed](https://github.com/element-hq/element-x-android/issues/+only-apply-dependency-analysis-plugin-where-needed)) +- Migrate to Kover 0.7.X ([#1782](https://github.com/element-hq/element-x-android/issues/1782)) +- Remove extra logout screen. ([#2072](https://github.com/element-hq/element-x-android/issues/2072)) +- Handle `MembershipChange.NONE` rendering in the timeline. ([#2102](https://github.com/element-hq/element-x-android/issues/2102)) +- Remove extra previews for timestamp view with 'document' case ([#2127](https://github.com/element-hq/element-x-android/issues/2127)) +- Bump AGP version to 8.2.0 ([#2142](https://github.com/element-hq/element-x-android/issues/2142)) +- Replace 'leave room' text with 'leave conversation' for DMs. ([#2218](https://github.com/element-hq/element-x-android/issues/2218)) + + +Changes in Element X v0.4.0 (2023-12-22) +======================================== + +Features ✨ +---------- +- Use the RTE library `TextView` to render text events in the timeline. Add support for mention pills - with no interaction yet. ([#1433](https://github.com/element-hq/element-x-android/issues/1433)) +- Tapping on a user mention pill opens their profile. ([#1448](https://github.com/element-hq/element-x-android/issues/1448)) +- Display different notifications for mentions. ([#1451](https://github.com/element-hq/element-x-android/issues/1451)) +- Reply to a poll ([#1848](https://github.com/element-hq/element-x-android/issues/1848)) +- Add plain text representation of messages ([#1850](https://github.com/element-hq/element-x-android/issues/1850)) +- Allow polls to be edited when they have not been voted on ([#1869](https://github.com/element-hq/element-x-android/issues/1869)) +- Scroll to end of timeline when sending a new message. ([#1877](https://github.com/element-hq/element-x-android/issues/1877)) +- Confirm back navigation when editing a poll only if the poll was changed ([#1886](https://github.com/element-hq/element-x-android/issues/1886)) +- Add option to delete a poll while editing the poll ([#1895](https://github.com/element-hq/element-x-android/issues/1895)) +- Open room member avatar when you click on it inside the member details screen. ([#1907](https://github.com/element-hq/element-x-android/issues/1907)) +- Poll history of a room is now accessible from the room details screen. ([#2014](https://github.com/element-hq/element-x-android/issues/2014)) +- Always close the invite list screen when there is no more invite. ([#2022](https://github.com/element-hq/element-x-android/issues/2022)) + +Bugfixes 🐛 +---------- +- Fix see room in the room list after leaving it. ([#1006](https://github.com/element-hq/element-x-android/issues/1006)) +- Adjust mention pills font weight and horizontal padding ([#1449](https://github.com/element-hq/element-x-android/issues/1449)) +- Font size in 'All Chats' header was changing mid-animation. ([#1572](https://github.com/element-hq/element-x-android/issues/1572)) +- Accessibility: do not read initial used for avatar out loud. ([#1864](https://github.com/element-hq/element-x-android/issues/1864)) +- Use the right avatar for DMs in DM rooms ([#1912](https://github.com/element-hq/element-x-android/issues/1912)) +- Fix scaling of timeline images: don't crop, don't set min/max aspect ratio values. ([#1940](https://github.com/element-hq/element-x-android/issues/1940)) +- Fix rendering of user name with vertical text by clipping the text. ([#1950](https://github.com/element-hq/element-x-android/issues/1950)) +- Do not render `roomId` if the room has no canonical alias. ([#1970](https://github.com/element-hq/element-x-android/issues/1970)) +- Fix avatar not displayed in notification when the app is not in background ([#1991](https://github.com/element-hq/element-x-android/issues/1991)) +- Fix wording in room invite members view: `Send` -> `Invite`. ([#2037](https://github.com/element-hq/element-x-android/issues/2037)) +- Timestamp positioning was broken, specially for edited messages. ([#2060](https://github.com/element-hq/element-x-android/issues/2060)) +- Emojis in custom reaction bottom sheet are too tiny. ([#2066](https://github.com/element-hq/element-x-android/issues/2066)) +- Set a default power level to join calls. Also, create new rooms taking this power level into account. + +Other changes +------------- +- Add a warning for 'mentions and keywords only' notification option if your homeserver does not support it ([#1749](https://github.com/element-hq/element-x-android/issues/1749)) +- Remove `:libraries:theme` module, extract theme and tokens to [Compound Android](https://github.com/element-hq/compound-android). ([#1833](https://github.com/element-hq/element-x-android/issues/1833)) +- Update poll icons from Compound ([#1849](https://github.com/element-hq/element-x-android/issues/1849)) +- Add ability to see the room avatar in the media viewer. ([#1918](https://github.com/element-hq/element-x-android/issues/1918)) +- RoomList: introduce incremental loading to improve performances. ([#1920](https://github.com/element-hq/element-x-android/issues/1920)) +- Add toggle in the notification settings to disable notifications for room invites. ([#1944](https://github.com/element-hq/element-x-android/issues/1944)) +- Update rendering of Emojis displayed during verification. ([#1965](https://github.com/element-hq/element-x-android/issues/1965)) +- Hide sender info in direct rooms ([#1979](https://github.com/element-hq/element-x-android/issues/1979)) +- Render images in Notification ([#1991](https://github.com/element-hq/element-x-android/issues/1991)) +- Only process content.json from Localazy. ([#2031](https://github.com/element-hq/element-x-android/issues/2031)) +- Always show user avatar in message action sheet ([#2032](https://github.com/element-hq/element-x-android/issues/2032)) +- Hide room list dropdown menu. ([#2062](https://github.com/element-hq/element-x-android/issues/2062)) +- Enable Chat backup, Mentions and Read Receipt in release. ([#2087](https://github.com/element-hq/element-x-android/issues/2087)) +- Make most code used in Compose from `:libraries:matrix` and derived classes Immutable or Stable. + +Changes in Element X v0.3.2 (2023-11-22) +======================================== + +Features ✨ +---------- +- Add ongoing call indicator to rooms lists items. ([#1158](https://github.com/element-hq/element-x-android/issues/1158)) +- Add support for typing mentions in the message composer. ([#1453](https://github.com/element-hq/element-x-android/issues/1453)) +- Add intentional mentions to messages. This needs to be enabled in developer options since it's disabled by default. ([#1591](https://github.com/element-hq/element-x-android/issues/1591)) +- Update voice message recording behaviour. Instead of holding the record button, users can now tap the record button to start recording and tap again to stop recording. ([#1784](https://github.com/element-hq/element-x-android/issues/1784)) + +Bugfixes 🐛 +---------- +- Always ensure media temp dir exists ([#1790](https://github.com/element-hq/element-x-android/issues/1790)) + +Other changes +------------- +- Update icons and move away from `PreferenceText` components. ([#1718](https://github.com/element-hq/element-x-android/issues/1718)) +- Add item "This is the beginning of..." at the beginning of the timeline. ([#1801](https://github.com/element-hq/element-x-android/issues/1801)) +- LockScreen : rework LoggedInFlowNode and back management when locked. ([#1806](https://github.com/element-hq/element-x-android/issues/1806)) +- Suppress usage of removeTimeline method. ([#1824](https://github.com/element-hq/element-x-android/issues/1824)) +- Remove Element Call feature flag, it's now always enabled. +- Reverted the EC base URL to `https://call.element.io`. +- Moved the option to override this URL to developer settings from advanced settings. + + +Changes in Element X v0.3.1 (2023-11-09) +======================================== + +Features ✨ +---------- +- Chat backup is still under a feature flag, but when enabled, user can enter their recovery key (it's also possible to input a passphrase) to unlock the encrypted room history. ([#1770](https://github.com/element-hq/element-x-android/pull/1770)) + +Bugfixes 🐛 +---------- +- Improve confusing text in the 'ready to start verification' screen. ([#879](https://github.com/element-hq/element-x-android/issues/879)) +- Message composer wasn't resized when selecting a several lines message to reply to, then a single line one. ([#1560](https://github.com/element-hq/element-x-android/issues/1560)) + +Other changes +------------- +- PIN: Set lock grace period to 0. ([#1732](https://github.com/element-hq/element-x-android/issues/1732)) + + +Changes in Element X v0.3.0 (2023-10-31) +======================================== + +Features ✨ +---------- +- Element Call: change the 'join call' button in a chat room when there's an active call. ([#1158](https://github.com/element-hq/element-x-android/issues/1158)) +- Mentions: add mentions suggestion view in RTE ([#1452](https://github.com/element-hq/element-x-android/issues/1452)) +- Record and send voice messages ([#1596](https://github.com/element-hq/element-x-android/issues/1596)) +- Enable voice messages for all users ([#1669](https://github.com/element-hq/element-x-android/issues/1669)) +- Receive and play a voice message ([#2084](https://github.com/element-hq/element-x-android/issues/2084)) +- Enable Element Call integration in rooms by default, fix several issues when creating or joining calls. + +Bugfixes 🐛 +---------- +- Group fallback notification to avoid having plenty of them displayed. ([#994](https://github.com/element-hq/element-x-android/issues/994)) +- Hide keyboard when exiting the chat room screen. ([#1375](https://github.com/element-hq/element-x-android/issues/1375)) +- Always register the pusher when application starts ([#1481](https://github.com/element-hq/element-x-android/issues/1481)) +- Ensure screen does not turn off when playing a video ([#1519](https://github.com/element-hq/element-x-android/issues/1519)) +- Fix issue where text is cleared when cancelling a reply ([#1617](https://github.com/element-hq/element-x-android/issues/1617)) + +Other changes +------------- +- Remove usage of blocking methods. ([#1563](https://github.com/element-hq/element-x-android/issues/1563)) + + +Changes in Element X v0.2.4 (2023-10-12) +======================================== + +Features ✨ +---------- +- [Rich text editor] Add full screen mode ([#1447](https://github.com/element-hq/element-x-android/issues/1447)) +- Improve rendering of m.emote. ([#1497](https://github.com/element-hq/element-x-android/issues/1497)) +- Improve deleted session behavior. ([#1520](https://github.com/element-hq/element-x-android/issues/1520)) + +Bugfixes 🐛 +---------- +- WebP images can't be sent as media. ([#1483](https://github.com/element-hq/element-x-android/issues/1483)) +- Fix back button not working in bottom sheets. ([#1517](https://github.com/element-hq/element-x-android/issues/1517)) +- Render body of unknown msgtype in the timeline and in the room list ([#1539](https://github.com/element-hq/element-x-android/issues/1539)) + +Other changes +------------- +- Room : makes subscribeToSync/unsubscribeFromSync suspendable. ([#1457](https://github.com/element-hq/element-x-android/issues/1457)) +- Add some Konsist tests. ([#1526](https://github.com/element-hq/element-x-android/issues/1526)) + + +Changes in Element X v0.2.3 (2023-09-27) +======================================== + +Features ✨ +---------- +- Handle installation of Apks from the media viewer. ([#1432](https://github.com/element-hq/element-x-android/pull/1432)) +- Integrate SDK 0.1.58 ([#1437](https://github.com/element-hq/element-x-android/pull/1437)) + +Other changes +------------- +- Element call: add custom parameters to Element Call urls. ([#1434](https://github.com/element-hq/element-x-android/issues/1434)) + + +Changes in Element X v0.2.2 (2023-09-21) +======================================== + +Bugfixes 🐛 +---------- +- Add animation when rendering the timeline to avoid glitches. ([#1323](https://github.com/element-hq/element-x-android/issues/1323)) +- Fix crash when trying to take a photo or record a video. ([#1395](https://github.com/element-hq/element-x-android/issues/1395)) + + +Changes in Element X v0.2.1 (2023-09-20) +======================================== + +Features ✨ +---------- +- Bump Rust SDK to `v0.1.56` +- [Rich text editor] Add link support to rich text editor ([#1309](https://github.com/element-hq/element-x-android/issues/1309)) +- Let the SDK figure the best scheme given an homeserver URL (thus allowing HTTP homeservers) ([#1382](https://github.com/element-hq/element-x-android/issues/1382)) + +Bugfixes 🐛 +---------- +- Fix ANR on RoomList when notification settings change. ([#1370](https://github.com/element-hq/element-x-android/issues/1370)) + +Other changes +------------- +- Element Call: support scheme `io.element.call` ([#1377](https://github.com/element-hq/element-x-android/issues/1377)) +- [DI] Rework how dagger components are created and provided. ([#1378](https://github.com/element-hq/element-x-android/issues/1378)) +- Remove usage of async-uniffi as it leads to a deadlocks and memory leaks. ([#1381](https://github.com/element-hq/element-x-android/issues/1381)) + + +Changes in Element X v0.2.0 (2023-09-18) +======================================== + +Features ✨ +---------- +- Bump Rust SDK to `v0.1.54` +- Add a "Mute" shortcut icon and a "Notifications" section in the room details screen ([#506](https://github.com/element-hq/element-x-android/issues/506)) +- Add a notification permission screen to the initial flow. ([#897](https://github.com/element-hq/element-x-android/issues/897)) +- Integrate Element Call into EX by embedding a call in a WebView. ([#1300](https://github.com/element-hq/element-x-android/issues/1300)) +- Implement Bloom effect modifier. ([#1217](https://github.com/element-hq/element-x-android/issues/1217)) +- Set color on display name and default avatar in the timeline. ([#1224](https://github.com/element-hq/element-x-android/issues/1224)) +- Display a thread decorator in timeline so we know when a message is coming from a thread. ([#1236](https://github.com/element-hq/element-x-android/issues/1236)) +- [Rich text editor] Integrate rich text editor library. Note that markdown is now not supported and further formatting support will be introduced through the rich text editor. ([#1172](https://github.com/element-hq/element-x-android/issues/1172)) +- [Rich text editor] Add formatting menu (accessible via the '+' button) ([#1261](https://github.com/element-hq/element-x-android/issues/1261)) +- [Rich text editor] Add feature flag for rich text editor. Markdown support can now be enabled by disabling the rich text editor. ([#1289](https://github.com/element-hq/element-x-android/issues/1289)) +- [Rich text editor] Update design ([#1332](https://github.com/element-hq/element-x-android/issues/1332)) + +Bugfixes 🐛 +---------- +- Make links in room topic clickable ([#612](https://github.com/element-hq/element-x-android/issues/612)) +- Reply action: harmonize conditions in bottom sheet and swipe to reply. ([#1173](https://github.com/element-hq/element-x-android/issues/1173)) +- Fix system bar color after login on light theme. ([#1222](https://github.com/element-hq/element-x-android/issues/1222)) +- Fix long click on simple formatted messages ([#1232](https://github.com/element-hq/element-x-android/issues/1232)) +- Enable polls in release build. ([#1241](https://github.com/element-hq/element-x-android/issues/1241)) +- Fix top padding in room list when app is opened in offline mode. ([#1297](https://github.com/element-hq/element-x-android/issues/1297)) +- [Rich text editor] Fix 'text formatting' option only partially visible ([#1335](https://github.com/element-hq/element-x-android/issues/1335)) +- [Rich text editor] Ensure keyboard opens for reply and text formatting modes ([#1337](https://github.com/element-hq/element-x-android/issues/1337)) +- [Rich text editor] Fix placeholder spilling onto multiple lines ([#1347](https://github.com/element-hq/element-x-android/issues/1347)) + +Other changes +------------- +- Add a sub-screen "Notifications" in the existing application Settings ([#510](https://github.com/element-hq/element-x-android/issues/510)) +- Exclude some groups related to analytics to be included. ([#1191](https://github.com/element-hq/element-x-android/issues/1191)) +- Use the new SyncIndicator API. ([#1244](https://github.com/element-hq/element-x-android/issues/1244)) +- Improve RoomSummary mapping by using RoomInfo. ([#1251](https://github.com/element-hq/element-x-android/issues/1251)) +- Ensure Posthog data are sent to "https://posthog.element.io" ([#1269](https://github.com/element-hq/element-x-android/issues/1269)) +- New app icon, with monochrome support. ([#1363](https://github.com/element-hq/element-x-android/issues/1363)) + + +Changes in Element X v0.1.6 (2023-09-04) +======================================== + +Features ✨ +---------- +- Enable the Polls feature. Allows to create, view, vote and end polls. ([#1196](https://github.com/element-hq/element-x-android/issues/1196)) +- Create poll. ([#1143](https://github.com/element-hq/element-x-android/issues/1143)) + +Bugfixes 🐛 +---------- +- Ensure notification for Event from encrypted room get decrypted content. ([#1178](https://github.com/element-hq/element-x-android/issues/1178)) +- Make sure Snackbars are only displayed once. ([#928](https://github.com/element-hq/element-x-android/issues/928)) +- Fix the orientation of sent images. ([#1135](https://github.com/element-hq/element-x-android/issues/1135)) +- Bug reporter crashes when 'send logs' is disabled. ([#1168](https://github.com/element-hq/element-x-android/issues/1168)) +- Add missing link to the terms on the analytics setting screen. ([#1177](https://github.com/element-hq/element-x-android/issues/1177)) +- Re-enable `SyncService.withEncryptionSync` to improve decryption of notifications. ([#1198](https://github.com/element-hq/element-x-android/issues/1198)) +- Crash with `aspectRatio` modifier when `Float.NaN` was used as input. ([#1995](https://github.com/element-hq/element-x-android/issues/1995)) + +Other changes +------------- +- Remove unnecessary year in copyright mention. ([#1187](https://github.com/element-hq/element-x-android/issues/1187)) + + +Changes in Element X v0.1.5 (2023-08-28) +======================================== + +Bugfixes 🐛 +---------- +- Fix crash when opening any room. ([#1160](https://github.com/element-hq/element-x-android/issues/1160)) + + +Changes in Element X v0.1.4 (2023-08-28) +======================================== + +Features ✨ +---------- +- Allow cancelling media upload ([#769](https://github.com/element-hq/element-x-android/issues/769)) +- Enable OIDC support. ([#1127](https://github.com/element-hq/element-x-android/issues/1127)) +- Add a "Setting up account" screen, displayed the first time the user logs in to the app (per account). ([#1149](https://github.com/element-hq/element-x-android/issues/1149)) + +Bugfixes 🐛 +---------- +- Videos sent from the app were cropped in some cases. ([#862](https://github.com/element-hq/element-x-android/issues/862)) +- Timeline: sender names are now displayed in one single line. ([#1033](https://github.com/element-hq/element-x-android/issues/1033)) +- Fix `TextButtons` being displayed in black. ([#1077](https://github.com/element-hq/element-x-android/issues/1077)) +- Linkify links in HTML contents. ([#1079](https://github.com/element-hq/element-x-android/issues/1079)) +- Fix bug reporter failing after not finding some log files. ([#1082](https://github.com/element-hq/element-x-android/issues/1082)) +- Fix rendering of inline elements in list items. ([#1090](https://github.com/element-hq/element-x-android/issues/1090)) +- Fix crash RuntimeException "No matching key found for the ciphertext in the stream" ([#1101](https://github.com/element-hq/element-x-android/issues/1101)) +- Make links in messages clickable again. ([#1111](https://github.com/element-hq/element-x-android/issues/1111)) +- When event has no id, just cancel parsing the latest room message for a room. ([#1125](https://github.com/element-hq/element-x-android/issues/1125)) +- Only display verification prompt after initial sync is done. ([#1131](https://github.com/element-hq/element-x-android/issues/1131)) + +In development 🚧 +---------------- +- [Poll] Add feature flag in developer options ([#1064](https://github.com/element-hq/element-x-android/issues/1064)) +- [Polls] Improve UI and render ended state ([#1113](https://github.com/element-hq/element-x-android/issues/1113)) + +Other changes +------------- +- Compound: add `ListItem` and `ListSectionHeader` components. ([#990](https://github.com/element-hq/element-x-android/issues/990)) +- Migrate `object` to `data object` in sealed interface / class #1135 ([#1135](https://github.com/element-hq/element-x-android/issues/1135)) + + +Changes in Element X v0.1.2 (2023-08-16) +======================================== + +Bugfixes 🐛 +---------- +- Filter push notifications using push rules. ([#640](https://github.com/element-hq/element-x-android/issues/640)) +- Use `for` instead of `forEach` in `DefaultDiffCacheInvalidator` to improve performance. ([#1035](https://github.com/element-hq/element-x-android/issues/1035)) + +In development 🚧 +---------------- +- [Poll] Render start event in the timeline ([#1031](https://github.com/element-hq/element-x-android/issues/1031)) + +Other changes +------------- +- Add Button component based on Compound designs ([#1021](https://github.com/element-hq/element-x-android/issues/1021)) +- Compound: implement dialogs. ([#1043](https://github.com/element-hq/element-x-android/issues/1043)) +- Compound: customise `IconButton` component. ([#1049](https://github.com/element-hq/element-x-android/issues/1049)) +- Compound: implement `DropdownMenu` customisations. ([#1050](https://github.com/element-hq/element-x-android/issues/1050)) +- Compound: implement Snackbar component. ([#1054](https://github.com/element-hq/element-x-android/issues/1054)) + + +Changes in Element X v0.1.0 (2023-07-19) +======================================== + +First release of Element X 🚀! diff --git a/CODEOWNERS b/CODEOWNERS new file mode 100644 index 0000000..40e2416 --- /dev/null +++ b/CODEOWNERS @@ -0,0 +1 @@ +* @element-hq/element-x-android-reviewers diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md new file mode 100644 index 0000000..4e0c9b9 --- /dev/null +++ b/CONTRIBUTING.md @@ -0,0 +1,195 @@ +# Contributing to Element X Android + + + +* [Developer onboarding](#developer-onboarding) +* [Contributing code to Matrix](#contributing-code-to-matrix) +* [Android Studio settings](#android-studio-settings) +* [Compilation](#compilation) +* [Strings](#strings) + * [I want to add new strings to the project](#i-want-to-add-new-strings-to-the-project) + * [I want to help translating Element](#i-want-to-help-translating-element) + * [Element X Android Gallery](#element-x-android-gallery) +* [I want to submit a PR to fix an issue](#i-want-to-submit-a-pr-to-fix-an-issue) + * [Kotlin](#kotlin) + * [Changelog](#changelog) + * [Code quality](#code-quality) + * [detekt](#detekt) + * [ktlint](#ktlint) + * [knit](#knit) + * [lint](#lint) + * [Unit tests](#unit-tests) + * [konsist](#konsist) + * [Tests](#tests) + * [Accessibility](#accessibility) + * [Jetpack Compose](#jetpack-compose) + * [Authors](#authors) +* [Thanks](#thanks) + + + +## Developer onboarding + +For a detailed overview of the project, see [Developer Onboarding](./docs/_developer_onboarding.md). + +## Contributing code to Matrix + +If instead of contributing to the Element X Android project, you want to contribute to Synapse, the homeserver implementation, please read the [Synapse contribution guide](https://element-hq.github.io/synapse/latest/development/contributing_guide.html). + +Element X Android support can be found in this room: [![Element X Android Matrix room #element-x-android:matrix.org](https://img.shields.io/matrix/element-x-android:matrix.org.svg?label=%23element-x-android:matrix.org&logo=matrix&server_fqdn=matrix.org)](https://matrix.to/#/#element-x-android:matrix.org). + +The rest of the document contains specific rules for Matrix Android projects. + +## Android Studio settings + +Please set the "hard wrap" setting of Android Studio to 160 chars, this is the setting we use internally to format the source code (Menu `Settings/Editor/Code Style` then `Hard wrap at`). +Please ensure that you're using the project formatting rules (which are in the project at .idea/codeStyles/), and format the file before committing them. + +## Compilation + +This project should compile without any special action. Just clone it and open it with Android Studio, or compile from command line using `gradlew`. + +## Strings + +The strings of the project are managed externally using [https://localazy.com](https://localazy.com) and shared with Element X iOS. + +### I want to add new strings to the project + +Only the core team can modify or add English strings to Localazy. As an external contributor, if you want to add new strings, feel free to add an Android resource file to the project (for instance a file named `temporary.xml`), with a note in the description of the PR for the reviewer to integrate the String into `Localazy`. If accepted, the reviewer will add the String(s) for you, and then you can download them on your branch (following these [instructions](./tools/localazy/README.md#download-translations)) and remove the temporary file. + +Please follow the naming rules for the key. More details in [the dedicated section in this README.md](./tools/localazy/README.md#key-naming-rules) + +### I want to help translating Element + +To help translating, please go to [https://localazy.com/p/element](https://localazy.com/p/element). + +- If you want to fix an issue with an English string, please open an issue on the github project of Element X (Android or iOS). Only the core team can modify or add English strings. +- If you want to fix an issue in other languages, or add a missing translation, or even add a new language, please go to [https://localazy.com/p/element](https://localazy.com/p/element). + +More information can be found [in this README.md](./tools/localazy/README.md). + +Once a language is sufficiently translated, it will be added to the app. The core team will decide when a language is sufficiently translated. + +### Element X Android Gallery + +Once added to Localazy, translations can be checked screen per screen using our tool Element X Android Gallery, available at https://element-hq.github.io/element-x-android/. + +Localazy syncs occur every Monday and the screenshots on this page are generated every Tuesday, so you'll have to wait to see your change appearing on Element X Android Gallery. + +## I want to submit a PR to fix an issue + +Please have a look in the [dedicated documentation](./docs/pull_request.md) about pull request. + +Please check if a corresponding issue exists. If yes, please let us know in a comment that you're working on it. +If an issue does not exist yet, it may be relevant to open a new issue and let us know that you're implementing it. + +### Kotlin + +This project is full Kotlin. Please do not write Java classes. + +### Changelog + +The release notes are generated from the pull request titles and labels. If possible, the title must describe best what will be the user facing change. + +You will also need to add a label starting by `PR-` to you Pull Request to help categorize the release note. The label should be added by the PR author, but can be added by the reviewer if the submitter does not have right to add label. Also note that the label can be added after the PR has been merged, as soon as the release is not done yet. + +### Code quality + +Make sure the following commands execute without any error: + +
    +./tools/quality/check.sh
    +
    + +Some separate commands can also be run, see below. + +#### detekt + +
    +./gradlew detekt
    +
    + +#### ktlint + +
    +./gradlew ktlintCheck --continue
    +
    + +Note that you can run + +
    +./gradlew ktlintFormat
    +
    + +For ktlint to fix some detected errors for you (you still have to check and commit the fix of course) + +#### knit + +[knit](https://github.com/Kotlin/kotlinx-knit) is a tool which checks markdown files on the project. Also it generates/updates the table of content (toc) of the markdown files. + +So everytime the toc should be updated, just run +
    +./gradlew knit
    +
    + +and commit the changes. + +The CI will check that markdown files are up to date by running + +
    +./gradlew knitCheck
    +
    + +#### lint + +
    +./gradlew lint
    +
    + +### Unit tests + +Make sure the following commands execute without any error: + +
    +./gradlew test
    +
    + +#### konsist + +[konsist](https://github.com/LemonAppDev/konsist) is setup in the project to check that the architecture and the naming rules are followed. Konsist tests are classical Unit tests. + +### Tests + +Element X is currently supported on Android Marshmallow (API 23+): please test your change on an Android device (or Android emulator) running with API 23. Many issues can happen (including crashes) on older devices. +Also, if possible, please test your change on a real device. Testing on Android emulator may not be sufficient. + +You should consider adding Unit tests with your PR, and also integration tests (AndroidTest). Please refer to [this document](./docs/integration_tests.md) to install and run the integration test environment. + +### Accessibility + +Please consider accessibility as an important point. As a minimum requirement, in layout XML files please use attributes such as `android:contentDescription` and `android:importantForAccessibility`, and test with a screen reader if it's working well. You can add new string resources, dedicated to accessibility, in this case, please prefix theirs id with `a11y_`. + +For instance, when updating the image `src` of an ImageView, please also consider updating its `contentDescription`. A good example is a play pause button. + +### Jetpack Compose + +When adding or editing `@Composable`, make sure that you create an internal function annotated with `@PreviewsDayNight`, with a name suffixed by `Preview`, and having `ElementPreview` as the root composable. + +Example: +```kotlin +@PreviewsDayNight +@Composable +internal fun PinIconPreview() = ElementPreview { + PinIcon() +} +``` + +This will allow to preview the composable in both light and dark mode in Android Studio. This will also automatically add UI tests. The GitHub action [Record screenshots](https://github.com/element-hq/element-x-android/actions/workflows/recordScreenshots.yml) has to be run to record the new screenshots. The PR reviewer can trigger this for you if you're not part of the core team. + +### Authors + +Feel free to add an entry in file AUTHORS.md + +## Thanks + +Thanks for contributing to Matrix projects! diff --git a/Gemfile b/Gemfile new file mode 100644 index 0000000..a432dd0 --- /dev/null +++ b/Gemfile @@ -0,0 +1,3 @@ +source "https://rubygems.org" + +gem 'danger' diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..be3f7b2 --- /dev/null +++ b/LICENSE @@ -0,0 +1,661 @@ + GNU AFFERO GENERAL PUBLIC LICENSE + Version 3, 19 November 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The GNU Affero General Public License is a free, copyleft license for +software and other kinds of works, specifically designed to ensure +cooperation with the community in the case of network server software. + + The licenses for most software and other practical works are designed +to take away your freedom to share and change the works. By contrast, +our General Public Licenses are intended to guarantee your freedom to +share and change all versions of a program--to make sure it remains free +software for all its users. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +them if you wish), that you receive source code or can get it if you +want it, that you can change the software or use pieces of it in new +free programs, and that you know you can do these things. + + Developers that use our General Public Licenses protect your rights +with two steps: (1) assert copyright on the software, and (2) offer +you this License which gives you legal permission to copy, distribute +and/or modify the software. + + A secondary benefit of defending all users' freedom is that +improvements made in alternate versions of the program, if they +receive widespread use, become available for other developers to +incorporate. Many developers of free software are heartened and +encouraged by the resulting cooperation. However, in the case of +software used on network servers, this result may fail to come about. +The GNU General Public License permits making a modified version and +letting the public access it on a server without ever releasing its +source code to the public. + + The GNU Affero General Public License is designed specifically to +ensure that, in such cases, the modified source code becomes available +to the community. It requires the operator of a network server to +provide the source code of the modified version running there to the +users of that server. Therefore, public use of a modified version, on +a publicly accessible server, gives the public access to the source +code of the modified version. + + An older license, called the Affero General Public License and +published by Affero, was designed to accomplish similar goals. This is +a different license, not a version of the Affero GPL, but Affero has +released a new version of the Affero GPL which permits relicensing under +this license. + + The precise terms and conditions for copying, distribution and +modification follow. + + TERMS AND CONDITIONS + + 0. Definitions. + + "This License" refers to version 3 of the GNU Affero General Public License. + + "Copyright" also means copyright-like laws that apply to other kinds of +works, such as semiconductor masks. + + "The Program" refers to any copyrightable work licensed under this +License. Each licensee is addressed as "you". "Licensees" and +"recipients" may be individuals or organizations. + + To "modify" a work means to copy from or adapt all or part of the work +in a fashion requiring copyright permission, other than the making of an +exact copy. The resulting work is called a "modified version" of the +earlier work or a work "based on" the earlier work. + + A "covered work" means either the unmodified Program or a work based +on the Program. + + To "propagate" a work means to do anything with it that, without +permission, would make you directly or secondarily liable for +infringement under applicable copyright law, except executing it on a +computer or modifying a private copy. Propagation includes copying, +distribution (with or without modification), making available to the +public, and in some countries other activities as well. + + To "convey" a work means any kind of propagation that enables other +parties to make or receive copies. Mere interaction with a user through +a computer network, with no transfer of a copy, is not conveying. + + An interactive user interface displays "Appropriate Legal Notices" +to the extent that it includes a convenient and prominently visible +feature that (1) displays an appropriate copyright notice, and (2) +tells the user that there is no warranty for the work (except to the +extent that warranties are provided), that licensees may convey the +work under this License, and how to view a copy of this License. If +the interface presents a list of user commands or options, such as a +menu, a prominent item in the list meets this criterion. + + 1. Source Code. + + The "source code" for a work means the preferred form of the work +for making modifications to it. "Object code" means any non-source +form of a work. + + A "Standard Interface" means an interface that either is an official +standard defined by a recognized standards body, or, in the case of +interfaces specified for a particular programming language, one that +is widely used among developers working in that language. + + The "System Libraries" of an executable work include anything, other +than the work as a whole, that (a) is included in the normal form of +packaging a Major Component, but which is not part of that Major +Component, and (b) serves only to enable use of the work with that +Major Component, or to implement a Standard Interface for which an +implementation is available to the public in source code form. A +"Major Component", in this context, means a major essential component +(kernel, window system, and so on) of the specific operating system +(if any) on which the executable work runs, or a compiler used to +produce the work, or an object code interpreter used to run it. + + The "Corresponding Source" for a work in object code form means all +the source code needed to generate, install, and (for an executable +work) run the object code and to modify the work, including scripts to +control those activities. However, it does not include the work's +System Libraries, or general-purpose tools or generally available free +programs which are used unmodified in performing those activities but +which are not part of the work. For example, Corresponding Source +includes interface definition files associated with source files for +the work, and the source code for shared libraries and dynamically +linked subprograms that the work is specifically designed to require, +such as by intimate data communication or control flow between those +subprograms and other parts of the work. + + The Corresponding Source need not include anything that users +can regenerate automatically from other parts of the Corresponding +Source. + + The Corresponding Source for a work in source code form is that +same work. + + 2. Basic Permissions. + + All rights granted under this License are granted for the term of +copyright on the Program, and are irrevocable provided the stated +conditions are met. This License explicitly affirms your unlimited +permission to run the unmodified Program. The output from running a +covered work is covered by this License only if the output, given its +content, constitutes a covered work. This License acknowledges your +rights of fair use or other equivalent, as provided by copyright law. + + You may make, run and propagate covered works that you do not +convey, without conditions so long as your license otherwise remains +in force. You may convey covered works to others for the sole purpose +of having them make modifications exclusively for you, or provide you +with facilities for running those works, provided that you comply with +the terms of this License in conveying all material for which you do +not control copyright. Those thus making or running the covered works +for you must do so exclusively on your behalf, under your direction +and control, on terms that prohibit them from making any copies of +your copyrighted material outside their relationship with you. + + Conveying under any other circumstances is permitted solely under +the conditions stated below. Sublicensing is not allowed; section 10 +makes it unnecessary. + + 3. Protecting Users' Legal Rights From Anti-Circumvention Law. + + No covered work shall be deemed part of an effective technological +measure under any applicable law fulfilling obligations under article +11 of the WIPO copyright treaty adopted on 20 December 1996, or +similar laws prohibiting or restricting circumvention of such +measures. + + When you convey a covered work, you waive any legal power to forbid +circumvention of technological measures to the extent such circumvention +is effected by exercising rights under this License with respect to +the covered work, and you disclaim any intention to limit operation or +modification of the work as a means of enforcing, against the work's +users, your or third parties' legal rights to forbid circumvention of +technological measures. + + 4. Conveying Verbatim Copies. + + You may convey verbatim copies of the Program's source code as you +receive it, in any medium, provided that you conspicuously and +appropriately publish on each copy an appropriate copyright notice; +keep intact all notices stating that this License and any +non-permissive terms added in accord with section 7 apply to the code; +keep intact all notices of the absence of any warranty; and give all +recipients a copy of this License along with the Program. + + You may charge any price or no price for each copy that you convey, +and you may offer support or warranty protection for a fee. + + 5. Conveying Modified Source Versions. + + You may convey a work based on the Program, or the modifications to +produce it from the Program, in the form of source code under the +terms of section 4, provided that you also meet all of these conditions: + + a) The work must carry prominent notices stating that you modified + it, and giving a relevant date. + + b) The work must carry prominent notices stating that it is + released under this License and any conditions added under section + 7. This requirement modifies the requirement in section 4 to + "keep intact all notices". + + c) You must license the entire work, as a whole, under this + License to anyone who comes into possession of a copy. This + License will therefore apply, along with any applicable section 7 + additional terms, to the whole of the work, and all its parts, + regardless of how they are packaged. This License gives no + permission to license the work in any other way, but it does not + invalidate such permission if you have separately received it. + + d) If the work has interactive user interfaces, each must display + Appropriate Legal Notices; however, if the Program has interactive + interfaces that do not display Appropriate Legal Notices, your + work need not make them do so. + + A compilation of a covered work with other separate and independent +works, which are not by their nature extensions of the covered work, +and which are not combined with it such as to form a larger program, +in or on a volume of a storage or distribution medium, is called an +"aggregate" if the compilation and its resulting copyright are not +used to limit the access or legal rights of the compilation's users +beyond what the individual works permit. Inclusion of a covered work +in an aggregate does not cause this License to apply to the other +parts of the aggregate. + + 6. Conveying Non-Source Forms. + + You may convey a covered work in object code form under the terms +of sections 4 and 5, provided that you also convey the +machine-readable Corresponding Source under the terms of this License, +in one of these ways: + + a) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by the + Corresponding Source fixed on a durable physical medium + customarily used for software interchange. + + b) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by a + written offer, valid for at least three years and valid for as + long as you offer spare parts or customer support for that product + model, to give anyone who possesses the object code either (1) a + copy of the Corresponding Source for all the software in the + product that is covered by this License, on a durable physical + medium customarily used for software interchange, for a price no + more than your reasonable cost of physically performing this + conveying of source, or (2) access to copy the + Corresponding Source from a network server at no charge. + + c) Convey individual copies of the object code with a copy of the + written offer to provide the Corresponding Source. This + alternative is allowed only occasionally and noncommercially, and + only if you received the object code with such an offer, in accord + with subsection 6b. + + d) Convey the object code by offering access from a designated + place (gratis or for a charge), and offer equivalent access to the + Corresponding Source in the same way through the same place at no + further charge. You need not require recipients to copy the + Corresponding Source along with the object code. If the place to + copy the object code is a network server, the Corresponding Source + may be on a different server (operated by you or a third party) + that supports equivalent copying facilities, provided you maintain + clear directions next to the object code saying where to find the + Corresponding Source. Regardless of what server hosts the + Corresponding Source, you remain obligated to ensure that it is + available for as long as needed to satisfy these requirements. + + e) Convey the object code using peer-to-peer transmission, provided + you inform other peers where the object code and Corresponding + Source of the work are being offered to the general public at no + charge under subsection 6d. + + A separable portion of the object code, whose source code is excluded +from the Corresponding Source as a System Library, need not be +included in conveying the object code work. + + A "User Product" is either (1) a "consumer product", which means any +tangible personal property which is normally used for personal, family, +or household purposes, or (2) anything designed or sold for incorporation +into a dwelling. In determining whether a product is a consumer product, +doubtful cases shall be resolved in favor of coverage. For a particular +product received by a particular user, "normally used" refers to a +typical or common use of that class of product, regardless of the status +of the particular user or of the way in which the particular user +actually uses, or expects or is expected to use, the product. A product +is a consumer product regardless of whether the product has substantial +commercial, industrial or non-consumer uses, unless such uses represent +the only significant mode of use of the product. + + "Installation Information" for a User Product means any methods, +procedures, authorization keys, or other information required to install +and execute modified versions of a covered work in that User Product from +a modified version of its Corresponding Source. The information must +suffice to ensure that the continued functioning of the modified object +code is in no case prevented or interfered with solely because +modification has been made. + + If you convey an object code work under this section in, or with, or +specifically for use in, a User Product, and the conveying occurs as +part of a transaction in which the right of possession and use of the +User Product is transferred to the recipient in perpetuity or for a +fixed term (regardless of how the transaction is characterized), the +Corresponding Source conveyed under this section must be accompanied +by the Installation Information. But this requirement does not apply +if neither you nor any third party retains the ability to install +modified object code on the User Product (for example, the work has +been installed in ROM). + + The requirement to provide Installation Information does not include a +requirement to continue to provide support service, warranty, or updates +for a work that has been modified or installed by the recipient, or for +the User Product in which it has been modified or installed. Access to a +network may be denied when the modification itself materially and +adversely affects the operation of the network or violates the rules and +protocols for communication across the network. + + Corresponding Source conveyed, and Installation Information provided, +in accord with this section must be in a format that is publicly +documented (and with an implementation available to the public in +source code form), and must require no special password or key for +unpacking, reading or copying. + + 7. Additional Terms. + + "Additional permissions" are terms that supplement the terms of this +License by making exceptions from one or more of its conditions. +Additional permissions that are applicable to the entire Program shall +be treated as though they were included in this License, to the extent +that they are valid under applicable law. If additional permissions +apply only to part of the Program, that part may be used separately +under those permissions, but the entire Program remains governed by +this License without regard to the additional permissions. + + When you convey a copy of a covered work, you may at your option +remove any additional permissions from that copy, or from any part of +it. (Additional permissions may be written to require their own +removal in certain cases when you modify the work.) You may place +additional permissions on material, added by you to a covered work, +for which you have or can give appropriate copyright permission. + + Notwithstanding any other provision of this License, for material you +add to a covered work, you may (if authorized by the copyright holders of +that material) supplement the terms of this License with terms: + + a) Disclaiming warranty or limiting liability differently from the + terms of sections 15 and 16 of this License; or + + b) Requiring preservation of specified reasonable legal notices or + author attributions in that material or in the Appropriate Legal + Notices displayed by works containing it; or + + c) Prohibiting misrepresentation of the origin of that material, or + requiring that modified versions of such material be marked in + reasonable ways as different from the original version; or + + d) Limiting the use for publicity purposes of names of licensors or + authors of the material; or + + e) Declining to grant rights under trademark law for use of some + trade names, trademarks, or service marks; or + + f) Requiring indemnification of licensors and authors of that + material by anyone who conveys the material (or modified versions of + it) with contractual assumptions of liability to the recipient, for + any liability that these contractual assumptions directly impose on + those licensors and authors. + + All other non-permissive additional terms are considered "further +restrictions" within the meaning of section 10. If the Program as you +received it, or any part of it, contains a notice stating that it is +governed by this License along with a term that is a further +restriction, you may remove that term. If a license document contains +a further restriction but permits relicensing or conveying under this +License, you may add to a covered work material governed by the terms +of that license document, provided that the further restriction does +not survive such relicensing or conveying. + + If you add terms to a covered work in accord with this section, you +must place, in the relevant source files, a statement of the +additional terms that apply to those files, or a notice indicating +where to find the applicable terms. + + Additional terms, permissive or non-permissive, may be stated in the +form of a separately written license, or stated as exceptions; +the above requirements apply either way. + + 8. Termination. + + You may not propagate or modify a covered work except as expressly +provided under this License. Any attempt otherwise to propagate or +modify it is void, and will automatically terminate your rights under +this License (including any patent licenses granted under the third +paragraph of section 11). + + However, if you cease all violation of this License, then your +license from a particular copyright holder is reinstated (a) +provisionally, unless and until the copyright holder explicitly and +finally terminates your license, and (b) permanently, if the copyright +holder fails to notify you of the violation by some reasonable means +prior to 60 days after the cessation. + + Moreover, your license from a particular copyright holder is +reinstated permanently if the copyright holder notifies you of the +violation by some reasonable means, this is the first time you have +received notice of violation of this License (for any work) from that +copyright holder, and you cure the violation prior to 30 days after +your receipt of the notice. + + Termination of your rights under this section does not terminate the +licenses of parties who have received copies or rights from you under +this License. If your rights have been terminated and not permanently +reinstated, you do not qualify to receive new licenses for the same +material under section 10. + + 9. Acceptance Not Required for Having Copies. + + You are not required to accept this License in order to receive or +run a copy of the Program. Ancillary propagation of a covered work +occurring solely as a consequence of using peer-to-peer transmission +to receive a copy likewise does not require acceptance. However, +nothing other than this License grants you permission to propagate or +modify any covered work. These actions infringe copyright if you do +not accept this License. Therefore, by modifying or propagating a +covered work, you indicate your acceptance of this License to do so. + + 10. Automatic Licensing of Downstream Recipients. + + Each time you convey a covered work, the recipient automatically +receives a license from the original licensors, to run, modify and +propagate that work, subject to this License. You are not responsible +for enforcing compliance by third parties with this License. + + An "entity transaction" is a transaction transferring control of an +organization, or substantially all assets of one, or subdividing an +organization, or merging organizations. If propagation of a covered +work results from an entity transaction, each party to that +transaction who receives a copy of the work also receives whatever +licenses to the work the party's predecessor in interest had or could +give under the previous paragraph, plus a right to possession of the +Corresponding Source of the work from the predecessor in interest, if +the predecessor has it or can get it with reasonable efforts. + + You may not impose any further restrictions on the exercise of the +rights granted or affirmed under this License. For example, you may +not impose a license fee, royalty, or other charge for exercise of +rights granted under this License, and you may not initiate litigation +(including a cross-claim or counterclaim in a lawsuit) alleging that +any patent claim is infringed by making, using, selling, offering for +sale, or importing the Program or any portion of it. + + 11. Patents. + + A "contributor" is a copyright holder who authorizes use under this +License of the Program or a work on which the Program is based. The +work thus licensed is called the contributor's "contributor version". + + A contributor's "essential patent claims" are all patent claims +owned or controlled by the contributor, whether already acquired or +hereafter acquired, that would be infringed by some manner, permitted +by this License, of making, using, or selling its contributor version, +but do not include claims that would be infringed only as a +consequence of further modification of the contributor version. For +purposes of this definition, "control" includes the right to grant +patent sublicenses in a manner consistent with the requirements of +this License. + + Each contributor grants you a non-exclusive, worldwide, royalty-free +patent license under the contributor's essential patent claims, to +make, use, sell, offer for sale, import and otherwise run, modify and +propagate the contents of its contributor version. + + In the following three paragraphs, a "patent license" is any express +agreement or commitment, however denominated, not to enforce a patent +(such as an express permission to practice a patent or covenant not to +sue for patent infringement). To "grant" such a patent license to a +party means to make such an agreement or commitment not to enforce a +patent against the party. + + If you convey a covered work, knowingly relying on a patent license, +and the Corresponding Source of the work is not available for anyone +to copy, free of charge and under the terms of this License, through a +publicly available network server or other readily accessible means, +then you must either (1) cause the Corresponding Source to be so +available, or (2) arrange to deprive yourself of the benefit of the +patent license for this particular work, or (3) arrange, in a manner +consistent with the requirements of this License, to extend the patent +license to downstream recipients. "Knowingly relying" means you have +actual knowledge that, but for the patent license, your conveying the +covered work in a country, or your recipient's use of the covered work +in a country, would infringe one or more identifiable patents in that +country that you have reason to believe are valid. + + If, pursuant to or in connection with a single transaction or +arrangement, you convey, or propagate by procuring conveyance of, a +covered work, and grant a patent license to some of the parties +receiving the covered work authorizing them to use, propagate, modify +or convey a specific copy of the covered work, then the patent license +you grant is automatically extended to all recipients of the covered +work and works based on it. + + A patent license is "discriminatory" if it does not include within +the scope of its coverage, prohibits the exercise of, or is +conditioned on the non-exercise of one or more of the rights that are +specifically granted under this License. You may not convey a covered +work if you are a party to an arrangement with a third party that is +in the business of distributing software, under which you make payment +to the third party based on the extent of your activity of conveying +the work, and under which the third party grants, to any of the +parties who would receive the covered work from you, a discriminatory +patent license (a) in connection with copies of the covered work +conveyed by you (or copies made from those copies), or (b) primarily +for and in connection with specific products or compilations that +contain the covered work, unless you entered into that arrangement, +or that patent license was granted, prior to 28 March 2007. + + Nothing in this License shall be construed as excluding or limiting +any implied license or other defenses to infringement that may +otherwise be available to you under applicable patent law. + + 12. No Surrender of Others' Freedom. + + If conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot convey a +covered work so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you may +not convey it at all. For example, if you agree to terms that obligate you +to collect a royalty for further conveying from those to whom you convey +the Program, the only way you could satisfy both those terms and this +License would be to refrain entirely from conveying the Program. + + 13. Remote Network Interaction; Use with the GNU General Public License. + + Notwithstanding any other provision of this License, if you modify the +Program, your modified version must prominently offer all users +interacting with it remotely through a computer network (if your version +supports such interaction) an opportunity to receive the Corresponding +Source of your version by providing access to the Corresponding Source +from a network server at no charge, through some standard or customary +means of facilitating copying of software. This Corresponding Source +shall include the Corresponding Source for any work covered by version 3 +of the GNU General Public License that is incorporated pursuant to the +following paragraph. + + Notwithstanding any other provision of this License, you have +permission to link or combine any covered work with a work licensed +under version 3 of the GNU General Public License into a single +combined work, and to convey the resulting work. The terms of this +License will continue to apply to the part which is the covered work, +but the work with which it is combined will remain governed by version +3 of the GNU General Public License. + + 14. Revised Versions of this License. + + The Free Software Foundation may publish revised and/or new versions of +the GNU Affero General Public License from time to time. Such new versions +will be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + + Each version is given a distinguishing version number. If the +Program specifies that a certain numbered version of the GNU Affero General +Public License "or any later version" applies to it, you have the +option of following the terms and conditions either of that numbered +version or of any later version published by the Free Software +Foundation. If the Program does not specify a version number of the +GNU Affero General Public License, you may choose any version ever published +by the Free Software Foundation. + + If the Program specifies that a proxy can decide which future +versions of the GNU Affero General Public License can be used, that proxy's +public statement of acceptance of a version permanently authorizes you +to choose that version for the Program. + + Later license versions may give you additional or different +permissions. However, no additional obligations are imposed on any +author or copyright holder as a result of your choosing to follow a +later version. + + 15. Disclaimer of Warranty. + + THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY +APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT +HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY +OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, +THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM +IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF +ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. Limitation of Liability. + + IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS +THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY +GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE +USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF +DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD +PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), +EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF +SUCH DAMAGES. + + 17. Interpretation of Sections 15 and 16. + + If the disclaimer of warranty and limitation of liability provided +above cannot be given local legal effect according to their terms, +reviewing courts shall apply local law that most closely approximates +an absolute waiver of all civil liability in connection with the +Program, unless a warranty or assumption of liability accompanies a +copy of the Program in return for a fee. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +state the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU Affero General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Affero General Public License for more details. + + You should have received a copy of the GNU Affero General Public License + along with this program. If not, see . + +Also add information on how to contact you by electronic and paper mail. + + If your software can interact with users remotely through a computer +network, you should also make sure that it provides a way for users to +get its source. For example, if your program is a web application, its +interface could display a "Source" link that leads users to an archive +of the code. There are many ways you could offer source, and different +solutions will be better for different programs; see section 13 for the +specific requirements. + + You should also get your employer (if you work as a programmer) or school, +if any, to sign a "copyright disclaimer" for the program, if necessary. +For more information on this, and how to apply and follow the GNU AGPL, see +. diff --git a/LICENSE-COMMERCIAL b/LICENSE-COMMERCIAL new file mode 100644 index 0000000..39041ce --- /dev/null +++ b/LICENSE-COMMERCIAL @@ -0,0 +1,6 @@ +Licensees holding a valid commercial license with Element may use this +software in accordance with the terms contained in a written agreement +between you and Element. + +To purchase a commercial license please contact our sales team at +licensing@element.io diff --git a/README.md b/README.md new file mode 100644 index 0000000..5406b15 --- /dev/null +++ b/README.md @@ -0,0 +1,114 @@ +[![Latest build](https://github.com/element-hq/element-x-android/actions/workflows/build.yml/badge.svg?query=branch%3Adevelop)](https://github.com/element-hq/element-x-android/actions/workflows/build.yml?query=branch%3Adevelop) +[![Quality Gate Status](https://sonarcloud.io/api/project_badges/measure?project=element-x-android&metric=alert_status)](https://sonarcloud.io/summary/new_code?id=element-x-android) +[![Vulnerabilities](https://sonarcloud.io/api/project_badges/measure?project=element-x-android&metric=vulnerabilities)](https://sonarcloud.io/summary/new_code?id=element-x-android) +[![Bugs](https://sonarcloud.io/api/project_badges/measure?project=element-x-android&metric=bugs)](https://sonarcloud.io/summary/new_code?id=element-x-android) +[![codecov](https://codecov.io/github/element-hq/element-x-android/branch/develop/graph/badge.svg?token=ecwvia7amV)](https://codecov.io/github/element-hq/element-x-android) +[![Element X Android Matrix room #element-x-android:matrix.org](https://img.shields.io/matrix/element-x-android:matrix.org.svg?label=%23element-x-android:matrix.org&logo=matrix&server_fqdn=matrix.org)](https://matrix.to/#/#element-x-android:matrix.org) +[![Localazy](https://img.shields.io/endpoint?url=https%3A%2F%2Fconnect.localazy.com%2Fstatus%2Felement%2Fdata%3Fcontent%3Dall%26title%3Dlocalazy%26logo%3Dtrue)](https://localazy.com/p/element) + +# Element X Android + +Element X Android is the next-generation [Matrix](https://matrix.org/) client provided by [Element](https://element.io/). + +Compared to the previous-generation [Element Classic](https://github.com/element-hq/element-android), the application is a total rewrite, using the [Matrix Rust SDK](https://github.com/matrix-org/matrix-rust-sdk) underneath and targeting devices running Android 7+. The UI layer is written using [Jetpack Compose](https://developer.android.com/jetpack/compose), and the navigation is managed using [Appyx](https://github.com/bumble-tech/appyx). + +[Get it on Google Play](https://play.google.com/store/apps/details?id=io.element.android.x)[Get it on F-Droid](https://f-droid.org/packages/io.element.android.x) + +## Table of contents + + + +* [Screenshots](#screenshots) +* [Translations](#translations) +* [Rust SDK](#rust-sdk) +* [Status](#status) +* [Minimum SDK version](#minimum-sdk-version) +* [Contributing](#contributing) +* [Build instructions](#build-instructions) +* [Support](#support) +* [Copyright and License](#copyright-and-license) + + + +## Screenshots + +Here are some screenshots of the application: + + + +||||| +|-|-|-|-| +||||| + +## Translations + +Element X Android supports many languages. You can help us to translate the app in your language by joining our [Localazy project](https://localazy.com/p/element). You can also help us to improve the existing translations. + +Note that for now, we keep control on the French and German translations. + +Translations can be checked screen per screen using our tool Element X Android Gallery, available at https://element-hq.github.io/element-x-android/. Note that this page is updated every Tuesday. + +More instructions about translating the application can be found at [CONTRIBUTING.md](CONTRIBUTING.md#strings). + +## Rust SDK + +Element X leverages the [Matrix Rust SDK](https://github.com/matrix-org/matrix-rust-sdk) through an FFI layer that the final client can directly import and use. + +We're doing this as a way to share code between platforms and while we've seen promising results it's still in the experimental stage and bound to change. + +## Status + +This project is actively developed and supported. New users are recommended to use Element X instead of the previous-generation app. + +## Minimum SDK version + +Element X Android requires a minimum SDK version of 24 (Android 7.0, Nougat). We aim to support devices running Android 7.0 and above, which covers a wide range of devices still in use today. + +Element Android Enterprise requires a minimum SDK version of 33 (Android 13, Tiramisu). For Element Enterprise, we support only devices that still receive security updates, which means devices running Android 13 and above. Android does not have a documented support policy, but some information can be found at [https://endoflife.date/android](https://endoflife.date/android). + +## Contributing + +Want to get actively involved in the project? You're more than welcome! A good way to start is to check the issues that are labelled with the [good first issue](https://github.com/element-hq/element-x-android/issues?q=is%3Aissue+is%3Aopen+label%3A%22good+first+issue%22) label. Let us know by commenting the issue that you're starting working on it. + +But first make sure to read our [contribution guide](CONTRIBUTING.md) first. + +You can also come chat with the community in the Matrix [room](https://matrix.to/#/#element-x-android:matrix.org) dedicated to the project. + +## Build instructions + +Just clone the project and open it in Android Studio. Make sure to select the +`app` configuration when building (as we also have sample apps in the project). + +To build against a local copy of the Rust SDK, see the [Developer +onboarding](docs/_developer_onboarding.md#building-the-sdk-locally) instructions. + +## Support + +When you are experiencing an issue on Element X Android, please first search in [GitHub issues](https://github.com/element-hq/element-x-android/issues) +and then in [#element-x-android:matrix.org](https://matrix.to/#/#element-x-android:matrix.org). +If after your research you still have a question, ask at [#element-x-android:matrix.org](https://matrix.to/#/#element-x-android:matrix.org). Otherwise feel free to create a GitHub issue if you encounter a bug or a crash, by explaining clearly in detail what happened. You can also perform bug reporting from the application settings. This is especially recommended when you encounter a crash. + +## Copyright and License + +Copyright (c) 2025 Element Creations Ltd. +Copyright (c) 2022 - 2025 New Vector Ltd. + +This software is dual licensed by Element Creations Ltd (Element). It can be used either: + +(1) for free under the terms of the GNU Affero General Public License (as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version); OR + +(2) under the terms of a paid-for Element Commercial License agreement between you and Element (the terms of which may vary depending on what you and Element have agreed to). + +Unless required by applicable law or agreed to in writing, software distributed under the Licenses is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the Licenses for the specific language governing permissions and limitations under the Licenses. diff --git a/annotations/.gitignore b/annotations/.gitignore new file mode 100644 index 0000000..42afabf --- /dev/null +++ b/annotations/.gitignore @@ -0,0 +1 @@ +/build \ No newline at end of file diff --git a/annotations/build.gradle.kts b/annotations/build.gradle.kts new file mode 100644 index 0000000..33e3cbe --- /dev/null +++ b/annotations/build.gradle.kts @@ -0,0 +1,11 @@ +/* + * Copyright (c) 2025 Element Creations Ltd. + * Copyright 2022-2025 New Vector Ltd. + * + * SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial. + * Please see LICENSE files in the repository root for full details. + */ +plugins { + alias(libs.plugins.kotlin.jvm) + id("com.android.lint") +} diff --git a/annotations/src/main/kotlin/io/element/android/annotations/ContributesNode.kt b/annotations/src/main/kotlin/io/element/android/annotations/ContributesNode.kt new file mode 100644 index 0000000..632bdc3 --- /dev/null +++ b/annotations/src/main/kotlin/io/element/android/annotations/ContributesNode.kt @@ -0,0 +1,31 @@ +/* + * Copyright (c) 2025 Element Creations Ltd. + * Copyright 2023-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.annotations + +import kotlin.reflect.KClass + +/** + * Adds Node to the specified component graph. + * Equivalent to the following declaration: + * + * @BindingContainer + * @ContributesTo(Scope::class) + * abstract class YourNodeModule { + + * @Binds + * @IntoMap + * @NodeKey(YourNode::class) + * abstract fun bindYourNodeFactory(factory: YourNode.Factory): AssistedNodeFactory<*> + *} + + */ +@Target(AnnotationTarget.CLASS) +annotation class ContributesNode( + val scope: KClass<*>, +) diff --git a/app/build.gradle.kts b/app/build.gradle.kts new file mode 100644 index 0000000..2464155 --- /dev/null +++ b/app/build.gradle.kts @@ -0,0 +1,363 @@ +/* + * Copyright (c) 2025 Element Creations Ltd. + * Copyright 2022-2025 New Vector Ltd. + * + * SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial. + * Please see LICENSE files in the repository root for full details. + */ + +@file:Suppress("UnstableApiUsage") + +import com.android.build.api.variant.FilterConfiguration.FilterType.ABI +import com.android.build.gradle.internal.tasks.factory.dependsOn +import com.android.build.gradle.tasks.GenerateBuildConfig +import com.google.firebase.appdistribution.gradle.firebaseAppDistribution +import config.BuildTimeConfig +import extension.AssetCopyTask +import extension.GitBranchNameValueSource +import extension.GitRevisionValueSource +import extension.allEnterpriseImpl +import extension.allFeaturesImpl +import extension.allLibrariesImpl +import extension.allServicesImpl +import extension.buildConfigFieldStr +import extension.koverDependencies +import extension.locales +import extension.setupDependencyInjection +import extension.setupKover +import extension.testCommonDependencies +import java.util.Locale + +plugins { + id("io.element.android-compose-application") + alias(libs.plugins.kotlin.android) + // When using precompiled plugins, we need to apply the firebase plugin like this + id(libs.plugins.firebaseAppDistribution.get().pluginId) + alias(libs.plugins.knit) + id("kotlin-parcelize") + alias(libs.plugins.licensee) + alias(libs.plugins.kotlin.serialization) + // To be able to update the firebase.xml files, uncomment and build the project + // alias(libs.plugins.gms.google.services) +} + +setupKover() + +android { + namespace = "io.element.android.x" + + defaultConfig { + applicationId = BuildTimeConfig.APPLICATION_ID + targetSdk = Versions.TARGET_SDK + versionCode = Versions.VERSION_CODE + versionName = Versions.VERSION_NAME + + // Keep abiFilter for the universalApk + ndk { + abiFilters += listOf("armeabi-v7a", "x86", "arm64-v8a", "x86_64") + } + + // Ref: https://developer.android.com/studio/build/configure-apk-splits.html#configure-abi-split + splits { + // Configures multiple APKs based on ABI. + abi { + val buildingAppBundle = gradle.startParameter.taskNames.any { it.contains("bundle") } + + // Enables building multiple APKs per ABI. This should be disabled when building an AAB. + isEnable = !buildingAppBundle + + // By default all ABIs are included, so use reset() and include to specify that we only + // want APKs for armeabi-v7a, x86, arm64-v8a and x86_64. + // Resets the list of ABIs that Gradle should create APKs for to none. + reset() + + if (!buildingAppBundle) { + // Specifies a list of ABIs that Gradle should create APKs for. + include("armeabi-v7a", "x86", "arm64-v8a", "x86_64") + // Generate a universal APK that includes all ABIs, so user who installs from CI tool can use this one by default. + isUniversalApk = true + } + } + } + + androidResources { + localeFilters += locales + } + } + + signingConfigs { + getByName("debug") { + keyAlias = "androiddebugkey" + keyPassword = "android" + storeFile = file("./signature/debug.keystore") + storePassword = "android" + } + register("nightly") { + keyAlias = System.getenv("ELEMENT_ANDROID_NIGHTLY_KEYID") + ?: project.property("signing.element.nightly.keyId") as? String? + keyPassword = System.getenv("ELEMENT_ANDROID_NIGHTLY_KEYPASSWORD") + ?: project.property("signing.element.nightly.keyPassword") as? String? + storeFile = file("./signature/nightly.keystore") + storePassword = System.getenv("ELEMENT_ANDROID_NIGHTLY_STOREPASSWORD") + ?: project.property("signing.element.nightly.storePassword") as? String? + } + } + + val baseAppName = BuildTimeConfig.APPLICATION_NAME + val buildType = if (isEnterpriseBuild) "Enterprise" else "FOSS" + logger.warnInBox("Building ${defaultConfig.applicationId} ($baseAppName) [$buildType]") + + buildTypes { + val oidcRedirectSchemeBase = BuildTimeConfig.METADATA_HOST_REVERSED ?: "io.element.android" + getByName("debug") { + resValue("string", "app_name", "$baseAppName dbg") + resValue( + "string", + "login_redirect_scheme", + "$oidcRedirectSchemeBase.debug", + ) + applicationIdSuffix = ".debug" + signingConfig = signingConfigs.getByName("debug") + } + + getByName("release") { + resValue("string", "app_name", baseAppName) + resValue( + "string", + "login_redirect_scheme", + oidcRedirectSchemeBase, + ) + signingConfig = signingConfigs.getByName("debug") + + optimization { + enable = true + keepRules { + files.add(File(projectDir, "proguard-rules.pro")) + files.add(getDefaultProguardFile("proguard-android-optimize.txt")) + } + } + } + + register("nightly") { + val release = getByName("release") + initWith(release) + applicationIdSuffix = ".nightly" + versionNameSuffix = "-nightly" + resValue("string", "app_name", "$baseAppName nightly") + resValue( + "string", + "login_redirect_scheme", + "$oidcRedirectSchemeBase.nightly", + ) + matchingFallbacks += listOf("release") + signingConfig = signingConfigs.getByName("nightly") + + firebaseAppDistribution { + artifactType = "APK" + // We upload the universal APK to fix this error: + // "App Distribution found more than 1 output file for this variant. + // Please contact firebase-support@google.com for help using APK splits with App Distribution." + artifactPath = "$rootDir/app/build/outputs/apk/gplay/nightly/app-gplay-universal-nightly.apk" + // artifactType = "AAB" + // artifactPath = "$rootDir/app/build/outputs/bundle/nightly/app-nightly.aab" + releaseNotesFile = "tools/release/ReleaseNotesNightly.md" + groups = if (isEnterpriseBuild) { + "enterprise-testers" + } else { + "external-testers" + } + // This should not be required, but if I do not add the appId, I get this error: + // "App Distribution halted because it had a problem uploading the APK: [404] Requested entity was not found." + appId = if (isEnterpriseBuild) { + "1:912726360885:android:3f7e1fe644d99d5a00427c" + } else { + "1:912726360885:android:e17435e0beb0303000427c" + } + } + } + } + + buildFeatures { + buildConfig = true + } + flavorDimensions += "store" + productFlavors { + create("gplay") { + dimension = "store" + isDefault = true + buildConfigFieldStr("SHORT_FLAVOR_DESCRIPTION", "G") + buildConfigFieldStr("FLAVOR_DESCRIPTION", "GooglePlay") + } + create("fdroid") { + dimension = "store" + buildConfigFieldStr("SHORT_FLAVOR_DESCRIPTION", "F") + buildConfigFieldStr("FLAVOR_DESCRIPTION", "FDroid") + } + } + + packaging { + resources.pickFirsts += setOf( + "META-INF/versions/9/OSGI-INF/MANIFEST.MF", + ) + } +} + +androidComponents { + // map for the version codes last digit + // x86 must have greater values than arm + // 64 bits have greater value than 32 bits + val abiVersionCodes = mapOf( + "armeabi-v7a" to 1, + "arm64-v8a" to 2, + "x86" to 3, + "x86_64" to 4, + ) + + onVariants { variant -> + // Assigns a different version code for each output APK + // other than the universal APK. + variant.outputs.forEach { output -> + val name = output.filters.find { it.filterType == ABI }?.identifier + + // Stores the value of abiCodes that is associated with the ABI for this variant. + val abiCode = abiVersionCodes[name] ?: 0 + // Assigns the new version code to output.versionCode, which changes the version code + // for only the output APK, not for the variant itself. + output.versionCode.set((output.versionCode.orNull ?: 0) * 10 + abiCode) + } + } + + val reportingExtension: ReportingExtension = project.extensions.getByType(ReportingExtension::class.java) + configureLicensesTasks(reportingExtension) +} + +// Knit +apply { + plugin("kotlinx-knit") +} + +knit { + files = fileTree(project.rootDir) { + include( + "**/*.md", + "**/*.kt", + "*/*.kts", + ) + exclude( + "**/build/**", + "*/.gradle/**", + "**/CHANGES.md", + ) + } +} + +setupDependencyInjection() + +dependencies { + allLibrariesImpl() + allServicesImpl() + if (isEnterpriseBuild) { + allEnterpriseImpl(project) + implementation(projects.appicon.enterprise) + } else { + implementation(projects.features.enterprise.implFoss) + implementation(projects.appicon.element) + } + allFeaturesImpl(project) + implementation(projects.features.migration.api) + implementation(projects.appnav) + implementation(projects.appconfig) + implementation(projects.libraries.uiStrings) + implementation(projects.services.analytics.compose) + + if (ModulesConfig.pushProvidersConfig.includeFirebase) { + "gplayImplementation"(projects.libraries.pushproviders.firebase) + } + if (ModulesConfig.pushProvidersConfig.includeUnifiedPush) { + implementation(projects.libraries.pushproviders.unifiedpush) + } + + implementation(libs.appyx.core) + implementation(libs.androidx.splash) + implementation(libs.androidx.core) + implementation(libs.androidx.corektx) + implementation(libs.androidx.lifecycle.runtime) + implementation(libs.androidx.lifecycle.process) + implementation(libs.androidx.activity.compose) + implementation(libs.androidx.startup) + implementation(libs.androidx.preference) + implementation(libs.coil) + + implementation(platform(libs.network.okhttp.bom)) + implementation(libs.network.okhttp.logging) + implementation(libs.serialization.json) + + implementation(libs.matrix.emojibase.bindings) + + testCommonDependencies(libs) + testImplementation(projects.libraries.matrix.test) + testImplementation(projects.services.toolbox.test) + + koverDependencies() +} + +tasks.withType().configureEach { + outputs.upToDateWhen { false } + val gitRevision = providers.of(GitRevisionValueSource::class.java) {}.get() + val gitBranchName = providers.of(GitBranchNameValueSource::class.java) {}.get() + android.defaultConfig.buildConfigFieldStr("GIT_REVISION", gitRevision) + android.defaultConfig.buildConfigFieldStr("GIT_BRANCH_NAME", gitBranchName) +} + +licensee { + allow("Apache-2.0") + allow("MIT") + allow("BSD-2-Clause") + allow("BSD-3-Clause") + allow("EPL-1.0") + allowUrl("https://opensource.org/licenses/MIT") + allowUrl("https://developer.android.com/studio/terms.html") + allowUrl("https://www.zetetic.net/sqlcipher/license/") + allowUrl("https://jsoup.org/license") + allowUrl("https://asm.ow2.io/license.html") + allowUrl("https://www.gnu.org/licenses/agpl-3.0.txt") + allowUrl("https://github.com/mhssn95/compose-color-picker/blob/main/LICENSE") + ignoreDependencies("com.github.matrix-org", "matrix-analytics-events") + // Ignore dependency that are not third-party licenses to us. + ignoreDependencies(groupId = "io.element.android") +} + +fun Project.configureLicensesTasks(reportingExtension: ReportingExtension) { + androidComponents { + onVariants { variant -> + val capitalizedVariantName = variant.name.replaceFirstChar { + if (it.isLowerCase()) { + it.titlecase(Locale.getDefault()) + } else { + it.toString() + } + } + val artifactsFile = reportingExtension.baseDirectory.file("licensee/android$capitalizedVariantName/artifacts.json") + + val copyArtifactsTask = + project.tasks.register("copy${capitalizedVariantName}LicenseeReportToAssets") { + inputFile.set(artifactsFile) + targetFileName.set("licensee-artifacts.json") + } + variant.sources.assets?.addGeneratedSourceDirectory( + copyArtifactsTask, + AssetCopyTask::outputDirectory, + ) + copyArtifactsTask.dependsOn("licenseeAndroid$capitalizedVariantName") + } + } +} + +configurations.all { + resolutionStrategy { + dependencySubstitution { + val tink = libs.google.tink.get() + substitute(module("com.google.crypto.tink:tink")).using(module("${tink.group}:${tink.name}:${tink.version}")) + } + } +} diff --git a/app/proguard-rules.pro b/app/proguard-rules.pro new file mode 100644 index 0000000..9610942 --- /dev/null +++ b/app/proguard-rules.pro @@ -0,0 +1,72 @@ +# Add project specific ProGuard rules here. +# You can control the set of applied configuration files using the +# proguardFiles setting in build.gradle.kts. +# +# For more details, see +# http://developer.android.com/guide/developing/tools/proguard.html + +# JNA +-dontwarn java.awt.* +-keep class com.sun.jna.** { *; } +-keep class * implements com.sun.jna.** { *; } + +# TagSoup, coming from the RTE library +-keep class org.ccil.cowan.tagsoup.** { *; } + +# kotlinx.serialization + +# Kotlin serialization looks up the generated serializer classes through a function on companion +# objects. The companions are looked up reflectively so we need to explicitly keep these functions. +-keepclasseswithmembers class **.*$Companion { + kotlinx.serialization.KSerializer serializer(...); +} +# If a companion has the serializer function, keep the companion field on the original type so that +# the reflective lookup succeeds. +-if class **.*$Companion { + kotlinx.serialization.KSerializer serializer(...); +} +-keepclassmembers class <1>.<2> { + <1>.<2>$Companion Companion; +} + +# OkHttp platform used only on JVM and when Conscrypt and other security providers are available. +# Taken from https://raw.githubusercontent.com/square/okhttp/master/okhttp/src/jvmMain/resources/META-INF/proguard/okhttp3.pro +-dontwarn okhttp3.internal.platform.** +-dontwarn org.conscrypt.** +-dontwarn org.bouncycastle.** +-dontwarn org.openjsse.** + +# Needed for Posthog +-keepclassmembers class android.view.JavaViewSpy { + static int windowAttachCount(android.view.View); +} + + +# Keep LogSessionId class and related classes (https://github.com/androidx/media/issues/2535) +-keep class android.media.metrics.LogSessionId { *; } +-keep class android.media.metrics.** { *; } + +# Keep Media3 classes that use reflection (https://github.com/androidx/media/issues/2535) +-keep class androidx.media3.** { *; } +-dontwarn android.media.metrics.** + +# New rules after AGP 8.13.1 upgrade +-dontwarn androidx.window.extensions.WindowExtensions +-dontwarn androidx.window.extensions.WindowExtensionsProvider +-dontwarn androidx.window.extensions.area.ExtensionWindowAreaPresentation +-dontwarn androidx.window.extensions.layout.DisplayFeature +-dontwarn androidx.window.extensions.layout.FoldingFeature +-dontwarn androidx.window.extensions.layout.WindowLayoutComponent +-dontwarn androidx.window.extensions.layout.WindowLayoutInfo +-dontwarn androidx.window.sidecar.SidecarDeviceState +-dontwarn androidx.window.sidecar.SidecarDisplayFeature +-dontwarn androidx.window.sidecar.SidecarInterface$SidecarCallback +-dontwarn androidx.window.sidecar.SidecarInterface +-dontwarn androidx.window.sidecar.SidecarProvider +-dontwarn androidx.window.sidecar.SidecarWindowLayoutInfo + +# Also needed after AGP 8.13.1 upgrade, it seems like proguard is now more aggressive on removing unused code +-keep class org.matrix.rustcomponents.sdk.** { *;} +-keep class uniffi.** { *;} +-keep class io.element.android.x.di.** { *; } +-keepnames class io.element.android.x.** diff --git a/app/signature/debug.keystore b/app/signature/debug.keystore new file mode 100644 index 0000000000000000000000000000000000000000..4a15fc9eca2637827fa4ee2cb43a4ee437d21bb8 GIT binary patch literal 1260 zcmezO_TO6u1_mY|W&~sY#JrTE{LGY;)TGk%?9@u2c(%dMb*q7Db{jM?Z8zX!KA$&MBV5;->Wo7f-pH$kmsm2zFn@&D>cJieLfwJ(wvo` zX6!QfywWX}%k}zG>#YGgEme=AcqhMiWJoOZy0~0;$yr6MvS$WQI=1HDxGy+sW~R^O z=;NyU58V|tl-0j@%;m<f z!RY8a%^KB3=e?Wm&g#?4<>FFbxK7mI6Ti|!tAO(GrAMZGR^T)Hw&`0<2xH{GPere{ z%E=~Jwm&mUeP%1R=F`soYvz5qapC;B*B@uH+O3T!Yx)ta95(&W_6_B8%Wxnj3BN^!0K_hf?aABD4m2JHXdOgeR< z;JVFmi*@zP?7Mebv{h$j=}su}%IDa*cXk$Ia9hjIF7t!uBwPu;lSOZ1FLgd&Pcz z;f|bwBbtx<{;(}w&>-)pz4z{g1DRVUB#5nZ=q-?$bl=#?sd?#-leXFmjx3tN^_T7K z;Xu2U<{!@f__%Ch$SOOT+TcFTTdSWb$>fW8!7|Ek_rxvMB%M(feHYtkT|Mw?y*^J_V2Oz84Yuc(?Lv=yDf{ zbA7+^`BqZ0lW?A1+tTtj1>0_E-R6&swiBF# zrxzT0uA;y1!KL&ak196r`CZfSE@;J%Q@8b5xxd_KJd zoVHmb^h^ybfhqc-K@;O$Aa-M7WHjJqL;$er18*&?Pf<)ManL>jN_H2qx2z@ literal 0 HcmV?d00001 diff --git a/app/signature/nightly.keystore b/app/signature/nightly.keystore new file mode 100644 index 0000000000000000000000000000000000000000..a0e9ba413be5ac9bb0b30a3088882a17c5aaa3bd GIT binary patch literal 2217 zcmchYX*3iH8^>oem@$~Lz9mLsm@s3@5;As@{hG*bFbK(#vSbu8L%gh&woO@0m-p}uc=fm@Ro)6FYpXdDlhpUIH0001VT)@8z=1+_a zB>DJ;21FjCxZ$b?G5`Pv0856jvAj?i1`31#UvkOKfAL%zCfsf@3k=4}x5b~?zt zS>4={6p7gyxhG_MH3I1zfN#teA(S*?B|lTZoZwGcKpAO{|6-@9w&bn|X7I6X9UW zGgo>k|S7|o`+xSx=*lAdWp;Q=Ux zA15drh_my;U4+SN9d9q4lp33dhOd*Z2-MkY1(9tRT}NpRtom%KN$z0kq@Qx(Qx3jOKDu&89wDBwS>C>K zS}=#~WW1Q_Ua44H(YPiwqf0TU;Nkz2{~b7L{7e91 zDnhYF?ifpSL=LCu7~go8I~nC4>SyT4=ExsBYBF!B5-)stlTsD6Vj4`65+38(wJVmL z5FUZVNEkcR2k7;Spb8PKQ-R&l6{@;9oXMSt0UusGY0oQ}uE}+M#)|pXMMnjd8$kRG zUz2sw_H_aK$51fLx1}JEtjzS5x)IjqO!|34JxKp4)wll0EICK(_LY>TFjd(#FIm|Q zhr#WvD${`dCl1*=%8Wy!6Zi|K|BdGEEl=cw8#)%!(vr*$OKG+qDcr_v zK1@cgFC=1vvH#XNRWx7TR{<1K%5w^!FnuP(Wb@_K0xS7yJc(k?~D86QxgZyXHs zP__BqigJ!iCDVP=fP6;qM&H%+XvXK6VT*QH9`8!?1NfUg*3L>a0@t}%F7LkB=B5Ua zNt-w~w!LLLmCJugKkmK$Gk*&vyG+Aqo8@?yS{M)V`$hAY2h1O z4DKQ&LA36JPa;Ahr;$Mf_ggiziYEzC`cDtfw>FiK52$hxJm2|WJ*Q|k7H{pZKxuQ$ z=!ELXK=<$ZyBn5QgEJ9dq;Ci+l5W3~p_OJLz(r0@^%<43J?e#E$30=rjcgjuGA+wG%m39=L zE*cLdVro=R}*3L|u$9X;XEMI^9w>NSS6jZSq007tp zO9ne)$sl|I7z6}?ARbHu0u}+~mP;^6*g*h+@MFUa#KE!LP_R7&dJ<%0gX24%A2(b) zP@@p{Ku_X7fRhJmLktWg-o%~6BLBMq%q zs^V0zN?5F;2%i#G^;htJzlaQ!{8g0W!~m0le8*7&gn`IFAfV!9WH+`4Z!T?In;Z#G z62JC(0rh*4Mo=sA9p~L^3!Gy*GLO^@LPNtoNXhFx8*6DOH8Ib^Cu{F|ZRTGuQu)^; zYv6KT)8&Q4lQY+8%RK?rA+cxsJ%co&<0tcDMzHj%Cgvs@9@^kSNEVl#Qv-d?CKSt@ zY<7{DYmbTq_LHY)pT4G_yT33Ntk7f^qCviL5!N5JUu-X54*D}qD^5`3eIq}IuXw57 z`cAP2(SwBy;P<25qJ=2)(@$|d+HpHP*y{@Q9k+%}lwZWVW=uFo7rrHqhX!9Qr3$5k zA@?>1`I5c&Rv|_RZ#Zwg6ryurN&g0YdzV}kF$8v+q#!|fF6h)Vz)lUEIv|)hv!(< zHU^_&BM);E!{t|J+j-x3!aKBF_p9iv?d-%|D{ac_9sF&gbX!p(Pk7OK_qTK3ZMbz< zcX(;uW9{M7+e0dKYGW2P=>q + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/kotlin/io/element/android/x/ElementXApplication.kt b/app/src/main/kotlin/io/element/android/x/ElementXApplication.kt new file mode 100644 index 0000000..e29ff82 --- /dev/null +++ b/app/src/main/kotlin/io/element/android/x/ElementXApplication.kt @@ -0,0 +1,40 @@ +/* + * Copyright (c) 2025 Element Creations Ltd. + * Copyright 2022-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.x + +import android.app.Application +import androidx.startup.AppInitializer +import androidx.work.Configuration +import dev.zacsweers.metro.createGraphFactory +import io.element.android.libraries.di.DependencyInjectionGraphOwner +import io.element.android.libraries.workmanager.api.di.MetroWorkerFactory +import io.element.android.x.di.AppGraph +import io.element.android.x.info.logApplicationInfo +import io.element.android.x.initializer.CacheCleanerInitializer +import io.element.android.x.initializer.CrashInitializer +import io.element.android.x.initializer.PlatformInitializer + +class ElementXApplication : Application(), DependencyInjectionGraphOwner, Configuration.Provider { + override val graph: AppGraph = createGraphFactory().create(this) + + override val workManagerConfiguration: Configuration = Configuration.Builder() + .setWorkerFactory(MetroWorkerFactory(graph.workerProviders)) + .build() + + override fun onCreate() { + super.onCreate() + AppInitializer.getInstance(this).apply { + initializeComponent(CrashInitializer::class.java) + initializeComponent(PlatformInitializer::class.java) + initializeComponent(CacheCleanerInitializer::class.java) + } + + logApplicationInfo(this) + } +} diff --git a/app/src/main/kotlin/io/element/android/x/MainActivity.kt b/app/src/main/kotlin/io/element/android/x/MainActivity.kt new file mode 100644 index 0000000..162a55c --- /dev/null +++ b/app/src/main/kotlin/io/element/android/x/MainActivity.kt @@ -0,0 +1,170 @@ +/* + * Copyright (c) 2025 Element Creations Ltd. + * Copyright 2022-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.x + +import android.content.Intent +import android.os.Bundle +import androidx.activity.compose.setContent +import androidx.activity.enableEdgeToEdge +import androidx.compose.foundation.background +import androidx.compose.foundation.layout.Box +import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.runtime.Composable +import androidx.compose.runtime.CompositionLocalProvider +import androidx.compose.runtime.collectAsState +import androidx.compose.runtime.getValue +import androidx.compose.runtime.remember +import androidx.compose.ui.Modifier +import androidx.compose.ui.platform.LocalUriHandler +import androidx.core.splashscreen.SplashScreen.Companion.installSplashScreen +import androidx.lifecycle.Lifecycle +import androidx.lifecycle.lifecycleScope +import androidx.lifecycle.repeatOnLifecycle +import com.bumble.appyx.core.integration.NodeHost +import com.bumble.appyx.core.integrationpoint.NodeActivity +import com.bumble.appyx.core.plugin.NodeReadyObserver +import io.element.android.compound.colors.SemanticColorsLightDark +import io.element.android.compound.theme.ElementTheme +import io.element.android.features.lockscreen.api.LockScreenEntryPoint +import io.element.android.features.lockscreen.api.LockScreenLockState +import io.element.android.features.lockscreen.api.LockScreenService +import io.element.android.features.lockscreen.api.handleSecureFlag +import io.element.android.libraries.architecture.bindings +import io.element.android.libraries.core.log.logger.LoggerTag +import io.element.android.libraries.designsystem.theme.ElementThemeApp +import io.element.android.libraries.designsystem.utils.snackbar.LocalSnackbarDispatcher +import io.element.android.services.analytics.compose.LocalAnalyticsService +import io.element.android.x.di.AppBindings +import io.element.android.x.intent.SafeUriHandler +import kotlinx.coroutines.launch +import timber.log.Timber + +private val loggerTag = LoggerTag("MainActivity") + +class MainActivity : NodeActivity() { + private lateinit var mainNode: MainNode + private lateinit var appBindings: AppBindings + + override fun onCreate(savedInstanceState: Bundle?) { + Timber.tag(loggerTag.value).w("onCreate, with savedInstanceState: ${savedInstanceState != null}") + installSplashScreen() + super.onCreate(savedInstanceState) + appBindings = bindings() + setupLockManagement(appBindings.lockScreenService(), appBindings.lockScreenEntryPoint()) + enableEdgeToEdge() + setContent { + MainContent(appBindings) + } + } + + @Composable + private fun MainContent(appBindings: AppBindings) { + val migrationState = appBindings.migrationEntryPoint().present() + val colors by remember { + appBindings.enterpriseService().semanticColorsFlow(sessionId = null) + }.collectAsState(SemanticColorsLightDark.default) + ElementThemeApp( + appPreferencesStore = appBindings.preferencesStore(), + compoundLight = colors.light, + compoundDark = colors.dark, + buildMeta = appBindings.buildMeta() + ) { + CompositionLocalProvider( + LocalSnackbarDispatcher provides appBindings.snackbarDispatcher(), + LocalUriHandler provides SafeUriHandler(this), + LocalAnalyticsService provides appBindings.analyticsService(), + ) { + Box( + modifier = Modifier + .fillMaxSize() + .background(ElementTheme.colors.bgCanvasDefault), + ) { + if (migrationState.migrationAction.isSuccess()) { + MainNodeHost() + } else { + appBindings.migrationEntryPoint().Render( + state = migrationState, + modifier = Modifier, + ) + } + } + } + } + } + + @Composable + private fun MainNodeHost() { + NodeHost(integrationPoint = appyxV1IntegrationPoint) { + MainNode( + it, + plugins = listOf( + object : NodeReadyObserver { + override fun init(node: MainNode) { + Timber.tag(loggerTag.value).w("onMainNodeInit") + mainNode = node + mainNode.handleIntent(intent) + } + } + ), + context = applicationContext + ) + } + } + + private fun setupLockManagement( + lockScreenService: LockScreenService, + lockScreenEntryPoint: LockScreenEntryPoint + ) { + lockScreenService.handleSecureFlag(this) + lifecycleScope.launch { + repeatOnLifecycle(Lifecycle.State.RESUMED) { + lockScreenService.lockState.collect { state -> + if (state == LockScreenLockState.Locked) { + startActivity(lockScreenEntryPoint.pinUnlockIntent(this@MainActivity)) + } + } + } + } + } + + /** + * Called when: + * - the launcher icon is clicked (if the app is already running); + * - a notification is clicked. + * - a deep link have been clicked + * - the app is going to background (<- this is strange) + */ + override fun onNewIntent(intent: Intent) { + super.onNewIntent(intent) + Timber.tag(loggerTag.value).w("onNewIntent") + // If the mainNode is not init yet, keep the intent for later. + // It can happen when the activity is killed by the system. The methods are called in this order : + // onCreate(savedInstanceState=true) -> onNewIntent -> onResume -> onMainNodeInit + if (::mainNode.isInitialized) { + mainNode.handleIntent(intent) + } else { + setIntent(intent) + } + } + + override fun onPause() { + super.onPause() + Timber.tag(loggerTag.value).w("onPause") + } + + override fun onResume() { + super.onResume() + Timber.tag(loggerTag.value).w("onResume") + } + + override fun onDestroy() { + super.onDestroy() + Timber.tag(loggerTag.value).w("onDestroy") + } +} diff --git a/app/src/main/kotlin/io/element/android/x/MainNode.kt b/app/src/main/kotlin/io/element/android/x/MainNode.kt new file mode 100644 index 0000000..2004db8 --- /dev/null +++ b/app/src/main/kotlin/io/element/android/x/MainNode.kt @@ -0,0 +1,62 @@ +/* + * Copyright (c) 2025 Element Creations Ltd. + * Copyright 2023-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.x + +import android.content.Context +import android.content.Intent +import android.os.Parcelable +import androidx.compose.runtime.Composable +import androidx.compose.ui.Modifier +import androidx.lifecycle.lifecycleScope +import com.bumble.appyx.core.composable.Children +import com.bumble.appyx.core.modality.BuildContext +import com.bumble.appyx.core.navigation.model.permanent.PermanentNavModel +import com.bumble.appyx.core.node.Node +import com.bumble.appyx.core.node.ParentNode +import com.bumble.appyx.core.plugin.Plugin +import io.element.android.appnav.RootFlowNode +import io.element.android.libraries.architecture.createNode +import io.element.android.libraries.di.DependencyInjectionGraphOwner +import io.element.android.libraries.di.annotations.ApplicationContext +import kotlinx.coroutines.launch +import kotlinx.parcelize.Parcelize + +class MainNode( + buildContext: BuildContext, + plugins: List, + @ApplicationContext context: Context, +) : ParentNode( + navModel = PermanentNavModel( + navTargets = setOf(RootNavTarget), + savedStateMap = buildContext.savedStateMap, + ), + buildContext = buildContext, + plugins = plugins, +), + DependencyInjectionGraphOwner { + override val graph = (context as DependencyInjectionGraphOwner).graph + + override fun resolve(navTarget: RootNavTarget, buildContext: BuildContext): Node { + return createNode(buildContext = buildContext) + } + + @Composable + override fun View(modifier: Modifier) { + Children(navModel = navModel) + } + + fun handleIntent(intent: Intent) { + lifecycleScope.launch { + waitForChildAttached().handleIntent(intent) + } + } + + @Parcelize + object RootNavTarget : Parcelable +} diff --git a/app/src/main/kotlin/io/element/android/x/di/AppBindings.kt b/app/src/main/kotlin/io/element/android/x/di/AppBindings.kt new file mode 100644 index 0000000..6e157f6 --- /dev/null +++ b/app/src/main/kotlin/io/element/android/x/di/AppBindings.kt @@ -0,0 +1,51 @@ +/* + * Copyright (c) 2025 Element Creations Ltd. + * Copyright 2023-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.x.di + +import dev.zacsweers.metro.AppScope +import dev.zacsweers.metro.ContributesTo +import io.element.android.features.api.MigrationEntryPoint +import io.element.android.features.enterprise.api.EnterpriseService +import io.element.android.features.lockscreen.api.LockScreenEntryPoint +import io.element.android.features.lockscreen.api.LockScreenService +import io.element.android.features.rageshake.api.reporter.BugReporter +import io.element.android.libraries.core.meta.BuildMeta +import io.element.android.libraries.designsystem.utils.snackbar.SnackbarDispatcher +import io.element.android.libraries.featureflag.api.FeatureFlagService +import io.element.android.libraries.matrix.api.platform.InitPlatformService +import io.element.android.libraries.matrix.api.tracing.TracingService +import io.element.android.libraries.preferences.api.store.AppPreferencesStore +import io.element.android.services.analytics.api.AnalyticsService + +@ContributesTo(AppScope::class) +interface AppBindings { + fun snackbarDispatcher(): SnackbarDispatcher + + fun tracingService(): TracingService + + fun platformService(): InitPlatformService + + fun bugReporter(): BugReporter + + fun lockScreenService(): LockScreenService + + fun preferencesStore(): AppPreferencesStore + + fun migrationEntryPoint(): MigrationEntryPoint + + fun lockScreenEntryPoint(): LockScreenEntryPoint + + fun analyticsService(): AnalyticsService + + fun enterpriseService(): EnterpriseService + + fun featureFlagService(): FeatureFlagService + + fun buildMeta(): BuildMeta +} diff --git a/app/src/main/kotlin/io/element/android/x/di/AppGraph.kt b/app/src/main/kotlin/io/element/android/x/di/AppGraph.kt new file mode 100644 index 0000000..7b5ba11 --- /dev/null +++ b/app/src/main/kotlin/io/element/android/x/di/AppGraph.kt @@ -0,0 +1,37 @@ +/* + * Copyright (c) 2025 Element Creations Ltd. + * Copyright 2025 New Vector Ltd. + * + * SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial. + * Please see LICENSE files in the repository root for full details. + */ + +package io.element.android.x.di + +import android.content.Context +import androidx.work.ListenableWorker +import dev.zacsweers.metro.AppScope +import dev.zacsweers.metro.DependencyGraph +import dev.zacsweers.metro.Multibinds +import dev.zacsweers.metro.Provides +import io.element.android.libraries.architecture.NodeFactoriesBindings +import io.element.android.libraries.di.annotations.ApplicationContext +import io.element.android.libraries.workmanager.api.di.MetroWorkerFactory +import kotlin.reflect.KClass + +@DependencyGraph(AppScope::class) +interface AppGraph : NodeFactoriesBindings { + val sessionGraphFactory: SessionGraph.Factory + + @Multibinds + val workerProviders: + Map, MetroWorkerFactory.WorkerInstanceFactory<*>> + + @DependencyGraph.Factory + interface Factory { + fun create( + @ApplicationContext @Provides + context: Context + ): AppGraph + } +} diff --git a/app/src/main/kotlin/io/element/android/x/di/AppModule.kt b/app/src/main/kotlin/io/element/android/x/di/AppModule.kt new file mode 100644 index 0000000..87d0ece --- /dev/null +++ b/app/src/main/kotlin/io/element/android/x/di/AppModule.kt @@ -0,0 +1,124 @@ +/* + * Copyright (c) 2025 Element Creations Ltd. + * Copyright 2023-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.x.di + +import android.content.Context +import android.content.SharedPreferences +import android.content.res.Resources +import androidx.preference.PreferenceManager +import dev.zacsweers.metro.AppScope +import dev.zacsweers.metro.BindingContainer +import dev.zacsweers.metro.ContributesTo +import dev.zacsweers.metro.Provides +import dev.zacsweers.metro.SingleIn +import io.element.android.appconfig.ApplicationConfig +import io.element.android.features.enterprise.api.EnterpriseService +import io.element.android.libraries.androidutils.system.getVersionCodeFromManifest +import io.element.android.libraries.core.coroutine.CoroutineDispatchers +import io.element.android.libraries.core.meta.BuildMeta +import io.element.android.libraries.core.meta.BuildType +import io.element.android.libraries.designsystem.utils.snackbar.SnackbarDispatcher +import io.element.android.libraries.di.BaseDirectory +import io.element.android.libraries.di.CacheDirectory +import io.element.android.libraries.di.annotations.AppCoroutineScope +import io.element.android.libraries.di.annotations.ApplicationContext +import io.element.android.libraries.recentemojis.api.EmojibaseProvider +import io.element.android.libraries.recentemojis.impl.DefaultEmojibaseProvider +import io.element.android.x.BuildConfig +import io.element.android.x.R +import kotlinx.coroutines.CoroutineName +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.MainScope +import kotlinx.coroutines.plus +import java.io.File + +@BindingContainer +@ContributesTo(AppScope::class) +object AppModule { + @Provides + @BaseDirectory + fun providesBaseDirectory(@ApplicationContext context: Context): File { + return File(context.filesDir, "sessions") + } + + @Provides + @CacheDirectory + fun providesCacheDirectory(@ApplicationContext context: Context): File { + return context.cacheDir + } + + @Provides + fun providesResources(@ApplicationContext context: Context): Resources { + return context.resources + } + + @Provides + @AppCoroutineScope + @SingleIn(AppScope::class) + fun providesAppCoroutineScope(): CoroutineScope { + return MainScope() + CoroutineName("ElementX Scope") + } + + @Provides + @SingleIn(AppScope::class) + fun providesBuildType(): BuildType { + return BuildType.valueOf(BuildConfig.BUILD_TYPE.uppercase()) + } + + @Provides + @SingleIn(AppScope::class) + fun providesBuildMeta( + @ApplicationContext context: Context, + buildType: BuildType, + enterpriseService: EnterpriseService, + ): BuildMeta { + val applicationName = ApplicationConfig.APPLICATION_NAME.takeIf { it.isNotEmpty() } ?: context.getString(R.string.app_name) + return BuildMeta( + isDebuggable = BuildConfig.DEBUG, + buildType = buildType, + applicationName = applicationName, + productionApplicationName = if (enterpriseService.isEnterpriseBuild) applicationName else ApplicationConfig.PRODUCTION_APPLICATION_NAME, + desktopApplicationName = if (enterpriseService.isEnterpriseBuild) applicationName else ApplicationConfig.DESKTOP_APPLICATION_NAME, + applicationId = BuildConfig.APPLICATION_ID, + isEnterpriseBuild = enterpriseService.isEnterpriseBuild, + // TODO EAx Config.LOW_PRIVACY_LOG_ENABLE, + lowPrivacyLoggingEnabled = false, + versionName = BuildConfig.VERSION_NAME, + versionCode = context.getVersionCodeFromManifest(), + gitRevision = BuildConfig.GIT_REVISION, + gitBranchName = BuildConfig.GIT_BRANCH_NAME, + flavorDescription = BuildConfig.FLAVOR_DESCRIPTION, + flavorShortDescription = BuildConfig.SHORT_FLAVOR_DESCRIPTION, + ) + } + + @Provides + @SingleIn(AppScope::class) + fun providesSharedPreferences(@ApplicationContext context: Context): SharedPreferences { + return PreferenceManager.getDefaultSharedPreferences(context) + } + + @Provides + @SingleIn(AppScope::class) + fun providesCoroutineDispatchers(): CoroutineDispatchers { + return CoroutineDispatchers.Default + } + + @Provides + @SingleIn(AppScope::class) + fun provideSnackbarDispatcher(): SnackbarDispatcher { + return SnackbarDispatcher() + } + + @Provides + @SingleIn(AppScope::class) + fun providesEmojibaseProvider(@ApplicationContext context: Context): EmojibaseProvider { + return DefaultEmojibaseProvider(context) + } +} diff --git a/app/src/main/kotlin/io/element/android/x/di/DefaultRoomGraphFactory.kt b/app/src/main/kotlin/io/element/android/x/di/DefaultRoomGraphFactory.kt new file mode 100644 index 0000000..bc5c853 --- /dev/null +++ b/app/src/main/kotlin/io/element/android/x/di/DefaultRoomGraphFactory.kt @@ -0,0 +1,24 @@ +/* + * Copyright (c) 2025 Element Creations Ltd. + * Copyright 2023-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.x.di + +import dev.zacsweers.metro.ContributesBinding +import io.element.android.appnav.di.RoomGraphFactory +import io.element.android.libraries.di.SessionScope +import io.element.android.libraries.matrix.api.room.JoinedRoom + +@ContributesBinding(SessionScope::class) +class DefaultRoomGraphFactory( + private val sessionGraph: SessionGraph, +) : RoomGraphFactory { + override fun create(room: JoinedRoom): Any { + return sessionGraph.roomGraphFactory + .create(room, room) + } +} diff --git a/app/src/main/kotlin/io/element/android/x/di/DefaultSessionGraphFactory.kt b/app/src/main/kotlin/io/element/android/x/di/DefaultSessionGraphFactory.kt new file mode 100644 index 0000000..9631713 --- /dev/null +++ b/app/src/main/kotlin/io/element/android/x/di/DefaultSessionGraphFactory.kt @@ -0,0 +1,23 @@ +/* + * Copyright (c) 2025 Element Creations Ltd. + * Copyright 2023-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.x.di + +import dev.zacsweers.metro.AppScope +import dev.zacsweers.metro.ContributesBinding +import io.element.android.appnav.di.SessionGraphFactory +import io.element.android.libraries.matrix.api.MatrixClient + +@ContributesBinding(AppScope::class) +class DefaultSessionGraphFactory( + private val appGraph: AppGraph +) : SessionGraphFactory { + override fun create(client: MatrixClient): Any { + return appGraph.sessionGraphFactory.create(client) + } +} diff --git a/app/src/main/kotlin/io/element/android/x/di/RoomGraph.kt b/app/src/main/kotlin/io/element/android/x/di/RoomGraph.kt new file mode 100644 index 0000000..6588335 --- /dev/null +++ b/app/src/main/kotlin/io/element/android/x/di/RoomGraph.kt @@ -0,0 +1,28 @@ +/* + * Copyright (c) 2025 Element Creations Ltd. + * Copyright 2025 New Vector Ltd. + * + * SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial. + * Please see LICENSE files in the repository root for full details. + */ + +package io.element.android.x.di + +import dev.zacsweers.metro.GraphExtension +import dev.zacsweers.metro.Provides +import io.element.android.appnav.di.TimelineBindings +import io.element.android.libraries.architecture.NodeFactoriesBindings +import io.element.android.libraries.di.RoomScope +import io.element.android.libraries.matrix.api.room.BaseRoom +import io.element.android.libraries.matrix.api.room.JoinedRoom + +@GraphExtension(RoomScope::class) +interface RoomGraph : NodeFactoriesBindings, TimelineBindings { + @GraphExtension.Factory + interface Factory { + fun create( + @Provides joinedRoom: JoinedRoom, + @Provides baseRoom: BaseRoom + ): RoomGraph + } +} diff --git a/app/src/main/kotlin/io/element/android/x/di/SessionGraph.kt b/app/src/main/kotlin/io/element/android/x/di/SessionGraph.kt new file mode 100644 index 0000000..e53d0eb --- /dev/null +++ b/app/src/main/kotlin/io/element/android/x/di/SessionGraph.kt @@ -0,0 +1,25 @@ +/* + * Copyright (c) 2025 Element Creations Ltd. + * Copyright 2025 New Vector Ltd. + * + * SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial. + * Please see LICENSE files in the repository root for full details. + */ + +package io.element.android.x.di + +import dev.zacsweers.metro.GraphExtension +import dev.zacsweers.metro.Provides +import io.element.android.libraries.architecture.NodeFactoriesBindings +import io.element.android.libraries.di.SessionScope +import io.element.android.libraries.matrix.api.MatrixClient + +@GraphExtension(SessionScope::class) +interface SessionGraph : NodeFactoriesBindings { + val roomGraphFactory: RoomGraph.Factory + + @GraphExtension.Factory + interface Factory { + fun create(@Provides matrixClient: MatrixClient): SessionGraph + } +} diff --git a/app/src/main/kotlin/io/element/android/x/info/Logs.kt b/app/src/main/kotlin/io/element/android/x/info/Logs.kt new file mode 100644 index 0000000..2b66fef --- /dev/null +++ b/app/src/main/kotlin/io/element/android/x/info/Logs.kt @@ -0,0 +1,41 @@ +/* + * Copyright (c) 2025 Element Creations Ltd. + * Copyright 2023-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.x.info + +import android.content.Context +import io.element.android.libraries.androidutils.system.getVersionCodeFromManifest +import io.element.android.x.BuildConfig +import timber.log.Timber +import java.text.SimpleDateFormat +import java.util.Date +import java.util.Locale + +fun logApplicationInfo(context: Context) { + val appVersion = buildString { + append(BuildConfig.VERSION_NAME) + append(" (") + append(context.getVersionCodeFromManifest()) + append(") - ") + append(BuildConfig.BUILD_TYPE) + append(" / ") + append(BuildConfig.FLAVOR) + } + // TODO Get SDK version somehow + val sdkVersion = "SDK VERSION (TODO)" + val date = SimpleDateFormat("MM-dd HH:mm:ss.SSSZ", Locale.US).format(Date()) + + Timber.d("----------------------------------------------------------------") + Timber.d("----------------------------------------------------------------") + Timber.d(" Application version: $appVersion") + Timber.d(" Git SHA: ${BuildConfig.GIT_REVISION}") + Timber.d(" SDK version: $sdkVersion") + Timber.d(" Local time: $date") + Timber.d("----------------------------------------------------------------") + Timber.d("----------------------------------------------------------------\n\n\n\n") +} diff --git a/app/src/main/kotlin/io/element/android/x/initializer/CacheCleanerInitializer.kt b/app/src/main/kotlin/io/element/android/x/initializer/CacheCleanerInitializer.kt new file mode 100644 index 0000000..3e187bc --- /dev/null +++ b/app/src/main/kotlin/io/element/android/x/initializer/CacheCleanerInitializer.kt @@ -0,0 +1,22 @@ +/* + * Copyright (c) 2025 Element Creations Ltd. + * Copyright 2022-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.x.initializer + +import android.content.Context +import androidx.startup.Initializer +import io.element.android.features.cachecleaner.impl.CacheCleanerBindings +import io.element.android.libraries.architecture.bindings + +class CacheCleanerInitializer : Initializer { + override fun create(context: Context) { + context.bindings().cacheCleaner().clearCache() + } + + override fun dependencies(): List>> = emptyList() +} diff --git a/app/src/main/kotlin/io/element/android/x/initializer/CrashInitializer.kt b/app/src/main/kotlin/io/element/android/x/initializer/CrashInitializer.kt new file mode 100644 index 0000000..3caff8a --- /dev/null +++ b/app/src/main/kotlin/io/element/android/x/initializer/CrashInitializer.kt @@ -0,0 +1,25 @@ +/* + * Copyright (c) 2025 Element Creations Ltd. + * Copyright 2022-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.x.initializer + +import android.content.Context +import androidx.startup.Initializer +import io.element.android.features.rageshake.impl.crash.VectorUncaughtExceptionHandler +import io.element.android.features.rageshake.impl.di.RageshakeBindings +import io.element.android.libraries.architecture.bindings + +class CrashInitializer : Initializer { + override fun create(context: Context) { + VectorUncaughtExceptionHandler( + context.bindings().preferencesCrashDataStore(), + ).activate() + } + + override fun dependencies(): List>> = emptyList() +} diff --git a/app/src/main/kotlin/io/element/android/x/initializer/PlatformInitializer.kt b/app/src/main/kotlin/io/element/android/x/initializer/PlatformInitializer.kt new file mode 100644 index 0000000..0eea512 --- /dev/null +++ b/app/src/main/kotlin/io/element/android/x/initializer/PlatformInitializer.kt @@ -0,0 +1,49 @@ +/* + * Copyright (c) 2025 Element Creations Ltd. + * Copyright 2022-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.x.initializer + +import android.content.Context +import android.system.Os +import androidx.startup.Initializer +import io.element.android.features.rageshake.api.logs.createWriteToFilesConfiguration +import io.element.android.libraries.architecture.bindings +import io.element.android.libraries.featureflag.api.FeatureFlags +import io.element.android.libraries.matrix.api.tracing.TracingConfiguration +import io.element.android.x.di.AppBindings +import kotlinx.coroutines.flow.first +import kotlinx.coroutines.runBlocking +import timber.log.Timber + +private const val ELEMENT_X_TARGET = "elementx" + +class PlatformInitializer : Initializer { + override fun create(context: Context) { + val appBindings = context.bindings() + val tracingService = appBindings.tracingService() + val platformService = appBindings.platformService() + val bugReporter = appBindings.bugReporter() + Timber.plant(tracingService.createTimberTree(ELEMENT_X_TARGET)) + val preferencesStore = appBindings.preferencesStore() + val featureFlagService = appBindings.featureFlagService() + val logLevel = runBlocking { preferencesStore.getTracingLogLevelFlow().first() } + val tracingConfiguration = TracingConfiguration( + writesToLogcat = runBlocking { featureFlagService.isFeatureEnabled(FeatureFlags.PrintLogsToLogcat) }, + writesToFilesConfiguration = bugReporter.createWriteToFilesConfiguration(), + logLevel = logLevel, + extraTargets = listOf(ELEMENT_X_TARGET), + traceLogPacks = runBlocking { preferencesStore.getTracingLogPacksFlow().first() }, + ) + bugReporter.setCurrentTracingLogLevel(logLevel.name) + platformService.init(tracingConfiguration) + // Also set env variable for rust back trace + Os.setenv("RUST_BACKTRACE", "1", true) + } + + override fun dependencies(): List>> = mutableListOf() +} diff --git a/app/src/main/kotlin/io/element/android/x/intent/DefaultIntentProvider.kt b/app/src/main/kotlin/io/element/android/x/intent/DefaultIntentProvider.kt new file mode 100644 index 0000000..0453fdf --- /dev/null +++ b/app/src/main/kotlin/io/element/android/x/intent/DefaultIntentProvider.kt @@ -0,0 +1,44 @@ +/* + * Copyright (c) 2025 Element Creations Ltd. + * Copyright 2023-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.x.intent + +import android.content.Context +import android.content.Intent +import android.os.Bundle +import androidx.core.net.toUri +import dev.zacsweers.metro.AppScope +import dev.zacsweers.metro.ContributesBinding +import io.element.android.libraries.deeplink.api.DeepLinkCreator +import io.element.android.libraries.di.annotations.ApplicationContext +import io.element.android.libraries.matrix.api.core.EventId +import io.element.android.libraries.matrix.api.core.RoomId +import io.element.android.libraries.matrix.api.core.SessionId +import io.element.android.libraries.matrix.api.core.ThreadId +import io.element.android.libraries.push.impl.intent.IntentProvider +import io.element.android.x.MainActivity + +@ContributesBinding(AppScope::class) +class DefaultIntentProvider( + @ApplicationContext private val context: Context, + private val deepLinkCreator: DeepLinkCreator, +) : IntentProvider { + override fun getViewRoomIntent( + sessionId: SessionId, + roomId: RoomId?, + threadId: ThreadId?, + eventId: EventId?, + extras: Bundle?, + ): Intent { + return Intent(context, MainActivity::class.java).apply { + action = Intent.ACTION_VIEW + data = deepLinkCreator.create(sessionId, roomId, threadId, eventId).toUri() + extras?.let(::putExtras) + } + } +} diff --git a/app/src/main/kotlin/io/element/android/x/intent/SafeUriHandler.kt b/app/src/main/kotlin/io/element/android/x/intent/SafeUriHandler.kt new file mode 100644 index 0000000..1e9af37 --- /dev/null +++ b/app/src/main/kotlin/io/element/android/x/intent/SafeUriHandler.kt @@ -0,0 +1,19 @@ +/* + * Copyright (c) 2025 Element Creations Ltd. + * Copyright 2023-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.x.intent + +import android.app.Activity +import androidx.compose.ui.platform.UriHandler +import io.element.android.libraries.androidutils.system.openUrlInExternalApp + +class SafeUriHandler(private val activity: Activity) : UriHandler { + override fun openUri(uri: String) { + activity.openUrlInExternalApp(uri) + } +} diff --git a/app/src/main/kotlin/io/element/android/x/oidc/DefaultOidcRedirectUrlProvider.kt b/app/src/main/kotlin/io/element/android/x/oidc/DefaultOidcRedirectUrlProvider.kt new file mode 100644 index 0000000..ad4f9a4 --- /dev/null +++ b/app/src/main/kotlin/io/element/android/x/oidc/DefaultOidcRedirectUrlProvider.kt @@ -0,0 +1,25 @@ +/* + * Copyright (c) 2025 Element Creations Ltd. + * Copyright 2025 New Vector Ltd. + * + * SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial. + * Please see LICENSE files in the repository root for full details. + */ + +package io.element.android.x.oidc + +import dev.zacsweers.metro.AppScope +import dev.zacsweers.metro.ContributesBinding +import io.element.android.libraries.matrix.api.auth.OidcRedirectUrlProvider +import io.element.android.services.toolbox.api.strings.StringProvider +import io.element.android.x.R + +@ContributesBinding(AppScope::class) +class DefaultOidcRedirectUrlProvider( + private val stringProvider: StringProvider, +) : OidcRedirectUrlProvider { + override fun provide() = buildString { + append(stringProvider.getString(R.string.login_redirect_scheme)) + append(":/") + } +} diff --git a/app/src/main/res/drawable/transparent.xml b/app/src/main/res/drawable/transparent.xml new file mode 100644 index 0000000..248ccbc --- /dev/null +++ b/app/src/main/res/drawable/transparent.xml @@ -0,0 +1,12 @@ + + + + + + diff --git a/app/src/main/res/resources.properties b/app/src/main/res/resources.properties new file mode 100644 index 0000000..8cbf8ea --- /dev/null +++ b/app/src/main/res/resources.properties @@ -0,0 +1,7 @@ +# Copyright (c) 2025 Element Creations Ltd. +# Copyright 2024 New Vector Ltd. +# +# SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial. +# Please see LICENSE files in the repository root for full details. + +unqualifiedResLocale=en diff --git a/app/src/main/res/values-night/themes.xml b/app/src/main/res/values-night/themes.xml new file mode 100644 index 0000000..af159a0 --- /dev/null +++ b/app/src/main/res/values-night/themes.xml @@ -0,0 +1,17 @@ + + + + + + + + diff --git a/app/src/main/res/xml/automotive_app_desc.xml b/app/src/main/res/xml/automotive_app_desc.xml new file mode 100644 index 0000000..c466692 --- /dev/null +++ b/app/src/main/res/xml/automotive_app_desc.xml @@ -0,0 +1,10 @@ + + + + diff --git a/app/src/main/res/xml/backup_rules.xml b/app/src/main/res/xml/backup_rules.xml new file mode 100644 index 0000000..06db4ae --- /dev/null +++ b/app/src/main/res/xml/backup_rules.xml @@ -0,0 +1,17 @@ + + + + + + + + + diff --git a/app/src/main/res/xml/data_extraction_rules.xml b/app/src/main/res/xml/data_extraction_rules.xml new file mode 100644 index 0000000..77b05d3 --- /dev/null +++ b/app/src/main/res/xml/data_extraction_rules.xml @@ -0,0 +1,27 @@ + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/xml/file_providers.xml b/app/src/main/res/xml/file_providers.xml new file mode 100644 index 0000000..ac74590 --- /dev/null +++ b/app/src/main/res/xml/file_providers.xml @@ -0,0 +1,10 @@ + + + + diff --git a/app/src/main/res/xml/locales_config.xml b/app/src/main/res/xml/locales_config.xml new file mode 100644 index 0000000..a92d7b2 --- /dev/null +++ b/app/src/main/res/xml/locales_config.xml @@ -0,0 +1,39 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/xml/network_security_config.xml b/app/src/main/res/xml/network_security_config.xml new file mode 100644 index 0000000..96add8d --- /dev/null +++ b/app/src/main/res/xml/network_security_config.xml @@ -0,0 +1,34 @@ + + + + + + + + + + + + + + + localhost + 127.0.0.1 + + 10.0.2.2 + + onion + + + + home.arpa + local + test + + home + lan + localdomain + + diff --git a/app/src/test/kotlin/io/element/android/x/intent/DefaultIntentProviderTest.kt b/app/src/test/kotlin/io/element/android/x/intent/DefaultIntentProviderTest.kt new file mode 100644 index 0000000..4598a74 --- /dev/null +++ b/app/src/test/kotlin/io/element/android/x/intent/DefaultIntentProviderTest.kt @@ -0,0 +1,70 @@ +/* + * Copyright (c) 2025 Element Creations Ltd. + * Copyright 2023-2025 New Vector Ltd. + * + * SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial. + * Please see LICENSE files in the repository root for full details. + */ + +@file:Suppress("SameParameterValue") + +package io.element.android.x.intent + +import android.content.Context +import android.content.Intent +import com.google.common.truth.Truth.assertThat +import io.element.android.libraries.deeplink.api.DeepLinkCreator +import io.element.android.libraries.matrix.api.core.EventId +import io.element.android.libraries.matrix.api.core.RoomId +import io.element.android.libraries.matrix.api.core.SessionId +import io.element.android.libraries.matrix.api.core.ThreadId +import io.element.android.libraries.matrix.test.AN_EVENT_ID +import io.element.android.libraries.matrix.test.A_ROOM_ID +import io.element.android.libraries.matrix.test.A_SESSION_ID +import io.element.android.libraries.matrix.test.A_THREAD_ID +import io.element.android.tests.testutils.lambda.lambdaRecorder +import io.element.android.tests.testutils.lambda.value +import io.element.android.x.MainActivity +import org.junit.Test +import org.junit.runner.RunWith +import org.robolectric.RobolectricTestRunner +import org.robolectric.RuntimeEnvironment + +@RunWith(RobolectricTestRunner::class) +class DefaultIntentProviderTest { + @Test + fun `test getViewRoomIntent with data`() { + val deepLinkCreator = lambdaRecorder { _, _, _, _ -> "deepLinkCreatorResult" } + val sut = createDefaultIntentProvider( + deepLinkCreator = { sessionId, roomId, threadId, eventId -> deepLinkCreator.invoke(sessionId, roomId, threadId, eventId) }, + ) + val result = sut.getViewRoomIntent( + sessionId = A_SESSION_ID, + roomId = A_ROOM_ID, + threadId = A_THREAD_ID, + eventId = AN_EVENT_ID, + ) + result.commonAssertions() + assertThat(result.data.toString()).isEqualTo("deepLinkCreatorResult") + deepLinkCreator.assertions().isCalledOnce().with( + value(A_SESSION_ID), + value(A_ROOM_ID), + value(A_THREAD_ID), + value(AN_EVENT_ID), + ) + } + + private fun createDefaultIntentProvider( + deepLinkCreator: DeepLinkCreator = DeepLinkCreator { _, _, _, _ -> "" }, + ): DefaultIntentProvider { + return DefaultIntentProvider( + context = RuntimeEnvironment.getApplication() as Context, + deepLinkCreator = deepLinkCreator, + ) + } + + private fun Intent.commonAssertions() { + assertThat(action).isEqualTo(Intent.ACTION_VIEW) + assertThat(component?.className).isEqualTo(MainActivity::class.java.name) + } +} diff --git a/app/src/test/kotlin/io/element/android/x/oidc/DefaultOidcRedirectUrlProviderTest.kt b/app/src/test/kotlin/io/element/android/x/oidc/DefaultOidcRedirectUrlProviderTest.kt new file mode 100644 index 0000000..1856735 --- /dev/null +++ b/app/src/test/kotlin/io/element/android/x/oidc/DefaultOidcRedirectUrlProviderTest.kt @@ -0,0 +1,29 @@ +/* + * Copyright (c) 2025 Element Creations Ltd. + * Copyright 2025 New Vector Ltd. + * + * SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial. + * Please see LICENSE files in the repository root for full details. + */ + +package io.element.android.x.oidc + +import com.google.common.truth.Truth.assertThat +import io.element.android.services.toolbox.test.strings.FakeStringProvider +import io.element.android.x.R +import org.junit.Test + +class DefaultOidcRedirectUrlProviderTest { + @Test + fun `test provide`() { + val stringProvider = FakeStringProvider( + defaultResult = "str" + ) + val sut = DefaultOidcRedirectUrlProvider( + stringProvider = stringProvider, + ) + val result = sut.provide() + assertThat(result).isEqualTo("str:/") + assertThat(stringProvider.lastResIdParam).isEqualTo(R.string.login_redirect_scheme) + } +} diff --git a/appconfig/build.gradle.kts b/appconfig/build.gradle.kts new file mode 100644 index 0000000..45496ac --- /dev/null +++ b/appconfig/build.gradle.kts @@ -0,0 +1,53 @@ +import config.BuildTimeConfig +import extension.buildConfigFieldStr + +/* + * Copyright (c) 2025 Element Creations Ltd. + * Copyright 2022-2024 New Vector Ltd. + * + * SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial. + * Please see LICENSE files in the repository root for full details. + */ +plugins { + id("io.element.android-library") +} + +android { + namespace = "io.element.android.appconfig" + + buildFeatures { + buildConfig = true + } + + defaultConfig { + buildConfigFieldStr( + name = "URL_POLICY", + value = if (isEnterpriseBuild) { + BuildTimeConfig.URL_POLICY ?: "" + } else { + "https://element.io/cookie-policy" + }, + ) + buildConfigFieldStr( + name = "BUG_REPORT_URL", + value = if (isEnterpriseBuild) { + BuildTimeConfig.BUG_REPORT_URL ?: "" + } else { + "https://rageshakes.element.io/api/submit" + }, + ) + buildConfigFieldStr( + name = "BUG_REPORT_APP_NAME", + value = if (isEnterpriseBuild) { + BuildTimeConfig.BUG_REPORT_APP_NAME ?: "" + } else { + "element-x-android" + }, + ) + } +} + +dependencies { + implementation(libs.androidx.annotationjvm) + implementation(projects.libraries.matrix.api) +} diff --git a/appconfig/src/main/kotlin/io/element/android/appconfig/AnalyticsConfig.kt b/appconfig/src/main/kotlin/io/element/android/appconfig/AnalyticsConfig.kt new file mode 100644 index 0000000..e32e482 --- /dev/null +++ b/appconfig/src/main/kotlin/io/element/android/appconfig/AnalyticsConfig.kt @@ -0,0 +1,13 @@ +/* + * Copyright (c) 2025 Element Creations Ltd. + * Copyright 2023-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.appconfig + +object AnalyticsConfig { + const val POLICY_LINK = BuildConfig.URL_POLICY +} diff --git a/appconfig/src/main/kotlin/io/element/android/appconfig/ApplicationConfig.kt b/appconfig/src/main/kotlin/io/element/android/appconfig/ApplicationConfig.kt new file mode 100644 index 0000000..e1ae689 --- /dev/null +++ b/appconfig/src/main/kotlin/io/element/android/appconfig/ApplicationConfig.kt @@ -0,0 +1,35 @@ +/* + * Copyright (c) 2025 Element Creations Ltd. + * Copyright 2023-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.appconfig + +object ApplicationConfig { + /** + * Application name used in the UI for string. If empty, the value is taken from the resources `R.string.app_name`. + * Note that this value is not used for the launcher icon. + * For Element, the value is empty, and so read from `R.string.app_name`, which depends on the build variant: + * - "Element X" for release builds; + * - "Element X dbg" for debug builds; + * - "Element X nightly" for nightly builds. + */ + const val APPLICATION_NAME: String = "" + + /** + * Used in the strings to reference the Element client. + * Cannot be empty. + * For Element, the value is "Element". + */ + const val PRODUCTION_APPLICATION_NAME: String = "Element" + + /** + * Used in the strings to reference the Element Desktop client, for instance Element Web. + * Cannot be empty. + * For Element, the value is "Element". We use the same name for desktop and mobile for now. + */ + const val DESKTOP_APPLICATION_NAME: String = "Element" +} diff --git a/appconfig/src/main/kotlin/io/element/android/appconfig/AuthenticationConfig.kt b/appconfig/src/main/kotlin/io/element/android/appconfig/AuthenticationConfig.kt new file mode 100644 index 0000000..7432a69 --- /dev/null +++ b/appconfig/src/main/kotlin/io/element/android/appconfig/AuthenticationConfig.kt @@ -0,0 +1,23 @@ +/* + * Copyright (c) 2025 Element Creations Ltd. + * Copyright 2023-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.appconfig + +object AuthenticationConfig { + const val MATRIX_ORG_URL = "https://matrix.org" + + /** + * URL with some docs that explain what's sliding sync and how to add it to your home server. + */ + const val SLIDING_SYNC_READ_MORE_URL = "https://github.com/matrix-org/sliding-sync/blob/main/docs/Landing.md" + + /** + * Force a sliding sync proxy url, if not null, the proxy url in the .well-known file will be ignored. + */ + val SLIDING_SYNC_PROXY_URL: String? = null +} diff --git a/appconfig/src/main/kotlin/io/element/android/appconfig/ElementCallConfig.kt b/appconfig/src/main/kotlin/io/element/android/appconfig/ElementCallConfig.kt new file mode 100644 index 0000000..ea4c264 --- /dev/null +++ b/appconfig/src/main/kotlin/io/element/android/appconfig/ElementCallConfig.kt @@ -0,0 +1,16 @@ +/* + * Copyright (c) 2025 Element Creations Ltd. + * Copyright 2023-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.appconfig + +object ElementCallConfig { + /** + * The default duration of a ringing call in seconds before it's automatically dismissed. + */ + const val RINGING_CALL_DURATION_SECONDS = 90 +} diff --git a/appconfig/src/main/kotlin/io/element/android/appconfig/LearnMoreConfig.kt b/appconfig/src/main/kotlin/io/element/android/appconfig/LearnMoreConfig.kt new file mode 100644 index 0000000..c0c1521 --- /dev/null +++ b/appconfig/src/main/kotlin/io/element/android/appconfig/LearnMoreConfig.kt @@ -0,0 +1,16 @@ +/* + * Copyright (c) 2025 Element Creations Ltd. + * Copyright 2023-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.appconfig + +object LearnMoreConfig { + const val ENCRYPTION_URL: String = "https://element.io/help#encryption" + const val DEVICE_VERIFICATION_URL: String = "https://element.io/help#encryption-device-verification" + const val SECURE_BACKUP_URL: String = "https://element.io/help#encryption5" + const val IDENTITY_CHANGE_URL: String = "https://element.io/help#encryption18" +} diff --git a/appconfig/src/main/kotlin/io/element/android/appconfig/LockScreenConfig.kt b/appconfig/src/main/kotlin/io/element/android/appconfig/LockScreenConfig.kt new file mode 100644 index 0000000..f2ef0bc --- /dev/null +++ b/appconfig/src/main/kotlin/io/element/android/appconfig/LockScreenConfig.kt @@ -0,0 +1,35 @@ +/* + * Copyright (c) 2025 Element Creations Ltd. + * Copyright 2023-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.appconfig + +import kotlin.time.Duration +import kotlin.time.Duration.Companion.minutes + +object LockScreenConfig { + /** Whether the PIN is mandatory or not. */ + const val IS_PIN_MANDATORY: Boolean = false + + /** Set of forbidden PIN codes. */ + val FORBIDDEN_PIN_CODES: Set = setOf("0000", "1234") + + /** The size of the PIN. */ + const val PIN_SIZE: Int = 4 + + /** Number of attempts before the user is logged out. */ + const val MAX_PIN_CODE_ATTEMPTS_BEFORE_LOGOUT: Int = 3 + + /** Time period before locking the app once backgrounded. */ + val GRACE_PERIOD: Duration = 2.minutes + + /** Authentication with strong methods (fingerprint, some face/iris unlock implementations) is supported. */ + const val IS_STRONG_BIOMETRICS_ENABLED: Boolean = true + + /** Authentication with weak methods (most face/iris unlock implementations) is supported. */ + const val IS_WEAK_BIOMETRICS_ENABLED: Boolean = true +} diff --git a/appconfig/src/main/kotlin/io/element/android/appconfig/MatrixConfiguration.kt b/appconfig/src/main/kotlin/io/element/android/appconfig/MatrixConfiguration.kt new file mode 100644 index 0000000..76b96bf --- /dev/null +++ b/appconfig/src/main/kotlin/io/element/android/appconfig/MatrixConfiguration.kt @@ -0,0 +1,14 @@ +/* + * Copyright (c) 2025 Element Creations Ltd. + * Copyright 2023-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.appconfig + +object MatrixConfiguration { + const val MATRIX_TO_PERMALINK_BASE_URL: String = "https://matrix.to/#/" + val clientPermalinkBaseUrl: String? = null +} diff --git a/appconfig/src/main/kotlin/io/element/android/appconfig/MessageComposerConfig.kt b/appconfig/src/main/kotlin/io/element/android/appconfig/MessageComposerConfig.kt new file mode 100644 index 0000000..f3893f0 --- /dev/null +++ b/appconfig/src/main/kotlin/io/element/android/appconfig/MessageComposerConfig.kt @@ -0,0 +1,16 @@ +/* + * Copyright (c) 2025 Element Creations Ltd. + * Copyright 2024, 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.appconfig + +object MessageComposerConfig { + /** + * Enable the rich text editing in the composer. + */ + const val ENABLE_RICH_TEXT_EDITING = true +} diff --git a/appconfig/src/main/kotlin/io/element/android/appconfig/NotificationConfig.kt b/appconfig/src/main/kotlin/io/element/android/appconfig/NotificationConfig.kt new file mode 100644 index 0000000..cac2f8a --- /dev/null +++ b/appconfig/src/main/kotlin/io/element/android/appconfig/NotificationConfig.kt @@ -0,0 +1,32 @@ +/* + * Copyright (c) 2025 Element Creations Ltd. + * Copyright 2023-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.appconfig + +import androidx.annotation.ColorInt +import androidx.core.graphics.toColorInt + +object NotificationConfig { + /** + * If set to true, the notification will have a "Mark as read" action. + */ + const val SHOW_MARK_AS_READ_ACTION = true + + /** + * If set to true, the notification for invitation will have two actions to accept or decline the invite. + */ + const val SHOW_ACCEPT_AND_DECLINE_INVITE_ACTIONS = true + + /** + * If set to true, the notification will have a "Quick reply" action, allow to compose and send a message to the room. + */ + const val SHOW_QUICK_REPLY_ACTION = true + + @ColorInt + val NOTIFICATION_ACCENT_COLOR: Int = "#FF0DBD8B".toColorInt() +} diff --git a/appconfig/src/main/kotlin/io/element/android/appconfig/OnBoardingConfig.kt b/appconfig/src/main/kotlin/io/element/android/appconfig/OnBoardingConfig.kt new file mode 100644 index 0000000..c59f5d1 --- /dev/null +++ b/appconfig/src/main/kotlin/io/element/android/appconfig/OnBoardingConfig.kt @@ -0,0 +1,14 @@ +/* + * Copyright (c) 2025 Element Creations Ltd. + * Copyright 2024, 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.appconfig + +object OnBoardingConfig { + /** Whether the user can create an account using the app. */ + const val CAN_CREATE_ACCOUNT = true +} diff --git a/appconfig/src/main/kotlin/io/element/android/appconfig/PushConfig.kt b/appconfig/src/main/kotlin/io/element/android/appconfig/PushConfig.kt new file mode 100644 index 0000000..d36fb74 --- /dev/null +++ b/appconfig/src/main/kotlin/io/element/android/appconfig/PushConfig.kt @@ -0,0 +1,16 @@ +/* + * Copyright (c) 2025 Element Creations Ltd. + * Copyright 2023-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.appconfig + +object PushConfig { + /** + * Note: pusher_app_id cannot exceed 64 chars. + */ + const val PUSHER_APP_ID: String = "im.vector.app.android" +} diff --git a/appconfig/src/main/kotlin/io/element/android/appconfig/RageshakeConfig.kt b/appconfig/src/main/kotlin/io/element/android/appconfig/RageshakeConfig.kt new file mode 100644 index 0000000..1f6609e --- /dev/null +++ b/appconfig/src/main/kotlin/io/element/android/appconfig/RageshakeConfig.kt @@ -0,0 +1,28 @@ +/* + * Copyright (c) 2025 Element Creations Ltd. + * Copyright 2024, 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.appconfig + +object RageshakeConfig { + /** + * The URL to submit bug reports to. + */ + const val BUG_REPORT_URL = BuildConfig.BUG_REPORT_URL + + /** + * As per https://github.com/matrix-org/rageshake: + * Identifier for the application (eg 'riot-web'). + * Should correspond to a mapping configured in the configuration file for github issue reporting to work. + */ + const val BUG_REPORT_APP_NAME = BuildConfig.BUG_REPORT_APP_NAME + + /** + * The maximum size of the upload request. Default value is just below CloudFlare's max request size. + */ + const val MAX_LOG_UPLOAD_SIZE = 50 * 1024 * 1024L +} diff --git a/appconfig/src/main/kotlin/io/element/android/appconfig/RoomListConfig.kt b/appconfig/src/main/kotlin/io/element/android/appconfig/RoomListConfig.kt new file mode 100644 index 0000000..7369f13 --- /dev/null +++ b/appconfig/src/main/kotlin/io/element/android/appconfig/RoomListConfig.kt @@ -0,0 +1,16 @@ +/* + * Copyright (c) 2025 Element Creations Ltd. + * Copyright 2023-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.appconfig + +object RoomListConfig { + const val SHOW_INVITE_MENU_ITEM = false + const val SHOW_REPORT_PROBLEM_MENU_ITEM = false + + const val HAS_DROP_DOWN_MENU = SHOW_INVITE_MENU_ITEM || SHOW_REPORT_PROBLEM_MENU_ITEM +} diff --git a/appconfig/src/main/kotlin/io/element/android/appconfig/TimelineConfig.kt b/appconfig/src/main/kotlin/io/element/android/appconfig/TimelineConfig.kt new file mode 100644 index 0000000..539b678 --- /dev/null +++ b/appconfig/src/main/kotlin/io/element/android/appconfig/TimelineConfig.kt @@ -0,0 +1,35 @@ +/* + * Copyright (c) 2025 Element Creations Ltd. + * Copyright 2023-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.appconfig + +import io.element.android.libraries.matrix.api.room.StateEventType + +object TimelineConfig { + const val MAX_READ_RECEIPT_TO_DISPLAY = 3 + + /** + * Event types that will be filtered out from the timeline (i.e. not displayed). + */ + val excludedEvents = listOf( + StateEventType.CALL_MEMBER, + StateEventType.ROOM_ALIASES, + StateEventType.ROOM_CANONICAL_ALIAS, + StateEventType.ROOM_GUEST_ACCESS, + StateEventType.ROOM_HISTORY_VISIBILITY, + StateEventType.ROOM_JOIN_RULES, + StateEventType.ROOM_POWER_LEVELS, + StateEventType.ROOM_SERVER_ACL, + StateEventType.ROOM_TOMBSTONE, + StateEventType.SPACE_CHILD, + StateEventType.SPACE_PARENT, + StateEventType.POLICY_RULE_ROOM, + StateEventType.POLICY_RULE_SERVER, + StateEventType.POLICY_RULE_USER, + ) +} diff --git a/appconfig/src/main/kotlin/io/element/android/appconfig/VoiceMessageConfig.kt b/appconfig/src/main/kotlin/io/element/android/appconfig/VoiceMessageConfig.kt new file mode 100644 index 0000000..b77b2dc --- /dev/null +++ b/appconfig/src/main/kotlin/io/element/android/appconfig/VoiceMessageConfig.kt @@ -0,0 +1,15 @@ +/* + * Copyright (c) 2025 Element Creations Ltd. + * Copyright 2023-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.appconfig + +import kotlin.time.Duration.Companion.minutes + +object VoiceMessageConfig { + val maxVoiceMessageDuration = 30.minutes +} diff --git a/appicon/element/build.gradle.kts b/appicon/element/build.gradle.kts new file mode 100644 index 0000000..23c21d4 --- /dev/null +++ b/appicon/element/build.gradle.kts @@ -0,0 +1,18 @@ +/* + * Copyright (c) 2025 Element Creations Ltd. + * Copyright 2024, 2025 New Vector Ltd. + * + * SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial. + * Please see LICENSE files in the repository root for full details. + */ +plugins { + id("io.element.android-compose-library") +} + +android { + namespace = "io.element.android.appicon.element" + + buildTypes { + register("nightly") + } +} diff --git a/appicon/element/src/debug/res/drawable/ic_launcher_background.xml b/appicon/element/src/debug/res/drawable/ic_launcher_background.xml new file mode 100644 index 0000000..d414479 --- /dev/null +++ b/appicon/element/src/debug/res/drawable/ic_launcher_background.xml @@ -0,0 +1,10 @@ + + + diff --git a/appicon/element/src/main/ic_launcher-playstore.png b/appicon/element/src/main/ic_launcher-playstore.png new file mode 100644 index 0000000000000000000000000000000000000000..325bf570f53b0caef40c45fcf76951a119e25e64 GIT binary patch literal 100546 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

    ijLs)m_DcJO|5H0w@aCe?rNdNDh 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 + + + + + diff --git a/appicon/element/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml b/appicon/element/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml new file mode 100644 index 0000000..9de193b --- /dev/null +++ b/appicon/element/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml @@ -0,0 +1,12 @@ + + + + + + diff --git a/appicon/element/src/main/res/mipmap-hdpi/ic_launcher.webp b/appicon/element/src/main/res/mipmap-hdpi/ic_launcher.webp new file mode 100644 index 0000000000000000000000000000000000000000..2ae0da8d0fe1daa861e1c19b9eef1709c8b5ce0f GIT binary patch literal 2558 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 E1bts>^Z)<= literal 0 HcmV?d00001 diff --git a/appicon/element/src/main/res/mipmap-hdpi/ic_launcher_monochrome.webp b/appicon/element/src/main/res/mipmap-hdpi/ic_launcher_monochrome.webp new file mode 100644 index 0000000000000000000000000000000000000000..bcc8059674554b49e2b467f74b78b68fcbc33711 GIT binary patch literal 1426 zcmV;D1#S9LNk&GB1pok7MM6+kP&iC}1pojqp+G1QALbyEWLN2ZpXdS!NWi}oB&7Q} zNC*dQBT14o`%_sI#~;i=*mfLAlA|0~7Xsx1#^MHk!C$_$nz))t8fLE__lMI?qAe1T z07$g;#Kp%%9YSiwM3EFlQ6x!HB!whNAW}$DBvOcoJqi60W6qp81O{Nu8dw)tv*%-O z7%xObLIuE!P)i_UPeii-deZ?kUjj8DBKAboABkRIpG0c827w`<2j2pq_rjjoi(d5f zEt)yKHb5UeeH;;E-meaz=G{-%?f2@?v$FEP{A@lnm(%xuhx+J=__5Yv02dsGF z>7iY_wmnV6tw8HTzqVmsF9Tf~p?Mpw>8*%hGE$9{tSXY!TL&GZ_2^+;^osgo-%Rw_ zoEcM_wZ=pr8dEdXWk0DwpH{!J71g$xp>Nr&wo1C$guV_xQqai~^m*}X{&>? z9h^TLS-|M9*;c_TM%FC_KvptL$DSx4vl_`Sxc~^R&7r~?OMX+4ev0h|;Bhe(u905M z@Bo)>d3O3rAO&12r!r%*n~7fMH2u2g1ZN6}@SEhWn4TeGkLleUU@IdsJIXDJ^rgcl zMgRL&fPDWJ2YU<=My00LQB_a776ksR!C~zk4q_%zeNbjeq-{LZ22xLOz{d9+OeMmk z%pxTD|7L*ODNZ1UMI@$IQPiFR*PlWu*jo;k5moE*y2c24wSdb{ZEuai)I&9H zI}u)!*9H{t`2d_VPOJ!*6=tK$oQK?9stxj*CuUv%M}1Efif`h&FX4&}p?T5@gv7Rj zFfOZv&`6DIUx&n{768}-Ft;;zKqMinr$R3Q0JI2_&-e=3PKK4AxL+bq zWwlMDvKx0bj}H4y9+r(b1o()^AzAGb83+6-^n4ws4HVg>h}~S9M$dAta_>z=91?lM zwJ^kfhhI-%bfY!y7>aI_)l-qH+$qE+3&5U9_Rj?X0Bw}eQ&}ZMI&nJ?_W}SsWJGK) z@bNsMgskEs54lZiHZ*gjn^@cHkHokK*${+8c<`&zC0f(t8{rmgs3co z%bK4e;U;VQ5+sd)#FIq0frCp8P8(8ve%c?2lQIj|6IHzDprz5Fu!zEwkoZ1#IMkff{5lpj1{REXsp zGF==eV<$m@b~7Df#grSL96l~2n`Ns2+BSKBh?T>qY}~T9FH(owf*NlYd*X5NBT(hZ zymZNb4eH#=(t{lYmF{Qh!1jY$59a$XZ!4(wb+O-yPl9?Mh5glZ6I9%G7V{5lZVPI* zPgeV-=7|l;&YWua!CYg3(ql7Cugq^TQ2v!@ofq}dj?gO9laVS$QXNSKq4lU=+b}O= gxG{Ro+i*>XR%gJ9C!TKGwd>H+MBEC%U;qF4JK9H~_y7O^ literal 0 HcmV?d00001 diff --git a/appicon/element/src/main/res/mipmap-hdpi/ic_launcher_round.webp b/appicon/element/src/main/res/mipmap-hdpi/ic_launcher_round.webp new file mode 100644 index 0000000000000000000000000000000000000000..8ad6b7490122b054e634c0782d2cb54bde978c41 GIT binary patch literal 4112 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 I7!KbW0D60ub^rhX literal 0 HcmV?d00001 diff --git a/appicon/element/src/main/res/mipmap-mdpi/ic_launcher_monochrome.webp b/appicon/element/src/main/res/mipmap-mdpi/ic_launcher_monochrome.webp new file mode 100644 index 0000000000000000000000000000000000000000..62e0fb81a76cf7b4a5197490ce2573a0dc14ea82 GIT binary patch literal 946 zcmV;j15Nx=Nk&Gh0{{S5MM6+kP&iDT0{{RoYrq;1&%`#8BqzOBxcC&&kbg+(&^d(D zMv^2cvKQ}t@T@uiEjl#qxVCL40WRij(H3SUj+`d)UH`l%AW3jQ?VzGwej4v}QjL;O zQrgvY@Ubf74?+9_KoaEV0e&kKppXQCNrD0-U;t2qG53(uoxn^0YM8JR@VT`*D2CI7 z;RM({LLr1=$J%ZXI!zc(zZ2@rnDYst5bMyn8^k)~dI5CP32~yM;~0kjsm>{sdD0cy zo6e5vZ~;I|le56|dCXrxZQHiBZF9XUw}w4Z3R0PwnOSA#fW0y^gUih9`1e|VA35*) zd5h@(1n@r_``2z<>pXpGhGl%cDx|%EcnY*wW;GJ3pNAO5;Ez?TzZjAHgnZe;WA0q|z66H9S$5zInh8ry|Yg6DJODnvz3w z$_LLsh;mE;ptoyk$1Cakz-R!E-FryoxM zo__$y{dOiY9exfz6a>K<~vF zV%hNw?ubMSMqA8xsTf;?*MaBD#r`A=7#^PF?Z;Mee}`&fxfU2WPn5@@U-A*y(@JU% z-LMEBfY~V8t%e)nQs9@x4Tnx!%xu8@NENP0$I52ltHm{kIxThr-z47?z#NNChpt&1 z1!l>LD?3Bg^b*{PEKWOg!{RIi(Ztu7FPiWy@LMczI8?JZ2ZLo1uwV1Xz|aXcHHZ4g ztrp%IxJjlNIBGZYumQG+Wn6TK1+7Fvk&&<9rp@>*?*Xog?E+j*ZJN6w_>?i`(xba2 zn$M1~N}cM|q`=jTgJcKw4zccZs*or~zktTNrt=y9JX#|5Nx><$D`YoNTqPp2Zw`I; zc<)@%Zp7`XrsE+{u8)zttB#rF3i)swV9=5Ei>KtV!Z=1HRLJCeWShUbu!8eDG!h>w zXD~qb)wuWkgGOY|g%?ddst?cc;HgL@GGfWrKR?E4qEmSBKo0rV@nd6GpGb`-2+}^V zE5Mtk9msKD6b-DLni9YnWTO<2l|nl@&QHui#}<-I%D7?Nx)f3!UkLxJA4m U?JVH?V(rH1&TBVn{rT_z05u`l{r~^~ literal 0 HcmV?d00001 diff --git a/appicon/element/src/main/res/mipmap-mdpi/ic_launcher_round.webp b/appicon/element/src/main/res/mipmap-mdpi/ic_launcher_round.webp new file mode 100644 index 0000000000000000000000000000000000000000..3cd52b2182f60118c999a6e112e6a2f9368b9812 GIT binary patch literal 2590 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 AmH+?% literal 0 HcmV?d00001 diff --git a/appicon/element/src/main/res/mipmap-xhdpi/ic_launcher.webp b/appicon/element/src/main/res/mipmap-xhdpi/ic_launcher.webp new file mode 100644 index 0000000000000000000000000000000000000000..527b23880ad055355eb090f984d78cb49c720815 GIT binary patch literal 3700 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 S{zdP$J&VBum^i3$=@I}iJqbGi literal 0 HcmV?d00001 diff --git a/appicon/element/src/main/res/mipmap-xhdpi/ic_launcher_foreground.webp b/appicon/element/src/main/res/mipmap-xhdpi/ic_launcher_foreground.webp new file mode 100644 index 0000000000000000000000000000000000000000..f8c5c5f218aa78397390b774cf878ca8ba5fcab0 GIT binary patch literal 10464 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 WON*Jv{gZeQte&m#{|f(~igo~&e(Dqe literal 0 HcmV?d00001 diff --git a/appicon/element/src/main/res/mipmap-xhdpi/ic_launcher_monochrome.webp b/appicon/element/src/main/res/mipmap-xhdpi/ic_launcher_monochrome.webp new file mode 100644 index 0000000000000000000000000000000000000000..d7c1ffcc724987668e345b0c8184c57571750d0a GIT binary patch literal 1950 zcmV;P2VwY9Nk&GN2LJ$9MM6+kP&iDA2LJ#s*T6LpKLJVeWux7*36iNmt0Hgu2U?wI5D3AfP1OTl7k^~bPh&0efGN25I z7$UNCpA3ElB2Al0+ZrsP9#^dOj1Dmr!%z%I9Pu+gmp66&8SmTZ%HmVhx&v8DGMK7= zA_I^$C`kkf2of>PeIICmM3CBGQu>82g?|wbT3T9UKphZeC>hFL)C+I~j%!z#IX=Fd z!~0YC-?nXS8*SSTsh4wInG8d@^)<{hW#-l?Gc$8jHx~^v*-n|6nVpoujbckW%FLBR z*Jb}9IVGKk?DM?lw?y=R0-)Cawf?X5|DV*pxo>_xpxeE0BoYq%+-CTjZ&dsrpwu0a zzoA$|m!;8-y+_nlB+mMxbsDx(Qcy37)Q`b!`QWo;Sdu3J)_o+87PZxsdeZxb^z5apy+-*QK>BBs2uBM} z-RPZ~C%Vs9Y#{lNYKtniY3TKH{VHsrY8Mes7u!-Vm}d`eU$-vGLfq281{!Nb%Y^p4 zPIhwfH(%tI13*=W1PhOUVFN!A>CcO-FVdQ8#stAW9k9X6uh>)-(_njnS^G%L)zejQ z+$e5?#|l_5i0GLmt}k?oqmwLfnHRIeM;0r1nMVIYTpf|W5ekCq_YDW;I2QDv!H&XG zuJSAU)&ke%YtZSzN>&q-W``oGx-o9r=istDC;0XabZm}gRUD*=)fLqUVlr`Vl1T%BpW5;=VZwq&~aEqu3{=7fSiWrvh71Qs+Okk$(BYBrJ0939<#7?XibspWs6yS2Kob^r_ zT_W`N`X6sXL>$L@&*X7WOkpm+15*j17Y)tCny<5(BhRpyB3wqY7M6O#c3+CslS@Pz z63?@Sp_lsrQ`s#KVIHRy)}0z*A9UzM?0A}hcpP$7vfJcb+FGO6Y)PP1NQQ}ize~{qQMogdc zxW)P}BHjV!bC+n$E@_s!8u<fy1%W@W)8IfG_-Zc;^?UyMv)>u{{o+F= zlIzcl43-gHoNWWSVV&XWr6Ba_MEG=(4XBfznqHeGHgyXTKCEK{P-pa#n5QLj0rLfvq*j@WQ&3=)fPR!W9c$0sQKL_*)?S^nEhC z@^(BQ8Azd8-jMz&a92(p>8JUiUT0r@NpnOWer4`eji!^||}mn6ukGDOQPt%U;8 z>OYi8hx{P31ra?{^rBplTeVp z3M5*cwp90qzHGV*vi*GDeL9u?to`#K<<_i@S7ZEQJ37v?K;D(QBYSU*mb%f3H{_43 ktAPAhyzu7mHa`c#kx2Mnw*jBOIoAiZ{;&0at^fa|2J0flqyPW_ literal 0 HcmV?d00001 diff --git a/appicon/element/src/main/res/mipmap-xhdpi/ic_launcher_round.webp b/appicon/element/src/main/res/mipmap-xhdpi/ic_launcher_round.webp new file mode 100644 index 0000000000000000000000000000000000000000..1c98f35c9f51d114ef94c873487f866b9af4b8bf GIT binary patch literal 6018 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

    c{zJT*3HcQc!JVC6-k zy^5mzfkdkJfAM23|4r3E(-VqmcwQ=iY_$jw?6+H5K~{yhG3?4a;gY#|V?omJJgN*H z(i4pYNqC+B;15<)*&JP)wacr%p3369zFz%dB9@;mUly94@wYdE?2fp@T+926`-Fpy&1q56Bv2jML*a488|L=rh`oQ=zt;jE9d z-kk;XT6(0K8j4A(^t4Dz3osmzv#NB)`c42i zMyT8gx4=*n!W1g%fF<$3cwg`~=56s`b*v!(m;ebNDJj@l{qht@Bmq+ZNd}t2{9!vb zoQ%W_2!H79aj|27yOD4?QU(YP2}nvJ4e5mU0gWRrzL-F5*f4B7;xHy zlq*}R0SF0_;8G!h8EOgAHGccd)R60eiTt$E+Q5ZD*T4PvObB^^Q&=Xpa)zX&9dC~< zK}}5&?2K6+r-3p{ZB*0^W7x9fe=zR&|Hns>k1Lue40;j(3zDcI7I`}*7e_3Tz-hp_ z`5@ZZ2x_u;`6BZHojkG3J=0B*$CPtv2YMW3ODhKin%n{Syx$n6#V6n!kQ4*W=A|cjc8Y z==E?fJc$YY%ITY*`}FB6d-4Ljk)tPFyLIb+yzbUDCVu^b zKA!ZX;M=@~fOZ14qbU5R@VD@5@)UlbGap6ab>S`Z$ug(nL*dm(+QQFbcPCGeCxs7f z;oreg2&8JqOx&tn%nLyr{JijIwdd|vJUp3Bl4&8h#Irqjc{QCM9IKPUkJ3$XF`XRK zi)}T`6~3IDGs5}x`5u>gITKu*pReWd_TWD?)pv){pQKZ zvYh}+DDk|<(&gdcyzp(hnjajr6rv09g^)``mvI`4TfP^WMX^0X=7(Hc#qVODcIsJ` zuJ^Ld%X~gBe4R7uLPQ~|5PR|%f|nKX70DL`hy8hv*F8R-Kggf+!sqMr`H1GHh44b; zFZ}0{#}LTj{~-S;{JZ}0mtUVV>g8!6v=H`_r!QWf9D3*H&wS>a-tOQeE4Yt!U(C=Y*b3fAZ8;R}nP-|1~Ir?4hd8 z6X%x0!I5lRwbEaJ?|&8U-1(1+kkFmLjU?Nu(zv_5=$A$~AJ_dahmeTs{{-L{&|HQt zXnv07f1pT8kfJDR(#n`F}lfJAgU$anDB@UxE|ePNL2O!3{8 zLDbYqBq>B>fZcCOXAlv^01A;MB7j(!Qu+cxWT`0vgUI)>$Pz?>5RX*oy~Mb(HH zL=5tIN+N(EnG%S=u}Dkn5yb%v2DC)|=o5iJ<^Vv;=c!iIdVQaQQwM3qtw*E<0P@xp zoIC-N1bq=}-}>XAPez`G6#&w?WKIWTUs%0Xc};J9@msxKFCVX$FkVv3K?gvA&w*c}%4|HbaG*d0oW1W7Ut0rn?Jf&>UUn19KTU~i`* z*mU85A}NZZxTbT$0oXW6k^~6yQ3t=M>OkAJZ7lu&b*jzt6a`k<6f&nHkiAD;rMPvgunWdu|}qrtPRWmZyS!>_(Q29hV-n zbO{-?vY#h+FgBcYnA|VSuy$k7GTD`3_}h|WPvog!$FALL2y@!T9y{`X7r6nBq@^p! z6_lI{I6BlabZBfiQ4Ad(-M6svgpwr6{keLe5@ z$xDMLqX#1BfvTtjDiA68|=sYTLGL#avo%lVQMOkWgP%EC-iC zOI$|qX68Mh_g1s7Yunbg*|u%lk3-TS8DvPojmwuaVtVsunZ|? zD48jmh_)0_;#vk@*p^r+26N=D*{0h4yE4;KM2cymWih+UyKQYmu9;@9xI_y_bOG&_ zD|VSoW67nmk@|ciO@*GSDxg+S#)dLR<>nxeKrQ67eGV_v_M4Wl~4k0ka-!T zG~g1s{w{k0xaR*aO_DYz;@!~53;80?S0*|ZXy5neeL6vA^}Hs0VabK{U0NF*D%v*u z;SmiNj&_v|TI~qYLmLJ?blQcXZGo0Ul76?$ zjU?N(()%SE5A)}r7zto$W&!}&kpGALKji-*{}1_p$p3c=kw34v#h?99+*WN|Y*f+A zP&V#RD#uJ*+R2=pB{+*;#yS0uKbr^fU<%*HxV7&;*;8`frQM5Qy^EdD45AmRQ3OH= z8Uto12?dhKOo&O0iX|ctq1w6(JDO-ll|il9GynZ&2>62?7kT@$apv#XjO88aX^+G^ ztgQ%zjv_kHCDDP#>!RsCfDM=h!kk5bIVJ1^1nz!r2aSl2 z)HH>thIX1}XR}^0t2TkD})MIo5mt{g9Fc35bFwcryG0-~>I( z`Y`yOi@yw+KKpkAF$e*MP`JnqRDc1pAsAX0uKm)aF6PdDc{aZ^yGZsXDG0281n}oU z_9)=qiRf8L?)#PdXZUOqc!Lc$^)+*c^I^9eKY(|*yoO4HBrB=sA@p%UzhM1R;tsRG zma3dUga^$Am=hKkFlri-MdCFVsHSQI*-#oxl+h*INJ^8GlI%!!|BC2$utIT>JjHgk zJac)c7tcqR4<7LApS4^2@adM)>Q8?4Gl|zo79**9S^mob|8OwRgR~$m>y$8oK^YAp z;UYpY3Diy|8VkH}4ACCVwk3YVTEd7^`80|$(8 zpN^N;ab@S{`^54=f!qG|eQt^E8`PhOev-qm{b!bcT+lBU=(Uhz$_JX62u4PWqp4)| z+JIMsnAYo8*H#C#s1-;xfm{NBh`|A}zv^KkhUa?kj()X_MU`%F*aAs0Y7?cKz0 z=;zF_OX@c^Ur5##G^_QoR`MR}XXL+>zXyX4e2iJ7c=*_401cY);-k$keu!#WM)G=1 z4(p*=3$Lyj3e7208#`bW9RyE&%A|W5lwU*XW#FE0Me5W^#vx?8Sow524mv6B7tXcM zeQf>`{hrB2?q>Z*TJo;Yhk{qYfp6WobarH;6;)fk(PGn#7+6ye3sOA*tY0q6K%Y{28Ga}CBB47{A(Lnxu{pr|{rzu9X}@r;$F+z2Dd~3_n|aA4 z?+O2*&H_z@UDxAeTd%3+$}o(IGb|S@r^zKKr^vO} zn{-fX*j6lfW%mS1uY=N?1f?67l!fb@^>02q?tMcF`-QW*?|0|?0rRcYX1$tEJ`%}8 z!AIZ*7No;W$(rae7rF!*wvTF}_@g#VP+=R8(ovhq1Y%h8YB12My`IqUc0G*Vu3=~v zAX1xul+9W5D4R3eDmUz&4$805Ke#6xSy`Z*65WT_UH~_3o%^?sn`749R=^bjT$DAZ zqs0zm6=WU7ifkhU`Qj#h@xwRk#Ee0S=L3`e8=N2;)-7Rih{b~}4lLT5?mT?qg!*uJ zb!`*Am_Gl~bQ#X$SJup}sK@21rCDA1xKDv*s=DQGtVwcukGvs5mu17bXwgBWBw3GO zVe|2Z>Bf7Axung7F2o?Qrn|QrIOcws3aQ@S-v*+EI2d^@(+&7KFk1(5NxZrSh|j~R z{af9M?uH>d8C@y6k548+keV(sjO4|6E4n_xl~;6{j#WDqDORkGVgwYt-|Wx(^OPJB zof*nZ^TXzCM;<6Kg!A>OJ8|Ec7yP1pa}Ac)d6B3d9;yv;7iRK2!5BU4DzZqq#at>y zdS8xv+)HEWXuIE?a~N-Mre9Zk{7#~BqF6PGi6RaMH5g&xTQON2Hi;bs!I+do3=0ms zLD@XXka}v|WNa}IL)6SBnXscdV0VYzM0Pb{Ypb!bS`vXH+D1&A$~FxeDd-axpKB|| z>s&VIC7C=H{sLZM#S$2&IVT?E8%GI|Az0V6xvlB_Q;7AJdL4`?+j{*+{`+GjYfUxP z6gGgb0Rr(p%@pd7rfVBkT|0|~Tq3a|N!_hAy3@0#<;$g=oBL(+?DS)&k6XrX`jhGf z3Ze!b&;W%QS`Q1SkY@Tz&~dU3ut{Mv%?sL&>fIlCxOc57%!*sbCe0`*TXR@AHql&D zFidz$)f$tNGjbzki7*pNGjr;9cOz5j=B9t4uhi{tq{uC$XYlLVfP>g@56y}NA|U6( z#KIb0cMx#+{G`GrqG%O)$ z>3yFCr4)0Kw@-{y|NHnz_8Sq`LveoVPvS_05w~ zYQaDMW%xrcwsqW;o(sSJL_hst7yk(VEp3=!m!LT%`uFW-3KUl|l$0sLai*L0e|`%z zZDTnRh)vsAnypudUCGnPmEEc21Y#i;Qq+VfNs{_Y!2XcT-s7KtHd4x|A9jPS&B}0? z<9d}o`@#b++)NE5EF7RFlX{e@trQQNBSMJSIAT(dt5!yV<|SPNJd+!yWrp)I{+xo<5;rQd3xXO+fMT zHVPQ5)D6S{!Dt*?E{Y^5R4Pd~mcTx2Z3{j}I(5)tuuE}9!%1k-C>4>#L&dedw?s`@ z0V>y46Q8%nDHN}_)Z3cgA0gbmjl8g?*_ur{{YQFIF+OibxlCz-Qc86lq?^>n;*OCv z@CZcGlD-8m$k$>+{XjHRQZ@vwu2g7&&V&;xHJzlyw{*68T0Ol#-k3^=C(U$(=Z<`# zGEEHadga#DWLeaZONEqCPME?%fkHROzwtc4a{;@IS@`92fxUoT%uHXU6(?f^D1K+r z1HgtUm&Giab8^Z#+71Ffr>87E(g8Ji(mTR z{*6~rIX0w-3dlb>-!M6o-~NGM0yS}^F$vbR0-QP%V>9L`U`>kv76(fu?(O{ zHP4<7THPFAGgUH_>l0{oG_yD;WHbYd z1DZh%K)|>hc!J|reG*_#;P6v|Tw7bk@2!ZKl1{j6g8(I`7+AD{%YrR#E^M-R3sPF) zCuD#Fm>Jr8LCOJv8XT0i%1j1EOn7w-m;ePg0St&i3^4?#(NX{br(AbA#uLP?`k>i7 zxp=8y;JG?>m#~-Dv>Y3@>nngtA~K{>e1Vab;=pDK=tYMC2IQR1fsS5H?*QcnLnTfD zZbm>&u$g9J4-f;9*Jun}83TY^0(f|rOWx3sK(0%5;H7#BfTup&GOLA(Y&g#+Usv9; z&gVUb%8U`Pa?Wx9tjp-;V4_A`q}zN@nEl40J^`c7>C;aGY8LybA?OM2-cI^lXaz$6 z>#_;4&n&zLax8EF4%mh%@^ZQPulIi4*9$)Qi|?aL^;q%BPwwUsVju=C$8zBEeI#w@ zqX!U^UEoTCVR~Jg)0Zvw0loQRAFhl6h#{`*qwu*mOo14HNFe5Zlc5Cw5Ls4U4s)!a zoOa+%E!s1}YT8SDD>md;{#O5L0;k2q`x*Tvq)b=?d^44A_yd`86hk&`fg&eBaasU+ zFW9LW)^Ylg&I=gT9Lkymv)&|bXAQ@2vn%76hDMQ@zFrV$(TvK5Lo6YkbZD@99qsLl z%W=~3vlgbp&YyL;JArlx=@?1`r#OTKPB|<%5P|bSfQ5%xAaO$QzJ2XK_@KuEl{MHyjh(?G(Vx8^+s{~|IAj}k2y+>XpY9ixSshOUd zY4JAUastepDOVG%q8K!#63I;@M=+752cCT^>#g_%urahaddx%hhMtYWx1=20#6f^AB!8Rb}%9se@F{)&HT zV&nldjk%WyM%bYHLK_x1AjN)&#u#>7rkW&AWn0SpL5o8vzB$mxGe)Y&2HE8cL807JqI znXZx$3mc|0g|K1DCRG3j<#I;h^thZgyc4u$x7!ufWzU{s^-?I5LW7PRpcztN#s~od zGv!i-o`qN14k`{nVMq+O3$J`%1-ASC{}Tin_uCS-F*NQgUouY4{P@j9%oy(gx>p{E zP+W}5V_N`wEXYnwObmhJRq?866@0QsnUy4P!WQB5P}K=U0Asvx!omxFDG<3j zL?~X)C`#pZ2d#cIZp&t(WulezfWbh*kb+;jJcOo1Odv!8vFc$rW`~4@15L+;TuQty z|H!t0L%ynu9M4H_7jR5FE0I`Kj!(+{(euV}TVj8;cMEQ3}S^)pGDRs-Jk zTz@ikZ3}iU#SDi5pyh_0T+mK^Bm<45tTkoyk{ro^QUM3R0=LsRvK+m7jvrvx;`EZP zmcQtdaotIjOycU|Tv@!}1;+$KFc3@tN@m&99Yo@3J>ZyA*Jsia>h~Zw8XOLx;3k9! zhCn~#H`as$PPrrnjVYs7&ZS=~y!3JhJJYxcE^~N{lM2*yDKDm3fg;cXMeGoPKm?F- zk|W@pky@IHRJPC-K*OF)TE>*MiDpd}f_Y=2r<9c|SIGdflJx~rKSrq(6}A9iACG$- zl*zH$zt;_}8~fikfdF?+u(}j0J3g;$6iO7+>Y$wHxUxcmtThp4pj6xhg>0H_7r&mwPV=YC7oc|K0@n6Z_jK z4^R=I%tu9ZylysY5$Io!`T2zU5v+h`4WtqeyMS2Z7^@=!u<5m66%3C6Eoq{(8p#MmQBwv|=CP)EH6*l+0zl#A@VFoFXlNSfeo+ z-7QKYDNj$g?l+vy@$QqdT$CUuWv$JI12Z!Nv?j;~G{-C~@>kcKbmbUbrZ^^xw_Vn3 z0uIVCW6CMlRZh+77LAO}u#P!FOK^v~`RGjew?&EveH;y~7=j^&0H!O~>dJ}kq$}J6 zutuX1(FnOyvU&KQYrzD<(!QJEra>exBtDUc5NPn-+=# z2uBXO*2!5qfvm`61AytA5F=u*#w?LW=C%OA1iO6eOxb+<9TBui)|@L#Jn$P@@XZwD z(&XgDu$q#)8^Ls0?R5X26M2=3zf{^TD?`;c4)vIUj(TJTu5gOsE^%2vzPI3TBf0e) zhbnwFEIwB{fq2?X&NxU9zhTitRsjdBd@Dd zVn{QBm`Y8SbrtOo6sIPeg$^*NB0@J5*$zaxW5MdT%ZAeSANL8FtdSMP3r-pgd&}kG zx=FbwFW^w*n1Mxbevdgdl6|ItwV}ctZ0zxx%R4T&Bn7vt3G$L`h!PTg7Bg0~kWg<6 z_3C>Mo8|3B4+B(nZc{#iGdzu~hZ4c(#cgMWVx1-IK=HDa%~Ufe*+iKIpu_{kxvUu| zrF2s&*&U1GbFlmGJq@I5vC}~55V7_igSLQ_R!lGfivckJ+3;~AXe(e8fa!2h;1S(2 z9^dk+csA?CMNz#!~PtH?#6caR_gKKD^>*JG!5h{ zHKGS8^OBY+tb>Vd(o82%S}u#l00K1`%`C)^0L^k!5CwV$k#{Ia9blyfx?!~4x1Wt- z$M|~=I&j@Vs{;z~{v%`s$O`1ebOVsc(NtXngMokF%`Uh zF}0go-)`JJZ@a95bz5`S){!c9gu?S-@q&O@Nqug!ma7Uh^d9++zm|ad6O0pxgO5a^Q{EQF+6;|nAX4=1e zT{crTOo;&~PMM`V3IZ7KQLiL6YY#AWN0i4Gwu+cWE}n|!L95Q(;ay*i|0Td?ib?(f z^6Sd9R)}_a1Avn}$T4T$>Ys!NS%FOoF#xgZffsMk0gS-rx#$Tu73ff07@epzdkfS< z$bGzijwZt+##hz1G?eNnfk?^ft7F!TQl~^hnI$gQTaf#APf*q4+lX^sD_``KwSv~2 zJ@H?*d+S%k;vtfmC4&+&z${;cpQ0r2xrsFrHS+7Pb|8|AUy%0(i7Ns`nl|^u01!j0 zK*Ds)O%pgswzBf?tEU021gAMAfQC~dM4)N8 zM{WM$Yvl`OwHwFZ3R+tYoXibQ{yIJ>Am{e@CYxM%llUf$WoU`yL5>*{+h4JZp8>Li z#xjY^Z(<8n`54O~j@f11T$DDEfCC3vIq1+tImgQf3LjARO&Lo#vAN6QE}dmDXdGWQmn{Gbi#gLiQERt&M4xO*#K{D+Mv+50|=1UU8h zKZ#b>-T`p1_XmpGrLHamAf*L_GE{mfPU9vRX@*PeC(g@;PtrV*kaDXyIo~`N-$agi z%;I3e=Zzr-(CRR@gxR(rk2^FYX5fo}w#+viWUIq&ylW1`av+w&f`^%QECR~{5={6% zcO9!~Iz1x4!R-uPN$1@yLc;f7QeZ)xMP9N1m zzM)=@H)R@g@t~Jx^e`h3=`3qaGQ0{3Yy}xcVCD%?K622uv1-Qrm=2RdOBVyV0Bs^X zK%|^oT0ruY(S{<$XwVr08WYk>JtG zDDl69!Lhy~Kh}6CiQ*YhLgaEr1%u4i_uF|I(f;xT=6le#u^N-sWa6syPG{?tdDH5w z9PFWKWf%nF@kO~e61bEWDIp61j6q=tl$wByveK6KAA>|&VXY{*GHy$X5Bx78)1VbR zI&I=8=hi)WZnI!eZc=HHVvZPO6vP08DLC;T_6^40GH6rTAe^LjCp&oLtL)aY;Rt!n z>bN+76bjM$h&Eh~EFh^Kub81|4Q6x3pgARq3s;(e0SG2mobK4TX=1Ym@rIQ)cosSr z{K>bLN8m=PQr)_-K*x(V+_gch+vKSUU@^bjBpU=QZoHxQ z?zEwI*yw?l#bI+i+~f%zmAI{^f4UGlJF;6Q0;@9S%QjDI!N$6AN=|`=0~*-i0b*d2 zKo%ogL2J_Xm@#j2cY#D24o>K7!YNMjboU)jDx7Td_1xBo^%fx1+or7vm_lLUZ1V*2 zPzwl#PiIb~AVshw0Ve>PL~(4~JwqTCJP-qmc6`?Yv>at~caE)Bnr9a;7dW!@FaNhW zO-U6o{&ahHC~cQ1(+FgsIcAhh&&J{OHy>}A8nbAs5iBvSknu~Y+qp%mWq=vk3^Pzj z#|63_0J}TD;=m#esi?q~E-=xi^47TQ5L9=`g6UsQaZdM&h=4N$C@@%1T3qV7-E2l5Ojb(R46%- zB50|)pI~8XX?;0Xti~KSg=Fod&DTX8#r2hOnNv(-)u#! z$%g4J&@2PcIJ+^=Jw&!SP6K+}5z`Xv0WGAmIiUiRkF)DlHtG24%HTaV-TVPIQ!x2v zDvQ)FrkXZs#Og_o>Trsizl%?EIUp!+jmKv;*R%5}GkEdOMHx{bu(6k6dYjZKCL7uY zj*QuSjIua<(`Xp(qa1l~CTuR~J42hTNYZ-Y1LKOB%ogo<;l;xuADhF%i-Q4TW;B5g z1fH5PjF<*mn2%O7<<#tYJ>&Nh(<~zpSk&5>-TSGHH>n=SY}zSdx;f^=ZoKw{o-b~$ zkk#(vOMFcbln-SC2Iv;F$922n52q>?UznfrHRU5>b-pr>-VUygRlU*Wnkd8%feY@(OLasfLmJi zoK$rYsn8gwsRTs=Eb-PzuKZtuNq)7Xeu)s*ywCk-mr$*N5Def zqVM0LVvxD}m^&}=)2X}8#$iU(NItZgYjZ?m) zeuiVsdTju@7VMwrCHYL3XT5(+$6#{=*nvNKwsl)v4lu*b-el62X(|l^D$JKKte%je z=7Xjsnpqq`3^o=If8TCf0fRxq>Z2-_K0Pt9VqzkHo)2*EYTC(A@FqcBzBvl;+?5Q( zhmTEpOF&NVD_T`YXBu6HRR9?Jn^c#beV-~U-#kgEZ5k&F9XsXm&4p`Y5seNSXgFoj zIwWwr5o|0Gp=|!utDPHJJ81S*$Nc|H++astiVmrxJYQ5Tg3aEvL|vt4QH!>E0ykh* z8w>=Enw@?}eTzb|JD$x&?E4f=Oy(Xj!H~J{gj6YC7RrdJAJOuV@dpnLj7(GL)OrSC zSTH(cm1?r_E-S2#gk;Iyq#f(0pRGxqOY^)Zm|kB=|75c-GbO@HrIqWCiSa;8D;hS&Go9yi|QI)}z7PBZI0f9)U8H zb;XMVuotW}^Y{XQxcK9ea~LZy%&@1Q;x*Nyyjj)+RdZ^!Cb$K-?+kGjg9Q*Pu-X~; z39H9cv;@hNU9-~<|2KK-TSvrJ>V#&=)wvlBbq}mQsu|INtPyMz;7ZW2b}`f+o8pre z5Nld$;`2rVn1(M<)m?zNB+0n!DHMLJP~iQMyJZ-lxi@a{{x*RA5|k!eC+UM*yf$|C zDYZyxy4HQ2YkxFyN;rYp#dxPo zJoB#luAem=1y0TK?=G}o52KRU5DZG6Mh^7&KK1&Es})Qmo&1DVqCvibb?K4qPpXqL$Qv5%Z4^Y&qAm@tRd z!;*hm>6fIYLr-vOUdanTTKfuo!8G@GQx9(8EEWc-1Wh23sBHnA>n)7=o4^GL>Pg$am<7`S=Taeg`!* zEr8}LOwf$TX4vR}xS^XVhv_a93f2E;e*T^j{<1hJ;2sce(a8zQUr2o3$l3T)`N3aslXut~^; zm@(dk_-2V%h)sJxNFPZ%fDpSSA=tfx(Da0Q8Mn+8J(kKgM2@b?R;C`zc3*tPuCi#o zvQDu_V0r@Cgd|*?P~q8h;4#$O(4lM~;T)+PfW!KSWFH_s za=0)uLPMo(Qsi~H&2Nk)($}Z_uCD1GbHKPScn~svZJ1uwlQhZiwGK|*smn?p4N;S- z7cc4gomIC)BcW4{(9r*^4S(qBgbZ_ zrdTjDQ0N#|F4c2bb4Ul~`G>F{qCk2Y&rVmOCTgN4a%sC7mMet>6!~0K2m?Wb4ZcA( zO`ym1zmR}J;>Eg#+-W*d)s9C6r1cp_9Zsmqg)LnJatgbs2ISOPnEtN4Yk}3VCW!YW zCPOJPP(n>m6PQp*P?;RNcmmlBR+&2gLK17_v0@EN>47VF>;c4}LSn^ibm{gH2Y4Yo z9taujVgL6U*#+n4A61ul8b1+;h=FckUPgp;`NL46x(wq^%~>5z%}frnj`J-g1uje< zh;xqt>d!39`q>4QCr|gcgczu|kUP6i!~hTpk^WS=D1pI9_h|xGXkCV z7^u1vl_a7uwJ)_P6jnH4e{r$Vjl%*!&n#8%pBt}Fa2GgrEi@jXYFmFcUjlc*U&)aw zxA#vIXqH-``>=X`*eF(>07&bOW$KYwg)B?iHcLX&Hp^l4B=<*F_)@9@K_F-t6<1i`J!I%WeWZ|rJ4wXYf6iBBr$yO-= zsE*dKd{<-JjGs8&rTfS219@a( z0Sc2{h=dak>M|&o@<-!uhA32tYUYh}KyIWKF@Kh#t%POkQuZ$@-wpBL6%Zdxxl^X6>-!_7LZK(?e=BD>}>RBq|B zKChl8CN^j>YHF6NBZy^Xb!+nKmL{XIL4T+&;|kuDXwv?fw12aPkW2L`G|NF@2Qc1^ zxvKgNbuLqK^3)X1o zAF#Nzc&#~h&9DC3u;Ez%0CrXC{V}_cWO1yWnqTt3STaF zTGo#7)iNXRI;ibKk)vzDwWjLDm0VKR)e)t%y_HnX0dxi#B|{E0WT%}KTh=UU3r(z2u)DK!dcHeK$`He(+LipM~XI@8Bv?n#fD`&pkAX7rK!1X@X& z%}#4pjt-u%E8dW@+Qc-~0BKe0@p?~FIo9HhQd;pyUmlMXo-{h>r}^>f`F^{(7etRc;q0gpt@Wp-$xBVW0dq ztmfcTvT|#-Ombz27gej{9s2!|)p3=K5JN-^f}|%w9$BTNOi#3)Bposhi2}l+#8_g@mtx=I zKadl#k9|t%Vb{m5c(a6{%%GVHI51f4arR77-<^pEvFsszOJg4-T;P^enCa?i<n zI8~VS)phdw()$(-Ifml>@)xiiQpRF!%~^?=Q9&FgMrjksV6%3hop}sOeWbC+3zB1B zZ#5Af=N>!Nnh?uy!iLGLZ-W7xpS$_T*!&Ouq_#~vk|nxoxhOkBSBuEio>t>oruETW z?P+$qmd3QPZ{db4+D0A>$tSy&>loxU+~3YL&|iK%atl4?P6Y|QnUXSog&2^8yPsDWC__4qUF6^>6 zCd)_do;8j7L``5)objbSP+$kLd3O2#Z1;=jUuLw$ZdPR%OPXv2DR4z7LdS*iKnUEn z)C7qOVJ9J;IxeUj>5nkEzh(PAZ719xfmOIY%TaQgf>)1zxi{!4AIi#O1M+$?6O5_O z{kA*HK&E4{0;6&3s4e>bII;J~^yZjMNDnLnw#-SFIvF;ywqY$_Ewle8aiLzsniDl) z0n{I$HAzjb@|lo1gObqDZ7zj8R$}^N=l@|4DN#`1-w4VFI`s^%!+v+uV~JQPJBUG zr~(xAfk3F*O6BQ$U5o67mu0pe*`tJ{_x(eD!j$Qh6Kso-2) ze4n>b)56HusTzz+$={CKb^gi={N&B9V*nJikgodTAu%E>6O2GFpuoVK*sofemcnC* zA%~Qi%B67F?xhOcF0_%T|BW{NScjucB2w$L3N{{AV`i^($@B4LKs>5RGS)|(&GB?rI!Uw?8I z=N?f7X)@ASg~ScKVHIE=SO9hHO3ai1rtl7#Hj?ZO{Je6*i zCDCH9kBVp>aGq^F2uFdW8f^@9*{>2naiAt@>eW{%ZCV#BaFcy`py?L1tY+P;UXLL% zcZ$ck6A3`fd^iBvOq!wDf)&=Su4GXI0(kihXJ?(Kz9=H0wS%61@k>zG#y6G|I{{5= zm0_!lYM;;IRjCZKdgNSoXSUr=mHP;6Hm7JgbvyY?&J;S

    P{=BoG5v7KaF-F^8IF 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 W4q~SNGyR|G|4jd9`ajeEnRf;F3~F%z literal 0 HcmV?d00001 diff --git a/appicon/element/src/main/res/mipmap-xxhdpi/ic_launcher_round.webp b/appicon/element/src/main/res/mipmap-xxhdpi/ic_launcher_round.webp new file mode 100644 index 0000000000000000000000000000000000000000..a6b0547ed07f39e969c6d1b508a334987e5a6de4 GIT binary patch literal 10530 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 literal 0 HcmV?d00001 diff --git a/appicon/element/src/main/res/mipmap-xxxhdpi/ic_launcher.webp b/appicon/element/src/main/res/mipmap-xxxhdpi/ic_launcher.webp new file mode 100644 index 0000000000000000000000000000000000000000..359e3921a11eafaa9803ae03c12c8f02eb78b83b GIT binary patch literal 10000 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 T{vY=Lu>XhsKkWZu{}0a-nX7-8 literal 0 HcmV?d00001 diff --git a/appicon/element/src/main/res/mipmap-xxxhdpi/ic_launcher_monochrome.webp b/appicon/element/src/main/res/mipmap-xxxhdpi/ic_launcher_monochrome.webp new file mode 100644 index 0000000000000000000000000000000000000000..c3490dc0b4641993c273d665bca26e43a9158c91 GIT binary patch literal 4664 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 literal 0 HcmV?d00001 diff --git a/appicon/element/src/nightly/res/drawable/ic_launcher_background.xml b/appicon/element/src/nightly/res/drawable/ic_launcher_background.xml new file mode 100644 index 0000000..dc27f37 --- /dev/null +++ b/appicon/element/src/nightly/res/drawable/ic_launcher_background.xml @@ -0,0 +1,10 @@ + + + diff --git a/appicon/element/src/release/res/drawable/ic_launcher_background.xml b/appicon/element/src/release/res/drawable/ic_launcher_background.xml new file mode 100644 index 0000000..1cbabac --- /dev/null +++ b/appicon/element/src/release/res/drawable/ic_launcher_background.xml @@ -0,0 +1,10 @@ + + + diff --git a/appicon/enterprise/build.gradle.kts b/appicon/enterprise/build.gradle.kts new file mode 100644 index 0000000..bc5cdea --- /dev/null +++ b/appicon/enterprise/build.gradle.kts @@ -0,0 +1,18 @@ +/* + * Copyright (c) 2025 Element Creations Ltd. + * Copyright 2024, 2025 New Vector Ltd. + * + * SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial. + * Please see LICENSE files in the repository root for full details. + */ +plugins { + id("io.element.android-compose-library") +} + +android { + namespace = "io.element.android.appicon.enterprise" + + buildTypes { + register("nightly") + } +} diff --git a/appicon/enterprise/src/debug/res/drawable/ic_launcher_background_enterprise.xml b/appicon/enterprise/src/debug/res/drawable/ic_launcher_background_enterprise.xml new file mode 100644 index 0000000..d414479 --- /dev/null +++ b/appicon/enterprise/src/debug/res/drawable/ic_launcher_background_enterprise.xml @@ -0,0 +1,10 @@ + + + diff --git a/appicon/enterprise/src/main/kotlin/io/element/android/appicon/enterprise/IconPreview.kt b/appicon/enterprise/src/main/kotlin/io/element/android/appicon/enterprise/IconPreview.kt new file mode 100644 index 0000000..70e0201 --- /dev/null +++ b/appicon/enterprise/src/main/kotlin/io/element/android/appicon/enterprise/IconPreview.kt @@ -0,0 +1,45 @@ +/* + * Copyright (c) 2025 Element Creations Ltd. + * Copyright 2024, 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.appicon.enterprise + +import androidx.compose.foundation.Image +import androidx.compose.foundation.layout.Box +import androidx.compose.foundation.shape.CircleShape +import androidx.compose.runtime.Composable +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.draw.clip +import androidx.compose.ui.res.painterResource +import androidx.compose.ui.tooling.preview.Preview + +@Preview +@Composable +internal fun IconPreview() { + Box { + Image(painter = painterResource(id = R.mipmap.ic_launcher_background_enterprise), contentDescription = null) + Image( + modifier = Modifier.align(Alignment.Center), + painter = painterResource(id = R.mipmap.ic_launcher_foreground_enterprise), + contentDescription = null, + ) + } +} + +@Preview +@Composable +internal fun RoundIconPreview() { + Box(modifier = Modifier.clip(shape = CircleShape)) { + Image(painter = painterResource(id = R.mipmap.ic_launcher_background_enterprise), contentDescription = null) + Image( + modifier = Modifier.align(Alignment.Center), + painter = painterResource(id = R.mipmap.ic_launcher_foreground_enterprise), + contentDescription = null, + ) + } +} diff --git a/appicon/enterprise/src/main/res/mipmap-anydpi/ic_launcher.xml b/appicon/enterprise/src/main/res/mipmap-anydpi/ic_launcher.xml new file mode 100644 index 0000000..38ef234 --- /dev/null +++ b/appicon/enterprise/src/main/res/mipmap-anydpi/ic_launcher.xml @@ -0,0 +1,11 @@ + + + + + diff --git a/appicon/enterprise/src/main/res/mipmap-anydpi/ic_launcher_round.xml b/appicon/enterprise/src/main/res/mipmap-anydpi/ic_launcher_round.xml new file mode 100644 index 0000000..0fd0f91 --- /dev/null +++ b/appicon/enterprise/src/main/res/mipmap-anydpi/ic_launcher_round.xml @@ -0,0 +1,11 @@ + + + + + diff --git a/appicon/enterprise/src/main/res/mipmap-hdpi/ic_launcher_background_enterprise.webp b/appicon/enterprise/src/main/res/mipmap-hdpi/ic_launcher_background_enterprise.webp new file mode 100644 index 0000000000000000000000000000000000000000..45f77567486efa5adb1683e35c6ed074e187e8ea GIT binary patch literal 2458 zcmV;L31#+DNk&GJ2><|BMM6+kP&iD62><{uN5ByP2}NxrA=!i9`8Uj9Afo>XSBwll zSTKqtDN;(PCocjC__qgpNErC&{{&3j0|H5aoRDj`;g+uHCFJB^X((vhhDpkwb$2L4 z!~_7?_-06=W;QDW9lo?|+YZ|{7jnnn87KIVlQEoQ7<^A)yhJ8#lYR4VxD4C2jU>7I zFMLlG6JWWKBtep-;GgEHut!$&V19u*4Xtg=2ndS&9}Pj4MW+w}f5e~AhB|2{C<;ILi0_t^Fhd%N9Ma;t1LTKl-v z={TK0tz}?MNDXK`InPJi4?cw>Ywy@Vx%J8%O~p-YhMk$(8D|`wV5!_mF5Rr;QfmEv z*nZ?57LILS;ohg z0aF?Lq6knRxdU_qjRR#kdnd!#mW4@05lbem7gn)%6|g0KAmPGXrT{TiL>`@R80z3S zr;kpU+Tnp^$e83p2hf}=x>ZFb4nZ7Fr~@%=Zl=?TT00Cw@vcZOez_!<4*uBBGCxq= z2r1%(GWgmvJ6*0!oify+H+kGIm*JMVj8wOzDk2K=fi*buop^N1a{K-dsVhA7%$7-}u`QlXnBTwsMC6%`ao-SG{ig-DE7t(96><2MI3 z;lfnQ|x)1GvlFnqwk@z+t=qaZ5}Y2AB+3$t9Pfsc(-zqN1QUhyXIsQ5Zpn zOAM8@bCY^w@+E_w-0}S~Kb3bIS2)O<1c1RQ;H0!tmNIDS0!iUAKC4?U6BWS&!ef&N z#DJ_YO7it@U#cu+Nv;6X%kb={-=m^D5IOu1n-6dSsG%^*Ao1Zhqw;Qzg!ih;R6Y;n z00NT0hR2Y_Nc@XVf_v8pd;v1Pyj^f&S`kH38^LAgO~Uj1w|5~en~1~!b=>4uxX|PR z-$PF!cBs5TQt*JyAl%1a^5D)T{ARAnfdv2O4GDBpo-w%iz{!yUdHNUN4rH;-aJk%x z!YG*`ys}1;F^$6~>N2%|I>uX+}WC_>5@x>?476x%avlA}Mm?W*Htxczc$evl8awwB=;;gEpbvkdM@ zxFDWHltxcAuAYjr`dk0tv%Hs4t`|}w@L|~|_3s0-;R2UK8eE)H?lg+d$)0-E>&yG( zrD`fSq9E{dDtwH6(4jdcG>CUOC{DGj(ec};yF`^YIKU|?Ol}K$K`utIK|fTRt6Jt& zd9pJ8FOqlsw?RIZ}#-udFRAzAsp$ z_7#wXyxCNQ=9FlI+EPb#6uYUT8+9F4+pQHX@k&(80ki-ih<}wUHcA_+nJ5 zK9TqumMm#iLP*H3y;hgqLuABlormM<4(hn<$TAg|%k^%(Y@NGNy=^mI-u~JoZ53IEWrr*#zNqcH?^11>TO09E_T8NyUXh)j2|H?r z#gt*pwkrIepth&%Czb_|Mu}TSABPT-R+Y+mYK`zZZA77m$r9nEB1}jh?HPU2F`t-l&#Cl zPIjKSx@PyDvfs9P+crvjv_WZ*5(JDd?1=XG%4*v;WpPa|+rI5Lm)y2bXx(3CASD9L zKm!s#WsOB^w{+YliJNr4%UfHU>|#p~v?4V3h`IPgXs7{yG781Awal(x5^cSkx3n!c z+Mpnoi$WxW#PNp8E<82%jcsCL(zlkaL!}uu(#sM+0io`dm}A7Lh(t8xN%UDAVaroY zT1(WT&8=91^0X)y)J=jz1S4t=z8Jd@)sp^1lYdQ2uu z-zA2T(x0G8i`bk$&#g0Q}+^$Ac5C?bFY`DhS+O9abW9A~&r YnK+B71rYJK37|L3k%0BYfv-A51#IT4)Bpeg literal 0 HcmV?d00001 diff --git a/appicon/enterprise/src/main/res/mipmap-mdpi/ic_launcher_background_enterprise.webp b/appicon/enterprise/src/main/res/mipmap-mdpi/ic_launcher_background_enterprise.webp new file mode 100644 index 0000000000000000000000000000000000000000..937dbf1c5db43f88b44bce50d470f8aa61b60a88 GIT binary patch literal 1428 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 ECXRXU)&Kwi literal 0 HcmV?d00001 diff --git a/appicon/enterprise/src/main/res/mipmap-xxhdpi/ic_launcher_background_enterprise.webp b/appicon/enterprise/src/main/res/mipmap-xxhdpi/ic_launcher_background_enterprise.webp new file mode 100644 index 0000000000000000000000000000000000000000..65027bb480f22f5375f8cbdc9f8f4cd4b3ac5b51 GIT binary patch literal 7436 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 KqYv0lS7`vnA=SA6 literal 0 HcmV?d00001 diff --git a/appicon/enterprise/src/main/res/mipmap-xxhdpi/ic_launcher_foreground_enterprise.webp b/appicon/enterprise/src/main/res/mipmap-xxhdpi/ic_launcher_foreground_enterprise.webp new file mode 100644 index 0000000000000000000000000000000000000000..90b491a343cd7f46964efe1d34c2644b7ded943b GIT binary patch literal 4816 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 KErzpy8~hJTQANQ3 literal 0 HcmV?d00001 diff --git a/appicon/enterprise/src/main/res/mipmap-xxxhdpi/ic_launcher_background_enterprise.webp b/appicon/enterprise/src/main/res/mipmap-xxxhdpi/ic_launcher_background_enterprise.webp new file mode 100644 index 0000000000000000000000000000000000000000..7ae770c8121a5dbdee0d4ba8554a299788a53a42 GIT binary patch literal 14080 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 yQZ4A$Sq1%C((t-j + + diff --git a/appicon/enterprise/src/release/res/drawable/ic_launcher_background_enterprise.xml b/appicon/enterprise/src/release/res/drawable/ic_launcher_background_enterprise.xml new file mode 100644 index 0000000..161c685 --- /dev/null +++ b/appicon/enterprise/src/release/res/drawable/ic_launcher_background_enterprise.xml @@ -0,0 +1,2 @@ + diff --git a/appnav/build.gradle.kts b/appnav/build.gradle.kts new file mode 100644 index 0000000..aa0bc04 --- /dev/null +++ b/appnav/build.gradle.kts @@ -0,0 +1,71 @@ +/* + * Copyright (c) 2025 Element Creations Ltd. + * Copyright 2022-2025 New Vector Ltd. + * + * SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial. + * Please see LICENSE files in the repository root for full details. + */ + +@file:Suppress("UnstableApiUsage") + +import extension.allFeaturesApi +import extension.setupDependencyInjection +import extension.testCommonDependencies + +plugins { + id("io.element.android-compose-library") + id("kotlin-parcelize") +} + +android { + namespace = "io.element.android.appnav" +} + +setupDependencyInjection() + +dependencies { + allFeaturesApi(project) + + implementation(projects.libraries.core) + implementation(projects.libraries.accountselect.api) + implementation(projects.libraries.androidutils) + implementation(projects.libraries.architecture) + implementation(projects.libraries.deeplink.api) + implementation(projects.libraries.featureflag.api) + implementation(projects.libraries.matrix.api) + implementation(projects.libraries.oidc.api) + implementation(projects.libraries.preferences.api) + implementation(projects.libraries.push.api) + implementation(projects.libraries.pushproviders.api) + implementation(projects.libraries.designsystem) + implementation(projects.libraries.matrixui) + implementation(projects.libraries.matrixmedia.api) + implementation(projects.libraries.uiCommon) + implementation(projects.libraries.uiStrings) + implementation(projects.features.login.api) + + implementation(libs.coil) + + implementation(projects.features.announcement.api) + implementation(projects.features.ftue.api) + implementation(projects.features.share.api) + + implementation(projects.services.apperror.impl) + implementation(projects.services.appnavstate.api) + implementation(projects.services.analytics.api) + + testCommonDependencies(libs) + testImplementation(projects.features.login.test) + testImplementation(projects.libraries.matrix.test) + testImplementation(projects.libraries.oidc.test) + testImplementation(projects.libraries.preferences.test) + testImplementation(projects.libraries.push.test) + testImplementation(projects.libraries.pushproviders.test) + testImplementation(projects.features.forward.test) + testImplementation(projects.features.networkmonitor.test) + testImplementation(projects.features.rageshake.test) + testImplementation(projects.services.appnavstate.impl) + testImplementation(projects.services.appnavstate.test) + testImplementation(projects.services.analytics.test) + testImplementation(projects.services.toolbox.test) +} diff --git a/appnav/src/main/kotlin/io/element/android/appnav/BackstackExt.kt b/appnav/src/main/kotlin/io/element/android/appnav/BackstackExt.kt new file mode 100644 index 0000000..1185016 --- /dev/null +++ b/appnav/src/main/kotlin/io/element/android/appnav/BackstackExt.kt @@ -0,0 +1,34 @@ +/* + * Copyright (c) 2025 Element Creations Ltd. + * Copyright 2023-2025 New Vector Ltd. + * + * SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial. + * Please see LICENSE files in the repository root for full details. + */ + +package io.element.android.appnav + +import com.bumble.appyx.navmodel.backstack.BackStack +import com.bumble.appyx.navmodel.backstack.operation.NewRoot +import com.bumble.appyx.navmodel.backstack.operation.Remove + +/** + * Don't process NewRoot if the nav target already exists in the stack. + */ +fun BackStack.safeRoot(element: T) { + val containsRoot = elements.value.any { + it.key.navTarget == element + } + if (containsRoot) return + accept(NewRoot(element)) +} + +/** + * Remove the last element on the backstack equals to the given one. + */ +fun BackStack.removeLast(element: T) { + val lastExpectedNavElement = elements.value.lastOrNull { + it.key.navTarget == element + } ?: return + accept(Remove(lastExpectedNavElement.key)) +} diff --git a/appnav/src/main/kotlin/io/element/android/appnav/LoggedInAppScopeFlowNode.kt b/appnav/src/main/kotlin/io/element/android/appnav/LoggedInAppScopeFlowNode.kt new file mode 100644 index 0000000..0dbcb0f --- /dev/null +++ b/appnav/src/main/kotlin/io/element/android/appnav/LoggedInAppScopeFlowNode.kt @@ -0,0 +1,107 @@ +/* + * Copyright (c) 2025 Element Creations Ltd. + * Copyright 2023-2025 New Vector Ltd. + * + * SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial. + * Please see LICENSE files in the repository root for full details. + */ + +@file:OptIn(DelicateCoilApi::class) + +package io.element.android.appnav + +import android.os.Parcelable +import androidx.compose.runtime.Composable +import androidx.compose.ui.Modifier +import coil3.SingletonImageLoader +import coil3.annotation.DelicateCoilApi +import com.bumble.appyx.core.composable.Children +import com.bumble.appyx.core.lifecycle.subscribe +import com.bumble.appyx.core.modality.BuildContext +import com.bumble.appyx.core.navigation.model.permanent.PermanentNavModel +import com.bumble.appyx.core.node.Node +import com.bumble.appyx.core.node.ParentNode +import com.bumble.appyx.core.plugin.Plugin +import dev.zacsweers.metro.AppScope +import dev.zacsweers.metro.Assisted +import dev.zacsweers.metro.AssistedInject +import io.element.android.annotations.ContributesNode +import io.element.android.appnav.di.SessionGraphFactory +import io.element.android.libraries.architecture.NodeInputs +import io.element.android.libraries.architecture.callback +import io.element.android.libraries.architecture.createNode +import io.element.android.libraries.architecture.inputs +import io.element.android.libraries.di.DependencyInjectionGraphOwner +import io.element.android.libraries.matrix.api.MatrixClient +import io.element.android.libraries.matrix.ui.media.ImageLoaderHolder +import kotlinx.parcelize.Parcelize + +/** + * `LoggedInAppScopeFlowNode` is a Node responsible to set up the Session graph. + * [io.element.android.libraries.di.SessionScope]. It has only one child: [LoggedInFlowNode]. + * This allow to inject objects with SessionScope in the constructor of [LoggedInFlowNode]. + */ +@ContributesNode(AppScope::class) +@AssistedInject +class LoggedInAppScopeFlowNode( + @Assisted buildContext: BuildContext, + @Assisted plugins: List, + sessionGraphFactory: SessionGraphFactory, + private val imageLoaderHolder: ImageLoaderHolder, +) : ParentNode( + navModel = PermanentNavModel( + navTargets = setOf(NavTarget), + savedStateMap = buildContext.savedStateMap, + ), + buildContext = buildContext, + plugins = plugins +), DependencyInjectionGraphOwner { + interface Callback : Plugin { + fun navigateToBugReport() + fun navigateToAddAccount() + } + + private val callback: Callback = callback() + + @Parcelize + object NavTarget : Parcelable + + data class Inputs( + val matrixClient: MatrixClient + ) : NodeInputs + + private val inputs: Inputs = inputs() + override val graph = sessionGraphFactory.create(inputs.matrixClient) + + override fun onBuilt() { + super.onBuilt() + lifecycle.subscribe( + onResume = { + SingletonImageLoader.setUnsafe(imageLoaderHolder.get(inputs.matrixClient)) + }, + ) + } + + override fun resolve(navTarget: NavTarget, buildContext: BuildContext): Node { + val callback = object : LoggedInFlowNode.Callback { + override fun navigateToBugReport() { + callback.navigateToBugReport() + } + + override fun navigateToAddAccount() { + callback.navigateToAddAccount() + } + } + return createNode(buildContext, listOf(callback)) + } + + suspend fun attachSession(): LoggedInFlowNode = waitForChildAttached() + + @Composable + override fun View(modifier: Modifier) { + Children( + navModel = navModel, + modifier = modifier, + ) + } +} diff --git a/appnav/src/main/kotlin/io/element/android/appnav/LoggedInEventProcessor.kt b/appnav/src/main/kotlin/io/element/android/appnav/LoggedInEventProcessor.kt new file mode 100644 index 0000000..cee2296 --- /dev/null +++ b/appnav/src/main/kotlin/io/element/android/appnav/LoggedInEventProcessor.kt @@ -0,0 +1,62 @@ +/* + * Copyright (c) 2025 Element Creations Ltd. + * Copyright 2023-2025 New Vector Ltd. + * + * SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial. + * Please see LICENSE files in the repository root for full details. + */ + +package io.element.android.appnav + +import dev.zacsweers.metro.Inject +import io.element.android.libraries.designsystem.utils.snackbar.SnackbarDispatcher +import io.element.android.libraries.designsystem.utils.snackbar.SnackbarMessage +import io.element.android.libraries.matrix.api.room.RoomMembershipObserver +import io.element.android.libraries.matrix.api.timeline.item.event.MembershipChange +import io.element.android.libraries.ui.strings.CommonStrings +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.Job +import kotlinx.coroutines.flow.distinctUntilChanged +import kotlinx.coroutines.flow.filter +import kotlinx.coroutines.flow.launchIn +import kotlinx.coroutines.flow.onEach + +@Inject +class LoggedInEventProcessor( + private val snackbarDispatcher: SnackbarDispatcher, + private val roomMembershipObserver: RoomMembershipObserver, +) { + private var observingJob: Job? = null + + fun observeEvents(coroutineScope: CoroutineScope) { + observingJob = roomMembershipObserver.updates + .filter { !it.isUserInRoom } + .distinctUntilChanged() + .onEach { roomMemberShipUpdate -> + when (roomMemberShipUpdate.change) { + MembershipChange.LEFT -> { + displayMessage( + if (roomMemberShipUpdate.isSpace) { + CommonStrings.common_current_user_left_space + } else { + CommonStrings.common_current_user_left_room + } + ) + } + MembershipChange.INVITATION_REJECTED -> displayMessage(CommonStrings.common_current_user_rejected_invite) + MembershipChange.KNOCK_RETRACTED -> displayMessage(CommonStrings.common_current_user_canceled_knock) + else -> Unit + } + } + .launchIn(coroutineScope) + } + + fun stopObserving() { + observingJob?.cancel() + observingJob = null + } + + private fun displayMessage(message: Int) { + snackbarDispatcher.post(SnackbarMessage(message)) + } +} diff --git a/appnav/src/main/kotlin/io/element/android/appnav/LoggedInFlowNode.kt b/appnav/src/main/kotlin/io/element/android/appnav/LoggedInFlowNode.kt new file mode 100644 index 0000000..38dc39e --- /dev/null +++ b/appnav/src/main/kotlin/io/element/android/appnav/LoggedInFlowNode.kt @@ -0,0 +1,633 @@ +/* + * Copyright (c) 2025 Element Creations Ltd. + * Copyright 2023-2025 New Vector Ltd. + * + * SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial. + * Please see LICENSE files in the repository root for full details. + */ + +package io.element.android.appnav + +import android.content.Intent +import android.os.Parcelable +import androidx.compose.foundation.layout.Box +import androidx.compose.runtime.Composable +import androidx.compose.runtime.collectAsState +import androidx.compose.runtime.getValue +import androidx.compose.runtime.remember +import androidx.compose.ui.Modifier +import androidx.lifecycle.lifecycleScope +import com.bumble.appyx.core.composable.PermanentChild +import com.bumble.appyx.core.lifecycle.subscribe +import com.bumble.appyx.core.modality.BuildContext +import com.bumble.appyx.core.navigation.NavElements +import com.bumble.appyx.core.navigation.NavKey +import com.bumble.appyx.core.navigation.model.permanent.PermanentNavModel +import com.bumble.appyx.core.node.Node +import com.bumble.appyx.core.plugin.Plugin +import com.bumble.appyx.navmodel.backstack.BackStack +import com.bumble.appyx.navmodel.backstack.BackStack.State.ACTIVE +import com.bumble.appyx.navmodel.backstack.BackStack.State.CREATED +import com.bumble.appyx.navmodel.backstack.BackStack.State.STASHED +import com.bumble.appyx.navmodel.backstack.BackStackElement +import com.bumble.appyx.navmodel.backstack.BackStackElements +import com.bumble.appyx.navmodel.backstack.operation.BackStackOperation +import com.bumble.appyx.navmodel.backstack.operation.Push +import com.bumble.appyx.navmodel.backstack.operation.pop +import com.bumble.appyx.navmodel.backstack.operation.push +import com.bumble.appyx.navmodel.backstack.operation.replace +import com.bumble.appyx.navmodel.backstack.operation.singleTop +import dev.zacsweers.metro.Assisted +import dev.zacsweers.metro.AssistedInject +import io.element.android.annotations.ContributesNode +import io.element.android.appnav.loggedin.LoggedInNode +import io.element.android.appnav.loggedin.MediaPreviewConfigMigration +import io.element.android.appnav.loggedin.SendQueues +import io.element.android.appnav.room.RoomFlowNode +import io.element.android.appnav.room.RoomNavigationTarget +import io.element.android.appnav.room.joined.JoinedRoomLoadedFlowNode +import io.element.android.compound.colors.SemanticColorsLightDark +import io.element.android.features.enterprise.api.EnterpriseService +import io.element.android.features.enterprise.api.SessionEnterpriseService +import io.element.android.features.ftue.api.FtueEntryPoint +import io.element.android.features.ftue.api.state.FtueService +import io.element.android.features.ftue.api.state.FtueState +import io.element.android.features.home.api.HomeEntryPoint +import io.element.android.features.networkmonitor.api.NetworkMonitor +import io.element.android.features.networkmonitor.api.NetworkStatus +import io.element.android.features.networkmonitor.api.ui.ConnectivityIndicatorContainer +import io.element.android.features.preferences.api.PreferencesEntryPoint +import io.element.android.features.roomdirectory.api.RoomDescription +import io.element.android.features.roomdirectory.api.RoomDirectoryEntryPoint +import io.element.android.features.securebackup.api.SecureBackupEntryPoint +import io.element.android.features.share.api.ShareEntryPoint +import io.element.android.features.startchat.api.StartChatEntryPoint +import io.element.android.features.userprofile.api.UserProfileEntryPoint +import io.element.android.features.verifysession.api.IncomingVerificationEntryPoint +import io.element.android.libraries.architecture.BackstackView +import io.element.android.libraries.architecture.BaseFlowNode +import io.element.android.libraries.architecture.callback +import io.element.android.libraries.architecture.createNode +import io.element.android.libraries.architecture.waitForChildAttached +import io.element.android.libraries.architecture.waitForNavTargetAttached +import io.element.android.libraries.core.meta.BuildMeta +import io.element.android.libraries.designsystem.theme.ElementThemeApp +import io.element.android.libraries.designsystem.utils.snackbar.SnackbarDispatcher +import io.element.android.libraries.di.SessionScope +import io.element.android.libraries.di.annotations.SessionCoroutineScope +import io.element.android.libraries.matrix.api.MatrixClient +import io.element.android.libraries.matrix.api.core.EventId +import io.element.android.libraries.matrix.api.core.MAIN_SPACE +import io.element.android.libraries.matrix.api.core.RoomId +import io.element.android.libraries.matrix.api.core.RoomIdOrAlias +import io.element.android.libraries.matrix.api.core.UserId +import io.element.android.libraries.matrix.api.core.toRoomIdOrAlias +import io.element.android.libraries.matrix.api.permalink.PermalinkData +import io.element.android.libraries.matrix.api.room.JoinedRoom +import io.element.android.libraries.matrix.api.sync.SyncService +import io.element.android.libraries.matrix.api.verification.SessionVerificationServiceListener +import io.element.android.libraries.matrix.api.verification.VerificationRequest +import io.element.android.libraries.preferences.api.store.AppPreferencesStore +import io.element.android.libraries.push.api.notifications.conversations.NotificationConversationService +import io.element.android.libraries.ui.common.nodes.emptyNode +import io.element.android.services.analytics.api.AnalyticsLongRunningTransaction +import io.element.android.services.analytics.api.AnalyticsService +import io.element.android.services.analytics.api.watchers.AnalyticsRoomListStateWatcher +import io.element.android.services.appnavstate.api.AppNavigationStateService +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.flow.first +import kotlinx.coroutines.flow.launchIn +import kotlinx.coroutines.flow.onEach +import kotlinx.coroutines.launch +import kotlinx.coroutines.withTimeout +import kotlinx.parcelize.Parcelize +import timber.log.Timber +import java.time.Duration +import java.time.Instant +import java.util.Optional +import java.util.UUID +import kotlin.time.Duration.Companion.minutes +import kotlin.time.Duration.Companion.seconds +import kotlin.time.toKotlinDuration +import im.vector.app.features.analytics.plan.JoinedRoom as JoinedRoomAnalyticsEvent + +@ContributesNode(SessionScope::class) +@AssistedInject +class LoggedInFlowNode( + @Assisted buildContext: BuildContext, + @Assisted plugins: List, + private val homeEntryPoint: HomeEntryPoint, + private val preferencesEntryPoint: PreferencesEntryPoint, + private val startChatEntryPoint: StartChatEntryPoint, + private val appNavigationStateService: AppNavigationStateService, + private val secureBackupEntryPoint: SecureBackupEntryPoint, + private val userProfileEntryPoint: UserProfileEntryPoint, + private val ftueEntryPoint: FtueEntryPoint, + @SessionCoroutineScope + private val sessionCoroutineScope: CoroutineScope, + private val ftueService: FtueService, + private val roomDirectoryEntryPoint: RoomDirectoryEntryPoint, + private val shareEntryPoint: ShareEntryPoint, + private val matrixClient: MatrixClient, + private val sendingQueue: SendQueues, + private val incomingVerificationEntryPoint: IncomingVerificationEntryPoint, + private val mediaPreviewConfigMigration: MediaPreviewConfigMigration, + private val sessionEnterpriseService: SessionEnterpriseService, + private val networkMonitor: NetworkMonitor, + private val notificationConversationService: NotificationConversationService, + private val syncService: SyncService, + private val enterpriseService: EnterpriseService, + private val appPreferencesStore: AppPreferencesStore, + private val buildMeta: BuildMeta, + snackbarDispatcher: SnackbarDispatcher, + private val analyticsService: AnalyticsService, + private val analyticsRoomListStateWatcher: AnalyticsRoomListStateWatcher, +) : BaseFlowNode( + backstack = BackStack( + initialElement = NavTarget.Placeholder, + savedStateMap = buildContext.savedStateMap, + ), + permanentNavModel = PermanentNavModel( + navTargets = setOf(NavTarget.LoggedInPermanent), + savedStateMap = buildContext.savedStateMap, + ), + buildContext = buildContext, + plugins = plugins +) { + interface Callback : Plugin { + fun navigateToBugReport() + fun navigateToAddAccount() + } + + private val callback: Callback = callback() + private val loggedInFlowProcessor = LoggedInEventProcessor( + snackbarDispatcher = snackbarDispatcher, + roomMembershipObserver = matrixClient.roomMembershipObserver, + ) + + private val verificationListener = object : SessionVerificationServiceListener { + override fun onIncomingSessionRequest(verificationRequest: VerificationRequest.Incoming) { + // Without this launch the rendering and actual state of this Appyx node's children gets out of sync, resulting in a crash. + // This might be because this method is called back from Rust in a background thread. + lifecycleScope.launch { + val receivedAt = Instant.now() + + // Wait until the app is in foreground to display the incoming verification request + appNavigationStateService.appNavigationState.first { it.isInForeground } + + // TODO there should also be a timeout for > 10 minutes elapsed since the request was created, but the SDK doesn't expose that info yet + val now = Instant.now() + val elapsedTimeSinceReceived = Duration.between(receivedAt, now).toKotlinDuration() + + // Discard the incoming verification request if it has timed out + if (elapsedTimeSinceReceived > 2.minutes) { + Timber.w("Incoming verification request ${verificationRequest.details.flowId} discarded due to timeout.") + return@launch + } + + // Wait for the RoomList UI to be ready so the incoming verification screen can be displayed on top of it + // Otherwise, the RoomList UI may be incorrectly displayed on top + withTimeout(5.seconds) { + backstack.elements.first { elements -> + elements.any { it.key.navTarget == NavTarget.Home } + } + } + + backstack.singleTop(NavTarget.IncomingVerificationRequest(verificationRequest)) + } + } + } + + override fun onBuilt() { + super.onBuilt() + lifecycleScope.launch { + sessionEnterpriseService.init() + } + lifecycle.subscribe( + onCreate = { + analyticsRoomListStateWatcher.start() + appNavigationStateService.onNavigateToSession(id, matrixClient.sessionId) + // TODO We do not support Space yet, so directly navigate to main space + appNavigationStateService.onNavigateToSpace(id, MAIN_SPACE) + loggedInFlowProcessor.observeEvents(sessionCoroutineScope) + 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() + } + + analyticsService.startLongRunningTransaction(AnalyticsLongRunningTransaction.FirstRoomsDisplayed) + + ftueService.state + .onEach { ftueState -> + when (ftueState) { + is FtueState.Unknown -> Unit // Nothing to do + is FtueState.Incomplete -> backstack.safeRoot(NavTarget.Ftue) + is FtueState.Complete -> backstack.safeRoot(NavTarget.Home) + } + } + .launchIn(lifecycleScope) + }, + onResume = { + lifecycleScope.launch { + val availableRoomIds = matrixClient.getJoinedRoomIds().getOrNull() ?: return@launch + notificationConversationService.onAvailableRoomsChanged(sessionId = matrixClient.sessionId, roomIds = availableRoomIds) + } + }, + onDestroy = { + appNavigationStateService.onLeavingSpace(id) + appNavigationStateService.onLeavingSession(id) + loggedInFlowProcessor.stopObserving() + matrixClient.sessionVerificationService.setListener(null) + analyticsRoomListStateWatcher.stop() + } + ) + setupSendingQueue() + } + + private fun setupSendingQueue() { + sendingQueue.launchIn(lifecycleScope) + } + + sealed interface NavTarget : Parcelable { + @Parcelize + data object Placeholder : NavTarget + + @Parcelize + data object LoggedInPermanent : NavTarget + + @Parcelize + data object Home : NavTarget + + @Parcelize + data class Room( + val roomIdOrAlias: RoomIdOrAlias, + val serverNames: List = emptyList(), + val trigger: JoinedRoomAnalyticsEvent.Trigger? = null, + val roomDescription: RoomDescription? = null, + val initialElement: RoomNavigationTarget = RoomNavigationTarget.Root(), + val targetId: UUID = UUID.randomUUID(), + ) : NavTarget + + @Parcelize + data class UserProfile( + val userId: UserId, + ) : NavTarget + + @Parcelize + data class Settings( + val initialElement: PreferencesEntryPoint.InitialTarget = PreferencesEntryPoint.InitialTarget.Root + ) : NavTarget + + @Parcelize + data object CreateRoom : NavTarget + + @Parcelize + data class SecureBackup( + val initialElement: SecureBackupEntryPoint.InitialTarget = SecureBackupEntryPoint.InitialTarget.Root + ) : NavTarget + + @Parcelize + data object Ftue : NavTarget + + @Parcelize + data object RoomDirectory : NavTarget + + @Parcelize + data class IncomingShare(val intent: Intent) : NavTarget + + @Parcelize + data class IncomingVerificationRequest(val data: VerificationRequest.Incoming) : NavTarget + } + + override fun resolve(navTarget: NavTarget, buildContext: BuildContext): Node { + return when (navTarget) { + NavTarget.Placeholder -> emptyNode(buildContext) + NavTarget.LoggedInPermanent -> { + val callback = object : LoggedInNode.Callback { + override fun navigateToNotificationTroubleshoot() { + backstack.push(NavTarget.Settings(PreferencesEntryPoint.InitialTarget.NotificationTroubleshoot)) + } + } + createNode(buildContext, listOf(callback)) + } + NavTarget.Home -> { + val callback = object : HomeEntryPoint.Callback { + override fun navigateToRoom(roomId: RoomId, joinedRoom: JoinedRoom?) { + backstack.push( + NavTarget.Room( + roomIdOrAlias = roomId.toRoomIdOrAlias(), + initialElement = RoomNavigationTarget.Root(joinedRoom = joinedRoom) + ) + ) + } + + override fun navigateToSettings() { + backstack.push(NavTarget.Settings()) + } + + override fun navigateToCreateRoom() { + backstack.push(NavTarget.CreateRoom) + } + + override fun navigateToSetUpRecovery() { + backstack.push(NavTarget.SecureBackup(initialElement = SecureBackupEntryPoint.InitialTarget.Root)) + } + + override fun navigateToEnterRecoveryKey() { + backstack.push(NavTarget.SecureBackup(initialElement = SecureBackupEntryPoint.InitialTarget.EnterRecoveryKey)) + } + + override fun navigateToRoomSettings(roomId: RoomId) { + backstack.push(NavTarget.Room(roomId.toRoomIdOrAlias(), initialElement = RoomNavigationTarget.Details)) + } + + override fun navigateToBugReport() { + callback.navigateToBugReport() + } + } + homeEntryPoint.createNode( + parentNode = this, + buildContext = buildContext, + callback = callback, + ) + } + is NavTarget.Room -> { + val joinedRoomCallback = object : JoinedRoomLoadedFlowNode.Callback { + override fun navigateToRoom(roomId: RoomId, serverNames: List) { + backstack.push(NavTarget.Room(roomId.toRoomIdOrAlias(), serverNames)) + } + + override fun handlePermalinkClick(data: PermalinkData, pushToBackstack: Boolean) { + when (data) { + is PermalinkData.UserLink -> { + // Should not happen (handled by MessagesNode) + Timber.e("User link clicked: ${data.userId}.") + } + is PermalinkData.RoomLink -> { + val target = NavTarget.Room( + roomIdOrAlias = data.roomIdOrAlias, + serverNames = data.viaParameters, + trigger = JoinedRoomAnalyticsEvent.Trigger.Timeline, + initialElement = RoomNavigationTarget.Root(data.eventId), + ) + if (pushToBackstack) { + backstack.push(target) + } else { + backstack.replace(target) + } + } + is PermalinkData.FallbackLink, + is PermalinkData.RoomEmailInviteLink -> { + // Should not happen (handled by MessagesNode) + } + } + } + + override fun navigateToGlobalNotificationSettings() { + backstack.push(NavTarget.Settings(PreferencesEntryPoint.InitialTarget.NotificationSettings)) + } + } + val inputs = RoomFlowNode.Inputs( + roomIdOrAlias = navTarget.roomIdOrAlias, + roomDescription = Optional.ofNullable(navTarget.roomDescription), + serverNames = navTarget.serverNames, + trigger = Optional.ofNullable(navTarget.trigger), + initialElement = navTarget.initialElement + ) + createNode(buildContext, plugins = listOf(inputs, joinedRoomCallback)) + } + is NavTarget.UserProfile -> { + val callback = object : UserProfileEntryPoint.Callback { + override fun navigateToRoom(roomId: RoomId) { + backstack.push(NavTarget.Room(roomId.toRoomIdOrAlias())) + } + } + userProfileEntryPoint.createNode( + parentNode = this, + buildContext = buildContext, + params = UserProfileEntryPoint.Params(userId = navTarget.userId), + callback = callback, + ) + } + is NavTarget.Settings -> { + val callback = object : PreferencesEntryPoint.Callback { + override fun navigateToAddAccount() { + callback.navigateToAddAccount() + } + + override fun navigateToBugReport() { + callback.navigateToBugReport() + } + + override fun navigateToSecureBackup() { + backstack.push(NavTarget.SecureBackup()) + } + + override fun navigateToRoomNotificationSettings(roomId: RoomId) { + backstack.push(NavTarget.Room(roomId.toRoomIdOrAlias(), initialElement = RoomNavigationTarget.NotificationSettings)) + } + + override fun navigateToEvent(roomId: RoomId, eventId: EventId) { + backstack.push(NavTarget.Room(roomId.toRoomIdOrAlias(), initialElement = RoomNavigationTarget.Root(eventId))) + } + } + val inputs = PreferencesEntryPoint.Params(navTarget.initialElement) + preferencesEntryPoint.createNode( + parentNode = this, + buildContext = buildContext, + params = inputs, + callback = callback, + ) + } + NavTarget.CreateRoom -> { + val callback = object : StartChatEntryPoint.Callback { + override fun onRoomCreated(roomIdOrAlias: RoomIdOrAlias, serverNames: List) { + backstack.replace(NavTarget.Room(roomIdOrAlias = roomIdOrAlias, serverNames = serverNames)) + } + + override fun navigateToRoomDirectory() { + backstack.push(NavTarget.RoomDirectory) + } + } + + startChatEntryPoint.createNode( + parentNode = this, + buildContext = buildContext, + callback = callback, + ) + } + is NavTarget.SecureBackup -> { + secureBackupEntryPoint.createNode( + parentNode = this, + buildContext = buildContext, + params = SecureBackupEntryPoint.Params(initialElement = navTarget.initialElement), + callback = object : SecureBackupEntryPoint.Callback { + override fun onDone() { + backstack.pop() + } + }, + ) + } + NavTarget.Ftue -> { + ftueEntryPoint.createNode(this, buildContext) + } + NavTarget.RoomDirectory -> { + roomDirectoryEntryPoint.createNode( + parentNode = this, + buildContext = buildContext, + callback = object : RoomDirectoryEntryPoint.Callback { + override fun navigateToRoom(roomDescription: RoomDescription) { + backstack.push( + NavTarget.Room( + roomIdOrAlias = roomDescription.roomId.toRoomIdOrAlias(), + roomDescription = roomDescription, + trigger = JoinedRoomAnalyticsEvent.Trigger.RoomDirectory, + ) + ) + } + }, + ) + } + is NavTarget.IncomingShare -> { + shareEntryPoint.createNode( + parentNode = this, + buildContext = buildContext, + params = ShareEntryPoint.Params(intent = navTarget.intent), + callback = object : ShareEntryPoint.Callback { + override fun onDone(roomIds: List) { + backstack.pop() + roomIds.singleOrNull()?.let { roomId -> + backstack.push(NavTarget.Room(roomId.toRoomIdOrAlias())) + } + } + }, + ) + } + is NavTarget.IncomingVerificationRequest -> { + incomingVerificationEntryPoint.createNode( + parentNode = this, + buildContext = buildContext, + params = IncomingVerificationEntryPoint.Params(navTarget.data), + callback = object : IncomingVerificationEntryPoint.Callback { + override fun onDone() { + backstack.pop() + } + }, + ) + } + } + } + + suspend fun attachRoom( + roomIdOrAlias: RoomIdOrAlias, + serverNames: List = emptyList(), + trigger: JoinedRoomAnalyticsEvent.Trigger? = null, + eventId: EventId? = null, + clearBackstack: Boolean, + ): RoomFlowNode { + waitForNavTargetAttached { navTarget -> + navTarget is NavTarget.Home + } + attachChild { + val roomNavTarget = NavTarget.Room( + roomIdOrAlias = roomIdOrAlias, + serverNames = serverNames, + trigger = trigger, + initialElement = RoomNavigationTarget.Root(eventId = eventId) + ) + backstack.accept(AttachRoomOperation(roomNavTarget, clearBackstack)) + } + + // If we don't do this check, we might be returning while a previous node with the same type is still displayed + // This means we may attach some new nodes to that one, which will be quickly replaced by the one instantiated above + return waitForChildAttached { + it is NavTarget.Room && + it.roomIdOrAlias == roomIdOrAlias && + it.initialElement is RoomNavigationTarget.Root && + it.initialElement.eventId == eventId + } + } + + suspend fun attachUser(userId: UserId) { + waitForNavTargetAttached { navTarget -> + navTarget is NavTarget.Home + } + attachChild { + backstack.push( + NavTarget.UserProfile( + userId = userId, + ) + ) + } + } + + internal suspend fun attachIncomingShare(intent: Intent) { + waitForNavTargetAttached { navTarget -> + navTarget is NavTarget.Home + } + attachChild { + backstack.push( + NavTarget.IncomingShare(intent) + ) + } + } + + @Composable + override fun View(modifier: Modifier) { + val colors by remember { + enterpriseService.semanticColorsFlow(sessionId = matrixClient.sessionId) + }.collectAsState(SemanticColorsLightDark.default) + ElementThemeApp( + appPreferencesStore = appPreferencesStore, + compoundLight = colors.light, + compoundDark = colors.dark, + buildMeta = buildMeta, + ) { + val isOnline by syncService.isOnline.collectAsState() + ConnectivityIndicatorContainer( + isOnline = isOnline, + modifier = modifier, + ) { contentModifier -> + Box(modifier = contentModifier) { + val ftueState by ftueService.state.collectAsState() + BackstackView() + if (ftueState is FtueState.Complete) { + PermanentChild(permanentNavModel = permanentNavModel, navTarget = NavTarget.LoggedInPermanent) + } + } + } + } + } +} + +@Parcelize +private class AttachRoomOperation( + val roomTarget: LoggedInFlowNode.NavTarget.Room, + val clearBackstack: Boolean, +) : BackStackOperation { + override fun isApplicable(elements: NavElements) = true + + override fun invoke(elements: BackStackElements): BackStackElements { + return if (clearBackstack) { + // Makes sure the room list target is alone in the backstack and stashed + elements.mapNotNull { element -> + if (element.key.navTarget == LoggedInFlowNode.NavTarget.Home) { + element.transitionTo(STASHED, this) + } else { + null + } + } + BackStackElement( + key = NavKey(roomTarget), + fromState = CREATED, + targetState = ACTIVE, + operation = this + ) + } else { + Push(roomTarget).invoke(elements) + } + } +} diff --git a/appnav/src/main/kotlin/io/element/android/appnav/NotLoggedInFlowNode.kt b/appnav/src/main/kotlin/io/element/android/appnav/NotLoggedInFlowNode.kt new file mode 100644 index 0000000..080f3c1 --- /dev/null +++ b/appnav/src/main/kotlin/io/element/android/appnav/NotLoggedInFlowNode.kt @@ -0,0 +1,115 @@ +/* + * Copyright (c) 2025 Element Creations Ltd. + * Copyright 2023-2025 New Vector Ltd. + * + * SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial. + * Please see LICENSE files in the repository root for full details. + */ + +@file:OptIn(DelicateCoilApi::class) + +package io.element.android.appnav + +import android.os.Parcelable +import androidx.compose.runtime.Composable +import androidx.compose.ui.Modifier +import coil3.SingletonImageLoader +import coil3.annotation.DelicateCoilApi +import com.bumble.appyx.core.lifecycle.subscribe +import com.bumble.appyx.core.modality.BuildContext +import com.bumble.appyx.core.node.Node +import com.bumble.appyx.core.plugin.Plugin +import com.bumble.appyx.navmodel.backstack.BackStack +import dev.zacsweers.metro.AppScope +import dev.zacsweers.metro.Assisted +import dev.zacsweers.metro.AssistedInject +import io.element.android.annotations.ContributesNode +import io.element.android.features.login.api.LoginEntryPoint +import io.element.android.features.login.api.LoginParams +import io.element.android.libraries.architecture.BackstackView +import io.element.android.libraries.architecture.BaseFlowNode +import io.element.android.libraries.architecture.NodeInputs +import io.element.android.libraries.architecture.callback +import io.element.android.libraries.architecture.inputs +import io.element.android.libraries.designsystem.utils.ForceOrientationInMobileDevices +import io.element.android.libraries.designsystem.utils.ScreenOrientation +import io.element.android.libraries.matrix.ui.media.ImageLoaderHolder +import io.element.android.services.analytics.api.watchers.AnalyticsColdStartWatcher +import kotlinx.parcelize.Parcelize + +@ContributesNode(AppScope::class) +@AssistedInject +class NotLoggedInFlowNode( + @Assisted buildContext: BuildContext, + @Assisted plugins: List, + private val loginEntryPoint: LoginEntryPoint, + private val imageLoaderHolder: ImageLoaderHolder, + private val analyticsColdStartWatcher: AnalyticsColdStartWatcher, +) : BaseFlowNode( + backstack = BackStack( + initialElement = NavTarget.Root, + savedStateMap = buildContext.savedStateMap + ), + buildContext = buildContext, + plugins = plugins, +) { + data class Params( + val loginParams: LoginParams?, + ) : NodeInputs + + interface Callback : Plugin { + fun navigateToBugReport() + fun onDone() + } + + private val callback: Callback = callback() + private val inputs = inputs() + + override fun onBuilt() { + super.onBuilt() + analyticsColdStartWatcher.whenLoggingIn() + lifecycle.subscribe( + onResume = { + SingletonImageLoader.setUnsafe(imageLoaderHolder.get()) + }, + ) + } + + sealed interface NavTarget : Parcelable { + @Parcelize + data object Root : NavTarget + } + + override fun resolve(navTarget: NavTarget, buildContext: BuildContext): Node { + return when (navTarget) { + NavTarget.Root -> { + val callback = object : LoginEntryPoint.Callback { + override fun navigateToBugReport() { + callback.navigateToBugReport() + } + + override fun onDone() { + callback.onDone() + } + } + loginEntryPoint.createNode( + parentNode = this, + buildContext = buildContext, + params = LoginEntryPoint.Params( + accountProvider = inputs.loginParams?.accountProvider, + loginHint = inputs.loginParams?.loginHint, + ), + callback = callback, + ) + } + } + } + + @Composable + override fun View(modifier: Modifier) { + // The login flow doesn't support landscape mode on mobile devices yet + ForceOrientationInMobileDevices(orientation = ScreenOrientation.PORTRAIT) + + BackstackView() + } +} diff --git a/appnav/src/main/kotlin/io/element/android/appnav/RootFlowNode.kt b/appnav/src/main/kotlin/io/element/android/appnav/RootFlowNode.kt new file mode 100644 index 0000000..4687946 --- /dev/null +++ b/appnav/src/main/kotlin/io/element/android/appnav/RootFlowNode.kt @@ -0,0 +1,478 @@ +/* + * Copyright (c) 2025 Element Creations Ltd. + * Copyright 2023-2025 New Vector Ltd. + * + * SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial. + * Please see LICENSE files in the repository root for full details. + */ + +package io.element.android.appnav + +import android.content.Intent +import android.os.Parcelable +import androidx.compose.animation.core.Spring +import androidx.compose.animation.core.spring +import androidx.compose.runtime.Composable +import androidx.compose.ui.Modifier +import androidx.lifecycle.lifecycleScope +import com.bumble.appyx.core.modality.BuildContext +import com.bumble.appyx.core.node.Node +import com.bumble.appyx.core.plugin.Plugin +import com.bumble.appyx.core.state.MutableSavedStateMap +import com.bumble.appyx.navmodel.backstack.BackStack +import com.bumble.appyx.navmodel.backstack.operation.pop +import com.bumble.appyx.navmodel.backstack.operation.push +import com.bumble.appyx.navmodel.backstack.transitionhandler.rememberBackstackFader +import com.bumble.appyx.navmodel.backstack.transitionhandler.rememberBackstackSlider +import dev.zacsweers.metro.AppScope +import dev.zacsweers.metro.Assisted +import dev.zacsweers.metro.AssistedInject +import im.vector.app.features.analytics.plan.JoinedRoom +import io.element.android.annotations.ContributesNode +import io.element.android.appnav.di.MatrixSessionCache +import io.element.android.appnav.intent.IntentResolver +import io.element.android.appnav.intent.ResolvedIntent +import io.element.android.appnav.room.RoomFlowNode +import io.element.android.appnav.root.RootNavStateFlowFactory +import io.element.android.appnav.root.RootPresenter +import io.element.android.appnav.root.RootView +import io.element.android.features.announcement.api.AnnouncementService +import io.element.android.features.login.api.LoginParams +import io.element.android.features.login.api.accesscontrol.AccountProviderAccessControl +import io.element.android.features.rageshake.api.bugreport.BugReportEntryPoint +import io.element.android.features.signedout.api.SignedOutEntryPoint +import io.element.android.libraries.accountselect.api.AccountSelectEntryPoint +import io.element.android.libraries.architecture.BackstackView +import io.element.android.libraries.architecture.BaseFlowNode +import io.element.android.libraries.architecture.appyx.rememberDelegateTransitionHandler +import io.element.android.libraries.architecture.createNode +import io.element.android.libraries.architecture.waitForChildAttached +import io.element.android.libraries.core.uri.ensureProtocol +import io.element.android.libraries.deeplink.api.DeeplinkData +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.SessionId +import io.element.android.libraries.matrix.api.core.ThreadId +import io.element.android.libraries.matrix.api.core.asEventId +import io.element.android.libraries.matrix.api.core.toRoomIdOrAlias +import io.element.android.libraries.matrix.api.permalink.PermalinkData +import io.element.android.libraries.oidc.api.OidcAction +import io.element.android.libraries.oidc.api.OidcActionFlow +import io.element.android.libraries.sessionstorage.api.LoggedInState +import io.element.android.libraries.sessionstorage.api.SessionStore +import io.element.android.libraries.ui.common.nodes.emptyNode +import io.element.android.services.analytics.api.AnalyticsLongRunningTransaction +import io.element.android.services.analytics.api.AnalyticsService +import io.element.android.services.analytics.api.watchers.AnalyticsColdStartWatcher +import io.element.android.services.appnavstate.api.ROOM_OPENED_FROM_NOTIFICATION +import kotlinx.coroutines.flow.distinctUntilChanged +import kotlinx.coroutines.flow.launchIn +import kotlinx.coroutines.flow.onEach +import kotlinx.coroutines.launch +import kotlinx.parcelize.Parcelize +import timber.log.Timber + +@ContributesNode(AppScope::class) +@AssistedInject +class RootFlowNode( + @Assisted val buildContext: BuildContext, + @Assisted plugins: List, + private val sessionStore: SessionStore, + private val accountProviderAccessControl: AccountProviderAccessControl, + private val navStateFlowFactory: RootNavStateFlowFactory, + private val matrixSessionCache: MatrixSessionCache, + private val presenter: RootPresenter, + private val bugReportEntryPoint: BugReportEntryPoint, + private val signedOutEntryPoint: SignedOutEntryPoint, + private val accountSelectEntryPoint: AccountSelectEntryPoint, + private val intentResolver: IntentResolver, + private val oidcActionFlow: OidcActionFlow, + private val featureFlagService: FeatureFlagService, + private val announcementService: AnnouncementService, + private val analyticsService: AnalyticsService, + private val analyticsColdStartWatcher: AnalyticsColdStartWatcher, +) : BaseFlowNode( + backstack = BackStack( + initialElement = NavTarget.SplashScreen, + savedStateMap = buildContext.savedStateMap, + ), + buildContext = buildContext, + plugins = plugins +) { + override fun onBuilt() { + analyticsColdStartWatcher.start() + matrixSessionCache.restoreWithSavedState(buildContext.savedStateMap) + super.onBuilt() + observeNavState() + } + + override fun onSaveInstanceState(state: MutableSavedStateMap) { + super.onSaveInstanceState(state) + matrixSessionCache.saveIntoSavedState(state) + navStateFlowFactory.saveIntoSavedState(state) + } + + private fun observeNavState() { + navStateFlowFactory.create(buildContext.savedStateMap).distinctUntilChanged().onEach { navState -> + Timber.v("navState=$navState") + when (navState.loggedInState) { + is LoggedInState.LoggedIn -> { + if (navState.loggedInState.isTokenValid) { + tryToRestoreLatestSession( + onSuccess = { sessionId -> switchToLoggedInFlow(sessionId, navState.cacheIndex) }, + onFailure = { switchToNotLoggedInFlow(null) } + ) + } else { + switchToSignedOutFlow(SessionId(navState.loggedInState.sessionId)) + } + } + LoggedInState.NotLoggedIn -> { + switchToNotLoggedInFlow(null) + } + } + }.launchIn(lifecycleScope) + } + + private fun switchToLoggedInFlow(sessionId: SessionId, navId: Int) { + backstack.safeRoot(NavTarget.LoggedInFlow(sessionId, navId)) + } + + private fun switchToNotLoggedInFlow(params: LoginParams?) { + matrixSessionCache.removeAll() + backstack.safeRoot(NavTarget.NotLoggedInFlow(params)) + } + + private fun switchToSignedOutFlow(sessionId: SessionId) { + backstack.safeRoot(NavTarget.SignedOutFlow(sessionId)) + } + + private suspend fun restoreSessionIfNeeded( + sessionId: SessionId, + onFailure: () -> Unit, + onSuccess: (SessionId) -> Unit, + ) { + matrixSessionCache.getOrRestore(sessionId).onSuccess { + Timber.v("Succeed to restore session $sessionId") + onSuccess(sessionId) + }.onFailure { + Timber.e(it, "Failed to restore session $sessionId") + onFailure() + } + } + + private suspend fun tryToRestoreLatestSession( + onSuccess: (SessionId) -> Unit, onFailure: () -> Unit + ) { + val latestSessionId = sessionStore.getLatestSessionId() + if (latestSessionId == null) { + onFailure() + return + } + restoreSessionIfNeeded(latestSessionId, onFailure, onSuccess) + } + + private fun onOpenBugReport() { + backstack.push(NavTarget.BugReport) + } + + @Composable + override fun View(modifier: Modifier) { + val state = presenter.present() + RootView( + state = state, + modifier = modifier, + onOpenBugReport = this::onOpenBugReport, + ) { + val backstackSlider = rememberBackstackSlider( + transitionSpec = { spring(stiffness = Spring.StiffnessMediumLow) }, + ) + val backstackFader = rememberBackstackFader( + transitionSpec = { spring(stiffness = Spring.StiffnessMediumLow) }, + ) + val transitionHandler = rememberDelegateTransitionHandler { navTarget -> + when (navTarget) { + is NavTarget.SplashScreen, + is NavTarget.LoggedInFlow -> backstackFader + else -> backstackSlider + } + } + BackstackView(transitionHandler = transitionHandler) + announcementService.Render(Modifier) + } + } + + sealed interface NavTarget : Parcelable { + @Parcelize data object SplashScreen : NavTarget + + @Parcelize data class AccountSelect( + val currentSessionId: SessionId, + val intent: Intent?, + val permalinkData: PermalinkData?, + ) : NavTarget + + @Parcelize data class NotLoggedInFlow( + val params: LoginParams? + ) : NavTarget + + @Parcelize data class LoggedInFlow( + val sessionId: SessionId, val navId: Int + ) : NavTarget + + @Parcelize data class SignedOutFlow( + val sessionId: SessionId + ) : NavTarget + + @Parcelize data object BugReport : NavTarget + } + + override fun resolve(navTarget: NavTarget, buildContext: BuildContext): Node { + return when (navTarget) { + is NavTarget.LoggedInFlow -> { + val matrixClient = matrixSessionCache.getOrNull(navTarget.sessionId) + ?: return emptyNode(buildContext).also { + Timber.w("Couldn't find any session, go through SplashScreen") + } + val inputs = LoggedInAppScopeFlowNode.Inputs(matrixClient) + val callback = object : LoggedInAppScopeFlowNode.Callback { + override fun navigateToBugReport() { + backstack.push(NavTarget.BugReport) + } + + override fun navigateToAddAccount() { + backstack.push(NavTarget.NotLoggedInFlow(null)) + } + } + createNode(buildContext, plugins = listOf(inputs, callback)) + } + is NavTarget.NotLoggedInFlow -> { + val callback = object : NotLoggedInFlowNode.Callback { + override fun navigateToBugReport() { + backstack.push(NavTarget.BugReport) + } + + override fun onDone() { + backstack.pop() + } + } + val params = NotLoggedInFlowNode.Params( + loginParams = navTarget.params, + ) + createNode(buildContext, plugins = listOf(params, callback)) + } + is NavTarget.SignedOutFlow -> { + signedOutEntryPoint.createNode( + parentNode = this, + buildContext = buildContext, + params = SignedOutEntryPoint.Params( + sessionId = navTarget.sessionId, + ), + ) + } + NavTarget.SplashScreen -> emptyNode(buildContext) + NavTarget.BugReport -> { + val callback = object : BugReportEntryPoint.Callback { + override fun onDone() { + backstack.pop() + } + } + bugReportEntryPoint.createNode( + parentNode = this, + buildContext = buildContext, + callback = callback, + ) + } + is NavTarget.AccountSelect -> { + val callback: AccountSelectEntryPoint.Callback = object : AccountSelectEntryPoint.Callback { + override fun onAccountSelected(sessionId: SessionId) { + lifecycleScope.launch { + if (sessionId == navTarget.currentSessionId) { + // Ensure that the account selection Node is removed from the backstack + // Do not pop when the account is changed to avoid a UI flicker. + backstack.pop() + } + attachSession(sessionId).apply { + if (navTarget.intent != null) { + attachIncomingShare(navTarget.intent) + } else if (navTarget.permalinkData != null) { + attachPermalinkData(navTarget.permalinkData) + } + } + } + } + + override fun onCancel() { + backstack.pop() + } + } + accountSelectEntryPoint.createNode( + parentNode = this, + buildContext = buildContext, + callback = callback, + ) + } + } + } + + suspend fun handleIntent(intent: Intent) { + val resolvedIntent = intentResolver.resolve(intent) ?: return + when (resolvedIntent) { + is ResolvedIntent.Navigation -> { + val openingRoomFromNotification = intent.getBooleanExtra(ROOM_OPENED_FROM_NOTIFICATION, false) + if (openingRoomFromNotification && resolvedIntent.deeplinkData is DeeplinkData.Room) { + analyticsService.startLongRunningTransaction(AnalyticsLongRunningTransaction.NotificationTapOpensTimeline) + } + navigateTo(resolvedIntent.deeplinkData) + } + is ResolvedIntent.Login -> onLoginLink(resolvedIntent.params) + is ResolvedIntent.Oidc -> onOidcAction(resolvedIntent.oidcAction) + is ResolvedIntent.Permalink -> navigateTo(resolvedIntent.permalinkData) + is ResolvedIntent.IncomingShare -> onIncomingShare(resolvedIntent.intent) + } + } + + private suspend fun onLoginLink(params: LoginParams) { + if (accountProviderAccessControl.isAllowedToConnectToAccountProvider(params.accountProvider.ensureProtocol())) { + // Is there a session already? + val sessions = sessionStore.getAllSessions() + if (sessions.isNotEmpty()) { + if (featureFlagService.isFeatureEnabled(FeatureFlags.MultiAccount)) { + val loginHintMatrixId = params.loginHint?.removePrefix("mxid:") + val existingAccount = sessions.find { it.userId == loginHintMatrixId } + if (existingAccount != null) { + // We have an existing account matching the login hint, ensure this is the current session + sessionStore.setLatestSession(existingAccount.userId) + } else { + val latestSessionId = sessions.maxBy { it.lastUsageIndex }.userId + attachSession(SessionId(latestSessionId)) + backstack.push(NavTarget.NotLoggedInFlow(params)) + } + } else { + Timber.w("Login link ignored, multi account is disabled") + } + } else { + switchToNotLoggedInFlow(params) + } + } else { + Timber.w("Login link ignored, we are not allowed to connect to the homeserver") + } + } + + private suspend fun onIncomingShare(intent: Intent) { + // Is there a session already? + val latestSessionId = sessionStore.getLatestSessionId() + if (latestSessionId == null) { + // No session, open login + switchToNotLoggedInFlow(null) + } else { + // wait for the current session to be restored + val loggedInFlowNode = attachSession(latestSessionId) + if (sessionStore.numberOfSessions() > 1) { + // Several accounts, let the user choose which one to use + backstack.push( + NavTarget.AccountSelect( + currentSessionId = latestSessionId, + intent = intent, + permalinkData = null, + ) + ) + } else { + // Only one account, directly attach the incoming share node. + loggedInFlowNode.attachIncomingShare(intent) + } + } + } + + private suspend fun navigateTo(permalinkData: PermalinkData) { + Timber.d("Navigating to $permalinkData") + // Is there a session already? + val latestSessionId = sessionStore.getLatestSessionId() + if (latestSessionId == null) { + // No session, open login + switchToNotLoggedInFlow(null) + } else { + // wait for the current session to be restored + val loggedInFlowNode = attachSession(latestSessionId) + when (permalinkData) { + is PermalinkData.FallbackLink -> Unit + is PermalinkData.RoomEmailInviteLink -> Unit + else -> { + if (sessionStore.numberOfSessions() > 1) { + // Several accounts, let the user choose which one to use + backstack.push( + NavTarget.AccountSelect( + currentSessionId = latestSessionId, + intent = null, + permalinkData = permalinkData, + ) + ) + } else { + // Only one account, directly attach the room or the user node. + loggedInFlowNode.attachPermalinkData(permalinkData) + } + } + } + } + } + + private suspend fun LoggedInFlowNode.attachPermalinkData(permalinkData: PermalinkData) { + when (permalinkData) { + is PermalinkData.FallbackLink -> Unit + is PermalinkData.RoomEmailInviteLink -> Unit + is PermalinkData.RoomLink -> { + // If there is a thread id, focus on it in the main timeline + val focusedEventId = if (permalinkData.threadId != null) { + permalinkData.threadId?.asEventId() + } else { + permalinkData.eventId + } + attachRoom( + roomIdOrAlias = permalinkData.roomIdOrAlias, + trigger = JoinedRoom.Trigger.MobilePermalink, + serverNames = permalinkData.viaParameters, + eventId = focusedEventId, + clearBackstack = true + ).maybeAttachThread(permalinkData.threadId, permalinkData.eventId) + } + is PermalinkData.UserLink -> { + attachUser(permalinkData.userId) + } + } + } + + private suspend fun RoomFlowNode.maybeAttachThread(threadId: ThreadId?, focusedEventId: EventId?) { + if (threadId != null) { + attachThread(threadId, focusedEventId) + } + } + + private suspend fun navigateTo(deeplinkData: DeeplinkData) { + Timber.d("Navigating to $deeplinkData") + attachSession(deeplinkData.sessionId).let { loggedInFlowNode -> + when (deeplinkData) { + is DeeplinkData.Root -> Unit // The room list will always be shown, observing FtueState + is DeeplinkData.Room -> { + loggedInFlowNode.attachRoom( + roomIdOrAlias = deeplinkData.roomId.toRoomIdOrAlias(), + eventId = if (deeplinkData.threadId != null) deeplinkData.threadId?.asEventId() else deeplinkData.eventId, + clearBackstack = true, + ).maybeAttachThread(deeplinkData.threadId, deeplinkData.eventId) + } + } + } + } + + private fun onOidcAction(oidcAction: OidcAction) { + oidcActionFlow.post(oidcAction) + } + + private suspend fun attachSession(sessionId: SessionId): LoggedInFlowNode { + // Ensure that the session is the latest one + sessionStore.setLatestSession(sessionId.value) + return waitForChildAttached { navTarget -> + navTarget is NavTarget.LoggedInFlow && navTarget.sessionId == sessionId + }.attachSession() + } +} + +private suspend fun SessionStore.getLatestSessionId() = getLatestSession()?.userId?.let(::SessionId) diff --git a/appnav/src/main/kotlin/io/element/android/appnav/di/MatrixSessionCache.kt b/appnav/src/main/kotlin/io/element/android/appnav/di/MatrixSessionCache.kt new file mode 100644 index 0000000..4af64cb --- /dev/null +++ b/appnav/src/main/kotlin/io/element/android/appnav/di/MatrixSessionCache.kt @@ -0,0 +1,126 @@ +/* + * Copyright (c) 2025 Element Creations Ltd. + * Copyright 2023-2025 New Vector Ltd. + * + * SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial. + * Please see LICENSE files in the repository root for full details. + */ + +package io.element.android.appnav.di + +import androidx.annotation.VisibleForTesting +import com.bumble.appyx.core.state.MutableSavedStateMap +import com.bumble.appyx.core.state.SavedStateMap +import dev.zacsweers.metro.AppScope +import dev.zacsweers.metro.ContributesBinding +import dev.zacsweers.metro.SingleIn +import io.element.android.libraries.matrix.api.MatrixClient +import io.element.android.libraries.matrix.api.MatrixClientProvider +import io.element.android.libraries.matrix.api.auth.MatrixAuthenticationService +import io.element.android.libraries.matrix.api.core.SessionId +import kotlinx.coroutines.runBlocking +import kotlinx.coroutines.sync.Mutex +import kotlinx.coroutines.sync.withLock +import timber.log.Timber +import java.util.concurrent.ConcurrentHashMap + +private const val SAVE_INSTANCE_KEY = "io.element.android.x.di.MatrixClientsHolder.SaveInstanceKey" + +/** + * In-memory cache for logged in Matrix sessions. + * + * This component contains both the [MatrixClient] and the [SyncOrchestrator] for each session. + */ +@SingleIn(AppScope::class) +@ContributesBinding(AppScope::class) +class MatrixSessionCache( + private val authenticationService: MatrixAuthenticationService, + private val syncOrchestratorFactory: SyncOrchestrator.Factory, +) : MatrixClientProvider { + private val sessionIdsToMatrixSession = ConcurrentHashMap() + private val restoreMutex = Mutex() + + init { + authenticationService.listenToNewMatrixClients { matrixClient -> + onNewMatrixClient(matrixClient) + } + } + + fun removeAll() { + sessionIdsToMatrixSession.clear() + } + + fun remove(sessionId: SessionId) { + sessionIdsToMatrixSession.remove(sessionId) + } + + override fun getOrNull(sessionId: SessionId): MatrixClient? { + return sessionIdsToMatrixSession[sessionId]?.matrixClient + } + + override suspend fun getOrRestore(sessionId: SessionId): Result { + return restoreMutex.withLock { + when (val cached = getOrNull(sessionId)) { + null -> restore(sessionId) + else -> Result.success(cached) + } + } + } + + @VisibleForTesting(otherwise = VisibleForTesting.PRIVATE) + internal fun getSyncOrchestrator(sessionId: SessionId): SyncOrchestrator? { + return sessionIdsToMatrixSession[sessionId]?.syncOrchestrator + } + + @Suppress("UNCHECKED_CAST") + fun restoreWithSavedState(state: SavedStateMap?) { + Timber.d("Restore state") + if (state == null || sessionIdsToMatrixSession.isNotEmpty()) { + Timber.w("Restore with non-empty map") + return + } + val sessionIds = state[SAVE_INSTANCE_KEY] as? Array + Timber.d("Restore matrix session keys = ${sessionIds?.map { it.value }}") + if (sessionIds.isNullOrEmpty()) return + // Not ideal but should only happens in case of process recreation. This ensure we restore all the active sessions before restoring the node graphs. + runBlocking { + sessionIds.forEach { sessionId -> + getOrRestore(sessionId) + } + } + } + + fun saveIntoSavedState(state: MutableSavedStateMap) { + val sessionKeys = sessionIdsToMatrixSession.keys.toTypedArray() + Timber.d("Save matrix session keys = ${sessionKeys.map { it.value }}") + state[SAVE_INSTANCE_KEY] = sessionKeys + } + + private suspend fun restore(sessionId: SessionId): Result { + Timber.d("Restore matrix session: $sessionId") + return authenticationService.restoreSession(sessionId) + .onSuccess { matrixClient -> + onNewMatrixClient(matrixClient) + } + .onFailure { + Timber.e(it, "Fail to restore session") + } + } + + private fun onNewMatrixClient(matrixClient: MatrixClient) { + val syncOrchestrator = syncOrchestratorFactory.create( + syncService = matrixClient.syncService, + sessionCoroutineScope = matrixClient.sessionCoroutineScope, + ) + sessionIdsToMatrixSession[matrixClient.sessionId] = InMemoryMatrixSession( + matrixClient = matrixClient, + syncOrchestrator = syncOrchestrator, + ) + syncOrchestrator.start() + } +} + +private data class InMemoryMatrixSession( + val matrixClient: MatrixClient, + val syncOrchestrator: SyncOrchestrator, +) diff --git a/appnav/src/main/kotlin/io/element/android/appnav/di/RoomGraphFactory.kt b/appnav/src/main/kotlin/io/element/android/appnav/di/RoomGraphFactory.kt new file mode 100644 index 0000000..2d5244c --- /dev/null +++ b/appnav/src/main/kotlin/io/element/android/appnav/di/RoomGraphFactory.kt @@ -0,0 +1,15 @@ +/* + * Copyright (c) 2025 Element Creations Ltd. + * Copyright 2023-2025 New Vector Ltd. + * + * SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial. + * Please see LICENSE files in the repository root for full details. + */ + +package io.element.android.appnav.di + +import io.element.android.libraries.matrix.api.room.JoinedRoom + +fun interface RoomGraphFactory { + fun create(room: JoinedRoom): Any +} diff --git a/appnav/src/main/kotlin/io/element/android/appnav/di/SessionGraphFactory.kt b/appnav/src/main/kotlin/io/element/android/appnav/di/SessionGraphFactory.kt new file mode 100644 index 0000000..bc39604 --- /dev/null +++ b/appnav/src/main/kotlin/io/element/android/appnav/di/SessionGraphFactory.kt @@ -0,0 +1,15 @@ +/* + * Copyright (c) 2025 Element Creations Ltd. + * Copyright 2023-2025 New Vector Ltd. + * + * SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial. + * Please see LICENSE files in the repository root for full details. + */ + +package io.element.android.appnav.di + +import io.element.android.libraries.matrix.api.MatrixClient + +interface SessionGraphFactory { + fun create(client: MatrixClient): Any +} diff --git a/appnav/src/main/kotlin/io/element/android/appnav/di/SyncOrchestrator.kt b/appnav/src/main/kotlin/io/element/android/appnav/di/SyncOrchestrator.kt new file mode 100644 index 0000000..53ce50a --- /dev/null +++ b/appnav/src/main/kotlin/io/element/android/appnav/di/SyncOrchestrator.kt @@ -0,0 +1,144 @@ +/* + * Copyright (c) 2025 Element Creations Ltd. + * Copyright 2025 New Vector Ltd. + * + * SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial. + * Please see LICENSE files in the repository root for full details. + */ + +package io.element.android.appnav.di + +import androidx.annotation.VisibleForTesting +import dev.zacsweers.metro.Assisted +import dev.zacsweers.metro.AssistedFactory +import dev.zacsweers.metro.AssistedInject +import io.element.android.features.networkmonitor.api.NetworkMonitor +import io.element.android.features.networkmonitor.api.NetworkStatus +import io.element.android.libraries.core.coroutine.CoroutineDispatchers +import io.element.android.libraries.core.coroutine.childScope +import io.element.android.libraries.matrix.api.sync.SyncService +import io.element.android.libraries.matrix.api.sync.SyncState +import io.element.android.services.analytics.api.AnalyticsService +import io.element.android.services.analytics.api.recordTransaction +import io.element.android.services.appnavstate.api.AppForegroundStateService +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.FlowPreview +import kotlinx.coroutines.flow.combine +import kotlinx.coroutines.flow.debounce +import kotlinx.coroutines.flow.distinctUntilChanged +import kotlinx.coroutines.flow.first +import kotlinx.coroutines.flow.onCompletion +import kotlinx.coroutines.launch +import timber.log.Timber +import java.util.concurrent.atomic.AtomicBoolean +import kotlin.time.Duration.Companion.milliseconds +import kotlin.time.Duration.Companion.seconds + +@AssistedInject +class SyncOrchestrator( + @Assisted private val syncService: SyncService, + @Assisted sessionCoroutineScope: CoroutineScope, + private val appForegroundStateService: AppForegroundStateService, + private val networkMonitor: NetworkMonitor, + dispatchers: CoroutineDispatchers, + private val analyticsService: AnalyticsService, +) { + @AssistedFactory + interface Factory { + fun create( + syncService: SyncService, + sessionCoroutineScope: CoroutineScope, + ): SyncOrchestrator + } + + private val tag = "SyncOrchestrator" + + private val coroutineScope = sessionCoroutineScope.childScope(dispatchers.io, tag) + + private val started = AtomicBoolean(false) + + /** + * Starting observing the app state and network state to start/stop the sync service. + * + * Before observing the state, a first attempt at starting the sync service will happen if it's not already running. + */ + fun start() { + if (!started.compareAndSet(false, true)) { + Timber.tag(tag).d("already started, exiting early") + return + } + + coroutineScope.launch { + // Perform an initial sync if the sync service is not running, to check whether the homeserver is accessible + // Otherwise, if the device is offline the sync service will never start and the SyncState will be Idle, not Offline + Timber.tag(tag).d("performing initial sync attempt") + analyticsService.recordTransaction("First sync", "syncService.startSync()") { transaction -> + syncService.startSync() + + // Wait until the sync service is not idle, either it will be running or in error/offline state + val firstState = syncService.syncState.first { it != SyncState.Idle } + transaction.setData("first_sync_state", firstState.name) + } + + observeStates() + } + } + + @OptIn(FlowPreview::class) + @VisibleForTesting(otherwise = VisibleForTesting.PRIVATE) + internal fun observeStates() = coroutineScope.launch { + Timber.tag(tag).d("start observing the app and network state") + + val isAppActiveFlow = combine( + appForegroundStateService.isInForeground, + appForegroundStateService.isInCall, + appForegroundStateService.isSyncingNotificationEvent, + appForegroundStateService.hasRingingCall, + ) { isInForeground, isInCall, isSyncingNotificationEvent, hasRingingCall -> + isInForeground || isInCall || isSyncingNotificationEvent || hasRingingCall + } + + combine( + // small debounce to avoid spamming startSync when the state is changing quickly in case of error. + syncService.syncState.debounce(100.milliseconds), + networkMonitor.connectivity, + isAppActiveFlow, + ) { syncState, networkState, isAppActive -> + val isNetworkAvailable = networkState == NetworkStatus.Connected + + Timber.tag(tag).d("isAppActive=$isAppActive, isNetworkAvailable=$isNetworkAvailable") + if (syncState == SyncState.Running && !isAppActive) { + SyncStateAction.StopSync + } else if (syncState == SyncState.Idle && isAppActive && isNetworkAvailable) { + SyncStateAction.StartSync + } else { + SyncStateAction.NoOp + } + } + .distinctUntilChanged() + .debounce { action -> + // Don't stop the sync immediately, wait a bit to avoid starting/stopping the sync too often + if (action == SyncStateAction.StopSync) 3.seconds else 0.seconds + } + .onCompletion { + Timber.tag(tag).d("has been stopped") + } + .collect { action -> + when (action) { + SyncStateAction.StartSync -> { + syncService.startSync() + } + SyncStateAction.StopSync -> { + syncService.stopSync() + } + SyncStateAction.NoOp -> Unit + } + } + } +} + +private enum class SyncStateAction { + StartSync, + StopSync, + NoOp, +} diff --git a/appnav/src/main/kotlin/io/element/android/appnav/di/TimelineBindings.kt b/appnav/src/main/kotlin/io/element/android/appnav/di/TimelineBindings.kt new file mode 100644 index 0000000..cb78760 --- /dev/null +++ b/appnav/src/main/kotlin/io/element/android/appnav/di/TimelineBindings.kt @@ -0,0 +1,17 @@ +/* + * Copyright (c) 2025 Element Creations Ltd. + * Copyright 2025 New Vector Ltd. + * + * SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial. + * Please see LICENSE files in the repository root for full details. + */ + +package io.element.android.appnav.di + +import io.element.android.features.messages.api.pinned.PinnedEventsTimelineProvider +import io.element.android.libraries.matrix.api.timeline.TimelineProvider + +interface TimelineBindings { + val timelineProvider: TimelineProvider + val pinnedEventsTimelineProvider: PinnedEventsTimelineProvider +} diff --git a/appnav/src/main/kotlin/io/element/android/appnav/intent/IntentResolver.kt b/appnav/src/main/kotlin/io/element/android/appnav/intent/IntentResolver.kt new file mode 100644 index 0000000..3e26130 --- /dev/null +++ b/appnav/src/main/kotlin/io/element/android/appnav/intent/IntentResolver.kt @@ -0,0 +1,77 @@ +/* + * Copyright (c) 2025 Element Creations Ltd. + * Copyright 2023-2025 New Vector Ltd. + * + * SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial. + * Please see LICENSE files in the repository root for full details. + */ + +package io.element.android.appnav.intent + +import android.content.Intent +import dev.zacsweers.metro.Inject +import io.element.android.features.login.api.LoginIntentResolver +import io.element.android.features.login.api.LoginParams +import io.element.android.libraries.deeplink.api.DeeplinkData +import io.element.android.libraries.deeplink.api.DeeplinkParser +import io.element.android.libraries.matrix.api.permalink.PermalinkData +import io.element.android.libraries.matrix.api.permalink.PermalinkParser +import io.element.android.libraries.oidc.api.OidcAction +import io.element.android.libraries.oidc.api.OidcIntentResolver +import timber.log.Timber + +sealed interface ResolvedIntent { + data class Navigation(val deeplinkData: DeeplinkData) : ResolvedIntent + data class Oidc(val oidcAction: OidcAction) : ResolvedIntent + data class Permalink(val permalinkData: PermalinkData) : ResolvedIntent + data class Login(val params: LoginParams) : ResolvedIntent + data class IncomingShare(val intent: Intent) : ResolvedIntent +} + +@Inject +class IntentResolver( + private val deeplinkParser: DeeplinkParser, + private val loginIntentResolver: LoginIntentResolver, + private val oidcIntentResolver: OidcIntentResolver, + private val permalinkParser: PermalinkParser, +) { + fun resolve(intent: Intent): ResolvedIntent? { + if (intent.canBeIgnored()) return null + + // Coming from a notification? + val deepLinkData = deeplinkParser.getFromIntent(intent) + if (deepLinkData != null) return ResolvedIntent.Navigation(deepLinkData) + + // Coming during login using Oidc? + val oidcAction = oidcIntentResolver.resolve(intent) + if (oidcAction != null) return ResolvedIntent.Oidc(oidcAction) + + val actionViewData = intent + .takeIf { it.action == Intent.ACTION_VIEW } + ?.dataString + + // Mobile configuration link clicked? (mobile.element.io) + val mobileLoginData = actionViewData + ?.let { loginIntentResolver.parse(it) } + if (mobileLoginData != null) return ResolvedIntent.Login(mobileLoginData) + + // External link clicked? (matrix.to, element.io, etc.) + val permalinkData = actionViewData + ?.let { permalinkParser.parse(it) } + ?.takeIf { it !is PermalinkData.FallbackLink } + if (permalinkData != null) return ResolvedIntent.Permalink(permalinkData) + + if (intent.action == Intent.ACTION_SEND || intent.action == Intent.ACTION_SEND_MULTIPLE) { + return ResolvedIntent.IncomingShare(intent) + } + + // Unknown intent + Timber.w("Unknown intent") + return null + } +} + +private fun Intent.canBeIgnored(): Boolean { + return action == Intent.ACTION_MAIN && + categories?.contains(Intent.CATEGORY_LAUNCHER) == true +} diff --git a/appnav/src/main/kotlin/io/element/android/appnav/loggedin/AnalyticsVerificationStateExt.kt b/appnav/src/main/kotlin/io/element/android/appnav/loggedin/AnalyticsVerificationStateExt.kt new file mode 100644 index 0000000..714645d --- /dev/null +++ b/appnav/src/main/kotlin/io/element/android/appnav/loggedin/AnalyticsVerificationStateExt.kt @@ -0,0 +1,51 @@ +/* + * Copyright (c) 2025 Element Creations Ltd. + * Copyright 2024, 2025 New Vector Ltd. + * + * SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial. + * Please see LICENSE files in the repository root for full details. + */ + +package io.element.android.appnav.loggedin + +import im.vector.app.features.analytics.plan.CryptoSessionStateChange +import im.vector.app.features.analytics.plan.UserProperties +import io.element.android.libraries.matrix.api.encryption.RecoveryState +import io.element.android.libraries.matrix.api.verification.SessionVerifiedStatus + +fun SessionVerifiedStatus.toAnalyticsUserPropertyValue(): UserProperties.VerificationState? { + return when (this) { + // we don't need to report transient states + SessionVerifiedStatus.Unknown -> null + SessionVerifiedStatus.NotVerified -> UserProperties.VerificationState.NotVerified + SessionVerifiedStatus.Verified -> UserProperties.VerificationState.Verified + } +} + +fun RecoveryState.toAnalyticsUserPropertyValue(): UserProperties.RecoveryState? { + return when (this) { + RecoveryState.ENABLED -> UserProperties.RecoveryState.Enabled + RecoveryState.DISABLED -> UserProperties.RecoveryState.Disabled + RecoveryState.INCOMPLETE -> UserProperties.RecoveryState.Incomplete + // we don't need to report transient states + else -> null + } +} +fun SessionVerifiedStatus.toAnalyticsStateChangeValue(): CryptoSessionStateChange.VerificationState? { + return when (this) { + // we don't need to report transient states + SessionVerifiedStatus.Unknown -> null + SessionVerifiedStatus.NotVerified -> CryptoSessionStateChange.VerificationState.NotVerified + SessionVerifiedStatus.Verified -> CryptoSessionStateChange.VerificationState.Verified + } +} + +fun RecoveryState.toAnalyticsStateChangeValue(): CryptoSessionStateChange.RecoveryState? { + return when (this) { + RecoveryState.ENABLED -> CryptoSessionStateChange.RecoveryState.Enabled + RecoveryState.DISABLED -> CryptoSessionStateChange.RecoveryState.Disabled + RecoveryState.INCOMPLETE -> CryptoSessionStateChange.RecoveryState.Incomplete + // we don't need to report transient states + else -> null + } +} diff --git a/appnav/src/main/kotlin/io/element/android/appnav/loggedin/LoggedInEvents.kt b/appnav/src/main/kotlin/io/element/android/appnav/loggedin/LoggedInEvents.kt new file mode 100644 index 0000000..d2a9c92 --- /dev/null +++ b/appnav/src/main/kotlin/io/element/android/appnav/loggedin/LoggedInEvents.kt @@ -0,0 +1,15 @@ +/* + * Copyright (c) 2025 Element Creations Ltd. + * Copyright 2024, 2025 New Vector Ltd. + * + * SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial. + * Please see LICENSE files in the repository root for full details. + */ + +package io.element.android.appnav.loggedin + +sealed interface LoggedInEvents { + data class CloseErrorDialog(val doNotShowAgain: Boolean) : LoggedInEvents + data object CheckSlidingSyncProxyAvailability : LoggedInEvents + data object LogoutAndMigrateToNativeSlidingSync : LoggedInEvents +} diff --git a/appnav/src/main/kotlin/io/element/android/appnav/loggedin/LoggedInNode.kt b/appnav/src/main/kotlin/io/element/android/appnav/loggedin/LoggedInNode.kt new file mode 100644 index 0000000..c49ca42 --- /dev/null +++ b/appnav/src/main/kotlin/io/element/android/appnav/loggedin/LoggedInNode.kt @@ -0,0 +1,47 @@ +/* + * Copyright (c) 2025 Element Creations Ltd. + * Copyright 2023-2025 New Vector Ltd. + * + * SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial. + * Please see LICENSE files in the repository root for full details. + */ + +package io.element.android.appnav.loggedin + +import 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 dev.zacsweers.metro.Assisted +import dev.zacsweers.metro.AssistedInject +import io.element.android.annotations.ContributesNode +import io.element.android.libraries.architecture.callback +import io.element.android.libraries.di.SessionScope + +@ContributesNode(SessionScope::class) +@AssistedInject +class LoggedInNode( + @Assisted buildContext: BuildContext, + @Assisted plugins: List, + private val loggedInPresenter: LoggedInPresenter, +) : Node( + buildContext = buildContext, + plugins = plugins +) { + interface Callback : Plugin { + fun navigateToNotificationTroubleshoot() + } + + private val callback: Callback = callback() + + @Composable + override fun View(modifier: Modifier) { + val loggedInState = loggedInPresenter.present() + LoggedInView( + state = loggedInState, + navigateToNotificationTroubleshoot = callback::navigateToNotificationTroubleshoot, + modifier = modifier + ) + } +} diff --git a/appnav/src/main/kotlin/io/element/android/appnav/loggedin/LoggedInPresenter.kt b/appnav/src/main/kotlin/io/element/android/appnav/loggedin/LoggedInPresenter.kt new file mode 100644 index 0000000..184766e --- /dev/null +++ b/appnav/src/main/kotlin/io/element/android/appnav/loggedin/LoggedInPresenter.kt @@ -0,0 +1,172 @@ +/* + * Copyright (c) 2025 Element Creations Ltd. + * Copyright 2023-2025 New Vector Ltd. + * + * SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial. + * Please see LICENSE files in the repository root for full details. + */ + +package io.element.android.appnav.loggedin + +import androidx.compose.runtime.Composable +import androidx.compose.runtime.LaunchedEffect +import androidx.compose.runtime.MutableState +import androidx.compose.runtime.collectAsState +import androidx.compose.runtime.derivedStateOf +import androidx.compose.runtime.getValue +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.remember +import androidx.compose.runtime.rememberCoroutineScope +import androidx.compose.runtime.setValue +import dev.zacsweers.metro.Inject +import im.vector.app.features.analytics.plan.CryptoSessionStateChange +import im.vector.app.features.analytics.plan.UserProperties +import io.element.android.libraries.architecture.AsyncData +import io.element.android.libraries.architecture.Presenter +import io.element.android.libraries.core.extensions.runCatchingExceptions +import io.element.android.libraries.core.log.logger.LoggerTag +import io.element.android.libraries.core.meta.BuildMeta +import io.element.android.libraries.matrix.api.MatrixClient +import io.element.android.libraries.matrix.api.encryption.EncryptionService +import io.element.android.libraries.matrix.api.encryption.RecoveryState +import io.element.android.libraries.matrix.api.oidc.AccountManagementAction +import io.element.android.libraries.matrix.api.roomlist.RoomListService +import io.element.android.libraries.matrix.api.sync.SlidingSyncVersion +import io.element.android.libraries.matrix.api.sync.SyncService +import io.element.android.libraries.matrix.api.verification.SessionVerificationService +import io.element.android.libraries.matrix.api.verification.SessionVerifiedStatus +import io.element.android.libraries.push.api.PushService +import io.element.android.libraries.push.api.PusherRegistrationFailure +import io.element.android.services.analytics.api.AnalyticsService +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.flow.combine +import kotlinx.coroutines.flow.launchIn +import kotlinx.coroutines.flow.onEach +import kotlinx.coroutines.launch +import timber.log.Timber + +private val pusherTag = LoggerTag("Pusher", LoggerTag.PushLoggerTag) + +@Inject +class LoggedInPresenter( + private val matrixClient: MatrixClient, + private val syncService: SyncService, + private val pushService: PushService, + private val sessionVerificationService: SessionVerificationService, + private val analyticsService: AnalyticsService, + private val encryptionService: EncryptionService, + private val buildMeta: BuildMeta, +) : Presenter { + @Composable + override fun present(): LoggedInState { + val coroutineScope = rememberCoroutineScope() + val ignoreRegistrationError by remember { + pushService.ignoreRegistrationError(matrixClient.sessionId) + }.collectAsState(initial = false) + val pusherRegistrationState = remember>> { mutableStateOf(AsyncData.Uninitialized) } + LaunchedEffect(Unit) { preloadAccountManagementUrl() } + LaunchedEffect(Unit) { + sessionVerificationService.sessionVerifiedStatus + .onEach { sessionVerifiedStatus -> + when (sessionVerifiedStatus) { + SessionVerifiedStatus.Unknown -> Unit + SessionVerifiedStatus.Verified -> { + Timber.tag(pusherTag.value).d("Ensure pusher is registered") + pushService.ensurePusherIsRegistered(matrixClient).fold( + onSuccess = { + Timber.tag(pusherTag.value).d("Pusher registered") + pusherRegistrationState.value = AsyncData.Success(Unit) + }, + onFailure = { + Timber.tag(pusherTag.value).e(it, "Failed to register pusher") + pusherRegistrationState.value = AsyncData.Failure(it) + }, + ) + } + SessionVerifiedStatus.NotVerified -> { + pusherRegistrationState.value = AsyncData.Failure(PusherRegistrationFailure.AccountNotVerified()) + } + } + } + .launchIn(this) + } + val syncIndicator by matrixClient.roomListService.syncIndicator.collectAsState() + val isOnline by syncService.isOnline.collectAsState() + val showSyncSpinner by remember { + derivedStateOf { + isOnline && syncIndicator == RoomListService.SyncIndicator.Show + } + } + var forceNativeSlidingSyncMigration by remember { mutableStateOf(false) } + LaunchedEffect(Unit) { + combine( + sessionVerificationService.sessionVerifiedStatus, + encryptionService.recoveryStateStateFlow + ) { verificationState, recoveryState -> + reportCryptoStatusToAnalytics(verificationState, recoveryState) + }.launchIn(this) + } + + fun handleEvent(event: LoggedInEvents) { + when (event) { + is LoggedInEvents.CloseErrorDialog -> { + pusherRegistrationState.value = AsyncData.Uninitialized + if (event.doNotShowAgain) { + coroutineScope.launch { + pushService.setIgnoreRegistrationError(matrixClient.sessionId, true) + } + } + } + LoggedInEvents.CheckSlidingSyncProxyAvailability -> coroutineScope.launch { + forceNativeSlidingSyncMigration = matrixClient.needsForcedNativeSlidingSyncMigration().getOrDefault(false) + } + LoggedInEvents.LogoutAndMigrateToNativeSlidingSync -> coroutineScope.launch { + // Force the logout since Native Sliding Sync is already enforced by the SDK + matrixClient.logout(userInitiated = true, ignoreSdkError = true) + } + } + } + + return LoggedInState( + showSyncSpinner = showSyncSpinner, + pusherRegistrationState = pusherRegistrationState.value, + ignoreRegistrationError = ignoreRegistrationError, + forceNativeSlidingSyncMigration = forceNativeSlidingSyncMigration, + appName = buildMeta.applicationName, + eventSink = ::handleEvent, + ) + } + + // Force the user to log out if they were using the proxy sliding sync as it's no longer supported by the SDK + private suspend fun MatrixClient.needsForcedNativeSlidingSyncMigration(): Result = runCatchingExceptions { + val currentSlidingSyncVersion = currentSlidingSyncVersion().getOrThrow() + currentSlidingSyncVersion == SlidingSyncVersion.Proxy + } + + private fun reportCryptoStatusToAnalytics(verificationState: SessionVerifiedStatus, recoveryState: RecoveryState) { + // Update first the user property, to store the current status for that posthog user + val userVerificationState = verificationState.toAnalyticsUserPropertyValue() + val userRecoveryState = recoveryState.toAnalyticsUserPropertyValue() + if (userRecoveryState != null && userVerificationState != null) { + // we want to report when both value are known (if one is unknown we wait until we have them both) + analyticsService.updateUserProperties( + UserProperties( + verificationState = userVerificationState, + recoveryState = userRecoveryState + ) + ) + } + + // Also report when there is a change in the state, to be able to track the changes + val changeVerificationState = verificationState.toAnalyticsStateChangeValue() + val changeRecoveryState = recoveryState.toAnalyticsStateChangeValue() + if (changeVerificationState != null && changeRecoveryState != null) { + analyticsService.capture(CryptoSessionStateChange(changeRecoveryState, changeVerificationState)) + } + } + + private fun CoroutineScope.preloadAccountManagementUrl() = launch { + matrixClient.getAccountManagementUrl(AccountManagementAction.Profile) + matrixClient.getAccountManagementUrl(AccountManagementAction.SessionsList) + } +} diff --git a/appnav/src/main/kotlin/io/element/android/appnav/loggedin/LoggedInState.kt b/appnav/src/main/kotlin/io/element/android/appnav/loggedin/LoggedInState.kt new file mode 100644 index 0000000..b066f9f --- /dev/null +++ b/appnav/src/main/kotlin/io/element/android/appnav/loggedin/LoggedInState.kt @@ -0,0 +1,20 @@ +/* + * Copyright (c) 2025 Element Creations Ltd. + * Copyright 2023-2025 New Vector Ltd. + * + * SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial. + * Please see LICENSE files in the repository root for full details. + */ + +package io.element.android.appnav.loggedin + +import io.element.android.libraries.architecture.AsyncData + +data class LoggedInState( + val showSyncSpinner: Boolean, + val pusherRegistrationState: AsyncData, + val ignoreRegistrationError: Boolean, + val forceNativeSlidingSyncMigration: Boolean, + val appName: String, + val eventSink: (LoggedInEvents) -> Unit, +) diff --git a/appnav/src/main/kotlin/io/element/android/appnav/loggedin/LoggedInStateProvider.kt b/appnav/src/main/kotlin/io/element/android/appnav/loggedin/LoggedInStateProvider.kt new file mode 100644 index 0000000..b2f5407 --- /dev/null +++ b/appnav/src/main/kotlin/io/element/android/appnav/loggedin/LoggedInStateProvider.kt @@ -0,0 +1,37 @@ +/* + * Copyright (c) 2025 Element Creations Ltd. + * Copyright 2023-2025 New Vector Ltd. + * + * SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial. + * Please see LICENSE files in the repository root for full details. + */ + +package io.element.android.appnav.loggedin + +import androidx.compose.ui.tooling.preview.PreviewParameterProvider +import io.element.android.libraries.architecture.AsyncData +import io.element.android.libraries.push.api.PusherRegistrationFailure + +open class LoggedInStateProvider : PreviewParameterProvider { + override val values: Sequence + get() = sequenceOf( + aLoggedInState(), + aLoggedInState(showSyncSpinner = true), + aLoggedInState(pusherRegistrationState = AsyncData.Failure(PusherRegistrationFailure.NoDistributorsAvailable())), + aLoggedInState(forceNativeSlidingSyncMigration = true), + ) +} + +fun aLoggedInState( + showSyncSpinner: Boolean = false, + pusherRegistrationState: AsyncData = AsyncData.Uninitialized, + forceNativeSlidingSyncMigration: Boolean = false, + appName: String = "Element X", +) = LoggedInState( + showSyncSpinner = showSyncSpinner, + pusherRegistrationState = pusherRegistrationState, + ignoreRegistrationError = false, + forceNativeSlidingSyncMigration = forceNativeSlidingSyncMigration, + appName = appName, + eventSink = {}, +) diff --git a/appnav/src/main/kotlin/io/element/android/appnav/loggedin/LoggedInView.kt b/appnav/src/main/kotlin/io/element/android/appnav/loggedin/LoggedInView.kt new file mode 100644 index 0000000..62d8de8 --- /dev/null +++ b/appnav/src/main/kotlin/io/element/android/appnav/loggedin/LoggedInView.kt @@ -0,0 +1,125 @@ +/* + * Copyright (c) 2025 Element Creations Ltd. + * Copyright 2023-2025 New Vector Ltd. + * + * SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial. + * Please see LICENSE files in the repository root for full details. + */ + +package io.element.android.appnav.loggedin + +import androidx.compose.foundation.layout.Box +import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.foundation.layout.systemBarsPadding +import androidx.compose.runtime.Composable +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.res.stringResource +import androidx.compose.ui.tooling.preview.PreviewParameter +import androidx.lifecycle.Lifecycle +import io.element.android.appnav.R +import io.element.android.libraries.architecture.AsyncData +import io.element.android.libraries.designsystem.components.dialogs.ErrorDialog +import io.element.android.libraries.designsystem.components.dialogs.ErrorDialogWithDoNotShowAgain +import io.element.android.libraries.designsystem.preview.ElementPreview +import io.element.android.libraries.designsystem.preview.PreviewsDayNight +import io.element.android.libraries.designsystem.utils.OnLifecycleEvent +import io.element.android.libraries.matrix.api.exception.isNetworkError +import io.element.android.libraries.push.api.PusherRegistrationFailure +import io.element.android.libraries.ui.strings.CommonStrings + +@Composable +fun LoggedInView( + state: LoggedInState, + navigateToNotificationTroubleshoot: () -> Unit, + modifier: Modifier = Modifier +) { + OnLifecycleEvent { _, event -> + if (event == Lifecycle.Event.ON_RESUME) { + state.eventSink(LoggedInEvents.CheckSlidingSyncProxyAvailability) + } + } + Box( + modifier = modifier + .fillMaxSize() + .systemBarsPadding() + ) { + SyncStateView( + modifier = Modifier.align(Alignment.TopCenter), + isVisible = state.showSyncSpinner, + ) + } + when (state.pusherRegistrationState) { + is AsyncData.Uninitialized, + is AsyncData.Loading, + is AsyncData.Success -> Unit + is AsyncData.Failure -> { + state.pusherRegistrationState.errorOrNull() + ?.takeIf { !state.ignoreRegistrationError } + ?.getReason() + ?.let { reason -> + ErrorDialogWithDoNotShowAgain( + content = stringResource(id = CommonStrings.common_error_registering_pusher_android, reason), + cancelText = stringResource(id = CommonStrings.common_settings), + onDismiss = { + state.eventSink(LoggedInEvents.CloseErrorDialog(it)) + }, + onCancel = { + state.eventSink(LoggedInEvents.CloseErrorDialog(false)) + navigateToNotificationTroubleshoot() + } + ) + } + } + } + + // Set the force migration dialog here so it's always displayed over every screen + if (state.forceNativeSlidingSyncMigration) { + ForceNativeSlidingSyncMigrationDialog( + appName = state.appName, + onSubmit = { + state.eventSink(LoggedInEvents.LogoutAndMigrateToNativeSlidingSync) + } + ) + } +} + +private fun Throwable.getReason(): String? { + return when (this) { + is PusherRegistrationFailure.RegistrationFailure -> { + if (isRegisteringAgain && clientException.isNetworkError()) { + // When registering again, ignore network error + null + } else { + clientException.message ?: "Unknown error" + } + } + is PusherRegistrationFailure.AccountNotVerified -> null + is PusherRegistrationFailure.NoDistributorsAvailable -> "No distributors available" + is PusherRegistrationFailure.NoProvidersAvailable -> "No providers available" + else -> "Other error: $message" + } +} + +@Composable +private fun ForceNativeSlidingSyncMigrationDialog( + appName: String, + onSubmit: () -> Unit, +) { + ErrorDialog( + title = null, + content = stringResource(R.string.banner_migrate_to_native_sliding_sync_app_force_logout_title, appName), + submitText = stringResource(R.string.banner_migrate_to_native_sliding_sync_action), + onSubmit = onSubmit, + canDismiss = false, + ) +} + +@PreviewsDayNight +@Composable +internal fun LoggedInViewPreview(@PreviewParameter(LoggedInStateProvider::class) state: LoggedInState) = ElementPreview { + LoggedInView( + state = state, + navigateToNotificationTroubleshoot = {}, + ) +} diff --git a/appnav/src/main/kotlin/io/element/android/appnav/loggedin/MediaPreviewConfigMigration.kt b/appnav/src/main/kotlin/io/element/android/appnav/loggedin/MediaPreviewConfigMigration.kt new file mode 100644 index 0000000..6b5803a --- /dev/null +++ b/appnav/src/main/kotlin/io/element/android/appnav/loggedin/MediaPreviewConfigMigration.kt @@ -0,0 +1,60 @@ +/* + * Copyright (c) 2025 Element Creations Ltd. + * Copyright 2025 New Vector Ltd. + * + * SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial. + * Please see LICENSE files in the repository root for full details. + */ + +package io.element.android.appnav.loggedin + +import dev.zacsweers.metro.Inject +import io.element.android.libraries.di.annotations.SessionCoroutineScope +import io.element.android.libraries.matrix.api.media.MediaPreviewService +import io.element.android.libraries.preferences.api.store.AppPreferencesStore +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.flow.first +import kotlinx.coroutines.launch +import timber.log.Timber + +/** + * This migration is temporary, will be safe to remove after some time. + * The goal is to set the server config if it's not set, and remove the local data. + */ +@Inject +class MediaPreviewConfigMigration( + private val mediaPreviewService: MediaPreviewService, + private val appPreferencesStore: AppPreferencesStore, + @SessionCoroutineScope + private val sessionCoroutineScope: CoroutineScope, +) { + @Suppress("DEPRECATION") + operator fun invoke() = sessionCoroutineScope.launch { + val hideInviteAvatars = appPreferencesStore.getHideInviteAvatarsFlow().first() + val mediaPreviewValue = appPreferencesStore.getTimelineMediaPreviewValueFlow().first() + if (hideInviteAvatars == null && mediaPreviewValue == null) { + // No local data, abort. + return@launch + } + mediaPreviewService + .fetchMediaPreviewConfig() + .onSuccess { config -> + if (config != null) { + appPreferencesStore.setHideInviteAvatars(null) + appPreferencesStore.setTimelineMediaPreviewValue(null) + } else { + if (hideInviteAvatars != null) { + mediaPreviewService.setHideInviteAvatars(hideInviteAvatars) + appPreferencesStore.setHideInviteAvatars(null) + } + if (mediaPreviewValue != null) { + mediaPreviewService.setMediaPreviewValue(mediaPreviewValue) + appPreferencesStore.setTimelineMediaPreviewValue(null) + } + } + } + .onFailure { + Timber.e(it, "Couldn't perform migration, failed to fetch media preview config.") + } + } +} diff --git a/appnav/src/main/kotlin/io/element/android/appnav/loggedin/SendQueues.kt b/appnav/src/main/kotlin/io/element/android/appnav/loggedin/SendQueues.kt new file mode 100644 index 0000000..3f01f83 --- /dev/null +++ b/appnav/src/main/kotlin/io/element/android/appnav/loggedin/SendQueues.kt @@ -0,0 +1,56 @@ +/* + * Copyright (c) 2025 Element Creations Ltd. + * Copyright 2024, 2025 New Vector Ltd. + * + * SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial. + * Please see LICENSE files in the repository root for full details. + */ + +package io.element.android.appnav.loggedin + +import androidx.annotation.VisibleForTesting +import dev.zacsweers.metro.Inject +import dev.zacsweers.metro.SingleIn +import io.element.android.features.networkmonitor.api.NetworkStatus +import io.element.android.libraries.di.SessionScope +import io.element.android.libraries.matrix.api.MatrixClient +import io.element.android.libraries.matrix.api.sync.SyncService +import io.element.android.libraries.matrix.api.sync.SyncState +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.FlowPreview +import kotlinx.coroutines.flow.combine +import kotlinx.coroutines.flow.debounce +import kotlinx.coroutines.flow.launchIn +import kotlinx.coroutines.flow.onEach +import timber.log.Timber + +@VisibleForTesting +const val SEND_QUEUES_RETRY_DELAY_MILLIS = 500L + +@SingleIn(SessionScope::class) +@Inject +class SendQueues( + private val matrixClient: MatrixClient, + private val syncService: SyncService, +) { + /** + * Launches the send queues retry mechanism in the given [coroutineScope]. + * Makes sure to re-enable all send queues when the network status is [NetworkStatus.Connected]. + */ + @OptIn(FlowPreview::class) + fun launchIn(coroutineScope: CoroutineScope) { + combine( + syncService.syncState, + matrixClient.sendQueueDisabledFlow(), + ) { syncState, _ -> syncState } + .debounce(SEND_QUEUES_RETRY_DELAY_MILLIS) + .onEach { syncState -> + Timber.tag("SendQueues").d("Sync state changed: $syncState") + if (syncState == SyncState.Running) { + Timber.tag("SendQueues").d("Enabling send queues again") + matrixClient.setAllSendQueuesEnabled(enabled = true) + } + } + .launchIn(coroutineScope) + } +} diff --git a/appnav/src/main/kotlin/io/element/android/appnav/loggedin/SyncStateView.kt b/appnav/src/main/kotlin/io/element/android/appnav/loggedin/SyncStateView.kt new file mode 100644 index 0000000..7c5f196 --- /dev/null +++ b/appnav/src/main/kotlin/io/element/android/appnav/loggedin/SyncStateView.kt @@ -0,0 +1,52 @@ +/* + * Copyright (c) 2025 Element Creations Ltd. + * Copyright 2023-2025 New Vector Ltd. + * + * SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial. + * Please see LICENSE files in the repository root for full details. + */ + +package io.element.android.appnav.loggedin + +import androidx.compose.animation.AnimatedVisibility +import androidx.compose.animation.core.spring +import androidx.compose.animation.fadeIn +import androidx.compose.animation.fadeOut +import androidx.compose.foundation.layout.Box +import androidx.compose.foundation.layout.padding +import androidx.compose.runtime.Composable +import androidx.compose.ui.Modifier +import androidx.compose.ui.res.stringResource +import androidx.compose.ui.unit.dp +import io.element.android.libraries.designsystem.components.async.AsyncIndicator +import io.element.android.libraries.designsystem.preview.ElementPreview +import io.element.android.libraries.designsystem.preview.PreviewsDayNight +import io.element.android.libraries.ui.strings.CommonStrings + +@Composable +fun SyncStateView( + isVisible: Boolean, + modifier: Modifier = Modifier +) { + AnimatedVisibility( + visible = isVisible, + modifier = modifier, + enter = fadeIn(spring(stiffness = 500F)), + exit = fadeOut(spring(stiffness = 500F)), + ) { + AsyncIndicator.Loading( + text = stringResource(id = CommonStrings.common_syncing), + ) + } +} + +@PreviewsDayNight +@Composable +internal fun SyncStateViewPreview() = ElementPreview { + // Add a box to see the shadow + Box(modifier = Modifier.padding(24.dp)) { + SyncStateView( + isVisible = true + ) + } +} diff --git a/appnav/src/main/kotlin/io/element/android/appnav/room/RoomFlowNode.kt b/appnav/src/main/kotlin/io/element/android/appnav/room/RoomFlowNode.kt new file mode 100644 index 0000000..1bf3516 --- /dev/null +++ b/appnav/src/main/kotlin/io/element/android/appnav/room/RoomFlowNode.kt @@ -0,0 +1,259 @@ +/* + * Copyright (c) 2025 Element Creations Ltd. + * Copyright 2024, 2025 New Vector Ltd. + * + * SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial. + * Please see LICENSE files in the repository root for full details. + */ + +package io.element.android.appnav.room + +import android.os.Parcelable +import androidx.compose.runtime.Composable +import androidx.compose.ui.Modifier +import androidx.lifecycle.lifecycleScope +import com.bumble.appyx.core.modality.BuildContext +import com.bumble.appyx.core.navigation.transition.JumpToEndTransitionHandler +import com.bumble.appyx.core.node.Node +import com.bumble.appyx.core.node.node +import com.bumble.appyx.core.plugin.Plugin +import com.bumble.appyx.core.plugin.plugins +import com.bumble.appyx.navmodel.backstack.BackStack +import com.bumble.appyx.navmodel.backstack.active +import com.bumble.appyx.navmodel.backstack.operation.newRoot +import dev.zacsweers.metro.Assisted +import dev.zacsweers.metro.AssistedInject +import io.element.android.annotations.ContributesNode +import io.element.android.appnav.room.joined.JoinedRoomFlowNode +import io.element.android.appnav.room.joined.JoinedRoomLoadedFlowNode +import io.element.android.appnav.room.joined.LoadingRoomNodeView +import io.element.android.features.joinroom.api.JoinRoomEntryPoint +import io.element.android.features.roomaliasesolver.api.RoomAliasResolverEntryPoint +import io.element.android.features.roomaliasesolver.api.RoomAliasResolverEntryPoint.Params +import io.element.android.features.roomdirectory.api.RoomDescription +import io.element.android.libraries.architecture.BackstackView +import io.element.android.libraries.architecture.BaseFlowNode +import io.element.android.libraries.architecture.NodeInputs +import io.element.android.libraries.architecture.createNode +import io.element.android.libraries.architecture.inputs +import io.element.android.libraries.core.coroutine.withPreviousValue +import io.element.android.libraries.di.SessionScope +import io.element.android.libraries.matrix.api.MatrixClient +import io.element.android.libraries.matrix.api.core.EventId +import io.element.android.libraries.matrix.api.core.RoomAlias +import io.element.android.libraries.matrix.api.core.RoomId +import io.element.android.libraries.matrix.api.core.RoomIdOrAlias +import io.element.android.libraries.matrix.api.core.ThreadId +import io.element.android.libraries.matrix.api.room.CurrentUserMembership +import io.element.android.libraries.matrix.api.room.RoomMembershipObserver +import io.element.android.libraries.matrix.api.room.alias.ResolvedRoomAlias +import io.element.android.libraries.matrix.ui.room.LoadingRoomState +import io.element.android.services.analytics.api.AnalyticsLongRunningTransaction.LoadJoinedRoomFlow +import io.element.android.services.analytics.api.AnalyticsLongRunningTransaction.NotificationTapOpensTimeline +import io.element.android.services.analytics.api.AnalyticsLongRunningTransaction.OpenRoom +import io.element.android.services.analytics.api.AnalyticsService +import kotlinx.coroutines.flow.SharingStarted +import kotlinx.coroutines.flow.distinctUntilChanged +import kotlinx.coroutines.flow.filter +import kotlinx.coroutines.flow.launchIn +import kotlinx.coroutines.flow.map +import kotlinx.coroutines.flow.onEach +import kotlinx.coroutines.flow.shareIn +import kotlinx.coroutines.launch +import kotlinx.parcelize.IgnoredOnParcel +import kotlinx.parcelize.Parcelize +import timber.log.Timber +import java.util.Optional +import kotlin.jvm.optionals.getOrNull +import im.vector.app.features.analytics.plan.JoinedRoom as JoinedRoomAnalyticsEvent +import io.element.android.libraries.matrix.api.room.JoinedRoom as JoinedRoomInstance + +@ContributesNode(SessionScope::class) +@AssistedInject +class RoomFlowNode( + @Assisted val buildContext: BuildContext, + @Assisted plugins: List, + private val client: MatrixClient, + private val joinRoomEntryPoint: JoinRoomEntryPoint, + private val roomAliasResolverEntryPoint: RoomAliasResolverEntryPoint, + private val membershipObserver: RoomMembershipObserver, + private val analyticsService: AnalyticsService, +) : BaseFlowNode( + backstack = BackStack( + initialElement = run { + val joinedRoom = (plugins.filterIsInstance().first().initialElement as? RoomNavigationTarget.Root)?.joinedRoom + if (joinedRoom != null) { + NavTarget.JoinedRoom(joinedRoom) + } else { + NavTarget.Loading + } + }, + savedStateMap = buildContext.savedStateMap, + ), + buildContext = buildContext, + plugins = plugins +) { + data class Inputs( + val roomIdOrAlias: RoomIdOrAlias, + val roomDescription: Optional, + val serverNames: List, + val trigger: Optional, + val initialElement: RoomNavigationTarget, + ) : NodeInputs + + private val inputs: Inputs = inputs() + + sealed interface NavTarget : Parcelable { + @Parcelize + data object Loading : NavTarget + + @Parcelize + data class Resolving(val roomAlias: RoomAlias) : NavTarget + + @Parcelize + data class JoinRoom( + val roomId: RoomId, + val serverNames: List, + val trigger: JoinedRoomAnalyticsEvent.Trigger, + ) : NavTarget + + @Parcelize + data class JoinedRoom( + val roomId: RoomId, + @IgnoredOnParcel val joinedRoom: JoinedRoomInstance? = null, + ) : NavTarget { + constructor(joinedRoom: JoinedRoomInstance) : this(joinedRoom.roomId, joinedRoom) + } + } + + override fun onBuilt() { + super.onBuilt() + val parentTransaction = analyticsService.getLongRunningTransaction(NotificationTapOpensTimeline) + val openRoomTransaction = analyticsService.startLongRunningTransaction(OpenRoom, parentTransaction) + analyticsService.startLongRunningTransaction(LoadJoinedRoomFlow, openRoomTransaction) + resolveRoomId() + } + + private fun resolveRoomId() { + lifecycleScope.launch { + when (val i = inputs.roomIdOrAlias) { + is RoomIdOrAlias.Alias -> { + backstack.newRoot(NavTarget.Resolving(i.roomAlias)) + } + is RoomIdOrAlias.Id -> { + subscribeToRoomInfoFlow(i.roomId, inputs.serverNames) + } + } + } + } + + private fun subscribeToRoomInfoFlow(roomId: RoomId, serverNames: List) { + val joinedRoom = (inputs.initialElement as? RoomNavigationTarget.Root)?.joinedRoom + val roomInfoFlow = joinedRoom?.roomInfoFlow?.map { Optional.of(it) } + ?: client.getRoomInfoFlow(roomId) + + // This observes the local membership changes for the room + val membershipUpdateFlow = membershipObserver.updates + .filter { it.roomId == roomId } + .distinctUntilChanged() + // We add a replay so we can check the last local membership update + .shareIn(lifecycleScope, started = SharingStarted.Eagerly, replay = 1) + + val currentMembershipFlow = roomInfoFlow + .map { it.getOrNull()?.currentUserMembership } + .distinctUntilChanged() + .withPreviousValue() + currentMembershipFlow.onEach { (previousMembership, membership) -> + Timber.d("Room membership: $membership") + if (membership == CurrentUserMembership.JOINED) { + val currentNavTarget = backstack.active?.key?.navTarget + if (currentNavTarget is NavTarget.JoinedRoom && currentNavTarget.roomId == roomId) { + Timber.d("Already in JoinedRoom $roomId, do nothing") + return@onEach + } + backstack.newRoot(NavTarget.JoinedRoom(roomId)) + } else { + val leavingFromCurrentDevice = + membership == CurrentUserMembership.LEFT && + previousMembership == CurrentUserMembership.JOINED && + membershipUpdateFlow.replayCache.lastOrNull()?.isUserInRoom == false + + if (leavingFromCurrentDevice) { + navigateUp() + } else { + backstack.newRoot( + NavTarget.JoinRoom( + roomId = roomId, + serverNames = serverNames, + trigger = inputs.trigger.getOrNull() ?: JoinedRoomAnalyticsEvent.Trigger.Invite, + ) + ) + } + } + }.launchIn(lifecycleScope) + } + + override fun resolve(navTarget: NavTarget, buildContext: BuildContext): Node { + return when (navTarget) { + is NavTarget.Loading -> loadingNode(buildContext) + is NavTarget.Resolving -> { + val callback = object : RoomAliasResolverEntryPoint.Callback { + override fun onAliasResolved(data: ResolvedRoomAlias) { + subscribeToRoomInfoFlow( + roomId = data.roomId, + serverNames = data.servers, + ) + } + } + val params = Params(navTarget.roomAlias) + roomAliasResolverEntryPoint.createNode( + parentNode = this, + buildContext = buildContext, + params = params, + callback = callback, + ) + } + is NavTarget.JoinRoom -> { + val inputs = JoinRoomEntryPoint.Inputs( + roomId = navTarget.roomId, + roomIdOrAlias = inputs.roomIdOrAlias, + roomDescription = inputs.roomDescription, + serverNames = navTarget.serverNames, + trigger = navTarget.trigger, + ) + joinRoomEntryPoint.createNode( + parentNode = this, + buildContext = buildContext, + inputs = inputs, + ) + } + is NavTarget.JoinedRoom -> { + val roomFlowNodeCallback = plugins() + val inputs = JoinedRoomFlowNode.Inputs( + roomId = navTarget.roomId, + initialElement = inputs.initialElement, + joinedRoom = navTarget.joinedRoom, + ) + createNode(buildContext, plugins = listOf(inputs) + roomFlowNodeCallback) + } + } + } + + suspend fun attachThread(threadId: ThreadId, focusedEventId: EventId?) { + waitForChildAttached() + .attachThread(threadId, focusedEventId) + } + + private fun loadingNode(buildContext: BuildContext) = node(buildContext) { modifier -> + LoadingRoomNodeView( + state = LoadingRoomState.Loading, + onBackClick = { navigateUp() }, + modifier = modifier, + ) + } + + @Composable + override fun View(modifier: Modifier) { + BackstackView(transitionHandler = JumpToEndTransitionHandler()) + } +} diff --git a/appnav/src/main/kotlin/io/element/android/appnav/room/RoomNavigationTarget.kt b/appnav/src/main/kotlin/io/element/android/appnav/room/RoomNavigationTarget.kt new file mode 100644 index 0000000..aac916a --- /dev/null +++ b/appnav/src/main/kotlin/io/element/android/appnav/room/RoomNavigationTarget.kt @@ -0,0 +1,29 @@ +/* + * Copyright (c) 2025 Element Creations Ltd. + * Copyright 2024, 2025 New Vector Ltd. + * + * SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial. + * Please see LICENSE files in the repository root for full details. + */ + +package io.element.android.appnav.room + +import android.os.Parcelable +import io.element.android.libraries.matrix.api.core.EventId +import io.element.android.libraries.matrix.api.room.JoinedRoom +import kotlinx.parcelize.IgnoredOnParcel +import kotlinx.parcelize.Parcelize + +sealed interface RoomNavigationTarget : Parcelable { + @Parcelize + data class Root( + val eventId: EventId? = null, + @IgnoredOnParcel val joinedRoom: JoinedRoom? = null, + ) : RoomNavigationTarget + + @Parcelize + data object Details : RoomNavigationTarget + + @Parcelize + data object NotificationSettings : RoomNavigationTarget +} diff --git a/appnav/src/main/kotlin/io/element/android/appnav/room/joined/JoinedRoomFlowNode.kt b/appnav/src/main/kotlin/io/element/android/appnav/room/joined/JoinedRoomFlowNode.kt new file mode 100644 index 0000000..504bdfe --- /dev/null +++ b/appnav/src/main/kotlin/io/element/android/appnav/room/joined/JoinedRoomFlowNode.kt @@ -0,0 +1,140 @@ +/* + * Copyright (c) 2025 Element Creations Ltd. + * Copyright 2024, 2025 New Vector Ltd. + * + * SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial. + * Please see LICENSE files in the repository root for full details. + */ + +@file:OptIn(ExperimentalMaterial3Api::class) + +package io.element.android.appnav.room.joined + +import android.os.Parcelable +import androidx.compose.material3.ExperimentalMaterial3Api +import androidx.compose.runtime.Composable +import androidx.compose.runtime.collectAsState +import androidx.compose.runtime.getValue +import androidx.compose.ui.Modifier +import androidx.lifecycle.lifecycleScope +import com.bumble.appyx.core.modality.BuildContext +import com.bumble.appyx.core.navigation.transition.JumpToEndTransitionHandler +import com.bumble.appyx.core.node.Node +import com.bumble.appyx.core.node.node +import com.bumble.appyx.core.plugin.Plugin +import com.bumble.appyx.core.plugin.plugins +import com.bumble.appyx.navmodel.backstack.BackStack +import com.bumble.appyx.navmodel.backstack.operation.newRoot +import dev.zacsweers.metro.Assisted +import dev.zacsweers.metro.AssistedInject +import io.element.android.annotations.ContributesNode +import io.element.android.appnav.room.RoomNavigationTarget +import io.element.android.libraries.architecture.BackstackView +import io.element.android.libraries.architecture.BaseFlowNode +import io.element.android.libraries.architecture.NodeInputs +import io.element.android.libraries.architecture.createNode +import io.element.android.libraries.architecture.inputs +import io.element.android.libraries.di.SessionScope +import io.element.android.libraries.matrix.api.core.EventId +import io.element.android.libraries.matrix.api.core.RoomId +import io.element.android.libraries.matrix.api.core.ThreadId +import io.element.android.libraries.matrix.api.room.JoinedRoom +import io.element.android.libraries.matrix.ui.room.LoadingRoomState +import io.element.android.libraries.matrix.ui.room.LoadingRoomStateFlowFactory +import kotlinx.coroutines.flow.distinctUntilChanged +import kotlinx.coroutines.flow.launchIn +import kotlinx.coroutines.flow.map +import kotlinx.coroutines.flow.onEach +import kotlinx.parcelize.Parcelize + +@ContributesNode(SessionScope::class) +@AssistedInject +class JoinedRoomFlowNode( + @Assisted val buildContext: BuildContext, + @Assisted plugins: List, + loadingRoomStateFlowFactory: LoadingRoomStateFlowFactory, +) : + BaseFlowNode( + backstack = BackStack( + initialElement = NavTarget.Loading, + savedStateMap = buildContext.savedStateMap, + ), + buildContext = buildContext, + plugins = plugins + ) { + data class Inputs( + val roomId: RoomId, + val joinedRoom: JoinedRoom?, + val initialElement: RoomNavigationTarget, + ) : NodeInputs + + private val inputs: Inputs = inputs() + private val loadingRoomStateStateFlow = loadingRoomStateFlowFactory.create(lifecycleScope, inputs.roomId, inputs.joinedRoom) + + sealed interface NavTarget : Parcelable { + @Parcelize + data object Loading : NavTarget + + @Parcelize + data object Loaded : NavTarget + } + + override fun onBuilt() { + super.onBuilt() + loadingRoomStateStateFlow + .map { + it is LoadingRoomState.Loaded + } + .distinctUntilChanged() + .onEach { isLoaded -> + if (isLoaded) { + backstack.newRoot(NavTarget.Loaded) + } else { + backstack.newRoot(NavTarget.Loading) + } + } + .launchIn(lifecycleScope) + } + + override fun resolve(navTarget: NavTarget, buildContext: BuildContext): Node { + return when (navTarget) { + NavTarget.Loaded -> { + val roomFlowNodeCallback = plugins() + val awaitRoomState = loadingRoomStateStateFlow.value + if (awaitRoomState is LoadingRoomState.Loaded) { + val inputs = JoinedRoomLoadedFlowNode.Inputs( + room = awaitRoomState.room, + initialElement = inputs.initialElement + ) + createNode(buildContext, plugins = listOf(inputs) + roomFlowNodeCallback) + } else { + loadingNode(buildContext, this::navigateUp) + } + } + NavTarget.Loading -> { + loadingNode(buildContext, this::navigateUp) + } + } + } + + private fun loadingNode(buildContext: BuildContext, onBackClick: () -> Unit) = node(buildContext) { modifier -> + val loadingRoomState by loadingRoomStateStateFlow.collectAsState() + LoadingRoomNodeView( + state = loadingRoomState, + onBackClick = onBackClick, + modifier = modifier + ) + } + + suspend fun attachThread(threadId: ThreadId, focusedEventId: EventId?) { + waitForChildAttached() + .attachThread(threadId, focusedEventId) + } + + @Composable + override fun View(modifier: Modifier) { + BackstackView( + transitionHandler = JumpToEndTransitionHandler(), + ) + } +} diff --git a/appnav/src/main/kotlin/io/element/android/appnav/room/joined/JoinedRoomLoadedFlowNode.kt b/appnav/src/main/kotlin/io/element/android/appnav/room/joined/JoinedRoomLoadedFlowNode.kt new file mode 100644 index 0000000..5a6ef91 --- /dev/null +++ b/appnav/src/main/kotlin/io/element/android/appnav/room/joined/JoinedRoomLoadedFlowNode.kt @@ -0,0 +1,309 @@ +/* + * Copyright (c) 2025 Element Creations Ltd. + * Copyright 2024, 2025 New Vector Ltd. + * + * SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial. + * Please see LICENSE files in the repository root for full details. + */ + +package io.element.android.appnav.room.joined + +import android.os.Parcelable +import androidx.compose.runtime.Composable +import androidx.compose.ui.Modifier +import androidx.lifecycle.lifecycleScope +import com.bumble.appyx.core.lifecycle.subscribe +import com.bumble.appyx.core.modality.BuildContext +import com.bumble.appyx.core.node.Node +import com.bumble.appyx.core.plugin.Plugin +import com.bumble.appyx.navmodel.backstack.BackStack +import com.bumble.appyx.navmodel.backstack.operation.pop +import com.bumble.appyx.navmodel.backstack.operation.push +import dev.zacsweers.metro.Assisted +import dev.zacsweers.metro.AssistedInject +import io.element.android.annotations.ContributesNode +import io.element.android.appnav.di.RoomGraphFactory +import io.element.android.appnav.di.TimelineBindings +import io.element.android.appnav.room.RoomNavigationTarget +import io.element.android.features.forward.api.ForwardEntryPoint +import io.element.android.features.messages.api.MessagesEntryPoint +import io.element.android.features.roomdetails.api.RoomDetailsEntryPoint +import io.element.android.features.space.api.SpaceEntryPoint +import io.element.android.libraries.architecture.BackstackView +import io.element.android.libraries.architecture.BaseFlowNode +import io.element.android.libraries.architecture.NodeInputs +import io.element.android.libraries.architecture.callback +import io.element.android.libraries.architecture.inputs +import io.element.android.libraries.architecture.waitForChildAttached +import io.element.android.libraries.di.DependencyInjectionGraphOwner +import io.element.android.libraries.di.SessionScope +import io.element.android.libraries.di.annotations.SessionCoroutineScope +import io.element.android.libraries.matrix.api.MatrixClient +import io.element.android.libraries.matrix.api.core.EventId +import io.element.android.libraries.matrix.api.core.RoomId +import io.element.android.libraries.matrix.api.core.ThreadId +import io.element.android.libraries.matrix.api.core.UserId +import io.element.android.libraries.matrix.api.permalink.PermalinkData +import io.element.android.libraries.matrix.api.room.JoinedRoom +import io.element.android.services.analytics.api.AnalyticsLongRunningTransaction.LoadJoinedRoomFlow +import io.element.android.services.analytics.api.AnalyticsLongRunningTransaction.LoadMessagesUi +import io.element.android.services.analytics.api.AnalyticsLongRunningTransaction.OpenRoom +import io.element.android.services.analytics.api.AnalyticsService +import io.element.android.services.analytics.api.finishLongRunningTransaction +import io.element.android.services.appnavstate.api.ActiveRoomsHolder +import io.element.android.services.appnavstate.api.AppNavigationStateService +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.launch +import kotlinx.parcelize.Parcelize +import timber.log.Timber + +@ContributesNode(SessionScope::class) +@AssistedInject +class JoinedRoomLoadedFlowNode( + @Assisted buildContext: BuildContext, + @Assisted plugins: List, + private val messagesEntryPoint: MessagesEntryPoint, + private val roomDetailsEntryPoint: RoomDetailsEntryPoint, + private val spaceEntryPoint: SpaceEntryPoint, + private val forwardEntryPoint: ForwardEntryPoint, + private val appNavigationStateService: AppNavigationStateService, + @SessionCoroutineScope + private val sessionCoroutineScope: CoroutineScope, + private val matrixClient: MatrixClient, + private val activeRoomsHolder: ActiveRoomsHolder, + private val analyticsService: AnalyticsService, + roomGraphFactory: RoomGraphFactory, +) : BaseFlowNode( + backstack = BackStack( + initialElement = initialElement(plugins), + savedStateMap = buildContext.savedStateMap, + ), + buildContext = buildContext, + plugins = plugins, +), DependencyInjectionGraphOwner { + interface Callback : Plugin { + fun navigateToRoom(roomId: RoomId, serverNames: List) + fun handlePermalinkClick(data: PermalinkData, pushToBackstack: Boolean) + fun navigateToGlobalNotificationSettings() + } + + data class Inputs( + val room: JoinedRoom, + val initialElement: RoomNavigationTarget, + ) : NodeInputs + + private val inputs: Inputs = inputs() + private val callback: Callback = callback() + override val graph = roomGraphFactory.create(inputs.room) + + init { + lifecycle.subscribe( + onCreate = { + val parent = analyticsService.getLongRunningTransaction(OpenRoom) + analyticsService.startLongRunningTransaction(LoadMessagesUi, parent) + Timber.v("OnCreate => ${inputs.room.roomId}") + appNavigationStateService.onNavigateToRoom(id, inputs.room.roomId) + activeRoomsHolder.addRoom(inputs.room) + fetchRoomMembers() + trackVisitedRoom() + }, + onResume = { + analyticsService.finishLongRunningTransaction(LoadJoinedRoomFlow) + sessionCoroutineScope.launch { + inputs.room.subscribeToSync() + } + }, + onDestroy = { + Timber.v("OnDestroy") + activeRoomsHolder.removeRoom(inputs.room.sessionId, inputs.room.roomId) + inputs.room.destroy() + appNavigationStateService.onLeavingRoom(id) + } + ) + } + + private fun trackVisitedRoom() = lifecycleScope.launch { + matrixClient.trackRecentlyVisitedRoom(inputs.room.roomId) + } + + private fun fetchRoomMembers() = lifecycleScope.launch { + inputs.room.updateMembers() + } + + private fun createRoomDetailsNode(buildContext: BuildContext, initialTarget: RoomDetailsEntryPoint.InitialTarget): Node { + val callback = object : RoomDetailsEntryPoint.Callback { + override fun navigateToGlobalNotificationSettings() { + callback.navigateToGlobalNotificationSettings() + } + + override fun navigateToRoom(roomId: RoomId, serverNames: List) { + callback.navigateToRoom(roomId, serverNames) + } + + override fun handlePermalinkClick(data: PermalinkData, pushToBackstack: Boolean) { + callback.handlePermalinkClick(data, pushToBackstack) + } + + override fun startForwardEventFlow(eventId: EventId, fromPinnedEvents: Boolean) { + backstack.push(NavTarget.ForwardEvent(eventId, fromPinnedEvents)) + } + } + return roomDetailsEntryPoint.createNode( + parentNode = this, + buildContext = buildContext, + params = RoomDetailsEntryPoint.Params(initialTarget), + callback = callback, + ) + } + + override fun resolve(navTarget: NavTarget, buildContext: BuildContext): Node { + return when (navTarget) { + is NavTarget.Messages -> { + createMessagesNode(buildContext, navTarget) + } + NavTarget.RoomDetails -> { + createRoomDetailsNode(buildContext, RoomDetailsEntryPoint.InitialTarget.RoomDetails) + } + is NavTarget.RoomMemberDetails -> { + createRoomDetailsNode(buildContext, RoomDetailsEntryPoint.InitialTarget.RoomMemberDetails(navTarget.userId)) + } + NavTarget.RoomNotificationSettings -> { + createRoomDetailsNode(buildContext, RoomDetailsEntryPoint.InitialTarget.RoomNotificationSettings) + } + NavTarget.RoomMemberList -> { + createRoomDetailsNode(buildContext, RoomDetailsEntryPoint.InitialTarget.RoomMemberList) + } + NavTarget.Space -> { + createSpaceNode(buildContext) + } + is NavTarget.ForwardEvent -> { + val timelineProvider = if (navTarget.fromPinnedEvents) { + (graph as TimelineBindings).pinnedEventsTimelineProvider + } else { + (graph as TimelineBindings).timelineProvider + } + val params = ForwardEntryPoint.Params(navTarget.eventId, timelineProvider) + val callback = object : ForwardEntryPoint.Callback { + override fun onDone(roomIds: List) { + backstack.pop() + roomIds.singleOrNull()?.let { roomId -> + callback.navigateToRoom(roomId, emptyList()) + } + } + } + forwardEntryPoint.createNode( + parentNode = this, + buildContext = buildContext, + params = params, + callback = callback, + ) + } + } + } + + private fun createSpaceNode(buildContext: BuildContext): Node { + val callback = object : SpaceEntryPoint.Callback { + override fun navigateToRoom(roomId: RoomId, viaParameters: List) { + callback.navigateToRoom(roomId, viaParameters) + } + + override fun navigateToRoomMemberList() { + backstack.push(NavTarget.RoomMemberList) + } + } + return spaceEntryPoint.createNode( + parentNode = this, + buildContext = buildContext, + inputs = SpaceEntryPoint.Inputs(roomId = inputs.room.roomId), + callback = callback, + ) + } + + private fun createMessagesNode( + buildContext: BuildContext, + navTarget: NavTarget.Messages, + ): Node { + val callback = object : MessagesEntryPoint.Callback { + override fun navigateToRoomDetails() { + backstack.push(NavTarget.RoomDetails) + } + + override fun navigateToRoomMemberDetails(userId: UserId) { + backstack.push(NavTarget.RoomMemberDetails(userId)) + } + + override fun handlePermalinkClick(data: PermalinkData, pushToBackstack: Boolean) { + callback.handlePermalinkClick(data, pushToBackstack) + } + + override fun forwardEvent(eventId: EventId, fromPinnedEvents: Boolean) { + backstack.push(NavTarget.ForwardEvent(eventId, fromPinnedEvents)) + } + + override fun navigateToRoom(roomId: RoomId) { + callback.navigateToRoom(roomId, emptyList()) + } + } + val params = MessagesEntryPoint.Params( + MessagesEntryPoint.InitialTarget.Messages(navTarget.focusedEventId) + ) + return messagesEntryPoint.createNode( + parentNode = this, + buildContext = buildContext, + params = params, + callback = callback, + ) + } + + sealed interface NavTarget : Parcelable { + @Parcelize + data object Space : NavTarget + + @Parcelize + data class Messages( + val focusedEventId: EventId? = null, + ) : NavTarget + + @Parcelize + data object RoomDetails : NavTarget + + @Parcelize + data object RoomMemberList : NavTarget + + @Parcelize + data class RoomMemberDetails(val userId: UserId) : NavTarget + + @Parcelize + data class ForwardEvent(val eventId: EventId, val fromPinnedEvents: Boolean) : NavTarget + + @Parcelize + data object RoomNotificationSettings : NavTarget + } + + suspend fun attachThread(threadId: ThreadId, focusedEventId: EventId?) { + val messageNode = waitForChildAttached { navTarget -> + navTarget is NavTarget.Messages + } + (messageNode as? MessagesEntryPoint.NodeProxy)?.attachThread(threadId, focusedEventId) + } + + @Composable + override fun View(modifier: Modifier) { + BackstackView() + } +} + +private fun initialElement(plugins: List): JoinedRoomLoadedFlowNode.NavTarget { + val input = plugins.filterIsInstance().single() + return when (input.initialElement) { + is RoomNavigationTarget.Root -> { + if (input.room.roomInfoFlow.value.isSpace) { + JoinedRoomLoadedFlowNode.NavTarget.Space + } else { + JoinedRoomLoadedFlowNode.NavTarget.Messages(input.initialElement.eventId) + } + } + RoomNavigationTarget.Details -> JoinedRoomLoadedFlowNode.NavTarget.RoomDetails + RoomNavigationTarget.NotificationSettings -> JoinedRoomLoadedFlowNode.NavTarget.RoomNotificationSettings + } +} diff --git a/appnav/src/main/kotlin/io/element/android/appnav/room/joined/LoadingRoomNodeView.kt b/appnav/src/main/kotlin/io/element/android/appnav/room/joined/LoadingRoomNodeView.kt new file mode 100644 index 0000000..a596052 --- /dev/null +++ b/appnav/src/main/kotlin/io/element/android/appnav/room/joined/LoadingRoomNodeView.kt @@ -0,0 +1,92 @@ +/* + * Copyright (c) 2025 Element Creations Ltd. + * Copyright 2024, 2025 New Vector Ltd. + * + * SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial. + * Please see LICENSE files in the repository root for full details. + */ + +package io.element.android.appnav.room.joined + +import androidx.compose.foundation.layout.Box +import androidx.compose.foundation.layout.consumeWindowInsets +import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.foundation.layout.padding +import androidx.compose.material3.ExperimentalMaterial3Api +import androidx.compose.runtime.Composable +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.res.stringResource +import androidx.compose.ui.tooling.preview.PreviewParameter +import androidx.compose.ui.unit.dp +import io.element.android.compound.theme.ElementTheme +import io.element.android.libraries.designsystem.components.button.BackButton +import io.element.android.libraries.designsystem.preview.ElementPreview +import io.element.android.libraries.designsystem.preview.PreviewsDayNight +import io.element.android.libraries.designsystem.theme.components.CircularProgressIndicator +import io.element.android.libraries.designsystem.theme.components.Scaffold +import io.element.android.libraries.designsystem.theme.components.Text +import io.element.android.libraries.designsystem.theme.components.TopAppBar +import io.element.android.libraries.designsystem.utils.DelayedVisibility +import io.element.android.libraries.matrix.ui.room.LoadingRoomState +import io.element.android.libraries.matrix.ui.room.LoadingRoomStateProvider +import io.element.android.libraries.ui.strings.CommonStrings + +@Composable +fun LoadingRoomNodeView( + state: LoadingRoomState, + onBackClick: () -> Unit, + modifier: Modifier = Modifier, +) { + Scaffold( + modifier = modifier, + topBar = { + LoadingRoomTopBar(onBackClick) + }, + content = { padding -> + Box( + modifier = Modifier + .fillMaxSize() + .padding(padding) + .consumeWindowInsets(padding) + .padding(16.dp), + contentAlignment = Alignment.Center + ) { + if (state is LoadingRoomState.Error) { + Text( + text = stringResource(id = CommonStrings.error_unknown), + color = ElementTheme.colors.textSecondary, + style = ElementTheme.typography.fontBodyMdRegular, + ) + } else { + DelayedVisibility { + CircularProgressIndicator() + } + } + } + }, + ) +} + +@OptIn(ExperimentalMaterial3Api::class) +@Composable +private fun LoadingRoomTopBar( + onBackClick: () -> Unit, +) { + TopAppBar( + navigationIcon = { + BackButton(onClick = onBackClick) + }, + title = { + }, + ) +} + +@PreviewsDayNight +@Composable +internal fun LoadingRoomNodeViewPreview(@PreviewParameter(LoadingRoomStateProvider::class) state: LoadingRoomState) = ElementPreview { + LoadingRoomNodeView( + state = state, + onBackClick = {} + ) +} diff --git a/appnav/src/main/kotlin/io/element/android/appnav/root/RootNavState.kt b/appnav/src/main/kotlin/io/element/android/appnav/root/RootNavState.kt new file mode 100644 index 0000000..9015872 --- /dev/null +++ b/appnav/src/main/kotlin/io/element/android/appnav/root/RootNavState.kt @@ -0,0 +1,26 @@ +/* + * Copyright (c) 2025 Element Creations Ltd. + * Copyright 2023-2025 New Vector Ltd. + * + * SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial. + * Please see LICENSE files in the repository root for full details. + */ + +package io.element.android.appnav.root + +import io.element.android.libraries.sessionstorage.api.LoggedInState + +/** + * [RootNavState] produced by [RootNavStateFlowFactory]. + */ +data class RootNavState( + /** + * This value is incremented when a clear cache is done. + * Can be useful to track to force ui state to re-render + */ + val cacheIndex: Int, + /** + * LoggedInState. + */ + val loggedInState: LoggedInState, +) diff --git a/appnav/src/main/kotlin/io/element/android/appnav/root/RootNavStateFlowFactory.kt b/appnav/src/main/kotlin/io/element/android/appnav/root/RootNavStateFlowFactory.kt new file mode 100644 index 0000000..9a91e97 --- /dev/null +++ b/appnav/src/main/kotlin/io/element/android/appnav/root/RootNavStateFlowFactory.kt @@ -0,0 +1,89 @@ +/* + * Copyright (c) 2025 Element Creations Ltd. + * Copyright 2023-2025 New Vector Ltd. + * + * SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial. + * Please see LICENSE files in the repository root for full details. + */ + +package io.element.android.appnav.root + +import com.bumble.appyx.core.state.MutableSavedStateMap +import com.bumble.appyx.core.state.SavedStateMap +import dev.zacsweers.metro.Inject +import io.element.android.appnav.di.MatrixSessionCache +import io.element.android.features.preferences.api.CacheService +import io.element.android.libraries.matrix.ui.media.ImageLoaderHolder +import io.element.android.libraries.preferences.api.store.SessionPreferencesStoreFactory +import io.element.android.libraries.sessionstorage.api.SessionStore +import kotlinx.coroutines.flow.Flow +import kotlinx.coroutines.flow.combine +import kotlinx.coroutines.flow.flow +import kotlinx.coroutines.flow.onEach + +private const val SAVE_INSTANCE_KEY = "io.element.android.x.RootNavStateFlowFactory.SAVE_INSTANCE_KEY" + +/** + * This class is responsible for creating a flow of [RootNavState]. + * It gathers data from multiple datasource and creates a unique one. + */ +@Inject +class RootNavStateFlowFactory( + private val sessionStore: SessionStore, + private val cacheService: CacheService, + private val matrixSessionCache: MatrixSessionCache, + private val imageLoaderHolder: ImageLoaderHolder, + private val sessionPreferencesStoreFactory: SessionPreferencesStoreFactory, +) { + private var currentCacheIndex = 0 + + fun create(savedStateMap: SavedStateMap?): Flow { + return combine( + cacheIndexFlow(savedStateMap), + sessionStore.loggedInStateFlow(), + ) { cacheIndex, loggedInState -> + RootNavState( + cacheIndex = cacheIndex, + loggedInState = loggedInState, + ) + } + } + + fun saveIntoSavedState(stateMap: MutableSavedStateMap) { + stateMap[SAVE_INSTANCE_KEY] = currentCacheIndex + } + + /** + * @return a flow of integer, where each time a clear cache is done, we have a new incremented value. + */ + private fun cacheIndexFlow(savedStateMap: SavedStateMap?): Flow { + val initialCacheIndex = savedStateMap.getCacheIndexOrDefault() + return cacheService.clearedCacheEventFlow + .onEach { sessionId -> + matrixSessionCache.remove(sessionId) + // Ensure image loader will be recreated with the new MatrixClient + imageLoaderHolder.remove(sessionId) + // Also remove cached value for SessionPreferencesStore + sessionPreferencesStoreFactory.remove(sessionId) + } + .toIndexFlow(initialCacheIndex) + .onEach { cacheIndex -> + currentCacheIndex = cacheIndex + } + } + + /** + * @return a flow of integer that increments the value by one each time a new element is emitted upstream. + */ + private fun Flow.toIndexFlow(initialValue: Int): Flow = flow { + var index = initialValue + emit(initialValue) + collect { + emit(++index) + } + } + + private fun SavedStateMap?.getCacheIndexOrDefault(): Int { + return this?.get(SAVE_INSTANCE_KEY) as? Int ?: 0 + } +} diff --git a/appnav/src/main/kotlin/io/element/android/appnav/root/RootPresenter.kt b/appnav/src/main/kotlin/io/element/android/appnav/root/RootPresenter.kt new file mode 100644 index 0000000..75704c4 --- /dev/null +++ b/appnav/src/main/kotlin/io/element/android/appnav/root/RootPresenter.kt @@ -0,0 +1,54 @@ +/* + * Copyright (c) 2025 Element Creations Ltd. + * Copyright 2023-2025 New Vector Ltd. + * + * SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial. + * Please see LICENSE files in the repository root for full details. + */ + +package io.element.android.appnav.root + +import androidx.compose.runtime.Composable +import androidx.compose.runtime.LaunchedEffect +import androidx.compose.runtime.collectAsState +import androidx.compose.runtime.getValue +import dev.zacsweers.metro.Inject +import im.vector.app.features.analytics.plan.SuperProperties +import io.element.android.features.rageshake.api.crash.CrashDetectionState +import io.element.android.features.rageshake.api.detection.RageshakeDetectionState +import io.element.android.libraries.architecture.Presenter +import io.element.android.libraries.matrix.api.SdkMetadata +import io.element.android.services.analytics.api.AnalyticsService +import io.element.android.services.apperror.api.AppErrorStateService + +@Inject +class RootPresenter( + private val crashDetectionPresenter: Presenter, + private val rageshakeDetectionPresenter: Presenter, + private val appErrorStateService: AppErrorStateService, + private val analyticsService: AnalyticsService, + private val sdkMetadata: SdkMetadata, +) : Presenter { + @Composable + override fun present(): RootState { + val rageshakeDetectionState = rageshakeDetectionPresenter.present() + val crashDetectionState = crashDetectionPresenter.present() + val appErrorState by appErrorStateService.appErrorStateFlow.collectAsState() + + LaunchedEffect(Unit) { + analyticsService.updateSuperProperties( + SuperProperties( + cryptoSDK = SuperProperties.CryptoSDK.Rust, + appPlatform = SuperProperties.AppPlatform.EXA, + cryptoSDKVersion = sdkMetadata.sdkGitSha, + ) + ) + } + + return RootState( + rageshakeDetectionState = rageshakeDetectionState, + crashDetectionState = crashDetectionState, + errorState = appErrorState, + ) + } +} diff --git a/appnav/src/main/kotlin/io/element/android/appnav/root/RootState.kt b/appnav/src/main/kotlin/io/element/android/appnav/root/RootState.kt new file mode 100644 index 0000000..0d7f362 --- /dev/null +++ b/appnav/src/main/kotlin/io/element/android/appnav/root/RootState.kt @@ -0,0 +1,19 @@ +/* + * Copyright (c) 2025 Element Creations Ltd. + * Copyright 2023-2025 New Vector Ltd. + * + * SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial. + * Please see LICENSE files in the repository root for full details. + */ + +package io.element.android.appnav.root + +import io.element.android.features.rageshake.api.crash.CrashDetectionState +import io.element.android.features.rageshake.api.detection.RageshakeDetectionState +import io.element.android.services.apperror.api.AppErrorState + +data class RootState( + val rageshakeDetectionState: RageshakeDetectionState, + val crashDetectionState: CrashDetectionState, + val errorState: AppErrorState, +) diff --git a/appnav/src/main/kotlin/io/element/android/appnav/root/RootStateProvider.kt b/appnav/src/main/kotlin/io/element/android/appnav/root/RootStateProvider.kt new file mode 100644 index 0000000..26db205 --- /dev/null +++ b/appnav/src/main/kotlin/io/element/android/appnav/root/RootStateProvider.kt @@ -0,0 +1,38 @@ +/* + * Copyright (c) 2025 Element Creations Ltd. + * Copyright 2023-2025 New Vector Ltd. + * + * SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial. + * Please see LICENSE files in the repository root for full details. + */ + +package io.element.android.appnav.root + +import androidx.compose.ui.tooling.preview.PreviewParameterProvider +import io.element.android.features.rageshake.api.crash.aCrashDetectionState +import io.element.android.features.rageshake.api.detection.aRageshakeDetectionState +import io.element.android.services.apperror.api.AppErrorState +import io.element.android.services.apperror.api.aAppErrorState + +open class RootStateProvider : PreviewParameterProvider { + override val values: Sequence + get() = sequenceOf( + aRootState().copy( + rageshakeDetectionState = aRageshakeDetectionState().copy(showDialog = false), + crashDetectionState = aCrashDetectionState().copy(crashDetected = true), + ), + aRootState().copy( + rageshakeDetectionState = aRageshakeDetectionState().copy(showDialog = true), + crashDetectionState = aCrashDetectionState().copy(crashDetected = false), + ), + aRootState().copy( + errorState = aAppErrorState(), + ) + ) +} + +fun aRootState() = RootState( + rageshakeDetectionState = aRageshakeDetectionState(), + crashDetectionState = aCrashDetectionState(), + errorState = AppErrorState.NoError, +) diff --git a/appnav/src/main/kotlin/io/element/android/appnav/root/RootView.kt b/appnav/src/main/kotlin/io/element/android/appnav/root/RootView.kt new file mode 100644 index 0000000..2bc76d7 --- /dev/null +++ b/appnav/src/main/kotlin/io/element/android/appnav/root/RootView.kt @@ -0,0 +1,70 @@ +/* + * Copyright (c) 2025 Element Creations Ltd. + * Copyright 2023-2025 New Vector Ltd. + * + * SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial. + * Please see LICENSE files in the repository root for full details. + */ + +package io.element.android.appnav.root + +import androidx.compose.foundation.layout.Box +import androidx.compose.foundation.layout.BoxScope +import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.runtime.Composable +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.tooling.preview.PreviewParameter +import io.element.android.features.rageshake.api.crash.CrashDetectionEvents +import io.element.android.features.rageshake.api.crash.CrashDetectionView +import io.element.android.features.rageshake.api.detection.RageshakeDetectionEvents +import io.element.android.features.rageshake.api.detection.RageshakeDetectionView +import io.element.android.libraries.designsystem.preview.ElementPreview +import io.element.android.libraries.designsystem.preview.PreviewsDayNight +import io.element.android.libraries.designsystem.theme.components.Text +import io.element.android.services.apperror.impl.AppErrorView + +@Composable +fun RootView( + state: RootState, + onOpenBugReport: () -> Unit, + modifier: Modifier = Modifier, + children: @Composable BoxScope.() -> Unit, +) { + Box( + modifier = modifier + .fillMaxSize(), + contentAlignment = Alignment.TopCenter, + ) { + children() + + fun onOpenBugReport() { + state.crashDetectionState.eventSink(CrashDetectionEvents.ResetAppHasCrashed) + state.rageshakeDetectionState.eventSink(RageshakeDetectionEvents.Dismiss) + onOpenBugReport.invoke() + } + + RageshakeDetectionView( + state = state.rageshakeDetectionState, + onOpenBugReport = ::onOpenBugReport, + ) + CrashDetectionView( + state = state.crashDetectionState, + onOpenBugReport = ::onOpenBugReport, + ) + AppErrorView( + state = state.errorState, + ) + } +} + +@PreviewsDayNight +@Composable +internal fun RootViewPreview(@PreviewParameter(RootStateProvider::class) rootState: RootState) = ElementPreview { + RootView( + state = rootState, + onOpenBugReport = {}, + ) { + Text("Children") + } +} diff --git a/appnav/src/main/res/values-be/translations.xml b/appnav/src/main/res/values-be/translations.xml new file mode 100644 index 0000000..f6699c0 --- /dev/null +++ b/appnav/src/main/res/values-be/translations.xml @@ -0,0 +1,5 @@ + + + "Выйсці і абнавіць" + "Ваш хатні сервер больш не падтрымлівае стары пратакол. Калі ласка, выйдзіце і ўвайдзіце зноў, каб працягнуць выкарыстанне праграмы." + diff --git a/appnav/src/main/res/values-cs/translations.xml b/appnav/src/main/res/values-cs/translations.xml new file mode 100644 index 0000000..3652bda --- /dev/null +++ b/appnav/src/main/res/values-cs/translations.xml @@ -0,0 +1,6 @@ + + + "Odhlásit se a upgradovat" + "%1$s již nepodporuje starý protokol. Odhlaste se a znovu přihlaste, abyste mohli pokračovat v používání aplikace." + "Váš domovský server již nepodporuje starý protokol. Chcete-li pokračovat v používání aplikace, odhlaste se a znovu se přihlaste." + diff --git a/appnav/src/main/res/values-cy/translations.xml b/appnav/src/main/res/values-cy/translations.xml new file mode 100644 index 0000000..06d53cd --- /dev/null +++ b/appnav/src/main/res/values-cy/translations.xml @@ -0,0 +1,6 @@ + + + "Allgofnodi ac Uwchraddio" + "Nid yw %1$s bellach yn cefnogi\'r hen brotocol. Allgofnodwch a mewngofnodi\'n ôl i barhau i ddefnyddio\'r ap." + "Nid yw eich gweinydd cartref yn cefnogi\'r hen brotocol mwyach. Allgofnodwch a mewngofnodi yn ôl i barhau i ddefnyddio\'r ap." + diff --git a/appnav/src/main/res/values-da/translations.xml b/appnav/src/main/res/values-da/translations.xml new file mode 100644 index 0000000..ef5025e --- /dev/null +++ b/appnav/src/main/res/values-da/translations.xml @@ -0,0 +1,6 @@ + + + "Log ud og opgradér" + "%1$s understøtter ikke længere den gamle protokol. Log ud og log ind igen for at fortsætte med at bruge appen." + "Din hjemmeserver understøtter ikke længere den gamle protokol. Log ud og log ind igen for at fortsætte med at bruge appen." + diff --git a/appnav/src/main/res/values-de/translations.xml b/appnav/src/main/res/values-de/translations.xml new file mode 100644 index 0000000..13d085e --- /dev/null +++ b/appnav/src/main/res/values-de/translations.xml @@ -0,0 +1,6 @@ + + + "Abmelden und aktualisieren" + "%1$s unterstützt das alte Protokoll nicht mehr. Bitte melde dich ab und wieder an, um die App weiter nutzen zu können." + "Dein Homeserver unterstützt das alte Protokoll nicht mehr. Bitte logge dich aus und melde dich wieder an, um die App weiter zu nutzen." + diff --git a/appnav/src/main/res/values-el/translations.xml b/appnav/src/main/res/values-el/translations.xml new file mode 100644 index 0000000..03848d7 --- /dev/null +++ b/appnav/src/main/res/values-el/translations.xml @@ -0,0 +1,6 @@ + + + "Αποσύνδεση & Αναβάθμιση" + "Το %1$s δεν υποστηρίζει πλέον το παλιό πρωτόκολλο. Αποσυνδεθείτε και συνδεθείτε ξανά για να συνεχίσετε να χρησιμοποιείτε την εφαρμογή." + "Ο οικιακός διακομιστής σου δεν υποστηρίζει πλέον το παλιό πρωτόκολλο. Αποσυνδέσου και συνδέσου ξανά για να συνεχίσεις να χρησιμοποιείς την εφαρμογή." + diff --git a/appnav/src/main/res/values-es/translations.xml b/appnav/src/main/res/values-es/translations.xml new file mode 100644 index 0000000..20f1555 --- /dev/null +++ b/appnav/src/main/res/values-es/translations.xml @@ -0,0 +1,6 @@ + + + "Cerrar sesión y actualizar" + "%1$s ya no es compatible con el antiguo protocolo. Cierra sesión y vuelve a iniciarla para seguir usando la aplicación." + "Tu servidor base ya no es compatible con el protocolo anterior. Cierra sesión y vuelve a iniciarla para seguir usando la aplicación." + diff --git a/appnav/src/main/res/values-et/translations.xml b/appnav/src/main/res/values-et/translations.xml new file mode 100644 index 0000000..b71640a --- /dev/null +++ b/appnav/src/main/res/values-et/translations.xml @@ -0,0 +1,6 @@ + + + "Logi välja ja uuenda" + "%1$s enam ei toeta vana protokolli. Kui soovid rakendust edasi kasutada, siis logi korraks temast välja ning seejärel tagasi." + "Sinu koduserver enam ei toeta vana protokolli. Jätkamaks rakenduse kasutamist palun logi välja ning seejärel tagasi." + diff --git a/appnav/src/main/res/values-eu/translations.xml b/appnav/src/main/res/values-eu/translations.xml new file mode 100644 index 0000000..909ade1 --- /dev/null +++ b/appnav/src/main/res/values-eu/translations.xml @@ -0,0 +1,6 @@ + + + "Amaitu saioa eta bertsio-berritu" + "%1$s(e)k ez da bateragarria lehengo protokoloarekin. Amaitu saioa eta hasi berriro aplikazioa erabiltzen jarraitzeko." + "Zure zerbitzaria ez da bateragarria protokolo zaharrarekin. Amaitu saioa eta hasi berriro aplikazioa erabiltzen jarraitzeko." + diff --git a/appnav/src/main/res/values-fa/translations.xml b/appnav/src/main/res/values-fa/translations.xml new file mode 100644 index 0000000..16bb7fd --- /dev/null +++ b/appnav/src/main/res/values-fa/translations.xml @@ -0,0 +1,5 @@ + + + "خروج و ارتقا" + "‏%1$s دیگر از شیوه‌نامهٔ قدیمی پشتیبانی نمی‌کند. لطفاً برای ادامهٔ استفاده از کاره، خارج شده و دوباره وارد شوید." + diff --git a/appnav/src/main/res/values-fi/translations.xml b/appnav/src/main/res/values-fi/translations.xml new file mode 100644 index 0000000..14605ea --- /dev/null +++ b/appnav/src/main/res/values-fi/translations.xml @@ -0,0 +1,6 @@ + + + "Kirjaudu Ulos & Päivitä" + "%1$s ei enää tue vanhaa protokollaa. Kirjaudu ulos ja takaisin sisään jatkaaksesi sovelluksen käyttöä." + "Kotipalvelimesi ei enää tue vanhaa protokollaa. Kirjaudu ulos ja takaisin sisään jatkaaksesi sovelluksen käyttöä." + diff --git a/appnav/src/main/res/values-fr/translations.xml b/appnav/src/main/res/values-fr/translations.xml new file mode 100644 index 0000000..e3885f8 --- /dev/null +++ b/appnav/src/main/res/values-fr/translations.xml @@ -0,0 +1,6 @@ + + + "Déconnecter et mettre à niveau" + "%1$s ne prend plus en charge l’ancien protocole. Veuillez vous déconnecter puis vous reconnecter pour continuer à utiliser l’application." + "Votre serveur d’accueil ne prend plus en charge l’ancien protocole. Veuillez vous déconnecter puis vous reconnecter pour continuer à utiliser l’application." + diff --git a/appnav/src/main/res/values-hu/translations.xml b/appnav/src/main/res/values-hu/translations.xml new file mode 100644 index 0000000..a4dca1c --- /dev/null +++ b/appnav/src/main/res/values-hu/translations.xml @@ -0,0 +1,6 @@ + + + "Kijelentkezés és frissítés" + "%1$s már nem támogatja a régi protokollt. Kérjük, jelentkezzen ki és jelentkezzen be újra az alkalmazás használatának folytatásához." + "A Matrix-kiszolgáló már nem támogatja a régi protokollt. Az alkalmazás további használatához jelentkezzen ki és be." + diff --git a/appnav/src/main/res/values-in/translations.xml b/appnav/src/main/res/values-in/translations.xml new file mode 100644 index 0000000..e4f445d --- /dev/null +++ b/appnav/src/main/res/values-in/translations.xml @@ -0,0 +1,6 @@ + + + "Keluar & Tingkatkan" + "%1$s tidak lagi mendukung protokol lama. Silakan keluar dan masuk kembali untuk terus menggunakan aplikasi." + "Homeserver Anda tidak lagi mendukung protokol lama. Silakan keluar dan masuk kembali untuk terus menggunakan aplikasi." + diff --git a/appnav/src/main/res/values-it/translations.xml b/appnav/src/main/res/values-it/translations.xml new file mode 100644 index 0000000..725604e --- /dev/null +++ b/appnav/src/main/res/values-it/translations.xml @@ -0,0 +1,6 @@ + + + "Esci e aggiorna" + "%1$s non supporta più il vecchio protocollo. Esci e accedi nuovamente per continuare a utilizzare l\'app." + "Il tuo homeserver non supporta più il vecchio protocollo. Esci e rientra per continuare a usare l\'app." + diff --git a/appnav/src/main/res/values-ko/translations.xml b/appnav/src/main/res/values-ko/translations.xml new file mode 100644 index 0000000..a29e74f --- /dev/null +++ b/appnav/src/main/res/values-ko/translations.xml @@ -0,0 +1,6 @@ + + + "로그아웃 및 업그레이드" + "%1$s 더 이상 이전 프로토콜을 지원하지 않습니다. 계속 사용하려면 로그아웃 후 다시 로그인해 주세요." + "귀하의 홈서버는 더 이상 이전 프로토콜을 지원하지 않습니다. 앱을 계속 사용하려면 로그아웃한 후 다시 로그인하세요." + diff --git a/appnav/src/main/res/values-nb/translations.xml b/appnav/src/main/res/values-nb/translations.xml new file mode 100644 index 0000000..8270499 --- /dev/null +++ b/appnav/src/main/res/values-nb/translations.xml @@ -0,0 +1,6 @@ + + + "Logg ut og oppgrader" + "%1$s støtter ikke lenger den gamle protokollen. Logg ut og logg inn igjen for å fortsette å bruke appen." + "Hjemmeserveren din støtter ikke lenger den gamle protokollen. Vennligst logg ut og inn igjen for å fortsette å bruke appen." + diff --git a/appnav/src/main/res/values-nl/translations.xml b/appnav/src/main/res/values-nl/translations.xml new file mode 100644 index 0000000..e38f958 --- /dev/null +++ b/appnav/src/main/res/values-nl/translations.xml @@ -0,0 +1,5 @@ + + + "Uitloggen & Upgraden" + "Je homeserver ondersteunt het oude protocol niet meer. Log uit en log opnieuw in om de app te blijven gebruiken." + diff --git a/appnav/src/main/res/values-pl/translations.xml b/appnav/src/main/res/values-pl/translations.xml new file mode 100644 index 0000000..68de66a --- /dev/null +++ b/appnav/src/main/res/values-pl/translations.xml @@ -0,0 +1,6 @@ + + + "Wyloguj się i zaktualizuj" + "%1$s już nie wspiera starego protokołu. Zaloguj się ponownie, aby dalej korzystać z aplikacji." + "Twój serwer domowy już nie wspiera starego protokołu. Zaloguj się ponownie, aby kontynuować korzystanie z aplikacji." + diff --git a/appnav/src/main/res/values-pt-rBR/translations.xml b/appnav/src/main/res/values-pt-rBR/translations.xml new file mode 100644 index 0000000..90d27d3 --- /dev/null +++ b/appnav/src/main/res/values-pt-rBR/translations.xml @@ -0,0 +1,6 @@ + + + "Sair e atualizar" + "%1$s não tem mais suporte ao protocolo antigo. Saia da sua conta e entre novamente para continuar utilizando o aplicativo." + "Seu servidor-casa não é mais compatível com o protocolo antigo. Saia da sua conta e entre novamente para continuar usando o aplicativo." + diff --git a/appnav/src/main/res/values-pt/translations.xml b/appnav/src/main/res/values-pt/translations.xml new file mode 100644 index 0000000..2d84d29 --- /dev/null +++ b/appnav/src/main/res/values-pt/translations.xml @@ -0,0 +1,6 @@ + + + "Sair & Atualizar" + "%1$s já não suporta o protocolo antigo. Termina a sessão e volta a iniciar sessão para continuares a utilizar a aplicação." + "O teu servidor já não permite o protocolo antigo. Termine sessão e volte a iniciá-la para continuar a utilizar a aplicação." + diff --git a/appnav/src/main/res/values-ro/translations.xml b/appnav/src/main/res/values-ro/translations.xml new file mode 100644 index 0000000..626902b --- /dev/null +++ b/appnav/src/main/res/values-ro/translations.xml @@ -0,0 +1,6 @@ + + + "Deconectați-vă și faceți upgrade" + "%1$s nu mai acceptă vechiul protocol. Vă rugăm să vă deconectați și să vă reconectați pentru a continua utilizarea aplicației." + "Serverul dvs. de acasă nu mai acceptă vechiul protocol. Vă rugăm să vă deconectați și să vă conectați din nou pentru a continua să utilizați aplicația." + diff --git a/appnav/src/main/res/values-ru/translations.xml b/appnav/src/main/res/values-ru/translations.xml new file mode 100644 index 0000000..45f00a7 --- /dev/null +++ b/appnav/src/main/res/values-ru/translations.xml @@ -0,0 +1,6 @@ + + + "Выйти и обновить" + "%1$s больше не поддерживает старый протокол. Пожалуйста, выйдите из системы и войдите снова, чтобы продолжить использование приложения." + "Ваш домашний сервер больше не поддерживает старый протокол. Пожалуйста, выйдите и войдите в свою учётную запись снова, чтобы продолжить использование приложения." + diff --git a/appnav/src/main/res/values-sk/translations.xml b/appnav/src/main/res/values-sk/translations.xml new file mode 100644 index 0000000..a75c2fd --- /dev/null +++ b/appnav/src/main/res/values-sk/translations.xml @@ -0,0 +1,6 @@ + + + "Odhlásiť sa a aktualizovať" + "%1$s už nepodporuje starý protokol. Odhláste sa a znova prihláste, aby ste mohli pokračovať v používaní aplikácie." + "Váš domovský server už nepodporuje starý protokol. Ak chcete pokračovať v používaní aplikácie, odhláste sa a znova sa prihláste." + diff --git a/appnav/src/main/res/values-sv/translations.xml b/appnav/src/main/res/values-sv/translations.xml new file mode 100644 index 0000000..408e020 --- /dev/null +++ b/appnav/src/main/res/values-sv/translations.xml @@ -0,0 +1,6 @@ + + + "Logga ut och uppgradera" + "%1$s stöder inte längre det gamla protokollet. Logga ut och logga in igen för att fortsätta använda appen." + "Din hemserver stöder inte längre det gamla protokollet. Logga ut och logga in igen för att fortsätta använda appen." + diff --git a/appnav/src/main/res/values-tr/translations.xml b/appnav/src/main/res/values-tr/translations.xml new file mode 100644 index 0000000..443bed5 --- /dev/null +++ b/appnav/src/main/res/values-tr/translations.xml @@ -0,0 +1,7 @@ + + + "Çıkış Yap ve Yükselt" + "%1$s artık eski protokolü destekleniyor. Uygulamayı kullanmaya devam etmek için lütfen çıkış yapın ve tekrar giriş yapın +" + "Ana sunucunuz artık eski protokolü desteklemiyor. Lütfen oturumu kapatın ve uygulamayı kullanmaya devam etmek için tekrar oturum açın." + diff --git a/appnav/src/main/res/values-uk/translations.xml b/appnav/src/main/res/values-uk/translations.xml new file mode 100644 index 0000000..b65ab1a --- /dev/null +++ b/appnav/src/main/res/values-uk/translations.xml @@ -0,0 +1,6 @@ + + + "Вийти та оновити" + "%1$s більше не підтримує старий протокол. Вийдіть і знов увійдіть, щоб продовжити користуватися застосунком." + "Ваш домашній сервер більше не підтримує старий протокол. Будь ласка, вийдіть і увійдіть знову, щоб продовжити використання програми." + diff --git a/appnav/src/main/res/values-ur/translations.xml b/appnav/src/main/res/values-ur/translations.xml new file mode 100644 index 0000000..80d1840 --- /dev/null +++ b/appnav/src/main/res/values-ur/translations.xml @@ -0,0 +1,5 @@ + + + "لاگ آؤٹ اور اپ گریڈ کریں" + "آپ کا homeserver اب پرانے پروٹوکول کو سپورٹ نہیں کرتا ہے۔ براہ کرم لاگ آؤٹ کریں اور ایپ کا استعمال جاری رکھنے کے لیے دوبارہ لاگ ان کریں۔" + diff --git a/appnav/src/main/res/values-uz/translations.xml b/appnav/src/main/res/values-uz/translations.xml new file mode 100644 index 0000000..a76aaae --- /dev/null +++ b/appnav/src/main/res/values-uz/translations.xml @@ -0,0 +1,6 @@ + + + "Tizmdan chiqish va yangilash" + "%1$s endi eski protokolni qoʻllab-quvvatlamaydi. Iltimos, ilovadan foydalanishni davom ettirish uchun tizimdan chiqing va qayta kiring." + "Sizning uy serveringiz endi eski protokolni qoʻllab-quvvatlamaydi. Iltimos, ilovadan foydalanishni davom ettirish uchun tizimdan qayta chiqib-kiring." + diff --git a/appnav/src/main/res/values-zh-rTW/translations.xml b/appnav/src/main/res/values-zh-rTW/translations.xml new file mode 100644 index 0000000..ea69a33 --- /dev/null +++ b/appnav/src/main/res/values-zh-rTW/translations.xml @@ -0,0 +1,6 @@ + + + "登出並升級" + "%1$s 不再支援舊版通訊協定。請登出並重新登入以繼續使用應用程式。" + "您的家伺服器不再支援舊協定。請登出並重新登入以繼續使用應用程式。" + diff --git a/appnav/src/main/res/values-zh/translations.xml b/appnav/src/main/res/values-zh/translations.xml new file mode 100644 index 0000000..4064711 --- /dev/null +++ b/appnav/src/main/res/values-zh/translations.xml @@ -0,0 +1,6 @@ + + + "登出并升级" + "%1$s 不再支持旧协议。请注销并重新登录以继续使用该应用程序。" + "您的服务器不再支持旧协议。请登出并重新登录以继续使用此应用。" + diff --git a/appnav/src/main/res/values/localazy.xml b/appnav/src/main/res/values/localazy.xml new file mode 100644 index 0000000..c018fbf --- /dev/null +++ b/appnav/src/main/res/values/localazy.xml @@ -0,0 +1,6 @@ + + + "Log Out & Upgrade" + "%1$s no longer supports the old protocol. Please log out and log back in to continue using the app." + "Your homeserver no longer supports the old protocol. Please log out and log back in to continue using the app." + diff --git a/appnav/src/test/kotlin/io/element/android/appnav/JoinedRoomLoadedFlowNodeTest.kt b/appnav/src/test/kotlin/io/element/android/appnav/JoinedRoomLoadedFlowNodeTest.kt new file mode 100644 index 0000000..6cd7df0 --- /dev/null +++ b/appnav/src/test/kotlin/io/element/android/appnav/JoinedRoomLoadedFlowNodeTest.kt @@ -0,0 +1,239 @@ +/* + * Copyright (c) 2025 Element Creations Ltd. + * Copyright 2023-2025 New Vector Ltd. + * + * SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial. + * Please see LICENSE files in the repository root for full details. + */ + +package io.element.android.appnav + +import androidx.arch.core.executor.testing.InstantTaskExecutorRule +import androidx.lifecycle.Lifecycle +import com.bumble.appyx.core.modality.BuildContext +import com.bumble.appyx.core.node.Node +import com.bumble.appyx.core.node.node +import com.bumble.appyx.core.plugin.Plugin +import com.bumble.appyx.navmodel.backstack.activeElement +import com.bumble.appyx.testing.junit4.util.MainDispatcherRule +import com.bumble.appyx.testing.unit.common.helper.parentNodeTestHelper +import com.google.common.truth.Truth.assertThat +import io.element.android.appnav.di.RoomGraphFactory +import io.element.android.appnav.room.RoomNavigationTarget +import io.element.android.appnav.room.joined.FakeJoinedRoomLoadedFlowNodeCallback +import io.element.android.appnav.room.joined.JoinedRoomLoadedFlowNode +import io.element.android.features.forward.api.ForwardEntryPoint +import io.element.android.features.forward.test.FakeForwardEntryPoint +import io.element.android.features.messages.api.MessagesEntryPoint +import io.element.android.features.roomdetails.api.RoomDetailsEntryPoint +import io.element.android.features.space.api.SpaceEntryPoint +import io.element.android.libraries.architecture.childNode +import io.element.android.libraries.matrix.api.room.JoinedRoom +import io.element.android.libraries.matrix.test.A_SESSION_ID +import io.element.android.libraries.matrix.test.FakeMatrixClient +import io.element.android.libraries.matrix.test.room.FakeBaseRoom +import io.element.android.libraries.matrix.test.room.FakeJoinedRoom +import io.element.android.libraries.matrix.test.room.aRoomInfo +import io.element.android.services.analytics.test.FakeAnalyticsService +import io.element.android.services.appnavstate.api.ActiveRoomsHolder +import io.element.android.services.appnavstate.impl.DefaultActiveRoomsHolder +import io.element.android.services.appnavstate.test.FakeAppNavigationStateService +import kotlinx.coroutines.test.TestScope +import kotlinx.coroutines.test.runTest +import org.junit.Rule +import org.junit.Test +import org.junit.runner.RunWith +import org.robolectric.RobolectricTestRunner + +@RunWith(RobolectricTestRunner::class) +class JoinedRoomLoadedFlowNodeTest { + @get:Rule + val instantTaskExecutorRule = InstantTaskExecutorRule() + + @get:Rule + val mainDispatcherRule = MainDispatcherRule() + + private class FakeMessagesEntryPoint : MessagesEntryPoint { + var nodeId: String? = null + var parameters: MessagesEntryPoint.Params? = null + var callback: MessagesEntryPoint.Callback? = null + + override fun createNode( + parentNode: Node, + buildContext: BuildContext, + params: MessagesEntryPoint.Params, + callback: MessagesEntryPoint.Callback, + ): Node { + parameters = params + this.callback = callback + return node(buildContext) {}.also { + nodeId = it.id + } + } + } + + private class FakeRoomGraphFactory : RoomGraphFactory { + override fun create(room: JoinedRoom): Any { + return Unit + } + } + + private class FakeRoomDetailsEntryPoint : RoomDetailsEntryPoint { + var nodeId: String? = null + + override fun createNode( + parentNode: Node, + buildContext: BuildContext, + params: RoomDetailsEntryPoint.Params, + callback: RoomDetailsEntryPoint.Callback, + ) = node(buildContext) {}.also { + nodeId = it.id + } + } + + private class FakeSpaceEntryPoint : SpaceEntryPoint { + var nodeId: String? = null + + override fun createNode( + parentNode: Node, + buildContext: BuildContext, + inputs: SpaceEntryPoint.Inputs, + callback: SpaceEntryPoint.Callback, + ) = node(buildContext) {}.also { + nodeId = it.id + } + } + + private fun TestScope.createJoinedRoomLoadedFlowNode( + plugins: List, + messagesEntryPoint: MessagesEntryPoint = FakeMessagesEntryPoint(), + roomDetailsEntryPoint: RoomDetailsEntryPoint = FakeRoomDetailsEntryPoint(), + spaceEntryPoint: SpaceEntryPoint = FakeSpaceEntryPoint(), + forwardEntryPoint: ForwardEntryPoint = FakeForwardEntryPoint(), + activeRoomsHolder: ActiveRoomsHolder = DefaultActiveRoomsHolder(), + matrixClient: FakeMatrixClient = FakeMatrixClient(), + ) = JoinedRoomLoadedFlowNode( + buildContext = BuildContext.root(savedStateMap = null), + plugins = plugins, + messagesEntryPoint = messagesEntryPoint, + roomDetailsEntryPoint = roomDetailsEntryPoint, + spaceEntryPoint = spaceEntryPoint, + forwardEntryPoint = forwardEntryPoint, + appNavigationStateService = FakeAppNavigationStateService(), + sessionCoroutineScope = backgroundScope, + roomGraphFactory = FakeRoomGraphFactory(), + matrixClient = matrixClient, + activeRoomsHolder = activeRoomsHolder, + analyticsService = FakeAnalyticsService(), + ) + + @Test + fun `given a room flow node when initialized then it loads messages entry point if room is not space`() = runTest { + // GIVEN + val room = FakeJoinedRoom(baseRoom = FakeBaseRoom(updateMembersResult = {}, initialRoomInfo = aRoomInfo(isSpace = false))) + val fakeMessagesEntryPoint = FakeMessagesEntryPoint() + val inputs = JoinedRoomLoadedFlowNode.Inputs(room, RoomNavigationTarget.Root()) + val roomFlowNode = createJoinedRoomLoadedFlowNode( + plugins = listOf(inputs, FakeJoinedRoomLoadedFlowNodeCallback()), + messagesEntryPoint = fakeMessagesEntryPoint, + ) + // WHEN + val roomFlowNodeTestHelper = roomFlowNode.parentNodeTestHelper() + + // THEN + assertThat(roomFlowNode.backstack.activeElement).isEqualTo(JoinedRoomLoadedFlowNode.NavTarget.Messages()) + roomFlowNodeTestHelper.assertChildHasLifecycle(JoinedRoomLoadedFlowNode.NavTarget.Messages(), Lifecycle.State.CREATED) + val messagesNode = roomFlowNode.childNode(JoinedRoomLoadedFlowNode.NavTarget.Messages())!! + assertThat(messagesNode.id).isEqualTo(fakeMessagesEntryPoint.nodeId) + } + + @Test + fun `given a room flow node when initialized then it loads space entry point if room is space`() = runTest { + // GIVEN + val room = FakeJoinedRoom(baseRoom = FakeBaseRoom(updateMembersResult = {}, initialRoomInfo = aRoomInfo(isSpace = true))) + val spaceEntryPoint = FakeSpaceEntryPoint() + val inputs = JoinedRoomLoadedFlowNode.Inputs(room, RoomNavigationTarget.Root()) + val roomFlowNode = createJoinedRoomLoadedFlowNode( + plugins = listOf(inputs, FakeJoinedRoomLoadedFlowNodeCallback()), + spaceEntryPoint = spaceEntryPoint, + ) + // WHEN + val roomFlowNodeTestHelper = roomFlowNode.parentNodeTestHelper() + + // THEN + assertThat(roomFlowNode.backstack.activeElement).isEqualTo(JoinedRoomLoadedFlowNode.NavTarget.Space) + roomFlowNodeTestHelper.assertChildHasLifecycle(JoinedRoomLoadedFlowNode.NavTarget.Space, Lifecycle.State.CREATED) + val spaceNode = roomFlowNode.childNode(JoinedRoomLoadedFlowNode.NavTarget.Space)!! + assertThat(spaceNode.id).isEqualTo(spaceEntryPoint.nodeId) + } + + @Test + fun `given a room flow node when callback on room details is triggered then it loads room details entry point`() = runTest { + // GIVEN + val room = FakeJoinedRoom(baseRoom = FakeBaseRoom(updateMembersResult = {})) + val fakeMessagesEntryPoint = FakeMessagesEntryPoint() + val fakeRoomDetailsEntryPoint = FakeRoomDetailsEntryPoint() + val inputs = JoinedRoomLoadedFlowNode.Inputs(room, RoomNavigationTarget.Root()) + val roomFlowNode = createJoinedRoomLoadedFlowNode( + plugins = listOf(inputs, FakeJoinedRoomLoadedFlowNodeCallback()), + messagesEntryPoint = fakeMessagesEntryPoint, + roomDetailsEntryPoint = fakeRoomDetailsEntryPoint, + ) + val roomFlowNodeTestHelper = roomFlowNode.parentNodeTestHelper() + // WHEN + fakeMessagesEntryPoint.callback?.navigateToRoomDetails() + // THEN + roomFlowNodeTestHelper.assertChildHasLifecycle(JoinedRoomLoadedFlowNode.NavTarget.RoomDetails, Lifecycle.State.CREATED) + val roomDetailsNode = roomFlowNode.childNode(JoinedRoomLoadedFlowNode.NavTarget.RoomDetails)!! + assertThat(roomDetailsNode.id).isEqualTo(fakeRoomDetailsEntryPoint.nodeId) + } + + @Test + fun `the ActiveRoomsHolder will be updated with the loaded room on create`() = runTest { + // GIVEN + val room = FakeJoinedRoom(baseRoom = FakeBaseRoom(updateMembersResult = {})) + val fakeMessagesEntryPoint = FakeMessagesEntryPoint() + val fakeRoomDetailsEntryPoint = FakeRoomDetailsEntryPoint() + val inputs = JoinedRoomLoadedFlowNode.Inputs(room, RoomNavigationTarget.Root()) + val activeRoomsHolder = DefaultActiveRoomsHolder() + val roomFlowNode = createJoinedRoomLoadedFlowNode( + plugins = listOf(inputs, FakeJoinedRoomLoadedFlowNodeCallback()), + messagesEntryPoint = fakeMessagesEntryPoint, + roomDetailsEntryPoint = fakeRoomDetailsEntryPoint, + activeRoomsHolder = activeRoomsHolder, + ) + + assertThat(activeRoomsHolder.getActiveRoom(A_SESSION_ID)).isNull() + val roomFlowNodeTestHelper = roomFlowNode.parentNodeTestHelper() + // WHEN + roomFlowNodeTestHelper.assertChildHasLifecycle(JoinedRoomLoadedFlowNode.NavTarget.Messages(null), Lifecycle.State.CREATED) + // THEN + assertThat(activeRoomsHolder.getActiveRoom(A_SESSION_ID)).isNotNull() + } + + @Test + fun `the ActiveRoomsHolder will be removed on destroy`() = runTest { + // GIVEN + val room = FakeJoinedRoom(baseRoom = FakeBaseRoom(updateMembersResult = {})) + val fakeMessagesEntryPoint = FakeMessagesEntryPoint() + val fakeRoomDetailsEntryPoint = FakeRoomDetailsEntryPoint() + val inputs = JoinedRoomLoadedFlowNode.Inputs(room, RoomNavigationTarget.Root()) + val activeRoomsHolder = DefaultActiveRoomsHolder().apply { + addRoom(room) + } + val roomFlowNode = createJoinedRoomLoadedFlowNode( + plugins = listOf(inputs, FakeJoinedRoomLoadedFlowNodeCallback()), + messagesEntryPoint = fakeMessagesEntryPoint, + roomDetailsEntryPoint = fakeRoomDetailsEntryPoint, + activeRoomsHolder = activeRoomsHolder, + ) + val roomFlowNodeTestHelper = roomFlowNode.parentNodeTestHelper() + roomFlowNodeTestHelper.assertChildHasLifecycle(JoinedRoomLoadedFlowNode.NavTarget.Messages(null), Lifecycle.State.CREATED) + assertThat(activeRoomsHolder.getActiveRoom(A_SESSION_ID)).isNotNull() + // WHEN + roomFlowNode.updateLifecycleState(Lifecycle.State.DESTROYED) + // THEN + roomFlowNodeTestHelper.assertChildHasLifecycle(JoinedRoomLoadedFlowNode.NavTarget.Messages(null), Lifecycle.State.DESTROYED) + assertThat(activeRoomsHolder.getActiveRoom(A_SESSION_ID)).isNull() + } +} diff --git a/appnav/src/test/kotlin/io/element/android/appnav/RootPresenterTest.kt b/appnav/src/test/kotlin/io/element/android/appnav/RootPresenterTest.kt new file mode 100644 index 0000000..73d5513 --- /dev/null +++ b/appnav/src/test/kotlin/io/element/android/appnav/RootPresenterTest.kt @@ -0,0 +1,80 @@ +/* + * Copyright (c) 2025 Element Creations Ltd. + * Copyright 2023-2025 New Vector Ltd. + * + * SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial. + * Please see LICENSE files in the repository root for full details. + */ + +package io.element.android.appnav + +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.appnav.root.RootPresenter +import io.element.android.features.rageshake.api.crash.aCrashDetectionState +import io.element.android.features.rageshake.api.detection.aRageshakeDetectionState +import io.element.android.libraries.matrix.test.FakeSdkMetadata +import io.element.android.services.analytics.test.FakeAnalyticsService +import io.element.android.services.apperror.api.AppErrorState +import io.element.android.services.apperror.api.AppErrorStateService +import io.element.android.services.apperror.impl.DefaultAppErrorStateService +import io.element.android.services.toolbox.test.strings.FakeStringProvider +import io.element.android.tests.testutils.WarmUpRule +import kotlinx.coroutines.test.runTest +import org.junit.Rule +import org.junit.Test + +class RootPresenterTest { + @get:Rule + val warmUpRule = WarmUpRule() + + @Test + fun `present - initial state`() = runTest { + val presenter = createRootPresenter() + moleculeFlow(RecompositionMode.Immediate) { + presenter.present() + }.test { + val initialState = awaitItem() + assertThat(initialState.crashDetectionState.crashDetected).isFalse() + } + } + + @Test + fun `present - passes app error state`() = runTest { + val presenter = createRootPresenter( + appErrorService = DefaultAppErrorStateService( + stringProvider = FakeStringProvider(), + ).apply { + showError("Bad news", "Something bad happened") + } + ) + moleculeFlow(RecompositionMode.Immediate) { + presenter.present() + }.test { + val initialState = awaitItem() + assertThat(initialState.errorState).isInstanceOf(AppErrorState.Error::class.java) + val initialErrorState = initialState.errorState as AppErrorState.Error + assertThat(initialErrorState.title).isEqualTo("Bad news") + assertThat(initialErrorState.body).isEqualTo("Something bad happened") + + initialErrorState.dismiss() + assertThat(awaitItem().errorState).isInstanceOf(AppErrorState.NoError::class.java) + } + } + + private fun createRootPresenter( + appErrorService: AppErrorStateService = DefaultAppErrorStateService( + stringProvider = FakeStringProvider(), + ), + ): RootPresenter { + return RootPresenter( + crashDetectionPresenter = { aCrashDetectionState() }, + rageshakeDetectionPresenter = { aRageshakeDetectionState() }, + appErrorStateService = appErrorService, + analyticsService = FakeAnalyticsService(), + sdkMetadata = FakeSdkMetadata("sha") + ) + } +} diff --git a/appnav/src/test/kotlin/io/element/android/appnav/SyncOrchestratorTest.kt b/appnav/src/test/kotlin/io/element/android/appnav/SyncOrchestratorTest.kt new file mode 100644 index 0000000..7309ca6 --- /dev/null +++ b/appnav/src/test/kotlin/io/element/android/appnav/SyncOrchestratorTest.kt @@ -0,0 +1,396 @@ +/* + * Copyright (c) 2025 Element Creations Ltd. + * Copyright 2025 New Vector Ltd. + * + * SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial. + * Please see LICENSE files in the repository root for full details. + */ + +package io.element.android.appnav + +import io.element.android.appnav.di.SyncOrchestrator +import io.element.android.features.networkmonitor.api.NetworkStatus +import io.element.android.features.networkmonitor.test.FakeNetworkMonitor +import io.element.android.libraries.matrix.api.sync.SyncState +import io.element.android.libraries.matrix.test.sync.FakeSyncService +import io.element.android.services.analytics.test.FakeAnalyticsService +import io.element.android.services.appnavstate.test.FakeAppForegroundStateService +import io.element.android.tests.testutils.WarmUpRule +import io.element.android.tests.testutils.lambda.lambdaRecorder +import io.element.android.tests.testutils.testCoroutineDispatchers +import kotlinx.coroutines.ExperimentalCoroutinesApi +import kotlinx.coroutines.test.TestScope +import kotlinx.coroutines.test.advanceTimeBy +import kotlinx.coroutines.test.runTest +import org.junit.Rule +import org.junit.Test +import kotlin.time.Duration.Companion.milliseconds +import kotlin.time.Duration.Companion.seconds + +@OptIn(ExperimentalCoroutinesApi::class) +class SyncOrchestratorTest { + @get:Rule + val warmUpRule = WarmUpRule() + + @Test + fun `when the sync wasn't running before, an initial sync will take place, even with no network`() = runTest { + val startSyncRecorder = lambdaRecorder> { Result.success(Unit) } + val syncService = FakeSyncService(initialSyncState = SyncState.Idle).apply { + startSyncLambda = startSyncRecorder + } + val networkMonitor = FakeNetworkMonitor(initialStatus = NetworkStatus.Disconnected) + val syncOrchestrator = createSyncOrchestrator( + syncService = syncService, + networkMonitor = networkMonitor, + ) + + // We start observing with an initial sync + syncOrchestrator.start() + + // Advance the time just enough to make sure the initial sync has run + advanceTimeBy(1.milliseconds) + startSyncRecorder.assertions().isCalledOnce() + } + + @Test + fun `when the sync wasn't running before, an initial sync will take place`() = runTest { + val startSyncRecorder = lambdaRecorder> { Result.success(Unit) } + val syncService = FakeSyncService(initialSyncState = SyncState.Idle).apply { + startSyncLambda = startSyncRecorder + } + val networkMonitor = FakeNetworkMonitor(initialStatus = NetworkStatus.Connected) + val syncOrchestrator = createSyncOrchestrator( + syncService = syncService, + networkMonitor = networkMonitor, + ) + + // We start observing with an initial sync + syncOrchestrator.start() + + // Advance the time just enough to make sure the initial sync has run + advanceTimeBy(1.milliseconds) + startSyncRecorder.assertions().isCalledOnce() + + // If we wait for a while, the sync will not be started again by the observer since it's already running + advanceTimeBy(10.seconds) + startSyncRecorder.assertions().isCalledOnce() + } + + @Test + fun `when the app goes to background and the sync was running, it will be stopped after a delay`() = runTest { + val stopSyncRecorder = lambdaRecorder> { Result.success(Unit) } + val syncService = FakeSyncService(initialSyncState = SyncState.Running).apply { + stopSyncLambda = stopSyncRecorder + } + val networkMonitor = FakeNetworkMonitor(initialStatus = NetworkStatus.Connected) + val appForegroundStateService = FakeAppForegroundStateService(initialForegroundValue = true) + val syncOrchestrator = createSyncOrchestrator( + syncService = syncService, + networkMonitor = networkMonitor, + appForegroundStateService = appForegroundStateService, + ) + + // We start observing + syncOrchestrator.observeStates() + + // Advance the time to make sure the orchestrator has had time to start processing the inputs + advanceTimeBy(100.milliseconds) + + // Stop sync was never called + stopSyncRecorder.assertions().isNeverCalled() + + // Now we send the app to background + appForegroundStateService.isInForeground.value = false + + // Stop sync will be called after some delay + stopSyncRecorder.assertions().isNeverCalled() + advanceTimeBy(10.seconds) + stopSyncRecorder.assertions().isCalledOnce() + } + + @Test + fun `when the app state changes several times in a short while, stop sync is only called once`() = runTest { + val stopSyncRecorder = lambdaRecorder> { Result.success(Unit) } + val syncService = FakeSyncService(initialSyncState = SyncState.Running).apply { + stopSyncLambda = stopSyncRecorder + } + val networkMonitor = FakeNetworkMonitor(initialStatus = NetworkStatus.Connected) + val appForegroundStateService = FakeAppForegroundStateService(initialForegroundValue = true) + val syncOrchestrator = createSyncOrchestrator( + syncService = syncService, + networkMonitor = networkMonitor, + appForegroundStateService = appForegroundStateService, + ) + + // We start observing + syncOrchestrator.observeStates() + + // Advance the time to make sure the orchestrator has had time to start processing the inputs + advanceTimeBy(100.milliseconds) + + // Stop sync was never called + stopSyncRecorder.assertions().isNeverCalled() + + // Now we send the app to background + appForegroundStateService.isInForeground.value = false + + // Ensure the stop action wasn't called yet + stopSyncRecorder.assertions().isNeverCalled() + advanceTimeBy(1.seconds) + appForegroundStateService.isInForeground.value = true + advanceTimeBy(1.seconds) + + // Ensure the stop action wasn't called yet either, since we didn't give it enough time to emit after the expected delay + stopSyncRecorder.assertions().isNeverCalled() + + // Now change it again and wait for enough time + appForegroundStateService.isInForeground.value = false + advanceTimeBy(4.seconds) + + // And confirm it's now called + stopSyncRecorder.assertions().isCalledOnce() + } + + @Test + fun `when the app was in background and we receive a notification, a sync will be started then stopped`() = runTest { + val startSyncRecorder = lambdaRecorder> { Result.success(Unit) } + val stopSyncRecorder = lambdaRecorder> { Result.success(Unit) } + val syncService = FakeSyncService(initialSyncState = SyncState.Idle).apply { + startSyncLambda = startSyncRecorder + stopSyncLambda = stopSyncRecorder + } + val networkMonitor = FakeNetworkMonitor(initialStatus = NetworkStatus.Connected) + val appForegroundStateService = FakeAppForegroundStateService( + initialForegroundValue = false, + initialIsSyncingNotificationEventValue = false, + ) + val syncOrchestrator = createSyncOrchestrator( + syncService = syncService, + networkMonitor = networkMonitor, + appForegroundStateService = appForegroundStateService, + ) + + // We start observing + syncOrchestrator.observeStates() + + // Advance the time to make sure the orchestrator has had time to start processing the inputs + advanceTimeBy(100.milliseconds) + + // Start sync was never called + startSyncRecorder.assertions().isNeverCalled() + + // Now we receive a notification and need to sync + appForegroundStateService.updateIsSyncingNotificationEvent(true) + + // Start sync will be called shortly after + advanceTimeBy(1.milliseconds) + startSyncRecorder.assertions().isCalledOnce() + + // If the sync is running and we mark the notification sync as no longer necessary, the sync stops after a delay + syncService.emitSyncState(SyncState.Running) + appForegroundStateService.updateIsSyncingNotificationEvent(false) + + advanceTimeBy(10.seconds) + stopSyncRecorder.assertions().isCalledOnce() + } + + @Test + fun `when the app was in background and we join a call, a sync will be started`() = runTest { + val startSyncRecorder = lambdaRecorder> { Result.success(Unit) } + val stopSyncRecorder = lambdaRecorder> { Result.success(Unit) } + val syncService = FakeSyncService(initialSyncState = SyncState.Idle).apply { + startSyncLambda = startSyncRecorder + stopSyncLambda = stopSyncRecorder + } + val networkMonitor = FakeNetworkMonitor(initialStatus = NetworkStatus.Connected) + val appForegroundStateService = FakeAppForegroundStateService( + initialForegroundValue = false, + initialIsSyncingNotificationEventValue = false, + ) + val syncOrchestrator = createSyncOrchestrator( + syncService = syncService, + networkMonitor = networkMonitor, + appForegroundStateService = appForegroundStateService, + ) + + // We start observing + syncOrchestrator.observeStates() + + // Advance the time to make sure the orchestrator has had time to start processing the inputs + advanceTimeBy(100.milliseconds) + + // Start sync was never called + startSyncRecorder.assertions().isNeverCalled() + + // Now we join a call + appForegroundStateService.updateIsInCallState(true) + + // Start sync will be called shortly after + advanceTimeBy(1.milliseconds) + startSyncRecorder.assertions().isCalledOnce() + + // If the sync is running and we mark the in-call state as false, the sync stops after a delay + syncService.emitSyncState(SyncState.Running) + appForegroundStateService.updateIsInCallState(false) + + advanceTimeBy(10.seconds) + stopSyncRecorder.assertions().isCalledOnce() + } + + @Test + fun `when the app was in background and we have an incoming ringing call, a sync will be started`() = runTest { + val startSyncRecorder = lambdaRecorder> { Result.success(Unit) } + val stopSyncRecorder = lambdaRecorder> { Result.success(Unit) } + val syncService = FakeSyncService(initialSyncState = SyncState.Idle).apply { + startSyncLambda = startSyncRecorder + stopSyncLambda = stopSyncRecorder + } + val networkMonitor = FakeNetworkMonitor(initialStatus = NetworkStatus.Connected) + val appForegroundStateService = FakeAppForegroundStateService( + initialForegroundValue = false, + initialIsSyncingNotificationEventValue = false, + initialHasRingingCall = false, + ) + val syncOrchestrator = createSyncOrchestrator( + syncService = syncService, + networkMonitor = networkMonitor, + appForegroundStateService = appForegroundStateService, + ) + + // We start observing + syncOrchestrator.observeStates() + + // Advance the time to make sure the orchestrator has had time to start processing the inputs + advanceTimeBy(100.milliseconds) + + // Start sync was never called + startSyncRecorder.assertions().isNeverCalled() + + // Now we receive a ringing call + appForegroundStateService.updateHasRingingCall(true) + + // Start sync will be called shortly after + advanceTimeBy(1.milliseconds) + startSyncRecorder.assertions().isCalledOnce() + + // If the sync is running and the ringing call notification is now over, the sync stops after a delay + syncService.emitSyncState(SyncState.Running) + appForegroundStateService.updateHasRingingCall(false) + + advanceTimeBy(10.seconds) + stopSyncRecorder.assertions().isCalledOnce() + } + + @Test + fun `when the app is in foreground, we sync for a notification and a call is ongoing, the sync will only stop when all conditions are false`() = runTest { + val startSyncRecorder = lambdaRecorder> { Result.success(Unit) } + val stopSyncRecorder = lambdaRecorder> { Result.success(Unit) } + val syncService = FakeSyncService(initialSyncState = SyncState.Running).apply { + startSyncLambda = startSyncRecorder + stopSyncLambda = stopSyncRecorder + } + val networkMonitor = FakeNetworkMonitor(initialStatus = NetworkStatus.Connected) + val appForegroundStateService = FakeAppForegroundStateService( + initialForegroundValue = true, + initialIsSyncingNotificationEventValue = true, + initialIsInCallValue = true, + ) + val syncOrchestrator = createSyncOrchestrator( + syncService = syncService, + networkMonitor = networkMonitor, + appForegroundStateService = appForegroundStateService, + ) + + // We start observing + syncOrchestrator.observeStates() + + // Advance the time to make sure the orchestrator has had time to start processing the inputs + advanceTimeBy(100.milliseconds) + + // Start sync was never called + startSyncRecorder.assertions().isNeverCalled() + + // We send the app to background, it's still syncing + appForegroundStateService.givenIsInForeground(false) + advanceTimeBy(10.seconds) + stopSyncRecorder.assertions().isNeverCalled() + + // We stop the notification sync, it's still syncing + appForegroundStateService.updateIsSyncingNotificationEvent(false) + advanceTimeBy(10.seconds) + stopSyncRecorder.assertions().isNeverCalled() + + // We set the in-call state to false, now it stops syncing after a delay + appForegroundStateService.updateIsInCallState(false) + advanceTimeBy(10.seconds) + stopSyncRecorder.assertions().isCalledOnce() + } + + @Test + fun `if the sync was running, it's set to be stopped but something triggers a sync again, the sync is not stopped`() = runTest { + val stopSyncRecorder = lambdaRecorder> { Result.success(Unit) } + val syncService = FakeSyncService(initialSyncState = SyncState.Running).apply { + stopSyncLambda = stopSyncRecorder + } + val networkMonitor = FakeNetworkMonitor(initialStatus = NetworkStatus.Connected) + val appForegroundStateService = FakeAppForegroundStateService( + initialForegroundValue = true, + initialIsSyncingNotificationEventValue = false, + initialIsInCallValue = false, + ) + val syncOrchestrator = createSyncOrchestrator( + syncService = syncService, + networkMonitor = networkMonitor, + appForegroundStateService = appForegroundStateService, + ) + + // We start observing + syncOrchestrator.observeStates() + + // Advance the time to make sure the orchestrator has had time to start processing the inputs + advanceTimeBy(100.milliseconds) + + // This will set the sync to stop + appForegroundStateService.givenIsInForeground(false) + + // But if we reset it quickly before the stop sync takes place, the sync is not stopped + advanceTimeBy(2.seconds) + appForegroundStateService.givenIsInForeground(true) + + advanceTimeBy(10.seconds) + stopSyncRecorder.assertions().isNeverCalled() + } + + @Test + fun `when network is offline, sync service should not start`() = runTest { + val startSyncRecorder = lambdaRecorder> { Result.success(Unit) } + val syncService = FakeSyncService(initialSyncState = SyncState.Idle).apply { + startSyncLambda = startSyncRecorder + } + val networkMonitor = FakeNetworkMonitor(initialStatus = NetworkStatus.Disconnected) + val syncOrchestrator = createSyncOrchestrator( + syncService = syncService, + networkMonitor = networkMonitor, + ) + + // We start observing + syncOrchestrator.observeStates() + + // This should still not trigger a sync, since there is no network + advanceTimeBy(10.seconds) + startSyncRecorder.assertions().isNeverCalled() + } + + private fun TestScope.createSyncOrchestrator( + syncService: FakeSyncService = FakeSyncService(), + networkMonitor: FakeNetworkMonitor = FakeNetworkMonitor(), + appForegroundStateService: FakeAppForegroundStateService = FakeAppForegroundStateService(), + ) = SyncOrchestrator( + syncService = syncService, + sessionCoroutineScope = backgroundScope, + networkMonitor = networkMonitor, + appForegroundStateService = appForegroundStateService, + dispatchers = testCoroutineDispatchers(), + analyticsService = FakeAnalyticsService(), + ) +} diff --git a/appnav/src/test/kotlin/io/element/android/appnav/di/MatrixSessionCacheTest.kt b/appnav/src/test/kotlin/io/element/android/appnav/di/MatrixSessionCacheTest.kt new file mode 100644 index 0000000..56c20f7 --- /dev/null +++ b/appnav/src/test/kotlin/io/element/android/appnav/di/MatrixSessionCacheTest.kt @@ -0,0 +1,137 @@ +/* + * Copyright (c) 2025 Element Creations Ltd. + * Copyright 2023-2025 New Vector Ltd. + * + * SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial. + * Please see LICENSE files in the repository root for full details. + */ + +package io.element.android.appnav.di + +import com.bumble.appyx.core.state.MutableSavedStateMapImpl +import com.google.common.truth.Truth.assertThat +import io.element.android.features.networkmonitor.test.FakeNetworkMonitor +import io.element.android.libraries.matrix.api.sync.SyncService +import io.element.android.libraries.matrix.test.A_SESSION_ID +import io.element.android.libraries.matrix.test.FakeMatrixClient +import io.element.android.libraries.matrix.test.auth.FakeMatrixAuthenticationService +import io.element.android.services.analytics.test.FakeAnalyticsService +import io.element.android.services.appnavstate.test.FakeAppForegroundStateService +import io.element.android.tests.testutils.testCoroutineDispatchers +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.test.TestScope +import kotlinx.coroutines.test.runTest +import org.junit.Test + +class MatrixSessionCacheTest { + @Test + fun `test getOrNull`() = runTest { + val fakeAuthenticationService = FakeMatrixAuthenticationService() + val matrixSessionCache = MatrixSessionCache(fakeAuthenticationService, createSyncOrchestratorFactory()) + assertThat(matrixSessionCache.getOrNull(A_SESSION_ID)).isNull() + } + + @Test + fun `test getSyncOrchestratorOrNull`() = runTest { + val fakeAuthenticationService = FakeMatrixAuthenticationService() + val matrixSessionCache = MatrixSessionCache(fakeAuthenticationService, createSyncOrchestratorFactory()) + + // With no matrix client there is no sync orchestrator + assertThat(matrixSessionCache.getOrNull(A_SESSION_ID)).isNull() + assertThat(matrixSessionCache.getSyncOrchestrator(A_SESSION_ID)).isNull() + + // But as soon as we receive a client, we can get the sync orchestrator + val fakeMatrixClient = FakeMatrixClient(sessionCoroutineScope = backgroundScope) + fakeAuthenticationService.givenMatrixClient(fakeMatrixClient) + assertThat(matrixSessionCache.getOrRestore(A_SESSION_ID).getOrNull()).isEqualTo(fakeMatrixClient) + assertThat(matrixSessionCache.getSyncOrchestrator(A_SESSION_ID)).isNotNull() + } + + @Test + fun `test getOrRestore`() = runTest { + val fakeAuthenticationService = FakeMatrixAuthenticationService() + val matrixSessionCache = MatrixSessionCache(fakeAuthenticationService, createSyncOrchestratorFactory()) + val fakeMatrixClient = FakeMatrixClient(sessionCoroutineScope = backgroundScope) + fakeAuthenticationService.givenMatrixClient(fakeMatrixClient) + assertThat(matrixSessionCache.getOrNull(A_SESSION_ID)).isNull() + assertThat(matrixSessionCache.getOrRestore(A_SESSION_ID).getOrNull()).isEqualTo(fakeMatrixClient) + // Do it again to hit the cache + assertThat(matrixSessionCache.getOrRestore(A_SESSION_ID).getOrNull()).isEqualTo(fakeMatrixClient) + assertThat(matrixSessionCache.getOrNull(A_SESSION_ID)).isEqualTo(fakeMatrixClient) + } + + @Test + fun `test remove`() = runTest { + val fakeAuthenticationService = FakeMatrixAuthenticationService() + val matrixSessionCache = MatrixSessionCache(fakeAuthenticationService, createSyncOrchestratorFactory()) + val fakeMatrixClient = FakeMatrixClient(sessionCoroutineScope = backgroundScope) + fakeAuthenticationService.givenMatrixClient(fakeMatrixClient) + assertThat(matrixSessionCache.getOrRestore(A_SESSION_ID).getOrNull()).isEqualTo(fakeMatrixClient) + assertThat(matrixSessionCache.getOrNull(A_SESSION_ID)).isEqualTo(fakeMatrixClient) + // Remove + matrixSessionCache.remove(A_SESSION_ID) + assertThat(matrixSessionCache.getOrNull(A_SESSION_ID)).isNull() + } + + @Test + fun `test remove all`() = runTest { + val fakeAuthenticationService = FakeMatrixAuthenticationService() + val matrixSessionCache = MatrixSessionCache(fakeAuthenticationService, createSyncOrchestratorFactory()) + val fakeMatrixClient = FakeMatrixClient(sessionCoroutineScope = backgroundScope) + fakeAuthenticationService.givenMatrixClient(fakeMatrixClient) + assertThat(matrixSessionCache.getOrRestore(A_SESSION_ID).getOrNull()).isEqualTo(fakeMatrixClient) + assertThat(matrixSessionCache.getOrNull(A_SESSION_ID)).isEqualTo(fakeMatrixClient) + // Remove all + matrixSessionCache.removeAll() + assertThat(matrixSessionCache.getOrNull(A_SESSION_ID)).isNull() + } + + @Test + fun `test save and restore`() = runTest { + val fakeAuthenticationService = FakeMatrixAuthenticationService() + val matrixSessionCache = MatrixSessionCache(fakeAuthenticationService, createSyncOrchestratorFactory()) + val fakeMatrixClient = FakeMatrixClient(sessionCoroutineScope = backgroundScope) + fakeAuthenticationService.givenMatrixClient(fakeMatrixClient) + matrixSessionCache.getOrRestore(A_SESSION_ID) + val savedStateMap = MutableSavedStateMapImpl { true } + matrixSessionCache.saveIntoSavedState(savedStateMap) + assertThat(savedStateMap.size).isEqualTo(1) + // Test Restore with non-empty map + matrixSessionCache.restoreWithSavedState(savedStateMap) + // Empty the map + matrixSessionCache.removeAll() + assertThat(matrixSessionCache.getOrNull(A_SESSION_ID)).isNull() + // Restore again + matrixSessionCache.restoreWithSavedState(savedStateMap) + assertThat(matrixSessionCache.getOrNull(A_SESSION_ID)).isEqualTo(fakeMatrixClient) + } + + @Test + fun `test AuthenticationService listenToNewMatrixClients emits a Client value and we save it`() = runTest { + val fakeAuthenticationService = FakeMatrixAuthenticationService() + val matrixSessionCache = MatrixSessionCache(fakeAuthenticationService, createSyncOrchestratorFactory()) + assertThat(matrixSessionCache.getOrNull(A_SESSION_ID)).isNull() + + fakeAuthenticationService.givenMatrixClient(FakeMatrixClient(sessionId = A_SESSION_ID, sessionCoroutineScope = backgroundScope)) + val loginSucceeded = fakeAuthenticationService.login("user", "pass") + + assertThat(loginSucceeded.isSuccess).isTrue() + assertThat(matrixSessionCache.getOrNull(A_SESSION_ID)).isNotNull() + } + + private fun TestScope.createSyncOrchestratorFactory() = object : SyncOrchestrator.Factory { + override fun create( + syncService: SyncService, + sessionCoroutineScope: CoroutineScope, + ): SyncOrchestrator { + return SyncOrchestrator( + syncService = syncService, + sessionCoroutineScope = sessionCoroutineScope, + appForegroundStateService = FakeAppForegroundStateService(), + networkMonitor = FakeNetworkMonitor(), + dispatchers = testCoroutineDispatchers(), + analyticsService = FakeAnalyticsService(), + ) + } + } +} diff --git a/appnav/src/test/kotlin/io/element/android/appnav/intent/IntentResolverTest.kt b/appnav/src/test/kotlin/io/element/android/appnav/intent/IntentResolverTest.kt new file mode 100644 index 0000000..bf67360 --- /dev/null +++ b/appnav/src/test/kotlin/io/element/android/appnav/intent/IntentResolverTest.kt @@ -0,0 +1,313 @@ +/* + * Copyright (c) 2025 Element Creations Ltd. + * Copyright 2023-2025 New Vector Ltd. + * + * SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial. + * Please see LICENSE files in the repository root for full details. + */ + +package io.element.android.appnav.intent + +import android.app.Activity +import android.content.Intent +import android.net.Uri +import androidx.core.net.toUri +import com.google.common.truth.Truth.assertThat +import io.element.android.features.login.api.LoginParams +import io.element.android.features.login.test.FakeLoginIntentResolver +import io.element.android.libraries.deeplink.api.DeeplinkData +import io.element.android.libraries.matrix.api.core.UserId +import io.element.android.libraries.matrix.api.permalink.PermalinkData +import io.element.android.libraries.matrix.test.AN_EVENT_ID +import io.element.android.libraries.matrix.test.A_ROOM_ID +import io.element.android.libraries.matrix.test.A_SESSION_ID +import io.element.android.libraries.matrix.test.A_THREAD_ID +import io.element.android.libraries.matrix.test.permalink.FakePermalinkParser +import io.element.android.libraries.oidc.api.OidcAction +import io.element.android.libraries.oidc.test.FakeOidcIntentResolver +import io.element.android.tests.testutils.lambda.lambdaError +import org.junit.Test +import org.junit.runner.RunWith +import org.robolectric.RobolectricTestRunner +import org.robolectric.RuntimeEnvironment + +@RunWith(RobolectricTestRunner::class) +class IntentResolverTest { + @Test + fun `resolve launcher intent should return null`() { + val sut = createIntentResolver() + val intent = Intent(RuntimeEnvironment.getApplication(), Activity::class.java).apply { + action = Intent.ACTION_MAIN + addCategory(Intent.CATEGORY_LAUNCHER) + } + val result = sut.resolve(intent) + assertThat(result).isNull() + } + + @Test + fun `test resolve navigation intent root`() { + val sut = createIntentResolver( + deeplinkParserResult = DeeplinkData.Root(A_SESSION_ID) + ) + val intent = Intent(RuntimeEnvironment.getApplication(), Activity::class.java).apply { + action = Intent.ACTION_VIEW + } + val result = sut.resolve(intent) + assertThat(result).isEqualTo( + ResolvedIntent.Navigation( + deeplinkData = DeeplinkData.Root( + sessionId = A_SESSION_ID, + ) + ) + ) + } + + @Test + fun `test resolve navigation intent room`() { + val sut = createIntentResolver( + deeplinkParserResult = DeeplinkData.Room( + sessionId = A_SESSION_ID, + roomId = A_ROOM_ID, + threadId = null, + eventId = null, + ) + ) + val intent = Intent(RuntimeEnvironment.getApplication(), Activity::class.java).apply { + action = Intent.ACTION_VIEW + } + val result = sut.resolve(intent) + assertThat(result).isEqualTo( + ResolvedIntent.Navigation( + deeplinkData = DeeplinkData.Room( + sessionId = A_SESSION_ID, + roomId = A_ROOM_ID, + threadId = null, + eventId = null, + ) + ) + ) + } + + @Test + fun `test resolve navigation intent thread`() { + val sut = createIntentResolver( + deeplinkParserResult = DeeplinkData.Room( + sessionId = A_SESSION_ID, + roomId = A_ROOM_ID, + threadId = A_THREAD_ID, + eventId = null, + ) + ) + val intent = Intent(RuntimeEnvironment.getApplication(), Activity::class.java).apply { + action = Intent.ACTION_VIEW + } + val result = sut.resolve(intent) + assertThat(result).isEqualTo( + ResolvedIntent.Navigation( + deeplinkData = DeeplinkData.Room( + sessionId = A_SESSION_ID, + roomId = A_ROOM_ID, + threadId = A_THREAD_ID, + eventId = null, + ) + ) + ) + } + + @Test + fun `test resolve navigation intent event`() { + val sut = createIntentResolver( + deeplinkParserResult = DeeplinkData.Room( + sessionId = A_SESSION_ID, + roomId = A_ROOM_ID, + threadId = null, + eventId = AN_EVENT_ID, + ) + ) + val intent = Intent(RuntimeEnvironment.getApplication(), Activity::class.java).apply { + action = Intent.ACTION_VIEW + } + val result = sut.resolve(intent) + assertThat(result).isEqualTo( + ResolvedIntent.Navigation( + deeplinkData = DeeplinkData.Room( + sessionId = A_SESSION_ID, + roomId = A_ROOM_ID, + threadId = null, + eventId = AN_EVENT_ID, + ) + ) + ) + } + + @Test + fun `test resolve navigation intent thread and event`() { + val sut = createIntentResolver( + deeplinkParserResult = DeeplinkData.Room( + sessionId = A_SESSION_ID, + roomId = A_ROOM_ID, + threadId = A_THREAD_ID, + eventId = AN_EVENT_ID, + ) + ) + val intent = Intent(RuntimeEnvironment.getApplication(), Activity::class.java).apply { + action = Intent.ACTION_VIEW + } + val result = sut.resolve(intent) + assertThat(result).isEqualTo( + ResolvedIntent.Navigation( + deeplinkData = DeeplinkData.Room( + sessionId = A_SESSION_ID, + roomId = A_ROOM_ID, + threadId = A_THREAD_ID, + eventId = AN_EVENT_ID, + ) + ) + ) + } + + @Test + fun `test resolve oidc`() { + val sut = createIntentResolver( + oidcIntentResolverResult = { OidcAction.GoBack() }, + ) + val intent = Intent(RuntimeEnvironment.getApplication(), Activity::class.java).apply { + action = Intent.ACTION_VIEW + data = "io.element.android:/?error=access_denied&state=IFF1UETGye2ZA8pO".toUri() + } + val result = sut.resolve(intent) + assertThat(result).isEqualTo( + ResolvedIntent.Oidc( + oidcAction = OidcAction.GoBack() + ) + ) + } + + @Test + fun `test resolve external permalink`() { + val permalinkData = PermalinkData.UserLink( + userId = UserId("@alice:matrix.org") + ) + val sut = createIntentResolver( + loginIntentResolverResult = { null }, + permalinkParserResult = { permalinkData }, + oidcIntentResolverResult = { null }, + ) + val intent = Intent(RuntimeEnvironment.getApplication(), Activity::class.java).apply { + action = Intent.ACTION_VIEW + data = "https://matrix.to/#/@alice:matrix.org".toUri() + } + val result = sut.resolve(intent) + assertThat(result).isEqualTo( + ResolvedIntent.Permalink( + permalinkData = permalinkData + ) + ) + } + + @Test + fun `test resolve external permalink, FallbackLink should be ignored`() { + val sut = createIntentResolver( + permalinkParserResult = { PermalinkData.FallbackLink(Uri.parse("https://matrix.org")) }, + loginIntentResolverResult = { null }, + oidcIntentResolverResult = { null }, + ) + val intent = Intent(RuntimeEnvironment.getApplication(), Activity::class.java).apply { + action = Intent.ACTION_VIEW + data = "https://matrix.to/#/@alice:matrix.org".toUri() + } + val result = sut.resolve(intent) + assertThat(result).isNull() + } + + @Test + fun `test resolve external permalink, invalid action`() { + val permalinkData = PermalinkData.UserLink( + userId = UserId("@alice:matrix.org") + ) + val sut = createIntentResolver( + permalinkParserResult = { permalinkData }, + oidcIntentResolverResult = { null }, + ) + val intent = Intent(RuntimeEnvironment.getApplication(), Activity::class.java).apply { + action = Intent.ACTION_BATTERY_LOW + data = "https://matrix.to/invalid".toUri() + } + val result = sut.resolve(intent) + assertThat(result).isNull() + } + + @Test + fun `test incoming share simple`() { + val sut = createIntentResolver( + oidcIntentResolverResult = { null }, + ) + val intent = Intent(RuntimeEnvironment.getApplication(), Activity::class.java).apply { + action = Intent.ACTION_SEND + } + val result = sut.resolve(intent) + assertThat(result).isEqualTo(ResolvedIntent.IncomingShare(intent = intent)) + } + + @Test + fun `test incoming share multiple`() { + val sut = createIntentResolver( + oidcIntentResolverResult = { null }, + ) + val intent = Intent(RuntimeEnvironment.getApplication(), Activity::class.java).apply { + action = Intent.ACTION_SEND_MULTIPLE + } + val result = sut.resolve(intent) + assertThat(result).isEqualTo(ResolvedIntent.IncomingShare(intent = intent)) + } + + @Test + fun `test resolve invalid`() { + val sut = createIntentResolver( + permalinkParserResult = { PermalinkData.FallbackLink(Uri.parse("https://matrix.org")) }, + loginIntentResolverResult = { null }, + oidcIntentResolverResult = { null }, + ) + val intent = Intent(RuntimeEnvironment.getApplication(), Activity::class.java).apply { + action = Intent.ACTION_VIEW + data = "io.element:/invalid".toUri() + } + val result = sut.resolve(intent) + assertThat(result).isNull() + } + + @Test + fun `test resolve login param`() { + val aLoginParams = LoginParams("accountProvider", null) + val sut = createIntentResolver( + loginIntentResolverResult = { aLoginParams }, + oidcIntentResolverResult = { null }, + ) + val intent = Intent(RuntimeEnvironment.getApplication(), Activity::class.java).apply { + action = Intent.ACTION_VIEW + data = "".toUri() + } + val result = sut.resolve(intent) + assertThat(result).isEqualTo(ResolvedIntent.Login(aLoginParams)) + } + + private fun createIntentResolver( + deeplinkParserResult: DeeplinkData? = null, + permalinkParserResult: (String) -> PermalinkData = { lambdaError() }, + loginIntentResolverResult: (String) -> LoginParams? = { lambdaError() }, + oidcIntentResolverResult: (Intent) -> OidcAction? = { lambdaError() }, + ): IntentResolver { + return IntentResolver( + deeplinkParser = { deeplinkParserResult }, + loginIntentResolver = FakeLoginIntentResolver( + parseResult = loginIntentResolverResult, + ), + oidcIntentResolver = FakeOidcIntentResolver( + resolveResult = oidcIntentResolverResult, + ), + permalinkParser = FakePermalinkParser( + result = permalinkParserResult + ), + ) + } +} diff --git a/appnav/src/test/kotlin/io/element/android/appnav/loggedin/AnalyticsVerificationStateMappingTest.kt b/appnav/src/test/kotlin/io/element/android/appnav/loggedin/AnalyticsVerificationStateMappingTest.kt new file mode 100644 index 0000000..50b9df5 --- /dev/null +++ b/appnav/src/test/kotlin/io/element/android/appnav/loggedin/AnalyticsVerificationStateMappingTest.kt @@ -0,0 +1,62 @@ +/* + * Copyright (c) 2025 Element Creations Ltd. + * Copyright 2024, 2025 New Vector Ltd. + * + * SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial. + * Please see LICENSE files in the repository root for full details. + */ + +package io.element.android.appnav.loggedin + +import com.google.common.truth.Truth.assertThat +import im.vector.app.features.analytics.plan.CryptoSessionStateChange +import im.vector.app.features.analytics.plan.UserProperties +import io.element.android.libraries.matrix.api.encryption.RecoveryState +import io.element.android.libraries.matrix.api.verification.SessionVerifiedStatus +import io.element.android.tests.testutils.WarmUpRule +import kotlinx.coroutines.test.runTest +import org.junit.Rule +import org.junit.Test + +class AnalyticsVerificationStateMappingTest { + @get:Rule + val warmUpRule = WarmUpRule() + + @Test + fun `Test verification Mappings`() = runTest { + assertThat(SessionVerifiedStatus.Verified.toAnalyticsUserPropertyValue()) + .isEqualTo(UserProperties.VerificationState.Verified) + assertThat(SessionVerifiedStatus.NotVerified.toAnalyticsUserPropertyValue()) + .isEqualTo(UserProperties.VerificationState.NotVerified) + + assertThat(SessionVerifiedStatus.Verified.toAnalyticsStateChangeValue()) + .isEqualTo(CryptoSessionStateChange.VerificationState.Verified) + assertThat(SessionVerifiedStatus.NotVerified.toAnalyticsStateChangeValue()) + .isEqualTo(CryptoSessionStateChange.VerificationState.NotVerified) + } + + @Test + fun `Test recovery state Mappings`() = runTest { + assertThat(RecoveryState.UNKNOWN.toAnalyticsUserPropertyValue()) + .isNull() + assertThat(RecoveryState.WAITING_FOR_SYNC.toAnalyticsUserPropertyValue()) + .isNull() + assertThat(RecoveryState.INCOMPLETE.toAnalyticsUserPropertyValue()) + .isEqualTo(UserProperties.RecoveryState.Incomplete) + assertThat(RecoveryState.ENABLED.toAnalyticsUserPropertyValue()) + .isEqualTo(UserProperties.RecoveryState.Enabled) + assertThat(RecoveryState.DISABLED.toAnalyticsUserPropertyValue()) + .isEqualTo(UserProperties.RecoveryState.Disabled) + + assertThat(RecoveryState.UNKNOWN.toAnalyticsStateChangeValue()) + .isNull() + assertThat(RecoveryState.WAITING_FOR_SYNC.toAnalyticsStateChangeValue()) + .isNull() + assertThat(RecoveryState.INCOMPLETE.toAnalyticsStateChangeValue()) + .isEqualTo(CryptoSessionStateChange.RecoveryState.Incomplete) + assertThat(RecoveryState.ENABLED.toAnalyticsStateChangeValue()) + .isEqualTo(CryptoSessionStateChange.RecoveryState.Enabled) + assertThat(RecoveryState.DISABLED.toAnalyticsStateChangeValue()) + .isEqualTo(CryptoSessionStateChange.RecoveryState.Disabled) + } +} diff --git a/appnav/src/test/kotlin/io/element/android/appnav/loggedin/LoggedInPresenterTest.kt b/appnav/src/test/kotlin/io/element/android/appnav/loggedin/LoggedInPresenterTest.kt new file mode 100644 index 0000000..849dfa8 --- /dev/null +++ b/appnav/src/test/kotlin/io/element/android/appnav/loggedin/LoggedInPresenterTest.kt @@ -0,0 +1,348 @@ +/* + * Copyright (c) 2025 Element Creations Ltd. + * Copyright 2023-2025 New Vector Ltd. + * + * SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial. + * Please see LICENSE files in the repository root for full details. + */ + +@file:OptIn(ExperimentalCoroutinesApi::class) + +package io.element.android.appnav.loggedin + +import app.cash.turbine.ReceiveTurbine +import com.google.common.truth.Truth.assertThat +import im.vector.app.features.analytics.plan.CryptoSessionStateChange +import im.vector.app.features.analytics.plan.UserProperties +import io.element.android.libraries.core.meta.BuildMeta +import io.element.android.libraries.matrix.api.MatrixClient +import io.element.android.libraries.matrix.api.core.SessionId +import io.element.android.libraries.matrix.api.encryption.EncryptionService +import io.element.android.libraries.matrix.api.encryption.RecoveryState +import io.element.android.libraries.matrix.api.oidc.AccountManagementAction +import io.element.android.libraries.matrix.api.roomlist.RoomListService +import io.element.android.libraries.matrix.api.sync.SlidingSyncVersion +import io.element.android.libraries.matrix.api.sync.SyncState +import io.element.android.libraries.matrix.api.verification.SessionVerificationService +import io.element.android.libraries.matrix.api.verification.SessionVerifiedStatus +import io.element.android.libraries.matrix.test.AN_EXCEPTION +import io.element.android.libraries.matrix.test.A_SESSION_ID +import io.element.android.libraries.matrix.test.FakeMatrixClient +import io.element.android.libraries.matrix.test.core.aBuildMeta +import io.element.android.libraries.matrix.test.encryption.FakeEncryptionService +import io.element.android.libraries.matrix.test.roomlist.FakeRoomListService +import io.element.android.libraries.matrix.test.sync.FakeSyncService +import io.element.android.libraries.matrix.test.verification.FakeSessionVerificationService +import io.element.android.libraries.push.api.PushService +import io.element.android.libraries.push.api.PusherRegistrationFailure +import io.element.android.libraries.push.test.FakePushService +import io.element.android.libraries.pushproviders.api.Distributor +import io.element.android.libraries.pushproviders.api.PushProvider +import io.element.android.libraries.pushproviders.test.FakePushProvider +import io.element.android.services.analytics.api.AnalyticsService +import io.element.android.services.analytics.test.FakeAnalyticsService +import io.element.android.tests.testutils.WarmUpRule +import io.element.android.tests.testutils.consumeItemsUntilPredicate +import io.element.android.tests.testutils.lambda.lambdaError +import io.element.android.tests.testutils.lambda.lambdaRecorder +import io.element.android.tests.testutils.lambda.value +import io.element.android.tests.testutils.test +import kotlinx.coroutines.ExperimentalCoroutinesApi +import kotlinx.coroutines.test.advanceUntilIdle +import kotlinx.coroutines.test.runTest +import org.junit.Rule +import org.junit.Test + +class LoggedInPresenterTest { + @get:Rule + val warmUpRule = WarmUpRule() + + @Test + fun `present - initial state`() = runTest { + createLoggedInPresenter().test { + val initialState = awaitItem() + assertThat(initialState.showSyncSpinner).isFalse() + assertThat(initialState.pusherRegistrationState.isUninitialized()).isTrue() + assertThat(initialState.ignoreRegistrationError).isFalse() + } + } + + @Test + fun `present - ensure that account urls are preloaded`() = runTest { + val accountManagementUrlResult = lambdaRecorder> { Result.success("aUrl") } + val matrixClient = FakeMatrixClient( + accountManagementUrlResult = accountManagementUrlResult, + ) + createLoggedInPresenter( + matrixClient = matrixClient, + ).test { + awaitItem() + advanceUntilIdle() + accountManagementUrlResult.assertions().isCalledExactly(2) + .withSequence( + listOf(value(AccountManagementAction.Profile)), + listOf(value(AccountManagementAction.SessionsList)), + ) + } + } + + @Test + fun `present - show sync spinner`() = runTest { + val roomListService = FakeRoomListService() + createLoggedInPresenter( + syncState = SyncState.Running, + matrixClient = FakeMatrixClient(roomListService = roomListService), + ).test { + val initialState = awaitItem() + assertThat(initialState.showSyncSpinner).isFalse() + roomListService.postSyncIndicator(RoomListService.SyncIndicator.Show) + consumeItemsUntilPredicate { it.showSyncSpinner } + roomListService.postSyncIndicator(RoomListService.SyncIndicator.Hide) + consumeItemsUntilPredicate { !it.showSyncSpinner } + } + } + + @Test + fun `present - report crypto status analytics`() = runTest { + val analyticsService = FakeAnalyticsService() + val roomListService = FakeRoomListService() + val verificationService = FakeSessionVerificationService() + val encryptionService = FakeEncryptionService() + val buildMeta = aBuildMeta() + LoggedInPresenter( + matrixClient = FakeMatrixClient( + roomListService = roomListService, + encryptionService = encryptionService, + ), + syncService = FakeSyncService(initialSyncState = SyncState.Running), + pushService = FakePushService( + ensurePusherIsRegisteredResult = { Result.success(Unit) }, + ), + sessionVerificationService = verificationService, + analyticsService = analyticsService, + encryptionService = encryptionService, + buildMeta = buildMeta, + ).test { + encryptionService.emitRecoveryState(RecoveryState.UNKNOWN) + encryptionService.emitRecoveryState(RecoveryState.INCOMPLETE) + verificationService.emitVerifiedStatus(SessionVerifiedStatus.Verified) + skipItems(2) + assertThat(analyticsService.capturedEvents.size).isEqualTo(1) + assertThat(analyticsService.capturedEvents[0]).isInstanceOf(CryptoSessionStateChange::class.java) + assertThat(analyticsService.capturedUserProperties.size).isEqualTo(1) + assertThat(analyticsService.capturedUserProperties[0].recoveryState).isEqualTo(UserProperties.RecoveryState.Incomplete) + assertThat(analyticsService.capturedUserProperties[0].verificationState).isEqualTo(UserProperties.VerificationState.Verified) + // ensure a sync status change does not trigger a new capture + roomListService.postSyncIndicator(RoomListService.SyncIndicator.Show) + skipItems(1) + assertThat(analyticsService.capturedEvents.size).isEqualTo(1) + } + } + + @Test + fun `present - ensure default pusher is not registered if session is not verified`() = runTest { + val lambda = lambdaRecorder> { + Result.success(Unit) + } + val pushService = createFakePushService(ensurePusherIsRegisteredResult = lambda) + val verificationService = FakeSessionVerificationService( + initialSessionVerifiedStatus = SessionVerifiedStatus.NotVerified + ) + createLoggedInPresenter( + pushService = pushService, + sessionVerificationService = verificationService, + ).test { + val finalState = awaitFirstItem() + assertThat(finalState.pusherRegistrationState.errorOrNull()) + .isInstanceOf(PusherRegistrationFailure.AccountNotVerified::class.java) + lambda.assertions().isNeverCalled() + } + } + + @Test + fun `present - ensure default pusher is registered with default provider`() = runTest { + val lambda = lambdaRecorder> { Result.success(Unit) } + val sessionVerificationService = FakeSessionVerificationService( + initialSessionVerifiedStatus = SessionVerifiedStatus.Verified + ) + val pushService = createFakePushService( + ensurePusherIsRegisteredResult = lambda, + ) + createLoggedInPresenter( + pushService = pushService, + sessionVerificationService = sessionVerificationService, + matrixClient = FakeMatrixClient( + accountManagementUrlResult = { Result.success(null) }, + ), + ).test { + val finalState = awaitFirstItem() + assertThat(finalState.pusherRegistrationState.isSuccess()).isTrue() + lambda.assertions() + .isCalledOnce() + } + } + + @Test + fun `present - ensure default pusher is registered with default provider - fail to register`() = runTest { + val lambda = lambdaRecorder> { Result.failure(AN_EXCEPTION) } + val sessionVerificationService = FakeSessionVerificationService( + initialSessionVerifiedStatus = SessionVerifiedStatus.Verified + ) + val pushService = createFakePushService( + ensurePusherIsRegisteredResult = lambda, + ) + createLoggedInPresenter( + pushService = pushService, + sessionVerificationService = sessionVerificationService, + matrixClient = FakeMatrixClient( + accountManagementUrlResult = { Result.success(null) }, + ), + ).test { + val finalState = awaitFirstItem() + assertThat(finalState.pusherRegistrationState.isFailure()).isTrue() + lambda.assertions() + .isCalledOnce() + // Reset the error and do not show again + finalState.eventSink(LoggedInEvents.CloseErrorDialog(doNotShowAgain = false)) + val lastState = awaitItem() + assertThat(lastState.pusherRegistrationState.isUninitialized()).isTrue() + assertThat(lastState.ignoreRegistrationError).isFalse() + } + } + + @Test + fun `present - ensure default pusher is registered with default provider - fail to register - do not show again`() = runTest { + val lambda = lambdaRecorder> { Result.failure(AN_EXCEPTION) } + val setIgnoreRegistrationErrorLambda = lambdaRecorder { _, _ -> } + val sessionVerificationService = FakeSessionVerificationService( + initialSessionVerifiedStatus = SessionVerifiedStatus.Verified + ) + val pushService = createFakePushService( + ensurePusherIsRegisteredResult = lambda, + setIgnoreRegistrationErrorLambda = setIgnoreRegistrationErrorLambda, + ) + createLoggedInPresenter( + pushService = pushService, + sessionVerificationService = sessionVerificationService, + matrixClient = FakeMatrixClient( + accountManagementUrlResult = { Result.success(null) }, + ), + ).test { + val finalState = awaitFirstItem() + assertThat(finalState.pusherRegistrationState.isFailure()).isTrue() + lambda.assertions() + .isCalledOnce() + // Reset the error and do not show again + finalState.eventSink(LoggedInEvents.CloseErrorDialog(doNotShowAgain = true)) + skipItems(1) + setIgnoreRegistrationErrorLambda.assertions() + .isCalledOnce() + .with( + // SessionId + value(A_SESSION_ID), + // Ignore + value(true), + ) + val lastState = awaitItem() + assertThat(lastState.pusherRegistrationState.isUninitialized()).isTrue() + assertThat(lastState.ignoreRegistrationError).isTrue() + } + } + + private fun createFakePushService( + pushProvider0: PushProvider? = FakePushProvider( + index = 0, + name = "aFakePushProvider0", + distributors = listOf(Distributor("aDistributorValue0", "aDistributorName0")), + currentDistributor = { null }, + ), + pushProvider1: PushProvider? = FakePushProvider( + index = 1, + name = "aFakePushProvider1", + distributors = listOf(Distributor("aDistributorValue1", "aDistributorName1")), + currentDistributor = { null }, + ), + ensurePusherIsRegisteredResult: () -> Result = { + Result.success(Unit) + }, + selectPushProviderLambda: (SessionId, PushProvider) -> Unit = { _, _ -> lambdaError() }, + currentPushProvider: (SessionId) -> PushProvider? = { null }, + setIgnoreRegistrationErrorLambda: (SessionId, Boolean) -> Unit = { _, _ -> lambdaError() }, + ): PushService { + return FakePushService( + availablePushProviders = listOfNotNull(pushProvider0, pushProvider1), + ensurePusherIsRegisteredResult = ensurePusherIsRegisteredResult, + currentPushProvider = currentPushProvider, + selectPushProviderLambda = selectPushProviderLambda, + setIgnoreRegistrationErrorLambda = setIgnoreRegistrationErrorLambda, + ) + } + + @Test + fun `present - CheckSlidingSyncProxyAvailability forces the sliding sync migration under the right circumstances`() = runTest { + // The migration will be forced if the user is not using the native sliding sync + val matrixClient = FakeMatrixClient( + currentSlidingSyncVersionLambda = { Result.success(SlidingSyncVersion.Proxy) }, + ) + createLoggedInPresenter( + matrixClient = matrixClient, + ).test { + val initialState = awaitItem() + assertThat(initialState.forceNativeSlidingSyncMigration).isFalse() + initialState.eventSink(LoggedInEvents.CheckSlidingSyncProxyAvailability) + assertThat(awaitItem().forceNativeSlidingSyncMigration).isTrue() + } + } + + @OptIn(ExperimentalCoroutinesApi::class) + @Test + fun `present - LogoutAndMigrateToNativeSlidingSync logs out the user`() = runTest { + val logoutLambda = lambdaRecorder { userInitiated, ignoreSdkError -> + assertThat(userInitiated).isTrue() + assertThat(ignoreSdkError).isTrue() + } + val matrixClient = FakeMatrixClient( + accountManagementUrlResult = { Result.success(null) }, + ).apply { + this.logoutLambda = logoutLambda + } + createLoggedInPresenter( + matrixClient = matrixClient, + ).test { + val initialState = awaitItem() + + initialState.eventSink(LoggedInEvents.LogoutAndMigrateToNativeSlidingSync) + + advanceUntilIdle() + + assertThat(logoutLambda.assertions().isCalledOnce()) + } + } + + private suspend fun ReceiveTurbine.awaitFirstItem(): T { + skipItems(1) + return awaitItem() + } + + private fun createLoggedInPresenter( + syncState: SyncState = SyncState.Running, + analyticsService: AnalyticsService = FakeAnalyticsService(), + sessionVerificationService: SessionVerificationService = FakeSessionVerificationService(), + encryptionService: EncryptionService = FakeEncryptionService(), + pushService: PushService = FakePushService(), + matrixClient: MatrixClient = FakeMatrixClient( + accountManagementUrlResult = { Result.success(null) }, + ), + buildMeta: BuildMeta = aBuildMeta(), + ): LoggedInPresenter { + return LoggedInPresenter( + matrixClient = matrixClient, + syncService = FakeSyncService(initialSyncState = syncState), + pushService = pushService, + sessionVerificationService = sessionVerificationService, + analyticsService = analyticsService, + encryptionService = encryptionService, + buildMeta = buildMeta, + ) + } +} diff --git a/appnav/src/test/kotlin/io/element/android/appnav/loggedin/MediaPreviewConfigMigrationTest.kt b/appnav/src/test/kotlin/io/element/android/appnav/loggedin/MediaPreviewConfigMigrationTest.kt new file mode 100644 index 0000000..8e081bd --- /dev/null +++ b/appnav/src/test/kotlin/io/element/android/appnav/loggedin/MediaPreviewConfigMigrationTest.kt @@ -0,0 +1,163 @@ +/* + * Copyright (c) 2025 Element Creations Ltd. + * Copyright 2025 New Vector Ltd. + * + * SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial. + * Please see LICENSE files in the repository root for full details. + */ + +@file:Suppress("DEPRECATION") + +package io.element.android.appnav.loggedin + +import com.google.common.truth.Truth.assertThat +import io.element.android.libraries.matrix.api.media.MediaPreviewConfig +import io.element.android.libraries.matrix.api.media.MediaPreviewValue +import io.element.android.libraries.matrix.test.media.FakeMediaPreviewService +import io.element.android.libraries.preferences.test.InMemoryAppPreferencesStore +import kotlinx.coroutines.flow.first +import kotlinx.coroutines.test.TestScope +import kotlinx.coroutines.test.runTest +import org.junit.Test + +class MediaPreviewConfigMigrationTest { + @Test + fun `when no local data exists, migration does nothing`() = runTest { + val appPreferencesStore = InMemoryAppPreferencesStore() + val mediaPreviewService = FakeMediaPreviewService( + fetchMediaPreviewConfigResult = { Result.success(null) } + ) + val migration = createMigration(appPreferencesStore, mediaPreviewService) + + migration().join() + + // Verify no calls were made to set server config + // since there's nothing to migrate + } + + @Test + fun `when local data exists and server has config, clears local data`() = runTest { + val appPreferencesStore = InMemoryAppPreferencesStore().apply { + setHideInviteAvatars(true) + setTimelineMediaPreviewValue(MediaPreviewValue.Private) + } + val serverConfig = MediaPreviewConfig( + hideInviteAvatar = false, + mediaPreviewValue = MediaPreviewValue.On + ) + val mediaPreviewService = FakeMediaPreviewService( + fetchMediaPreviewConfigResult = { Result.success(serverConfig) } + ) + val migration = createMigration(appPreferencesStore, mediaPreviewService) + + migration().join() + + // Verify local data was cleared + assertThat(appPreferencesStore.getHideInviteAvatarsFlow().first()).isNull() + assertThat(appPreferencesStore.getTimelineMediaPreviewValueFlow().first()).isNull() + } + + @Test + fun `when local hideInviteAvatars exists and server has no config, migrates to server`() = runTest { + val appPreferencesStore = InMemoryAppPreferencesStore().apply { + setHideInviteAvatars(true) + } + var setHideInviteAvatarsValue: Boolean? = null + val mediaPreviewService = FakeMediaPreviewService( + fetchMediaPreviewConfigResult = { Result.success(null) }, + setHideInviteAvatarsResult = { value -> + setHideInviteAvatarsValue = value + Result.success(Unit) + } + ) + val migration = createMigration(appPreferencesStore, mediaPreviewService) + + migration().join() + + // Verify server was updated with local value + assertThat(setHideInviteAvatarsValue).isTrue() + // Verify local data was cleared + assertThat(appPreferencesStore.getHideInviteAvatarsFlow().first()).isNull() + } + + @Test + fun `when local mediaPreviewValue exists and server has no config, migrates to server`() = runTest { + val appPreferencesStore = InMemoryAppPreferencesStore().apply { + setTimelineMediaPreviewValue(MediaPreviewValue.Private) + } + var setMediaPreviewValue: MediaPreviewValue? = null + val mediaPreviewService = FakeMediaPreviewService( + fetchMediaPreviewConfigResult = { Result.success(null) }, + setMediaPreviewValueResult = { value -> + setMediaPreviewValue = value + Result.success(Unit) + } + ) + val migration = createMigration(appPreferencesStore, mediaPreviewService) + + migration().join() + + // Verify server was updated with local value + assertThat(setMediaPreviewValue).isEqualTo(MediaPreviewValue.Private) + // Verify local data was cleared + assertThat(appPreferencesStore.getTimelineMediaPreviewValueFlow().first()).isNull() + } + + @Test + fun `when both local values exist and server has no config, migrates both to server`() = runTest { + val appPreferencesStore = InMemoryAppPreferencesStore().apply { + setHideInviteAvatars(true) + setTimelineMediaPreviewValue(MediaPreviewValue.Off) + } + var setHideInviteAvatarsValue: Boolean? = null + var setMediaPreviewValue: MediaPreviewValue? = null + val mediaPreviewService = FakeMediaPreviewService( + fetchMediaPreviewConfigResult = { Result.success(null) }, + setHideInviteAvatarsResult = { value -> + setHideInviteAvatarsValue = value + Result.success(Unit) + }, + setMediaPreviewValueResult = { value -> + setMediaPreviewValue = value + Result.success(Unit) + } + ) + val migration = createMigration(appPreferencesStore, mediaPreviewService) + + migration().join() + + // Verify server was updated with both local values + assertThat(setHideInviteAvatarsValue).isTrue() + assertThat(setMediaPreviewValue).isEqualTo(MediaPreviewValue.Off) + // Verify local data was cleared + assertThat(appPreferencesStore.getHideInviteAvatarsFlow().first()).isNull() + assertThat(appPreferencesStore.getTimelineMediaPreviewValueFlow().first()).isNull() + } + + @Test + fun `when fetch config fails, migration does nothing`() = runTest { + val appPreferencesStore = InMemoryAppPreferencesStore().apply { + setHideInviteAvatars(true) + setTimelineMediaPreviewValue(MediaPreviewValue.Private) + } + val mediaPreviewService = FakeMediaPreviewService( + fetchMediaPreviewConfigResult = { Result.failure(Exception("Network error")) } + ) + val migration = createMigration(appPreferencesStore, mediaPreviewService) + + migration().join() + + // Verify local data was not cleared since migration failed + assertThat(appPreferencesStore.getHideInviteAvatarsFlow().first()).isTrue() + assertThat(appPreferencesStore.getTimelineMediaPreviewValueFlow().first()).isEqualTo(MediaPreviewValue.Private) + } + + private fun TestScope.createMigration( + appPreferencesStore: InMemoryAppPreferencesStore, + mediaPreviewService: FakeMediaPreviewService + ) = MediaPreviewConfigMigration( + mediaPreviewService = mediaPreviewService, + appPreferencesStore = appPreferencesStore, + sessionCoroutineScope = this + ) +} diff --git a/appnav/src/test/kotlin/io/element/android/appnav/loggedin/SendQueuesTest.kt b/appnav/src/test/kotlin/io/element/android/appnav/loggedin/SendQueuesTest.kt new file mode 100644 index 0000000..3c5d8dc --- /dev/null +++ b/appnav/src/test/kotlin/io/element/android/appnav/loggedin/SendQueuesTest.kt @@ -0,0 +1,79 @@ +/* + * Copyright (c) 2025 Element Creations Ltd. + * Copyright 2024, 2025 New Vector Ltd. + * + * SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial. + * Please see LICENSE files in the repository root for full details. + */ + +package io.element.android.appnav.loggedin + +import io.element.android.libraries.matrix.api.core.RoomId +import io.element.android.libraries.matrix.api.sync.SyncState +import io.element.android.libraries.matrix.test.FakeMatrixClient +import io.element.android.libraries.matrix.test.room.FakeJoinedRoom +import io.element.android.libraries.matrix.test.sync.FakeSyncService +import io.element.android.tests.testutils.lambda.assert +import io.element.android.tests.testutils.lambda.lambdaRecorder +import io.element.android.tests.testutils.lambda.value +import kotlinx.coroutines.ExperimentalCoroutinesApi +import kotlinx.coroutines.flow.MutableSharedFlow +import kotlinx.coroutines.test.advanceTimeBy +import kotlinx.coroutines.test.runCurrent +import kotlinx.coroutines.test.runTest +import org.junit.Test + +@OptIn(ExperimentalCoroutinesApi::class) +class SendQueuesTest { + private val matrixClient = FakeMatrixClient() + private val syncService = FakeSyncService(initialSyncState = SyncState.Running) + private val sut = SendQueues(matrixClient, syncService) + + @Test + fun `test network status online and sending queue failed`() = runTest { + val sendQueueDisabledFlow = MutableSharedFlow(replay = 1) + val setAllSendQueuesEnabledLambda = lambdaRecorder { _: Boolean -> } + matrixClient.sendQueueDisabledFlow = sendQueueDisabledFlow + matrixClient.setAllSendQueuesEnabledLambda = setAllSendQueuesEnabledLambda + val setRoomSendQueueEnabledLambda = lambdaRecorder { _: Boolean -> } + val room = FakeJoinedRoom( + setSendQueueEnabledResult = setRoomSendQueueEnabledLambda + ) + matrixClient.givenGetRoomResult(room.roomId, room) + sut.launchIn(backgroundScope) + + sendQueueDisabledFlow.emit(room.roomId) + advanceTimeBy(SEND_QUEUES_RETRY_DELAY_MILLIS) + runCurrent() + + assert(setAllSendQueuesEnabledLambda) + .isCalledOnce() + .with(value(true)) + + assert(setRoomSendQueueEnabledLambda).isNeverCalled() + } + + @Test + fun `test sync state offline and sending queue failed`() = runTest { + val sendQueueDisabledFlow = MutableSharedFlow(replay = 1) + + val setAllSendQueuesEnabledLambda = lambdaRecorder { _: Boolean -> } + matrixClient.sendQueueDisabledFlow = sendQueueDisabledFlow + matrixClient.setAllSendQueuesEnabledLambda = setAllSendQueuesEnabledLambda + syncService.emitSyncState(SyncState.Offline) + val setRoomSendQueueEnabledLambda = lambdaRecorder { _: Boolean -> } + val room = FakeJoinedRoom( + setSendQueueEnabledResult = setRoomSendQueueEnabledLambda + ) + matrixClient.givenGetRoomResult(room.roomId, room) + + sut.launchIn(backgroundScope) + + sendQueueDisabledFlow.emit(room.roomId) + advanceTimeBy(SEND_QUEUES_RETRY_DELAY_MILLIS) + runCurrent() + + assert(setAllSendQueuesEnabledLambda).isNeverCalled() + assert(setRoomSendQueueEnabledLambda).isNeverCalled() + } +} diff --git a/appnav/src/test/kotlin/io/element/android/appnav/room/LoadingBaseRoomStateFlowFactoryTest.kt b/appnav/src/test/kotlin/io/element/android/appnav/room/LoadingBaseRoomStateFlowFactoryTest.kt new file mode 100644 index 0000000..14128ac --- /dev/null +++ b/appnav/src/test/kotlin/io/element/android/appnav/room/LoadingBaseRoomStateFlowFactoryTest.kt @@ -0,0 +1,83 @@ +/* + * Copyright (c) 2025 Element Creations Ltd. + * Copyright 2023-2025 New Vector Ltd. + * + * SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial. + * Please see LICENSE files in the repository root for full details. + */ + +package io.element.android.appnav.room + +import app.cash.turbine.test +import com.google.common.truth.Truth.assertThat +import io.element.android.libraries.matrix.api.roomlist.RoomList +import io.element.android.libraries.matrix.test.A_ROOM_ID +import io.element.android.libraries.matrix.test.A_SESSION_ID +import io.element.android.libraries.matrix.test.FakeMatrixClient +import io.element.android.libraries.matrix.test.room.FakeBaseRoom +import io.element.android.libraries.matrix.test.room.FakeJoinedRoom +import io.element.android.libraries.matrix.test.roomlist.FakeRoomListService +import io.element.android.libraries.matrix.ui.room.LoadingRoomState +import io.element.android.libraries.matrix.ui.room.LoadingRoomStateFlowFactory +import kotlinx.coroutines.test.runTest +import org.junit.Test + +class LoadingBaseRoomStateFlowFactoryTest { + @Test + fun `flow should emit only Loaded when we already pass a JoinedRoom`() = runTest { + val room = FakeJoinedRoom(baseRoom = FakeBaseRoom(sessionId = A_SESSION_ID, roomId = A_ROOM_ID)) + val matrixClient = FakeMatrixClient(A_SESSION_ID) + val flowFactory = LoadingRoomStateFlowFactory(matrixClient) + flowFactory + .create(lifecycleScope = this, roomId = A_ROOM_ID, joinedRoom = room) + .test { + assertThat(awaitItem()).isEqualTo(LoadingRoomState.Loaded(room)) + ensureAllEventsConsumed() + } + } + + @Test + fun `flow should emit Loading and then Loaded when there is a room in cache`() = runTest { + val room = FakeJoinedRoom(baseRoom = FakeBaseRoom(sessionId = A_SESSION_ID, roomId = A_ROOM_ID)) + val matrixClient = FakeMatrixClient(A_SESSION_ID).apply { + givenGetRoomResult(A_ROOM_ID, room) + } + val flowFactory = LoadingRoomStateFlowFactory(matrixClient) + flowFactory + .create(lifecycleScope = this, roomId = A_ROOM_ID, joinedRoom = null) + .test { + assertThat(awaitItem()).isEqualTo(LoadingRoomState.Loading) + assertThat(awaitItem()).isEqualTo(LoadingRoomState.Loaded(room)) + } + } + + @Test + fun `flow should emit Loading and then Loaded when there is a room in cache after SS is loaded`() = runTest { + val room = FakeJoinedRoom(baseRoom = FakeBaseRoom(sessionId = A_SESSION_ID, roomId = A_ROOM_ID)) + val roomListService = FakeRoomListService() + val matrixClient = FakeMatrixClient(A_SESSION_ID, roomListService = roomListService) + val flowFactory = LoadingRoomStateFlowFactory(matrixClient) + flowFactory + .create(lifecycleScope = this, roomId = A_ROOM_ID, joinedRoom = null) + .test { + assertThat(awaitItem()).isEqualTo(LoadingRoomState.Loading) + matrixClient.givenGetRoomResult(A_ROOM_ID, room) + roomListService.postAllRoomsLoadingState(RoomList.LoadingState.Loaded(1)) + assertThat(awaitItem()).isEqualTo(LoadingRoomState.Loaded(room)) + } + } + + @Test + fun `flow should emit Loading and then Error when there is no room in cache after SS is loaded`() = runTest { + val roomListService = FakeRoomListService() + val matrixClient = FakeMatrixClient(A_SESSION_ID, roomListService = roomListService) + val flowFactory = LoadingRoomStateFlowFactory(matrixClient) + flowFactory + .create(lifecycleScope = this, roomId = A_ROOM_ID, joinedRoom = null) + .test { + assertThat(awaitItem()).isEqualTo(LoadingRoomState.Loading) + roomListService.postAllRoomsLoadingState(RoomList.LoadingState.Loaded(1)) + assertThat(awaitItem()).isEqualTo(LoadingRoomState.Error) + } + } +} diff --git a/appnav/src/test/kotlin/io/element/android/appnav/room/joined/FakeJoinedRoomLoadedFlowNodeCallback.kt b/appnav/src/test/kotlin/io/element/android/appnav/room/joined/FakeJoinedRoomLoadedFlowNodeCallback.kt new file mode 100644 index 0000000..40778ae --- /dev/null +++ b/appnav/src/test/kotlin/io/element/android/appnav/room/joined/FakeJoinedRoomLoadedFlowNodeCallback.kt @@ -0,0 +1,19 @@ +/* + * Copyright (c) 2025 Element Creations Ltd. + * Copyright 2025 New Vector Ltd. + * + * SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial. + * Please see LICENSE files in the repository root for full details. + */ + +package io.element.android.appnav.room.joined + +import io.element.android.libraries.matrix.api.core.RoomId +import io.element.android.libraries.matrix.api.permalink.PermalinkData +import io.element.android.tests.testutils.lambda.lambdaError + +class FakeJoinedRoomLoadedFlowNodeCallback : JoinedRoomLoadedFlowNode.Callback { + override fun navigateToRoom(roomId: RoomId, serverNames: List) = lambdaError() + override fun handlePermalinkClick(data: PermalinkData, pushToBackstack: Boolean) = lambdaError() + override fun navigateToGlobalNotificationSettings() = lambdaError() +} diff --git a/build.gradle.kts b/build.gradle.kts new file mode 100644 index 0000000..19aaf78 --- /dev/null +++ b/build.gradle.kts @@ -0,0 +1,237 @@ +import org.gradle.accessors.dm.LibrariesForLibs + +/* + * Copyright (c) 2025 Element Creations Ltd. + * Copyright 2022-2024 New Vector Ltd. + * + * SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial. + * Please see LICENSE files in the repository root for full details. + */ + +// Top-level build file where you can add configuration options common to all sub-projects/modules. +plugins { + id("io.element.android-root") + alias(libs.plugins.kotlin.jvm) apply false + alias(libs.plugins.android.application) apply false + alias(libs.plugins.android.library) apply false + alias(libs.plugins.kotlin.android) apply false + alias(libs.plugins.compose.compiler) apply false + alias(libs.plugins.ksp) apply false + alias(libs.plugins.dependencycheck) apply false + alias(libs.plugins.roborazzi) apply false + alias(libs.plugins.dependencyanalysis) + alias(libs.plugins.detekt) + alias(libs.plugins.ktlint) + alias(libs.plugins.dependencygraph) + alias(libs.plugins.sonarqube) +} + +tasks.register("clean").configure { + delete(rootProject.layout.buildDirectory) +} + +private val ktLintVersion = the().versions.ktlint.get() + +allprojects { + // Detekt + apply { + plugin("io.gitlab.arturbosch.detekt") + } + detekt { + // preconfigure defaults + buildUponDefaultConfig = true + // activate all available (even unstable) rules. + allRules = true + // point to your custom config defining rules to run, overwriting default behavior + config.from(files("$rootDir/tools/detekt/detekt.yml")) + } + dependencies { + detektPlugins("io.nlopez.compose.rules:detekt:0.4.28") + detektPlugins(project(":tests:detekt-rules")) + } + + tasks.withType().configureEach { + exclude("io/element/android/tests/konsist/failures/**") + } + + // KtLint + apply { + plugin("org.jlleitschuh.gradle.ktlint") + } + + // See https://github.com/JLLeitschuh/ktlint-gradle#configuration + configure { + version = ktLintVersion + android = true + ignoreFailures = false + enableExperimentalRules = true + // display the corresponding rule + verbose = true + reporters { + reporter(org.jlleitschuh.gradle.ktlint.reporter.ReporterType.PLAIN) + // To have XML report for Danger + reporter(org.jlleitschuh.gradle.ktlint.reporter.ReporterType.CHECKSTYLE) + } + val generatedPath = "${layout.buildDirectory.asFile.get()}/generated/" + filter { + exclude { element -> element.file.path.contains(generatedPath) } + exclude("io/element/android/tests/konsist/failures/**") + } + } + // Dependency check + apply { + plugin("org.owasp.dependencycheck") + } + + tasks.withType { + compilerOptions { + // Warnings are potential errors, so stop ignoring them + // This is disabled by default, but the CI will enforce this. + // You can override by passing `-PallWarningsAsErrors=true` in the command line + // Or add a line with "allWarningsAsErrors=true" in your ~/.gradle/gradle.properties file + allWarningsAsErrors = project.properties["allWarningsAsErrors"] == "true" + + // Uncomment to suppress Compose Kotlin compiler compatibility warning +// freeCompilerArgs.addAll(listOf("-P", "plugin:androidx.compose.compiler.plugins.kotlin:suppressKotlinVersionCompatibilityCheck=true")) + + // Fix compilation warning for annotations + // See https://youtrack.jetbrains.com/issue/KT-73255/Change-defaulting-rule-for-annotations for more details + freeCompilerArgs.add("-Xannotation-default-target=first-only") + // Opt-in to context receivers + freeCompilerArgs.add("-Xcontext-parameters") + } + } +} + +// See https://github.com/autonomousapps/dependency-analysis-android-gradle-plugin/wiki/Customizing-plugin-behavior +dependencyAnalysis { + issues { + all { + onUnusedDependencies { + exclude("com.jakewharton.timber:timber") + } + onUnusedAnnotationProcessors {} + onRedundantPlugins {} + onIncorrectConfiguration {} + } + } +} + +// To run a sonar analysis: +// Run './gradlew sonar -Dsonar.login=' +// The SONAR_LOGIN is stored in passbolt as Token Sonar Cloud Bma +// Sonar result can be found here: https://sonarcloud.io/project/overview?id=element-x-android +sonar { + properties { + property("sonar.projectName", "element-x-android") + property("sonar.projectKey", "element-x-android") + property("sonar.host.url", "https://sonarcloud.io") + property("sonar.projectVersion", "1.0") // TODO project(":app").android.defaultConfig.versionName) + property("sonar.sourceEncoding", "UTF-8") + property("sonar.links.homepage", "https://github.com/element-hq/element-x-android/") + property("sonar.links.ci", "https://github.com/element-hq/element-x-android/actions") + property("sonar.links.scm", "https://github.com/element-hq/element-x-android/") + property("sonar.links.issue", "https://github.com/element-hq/element-x-android/issues") + property("sonar.organization", "element-hq") + property("sonar.login", if (project.hasProperty("SONAR_LOGIN")) project.property("SONAR_LOGIN")!! else "invalid") + + // exclude source code from analyses separated by a colon (:) + // Exclude Java source + property("sonar.exclusions", "**/BugReporterMultipartBody.java") + } +} + +allprojects { + tasks.withType { + maxParallelForks = (Runtime.getRuntime().availableProcessors() / 2).coerceAtLeast(1) + + val isScreenshotTest = project.gradle.startParameter.taskNames.any { it.contains("paparazzi", ignoreCase = true) } + if (isScreenshotTest) { + // Increase heap size for screenshot tests + maxHeapSize = "2g" + // Record all the languages? + if (project.hasProperty("allLanguagesNoEnglish")) { + // Do not record English language + exclude("ui/*.class") + } else if (project.hasProperty("allLanguages").not()) { + // Do not record other languages + exclude("translations/*.class") + } + } else { + // Disable screenshot tests by default + exclude("ui/*.class") + exclude("translations/*.class") + } + } +} + +// Register quality check tasks. +tasks.register("runQualityChecks") { + dependsOn(":tests:konsist:testDebugUnitTest") + dependsOn(":app:lintGplayDebug") + project.subprojects { + tasks.findByPath("$path:lintDebug")?.let { dependsOn(it) } + tasks.findByName("detekt")?.let { dependsOn(it) } + tasks.findByName("ktlintCheck")?.let { dependsOn(it) } + // tasks.findByName("buildHealth")?.let { dependsOn(it) } + } + dependsOn(":app:knitCheck") + + // Make sure all checks run even if some fail + gradle.startParameter.isContinueOnFailure = true +} + +// Make sure to delete old screenshots before recording new ones +subprojects { + val snapshotsDir = File("${project.projectDir}/src/test/snapshots") + val removeOldScreenshotsTask = tasks.register("removeOldSnapshots") { + onlyIf { snapshotsDir.exists() } + doFirst { + println("Delete previous screenshots located at $snapshotsDir\n") + snapshotsDir.deleteRecursively() + } + } + tasks.findByName("recordPaparazzi")?.dependsOn(removeOldScreenshotsTask) + tasks.findByName("recordPaparazziDebug")?.dependsOn(removeOldScreenshotsTask) + tasks.findByName("recordPaparazziRelease")?.dependsOn(removeOldScreenshotsTask) +} + +// Make sure to delete old snapshot before recording new ones +subprojects { + val screenshotsDir = File("${project.projectDir}/screenshots") + val removeOldScreenshotsTask = tasks.register("removeOldScreenshots") { + onlyIf { screenshotsDir.exists() } + doFirst { + println("Delete previous screenshots located at $screenshotsDir\n") + screenshotsDir.deleteRecursively() + } + } + tasks.findByName("recordRoborazzi")?.dependsOn(removeOldScreenshotsTask) + tasks.findByName("recordRoborazziDebug")?.dependsOn(removeOldScreenshotsTask) + tasks.findByName("recordRoborazziRelease")?.dependsOn(removeOldScreenshotsTask) +} + +subprojects { + tasks.withType().configureEach { + compilerOptions { + if (project.findProperty("composeCompilerReports") == "true") { + freeCompilerArgs.addAll( + listOf( + "-P", + "plugin:androidx.compose.compiler.plugins.kotlin:reportsDestination=" + + "${project.layout.buildDirectory.asFile.get().absolutePath}/compose_compiler" + ) + ) + } + if (project.findProperty("composeCompilerMetrics") == "true") { + freeCompilerArgs.addAll( + listOf( + "-P", + "plugin:androidx.compose.compiler.plugins.kotlin:metricsDestination=" + + "${project.layout.buildDirectory.asFile.get().absolutePath}/compose_compiler" + ) + ) + } + } + } +} diff --git a/codegen/.gitignore b/codegen/.gitignore new file mode 100644 index 0000000..42afabf --- /dev/null +++ b/codegen/.gitignore @@ -0,0 +1 @@ +/build \ No newline at end of file diff --git a/codegen/build.gradle.kts b/codegen/build.gradle.kts new file mode 100644 index 0000000..5c71c17 --- /dev/null +++ b/codegen/build.gradle.kts @@ -0,0 +1,20 @@ +/* + * Copyright (c) 2025 Element Creations Ltd. + * Copyright 2022-2025 New Vector Ltd. + * + * SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial. + * Please see LICENSE files in the repository root for full details. + */ + +plugins { + alias(libs.plugins.kotlin.jvm) +} + +dependencies { + implementation(projects.annotations) + implementation(libs.metro.runtime) + implementation(libs.kotlin.compiler) + implementation(libs.kotlinpoet) + implementation(libs.ksp.plugin) + implementation(libs.kotlinpoet.ksp) +} diff --git a/codegen/src/main/kotlin/io/element/android/codegen/ContributesNodeProcessor.kt b/codegen/src/main/kotlin/io/element/android/codegen/ContributesNodeProcessor.kt new file mode 100644 index 0000000..7ddf80b --- /dev/null +++ b/codegen/src/main/kotlin/io/element/android/codegen/ContributesNodeProcessor.kt @@ -0,0 +1,173 @@ +/* + * Copyright (c) 2025 Element Creations Ltd. + * Copyright 2022-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.codegen + +import com.google.devtools.ksp.KspExperimental +import com.google.devtools.ksp.getConstructors +import com.google.devtools.ksp.isAnnotationPresent +import com.google.devtools.ksp.processing.CodeGenerator +import com.google.devtools.ksp.processing.Dependencies +import com.google.devtools.ksp.processing.KSPLogger +import com.google.devtools.ksp.processing.Resolver +import com.google.devtools.ksp.processing.SymbolProcessor +import com.google.devtools.ksp.symbol.KSAnnotated +import com.google.devtools.ksp.symbol.KSClassDeclaration +import com.google.devtools.ksp.symbol.KSType +import com.google.devtools.ksp.validate +import com.squareup.kotlinpoet.AnnotationSpec +import com.squareup.kotlinpoet.ClassName +import com.squareup.kotlinpoet.FileSpec +import com.squareup.kotlinpoet.FunSpec +import com.squareup.kotlinpoet.KModifier +import com.squareup.kotlinpoet.ParameterizedTypeName.Companion.parameterizedBy +import com.squareup.kotlinpoet.STAR +import com.squareup.kotlinpoet.TypeSpec +import com.squareup.kotlinpoet.ksp.toTypeName +import com.squareup.kotlinpoet.ksp.writeTo +import dev.zacsweers.metro.Assisted +import dev.zacsweers.metro.AssistedFactory +import dev.zacsweers.metro.BindingContainer +import dev.zacsweers.metro.Binds +import dev.zacsweers.metro.ContributesTo +import dev.zacsweers.metro.IntoMap +import dev.zacsweers.metro.Origin +import io.element.android.annotations.ContributesNode +import org.jetbrains.kotlin.name.FqName + +class ContributesNodeProcessor( + private val logger: KSPLogger, + private val codeGenerator: CodeGenerator, + private val config: Config, +) : SymbolProcessor { + data class Config( + val enableLogging: Boolean = false, + ) + + override fun process(resolver: Resolver): List { + val annotatedSymbols = resolver.getSymbolsWithAnnotation(ContributesNode::class.qualifiedName!!) + .filterIsInstance() + + val (validSymbols, invalidSymbols) = annotatedSymbols.partition { it.validate() } + + if (validSymbols.isEmpty()) return invalidSymbols + + for (ksClass in validSymbols) { + if (config.enableLogging) { + logger.warn("Processing ${ksClass.qualifiedName?.asString()}") + } + generateModule(ksClass) + generateFactory(ksClass) + } + + return invalidSymbols + } + + private fun generateModule(ksClass: KSClassDeclaration) { + val annotation = ksClass.annotations.find { it.shortName.asString() == "ContributesNode" }!! + val scope = annotation.arguments.find { it.name?.asString() == "scope" }!!.value as KSType + val modulePackage = ksClass.packageName.asString() + val moduleClassName = "${ksClass.simpleName.asString()}_Module" + val nodeClassName = ClassName.bestGuess(ksClass.qualifiedName!!.asString()) + val content = FileSpec.builder( + packageName = modulePackage, + fileName = moduleClassName, + ) + .addType( + TypeSpec.interfaceBuilder(moduleClassName) + .addAnnotation(AnnotationSpec.builder(Origin::class).addMember(CLASS_PLACEHOLDER, nodeClassName).build()) + .addAnnotation(BindingContainer::class) + .addAnnotation(AnnotationSpec.builder(ContributesTo::class).addMember(CLASS_PLACEHOLDER, scope.toTypeName()).build()) + .addFunction( + FunSpec.builder("bind${ksClass.simpleName.asString()}Factory") + .addModifiers(KModifier.ABSTRACT) + .addParameter("factory", ClassName(modulePackage, "${ksClass.simpleName.asString()}_AssistedFactory")) + .returns(ClassName.bestGuess(assistedNodeFactoryFqName.asString()).parameterizedBy(STAR)) + .addAnnotation(Binds::class) + .addAnnotation(IntoMap::class) + .addAnnotation( + AnnotationSpec.Companion.builder(ClassName.bestGuess(nodeKeyFqName.asString())).addMember( + CLASS_PLACEHOLDER, + ClassName.bestGuess(ksClass.qualifiedName!!.asString()) + ).build() + ) + .build(), + ) + .build(), + ) + .build() + + content.writeTo( + codeGenerator = codeGenerator, + dependencies = Dependencies( + aggregating = false, + ksClass.containingFile!! + ), + ) + } + + @OptIn(KspExperimental::class) + private fun generateFactory(ksClass: KSClassDeclaration) { + val generatedPackage = ksClass.packageName.asString() + val assistedFactoryClassName = "${ksClass.simpleName.asString()}_AssistedFactory" + val constructor = ksClass.getConstructors().first { it.parameters.isNotEmpty() } + val assistedParameters = constructor.parameters.filter { it.isAnnotationPresent(Assisted::class) } + if (assistedParameters.size != 2) { + error( + "${ksClass.qualifiedName?.asString()} must have a constructor with 2 @Assisted parameters. Found: ${assistedParameters.size}", + ) + } + val contextAssistedParam = assistedParameters[0] + if (contextAssistedParam.name?.asString() != "buildContext") { + error( + "${ksClass.qualifiedName?.asString()} @Assisted parameter must be named buildContext", + ) + } + val pluginsAssistedParam = assistedParameters[1] + if (pluginsAssistedParam.name?.asString() != "plugins") { + error( + "${ksClass.qualifiedName?.asString()} @Assisted parameter must be named plugins", + ) + } + + val nodeClassName = ClassName.bestGuess(ksClass.qualifiedName!!.asString()) + val buildContextClassName = contextAssistedParam.type.toTypeName() + val pluginsClassName = pluginsAssistedParam.type.toTypeName() + val content = FileSpec.builder(generatedPackage, assistedFactoryClassName) + .addType( + TypeSpec.interfaceBuilder(assistedFactoryClassName) + .addSuperinterface(ClassName.bestGuess(assistedNodeFactoryFqName.asString()).parameterizedBy(nodeClassName)) + .addAnnotation(AnnotationSpec.builder(Origin::class).addMember("%T::class", nodeClassName).build()) + .addAnnotation(AssistedFactory::class) + .addFunction( + FunSpec.builder("create") + .addModifiers(KModifier.OVERRIDE, KModifier.ABSTRACT) + .addParameter("buildContext", buildContextClassName) + .addParameter("plugins", pluginsClassName) + .returns(nodeClassName) + .build(), + ) + .build(), + ) + .build() + + content.writeTo( + codeGenerator = codeGenerator, + dependencies = Dependencies( + aggregating = false, + ksClass.containingFile!! + ), + ) + } + + companion object { + private const val CLASS_PLACEHOLDER = "%T::class" + private val assistedNodeFactoryFqName = FqName("io.element.android.libraries.architecture.AssistedNodeFactory") + private val nodeKeyFqName = FqName("io.element.android.libraries.architecture.NodeKey") + } +} diff --git a/codegen/src/main/kotlin/io/element/android/codegen/ContributesNodeProcessorProvider.kt b/codegen/src/main/kotlin/io/element/android/codegen/ContributesNodeProcessorProvider.kt new file mode 100644 index 0000000..8412fbf --- /dev/null +++ b/codegen/src/main/kotlin/io/element/android/codegen/ContributesNodeProcessorProvider.kt @@ -0,0 +1,24 @@ +/* + * Copyright (c) 2025 Element Creations Ltd. + * Copyright 2022-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.codegen + +import com.google.devtools.ksp.processing.SymbolProcessor +import com.google.devtools.ksp.processing.SymbolProcessorEnvironment +import com.google.devtools.ksp.processing.SymbolProcessorProvider + +class ContributesNodeProcessorProvider : SymbolProcessorProvider { + override fun create(environment: SymbolProcessorEnvironment): SymbolProcessor { + val enableLogging = environment.options["enableLogging"]?.toBoolean() == true + return ContributesNodeProcessor( + logger = environment.logger, + codeGenerator = environment.codeGenerator, + config = ContributesNodeProcessor.Config(enableLogging = enableLogging), + ) + } +} diff --git a/codegen/src/main/resources/META-INF/services/com.google.devtools.ksp.processing.SymbolProcessorProvider b/codegen/src/main/resources/META-INF/services/com.google.devtools.ksp.processing.SymbolProcessorProvider new file mode 100644 index 0000000..2d18fdf --- /dev/null +++ b/codegen/src/main/resources/META-INF/services/com.google.devtools.ksp.processing.SymbolProcessorProvider @@ -0,0 +1 @@ +io.element.android.codegen.ContributesNodeProcessorProvider diff --git a/docs/_developer_onboarding.md b/docs/_developer_onboarding.md new file mode 100644 index 0000000..6fb5229 --- /dev/null +++ b/docs/_developer_onboarding.md @@ -0,0 +1,433 @@ +# Developer on boarding + + + +* [Introduction](#introduction) + * [Quick introduction to Matrix](#quick-introduction-to-matrix) + * [Matrix data](#matrix-data) + * [Room](#room) + * [Event](#event) + * [Sync](#sync) + * [Rust SDK](#rust-sdk) + * [Matrix Rust Component Kotlin](#matrix-rust-component-kotlin) + * [Building the SDK locally](#building-the-sdk-locally) + * [The Android project](#the-android-project) + * [Application](#application) + * [Jetpack Compose](#jetpack-compose) + * [Global architecture](#global-architecture) + * [Template and naming](#template-and-naming) + * [Push](#push) + * [Dependencies management](#dependencies-management) + * [Test](#test) + * [Code coverage](#code-coverage) + * [Other points](#other-points) + * [Logging](#logging) + * [Translations](#translations) + * [Rageshake](#rageshake) + * [Tips](#tips) +* [Happy coding!](#happy-coding) + + + +## Introduction + +This doc is a quick introduction about the project and its architecture. + +Its aim is to help new developers to understand the overall project and where to start developing. + +Other useful documentation: + +- all the docs in this folder! +- the [contributing doc](../CONTRIBUTING.md), that you should also read carefully. + +### Quick introduction to Matrix + +Matrix website: [matrix.org](https://matrix.org), [discover page](https://matrix.org/discover). +*Note*: Matrix.org is also hosting a homeserver ([.well-known file](https://matrix.org/.well-known/matrix/client)). +The reference homeserver (this is how Matrix servers are called) implementation is [Synapse](https://github.com/matrix-org/synapse/). But other implementations +exist. The Matrix specification is here to ensure that any Matrix client, such as Element Android and its SDK can talk to any Matrix server. + +Have a quick look to the client-server API documentation: [Client-server documentation](https://spec.matrix.org/v1.3/client-server-api/). Other network API +exist, the list is here: (https://spec.matrix.org/latest/) + +Matrix is an open source protocol. Change are possible and are tracked using [this GitHub repository](https://github.com/matrix-org/matrix-doc/). Changes to the +protocol are called MSC: Matrix Spec Change. These are PullRequest to this project. + +Matrix object are Json data. Unstable prefixes must be used for Json keys when the MSC is not merged (i.e. accepted). + +#### Matrix data + +There are many object and data in the Matrix worlds. Let's focus on the most important and used, `Room` and `Event` + +##### Room + +`Room` is a place which contains ordered `Event`s. They are identified with their `room_id`. Nearly all the data are stored in rooms, and shared using +homeserver to all the Room Member. + +*Note*: Spaces are also Rooms with a different `type`. + +##### Event + +`Events` are items of a Room, where data is embedded. + +There are 2 types of Room Event: + +- Regular Events: contain useful content for the user (message, image, etc.), but are not necessarily displayed as this in the timeline (reaction, message + edition, call signaling). +- State Events: contain the state of the Room (name, topic, etc.). They have a non null value for the key `state_key`. + +Also all the Room Member details are in State Events: one State Event per member. In this case, the `state_key` is the matrixId (= userId). + +Important Fields of an Event: + +- `event_id`: unique across the Matrix universe; +- `room_id`: the room the Event belongs to; +- `type`: describe what the Event contain, especially in the `content` section, and how the SDK should handle this Event; +- `content`: dynamic Event data; depends on the `type`. + +So we have a triple `event_id`, `type`, `state_key` which uniquely defines an Event. + +#### Sync + +This is managed by the Rust SDK. + +### Rust SDK + +The Rust SDK is hosted here: https://github.com/matrix-org/matrix-rust-sdk. + +This repository contains an implementation of a Matrix client-server library written in Rust. + +With some bindings we can embed this sdk inside other environments, like Swift or Kotlin, with the help of [Uniffi](https://github.com/mozilla/uniffi-rs). +From these kotlin bindings we can generate native libs (.so files) and kotlin classes/interfaces. + +#### Matrix Rust Component Kotlin + +To use these bindings in an android project, we need to wrap this up into an android library (as the form of an .aar file). +This is the goal of https://github.com/matrix-org/matrix-rust-components-kotlin. +This repository is used for distributing kotlin releases of the Matrix Rust SDK. +It'll provide the corresponding aar and also publish them on maven. + +Most of the time **you want to use the releases made on maven with gradle**: + +```groovy +implementation("org.matrix.rustcomponents:sdk-android:latest-version") +``` + +You can also have access to the aars through the [release](https://github.com/matrix-org/matrix-rust-components-kotlin/releases) page. + +#### Building the SDK locally + +If you want to make changes to the SDK or test them before integrating it with your codebase, you can build the SDK locally too. + +Prerequisites: +* Install the Android NDK (Native Development Kit). To do this from within + Android Studio: + 1. **Tools > SDK Manager** + 2. Click the **SDK Tools** tab. + 3. Select the **NDK (Side by side)** checkbox + 4. Click **OK**. + 5. Click **OK**. + 6. When the installation is complete, click **Finish**. +* Install `cargo-ndk`: + ``` + cargo install cargo-ndk + ``` +* Install the Android Rust toolchain for your machine's hardware: + ``` + rustup target add aarch64-linux-android x86_64-linux-android + ``` +* Depending on the location of the Android SDK, you may need to set + `ANDROID_HOME`: + ``` + export ANDROID_HOME=$HOME/android/sdk + ``` + +You can then build the Rust SDK by running the script +[`tools/sdk/build_rust_sdk.sh`](../tools/sdk/build_rust_sdk.sh) and just answering +the questions. + +This will prompt you for the path to the Rust SDK, then build it and +`matrix-rust-components-kotlin`, eventually producing an aar file at +`./libraries/rustsdk/matrix-rust-sdk.aar`, which will be picked up +automatically by the Element X Android build. + +Troubleshooting: + - You may need to set `ANDROID_NDK_HOME` e.g `export ANDROID_NDK_HOME=~/Library/Android/sdk/ndk`. + - If you get the error `thread 'main' panicked at 'called `Option::unwrap()` on a `None` value', .cargo/registry/src/index.crates.io-6f17d22bba15001f/cargo-ndk-2.11.0/src/cli.rs:345:18` try updating your Cargo NDK version. In this case, 2.11.0 is too old so `cargo install cargo-ndk` to install a newer version. + - If you get the error `Unsupported class file major version `, try changing your JVM version by setting + `JAVA_HOME` and, if building via Android Studio, "File | Settings | Build, Execution, Deployment | Build Tools | Gradle | Gradle JDK". + +You can switch back to using the published version of the SDK by deleting `libraries/rustsdk/matrix-rust-sdk.aar`. + +### The Android project + +The project should compile out of the box. + +This Android project is a multi modules project. + +- `app` module is the Android application module. Other modules are libraries; +- `features` modules contain some UI and can be seen as screen or flow of screens of the application; +- `libraries` modules contain classes that can be useful for other modules to work. + +A few details about some modules: + +- `libraries-core` module contains utility classes; +- `libraries-designsystem` module contains Composables which can be used across the app (theme, etc.); +- `libraries-elementresources` module contains resource from Element Android (mainly strings); +- `libraries-matrix` module contains wrappers around the Matrix Rust SDK. + +Most of the time a feature module should not know anything about other feature module. +The navigation glue is currently done in the `app` module. + +Here is the current simplified module dependency graph: + + + +```mermaid +flowchart TD + subgraph Application + app([:app])--implementation-->appnav([:appnav]) + end + subgraph Features + featureapi([:features:*:api]) + featureimpl([:features:*:impl]) + end + subgraph Libraries + subgraph Matrix + matrixapi([:matrix:api]) + matriximpl([:matrix:impl]) + end + libraryarch([:libraries:architecture]) + libraryapi([:libraries:*:api]) + libraryimpl([:libraries:*:impl]) + end + subgraph Matrix RustSdk + RustSdk([Rust Sdk]) + end + + app--implementation-->featureimpl + app--implementation-->libraryimpl + appnav--implementation-->featureapi + appnav--implementation-->libraryarch + featureimpl--api-->featureapi + featureimpl--implementation-->matrixapi + featureimpl--implementation-->libraryapi + featureimpl--implementation-->libraryarch + matriximpl--implementation-->matrixapi + matrixapi--api-->RustSdk + matriximpl--api-->RustSdk + featureapi--implementation-->libraryarch + libraryimpl--api-->libraryapi +``` + +### Application + +This Android project mainly handle the application layer of the whole software. The communication with the Matrix server, as well as the local storage, the +cryptography (encryption and decryption of Event, key management, etc.) is managed by the Rust SDK. + +The application is responsible to store the session credentials though. + +#### Jetpack Compose + +Compose is essentially two libraries : Compose Compiler and Compose UI. The compiler (and his runtime) is actually not specific to UI at all and offer powerful +state management APIs. See https://jakewharton.com/a-jetpack-compose-by-any-other-name/ + +Some useful links: + +- https://developer.android.com/jetpack/compose/mental-model +- https://developer.android.com/jetpack/compose/libraries +- https://developer.android.com/jetpack/compose/modifiers-list +- https://android.googlesource.com/platform/frameworks/support/+/androidx-main/compose/docs/compose-api-guidelines.md#api-guidelines-for-jetpack-compose + +About Preview + +- https://alexzh.com/jetpack-compose-preview/ + +#### Global architecture + +Main libraries and frameworks used in this application: + +- Navigation state with [Appyx](https://bumble-tech.github.io/appyx/). Please + watch [this video](https://www.droidcon.com/2022/11/15/model-driven-navigation-with-appyx-from-zero-to-hero/) to learn more about Appyx! +- Dependency injection: [Metro](https://zacsweers.github.io/metro/latest/) +- Reactive State management with Compose runtime and [Molecule](https://github.com/cashapp/molecule) + +Some patterns are inspired by [Circuit](https://slackhq.github.io/circuit/) + +Here are the main points: + +1. `Presenter` and `View` does not communicate with each other directly, but through `State` and `Event` +2. Views are compose first +3. Presenters are also compose first, and have a single `present(): State` method. It's using the power of compose-runtime/compiler. +4. The point of connection between a `View` and a `Presenter` is a `Node`. +5. A `Node` is also responsible for managing DI graph if any, see for instance `LoggedInAppScopeFlowNode`. +6. A `ParentNode` has some children `Node` and only know about them. +7. This is a single activity full compose application. The `MainActivity` is responsible for holding and configuring the `RootNode`. +8. There is no more needs for Android Architecture Component ViewModel as configuration change should be handled by Composable if needed. + +#### Template and naming + +This documentation provides you with the steps to install and use the AS plugin for generating modules in your project. +The plugin and templates will help you quickly create new features with a standardized structure. + +A. Installation + +Follow these steps to install and configure the plugin and templates: + +1. Install the AS plugin for generating modules : + [Generate Module from Template](https://plugins.jetbrains.com/plugin/13586-generate-module-from-template) +2. From repository root, run `./tools/templates/generate_templates.sh` to generate the template zip file +3. Import file templates in AS : + - Navigate to File/Manage IDE Settings/Import Settings + - Pick the `tmp/file_templates.zip` files + - Click on OK +4. Configure generate-module-from-template plugin : + - Navigate to AS/Settings/Tools/Module Template Settings + - Click on + / Import From File + - Pick the `tools/templates/FeatureModule.json` + +Everything should be ready to use. + +B. Usage + +Example for a new feature called RoomDetails: + +1. Right-click on the features package and click on Create Module from Template +2. Fill the 2 text fields like so: + - MODULE_NAME = roomdetails + - FEATURE_NAME = RoomDetails +3. Click on Next +4. Verify that the structure looks ok and click on Finish +5. The modules api/impl should be created under `features/roomdetails` directory. +6. Sync project with Gradle so the modules are recognized (no need to add them to settings.gradle). +7. You can now add more Presentation classes (Events, State, StateProvider, View, Presenter) in the impl module with the `Template Presentation Classes`. + To use it, just right click on the package where you want to generate classes, and click on `Template Presentation Classes`. + Fill the text field with the base name of the classes, ie `RootRoomDetails` in the `root` package. + + +Note that naming of files and classes is important, since those names are used to set up code coverage rules. For instance, presenters MUST have a +suffix `Presenter`,states MUST have a suffix `State`, etc. Also we want to have a common naming along all the modules. + +### Push + +**Note** Firebase is implemented, but Unified Push is not yet fully implemented on the project, so this is not possible to choose this push provider in the app at the moment. + +Please see the dedicated [documentation](notifications.md) for more details. + +This is the classical scenario: + +- App receives a Push. Note: Push is ignored if app is in foreground; +- App asks the SDK to load Event data (fastlane mode). We have a change to get the data faster and display the notification faster; +- App asks the SDK to perform a sync request. + +### Dependencies management + +We are using [Gradle version catalog](https://docs.gradle.org/current/userguide/platforms.html#sub:central-declaration-of-dependencies) on this project. + +All the dependencies (including android artifact, gradle plugin, etc.) should be declared in [../gradle/libs.versions.toml](libs.versions.toml) file. +Some dependency, mainly because they are not shared can be declared in `build.gradle.kts` files. + +[Renovate](https://github.com/apps/renovate) is set up on the project. This tool will automatically create Pull Request to upgrade our dependencies one by one. A [dependency dashboard issue](https://github.com/element-hq/element-x-android/issues/150) is maintained by the tool and allow to perform some actions. + +### Test + +We have 3 tests frameworks in place, and this should be sufficient to guarantee a good code coverage and limit regressions hopefully: + +- Maestro to test the global usage of the application. See the related [documentation](../.maestro/README.md). +- Combination of [Showkase](https://github.com/airbnb/Showkase) and [Paparazzi](https://github.com/cashapp/paparazzi), to test UI pixel perfect. To add test, + just add `@Preview` for the composable you are adding. See the related [documentation](screenshot_testing.md) and see in the template the + file [TemplateView.kt](../features/template/src/main/kotlin/io/element/android/features/template/TemplateView.kt). We create PreviewProvider to provide + different states. See for instance the + file [TemplateStateProvider.kt](../features/template/src/main/kotlin/io/element/android/features/template/TemplateStateProvider.kt) +- Tests on presenter with [Molecule](https://github.com/cashapp/molecule) and [Turbine](https://github.com/cashapp/turbine). See in the template the class [TemplatePresenterTests](../features/template/src/test/kotlin/io/element/android/features/template/TemplatePresenterTests.kt). + +**Note** For now we want to avoid using class mocking (with library such as *mockk*), because this should be not necessary. We prefer to create Fake +implementation of our interfaces. Mocking can be used to mock Android framework classes though, such as `Bitmap` for instance. + +### Code coverage + +[kover](https://github.com/Kotlin/kotlinx-kover) is used to compute code coverage. Only have unit tests can produce code coverage result. Running Maestro does +not participate to the code coverage results. + +Kover configuration is defined in the app [build.gradle.kts](../app/build.gradle.kts) file. + +To compute the code coverage, run: + +```bash +./gradlew :app:koverHtmlReport +``` + +and open the Html report: [../app/build/reports/kover/html/index.html](../app/build/reports/kover/html/index.html) + +To ensure that the code coverage threshold are OK, you can run + +```bash +./gradlew :app:koverVerify +``` + +Note that the CI performs this check on every pull requests. + +Also, if the rule `Global minimum code coverage.` is in error because code coverage is `> maxValue`, `minValue` and `maxValue` can be updated for this rule in +the file [build.gradle.kts](../app/build.gradle.kts) (you will see further instructions there). + +### Other points + +#### Logging + +**Important warning: ** NEVER log private user data, or use the flag `LOG_PRIVATE_DATA`. Be very careful when logging `data class`, all the content will be +output! + +[Timber](https://github.com/JakeWharton/timber) is used to log data to logcat. We do not use directly the `Log` class. If possible please use a tag, as per + +````kotlin +Timber.tag(loggerTag.value).d("my log") +```` + +because automatic tag (= class name) will not be available on the release version. + +Also generally it is recommended to provide the `Throwable` to the Timber log functions. + +Last point, note that `Timber.v` function may have no effect on some devices. Prefer using `Timber.d` and up. + + +#### Translations + +Translations are handled through localazy. See [the dedicated README.md file](../tools/localazy/README.md) for information on how +to configure new modules etc. + +#### Rageshake + +Rageshake is a feature to send bug report directly from the application. Just shake your phone and you will be prompted to send a bug report. + +Bug reports can contain: + +- a screenshot of the current application state +- the application logs from up to 15 application starts +- the logcat logs + +The data will be sent to an internal server, which is not publicly accessible. A GitHub issue will also be created to a private GitHub repository. + +Rageshake can be very useful to get logs from a release version of the application. + +### Tips + +- Element Android has a `developer mode` in the `Settings/Advanced settings`. Other useful options are available here; (TODO Not supported yet!) +- Show hidden Events can also help to debug feature. When developer mode is enabled, it is possible to view the source (= the Json content) of any Events; (TODO + Not supported yet!) +- Type `/devtools` in a Room composer to access a developer menu. There are some other entry points. Developer mode has to be enabled; (TODO Not supported yet!) +- Hidden debug menu: when developer mode is enabled and on debug build, there are some extra screens that can be accessible using the green wheel. In those + screens, it will be possible to toggle some feature flags; (TODO Not supported yet!) +- Using logcat, filtering with `Compositions` can help you to understand what screen are currently displayed on your device. Searching for string displayed on + the screen can also help to find the running code in the codebase. +- When this is possible, prefer using `sealed interface` instead of `sealed class`; +- When writing temporary code, using the string "DO NOT COMMIT" in a comment can help to avoid committing things by mistake. If committed and pushed, the CI + will detect this String and will warn the user about it. (TODO Not supported yet!) +- Very occasionally the gradle cache misbehaves and causes problems with code generation. Adding `--no-build-cache` to the `gradlew` command line can help to fix compilation issue. + +## Happy coding! + +The team is here to support you, feel free to ask anything to other developers. + +Also please feel free to update this documentation, if incomplete/wrong/obsolete/etc. + +**Thanks!** diff --git a/docs/analytics.md b/docs/analytics.md new file mode 100644 index 0000000..3113b94 --- /dev/null +++ b/docs/analytics.md @@ -0,0 +1,17 @@ +# Analytics in Element + + + +* [Sentry](#sentry) + + + +## Sentry + +To make Sentry analytics and bug reporting work, you need to provide a Sentry DSN in the `local.properties` file, or set the `ELEMENT_ANDROID_SENTRY_DSN` environment variable. + +The format used to add the DSN to your `local.properties` file is the following: + +```properties +services.analyticsproviders.sentry.dsn=https://your-sentry-dsn/project-id +``` diff --git a/docs/continuous_integration.md b/docs/continuous_integration.md new file mode 100644 index 0000000..85a869c --- /dev/null +++ b/docs/continuous_integration.md @@ -0,0 +1,69 @@ +# Continuous integration strategy + + + +* [Introduction](#introduction) +* [CI tools](#ci-tools) +* [Rules](#rules) +* [What is the CI checking](#what-is-the-ci-checking) +* [What is the CI reporting](#what-is-the-ci-reporting) +* [Current choices](#current-choices) + * [R8 task](#r8-task) + * [Android test (connected test)](#android-test-connected-test) + + + +## Introduction + +This document gives some information about how we take advantage of the continuous integration (CI). + +## CI tools + +We use GitHub Actions to configure and perform the CI. + +## Rules + +We want: + +1. The CI to detect as soon as possible any issue in the code +2. The CI to be fast - it's run on all the Pull Requests, and developers do not like to wait too long +3. The CI to be reliable - it should not fail randomly +4. The CI to generate artifacts which can be used by the team and the community +5. The CI to generate useful logs and reports, not too verbose, not too short +6. The developer to be able to run the CI locally - to help with this we have [a script](../tools/check/check_code_quality.sh) the can be run locally and which does more checks that just building and deploying the app. +7. The CI to be used as a common environment for the team: generate the screenshots image for the screenshot test, build the release build (unsigned) +8. The CI to run repeated tasks, like building the nightly builds, integrating data from external tools (translations, etc.) +9. The CI to upgrade our dependencies (Renovate) +10. The CI to do some issue triaging + +## What is the CI checking + +The CI checks that: + +1. The code is compiling, without any warnings, for all the app build types and variants +2. The tests are passing +3. The code quality is good (detekt, ktlint, lint) +4. The code is running and smoke tests are passing (maestro) +5. The PullRequest itself is good (with danger) +6. Files that must be added with git-lfs are added with git-lfs + +## What is the CI reporting + +The CI reports: + +1. Code coverage reports +2. Sonar reports + +## Current choices + +### R8 task + +The CI does not run R8 because it's too slow, and it breaks rule 2. + +The drawback is that the nightly build can fail, as well as the release build. + +Since the nightly build is failing, the team can detect the failure quite fast and react to it. + +### Android test (connected test) + +We limit the number of connected tests (tests under folder `androidTest`), because it often break rule 2 and 3. diff --git a/docs/danger.md b/docs/danger.md new file mode 100644 index 0000000..9adb382 --- /dev/null +++ b/docs/danger.md @@ -0,0 +1,105 @@ +## Danger + + + +* [What does danger checks](#what-does-danger-checks) + * [PR check](#pr-check) + * [Quality check](#quality-check) +* [Setup](#setup) +* [Run danger locally](#run-danger-locally) +* [Danger user](#danger-user) +* [Useful links](#useful-links) + + + +## What does danger checks + +### PR check + +See the [dangerfile](../tools/danger/dangerfile.js). If you add rules in the dangerfile, please update the list below! + +Here are the checks that Danger does so far: + +- PR description is not empty +- Big PR got a warning to recommend to split +- PR contains a correct title and a label to categorize the release note +- PR does not modify frozen classes +- PR with change on layout should include screenshot in the description (TODO Not supported yet!) +- PR which adds png file warn about the usage of vector drawables +- non draft PR should have a reviewer +- files containing translations are not modified by developers + +### Quality check + +After all the checks that generate checkstyle XML report, such as Ktlint, lint, or Detekt, Danger is run with this [dangerfile](../tools/danger/dangerfile-lint.js), in order to post comments to the PR with the detected error and warnings. + +To run locally, you will have to install the plugin `danger-plugin-lint-report` using: + +```shell +yarn add danger-plugin-lint-report --dev +``` + +## Setup + +This operation should not be necessary, since Danger is already setup for the project. + +To setup danger to the project, run: + +```shell +bundle exec danger init +``` + +## Run danger locally + +When modifying the [dangerfile](../tools/danger/dangerfile.js), you can check it by running Danger locally. + +To run danger locally, install it and run: + +```shell +bundle exec danger pr --dangerfile=./tools/danger/dangerfile.js +``` + +For instance: + +```shell +bundle exec danger pr https://github.com/element-hq/element-android/pull/6637 --dangerfile=./tools/danger/dangerfile.js +``` + +We may need to create a GitHub token to have less API rate limiting, and then set the env var: + +```shell +export DANGER_GITHUB_API_TOKEN='YOUR_TOKEN' +``` + +Swift and Kotlin (just in case) + +```shell +bundle exec danger-swift pr --dangerfile=./tools/danger/dangerfile.js +bundle exec danger-kotlin pr --dangerfile=./tools/danger/dangerfile.js +``` + +## Danger user + +To let Danger check all the PRs, including PRs form forks, a GitHub account have been created: +- login: ElementBot +- password: Stored on Passbolt +- GitHub token: A token with limited access has been created and added to the repository https://github.com/element-hq/element-x-android as secret DANGER_GITHUB_API_TOKEN. This token is not saved anywhere else. In case of problem, just delete it and create a new one, then update the secret. + +PRs from forks do not always have access to the secret `secrets.DANGER_GITHUB_API_TOKEN`, so `secrets.GITHUB_TOKEN` is also provided to the job environment. If `secrets.DANGER_GITHUB_API_TOKEN` is available, it will be used, so user `ElementBot` will comment the PR. Else `secrets.GITHUB_TOKEN` will be used, and bot `github-actions` will comment the PR. + +## Useful links + +- https://danger.systems/ +- https://danger.systems/js/ +- https://danger.systems/js/guides/getting_started.html +- https://danger.systems/js/reference.html +- https://github.com/danger/awesome-danger + +Some danger files to get inspired from + +- https://github.com/artsy/emission/blob/master/dangerfile.ts +- https://github.com/facebook/react-native/blob/master/bots/dangerfile.js +- https://github.com/apollographql/apollo-client/blob/master/config/dangerfile.ts +- https://github.com/styleguidist/react-styleguidist/blob/master/dangerfile.js +- https://github.com/storybooks/storybook/blob/master/dangerfile.js +- https://github.com/ReactiveX/rxjs/blob/master/dangerfile.js diff --git a/docs/debug_proxying.md b/docs/debug_proxying.md new file mode 100644 index 0000000..a28163c --- /dev/null +++ b/docs/debug_proxying.md @@ -0,0 +1,22 @@ +# Setup a debug mitm proxy to inspect all the app's network traffic + +1) Install mitmproxy: `brew install mitmproxy`. + 1) Launch `mitmweb` from a terminal. It will pop up mitmproxy's web interface in a web browser. +1) Configure Android Emulator. + 1) Launch your android emulator. + 1) Open its settings page and go to Settings -> Proxy (nb this tab isn't visible when running the emu inside the Android Studio window, you need to set it so it runs in its own window). + 1) Disable "Use Android Studio HTTP proxy settings" and pick "Manual proxy configuration". + 1) Set `127.0.0.1` as "Host name" and `8080` as "Port number". + 1) Click "Apply" and verify that "Proxy status" is "Success" and close the settings window. + Screenshot 2023-10-04 at 14 48 47 +1) Install the mitmproxy CA cert (this is needed to see traffic from java/kotlin code, it's not needed for traffic coming from native code e.g. the matrix-rust-sdk). + 1) Open the emulator Chrome browser app + 1) Go to the url `mitm.it` + 1) Follow the instructions to install the CA cert on Android devices. + Screenshot 2023-10-04 at 14 51 27 +1) Slightly modify the Element X app source code. + 1) Go to the `RustMatrixClientFactory.create()` method. + 1) Add `.disableSslVerification()` in the `ClientBuilder` method chain. +1) Build and run the Element X app. +1) Enjoy, you will see all the traffic in mitmproxy's web interface. + Screenshot 2023-10-04 at 14 50 03 diff --git a/docs/deeplink.md b/docs/deeplink.md new file mode 100644 index 0000000..1350b2f --- /dev/null +++ b/docs/deeplink.md @@ -0,0 +1,71 @@ +# Element X Android deeplink + + + +* [Introduction](#introduction) + * [Asset Links](#asset-links) + * [Supported links](#supported-links) +* [Developer tools](#developer-tools) + + + + +## Introduction + +Element X Android supports deep linking to specific screens in the application. This document explains how to use deep links in Element X Android. + +### Asset Links + +The asset links file is available at https://element.io/.well-known/assetlinks.json + +### Supported links + +Element Call link: +> https://call.element.io/Example + +Link to a user: +> https://app.element.io/#/user/@alice:matrix.org + +Link to a room by id or alias: +> https://app.element.io/#/room/!roomid:matrix.org +> https://app.element.io/#/room/#element-x-android:matrix.org + +Link to a room with a specific event: +> https://app.element.io/#/room/!roomid:matrix.org/$eventid + +Note that it will also work with other domain such as: +> https://mobile.element.io +> https://develop.element.io +> https://staging.element.io + +## Developer tools + +Using an Android 12 or higher emulator + +Ensure links verification is enabled +```bash +adb shell am compat enable 175408749 io.element.android.x.debug +``` + +Reset link verifications for the given package id +```bash +adb shell pm set-app-links --package io.element.android.x.debug 0 all +``` + +Force the package id links to be verified +```bash +adb shell pm verify-app-links --re-verify io.element.android.x.debug +``` + +Print the link verification of the package id +```bash +adb shell pm get-app-links io.element.android.x.debug +``` + +``` + io.element.android.x.debug: + ID: e2ece472-c266-4bf0-829c-be79959a6270 + Signatures: [B0:B0:51:DC:56:5C:81:2F:E1:7F:6F:3E:94:5B:4D:79:04:71:23:AB:0D:A6:12:86:76:9E:B2:94:91:97:13:0E] + Domain verification state: + *.element.io: 1024 +``` diff --git a/docs/design.md b/docs/design.md new file mode 100644 index 0000000..bdcaba1 --- /dev/null +++ b/docs/design.md @@ -0,0 +1,161 @@ +# Element Android design + + + +* [Introduction](#introduction) +* [How to import from Figma to the Element Android project](#how-to-import-from-figma-to-the-element-android-project) + * [Colors](#colors) + * [Text](#text) + * [Dimension, position and margin](#dimension-position-and-margin) + * [Icons](#icons) + * [Custom icons](#custom-icons) + * [Export drawable from Figma](#export-drawable-from-figma) + * [Import in Android Studio](#import-in-android-studio) + * [Images](#images) +* [Figma links](#figma-links) + * [Compound](#compound) + * [Login](#login) + * [Login v2](#login-v2) + * [Room list](#room-list) + * [Timeline](#timeline) + * [Voice message](#voice-message) + * [Room settings](#room-settings) + * [VoIP](#voip) + * [Presence](#presence) + * [Spaces](#spaces) + * [List to be continued...](#list-to-be-continued) + + + +**TODO This documentation is a bit outdated and must be updated when we will set up the design components.** + +## Introduction + +Design at element.io is done using Figma - https://www.figma.com +You will find guidance to build using interface on the [Compound documentation – Element's design system](https://compound.element.io) + +## How to import from Figma to the Element Android project + +Integration should be done using the Android development best practice, and should follow the existing convention in the code. + +### Colors + +Element Android already contains all the colors which can be used by the designer, in the module `ui-style`. +Some of them depend on the theme, so ensure to use theme attributes and not colors directly. + +A comprehensive [color definition documentation](https://compound.element.io/?path=/docs/tokens-color-palettes--docs) is available in Compound. + + +### Text + + - click on a text on Figma + - on the right panel, information about the style and colors are displayed + - in Element Android, text style are already defined, generally you should not create new style + - apply the style and the color to the layout + +### Dimension, position and margin + + - click on an item on Figma + - dimensions of the item will be displayed. + - move the mouse to other items to get relative positioning, margin, etc. + +### Icons + +Most icons should be available as part of the [Compound icon library](https://compound.element.io/?path=/docs/tokens-icons--docs) + +All drawable are auto-generated as part of the design tokens library. You can find +all assets in [`element-hq/compound-design-tokens#assets/android`](https://github.com/element-hq/compound-design-tokens/tree/main/assets/android) + +If you are missing an icon, follow to [contribution guidelines for icons](https://www.figma.com/file/gkNXqPoiJhEv2wt0EJpew4/Compound-Icons?type=design&node-id=178-3119&t=j2uSJD9xPXJn5aRM-0) + +#### Custom icons + +##### Export drawable from Figma + + - click on the element to export + - ensure that the correct layer is selected. Sometimes the parent layer has to be selected on the left panel + - on the right panel, click on "export" + - select SVG + - you can check the preview of what will be exported + - click on "export" and save the file locally + - unzip the file if necessary + +It's also possible for any icon to go to the main component by right-clicking on the icon. + +##### Import in Android Studio + + - right click on the drawable folder where the drawable will be created + - click on "New"/"Vector Asset" + - select the exported file + - update the filename if necessary + - click on "Next" and click on "Finish" + - open the created vector drawable + - optionally update the color(s) to "#FF0000" (red) to ensure that the drawable is correctly tinted at runtime. + +### Images + +Android 4.3 (18+) fully supports the WebP image format which can often provide smaller image sizes without drastically impacting image quality (depending on the output encoding quality). +When importing non vector images, WebP is the preferred format. + +Images can be converted to the WebP within Android Studio by + - right clicking the image file within the project file explorer + - select `Convert to WebP` + +https://developer.android.com/studio/write/convert-webp + +## Figma links + +Figma links can be included in the layout, for future reference, but it is also OK to add a paragraph below here, to centralize the information + +Main entry point: https://www.figma.com/files/project/5612863/Element?fuid=779371459522484071 + +Note: all the Figma links are not publicly available. + +### Compound + +Compound is Element's design system where you'll find styles and documentation +regarding user interfaces. + +- Documentation: [https://compound.element.io](https://compound.element.io) +- [Compound Android – Figma document](https://www.figma.com/file/G1xy0HDZKJf5TCRFmKb5d5/Compound-Android-Components) +- [Compound Styles - Figma document](https://www.figma.com/file/PpKepmHKGikp33Ql7iivbn/Compound-Styles?type=design) +- [Compound Icons - Figma document](https://www.figma.com/file/gkNXqPoiJhEv2wt0EJpew4/Compound-Icons) + +### Login + +TBD + +#### Login v2 + +https://www.figma.com/file/xdV4PuI3DlzA1EiBvbrggz/Login-Flow-v2 + +### Room list + +TBD + +### Timeline + +https://www.figma.com/file/x1HYYLYMmbYnhfoz2c2nGD/%5BRiotX%5D-Misc?node-id=0%3A1 + +### Voice message + +https://www.figma.com/file/uaWc62Ux2DkZC4OGtAGcNc/Voice-Messages?node-id=473%3A12 + +### Room settings + +TBD + +### VoIP + +https://www.figma.com/file/V6m2z0oAtUV1l8MdyIrAep/VoIP?node-id=4254%3A25767 + +### Presence + +https://www.figma.com/file/qmvEskET5JWva8jZJ4jX8o/Presence---User-Status?node-id=114%3A9174 +(Option B is chosen) + +### Spaces + +https://www.figma.com/file/m7L63aGPW7iHnIYStfdxCe/Spaces?node-id=192%3A30161 + +### List to be continued... diff --git a/docs/images-lfs/screen_1_dark.png b/docs/images-lfs/screen_1_dark.png new file mode 100644 index 0000000..8bdcd59 --- /dev/null +++ b/docs/images-lfs/screen_1_dark.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:4515f7589c422197a82672cdc3e64814ccca9a9a022b806facee44dd67d51ff2 +size 1116864 diff --git a/docs/images-lfs/screen_1_light.png b/docs/images-lfs/screen_1_light.png new file mode 100644 index 0000000..8eba38a --- /dev/null +++ b/docs/images-lfs/screen_1_light.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:2afb667a8b679f4395c28407b014f074e8b74745f6ecdd6ad699a6650cee2bc7 +size 771160 diff --git a/docs/images-lfs/screen_2_dark.png b/docs/images-lfs/screen_2_dark.png new file mode 100644 index 0000000..9a01029 --- /dev/null +++ b/docs/images-lfs/screen_2_dark.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:910f9ab58a197a16b1295cd6b65d406ebfff1298c9c128a326edf1ec834d7fa7 +size 332936 diff --git a/docs/images-lfs/screen_2_light.png b/docs/images-lfs/screen_2_light.png new file mode 100644 index 0000000..1dd3106 --- /dev/null +++ b/docs/images-lfs/screen_2_light.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:f7b80b9124c5c04c9db3824b68ab35883d41d05918abd415f7565f87d2713cfa +size 338455 diff --git a/docs/images-lfs/screen_3_dark.png b/docs/images-lfs/screen_3_dark.png new file mode 100644 index 0000000..ccc1733 --- /dev/null +++ b/docs/images-lfs/screen_3_dark.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:dadff79ae955ab1da5c0a0567960fc567526ad0d8d2ea418d8adacf3a7a400cc +size 243201 diff --git a/docs/images-lfs/screen_3_light.png b/docs/images-lfs/screen_3_light.png new file mode 100644 index 0000000..2116f1d --- /dev/null +++ b/docs/images-lfs/screen_3_light.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:e2f328b3e8bf2ebe4abc4c130e28f6fc2351f5ac339be0819e5fddb657f4a560 +size 246731 diff --git a/docs/images-lfs/screen_4_dark.png b/docs/images-lfs/screen_4_dark.png new file mode 100644 index 0000000..5bd122a --- /dev/null +++ b/docs/images-lfs/screen_4_dark.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:519fb54f0070833b2a4671e1f0fc7b2ec60930d69b592b8a760f52a73dc4fe38 +size 132247 diff --git a/docs/images-lfs/screen_4_light.png b/docs/images-lfs/screen_4_light.png new file mode 100644 index 0000000..ee82f3b --- /dev/null +++ b/docs/images-lfs/screen_4_light.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:f683a228d7168c75d6f42c353c1a0e169cb22cb8fa6696e9e3ffeb80854b2441 +size 131610 diff --git a/docs/images/module_graph.png b/docs/images/module_graph.png new file mode 100644 index 0000000000000000000000000000000000000000..3be025664628aa2bd4aea054918d944d7f557627 GIT binary patch literal 276632 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

    JQzKPI@~nPr9o?lr2`7M=9vow! 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

    j!g+nG5G_?zp*{zHK;XqADWiGZwsot% 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

    0_J7!V@3@}(_l^5gDIrQ$nH9;nqOw=p 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%0AjIoxngGQg7$#bs)X9TlQ0*D_Vvt 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 literal 0 HcmV?d00001 diff --git a/docs/install_from_github_release.md b/docs/install_from_github_release.md new file mode 100644 index 0000000..5be1c0c --- /dev/null +++ b/docs/install_from_github_release.md @@ -0,0 +1,94 @@ +# Installing Element X Android from a Github Release + +This document explains how to install Element X Android from a Github Release. + + + +* [Installing the universal APK](#installing-the-universal-apk) + * [Instructions](#instructions) + * [Steps](#steps) + * [I already have the application on my phone](#i-already-have-the-application-on-my-phone) +* [Installing from the App Bundle](#installing-from-the-app-bundle) + * [Requirements](#requirements) + * [Steps](#steps) + * [I already have the application on my phone](#i-already-have-the-application-on-my-phone) + + + +## Installing the universal APK + +### Instructions + +The easiest way to install the application from a GitHub release is to use the universal APK which is attached to the release. This APK is compatible with all Android devices, but it is not optimized for any of them. So it may not be as fast as it could be on your device, and it may not be as small as it could be. + +Alternatively, you can generate an APK that is optimized for your device. This is explained in the next section. + +### Steps + +- Open the GitHub release that you want to install from using the Web browser of your phone. +- Download the APK +- Open the APK file from the download notification, or from the file manager +- Follow the steps to install the application + +### I already have the application on my phone + +If the application was already installed on your phone, there are several cases: + +- it was installed from the PlayStore, you can install the universal APK as long as the version is more recent. The existing data should not be lost. +- it was installed from a previous GitHub release, this is like an application upgrade. +- it was installed from a more recent GitHub release, or from the PlayStore with a later version, you will have to uninstall it first. + +## Installing from the App Bundle + +### Requirements + +The Github release will contain an Android App Bundle (with `aab` extension) file, unlike in the Element Android project where releases directly provide the APKs. So there are some steps to perform to generate and sign App Bundle APKs. An APK suitable for the targeted device will then be generated. + +The easiest way to do that is to use the debug signature that is shared between the developers and stored in the Element X Android project. So we recommend to clone the project first, to be able to use the debug signature it contains. But note that you can use any other signature. You don't need to install Android Studio, you will only need a shell terminal. + +You can clone the project by running: +```bash +git clone git@github.com:element-hq/element-x-android.git +``` +or +```bash +git clone https://github.com/element-hq/element-x-android.git +``` + +You will also need to install [bundletool](https://developer.android.com/studio/command-line/bundletool). On MacOS, you can run the following command: + +```bash +brew install bundletool +``` + +### Steps + +1. Open the GitHub release that you want to install from https://github.com/element-hq/element-x-android/releases +2. Download the asset `app-release-signed.aab` +3. Navigate to the folder where you cloned the project and run the following command: +```bash +bundletool build-apks --bundle= --output=./tmp/elementx.apks \ + --ks=./app/signature/debug.keystore --ks-pass=pass:android --ks-key-alias=androiddebugkey --key-pass=pass:android \ + --overwrite +``` +For instance: +```bash +bundletool build-apks --bundle=./tmp/Element/0.1.5/app-release-signed.aab --output=./tmp/elementx.apks \ + --ks=./app/signature/debug.keystore --ks-pass=pass:android --ks-key-alias=androiddebugkey --key-pass=pass:android \ + --overwrite +``` +4. Run an Android emulator, or connect a real device to your computer +5. Install the APKs on the device: +```bash +bundletool install-apks --apks=./tmp/elementx.apks +``` + +That's it, the application should be installed on your device, you can start it from the launcher icon. + +### I already have the application on my phone + +If the application was already installed on your phone, there are several cases: + +- it was installed from the PlayStore, you will have to uninstall it first because the signature will not match. +- it was installed from a previous GitHub release, this is like an application upgrade, so no need to uninstall the existing app. +- it was installed from a more recent GitHub release, you will have to uninstall it first. diff --git a/docs/installing_from_ci.md b/docs/installing_from_ci.md new file mode 100644 index 0000000..634ee90 --- /dev/null +++ b/docs/installing_from_ci.md @@ -0,0 +1,49 @@ +## Installing from CI + + + + * [Installing from GitHub](#installing-from-github) + * [Create a GitHub token](#create-a-github-token) + * [Provide artifact URL](#provide-artifact-url) + * [Next steps](#next-steps) + * [Future improvement](#future-improvement) + + + +Installing APK build by the CI is possible + +### Installing from GitHub + +TODO Import the script from Element Android and make it work, then update this documentation. + +To install an APK built by a GitHub action, run the script `./tools/install/installFromGitHub.sh`. You will need to pass a GitHub token to do so. + +#### Create a GitHub token + +You can create a GitHub token going to your Github account, at this page: [https://github.com/settings/tokens](https://github.com/settings/tokens). + +You need to create a token (classic) with the scope `repo/public_repo`. So just check the corresponding checkbox. +Validity can be long since the scope of this token is limited. You will still be able to delete the token and generate a new one. +Click on Generate token and save the token locally. + +### Provide artifact URL + +The script will ask for an artifact URL. You can get this artifact URL by following these steps: + +- open the pull request +- in the check at the bottom, click on `APK Build / Build debug APKs` +- click on `Summary` +- scroll to the bottom of the page +- copy the link `vector-Fdroid-debug` if you want the F-Droid variant or `vector-Gplay-debug` if you want the Gplay variant. + +The copied link can be provided to the script. + +### Next steps + +The script will download the artifact, unzip it and install the correct version (regarding arch) on your device. + +Files will be added to the folder `./tmp/DebugApks`. Feel free to cleanup this folder from time to time, the script will not delete files. + +### Future improvement + +The script could ask the user for a Pull Request number and Gplay/Fdroid choice like it was done with Buildkite script. Using GitHub API may be possible to do that. diff --git a/docs/integration_tests.md b/docs/integration_tests.md new file mode 100644 index 0000000..dbd3ce2 --- /dev/null +++ b/docs/integration_tests.md @@ -0,0 +1,131 @@ +# Integration tests + + + +* [Pre requirements](#pre-requirements) +* [Install and run Synapse](#install-and-run-synapse) +* [Run the test](#run-the-test) +* [Stop Synapse](#stop-synapse) +* [Troubleshoot](#troubleshoot) + * [Android Emulator does cannot reach the homeserver](#android-emulator-does-cannot-reach-the-homeserver) + * [Tests partially run but some fail with "Unable to contact localhost:8080"](#tests-partially-run-but-some-fail-with-"unable-to-contact-localhost8080") + * [virtualenv command fails](#virtualenv-command-fails) + + + +Integration tests are useful to ensure that the code works well for any use cases. + +They can also be used as sample on how to use the Matrix SDK. + +In a ideal world, every API of the SDK should be covered by integration tests. For the moment, we have test mainly for the Crypto part, which is the tricky part. But it covers quite a lot of features: accounts creation, login to existing account, send encrypted messages, keys backup, verification, etc. + +The Matrix SDK is able to open multiple sessions, for the same user, of for different users. This way we can test communication between several sessions on a single device. + +## Pre requirements + +Integration tests need a homeserver running on localhost. + +The documentation describes what we do to have one, using [Synapse](https://github.com/matrix-org/synapse/), which is the Matrix reference homeserver. + +## Install and run Synapse + +Steps: + +- Install virtualenv + +```bash +python3 -m pip install virtualenv +``` + +- Clone Synapse repository + +```bash +git clone -b develop https://github.com/matrix-org/synapse.git +``` +or +```bash +git clone -b develop git@github.com:matrix-org/synapse.git +``` + +You should have the develop branch cloned by default. + +- Run synapse, from the Synapse folder you just cloned + +```bash +virtualenv -p python3 env +source env/bin/activate +pip install -e . +demo/start.sh --no-rate-limit + +``` + +Alternatively, to install the latest Synapse release package (and not a cloned branch) you can run the following instead of `git clone` and `pip install -e .`: + +```bash +pip install matrix-synapse +``` + +On your first run, you will want to stop the demo and edit the config to correct the `public_baseurl` to http://10.0.2.2:8080 and restart the server. + +You should now have 3 running federated Synapse instances 🎉, at http://127.0.0.1:8080/, http://127.0.0.1:8081/ and http://127.0.0.1:8082/, which should display a "It Works! Synapse is running" message. + +## Run the test + +It's recommended to run tests using an Android Emulator and not a real device. First reason for that is that the tests will use http://10.0.2.2:8080 to connect to Synapse, which run locally on your machine. + +You can run all the tests in the `androidTest` folders. + +It can be done using this command: + +```bash +./gradlew vector:connectedAndroidTest matrix-sdk-android:connectedAndroidTest +``` + +## Stop Synapse + +To stop Synapse, you can run the following commands: + +```bash +./demo/stop.sh +``` + +And you can deactivate the virtualenv: + +```bash +deactivate +``` + +## Troubleshoot + +You'll need python3 to be able to run synapse + +### Android Emulator does cannot reach the homeserver + +Try on the Emulator browser to open "http://10.0.2.2:8080". You should see the "Synapse is running" message. + +### Tests partially run but some fail with "Unable to contact localhost:8080" + +This is because the `public_baseurl` of synapse is not consistent with the endpoint that the tests are connecting to. + +Ensure you have the following configuration in `demo/etc/8080.config`. + +``` +public_baseurl: http://10.0.2.2:8080/ +``` + +After changing this you will need to restart synapse using `demo/stop.sh` and `demo/start.sh` to load the new configuration. + +### virtualenv command fails + +You can try using +```bash +python3 -m venv env +``` +or +```bash +python3 -m virtualenv env +``` +instead of +```bash +virtualenv -p python3 env +``` diff --git a/docs/maps.md b/docs/maps.md new file mode 100644 index 0000000..789d455 --- /dev/null +++ b/docs/maps.md @@ -0,0 +1,47 @@ +# Use of maps + + + +* [Overview](#overview) +* [Local development with MapTiler](#local-development-with-maptiler) +* [Making releasable builds with MapTiler](#making-releasable-builds-with-maptiler) +* [Using other map sources or MapTiler styles](#using-other-map-sources-or-maptiler-styles) + + + +## Overview + +Element Android uses [MapTiler](https://www.maptiler.com/) to provide map +imagery where required. MapTiler requires an API key, which we bake in to +the app at release time. + +## Local development with MapTiler + +If you're developing the application and want maps to render properly you can +sign up for the [MapTiler free tier](https://www.maptiler.com/cloud/pricing/). + +Place your API key in `local.properties` with the key +`services.maptiler.apikey`, e.g.: + +```properties +services.maptiler.apikey=abCd3fGhijK1mN0pQr5t +``` + +Optionally you can also place your custom MapTyler style ids for light and dark maps +in the `local.properties` with the keys `services.maptiler.lightMapId` and +`services.maptiler.darkMapId`. If you don't specify these, the default MapTiler "basic-v2" +styles will be used. + +## Making releasable builds with MapTiler + +To insert the MapTiler API key when building an APK, set the +`ELEMENT_ANDROID_MAPTILER_API_KEY` environment variable in your build +environment. +If you've added custom styles also set the `ELEMENT_ANDROID_MAPTILER_LIGHT_MAP_ID` +and `ELEMENT_ANDROID_MAPTILER_DARK_MAP_ID` environment variables accordingly. + +## Using other map sources or MapTiler styles + +If you wish to use an alternative map provider, you can provide your own implementations of +`TileServerStyleUriBuilder` and `StaticMapUrlBuilder` in +`features/location/api/src/main/kotlin/io/element/android/features/location/api/internal/`. diff --git a/docs/migration_to_metro.md b/docs/migration_to_metro.md new file mode 100644 index 0000000..23c5db9 --- /dev/null +++ b/docs/migration_to_metro.md @@ -0,0 +1,15 @@ +# Migration to Metro + +The dependency injection library is now [Metro](https://zacsweers.github.io/metro/latest/). It replaces both Dagger and Anvil. + +Migration of the current Element X code has been performed in https://github.com/element-hq/element-x-android/pull/5253. + +To migrate other existing code you will need to: + +- replace `setupAnvil()` with `setupDependencyInjection()` in your `build.gradle.kts` files +- replace the Dagger and Anvil imports with Metro ones +- move the `@Inject` apply to the constructor to the class itself (only applicable if there is only one primary constructor +- replace `@AssistedInject` with `@Inject` +- replace `@Module` with `@BindingContainer` + +This should help to migrate your existing code. diff --git a/docs/nightly_build.md b/docs/nightly_build.md new file mode 100644 index 0000000..3a3345d --- /dev/null +++ b/docs/nightly_build.md @@ -0,0 +1,48 @@ +# Nightly builds + + + +* [Configuration](#configuration) +* [How to register to get nightly build](#how-to-register-to-get-nightly-build) +* [Build nightly manually](#build-nightly-manually) + + + +## Configuration + +The nightly build will contain what's on develop, in release mode, for the main variant. It is signed using a dedicated signature, and has a dedicated appId (`io.element.android.x.nightly`), so it can be installed along with the production version of Element X Android. The only other difference compared to ElementX Android is a different app name. We do not want to change the app name since it will also affect some strings in the app, and we do want to do that. (TODO today, the app name is changed.) + +Nightly builds are built and released to Firebase every days, and automatically. + +This is recommended to exclusively use this app, with your main account, instead of Element X Android, and fallback to ElementX Android just in case of regression, to discover as soon as possible any regression, and report it to the team. To avoid double notification, you may want to disable the notification from the Element Android production version. Just open Element Android, navigate to `Settings/Notifications` and uncheck `Enable notifications for this session` (TODO Not supported yet). + +*Note:* Due to a limitation of Firebase, the nightly build is the universal build, which means that the size of the APK is a bit bigger, but this should not have any other side effect. + +## How to register to get nightly build + +Click on this link and follow the instruction: [https://appdistribution.firebase.dev/i/7de2dbc61e7fb2a6](https://appdistribution.firebase.dev/i/7de2dbc61e7fb2a6) + +## Build nightly manually + +Nightly build can be built manually from your computer. You will need to retrieved some secrets from Passbolt and add them to your file `~/.gradle/gradle.properties`: + +``` +signing.element.nightly.storePassword=VALUE_FROM_PASSBOLT +signing.element.nightly.keyId=VALUE_FROM_PASSBOLT +signing.element.nightly.keyPassword=VALUE_FROM_PASSBOLT +``` + +You will also need to add the environment variable `FIREBASE_TOKEN`: + +```sh +export FIREBASE_TOKEN=VALUE_FROM_PASSBOLT +``` + +Then you can run the following commands (which are also used in the file for [the GitHub action](../.github/workflows/nightly.yml)): + +```sh +git checkout develop +./gradlew assembleGplayNightly appDistributionUploadGplayNightly +``` + +Then you can reset the change on the codebase. diff --git a/docs/notifications.md b/docs/notifications.md new file mode 100644 index 0000000..5f67f88 --- /dev/null +++ b/docs/notifications.md @@ -0,0 +1,284 @@ +This document aims to describe how Element android displays notifications to the end user. It also clarifies notifications and background settings in the app. + +# Table of Contents + + + +* [Prerequisites Knowledge](#prerequisites-knowledge) + * [How does a matrix client get a message from a homeserver?](#how-does-a-matrix-client-get-a-message-from-a-homeserver?) + * [How does a mobile app receives push notification](#how-does-a-mobile-app-receives-push-notification) + * [Push VS Notification](#push-vs-notification) + * [Push in the matrix federated world](#push-in-the-matrix-federated-world) + * [How does the homeserver know when to notify a client?](#how-does-the-homeserver-know-when-to-notify-a-client?) + * [Push vs privacy, and mitigation](#push-vs-privacy-and-mitigation) + * [Background processing limitations](#background-processing-limitations) +* [Element Notification implementations](#element-notification-implementations) + * [Requirements](#requirements) + * [Foreground sync mode (Gplay and F-Droid)](#foreground-sync-mode-gplay-and-f-droid) + * [Push (FCM) received in background](#push-fcm-received-in-background) + * [FCM Fallback mode](#fcm-fallback-mode) + * [F-Droid background Mode](#f-droid-background-mode) +* [Application Settings](#application-settings) + + + + +First let's start with some prerequisite knowledge + +## Prerequisites Knowledge + +### How does a matrix client get a message from a homeserver? + +In order to get messages from a homeserver, a matrix client need to perform a ``sync`` operation. + +`To read events, the intended flow of operation is for clients to first call the /sync API without a since parameter. This returns the most recent message events for each room, as well as the state of the room at the start of the returned timeline. ` + +The client need to call the `sync` API periodically in order to get incremental updates of the server state (new messages). +This mechanism is known as **HTTP long Polling**. + +Using the **HTTP Long Polling** mechanism a client polls a server requesting new information. +The server *holds the request open until new data is available*. +Once available, the server responds and sends the new information. +When the client receives the new information, it immediately sends another request, and the operation is repeated. +This effectively emulates a server push feature. + +The HTTP long Polling can be fine tuned in the **SDK** using two parameters: +* timeout (Sync request timeout) +* delay (Delay between each sync) + +**timeout** is a server parameter, defined by: +``` +The maximum time to wait, in milliseconds, before returning this request.` +If no events (or other data) become available before this time elapses, the server will return a response with empty fields. +By default, this is 0, so the server will return immediately even if the response is empty. +``` + +**delay** is a client preference. When the server responds to a sync request, the client waits for `delay`before calling a new sync. + +When the Element Android app is open (i.e in foreground state), the default timeout is 30 seconds, and delay is 0. + +### How does a mobile app receives push notification + +Push notification is used as a way to wake up a mobile application when some important information is available and should be processed. + +Typically in order to get push notification, an application relies on a **Push Notification Service** or **Push Provider**. + +For example iOS uses APNS (Apple Push Notification Service). +Most of android devices relies on Google's Firebase Cloud Messaging (FCM). + > FCM has replaced Google Cloud Messaging (GCM - deprecated April 10 2018) + +FCM will only work on android devices that have Google plays services installed +(In simple terms, Google Play Services is a background service that runs on Android, which in turn helps in integrating Google’s advanced functionalities to other applications) + +De-Googlified devices need to rely on something else in order to stay up to date with a server. +There some cases when devices with google services cannot use FCM (network infrastructure limitations -firewalls-, + privacy and or independence requirement, source code licence) + +### Push VS Notification + +This need some disambiguation, because it is the source of common confusion: + + +*The fact that you see a notification on your screen does not mean that you have successfully configured your PUSH platform.* + + Technically there is a difference between a push and a notification. A notification is what you see on screen and/or in the notification Menu/Drawer (in the top bar of the phone). + + Notifications are not always triggered by a push (One can display a notification locally triggered by an alarm) + + +### Push in the matrix federated world + +In order to send a push to a mobile, App developers need to have a server that will use the FCM APIs, and these APIs requires authentication! +This server is called a **Push Gateway** in the matrix world + +That means that Element Android, a matrix client created by New Vector, is using a **Push Gateway** with the needed credentials (FCM API secret Key) in order to send push to the New Vector client. + +If you create your own matrix client, you will also need to deploy an instance of a **Push Gateway** with the credentials needed to use FCM for your app. + +On registration, a matrix client must tell its homeserver what Push Gateway to use. + +See [Sygnal](https://github.com/matrix-org/sygnal/) for a reference implementation. +``` + + +--------------------+ +-------------------+ + Matrix HTTP | | | | + Notification Protocol | App Developer | | Device Vendor | + | | | | + +-------------------+ | +----------------+ | | +---------------+ | + | | | | | | | | | | + | Matrix homeserver +-----> Push Gateway +------> Push Provider | | + | | | | | | | | | | + +-^-----------------+ | +----------------+ | | +----+----------+ | + | | | | | | + Matrix | | | | | | +Client/Server API + | | | | | + | | +--------------------+ +-------------------+ + | +--+-+ | + | | <-------------------------------------------+ + +---+ | + | | Provider Push Protocol + +----+ + + Mobile Device or Client +``` + +Recommended reading: +* https://thomask.sdf.org/blog/2016/12/11/riots-magical-push-notifications-in-ios.html +* https://matrix.org/docs/spec/client_server/r0.4.0.html#id128 + + +### How does the homeserver know when to notify a client? + +This is defined by [**push rules**](https://matrix.org/docs/spec/client_server/r0.4.0.html#push-rules-). + +`A push rule is a single rule that states under what conditions an event should be passed onto a push gateway and how the notification should be presented (sound / importance).` + +A homeserver can be configured with default rules (for Direct messages, group messages, mentions, etc.. ). + +There are different kind of push rules, it can be per room (each new message on this room should be notified), it can also define a pattern that a message should match (when you are mentioned, or key word based). + +Notifications have 2 'levels' (`highlighted = true/false sound = default/custom`). In Element these notifications level are reflected as Noisy/Silent. + +**What about encrypted messages?** + +Of course, content patterns matching cannot be used for encrypted messages server side (as the content is encrypted). + +That is why clients are able to **process the push rules client side** to decide what kind of notification should be presented for a given event. + +### Push vs privacy, and mitigation + +As seen previously, App developers don't directly send a push to the end user's device, they use a Push Provider as intermediary. So technically this intermediary is able to read the content of what is sent. + +App developers usually mitigate this by sending a `silent notification`, that is a notification with no identifiable data, or with an encrypted payload. When the push is received the app can then synchronise to its server in order to generate a local notification. + + +### Background processing limitations + +A mobile applications process live in a managed word, meaning that its process can be limited (e.g no network access), stopped or killed at almost anytime by the Operating System. + +In order to improve the battery life of their devices some constructors started to implement mechanism to drastically limit background execution of applications (e.g MIUI/Xiaomi restrictions, Sony stamina mode). +Then starting android M, android has also put more focus on improving device performances, introducing several IDLE modes, App-Standby, Light Doze, Doze. + +In a nutshell, apps can't do much in background now. + +If the devices is not plugged and stays IDLE for a certain amount of time, radio (mobile connectivity) and CPU can/will be turned off. + +For an application like Element, where users can receive important information at anytime, the best option is to rely on a push system (Google's Firebase Message a.k.a FCM). FCM high priority push can wake up the device and whitelist an application to perform background task (for a limited but unspecified amount of time). + +Notice that this is still evolving, and in future versions application that has been 'background restricted' by users won't be able to wake up even when a high priority push is received. Also high priority notifications could be rate limited (not defined anywhere) + +It's getting a lot more complicated when you cannot rely on FCM (because: closed sources, network/firewall restrictions, privacy concerns). +The documentation on this subject is vague, and as per our experiments not always exact, also device's behaviour is fragmented. + +It is getting more and more complex to have reliable notifications when FCM is not used. + +## Element Notification implementations + +### Requirements + +Element Android must work with and without FCM. +* The Element android app published on F-Droid do not rely on FCM (all related dependencies are not present) +* The Element android app published on google play rely on FCM, with a fallback mode when FCM registration has failed (e.g outdated or missing Google Play Services) + +### Foreground sync mode (Gplay and F-Droid) + +When in foreground, Element performs sync continuously with a timeout value set to 10 seconds (see HttpPooling). + +As this mode does not need to live beyond the scope of the application, and as per Google recommendation, Element uses the internal app resources (Thread and Timers) to perform the syncs. + +This mode is turned on when the app enters foreground, and off when enters background. + +In background, and depending on whether push is available or not, Element will use different methods to perform the syncs (Workers / Alarms / Service) + +### Push (FCM) received in background + +In order to enable Push, Element must first get a push token from the firebase SDK, then register a pusher with this token on the homeserver. + +When a message should be notified to a user, the user's homeserver notifies the registered `push gateway` for Element, that is [sygnal](https://github.com/matrix-org/sygnal) _- The reference implementation for push gateways -_ hosted by matrix.org. + +This sygnal instance is configured with the required FCM API authentication token, and will then use the FCM API in order to notify the user's device running Element. + +``` +Homeserver ----> Sygnal (configured for Element) ----> FCM ----> Element +``` + +The push gateway is configured to only send `(eventId,roomId)` in the push payload (for better [privacy](#push-vs-privacy-and-mitigation)). + +Element needs then to synchronise with the user's homeserver, in order to resolve the event and create a notification. + +As per [Google recommendation](https://android-developers.googleblog.com/2018/09/notifying-your-users-with-fcm.html), Element will then use the WorkManager API in order to trigger a background sync. + +**Google recommendations:** +> We recommend using FCM messages in combination with the WorkManager 1 or JobScheduler API + +> Avoid background services. One common pitfall is using a background service to fetch data in the FCM message handler, since background service will be stopped by the system per recent changes to Google Play Policy + +``` +Homeserver ----> Sygnal ----> FCM ----> Element + (Sync) ----> Homeserver + <---- + Display notification +``` + +**Possible outcomes** + +Upon reception of the FCM push, Element will perform a sync call to the homeserver, during this process it is possible that: + * Happy path, the sync is performed, the message resolved and displayed in the notification drawer + * The notified message is not in the sync. Can happen if a lot of things did happen since the push (`gappy sync`) + * The sync generates additional notifications (e.g an encrypted message where the user is mentioned detected locally) + * The sync takes too long and the process is killed before completion, or network is not reliable and the sync fails. + +Element implements several strategies in these cases (TODO document) + +### FCM Fallback mode + +It is possible that Element is not able to get a FCM push token. +Common errors (among several others) that can cause that: +* Google Play Services is outdated +* Google Play Service fails in someways with FCM servers (infamous `SERVICE_NOT_AVAILABLE`) + +If Element is able to detect one of this cases, it will notifies it to the users and when possible help him fix it via a dedicated troubleshoot screen. + +Meanwhile, in order to offer a minimal service, and as per Google's recommendation for background activities, Element will launch periodic background sync in order to stays in sync with servers. + +The fallback mode is impacted by all the battery life saving mechanism implemented by android. Meaning that if the app is not used for a certain amount of time (`App-Standby`), or the device stays still and unplugged (`Light Doze`) , the sync will become less frequent. + +And if the device stays unplugged and still for too long (`Doze Mode`), no background sync will be perform at all (the system's `Ignore Battery Optimization option` has no effect on that). + + Also the time interval between sync is elastic, controlled by the system to group other apps background sync request and start radio/cpu only once for all. + +Usually in this mode, what happen is when you take back your phone in your hand, you suddenly receive notifications. + +The fallback mode is supposed to be a temporary state waiting for the user to fix issues for FCM, or for App Developers that has done a fork to correctly configure their FCM settings. + +### F-Droid background Mode + +The F-Droid Element flavor has no dependencies to FCM, therefore cannot relies on Push. + +Also Google's recommended background processing method cannot be applied. This is because all of these methods are affected by IDLE modes, and will result on the user not being notified at all when the app is in a Doze mode (only in maintenance windows that could happens only after hours). + +Only solution left is to use `AlarmManager`, that offers new API to allow launching some process even if the App is in IDLE modes. + +Notice that these alarms, due to their potential impact on battery life, can still be restricted by the system. Documentation says that they will not be triggered more than every minutes under normal system operation, and when in low power mode about every 15 mn. + +These restrictions can be relaxed by requiring the app to be white listed from battery optimization. + +F-Droid version will schedule alarms that will then trigger a Broadcast Receiver, that in turn will launch a Service (in the classic android way), and the reschedule an alarm for next time. + +Depending on the system status (or device make), it is still possible that the app is not given enough time to launch the service, or that the radio is still turned off thus preventing the sync to success (that's why Alarms are not recommended for network related tasks). + +That is why on Element F-Droid, the broadcast receiver will acquire a temporary WAKE_LOCK for several seconds (thus securing cpu/network), and launch the service in foreground. The service performs the sync. + +Note that foreground services require to put a notification informing the user that the app is doing something even if not launched). + +## Application Settings + +**Notifications > Enable notifications for this account** + +Configure Sygnal to send or not notifications to all user devices. + +**Notifications > Enable notifications for this device** + +Disable notifications locally. The push server will continue to send notifications to the device but this one will ignore them. + + diff --git a/docs/oidc.md b/docs/oidc.md new file mode 100644 index 0000000..23709b6 --- /dev/null +++ b/docs/oidc.md @@ -0,0 +1,51 @@ +This file contains some rough notes about Oidc implementation, with some examples of actual data. + +[ios implementation](https://github.com/element-hq/element-x-ios/compare/develop...doug/oidc-temp) + +Rust sdk branch: https://github.com/matrix-org/matrix-rust-sdk/tree/oidc-ffi + +Figma https://www.figma.com/file/o9p34zmiuEpZRyvZXJZAYL/FTUE?node-id=133-5426&t=yQXKeANatk6keoZF-0 + +Server list: https://github.com/element-hq/oidc-playground + +Metadata iOS: (from https://github.com/element-hq/element-x-ios/blob/5f9d07377cebc4f21d9668b1a25f6e3bb22f64a1/ElementX/Sources/Services/Authentication/AuthenticationServiceProxy.swift#L28) + +clientName: InfoPlistReader.main.bundleDisplayName, +redirectUri: "io.element.android:/", +clientUri: "https://element.io", +tosUri: "https://element.io/user-terms-of-service", +policyUri: "https://element.io/privacy" + + +Android: +clientName = "Element", +redirectUri = "io.element.android:/", +clientUri = "https://element.io", +tosUri = "https://element.io/user-terms-of-service", +policyUri = "https://element.io/privacy" + + +Example of OidcData (from presentUrl callback): +url: https://auth-oidc.lab.element.dev/authorize?response_type=code&client_id=01GYCAGG3PA70CJ97ZVP0WFJY3&redirect_uri=io.element%3A%2Fcallback&scope=openid+urn%3Amatrix%3Aorg.matrix.msc2967.client%3Aapi%3A*+urn%3Amatrix%3Aorg.matrix.msc2967.client%3Adevice%3AYAgcPW4mcG&state=ex6mNJVFZ5jn9wL8&nonce=NZ93DOyIGQd9exPQ&code_challenge_method=S256&code_challenge=FFRcPALNSPCh-ZgpyTRFu_h8NZJVncfvihbfT9CyX8U&prompt=consent + +Formatted url: +https://auth-oidc.lab.element.dev/authorize? + response_type=code& + client_id=01GYCAGG3PA70CJ97ZVP0WFJY3& + redirect_uri=io.element%3A%2Fcallback& + scope=openid+urn%3Amatrix%3Aorg.matrix.msc2967.client%3Aapi%3A*+urn%3Amatrix%3Aorg.matrix.msc2967.client%3Adevice%3AYAgcPW4mcG& + state=ex6mNJVFZ5jn9wL8& + nonce=NZ93DOyIGQd9exPQ& + code_challenge_method=S256& + code_challenge=FFRcPALNSPCh-ZgpyTRFu_h8NZJVncfvihbfT9CyX8U& + prompt=consent + +state: ex6mNJVFZ5jn9wL8 + + +Oidc client example: https://github.com/matrix-org/matrix-rust-sdk/blob/39ad8a46801fb4317a777ebf895822b3675b709c/examples/oidc_cli/src/main.rs +Oidc sdk doc: https://github.com/matrix-org/matrix-rust-sdk/blob/39ad8a46801fb4317a777ebf895822b3675b709c/crates/matrix-sdk/src/oidc.rs + + +Test server: +synapse-oidc.lab.element.dev diff --git a/docs/pull_request.md b/docs/pull_request.md new file mode 100644 index 0000000..97314b2 --- /dev/null +++ b/docs/pull_request.md @@ -0,0 +1,290 @@ +# Pull requests + + + +* [Introduction](#introduction) +* [Who should read this document?](#who-should-read-this-document?) +* [Submitting PR](#submitting-pr) + * [Who can submit pull requests?](#who-can-submit-pull-requests?) + * [Humans](#humans) + * [Draft PR?](#draft-pr?) + * [Base branch](#base-branch) + * [PR Review Assignment](#pr-review-assignment) + * [PR review time](#pr-review-time) + * [Re-request PR review](#re-request-pr-review) + * [When create split PR?](#when-create-split-pr?) + * [Avoid fixing other unrelated issue in a big PR](#avoid-fixing-other-unrelated-issue-in-a-big-pr) + * [Bots](#bots) + * [Renovate](#renovate) + * [Gradle wrapper](#gradle-wrapper) + * [Sync analytics plan](#sync-analytics-plan) +* [Reviewing PR](#reviewing-pr) + * [Who can review pull requests?](#who-can-review-pull-requests?) + * [What to have in mind when reviewing a PR](#what-to-have-in-mind-when-reviewing-a-pr) + * [Rules](#rules) + * [Check the form](#check-the-form) + * [PR title](#pr-title) + * [PR description](#pr-description) + * [File change](#file-change) + * [Check the commit](#check-the-commit) + * [Check the substance](#check-the-substance) + * [Make a dedicated meeting to review the PR](#make-a-dedicated-meeting-to-review-the-pr) + * [What happen to the issue(s)?](#what-happen-to-the-issues?) + * [Merge conflict](#merge-conflict) + * [When and who can merge PR](#when-and-who-can-merge-pr) + * [Merge type](#merge-type) + * [Resolve conversation](#resolve-conversation) +* [Responsibility](#responsibility) + + + +## Introduction + +This document gives some clue about how to efficiently manage Pull Requests (PR). This document is a first draft and may be improved later. + +## Who should read this document? + +Every pull request reviewers, but also probably every ones who submit PRs. + +## Submitting PR + +### Who can submit pull requests? + +Basically every one who wants to contribute to the project! But there are some rules to follow. + +#### Humans + +People with write access to the project can directly clone the project, push their branches and create PR. + +External contributors must first fork the project and create PR to the mainline from there. + +##### Draft PR? + +Draft PR can be created when the submitter does not expect the PR to be reviewed and merged yet. It can be useful to publicly show the work, or to do a self-review first. + +Draft PR can also be created when it depends on other un-merged PR. + +In any case, it is better to explicitly declare in the description why the PR is a draft PR. + +Also, draft PR should not stay indefinitely in this state. It may be removed if it is the case and the submitter does not update it after a few days. + +##### Base branch + +The `develop` branch is generally the base branch for every PRs. + +Exceptions can occur: + +- if a feature implementation is split into multiple PRs. We can have a chain of PRs in this case. PR can be merged one by one on develop, and GitHub change the target branch to `develop` for the next PR automatically. +- we want to merge a PR from the community, but there is still work to do, and the PR is not updated by the submitter. First, we can kindly ask the submitter if they will update their PR, by commenting it. If there is no answer after a few days (including a week-end), we can create a new branch, push it, and change the target branch of the PR to this new branch. The PR can then be merged, and we can add more commits to fix the issues. After that a new PR can be created with `develop` as a target branch. + +**Important notice 1:** Releases are created from the `develop` branch. So `develop` branch should always contain a "releasable" source code. So when a feature is being implemented with several PRs, it has to be disabled by default (using a feature flag for instance), until the feature is fully implemented. A last PR to enable the feature can then be created. + +**Important notice 2:** Database migration: some developers and some people from the community are using the nightly build from `develop`. Multiple database migrations should be properly handled for them. It is OK to have multiple migrations between 2 releases, It is not OK to add steps to existing database migrations on `develop`. So for instance `develop` users will migrate from version 11 to version 12, then 13, then 14, and `main` users will do all those steps after they get the app upgrade. + +##### PR Review Assignment + +We use automatic assignment for PR reviews. **A PR is automatically routed by GitHub to one team member** using the round robin algorithm. Additional reviewers can be used for complex changes or when the first reviewer is not confident enough on the changes. +The process is the following: + +- The PR creator selects the [element-x-android-reviewers](https://github.com/orgs/element-hq/teams/element-x-android-reviewers) team as a reviewer. +- GitHub automatically assign the reviewer. If the reviewer is not available (holiday, etc.), remove them and set again the team, GitHub will select another reviewer. +- Alternatively, the PR creator can directly assign specific people if they have another Android developer in their team or they think a specific reviewer should take a look at their PR. +- Reviewers get a notification to make the review: they review the code following the good practice (see the rest of this document). +- After making their own review, if they feel not confident enough, they can ask another person for a full review, or they can tag someone within a PR comment to check specific lines. + +For PRs coming from the community, the issue wrangler can assign either the team [element-x-android-reviewers](https://github.com/orgs/element-hq/teams/element-x-android-reviewers) or any member directly. + +##### PR review time + +As a PR submitter, you deserve a quick review. As a reviewer, you should do your best to unblock others. + +Some tips to achieve it: + +- Set up your GH notifications correctly +- Check your pulls page: [https://github.com/pulls](https://github.com/pulls) +- Check your pending assigned PRs before starting or resuming your day to day tasks +- If you are busy with high priority tasks, inform the author. They will find another developer + +It is hard to define a deadline for a review. It depends on the PR size and the complexity. Let's start with a goal of 24h (working day!) for a PR smaller than 500 lines. If bigger, the submitter and the reviewer should discuss. + +After this time, the submitter can ping the reviewer to get a status of the review. + +##### Re-request PR review + +Once all the remarks have been handled, it's possible to re-request a review from the (same) reviewer to let them know that the PR has been updated the PR is ready to be reviewed again. Use the double arrow next to the reviewer name to do that. + +##### When create split PR? + +To implement big new feature, it may be efficient to split the work into several smaller and scoped PRs. They will be easier to review, and they can be merged on `develop` faster. + +Big PR can take time, and there is a risk of future merge conflict. + +Feature flag can be used to avoid half implemented feature to be available in the application. + +That said, splitting into several PRs should not have the side effect to have more review to do, for instance if some code is added, then finally removed. + +##### Avoid fixing other unrelated issue in a big PR + +Each PR should focus on a single task. If other issues may be fixed when working in the area of it, it's preferable to open a dedicated PR. + +It will have the advantage to be reviewed and merged faster, and not interfere with the main PR. + +It's also applicable for code rework (such as renaming for instance), or code formatting. Sometimes, it is more efficient to extract that work to a dedicated PR, and rebase your branch once this "rework" PR has been merged. + +#### Bots + +Some bots can create PR, but they still have to be reviewed by the team + +##### Renovate + +Renovate is a tool which maintain all our external dependencies up to date. A dedicated PR is created for each new available release for one of our external dependencies. + +To review such PR, you have to + - **IMPORTANT** check the diff files (as always). + - Check the release note. Some existing bugs in Element project may be fixed by the upgrade + - Make sure that the CI is happy + - If the code does not compile (API break for instance), you have to checkout the branch and push new commits + - Do some smoke test, depending of the library which has been upgraded + +For some reasons (like for instance a change in package declaration) the tool sometimes does not upgrade some dependencies. In this case, and when detected, the upgrade has to be done manually. + +##### Gradle wrapper + +`Update Gradle Wrapper` is a tool which can create PR to upgrade our gradle.properties file. +Review such PR is the same recipe than for PR from Dependabot + +##### Sync analytics plan + +This tools imports any update in the analytics plan. See instruction in the PR itself to handle it. +More info can be found in the file [analytics.md](./analytics.md) + +## Reviewing PR + +### Who can review pull requests? + +As an open source project, every one can review each others PR. Of course an approval from internal developer is mandatory for a PR to be merged. +But comment in PR from the community are always appreciated! + +### What to have in mind when reviewing a PR + +1. User experience: is the UX and UI correct? You will probably be the second person to test the new thing, the first one is the developer. +2. Developer experience: does the code look nice and decoupled? No big functions, new classes added to the right module, etc. +3. Code maintenance. A bit similar to point 2. Tricky code must be documented for instance +4. Fork consideration. Will configuration of forks be easy? Some documentation may help in some cases. +5. We are building long term products. "Quick and dirty" code must be avoided. +6. The PR includes new tests for the added code, updated test for the existing code +7. All commit authors must have signed the CLA. Please open https://cla-assistant.io/element-hq/element-x-android to agree to the CLA. + +### Rules + +#### Check the form + +##### PR title + +PR title should describe in one line what's brought by the PR. Reviewer can edit the title if it's not clear enough, or to add suffix like `[BLOCKED]` or similar. Fixing typo is also a good practice, since GitHub search is quite not efficient, so the words must be spelled without any issue. Adding suffix will help when viewing the PR list. + +It's free form, but prefix tags could also be used to help understand what's in the PR. + +Examples of prefixes: +- `[Refacto]` +- `[Feature]` +- `[Bugfix]` +- etc. + +Also, it's still possible to add labels to the PRs, such as `A-` or `T-` labels, even if this is not a strong requirement. We prefer to spend time to add labels on issues. + +##### PR description + +PR description should follow the PR template, and at least provide some context about the code change. + +##### File change + +1. Code should follow the guidelines +2. Code should be formatted correctly +3. XML attribute must be sorted +4. New code is added at the correct location +5. New classes are added to the correct location +6. Naming is correct. Naming is really important, it's considered part of the documentation +7. Architecture is followed. For instance, the logic is in the ViewModel and not in the Fragment +8. There is at least one file for the changelog. Exception if the PR fixes something which has not been released yet. Changelog content should target their audience: `.sdk` extension are mainly targeted for developers, other extensions are targeted for users and forks maintainers. It should generally describe visual change rather than give technical details. More details can be found [here](../CONTRIBUTING.md#changelog). +9. PR includes tests. allScreensTest when applicable, and unit tests +10. Avoid over complicating things. Keep it simple (KISS)! +11. PR contains only the expected change. Sometimes, the diff is showing changes that are already on `develop`. This is not good, submitter has to fix that up. + +##### Check the commit + +Commit message must be short, one line and valuable. "WIP" is not a good commit message. Commit message can contain issue number, starting with `#`. GitHub will add some link between the issue and such commit, which can be useful. It's possible to change a commit message at any time (may require a force push). + +Commit messages can contain extra lines with more details, links, etc. But keep in mind that those lines are quite less visible than the first line. + +Also commit history should be nice. Having commits like "Adding temporary code" then later "Removing temporary code" is not good. The branch has to be rebased and those commit have to be dropped. + +PR merger could decide to squash and merge if commit history is not good. + +Commit like "Code review fixes" is good when reviewing the PR, since new changes can be reviewed easily, but is less valuable when looking at git history. To avoid this, PR submitter should always push new commits after a review (no commit amend with force push), and when the PR is approved decide to interactive rebase the PR to improve the git history and reduce noise. + +##### Check the substance + +1. Test the changes! +2. Test the nominal case and the edge cases +3. Run the sanity test for critical PR + +##### Make a dedicated meeting to review the PR + +Sometimes a big PR can be hard to review. Setting up a call with the PR submitter can speed up the communication, rather than putting comments and questions in GitHub comments. It has the inconvenience of making the discussion non-public, consider including a summary of the main points of the "offline" conversation in the PR. + +### What happen to the issue(s)? + +The issue(s) should be referenced in the PR description using keywords like `Closes` of `Fixes` followed by the issue number. + +Example: +> Closes #1 + +Note that you have to repeat the keyword in case of a list of issue + +> Closes #1, Closes #2, etc. + +When PR will be merged, such referenced issue will be automatically closed. +It is up to the person who has merged the PR to go to the (closed) issue(s) and to add a comment to inform in which version the issue fix will be available. Use the current version of `develop` branch. + +> Closed in Element Android v1.x.y + +### Merge conflict + +It's up to the submitter to handle merge conflict. Sometimes, they can be fixed directly from GitHub, sometimes this is not possible. The branch can be rebased on `develop`, or the `develop` branch can be merged on the branch, it's up to the submitter to decide what is best. +Keep in mind that Github Actions are not run in case of conflict. + +### When and who can merge PR + +PR can be merged by the submitter, if and only if at least one approval from another developer is done. Approval from all people added as reviewer is also a good thing to have. Approval from design team may be mandatory, but is not sufficient to merge a PR. + +PR can also be merged by the reviewer, to reduce the time the PR is open. But only if the PR is not in draft and the change are quite small, or behind a feature flag. + +Dangerous PR should not be merged just before a release. Dangerous PR are PR that could break the app. Update of Realm library, rework in the chunk of Events management in the SDK, etc. + +We prefer to merge such PR after a release so that it can be tested during several days by the team before behind included in a release candidate. + +PR from bots will always be merged by the reviewer, right after approving the changes, or in case of critical changes, right after a release. + +#### Merge type + +Generally we use "Create a merge commit", which has the advantage to keep the branch visible. + +If git history is noisy (code added, then removed, etc.), it's possible to use "Squash and merge". But the branch will not be visible anymore, a commit will be added on top of develop. Git commit message can (and probably must) be edited from the GitHub web app. It's better if the submitter do the work to cleanup the git history by using a git interactive rebase of their branch. + +### Resolve conversation + +Generally we do not close conversation added during PR review and update by clicking on "Resolve conversation" +If the submitter or the reviewer do so, it will more difficult for further readers to see again the content. They will have to open the conversation to see it again. it's a waste of time. + +When remarks are handled, a small comment like "done" is enough, commit hash can also be added to the conversation. + +Exception: for big PRs with lots of conversations, using "Resolve conversation" may help to see the remaining remarks. + +Also "Resolve conversation" should probably be hit by the creator of the conversation. + +## Responsibility + +PR submitter is responsible of the incoming change. PR reviewers who approved the PR take a part of responsibility on the code which will land to develop, and then be used by our users, and the user of our forks. + +That said, bug may still be merged on `develop`, this is still acceptable of course. In this case, please make sure an issue is created and correctly labelled. Ideally, such issues should be fixed before the next release candidate, i.e. with a higher priority. But as we release the application every 10 working days, it can be hard to fix every bugs. That's why PR should be fully tested and reviewed before being merge and we should never comment code review remark with "will be handled later", or similar comments. diff --git a/docs/screenshot_testing.md b/docs/screenshot_testing.md new file mode 100644 index 0000000..044b136 --- /dev/null +++ b/docs/screenshot_testing.md @@ -0,0 +1,67 @@ +# Screenshot testing + + + +* [Overview](#overview) +* [Setup](#setup) +* [Recording](#recording) +* [Verifying](#verifying) +* [Contributing](#contributing) + + + +## Overview + +- Screenshot tests are tests which record the content of a rendered screen and verify subsequent runs to check if the screen renders differently. +- Element X uses [Paparazzi](https://github.com/cashapp/paparazzi) to render, record and verify Composables. All internal/public Composable Preview will be used for screenshot tests, thanks to the usage of [ComposablePreviewScanner](https://github.com/sergio-sastre/ComposablePreviewScanner). +- The screenshot verification occurs on every pull request as part of the `tests.yml` workflow. + +## Setup + +- Install Git LFS through your package manager of choice (`brew install git-lfs` | `yay -S git-lfs`). +- Install the Git LFS hooks into the project. + +```shell +# with element-android as the current working directory +git lfs install --local +``` + +If installed correctly, `git push` and `git pull` will now include LFS content. + +## Recording + +Recording of screenshots is done by triggering the GitHub action [Record screenshots](https://github.com/element-hq/element-x-android/actions/workflows/recordScreenshots.yml), to avoid differences of generated binary files (png images) depending on developers' environment. + +So basically, you will create a branch, do some commits with your work on it, then push your branch, trigger the GitHub action to record the screenshots (only if you think preview may have changed), and finally create a pull request. The GitHub action will record the screenshots and commit the changes to the branch. + +You can still record the screenshots locally, but please do not commit the changes. + +To record the screenshot locally, run the following command: + +```shell +./gradlew recordPaparazziDebug +``` + +The task will delete the content of the folder `/snapshots` before recording (see the task `removeOldSnapshots` defined in the project). + +If this is not the case, you can run + +```shell +rm -rf ./tests/uitests/src/test/snapshots +``` + +Paparazzi will generate images in `:tests:uitests/src/test/snapshots`, which will need to be committed to the repository using Git LFS. + +## Verifying + +```shell +./gradlew verifyPaparazziDebug +``` + +In the case of failure, Paparazzi will generate images in `:tests:uitests/build/paparazzi/failures`. The images will show the expected and actual screenshots along with a delta of the two images. + +## Contributing + +- Creating Previewable Composable will automatically creates new screenshot tests. +- After creating the new test, record and commit the newly rendered screens. +- `./tools/git/validate_lfs.sh` can be run to ensure everything is working correctly with Git LFS, the CI also runs this check. diff --git a/fastlane/metadata/android/en-US/changelogs/1001000.txt b/fastlane/metadata/android/en-US/changelogs/1001000.txt new file mode 100644 index 0000000..78dd519 --- /dev/null +++ b/fastlane/metadata/android/en-US/changelogs/1001000.txt @@ -0,0 +1 @@ +First release of Element X 🚀! diff --git a/fastlane/metadata/android/en-US/changelogs/202502000.txt b/fastlane/metadata/android/en-US/changelogs/202502000.txt new file mode 100644 index 0000000..cb9da2e --- /dev/null +++ b/fastlane/metadata/android/en-US/changelogs/202502000.txt @@ -0,0 +1,2 @@ +Main changes in this version: swipe between media. +Full changelog: https://github.com/element-hq/element-x-android/releases diff --git a/fastlane/metadata/android/en-US/changelogs/202503000.txt b/fastlane/metadata/android/en-US/changelogs/202503000.txt new file mode 100644 index 0000000..9f4d072 --- /dev/null +++ b/fastlane/metadata/android/en-US/changelogs/202503000.txt @@ -0,0 +1,2 @@ +Main changes in this version: bug fixes. +Full changelog: https://github.com/element-hq/element-x-android/releases diff --git a/fastlane/metadata/android/en-US/changelogs/202503010.txt b/fastlane/metadata/android/en-US/changelogs/202503010.txt new file mode 100644 index 0000000..8e44d1e --- /dev/null +++ b/fastlane/metadata/android/en-US/changelogs/202503010.txt @@ -0,0 +1,2 @@ +Main changes in this version: Event cache / Join room by address. +Full changelog: https://github.com/element-hq/element-x-android/releases diff --git a/fastlane/metadata/android/en-US/changelogs/202503020.txt b/fastlane/metadata/android/en-US/changelogs/202503020.txt new file mode 100644 index 0000000..8955ade --- /dev/null +++ b/fastlane/metadata/android/en-US/changelogs/202503020.txt @@ -0,0 +1,2 @@ +Main changes in this version: bug fixes and improvements. +Full changelog: https://github.com/element-hq/element-x-android/releases diff --git a/fastlane/metadata/android/en-US/changelogs/202503030.txt b/fastlane/metadata/android/en-US/changelogs/202503030.txt new file mode 100644 index 0000000..f7a79e0 --- /dev/null +++ b/fastlane/metadata/android/en-US/changelogs/202503030.txt @@ -0,0 +1,2 @@ +Main changes in this version: improvements to the event cache, Element Call now uses an embedded implementation, several bugfixes. +Full changelog: https://github.com/element-hq/element-x-android/releases diff --git a/fastlane/metadata/android/en-US/changelogs/202503040.txt b/fastlane/metadata/android/en-US/changelogs/202503040.txt new file mode 100644 index 0000000..21f4248 --- /dev/null +++ b/fastlane/metadata/android/en-US/changelogs/202503040.txt @@ -0,0 +1,2 @@ +Main changes in this version: added a fix for Element Call not being able to report issues. +Full changelog: https://github.com/element-hq/element-x-android/releases diff --git a/fastlane/metadata/android/en-US/changelogs/202504000.txt b/fastlane/metadata/android/en-US/changelogs/202504000.txt new file mode 100644 index 0000000..8955ade --- /dev/null +++ b/fastlane/metadata/android/en-US/changelogs/202504000.txt @@ -0,0 +1,2 @@ +Main changes in this version: bug fixes and improvements. +Full changelog: https://github.com/element-hq/element-x-android/releases diff --git a/fastlane/metadata/android/en-US/changelogs/202504010.txt b/fastlane/metadata/android/en-US/changelogs/202504010.txt new file mode 100644 index 0000000..8955ade --- /dev/null +++ b/fastlane/metadata/android/en-US/changelogs/202504010.txt @@ -0,0 +1,2 @@ +Main changes in this version: bug fixes and improvements. +Full changelog: https://github.com/element-hq/element-x-android/releases diff --git a/fastlane/metadata/android/en-US/changelogs/202504020.txt b/fastlane/metadata/android/en-US/changelogs/202504020.txt new file mode 100644 index 0000000..6657847 --- /dev/null +++ b/fastlane/metadata/android/en-US/changelogs/202504020.txt @@ -0,0 +1,2 @@ +Main changes in this version: security fix. +Full changelog: https://github.com/element-hq/element-x-android/releases diff --git a/fastlane/metadata/android/en-US/changelogs/202504030.txt b/fastlane/metadata/android/en-US/changelogs/202504030.txt new file mode 100644 index 0000000..a4b397f --- /dev/null +++ b/fastlane/metadata/android/en-US/changelogs/202504030.txt @@ -0,0 +1,2 @@ +Main changes in this version: bug fixes and improvements. +Full changelog: https://github.com/element-hq/element-x-android/releases \ No newline at end of file diff --git a/fastlane/metadata/android/en-US/changelogs/202505000.txt b/fastlane/metadata/android/en-US/changelogs/202505000.txt new file mode 100644 index 0000000..8955ade --- /dev/null +++ b/fastlane/metadata/android/en-US/changelogs/202505000.txt @@ -0,0 +1,2 @@ +Main changes in this version: bug fixes and improvements. +Full changelog: https://github.com/element-hq/element-x-android/releases diff --git a/fastlane/metadata/android/en-US/changelogs/202505010.txt b/fastlane/metadata/android/en-US/changelogs/202505010.txt new file mode 100644 index 0000000..4712e9f --- /dev/null +++ b/fastlane/metadata/android/en-US/changelogs/202505010.txt @@ -0,0 +1,2 @@ +Main changes in this version: fix Element Call not working. +Full changelog: https://github.com/element-hq/element-x-android/releases diff --git a/fastlane/metadata/android/en-US/changelogs/202505030.txt b/fastlane/metadata/android/en-US/changelogs/202505030.txt new file mode 100644 index 0000000..f9194d1 --- /dev/null +++ b/fastlane/metadata/android/en-US/changelogs/202505030.txt @@ -0,0 +1,2 @@ +Main changes in this version: fix issue with Element Call and to-device events. +Full changelog: https://github.com/element-hq/element-x-android/releases diff --git a/fastlane/metadata/android/en-US/changelogs/202505040.txt b/fastlane/metadata/android/en-US/changelogs/202505040.txt new file mode 100644 index 0000000..8955ade --- /dev/null +++ b/fastlane/metadata/android/en-US/changelogs/202505040.txt @@ -0,0 +1,2 @@ +Main changes in this version: bug fixes and improvements. +Full changelog: https://github.com/element-hq/element-x-android/releases diff --git a/fastlane/metadata/android/en-US/changelogs/202506000.txt b/fastlane/metadata/android/en-US/changelogs/202506000.txt new file mode 100644 index 0000000..a4b397f --- /dev/null +++ b/fastlane/metadata/android/en-US/changelogs/202506000.txt @@ -0,0 +1,2 @@ +Main changes in this version: bug fixes and improvements. +Full changelog: https://github.com/element-hq/element-x-android/releases \ No newline at end of file diff --git a/fastlane/metadata/android/en-US/changelogs/202506010.txt b/fastlane/metadata/android/en-US/changelogs/202506010.txt new file mode 100644 index 0000000..a51bde4 --- /dev/null +++ b/fastlane/metadata/android/en-US/changelogs/202506010.txt @@ -0,0 +1,2 @@ +Main changes in this version: fix audio devices and volume selection in Element Call, improves moderation features. +Full changelog: https://github.com/element-hq/element-x-android/releases diff --git a/fastlane/metadata/android/en-US/changelogs/202506020.txt b/fastlane/metadata/android/en-US/changelogs/202506020.txt new file mode 100644 index 0000000..8955ade --- /dev/null +++ b/fastlane/metadata/android/en-US/changelogs/202506020.txt @@ -0,0 +1,2 @@ +Main changes in this version: bug fixes and improvements. +Full changelog: https://github.com/element-hq/element-x-android/releases diff --git a/fastlane/metadata/android/en-US/changelogs/202506030.txt b/fastlane/metadata/android/en-US/changelogs/202506030.txt new file mode 100644 index 0000000..f52df1a --- /dev/null +++ b/fastlane/metadata/android/en-US/changelogs/202506030.txt @@ -0,0 +1,2 @@ +Main changes in this version: add support for tombstoned rooms, improve notification reliability. +Full changelog: https://github.com/element-hq/element-x-android/releases \ No newline at end of file diff --git a/fastlane/metadata/android/en-US/changelogs/202507000.txt b/fastlane/metadata/android/en-US/changelogs/202507000.txt new file mode 100644 index 0000000..3abd90d --- /dev/null +++ b/fastlane/metadata/android/en-US/changelogs/202507000.txt @@ -0,0 +1,2 @@ +Main changes in this version: improve accessibility. +Full changelog: https://github.com/element-hq/element-x-android/releases diff --git a/fastlane/metadata/android/en-US/changelogs/202507010.txt b/fastlane/metadata/android/en-US/changelogs/202507010.txt new file mode 100644 index 0000000..42a042f --- /dev/null +++ b/fastlane/metadata/android/en-US/changelogs/202507010.txt @@ -0,0 +1,2 @@ +Main changes in this version: improvements and bug fixes. +Full changelog: https://github.com/element-hq/element-x-android/releases \ No newline at end of file diff --git a/fastlane/metadata/android/en-US/changelogs/202508000.txt b/fastlane/metadata/android/en-US/changelogs/202508000.txt new file mode 100644 index 0000000..46897eb --- /dev/null +++ b/fastlane/metadata/android/en-US/changelogs/202508000.txt @@ -0,0 +1,2 @@ +Main changes in this version: start support for room v12, bug fixes and general improvements. +Full changelog: https://github.com/element-hq/element-x-android/releases diff --git a/fastlane/metadata/android/en-US/changelogs/202508010.txt b/fastlane/metadata/android/en-US/changelogs/202508010.txt new file mode 100644 index 0000000..e96d596 --- /dev/null +++ b/fastlane/metadata/android/en-US/changelogs/202508010.txt @@ -0,0 +1,4 @@ +Main changes in this version: +- Fixes for the room v12 changes. +- Several bug fixes, centered on media and calls. +Full changelog: https://github.com/element-hq/element-x-android/releases 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 0000000..4da3e65 --- /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/fastlane/metadata/android/en-US/changelogs/202508030.txt b/fastlane/metadata/android/en-US/changelogs/202508030.txt new file mode 100644 index 0000000..8955ade --- /dev/null +++ b/fastlane/metadata/android/en-US/changelogs/202508030.txt @@ -0,0 +1,2 @@ +Main changes in this version: bug fixes and improvements. +Full changelog: https://github.com/element-hq/element-x-android/releases diff --git a/fastlane/metadata/android/en-US/changelogs/202508040.txt b/fastlane/metadata/android/en-US/changelogs/202508040.txt new file mode 100644 index 0000000..ac9a4fb --- /dev/null +++ b/fastlane/metadata/android/en-US/changelogs/202508040.txt @@ -0,0 +1,2 @@ +Main changes in this version: you can now create shortcuts to your recent conversations, several bug fixes related to media processing and downloading. +Full changelog: https://github.com/element-hq/element-x-android/releases \ No newline at end of file diff --git a/fastlane/metadata/android/en-US/changelogs/202509000.txt b/fastlane/metadata/android/en-US/changelogs/202509000.txt new file mode 100644 index 0000000..9756225 --- /dev/null +++ b/fastlane/metadata/android/en-US/changelogs/202509000.txt @@ -0,0 +1,2 @@ +Main changes in this version: improved timeline loading times, you can now create shortcuts to your recent conversations, several bug fixes related to media processing and downloading. +Full changelog: https://github.com/element-hq/element-x-android/releases \ No newline at end of file diff --git a/fastlane/metadata/android/en-US/changelogs/202509010.txt b/fastlane/metadata/android/en-US/changelogs/202509010.txt new file mode 100644 index 0000000..8955ade --- /dev/null +++ b/fastlane/metadata/android/en-US/changelogs/202509010.txt @@ -0,0 +1,2 @@ +Main changes in this version: bug fixes and improvements. +Full changelog: https://github.com/element-hq/element-x-android/releases diff --git a/fastlane/metadata/android/en-US/changelogs/202509020.txt b/fastlane/metadata/android/en-US/changelogs/202509020.txt new file mode 100644 index 0000000..8955ade --- /dev/null +++ b/fastlane/metadata/android/en-US/changelogs/202509020.txt @@ -0,0 +1,2 @@ +Main changes in this version: bug fixes and improvements. +Full changelog: https://github.com/element-hq/element-x-android/releases diff --git a/fastlane/metadata/android/en-US/changelogs/202510000.txt b/fastlane/metadata/android/en-US/changelogs/202510000.txt new file mode 100644 index 0000000..e30ec57 --- /dev/null +++ b/fastlane/metadata/android/en-US/changelogs/202510000.txt @@ -0,0 +1,2 @@ +Main changes in this version: Spaces! +Full changelog: https://github.com/element-hq/element-x-android/releases diff --git a/fastlane/metadata/android/en-US/changelogs/202510010.txt b/fastlane/metadata/android/en-US/changelogs/202510010.txt new file mode 100644 index 0000000..3c916fe --- /dev/null +++ b/fastlane/metadata/android/en-US/changelogs/202510010.txt @@ -0,0 +1,2 @@ +Main changes in this version: bug fixes around notifications and UX improvements. +Full changelog: https://github.com/element-hq/element-x-android/releases diff --git a/fastlane/metadata/android/en-US/changelogs/202511000.txt b/fastlane/metadata/android/en-US/changelogs/202511000.txt new file mode 100644 index 0000000..8afd746 --- /dev/null +++ b/fastlane/metadata/android/en-US/changelogs/202511000.txt @@ -0,0 +1,2 @@ +Main changes in this version: fixes an issue that prevented Element Call notifications from being displayed sometimes. +Full changelog: https://github.com/element-hq/element-x-android/releases diff --git a/fastlane/metadata/android/en-US/changelogs/202511020.txt b/fastlane/metadata/android/en-US/changelogs/202511020.txt new file mode 100644 index 0000000..a4b397f --- /dev/null +++ b/fastlane/metadata/android/en-US/changelogs/202511020.txt @@ -0,0 +1,2 @@ +Main changes in this version: bug fixes and improvements. +Full changelog: https://github.com/element-hq/element-x-android/releases \ No newline at end of file diff --git a/fastlane/metadata/android/en-US/changelogs/202511030.txt b/fastlane/metadata/android/en-US/changelogs/202511030.txt new file mode 100644 index 0000000..a4b397f --- /dev/null +++ b/fastlane/metadata/android/en-US/changelogs/202511030.txt @@ -0,0 +1,2 @@ +Main changes in this version: bug fixes and improvements. +Full changelog: https://github.com/element-hq/element-x-android/releases \ No newline at end of file diff --git a/fastlane/metadata/android/en-US/changelogs/202512000.txt b/fastlane/metadata/android/en-US/changelogs/202512000.txt new file mode 100644 index 0000000..e287435 --- /dev/null +++ b/fastlane/metadata/android/en-US/changelogs/202512000.txt @@ -0,0 +1,6 @@ +Main changes in this version: +- Improve the room security and privacy screens. +- Better room list sorting. +- Fixed crashes when recording long voice messages. +- Improved the UX when opening a room from the room list. +Full changelog: https://github.com/element-hq/element-x-android/releases \ No newline at end of file diff --git a/fastlane/metadata/android/en-US/changelogs/40001020.txt b/fastlane/metadata/android/en-US/changelogs/40001020.txt new file mode 100644 index 0000000..54b9834 --- /dev/null +++ b/fastlane/metadata/android/en-US/changelogs/40001020.txt @@ -0,0 +1,2 @@ +First release of Element X 🚀! +Full changelog: https://github.com/element-hq/element-x-android/releases diff --git a/fastlane/metadata/android/en-US/changelogs/40001040.txt b/fastlane/metadata/android/en-US/changelogs/40001040.txt new file mode 100644 index 0000000..8b8ede3 --- /dev/null +++ b/fastlane/metadata/android/en-US/changelogs/40001040.txt @@ -0,0 +1,2 @@ +Main changes in this version: bug fixes and add OIDC support. +Full changelog: https://github.com/element-hq/element-x-android/releases diff --git a/fastlane/metadata/android/en-US/changelogs/40001050.txt b/fastlane/metadata/android/en-US/changelogs/40001050.txt new file mode 100644 index 0000000..8b8ede3 --- /dev/null +++ b/fastlane/metadata/android/en-US/changelogs/40001050.txt @@ -0,0 +1,2 @@ +Main changes in this version: bug fixes and add OIDC support. +Full changelog: https://github.com/element-hq/element-x-android/releases diff --git a/fastlane/metadata/android/en-US/changelogs/40001060.txt b/fastlane/metadata/android/en-US/changelogs/40001060.txt new file mode 100644 index 0000000..b2d056f --- /dev/null +++ b/fastlane/metadata/android/en-US/changelogs/40001060.txt @@ -0,0 +1,2 @@ +Main changes in this version: bugfixes. +Full changelog: https://github.com/element-hq/element-x-android/releases diff --git a/fastlane/metadata/android/en-US/changelogs/40002000.txt b/fastlane/metadata/android/en-US/changelogs/40002000.txt new file mode 100644 index 0000000..19e1bab --- /dev/null +++ b/fastlane/metadata/android/en-US/changelogs/40002000.txt @@ -0,0 +1,2 @@ +Main changes in this version: Element Call, design update, bugfixes +Full changelog: https://github.com/element-hq/element-x-android/releases diff --git a/fastlane/metadata/android/en-US/changelogs/40002010.txt b/fastlane/metadata/android/en-US/changelogs/40002010.txt new file mode 100644 index 0000000..19e1bab --- /dev/null +++ b/fastlane/metadata/android/en-US/changelogs/40002010.txt @@ -0,0 +1,2 @@ +Main changes in this version: Element Call, design update, bugfixes +Full changelog: https://github.com/element-hq/element-x-android/releases diff --git a/fastlane/metadata/android/en-US/changelogs/40002020.txt b/fastlane/metadata/android/en-US/changelogs/40002020.txt new file mode 100644 index 0000000..f9c0486 --- /dev/null +++ b/fastlane/metadata/android/en-US/changelogs/40002020.txt @@ -0,0 +1,2 @@ +Main changes in this version: bugfixes +Full changelog: https://github.com/element-hq/element-x-android/releases diff --git a/fastlane/metadata/android/en-US/changelogs/40002030.txt b/fastlane/metadata/android/en-US/changelogs/40002030.txt new file mode 100644 index 0000000..b2d056f --- /dev/null +++ b/fastlane/metadata/android/en-US/changelogs/40002030.txt @@ -0,0 +1,2 @@ +Main changes in this version: bugfixes. +Full changelog: https://github.com/element-hq/element-x-android/releases diff --git a/fastlane/metadata/android/en-US/changelogs/40002040.txt b/fastlane/metadata/android/en-US/changelogs/40002040.txt new file mode 100644 index 0000000..b2d056f --- /dev/null +++ b/fastlane/metadata/android/en-US/changelogs/40002040.txt @@ -0,0 +1,2 @@ +Main changes in this version: bugfixes. +Full changelog: https://github.com/element-hq/element-x-android/releases diff --git a/fastlane/metadata/android/en-US/changelogs/40003000.txt b/fastlane/metadata/android/en-US/changelogs/40003000.txt new file mode 100644 index 0000000..fb55ecb --- /dev/null +++ b/fastlane/metadata/android/en-US/changelogs/40003000.txt @@ -0,0 +1,2 @@ +Main changes in this version: Element Call, voice message. +Full changelog: https://github.com/element-hq/element-x-android/releases diff --git a/fastlane/metadata/android/en-US/changelogs/40003010.txt b/fastlane/metadata/android/en-US/changelogs/40003010.txt new file mode 100644 index 0000000..cccc747 --- /dev/null +++ b/fastlane/metadata/android/en-US/changelogs/40003010.txt @@ -0,0 +1,2 @@ +Main changes in this version: Mainly bug fixes. +Full changelog: https://github.com/element-hq/element-x-android/releases diff --git a/fastlane/metadata/android/en-US/changelogs/40003020.txt b/fastlane/metadata/android/en-US/changelogs/40003020.txt new file mode 100644 index 0000000..610f99e --- /dev/null +++ b/fastlane/metadata/android/en-US/changelogs/40003020.txt @@ -0,0 +1,7 @@ +Main changes in this version: +- Element Call is now enabled by default. +- There is an 'ongoing call' indicator in the room list. +- Adding mentions to a message is now possible, but it's disabled by default as it's a work in progress. They can be enabled in the developer options. +- Voice messages behavior changed: there is no need to keep pressing to record, to start recording a message just tap on the mic button, then tap again to stop recording. +- Added a marker in the timeline to indicate the starting point of the room messages. +Full changelog: https://github.com/element-hq/element-x-android/releases diff --git a/fastlane/metadata/android/en-US/changelogs/40004000.txt b/fastlane/metadata/android/en-US/changelogs/40004000.txt new file mode 100644 index 0000000..811c504 --- /dev/null +++ b/fastlane/metadata/android/en-US/changelogs/40004000.txt @@ -0,0 +1,13 @@ +Main changes in this version: + +- New timeline messages rendering. +- Added support for user mentions. +- Enabled chat backup so you can restore previous message history. +- Added read receipts. +- Several improvements to polls, including poll history. +- Several UI/UX improvements. +- Set a default power level to join room calls. +- Added an option to disable notifications for invites. +- Fixed a bug with the text composer and suggestions on Android 14. + +Full changelog: https://github.com/element-hq/element-x-android/releases diff --git a/fastlane/metadata/android/en-US/changelogs/40004010.txt b/fastlane/metadata/android/en-US/changelogs/40004010.txt new file mode 100644 index 0000000..cccc747 --- /dev/null +++ b/fastlane/metadata/android/en-US/changelogs/40004010.txt @@ -0,0 +1,2 @@ +Main changes in this version: Mainly bug fixes. +Full changelog: https://github.com/element-hq/element-x-android/releases diff --git a/fastlane/metadata/android/en-US/changelogs/40004020.txt b/fastlane/metadata/android/en-US/changelogs/40004020.txt new file mode 100644 index 0000000..b55bf0b --- /dev/null +++ b/fastlane/metadata/android/en-US/changelogs/40004020.txt @@ -0,0 +1,2 @@ +Main changes in this version: be able to send a problem from the first screen, and add an internal log viewer. Be able to send private read receipt, send typing notification, improve performance. +Full changelog: https://github.com/element-hq/element-x-android/releases diff --git a/fastlane/metadata/android/en-US/changelogs/40004030.txt b/fastlane/metadata/android/en-US/changelogs/40004030.txt new file mode 100644 index 0000000..3135dcf --- /dev/null +++ b/fastlane/metadata/android/en-US/changelogs/40004030.txt @@ -0,0 +1,10 @@ +Main changes in this version: +- Added share presence toggle. +- Render typing notifications. +- Manually mark a room as unread. +- Add an empty state to the room list. +- Allow joining unencrypted video calls in non encrypted rooms. + +And several other bugfixes. + +Full changelog: https://github.com/element-hq/element-x-android/releases diff --git a/fastlane/metadata/android/en-US/changelogs/40004040.txt b/fastlane/metadata/android/en-US/changelogs/40004040.txt new file mode 100644 index 0000000..22293ab --- /dev/null +++ b/fastlane/metadata/android/en-US/changelogs/40004040.txt @@ -0,0 +1,4 @@ +Main changes in this version: +- Fix decryption of previous messages after session verification not working. + +Full changelog: https://github.com/element-hq/element-x-android/releases diff --git a/fastlane/metadata/android/en-US/changelogs/40004050.txt b/fastlane/metadata/android/en-US/changelogs/40004050.txt new file mode 100644 index 0000000..cc12859 --- /dev/null +++ b/fastlane/metadata/android/en-US/changelogs/40004050.txt @@ -0,0 +1,2 @@ +Main changes in this version: Moderation to rooms, mark room as favourite. +Full changelog: https://github.com/element-hq/element-x-android/releases diff --git a/fastlane/metadata/android/en-US/changelogs/40004060.txt b/fastlane/metadata/android/en-US/changelogs/40004060.txt new file mode 100644 index 0000000..303b8eb --- /dev/null +++ b/fastlane/metadata/android/en-US/changelogs/40004060.txt @@ -0,0 +1,2 @@ +Main changes in this version: room and user moderation. +Full changelog: https://github.com/element-hq/element-x-android/releases diff --git a/fastlane/metadata/android/en-US/changelogs/40004070.txt b/fastlane/metadata/android/en-US/changelogs/40004070.txt new file mode 100644 index 0000000..7ce359b --- /dev/null +++ b/fastlane/metadata/android/en-US/changelogs/40004070.txt @@ -0,0 +1,2 @@ +Main changes in this version: Enable the feature "RoomList filters" and "Mark as unread". +Full changelog: https://github.com/element-hq/element-x-android/releases diff --git a/fastlane/metadata/android/en-US/changelogs/40004080.txt b/fastlane/metadata/android/en-US/changelogs/40004080.txt new file mode 100644 index 0000000..06f69e5 --- /dev/null +++ b/fastlane/metadata/android/en-US/changelogs/40004080.txt @@ -0,0 +1,2 @@ +Main changes in this version: Enable room moderation feature. +Full changelog: https://github.com/element-hq/element-x-android/releases diff --git a/fastlane/metadata/android/en-US/changelogs/40004090.txt b/fastlane/metadata/android/en-US/changelogs/40004090.txt new file mode 100644 index 0000000..06f69e5 --- /dev/null +++ b/fastlane/metadata/android/en-US/changelogs/40004090.txt @@ -0,0 +1,2 @@ +Main changes in this version: Enable room moderation feature. +Full changelog: https://github.com/element-hq/element-x-android/releases diff --git a/fastlane/metadata/android/en-US/changelogs/40004100.txt b/fastlane/metadata/android/en-US/changelogs/40004100.txt new file mode 100644 index 0000000..1618e5e --- /dev/null +++ b/fastlane/metadata/android/en-US/changelogs/40004100.txt @@ -0,0 +1,2 @@ +Main changes in this version: Prepare navigation with permalink. +Full changelog: https://github.com/element-hq/element-x-android/releases diff --git a/fastlane/metadata/android/en-US/changelogs/40004120.txt b/fastlane/metadata/android/en-US/changelogs/40004120.txt new file mode 100644 index 0000000..6ecb5ad --- /dev/null +++ b/fastlane/metadata/android/en-US/changelogs/40004120.txt @@ -0,0 +1,10 @@ +Main changes in this version: + +- Added support for opening matrix URLs inside the app and navigating to replied to messages. +- Added per-app language support for Android 13+. +- Session verification is no longer mandatory for already logged in users. +- Better log handling. +- Fixed CVE-2024-34353 / GHSA-9ggc-845v-gcgv. +- UX improvements. + +Full changelog: https://github.com/element-hq/element-x-android/releases \ No newline at end of file diff --git a/fastlane/metadata/android/en-US/changelogs/40004130.txt b/fastlane/metadata/android/en-US/changelogs/40004130.txt new file mode 100644 index 0000000..a00be64 --- /dev/null +++ b/fastlane/metadata/android/en-US/changelogs/40004130.txt @@ -0,0 +1,2 @@ +Main changes in this version: Add plain text editor based on Markdown input. +Full changelog: https://github.com/element-hq/element-x-android/releases diff --git a/fastlane/metadata/android/en-US/changelogs/40004140.txt b/fastlane/metadata/android/en-US/changelogs/40004140.txt new file mode 100644 index 0000000..b4b4c00 --- /dev/null +++ b/fastlane/metadata/android/en-US/changelogs/40004140.txt @@ -0,0 +1,2 @@ +Main changes in this version: Add support for incoming share (text or files) from other apps. Bug fixes. +Full changelog: https://github.com/element-hq/element-x-android/releases diff --git a/fastlane/metadata/android/en-US/changelogs/40004150.txt b/fastlane/metadata/android/en-US/changelogs/40004150.txt new file mode 100644 index 0000000..0dce189 --- /dev/null +++ b/fastlane/metadata/android/en-US/changelogs/40004150.txt @@ -0,0 +1,2 @@ +Main changes in this version: Ringing call notifications. +Full changelog: https://github.com/element-hq/element-x-android/releases diff --git a/fastlane/metadata/android/en-US/changelogs/40004160.txt b/fastlane/metadata/android/en-US/changelogs/40004160.txt new file mode 100644 index 0000000..a79e38a --- /dev/null +++ b/fastlane/metadata/android/en-US/changelogs/40004160.txt @@ -0,0 +1,2 @@ +Main changes in this version: Composer draft support and bug fixes. +Full changelog: https://github.com/element-hq/element-x-android/releases \ No newline at end of file diff --git a/fastlane/metadata/android/en-US/changelogs/40005000.txt b/fastlane/metadata/android/en-US/changelogs/40005000.txt new file mode 100644 index 0000000..dd8c30a --- /dev/null +++ b/fastlane/metadata/android/en-US/changelogs/40005000.txt @@ -0,0 +1,2 @@ +Main changes in this version: mostly bug fixes and performance improvements. +Full changelog: https://github.com/element-hq/element-x-android/releases \ No newline at end of file diff --git a/fastlane/metadata/android/en-US/changelogs/40005010.txt b/fastlane/metadata/android/en-US/changelogs/40005010.txt new file mode 100644 index 0000000..3c6c019 --- /dev/null +++ b/fastlane/metadata/android/en-US/changelogs/40005010.txt @@ -0,0 +1,2 @@ +Main changes in this version: Element Call improvements and bug fixes. +Full changelog: https://github.com/element-hq/element-x-android/releases \ No newline at end of file diff --git a/fastlane/metadata/android/en-US/changelogs/40005020.txt b/fastlane/metadata/android/en-US/changelogs/40005020.txt new file mode 100644 index 0000000..2508042 --- /dev/null +++ b/fastlane/metadata/android/en-US/changelogs/40005020.txt @@ -0,0 +1,2 @@ +Main changes in this version: mainly bug fixes. +Full changelog: https://github.com/element-hq/element-x-android/releases \ No newline at end of file diff --git a/fastlane/metadata/android/en-US/changelogs/40005030.txt b/fastlane/metadata/android/en-US/changelogs/40005030.txt new file mode 100644 index 0000000..cbdff7b --- /dev/null +++ b/fastlane/metadata/android/en-US/changelogs/40005030.txt @@ -0,0 +1,2 @@ +Main changes in this version: mainly bug fixes. +Full changelog: https://github.com/element-hq/element-x-android/releases diff --git a/fastlane/metadata/android/en-US/changelogs/40006000.txt b/fastlane/metadata/android/en-US/changelogs/40006000.txt new file mode 100644 index 0000000..0574894 --- /dev/null +++ b/fastlane/metadata/android/en-US/changelogs/40006000.txt @@ -0,0 +1,2 @@ +Element X is the new generation of Element for professional and personal use on mobile. It’s the fastest Matrix client with a seamless & intuitive user interface. +Full changelog: https://github.com/element-hq/element-x-android/releases diff --git a/fastlane/metadata/android/en-US/changelogs/40006010.txt b/fastlane/metadata/android/en-US/changelogs/40006010.txt new file mode 100644 index 0000000..0574894 --- /dev/null +++ b/fastlane/metadata/android/en-US/changelogs/40006010.txt @@ -0,0 +1,2 @@ +Element X is the new generation of Element for professional and personal use on mobile. It’s the fastest Matrix client with a seamless & intuitive user interface. +Full changelog: https://github.com/element-hq/element-x-android/releases diff --git a/fastlane/metadata/android/en-US/changelogs/40006020.txt b/fastlane/metadata/android/en-US/changelogs/40006020.txt new file mode 100644 index 0000000..0574894 --- /dev/null +++ b/fastlane/metadata/android/en-US/changelogs/40006020.txt @@ -0,0 +1,2 @@ +Element X is the new generation of Element for professional and personal use on mobile. It’s the fastest Matrix client with a seamless & intuitive user interface. +Full changelog: https://github.com/element-hq/element-x-android/releases diff --git a/fastlane/metadata/android/en-US/changelogs/40006030.txt b/fastlane/metadata/android/en-US/changelogs/40006030.txt new file mode 100644 index 0000000..0574894 --- /dev/null +++ b/fastlane/metadata/android/en-US/changelogs/40006030.txt @@ -0,0 +1,2 @@ +Element X is the new generation of Element for professional and personal use on mobile. It’s the fastest Matrix client with a seamless & intuitive user interface. +Full changelog: https://github.com/element-hq/element-x-android/releases diff --git a/fastlane/metadata/android/en-US/changelogs/40006040.txt b/fastlane/metadata/android/en-US/changelogs/40006040.txt new file mode 100644 index 0000000..2508042 --- /dev/null +++ b/fastlane/metadata/android/en-US/changelogs/40006040.txt @@ -0,0 +1,2 @@ +Main changes in this version: mainly bug fixes. +Full changelog: https://github.com/element-hq/element-x-android/releases \ No newline at end of file diff --git a/fastlane/metadata/android/en-US/changelogs/40006050.txt b/fastlane/metadata/android/en-US/changelogs/40006050.txt new file mode 100644 index 0000000..0e38b17 --- /dev/null +++ b/fastlane/metadata/android/en-US/changelogs/40006050.txt @@ -0,0 +1,2 @@ +Main changes in this version: bug fixes and performance improvement. +Full changelog: https://github.com/element-hq/element-x-android/releases diff --git a/fastlane/metadata/android/en-US/changelogs/40007000.txt b/fastlane/metadata/android/en-US/changelogs/40007000.txt new file mode 100644 index 0000000..0e38b17 --- /dev/null +++ b/fastlane/metadata/android/en-US/changelogs/40007000.txt @@ -0,0 +1,2 @@ +Main changes in this version: bug fixes and performance improvement. +Full changelog: https://github.com/element-hq/element-x-android/releases diff --git a/fastlane/metadata/android/en-US/changelogs/40007010.txt b/fastlane/metadata/android/en-US/changelogs/40007010.txt new file mode 100644 index 0000000..0e38b17 --- /dev/null +++ b/fastlane/metadata/android/en-US/changelogs/40007010.txt @@ -0,0 +1,2 @@ +Main changes in this version: bug fixes and performance improvement. +Full changelog: https://github.com/element-hq/element-x-android/releases diff --git a/fastlane/metadata/android/en-US/changelogs/40007020.txt b/fastlane/metadata/android/en-US/changelogs/40007020.txt new file mode 100644 index 0000000..4271b64 --- /dev/null +++ b/fastlane/metadata/android/en-US/changelogs/40007020.txt @@ -0,0 +1,2 @@ +Main changes in this version: bug fixes. +Full changelog: https://github.com/element-hq/element-x-android/releases \ No newline at end of file diff --git a/fastlane/metadata/android/en-US/changelogs/40007030.txt b/fastlane/metadata/android/en-US/changelogs/40007030.txt new file mode 100644 index 0000000..120548b --- /dev/null +++ b/fastlane/metadata/android/en-US/changelogs/40007030.txt @@ -0,0 +1,2 @@ +Main changes in this version: TODO. +Full changelog: https://github.com/element-hq/element-x-android/releases \ No newline at end of file diff --git a/fastlane/metadata/android/en-US/changelogs/40007040.txt b/fastlane/metadata/android/en-US/changelogs/40007040.txt new file mode 100644 index 0000000..4271b64 --- /dev/null +++ b/fastlane/metadata/android/en-US/changelogs/40007040.txt @@ -0,0 +1,2 @@ +Main changes in this version: bug fixes. +Full changelog: https://github.com/element-hq/element-x-android/releases \ No newline at end of file diff --git a/fastlane/metadata/android/en-US/changelogs/40007050.txt b/fastlane/metadata/android/en-US/changelogs/40007050.txt new file mode 100644 index 0000000..a4b397f --- /dev/null +++ b/fastlane/metadata/android/en-US/changelogs/40007050.txt @@ -0,0 +1,2 @@ +Main changes in this version: bug fixes and improvements. +Full changelog: https://github.com/element-hq/element-x-android/releases \ No newline at end of file diff --git a/fastlane/metadata/android/en-US/changelogs/40007060.txt b/fastlane/metadata/android/en-US/changelogs/40007060.txt new file mode 100644 index 0000000..1bc0b2f --- /dev/null +++ b/fastlane/metadata/android/en-US/changelogs/40007060.txt @@ -0,0 +1,2 @@ +Main changes in this version: media browser and bug fixes. +Full changelog: https://github.com/element-hq/element-x-android/releases \ No newline at end of file diff --git a/fastlane/metadata/android/en-US/full_description.txt b/fastlane/metadata/android/en-US/full_description.txt new file mode 100644 index 0000000..862c235 --- /dev/null +++ b/fastlane/metadata/android/en-US/full_description.txt @@ -0,0 +1,29 @@ +Freedom to communicate on your own terms + +For individuals and communities - private communication between family, friends, hobby groups, clubs, etc. + +Element X gives you fast, secure and private instant messaging and video calls built on Matrix, the open standard for real-time communication. This is a free and open-source app maintained at https://github.com/element-hq/element-x-android. + +Stay in touch with friends, family and communities with: + • Real time messaging & video calls + • Public rooms for open group communication + • Private rooms for closed group communication + • Rich messaging features: emoji reactions, replies, polls, pinned messages and more. + • Video calling while browsing messages. + • Interoperability with other Matrix-based apps such as FluffyChat, Cinny and many more. + +Privacy-first +Unlike some other messengers from Big Tech companies, we don’t mine your data or monitor your communications. + +Own your conversations +Choose where to host your data - from any public server (the largest free server is matrix.org, but there are plenty of others to choose from) to creating your own personal server and hosting it on your own domain. This ability to choose a server is a large part of what differentiates us from other real time communication apps. However you host, you have ownership; it’s your data. You’re not the product. You’re in control. + +Communicate in real time, all the time +Use Element everywhere. Stay in touch wherever you are with fully synchronised message history across all your devices, including on the web at https://app.element.io + +Element X is our next-generation app +If you’re using the previous-generation Element Classic app, it’s time to try Element X! It’s faster, easier to use, and more powerful than the classic app. It’s better in every way and we’re adding new features all the time. + +The application requires the android.permission.REQUEST_INSTALL_PACKAGES permission to enable the installation of applications received as attachments, ensuring seamless and convenient access to new software within the app. + +The application requires the USE_FULL_SCREEN_INTENT permission to ensure our users can effectively receive call notifications even when their devices are locked. diff --git a/fastlane/metadata/android/en-US/images/featureGraphic.png b/fastlane/metadata/android/en-US/images/featureGraphic.png new file mode 100644 index 0000000000000000000000000000000000000000..eb6cabd122c4397a3ce4b13064dc6febebb3265a GIT binary patch literal 400607 zcmV(xKpIRX00#V>A=FDf)cj{@)W0ku8c;j0GtXYOM4|~a1Snaq|Ih#T|JMbe|L?!~%UAKA zIK;8_fB*LXeJUICf1m6BJ|`U;_xpR(#TLS8`usV3#x(x;eS-c^uD|0mxRTMF4~>6w zpF?#H^`}z6C34DWayuqfi}wsIJM|oYr8|7<{~^mq@{4wz&v>vna~?74;mctqyV$rt zLNzj;(;VPBQf;$|jqjLNr2VS%k6wkWjhtI{e#ZK_7~?p{dH(Y%L+}i}=fuaxpMOeY zQub2JKse#TJ@t0E`q+to$FinRyMT53!JI3z*~Z#=IsbV7FWbG18Tr=vjn5N!X}kZ; z>%9Lc=H!Ft@6JyLlfY@wrL2GU{Ta<^q+hrw?eYKlD4AZq^NyGJTK=5)`v=COUme{e z#y0vE1Q4mwT?~hlCLYzxEvD)!@$Sn zxS@x4Tyf8-@YmUU(N{C#4iv~G>BE&mC>IDu6sk@QJjuQku5 z-@k0(Q;R%?mdm9vlI8QUSRR@ILdstjOE7t9qsC?1ckvh9iGP>lISE*eMaFT=r#$l9 z!{tjO<4mfMse|`x{Ci#x?2a#W2jv*C{loKU50%cj^wH7DbJ~m*@8^?wFU@Hqx$d>% z44JFK(8P2SS%(VBKYiv$rZJq7-y}u%QNZy!4H-YQ#bD9&i=Uj|4nF(u zbMi|XkFF1$C)QiXz7yYPAbFpB@kgic^AE3Q{ysPO90IBP!hz?{e<8o&(Es=Ok@Z>6 z`}^hGGJVDK(Eh)1Bi~PEJ1ws#cC5vh@=K1*rVm}DZo*7)3)l@O1Eo@~Xp*eSdu^&eDyYhi*Ycs8FBFpi-Zph)Hy}1V z+*Tpe=NvA)`Zzf&Mp^8S?jKTk#(zHYzs9no{L}TiWH5XC2A&NzU&N7N*>$8pZ_EAD zF(3Q8-mRG2P5B?Mp+kK^@GyIZxPx1i9p>Ntm(D(s zhdrjS;~$w5#a;L_-(WTeB+$6aH2=|@avp-;I7)2L@pM_8CfWKhnu1XD8@|Ez=R+A* z#=k@BnGITpC6uidy=6zf9Oy&$sZ-roCrCw)`MT}20@vh~{`KO^p0{ASJor9;XUuCP zly6qhQ7nRTUKvj_0nh$y(`7RFW<@I>F~`@UAw1|GZCQ*sN%Pg7 zl7C|TNi1c&o`4c&e~o5S?&E9S=H|k<(xDf28q>WtW7b%Y|I9=5bc>^QZbQJ6Ff6$! zcfs?V@%qW<@|30PGs9@NpR#j3AgU-m8xkz(#`+l*zN>-4kJB>V1bLrw7?(eL;I zCeIZ8(SV`s^LNxJZ2wudj5EqVivO={VzP`tvk5_wN7tSW-!>jryPPAfAdOrVuD<0r z|NM_9CP|&*ZgvtnioI8@|HtcqH&>^R(mAAXuY~x=_*!qR`5RfSI`L+IY=2^1Y}@#G zR_6j(w;Tj;0s)h?GbxzFUhwrXeAjBETY3c!zJONBGgBsLy*M}ZZ84ey!VhpcfGLb& z5X|3i8x)kqXM3a7wWhfW# zD;kpFL!aZ-@UuC=zh>XVytirPY~fc$Y}<5QevH$I)>$?`&*Uy`9Ob4!#h(*6Y8)BblW97?2`Vgp!wShiJn*+>Qu(;xs z^rgVwav6OOd$}l6a{hiO+vdG-*?DJjALTdRV?Rfo4bv14r46~~{E)8{_bp%jjrwSw z?#QUvjPoU9e1wZQEZ&ahlqc4G2hG>2qo>F4l2Oy@I?RIjcUt(Vk;>S0A1t?dD+jR< zswIbu0%610>6Gn?rxOeG>2v1UT%A`_-0|1#7XH?Xxv6J%2icYfwi<9Aq^prri$0rAH@?Lj{2c$3 zn&$4PQf$3jZS}xIOqQTr6Z+`#wOrEX4=283&1twVKI{LNDE_efIy=+d{7Ri0VGrDZ z1&QSEE*}St6P_En>ff{3+bGC(gMuc7d}u zMWTYSf+FPF!k7PrJpRb!i-lhWW=b9$VM+9@xHIhKXrdeV%qC7P8PB3LYR%tA7Uu<9 z2kQDe;xLpJf34LOe6B#>a+`f^jXaR7X5BFF7eD>|yRMA7Fl{2}{NJ0;#gqJCwrjAF zVwrO`xq8dR#%2D3wwXne7A^Vy=o|iW&Ns1_%(N5XIr^XXFrQ#(9iA1KNY24(8eJ?t zX%m(bvD+R%0WCfSf}=ol%`JJi0#iHE9Nq zvjL?G6&2$OALMeLcpO5A&A3k4CoZ}1At>OR8lEG(K#MEORlG_WG_Xp!LVUh93wvae ze8kk_A4a58Hs(UC*SXRkf}qSb)TFZUmt&Hj`_{xrInP#{O<`G%G>b38JvO9S@_E#)SxaH|T59+_L|>f?jS1HEAJ(C)HRC+ZFlU**)23#2wKmzt3ht zo$=GZ3?1gTDmK5wY391`w0w+KYOHwq+WY6v-0e`ocZ50|%YDNV+rfeB_N)-KW&GZD zJh<|1$iH#tYXJ2B9t;&!+I*OC%9ZrtR&9W2$PeFIzR@zT-j5GTj@URbllyo|*I&GC zc!V#+Si1x0d>XbM8yWw7#dsY(+6MO$c&O>_nRCR$#b1o;-G}B~Ge29@S32m{Eav03 zJTtEJn6Yp-wr}wZ`oe#8gwW}PhwqIZfvJ_aY842uF+1p8SWiOb?90w|B-%~Ki(8*A z4^W{vBRgbV$!Ik;JiCi(q^@s^>=b_^ltm!$#(FwNK`;2BEa@ zIOLD$R!|xC+_-R<0K0O1u1b<;F+sCH8KR|40ghcbORb{Jea=15WV0GJG`XYUMuq#7 zCGX1sWqBE**_+>K@Sf(+FmakCy|;>L?2A}oWGxM5Q&xqz0|1gQny$gh&IJxM;tag}@Mog`7O_9$w~_#a}hw_S1GeKzj|a9d=YjZMCug9!Jz8dtUinXgQ<`zF4} zhi}06ph19o{(Pa3{ZApB{P6BLU9r)=r-xv3#kMNrZ*o&FJS|5%!G`j;YK7zH3Ru3B zn{zX>4U2nRQ6|cdZ0O1`sgZx2K8hl|EyU9A_t%=@R-Tz@Dh^LRjP<{)7+iFK`0hU& zSacT0=4aIR70aXa@|9kMetG6N^wgxT%as5u<6XJos7l;tZ2dndkbm0KLz;OI9UDr| z*be^?O_S?jl~*5ETpa);f6|)oBgZY;@I29&6q}JCOvV8{-<0V-GPp$*V^AGtG-j;( zBIR%+%`M9lBb_{~M>EOhZN*nRq9OZs;zFTC2kZ-SbJLOHMVB3mmRFh2fvh1qBfvkG z#R%Uze%`apyl(m0IrpdMz9Xtv6DmJ~@5YEN?Oghtc&N#Utgn(m};V zSYAn=pL~Gs^o!$X(;xL}xLe>Rt#4mhIQ-BMVBTfWcI5mqc&$yZkqzj?(3K|*&<7IZ z9fLeU-x*0$pL5jLo8~|GkAYd%sAVRwNk((ORjeTf z$Q6lGMCwJ3;qtkLT#Hv(?)&69+8>kb|4)YL@qLtA63NS5@{uZ=Lm+dncBg#-GB&Vq zC@)`bKzb>C_m`sD|#CB03S2$!IOau3@7og?^3zwtk$L^2- z)-CYDQaIO6xhIK^kEKJFUDftipLv7Bs0zmf|H1&FulqiW(}}4W|H)h!_DIp>Lm$0= zE|Qx+T=UAFA9-Xj`~T=FP~dkWjO>#4B__^1Z*DoSvixr#?MjwZVJ2`0l!xQ)#f&!hC`P_SnQY?{Q!bA|cNT43ZUYaS4OuKauEnLn2K z3-xJ_D*b5@bEYt2U|sXEE3ySE#)2d$!C_Y{&MRsXZz$k$_#l@7FPlNJwl=xzD>Lac zL-s@8>%h}MSXj86lTTVS50NrD-n>;wf6udOE0ynnTFsPrv6((HcvE3Xi_LJiV^dti zo+)j0qU(v*lB$M}S=u+1d7A#@g>L#+TVZP~j=oq?0AX_IJKo`M$J}bVOh2o-BM-G- zebn*00Ux^}+;T9r$^g1ud{i#-dCL#MfcI=1{E8{omX%+DlE zd7_bS)+Z&#u1nvf6N#V} zHYL%C%-q&b$y}FCna?4oIr(Z?2g->qyEnkIHnhP}8VirhW7RtHE-^buCUt}2$ zFZeBP{}qK=%yx8|0!msg$iK(KlMIpZ1CX$9LJ-e`;`mcd}-}lK^e!8j^p}Tc2led7~SnjK{bF7V4I1#XldW_IU@I?f% zF~CCiExz2hYT-F3&R2GZzWa`0D^n7vg58dz%+@QnA6d5C{X*a4N(@{s=Q72Z za$T?Hg`2Tfbd%4P0cyN4f3f1+ChpCs8GGqY^)?S&RZqA;=r|@u9mu15mNG zWV3t<)6;$2|Mg8y-`sg}Np5=789#iUW?mjnUZ}u<-@7Ma`#96Lo}QP`Vc@q$-Jcle zcQcq6h|Sy=|D&SNI#DzJYa4o2BMKK&0UGzC)}{wM{-;n*n=qlc-%GT3IG)?f{eE;O zyvH~xfoBj!lfIL$jR?7NMGh_F(T7JZ|9>zjlgIN?FWwD@*)6RNmR>mY!ivFuZQzuH z)nb%)4S_j8#^Nl+6=Q)AorNwvB`%|3l|A^$i6XWuN9(u~;u6PL`=i z2yHPX(!j1B%q|Nfg39lA=O$FjmQlc7EBwfHHXg>aY_0Ra^LTz_8r&EKNoe@_?M^G6 zCg!y+jZELr=8FG;H#V3MJUQ0&gXuNs?S|g97+g8U)wtn;WKL=+fUAJ*2lIwv!h6l_bk(~;b zyV4=4m<5{Uh~L|f(*JQSCmK3}3( z0^v8Rfx7`Oi&;%=8#{QV?kV@gMid<}rXoJv-Vd*R2ZPc4`#XU-9%OlvcI<8ET-Uu$ z@LWs{Y`t#mR|O^=R?TrE8}oCOJ0fN1E1U{`rQS|(Gi(x+t_s7}BfBEA#H-~OF3wYT zH)aj#-g14|^rbJPA6$66`D~RQ(g!*Lc5u?JjXOs{ct%?CBs4idUmV5~)|J2Fk@QhZ zR_XOL^cFk4)MyhcJuUh5%qiN@rE!1WO=O>^6_ft>XIp-3GjG_emORq)=U?;nzhjWc z2JX*l1jk-&b#ZPCC}%MYDPzNP@xCzGjYvRc$Dg@RFlqBjIF%Ek5=qCI@#_n{guvP) zie}l*70=hu`;+NwUk7_SLA2SLer`KBL-V2kwYh587$?>G^%m+mJ~}wmvET6rZ}hqY zC&!$6@U(A`A^FwDII;Xe@dZ84w2dg#M$O23@>>ly-?L6Fn;=yh`Dy~7JH~D)wvSMc zK0JT#UwE3mCZ!GkAXl)Qv+VynpD|80FyFEDs?SdlKJ!Z|EIs!o5`TuW#zz6IE%SVZ zTNd9S#?WYsf2@ZxBI6&P2SdiU1l|0;zqCG1^!w8(pFy*I@xM+j!YFAV1#m1(G1zBJ zG~KC`S$D?SF}tQ0hI!7xUE{1{_xOGj4Y=sVfO2`4Y_^gr@CmC@*{VQZLsx=&Lj$@yz|OFFmf zPaeQm+LQwA&_q@NTnEHl=QZ_a~2;rRE8xif!k85n^+0M{+fxllS5 zE*+S(;@{}F{;XBc&set6-;ImpYT_oh-(%dTl$E(I8K1P1yOQOL5aYpeD1Soo=)_SFU3 zPCI_Z`t5wKGjHqjR`d=;F0zSB#e7yB-jA)B-8q8mLT^{Ct?h+F!9v3M7tHPjHT@^| zwbm6v-}F@CHU3}abD-J{%H=NqV3&KapqDd0D~`6kR8GUFfgmwt~4#<7ikHiL%09@`#1h?0kQ z^53zmR_Pxyv#!@k`6g`jmCPGc`n5zv`fVG%WjkQSyp6M5m_FoRpEzQihdai@>);AM zM<}NoY9{iohucr)xa-gL0V~JEIFsMk^j;fQyYo36?J)ed0eih7kA9f6CcI>2f7DPOS%R&F3qlL(E@awyTVnX`V{|fMFrK zihscB8OsPxa6WsckNb>VhDblhp(Yhi9A#0>hr=11@_ads-oxaCWSU%gc-3y&#tBP& zU1HKQwVt5OpN&|@YN8(ku8$Yb zMf^sNX>9&D^HzG-b=zTdS+YI+o`${u<>N29NKY8Hr3_WjJ{xcK{s(=R*J=MC`TTnh zeGh4mIX7W}f;Z^%b4I=LMb6h94|#lzgBp5?rG`FaZDDxxyBoMeomgn2sE`fc;9b!; zk;yy{Akvs-PaI4vPKHv-tjr#cyQv1l`G?)dn$I^|&*JU6A-#kfO+LSU<4iG~n_}R( zt1__9~$%)%HwZ-M~`&ss5P5G`@$5H zOMvUy4sfO}MZcUm7$13f5#S#@wLTfWUNLZ#&@Tn_s&{l7ZKo@$k?qwi`Z{2?rJZr| zS$jl#fnV_`h<09Bwvr0ZJdedW@BU^vQlH14-9KUZhS`|3Bc~lY<4+GxPyFla1Li+i zIq%#Js7(YnYb`w+QRA)SYM>#R-B-=V4E51*23ei%S(ciAx39Qw%YT05v*GV|F%WkE zxp5&84IsTtZ#Hv(ALr-nmfk+k&-*FgfQWbI58>OR3-Ll`zQE*59fX0)gk>-N< zQ5H6Kbzx^9*{1N)!8j1+&WPbbm>{#Z{CxDQUq+amI7Ge=jWX_%t7JD&ji*lPJ{9}% zJ+4b%=79Z$Nv`RRF4Z?>uh`%OQ$*Z+=h z@<%2wZlA+SmAaCnMUZ|__8x{~9Iv!T0p6%N-##BI{G{;KD9kZ`waNBJ>tk0YU8b2& zp4hrfllS*Fzqjrf{pQ!&RN4hGT+g~>p`uj=iRrdz(8jaq8TP(ZNuM2m^3ylDVftOo z5sRsX*91~U+BKdyK5R`4i-`~U1s`zDyzs!82_xNRk4>*H`uXb_zUdTpJN&}WK3@Ev znE0rv@`tt=!!*Ok8cK@M5yz72(XdU~lx^9_Y(KIc35dnU=b@=Ue6EmA{6m zH95i3mzqCYW-&#XXbPWMQwhL1Z~1O?<7AnI*foT2*(S#E8^4RfRZN@1&B-S|hjM^^ z)~h@8H^f+k`uXu;*PR=ne_D2M^?%^dKz%t z2q?h6Zi_Z6xBc}T+4O?n$%l6-cF)9eU!mLyYWxxvT30LEJl^K>!gapR zlXuIEE=|fjdwxrPV?DeIg1gOsiIt5DAC}?>c*YG;*Ezcgp--{Qs0S$T0iCHuK(GqmB-(4K!|Mw1f+6sxv;?1UW|8n_PIqbWVEA zkM)_K?lq7x?|#g4`L^1!v+)W6CWy`{eFeZ*<)2=4zLZk9UW`VcTki^=^P19JU9Rsp z#$paGgiPE73h`ZgF3^WIgJs;(jNShf5~+hSHe}Yq?U9{N(5?&{ts<2?lml#x=(fEl z_d?VYb1ae+z`}wHWdZv(<|!QcUD;alg&f5KkA7HyrI+Bf@hqpy0ySm6nu)rbLt^0L z31?XmTDrnVo=2ZITNoa*qqjFDW=y}z1r~C;E%B|nUHYyniw#T(2W@100QbK)d)e0v z@_2FK{Srefu1Yaq9ygojZ|Dbpl`J-}%4GEw6u4@Pf&d77^R={JDo9E~G~mAefr^Kn2| zGk{)x@b}5TS`iFT8S_-Vj2E)ef$S;$%u@`X!COZvV;2a&+?(30-7F3zZ)JTjYbGi- zKTK4fQ!ebY8K7Js#Y>MR8ED2&x*}|&jL$kh>2Pv`rTSwNztEzOT!15Q#J@|t%4($z#us-(sJ7(DS(WfAK zs+~Z5z;Vh;< z-?7GSto026%M*U+VHPnWJI^%V(0u4Vo1S0S;_}Hz?BrLp2@gzL$V-3|-?mW$@E0WKai%R2x#>Yj8V{=%V@1fszrP|kGRx9rwW z1E#KYAE2?g8wYlNMteSSU98H&+j!%RFQd7nd#Gi49B!mgDtuW$&TII7Oy{4wJey|XSSn6- zAIlTN0TCY|+tHIckG!Mc!A`n*BXT%=M31^ug=md>Z|oJtN0u|`xcRkFl%ktoirxUU&~KFdt|?{tTku zPV+9(h)t=HsZvU=3GTl>x2?%@gS+j5vH4D$?~GcJR7VHXCpL%dRh2*CiyO@uhs^?( zldSR8F`K^fTP9+JKhJ?)10J6|_Gs}3*PurHI+4f8$lFgmlj#rZ$I0tW^ET0z9=$$? zG8I9S>pkVbKk)xo^M8r9#XaQuEtp6Y=>vT&nvK{Hin-?B<|Mqr zKR(iBUqLxv9BkJqV_&g(yAG{zHJ98nz4R%QS1~Rhh>e^|{w_pW{b0_Ix6P-qf808a zHJ8WxQdDv)*r!QD+wt+Gu(RbCQz|!2l3u;o{a>HGVe}1zn8MGpN$>Mjy35ya!pb_+ zh{qid{xvj!v2|Vj_k7#R7qu}T`V)iLJ`mg0_U^?~!(TjpOdc~)+_L`trp)WLeP!;N z@bBAu3`k$eCI9YACf&(F;Sie@S5DaSf&6__NXq8s0^gqe2)y_gXCK_lH`*oBsKI*l zr&AMS;`1ZD?u_|+^TjQjf3A#!|Bz_Dpy9wZ7i-~B{Cme=D@YdE@-cNUQ+^$V|BRgR z*4-f2vFq-)Bg+`z%Cf&_0Qf3UE@*s?xTCWdyr7JgYU8%_wLui~xqYp?9y_&2E;jR> zcJiy+KHM!m$B0)nGZmuxGF;^$>3RqgZ=yIR3JAyi&@9)*=9o;ibSmo5SE@x>({4?g zXloqTzmc(yKTVS}iS7Jc;j9NPv(Nv%J|D`|CQ}xqd;Y564_U~y9KPJbT zLwri#(sLZ-t3KWvQ~vYnTM@sj0Q6h;Nzd*Y=tWCkm-!g)o9;7rHC$Cpj;@H*%Jp0M7CB&qfpL4X-geCjpqm4n(huNfZ(BvyDzXNmF*t|+P z{fZ^1u`GVp`OEi5e_Pm?o7(+zcq1ClB=xb7J-*QE>WpIty_u^lwPbAI#uOUQbLQ_O z-+b+0%skBt0tjNCmb9(gfz>=Lh7MM3SKuCwXe-8auJ1x0nHP6$ z+aYPhy~bHI^`q{nd@$#&5qfu3uCrY3$9s z6YBAK2li|@F%DsJ42p$UZ|i#_$vq7Fx7t@wpwg1<6T3$FzSs z_=A})@l8eo=d0gwz>~Z>4o@JL^geVVch!4By@c_m?Q&poch?=!XRLqqfrV*_Hj62L zDBS4cP?$`8oGGs8{T=!goB91v6Sz*g%c1He{UN z@w2kX3STyiM?VO2`ryLr4HsPgW1oF2ZMq*^Y4%!t_}%Wha`a=CV_z<7zrBaL;q?PO{8Bc42ev-g&9ri~ za*tvfnD4T?Y!7bP1dMJN+DLoTuS~ApMugo*&i3(#&qp!l`3z|?%%)NleCS+Lcl`d| zd!acoG-q$U#L#3ieVg{Qz5n^?2XRF|Vg|>bpE-Umn*JTHe5YcoR-6bgTz+{M*v= z=qF;ZH$z5*!`J(!H@)KPFz$G!%Y)DN@crZeS5)NF{pHi*_1d@LX-R2q7NbMg zHyxUG&?Y0ttQT`c=Y~jG{!2OQY`S#Jr_2%D=DSA^nC$7Fh<15Gi+YxH@^y;q407|& zkB1-e_f0GRB4z%2{pU(6QMLwFBKZhiI`3NHg-Jzd>F+KCPR1+e-C6|a=l&W?Bv?ux z`7hpYufOx3TLxh5s!pcXL*rPaFCKK})p#j87gmg$uFp7aWY~uJ{aSAd00gRWkX?#{yG;vk*UjYkmEp0pU2<+2`_csQ9WuDDbIe^MBKP z<4^i~49SUpztAH_fXQ6(H5352o^bz@-JXeRI=kHCOTBd~|NQ)uz9V0ZJ3f$l_KJ!9 z-SF@wvptg+buA13vKX+>FZ{tUsPNPAr(Z%{_VtirGdezk+-eQ!RPu+ zAvUpull#l@U=W?WkXJy59&0)UC;%0{TVA|=E_*t>k+E0j(u~+_ILFYgqtjTx4GkbX zNf@5OlMhB*{!JM_@Y`#NRSTQ_Qo(HJU&hJL*QU_qs$FBGNiFy)Flfl;2+hk5D$Zxy zD3*TQZ8oDL; z+VV4;mc{ux=lME{c!_>=Sq&h7{0(o<<|noy){+i!_gT{OJBX%Njw0HShMOndy0-wQ^h+Z;lW?5&mUy7_1nxbeQ1-3$wufKHg`FI@R``*h}{kwZ%~&(`-rDN zGqhtaW1;G7Fi;A^>*med`>Dr{$RgkOj0CL@#-h)z%v?8jzFY@^z%-lV@4;bW=Bx1> zyT6vOox%NAabFvU%>y=dY&`$^LQtmr(UC3}xpDF-;zb)n7@Sbc7+oIm1_@ACq z-*_$Bs6atQlD&45Zwg+oXgowe6}E&_XR)wzbX=s94HyFOMb_8G$9P&%sVq=Q%T}Z) zzH1B*ekZ7%PyIuNIA8I1n(a~6o1vX#S@>Kkz1XcLO^UDBmUOAavQ4%qZjDZpXX?|# zrM7*1>_aRTqH}7nwA8?9?KDhBVZ3DHc%OS{R^j?dv@0%7qHAF}W{QVEMqJ!<>d4Mp zZY$^MecCGVYB+YkdE+accKTOCtGS;WyB0kQSw07VMfcH#I2@jSmq>m7(HK(;x2gHa zijkr{=jyxTAf4R5_NLe4i}cECL%`#2Y%?shQSjn#NMF6Kc>ef&(w-svk%5Qx&_!*) zi5Sy;G$NAk$)D3CnIGB$ijc+r6l@cxcuMhMvd4tn6q!3qu8p0hdkd@f_pO?Qyz3Mm zcMHRYvg#6Pd|=1my+*7LjmZBk6eQEu(KDEwD->zZ!M2t(U7;jzSusq>iar_}gjd(M zQGx+upWA)tZO+79GtM>7&x1JwhM`1y@F|Pc-x1Sqig7iC=6f^hoMWNx?oSoe3^-?w z>#ZTs!R1jTHxg>rCn(M&{%eF9ot@%q@JZU)|*aa;8Hkzoc1AKib`uf43 z9q;saER6c#)W$b;HlHc1=4x#2G0=>sDLgX%pxlNRUgdG3bG?tfonu^#@8sr0FQ;kd zA~l2;ZkDh5(01D@$7a)}jR|c+(B2dOynX(7FY9KvuO-oVRRqDEQR@nl@e@*xX0a$~ zFMOHf45Lhn;QZ(RBl9KnOZ+2xeBDXXTL^nAdnqnQ50ATs@-K)wu-jy~HnNY<{@wQp z&+4@{9$e#!e2cd0Ge50)b~nhAU&C$Lr)Eqe{LFEDi+%s=9$8VVoVn(YYWOvF5as49 zu(MRYj`NORcszCRdYKl)l~dmAxMtB$|9b+aUv62y=e(bn5#rTg@e)RH=PyqK71Qno z$bin#{O*y@?>9N=kxRF_K9DYs3iWr}%Ex&Z>2fE^ z+Q#8(p2}FChW=3S0&*HX;$Ht~KH<=PLQXC`wd5*GNFh^6*QzTB9~nn)>BeMA=I77< zT}|iJEYt1M}Hv(qeMWe>$PE4 ztFW3J;MkP$qr7ThDZ9T%Up~UP;DHd&us?M{hi73I+TI}lMD~X}f(#$>R?ux4`pGYg zt!=Y@5fyf&vRB67ara}Jd~R#ec*~w6jL~*k97C_SCQgd_mh#l{lZ=1I1K67q)T_lm z8vcVLdJ*CK75|v?hD_V^&SLn@Rfa}vZ2vIpYlAayy%vgop<*|Pfc&j&EV0GtWki>t zu5)!}U99H7R!BYnq2bA30{}IG0?8 z>BBaknY!mZe-{vJ?7s9p{RX|$dhq;yZym?`r}6uZZlh2Aq)gbZkxuoZk7U{QDKYHv z-E+v|r^s(&{!5vMU%fa9HysZxR%3>J-Z^u8d@y|**A3sudUEu4$*i1_K4&^HZv%#e zV#UsLR7)?)%U>!ug%{ZfklDWv{{I09~$);)rVdkT0PmWM5q6!e0yL6 z(IDBhKfa&4!S~&;-fRlMPA7~Od#DwgH#cFV8tUs!HQw~A|Mw;YF)kH{6S%&K@f%y% z1~ENqsVMBd@gyIL`Vif>#V1sAJACDpBrp_3!$BX~#9(CnfJ?C1s^LFz*T{Q_Mek~! zrYR{c0-P7WC-3qJH~*U(2FAD27aXVEaJj$mH_{CY@v~I#{d@ZTFmLu;Zc{lqskhz*pJXMHR4 zeb;9x;x2_;$}A52*Ca6cBJKA0MqOBrEr)^Q9&$kWU4^n}a8H{;6>GY7G9IH?`LKPy zOPQF$=5WdS6pJhsV1}0qQ94#|+tRp~tmw{IIk8_$9?`W8p!4_Hj6CO*KxC5xNEUXw zVmdzKS4bbe9~IwWx&khHAK~qQUmb7H7cmKlJ7wZ*#n0qLthD)WXH3seDKd8q3~~yN zy~?brD7@XDa&x5Cxt!33w|bD`@u+=lZp6R&{`gaD6f`JR_)^OkXj|74HZOz!^l`_- zPR*D8tmxu#^DFukmhD|;9}CB|!#2KAnrj{|%$~PSx9Rgcz&-xwYU0q+I^4u@WK&L; z-+04AT%df3zOQVC_`PtY&71OhV)5IVMMHYe@dB`~04r{R-LTK6jQ{bQoBq~EZqpYp z;dLxS8RxS$lhhEK4!)4Sy^djgJb7*>?@Y&|^b>dP*KJr`N@{%=_AmDR$?>)3o)gP> z=~B_ttXl1mq>BaCl)wST65(0T>O zsTdghD*dxI`=gyV?rns1w?yW@f+@>bzXTh9Gz=n!hM$G#b6&qk`X55)%89c$$8kID z7Ine)LP~+pxlg_PWXH|LcTFEMbjz2~1=l4SOv+SCUYqB#<^XcEWe!@j$VfHE#^jQ5 zGWq?$w$RRKDb<#ZSq=Nh0msT@sJv4Aqww<6aURleXEa^m@>L$6;=f*gm%jO4Hj%#G zw66xS4Bx?V75lp}_6>yC)F2jyl?MoL`$mBaPORCc{}e_+ue3=O7#clnA4I{gexta3 zVaGta(_C^9t4^ELG-HlGmOS~lP4>apF^QrHxUgcp0Twax4?oULFyMZ^!}4tr`K8nc+0HlT?2m_HhSS4BVm^NDVY^5$#Kn?E0UbQSWU-m#dKOc2oQrB^>)zFJI~-`}hzlvAg7If|7B7pb;l`6Ru;8|8_s zH0Z=1OowNzuNp(q8h+#HHZVkxZe%#NE}mSQOA{x94a)Qbn?LH;D}SBu180o)o%;@* z;hBLYA6Sv9fi0~J$mfBSaJ$KtM6tGvM&sfa?2aF`+1@s=MyAdvf0`&tgZ-QIJ#@@Q zw>;9j{qz%b2a8^jS^P={tO0E{ZlTDgi6cCYVc%`nylm(%nP4l83t@O|zV+%P zFrB{gm*2Yd#XNWSH_JjSvUpoe+lGvM6sO!B+|rNd9q%L{9Wm6#cvI{$dpZUs2=%#j zHw1s;FnsWN`#HyzQ%CWQudwZny=5EfgV|I-=-$pJ>^OJp9Vg4*nzgaNI{<2Xh=dbb zZv+1Q+Qo`3N{p8f#26LTi=XtPAx=Tku2&&JK|0;aWIHCbziAn=kxE3tB5x`Bla?I0_eI>9((X1BJR6eS5DID|H8tu$j?hLsjGT zH{I*K=Mx~XiQBl#9MkbTsM053n`6h2e?QTsTg1n2@nTE!r?8)J^)#PXeR1ni0TSt5 zx+3lGm_Dx$yfGHO9en4FHe!+|@gr-E>T7*?aK3V($v*bwM&Zs8-DeN$$Y3$!KGp6m zJ{H2N;Bu73o}~IZUw1TF#2Qovr18)4x&rQysEVHid=5gk;`96j8;Cp1;n}}}3 z5Ww)V!4jy-#t2XMx$&kdzfE)E$God8{;f%2OJeq=A00Mc0EewDW}G%${aPi(=%Wc~ z2e(=|PEWn@T&~Ye1gA zKQ-Djb=sExXEMrd+)!r3b1pUkOuL~;x04y=GviN2JKGmr*oV6hy;Wn%|1$1Xrq)Z` zMAj1>fby}qIWV!kJ-9u-ybJ{+r2Aene|X1Hp0v0c=H8QCUQlCJ}~Ra{>p&I#dp5?aTdGdM#jXTiCVeCcHF29 z8Rf4#WZD8gHyY)e($V6-JC+pRynw$eQ{WEQ-@*UzkJl69Yc-98iO0W&T|1^NKNS%;@WMFRV)Tq--{?T(XLJgJ`?2I6>|H0VRY@7I(<^h13 zt6I5{`0P%7{27h7y|rv()qT2~`JrF&DoeFz!=u;6%*fr+>vw9!lVmq$C^l;C+$A3Q zOjGExMGb*^!5JFR0Gpn&4JI2UL4mm90dNhNd0{y#$cy$7TffRG7L8glMT#>wcma9G z%kjfDA6ZRGMXZ=S(M<`v0wOW%)@aA;{fam9{n-?Q%Mgo!8BM8Ge7kfJp*_me+_Cm_ z+-IX16N6vP9A8s;TExUtsb^r{=y;CWR;k6;g&{v{MQ+1y1XLD+YZx--=SJ8b;Em4C z$BaNedbk-B4@Zp|v%>Zv5%Dkm77Kpb-{Gf?2B--2S`zz)z|klfaNPLZ5c6Se_87L} z?@`i=bTfwi>s-@(Pd$>mEQSU1m+=`{m~2~mjcm0y6%hG{KSM}^>922IsnIo=sedxq zur`}`Sp0juj1CkUa~Fril3#}Jy(ZdPD|P?R3(T-HjOytJ5le^n~j`{fttpK-g@z993H)&hx90(>!q(_$s`I zoKiC}^9IFbD!amIw4&(;A_&C0k`{E#oBwG9b;Zi#)jN9^KCEs%3zP;-4MO#lZ zd9Yz)&b)_sorveya(lOU_)hldTu$Tj!K`mC@6HSKS8J94i;+m^wlEyuyL|m8%h}}X zRIl(7|F~tWmt&eg{=U{Zk4G%OYt4b@oZo@@>9=yV&Xng|pTHPV=tq_#`(N^#O#7_` zGxP8Ezw7(ICEpTfZRX^r27=b)il{A6%mEE4vhiiicFG1TE+}7H!34Jhn0J1&T8eOU zH;Nf;w8iG0uN9S$jwHYLe=+dQBFC@D19S<7%9K(lF{ykCXzKT6mxr_Rj! z*FhWknta%q?}8$Asb|BWLR(x7iA!g;b|0n8J!?S|{MfRn2MLEe8*uuWg33#Tv)9#lgX*rPDK{nWP;X zwfr^?+5|ox{Ty@uOIH(KKY2TH^4n&PFB*r~sm>#{J_v5=gfVz$T z#(woPgWO2^%~RHV;(z<(t@~u-`HRlHrds*v)Q&ms>i`yawopSGK=1@`HUJuVVi&}| zA{FpjDAzVEWR&YiNy`i>$^E;)fEPe9dbV7;wu0iNB`X9T7U*R-@uJNVa3x3}rXeg$^NmoknTv5^^JZ}aiROD^HIEj|cM z^PyNP^NRye(Z4%*jm|b5UL?+D>BRqF%tFeGWb;MllfKouAF7Ep-zRW+v$UuU34yFq zeN>owZErB(g`Wx!hcfg3l^+fEa{naJ^vibYZf`k+4*iB`7{&ivGtvkZ$_({&wf=H!M- zw+d%AEheKBF7kru7n_sl&oZ;jf>bCUux=!Gn@S=fJ# z^{euAPVV@f#t7)JQ+lCr-H1@L%I2K3{`s25ci`y23GPFXpA3D<-6Of@NZWjJK}X(h z%foHH{=vG(scmp(FMjE?yQbMwjLv=MwmiB+52u@MbSS!|3|Yi=t# zd089Q%l|02j??Fk660H-Zl;mh2WH=tf8`8-zB*U-off_Q$^kGtRp8@39%}oq7 ztCCw3PkwT}tkLwl7@k?*u=|Lawra%@8+vE~K*s6-z?z;7pVJ+GZOZlW)X5xc59C{! z(6$fO=U!O*=F+)?sL~$RfyKP1Hyb^BjnMh|ijwnrZ1p|>cCv#xaOtu@2MGoJz#}KfeNyi{KE4 ztmMZ$<(&x7qT>@vM6N>k!{2fAf=RZil{o94$yO&!&?(ga*Q>_iPmx=bW;@2rE;)7h zC*8&01Ri|e7K!%vrDmOYR1wy{KcCNs$Aj$1H+G||ZYNS!9K7Aln+2l~0W z`I}!ukc34$v8gK8f8*<)EB;cR8veD$xjcr`ruFm9PvXZp;zhX!G8eB53)BnmmLHvC zV_Ux(?mpbc?^D?@&(GO8AEtTpd&d{#A)jD6Dg48qCj8I%nfFPalKW8fI2oBgpWF94 zeIMnUTPgd*zZo}WfNbJegzoz__vOF&1PUtHUZx+~&R;%X(I|N%H0PNUcl=EbDvH26 z2^cr_eS)H&^o3)@!crn}>C2C16O@}Z09dwuE-=U{a#`C#eBvnAt1=4WF#4p8kq;Kc z(a~bYt9coR!^0?T*p7Tcf3?`=MEca`KkoGrzIDxWX8{q{un} z`KnLEUTqno3I`Ar$H#lcHTY{43<~}Xns8)ZUD#4Ii=p56FCrgIV9hN5+JrZjJP(Op zi5~Ur^M39MnbedGNTsapGE3ee+nyoIc^9F@?Z8m4J5fjf!JO9c2-P<99QAb`` z-m=~{bErnOV#FBKzyb;PGw)Y=6!TKwxEG|gJ?!neLfgx3Y%nE9Gkl-9@?*z!tfS^^ zSS1mcUp&LZI#igHZvxFm=)`Lu|B!|SS;%D`Tz~cdH?Np0?rfu^mB-wS%F6i~d(Kz2 zx$d~1Qr|C>F$eHE&OY(@jg5{n+c5tD)G>+!vvb~cl`_Pg0j5g{K1@9Q^ToKfIJ3{H zmv?>AIsg2P4Ft*yt|h~zqX0OF%$f(u?Hk{5C;h8V=8M1A2mBQPoDF~&!T|mUv08^B z;?8+X3M{gg@pgZygW471uLYERU^mTO>$|+Qk`^1uA!K99xR*q(+`c+Y&Y8Cs8m5L_{*og zxxDxTvGF?YrTnEA!)0){W>MqY7Qw&cby8b#9mb~5=L?i`3Lox}!F4bj17?5W5Y080 zxRt9`-1?CQqKD7d_?_g>@;f)wRCHDVdo^4neG2if>);Kl=oZf*X92mFfs-jVZZ`#M!)zuf)NFTA7H zZ^gAoYs6UVZ!|4n?irscGalFUzn5=dF;9SBukl;JkEbgBkA3-z8~!YykpIEK5pEFr4<$P_G?eoXYXU@W81|W^7E$5HomP& znS?69obiv>tjS}~IUIlg{ypG+N1pQ#<=^9!&1aA{P~O_N{o{YWBENq7BhA5oiLc%1sLy}D zzoX&Kc>cOR14OY(E(i8QR9m{^5VC=Mf-$FYZ$Mbc@!K^P8n%V9r%18EY zi}2;MWq2dr5B)QaH!zre`ehDf8{g^MH{BPE_2@Q=a8nVJPt$LGK4S$c?~C$G;}eWH zx(%1tQpIBh>64dRAZssLlWS9Hom{zBzpM~S1@DKn(Wb9?ROv+Z^_O%BGs(G~du!>cJ8 z7IxCTLuFlcD)>f1Le>aKZSMy*6395f5`Wx|Fb(FK^P-{IIcY7IYxOXuk6YFI&nI9I6XEu^Hr=)d6h?w zZg5lBrh;|D&JXcO^fp_ak3sNv9X9zi?g!1mF;UL?6xj5*UrwHAH>Al>aUlJQ%gOJb zry-3EaMN~GNs$xT_ps$NeLwruOdH2|^zkRJAvx21Gyu2TsLqPeeYsZE* ze3}kII>h{U_{%)SMv}gM8h83!-|MP5NP7&mY%)J**zYOnxKA#rVp?wqa!@BLAb|cM$01QdwS_QGLZDHX2 z*Us#!pk3C^^X35YDye_XiHV^hCSwGo1$eqD{tE&di_7(@e5;jL2YpDbIoO*3wzK}f z_?3SwR}WzEb&DT`zKydz)kp_=TmN`}oMaa6DUwfPCS(u4f8aP*BI7)$$mKt9tDFW&F9gykO>xII=?IXur< z>%hN4C{y0^_1hR9+Jj+BCVy9{W0{;}V@Xfo#)1m-rW9uJUBk5ia3N~ zZCGLZjqCU#kJEStKmPdJ1Xyy@<__e(aPTl_pFcijx^hk0e0tq|W$&M9#((nUPh36J zQkkl;e|}X?upRxyNW>1zKORZUmn{#j<$Hl$Eg;UH|A@dp7TEtGpO{f`V>U3eiWOO;ftF!99)P z%ztDr!>OY1WdgU)e0X4iizrsJ?0^6MKUcJ1JUM>If9!j~hT*<)FS*he=g{MMBj^f z2$IC(k1J!!Sen~YBTB}oCFO3#fJucgJa1FqcDFiT^VXi#ySG~UD9X})Y!R(TN zjlsj5n}mSnRQw*=*imf&`5pe{%e`dml#s_~?98KoCI;?%Jl$@})o>4XLwaJmbF+P3 z4-RL;bC$>RLAU0Db7l9w_1d{XQW&rDU^Ir1f6ux3Lm3;JZAGKtdWlW>F4DJ6HimwmbAw_Y#`!yUe7dZ&?N;^}`Deqe z4NTTnOet!hFFzUix+B@i2V1;PF89s2(cc?*zuR@>c%IVjxJ)k3OG+>dev-6r?+N<} zthkCydVSf>Ab4ODvzi6+`2w3BR*f2qU z?W&f}qyw!F_I{51zSCX{g^=?Y)Eibb;*M8u!cT6)vFG+dxI8_va!y9FgZan=+}Cnw zAsa}lba?hmAuajU^S-SSr9J86UuBj)j_o#WT=7q3-B;1sx_up6@%%b}%lsAFwgyb<7EIuG%g7g;#$ebd$34e>x8;*ZCG(}5 zPAQhi=J2SFZO7+)WnM}rM$nQNx9$EES-%2sq4Yw{iPpc5?Kww?UsB=&-T(eMxBQ;- z)BN;N{)~c~xHoS%B!|_zoCEB6KZ)T1wqpK(O`ev7F?uB7y8#t9ut_PXkZ!-?R1(## zS55;~4;Aq#=WVz&`I=64el+q1KN=A~J{T>U{9At2HszUSb9i~vkqs}x|Ee623YlES zG0A>T0WpID_u-my8*}WY{ka`o#jo@mKElxbaP;MOrGKnGFM5{A=)O947g#ZD{mwzc{3D-2k6IsRj@6miLg*!*jX^M&a|5I%7reBe*6`E?#` z?5zj-h5DqLm`6MejP7%-LgMiCWPQD8i+N6o-+3Uc9+LN630|;UL~zdJ1(tK=>wwF% zHa?boy~ht8wq{IzY(Ekz=lr%q6K@?;RXq1U>_b_$PD8idlIP!8=a!u@J~_u58{JJm zaP`>y^IvbK7H`Ht>#AbJWxw#HzPS$HMbgpeG%LwE#v{oq?yl_qt0 z^ANFUb{sp!+S0nJy`vbIHG)~o>@#}Wc=zoE*-w60aXk2SuN>>md-^TcD5$Y7r2j>; z(jA((e*BtMkCs|rhCAcm^H}&)ZoG{-!w+F;7A2D(GTys1T-3G=0rM5#EbR_{s#yk` z4qbx(@QnDEZxBbg3C9nN9&w;Z%bRS>0i$@!x%nbTn_s!{H%4|WKHeRz$qwD>PyCM* zjg+aIddbhs-T^HQZzt0>Wq_8hmLQ6-1d8}L^D9>lkiOj;HC@E$M3(=-4Q9gzq+-7HZktJC+yk` zD0`(={n9+2CGhbv`bob@LLb>H64p-!iawybf@ZzF>AUQT(aDvE{sisn6JUP8&+YO$ z%Ih^tjb#M+`5Oj^l>HxeksK2%5A7kIEPXZcX2k;>Q3hf^b@ypVY(fF~OGbrQ_z0F; z)Ob_YM=CR(xM}%F|j= z4wu3CKgX92(fmjjHb8Y6uhl@oj>S*YjY@;Ty4{{K9DQc7@Lvd+?Drz)^QAtF;hCJqemxs2;(6ifi>Bc=dVE8qg;9aciR)2sSQ;k8 zt$Ycx7{J0-gU&pCzZWK}WAA-RCWu+wJ*~Ukmc!cpr!2NA)|hQq*)o4Yz;Ts13vp%J zV%qPQ+M6ZWc-C%&*Uu1K?Z{qV}e;(Jy2SoZO#97-xLg^rF9%}lm74+AA;m`db}btCS-0Z7ULBd zy+}ZO?YR2@9;+(8VE>XjdAM%8GP=|i`MOe-bO4JJ_W|;3+q9jg<@>(Dp!b%;ya}${ zoSM4b*UTxPQ|h`l5o%f2^9;=YW7D8L{@dgjN5HYM(Av!}{d?H}<`dIwiKnhC3SWI_ zIS1xyG4q^#$KThD{+l=O`|xO& z*z{PQuBED#C1Cs~1D44lb2t9A8LPj_3kCa&iN9~;r+>d31031P0+CXO{8AF(7mpqm zd%amLADvu<92Zyj|8QVJy!|^if6eY*XN`YN-V~0{`hXa_;tt0~ax5-EZ@Ek9+CRZc zA*cUlpZ@y_0A5~&;2x)5Qx}5sMQh-gF+-w7@6Qk)|4r1TY?-rTi(oQU-TVvi=0lJ? z;}?ER{1ID$iGMCe1~(BHc3@(F7e$}a;!#BAnczR@>50<9PDS_NT9&AgMOOiOV*co3 zvX7j;h_42c@wA$zw@ra~Z+|=J9l7k>VD8x_ihiPHj`)QW>>OfQGk#l(=bw}7u&Xcs~Dgk}JOdbyZSdnacN4%Kq>sVRb zD7u7K8?C-*;igY}lwz)hOLxH=$iX4_c)NrkJ8m+Vq&&~bcN=A+kPW?KgVXF-M%AqKa4;9M4PXD zQOwyocs(r3F}30$?8-XSIC8Jy2``0fJ2ui9dfzM4wvWOkaoD`k{hq7D)^k0`rweKz5|Xq(J* zHT;n8c)Z5dVnf9B*zig04xfJ-&F1+&MHsJxeywgo#xxo$$H;d_@3AYjY^}BKJGJ7) z>2Y&w+i%5EyN(Z0%7DOIfN)cHTie3UU{HX!9uI)baq%rpWfgU+Mc@WIO*BfW5KcdA{6e6QeQD ze4_Uq2w8ID%USb@F2lkV{_;m~H{M5(>_QqZqemUgYjH5r!TGnUW zI`$*_IAGPz-xd$%h#r&3s0HsJq3zO-zL%UY?#9v77{1OlvF-vj1Vv?D*$ z$xNz$@H!`bk&dFgTwgQL$bhBhM+^P4C|2;~RlwuC(cpW-P`JM59D9USWTpp$n5-jLKHy59qiHo6yuqgxt@*zmo_P7~ zBfrxcANU2qEDM-OoxKKNIDF}>TGpTzGem}kMw zT$3?6hvfU7pi4pWc}7j{ZXC|Iqo{Jn*!_iPj+6L+C3+@APuBRhF$A=Eye?3D`^Rvs_HDQP`t?fDMGBqk3*27q3f}(fP4e$a`2Dy37q9BOt;cR|qutOx!{_R9 zs+WE>C&pfGi%vXRIdvkI&0qKp(qddM8=j}$;~zq1)|Kd*rJs0sl;*L0Wt^Oj%zehz zW60FwmwWpqM`H0BTx(&9@R@?gKe%5)J{XiUR}q2Lu+@ipx6SpxjpVZnpJ_7Z_?P^K4gxbTxV^4! z=V?v%?{hz*ayc^Iva2w|n=Z>g2lraz{4=jO{P?ePKP5i68?1v9RMb2e)w^8&mogl_ zW8^~G$LvX5MS$2oYg86riL)>bynRlAi_8?hv^nh9KlITipW)7V9p`pDrXK^IH#)}3 z515lIFDZu%Ugq->;K8vFGVKP28!*Maf1N5Ajr*SHi&%nazZe2X;($4_<)`}n_8 z`zgs~xwPJBb0W0K`9XXi_c-3@##m?3AO+M8RY<3?rswZ{$v}H<8TNstZ01EaV#sU~ zm2P*fXNG*VBIhQX^UmYeih=lwNCWRzLga&N=nDVX7#P0{B`C+p%W*UEOZ^*|SnfBbE2Of=TB zZIsjXEC<`maCBtcjzQ)vUZI9caVL7NYjuQG>+OA#R z{oxx8MSdnEPq(F#%vo$0mtI&RFR8c=(1`wu(j=7ISX$ zpIOhvU*!i9K;}AI1nfc1?(Z3!>ZQS)Bp4c3E|#XZoeFQ?@=E^4VO(b&FTVdzPUZ|| zSM0?>h-Tw1+EO3_R+d<7Dno6G4%4j8@sVc$3Xz;YBV?UBLOk*?1oD_U$WQIE;K8gw zg{a7}d8JZq!zStXkfF$D!Ge{TrK@qye+pTtSyFozz0ZR&?+zp670*(T%;iy};!?iK zF~rK|g)B=(%=n9EepcEZh}VPmhC}Jf_rGZIt$)SB<*2&m*F~>r$9_Ezp7UdGd^)RQ zv+Ykv(u%kkEKw1w@$f*$+YULe{0lYrNL~GIn|avb1Vg)j)a`F)7VX5{RYiiL{h)Y~ubj;gF6&0$=3nZHOE^yZ|P8 z9&7*dCsX6hB9Uj@G&1tLeYZs$&#goHq?%^ophjKTD;LW?MVSPS#egfbWT4KT_iSUs z?J5#l=0^r$pL+1t%QJcM%{+wFW#a~tWjHMFS^N19zuse@?@dc+#^PQ}+29(E!k!hUo|II{93bIgGV0=_L8s@XBKV~^DgsOygX->X~ja17(r`y0kTfU1X|+;YeIY0 zjA_y(H<%e~LB6jzh92&ca2Y*T&5w~0((tt*m~syD{rFNmfxOaWEm`i1M310t$8tkw z{l&szbeufHLVx0Ku9VyQ&?Z~?XPqcl`5W1gIbjBj?AoX>Z?T3eczi#)D=FjZyUbI{AmQvj$F%z?$!Sw2af8XY8ZYLF zZ}`sEnK^9M9;6yIc$OVQ+PZ@0;?Wl8u(Z>P0mmTY>g1EJe$uWK48*rvo3d9d*jTvi zc(4(DB?dmUucZLj-A+4Rua0zWc@6m-hqt-#^W#Q$Z2yJb=g1AuXNzQc5JQ_*%1ufE=S?5Bbm-*OI(`!5g9IrE$?gS%0L8{_`ACX-u6iU5EnQ~pR3hQU* z*)e&htuZ!F4Z9`z!`sCwJ};ooS4}G%dKxJGR(#z$7*2Ai$_tV+$C{qss1gKGTpwGt z@p{|X@bSQEkdZW*7YrAD^`XxHh1bYbp>JJ&n<^IC=01r^dS3Xw{heaz_xWR3)j!f% z8AdQ)vdxi7pKGo_eH2O7nJY&^# zm=1V~4L@Fv*<&2r2+%sFUtJKcZM@yr->!NSBUnjZz!f*0xT+xfhmXQ z0zwhzu`B+WzYN2dJVfNm3XYInId*(5aZ?;RzL7uNA59iAx`N=+RJp%YkV@9^nUU7x zA6CokJZm|zW!bqpI{71XW)R3as3m?2KgEj|@+S8Qq$wDvGk+zb%(!I_UHe2)3-d)U zHl;&PcwpxienkOxb#(nyVat$9|G!V4Rls^Y75b_-rtsXrRg8OkeR*Z=pjkvJ7?HRtO{TM z)i+;w8i6?>6emWvrGLCSpl7_T)08=VvvgbW6|1J369Td!U8rOuGnSG_PgSIo^R&LE|iY`y>(4|B!+)j%csW7f6RS}=lx+7x?sF;GwZ|`$sUeTqP@Z61S0|kuTXKbG@ERGGB2ajxi9Hei$ zcgmSp#P{moJnowluUG;1MoA0DiPCc6;qm|CU#**x^C78~O7LwTjI_M)?uf~QE#kdt zobe%J&!&nxlR}#f!yO$1 z=8)9?@r50$xa=ljoB_^-@J@m!i1l-TqrLFpnqucK`jP~&xcd)bmKo=(ft{X=;+X}w zKl|}R&ka8;o*@00z-7AcV%qs(Wi}gAK_)d@3+$wmA20h^Gv(vO+q0-$sm3zeBc2I? zvO?mVs~28%QUvvXk-=#n9KyNJdH+UD_BWN}ydf&dFD#||=oMCZ`RsB;&aCvYxcXP6 zKtZLPhMhMQ-Vo%R{40BGev+X}v>7^QN*~&DRnh5=9`d#NIeCX%PP2$Ju;n}NR|9+T zJ5#5?@n-FJ_A}nIf`LgzG;?ES1~r){~GV!NR+MT{U+Cg!{D_QhwK6~*>9X!L`# ziX)S~vSEn0L-7G-7^{uE@S?^sU7ttZZu8Y~L!pz%4~ z71Xc!Vrb2HQuz76$^g!%6}DwkPmUcT^n!jq>$!EU{As>iE*RwVGhlp9n}WU5$C+0a z&8fS-F46QO>D87~Y#hv^TT$OecUp(paEM4~0}bhizdzr((?B-cO(OG%A?|nX5Q`QD zmtp5+ar#U>J47+w^fWvDou7u1>*>@3JJ%n(`(3WW;n|@0gow4|O$T9)11#PQ*YKFx z=so9GUeotSq~`-=hYxO1#+Hiz$p;-WgzPV*_!`;ZHtvJZ+S~!?f9N(}`3~47s^9e? zTxo|He~H*oGueu}->0w1Gq`nZaBwu`{34i8?uln%;PU_L_1N$$i<#a=LST*$Jd>Zf z&Z{bYUhtle=Ii|p+5FC%F5Sj&UA|J@az5@;9?tWS!QM9iz3dkJNfIN+$5Ms^F;n}&O8LcX>@i69m!ImE z*5T!}JqA4H6;I_&h3V6rUKBCxz}Uov^-q?1OM~_Lo_M!-vfZ1{miN58X9G1Pk9@Yo zg#H5I`H-nodd+bjS#G2pB$?F29Y$3upy(T=g(&iP`oxs;JGTMKt-PzDt?4U&uCa3a z2w$E=ljY9#dn*ql3kI5;WP1i3`d!I`Cr?H=+R90ftwRbM3x7TF*{fh zCjQ2~H4!ZtD;^-{wDcKfXI)p@n_eAWNeNo{v@DOgyLvOsc=5n(@h%i{qffl!s-x%5 z@$afo?h3W`c!1G57+7+MoITXqx8@M|cuw;Mlk)!!_zsy4nx-i_l3gqRh0&ik-G+iG zMyyag{^X;U&sFBr@PWhd@g+5=X*1J5u++sI zu&#{alSlI>6`1q8!)B8E(AT4#G12?rQ4)sZTJw)Tazp#X_wV73TZU(##cwe#NShEJ zTz*r|E&cGj4KN1!@%`G*{b>VRz5Jc(nbfjjC@qpSLJd^qQF+PPiw|Y>vC{y-+YdQQ)yrHnSGf$Ia)$T!^?zf_-db}~ z(x=y)4z7pCbB`qU)odI&^_%LcFRwlgzcU_&xlB@M^6!+NbiA=$4RX+|z}|7aXinn% zSmDI;YT7o9xC;O;%|FavmycX`F@$YCXj??#c$eAd&>fr5S6e#sd%iBqmQN0G%x#Wz zK97f9SHVB#qaT+`1mqW!^g*|3tzAdAqA0>COXrR zd0q;iGOUI{`P1v+=XabLjjb;LZ<-$2I&{hT$}c|8uVg5PnjezB`9DP;zS6@)5QAZX|{wbCO>5g9eErh_Zr zfH&1gwG+-0%IAwU*W6;)Lb!F!&CrPvrm2*AE{ScJh|^zd>_?| z>%

    b&@A1h+ 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

    KF2e{AVXjTrJ)l^I0EEbJcvp66@o&4 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͹-6x2RB_Z=_b$7h&M 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̒qE2FE$9i$Jjmk%`i5wRM-5X2u3SR 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 z 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 Z{{gKyFEqahVO0PC002ovPDHLkV1fxi2si)$ literal 0 HcmV?d00001 diff --git a/fastlane/metadata/android/en-US/images/icon.png b/fastlane/metadata/android/en-US/images/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..325bf570f53b0caef40c45fcf76951a119e25e64 GIT binary patch literal 100546 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

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

    >=g-1VKVJOp=M4~$y}h*ZvNd=$*lGB+^oL^y2 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