From 7c32b35857a80af6b67ddc2635520ee91f237843 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jorge=20Mart=C3=ADn?= Date: Tue, 21 Oct 2025 14:10:48 +0200 Subject: [PATCH 01/46] Setting version for the release 25.10.1 --- plugins/src/main/kotlin/Versions.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/src/main/kotlin/Versions.kt b/plugins/src/main/kotlin/Versions.kt index 52c09434d4..673f3cb724 100644 --- a/plugins/src/main/kotlin/Versions.kt +++ b/plugins/src/main/kotlin/Versions.kt @@ -44,7 +44,7 @@ private const val versionMonth = 10 * Release number in the month. Value must be in [0,99]. * Do not update this value. it is updated by the release script. */ -private const val versionReleaseNumber = 0 +private const val versionReleaseNumber = 1 object Versions { /** From d2dc9adfe4aba46937283cd4e8be45b4beb8db4b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jorge=20Mart=C3=ADn?= Date: Tue, 21 Oct 2025 14:15:10 +0200 Subject: [PATCH 02/46] Adding fastlane file for version 25.10.1 --- fastlane/metadata/android/en-US/changelogs/202510010.txt | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 fastlane/metadata/android/en-US/changelogs/202510010.txt 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 0000000000..3c916fed88 --- /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 From 5c88c783165a5184ff633aa7f82d0994a51ede70 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Sat, 25 Oct 2025 00:13:11 +0000 Subject: [PATCH 03/46] chore(deps): update github artifact actions --- .github/workflows/build.yml | 4 ++-- .github/workflows/build_enterprise.yml | 2 +- .github/workflows/maestro-local.yml | 6 +++--- .github/workflows/nightlyReports.yml | 4 ++-- .github/workflows/quality.yml | 10 +++++----- .github/workflows/release.yml | 6 +++--- .github/workflows/tests.yml | 4 ++-- 7 files changed, 18 insertions(+), 18 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index cf7f262cee..6c77cb3770 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -53,7 +53,7 @@ jobs: run: ./gradlew :app:assembleGplayDebug app:assembleFDroidDebug -PallWarningsAsErrors=true $CI_GRADLE_ARG_PROPERTIES - name: Upload debug APKs if: ${{ matrix.variant == 'debug' }} - uses: actions/upload-artifact@v4 + uses: actions/upload-artifact@v5 with: name: elementx-debug path: | @@ -61,7 +61,7 @@ jobs: app/build/outputs/apk/fdroid/debug/*-universal-debug.apk - name: Upload x86_64 APK for Maestro if: ${{ matrix.variant == 'debug' }} - uses: actions/upload-artifact@v4 + uses: actions/upload-artifact@v5 with: name: elementx-apk-maestro path: | diff --git a/.github/workflows/build_enterprise.yml b/.github/workflows/build_enterprise.yml index 0d9b5949cc..bce9d923f3 100644 --- a/.github/workflows/build_enterprise.yml +++ b/.github/workflows/build_enterprise.yml @@ -61,7 +61,7 @@ jobs: run: ./gradlew :app:assembleGplayDebug -PallWarningsAsErrors=true $CI_GRADLE_ARG_PROPERTIES - name: Upload debug Enterprise APKs if: ${{ matrix.variant == 'debug' }} - uses: actions/upload-artifact@v4 + uses: actions/upload-artifact@v5 with: name: elementx-enterprise-debug path: | diff --git a/.github/workflows/maestro-local.yml b/.github/workflows/maestro-local.yml index 7481bec0ba..ff0ac49f5c 100644 --- a/.github/workflows/maestro-local.yml +++ b/.github/workflows/maestro-local.yml @@ -44,7 +44,7 @@ jobs: ELEMENT_ANDROID_MAPTILER_LIGHT_MAP_ID: ${{ secrets.MAPTILER_LIGHT_MAP_ID }} ELEMENT_ANDROID_MAPTILER_DARK_MAP_ID: ${{ secrets.MAPTILER_DARK_MAP_ID }} - name: Upload APK as artifact - uses: actions/upload-artifact@v4 + uses: actions/upload-artifact@v5 with: name: elementx-apk-maestro path: | @@ -69,7 +69,7 @@ jobs: # https://github.com/actions/checkout/issues/881 ref: ${{ github.ref }} - name: Download APK artifact from previous job - uses: actions/download-artifact@v5 + uses: actions/download-artifact@v6 with: name: elementx-apk-maestro - name: Enable KVM group perms @@ -102,7 +102,7 @@ jobs: script: | .github/workflows/scripts/maestro/maestro-local-with-screen-recording.sh app-gplay-x86_64-debug.apk - name: Upload test results - uses: actions/upload-artifact@v4 + uses: actions/upload-artifact@v5 with: name: test-results path: | diff --git a/.github/workflows/nightlyReports.yml b/.github/workflows/nightlyReports.yml index 537565743e..080cf99b05 100644 --- a/.github/workflows/nightlyReports.yml +++ b/.github/workflows/nightlyReports.yml @@ -42,7 +42,7 @@ jobs: - name: ✅ Upload kover report if: always() - uses: actions/upload-artifact@v4 + uses: actions/upload-artifact@v5 with: name: kover-results path: | @@ -74,7 +74,7 @@ jobs: run: ./gradlew dependencyCheckAnalyze $CI_GRADLE_ARG_PROPERTIES - name: Upload dependency analysis if: always() - uses: actions/upload-artifact@v4 + uses: actions/upload-artifact@v5 with: name: dependency-analysis path: build/reports/dependency-check-report.html diff --git a/.github/workflows/quality.yml b/.github/workflows/quality.yml index 5277cbdf05..1b46f1373c 100644 --- a/.github/workflows/quality.yml +++ b/.github/workflows/quality.yml @@ -97,7 +97,7 @@ jobs: run: ./gradlew :tests:konsist:testDebugUnitTest $CI_GRADLE_ARG_PROPERTIES --no-daemon - name: Upload reports if: always() - uses: actions/upload-artifact@v4 + uses: actions/upload-artifact@v5 with: name: konsist-report path: | @@ -174,7 +174,7 @@ jobs: run: ./gradlew :app:lintGplayDebug :app:lintFdroidDebug lintDebug $CI_GRADLE_ARG_PROPERTIES --continue - name: Upload reports if: always() - uses: actions/upload-artifact@v4 + uses: actions/upload-artifact@v5 with: name: linting-report path: | @@ -214,7 +214,7 @@ jobs: run: ./gradlew detekt $CI_GRADLE_ARG_PROPERTIES --no-daemon - name: Upload reports if: always() - uses: actions/upload-artifact@v4 + uses: actions/upload-artifact@v5 with: name: detekt-report path: | @@ -254,7 +254,7 @@ jobs: run: ./gradlew ktlintCheck $CI_GRADLE_ARG_PROPERTIES - name: Upload reports if: always() - uses: actions/upload-artifact@v4 + uses: actions/upload-artifact@v5 with: name: ktlint-report path: | @@ -317,7 +317,7 @@ jobs: # https://github.com/actions/checkout/issues/881 ref: ${{ github.event_name == 'pull_request' && github.event.pull_request.head.sha || github.ref }} - name: Download reports from previous jobs - uses: actions/download-artifact@v5 + uses: actions/download-artifact@v6 - name: Prepare Danger if: always() run: | diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 2cce85bd5a..29ff4a5373 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -38,7 +38,7 @@ jobs: ELEMENT_CALL_RAGESHAKE_URL: ${{ secrets.ELEMENT_CALL_RAGESHAKE_URL }} run: ./gradlew bundleGplayRelease $CI_GRADLE_ARG_PROPERTIES - name: Upload bundle as artifact - uses: actions/upload-artifact@v4 + uses: actions/upload-artifact@v5 with: name: elementx-app-gplay-bundle-unsigned path: | @@ -74,7 +74,7 @@ jobs: ELEMENT_ANDROID_MAPTILER_DARK_MAP_ID: ${{ secrets.MAPTILER_DARK_MAP_ID }} run: ./gradlew bundleGplayRelease $CI_GRADLE_ARG_PROPERTIES - name: Upload bundle as artifact - uses: actions/upload-artifact@v4 + uses: actions/upload-artifact@v5 with: name: elementx-enterprise-app-gplay-bundle-unsigned path: | @@ -102,7 +102,7 @@ jobs: ELEMENT_ANDROID_MAPTILER_DARK_MAP_ID: ${{ secrets.MAPTILER_DARK_MAP_ID }} run: ./gradlew assembleFdroidRelease $CI_GRADLE_ARG_PROPERTIES - name: Upload apks as artifact - uses: actions/upload-artifact@v4 + uses: actions/upload-artifact@v5 with: name: elementx-app-fdroid-apks-unsigned path: | diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index 22c302cbb3..4965530b5a 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -61,7 +61,7 @@ jobs: - name: 🚫 Upload kover failed coverage reports if: failure() - uses: actions/upload-artifact@v4 + uses: actions/upload-artifact@v5 with: name: kover-error-report path: | @@ -73,7 +73,7 @@ jobs: - name: 🚫 Upload test results on error if: failure() - uses: actions/upload-artifact@v4 + uses: actions/upload-artifact@v5 with: name: tests-and-screenshot-tests-results path: | From 09a18ad7ca8787968c1ece9f7b2360417d40e403 Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Wed, 29 Oct 2025 10:30:30 +0100 Subject: [PATCH 04/46] Rename fun in Callback for clarity. --- .../appnav/LoggedInAppScopeFlowNode.kt | 12 +- .../android/appnav/LoggedInFlowNode.kt | 54 ++++----- .../android/appnav/NotLoggedInFlowNode.kt | 6 +- .../io/element/android/appnav/RootFlowNode.kt | 8 +- .../room/joined/JoinedRoomLoadedFlowNode.kt | 42 +++---- .../appnav/JoinedRoomLoadedFlowNodeTest.kt | 2 +- .../FtueSessionVerificationFlowNode.kt | 11 +- .../ChooseSelfVerificationModeNode.kt | 16 +-- .../features/home/api/HomeEntryPoint.kt | 14 +-- .../features/home/impl/HomeFlowNode.kt | 14 +-- .../home/impl/DefaultHomeEntryPointTest.kt | 14 +-- .../licenses/impl/DependenciesFlowNode.kt | 2 +- .../impl/list/DependencyLicensesListNode.kt | 4 +- .../settings/LockScreenSettingsFlowNode.kt | 2 +- .../impl/settings/LockScreenSettingsNode.kt | 4 +- .../features/login/api/LoginEntryPoint.kt | 2 +- .../features/login/impl/LoginFlowNode.kt | 32 +++--- .../login/impl/qrcode/QrCodeLoginFlowNode.kt | 8 +- .../ChangeAccountProviderNode.kt | 4 +- .../ChooseAccountProviderNode.kt | 12 +- .../ConfirmAccountProviderNode.kt | 16 +-- .../impl/screens/onboarding/OnBoardingNode.kt | 28 ++--- .../screens/qrcode/intro/QrCodeIntroNode.kt | 8 +- .../screens/qrcode/scan/QrCodeScanNode.kt | 8 +- .../login/impl/DefaultLoginEntryPointTest.kt | 2 +- .../features/logout/api/LogoutEntryPoint.kt | 2 +- .../features/logout/impl/LogoutNode.kt | 2 +- .../impl/DefaultLogoutEntryPointTest.kt | 2 +- .../messages/api/MessagesEntryPoint.kt | 8 +- .../messages/impl/MessagesFlowNode.kt | 98 ++++++++-------- .../messages/impl/MessagesNavigator.kt | 14 +-- .../features/messages/impl/MessagesNode.kt | 108 +++++++++--------- .../messages/impl/MessagesPresenter.kt | 10 +- .../MessageComposerPresenter.kt | 2 +- .../list/PinnedMessagesListNavigator.kt | 6 +- .../pinned/list/PinnedMessagesListNode.kt | 40 +++---- .../list/PinnedMessagesListPresenter.kt | 6 +- .../impl/threads/ThreadedMessagesNode.kt | 82 ++++++------- .../impl/timeline/TimelinePresenter.kt | 10 +- .../impl/DefaultMessagesEntryPointTest.kt | 8 +- .../messages/impl/FakeMessagesNavigator.kt | 14 +-- .../list/FakePinnedMessagesListNavigator.kt | 6 +- .../poll/impl/history/PollHistoryFlowNode.kt | 2 +- .../poll/impl/history/PollHistoryNode.kt | 4 +- .../preferences/api/PreferencesEntryPoint.kt | 10 +- .../preferences/impl/PreferencesFlowNode.kt | 56 ++++----- .../preferences/impl/about/AboutNode.kt | 4 +- .../impl/developer/DeveloperSettingsNode.kt | 8 +- .../notifications/NotificationSettingsNode.kt | 16 +-- .../EditDefaultNotificationSettingNode.kt | 8 +- .../impl/root/PreferencesRootNode.kt | 56 ++++----- .../impl/DefaultPreferencesEntryPointTest.kt | 10 +- .../impl/bugreport/BugReportFlowNode.kt | 2 +- .../rageshake/impl/bugreport/BugReportNode.kt | 4 +- .../roomdetails/api/RoomDetailsEntryPoint.kt | 8 +- .../roomdetails/impl/RoomDetailsFlowNode.kt | 76 ++++++------ .../roomdetails/impl/RoomDetailsNode.kt | 60 +++++----- .../impl/members/RoomMemberListNode.kt | 8 +- .../members/details/RoomMemberDetailsNode.kt | 12 +- .../RoomNotificationSettingsNode.kt | 8 +- .../impl/DefaultRoomDetailsEntryPointTest.kt | 8 +- .../api/RoomDirectoryEntryPoint.kt | 2 +- .../impl/root/RoomDirectoryNode.kt | 2 +- .../DefaultRoomDirectoryEntryPointTest.kt | 2 +- .../securebackup/impl/SecureBackupFlowNode.kt | 8 +- .../impl/root/SecureBackupRootNode.kt | 16 +-- .../features/space/api/SpaceEntryPoint.kt | 7 +- .../features/space/impl/SpaceFlowNode.kt | 12 +- .../features/space/impl/root/SpaceNode.kt | 15 ++- .../space/impl/DefaultSpaceEntryPointTest.kt | 6 +- .../startchat/api/StartChatEntryPoint.kt | 4 +- .../features/startchat/StartChatNavigator.kt | 5 +- .../startchat/impl/StartChatFlowNode.kt | 6 +- .../JoinRoomByAddressPresenter.kt | 2 +- .../startchat/impl/root/StartChatNode.kt | 2 +- .../impl/DefaultStartChatEntryPointTest.kt | 4 +- .../startchat/impl/FakeStartChatNavigator.kt | 2 +- .../userprofile/api/UserProfileEntryPoint.kt | 2 +- .../userprofile/impl/UserProfileFlowNode.kt | 14 +-- .../userprofile/impl/root/UserProfileNode.kt | 8 +- .../impl/DefaultUserProfileEntryPointTest.kt | 2 +- .../shared/UserProfileNodeHelper.kt | 8 +- .../api/OutgoingVerificationEntryPoint.kt | 2 +- .../impl/outgoing/OutgoingVerificationNode.kt | 2 +- ...faultOutgoingVerificationEntryPointTest.kt | 2 +- .../viewfolder/impl/folder/ViewFolderNode.kt | 4 +- .../impl/root/ViewFolderFlowNode.kt | 2 +- .../api/AccountSelectEntryPoint.kt | 2 +- .../accountselect/impl/AccountSelectNode.kt | 6 +- .../DefaultAccountSelectEntryPointTest.kt | 2 +- .../mediaviewer/api/MediaGalleryEntryPoint.kt | 4 +- .../mediaviewer/api/MediaViewerEntryPoint.kt | 4 +- .../impl/gallery/MediaGalleryNode.kt | 12 +- .../impl/gallery/root/MediaGalleryFlowNode.kt | 16 +-- .../impl/viewer/MediaViewerNode.kt | 4 +- .../impl/DefaultMediaGalleryEntryPointTest.kt | 4 +- .../impl/DefaultMediaViewerEntryPointTest.kt | 8 +- .../roomselect/impl/RoomSelectNode.kt | 4 +- .../api/NotificationTroubleShootEntryPoint.kt | 2 +- .../troubleshoot/api/PushHistoryEntryPoint.kt | 2 +- .../impl/TroubleshootNotificationsNode.kt | 2 +- .../impl/history/PushHistoryNode.kt | 2 +- ...tNotificationTroubleShootEntryPointTest.kt | 2 +- .../DefaultPushHistoryEntryPointTest.kt | 2 +- 104 files changed, 658 insertions(+), 664 deletions(-) diff --git a/appnav/src/main/kotlin/io/element/android/appnav/LoggedInAppScopeFlowNode.kt b/appnav/src/main/kotlin/io/element/android/appnav/LoggedInAppScopeFlowNode.kt index 9ae5aa38fe..47681dc624 100644 --- a/appnav/src/main/kotlin/io/element/android/appnav/LoggedInAppScopeFlowNode.kt +++ b/appnav/src/main/kotlin/io/element/android/appnav/LoggedInAppScopeFlowNode.kt @@ -56,8 +56,8 @@ class LoggedInAppScopeFlowNode( plugins = plugins ), DependencyInjectionGraphOwner { interface Callback : Plugin { - fun onOpenBugReport() - fun onAddAccount() + fun navigateToBugReport() + fun navigateToAddAccount() } @Parcelize @@ -81,12 +81,12 @@ class LoggedInAppScopeFlowNode( override fun resolve(navTarget: NavTarget, buildContext: BuildContext): Node { val callback = object : LoggedInFlowNode.Callback { - override fun onOpenBugReport() { - plugins().forEach { it.onOpenBugReport() } + override fun navigateToBugReport() { + plugins().forEach { it.navigateToBugReport() } } - override fun onAddAccount() { - plugins().forEach { it.onAddAccount() } + override fun navigateToAddAccount() { + plugins().forEach { it.navigateToAddAccount() } } } return createNode(buildContext, listOf(callback)) diff --git a/appnav/src/main/kotlin/io/element/android/appnav/LoggedInFlowNode.kt b/appnav/src/main/kotlin/io/element/android/appnav/LoggedInFlowNode.kt index 090ed70fe2..dc6ad19f4b 100644 --- a/appnav/src/main/kotlin/io/element/android/appnav/LoggedInFlowNode.kt +++ b/appnav/src/main/kotlin/io/element/android/appnav/LoggedInFlowNode.kt @@ -148,8 +148,8 @@ class LoggedInFlowNode( plugins = plugins ) { interface Callback : Plugin { - fun onOpenBugReport() - fun onAddAccount() + fun navigateToBugReport() + fun navigateToAddAccount() } private val loggedInFlowProcessor = LoggedInEventProcessor( @@ -282,7 +282,7 @@ class LoggedInFlowNode( data object Ftue : NavTarget @Parcelize - data object RoomDirectorySearch : NavTarget + data object RoomDirectory : NavTarget @Parcelize data class IncomingShare(val intent: Intent) : NavTarget @@ -304,32 +304,32 @@ class LoggedInFlowNode( } NavTarget.Home -> { val callback = object : HomeEntryPoint.Callback { - override fun onRoomClick(roomId: RoomId) { + override fun navigateToRoom(roomId: RoomId) { backstack.push(NavTarget.Room(roomId.toRoomIdOrAlias())) } - override fun onSettingsClick() { + override fun navigateToSettings() { backstack.push(NavTarget.Settings()) } - override fun onStartChatClick() { + override fun navigateToCreateRoom() { backstack.push(NavTarget.CreateRoom) } - override fun onSetUpRecoveryClick() { + override fun navigateToSetUpRecovery() { backstack.push(NavTarget.SecureBackup(initialElement = SecureBackupEntryPoint.InitialTarget.Root)) } - override fun onSessionConfirmRecoveryKeyClick() { + override fun navigateToEnterRecoveryKey() { backstack.push(NavTarget.SecureBackup(initialElement = SecureBackupEntryPoint.InitialTarget.EnterRecoveryKey)) } - override fun onRoomSettingsClick(roomId: RoomId) { + override fun navigateToRoomSettings(roomId: RoomId) { backstack.push(NavTarget.Room(roomId.toRoomIdOrAlias(), initialElement = RoomNavigationTarget.Details)) } - override fun onReportBugClick() { - plugins().forEach { it.onOpenBugReport() } + override fun navigateToBugReport() { + plugins().forEach { it.navigateToBugReport() } } } homeEntryPoint @@ -339,11 +339,11 @@ class LoggedInFlowNode( } is NavTarget.Room -> { val joinedRoomCallback = object : JoinedRoomLoadedFlowNode.Callback { - override fun onOpenRoom(roomId: RoomId, serverNames: List) { + override fun navigateToRoom(roomId: RoomId, serverNames: List) { backstack.push(NavTarget.Room(roomId.toRoomIdOrAlias(), serverNames)) } - override fun onPermalinkClick(data: PermalinkData, pushToBackstack: Boolean) { + override fun handlePermalinkClick(data: PermalinkData, pushToBackstack: Boolean) { when (data) { is PermalinkData.UserLink -> { // Should not happen (handled by MessagesNode) @@ -369,7 +369,7 @@ class LoggedInFlowNode( } } - override fun onOpenGlobalNotificationSettings() { + override fun navigateToGlobalNotificationSettings() { backstack.push(NavTarget.Settings(PreferencesEntryPoint.InitialTarget.NotificationSettings)) } } @@ -384,7 +384,7 @@ class LoggedInFlowNode( } is NavTarget.UserProfile -> { val callback = object : UserProfileEntryPoint.Callback { - override fun onOpenRoom(roomId: RoomId) { + override fun navigateToRoom(roomId: RoomId) { backstack.push(NavTarget.Room(roomId.toRoomIdOrAlias())) } } @@ -395,23 +395,23 @@ class LoggedInFlowNode( } is NavTarget.Settings -> { val callback = object : PreferencesEntryPoint.Callback { - override fun onAddAccount() { - plugins().forEach { it.onAddAccount() } + override fun navigateToAddAccount() { + plugins().forEach { it.navigateToAddAccount() } } - override fun onOpenBugReport() { - plugins().forEach { it.onOpenBugReport() } + override fun navigateToBugReport() { + plugins().forEach { it.navigateToBugReport() } } - override fun onSecureBackupClick() { + override fun navigateToSecureBackup() { backstack.push(NavTarget.SecureBackup()) } - override fun onOpenRoomNotificationSettings(roomId: RoomId) { + override fun navigateToRoomNotificationSettings(roomId: RoomId) { backstack.push(NavTarget.Room(roomId.toRoomIdOrAlias(), initialElement = RoomNavigationTarget.NotificationSettings)) } - override fun navigateTo(roomId: RoomId, eventId: EventId) { + override fun navigateToEvent(roomId: RoomId, eventId: EventId) { backstack.push(NavTarget.Room(roomId.toRoomIdOrAlias(), initialElement = RoomNavigationTarget.Root(eventId))) } } @@ -423,12 +423,12 @@ class LoggedInFlowNode( } NavTarget.CreateRoom -> { val callback = object : StartChatEntryPoint.Callback { - override fun onOpenRoom(roomIdOrAlias: RoomIdOrAlias, serverNames: List) { + override fun onRoomCreated(roomIdOrAlias: RoomIdOrAlias, serverNames: List) { backstack.replace(NavTarget.Room(roomIdOrAlias = roomIdOrAlias, serverNames = serverNames)) } - override fun onOpenRoomDirectory() { - backstack.push(NavTarget.RoomDirectorySearch) + override fun navigateToRoomDirectory() { + backstack.push(NavTarget.RoomDirectory) } } @@ -450,10 +450,10 @@ class LoggedInFlowNode( NavTarget.Ftue -> { ftueEntryPoint.createNode(this, buildContext) } - NavTarget.RoomDirectorySearch -> { + NavTarget.RoomDirectory -> { roomDirectoryEntryPoint.nodeBuilder(this, buildContext) .callback(object : RoomDirectoryEntryPoint.Callback { - override fun onResultClick(roomDescription: RoomDescription) { + override fun navigateToRoom(roomDescription: RoomDescription) { backstack.push( NavTarget.Room( roomIdOrAlias = roomDescription.roomId.toRoomIdOrAlias(), diff --git a/appnav/src/main/kotlin/io/element/android/appnav/NotLoggedInFlowNode.kt b/appnav/src/main/kotlin/io/element/android/appnav/NotLoggedInFlowNode.kt index 08bdbadde6..f3c92f4407 100644 --- a/appnav/src/main/kotlin/io/element/android/appnav/NotLoggedInFlowNode.kt +++ b/appnav/src/main/kotlin/io/element/android/appnav/NotLoggedInFlowNode.kt @@ -55,7 +55,7 @@ class NotLoggedInFlowNode( ) : NodeInputs interface Callback : Plugin { - fun onOpenBugReport() + fun navigateToBugReport() } private val inputs = inputs() @@ -78,8 +78,8 @@ class NotLoggedInFlowNode( return when (navTarget) { NavTarget.Root -> { val callback = object : LoginEntryPoint.Callback { - override fun onReportProblem() { - plugins().forEach { it.onOpenBugReport() } + override fun navigateToBugReport() { + plugins().forEach { it.navigateToBugReport() } } } loginEntryPoint diff --git a/appnav/src/main/kotlin/io/element/android/appnav/RootFlowNode.kt b/appnav/src/main/kotlin/io/element/android/appnav/RootFlowNode.kt index dc4e169d53..676cc75767 100644 --- a/appnav/src/main/kotlin/io/element/android/appnav/RootFlowNode.kt +++ b/appnav/src/main/kotlin/io/element/android/appnav/RootFlowNode.kt @@ -227,11 +227,11 @@ class RootFlowNode( } val inputs = LoggedInAppScopeFlowNode.Inputs(matrixClient) val callback = object : LoggedInAppScopeFlowNode.Callback { - override fun onOpenBugReport() { + override fun navigateToBugReport() { backstack.push(NavTarget.BugReport) } - override fun onAddAccount() { + override fun navigateToAddAccount() { backstack.push(NavTarget.NotLoggedInFlow(null)) } } @@ -239,7 +239,7 @@ class RootFlowNode( } is NavTarget.NotLoggedInFlow -> { val callback = object : NotLoggedInFlowNode.Callback { - override fun onOpenBugReport() { + override fun navigateToBugReport() { backstack.push(NavTarget.BugReport) } } @@ -266,7 +266,7 @@ class RootFlowNode( } is NavTarget.AccountSelect -> { val callback: AccountSelectEntryPoint.Callback = object : AccountSelectEntryPoint.Callback { - override fun onSelectAccount(sessionId: SessionId) { + override fun onAccountSelected(sessionId: SessionId) { lifecycleScope.launch { if (sessionId == navTarget.currentSessionId) { // Ensure that the account selection Node is removed from the backstack 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 index a4e4540b92..154d8c45d0 100644 --- 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 @@ -76,9 +76,9 @@ class JoinedRoomLoadedFlowNode( plugins = plugins, ), DependencyInjectionGraphOwner { interface Callback : Plugin { - fun onOpenRoom(roomId: RoomId, serverNames: List) - fun onPermalinkClick(data: PermalinkData, pushToBackstack: Boolean) - fun onOpenGlobalNotificationSettings() + fun navigateToRoom(roomId: RoomId, serverNames: List) + fun handlePermalinkClick(data: PermalinkData, pushToBackstack: Boolean) + fun navigateToGlobalNotificationSettings() } data class Inputs( @@ -123,19 +123,19 @@ class JoinedRoomLoadedFlowNode( private fun createRoomDetailsNode(buildContext: BuildContext, initialTarget: RoomDetailsEntryPoint.InitialTarget): Node { val callback = object : RoomDetailsEntryPoint.Callback { - override fun onOpenGlobalNotificationSettings() { - callbacks.forEach { it.onOpenGlobalNotificationSettings() } + override fun navigateToGlobalNotificationSettings() { + callbacks.forEach { it.navigateToGlobalNotificationSettings() } } - override fun onOpenRoom(roomId: RoomId, serverNames: List) { - callbacks.forEach { it.onOpenRoom(roomId, serverNames) } + override fun navigateToRoom(roomId: RoomId, serverNames: List) { + callbacks.forEach { it.navigateToRoom(roomId, serverNames) } } - override fun onPermalinkClick(data: PermalinkData, pushToBackstack: Boolean) { - callbacks.forEach { it.onPermalinkClick(data, pushToBackstack) } + override fun handlePermalinkClick(data: PermalinkData, pushToBackstack: Boolean) { + callbacks.forEach { it.handlePermalinkClick(data, pushToBackstack) } } - override fun forwardEvent(eventId: EventId) { + override fun startForwardEventFlow(eventId: EventId) { backstack.push(NavTarget.ForwardEvent(eventId)) } } @@ -172,7 +172,7 @@ class JoinedRoomLoadedFlowNode( override fun onDone(roomIds: List) { backstack.pop() roomIds.singleOrNull()?.let { roomId -> - callbacks.forEach { it.onOpenRoom(roomId, emptyList()) } + callbacks.forEach { it.navigateToRoom(roomId, emptyList()) } } } } @@ -186,15 +186,15 @@ class JoinedRoomLoadedFlowNode( private fun createSpaceNode(buildContext: BuildContext): Node { val callback = object : SpaceEntryPoint.Callback { - override fun onOpenRoom(roomId: RoomId, viaParameters: List) { - callbacks.forEach { it.onOpenRoom(roomId, viaParameters) } + override fun navigateToRoom(roomId: RoomId, viaParameters: List) { + callbacks.forEach { it.navigateToRoom(roomId, viaParameters) } } - override fun onOpenDetails() { + override fun navigateToRoomDetails() { backstack.push(NavTarget.RoomDetails) } - override fun onOpenMemberList() { + override fun navigateToRoomMemberList() { backstack.push(NavTarget.RoomMemberList) } } @@ -209,24 +209,24 @@ class JoinedRoomLoadedFlowNode( navTarget: NavTarget.Messages, ): Node { val callback = object : MessagesEntryPoint.Callback { - override fun onRoomDetailsClick() { + override fun navigateToRoomDetails() { backstack.push(NavTarget.RoomDetails) } - override fun onUserDataClick(userId: UserId) { + override fun navigateToRoomMemberDetails(userId: UserId) { backstack.push(NavTarget.RoomMemberDetails(userId)) } - override fun onPermalinkClick(data: PermalinkData, pushToBackstack: Boolean) { - callbacks.forEach { it.onPermalinkClick(data, pushToBackstack) } + override fun handlePermalinkClick(data: PermalinkData, pushToBackstack: Boolean) { + callbacks.forEach { it.handlePermalinkClick(data, pushToBackstack) } } override fun forwardEvent(eventId: EventId) { backstack.push(NavTarget.ForwardEvent(eventId)) } - override fun openRoom(roomId: RoomId) { - callbacks.forEach { it.onOpenRoom(roomId, emptyList()) } + override fun navigateToRoom(roomId: RoomId) { + callbacks.forEach { it.navigateToRoom(roomId, emptyList()) } } } val params = MessagesEntryPoint.Params( diff --git a/appnav/src/test/kotlin/io/element/android/appnav/JoinedRoomLoadedFlowNodeTest.kt b/appnav/src/test/kotlin/io/element/android/appnav/JoinedRoomLoadedFlowNodeTest.kt index c9eb28397e..d9070b97bc 100644 --- a/appnav/src/test/kotlin/io/element/android/appnav/JoinedRoomLoadedFlowNodeTest.kt +++ b/appnav/src/test/kotlin/io/element/android/appnav/JoinedRoomLoadedFlowNodeTest.kt @@ -212,7 +212,7 @@ class JoinedRoomLoadedFlowNodeTest { ) val roomFlowNodeTestHelper = roomFlowNode.parentNodeTestHelper() // WHEN - fakeMessagesEntryPoint.callback?.onRoomDetailsClick() + fakeMessagesEntryPoint.callback?.navigateToRoomDetails() // THEN roomFlowNodeTestHelper.assertChildHasLifecycle(JoinedRoomLoadedFlowNode.NavTarget.RoomDetails, Lifecycle.State.CREATED) val roomDetailsNode = roomFlowNode.childNode(JoinedRoomLoadedFlowNode.NavTarget.RoomDetails)!! diff --git a/features/ftue/impl/src/main/kotlin/io/element/android/features/ftue/impl/sessionverification/FtueSessionVerificationFlowNode.kt b/features/ftue/impl/src/main/kotlin/io/element/android/features/ftue/impl/sessionverification/FtueSessionVerificationFlowNode.kt index 02a27d381d..b36c5633dc 100644 --- a/features/ftue/impl/src/main/kotlin/io/element/android/features/ftue/impl/sessionverification/FtueSessionVerificationFlowNode.kt +++ b/features/ftue/impl/src/main/kotlin/io/element/android/features/ftue/impl/sessionverification/FtueSessionVerificationFlowNode.kt @@ -82,23 +82,22 @@ class FtueSessionVerificationFlowNode( return when (navTarget) { is NavTarget.Root -> { val callback = object : ChooseSelfVerificationModeNode.Callback { - override fun onUseAnotherDevice() { + override fun navigateToUseAnotherDevice() { backstack.push(NavTarget.UseAnotherDevice) } - override fun onUseRecoveryKey() { + override fun navigateToUseRecoveryKey() { backstack.push(NavTarget.EnterRecoveryKey) } - override fun onResetKey() { + override fun navigateToResetKey() { backstack.push(NavTarget.ResetIdentity) } - override fun onLearnMoreAboutEncryption() { + override fun navigateToLearnMoreAboutEncryption() { learnMoreUrl.value = LearnMoreConfig.DEVICE_VERIFICATION_URL } } - createNode(buildContext, plugins = listOf(callback)) } is NavTarget.UseAnotherDevice -> { @@ -116,7 +115,7 @@ class FtueSessionVerificationFlowNode( backstack.pop() } - override fun onLearnMoreAboutEncryption() { + override fun navigateToLearnMoreAboutEncryption() { // Note that this callback is never called. The "Learn more" link is not displayed // for the self session interactive verification. } diff --git a/features/ftue/impl/src/main/kotlin/io/element/android/features/ftue/impl/sessionverification/choosemode/ChooseSelfVerificationModeNode.kt b/features/ftue/impl/src/main/kotlin/io/element/android/features/ftue/impl/sessionverification/choosemode/ChooseSelfVerificationModeNode.kt index 99409ac2d2..d5a0f91ed7 100644 --- a/features/ftue/impl/src/main/kotlin/io/element/android/features/ftue/impl/sessionverification/choosemode/ChooseSelfVerificationModeNode.kt +++ b/features/ftue/impl/src/main/kotlin/io/element/android/features/ftue/impl/sessionverification/choosemode/ChooseSelfVerificationModeNode.kt @@ -29,10 +29,10 @@ class ChooseSelfVerificationModeNode( private val directLogoutView: DirectLogoutView, ) : Node(buildContext, plugins = plugins) { interface Callback : Plugin { - fun onUseAnotherDevice() - fun onUseRecoveryKey() - fun onResetKey() - fun onLearnMoreAboutEncryption() + fun navigateToUseAnotherDevice() + fun navigateToUseRecoveryKey() + fun navigateToResetKey() + fun navigateToLearnMoreAboutEncryption() } private val callback = plugins().first() @@ -43,10 +43,10 @@ class ChooseSelfVerificationModeNode( ChooseSelfVerificationModeView( state = state, - onUseAnotherDevice = callback::onUseAnotherDevice, - onUseRecoveryKey = callback::onUseRecoveryKey, - onResetKey = callback::onResetKey, - onLearnMore = callback::onLearnMoreAboutEncryption, + onUseAnotherDevice = callback::navigateToUseAnotherDevice, + onUseRecoveryKey = callback::navigateToUseRecoveryKey, + onResetKey = callback::navigateToResetKey, + onLearnMore = callback::navigateToLearnMoreAboutEncryption, modifier = modifier, ) diff --git a/features/home/api/src/main/kotlin/io/element/android/features/home/api/HomeEntryPoint.kt b/features/home/api/src/main/kotlin/io/element/android/features/home/api/HomeEntryPoint.kt index 9beb147568..daf020f26c 100644 --- a/features/home/api/src/main/kotlin/io/element/android/features/home/api/HomeEntryPoint.kt +++ b/features/home/api/src/main/kotlin/io/element/android/features/home/api/HomeEntryPoint.kt @@ -21,12 +21,12 @@ interface HomeEntryPoint : FeatureEntryPoint { } interface Callback : Plugin { - fun onRoomClick(roomId: RoomId) - fun onStartChatClick() - fun onSettingsClick() - fun onSetUpRecoveryClick() - fun onSessionConfirmRecoveryKeyClick() - fun onRoomSettingsClick(roomId: RoomId) - fun onReportBugClick() + fun navigateToRoom(roomId: RoomId) + fun navigateToCreateRoom() + fun navigateToSettings() + fun navigateToSetUpRecovery() + fun navigateToEnterRecoveryKey() + fun navigateToRoomSettings(roomId: RoomId) + fun navigateToBugReport() } } diff --git a/features/home/impl/src/main/kotlin/io/element/android/features/home/impl/HomeFlowNode.kt b/features/home/impl/src/main/kotlin/io/element/android/features/home/impl/HomeFlowNode.kt index cb205960fd..7245db296e 100644 --- a/features/home/impl/src/main/kotlin/io/element/android/features/home/impl/HomeFlowNode.kt +++ b/features/home/impl/src/main/kotlin/io/element/android/features/home/impl/HomeFlowNode.kt @@ -116,27 +116,27 @@ class HomeFlowNode( } private fun onRoomClick(roomId: RoomId) { - plugins().forEach { it.onRoomClick(roomId) } + plugins().forEach { it.navigateToRoom(roomId) } } private fun onOpenSettings() { - plugins().forEach { it.onSettingsClick() } + plugins().forEach { it.navigateToSettings() } } private fun onStartChatClick() { - plugins().forEach { it.onStartChatClick() } + plugins().forEach { it.navigateToCreateRoom() } } private fun onSetUpRecoveryClick() { - plugins().forEach { it.onSetUpRecoveryClick() } + plugins().forEach { it.navigateToSetUpRecovery() } } private fun onSessionConfirmRecoveryKeyClick() { - plugins().forEach { it.onSessionConfirmRecoveryKeyClick() } + plugins().forEach { it.navigateToEnterRecoveryKey() } } private fun onRoomSettingsClick(roomId: RoomId) { - plugins().forEach { it.onRoomSettingsClick(roomId) } + plugins().forEach { it.navigateToRoomSettings(roomId) } } private fun onReportRoomClick(roomId: RoomId) { @@ -153,7 +153,7 @@ class HomeFlowNode( inviteFriendsUseCase.execute(activity) } RoomListMenuAction.ReportBug -> { - plugins().forEach { it.onReportBugClick() } + plugins().forEach { it.navigateToBugReport() } } } } diff --git a/features/home/impl/src/test/kotlin/io/element/android/features/home/impl/DefaultHomeEntryPointTest.kt b/features/home/impl/src/test/kotlin/io/element/android/features/home/impl/DefaultHomeEntryPointTest.kt index 7d0c95befd..b2cbea8d76 100644 --- a/features/home/impl/src/test/kotlin/io/element/android/features/home/impl/DefaultHomeEntryPointTest.kt +++ b/features/home/impl/src/test/kotlin/io/element/android/features/home/impl/DefaultHomeEntryPointTest.kt @@ -41,13 +41,13 @@ class DefaultHomeEntryPointTest { ) } val callback = object : HomeEntryPoint.Callback { - override fun onRoomClick(roomId: RoomId) = lambdaError() - override fun onStartChatClick() = lambdaError() - override fun onSettingsClick() = lambdaError() - override fun onSetUpRecoveryClick() = lambdaError() - override fun onSessionConfirmRecoveryKeyClick() = lambdaError() - override fun onRoomSettingsClick(roomId: RoomId) = lambdaError() - override fun onReportBugClick() = lambdaError() + override fun navigateToRoom(roomId: RoomId) = lambdaError() + override fun navigateToCreateRoom() = lambdaError() + override fun navigateToSettings() = lambdaError() + override fun navigateToSetUpRecovery() = lambdaError() + override fun navigateToEnterRecoveryKey() = lambdaError() + override fun navigateToRoomSettings(roomId: RoomId) = lambdaError() + override fun navigateToBugReport() = lambdaError() } val result = entryPoint.nodeBuilder(parentNode, BuildContext.root(null)) .callback(callback) diff --git a/features/licenses/impl/src/main/kotlin/io/element/android/features/licenses/impl/DependenciesFlowNode.kt b/features/licenses/impl/src/main/kotlin/io/element/android/features/licenses/impl/DependenciesFlowNode.kt index 30e094e38e..ab16092065 100644 --- a/features/licenses/impl/src/main/kotlin/io/element/android/features/licenses/impl/DependenciesFlowNode.kt +++ b/features/licenses/impl/src/main/kotlin/io/element/android/features/licenses/impl/DependenciesFlowNode.kt @@ -52,7 +52,7 @@ class DependenciesFlowNode( return when (navTarget) { is NavTarget.LicensesList -> { val callback = object : DependencyLicensesListNode.Callback { - override fun onOpenLicense(license: DependencyLicenseItem) { + override fun navigateToLicense(license: DependencyLicenseItem) { backstack.push(NavTarget.LicenseDetails(license)) } } diff --git a/features/licenses/impl/src/main/kotlin/io/element/android/features/licenses/impl/list/DependencyLicensesListNode.kt b/features/licenses/impl/src/main/kotlin/io/element/android/features/licenses/impl/list/DependencyLicensesListNode.kt index 7280c2ad41..56faebe71b 100644 --- a/features/licenses/impl/src/main/kotlin/io/element/android/features/licenses/impl/list/DependencyLicensesListNode.kt +++ b/features/licenses/impl/src/main/kotlin/io/element/android/features/licenses/impl/list/DependencyLicensesListNode.kt @@ -30,12 +30,12 @@ class DependencyLicensesListNode( plugins = plugins ) { interface Callback : Plugin { - fun onOpenLicense(license: DependencyLicenseItem) + fun navigateToLicense(license: DependencyLicenseItem) } private fun onOpenLicense(license: DependencyLicenseItem) { plugins() - .forEach { it.onOpenLicense(license) } + .forEach { it.navigateToLicense(license) } } @Composable diff --git a/features/lockscreen/impl/src/main/kotlin/io/element/android/features/lockscreen/impl/settings/LockScreenSettingsFlowNode.kt b/features/lockscreen/impl/src/main/kotlin/io/element/android/features/lockscreen/impl/settings/LockScreenSettingsFlowNode.kt index 01aeaabe89..1597b584bc 100644 --- a/features/lockscreen/impl/src/main/kotlin/io/element/android/features/lockscreen/impl/settings/LockScreenSettingsFlowNode.kt +++ b/features/lockscreen/impl/src/main/kotlin/io/element/android/features/lockscreen/impl/settings/LockScreenSettingsFlowNode.kt @@ -110,7 +110,7 @@ class LockScreenSettingsFlowNode( } NavTarget.Settings -> { val callback = object : LockScreenSettingsNode.Callback { - override fun onChangePinClick() { + override fun navigateToSetupPin() { backstack.push(NavTarget.SetupPin) } } diff --git a/features/lockscreen/impl/src/main/kotlin/io/element/android/features/lockscreen/impl/settings/LockScreenSettingsNode.kt b/features/lockscreen/impl/src/main/kotlin/io/element/android/features/lockscreen/impl/settings/LockScreenSettingsNode.kt index 5e27b815bc..2dcfb0524e 100644 --- a/features/lockscreen/impl/src/main/kotlin/io/element/android/features/lockscreen/impl/settings/LockScreenSettingsNode.kt +++ b/features/lockscreen/impl/src/main/kotlin/io/element/android/features/lockscreen/impl/settings/LockScreenSettingsNode.kt @@ -26,11 +26,11 @@ class LockScreenSettingsNode( private val presenter: LockScreenSettingsPresenter, ) : Node(buildContext, plugins = plugins) { interface Callback : Plugin { - fun onChangePinClick() + fun navigateToSetupPin() } private fun onChangePinClick() { - plugins().forEach { it.onChangePinClick() } + plugins().forEach { it.navigateToSetupPin() } } @Composable diff --git a/features/login/api/src/main/kotlin/io/element/android/features/login/api/LoginEntryPoint.kt b/features/login/api/src/main/kotlin/io/element/android/features/login/api/LoginEntryPoint.kt index b3ef99ee19..3bb1db478b 100644 --- a/features/login/api/src/main/kotlin/io/element/android/features/login/api/LoginEntryPoint.kt +++ b/features/login/api/src/main/kotlin/io/element/android/features/login/api/LoginEntryPoint.kt @@ -19,7 +19,7 @@ interface LoginEntryPoint : FeatureEntryPoint { ) interface Callback : Plugin { - fun onReportProblem() + fun navigateToBugReport() } fun nodeBuilder(parentNode: Node, buildContext: BuildContext): NodeBuilder diff --git a/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/LoginFlowNode.kt b/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/LoginFlowNode.kt index 4b83190f5d..ce85c617ef 100644 --- a/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/LoginFlowNode.kt +++ b/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/LoginFlowNode.kt @@ -126,13 +126,13 @@ class LoginFlowNode( return when (navTarget) { NavTarget.OnBoarding -> { val callback = object : OnBoardingNode.Callback { - override fun onSignUp() { + override fun navigateToSignUpFlow() { backstack.push( NavTarget.ConfirmAccountProvider(isAccountCreation = true) ) } - override fun onSignIn(mustChooseAccountProvider: Boolean) { + override fun navigateToSignInFlow(mustChooseAccountProvider: Boolean) { backstack.push( if (mustChooseAccountProvider) { NavTarget.ChooseAccountProvider @@ -142,23 +142,23 @@ class LoginFlowNode( ) } - override fun onSignInWithQrCode() { + override fun navigateToQrCode() { backstack.push(NavTarget.QrCode) } - override fun onReportProblem() { - plugins().forEach { it.onReportProblem() } + override fun navigateToBugReport() { + plugins().forEach { it.navigateToBugReport() } } - override fun onOidcDetails(oidcDetails: OidcDetails) { + override fun navigateToOidc(oidcDetails: OidcDetails) { navigateToMas(oidcDetails) } - override fun onCreateAccountContinue(url: String) { + override fun navigateToCreateAccount(url: String) { backstack.push(NavTarget.CreateAccount(url)) } - override fun onLoginPasswordNeeded() { + override fun navigateToLoginPassword() { backstack.push(NavTarget.LoginPassword) } } @@ -171,15 +171,15 @@ class LoginFlowNode( } NavTarget.ChooseAccountProvider -> { val callback = object : ChooseAccountProviderNode.Callback { - override fun onOidcDetails(oidcDetails: OidcDetails) { + override fun navigateToOidc(oidcDetails: OidcDetails) { navigateToMas(oidcDetails) } - override fun onCreateAccountContinue(url: String) { + override fun navigateToCreateAccount(url: String) { backstack.push(NavTarget.CreateAccount(url)) } - override fun onLoginPasswordNeeded() { + override fun navigateToLoginPassword() { backstack.push(NavTarget.LoginPassword) } } @@ -193,19 +193,19 @@ class LoginFlowNode( isAccountCreation = navTarget.isAccountCreation, ) val callback = object : ConfirmAccountProviderNode.Callback { - override fun onOidcDetails(oidcDetails: OidcDetails) { + override fun navigateToOidc(oidcDetails: OidcDetails) { navigateToMas(oidcDetails) } - override fun onCreateAccountContinue(url: String) { + override fun navigateToCreateAccount(url: String) { backstack.push(NavTarget.CreateAccount(url)) } - override fun onLoginPasswordNeeded() { + override fun navigateToLoginPassword() { backstack.push(NavTarget.LoginPassword) } - override fun onChangeAccountProvider() { + override fun navigateToChangeAccountProvider() { backstack.push(NavTarget.ChangeAccountProvider) } } @@ -221,7 +221,7 @@ class LoginFlowNode( backstack.singleTop(confirmAccountProvider) } - override fun onOtherClick() { + override fun navigateToSearchAccountProvider() { backstack.push(NavTarget.SearchAccountProvider) } } diff --git a/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/qrcode/QrCodeLoginFlowNode.kt b/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/qrcode/QrCodeLoginFlowNode.kt index 22dcb9da9c..992bf18590 100644 --- a/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/qrcode/QrCodeLoginFlowNode.kt +++ b/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/qrcode/QrCodeLoginFlowNode.kt @@ -147,11 +147,11 @@ class QrCodeLoginFlowNode( return when (navTarget) { is NavTarget.Initial -> { val callback = object : QrCodeIntroNode.Callback { - override fun onCancelClicked() { + override fun cancel() { navigateUp() } - override fun onContinue() { + override fun navigateToQrCodeScan() { backstack.push(NavTarget.QrCodeScan) } } @@ -159,11 +159,11 @@ class QrCodeLoginFlowNode( } is NavTarget.QrCodeScan -> { val callback = object : QrCodeScanNode.Callback { - override fun onScannedCode(qrCodeLoginData: MatrixQrCodeLoginData) { + override fun handleScannedCode(qrCodeLoginData: MatrixQrCodeLoginData) { lifecycleScope.startAuthentication(qrCodeLoginData) } - override fun onCancelClicked() { + override fun cancel() { backstack.pop() } } diff --git a/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/screens/changeaccountprovider/ChangeAccountProviderNode.kt b/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/screens/changeaccountprovider/ChangeAccountProviderNode.kt index a0587211c0..80de8c6d71 100644 --- a/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/screens/changeaccountprovider/ChangeAccountProviderNode.kt +++ b/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/screens/changeaccountprovider/ChangeAccountProviderNode.kt @@ -29,7 +29,7 @@ class ChangeAccountProviderNode( ) : Node(buildContext, plugins = plugins) { interface Callback : Plugin { fun onDone() - fun onOtherClick() + fun navigateToSearchAccountProvider() } private fun onDone() { @@ -37,7 +37,7 @@ class ChangeAccountProviderNode( } private fun onOtherClick() { - plugins().forEach { it.onOtherClick() } + plugins().forEach { it.navigateToSearchAccountProvider() } } @Composable diff --git a/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/screens/chooseaccountprovider/ChooseAccountProviderNode.kt b/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/screens/chooseaccountprovider/ChooseAccountProviderNode.kt index 128d235c93..02203aaa72 100644 --- a/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/screens/chooseaccountprovider/ChooseAccountProviderNode.kt +++ b/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/screens/chooseaccountprovider/ChooseAccountProviderNode.kt @@ -29,21 +29,21 @@ class ChooseAccountProviderNode( private val presenter: ChooseAccountProviderPresenter, ) : Node(buildContext, plugins = plugins) { interface Callback : Plugin { - fun onLoginPasswordNeeded() - fun onOidcDetails(oidcDetails: OidcDetails) - fun onCreateAccountContinue(url: String) + fun navigateToLoginPassword() + fun navigateToOidc(oidcDetails: OidcDetails) + fun navigateToCreateAccount(url: String) } private fun onOidcDetails(oidcDetails: OidcDetails) { - plugins().forEach { it.onOidcDetails(oidcDetails) } + plugins().forEach { it.navigateToOidc(oidcDetails) } } private fun onLoginPasswordNeeded() { - plugins().forEach { it.onLoginPasswordNeeded() } + plugins().forEach { it.navigateToLoginPassword() } } private fun onCreateAccountContinue(url: String) { - plugins().forEach { it.onCreateAccountContinue(url) } + plugins().forEach { it.navigateToCreateAccount(url) } } @Composable diff --git a/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/screens/confirmaccountprovider/ConfirmAccountProviderNode.kt b/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/screens/confirmaccountprovider/ConfirmAccountProviderNode.kt index 0d50d21a18..52df30b4fb 100644 --- a/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/screens/confirmaccountprovider/ConfirmAccountProviderNode.kt +++ b/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/screens/confirmaccountprovider/ConfirmAccountProviderNode.kt @@ -42,26 +42,26 @@ class ConfirmAccountProviderNode( ) interface Callback : Plugin { - fun onLoginPasswordNeeded() - fun onOidcDetails(oidcDetails: OidcDetails) - fun onCreateAccountContinue(url: String) - fun onChangeAccountProvider() + fun navigateToLoginPassword() + fun navigateToOidc(oidcDetails: OidcDetails) + fun navigateToCreateAccount(url: String) + fun navigateToChangeAccountProvider() } private fun onOidcDetails(data: OidcDetails) { - plugins().forEach { it.onOidcDetails(data) } + plugins().forEach { it.navigateToOidc(data) } } private fun onLoginPasswordNeeded() { - plugins().forEach { it.onLoginPasswordNeeded() } + plugins().forEach { it.navigateToLoginPassword() } } private fun onCreateAccountContinue(url: String) { - plugins().forEach { it.onCreateAccountContinue(url) } + plugins().forEach { it.navigateToCreateAccount(url) } } private fun onChangeAccountProvider() { - plugins().forEach { it.onChangeAccountProvider() } + plugins().forEach { it.navigateToChangeAccountProvider() } } @Composable diff --git a/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/screens/onboarding/OnBoardingNode.kt b/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/screens/onboarding/OnBoardingNode.kt index 3652a3df8d..d9968af936 100644 --- a/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/screens/onboarding/OnBoardingNode.kt +++ b/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/screens/onboarding/OnBoardingNode.kt @@ -34,13 +34,13 @@ class OnBoardingNode( plugins = plugins ) { interface Callback : Plugin { - fun onSignUp() - fun onSignIn(mustChooseAccountProvider: Boolean) - fun onSignInWithQrCode() - fun onReportProblem() - fun onLoginPasswordNeeded() - fun onOidcDetails(oidcDetails: OidcDetails) - fun onCreateAccountContinue(url: String) + fun navigateToSignUpFlow() + fun navigateToSignInFlow(mustChooseAccountProvider: Boolean) + fun navigateToQrCode() + fun navigateToBugReport() + fun navigateToLoginPassword() + fun navigateToOidc(oidcDetails: OidcDetails) + fun navigateToCreateAccount(url: String) } data class Params( @@ -55,31 +55,31 @@ class OnBoardingNode( ) private fun onSignIn(mustChooseAccountProvider: Boolean) { - plugins().forEach { it.onSignIn(mustChooseAccountProvider) } + plugins().forEach { it.navigateToSignInFlow(mustChooseAccountProvider) } } private fun onSignUp() { - plugins().forEach { it.onSignUp() } + plugins().forEach { it.navigateToSignUpFlow() } } private fun onSignInWithQrCode() { - plugins().forEach { it.onSignInWithQrCode() } + plugins().forEach { it.navigateToQrCode() } } private fun onReportProblem() { - plugins().forEach { it.onReportProblem() } + plugins().forEach { it.navigateToBugReport() } } private fun onOidcDetails(data: OidcDetails) { - plugins().forEach { it.onOidcDetails(data) } + plugins().forEach { it.navigateToOidc(data) } } private fun onLoginPasswordNeeded() { - plugins().forEach { it.onLoginPasswordNeeded() } + plugins().forEach { it.navigateToLoginPassword() } } private fun onCreateAccountContinue(url: String) { - plugins().forEach { it.onCreateAccountContinue(url) } + plugins().forEach { it.navigateToCreateAccount(url) } } @Composable diff --git a/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/screens/qrcode/intro/QrCodeIntroNode.kt b/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/screens/qrcode/intro/QrCodeIntroNode.kt index c86dc6096a..951550fc22 100644 --- a/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/screens/qrcode/intro/QrCodeIntroNode.kt +++ b/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/screens/qrcode/intro/QrCodeIntroNode.kt @@ -26,16 +26,16 @@ class QrCodeIntroNode( private val presenter: QrCodeIntroPresenter, ) : Node(buildContext, plugins = plugins) { interface Callback : Plugin { - fun onCancelClicked() - fun onContinue() + fun cancel() + fun navigateToQrCodeScan() } private fun onCancelClicked() { - plugins().forEach { it.onCancelClicked() } + plugins().forEach { it.cancel() } } private fun onContinue() { - plugins().forEach { it.onContinue() } + plugins().forEach { it.navigateToQrCodeScan() } } @Composable diff --git a/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/screens/qrcode/scan/QrCodeScanNode.kt b/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/screens/qrcode/scan/QrCodeScanNode.kt index f6b52522b5..554639c72a 100644 --- a/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/screens/qrcode/scan/QrCodeScanNode.kt +++ b/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/screens/qrcode/scan/QrCodeScanNode.kt @@ -27,16 +27,16 @@ class QrCodeScanNode( private val presenter: QrCodeScanPresenter, ) : Node(buildContext, plugins = plugins) { interface Callback : Plugin { - fun onScannedCode(qrCodeLoginData: MatrixQrCodeLoginData) - fun onCancelClicked() + fun handleScannedCode(qrCodeLoginData: MatrixQrCodeLoginData) + fun cancel() } private fun onQrCodeDataReady(qrCodeLoginData: MatrixQrCodeLoginData) { - plugins().forEach { it.onScannedCode(qrCodeLoginData) } + plugins().forEach { it.handleScannedCode(qrCodeLoginData) } } private fun onCancelClicked() { - plugins().forEach { it.onCancelClicked() } + plugins().forEach { it.cancel() } } @Composable diff --git a/features/login/impl/src/test/kotlin/io/element/android/features/login/impl/DefaultLoginEntryPointTest.kt b/features/login/impl/src/test/kotlin/io/element/android/features/login/impl/DefaultLoginEntryPointTest.kt index c10d22c51a..d39cea9865 100644 --- a/features/login/impl/src/test/kotlin/io/element/android/features/login/impl/DefaultLoginEntryPointTest.kt +++ b/features/login/impl/src/test/kotlin/io/element/android/features/login/impl/DefaultLoginEntryPointTest.kt @@ -39,7 +39,7 @@ class DefaultLoginEntryPointTest { ) } val callback = object : LoginEntryPoint.Callback { - override fun onReportProblem() = lambdaError() + override fun navigateToBugReport() = lambdaError() } val params = LoginEntryPoint.Params( accountProvider = "ac", diff --git a/features/logout/api/src/main/kotlin/io/element/android/features/logout/api/LogoutEntryPoint.kt b/features/logout/api/src/main/kotlin/io/element/android/features/logout/api/LogoutEntryPoint.kt index 17f67813ca..676216d8f4 100644 --- a/features/logout/api/src/main/kotlin/io/element/android/features/logout/api/LogoutEntryPoint.kt +++ b/features/logout/api/src/main/kotlin/io/element/android/features/logout/api/LogoutEntryPoint.kt @@ -21,6 +21,6 @@ interface LogoutEntryPoint : FeatureEntryPoint { } interface Callback : Plugin { - fun onChangeRecoveryKeyClick() + fun navigateToSecureBackup() } } diff --git a/features/logout/impl/src/main/kotlin/io/element/android/features/logout/impl/LogoutNode.kt b/features/logout/impl/src/main/kotlin/io/element/android/features/logout/impl/LogoutNode.kt index d554dbe8f0..3860850fcf 100644 --- a/features/logout/impl/src/main/kotlin/io/element/android/features/logout/impl/LogoutNode.kt +++ b/features/logout/impl/src/main/kotlin/io/element/android/features/logout/impl/LogoutNode.kt @@ -27,7 +27,7 @@ class LogoutNode( private val presenter: LogoutPresenter, ) : Node(buildContext, plugins = plugins) { private fun onChangeRecoveryKeyClick() { - plugins().forEach { it.onChangeRecoveryKeyClick() } + plugins().forEach { it.navigateToSecureBackup() } } @Composable diff --git a/features/logout/impl/src/test/kotlin/io/element/android/features/logout/impl/DefaultLogoutEntryPointTest.kt b/features/logout/impl/src/test/kotlin/io/element/android/features/logout/impl/DefaultLogoutEntryPointTest.kt index 01d1bfc6ca..7e831bccf5 100644 --- a/features/logout/impl/src/test/kotlin/io/element/android/features/logout/impl/DefaultLogoutEntryPointTest.kt +++ b/features/logout/impl/src/test/kotlin/io/element/android/features/logout/impl/DefaultLogoutEntryPointTest.kt @@ -32,7 +32,7 @@ class DefaultLogoutEntryPointTest { ) } val callback = object : LogoutEntryPoint.Callback { - override fun onChangeRecoveryKeyClick() = lambdaError() + override fun navigateToSecureBackup() = lambdaError() } val result = entryPoint.nodeBuilder(parentNode, BuildContext.root(null)) .callback(callback) diff --git a/features/messages/api/src/main/kotlin/io/element/android/features/messages/api/MessagesEntryPoint.kt b/features/messages/api/src/main/kotlin/io/element/android/features/messages/api/MessagesEntryPoint.kt index 1d689663ee..6540e03684 100644 --- a/features/messages/api/src/main/kotlin/io/element/android/features/messages/api/MessagesEntryPoint.kt +++ b/features/messages/api/src/main/kotlin/io/element/android/features/messages/api/MessagesEntryPoint.kt @@ -38,11 +38,11 @@ interface MessagesEntryPoint : FeatureEntryPoint { } interface Callback : Plugin { - fun onRoomDetailsClick() - fun onUserDataClick(userId: UserId) - fun onPermalinkClick(data: PermalinkData, pushToBackstack: Boolean) + fun navigateToRoomDetails() + fun navigateToRoomMemberDetails(userId: UserId) + fun handlePermalinkClick(data: PermalinkData, pushToBackstack: Boolean) fun forwardEvent(eventId: EventId) - fun openRoom(roomId: RoomId) + fun navigateToRoom(roomId: RoomId) } data class Params(val initialTarget: InitialTarget) : NodeInputs diff --git a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/MessagesFlowNode.kt b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/MessagesFlowNode.kt index 73aad6f7de..c9fe66191b 100644 --- a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/MessagesFlowNode.kt +++ b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/MessagesFlowNode.kt @@ -220,18 +220,18 @@ class MessagesFlowNode( return when (navTarget) { is NavTarget.Messages -> { val callback = object : MessagesNode.Callback { - override fun onRoomDetailsClick() { - callbacks.forEach { it.onRoomDetailsClick() } + override fun navigateToRoomDetails() { + callbacks.forEach { it.navigateToRoomDetails() } } - override fun onEventClick(timelineMode: Timeline.Mode, event: TimelineItem.Event): Boolean { + override fun handleEventClick(timelineMode: Timeline.Mode, event: TimelineItem.Event): Boolean { return processEventClick( timelineMode = timelineMode, event = event, ) } - override fun onPreviewAttachments(attachments: ImmutableList, inReplyToEventId: EventId?) { + override fun navigateToPreviewAttachments(attachments: ImmutableList, inReplyToEventId: EventId?) { backstack.push( NavTarget.AttachmentPreview( attachment = attachments.first(), @@ -241,39 +241,39 @@ class MessagesFlowNode( ) } - override fun onUserDataClick(userId: UserId) { - callbacks.forEach { it.onUserDataClick(userId) } + override fun navigateToRoomMemberDetails(userId: UserId) { + callbacks.forEach { it.navigateToRoomMemberDetails(userId) } } - override fun onPermalinkClick(data: PermalinkData) { - callbacks.forEach { it.onPermalinkClick(data, pushToBackstack = true) } + override fun handlePermalinkClick(data: PermalinkData) { + callbacks.forEach { it.handlePermalinkClick(data, pushToBackstack = true) } } - override fun onShowEventDebugInfoClick(eventId: EventId?, debugInfo: TimelineItemDebugInfo) { + override fun navigateToEventDebugInfo(eventId: EventId?, debugInfo: TimelineItemDebugInfo) { backstack.push(NavTarget.EventDebugInfo(eventId, debugInfo)) } - override fun onForwardEventClick(eventId: EventId) { + override fun forwardEvent(eventId: EventId) { backstack.push(NavTarget.ForwardEvent(eventId, fromPinnedEvents = false)) } - override fun onReportMessage(eventId: EventId, senderId: UserId) { + override fun navigateToReportMessage(eventId: EventId, senderId: UserId) { backstack.push(NavTarget.ReportMessage(eventId, senderId)) } - override fun onSendLocationClick() { + override fun navigateToSendLocation() { backstack.push(NavTarget.SendLocation(Timeline.Mode.Live)) } - override fun onCreatePollClick() { + override fun navigateToCreatePoll() { backstack.push(NavTarget.CreatePoll(Timeline.Mode.Live)) } - override fun onEditPollClick(eventId: EventId) { + override fun navigateToEditPoll(eventId: EventId) { backstack.push(NavTarget.EditPoll(Timeline.Mode.Live, eventId)) } - override fun onJoinCallClick(roomId: RoomId) { + override fun navigateToRoomCall(roomId: RoomId) { val callType = CallType.RoomCall( sessionId = sessionId, roomId = roomId, @@ -282,15 +282,15 @@ class MessagesFlowNode( elementCallEntryPoint.startCall(callType) } - override fun onViewAllPinnedEvents() { + override fun navigateToPinnedMessagesList() { backstack.push(NavTarget.PinnedMessagesList) } - override fun onViewKnockRequests() { + override fun navigateToKnockRequestsList() { backstack.push(NavTarget.KnockRequestsList) } - override fun onOpenThread(threadRootId: ThreadId, focusedEventId: EventId?) { + override fun navigateToThread(threadRootId: ThreadId, focusedEventId: EventId?) { backstack.push(NavTarget.Thread(threadRootId, focusedEventId)) } } @@ -311,13 +311,13 @@ class MessagesFlowNode( overlay.hide() } - override fun onViewInTimeline(eventId: EventId) { - viewInTimeline(eventId) + override fun viewInTimeline(eventId: EventId) { + this@MessagesFlowNode.viewInTimeline(eventId) } - override fun onForwardEvent(eventId: EventId) { + override fun forwardEvent(eventId: EventId) { // Need to go to the parent because of the overlay - forwardEvent(eventId) + callbacks.forEach { it.forwardEvent(eventId) } } } mediaViewerEntryPoint.nodeBuilder(this, buildContext) @@ -352,7 +352,7 @@ class MessagesFlowNode( override fun onDone(roomIds: List) { backstack.pop() roomIds.singleOrNull()?.let { roomId -> - callbacks.forEach { it.openRoom(roomId) } + callbacks.forEach { it.navigateToRoom(roomId) } } } } @@ -392,30 +392,30 @@ class MessagesFlowNode( } NavTarget.PinnedMessagesList -> { val callback = object : PinnedMessagesListNode.Callback { - override fun onEventClick(event: TimelineItem.Event) { + override fun handleEventClick(event: TimelineItem.Event) { processEventClick( timelineMode = Timeline.Mode.PinnedEvents, event = event, ) } - override fun onUserDataClick(userId: UserId) { - callbacks.forEach { it.onUserDataClick(userId) } + override fun navigateToRoomMemberDetails(userId: UserId) { + callbacks.forEach { it.navigateToRoomMemberDetails(userId) } } - override fun onViewInTimelineClick(eventId: EventId) { - viewInTimeline(eventId) + override fun viewInTimeline(eventId: EventId) { + this@MessagesFlowNode.viewInTimeline(eventId) } - override fun onRoomPermalinkClick(data: PermalinkData.RoomLink) { - callbacks.forEach { it.onPermalinkClick(data, pushToBackstack = !room.matches(data.roomIdOrAlias)) } + override fun handlePermalinkClick(data: PermalinkData.RoomLink) { + callbacks.forEach { it.handlePermalinkClick(data, pushToBackstack = !room.matches(data.roomIdOrAlias)) } } - override fun onShowEventDebugInfoClick(eventId: EventId?, debugInfo: TimelineItemDebugInfo) { + override fun navigateToEventDebugInfo(eventId: EventId?, debugInfo: TimelineItemDebugInfo) { backstack.push(NavTarget.EventDebugInfo(eventId, debugInfo)) } - override fun onForwardEventClick(eventId: EventId) { + override fun handleForwardEventClick(eventId: EventId) { backstack.push(NavTarget.ForwardEvent(eventId = eventId, fromPinnedEvents = true)) } } @@ -430,14 +430,14 @@ class MessagesFlowNode( focusedEventId = navTarget.focusedEventId, ) val callback = object : ThreadedMessagesNode.Callback { - override fun onEventClick(timelineMode: Timeline.Mode, event: TimelineItem.Event): Boolean { + override fun handleEventClick(timelineMode: Timeline.Mode, event: TimelineItem.Event): Boolean { return processEventClick( timelineMode = timelineMode, event = event, ) } - override fun onPreviewAttachments(attachments: ImmutableList, inReplyToEventId: EventId?) { + override fun navigateToPreviewAttachments(attachments: ImmutableList, inReplyToEventId: EventId?) { backstack.push( NavTarget.AttachmentPreview( attachment = attachments.first(), @@ -447,39 +447,39 @@ class MessagesFlowNode( ) } - override fun onUserDataClick(userId: UserId) { - callbacks.forEach { it.onUserDataClick(userId) } + override fun navigateToRoomMemberDetails(userId: UserId) { + callbacks.forEach { it.navigateToRoomMemberDetails(userId) } } - override fun onPermalinkClick(data: PermalinkData) { - callbacks.forEach { it.onPermalinkClick(data, pushToBackstack = true) } + override fun handlePermalinkClick(data: PermalinkData) { + callbacks.forEach { it.handlePermalinkClick(data, pushToBackstack = true) } } - override fun onShowEventDebugInfoClick(eventId: EventId?, debugInfo: TimelineItemDebugInfo) { + override fun navigateToEventDebugInfo(eventId: EventId?, debugInfo: TimelineItemDebugInfo) { backstack.push(NavTarget.EventDebugInfo(eventId, debugInfo)) } - override fun onForwardEventClick(eventId: EventId) { + override fun handleForwardEventClick(eventId: EventId) { backstack.push(NavTarget.ForwardEvent(eventId, fromPinnedEvents = false)) } - override fun onReportMessage(eventId: EventId, senderId: UserId) { + override fun navigateToReportMessage(eventId: EventId, senderId: UserId) { backstack.push(NavTarget.ReportMessage(eventId, senderId)) } - override fun onSendLocationClick() { + override fun navigateToSendLocation() { backstack.push(NavTarget.SendLocation(Timeline.Mode.Thread(navTarget.threadRootId))) } - override fun onCreatePollClick() { + override fun navigateToCreatePoll() { backstack.push(NavTarget.CreatePoll(Timeline.Mode.Thread(navTarget.threadRootId))) } - override fun onEditPollClick(eventId: EventId) { + override fun navigateToEditPoll(eventId: EventId) { backstack.push(NavTarget.EditPoll(Timeline.Mode.Thread(navTarget.threadRootId), eventId)) } - override fun onJoinCallClick(roomId: RoomId) { + override fun navigateToRoomCall(roomId: RoomId) { val callType = CallType.RoomCall( sessionId = sessionId, roomId = roomId, @@ -488,7 +488,7 @@ class MessagesFlowNode( elementCallEntryPoint.startCall(callType) } - override fun onOpenThread(threadRootId: ThreadId, focusedEventId: EventId?) { + override fun navigateToThread(threadRootId: ThreadId, focusedEventId: EventId?) { backstack.push(NavTarget.Thread(threadRootId, focusedEventId)) } } @@ -502,11 +502,7 @@ class MessagesFlowNode( roomIdOrAlias = room.roomId.toRoomIdOrAlias(), eventId = eventId, ) - callbacks.forEach { it.onPermalinkClick(permalinkData, pushToBackstack = false) } - } - - private fun forwardEvent(eventId: EventId) { - callbacks.forEach { it.forwardEvent(eventId) } + callbacks.forEach { it.handlePermalinkClick(permalinkData, pushToBackstack = false) } } private fun processEventClick( diff --git a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/MessagesNavigator.kt b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/MessagesNavigator.kt index 25fd7f222d..7c55e23323 100644 --- a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/MessagesNavigator.kt +++ b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/MessagesNavigator.kt @@ -16,12 +16,12 @@ import io.element.android.libraries.matrix.api.timeline.item.TimelineItemDebugIn import kotlinx.collections.immutable.ImmutableList interface MessagesNavigator { - fun onShowEventDebugInfoClick(eventId: EventId?, debugInfo: TimelineItemDebugInfo) - fun onForwardEventClick(eventId: EventId) - fun onReportContentClick(eventId: EventId, senderId: UserId) - fun onEditPollClick(eventId: EventId) - fun onPreviewAttachment(attachments: ImmutableList, inReplyToEventId: EventId?) - fun onNavigateToRoom(roomId: RoomId, eventId: EventId?, serverNames: List) - fun onOpenThread(threadRootId: ThreadId, focusedEventId: EventId?) + fun navigateToEventDebugInfo(eventId: EventId?, debugInfo: TimelineItemDebugInfo) + fun forwardEvent(eventId: EventId) + fun navigateToReportMessage(eventId: EventId, senderId: UserId) + fun navigateToEditPoll(eventId: EventId) + fun navigateToPreviewAttachments(attachments: ImmutableList, inReplyToEventId: EventId?) + fun navigateToRoom(roomId: RoomId, eventId: EventId?, serverNames: List) + fun navigateToThread(threadRootId: ThreadId, focusedEventId: EventId?) fun onNavigateUp() } diff --git a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/MessagesNode.kt b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/MessagesNode.kt index e0e3e88891..bb2870b6af 100644 --- a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/MessagesNode.kt +++ b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/MessagesNode.kt @@ -114,21 +114,21 @@ class MessagesNode( ) interface Callback : Plugin { - fun onEventClick(timelineMode: Timeline.Mode, event: TimelineItem.Event): Boolean - fun onPreviewAttachments(attachments: ImmutableList, inReplyToEventId: EventId?) - fun onUserDataClick(userId: UserId) - fun onPermalinkClick(data: PermalinkData) - fun onShowEventDebugInfoClick(eventId: EventId?, debugInfo: TimelineItemDebugInfo) - fun onForwardEventClick(eventId: EventId) - fun onReportMessage(eventId: EventId, senderId: UserId) - fun onSendLocationClick() - fun onCreatePollClick() - fun onEditPollClick(eventId: EventId) - fun onJoinCallClick(roomId: RoomId) - fun onOpenThread(threadRootId: ThreadId, focusedEventId: EventId?) - fun onRoomDetailsClick() - fun onViewAllPinnedEvents() - fun onViewKnockRequests() + fun handleEventClick(timelineMode: Timeline.Mode, event: TimelineItem.Event): Boolean + fun navigateToPreviewAttachments(attachments: ImmutableList, inReplyToEventId: EventId?) + fun navigateToRoomMemberDetails(userId: UserId) + fun handlePermalinkClick(data: PermalinkData) + fun navigateToEventDebugInfo(eventId: EventId?, debugInfo: TimelineItemDebugInfo) + fun forwardEvent(eventId: EventId) + fun navigateToReportMessage(eventId: EventId, senderId: UserId) + fun navigateToSendLocation() + fun navigateToCreatePoll() + fun navigateToEditPoll(eventId: EventId) + fun navigateToRoomCall(roomId: RoomId) + fun navigateToThread(threadRootId: ThreadId, focusedEventId: EventId?) + fun navigateToRoomDetails() + fun navigateToPinnedMessagesList() + fun navigateToKnockRequestsList() } override fun onBuilt() { @@ -143,16 +143,16 @@ class MessagesNode( ) } - private fun onRoomDetailsClick() { - callbacks.forEach { it.onRoomDetailsClick() } + private fun navigateToRoomDetails() { + callbacks.forEach { it.navigateToRoomDetails() } } - private fun onViewAllPinnedMessagesClick() { - callbacks.forEach { it.onViewAllPinnedEvents() } + private fun navigateToPinnedMessagesList() { + callbacks.forEach { it.navigateToPinnedMessagesList() } } - private fun onViewKnockRequestsClick() { - callbacks.forEach { it.onViewKnockRequests() } + private fun navigateToKnockRequestsList() { + callbacks.forEach { it.navigateToKnockRequestsList() } } private fun onEventClick(timelineMode: Timeline.Mode, event: TimelineItem.Event): Boolean { @@ -160,13 +160,13 @@ class MessagesNode( // - if callbacks is empty, it will return true and we want to return false. // - if a callback returns false, the other callback will not be invoked. return callbacks.takeIf { it.isNotEmpty() } - ?.map { it.onEventClick(timelineMode, event) } + ?.map { it.handleEventClick(timelineMode, event) } ?.all { it } .orFalse() } - private fun onUserDataClick(userId: UserId) { - callbacks.forEach { it.onUserDataClick(userId) } + private fun navigateToRoomMemberDetails(userId: UserId) { + callbacks.forEach { it.navigateToRoomMemberDetails(userId) } } private fun onLinkClick( @@ -180,7 +180,7 @@ class MessagesNode( is PermalinkData.UserLink -> { // Open the room member profile, it will fallback to // the user profile if the user is not in the room - callbacks.forEach { it.onUserDataClick(permalink.userId) } + callbacks.forEach { it.navigateToRoomMemberDetails(permalink.userId) } } is PermalinkData.RoomLink -> { handleRoomLinkClick(permalink, eventSink) @@ -211,53 +211,53 @@ class MessagesNode( displaySameRoomToast() } } else { - callbacks.forEach { it.onPermalinkClick(roomLink) } + callbacks.forEach { it.handlePermalinkClick(roomLink) } } } - override fun onShowEventDebugInfoClick(eventId: EventId?, debugInfo: TimelineItemDebugInfo) { - callbacks.forEach { it.onShowEventDebugInfoClick(eventId, debugInfo) } + override fun navigateToEventDebugInfo(eventId: EventId?, debugInfo: TimelineItemDebugInfo) { + callbacks.forEach { it.navigateToEventDebugInfo(eventId, debugInfo) } } - override fun onForwardEventClick(eventId: EventId) { - callbacks.forEach { it.onForwardEventClick(eventId) } + override fun forwardEvent(eventId: EventId) { + callbacks.forEach { it.forwardEvent(eventId) } } - override fun onReportContentClick(eventId: EventId, senderId: UserId) { - callbacks.forEach { it.onReportMessage(eventId, senderId) } + override fun navigateToReportMessage(eventId: EventId, senderId: UserId) { + callbacks.forEach { it.navigateToReportMessage(eventId, senderId) } } - override fun onEditPollClick(eventId: EventId) { - callbacks.forEach { it.onEditPollClick(eventId) } + override fun navigateToEditPoll(eventId: EventId) { + callbacks.forEach { it.navigateToEditPoll(eventId) } } - override fun onPreviewAttachment(attachments: ImmutableList, inReplyToEventId: EventId?) { - callbacks.forEach { it.onPreviewAttachments(attachments, inReplyToEventId) } + override fun navigateToPreviewAttachments(attachments: ImmutableList, inReplyToEventId: EventId?) { + callbacks.forEach { it.navigateToPreviewAttachments(attachments, inReplyToEventId) } } - override fun onNavigateToRoom(roomId: RoomId, eventId: EventId?, serverNames: List) { + override fun navigateToRoom(roomId: RoomId, eventId: EventId?, serverNames: List) { if (roomId == room.roomId) { displaySameRoomToast() } else { val permalinkData = PermalinkData.RoomLink(roomId.toRoomIdOrAlias(), eventId, viaParameters = serverNames.toImmutableList()) - callbacks.forEach { it.onPermalinkClick(permalinkData) } + callbacks.forEach { it.handlePermalinkClick(permalinkData) } } } - override fun onOpenThread(threadRootId: ThreadId, focusedEventId: EventId?) { - callbacks.forEach { it.onOpenThread(threadRootId, focusedEventId) } + override fun navigateToThread(threadRootId: ThreadId, focusedEventId: EventId?) { + callbacks.forEach { it.navigateToThread(threadRootId, focusedEventId) } } - private fun onSendLocationClick() { - callbacks.forEach { it.onSendLocationClick() } + private fun navigateToSendLocation() { + callbacks.forEach { it.navigateToSendLocation() } } - private fun onCreatePollClick() { - callbacks.forEach { it.onCreatePollClick() } + private fun navigateToCreatePoll() { + callbacks.forEach { it.navigateToCreatePoll() } } - private fun onJoinCallClick() { - callbacks.forEach { it.onJoinCallClick(room.roomId) } + private fun navigateToRoomCall() { + callbacks.forEach { it.navigateToRoomCall(room.roomId) } } private fun displaySameRoomToast() { @@ -288,7 +288,7 @@ class MessagesNode( MessagesView( state = state, onBackClick = { state.eventSink(MessagesEvents.MarkAsFullyReadAndExit) }, - onRoomDetailsClick = this::onRoomDetailsClick, + onRoomDetailsClick = ::navigateToRoomDetails, onEventContentClick = { isLive, event -> if (isLive) { onEventClick(timelineController.mainTimelineMode(), event) @@ -301,7 +301,7 @@ class MessagesNode( } } }, - onUserDataClick = this::onUserDataClick, + onUserDataClick = ::navigateToRoomMemberDetails, onLinkClick = { url, customTab -> onLinkClick( activity = activity, @@ -311,15 +311,15 @@ class MessagesNode( customTab = customTab, ) }, - onSendLocationClick = this::onSendLocationClick, - onCreatePollClick = this::onCreatePollClick, - onJoinCallClick = this::onJoinCallClick, - onViewAllPinnedMessagesClick = this::onViewAllPinnedMessagesClick, + onSendLocationClick = ::navigateToSendLocation, + onCreatePollClick = ::navigateToCreatePoll, + onJoinCallClick = ::navigateToRoomCall, + onViewAllPinnedMessagesClick = ::navigateToPinnedMessagesList, modifier = modifier, knockRequestsBannerView = { knockRequestsBannerRenderer.View( modifier = Modifier, - onViewRequestsClick = this::onViewKnockRequestsClick + onViewRequestsClick = ::navigateToKnockRequestsList, ) }, ) @@ -327,7 +327,7 @@ class MessagesNode( state = state.roomMemberModerationState, onSelectAction = { action, target -> when (action) { - is ModerationAction.DisplayProfile -> onUserDataClick(target.userId) + is ModerationAction.DisplayProfile -> navigateToRoomMemberDetails(target.userId) else -> state.roomMemberModerationState.eventSink(RoomMemberModerationEvents.ProcessAction(action, target)) } }, diff --git a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/MessagesPresenter.kt b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/MessagesPresenter.kt index 9056437218..aae371998e 100644 --- a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/MessagesPresenter.kt +++ b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/MessagesPresenter.kt @@ -355,7 +355,7 @@ class MessagesPresenter( is TimelineItemThreadInfo.ThreadResponse -> targetEvent.threadInfo.threadRootId is TimelineItemThreadInfo.ThreadRoot, null -> targetEvent.eventId?.toThreadId() } ?: return@launch - navigator.onOpenThread(threadId, null) + navigator.navigateToThread(threadId, null) } else { handleActionReply(targetEvent, composerState, timelineProtectionState) } @@ -463,7 +463,7 @@ class MessagesPresenter( when (targetEvent.content) { is TimelineItemPollContent -> { if (targetEvent.eventId == null) return - navigator.onEditPollClick(targetEvent.eventId) + navigator.navigateToEditPoll(targetEvent.eventId) } else -> { val composerMode = MessageComposerMode.Edit( @@ -528,17 +528,17 @@ class MessagesPresenter( } private fun handleShowDebugInfoAction(event: TimelineItem.Event) { - navigator.onShowEventDebugInfoClick(event.eventId, event.debugInfo) + navigator.navigateToEventDebugInfo(event.eventId, event.debugInfo) } private fun handleForwardAction(event: TimelineItem.Event) { if (event.eventId == null) return - navigator.onForwardEventClick(event.eventId) + navigator.forwardEvent(event.eventId) } private fun handleReportAction(event: TimelineItem.Event) { if (event.eventId == null) return - navigator.onReportContentClick(event.eventId, event.senderId) + navigator.navigateToReportMessage(event.eventId, event.senderId) } private fun handleEndPollAction( diff --git a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/messagecomposer/MessageComposerPresenter.kt b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/messagecomposer/MessageComposerPresenter.kt index 9505f0d758..612797261a 100644 --- a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/messagecomposer/MessageComposerPresenter.kt +++ b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/messagecomposer/MessageComposerPresenter.kt @@ -528,7 +528,7 @@ class MessageComposerPresenter( ) val mediaAttachment = Attachment.Media(localMedia) val inReplyToEventId = (messageComposerContext.composerMode as? MessageComposerMode.Reply)?.eventId - navigator.onPreviewAttachment(persistentListOf(mediaAttachment), inReplyToEventId) + navigator.navigateToPreviewAttachments(persistentListOf(mediaAttachment), inReplyToEventId) // Reset composer since the attachment will be sent in a separate flow messageComposerContext.composerMode = MessageComposerMode.Normal diff --git a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/pinned/list/PinnedMessagesListNavigator.kt b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/pinned/list/PinnedMessagesListNavigator.kt index d33ad54eed..7a890eac7b 100644 --- a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/pinned/list/PinnedMessagesListNavigator.kt +++ b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/pinned/list/PinnedMessagesListNavigator.kt @@ -11,7 +11,7 @@ import io.element.android.libraries.matrix.api.core.EventId import io.element.android.libraries.matrix.api.timeline.item.TimelineItemDebugInfo interface PinnedMessagesListNavigator { - fun onViewInTimelineClick(eventId: EventId) - fun onShowEventDebugInfoClick(eventId: EventId?, debugInfo: TimelineItemDebugInfo) - fun onForwardEventClick(eventId: EventId) + fun viewInTimeline(eventId: EventId) + fun navigateToEventDebugInfo(eventId: EventId?, debugInfo: TimelineItemDebugInfo) + fun forwardEvent(eventId: EventId) } diff --git a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/pinned/list/PinnedMessagesListNode.kt b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/pinned/list/PinnedMessagesListNode.kt index 8ba776c520..6d1c7b6027 100644 --- a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/pinned/list/PinnedMessagesListNode.kt +++ b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/pinned/list/PinnedMessagesListNode.kt @@ -48,12 +48,12 @@ class PinnedMessagesListNode( private val permalinkParser: PermalinkParser, ) : Node(buildContext, plugins = plugins), PinnedMessagesListNavigator { interface Callback : Plugin { - fun onEventClick(event: TimelineItem.Event) - fun onUserDataClick(userId: UserId) - fun onViewInTimelineClick(eventId: EventId) - fun onRoomPermalinkClick(data: PermalinkData.RoomLink) - fun onShowEventDebugInfoClick(eventId: EventId?, debugInfo: TimelineItemDebugInfo) - fun onForwardEventClick(eventId: EventId) + fun handleEventClick(event: TimelineItem.Event) + fun navigateToRoomMemberDetails(userId: UserId) + fun viewInTimeline(eventId: EventId) + fun handlePermalinkClick(data: PermalinkData.RoomLink) + fun navigateToEventDebugInfo(eventId: EventId?, debugInfo: TimelineItemDebugInfo) + fun handleForwardEventClick(eventId: EventId) } private val presenter = presenterFactory.create( @@ -65,12 +65,12 @@ class PinnedMessagesListNode( ) private val callbacks = plugins() - private fun onEventClick(event: TimelineItem.Event) { - return callbacks.forEach { it.onEventClick(event) } + private fun handleEventClick(event: TimelineItem.Event) { + return callbacks.forEach { it.handleEventClick(event) } } - private fun onUserDataClick(user: MatrixUser) { - callbacks.forEach { it.onUserDataClick(user.userId) } + private fun navigateToRoomMemberDetails(user: MatrixUser) { + callbacks.forEach { it.navigateToRoomMemberDetails(user.userId) } } private fun onLinkClick(context: Context, url: String) { @@ -78,10 +78,10 @@ class PinnedMessagesListNode( is PermalinkData.UserLink -> { // Open the room member profile, it will fallback to // the user profile if the user is not in the room - callbacks.forEach { it.onUserDataClick(permalink.userId) } + callbacks.forEach { it.navigateToRoomMemberDetails(permalink.userId) } } is PermalinkData.RoomLink -> { - callbacks.forEach { it.onRoomPermalinkClick(permalink) } + callbacks.forEach { it.handlePermalinkClick(permalink) } } is PermalinkData.FallbackLink, is PermalinkData.RoomEmailInviteLink -> { @@ -90,16 +90,16 @@ class PinnedMessagesListNode( } } - override fun onViewInTimelineClick(eventId: EventId) { - callbacks.forEach { it.onViewInTimelineClick(eventId) } + override fun viewInTimeline(eventId: EventId) { + callbacks.forEach { it.viewInTimeline(eventId) } } - override fun onShowEventDebugInfoClick(eventId: EventId?, debugInfo: TimelineItemDebugInfo) { - callbacks.forEach { it.onShowEventDebugInfoClick(eventId, debugInfo) } + override fun navigateToEventDebugInfo(eventId: EventId?, debugInfo: TimelineItemDebugInfo) { + callbacks.forEach { it.navigateToEventDebugInfo(eventId, debugInfo) } } - override fun onForwardEventClick(eventId: EventId) { - callbacks.forEach { it.onForwardEventClick(eventId) } + override fun forwardEvent(eventId: EventId) { + callbacks.forEach { it.handleForwardEventClick(eventId) } } @Composable @@ -113,8 +113,8 @@ class PinnedMessagesListNode( PinnedMessagesListView( state = state, onBackClick = ::navigateUp, - onEventClick = ::onEventClick, - onUserDataClick = ::onUserDataClick, + onEventClick = ::handleEventClick, + onUserDataClick = ::navigateToRoomMemberDetails, onLinkClick = { link -> onLinkClick(context, link.url) }, onLinkLongClick = { view.performHapticFeedback( diff --git a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/pinned/list/PinnedMessagesListPresenter.kt b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/pinned/list/PinnedMessagesListPresenter.kt index 50652bb6e5..6d09e12447 100644 --- a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/pinned/list/PinnedMessagesListPresenter.kt +++ b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/pinned/list/PinnedMessagesListPresenter.kt @@ -153,18 +153,18 @@ class PinnedMessagesListPresenter( ) = launch { when (action) { TimelineItemAction.ViewSource -> { - navigator.onShowEventDebugInfoClick(targetEvent.eventId, targetEvent.debugInfo) + navigator.navigateToEventDebugInfo(targetEvent.eventId, targetEvent.debugInfo) } TimelineItemAction.Forward -> { targetEvent.eventId?.let { eventId -> - navigator.onForwardEventClick(eventId) + navigator.forwardEvent(eventId) } } TimelineItemAction.Unpin -> handleUnpinAction(targetEvent) TimelineItemAction.ViewInTimeline -> { targetEvent.eventId?.let { eventId -> analyticsService.captureInteraction(Interaction.Name.PinnedMessageListViewTimeline) - navigator.onViewInTimelineClick(eventId) + navigator.viewInTimeline(eventId) } } else -> Unit diff --git a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/threads/ThreadedMessagesNode.kt b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/threads/ThreadedMessagesNode.kt index 9b5121eeb5..62138e99e0 100644 --- a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/threads/ThreadedMessagesNode.kt +++ b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/threads/ThreadedMessagesNode.kt @@ -113,18 +113,18 @@ class ThreadedMessagesNode( ) interface Callback : Plugin { - fun onEventClick(timelineMode: Timeline.Mode, event: TimelineItem.Event): Boolean - fun onPreviewAttachments(attachments: ImmutableList, inReplyToEventId: EventId?) - fun onUserDataClick(userId: UserId) - fun onPermalinkClick(data: PermalinkData) - fun onShowEventDebugInfoClick(eventId: EventId?, debugInfo: TimelineItemDebugInfo) - fun onForwardEventClick(eventId: EventId) - fun onReportMessage(eventId: EventId, senderId: UserId) - fun onSendLocationClick() - fun onCreatePollClick() - fun onEditPollClick(eventId: EventId) - fun onJoinCallClick(roomId: RoomId) - fun onOpenThread(threadRootId: ThreadId, focusedEventId: EventId?) + fun handleEventClick(timelineMode: Timeline.Mode, event: TimelineItem.Event): Boolean + fun navigateToPreviewAttachments(attachments: ImmutableList, inReplyToEventId: EventId?) + fun navigateToRoomMemberDetails(userId: UserId) + fun handlePermalinkClick(data: PermalinkData) + fun navigateToEventDebugInfo(eventId: EventId?, debugInfo: TimelineItemDebugInfo) + fun handleForwardEventClick(eventId: EventId) + fun navigateToReportMessage(eventId: EventId, senderId: UserId) + fun navigateToSendLocation() + fun navigateToCreatePoll() + fun navigateToEditPoll(eventId: EventId) + fun navigateToRoomCall(roomId: RoomId) + fun navigateToThread(threadRootId: ThreadId, focusedEventId: EventId?) } override fun onBuilt() { @@ -150,13 +150,13 @@ class ThreadedMessagesNode( // - if callbacks is empty, it will return true and we want to return false. // - if a callback returns false, the other callback will not be invoked. return callbacks.takeIf { it.isNotEmpty() } - ?.map { it.onEventClick(timelineMode, event) } + ?.map { it.handleEventClick(timelineMode, event) } ?.all { it } .orFalse() } - private fun onUserDataClick(userId: UserId) { - callbacks.forEach { it.onUserDataClick(userId) } + private fun navigateToRoomMemberDetails(userId: UserId) { + callbacks.forEach { it.navigateToRoomMemberDetails(userId) } } private fun onLinkClick( @@ -170,7 +170,7 @@ class ThreadedMessagesNode( is PermalinkData.UserLink -> { // Open the room member profile, it will fallback to // the user profile if the user is not in the room - callbacks.forEach { it.onUserDataClick(permalink.userId) } + callbacks.forEach { it.navigateToRoomMemberDetails(permalink.userId) } } is PermalinkData.RoomLink -> { handleRoomLinkClick(permalink, eventSink) @@ -204,51 +204,51 @@ class ThreadedMessagesNode( navigateUp() } } else { - callbacks.forEach { it.onPermalinkClick(roomLink) } + callbacks.forEach { it.handlePermalinkClick(roomLink) } } } - override fun onShowEventDebugInfoClick(eventId: EventId?, debugInfo: TimelineItemDebugInfo) { - callbacks.forEach { it.onShowEventDebugInfoClick(eventId, debugInfo) } + override fun navigateToEventDebugInfo(eventId: EventId?, debugInfo: TimelineItemDebugInfo) { + callbacks.forEach { it.navigateToEventDebugInfo(eventId, debugInfo) } } - override fun onForwardEventClick(eventId: EventId) { - callbacks.forEach { it.onForwardEventClick(eventId) } + override fun forwardEvent(eventId: EventId) { + callbacks.forEach { it.handleForwardEventClick(eventId) } } - override fun onReportContentClick(eventId: EventId, senderId: UserId) { - callbacks.forEach { it.onReportMessage(eventId, senderId) } + override fun navigateToReportMessage(eventId: EventId, senderId: UserId) { + callbacks.forEach { it.navigateToReportMessage(eventId, senderId) } } - override fun onEditPollClick(eventId: EventId) { - callbacks.forEach { it.onEditPollClick(eventId) } + override fun navigateToEditPoll(eventId: EventId) { + callbacks.forEach { it.navigateToEditPoll(eventId) } } - override fun onPreviewAttachment(attachments: ImmutableList, inReplyToEventId: EventId?) { - callbacks.forEach { it.onPreviewAttachments(attachments, inReplyToEventId) } + override fun navigateToPreviewAttachments(attachments: ImmutableList, inReplyToEventId: EventId?) { + callbacks.forEach { it.navigateToPreviewAttachments(attachments, inReplyToEventId) } } - override fun onNavigateToRoom(roomId: RoomId, eventId: EventId?, serverNames: List) { + override fun navigateToRoom(roomId: RoomId, eventId: EventId?, serverNames: List) { val permalinkData = PermalinkData.RoomLink(roomId.toRoomIdOrAlias(), eventId, viaParameters = serverNames.toImmutableList()) - callbacks.forEach { it.onPermalinkClick(permalinkData) } + callbacks.forEach { it.handlePermalinkClick(permalinkData) } } - override fun onOpenThread(threadRootId: ThreadId, focusedEventId: EventId?) { - callbacks.forEach { it.onOpenThread(threadRootId, focusedEventId) } + override fun navigateToThread(threadRootId: ThreadId, focusedEventId: EventId?) { + callbacks.forEach { it.navigateToThread(threadRootId, focusedEventId) } } override fun onNavigateUp() = navigateUp() - private fun onSendLocationClick() { - callbacks.forEach { it.onSendLocationClick() } + private fun navigateToSendLocation() { + callbacks.forEach { it.navigateToSendLocation() } } - private fun onCreatePollClick() { - callbacks.forEach { it.onCreatePollClick() } + private fun navigateToCreatePoll() { + callbacks.forEach { it.navigateToCreatePoll() } } - private fun onJoinCallClick() { - callbacks.forEach { it.onJoinCallClick(room.roomId) } + private fun navigateToRoomCall() { + callbacks.forEach { it.navigateToRoomCall(room.roomId) } } @Composable @@ -281,7 +281,7 @@ class ThreadedMessagesNode( } } }, - onUserDataClick = this::onUserDataClick, + onUserDataClick = this::navigateToRoomMemberDetails, onLinkClick = { url, customTab -> onLinkClick( activity = activity, @@ -291,9 +291,9 @@ class ThreadedMessagesNode( customTab = customTab, ) }, - onSendLocationClick = this::onSendLocationClick, - onCreatePollClick = this::onCreatePollClick, - onJoinCallClick = this::onJoinCallClick, + onSendLocationClick = this::navigateToSendLocation, + onCreatePollClick = this::navigateToCreatePoll, + onJoinCallClick = this::navigateToRoomCall, onViewAllPinnedMessagesClick = {}, modifier = modifier, knockRequestsBannerView = {}, diff --git a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/TimelinePresenter.kt b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/TimelinePresenter.kt index ae8e26bff4..8602de0532 100644 --- a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/TimelinePresenter.kt +++ b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/TimelinePresenter.kt @@ -185,7 +185,7 @@ class TimelinePresenter( } } is TimelineEvents.EditPoll -> { - navigator.onEditPollClick(event.pollStartId) + navigator.navigateToEditPoll(event.pollStartId) } is TimelineEvents.FocusOnEvent -> sessionCoroutineScope.launch { focusRequestState.value = FocusRequestState.Requested(event.eventId, event.debounce) @@ -210,10 +210,10 @@ class TimelinePresenter( is TimelineEvents.NavigateToPredecessorOrSuccessorRoom -> { // Navigate to the predecessor or successor room val serverNames = calculateServerNamesForRoom(room) - navigator.onNavigateToRoom(event.roomId, null, serverNames) + navigator.navigateToRoom(event.roomId, null, serverNames) } is TimelineEvents.OpenThread -> { - navigator.onOpenThread( + navigator.navigateToThread( threadRootId = event.threadRootEventId, focusedEventId = event.focusedEvent, ) @@ -314,7 +314,7 @@ class TimelinePresenter( if (timelineController.mainTimelineMode() is Timeline.Mode.Thread && threadId == null) { // We are in a thread timeline, and the event isn't part of a thread, we need to navigate back to the room focusRequestState.value = FocusRequestState.None - navigator.onNavigateToRoom(room.roomId, eventId, calculateServerNamesForRoom(room)) + navigator.navigateToRoom(room.roomId, eventId, calculateServerNamesForRoom(room)) } else { Timber.tag(tag).d("Focusing on event $eventId - thread $threadId") timelineController.focusOnEvent(eventId, threadId) @@ -331,7 +331,7 @@ class TimelinePresenter( } else { focusRequestState.value = FocusRequestState.Success(eventId = result.threadId.asEventId()) // It's part of a thread we're not in, let's open it in another timeline - navigator.onOpenThread(result.threadId, eventId) + navigator.navigateToThread(result.threadId, eventId) } } } diff --git a/features/messages/impl/src/test/kotlin/io/element/android/features/messages/impl/DefaultMessagesEntryPointTest.kt b/features/messages/impl/src/test/kotlin/io/element/android/features/messages/impl/DefaultMessagesEntryPointTest.kt index 88c0ca8020..1df6fc25f1 100644 --- a/features/messages/impl/src/test/kotlin/io/element/android/features/messages/impl/DefaultMessagesEntryPointTest.kt +++ b/features/messages/impl/src/test/kotlin/io/element/android/features/messages/impl/DefaultMessagesEntryPointTest.kt @@ -116,11 +116,11 @@ class DefaultMessagesEntryPointTest { ) } val callback = object : MessagesEntryPoint.Callback { - override fun onRoomDetailsClick() = lambdaError() - override fun onUserDataClick(userId: UserId) = lambdaError() - override fun onPermalinkClick(data: PermalinkData, pushToBackstack: Boolean) = lambdaError() + override fun navigateToRoomDetails() = lambdaError() + override fun navigateToRoomMemberDetails(userId: UserId) = lambdaError() + override fun handlePermalinkClick(data: PermalinkData, pushToBackstack: Boolean) = lambdaError() override fun forwardEvent(eventId: EventId) = lambdaError() - override fun openRoom(roomId: RoomId) = lambdaError() + override fun navigateToRoom(roomId: RoomId) = lambdaError() } val initialTarget = MessagesEntryPoint.InitialTarget.Messages(focusedEventId = AN_EVENT_ID) val params = MessagesEntryPoint.Params(initialTarget) diff --git a/features/messages/impl/src/test/kotlin/io/element/android/features/messages/impl/FakeMessagesNavigator.kt b/features/messages/impl/src/test/kotlin/io/element/android/features/messages/impl/FakeMessagesNavigator.kt index c26e7a83e2..04b34fe778 100644 --- a/features/messages/impl/src/test/kotlin/io/element/android/features/messages/impl/FakeMessagesNavigator.kt +++ b/features/messages/impl/src/test/kotlin/io/element/android/features/messages/impl/FakeMessagesNavigator.kt @@ -26,31 +26,31 @@ class FakeMessagesNavigator( private val onOpenThreadLambda: (threadRootId: ThreadId, focusedEventId: EventId?) -> Unit = { _, _ -> lambdaError() }, private val onNavigateUpLambda: () -> Unit = { lambdaError() }, ) : MessagesNavigator { - override fun onShowEventDebugInfoClick(eventId: EventId?, debugInfo: TimelineItemDebugInfo) { + override fun navigateToEventDebugInfo(eventId: EventId?, debugInfo: TimelineItemDebugInfo) { onShowEventDebugInfoClickLambda(eventId, debugInfo) } - override fun onForwardEventClick(eventId: EventId) { + override fun forwardEvent(eventId: EventId) { onForwardEventClickLambda(eventId) } - override fun onReportContentClick(eventId: EventId, senderId: UserId) { + override fun navigateToReportMessage(eventId: EventId, senderId: UserId) { onReportContentClickLambda(eventId, senderId) } - override fun onEditPollClick(eventId: EventId) { + override fun navigateToEditPoll(eventId: EventId) { onEditPollClickLambda(eventId) } - override fun onPreviewAttachment(attachments: ImmutableList, inReplyToEventId: EventId?) { + override fun navigateToPreviewAttachments(attachments: ImmutableList, inReplyToEventId: EventId?) { onPreviewAttachmentLambda(attachments, inReplyToEventId) } - override fun onNavigateToRoom(roomId: RoomId, eventId: EventId?, serverNames: List) { + override fun navigateToRoom(roomId: RoomId, eventId: EventId?, serverNames: List) { onNavigateToRoomLambda(roomId, eventId, serverNames) } - override fun onOpenThread(threadRootId: ThreadId, focusedEventId: EventId?) { + override fun navigateToThread(threadRootId: ThreadId, focusedEventId: EventId?) { onOpenThreadLambda(threadRootId, focusedEventId) } diff --git a/features/messages/impl/src/test/kotlin/io/element/android/features/messages/impl/pinned/list/FakePinnedMessagesListNavigator.kt b/features/messages/impl/src/test/kotlin/io/element/android/features/messages/impl/pinned/list/FakePinnedMessagesListNavigator.kt index bf0a24dd5a..fba3803806 100644 --- a/features/messages/impl/src/test/kotlin/io/element/android/features/messages/impl/pinned/list/FakePinnedMessagesListNavigator.kt +++ b/features/messages/impl/src/test/kotlin/io/element/android/features/messages/impl/pinned/list/FakePinnedMessagesListNavigator.kt @@ -12,17 +12,17 @@ import io.element.android.libraries.matrix.api.timeline.item.TimelineItemDebugIn class FakePinnedMessagesListNavigator : PinnedMessagesListNavigator { var onViewInTimelineClickLambda: ((EventId) -> Unit)? = null - override fun onViewInTimelineClick(eventId: EventId) { + override fun viewInTimeline(eventId: EventId) { onViewInTimelineClickLambda?.invoke(eventId) } var onShowEventDebugInfoClickLambda: ((EventId?, TimelineItemDebugInfo) -> Unit)? = null - override fun onShowEventDebugInfoClick(eventId: EventId?, debugInfo: TimelineItemDebugInfo) { + override fun navigateToEventDebugInfo(eventId: EventId?, debugInfo: TimelineItemDebugInfo) { onShowEventDebugInfoClickLambda?.invoke(eventId, debugInfo) } var onForwardEventClickLambda: ((EventId) -> Unit)? = null - override fun onForwardEventClick(eventId: EventId) { + override fun forwardEvent(eventId: EventId) { onForwardEventClickLambda?.invoke(eventId) } } diff --git a/features/poll/impl/src/main/kotlin/io/element/android/features/poll/impl/history/PollHistoryFlowNode.kt b/features/poll/impl/src/main/kotlin/io/element/android/features/poll/impl/history/PollHistoryFlowNode.kt index 19142508a1..0f8ae56887 100644 --- a/features/poll/impl/src/main/kotlin/io/element/android/features/poll/impl/history/PollHistoryFlowNode.kt +++ b/features/poll/impl/src/main/kotlin/io/element/android/features/poll/impl/history/PollHistoryFlowNode.kt @@ -64,7 +64,7 @@ class PollHistoryFlowNode( } NavTarget.Root -> { val callback = object : PollHistoryNode.Callback { - override fun onEditPoll(pollStartEventId: EventId) { + override fun navigateToEditPoll(pollStartEventId: EventId) { backstack.push(NavTarget.EditPoll(pollStartEventId)) } } diff --git a/features/poll/impl/src/main/kotlin/io/element/android/features/poll/impl/history/PollHistoryNode.kt b/features/poll/impl/src/main/kotlin/io/element/android/features/poll/impl/history/PollHistoryNode.kt index 3fdfdb921f..3ebabe5a2f 100644 --- a/features/poll/impl/src/main/kotlin/io/element/android/features/poll/impl/history/PollHistoryNode.kt +++ b/features/poll/impl/src/main/kotlin/io/element/android/features/poll/impl/history/PollHistoryNode.kt @@ -30,11 +30,11 @@ class PollHistoryNode( plugins = plugins, ) { interface Callback : Plugin { - fun onEditPoll(pollStartEventId: EventId) + fun navigateToEditPoll(pollStartEventId: EventId) } private fun onEditPoll(pollStartEventId: EventId) { - plugins().forEach { it.onEditPoll(pollStartEventId) } + plugins().forEach { it.navigateToEditPoll(pollStartEventId) } } @Composable diff --git a/features/preferences/api/src/main/kotlin/io/element/android/features/preferences/api/PreferencesEntryPoint.kt b/features/preferences/api/src/main/kotlin/io/element/android/features/preferences/api/PreferencesEntryPoint.kt index c0affde2df..b828fab0ff 100644 --- a/features/preferences/api/src/main/kotlin/io/element/android/features/preferences/api/PreferencesEntryPoint.kt +++ b/features/preferences/api/src/main/kotlin/io/element/android/features/preferences/api/PreferencesEntryPoint.kt @@ -40,10 +40,10 @@ interface PreferencesEntryPoint : FeatureEntryPoint { } interface Callback : Plugin { - fun onAddAccount() - fun onOpenBugReport() - fun onSecureBackupClick() - fun onOpenRoomNotificationSettings(roomId: RoomId) - fun navigateTo(roomId: RoomId, eventId: EventId) + fun navigateToAddAccount() + fun navigateToBugReport() + fun navigateToSecureBackup() + fun navigateToRoomNotificationSettings(roomId: RoomId) + fun navigateToEvent(roomId: RoomId, eventId: EventId) } } diff --git a/features/preferences/impl/src/main/kotlin/io/element/android/features/preferences/impl/PreferencesFlowNode.kt b/features/preferences/impl/src/main/kotlin/io/element/android/features/preferences/impl/PreferencesFlowNode.kt index e4ba87c43a..4903f9d2cf 100644 --- a/features/preferences/impl/src/main/kotlin/io/element/android/features/preferences/impl/PreferencesFlowNode.kt +++ b/features/preferences/impl/src/main/kotlin/io/element/android/features/preferences/impl/PreferencesFlowNode.kt @@ -120,59 +120,59 @@ class PreferencesFlowNode( return when (navTarget) { NavTarget.Root -> { val callback = object : PreferencesRootNode.Callback { - override fun onAddAccount() { - plugins().forEach { it.onAddAccount() } + override fun navigateToAddAccount() { + plugins().forEach { it.navigateToAddAccount() } } - override fun onOpenBugReport() { - plugins().forEach { it.onOpenBugReport() } + override fun navigateToBugReport() { + plugins().forEach { it.navigateToBugReport() } } - override fun onSecureBackupClick() { - plugins().forEach { it.onSecureBackupClick() } + override fun navigateToSecureBackup() { + plugins().forEach { it.navigateToSecureBackup() } } - override fun onOpenAnalytics() { + override fun navigateToAnalyticsSettings() { backstack.push(NavTarget.AnalyticsSettings) } - override fun onOpenAbout() { + override fun navigateToAbout() { backstack.push(NavTarget.About) } - override fun onOpenDeveloperSettings() { + override fun navigateToDeveloperSettings() { backstack.push(NavTarget.DeveloperSettings) } - override fun onOpenNotificationSettings() { + override fun navigateToNotificationSettings() { backstack.push(NavTarget.NotificationSettings) } - override fun onOpenLockScreenSettings() { + override fun navigateToLockScreenSettings() { backstack.push(NavTarget.LockScreenSettings) } - override fun onOpenAdvancedSettings() { + override fun navigateToAdvancedSettings() { backstack.push(NavTarget.AdvancedSettings) } - override fun onOpenLabs() { + override fun navigateToLabs() { backstack.push(NavTarget.Labs) } - override fun onOpenUserProfile(matrixUser: MatrixUser) { + override fun navigateToUserProfile(matrixUser: MatrixUser) { backstack.push(NavTarget.UserProfile(matrixUser)) } - override fun onOpenBlockedUsers() { + override fun navigateToBlockedUsers() { backstack.push(NavTarget.BlockedUsers) } - override fun onSignOutClick() { + override fun startSignOutFlow() { backstack.push(NavTarget.SignOut) } - override fun onOpenAccountDeactivation() { + override fun startAccountDeactivationFlow() { backstack.push(NavTarget.AccountDeactivation) } } @@ -180,7 +180,7 @@ class PreferencesFlowNode( } NavTarget.DeveloperSettings -> { val developerSettingsCallback = object : DeveloperSettingsNode.Callback { - override fun onPushHistoryClick() { + override fun navigateToPushHistory() { backstack.push(NavTarget.PushHistory) } } @@ -191,7 +191,7 @@ class PreferencesFlowNode( } NavTarget.About -> { val callback = object : AboutNode.Callback { - override fun openOssLicenses() { + override fun navigateToOssLicenses() { backstack.push(NavTarget.OssLicenses) } } @@ -202,11 +202,11 @@ class PreferencesFlowNode( } NavTarget.NotificationSettings -> { val notificationSettingsCallback = object : NotificationSettingsNode.Callback { - override fun editDefaultNotificationMode(isOneToOne: Boolean) { + override fun navigateToEditDefaultNotificationSetting(isOneToOne: Boolean) { backstack.push(NavTarget.EditDefaultNotificationSetting(isOneToOne)) } - override fun onTroubleshootNotificationsClick() { + override fun navigateToTroubleshootNotifications() { backstack.push(NavTarget.TroubleshootNotifications) } } @@ -223,7 +223,7 @@ class PreferencesFlowNode( } } - override fun openIgnoredUsers() { + override fun navigateToBlockedUsers() { backstack.push(NavTarget.BlockedUsers) } }) @@ -240,16 +240,16 @@ class PreferencesFlowNode( } } - override fun navigateTo(roomId: RoomId, eventId: EventId) { - plugins().forEach { it.navigateTo(roomId, eventId) } + override fun navigateToEvent(roomId: RoomId, eventId: EventId) { + plugins().forEach { it.navigateToEvent(roomId, eventId) } } }) .build() } is NavTarget.EditDefaultNotificationSetting -> { val callback = object : EditDefaultNotificationSettingNode.Callback { - override fun openRoomNotificationSettings(roomId: RoomId) { - plugins().forEach { it.onOpenRoomNotificationSettings(roomId) } + override fun navigateToRoomNotificationSettings(roomId: RoomId) { + plugins().forEach { it.navigateToRoomNotificationSettings(roomId) } } } val input = EditDefaultNotificationSettingNode.Inputs(navTarget.isOneToOne) @@ -270,8 +270,8 @@ class PreferencesFlowNode( } NavTarget.SignOut -> { val callBack: LogoutEntryPoint.Callback = object : LogoutEntryPoint.Callback { - override fun onChangeRecoveryKeyClick() { - plugins().forEach { it.onSecureBackupClick() } + override fun navigateToSecureBackup() { + plugins().forEach { it.navigateToSecureBackup() } } } logoutEntryPoint.nodeBuilder(this, buildContext) diff --git a/features/preferences/impl/src/main/kotlin/io/element/android/features/preferences/impl/about/AboutNode.kt b/features/preferences/impl/src/main/kotlin/io/element/android/features/preferences/impl/about/AboutNode.kt index 37de32bab7..564189442c 100644 --- a/features/preferences/impl/src/main/kotlin/io/element/android/features/preferences/impl/about/AboutNode.kt +++ b/features/preferences/impl/src/main/kotlin/io/element/android/features/preferences/impl/about/AboutNode.kt @@ -29,7 +29,7 @@ class AboutNode( private val presenter: AboutPresenter, ) : Node(buildContext, plugins = plugins) { interface Callback : Plugin { - fun openOssLicenses() + fun navigateToOssLicenses() } private fun onElementLegalClick( @@ -52,7 +52,7 @@ class AboutNode( onElementLegalClick(activity, isDark, elementLegal) }, onOpenSourceLicensesClick = { - plugins.filterIsInstance().forEach { it.openOssLicenses() } + plugins.filterIsInstance().forEach { it.navigateToOssLicenses() } }, modifier = modifier ) diff --git a/features/preferences/impl/src/main/kotlin/io/element/android/features/preferences/impl/developer/DeveloperSettingsNode.kt b/features/preferences/impl/src/main/kotlin/io/element/android/features/preferences/impl/developer/DeveloperSettingsNode.kt index 6208d0123e..6f18fd44dc 100644 --- a/features/preferences/impl/src/main/kotlin/io/element/android/features/preferences/impl/developer/DeveloperSettingsNode.kt +++ b/features/preferences/impl/src/main/kotlin/io/element/android/features/preferences/impl/developer/DeveloperSettingsNode.kt @@ -29,13 +29,13 @@ class DeveloperSettingsNode( private val presenter: DeveloperSettingsPresenter, ) : Node(buildContext, plugins = plugins) { interface Callback : Plugin { - fun onPushHistoryClick() + fun navigateToPushHistory() } private val callbacks = plugins() - private fun onPushHistoryClick() { - callbacks.forEach { it.onPushHistoryClick() } + private fun navigateToPushHistory() { + callbacks.forEach { it.navigateToPushHistory() } } @Composable @@ -51,7 +51,7 @@ class DeveloperSettingsNode( state = state, modifier = modifier, onOpenShowkase = ::openShowkase, - onPushHistoryClick = ::onPushHistoryClick, + onPushHistoryClick = ::navigateToPushHistory, onBackClick = ::navigateUp ) } diff --git a/features/preferences/impl/src/main/kotlin/io/element/android/features/preferences/impl/notifications/NotificationSettingsNode.kt b/features/preferences/impl/src/main/kotlin/io/element/android/features/preferences/impl/notifications/NotificationSettingsNode.kt index f488889c5b..2b2879a4da 100644 --- a/features/preferences/impl/src/main/kotlin/io/element/android/features/preferences/impl/notifications/NotificationSettingsNode.kt +++ b/features/preferences/impl/src/main/kotlin/io/element/android/features/preferences/impl/notifications/NotificationSettingsNode.kt @@ -26,18 +26,18 @@ class NotificationSettingsNode( private val presenter: NotificationSettingsPresenter, ) : Node(buildContext, plugins = plugins) { interface Callback : Plugin { - fun editDefaultNotificationMode(isOneToOne: Boolean) - fun onTroubleshootNotificationsClick() + fun navigateToEditDefaultNotificationSetting(isOneToOne: Boolean) + fun navigateToTroubleshootNotifications() } private val callbacks = plugins() - private fun openEditDefault(isOneToOne: Boolean) { - callbacks.forEach { it.editDefaultNotificationMode(isOneToOne) } + private fun navigateToEditDefaultNotificationSetting(isOneToOne: Boolean) { + callbacks.forEach { it.navigateToEditDefaultNotificationSetting(isOneToOne) } } - private fun onTroubleshootNotificationsClick() { - callbacks.forEach { it.onTroubleshootNotificationsClick() } + private fun navigateToTroubleshootNotifications() { + callbacks.forEach { it.navigateToTroubleshootNotifications() } } @Composable @@ -45,9 +45,9 @@ class NotificationSettingsNode( val state = presenter.present() NotificationSettingsView( state = state, - onOpenEditDefault = { openEditDefault(isOneToOne = it) }, + onOpenEditDefault = ::navigateToEditDefaultNotificationSetting, onBackClick = ::navigateUp, - onTroubleshootNotificationsClick = ::onTroubleshootNotificationsClick, + onTroubleshootNotificationsClick = ::navigateToTroubleshootNotifications, modifier = modifier, ) } diff --git a/features/preferences/impl/src/main/kotlin/io/element/android/features/preferences/impl/notifications/edit/EditDefaultNotificationSettingNode.kt b/features/preferences/impl/src/main/kotlin/io/element/android/features/preferences/impl/notifications/edit/EditDefaultNotificationSettingNode.kt index ccba221d9a..e697089ad1 100644 --- a/features/preferences/impl/src/main/kotlin/io/element/android/features/preferences/impl/notifications/edit/EditDefaultNotificationSettingNode.kt +++ b/features/preferences/impl/src/main/kotlin/io/element/android/features/preferences/impl/notifications/edit/EditDefaultNotificationSettingNode.kt @@ -29,7 +29,7 @@ class EditDefaultNotificationSettingNode( presenterFactory: EditDefaultNotificationSettingPresenter.Factory ) : Node(buildContext, plugins = plugins) { interface Callback : Plugin { - fun openRoomNotificationSettings(roomId: RoomId) + fun navigateToRoomNotificationSettings(roomId: RoomId) } data class Inputs( @@ -40,8 +40,8 @@ class EditDefaultNotificationSettingNode( private val callbacks = plugins() private val presenter = presenterFactory.create(inputs.isOneToOne) - private fun openRoomNotificationSettings(roomId: RoomId) { - callbacks.forEach { it.openRoomNotificationSettings(roomId) } + private fun navigateToRoomNotificationSettings(roomId: RoomId) { + callbacks.forEach { it.navigateToRoomNotificationSettings(roomId) } } @Composable @@ -49,7 +49,7 @@ class EditDefaultNotificationSettingNode( val state = presenter.present() EditDefaultNotificationSettingView( state = state, - openRoomNotificationSettings = { openRoomNotificationSettings(it) }, + openRoomNotificationSettings = { navigateToRoomNotificationSettings(it) }, onBackClick = ::navigateUp, modifier = modifier, ) diff --git a/features/preferences/impl/src/main/kotlin/io/element/android/features/preferences/impl/root/PreferencesRootNode.kt b/features/preferences/impl/src/main/kotlin/io/element/android/features/preferences/impl/root/PreferencesRootNode.kt index 67d50a76f0..ba6edb97e0 100644 --- a/features/preferences/impl/src/main/kotlin/io/element/android/features/preferences/impl/root/PreferencesRootNode.kt +++ b/features/preferences/impl/src/main/kotlin/io/element/android/features/preferences/impl/root/PreferencesRootNode.kt @@ -34,52 +34,52 @@ class PreferencesRootNode( private val directLogoutView: DirectLogoutView, ) : Node(buildContext, plugins = plugins) { interface Callback : Plugin { - fun onAddAccount() - fun onOpenBugReport() - fun onSecureBackupClick() - fun onOpenAnalytics() - fun onOpenAbout() - fun onOpenDeveloperSettings() - fun onOpenNotificationSettings() - fun onOpenLockScreenSettings() - fun onOpenAdvancedSettings() - fun onOpenLabs() - fun onOpenUserProfile(matrixUser: MatrixUser) - fun onOpenBlockedUsers() - fun onSignOutClick() - fun onOpenAccountDeactivation() + fun navigateToAddAccount() + fun navigateToBugReport() + fun navigateToSecureBackup() + fun navigateToAnalyticsSettings() + fun navigateToAbout() + fun navigateToDeveloperSettings() + fun navigateToNotificationSettings() + fun navigateToLockScreenSettings() + fun navigateToAdvancedSettings() + fun navigateToLabs() + fun navigateToUserProfile(matrixUser: MatrixUser) + fun navigateToBlockedUsers() + fun startSignOutFlow() + fun startAccountDeactivationFlow() } private fun onAddAccount() { - plugins().forEach { it.onAddAccount() } + plugins().forEach { it.navigateToAddAccount() } } private fun onOpenBugReport() { - plugins().forEach { it.onOpenBugReport() } + plugins().forEach { it.navigateToBugReport() } } private fun onSecureBackupClick() { - plugins().forEach { it.onSecureBackupClick() } + plugins().forEach { it.navigateToSecureBackup() } } private fun onOpenDeveloperSettings() { - plugins().forEach { it.onOpenDeveloperSettings() } + plugins().forEach { it.navigateToDeveloperSettings() } } private fun onOpenAdvancedSettings() { - plugins().forEach { it.onOpenAdvancedSettings() } + plugins().forEach { it.navigateToAdvancedSettings() } } private fun onOpenLabs() { - plugins().forEach { it.onOpenLabs() } + plugins().forEach { it.navigateToLabs() } } private fun onOpenAnalytics() { - plugins().forEach { it.onOpenAnalytics() } + plugins().forEach { it.navigateToAnalyticsSettings() } } private fun onOpenAbout() { - plugins().forEach { it.onOpenAbout() } + plugins().forEach { it.navigateToAbout() } } private fun onManageAccountClick( @@ -97,27 +97,27 @@ class PreferencesRootNode( } private fun onOpenNotificationSettings() { - plugins().forEach { it.onOpenNotificationSettings() } + plugins().forEach { it.navigateToNotificationSettings() } } private fun onOpenLockScreenSettings() { - plugins().forEach { it.onOpenLockScreenSettings() } + plugins().forEach { it.navigateToLockScreenSettings() } } private fun onOpenUserProfile(matrixUser: MatrixUser) { - plugins().forEach { it.onOpenUserProfile(matrixUser) } + plugins().forEach { it.navigateToUserProfile(matrixUser) } } private fun onOpenBlockedUsers() { - plugins().forEach { it.onOpenBlockedUsers() } + plugins().forEach { it.navigateToBlockedUsers() } } private fun onSignOutClick() { - plugins().forEach { it.onSignOutClick() } + plugins().forEach { it.startSignOutFlow() } } private fun onOpenAccountDeactivation() { - plugins().forEach { it.onOpenAccountDeactivation() } + plugins().forEach { it.startAccountDeactivationFlow() } } @Composable diff --git a/features/preferences/impl/src/test/kotlin/io/element/android/features/preferences/impl/DefaultPreferencesEntryPointTest.kt b/features/preferences/impl/src/test/kotlin/io/element/android/features/preferences/impl/DefaultPreferencesEntryPointTest.kt index 9e1bd70376..deb15561de 100644 --- a/features/preferences/impl/src/test/kotlin/io/element/android/features/preferences/impl/DefaultPreferencesEntryPointTest.kt +++ b/features/preferences/impl/src/test/kotlin/io/element/android/features/preferences/impl/DefaultPreferencesEntryPointTest.kt @@ -63,11 +63,11 @@ class DefaultPreferencesEntryPointTest { ) } val callback = object : PreferencesEntryPoint.Callback { - override fun onAddAccount() = lambdaError() - override fun onOpenBugReport() = lambdaError() - override fun onSecureBackupClick() = lambdaError() - override fun onOpenRoomNotificationSettings(roomId: RoomId) = lambdaError() - override fun navigateTo(roomId: RoomId, eventId: EventId) = lambdaError() + override fun navigateToAddAccount() = lambdaError() + override fun navigateToBugReport() = lambdaError() + override fun navigateToSecureBackup() = lambdaError() + override fun navigateToRoomNotificationSettings(roomId: RoomId) = lambdaError() + override fun navigateToEvent(roomId: RoomId, eventId: EventId) = lambdaError() } val params = PreferencesEntryPoint.Params( initialElement = PreferencesEntryPoint.InitialTarget.NotificationSettings, diff --git a/features/rageshake/impl/src/main/kotlin/io/element/android/features/rageshake/impl/bugreport/BugReportFlowNode.kt b/features/rageshake/impl/src/main/kotlin/io/element/android/features/rageshake/impl/bugreport/BugReportFlowNode.kt index 10af89f740..4e1f599237 100644 --- a/features/rageshake/impl/src/main/kotlin/io/element/android/features/rageshake/impl/bugreport/BugReportFlowNode.kt +++ b/features/rageshake/impl/src/main/kotlin/io/element/android/features/rageshake/impl/bugreport/BugReportFlowNode.kt @@ -64,7 +64,7 @@ class BugReportFlowNode( this@BugReportFlowNode.onDone() } - override fun onViewLogs(basePath: String) { + override fun navigateToViewLogs(basePath: String) { backstack.push(NavTarget.ViewLogs(rootPath = basePath)) } } diff --git a/features/rageshake/impl/src/main/kotlin/io/element/android/features/rageshake/impl/bugreport/BugReportNode.kt b/features/rageshake/impl/src/main/kotlin/io/element/android/features/rageshake/impl/bugreport/BugReportNode.kt index e307dba8ec..1d3974d166 100644 --- a/features/rageshake/impl/src/main/kotlin/io/element/android/features/rageshake/impl/bugreport/BugReportNode.kt +++ b/features/rageshake/impl/src/main/kotlin/io/element/android/features/rageshake/impl/bugreport/BugReportNode.kt @@ -32,11 +32,11 @@ class BugReportNode( ) : Node(buildContext, plugins = plugins) { interface Callback : Plugin { fun onDone() - fun onViewLogs(basePath: String) + fun navigateToViewLogs(basePath: String) } private fun onViewLogs(basePath: String) { - plugins().forEach { it.onViewLogs(basePath) } + plugins().forEach { it.navigateToViewLogs(basePath) } } private fun onDone() { diff --git a/features/roomdetails/api/src/main/kotlin/io/element/android/features/roomdetails/api/RoomDetailsEntryPoint.kt b/features/roomdetails/api/src/main/kotlin/io/element/android/features/roomdetails/api/RoomDetailsEntryPoint.kt index 48fcac8ee6..4b47f6b276 100644 --- a/features/roomdetails/api/src/main/kotlin/io/element/android/features/roomdetails/api/RoomDetailsEntryPoint.kt +++ b/features/roomdetails/api/src/main/kotlin/io/element/android/features/roomdetails/api/RoomDetailsEntryPoint.kt @@ -37,10 +37,10 @@ interface RoomDetailsEntryPoint : FeatureEntryPoint { data class Params(val initialElement: InitialTarget) : NodeInputs interface Callback : Plugin { - fun onOpenGlobalNotificationSettings() - fun onOpenRoom(roomId: RoomId, serverNames: List) - fun onPermalinkClick(data: PermalinkData, pushToBackstack: Boolean) - fun forwardEvent(eventId: EventId) + fun navigateToGlobalNotificationSettings() + fun navigateToRoom(roomId: RoomId, serverNames: List) + fun handlePermalinkClick(data: PermalinkData, pushToBackstack: Boolean) + fun startForwardEventFlow(eventId: EventId) } interface NodeBuilder { diff --git a/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/RoomDetailsFlowNode.kt b/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/RoomDetailsFlowNode.kt index b0540626b9..895fd9dd59 100644 --- a/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/RoomDetailsFlowNode.kt +++ b/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/RoomDetailsFlowNode.kt @@ -167,55 +167,55 @@ class RoomDetailsFlowNode( return when (navTarget) { NavTarget.RoomDetails -> { val roomDetailsCallback = object : RoomDetailsNode.Callback { - override fun openRoomMemberList() { + override fun navigateToRoomMemberList() { backstack.push(NavTarget.RoomMemberList) } - override fun editRoomDetails() { + override fun navigateToRoomDetailsEdit() { backstack.push(NavTarget.RoomDetailsEdit) } - override fun openInviteMembers() { + override fun navigateToInviteMembers() { backstack.push(NavTarget.InviteMembers) } - override fun openRoomNotificationSettings() { + override fun navigateToRoomNotificationSettings() { backstack.push(NavTarget.RoomNotificationSettings(showUserDefinedSettingStyle = false)) } - override fun openAvatarPreview(name: String, url: String) { + override fun navigateToAvatarPreview(name: String, url: String) { overlay.show(NavTarget.AvatarPreview(name, url)) } - override fun openPollHistory() { + override fun navigateToPollHistory() { backstack.push(NavTarget.PollHistory) } - override fun openMediaGallery() { + override fun navigateToMediaGallery() { backstack.push(NavTarget.MediaGallery) } - override fun openAdminSettings() { + override fun navigateToAdminSettings() { backstack.push(NavTarget.AdminSettings) } - override fun openPinnedMessagesList() { + override fun navigateToPinnedMessagesList() { backstack.push(NavTarget.PinnedMessagesList) } - override fun openKnockRequestsList() { + override fun navigateToKnockRequestsList() { backstack.push(NavTarget.KnockRequestsList) } - override fun openSecurityAndPrivacy() { + override fun navigateToSecurityAndPrivacy() { backstack.push(NavTarget.SecurityAndPrivacy) } - override fun openDmUserProfile(userId: UserId) { + override fun navigateToRoomMemberDetails(userId: UserId) { backstack.push(NavTarget.RoomMemberDetails(userId)) } - override fun onJoinCall() { + override fun navigateToRoomCall() { val inputs = CallType.RoomCall( sessionId = room.sessionId, roomId = room.roomId, @@ -224,11 +224,11 @@ class RoomDetailsFlowNode( elementCallEntryPoint.startCall(inputs) } - override fun openReportRoom() { + override fun navigateToReportRoom() { backstack.push(NavTarget.ReportRoom) } - override fun onSelectNewOwnersWhenLeaving() { + override fun navigateToSelectNewOwnersWhenLeaving() { backstack.push(NavTarget.SelectNewOwnersWhenLeaving) } } @@ -237,11 +237,11 @@ class RoomDetailsFlowNode( NavTarget.RoomMemberList -> { val roomMemberListCallback = object : RoomMemberListNode.Callback { - override fun openRoomMemberDetails(roomMemberId: UserId) { + override fun navigateToRoomMemberDetails(roomMemberId: UserId) { backstack.push(NavTarget.RoomMemberDetails(roomMemberId)) } - override fun openInviteMembers() { + override fun navigateToInviteMembers() { backstack.push(NavTarget.InviteMembers) } } @@ -259,8 +259,8 @@ class RoomDetailsFlowNode( is NavTarget.RoomNotificationSettings -> { val input = RoomNotificationSettingsNode.RoomNotificationSettingInput(navTarget.showUserDefinedSettingStyle) val callback = object : RoomNotificationSettingsNode.Callback { - override fun openGlobalNotificationSettings() { - plugins().forEach { it.onOpenGlobalNotificationSettings() } + override fun navigateToGlobalNotificationSettings() { + plugins().forEach { it.navigateToGlobalNotificationSettings() } } } createNode(buildContext, listOf(input, callback)) @@ -268,19 +268,19 @@ class RoomDetailsFlowNode( is NavTarget.RoomMemberDetails -> { val callback = object : UserProfileNodeHelper.Callback { - override fun openAvatarPreview(username: String, avatarUrl: String) { + override fun navigateToAvatarPreview(username: String, avatarUrl: String) { overlay.show(NavTarget.AvatarPreview(username, avatarUrl)) } - override fun onStartDM(roomId: RoomId) { - plugins().forEach { it.onOpenRoom(roomId, emptyList()) } + override fun navigateToRoom(roomId: RoomId) { + plugins().forEach { it.navigateToRoom(roomId, emptyList()) } } - override fun onStartCall(dmRoomId: RoomId) { + override fun startCall(dmRoomId: RoomId) { elementCallEntryPoint.startCall(CallType.RoomCall(roomId = dmRoomId, sessionId = room.sessionId)) } - override fun onVerifyUser(userId: UserId) { + override fun startVerifyUserFlow(userId: UserId) { backstack.push(NavTarget.VerifyUser(userId)) } } @@ -293,11 +293,11 @@ class RoomDetailsFlowNode( overlay.hide() } - override fun onViewInTimeline(eventId: EventId) { + override fun viewInTimeline(eventId: EventId) { // Cannot happen } - override fun onForwardEvent(eventId: EventId) { + override fun forwardEvent(eventId: EventId) { // Cannot happen } } @@ -318,18 +318,18 @@ class RoomDetailsFlowNode( backstack.pop() } - override fun onViewInTimeline(eventId: EventId) { + override fun viewInTimeline(eventId: EventId) { val permalinkData = PermalinkData.RoomLink( roomIdOrAlias = room.roomId.toRoomIdOrAlias(), eventId = eventId, ) plugins().forEach { - it.onPermalinkClick(permalinkData, pushToBackstack = false) + it.handlePermalinkClick(permalinkData, pushToBackstack = false) } } - override fun forwardEvent(eventId: EventId) { - plugins().forEach { it.forwardEvent(eventId) } + override fun forward(eventId: EventId) { + plugins().forEach { it.startForwardEventFlow(eventId) } } } mediaGalleryEntryPoint.nodeBuilder(this, buildContext) @@ -345,20 +345,20 @@ class RoomDetailsFlowNode( MessagesEntryPoint.InitialTarget.PinnedMessages ) val callback = object : MessagesEntryPoint.Callback { - override fun onRoomDetailsClick() = Unit + override fun navigateToRoomDetails() = Unit - override fun onUserDataClick(userId: UserId) = Unit + override fun navigateToRoomMemberDetails(userId: UserId) = Unit - override fun onPermalinkClick(data: PermalinkData, pushToBackstack: Boolean) { - plugins().forEach { it.onPermalinkClick(data, pushToBackstack) } + override fun handlePermalinkClick(data: PermalinkData, pushToBackstack: Boolean) { + plugins().forEach { it.handlePermalinkClick(data, pushToBackstack) } } override fun forwardEvent(eventId: EventId) { - plugins().forEach { it.forwardEvent(eventId) } + plugins().forEach { it.startForwardEventFlow(eventId) } } - override fun openRoom(roomId: RoomId) { - plugins().forEach { it.onOpenRoom(roomId, emptyList()) } + override fun navigateToRoom(roomId: RoomId) { + plugins().forEach { it.navigateToRoom(roomId, emptyList()) } } } return messagesEntryPoint.nodeBuilder(this, buildContext) @@ -388,7 +388,7 @@ class RoomDetailsFlowNode( backstack.pop() } - override fun onLearnMoreAboutEncryption() { + override fun navigateToLearnMoreAboutEncryption() { learnMoreUrl.value = LearnMoreConfig.ENCRYPTION_URL } }) diff --git a/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/RoomDetailsNode.kt b/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/RoomDetailsNode.kt index 2ada71dbc8..ea37c0f774 100644 --- a/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/RoomDetailsNode.kt +++ b/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/RoomDetailsNode.kt @@ -46,21 +46,21 @@ class RoomDetailsNode( private val leaveRoomRenderer: LeaveRoomRenderer, ) : Node(buildContext, plugins = plugins) { interface Callback : Plugin { - fun openRoomMemberList() - fun openInviteMembers() - fun editRoomDetails() - fun openRoomNotificationSettings() - fun openAvatarPreview(name: String, url: String) - fun openPollHistory() - fun openMediaGallery() - fun openAdminSettings() - fun openPinnedMessagesList() - fun openKnockRequestsList() - fun openSecurityAndPrivacy() - fun openDmUserProfile(userId: UserId) - fun onJoinCall() - fun openReportRoom() - fun onSelectNewOwnersWhenLeaving() + fun navigateToRoomMemberList() + fun navigateToInviteMembers() + fun navigateToRoomDetailsEdit() + fun navigateToRoomNotificationSettings() + fun navigateToAvatarPreview(name: String, url: String) + fun navigateToPollHistory() + fun navigateToMediaGallery() + fun navigateToAdminSettings() + fun navigateToPinnedMessagesList() + fun navigateToKnockRequestsList() + fun navigateToSecurityAndPrivacy() + fun navigateToRoomMemberDetails(userId: UserId) + fun navigateToRoomCall() + fun navigateToReportRoom() + fun navigateToSelectNewOwnersWhenLeaving() } private val callback = plugins().first() @@ -74,27 +74,27 @@ class RoomDetailsNode( } private fun openRoomMemberList() { - callback.openRoomMemberList() + callback.navigateToRoomMemberList() } private fun openRoomNotificationSettings() { - callback.openRoomNotificationSettings() + callback.navigateToRoomNotificationSettings() } private fun invitePeople() { - callback.openInviteMembers() + callback.navigateToInviteMembers() } private fun openPollHistory() { - callback.openPollHistory() + callback.navigateToPollHistory() } private fun openMediaGallery() { - callback.openMediaGallery() + callback.navigateToMediaGallery() } private fun onJoinCall() { - callback.onJoinCall() + callback.navigateToRoomCall() } private fun CoroutineScope.onShareRoom(context: Context) = launch { @@ -113,39 +113,39 @@ class RoomDetailsNode( } private fun onEditRoomDetails() { - callback.editRoomDetails() + callback.navigateToRoomDetailsEdit() } private fun openAvatarPreview(name: String, url: String) { - callback.openAvatarPreview(name, url) + callback.navigateToAvatarPreview(name, url) } private fun openAdminSettings() { - callback.openAdminSettings() + callback.navigateToAdminSettings() } private fun openPinnedMessages() { - callback.openPinnedMessagesList() + callback.navigateToPinnedMessagesList() } private fun openKnockRequestsLists() { - callback.openKnockRequestsList() + callback.navigateToKnockRequestsList() } private fun openSecurityAndPrivacy() { - callback.openSecurityAndPrivacy() + callback.navigateToSecurityAndPrivacy() } private fun onProfileClick(userId: UserId) { - callback.openDmUserProfile(userId) + callback.navigateToRoomMemberDetails(userId) } private fun onReportRoomClick() { - callback.openReportRoom() + callback.navigateToReportRoom() } private fun onSelectNewOwnersWhenLeaving() { - return callback.onSelectNewOwnersWhenLeaving() + return callback.navigateToSelectNewOwnersWhenLeaving() } private val stateFlow = launchMolecule { presenter.present() } diff --git a/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/members/RoomMemberListNode.kt b/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/members/RoomMemberListNode.kt index cc7a6e2151..27a0bceb66 100644 --- a/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/members/RoomMemberListNode.kt +++ b/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/members/RoomMemberListNode.kt @@ -35,8 +35,8 @@ class RoomMemberListNode( private val roomMemberModerationRenderer: RoomMemberModerationRenderer, ) : Node(buildContext, plugins = plugins), RoomMemberListNavigator { interface Callback : Plugin { - fun openRoomMemberDetails(roomMemberId: UserId) - fun openInviteMembers() + fun navigateToRoomMemberDetails(roomMemberId: UserId) + fun navigateToInviteMembers() } private val callbacks = plugins() @@ -51,13 +51,13 @@ class RoomMemberListNode( override fun openRoomMemberDetails(roomMemberId: UserId) { callbacks.forEach { - it.openRoomMemberDetails(roomMemberId) + it.navigateToRoomMemberDetails(roomMemberId) } } override fun openInviteMembers() { callbacks.forEach { - it.openInviteMembers() + it.navigateToInviteMembers() } } diff --git a/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/members/details/RoomMemberDetailsNode.kt b/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/members/details/RoomMemberDetailsNode.kt index 3b364c6f92..52aa7924e6 100644 --- a/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/members/details/RoomMemberDetailsNode.kt +++ b/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/members/details/RoomMemberDetailsNode.kt @@ -62,12 +62,12 @@ class RoomMemberDetailsNode( userProfileNodeHelper.onShareUser(context, permalinkBuilder) } - fun onStartDM(roomId: RoomId) { - callback.onStartDM(roomId) + fun navigateToRoom(roomId: RoomId) { + callback.navigateToRoom(roomId) } fun onStartCall(roomId: RoomId) { - callback.onStartCall(roomId) + callback.startCall(roomId) } val state = presenter.present() @@ -77,10 +77,10 @@ class RoomMemberDetailsNode( modifier = modifier, goBack = this::navigateUp, onShareUser = ::onShareUser, - onOpenDm = ::onStartDM, + onOpenDm = ::navigateToRoom, onStartCall = ::onStartCall, - openAvatarPreview = callback::openAvatarPreview, - onVerifyClick = callback::onVerifyUser, + openAvatarPreview = callback::navigateToAvatarPreview, + onVerifyClick = callback::startVerifyUserFlow, ) } } diff --git a/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/notificationsettings/RoomNotificationSettingsNode.kt b/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/notificationsettings/RoomNotificationSettingsNode.kt index 0e5a9b23b1..ec78bf56af 100644 --- a/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/notificationsettings/RoomNotificationSettingsNode.kt +++ b/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/notificationsettings/RoomNotificationSettingsNode.kt @@ -35,13 +35,13 @@ class RoomNotificationSettingsNode( val showUserDefinedSettingStyle: Boolean ) : NodeInputs interface Callback : Plugin { - fun openGlobalNotificationSettings() + fun navigateToGlobalNotificationSettings() } private val inputs = inputs() private val callbacks = plugins() - private fun openGlobalNotificationSettings() { - callbacks.forEach { it.openGlobalNotificationSettings() } + private fun navigateToGlobalNotificationSettings() { + callbacks.forEach { it.navigateToGlobalNotificationSettings() } } private val presenter = presenterFactory.create(inputs.showUserDefinedSettingStyle) @@ -59,7 +59,7 @@ class RoomNotificationSettingsNode( RoomNotificationSettingsView( state = state, modifier = modifier, - onShowGlobalNotifications = this::openGlobalNotificationSettings, + onShowGlobalNotifications = this::navigateToGlobalNotificationSettings, onBackClick = this::navigateUp, ) } diff --git a/features/roomdetails/impl/src/test/kotlin/io/element/android/features/roomdetails/impl/DefaultRoomDetailsEntryPointTest.kt b/features/roomdetails/impl/src/test/kotlin/io/element/android/features/roomdetails/impl/DefaultRoomDetailsEntryPointTest.kt index a9d528ace5..0872567523 100644 --- a/features/roomdetails/impl/src/test/kotlin/io/element/android/features/roomdetails/impl/DefaultRoomDetailsEntryPointTest.kt +++ b/features/roomdetails/impl/src/test/kotlin/io/element/android/features/roomdetails/impl/DefaultRoomDetailsEntryPointTest.kt @@ -94,10 +94,10 @@ class DefaultRoomDetailsEntryPointTest { ) } val callback = object : RoomDetailsEntryPoint.Callback { - override fun onOpenGlobalNotificationSettings() = lambdaError() - override fun onOpenRoom(roomId: RoomId, serverNames: List) = lambdaError() - override fun onPermalinkClick(data: PermalinkData, pushToBackstack: Boolean) = lambdaError() - override fun forwardEvent(eventId: EventId) = lambdaError() + override fun navigateToGlobalNotificationSettings() = lambdaError() + override fun navigateToRoom(roomId: RoomId, serverNames: List) = lambdaError() + override fun handlePermalinkClick(data: PermalinkData, pushToBackstack: Boolean) = lambdaError() + override fun startForwardEventFlow(eventId: EventId) = lambdaError() } val params = RoomDetailsEntryPoint.Params( initialElement = RoomDetailsEntryPoint.InitialTarget.RoomDetails, diff --git a/features/roomdirectory/api/src/main/kotlin/io/element/android/features/roomdirectory/api/RoomDirectoryEntryPoint.kt b/features/roomdirectory/api/src/main/kotlin/io/element/android/features/roomdirectory/api/RoomDirectoryEntryPoint.kt index 892719554b..7a1764106a 100644 --- a/features/roomdirectory/api/src/main/kotlin/io/element/android/features/roomdirectory/api/RoomDirectoryEntryPoint.kt +++ b/features/roomdirectory/api/src/main/kotlin/io/element/android/features/roomdirectory/api/RoomDirectoryEntryPoint.kt @@ -21,6 +21,6 @@ interface RoomDirectoryEntryPoint : FeatureEntryPoint { } interface Callback : Plugin { - fun onResultClick(roomDescription: RoomDescription) + fun navigateToRoom(roomDescription: RoomDescription) } } diff --git a/features/roomdirectory/impl/src/main/kotlin/io/element/android/features/roomdirectory/impl/root/RoomDirectoryNode.kt b/features/roomdirectory/impl/src/main/kotlin/io/element/android/features/roomdirectory/impl/root/RoomDirectoryNode.kt index 03d2be6e35..5bc492b7a8 100644 --- a/features/roomdirectory/impl/src/main/kotlin/io/element/android/features/roomdirectory/impl/root/RoomDirectoryNode.kt +++ b/features/roomdirectory/impl/src/main/kotlin/io/element/android/features/roomdirectory/impl/root/RoomDirectoryNode.kt @@ -29,7 +29,7 @@ class RoomDirectoryNode( ) : Node(buildContext, plugins = plugins) { private fun onResultClick(roomDescription: RoomDescription) { plugins().forEach { - it.onResultClick(roomDescription) + it.navigateToRoom(roomDescription) } } diff --git a/features/roomdirectory/impl/src/test/kotlin/io/element/android/features/roomdirectory/impl/DefaultRoomDirectoryEntryPointTest.kt b/features/roomdirectory/impl/src/test/kotlin/io/element/android/features/roomdirectory/impl/DefaultRoomDirectoryEntryPointTest.kt index d544f55000..50d15b66aa 100644 --- a/features/roomdirectory/impl/src/test/kotlin/io/element/android/features/roomdirectory/impl/DefaultRoomDirectoryEntryPointTest.kt +++ b/features/roomdirectory/impl/src/test/kotlin/io/element/android/features/roomdirectory/impl/DefaultRoomDirectoryEntryPointTest.kt @@ -35,7 +35,7 @@ class DefaultRoomDirectoryEntryPointTest { ) } val callback = object : RoomDirectoryEntryPoint.Callback { - override fun onResultClick(roomDescription: RoomDescription) = lambdaError() + override fun navigateToRoom(roomDescription: RoomDescription) = lambdaError() } val result = entryPoint.nodeBuilder(parentNode, BuildContext.root(null)) .callback(callback) diff --git a/features/securebackup/impl/src/main/kotlin/io/element/android/features/securebackup/impl/SecureBackupFlowNode.kt b/features/securebackup/impl/src/main/kotlin/io/element/android/features/securebackup/impl/SecureBackupFlowNode.kt index 4d79f8ea1b..63f6282dc8 100644 --- a/features/securebackup/impl/src/main/kotlin/io/element/android/features/securebackup/impl/SecureBackupFlowNode.kt +++ b/features/securebackup/impl/src/main/kotlin/io/element/android/features/securebackup/impl/SecureBackupFlowNode.kt @@ -77,19 +77,19 @@ class SecureBackupFlowNode( return when (navTarget) { NavTarget.Root -> { val callback = object : SecureBackupRootNode.Callback { - override fun onSetupClick() { + override fun navigateToSetup() { backstack.push(NavTarget.Setup) } - override fun onChangeClick() { + override fun navigateToChange() { backstack.push(NavTarget.Change) } - override fun onDisableClick() { + override fun navigateToDisable() { backstack.push(NavTarget.Disable) } - override fun onConfirmRecoveryKeyClick() { + override fun navigateToEnterRecoveryKey() { backstack.push(NavTarget.EnterRecoveryKey) } } diff --git a/features/securebackup/impl/src/main/kotlin/io/element/android/features/securebackup/impl/root/SecureBackupRootNode.kt b/features/securebackup/impl/src/main/kotlin/io/element/android/features/securebackup/impl/root/SecureBackupRootNode.kt index 6d4db197d3..e8d13a3d38 100644 --- a/features/securebackup/impl/src/main/kotlin/io/element/android/features/securebackup/impl/root/SecureBackupRootNode.kt +++ b/features/securebackup/impl/src/main/kotlin/io/element/android/features/securebackup/impl/root/SecureBackupRootNode.kt @@ -32,26 +32,26 @@ class SecureBackupRootNode( plugins = plugins ) { interface Callback : Plugin { - fun onSetupClick() - fun onChangeClick() - fun onDisableClick() - fun onConfirmRecoveryKeyClick() + fun navigateToSetup() + fun navigateToChange() + fun navigateToDisable() + fun navigateToEnterRecoveryKey() } private fun onSetupClick() { - plugins().forEach { it.onSetupClick() } + plugins().forEach { it.navigateToSetup() } } private fun onChangeClick() { - plugins().forEach { it.onChangeClick() } + plugins().forEach { it.navigateToChange() } } private fun onDisableClick() { - plugins().forEach { it.onDisableClick() } + plugins().forEach { it.navigateToDisable() } } private fun onConfirmRecoveryKeyClick() { - plugins().forEach { it.onConfirmRecoveryKeyClick() } + plugins().forEach { it.navigateToEnterRecoveryKey() } } private fun onLearnMoreClick(uriHandler: UriHandler) { diff --git a/features/space/api/src/main/kotlin/io/element/android/features/space/api/SpaceEntryPoint.kt b/features/space/api/src/main/kotlin/io/element/android/features/space/api/SpaceEntryPoint.kt index 9dd61c6dff..e939a75d15 100644 --- a/features/space/api/src/main/kotlin/io/element/android/features/space/api/SpaceEntryPoint.kt +++ b/features/space/api/src/main/kotlin/io/element/android/features/space/api/SpaceEntryPoint.kt @@ -31,9 +31,8 @@ interface SpaceEntryPoint : FeatureEntryPoint { ) : NodeInputs interface Callback : Plugin { - fun onOpenRoom(roomId: RoomId, viaParameters: List) - fun onOpenDetails() - - fun onOpenMemberList() + fun navigateToRoom(roomId: RoomId, viaParameters: List) + fun navigateToRoomDetails() + fun navigateToRoomMemberList() } } diff --git a/features/space/impl/src/main/kotlin/io/element/android/features/space/impl/SpaceFlowNode.kt b/features/space/impl/src/main/kotlin/io/element/android/features/space/impl/SpaceFlowNode.kt index f73a3d31ff..a9f8a79ed6 100644 --- a/features/space/impl/src/main/kotlin/io/element/android/features/space/impl/SpaceFlowNode.kt +++ b/features/space/impl/src/main/kotlin/io/element/android/features/space/impl/SpaceFlowNode.kt @@ -80,19 +80,19 @@ class SpaceFlowNode( } NavTarget.Root -> { val callback = object : SpaceNode.Callback { - override fun onOpenRoom(roomId: RoomId, viaParameters: List) { - callback.onOpenRoom(roomId, viaParameters) + override fun navigateToRoom(roomId: RoomId, viaParameters: List) { + callback.navigateToRoom(roomId, viaParameters) } - override fun onOpenDetails() { - callback.onOpenDetails() + override fun navigateToRoomDetails() { + callback.navigateToRoomDetails() } override fun onOpenMemberList() { - callback.onOpenMemberList() + callback.navigateToRoomMemberList() } - override fun onLeaveSpace() { + override fun startLeaveSpaceFlow() { backstack.push(NavTarget.Leave) } } diff --git a/features/space/impl/src/main/kotlin/io/element/android/features/space/impl/root/SpaceNode.kt b/features/space/impl/src/main/kotlin/io/element/android/features/space/impl/root/SpaceNode.kt index f02107dad2..978dc8dcbf 100644 --- a/features/space/impl/src/main/kotlin/io/element/android/features/space/impl/root/SpaceNode.kt +++ b/features/space/impl/src/main/kotlin/io/element/android/features/space/impl/root/SpaceNode.kt @@ -40,11 +40,10 @@ class SpaceNode( private val acceptDeclineInviteView: AcceptDeclineInviteView, ) : Node(buildContext, plugins = plugins) { interface Callback : Plugin { - fun onOpenRoom(roomId: RoomId, viaParameters: List) - fun onOpenDetails() - + fun navigateToRoom(roomId: RoomId, viaParameters: List) + fun navigateToRoomDetails() fun onOpenMemberList() - fun onLeaveSpace() + fun startLeaveSpaceFlow() } private val callback = plugins.filterIsInstance().single() @@ -74,13 +73,13 @@ class SpaceNode( state = state, onBackClick = ::navigateUp, onLeaveSpaceClick = { - callback.onLeaveSpace() + callback.startLeaveSpaceFlow() }, onRoomClick = { spaceRoom -> - callback.onOpenRoom(spaceRoom.roomId, spaceRoom.via) + callback.navigateToRoom(spaceRoom.roomId, spaceRoom.via) }, onDetailsClick = { - callback.onOpenDetails() + callback.navigateToRoomDetails() }, onShareSpace = { onShareRoom(context) @@ -92,7 +91,7 @@ class SpaceNode( acceptDeclineInviteView.Render( state = state.acceptDeclineInviteState, onAcceptInviteSuccess = { roomId -> - callback.onOpenRoom(roomId, emptyList()) + callback.navigateToRoom(roomId, emptyList()) }, onDeclineInviteSuccess = { roomId -> // No action needed diff --git a/features/space/impl/src/test/kotlin/io/element/android/features/space/impl/DefaultSpaceEntryPointTest.kt b/features/space/impl/src/test/kotlin/io/element/android/features/space/impl/DefaultSpaceEntryPointTest.kt index 2d43ef0d39..3cf6e398f2 100644 --- a/features/space/impl/src/test/kotlin/io/element/android/features/space/impl/DefaultSpaceEntryPointTest.kt +++ b/features/space/impl/src/test/kotlin/io/element/android/features/space/impl/DefaultSpaceEntryPointTest.kt @@ -44,9 +44,9 @@ class DefaultSpaceEntryPointTest { ) } val callback = object : SpaceEntryPoint.Callback { - override fun onOpenRoom(roomId: RoomId, viaParameters: List) = lambdaError() - override fun onOpenDetails() = lambdaError() - override fun onOpenMemberList() = lambdaError() + override fun navigateToRoom(roomId: RoomId, viaParameters: List) = lambdaError() + override fun navigateToRoomDetails() = lambdaError() + override fun navigateToRoomMemberList() = lambdaError() } val result = entryPoint.nodeBuilder(parentNode, BuildContext.root(null)) .inputs(nodeInputs) diff --git a/features/startchat/api/src/main/kotlin/io/element/android/features/startchat/api/StartChatEntryPoint.kt b/features/startchat/api/src/main/kotlin/io/element/android/features/startchat/api/StartChatEntryPoint.kt index 17b9b902e2..ca200bed1a 100644 --- a/features/startchat/api/src/main/kotlin/io/element/android/features/startchat/api/StartChatEntryPoint.kt +++ b/features/startchat/api/src/main/kotlin/io/element/android/features/startchat/api/StartChatEntryPoint.kt @@ -21,7 +21,7 @@ interface StartChatEntryPoint : FeatureEntryPoint { } interface Callback : Plugin { - fun onOpenRoom(roomIdOrAlias: RoomIdOrAlias, serverNames: List) - fun onOpenRoomDirectory() + fun onRoomCreated(roomIdOrAlias: RoomIdOrAlias, serverNames: List) + fun navigateToRoomDirectory() } } diff --git a/features/startchat/impl/src/main/kotlin/io/element/android/features/startchat/StartChatNavigator.kt b/features/startchat/impl/src/main/kotlin/io/element/android/features/startchat/StartChatNavigator.kt index a45b4dddab..70babb2928 100644 --- a/features/startchat/impl/src/main/kotlin/io/element/android/features/startchat/StartChatNavigator.kt +++ b/features/startchat/impl/src/main/kotlin/io/element/android/features/startchat/StartChatNavigator.kt @@ -17,7 +17,7 @@ import io.element.android.libraries.architecture.overlay.operation.show import io.element.android.libraries.matrix.api.core.RoomIdOrAlias interface StartChatNavigator : Plugin { - fun onOpenRoom(roomIdOrAlias: RoomIdOrAlias, serverNames: List) + fun onRoomCreated(roomIdOrAlias: RoomIdOrAlias, serverNames: List) fun onCreateNewRoom() fun onShowJoinRoomByAddress() fun onDismissJoinRoomByAddress() @@ -30,7 +30,8 @@ class DefaultStartChatNavigator( private val openRoom: (RoomIdOrAlias, List) -> Unit, private val openRoomDirectory: () -> Unit, ) : StartChatNavigator { - override fun onOpenRoom(roomIdOrAlias: RoomIdOrAlias, serverNames: List) = openRoom(roomIdOrAlias, serverNames) + override fun onRoomCreated(roomIdOrAlias: RoomIdOrAlias, serverNames: List) = + openRoom(roomIdOrAlias, serverNames) override fun onOpenRoomDirectory() = openRoomDirectory() diff --git a/features/startchat/impl/src/main/kotlin/io/element/android/features/startchat/impl/StartChatFlowNode.kt b/features/startchat/impl/src/main/kotlin/io/element/android/features/startchat/impl/StartChatFlowNode.kt index 30d1f3a2cf..e875dcc748 100644 --- a/features/startchat/impl/src/main/kotlin/io/element/android/features/startchat/impl/StartChatFlowNode.kt +++ b/features/startchat/impl/src/main/kotlin/io/element/android/features/startchat/impl/StartChatFlowNode.kt @@ -64,10 +64,10 @@ class StartChatFlowNode( backstack = backstack, overlay = overlay, openRoom = { roomIdOrAlias, viaServers -> - plugins().forEach { it.onOpenRoom(roomIdOrAlias, viaServers) } + plugins().forEach { it.onRoomCreated(roomIdOrAlias, viaServers) } }, openRoomDirectory = { - plugins().forEach { it.onOpenRoomDirectory() } + plugins().forEach { it.navigateToRoomDirectory() } } ) @@ -79,7 +79,7 @@ class StartChatFlowNode( NavTarget.NewRoom -> { val callback = object : CreateRoomEntryPoint.Callback { override fun onRoomCreated(roomId: RoomId) { - navigator.onOpenRoom(roomId.toRoomIdOrAlias(), emptyList()) + navigator.onRoomCreated(roomId.toRoomIdOrAlias(), emptyList()) } } createRoomEntryPoint.nodeBuilder(parentNode = this, buildContext = buildContext) diff --git a/features/startchat/impl/src/main/kotlin/io/element/android/features/startchat/impl/joinbyaddress/JoinRoomByAddressPresenter.kt b/features/startchat/impl/src/main/kotlin/io/element/android/features/startchat/impl/joinbyaddress/JoinRoomByAddressPresenter.kt index 540c1a4784..350a59de73 100644 --- a/features/startchat/impl/src/main/kotlin/io/element/android/features/startchat/impl/joinbyaddress/JoinRoomByAddressPresenter.kt +++ b/features/startchat/impl/src/main/kotlin/io/element/android/features/startchat/impl/joinbyaddress/JoinRoomByAddressPresenter.kt @@ -94,7 +94,7 @@ class JoinRoomByAddressPresenter( private fun onRoomFound(state: RoomAddressState.RoomFound) { navigator.onDismissJoinRoomByAddress() - navigator.onOpenRoom( + navigator.onRoomCreated( roomIdOrAlias = state.resolved.roomId.toRoomIdOrAlias(), serverNames = state.resolved.servers ) diff --git a/features/startchat/impl/src/main/kotlin/io/element/android/features/startchat/impl/root/StartChatNode.kt b/features/startchat/impl/src/main/kotlin/io/element/android/features/startchat/impl/root/StartChatNode.kt index 9a9ca85160..b5cc7f2506 100644 --- a/features/startchat/impl/src/main/kotlin/io/element/android/features/startchat/impl/root/StartChatNode.kt +++ b/features/startchat/impl/src/main/kotlin/io/element/android/features/startchat/impl/root/StartChatNode.kt @@ -53,7 +53,7 @@ class StartChatNode( onCloseClick = this::navigateUp, onNewRoomClick = navigator::onCreateNewRoom, onOpenDM = { - navigator.onOpenRoom(roomIdOrAlias = it.toRoomIdOrAlias(), serverNames = emptyList()) + navigator.onRoomCreated(roomIdOrAlias = it.toRoomIdOrAlias(), serverNames = emptyList()) }, onJoinByAddressClick = navigator::onShowJoinRoomByAddress, onInviteFriendsClick = { invitePeople(activity) }, diff --git a/features/startchat/impl/src/test/kotlin/io/element/android/features/startchat/impl/DefaultStartChatEntryPointTest.kt b/features/startchat/impl/src/test/kotlin/io/element/android/features/startchat/impl/DefaultStartChatEntryPointTest.kt index 8f4a41a3fa..6da424c01a 100644 --- a/features/startchat/impl/src/test/kotlin/io/element/android/features/startchat/impl/DefaultStartChatEntryPointTest.kt +++ b/features/startchat/impl/src/test/kotlin/io/element/android/features/startchat/impl/DefaultStartChatEntryPointTest.kt @@ -40,8 +40,8 @@ class DefaultStartChatEntryPointTest { ) } val callback = object : StartChatEntryPoint.Callback { - override fun onOpenRoom(roomIdOrAlias: RoomIdOrAlias, serverNames: List) = lambdaError() - override fun onOpenRoomDirectory() = lambdaError() + override fun onRoomCreated(roomIdOrAlias: RoomIdOrAlias, serverNames: List) = lambdaError() + override fun navigateToRoomDirectory() = lambdaError() } val result = entryPoint.nodeBuilder(parentNode, BuildContext.root(null)) .callback(callback) diff --git a/features/startchat/impl/src/test/kotlin/io/element/android/features/startchat/impl/FakeStartChatNavigator.kt b/features/startchat/impl/src/test/kotlin/io/element/android/features/startchat/impl/FakeStartChatNavigator.kt index 9de00e0a4c..95a8801fd7 100644 --- a/features/startchat/impl/src/test/kotlin/io/element/android/features/startchat/impl/FakeStartChatNavigator.kt +++ b/features/startchat/impl/src/test/kotlin/io/element/android/features/startchat/impl/FakeStartChatNavigator.kt @@ -17,7 +17,7 @@ class FakeStartChatNavigator( private val dismissJoinRoomByAddressLambda: () -> Unit = {}, private val openRoomDirectoryLambda: () -> Unit = {}, ) : StartChatNavigator { - override fun onOpenRoom(roomIdOrAlias: RoomIdOrAlias, serverNames: List) { + override fun onRoomCreated(roomIdOrAlias: RoomIdOrAlias, serverNames: List) { openRoomLambda(roomIdOrAlias, serverNames) } diff --git a/features/userprofile/api/src/main/kotlin/io/element/android/features/userprofile/api/UserProfileEntryPoint.kt b/features/userprofile/api/src/main/kotlin/io/element/android/features/userprofile/api/UserProfileEntryPoint.kt index 70968aad61..20f4a10955 100644 --- a/features/userprofile/api/src/main/kotlin/io/element/android/features/userprofile/api/UserProfileEntryPoint.kt +++ b/features/userprofile/api/src/main/kotlin/io/element/android/features/userprofile/api/UserProfileEntryPoint.kt @@ -19,7 +19,7 @@ interface UserProfileEntryPoint : FeatureEntryPoint { data class Params(val userId: UserId) : NodeInputs interface Callback : Plugin { - fun onOpenRoom(roomId: RoomId) + fun navigateToRoom(roomId: RoomId) } interface NodeBuilder { diff --git a/features/userprofile/impl/src/main/kotlin/io/element/android/features/userprofile/impl/UserProfileFlowNode.kt b/features/userprofile/impl/src/main/kotlin/io/element/android/features/userprofile/impl/UserProfileFlowNode.kt index da3adef973..c9df5024be 100644 --- a/features/userprofile/impl/src/main/kotlin/io/element/android/features/userprofile/impl/UserProfileFlowNode.kt +++ b/features/userprofile/impl/src/main/kotlin/io/element/android/features/userprofile/impl/UserProfileFlowNode.kt @@ -73,19 +73,19 @@ class UserProfileFlowNode( return when (navTarget) { NavTarget.Root -> { val callback = object : UserProfileNodeHelper.Callback { - override fun openAvatarPreview(username: String, avatarUrl: String) { + override fun navigateToAvatarPreview(username: String, avatarUrl: String) { backstack.push(NavTarget.AvatarPreview(username, avatarUrl)) } - override fun onStartDM(roomId: RoomId) { - plugins().forEach { it.onOpenRoom(roomId) } + override fun navigateToRoom(roomId: RoomId) { + plugins().forEach { it.navigateToRoom(roomId) } } - override fun onStartCall(dmRoomId: RoomId) { + override fun startCall(dmRoomId: RoomId) { elementCallEntryPoint.startCall(CallType.RoomCall(sessionId = sessionId, roomId = dmRoomId)) } - override fun onVerifyUser(userId: UserId) { + override fun startVerifyUserFlow(userId: UserId) { backstack.push(NavTarget.VerifyUser(userId)) } } @@ -98,11 +98,11 @@ class UserProfileFlowNode( backstack.pop() } - override fun onViewInTimeline(eventId: EventId) { + override fun viewInTimeline(eventId: EventId) { // Cannot happen } - override fun onForwardEvent(eventId: EventId) { + override fun forwardEvent(eventId: EventId) { // Cannot happen } } diff --git a/features/userprofile/impl/src/main/kotlin/io/element/android/features/userprofile/impl/root/UserProfileNode.kt b/features/userprofile/impl/src/main/kotlin/io/element/android/features/userprofile/impl/root/UserProfileNode.kt index 735957946a..c182bcb26c 100644 --- a/features/userprofile/impl/src/main/kotlin/io/element/android/features/userprofile/impl/root/UserProfileNode.kt +++ b/features/userprofile/impl/src/main/kotlin/io/element/android/features/userprofile/impl/root/UserProfileNode.kt @@ -63,7 +63,7 @@ class UserProfileNode( } fun onStartDM(roomId: RoomId) { - callback.onStartDM(roomId) + callback.navigateToRoom(roomId) } val state = presenter.present() @@ -74,9 +74,9 @@ class UserProfileNode( goBack = this::navigateUp, onShareUser = ::onShareUser, onOpenDm = ::onStartDM, - onStartCall = callback::onStartCall, - openAvatarPreview = callback::openAvatarPreview, - onVerifyClick = callback::onVerifyUser, + onStartCall = callback::startCall, + openAvatarPreview = callback::navigateToAvatarPreview, + onVerifyClick = callback::startVerifyUserFlow, ) } } diff --git a/features/userprofile/impl/src/test/kotlin/io/element/android/features/userprofile/impl/DefaultUserProfileEntryPointTest.kt b/features/userprofile/impl/src/test/kotlin/io/element/android/features/userprofile/impl/DefaultUserProfileEntryPointTest.kt index 75bc434048..493b9045cc 100644 --- a/features/userprofile/impl/src/test/kotlin/io/element/android/features/userprofile/impl/DefaultUserProfileEntryPointTest.kt +++ b/features/userprofile/impl/src/test/kotlin/io/element/android/features/userprofile/impl/DefaultUserProfileEntryPointTest.kt @@ -67,7 +67,7 @@ class DefaultUserProfileEntryPointTest { ) } val callback = object : UserProfileEntryPoint.Callback { - override fun onOpenRoom(roomId: RoomId) { + override fun navigateToRoom(roomId: RoomId) { lambdaError() } } diff --git a/features/userprofile/shared/src/main/kotlin/io/element/android/features/userprofile/shared/UserProfileNodeHelper.kt b/features/userprofile/shared/src/main/kotlin/io/element/android/features/userprofile/shared/UserProfileNodeHelper.kt index 61f4669769..af5f9691e0 100644 --- a/features/userprofile/shared/src/main/kotlin/io/element/android/features/userprofile/shared/UserProfileNodeHelper.kt +++ b/features/userprofile/shared/src/main/kotlin/io/element/android/features/userprofile/shared/UserProfileNodeHelper.kt @@ -21,10 +21,10 @@ class UserProfileNodeHelper( private val userId: UserId, ) { interface Callback : NodeInputs { - fun openAvatarPreview(username: String, avatarUrl: String) - fun onStartDM(roomId: RoomId) - fun onStartCall(dmRoomId: RoomId) - fun onVerifyUser(userId: UserId) + fun navigateToAvatarPreview(username: String, avatarUrl: String) + fun navigateToRoom(roomId: RoomId) + fun startCall(dmRoomId: RoomId) + fun startVerifyUserFlow(userId: UserId) } fun onShareUser( diff --git a/features/verifysession/api/src/main/kotlin/io/element/android/features/verifysession/api/OutgoingVerificationEntryPoint.kt b/features/verifysession/api/src/main/kotlin/io/element/android/features/verifysession/api/OutgoingVerificationEntryPoint.kt index 60536504d2..0d4fe76156 100644 --- a/features/verifysession/api/src/main/kotlin/io/element/android/features/verifysession/api/OutgoingVerificationEntryPoint.kt +++ b/features/verifysession/api/src/main/kotlin/io/element/android/features/verifysession/api/OutgoingVerificationEntryPoint.kt @@ -29,7 +29,7 @@ interface OutgoingVerificationEntryPoint : FeatureEntryPoint { } interface Callback : Plugin { - fun onLearnMoreAboutEncryption() + fun navigateToLearnMoreAboutEncryption() fun onBack() fun onDone() } diff --git a/features/verifysession/impl/src/main/kotlin/io/element/android/features/verifysession/impl/outgoing/OutgoingVerificationNode.kt b/features/verifysession/impl/src/main/kotlin/io/element/android/features/verifysession/impl/outgoing/OutgoingVerificationNode.kt index 9941ce58fe..c5a04f7834 100644 --- a/features/verifysession/impl/src/main/kotlin/io/element/android/features/verifysession/impl/outgoing/OutgoingVerificationNode.kt +++ b/features/verifysession/impl/src/main/kotlin/io/element/android/features/verifysession/impl/outgoing/OutgoingVerificationNode.kt @@ -42,7 +42,7 @@ class OutgoingVerificationNode( OutgoingVerificationView( state = state, modifier = modifier, - onLearnMoreClick = callback::onLearnMoreAboutEncryption, + onLearnMoreClick = callback::navigateToLearnMoreAboutEncryption, onFinish = callback::onDone, onBack = callback::onBack, ) diff --git a/features/verifysession/impl/src/test/kotlin/io/element/android/features/verifysession/impl/outgoing/DefaultOutgoingVerificationEntryPointTest.kt b/features/verifysession/impl/src/test/kotlin/io/element/android/features/verifysession/impl/outgoing/DefaultOutgoingVerificationEntryPointTest.kt index 52ff36dbd6..7e152383f9 100644 --- a/features/verifysession/impl/src/test/kotlin/io/element/android/features/verifysession/impl/outgoing/DefaultOutgoingVerificationEntryPointTest.kt +++ b/features/verifysession/impl/src/test/kotlin/io/element/android/features/verifysession/impl/outgoing/DefaultOutgoingVerificationEntryPointTest.kt @@ -34,7 +34,7 @@ class DefaultOutgoingVerificationEntryPointTest { ) } val callback = object : OutgoingVerificationEntryPoint.Callback { - override fun onLearnMoreAboutEncryption() = lambdaError() + override fun navigateToLearnMoreAboutEncryption() = lambdaError() override fun onBack() = lambdaError() override fun onDone() = lambdaError() } diff --git a/features/viewfolder/impl/src/main/kotlin/io/element/android/features/viewfolder/impl/folder/ViewFolderNode.kt b/features/viewfolder/impl/src/main/kotlin/io/element/android/features/viewfolder/impl/folder/ViewFolderNode.kt index 4c57ea4135..b7c6fe1bd1 100644 --- a/features/viewfolder/impl/src/main/kotlin/io/element/android/features/viewfolder/impl/folder/ViewFolderNode.kt +++ b/features/viewfolder/impl/src/main/kotlin/io/element/android/features/viewfolder/impl/folder/ViewFolderNode.kt @@ -35,7 +35,7 @@ class ViewFolderNode( interface Callback : Plugin { fun onBackClick() - fun onNavigateTo(item: Item) + fun navigateToItem(item: Item) } private val inputs: Inputs = inputs() @@ -50,7 +50,7 @@ class ViewFolderNode( } private fun onNavigateTo(item: Item) { - plugins().forEach { it.onNavigateTo(item) } + plugins().forEach { it.navigateToItem(item) } } @Composable diff --git a/features/viewfolder/impl/src/main/kotlin/io/element/android/features/viewfolder/impl/root/ViewFolderFlowNode.kt b/features/viewfolder/impl/src/main/kotlin/io/element/android/features/viewfolder/impl/root/ViewFolderFlowNode.kt index d57824f2fd..3c7935464b 100644 --- a/features/viewfolder/impl/src/main/kotlin/io/element/android/features/viewfolder/impl/root/ViewFolderFlowNode.kt +++ b/features/viewfolder/impl/src/main/kotlin/io/element/android/features/viewfolder/impl/root/ViewFolderFlowNode.kt @@ -111,7 +111,7 @@ class ViewFolderFlowNode( onDone() } - override fun onNavigateTo(item: Item) { + override fun navigateToItem(item: Item) { when (item) { Item.Parent -> { // Should not happen when in Root since parent is not accessible from root (canGoUp set to false) diff --git a/libraries/accountselect/api/src/main/kotlin/io/element/android/libraries/accountselect/api/AccountSelectEntryPoint.kt b/libraries/accountselect/api/src/main/kotlin/io/element/android/libraries/accountselect/api/AccountSelectEntryPoint.kt index 72da3491de..112293eb6a 100644 --- a/libraries/accountselect/api/src/main/kotlin/io/element/android/libraries/accountselect/api/AccountSelectEntryPoint.kt +++ b/libraries/accountselect/api/src/main/kotlin/io/element/android/libraries/accountselect/api/AccountSelectEntryPoint.kt @@ -22,7 +22,7 @@ interface AccountSelectEntryPoint : FeatureEntryPoint { } interface Callback : Plugin { - fun onSelectAccount(sessionId: SessionId) + fun onAccountSelected(sessionId: SessionId) fun onCancel() } } diff --git a/libraries/accountselect/impl/src/main/kotlin/io/element/android/libraries/accountselect/impl/AccountSelectNode.kt b/libraries/accountselect/impl/src/main/kotlin/io/element/android/libraries/accountselect/impl/AccountSelectNode.kt index 5478d9fe43..f0a543340c 100644 --- a/libraries/accountselect/impl/src/main/kotlin/io/element/android/libraries/accountselect/impl/AccountSelectNode.kt +++ b/libraries/accountselect/impl/src/main/kotlin/io/element/android/libraries/accountselect/impl/AccountSelectNode.kt @@ -32,8 +32,8 @@ class AccountSelectNode( callbacks.forEach { it.onCancel() } } - private fun onSelectAccount(sessionId: SessionId) { - callbacks.forEach { it.onSelectAccount(sessionId) } + private fun onAccountSelected(sessionId: SessionId) { + callbacks.forEach { it.onAccountSelected(sessionId) } } @Composable @@ -42,7 +42,7 @@ class AccountSelectNode( AccountSelectView( state = state, onDismiss = ::onDismiss, - onSelectAccount = ::onSelectAccount, + onSelectAccount = ::onAccountSelected, modifier = modifier, ) } diff --git a/libraries/accountselect/impl/src/test/kotlin/io/element/android/libraries/accountselect/impl/DefaultAccountSelectEntryPointTest.kt b/libraries/accountselect/impl/src/test/kotlin/io/element/android/libraries/accountselect/impl/DefaultAccountSelectEntryPointTest.kt index d61dcc89ba..230248d421 100644 --- a/libraries/accountselect/impl/src/test/kotlin/io/element/android/libraries/accountselect/impl/DefaultAccountSelectEntryPointTest.kt +++ b/libraries/accountselect/impl/src/test/kotlin/io/element/android/libraries/accountselect/impl/DefaultAccountSelectEntryPointTest.kt @@ -32,7 +32,7 @@ class DefaultAccountSelectEntryPointTest { ) } val callback = object : AccountSelectEntryPoint.Callback { - override fun onSelectAccount(sessionId: SessionId) = lambdaError() + override fun onAccountSelected(sessionId: SessionId) = lambdaError() override fun onCancel() = lambdaError() } val result = entryPoint.nodeBuilder(parentNode, BuildContext.root(null)) diff --git a/libraries/mediaviewer/api/src/main/kotlin/io/element/android/libraries/mediaviewer/api/MediaGalleryEntryPoint.kt b/libraries/mediaviewer/api/src/main/kotlin/io/element/android/libraries/mediaviewer/api/MediaGalleryEntryPoint.kt index 119c1002c8..702ce181db 100644 --- a/libraries/mediaviewer/api/src/main/kotlin/io/element/android/libraries/mediaviewer/api/MediaGalleryEntryPoint.kt +++ b/libraries/mediaviewer/api/src/main/kotlin/io/element/android/libraries/mediaviewer/api/MediaGalleryEntryPoint.kt @@ -23,7 +23,7 @@ interface MediaGalleryEntryPoint : FeatureEntryPoint { interface Callback : Plugin { fun onBackClick() - fun onViewInTimeline(eventId: EventId) - fun forwardEvent(eventId: EventId) + fun viewInTimeline(eventId: EventId) + fun forward(eventId: EventId) } } diff --git a/libraries/mediaviewer/api/src/main/kotlin/io/element/android/libraries/mediaviewer/api/MediaViewerEntryPoint.kt b/libraries/mediaviewer/api/src/main/kotlin/io/element/android/libraries/mediaviewer/api/MediaViewerEntryPoint.kt index b16de69b98..da1227d66b 100644 --- a/libraries/mediaviewer/api/src/main/kotlin/io/element/android/libraries/mediaviewer/api/MediaViewerEntryPoint.kt +++ b/libraries/mediaviewer/api/src/main/kotlin/io/element/android/libraries/mediaviewer/api/MediaViewerEntryPoint.kt @@ -30,8 +30,8 @@ interface MediaViewerEntryPoint : FeatureEntryPoint { interface Callback : Plugin { fun onDone() - fun onViewInTimeline(eventId: EventId) - fun onForwardEvent(eventId: EventId) + fun viewInTimeline(eventId: EventId) + fun forwardEvent(eventId: EventId) } data class Params( diff --git a/libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/gallery/MediaGalleryNode.kt b/libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/gallery/MediaGalleryNode.kt index 6ee31c6520..ff1359b672 100644 --- a/libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/gallery/MediaGalleryNode.kt +++ b/libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/gallery/MediaGalleryNode.kt @@ -38,9 +38,9 @@ class MediaGalleryNode( interface Callback : Plugin { fun onBackClick() - fun onItemClick(item: MediaItem.Event) - fun onViewInTimeline(eventId: EventId) - fun onForward(eventId: EventId) + fun showItem(item: MediaItem.Event) + fun viewInTimeline(eventId: EventId) + fun forward(eventId: EventId) } private fun onBackClick() { @@ -51,19 +51,19 @@ class MediaGalleryNode( override fun onViewInTimelineClick(eventId: EventId) { plugins().forEach { - it.onViewInTimeline(eventId) + it.viewInTimeline(eventId) } } override fun onForwardClick(eventId: EventId) { plugins().forEach { - it.onForward(eventId) + it.forward(eventId) } } private fun onItemClick(item: MediaItem.Event) { plugins().forEach { - it.onItemClick(item) + it.showItem(item) } } diff --git a/libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/gallery/root/MediaGalleryFlowNode.kt b/libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/gallery/root/MediaGalleryFlowNode.kt index 76f025006f..b72a3fbd46 100644 --- a/libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/gallery/root/MediaGalleryFlowNode.kt +++ b/libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/gallery/root/MediaGalleryFlowNode.kt @@ -78,13 +78,13 @@ class MediaGalleryFlowNode( private fun onViewInTimeline(eventId: EventId) { plugins().forEach { - it.onViewInTimeline(eventId) + it.viewInTimeline(eventId) } } private fun forwardEvent(eventId: EventId) { plugins().forEach { - it.forwardEvent(eventId) + it.forward(eventId) } } @@ -96,15 +96,15 @@ class MediaGalleryFlowNode( this@MediaGalleryFlowNode.onBackClick() } - override fun onViewInTimeline(eventId: EventId) { + override fun viewInTimeline(eventId: EventId) { this@MediaGalleryFlowNode.onViewInTimeline(eventId) } - override fun onForward(eventId: EventId) { + override fun forward(eventId: EventId) { forwardEvent(eventId) } - override fun onItemClick(item: MediaItem.Event) { + override fun showItem(item: MediaItem.Event) { val mode = when (item) { is MediaItem.Audio, is MediaItem.Voice, @@ -131,13 +131,13 @@ class MediaGalleryFlowNode( overlay.hide() } - override fun onViewInTimeline(eventId: EventId) { + override fun viewInTimeline(eventId: EventId) { this@MediaGalleryFlowNode.onViewInTimeline(eventId) } - override fun onForwardEvent(eventId: EventId) { + override fun forwardEvent(eventId: EventId) { // Need to go to the parent because of the overlay - forwardEvent(eventId) + this@MediaGalleryFlowNode.forwardEvent(eventId) } } mediaViewerEntryPoint.nodeBuilder(this, buildContext) diff --git a/libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/viewer/MediaViewerNode.kt b/libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/viewer/MediaViewerNode.kt index ee874156cd..a62784555a 100644 --- a/libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/viewer/MediaViewerNode.kt +++ b/libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/viewer/MediaViewerNode.kt @@ -67,13 +67,13 @@ class MediaViewerNode( override fun onViewInTimelineClick(eventId: EventId) { plugins().forEach { - it.onViewInTimeline(eventId) + it.viewInTimeline(eventId) } } override fun onForwardClick(eventId: EventId) { plugins().forEach { - it.onForwardEvent(eventId) + it.forwardEvent(eventId) } } diff --git a/libraries/mediaviewer/impl/src/test/kotlin/io/element/android/libraries/mediaviewer/impl/DefaultMediaGalleryEntryPointTest.kt b/libraries/mediaviewer/impl/src/test/kotlin/io/element/android/libraries/mediaviewer/impl/DefaultMediaGalleryEntryPointTest.kt index 38040426e1..8d38615ff3 100644 --- a/libraries/mediaviewer/impl/src/test/kotlin/io/element/android/libraries/mediaviewer/impl/DefaultMediaGalleryEntryPointTest.kt +++ b/libraries/mediaviewer/impl/src/test/kotlin/io/element/android/libraries/mediaviewer/impl/DefaultMediaGalleryEntryPointTest.kt @@ -42,8 +42,8 @@ class DefaultMediaGalleryEntryPointTest { } val callback = object : MediaGalleryEntryPoint.Callback { override fun onBackClick() = lambdaError() - override fun onViewInTimeline(eventId: EventId) = lambdaError() - override fun forwardEvent(eventId: EventId) = lambdaError() + override fun viewInTimeline(eventId: EventId) = lambdaError() + override fun forward(eventId: EventId) = lambdaError() } val result = entryPoint.nodeBuilder(parentNode, BuildContext.root(null)) .callback(callback) diff --git a/libraries/mediaviewer/impl/src/test/kotlin/io/element/android/libraries/mediaviewer/impl/DefaultMediaViewerEntryPointTest.kt b/libraries/mediaviewer/impl/src/test/kotlin/io/element/android/libraries/mediaviewer/impl/DefaultMediaViewerEntryPointTest.kt index a1f60cc124..ab31b5611e 100644 --- a/libraries/mediaviewer/impl/src/test/kotlin/io/element/android/libraries/mediaviewer/impl/DefaultMediaViewerEntryPointTest.kt +++ b/libraries/mediaviewer/impl/src/test/kotlin/io/element/android/libraries/mediaviewer/impl/DefaultMediaViewerEntryPointTest.kt @@ -71,8 +71,8 @@ class DefaultMediaViewerEntryPointTest { } val callback = object : MediaViewerEntryPoint.Callback { override fun onDone() = lambdaError() - override fun onViewInTimeline(eventId: EventId) = lambdaError() - override fun onForwardEvent(eventId: EventId) = lambdaError() + override fun viewInTimeline(eventId: EventId) = lambdaError() + override fun forwardEvent(eventId: EventId) = lambdaError() } val params = createMediaViewerEntryPointParams() val result = entryPoint.nodeBuilder(parentNode, BuildContext.root(null)) @@ -115,8 +115,8 @@ class DefaultMediaViewerEntryPointTest { } val callback = object : MediaViewerEntryPoint.Callback { override fun onDone() = lambdaError() - override fun onViewInTimeline(eventId: EventId) = lambdaError() - override fun onForwardEvent(eventId: EventId) = lambdaError() + override fun viewInTimeline(eventId: EventId) = lambdaError() + override fun forwardEvent(eventId: EventId) = lambdaError() } val result = entryPoint.nodeBuilder(parentNode, BuildContext.root(null)) .avatar( diff --git a/libraries/roomselect/impl/src/main/kotlin/io/element/android/libraries/roomselect/impl/RoomSelectNode.kt b/libraries/roomselect/impl/src/main/kotlin/io/element/android/libraries/roomselect/impl/RoomSelectNode.kt index a7e6dc0cb0..e72c45ed22 100644 --- a/libraries/roomselect/impl/src/main/kotlin/io/element/android/libraries/roomselect/impl/RoomSelectNode.kt +++ b/libraries/roomselect/impl/src/main/kotlin/io/element/android/libraries/roomselect/impl/RoomSelectNode.kt @@ -42,7 +42,7 @@ class RoomSelectNode( callbacks.forEach { it.onCancel() } } - private fun onSubmit(roomIds: List) { + private fun onRoomSelected(roomIds: List) { callbacks.forEach { it.onRoomSelected(roomIds) } } @@ -52,7 +52,7 @@ class RoomSelectNode( RoomSelectView( state = state, onDismiss = ::onDismiss, - onSubmit = ::onSubmit, + onSubmit = ::onRoomSelected, modifier = modifier ) } diff --git a/libraries/troubleshoot/api/src/main/kotlin/io/element/android/libraries/troubleshoot/api/NotificationTroubleShootEntryPoint.kt b/libraries/troubleshoot/api/src/main/kotlin/io/element/android/libraries/troubleshoot/api/NotificationTroubleShootEntryPoint.kt index bf0c6bb883..034abe9400 100644 --- a/libraries/troubleshoot/api/src/main/kotlin/io/element/android/libraries/troubleshoot/api/NotificationTroubleShootEntryPoint.kt +++ b/libraries/troubleshoot/api/src/main/kotlin/io/element/android/libraries/troubleshoot/api/NotificationTroubleShootEntryPoint.kt @@ -22,6 +22,6 @@ interface NotificationTroubleShootEntryPoint : FeatureEntryPoint { interface Callback : Plugin { fun onDone() - fun openIgnoredUsers() + fun navigateToBlockedUsers() } } diff --git a/libraries/troubleshoot/api/src/main/kotlin/io/element/android/libraries/troubleshoot/api/PushHistoryEntryPoint.kt b/libraries/troubleshoot/api/src/main/kotlin/io/element/android/libraries/troubleshoot/api/PushHistoryEntryPoint.kt index 0eab9b8e5a..bd0753d5cd 100644 --- a/libraries/troubleshoot/api/src/main/kotlin/io/element/android/libraries/troubleshoot/api/PushHistoryEntryPoint.kt +++ b/libraries/troubleshoot/api/src/main/kotlin/io/element/android/libraries/troubleshoot/api/PushHistoryEntryPoint.kt @@ -24,6 +24,6 @@ interface PushHistoryEntryPoint : FeatureEntryPoint { interface Callback : Plugin { fun onDone() - fun navigateTo(roomId: RoomId, eventId: EventId) + fun navigateToEvent(roomId: RoomId, eventId: EventId) } } diff --git a/libraries/troubleshoot/impl/src/main/kotlin/io/element/android/libraries/troubleshoot/impl/TroubleshootNotificationsNode.kt b/libraries/troubleshoot/impl/src/main/kotlin/io/element/android/libraries/troubleshoot/impl/TroubleshootNotificationsNode.kt index 508010a3d6..9ab1156d49 100644 --- a/libraries/troubleshoot/impl/src/main/kotlin/io/element/android/libraries/troubleshoot/impl/TroubleshootNotificationsNode.kt +++ b/libraries/troubleshoot/impl/src/main/kotlin/io/element/android/libraries/troubleshoot/impl/TroubleshootNotificationsNode.kt @@ -43,7 +43,7 @@ class TroubleshootNotificationsNode( override fun openIgnoredUsers() { plugins().forEach { - it.openIgnoredUsers() + it.navigateToBlockedUsers() } } diff --git a/libraries/troubleshoot/impl/src/main/kotlin/io/element/android/libraries/troubleshoot/impl/history/PushHistoryNode.kt b/libraries/troubleshoot/impl/src/main/kotlin/io/element/android/libraries/troubleshoot/impl/history/PushHistoryNode.kt index 69070298ec..e8b17bf2ca 100644 --- a/libraries/troubleshoot/impl/src/main/kotlin/io/element/android/libraries/troubleshoot/impl/history/PushHistoryNode.kt +++ b/libraries/troubleshoot/impl/src/main/kotlin/io/element/android/libraries/troubleshoot/impl/history/PushHistoryNode.kt @@ -39,7 +39,7 @@ class PushHistoryNode( override fun navigateTo(roomId: RoomId, eventId: EventId) { plugins().forEach { - it.navigateTo(roomId, eventId) + it.navigateToEvent(roomId, eventId) } } diff --git a/libraries/troubleshoot/impl/src/test/kotlin/io/element/android/libraries/troubleshoot/impl/DefaultNotificationTroubleShootEntryPointTest.kt b/libraries/troubleshoot/impl/src/test/kotlin/io/element/android/libraries/troubleshoot/impl/DefaultNotificationTroubleShootEntryPointTest.kt index e0d817a4ca..a506502fc1 100644 --- a/libraries/troubleshoot/impl/src/test/kotlin/io/element/android/libraries/troubleshoot/impl/DefaultNotificationTroubleShootEntryPointTest.kt +++ b/libraries/troubleshoot/impl/src/test/kotlin/io/element/android/libraries/troubleshoot/impl/DefaultNotificationTroubleShootEntryPointTest.kt @@ -34,7 +34,7 @@ class DefaultNotificationTroubleShootEntryPointTest { } val callback = object : NotificationTroubleShootEntryPoint.Callback { override fun onDone() = lambdaError() - override fun openIgnoredUsers() = lambdaError() + override fun navigateToBlockedUsers() = lambdaError() } val result = entryPoint.nodeBuilder(parentNode, BuildContext.root(null)) .callback(callback) diff --git a/libraries/troubleshoot/impl/src/test/kotlin/io/element/android/libraries/troubleshoot/impl/history/DefaultPushHistoryEntryPointTest.kt b/libraries/troubleshoot/impl/src/test/kotlin/io/element/android/libraries/troubleshoot/impl/history/DefaultPushHistoryEntryPointTest.kt index 858956488c..aa73649c62 100644 --- a/libraries/troubleshoot/impl/src/test/kotlin/io/element/android/libraries/troubleshoot/impl/history/DefaultPushHistoryEntryPointTest.kt +++ b/libraries/troubleshoot/impl/src/test/kotlin/io/element/android/libraries/troubleshoot/impl/history/DefaultPushHistoryEntryPointTest.kt @@ -46,7 +46,7 @@ class DefaultPushHistoryEntryPointTest { } val callback = object : PushHistoryEntryPoint.Callback { override fun onDone() = lambdaError() - override fun navigateTo(roomId: RoomId, eventId: EventId) = lambdaError() + override fun navigateToEvent(roomId: RoomId, eventId: EventId) = lambdaError() } val result = entryPoint.nodeBuilder(parentNode, BuildContext.root(null)) .callback(callback) From 596b7f00fc95d7cd4f3b71b668f90527259fc209 Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Thu, 30 Oct 2025 08:36:14 +0100 Subject: [PATCH 05/46] More renaming --- .../roomdetails/impl/RoomDetailsNode.kt | 100 ++++-------------- .../features/space/impl/SpaceFlowNode.kt | 2 +- .../features/space/impl/root/SpaceNode.kt | 4 +- 3 files changed, 25 insertions(+), 81 deletions(-) diff --git a/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/RoomDetailsNode.kt b/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/RoomDetailsNode.kt index ea37c0f774..c439c2ce49 100644 --- a/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/RoomDetailsNode.kt +++ b/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/RoomDetailsNode.kt @@ -63,7 +63,7 @@ class RoomDetailsNode( fun navigateToSelectNewOwnersWhenLeaving() } - private val callback = plugins().first() + private val callback = plugins().single() init { lifecycle.subscribe( @@ -73,30 +73,6 @@ class RoomDetailsNode( ) } - private fun openRoomMemberList() { - callback.navigateToRoomMemberList() - } - - private fun openRoomNotificationSettings() { - callback.navigateToRoomNotificationSettings() - } - - private fun invitePeople() { - callback.navigateToInviteMembers() - } - - private fun openPollHistory() { - callback.navigateToPollHistory() - } - - private fun openMediaGallery() { - callback.navigateToMediaGallery() - } - - private fun onJoinCall() { - callback.navigateToRoomCall() - } - private fun CoroutineScope.onShareRoom(context: Context) = launch { room.getPermalink() .onSuccess { permalink -> @@ -112,42 +88,6 @@ class RoomDetailsNode( } } - private fun onEditRoomDetails() { - callback.navigateToRoomDetailsEdit() - } - - private fun openAvatarPreview(name: String, url: String) { - callback.navigateToAvatarPreview(name, url) - } - - private fun openAdminSettings() { - callback.navigateToAdminSettings() - } - - private fun openPinnedMessages() { - callback.navigateToPinnedMessagesList() - } - - private fun openKnockRequestsLists() { - callback.navigateToKnockRequestsList() - } - - private fun openSecurityAndPrivacy() { - callback.navigateToSecurityAndPrivacy() - } - - private fun onProfileClick(userId: UserId) { - callback.navigateToRoomMemberDetails(userId) - } - - private fun onReportRoomClick() { - callback.navigateToReportRoom() - } - - private fun onSelectNewOwnersWhenLeaving() { - return callback.navigateToSelectNewOwnersWhenLeaving() - } - private val stateFlow = launchMolecule { presenter.present() } fun onNewOwnersSelected() { @@ -165,34 +105,38 @@ class RoomDetailsNode( fun onActionClick(action: RoomDetailsAction) { when (action) { - RoomDetailsAction.Edit -> onEditRoomDetails() - RoomDetailsAction.AddTopic -> onEditRoomDetails() + RoomDetailsAction.Edit -> { + callback.navigateToRoomDetailsEdit() + } + RoomDetailsAction.AddTopic -> { + callback.navigateToRoomDetailsEdit() + } } } RoomDetailsView( state = state, modifier = modifier, - goBack = this::navigateUp, + goBack = ::navigateUp, onActionClick = ::onActionClick, onShareRoom = ::onShareRoom, - openRoomMemberList = ::openRoomMemberList, - openRoomNotificationSettings = ::openRoomNotificationSettings, - invitePeople = ::invitePeople, - openAvatarPreview = ::openAvatarPreview, - openPollHistory = ::openPollHistory, - openMediaGallery = ::openMediaGallery, - openAdminSettings = this::openAdminSettings, - onJoinCallClick = ::onJoinCall, - onPinnedMessagesClick = ::openPinnedMessages, - onKnockRequestsClick = ::openKnockRequestsLists, - onSecurityAndPrivacyClick = ::openSecurityAndPrivacy, - onProfileClick = ::onProfileClick, - onReportRoomClick = ::onReportRoomClick, + openRoomMemberList = callback::navigateToRoomMemberList, + openRoomNotificationSettings = callback::navigateToRoomNotificationSettings, + invitePeople = callback::navigateToInviteMembers, + openAvatarPreview = callback::navigateToAvatarPreview, + openPollHistory = callback::navigateToPollHistory, + openMediaGallery = callback::navigateToMediaGallery, + openAdminSettings = callback::navigateToAdminSettings, + onJoinCallClick = callback::navigateToRoomCall, + onPinnedMessagesClick = callback::navigateToPinnedMessagesList, + onKnockRequestsClick = callback::navigateToKnockRequestsList, + onSecurityAndPrivacyClick = callback::navigateToSecurityAndPrivacy, + onProfileClick = callback::navigateToRoomMemberDetails, + onReportRoomClick = callback::navigateToReportRoom, leaveRoomView = { leaveRoomRenderer.Render( state = state.leaveRoomState, - onSelectNewOwners = { onSelectNewOwnersWhenLeaving() }, + onSelectNewOwners = { callback.navigateToSelectNewOwnersWhenLeaving() }, modifier = Modifier ) } diff --git a/features/space/impl/src/main/kotlin/io/element/android/features/space/impl/SpaceFlowNode.kt b/features/space/impl/src/main/kotlin/io/element/android/features/space/impl/SpaceFlowNode.kt index a9f8a79ed6..fb3de4a9be 100644 --- a/features/space/impl/src/main/kotlin/io/element/android/features/space/impl/SpaceFlowNode.kt +++ b/features/space/impl/src/main/kotlin/io/element/android/features/space/impl/SpaceFlowNode.kt @@ -88,7 +88,7 @@ class SpaceFlowNode( callback.navigateToRoomDetails() } - override fun onOpenMemberList() { + override fun navigateToRoomMemberList() { callback.navigateToRoomMemberList() } diff --git a/features/space/impl/src/main/kotlin/io/element/android/features/space/impl/root/SpaceNode.kt b/features/space/impl/src/main/kotlin/io/element/android/features/space/impl/root/SpaceNode.kt index 978dc8dcbf..28481651eb 100644 --- a/features/space/impl/src/main/kotlin/io/element/android/features/space/impl/root/SpaceNode.kt +++ b/features/space/impl/src/main/kotlin/io/element/android/features/space/impl/root/SpaceNode.kt @@ -42,7 +42,7 @@ class SpaceNode( interface Callback : Plugin { fun navigateToRoom(roomId: RoomId, viaParameters: List) fun navigateToRoomDetails() - fun onOpenMemberList() + fun navigateToRoomMemberList() fun startLeaveSpaceFlow() } @@ -85,7 +85,7 @@ class SpaceNode( onShareRoom(context) }, onViewMembersClick = { - callback.onOpenMemberList() + callback.navigateToRoomMemberList() }, acceptDeclineInviteView = { acceptDeclineInviteView.Render( From 5197154f5462c30329de23dd5772d885a45aa8a1 Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Thu, 30 Oct 2025 09:14:41 +0100 Subject: [PATCH 06/46] Ensure a Callback and only one is provided in the Plugin. Also reduce boilerplate code in Nodes. --- .../appnav/LoggedInAppScopeFlowNode.kt | 8 +- .../android/appnav/LoggedInFlowNode.kt | 9 +- .../android/appnav/NotLoggedInFlowNode.kt | 5 +- .../android/appnav/loggedin/LoggedInNode.kt | 10 +-- .../room/joined/JoinedRoomLoadedFlowNode.kt | 17 ++-- .../createroom/impl/CreateRoomFlowNode.kt | 8 +- .../impl/addpeople/AddPeopleNode.kt | 9 +- .../impl/configureroom/ConfigureRoomNode.kt | 8 +- .../forward/impl/ForwardMessagesNode.kt | 11 +-- .../FtueSessionVerificationFlowNode.kt | 18 ++-- .../ChooseSelfVerificationModeNode.kt | 4 +- .../features/home/impl/HomeFlowNode.kt | 55 ++++-------- .../impl/list/DependencyLicensesListNode.kt | 9 +- .../impl/settings/LockScreenSettingsNode.kt | 8 +- .../impl/setup/LockScreenSetupFlowNode.kt | 10 +-- .../setup/biometric/SetupBiometricNode.kt | 8 +- .../lockscreen/impl/unlock/PinUnlockNode.kt | 10 +-- .../features/login/impl/LoginFlowNode.kt | 5 +- .../ChangeAccountProviderNode.kt | 14 +-- .../ChooseAccountProviderNode.kt | 20 ++--- .../ConfirmAccountProviderNode.kt | 26 ++---- .../impl/screens/onboarding/OnBoardingNode.kt | 45 ++-------- .../confirmation/QrCodeConfirmationNode.kt | 9 +- .../screens/qrcode/error/QrCodeErrorNode.kt | 9 +- .../screens/qrcode/intro/QrCodeIntroNode.kt | 14 +-- .../screens/qrcode/scan/QrCodeScanNode.kt | 14 +-- .../SearchAccountProviderNode.kt | 8 +- .../features/logout/impl/LogoutNode.kt | 8 +- .../messages/impl/MessagesFlowNode.kt | 24 +++--- .../features/messages/impl/MessagesNode.kt | 82 +++++------------- .../pinned/list/PinnedMessagesListNode.kt | 27 ++---- .../impl/threads/ThreadedMessagesNode.kt | 62 ++++--------- .../poll/impl/history/PollHistoryNode.kt | 8 +- .../preferences/impl/PreferencesFlowNode.kt | 16 ++-- .../preferences/impl/about/AboutNode.kt | 7 +- .../impl/developer/DeveloperSettingsNode.kt | 10 +-- .../notifications/NotificationSettingsNode.kt | 16 +--- .../EditDefaultNotificationSettingNode.kt | 10 +-- .../impl/root/PreferencesRootNode.kt | 86 ++++--------------- .../impl/bugreport/BugReportFlowNode.kt | 8 +- .../rageshake/impl/bugreport/BugReportNode.kt | 14 +-- .../impl/RoomAliasResolverNode.kt | 10 +-- .../roomdetails/impl/RoomDetailsFlowNode.kt | 20 ++--- .../roomdetails/impl/RoomDetailsNode.kt | 4 +- .../impl/members/RoomMemberListNode.kt | 12 +-- .../RoomNotificationSettingsNode.kt | 15 ++-- .../RolesAndPermissionsNode.kt | 4 +- .../impl/root/RoomDirectoryNode.kt | 11 +-- .../securebackup/impl/SecureBackupFlowNode.kt | 8 +- .../enter/SecureBackupEnterRecoveryKeyNode.kt | 4 +- .../impl/reset/ResetIdentityFlowNode.kt | 6 +- .../impl/reset/root/ResetIdentityRootNode.kt | 3 +- .../impl/root/SecureBackupRootNode.kt | 26 ++---- .../android/features/share/impl/ShareNode.kt | 11 +-- .../features/space/impl/SpaceFlowNode.kt | 3 +- .../features/space/impl/root/SpaceNode.kt | 3 +- .../startchat/impl/StartChatFlowNode.kt | 11 +-- .../userprofile/impl/UserProfileFlowNode.kt | 5 +- .../impl/incoming/IncomingVerificationNode.kt | 5 +- .../impl/outgoing/OutgoingVerificationNode.kt | 5 +- .../viewfolder/impl/file/ViewFileNode.kt | 9 +- .../viewfolder/impl/folder/ViewFolderNode.kt | 15 +--- .../impl/root/ViewFolderFlowNode.kt | 9 +- .../accountselect/impl/AccountSelectNode.kt | 16 +--- .../libraries/architecture/NodeCallback.kt | 16 ++++ .../impl/gallery/MediaGalleryNode.kt | 26 ++---- .../impl/gallery/root/MediaGalleryFlowNode.kt | 30 ++----- .../impl/viewer/MediaViewerNode.kt | 21 ++--- .../impl/troubleshoot/IgnoredUsersTest.kt | 2 +- .../impl/troubleshoot/IgnoredUsersTestTest.kt | 2 +- .../roomselect/impl/RoomSelectNode.kt | 17 +--- .../test/NotificationTroubleshootNavigator.kt | 2 +- .../impl/TroubleshootNotificationsNode.kt | 17 ++-- .../impl/history/PushHistoryNode.kt | 14 +-- .../TroubleshootNotificationsPresenterTest.kt | 2 +- .../FakeNotificationTroubleshootNavigator.kt | 2 +- 76 files changed, 374 insertions(+), 741 deletions(-) create mode 100644 libraries/architecture/src/main/kotlin/io/element/android/libraries/architecture/NodeCallback.kt diff --git a/appnav/src/main/kotlin/io/element/android/appnav/LoggedInAppScopeFlowNode.kt b/appnav/src/main/kotlin/io/element/android/appnav/LoggedInAppScopeFlowNode.kt index 47681dc624..5e160ed49f 100644 --- a/appnav/src/main/kotlin/io/element/android/appnav/LoggedInAppScopeFlowNode.kt +++ b/appnav/src/main/kotlin/io/element/android/appnav/LoggedInAppScopeFlowNode.kt @@ -21,13 +21,13 @@ 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 com.bumble.appyx.core.plugin.plugins 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 @@ -60,6 +60,8 @@ class LoggedInAppScopeFlowNode( fun navigateToAddAccount() } + private val callback: Callback = callback() + @Parcelize object NavTarget : Parcelable @@ -82,11 +84,11 @@ class LoggedInAppScopeFlowNode( override fun resolve(navTarget: NavTarget, buildContext: BuildContext): Node { val callback = object : LoggedInFlowNode.Callback { override fun navigateToBugReport() { - plugins().forEach { it.navigateToBugReport() } + callback.navigateToBugReport() } override fun navigateToAddAccount() { - plugins().forEach { it.navigateToAddAccount() } + callback.navigateToAddAccount() } } return createNode(buildContext, listOf(callback)) diff --git a/appnav/src/main/kotlin/io/element/android/appnav/LoggedInFlowNode.kt b/appnav/src/main/kotlin/io/element/android/appnav/LoggedInFlowNode.kt index dc6ad19f4b..466abc9e36 100644 --- a/appnav/src/main/kotlin/io/element/android/appnav/LoggedInFlowNode.kt +++ b/appnav/src/main/kotlin/io/element/android/appnav/LoggedInFlowNode.kt @@ -24,7 +24,6 @@ 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.core.plugin.plugins 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 @@ -67,6 +66,7 @@ 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 @@ -152,6 +152,7 @@ class LoggedInFlowNode( fun navigateToAddAccount() } + private val callback: Callback = callback() private val loggedInFlowProcessor = LoggedInEventProcessor( snackbarDispatcher = snackbarDispatcher, roomMembershipObserver = matrixClient.roomMembershipObserver, @@ -329,7 +330,7 @@ class LoggedInFlowNode( } override fun navigateToBugReport() { - plugins().forEach { it.navigateToBugReport() } + callback.navigateToBugReport() } } homeEntryPoint @@ -396,11 +397,11 @@ class LoggedInFlowNode( is NavTarget.Settings -> { val callback = object : PreferencesEntryPoint.Callback { override fun navigateToAddAccount() { - plugins().forEach { it.navigateToAddAccount() } + callback.navigateToAddAccount() } override fun navigateToBugReport() { - plugins().forEach { it.navigateToBugReport() } + callback.navigateToAddAccount() } override fun navigateToSecureBackup() { diff --git a/appnav/src/main/kotlin/io/element/android/appnav/NotLoggedInFlowNode.kt b/appnav/src/main/kotlin/io/element/android/appnav/NotLoggedInFlowNode.kt index f3c92f4407..bb0ffa82c1 100644 --- a/appnav/src/main/kotlin/io/element/android/appnav/NotLoggedInFlowNode.kt +++ b/appnav/src/main/kotlin/io/element/android/appnav/NotLoggedInFlowNode.kt @@ -18,7 +18,6 @@ import com.bumble.appyx.core.lifecycle.subscribe import com.bumble.appyx.core.modality.BuildContext import com.bumble.appyx.core.node.Node import com.bumble.appyx.core.plugin.Plugin -import com.bumble.appyx.core.plugin.plugins import com.bumble.appyx.navmodel.backstack.BackStack import dev.zacsweers.metro.AppScope import dev.zacsweers.metro.Assisted @@ -29,6 +28,7 @@ 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 @@ -58,6 +58,7 @@ class NotLoggedInFlowNode( fun navigateToBugReport() } + private val callback: Callback = callback() private val inputs = inputs() override fun onBuilt() { @@ -79,7 +80,7 @@ class NotLoggedInFlowNode( NavTarget.Root -> { val callback = object : LoginEntryPoint.Callback { override fun navigateToBugReport() { - plugins().forEach { it.navigateToBugReport() } + callback.navigateToBugReport() } } loginEntryPoint 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 index edc2be05db..9f4187cb9c 100644 --- a/appnav/src/main/kotlin/io/element/android/appnav/loggedin/LoggedInNode.kt +++ b/appnav/src/main/kotlin/io/element/android/appnav/loggedin/LoggedInNode.kt @@ -12,10 +12,10 @@ import androidx.compose.ui.Modifier import com.bumble.appyx.core.modality.BuildContext import com.bumble.appyx.core.node.Node import com.bumble.appyx.core.plugin.Plugin -import com.bumble.appyx.core.plugin.plugins import 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) @@ -32,18 +32,14 @@ class LoggedInNode( fun navigateToNotificationTroubleshoot() } - private fun navigateToNotificationTroubleshoot() { - plugins().forEach { - it.navigateToNotificationTroubleshoot() - } - } + private val callback: Callback = callback() @Composable override fun View(modifier: Modifier) { val loggedInState = loggedInPresenter.present() LoggedInView( state = loggedInState, - navigateToNotificationTroubleshoot = ::navigateToNotificationTroubleshoot, + navigateToNotificationTroubleshoot = callback::navigateToNotificationTroubleshoot, modifier = modifier ) } 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 index 154d8c45d0..760adfab25 100644 --- 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 @@ -31,6 +31,7 @@ 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 @@ -87,7 +88,7 @@ class JoinedRoomLoadedFlowNode( ) : NodeInputs private val inputs: Inputs = inputs() - private val callbacks = plugins.filterIsInstance() + private val callback: Callback = callback() override val graph = roomGraphFactory.create(inputs.room) init { @@ -124,15 +125,15 @@ class JoinedRoomLoadedFlowNode( private fun createRoomDetailsNode(buildContext: BuildContext, initialTarget: RoomDetailsEntryPoint.InitialTarget): Node { val callback = object : RoomDetailsEntryPoint.Callback { override fun navigateToGlobalNotificationSettings() { - callbacks.forEach { it.navigateToGlobalNotificationSettings() } + callback.navigateToGlobalNotificationSettings() } override fun navigateToRoom(roomId: RoomId, serverNames: List) { - callbacks.forEach { it.navigateToRoom(roomId, serverNames) } + callback.navigateToRoom(roomId, serverNames) } override fun handlePermalinkClick(data: PermalinkData, pushToBackstack: Boolean) { - callbacks.forEach { it.handlePermalinkClick(data, pushToBackstack) } + callback.handlePermalinkClick(data, pushToBackstack) } override fun startForwardEventFlow(eventId: EventId) { @@ -172,7 +173,7 @@ class JoinedRoomLoadedFlowNode( override fun onDone(roomIds: List) { backstack.pop() roomIds.singleOrNull()?.let { roomId -> - callbacks.forEach { it.navigateToRoom(roomId, emptyList()) } + callback.navigateToRoom(roomId, emptyList()) } } } @@ -187,7 +188,7 @@ class JoinedRoomLoadedFlowNode( private fun createSpaceNode(buildContext: BuildContext): Node { val callback = object : SpaceEntryPoint.Callback { override fun navigateToRoom(roomId: RoomId, viaParameters: List) { - callbacks.forEach { it.navigateToRoom(roomId, viaParameters) } + callback.navigateToRoom(roomId, viaParameters) } override fun navigateToRoomDetails() { @@ -218,7 +219,7 @@ class JoinedRoomLoadedFlowNode( } override fun handlePermalinkClick(data: PermalinkData, pushToBackstack: Boolean) { - callbacks.forEach { it.handlePermalinkClick(data, pushToBackstack) } + callback.handlePermalinkClick(data, pushToBackstack) } override fun forwardEvent(eventId: EventId) { @@ -226,7 +227,7 @@ class JoinedRoomLoadedFlowNode( } override fun navigateToRoom(roomId: RoomId) { - callbacks.forEach { it.navigateToRoom(roomId, emptyList()) } + callback.navigateToRoom(roomId, emptyList()) } } val params = MessagesEntryPoint.Params( diff --git a/features/createroom/impl/src/main/kotlin/io/element/android/features/createroom/impl/CreateRoomFlowNode.kt b/features/createroom/impl/src/main/kotlin/io/element/android/features/createroom/impl/CreateRoomFlowNode.kt index 8f46103ba5..809edc933e 100644 --- a/features/createroom/impl/src/main/kotlin/io/element/android/features/createroom/impl/CreateRoomFlowNode.kt +++ b/features/createroom/impl/src/main/kotlin/io/element/android/features/createroom/impl/CreateRoomFlowNode.kt @@ -13,7 +13,6 @@ import androidx.compose.ui.Modifier import com.bumble.appyx.core.modality.BuildContext import com.bumble.appyx.core.node.Node import com.bumble.appyx.core.plugin.Plugin -import com.bumble.appyx.core.plugin.plugins import com.bumble.appyx.navmodel.backstack.BackStack import com.bumble.appyx.navmodel.backstack.operation.replace import dev.zacsweers.metro.Assisted @@ -24,6 +23,7 @@ import io.element.android.features.createroom.impl.addpeople.AddPeopleNode import io.element.android.features.createroom.impl.configureroom.ConfigureRoomNode import io.element.android.libraries.architecture.BackstackView import io.element.android.libraries.architecture.BaseFlowNode +import io.element.android.libraries.architecture.callback import io.element.android.libraries.architecture.createNode import io.element.android.libraries.di.SessionScope import io.element.android.libraries.matrix.api.core.RoomId @@ -42,9 +42,7 @@ class CreateRoomFlowNode( buildContext = buildContext, plugins = plugins ) { - private fun onRoomCreated(roomId: RoomId) { - plugins().forEach { it.onRoomCreated(roomId) } - } + private val callback: CreateRoomEntryPoint.Callback = callback() override fun resolve(navTarget: NavTarget, buildContext: BuildContext): Node { return when (navTarget) { @@ -60,7 +58,7 @@ class CreateRoomFlowNode( val inputs = AddPeopleNode.Inputs(navTarget.roomId) val callback: AddPeopleNode.Callback = object : AddPeopleNode.Callback { override fun onFinish() { - onRoomCreated(navTarget.roomId) + callback.onRoomCreated(navTarget.roomId) } } createNode(buildContext, plugins = listOf(inputs, callback)) diff --git a/features/createroom/impl/src/main/kotlin/io/element/android/features/createroom/impl/addpeople/AddPeopleNode.kt b/features/createroom/impl/src/main/kotlin/io/element/android/features/createroom/impl/addpeople/AddPeopleNode.kt index 9ea89912cb..5db56043d9 100644 --- a/features/createroom/impl/src/main/kotlin/io/element/android/features/createroom/impl/addpeople/AddPeopleNode.kt +++ b/features/createroom/impl/src/main/kotlin/io/element/android/features/createroom/impl/addpeople/AddPeopleNode.kt @@ -12,13 +12,13 @@ import androidx.compose.ui.Modifier import com.bumble.appyx.core.modality.BuildContext import com.bumble.appyx.core.node.Node import com.bumble.appyx.core.plugin.Plugin -import com.bumble.appyx.core.plugin.plugins import dev.zacsweers.metro.Assisted import dev.zacsweers.metro.AssistedInject import io.element.android.annotations.ContributesNode import io.element.android.features.invitepeople.api.InvitePeoplePresenter import io.element.android.features.invitepeople.api.InvitePeopleRenderer import io.element.android.libraries.architecture.NodeInputs +import io.element.android.libraries.architecture.callback import io.element.android.libraries.architecture.inputs import io.element.android.libraries.di.SessionScope import io.element.android.libraries.matrix.api.core.RoomId @@ -39,10 +39,7 @@ class AddPeopleNode( fun onFinish() } - private fun onFinish() { - plugins().forEach { it.onFinish() } - } - + private val callback: Callback = callback() private val roomId = inputs().roomId private val invitePeoplePresenter = invitePeoplePresenterFactory.create( joinedRoom = null, @@ -54,7 +51,7 @@ class AddPeopleNode( val state = invitePeoplePresenter.present() AddPeopleView( state = state, - onFinish = ::onFinish, + onFinish = callback::onFinish, ) { invitePeopleRenderer.Render(state, Modifier) } diff --git a/features/createroom/impl/src/main/kotlin/io/element/android/features/createroom/impl/configureroom/ConfigureRoomNode.kt b/features/createroom/impl/src/main/kotlin/io/element/android/features/createroom/impl/configureroom/ConfigureRoomNode.kt index 9e721d28bd..3c57c0b59d 100644 --- a/features/createroom/impl/src/main/kotlin/io/element/android/features/createroom/impl/configureroom/ConfigureRoomNode.kt +++ b/features/createroom/impl/src/main/kotlin/io/element/android/features/createroom/impl/configureroom/ConfigureRoomNode.kt @@ -13,11 +13,11 @@ import com.bumble.appyx.core.lifecycle.subscribe import com.bumble.appyx.core.modality.BuildContext import com.bumble.appyx.core.node.Node import com.bumble.appyx.core.plugin.Plugin -import com.bumble.appyx.core.plugin.plugins import dev.zacsweers.metro.Assisted import dev.zacsweers.metro.AssistedInject import im.vector.app.features.analytics.plan.MobileScreen import io.element.android.annotations.ContributesNode +import io.element.android.libraries.architecture.callback import io.element.android.libraries.di.SessionScope import io.element.android.libraries.matrix.api.core.RoomId import io.element.android.services.analytics.api.AnalyticsService @@ -42,9 +42,7 @@ class ConfigureRoomNode( ) } - private fun onCreateRoomSuccess(roomId: RoomId) { - plugins().forEach { it.onCreateRoomSuccess(roomId) } - } + private val callback: Callback = callback() @Composable override fun View(modifier: Modifier) { @@ -53,7 +51,7 @@ class ConfigureRoomNode( state = state, modifier = modifier, onBackClick = this::navigateUp, - onCreateRoomSuccess = ::onCreateRoomSuccess, + onCreateRoomSuccess = callback::onCreateRoomSuccess, ) } } diff --git a/features/forward/impl/src/main/kotlin/io/element/android/features/forward/impl/ForwardMessagesNode.kt b/features/forward/impl/src/main/kotlin/io/element/android/features/forward/impl/ForwardMessagesNode.kt index 27e95898d2..6fb1b2dc0e 100644 --- a/features/forward/impl/src/main/kotlin/io/element/android/features/forward/impl/ForwardMessagesNode.kt +++ b/features/forward/impl/src/main/kotlin/io/element/android/features/forward/impl/ForwardMessagesNode.kt @@ -22,6 +22,7 @@ import dev.zacsweers.metro.AssistedInject import io.element.android.annotations.ContributesNode import io.element.android.features.forward.api.ForwardEntryPoint 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.di.SessionScope import io.element.android.libraries.matrix.api.core.EventId @@ -55,8 +56,8 @@ class ForwardMessagesNode( ) : NodeInputs private val inputs = inputs() + private val callback: ForwardEntryPoint.Callback = callback() private val presenter = presenterFactory.create(inputs.eventId.value, inputs.timelineProvider) - private val callbacks = plugins.filterIsInstance() override fun resolve(navTarget: NavTarget, buildContext: BuildContext): Node { val callback = object : RoomSelectEntryPoint.Callback { @@ -65,7 +66,7 @@ class ForwardMessagesNode( } override fun onCancel() { - onForwardDone(emptyList()) + callback.onDone(emptyList()) } } @@ -86,12 +87,8 @@ class ForwardMessagesNode( val state = presenter.present() ForwardMessagesView( state = state, - onForwardSuccess = ::onForwardDone, + onForwardSuccess = callback::onDone, ) } } - - private fun onForwardDone(roomIds: List) { - callbacks.forEach { it.onDone(roomIds) } - } } diff --git a/features/ftue/impl/src/main/kotlin/io/element/android/features/ftue/impl/sessionverification/FtueSessionVerificationFlowNode.kt b/features/ftue/impl/src/main/kotlin/io/element/android/features/ftue/impl/sessionverification/FtueSessionVerificationFlowNode.kt index b36c5633dc..47f2da3455 100644 --- a/features/ftue/impl/src/main/kotlin/io/element/android/features/ftue/impl/sessionverification/FtueSessionVerificationFlowNode.kt +++ b/features/ftue/impl/src/main/kotlin/io/element/android/features/ftue/impl/sessionverification/FtueSessionVerificationFlowNode.kt @@ -15,7 +15,6 @@ 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.plugin.plugins import com.bumble.appyx.navmodel.backstack.BackStack import com.bumble.appyx.navmodel.backstack.operation.newRoot import com.bumble.appyx.navmodel.backstack.operation.pop @@ -29,6 +28,7 @@ import io.element.android.features.securebackup.api.SecureBackupEntryPoint import io.element.android.features.verifysession.api.OutgoingVerificationEntryPoint 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.designsystem.utils.OpenUrlInTabView import io.element.android.libraries.di.SessionScope @@ -69,6 +69,8 @@ class FtueSessionVerificationFlowNode( fun onDone() } + private val callback: Callback = callback() + private val secureBackupEntryPointCallback = object : SecureBackupEntryPoint.Callback { override fun onDone() { lifecycleScope.launch { @@ -102,13 +104,15 @@ class FtueSessionVerificationFlowNode( } is NavTarget.UseAnotherDevice -> { outgoingVerificationEntryPoint.nodeBuilder(this, buildContext) - .params(OutgoingVerificationEntryPoint.Params( - showDeviceVerifiedScreen = true, - verificationRequest = VerificationRequest.Outgoing.CurrentSession, - )) + .params( + OutgoingVerificationEntryPoint.Params( + showDeviceVerifiedScreen = true, + verificationRequest = VerificationRequest.Outgoing.CurrentSession, + ) + ) .callback(object : OutgoingVerificationEntryPoint.Callback { override fun onDone() { - plugins().forEach { it.onDone() } + callback.onDone() } override fun onBack() { @@ -133,7 +137,7 @@ class FtueSessionVerificationFlowNode( .params(SecureBackupEntryPoint.Params(SecureBackupEntryPoint.InitialTarget.ResetIdentity)) .callback(object : SecureBackupEntryPoint.Callback { override fun onDone() { - plugins().forEach { it.onDone() } + callback.onDone() } }) .build() diff --git a/features/ftue/impl/src/main/kotlin/io/element/android/features/ftue/impl/sessionverification/choosemode/ChooseSelfVerificationModeNode.kt b/features/ftue/impl/src/main/kotlin/io/element/android/features/ftue/impl/sessionverification/choosemode/ChooseSelfVerificationModeNode.kt index d5a0f91ed7..ac2aa09b22 100644 --- a/features/ftue/impl/src/main/kotlin/io/element/android/features/ftue/impl/sessionverification/choosemode/ChooseSelfVerificationModeNode.kt +++ b/features/ftue/impl/src/main/kotlin/io/element/android/features/ftue/impl/sessionverification/choosemode/ChooseSelfVerificationModeNode.kt @@ -12,12 +12,12 @@ import androidx.compose.ui.Modifier import com.bumble.appyx.core.modality.BuildContext import com.bumble.appyx.core.node.Node import com.bumble.appyx.core.plugin.Plugin -import com.bumble.appyx.core.plugin.plugins import dev.zacsweers.metro.Assisted import dev.zacsweers.metro.AssistedInject import io.element.android.annotations.ContributesNode import io.element.android.features.logout.api.direct.DirectLogoutView import io.element.android.libraries.architecture.Presenter +import io.element.android.libraries.architecture.callback import io.element.android.libraries.di.SessionScope @ContributesNode(SessionScope::class) @@ -35,7 +35,7 @@ class ChooseSelfVerificationModeNode( fun navigateToLearnMoreAboutEncryption() } - private val callback = plugins().first() + private val callback: Callback = callback() @Composable override fun View(modifier: Modifier) { diff --git a/features/home/impl/src/main/kotlin/io/element/android/features/home/impl/HomeFlowNode.kt b/features/home/impl/src/main/kotlin/io/element/android/features/home/impl/HomeFlowNode.kt index 7245db296e..eb3a8bd880 100644 --- a/features/home/impl/src/main/kotlin/io/element/android/features/home/impl/HomeFlowNode.kt +++ b/features/home/impl/src/main/kotlin/io/element/android/features/home/impl/HomeFlowNode.kt @@ -21,7 +21,6 @@ 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.core.plugin.plugins import com.bumble.appyx.navmodel.backstack.BackStack import com.bumble.appyx.navmodel.backstack.operation.pop import com.bumble.appyx.navmodel.backstack.operation.push @@ -44,6 +43,7 @@ import io.element.android.features.reportroom.api.ReportRoomEntryPoint import io.element.android.libraries.architecture.BackstackView import io.element.android.libraries.architecture.BaseFlowNode import io.element.android.libraries.architecture.appyx.launchMolecule +import io.element.android.libraries.architecture.callback import io.element.android.libraries.deeplink.api.usecase.InviteFriendsUseCase import io.element.android.libraries.di.SessionScope import io.element.android.libraries.matrix.api.MatrixClient @@ -78,6 +78,7 @@ class HomeFlowNode( buildContext = buildContext, plugins = plugins ) { + private val callback: HomeEntryPoint.Callback = callback() private val stateFlow = launchMolecule { presenter.present() } override fun onBuilt() { @@ -115,35 +116,11 @@ class HomeFlowNode( data class SelectNewOwnersWhenLeavingRoom(val roomId: RoomId) : NavTarget } - private fun onRoomClick(roomId: RoomId) { - plugins().forEach { it.navigateToRoom(roomId) } - } - - private fun onOpenSettings() { - plugins().forEach { it.navigateToSettings() } - } - - private fun onStartChatClick() { - plugins().forEach { it.navigateToCreateRoom() } - } - - private fun onSetUpRecoveryClick() { - plugins().forEach { it.navigateToSetUpRecovery() } - } - - private fun onSessionConfirmRecoveryKeyClick() { - plugins().forEach { it.navigateToEnterRecoveryKey() } - } - - private fun onRoomSettingsClick(roomId: RoomId) { - plugins().forEach { it.navigateToRoomSettings(roomId) } - } - - private fun onReportRoomClick(roomId: RoomId) { + private fun navigateToReportRoom(roomId: RoomId) { backstack.push(NavTarget.ReportRoom(roomId)) } - private fun onDeclineInviteAndBlockUserClick(roomSummary: RoomListRoomSummary) { + private fun navigateToDeclineInviteAndBlockUser(roomSummary: RoomListRoomSummary) { backstack.push(NavTarget.DeclineInviteAndBlockUser(roomSummary.toInviteData())) } @@ -153,12 +130,12 @@ class HomeFlowNode( inviteFriendsUseCase.execute(activity) } RoomListMenuAction.ReportBug -> { - plugins().forEach { it.navigateToBugReport() } + callback.navigateToBugReport() } } } - private fun onSelectNewOwnersWhenLeavingRoom(roomId: RoomId) { + private fun navigateToSelectNewOwnersWhenLeavingRoom(roomId: RoomId) { backstack.push(NavTarget.SelectNewOwnersWhenLeavingRoom(roomId)) } @@ -172,20 +149,20 @@ class HomeFlowNode( val activity = requireNotNull(LocalActivity.current) HomeView( homeState = state, - onRoomClick = this::onRoomClick, - onSettingsClick = this::onOpenSettings, - onStartChatClick = this::onStartChatClick, - onSetUpRecoveryClick = this::onSetUpRecoveryClick, - onConfirmRecoveryKeyClick = this::onSessionConfirmRecoveryKeyClick, - onRoomSettingsClick = this::onRoomSettingsClick, + onRoomClick = callback::navigateToRoom, + onSettingsClick = callback::navigateToSettings, + onStartChatClick = callback::navigateToCreateRoom, + onSetUpRecoveryClick = callback::navigateToSetUpRecovery, + onConfirmRecoveryKeyClick = callback::navigateToEnterRecoveryKey, + onRoomSettingsClick = callback::navigateToRoomSettings, onMenuActionClick = { onMenuActionClick(activity, it) }, - onReportRoomClick = this::onReportRoomClick, - onDeclineInviteAndBlockUser = this::onDeclineInviteAndBlockUserClick, + onReportRoomClick = ::navigateToReportRoom, + onDeclineInviteAndBlockUser = ::navigateToDeclineInviteAndBlockUser, modifier = modifier, acceptDeclineInviteView = { acceptDeclineInviteView.Render( state = state.roomListState.acceptDeclineInviteState, - onAcceptInviteSuccess = this::onRoomClick, + onAcceptInviteSuccess = callback::navigateToRoom, onDeclineInviteSuccess = { }, modifier = Modifier ) @@ -193,7 +170,7 @@ class HomeFlowNode( leaveRoomView = { leaveRoomRenderer.Render( state = state.roomListState.leaveRoomState, - onSelectNewOwners = this::onSelectNewOwnersWhenLeavingRoom, + onSelectNewOwners = ::navigateToSelectNewOwnersWhenLeavingRoom, modifier = Modifier ) } diff --git a/features/licenses/impl/src/main/kotlin/io/element/android/features/licenses/impl/list/DependencyLicensesListNode.kt b/features/licenses/impl/src/main/kotlin/io/element/android/features/licenses/impl/list/DependencyLicensesListNode.kt index 56faebe71b..00493a0489 100644 --- a/features/licenses/impl/src/main/kotlin/io/element/android/features/licenses/impl/list/DependencyLicensesListNode.kt +++ b/features/licenses/impl/src/main/kotlin/io/element/android/features/licenses/impl/list/DependencyLicensesListNode.kt @@ -12,12 +12,12 @@ import androidx.compose.ui.Modifier import com.bumble.appyx.core.modality.BuildContext import com.bumble.appyx.core.node.Node import com.bumble.appyx.core.plugin.Plugin -import com.bumble.appyx.core.plugin.plugins import 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.licenses.impl.model.DependencyLicenseItem +import io.element.android.libraries.architecture.callback @ContributesNode(AppScope::class) @AssistedInject @@ -33,10 +33,7 @@ class DependencyLicensesListNode( fun navigateToLicense(license: DependencyLicenseItem) } - private fun onOpenLicense(license: DependencyLicenseItem) { - plugins() - .forEach { it.navigateToLicense(license) } - } + private val callback: Callback = callback() @Composable override fun View(modifier: Modifier) { @@ -44,7 +41,7 @@ class DependencyLicensesListNode( DependencyLicensesListView( state = state, onBackClick = ::navigateUp, - onOpenLicense = ::onOpenLicense, + onOpenLicense = callback::navigateToLicense, ) } } diff --git a/features/lockscreen/impl/src/main/kotlin/io/element/android/features/lockscreen/impl/settings/LockScreenSettingsNode.kt b/features/lockscreen/impl/src/main/kotlin/io/element/android/features/lockscreen/impl/settings/LockScreenSettingsNode.kt index 2dcfb0524e..d7a87e4ff4 100644 --- a/features/lockscreen/impl/src/main/kotlin/io/element/android/features/lockscreen/impl/settings/LockScreenSettingsNode.kt +++ b/features/lockscreen/impl/src/main/kotlin/io/element/android/features/lockscreen/impl/settings/LockScreenSettingsNode.kt @@ -12,10 +12,10 @@ import androidx.compose.ui.Modifier import com.bumble.appyx.core.modality.BuildContext import com.bumble.appyx.core.node.Node import com.bumble.appyx.core.plugin.Plugin -import com.bumble.appyx.core.plugin.plugins import 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) @@ -29,9 +29,7 @@ class LockScreenSettingsNode( fun navigateToSetupPin() } - private fun onChangePinClick() { - plugins().forEach { it.navigateToSetupPin() } - } + private val callback: Callback = callback() @Composable override fun View(modifier: Modifier) { @@ -39,7 +37,7 @@ class LockScreenSettingsNode( LockScreenSettingsView( state = state, onBackClick = this::navigateUp, - onChangePinClick = this::onChangePinClick, + onChangePinClick = callback::navigateToSetupPin, modifier = modifier, ) } diff --git a/features/lockscreen/impl/src/main/kotlin/io/element/android/features/lockscreen/impl/setup/LockScreenSetupFlowNode.kt b/features/lockscreen/impl/src/main/kotlin/io/element/android/features/lockscreen/impl/setup/LockScreenSetupFlowNode.kt index 263cc8ea54..92ffd94a87 100644 --- a/features/lockscreen/impl/src/main/kotlin/io/element/android/features/lockscreen/impl/setup/LockScreenSetupFlowNode.kt +++ b/features/lockscreen/impl/src/main/kotlin/io/element/android/features/lockscreen/impl/setup/LockScreenSetupFlowNode.kt @@ -14,7 +14,6 @@ import com.bumble.appyx.core.lifecycle.subscribe import com.bumble.appyx.core.modality.BuildContext import com.bumble.appyx.core.node.Node import com.bumble.appyx.core.plugin.Plugin -import com.bumble.appyx.core.plugin.plugins import com.bumble.appyx.navmodel.backstack.BackStack import com.bumble.appyx.navmodel.backstack.operation.newRoot import dev.zacsweers.metro.Assisted @@ -27,6 +26,7 @@ import io.element.android.features.lockscreen.impl.setup.biometric.SetupBiometri import io.element.android.features.lockscreen.impl.setup.pin.SetupPinNode 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.di.SessionScope import kotlinx.parcelize.Parcelize @@ -50,9 +50,7 @@ class LockScreenSetupFlowNode( fun onSetupDone() } - private fun onSetupDone() { - plugins().forEach { it.onSetupDone() } - } + private val callback: Callback = callback() sealed interface NavTarget : Parcelable { @Parcelize @@ -67,7 +65,7 @@ class LockScreenSetupFlowNode( if (biometricAuthenticatorManager.hasAvailableAuthenticator) { backstack.newRoot(NavTarget.Biometric) } else { - onSetupDone() + callback.onSetupDone() } } } @@ -91,7 +89,7 @@ class LockScreenSetupFlowNode( NavTarget.Biometric -> { val callback = object : SetupBiometricNode.Callback { override fun onBiometricSetupDone() { - onSetupDone() + callback.onSetupDone() } } createNode(buildContext, plugins = listOf(callback)) diff --git a/features/lockscreen/impl/src/main/kotlin/io/element/android/features/lockscreen/impl/setup/biometric/SetupBiometricNode.kt b/features/lockscreen/impl/src/main/kotlin/io/element/android/features/lockscreen/impl/setup/biometric/SetupBiometricNode.kt index 64da1a321c..9ffd52e4bc 100644 --- a/features/lockscreen/impl/src/main/kotlin/io/element/android/features/lockscreen/impl/setup/biometric/SetupBiometricNode.kt +++ b/features/lockscreen/impl/src/main/kotlin/io/element/android/features/lockscreen/impl/setup/biometric/SetupBiometricNode.kt @@ -13,10 +13,10 @@ import androidx.compose.ui.Modifier import com.bumble.appyx.core.modality.BuildContext import com.bumble.appyx.core.node.Node import com.bumble.appyx.core.plugin.Plugin -import com.bumble.appyx.core.plugin.plugins import 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) @@ -30,16 +30,14 @@ class SetupBiometricNode( fun onBiometricSetupDone() } - private fun onSetupDone() { - plugins().forEach { it.onBiometricSetupDone() } - } + private val callback: Callback = callback() @Composable override fun View(modifier: Modifier) { val state = presenter.present() LaunchedEffect(state.isBiometricSetupDone) { if (state.isBiometricSetupDone) { - onSetupDone() + callback.onBiometricSetupDone() } } SetupBiometricView( diff --git a/features/lockscreen/impl/src/main/kotlin/io/element/android/features/lockscreen/impl/unlock/PinUnlockNode.kt b/features/lockscreen/impl/src/main/kotlin/io/element/android/features/lockscreen/impl/unlock/PinUnlockNode.kt index fba460f6ee..b1d45c348c 100644 --- a/features/lockscreen/impl/src/main/kotlin/io/element/android/features/lockscreen/impl/unlock/PinUnlockNode.kt +++ b/features/lockscreen/impl/src/main/kotlin/io/element/android/features/lockscreen/impl/unlock/PinUnlockNode.kt @@ -13,10 +13,10 @@ import androidx.compose.ui.Modifier import com.bumble.appyx.core.modality.BuildContext import com.bumble.appyx.core.node.Node import com.bumble.appyx.core.plugin.Plugin -import com.bumble.appyx.core.plugin.plugins import 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) @@ -30,18 +30,14 @@ class PinUnlockNode( fun onUnlock() } - private fun onUnlock() { - plugins().forEach { - it.onUnlock() - } - } + private val callback: Callback = callback() @Composable override fun View(modifier: Modifier) { val state = presenter.present() LaunchedEffect(state.isUnlocked) { if (state.isUnlocked) { - onUnlock() + callback.onUnlock() } } PinUnlockView( diff --git a/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/LoginFlowNode.kt b/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/LoginFlowNode.kt index ce85c617ef..208109d6f9 100644 --- a/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/LoginFlowNode.kt +++ b/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/LoginFlowNode.kt @@ -18,7 +18,6 @@ import com.bumble.appyx.core.lifecycle.subscribe import com.bumble.appyx.core.modality.BuildContext import com.bumble.appyx.core.node.Node import com.bumble.appyx.core.plugin.Plugin -import com.bumble.appyx.core.plugin.plugins import com.bumble.appyx.navmodel.backstack.BackStack import com.bumble.appyx.navmodel.backstack.operation.push import com.bumble.appyx.navmodel.backstack.operation.singleTop @@ -41,6 +40,7 @@ import io.element.android.libraries.androidutils.browser.openUrlInChromeCustomTa 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.createNode import io.element.android.libraries.architecture.inputs import io.element.android.libraries.matrix.api.auth.OidcDetails @@ -70,6 +70,7 @@ class LoginFlowNode( val loginHint: String?, ) : NodeInputs + private val callback: LoginEntryPoint.Callback = callback() private var activity: Activity? = null private var darkTheme: Boolean = false @@ -147,7 +148,7 @@ class LoginFlowNode( } override fun navigateToBugReport() { - plugins().forEach { it.navigateToBugReport() } + callback.navigateToBugReport() } override fun navigateToOidc(oidcDetails: OidcDetails) { diff --git a/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/screens/changeaccountprovider/ChangeAccountProviderNode.kt b/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/screens/changeaccountprovider/ChangeAccountProviderNode.kt index 80de8c6d71..b63b7cf011 100644 --- a/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/screens/changeaccountprovider/ChangeAccountProviderNode.kt +++ b/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/screens/changeaccountprovider/ChangeAccountProviderNode.kt @@ -13,12 +13,12 @@ import androidx.compose.ui.platform.LocalContext import com.bumble.appyx.core.modality.BuildContext import com.bumble.appyx.core.node.Node import com.bumble.appyx.core.plugin.Plugin -import com.bumble.appyx.core.plugin.plugins import 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.impl.util.openLearnMorePage +import io.element.android.libraries.architecture.callback @ContributesNode(AppScope::class) @AssistedInject @@ -32,13 +32,7 @@ class ChangeAccountProviderNode( fun navigateToSearchAccountProvider() } - private fun onDone() { - plugins().forEach { it.onDone() } - } - - private fun onOtherClick() { - plugins().forEach { it.navigateToSearchAccountProvider() } - } + private val callback: Callback = callback() @Composable override fun View(modifier: Modifier) { @@ -49,8 +43,8 @@ class ChangeAccountProviderNode( modifier = modifier, onBackClick = ::navigateUp, onLearnMoreClick = { openLearnMorePage(context) }, - onSuccess = ::onDone, - onOtherProviderClick = ::onOtherClick, + onSuccess = callback::onDone, + onOtherProviderClick = callback::navigateToSearchAccountProvider, ) } } diff --git a/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/screens/chooseaccountprovider/ChooseAccountProviderNode.kt b/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/screens/chooseaccountprovider/ChooseAccountProviderNode.kt index 02203aaa72..2b65c2a70f 100644 --- a/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/screens/chooseaccountprovider/ChooseAccountProviderNode.kt +++ b/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/screens/chooseaccountprovider/ChooseAccountProviderNode.kt @@ -13,12 +13,12 @@ import androidx.compose.ui.platform.LocalContext import com.bumble.appyx.core.modality.BuildContext import com.bumble.appyx.core.node.Node import com.bumble.appyx.core.plugin.Plugin -import com.bumble.appyx.core.plugin.plugins import 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.impl.util.openLearnMorePage +import io.element.android.libraries.architecture.callback import io.element.android.libraries.matrix.api.auth.OidcDetails @ContributesNode(AppScope::class) @@ -34,17 +34,7 @@ class ChooseAccountProviderNode( fun navigateToCreateAccount(url: String) } - private fun onOidcDetails(oidcDetails: OidcDetails) { - plugins().forEach { it.navigateToOidc(oidcDetails) } - } - - private fun onLoginPasswordNeeded() { - plugins().forEach { it.navigateToLoginPassword() } - } - - private fun onCreateAccountContinue(url: String) { - plugins().forEach { it.navigateToCreateAccount(url) } - } + private val callback: Callback = callback() @Composable override fun View(modifier: Modifier) { @@ -54,10 +44,10 @@ class ChooseAccountProviderNode( state = state, modifier = modifier, onBackClick = ::navigateUp, - onOidcDetails = ::onOidcDetails, - onNeedLoginPassword = ::onLoginPasswordNeeded, + onOidcDetails = callback::navigateToOidc, + onNeedLoginPassword = callback::navigateToLoginPassword, onLearnMoreClick = { openLearnMorePage(context) }, - onCreateAccountContinue = ::onCreateAccountContinue, + onCreateAccountContinue = callback::navigateToCreateAccount, ) } } diff --git a/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/screens/confirmaccountprovider/ConfirmAccountProviderNode.kt b/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/screens/confirmaccountprovider/ConfirmAccountProviderNode.kt index 52df30b4fb..e849d0d404 100644 --- a/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/screens/confirmaccountprovider/ConfirmAccountProviderNode.kt +++ b/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/screens/confirmaccountprovider/ConfirmAccountProviderNode.kt @@ -13,13 +13,13 @@ import androidx.compose.ui.platform.LocalContext import com.bumble.appyx.core.modality.BuildContext import com.bumble.appyx.core.node.Node import com.bumble.appyx.core.plugin.Plugin -import com.bumble.appyx.core.plugin.plugins import 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.impl.util.openLearnMorePage 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.matrix.api.auth.OidcDetails @@ -48,21 +48,7 @@ class ConfirmAccountProviderNode( fun navigateToChangeAccountProvider() } - private fun onOidcDetails(data: OidcDetails) { - plugins().forEach { it.navigateToOidc(data) } - } - - private fun onLoginPasswordNeeded() { - plugins().forEach { it.navigateToLoginPassword() } - } - - private fun onCreateAccountContinue(url: String) { - plugins().forEach { it.navigateToCreateAccount(url) } - } - - private fun onChangeAccountProvider() { - plugins().forEach { it.navigateToChangeAccountProvider() } - } + private val callback: Callback = callback() @Composable override fun View(modifier: Modifier) { @@ -71,10 +57,10 @@ class ConfirmAccountProviderNode( ConfirmAccountProviderView( state = state, modifier = modifier, - onOidcDetails = ::onOidcDetails, - onNeedLoginPassword = ::onLoginPasswordNeeded, - onCreateAccountContinue = ::onCreateAccountContinue, - onChange = ::onChangeAccountProvider, + onOidcDetails = callback::navigateToOidc, + onNeedLoginPassword = callback::navigateToLoginPassword, + onCreateAccountContinue = callback::navigateToCreateAccount, + onChange = callback::navigateToChangeAccountProvider, onLearnMoreClick = { openLearnMorePage(context) }, ) } diff --git a/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/screens/onboarding/OnBoardingNode.kt b/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/screens/onboarding/OnBoardingNode.kt index d9968af936..f90483778a 100644 --- a/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/screens/onboarding/OnBoardingNode.kt +++ b/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/screens/onboarding/OnBoardingNode.kt @@ -13,13 +13,13 @@ import androidx.compose.ui.platform.LocalContext import com.bumble.appyx.core.modality.BuildContext import com.bumble.appyx.core.node.Node import com.bumble.appyx.core.plugin.Plugin -import com.bumble.appyx.core.plugin.plugins import 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.impl.util.openLearnMorePage 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.matrix.api.auth.OidcDetails @@ -48,40 +48,13 @@ class OnBoardingNode( val loginHint: String?, ) : NodeInputs + private val callback: Callback = callback() private val params = inputs() private val presenter = presenterFactory.create( params = params, ) - private fun onSignIn(mustChooseAccountProvider: Boolean) { - plugins().forEach { it.navigateToSignInFlow(mustChooseAccountProvider) } - } - - private fun onSignUp() { - plugins().forEach { it.navigateToSignUpFlow() } - } - - private fun onSignInWithQrCode() { - plugins().forEach { it.navigateToQrCode() } - } - - private fun onReportProblem() { - plugins().forEach { it.navigateToBugReport() } - } - - private fun onOidcDetails(data: OidcDetails) { - plugins().forEach { it.navigateToOidc(data) } - } - - private fun onLoginPasswordNeeded() { - plugins().forEach { it.navigateToLoginPassword() } - } - - private fun onCreateAccountContinue(url: String) { - plugins().forEach { it.navigateToCreateAccount(url) } - } - @Composable override fun View(modifier: Modifier) { val state = presenter.present() @@ -89,14 +62,14 @@ class OnBoardingNode( OnBoardingView( state = state, modifier = modifier, - onSignIn = ::onSignIn, - onCreateAccount = ::onSignUp, - onSignInWithQrCode = ::onSignInWithQrCode, - onReportProblem = ::onReportProblem, - onOidcDetails = ::onOidcDetails, - onNeedLoginPassword = ::onLoginPasswordNeeded, + onSignIn = callback::navigateToSignInFlow, + onCreateAccount = callback::navigateToSignUpFlow, + onSignInWithQrCode = callback::navigateToQrCode, + onReportProblem = callback::navigateToBugReport, + onOidcDetails = callback::navigateToOidc, + onNeedLoginPassword = callback::navigateToLoginPassword, onLearnMoreClick = { openLearnMorePage(context) }, - onCreateAccountContinue = ::onCreateAccountContinue, + onCreateAccountContinue = callback::navigateToCreateAccount, onBackClick = ::navigateUp, ) } diff --git a/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/screens/qrcode/confirmation/QrCodeConfirmationNode.kt b/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/screens/qrcode/confirmation/QrCodeConfirmationNode.kt index 8b8d5b2dd5..7a3689dd3c 100644 --- a/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/screens/qrcode/confirmation/QrCodeConfirmationNode.kt +++ b/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/screens/qrcode/confirmation/QrCodeConfirmationNode.kt @@ -12,11 +12,11 @@ import androidx.compose.ui.Modifier import com.bumble.appyx.core.modality.BuildContext import com.bumble.appyx.core.node.Node import com.bumble.appyx.core.plugin.Plugin -import com.bumble.appyx.core.plugin.plugins import dev.zacsweers.metro.Assisted import dev.zacsweers.metro.AssistedInject import io.element.android.annotations.ContributesNode import io.element.android.features.login.impl.di.QrCodeLoginScope +import io.element.android.libraries.architecture.callback import io.element.android.libraries.architecture.inputs @ContributesNode(QrCodeLoginScope::class) @@ -29,17 +29,14 @@ class QrCodeConfirmationNode( fun onCancel() } + private val callback: Callback = callback() private val step = inputs() - private fun onCancel() { - plugins().forEach { it.onCancel() } - } - @Composable override fun View(modifier: Modifier) { QrCodeConfirmationView( step = step, - onCancel = ::onCancel, + onCancel = callback::onCancel, ) } } diff --git a/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/screens/qrcode/error/QrCodeErrorNode.kt b/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/screens/qrcode/error/QrCodeErrorNode.kt index 7b46c2e45c..294037a1f7 100644 --- a/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/screens/qrcode/error/QrCodeErrorNode.kt +++ b/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/screens/qrcode/error/QrCodeErrorNode.kt @@ -12,12 +12,12 @@ import androidx.compose.ui.Modifier import com.bumble.appyx.core.modality.BuildContext import com.bumble.appyx.core.node.Node import com.bumble.appyx.core.plugin.Plugin -import com.bumble.appyx.core.plugin.plugins import dev.zacsweers.metro.Assisted import dev.zacsweers.metro.AssistedInject import io.element.android.annotations.ContributesNode import io.element.android.features.login.impl.di.QrCodeLoginScope import io.element.android.features.login.impl.qrcode.QrCodeErrorScreenType +import io.element.android.libraries.architecture.callback import io.element.android.libraries.architecture.inputs import io.element.android.libraries.core.meta.BuildMeta @@ -32,10 +32,7 @@ class QrCodeErrorNode( fun onRetry() } - private fun onRetry() { - plugins().forEach { it.onRetry() } - } - + private val callback: Callback = callback() private val qrCodeErrorScreenType = inputs() @Composable @@ -44,7 +41,7 @@ class QrCodeErrorNode( modifier = modifier, errorScreenType = qrCodeErrorScreenType, appName = buildMeta.productionApplicationName, - onRetry = ::onRetry, + onRetry = callback::onRetry, ) } } diff --git a/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/screens/qrcode/intro/QrCodeIntroNode.kt b/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/screens/qrcode/intro/QrCodeIntroNode.kt index 951550fc22..719df8f423 100644 --- a/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/screens/qrcode/intro/QrCodeIntroNode.kt +++ b/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/screens/qrcode/intro/QrCodeIntroNode.kt @@ -12,11 +12,11 @@ import androidx.compose.ui.Modifier import com.bumble.appyx.core.modality.BuildContext import com.bumble.appyx.core.node.Node import com.bumble.appyx.core.plugin.Plugin -import com.bumble.appyx.core.plugin.plugins import dev.zacsweers.metro.Assisted import dev.zacsweers.metro.AssistedInject import io.element.android.annotations.ContributesNode import io.element.android.features.login.impl.di.QrCodeLoginScope +import io.element.android.libraries.architecture.callback @ContributesNode(QrCodeLoginScope::class) @AssistedInject @@ -30,21 +30,15 @@ class QrCodeIntroNode( fun navigateToQrCodeScan() } - private fun onCancelClicked() { - plugins().forEach { it.cancel() } - } - - private fun onContinue() { - plugins().forEach { it.navigateToQrCodeScan() } - } + private val callback: Callback = callback() @Composable override fun View(modifier: Modifier) { val state = presenter.present() QrCodeIntroView( state = state, - onBackClick = ::onCancelClicked, - onContinue = ::onContinue, + onBackClick = callback::cancel, + onContinue = callback::navigateToQrCodeScan, modifier = modifier ) } diff --git a/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/screens/qrcode/scan/QrCodeScanNode.kt b/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/screens/qrcode/scan/QrCodeScanNode.kt index 554639c72a..44eab816c1 100644 --- a/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/screens/qrcode/scan/QrCodeScanNode.kt +++ b/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/screens/qrcode/scan/QrCodeScanNode.kt @@ -12,11 +12,11 @@ import androidx.compose.ui.Modifier import com.bumble.appyx.core.modality.BuildContext import com.bumble.appyx.core.node.Node import com.bumble.appyx.core.plugin.Plugin -import com.bumble.appyx.core.plugin.plugins import dev.zacsweers.metro.Assisted import dev.zacsweers.metro.AssistedInject import io.element.android.annotations.ContributesNode import io.element.android.features.login.impl.di.QrCodeLoginScope +import io.element.android.libraries.architecture.callback import io.element.android.libraries.matrix.api.auth.qrlogin.MatrixQrCodeLoginData @ContributesNode(QrCodeLoginScope::class) @@ -31,21 +31,15 @@ class QrCodeScanNode( fun cancel() } - private fun onQrCodeDataReady(qrCodeLoginData: MatrixQrCodeLoginData) { - plugins().forEach { it.handleScannedCode(qrCodeLoginData) } - } - - private fun onCancelClicked() { - plugins().forEach { it.cancel() } - } + private val callback: Callback = callback() @Composable override fun View(modifier: Modifier) { val state = presenter.present() QrCodeScanView( state = state, - onQrCodeDataReady = ::onQrCodeDataReady, - onBackClick = ::onCancelClicked, + onQrCodeDataReady = callback::handleScannedCode, + onBackClick = callback::cancel, modifier = modifier ) } diff --git a/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/screens/searchaccountprovider/SearchAccountProviderNode.kt b/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/screens/searchaccountprovider/SearchAccountProviderNode.kt index dc6084032e..5def2bc830 100644 --- a/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/screens/searchaccountprovider/SearchAccountProviderNode.kt +++ b/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/screens/searchaccountprovider/SearchAccountProviderNode.kt @@ -13,12 +13,12 @@ import androidx.compose.ui.platform.LocalContext import com.bumble.appyx.core.modality.BuildContext import com.bumble.appyx.core.node.Node import com.bumble.appyx.core.plugin.Plugin -import com.bumble.appyx.core.plugin.plugins import 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.impl.util.openLearnMorePage +import io.element.android.libraries.architecture.callback @ContributesNode(AppScope::class) @AssistedInject @@ -31,9 +31,7 @@ class SearchAccountProviderNode( fun onDone() } - private fun onDone() { - plugins().forEach { it.onDone() } - } + private val callback: Callback = callback() @Composable override fun View(modifier: Modifier) { @@ -44,7 +42,7 @@ class SearchAccountProviderNode( modifier = modifier, onBackClick = ::navigateUp, onLearnMoreClick = { openLearnMorePage(context) }, - onSuccess = ::onDone, + onSuccess = callback::onDone, ) } } diff --git a/features/logout/impl/src/main/kotlin/io/element/android/features/logout/impl/LogoutNode.kt b/features/logout/impl/src/main/kotlin/io/element/android/features/logout/impl/LogoutNode.kt index 3860850fcf..7cf717df68 100644 --- a/features/logout/impl/src/main/kotlin/io/element/android/features/logout/impl/LogoutNode.kt +++ b/features/logout/impl/src/main/kotlin/io/element/android/features/logout/impl/LogoutNode.kt @@ -12,11 +12,11 @@ import androidx.compose.ui.Modifier import com.bumble.appyx.core.modality.BuildContext import com.bumble.appyx.core.node.Node import com.bumble.appyx.core.plugin.Plugin -import com.bumble.appyx.core.plugin.plugins import dev.zacsweers.metro.Assisted import dev.zacsweers.metro.AssistedInject import io.element.android.annotations.ContributesNode import io.element.android.features.logout.api.LogoutEntryPoint +import io.element.android.libraries.architecture.callback import io.element.android.libraries.di.SessionScope @ContributesNode(SessionScope::class) @@ -26,16 +26,14 @@ class LogoutNode( @Assisted plugins: List, private val presenter: LogoutPresenter, ) : Node(buildContext, plugins = plugins) { - private fun onChangeRecoveryKeyClick() { - plugins().forEach { it.navigateToSecureBackup() } - } + private val callback: LogoutEntryPoint.Callback = callback() @Composable override fun View(modifier: Modifier) { val state = presenter.present() LogoutView( state = state, - onChangeRecoveryKeyClick = ::onChangeRecoveryKeyClick, + onChangeRecoveryKeyClick = callback::navigateToSecureBackup, onBackClick = ::navigateUp, modifier = modifier, ) diff --git a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/MessagesFlowNode.kt b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/MessagesFlowNode.kt index c9fe66191b..a65595788a 100644 --- a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/MessagesFlowNode.kt +++ b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/MessagesFlowNode.kt @@ -16,7 +16,6 @@ import com.bumble.appyx.core.lifecycle.subscribe import com.bumble.appyx.core.modality.BuildContext import com.bumble.appyx.core.node.Node import com.bumble.appyx.core.plugin.Plugin -import com.bumble.appyx.core.plugin.plugins import com.bumble.appyx.navmodel.backstack.BackStack import com.bumble.appyx.navmodel.backstack.operation.pop import com.bumble.appyx.navmodel.backstack.operation.push @@ -55,6 +54,7 @@ import io.element.android.features.poll.api.create.CreatePollEntryPoint import io.element.android.features.poll.api.create.CreatePollMode import io.element.android.libraries.architecture.BackstackWithOverlayBox 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.overlay.Overlay import io.element.android.libraries.architecture.overlay.operation.hide @@ -182,7 +182,7 @@ class MessagesFlowNode( data class Thread(val threadRootId: ThreadId, val focusedEventId: EventId?) : NavTarget } - private val callbacks = plugins() + private val callback: MessagesEntryPoint.Callback = callback() override fun onBuilt() { super.onBuilt() @@ -221,7 +221,7 @@ class MessagesFlowNode( is NavTarget.Messages -> { val callback = object : MessagesNode.Callback { override fun navigateToRoomDetails() { - callbacks.forEach { it.navigateToRoomDetails() } + callback.navigateToRoomDetails() } override fun handleEventClick(timelineMode: Timeline.Mode, event: TimelineItem.Event): Boolean { @@ -242,11 +242,11 @@ class MessagesFlowNode( } override fun navigateToRoomMemberDetails(userId: UserId) { - callbacks.forEach { it.navigateToRoomMemberDetails(userId) } + callback.navigateToRoomMemberDetails(userId) } override fun handlePermalinkClick(data: PermalinkData) { - callbacks.forEach { it.handlePermalinkClick(data, pushToBackstack = true) } + callback.handlePermalinkClick(data, pushToBackstack = true) } override fun navigateToEventDebugInfo(eventId: EventId?, debugInfo: TimelineItemDebugInfo) { @@ -317,7 +317,7 @@ class MessagesFlowNode( override fun forwardEvent(eventId: EventId) { // Need to go to the parent because of the overlay - callbacks.forEach { it.forwardEvent(eventId) } + callback.forwardEvent(eventId) } } mediaViewerEntryPoint.nodeBuilder(this, buildContext) @@ -352,7 +352,7 @@ class MessagesFlowNode( override fun onDone(roomIds: List) { backstack.pop() roomIds.singleOrNull()?.let { roomId -> - callbacks.forEach { it.navigateToRoom(roomId) } + callback.navigateToRoom(roomId) } } } @@ -400,7 +400,7 @@ class MessagesFlowNode( } override fun navigateToRoomMemberDetails(userId: UserId) { - callbacks.forEach { it.navigateToRoomMemberDetails(userId) } + callback.navigateToRoomMemberDetails(userId) } override fun viewInTimeline(eventId: EventId) { @@ -408,7 +408,7 @@ class MessagesFlowNode( } override fun handlePermalinkClick(data: PermalinkData.RoomLink) { - callbacks.forEach { it.handlePermalinkClick(data, pushToBackstack = !room.matches(data.roomIdOrAlias)) } + callback.handlePermalinkClick(data, pushToBackstack = !room.matches(data.roomIdOrAlias)) } override fun navigateToEventDebugInfo(eventId: EventId?, debugInfo: TimelineItemDebugInfo) { @@ -448,11 +448,11 @@ class MessagesFlowNode( } override fun navigateToRoomMemberDetails(userId: UserId) { - callbacks.forEach { it.navigateToRoomMemberDetails(userId) } + callback.navigateToRoomMemberDetails(userId) } override fun handlePermalinkClick(data: PermalinkData) { - callbacks.forEach { it.handlePermalinkClick(data, pushToBackstack = true) } + callback.handlePermalinkClick(data, pushToBackstack = true) } override fun navigateToEventDebugInfo(eventId: EventId?, debugInfo: TimelineItemDebugInfo) { @@ -502,7 +502,7 @@ class MessagesFlowNode( roomIdOrAlias = room.roomId.toRoomIdOrAlias(), eventId = eventId, ) - callbacks.forEach { it.handlePermalinkClick(permalinkData, pushToBackstack = false) } + callback.handlePermalinkClick(permalinkData, pushToBackstack = false) } private fun processEventClick( diff --git a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/MessagesNode.kt b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/MessagesNode.kt index bb2870b6af..9647ffca17 100644 --- a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/MessagesNode.kt +++ b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/MessagesNode.kt @@ -24,7 +24,6 @@ import com.bumble.appyx.core.lifecycle.subscribe import com.bumble.appyx.core.modality.BuildContext import com.bumble.appyx.core.node.Node import com.bumble.appyx.core.plugin.Plugin -import com.bumble.appyx.core.plugin.plugins import dev.zacsweers.metro.Assisted import dev.zacsweers.metro.AssistedInject import io.element.android.annotations.ContributesNode @@ -48,8 +47,8 @@ import io.element.android.libraries.androidutils.browser.openUrlInChromeCustomTa import io.element.android.libraries.androidutils.system.openUrlInExternalApp import io.element.android.libraries.androidutils.system.toast import io.element.android.libraries.architecture.NodeInputs +import io.element.android.libraries.architecture.callback import io.element.android.libraries.architecture.inputs -import io.element.android.libraries.core.bool.orFalse import io.element.android.libraries.designsystem.utils.OnLifecycleEvent import io.element.android.libraries.di.RoomScope import io.element.android.libraries.di.annotations.ApplicationContext @@ -93,13 +92,12 @@ class MessagesNode( private val knockRequestsBannerRenderer: KnockRequestsBannerRenderer, private val roomMemberModerationRenderer: RoomMemberModerationRenderer, ) : Node(buildContext, plugins = plugins), MessagesNavigator { - private val callbacks = plugins() - data class Inputs( val focusedEventId: EventId?, ) : NodeInputs private val inputs = inputs() + private val callback: Callback = callback() private val timelineController = TimelineController(room, room.liveTimeline) private val presenter = presenterFactory.create( @@ -143,32 +141,6 @@ class MessagesNode( ) } - private fun navigateToRoomDetails() { - callbacks.forEach { it.navigateToRoomDetails() } - } - - private fun navigateToPinnedMessagesList() { - callbacks.forEach { it.navigateToPinnedMessagesList() } - } - - private fun navigateToKnockRequestsList() { - callbacks.forEach { it.navigateToKnockRequestsList() } - } - - private fun onEventClick(timelineMode: Timeline.Mode, event: TimelineItem.Event): Boolean { - // Note: cannot use `callbacks.all { it.onEventClick(event) }` because: - // - if callbacks is empty, it will return true and we want to return false. - // - if a callback returns false, the other callback will not be invoked. - return callbacks.takeIf { it.isNotEmpty() } - ?.map { it.handleEventClick(timelineMode, event) } - ?.all { it } - .orFalse() - } - - private fun navigateToRoomMemberDetails(userId: UserId) { - callbacks.forEach { it.navigateToRoomMemberDetails(userId) } - } - private fun onLinkClick( activity: Activity, darkTheme: Boolean, @@ -180,7 +152,7 @@ class MessagesNode( is PermalinkData.UserLink -> { // Open the room member profile, it will fallback to // the user profile if the user is not in the room - callbacks.forEach { it.navigateToRoomMemberDetails(permalink.userId) } + callback.navigateToRoomMemberDetails(permalink.userId) } is PermalinkData.RoomLink -> { handleRoomLinkClick(permalink, eventSink) @@ -211,28 +183,28 @@ class MessagesNode( displaySameRoomToast() } } else { - callbacks.forEach { it.handlePermalinkClick(roomLink) } + callback.handlePermalinkClick(roomLink) } } override fun navigateToEventDebugInfo(eventId: EventId?, debugInfo: TimelineItemDebugInfo) { - callbacks.forEach { it.navigateToEventDebugInfo(eventId, debugInfo) } + callback.navigateToEventDebugInfo(eventId, debugInfo) } override fun forwardEvent(eventId: EventId) { - callbacks.forEach { it.forwardEvent(eventId) } + callback.forwardEvent(eventId) } override fun navigateToReportMessage(eventId: EventId, senderId: UserId) { - callbacks.forEach { it.navigateToReportMessage(eventId, senderId) } + callback.navigateToReportMessage(eventId, senderId) } override fun navigateToEditPoll(eventId: EventId) { - callbacks.forEach { it.navigateToEditPoll(eventId) } + callback.navigateToEditPoll(eventId) } override fun navigateToPreviewAttachments(attachments: ImmutableList, inReplyToEventId: EventId?) { - callbacks.forEach { it.navigateToPreviewAttachments(attachments, inReplyToEventId) } + callback.navigateToPreviewAttachments(attachments, inReplyToEventId) } override fun navigateToRoom(roomId: RoomId, eventId: EventId?, serverNames: List) { @@ -240,24 +212,12 @@ class MessagesNode( displaySameRoomToast() } else { val permalinkData = PermalinkData.RoomLink(roomId.toRoomIdOrAlias(), eventId, viaParameters = serverNames.toImmutableList()) - callbacks.forEach { it.handlePermalinkClick(permalinkData) } + callback.handlePermalinkClick(permalinkData) } } override fun navigateToThread(threadRootId: ThreadId, focusedEventId: EventId?) { - callbacks.forEach { it.navigateToThread(threadRootId, focusedEventId) } - } - - private fun navigateToSendLocation() { - callbacks.forEach { it.navigateToSendLocation() } - } - - private fun navigateToCreatePoll() { - callbacks.forEach { it.navigateToCreatePoll() } - } - - private fun navigateToRoomCall() { - callbacks.forEach { it.navigateToRoomCall(room.roomId) } + callback.navigateToThread(threadRootId, focusedEventId) } private fun displaySameRoomToast() { @@ -288,20 +248,20 @@ class MessagesNode( MessagesView( state = state, onBackClick = { state.eventSink(MessagesEvents.MarkAsFullyReadAndExit) }, - onRoomDetailsClick = ::navigateToRoomDetails, + onRoomDetailsClick = callback::navigateToRoomDetails, onEventContentClick = { isLive, event -> if (isLive) { - onEventClick(timelineController.mainTimelineMode(), event) + callback.handleEventClick(timelineController.mainTimelineMode(), event) } else { val detachedTimelineMode = timelineController.detachedTimelineMode() if (detachedTimelineMode != null) { - onEventClick(detachedTimelineMode, event) + callback.handleEventClick(detachedTimelineMode, event) } else { false } } }, - onUserDataClick = ::navigateToRoomMemberDetails, + onUserDataClick = callback::navigateToRoomMemberDetails, onLinkClick = { url, customTab -> onLinkClick( activity = activity, @@ -311,15 +271,15 @@ class MessagesNode( customTab = customTab, ) }, - onSendLocationClick = ::navigateToSendLocation, - onCreatePollClick = ::navigateToCreatePoll, - onJoinCallClick = ::navigateToRoomCall, - onViewAllPinnedMessagesClick = ::navigateToPinnedMessagesList, + onSendLocationClick = callback::navigateToSendLocation, + onCreatePollClick = callback::navigateToCreatePoll, + onJoinCallClick = { callback.navigateToRoomCall(room.roomId) }, + onViewAllPinnedMessagesClick = callback::navigateToPinnedMessagesList, modifier = modifier, knockRequestsBannerView = { knockRequestsBannerRenderer.View( modifier = Modifier, - onViewRequestsClick = ::navigateToKnockRequestsList, + onViewRequestsClick = callback::navigateToKnockRequestsList, ) }, ) @@ -327,7 +287,7 @@ class MessagesNode( state = state.roomMemberModerationState, onSelectAction = { action, target -> when (action) { - is ModerationAction.DisplayProfile -> navigateToRoomMemberDetails(target.userId) + is ModerationAction.DisplayProfile -> callback.navigateToRoomMemberDetails(target.userId) else -> state.roomMemberModerationState.eventSink(RoomMemberModerationEvents.ProcessAction(action, target)) } }, diff --git a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/pinned/list/PinnedMessagesListNode.kt b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/pinned/list/PinnedMessagesListNode.kt index 6d1c7b6027..130d9fe678 100644 --- a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/pinned/list/PinnedMessagesListNode.kt +++ b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/pinned/list/PinnedMessagesListNode.kt @@ -17,7 +17,6 @@ import androidx.compose.ui.platform.LocalView import com.bumble.appyx.core.modality.BuildContext import com.bumble.appyx.core.node.Node import com.bumble.appyx.core.plugin.Plugin -import com.bumble.appyx.core.plugin.plugins import dev.zacsweers.metro.Assisted import dev.zacsweers.metro.AssistedInject import io.element.android.annotations.ContributesNode @@ -27,6 +26,7 @@ import io.element.android.features.messages.impl.timeline.di.TimelineItemPresent import io.element.android.features.messages.impl.timeline.model.TimelineItem import io.element.android.libraries.androidutils.system.copyToClipboard import io.element.android.libraries.androidutils.system.openUrlInExternalApp +import io.element.android.libraries.architecture.callback import io.element.android.libraries.di.RoomScope import io.element.android.libraries.matrix.api.core.EventId import io.element.android.libraries.matrix.api.core.UserId @@ -34,7 +34,6 @@ import io.element.android.libraries.matrix.api.permalink.PermalinkData import io.element.android.libraries.matrix.api.permalink.PermalinkParser import io.element.android.libraries.matrix.api.timeline.Timeline import io.element.android.libraries.matrix.api.timeline.item.TimelineItemDebugInfo -import io.element.android.libraries.matrix.api.user.MatrixUser import io.element.android.libraries.ui.strings.CommonStrings @ContributesNode(RoomScope::class) @@ -56,6 +55,7 @@ class PinnedMessagesListNode( fun handleForwardEventClick(eventId: EventId) } + private val callback: Callback = callback() private val presenter = presenterFactory.create( navigator = this, actionListPresenter = actionListPresenterFactory.create( @@ -63,25 +63,16 @@ class PinnedMessagesListNode( timelineMode = Timeline.Mode.PinnedEvents, ) ) - private val callbacks = plugins() - - private fun handleEventClick(event: TimelineItem.Event) { - return callbacks.forEach { it.handleEventClick(event) } - } - - private fun navigateToRoomMemberDetails(user: MatrixUser) { - callbacks.forEach { it.navigateToRoomMemberDetails(user.userId) } - } private fun onLinkClick(context: Context, url: String) { when (val permalink = permalinkParser.parse(url)) { is PermalinkData.UserLink -> { // Open the room member profile, it will fallback to // the user profile if the user is not in the room - callbacks.forEach { it.navigateToRoomMemberDetails(permalink.userId) } + callback.navigateToRoomMemberDetails(permalink.userId) } is PermalinkData.RoomLink -> { - callbacks.forEach { it.handlePermalinkClick(permalink) } + callback.handlePermalinkClick(permalink) } is PermalinkData.FallbackLink, is PermalinkData.RoomEmailInviteLink -> { @@ -91,15 +82,15 @@ class PinnedMessagesListNode( } override fun viewInTimeline(eventId: EventId) { - callbacks.forEach { it.viewInTimeline(eventId) } + callback.viewInTimeline(eventId) } override fun navigateToEventDebugInfo(eventId: EventId?, debugInfo: TimelineItemDebugInfo) { - callbacks.forEach { it.navigateToEventDebugInfo(eventId, debugInfo) } + callback.navigateToEventDebugInfo(eventId, debugInfo) } override fun forwardEvent(eventId: EventId) { - callbacks.forEach { it.handleForwardEventClick(eventId) } + callback.handleForwardEventClick(eventId) } @Composable @@ -113,8 +104,8 @@ class PinnedMessagesListNode( PinnedMessagesListView( state = state, onBackClick = ::navigateUp, - onEventClick = ::handleEventClick, - onUserDataClick = ::navigateToRoomMemberDetails, + onEventClick = callback::handleEventClick, + onUserDataClick = { callback.navigateToRoomMemberDetails(it.userId) }, onLinkClick = { link -> onLinkClick(context, link.url) }, onLinkLongClick = { view.performHapticFeedback( diff --git a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/threads/ThreadedMessagesNode.kt b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/threads/ThreadedMessagesNode.kt index 62138e99e0..5ce1b76956 100644 --- a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/threads/ThreadedMessagesNode.kt +++ b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/threads/ThreadedMessagesNode.kt @@ -22,7 +22,6 @@ import com.bumble.appyx.core.lifecycle.subscribe import com.bumble.appyx.core.modality.BuildContext import com.bumble.appyx.core.node.Node import com.bumble.appyx.core.plugin.Plugin -import com.bumble.appyx.core.plugin.plugins import dev.zacsweers.metro.Assisted import dev.zacsweers.metro.AssistedInject import io.element.android.annotations.ContributesNode @@ -44,8 +43,8 @@ import io.element.android.features.messages.impl.timeline.model.TimelineItem import io.element.android.libraries.androidutils.browser.openUrlInChromeCustomTab import io.element.android.libraries.androidutils.system.openUrlInExternalApp import io.element.android.libraries.architecture.NodeInputs +import io.element.android.libraries.architecture.callback import io.element.android.libraries.architecture.inputs -import io.element.android.libraries.core.bool.orFalse import io.element.android.libraries.designsystem.utils.OnLifecycleEvent import io.element.android.libraries.di.RoomScope import io.element.android.libraries.di.annotations.SessionCoroutineScope @@ -88,14 +87,13 @@ class ThreadedMessagesNode( private val permalinkParser: PermalinkParser, private val appNavigationStateService: AppNavigationStateService, ) : Node(buildContext, plugins = plugins), MessagesNavigator { - private val callbacks = plugins() - data class Inputs( val threadRootEventId: ThreadId, val focusedEventId: EventId?, ) : NodeInputs private val inputs = inputs() + private val callback: Callback = callback() // TODO use a loading state node to preload this instead of using `runBlocking` private val threadedTimeline = runBlocking { room.createTimeline(CreateTimelineParams.Threaded(threadRootEventId = inputs.threadRootEventId)).getOrThrow() } @@ -145,20 +143,6 @@ class ThreadedMessagesNode( ) } - private fun onEventClick(timelineMode: Timeline.Mode, event: TimelineItem.Event): Boolean { - // Note: cannot use `callbacks.all { it.onEventClick(event) }` because: - // - if callbacks is empty, it will return true and we want to return false. - // - if a callback returns false, the other callback will not be invoked. - return callbacks.takeIf { it.isNotEmpty() } - ?.map { it.handleEventClick(timelineMode, event) } - ?.all { it } - .orFalse() - } - - private fun navigateToRoomMemberDetails(userId: UserId) { - callbacks.forEach { it.navigateToRoomMemberDetails(userId) } - } - private fun onLinkClick( activity: Activity, darkTheme: Boolean, @@ -170,7 +154,7 @@ class ThreadedMessagesNode( is PermalinkData.UserLink -> { // Open the room member profile, it will fallback to // the user profile if the user is not in the room - callbacks.forEach { it.navigateToRoomMemberDetails(permalink.userId) } + callback.navigateToRoomMemberDetails(permalink.userId) } is PermalinkData.RoomLink -> { handleRoomLinkClick(permalink, eventSink) @@ -204,53 +188,41 @@ class ThreadedMessagesNode( navigateUp() } } else { - callbacks.forEach { it.handlePermalinkClick(roomLink) } + callback.handlePermalinkClick(roomLink) } } override fun navigateToEventDebugInfo(eventId: EventId?, debugInfo: TimelineItemDebugInfo) { - callbacks.forEach { it.navigateToEventDebugInfo(eventId, debugInfo) } + callback.navigateToEventDebugInfo(eventId, debugInfo) } override fun forwardEvent(eventId: EventId) { - callbacks.forEach { it.handleForwardEventClick(eventId) } + callback.handleForwardEventClick(eventId) } override fun navigateToReportMessage(eventId: EventId, senderId: UserId) { - callbacks.forEach { it.navigateToReportMessage(eventId, senderId) } + callback.navigateToReportMessage(eventId, senderId) } override fun navigateToEditPoll(eventId: EventId) { - callbacks.forEach { it.navigateToEditPoll(eventId) } + callback.navigateToEditPoll(eventId) } override fun navigateToPreviewAttachments(attachments: ImmutableList, inReplyToEventId: EventId?) { - callbacks.forEach { it.navigateToPreviewAttachments(attachments, inReplyToEventId) } + callback.navigateToPreviewAttachments(attachments, inReplyToEventId) } override fun navigateToRoom(roomId: RoomId, eventId: EventId?, serverNames: List) { val permalinkData = PermalinkData.RoomLink(roomId.toRoomIdOrAlias(), eventId, viaParameters = serverNames.toImmutableList()) - callbacks.forEach { it.handlePermalinkClick(permalinkData) } + callback.handlePermalinkClick(permalinkData) } override fun navigateToThread(threadRootId: ThreadId, focusedEventId: EventId?) { - callbacks.forEach { it.navigateToThread(threadRootId, focusedEventId) } + callback.navigateToThread(threadRootId, focusedEventId) } override fun onNavigateUp() = navigateUp() - private fun navigateToSendLocation() { - callbacks.forEach { it.navigateToSendLocation() } - } - - private fun navigateToCreatePoll() { - callbacks.forEach { it.navigateToCreatePoll() } - } - - private fun navigateToRoomCall() { - callbacks.forEach { it.navigateToRoomCall(room.roomId) } - } - @Composable override fun View(modifier: Modifier) { val activity = requireNotNull(LocalActivity.current) @@ -271,17 +243,17 @@ class ThreadedMessagesNode( onRoomDetailsClick = {}, onEventContentClick = { isLive, event -> if (isLive) { - onEventClick(timelineController.mainTimelineMode(), event) + callback.handleEventClick(timelineController.mainTimelineMode(), event) } else { val detachedTimelineMode = timelineController.detachedTimelineMode() if (detachedTimelineMode != null) { - onEventClick(detachedTimelineMode, event) + callback.handleEventClick(detachedTimelineMode, event) } else { false } } }, - onUserDataClick = this::navigateToRoomMemberDetails, + onUserDataClick = callback::navigateToRoomMemberDetails, onLinkClick = { url, customTab -> onLinkClick( activity = activity, @@ -291,9 +263,9 @@ class ThreadedMessagesNode( customTab = customTab, ) }, - onSendLocationClick = this::navigateToSendLocation, - onCreatePollClick = this::navigateToCreatePoll, - onJoinCallClick = this::navigateToRoomCall, + onSendLocationClick = callback::navigateToSendLocation, + onCreatePollClick = callback::navigateToCreatePoll, + onJoinCallClick = { callback.navigateToRoomCall(room.roomId) }, onViewAllPinnedMessagesClick = {}, modifier = modifier, knockRequestsBannerView = {}, diff --git a/features/poll/impl/src/main/kotlin/io/element/android/features/poll/impl/history/PollHistoryNode.kt b/features/poll/impl/src/main/kotlin/io/element/android/features/poll/impl/history/PollHistoryNode.kt index 3ebabe5a2f..714e7763e6 100644 --- a/features/poll/impl/src/main/kotlin/io/element/android/features/poll/impl/history/PollHistoryNode.kt +++ b/features/poll/impl/src/main/kotlin/io/element/android/features/poll/impl/history/PollHistoryNode.kt @@ -12,10 +12,10 @@ import androidx.compose.ui.Modifier import com.bumble.appyx.core.modality.BuildContext import com.bumble.appyx.core.node.Node import com.bumble.appyx.core.plugin.Plugin -import com.bumble.appyx.core.plugin.plugins import 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.RoomScope import io.element.android.libraries.matrix.api.core.EventId @@ -33,16 +33,14 @@ class PollHistoryNode( fun navigateToEditPoll(pollStartEventId: EventId) } - private fun onEditPoll(pollStartEventId: EventId) { - plugins().forEach { it.navigateToEditPoll(pollStartEventId) } - } + private val callback: Callback = callback() @Composable override fun View(modifier: Modifier) { PollHistoryView( state = presenter.present(), modifier = modifier, - onEditPoll = ::onEditPoll, + onEditPoll = callback::navigateToEditPoll, goBack = this::navigateUp, ) } diff --git a/features/preferences/impl/src/main/kotlin/io/element/android/features/preferences/impl/PreferencesFlowNode.kt b/features/preferences/impl/src/main/kotlin/io/element/android/features/preferences/impl/PreferencesFlowNode.kt index 4903f9d2cf..8f3bc6eb5c 100644 --- a/features/preferences/impl/src/main/kotlin/io/element/android/features/preferences/impl/PreferencesFlowNode.kt +++ b/features/preferences/impl/src/main/kotlin/io/element/android/features/preferences/impl/PreferencesFlowNode.kt @@ -13,7 +13,6 @@ import androidx.compose.ui.Modifier import com.bumble.appyx.core.modality.BuildContext import com.bumble.appyx.core.node.Node import com.bumble.appyx.core.plugin.Plugin -import com.bumble.appyx.core.plugin.plugins import com.bumble.appyx.navmodel.backstack.BackStack import com.bumble.appyx.navmodel.backstack.operation.pop import com.bumble.appyx.navmodel.backstack.operation.push @@ -38,6 +37,7 @@ import io.element.android.features.preferences.impl.user.editprofile.EditUserPro import io.element.android.libraries.architecture.BackstackView import io.element.android.libraries.architecture.BaseFlowNode import io.element.android.libraries.architecture.appyx.canPop +import io.element.android.libraries.architecture.callback import io.element.android.libraries.architecture.createNode import io.element.android.libraries.di.SessionScope import io.element.android.libraries.matrix.api.core.EventId @@ -116,20 +116,22 @@ class PreferencesFlowNode( data object OssLicenses : NavTarget } + private val callback: PreferencesEntryPoint.Callback = callback() + override fun resolve(navTarget: NavTarget, buildContext: BuildContext): Node { return when (navTarget) { NavTarget.Root -> { val callback = object : PreferencesRootNode.Callback { override fun navigateToAddAccount() { - plugins().forEach { it.navigateToAddAccount() } + callback.navigateToAddAccount() } override fun navigateToBugReport() { - plugins().forEach { it.navigateToBugReport() } + callback.navigateToBugReport() } override fun navigateToSecureBackup() { - plugins().forEach { it.navigateToSecureBackup() } + callback.navigateToSecureBackup() } override fun navigateToAnalyticsSettings() { @@ -241,7 +243,7 @@ class PreferencesFlowNode( } override fun navigateToEvent(roomId: RoomId, eventId: EventId) { - plugins().forEach { it.navigateToEvent(roomId, eventId) } + callback.navigateToEvent(roomId, eventId) } }) .build() @@ -249,7 +251,7 @@ class PreferencesFlowNode( is NavTarget.EditDefaultNotificationSetting -> { val callback = object : EditDefaultNotificationSettingNode.Callback { override fun navigateToRoomNotificationSettings(roomId: RoomId) { - plugins().forEach { it.navigateToRoomNotificationSettings(roomId) } + callback.navigateToRoomNotificationSettings(roomId) } } val input = EditDefaultNotificationSettingNode.Inputs(navTarget.isOneToOne) @@ -271,7 +273,7 @@ class PreferencesFlowNode( NavTarget.SignOut -> { val callBack: LogoutEntryPoint.Callback = object : LogoutEntryPoint.Callback { override fun navigateToSecureBackup() { - plugins().forEach { it.navigateToSecureBackup() } + callback.navigateToSecureBackup() } } logoutEntryPoint.nodeBuilder(this, buildContext) diff --git a/features/preferences/impl/src/main/kotlin/io/element/android/features/preferences/impl/about/AboutNode.kt b/features/preferences/impl/src/main/kotlin/io/element/android/features/preferences/impl/about/AboutNode.kt index 564189442c..a4e67f0ef3 100644 --- a/features/preferences/impl/src/main/kotlin/io/element/android/features/preferences/impl/about/AboutNode.kt +++ b/features/preferences/impl/src/main/kotlin/io/element/android/features/preferences/impl/about/AboutNode.kt @@ -19,6 +19,7 @@ import dev.zacsweers.metro.AssistedInject import io.element.android.annotations.ContributesNode import io.element.android.compound.theme.ElementTheme import io.element.android.libraries.androidutils.browser.openUrlInChromeCustomTab +import io.element.android.libraries.architecture.callback import io.element.android.libraries.di.SessionScope @ContributesNode(SessionScope::class) @@ -32,6 +33,8 @@ class AboutNode( fun navigateToOssLicenses() } + private val callback: Callback = callback() + private fun onElementLegalClick( activity: Activity, darkTheme: Boolean, @@ -51,9 +54,7 @@ class AboutNode( onElementLegalClick = { elementLegal -> onElementLegalClick(activity, isDark, elementLegal) }, - onOpenSourceLicensesClick = { - plugins.filterIsInstance().forEach { it.navigateToOssLicenses() } - }, + onOpenSourceLicensesClick = callback::navigateToOssLicenses, modifier = modifier ) } diff --git a/features/preferences/impl/src/main/kotlin/io/element/android/features/preferences/impl/developer/DeveloperSettingsNode.kt b/features/preferences/impl/src/main/kotlin/io/element/android/features/preferences/impl/developer/DeveloperSettingsNode.kt index 6f18fd44dc..385e99c3e3 100644 --- a/features/preferences/impl/src/main/kotlin/io/element/android/features/preferences/impl/developer/DeveloperSettingsNode.kt +++ b/features/preferences/impl/src/main/kotlin/io/element/android/features/preferences/impl/developer/DeveloperSettingsNode.kt @@ -14,10 +14,10 @@ import com.airbnb.android.showkase.models.Showkase import com.bumble.appyx.core.modality.BuildContext import com.bumble.appyx.core.node.Node import com.bumble.appyx.core.plugin.Plugin -import com.bumble.appyx.core.plugin.plugins import 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.designsystem.showkase.getBrowserIntent import io.element.android.libraries.di.SessionScope @@ -32,11 +32,7 @@ class DeveloperSettingsNode( fun navigateToPushHistory() } - private val callbacks = plugins() - - private fun navigateToPushHistory() { - callbacks.forEach { it.navigateToPushHistory() } - } + private val callback: Callback = callback() @Composable override fun View(modifier: Modifier) { @@ -51,7 +47,7 @@ class DeveloperSettingsNode( state = state, modifier = modifier, onOpenShowkase = ::openShowkase, - onPushHistoryClick = ::navigateToPushHistory, + onPushHistoryClick = callback::navigateToPushHistory, onBackClick = ::navigateUp ) } diff --git a/features/preferences/impl/src/main/kotlin/io/element/android/features/preferences/impl/notifications/NotificationSettingsNode.kt b/features/preferences/impl/src/main/kotlin/io/element/android/features/preferences/impl/notifications/NotificationSettingsNode.kt index 2b2879a4da..b2338c7cc2 100644 --- a/features/preferences/impl/src/main/kotlin/io/element/android/features/preferences/impl/notifications/NotificationSettingsNode.kt +++ b/features/preferences/impl/src/main/kotlin/io/element/android/features/preferences/impl/notifications/NotificationSettingsNode.kt @@ -12,10 +12,10 @@ import androidx.compose.ui.Modifier import com.bumble.appyx.core.modality.BuildContext import com.bumble.appyx.core.node.Node import com.bumble.appyx.core.plugin.Plugin -import com.bumble.appyx.core.plugin.plugins import 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) @@ -30,24 +30,16 @@ class NotificationSettingsNode( fun navigateToTroubleshootNotifications() } - private val callbacks = plugins() - - private fun navigateToEditDefaultNotificationSetting(isOneToOne: Boolean) { - callbacks.forEach { it.navigateToEditDefaultNotificationSetting(isOneToOne) } - } - - private fun navigateToTroubleshootNotifications() { - callbacks.forEach { it.navigateToTroubleshootNotifications() } - } + private val callback: Callback = callback() @Composable override fun View(modifier: Modifier) { val state = presenter.present() NotificationSettingsView( state = state, - onOpenEditDefault = ::navigateToEditDefaultNotificationSetting, + onOpenEditDefault = callback::navigateToEditDefaultNotificationSetting, onBackClick = ::navigateUp, - onTroubleshootNotificationsClick = ::navigateToTroubleshootNotifications, + onTroubleshootNotificationsClick = callback::navigateToTroubleshootNotifications, modifier = modifier, ) } diff --git a/features/preferences/impl/src/main/kotlin/io/element/android/features/preferences/impl/notifications/edit/EditDefaultNotificationSettingNode.kt b/features/preferences/impl/src/main/kotlin/io/element/android/features/preferences/impl/notifications/edit/EditDefaultNotificationSettingNode.kt index e697089ad1..823b3657e0 100644 --- a/features/preferences/impl/src/main/kotlin/io/element/android/features/preferences/impl/notifications/edit/EditDefaultNotificationSettingNode.kt +++ b/features/preferences/impl/src/main/kotlin/io/element/android/features/preferences/impl/notifications/edit/EditDefaultNotificationSettingNode.kt @@ -12,11 +12,11 @@ import androidx.compose.ui.Modifier import com.bumble.appyx.core.modality.BuildContext import com.bumble.appyx.core.node.Node import com.bumble.appyx.core.plugin.Plugin -import com.bumble.appyx.core.plugin.plugins import dev.zacsweers.metro.Assisted import dev.zacsweers.metro.AssistedInject import io.element.android.annotations.ContributesNode 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.di.SessionScope import io.element.android.libraries.matrix.api.core.RoomId @@ -36,20 +36,16 @@ class EditDefaultNotificationSettingNode( val isOneToOne: Boolean ) : NodeInputs + private val callback: Callback = callback() private val inputs = inputs() - private val callbacks = plugins() private val presenter = presenterFactory.create(inputs.isOneToOne) - private fun navigateToRoomNotificationSettings(roomId: RoomId) { - callbacks.forEach { it.navigateToRoomNotificationSettings(roomId) } - } - @Composable override fun View(modifier: Modifier) { val state = presenter.present() EditDefaultNotificationSettingView( state = state, - openRoomNotificationSettings = { navigateToRoomNotificationSettings(it) }, + openRoomNotificationSettings = callback::navigateToRoomNotificationSettings, onBackClick = ::navigateUp, modifier = modifier, ) diff --git a/features/preferences/impl/src/main/kotlin/io/element/android/features/preferences/impl/root/PreferencesRootNode.kt b/features/preferences/impl/src/main/kotlin/io/element/android/features/preferences/impl/root/PreferencesRootNode.kt index ba6edb97e0..4d3f482e7e 100644 --- a/features/preferences/impl/src/main/kotlin/io/element/android/features/preferences/impl/root/PreferencesRootNode.kt +++ b/features/preferences/impl/src/main/kotlin/io/element/android/features/preferences/impl/root/PreferencesRootNode.kt @@ -14,7 +14,6 @@ import androidx.compose.ui.Modifier import com.bumble.appyx.core.modality.BuildContext import com.bumble.appyx.core.node.Node import com.bumble.appyx.core.plugin.Plugin -import com.bumble.appyx.core.plugin.plugins import dev.zacsweers.metro.Assisted import dev.zacsweers.metro.AssistedInject import io.element.android.annotations.ContributesNode @@ -22,6 +21,7 @@ import io.element.android.compound.theme.ElementTheme import io.element.android.features.logout.api.direct.DirectLogoutEvents import io.element.android.features.logout.api.direct.DirectLogoutView import io.element.android.libraries.androidutils.browser.openUrlInChromeCustomTab +import io.element.android.libraries.architecture.callback import io.element.android.libraries.di.SessionScope import io.element.android.libraries.matrix.api.user.MatrixUser @@ -50,37 +50,7 @@ class PreferencesRootNode( fun startAccountDeactivationFlow() } - private fun onAddAccount() { - plugins().forEach { it.navigateToAddAccount() } - } - - private fun onOpenBugReport() { - plugins().forEach { it.navigateToBugReport() } - } - - private fun onSecureBackupClick() { - plugins().forEach { it.navigateToSecureBackup() } - } - - private fun onOpenDeveloperSettings() { - plugins().forEach { it.navigateToDeveloperSettings() } - } - - private fun onOpenAdvancedSettings() { - plugins().forEach { it.navigateToAdvancedSettings() } - } - - private fun onOpenLabs() { - plugins().forEach { it.navigateToLabs() } - } - - private fun onOpenAnalytics() { - plugins().forEach { it.navigateToAnalyticsSettings() } - } - - private fun onOpenAbout() { - plugins().forEach { it.navigateToAbout() } - } + private val callback: Callback = callback() private fun onManageAccountClick( activity: Activity, @@ -96,30 +66,6 @@ class PreferencesRootNode( } } - private fun onOpenNotificationSettings() { - plugins().forEach { it.navigateToNotificationSettings() } - } - - private fun onOpenLockScreenSettings() { - plugins().forEach { it.navigateToLockScreenSettings() } - } - - private fun onOpenUserProfile(matrixUser: MatrixUser) { - plugins().forEach { it.navigateToUserProfile(matrixUser) } - } - - private fun onOpenBlockedUsers() { - plugins().forEach { it.navigateToBlockedUsers() } - } - - private fun onSignOutClick() { - plugins().forEach { it.startSignOutFlow() } - } - - private fun onOpenAccountDeactivation() { - plugins().forEach { it.startAccountDeactivationFlow() } - } - @Composable override fun View(modifier: Modifier) { val state = presenter.present() @@ -129,27 +75,27 @@ class PreferencesRootNode( state = state, modifier = modifier, onBackClick = this::navigateUp, - onAddAccountClick = this::onAddAccount, - onOpenRageShake = this::onOpenBugReport, - onOpenAnalytics = this::onOpenAnalytics, - onOpenAbout = this::onOpenAbout, - onSecureBackupClick = this::onSecureBackupClick, - onOpenDeveloperSettings = this::onOpenDeveloperSettings, - onOpenAdvancedSettings = this::onOpenAdvancedSettings, - onOpenLabs = this::onOpenLabs, + onAddAccountClick = callback::navigateToAddAccount, + onOpenRageShake = callback::navigateToBugReport, + onOpenAnalytics = callback::navigateToAnalyticsSettings, + onOpenAbout = callback::navigateToAbout, + onSecureBackupClick = callback::navigateToSecureBackup, + onOpenDeveloperSettings = callback::navigateToDeveloperSettings, + onOpenAdvancedSettings = callback::navigateToAdvancedSettings, + onOpenLabs = callback::navigateToLabs, onManageAccountClick = { onManageAccountClick(activity, it, isDark) }, - onOpenNotificationSettings = this::onOpenNotificationSettings, - onOpenLockScreenSettings = this::onOpenLockScreenSettings, - onOpenUserProfile = this::onOpenUserProfile, - onOpenBlockedUsers = this::onOpenBlockedUsers, + onOpenNotificationSettings = callback::navigateToNotificationSettings, + onOpenLockScreenSettings = callback::navigateToLockScreenSettings, + onOpenUserProfile = callback::navigateToUserProfile, + onOpenBlockedUsers = callback::navigateToBlockedUsers, onSignOutClick = { if (state.directLogoutState.canDoDirectSignOut) { state.directLogoutState.eventSink(DirectLogoutEvents.Logout(ignoreSdkError = false)) } else { - onSignOutClick() + callback.startSignOutFlow() } }, - onDeactivateClick = this::onOpenAccountDeactivation + onDeactivateClick = callback::startAccountDeactivationFlow ) directLogoutView.Render(state = state.directLogoutState) diff --git a/features/rageshake/impl/src/main/kotlin/io/element/android/features/rageshake/impl/bugreport/BugReportFlowNode.kt b/features/rageshake/impl/src/main/kotlin/io/element/android/features/rageshake/impl/bugreport/BugReportFlowNode.kt index 4e1f599237..2893fa4d09 100644 --- a/features/rageshake/impl/src/main/kotlin/io/element/android/features/rageshake/impl/bugreport/BugReportFlowNode.kt +++ b/features/rageshake/impl/src/main/kotlin/io/element/android/features/rageshake/impl/bugreport/BugReportFlowNode.kt @@ -13,7 +13,6 @@ import androidx.compose.ui.Modifier import com.bumble.appyx.core.modality.BuildContext import com.bumble.appyx.core.node.Node import com.bumble.appyx.core.plugin.Plugin -import com.bumble.appyx.core.plugin.plugins import com.bumble.appyx.navmodel.backstack.BackStack import com.bumble.appyx.navmodel.backstack.operation.pop import com.bumble.appyx.navmodel.backstack.operation.push @@ -25,6 +24,7 @@ import io.element.android.features.rageshake.api.bugreport.BugReportEntryPoint import io.element.android.features.viewfolder.api.ViewFolderEntryPoint 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 kotlinx.parcelize.Parcelize @@ -42,9 +42,7 @@ class BugReportFlowNode( buildContext = buildContext, plugins = plugins ) { - private fun onDone() { - plugins().forEach { it.onDone() } - } + private val callback: BugReportEntryPoint.Callback = callback() sealed interface NavTarget : Parcelable { @Parcelize @@ -61,7 +59,7 @@ class BugReportFlowNode( NavTarget.Root -> { val callback = object : BugReportNode.Callback { override fun onDone() { - this@BugReportFlowNode.onDone() + callback.onDone() } override fun navigateToViewLogs(basePath: String) { diff --git a/features/rageshake/impl/src/main/kotlin/io/element/android/features/rageshake/impl/bugreport/BugReportNode.kt b/features/rageshake/impl/src/main/kotlin/io/element/android/features/rageshake/impl/bugreport/BugReportNode.kt index 1d3974d166..b270f0cf3b 100644 --- a/features/rageshake/impl/src/main/kotlin/io/element/android/features/rageshake/impl/bugreport/BugReportNode.kt +++ b/features/rageshake/impl/src/main/kotlin/io/element/android/features/rageshake/impl/bugreport/BugReportNode.kt @@ -13,13 +13,13 @@ import androidx.compose.ui.Modifier import com.bumble.appyx.core.modality.BuildContext import com.bumble.appyx.core.node.Node import com.bumble.appyx.core.plugin.Plugin -import com.bumble.appyx.core.plugin.plugins import 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.rageshake.api.reporter.BugReporter import io.element.android.libraries.androidutils.system.toast +import io.element.android.libraries.architecture.callback import io.element.android.libraries.ui.strings.CommonStrings @ContributesNode(AppScope::class) @@ -35,13 +35,7 @@ class BugReportNode( fun navigateToViewLogs(basePath: String) } - private fun onViewLogs(basePath: String) { - plugins().forEach { it.navigateToViewLogs(basePath) } - } - - private fun onDone() { - plugins().forEach { it.onDone() } - } + private val callback: Callback = callback() @Composable override fun View(modifier: Modifier) { @@ -53,12 +47,12 @@ class BugReportNode( onBackClick = { navigateUp() }, onSuccess = { activity?.toast(CommonStrings.common_report_submitted) - onDone() + callback.onDone() }, onViewLogs = { // Force a logcat dump bugReporter.saveLogCat() - onViewLogs(bugReporter.logDirectory().absolutePath) + callback.navigateToViewLogs(bugReporter.logDirectory().absolutePath) } ) } diff --git a/features/roomaliasresolver/impl/src/main/kotlin/io/element/android/features/roomaliasresolver/impl/RoomAliasResolverNode.kt b/features/roomaliasresolver/impl/src/main/kotlin/io/element/android/features/roomaliasresolver/impl/RoomAliasResolverNode.kt index d7b3242def..656017b484 100644 --- a/features/roomaliasresolver/impl/src/main/kotlin/io/element/android/features/roomaliasresolver/impl/RoomAliasResolverNode.kt +++ b/features/roomaliasresolver/impl/src/main/kotlin/io/element/android/features/roomaliasresolver/impl/RoomAliasResolverNode.kt @@ -12,14 +12,13 @@ import androidx.compose.ui.Modifier import com.bumble.appyx.core.modality.BuildContext import com.bumble.appyx.core.node.Node import com.bumble.appyx.core.plugin.Plugin -import com.bumble.appyx.core.plugin.plugins import dev.zacsweers.metro.Assisted import dev.zacsweers.metro.AssistedInject import io.element.android.annotations.ContributesNode import io.element.android.features.roomaliasesolver.api.RoomAliasResolverEntryPoint +import io.element.android.libraries.architecture.callback import io.element.android.libraries.architecture.inputs import io.element.android.libraries.di.SessionScope -import io.element.android.libraries.matrix.api.room.alias.ResolvedRoomAlias @ContributesNode(SessionScope::class) @AssistedInject @@ -28,22 +27,19 @@ class RoomAliasResolverNode( @Assisted plugins: List, presenterFactory: RoomAliasResolverPresenter.Factory, ) : Node(buildContext, plugins = plugins) { + private val callback: RoomAliasResolverEntryPoint.Callback = callback() private val inputs = inputs() private val presenter = presenterFactory.create( inputs.roomAlias ) - private fun onAliasResolved(data: ResolvedRoomAlias) { - plugins().forEach { it.onAliasResolved(data) } - } - @Composable override fun View(modifier: Modifier) { val state = presenter.present() RoomAliasResolverView( state = state, - onSuccess = ::onAliasResolved, + onSuccess = callback::onAliasResolved, onBackClick = ::navigateUp, modifier = modifier ) diff --git a/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/RoomDetailsFlowNode.kt b/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/RoomDetailsFlowNode.kt index 895fd9dd59..8ca5745ad1 100644 --- a/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/RoomDetailsFlowNode.kt +++ b/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/RoomDetailsFlowNode.kt @@ -16,7 +16,6 @@ import androidx.lifecycle.coroutineScope import com.bumble.appyx.core.modality.BuildContext import com.bumble.appyx.core.node.Node import com.bumble.appyx.core.plugin.Plugin -import com.bumble.appyx.core.plugin.plugins import com.bumble.appyx.navmodel.backstack.BackStack import com.bumble.appyx.navmodel.backstack.operation.pop import com.bumble.appyx.navmodel.backstack.operation.push @@ -45,6 +44,7 @@ import io.element.android.features.userprofile.shared.UserProfileNodeHelper import io.element.android.features.verifysession.api.OutgoingVerificationEntryPoint import io.element.android.libraries.architecture.BackstackWithOverlayBox 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.overlay.operation.hide import io.element.android.libraries.architecture.overlay.operation.show @@ -146,6 +146,8 @@ class RoomDetailsFlowNode( data object SelectNewOwnersWhenLeaving : NavTarget } + private val callback: RoomDetailsEntryPoint.Callback = callback() + override fun onBuilt() { super.onBuilt() whenChildrenAttached { @@ -260,7 +262,7 @@ class RoomDetailsFlowNode( val input = RoomNotificationSettingsNode.RoomNotificationSettingInput(navTarget.showUserDefinedSettingStyle) val callback = object : RoomNotificationSettingsNode.Callback { override fun navigateToGlobalNotificationSettings() { - plugins().forEach { it.navigateToGlobalNotificationSettings() } + callback.navigateToGlobalNotificationSettings() } } createNode(buildContext, listOf(input, callback)) @@ -273,7 +275,7 @@ class RoomDetailsFlowNode( } override fun navigateToRoom(roomId: RoomId) { - plugins().forEach { it.navigateToRoom(roomId, emptyList()) } + callback.navigateToRoom(roomId, emptyList()) } override fun startCall(dmRoomId: RoomId) { @@ -323,13 +325,11 @@ class RoomDetailsFlowNode( roomIdOrAlias = room.roomId.toRoomIdOrAlias(), eventId = eventId, ) - plugins().forEach { - it.handlePermalinkClick(permalinkData, pushToBackstack = false) - } + callback.handlePermalinkClick(permalinkData, pushToBackstack = false) } override fun forward(eventId: EventId) { - plugins().forEach { it.startForwardEventFlow(eventId) } + callback.startForwardEventFlow(eventId) } } mediaGalleryEntryPoint.nodeBuilder(this, buildContext) @@ -350,15 +350,15 @@ class RoomDetailsFlowNode( override fun navigateToRoomMemberDetails(userId: UserId) = Unit override fun handlePermalinkClick(data: PermalinkData, pushToBackstack: Boolean) { - plugins().forEach { it.handlePermalinkClick(data, pushToBackstack) } + callback.handlePermalinkClick(data, pushToBackstack) } override fun forwardEvent(eventId: EventId) { - plugins().forEach { it.startForwardEventFlow(eventId) } + callback.startForwardEventFlow(eventId) } override fun navigateToRoom(roomId: RoomId) { - plugins().forEach { it.navigateToRoom(roomId, emptyList()) } + callback.navigateToRoom(roomId, emptyList()) } } return messagesEntryPoint.nodeBuilder(this, buildContext) diff --git a/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/RoomDetailsNode.kt b/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/RoomDetailsNode.kt index c439c2ce49..4af3d454d9 100644 --- a/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/RoomDetailsNode.kt +++ b/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/RoomDetailsNode.kt @@ -18,7 +18,6 @@ import com.bumble.appyx.core.lifecycle.subscribe import com.bumble.appyx.core.modality.BuildContext import com.bumble.appyx.core.node.Node import com.bumble.appyx.core.plugin.Plugin -import com.bumble.appyx.core.plugin.plugins import dev.zacsweers.metro.Assisted import dev.zacsweers.metro.AssistedInject import im.vector.app.features.analytics.plan.MobileScreen @@ -26,6 +25,7 @@ import io.element.android.annotations.ContributesNode import io.element.android.features.leaveroom.api.LeaveRoomRenderer import io.element.android.libraries.androidutils.system.startSharePlainTextIntent import io.element.android.libraries.architecture.appyx.launchMolecule +import io.element.android.libraries.architecture.callback import io.element.android.libraries.di.RoomScope import io.element.android.libraries.matrix.api.core.UserId import io.element.android.libraries.matrix.api.room.BaseRoom @@ -63,7 +63,7 @@ class RoomDetailsNode( fun navigateToSelectNewOwnersWhenLeaving() } - private val callback = plugins().single() + private val callback: Callback = callback() init { lifecycle.subscribe( diff --git a/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/members/RoomMemberListNode.kt b/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/members/RoomMemberListNode.kt index 27a0bceb66..092326928a 100644 --- a/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/members/RoomMemberListNode.kt +++ b/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/members/RoomMemberListNode.kt @@ -13,7 +13,6 @@ import com.bumble.appyx.core.lifecycle.subscribe import com.bumble.appyx.core.modality.BuildContext import com.bumble.appyx.core.node.Node import com.bumble.appyx.core.plugin.Plugin -import com.bumble.appyx.core.plugin.plugins import dev.zacsweers.metro.Assisted import dev.zacsweers.metro.AssistedInject import im.vector.app.features.analytics.plan.MobileScreen @@ -21,6 +20,7 @@ import io.element.android.annotations.ContributesNode import io.element.android.features.roommembermoderation.api.ModerationAction import io.element.android.features.roommembermoderation.api.RoomMemberModerationEvents import io.element.android.features.roommembermoderation.api.RoomMemberModerationRenderer +import io.element.android.libraries.architecture.callback import io.element.android.libraries.di.RoomScope import io.element.android.libraries.matrix.api.core.UserId import io.element.android.services.analytics.api.AnalyticsService @@ -39,7 +39,7 @@ class RoomMemberListNode( fun navigateToInviteMembers() } - private val callbacks = plugins() + private val callback: Callback = callback() init { lifecycle.subscribe( @@ -50,15 +50,11 @@ class RoomMemberListNode( } override fun openRoomMemberDetails(roomMemberId: UserId) { - callbacks.forEach { - it.navigateToRoomMemberDetails(roomMemberId) - } + callback.navigateToRoomMemberDetails(roomMemberId) } override fun openInviteMembers() { - callbacks.forEach { - it.navigateToInviteMembers() - } + callback.navigateToInviteMembers() } override fun exitRoomMemberList() { diff --git a/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/notificationsettings/RoomNotificationSettingsNode.kt b/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/notificationsettings/RoomNotificationSettingsNode.kt index ec78bf56af..ab4b288803 100644 --- a/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/notificationsettings/RoomNotificationSettingsNode.kt +++ b/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/notificationsettings/RoomNotificationSettingsNode.kt @@ -13,12 +13,12 @@ import com.bumble.appyx.core.lifecycle.subscribe import com.bumble.appyx.core.modality.BuildContext import com.bumble.appyx.core.node.Node import com.bumble.appyx.core.plugin.Plugin -import com.bumble.appyx.core.plugin.plugins import dev.zacsweers.metro.Assisted import dev.zacsweers.metro.AssistedInject import im.vector.app.features.analytics.plan.MobileScreen import io.element.android.annotations.ContributesNode 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.di.RoomScope import io.element.android.services.analytics.api.AnalyticsService @@ -34,17 +34,16 @@ class RoomNotificationSettingsNode( data class RoomNotificationSettingInput( val showUserDefinedSettingStyle: Boolean ) : NodeInputs + interface Callback : Plugin { fun navigateToGlobalNotificationSettings() } - private val inputs = inputs() - private val callbacks = plugins() - private fun navigateToGlobalNotificationSettings() { - callbacks.forEach { it.navigateToGlobalNotificationSettings() } - } + private val callback: Callback = callback() + private val inputs = inputs() private val presenter = presenterFactory.create(inputs.showUserDefinedSettingStyle) + init { lifecycle.subscribe( onResume = { @@ -59,8 +58,8 @@ class RoomNotificationSettingsNode( RoomNotificationSettingsView( state = state, modifier = modifier, - onShowGlobalNotifications = this::navigateToGlobalNotificationSettings, - onBackClick = this::navigateUp, + onShowGlobalNotifications = callback::navigateToGlobalNotificationSettings, + onBackClick = ::navigateUp, ) } } diff --git a/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/rolesandpermissions/RolesAndPermissionsNode.kt b/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/rolesandpermissions/RolesAndPermissionsNode.kt index a430b0f6a5..29394398d3 100644 --- a/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/rolesandpermissions/RolesAndPermissionsNode.kt +++ b/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/rolesandpermissions/RolesAndPermissionsNode.kt @@ -14,10 +14,10 @@ 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.plugin.plugins 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.RoomScope import io.element.android.libraries.matrix.api.room.BaseRoom import io.element.android.libraries.matrix.api.room.RoomMember @@ -45,7 +45,7 @@ class RolesAndPermissionsNode( override fun onBackClick() {} } - private val callback = plugins().first() + private val callback: Callback = callback() @Stable private val navigator = object : RolesAndPermissionsNavigator by callback { diff --git a/features/roomdirectory/impl/src/main/kotlin/io/element/android/features/roomdirectory/impl/root/RoomDirectoryNode.kt b/features/roomdirectory/impl/src/main/kotlin/io/element/android/features/roomdirectory/impl/root/RoomDirectoryNode.kt index 5bc492b7a8..ec01ea3ba6 100644 --- a/features/roomdirectory/impl/src/main/kotlin/io/element/android/features/roomdirectory/impl/root/RoomDirectoryNode.kt +++ b/features/roomdirectory/impl/src/main/kotlin/io/element/android/features/roomdirectory/impl/root/RoomDirectoryNode.kt @@ -12,12 +12,11 @@ import androidx.compose.ui.Modifier import com.bumble.appyx.core.modality.BuildContext import com.bumble.appyx.core.node.Node import com.bumble.appyx.core.plugin.Plugin -import com.bumble.appyx.core.plugin.plugins import dev.zacsweers.metro.Assisted import dev.zacsweers.metro.AssistedInject import io.element.android.annotations.ContributesNode -import io.element.android.features.roomdirectory.api.RoomDescription import io.element.android.features.roomdirectory.api.RoomDirectoryEntryPoint +import io.element.android.libraries.architecture.callback import io.element.android.libraries.di.SessionScope @ContributesNode(SessionScope::class) @@ -27,18 +26,14 @@ class RoomDirectoryNode( @Assisted plugins: List, private val presenter: RoomDirectoryPresenter, ) : Node(buildContext, plugins = plugins) { - private fun onResultClick(roomDescription: RoomDescription) { - plugins().forEach { - it.navigateToRoom(roomDescription) - } - } + private val callback: RoomDirectoryEntryPoint.Callback = callback() @Composable override fun View(modifier: Modifier) { val state = presenter.present() RoomDirectoryView( state = state, - onResultClick = ::onResultClick, + onResultClick = callback::navigateToRoom, onBackClick = ::navigateUp, modifier = modifier ) diff --git a/features/securebackup/impl/src/main/kotlin/io/element/android/features/securebackup/impl/SecureBackupFlowNode.kt b/features/securebackup/impl/src/main/kotlin/io/element/android/features/securebackup/impl/SecureBackupFlowNode.kt index 63f6282dc8..586f37b664 100644 --- a/features/securebackup/impl/src/main/kotlin/io/element/android/features/securebackup/impl/SecureBackupFlowNode.kt +++ b/features/securebackup/impl/src/main/kotlin/io/element/android/features/securebackup/impl/SecureBackupFlowNode.kt @@ -13,7 +13,6 @@ import androidx.compose.ui.Modifier import com.bumble.appyx.core.modality.BuildContext import com.bumble.appyx.core.node.Node import com.bumble.appyx.core.plugin.Plugin -import com.bumble.appyx.core.plugin.plugins import com.bumble.appyx.navmodel.backstack.BackStack import com.bumble.appyx.navmodel.backstack.operation.pop import com.bumble.appyx.navmodel.backstack.operation.push @@ -29,6 +28,7 @@ import io.element.android.features.securebackup.impl.setup.SecureBackupSetupNode import io.element.android.libraries.architecture.BackstackView import io.element.android.libraries.architecture.BaseFlowNode import io.element.android.libraries.architecture.appyx.canPop +import io.element.android.libraries.architecture.callback import io.element.android.libraries.architecture.createNode import io.element.android.libraries.di.SessionScope import kotlinx.parcelize.Parcelize @@ -71,7 +71,7 @@ class SecureBackupFlowNode( data object ResetIdentity : NavTarget } - private val callbacks = plugins() + private val callback: SecureBackupEntryPoint.Callback = callback() override fun resolve(navTarget: NavTarget, buildContext: BuildContext): Node { return when (navTarget) { @@ -116,7 +116,7 @@ class SecureBackupFlowNode( if (backstack.canPop()) { backstack.pop() } else { - callbacks.forEach { it.onDone() } + callback.onDone() } } } @@ -125,7 +125,7 @@ class SecureBackupFlowNode( is NavTarget.ResetIdentity -> { val callback = object : ResetIdentityFlowNode.Callback { override fun onDone() { - callbacks.forEach { it.onDone() } + callback.onDone() } } createNode(buildContext, listOf(callback)) diff --git a/features/securebackup/impl/src/main/kotlin/io/element/android/features/securebackup/impl/enter/SecureBackupEnterRecoveryKeyNode.kt b/features/securebackup/impl/src/main/kotlin/io/element/android/features/securebackup/impl/enter/SecureBackupEnterRecoveryKeyNode.kt index 77d1fe8f32..ba4848ca82 100644 --- a/features/securebackup/impl/src/main/kotlin/io/element/android/features/securebackup/impl/enter/SecureBackupEnterRecoveryKeyNode.kt +++ b/features/securebackup/impl/src/main/kotlin/io/element/android/features/securebackup/impl/enter/SecureBackupEnterRecoveryKeyNode.kt @@ -12,10 +12,10 @@ import androidx.compose.ui.Modifier import com.bumble.appyx.core.modality.BuildContext import com.bumble.appyx.core.node.Node import com.bumble.appyx.core.plugin.Plugin -import com.bumble.appyx.core.plugin.plugins import 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) @@ -29,7 +29,7 @@ class SecureBackupEnterRecoveryKeyNode( fun onEnterRecoveryKeySuccess() } - private val callback = plugins().first() + private val callback: Callback = callback() @Composable override fun View(modifier: Modifier) { diff --git a/features/securebackup/impl/src/main/kotlin/io/element/android/features/securebackup/impl/reset/ResetIdentityFlowNode.kt b/features/securebackup/impl/src/main/kotlin/io/element/android/features/securebackup/impl/reset/ResetIdentityFlowNode.kt index dfc9425ebe..5f94d556c7 100644 --- a/features/securebackup/impl/src/main/kotlin/io/element/android/features/securebackup/impl/reset/ResetIdentityFlowNode.kt +++ b/features/securebackup/impl/src/main/kotlin/io/element/android/features/securebackup/impl/reset/ResetIdentityFlowNode.kt @@ -20,7 +20,6 @@ import androidx.lifecycle.LifecycleOwner import com.bumble.appyx.core.modality.BuildContext import com.bumble.appyx.core.node.Node import com.bumble.appyx.core.plugin.Plugin -import com.bumble.appyx.core.plugin.plugins import com.bumble.appyx.navmodel.backstack.BackStack import com.bumble.appyx.navmodel.backstack.operation.push import dev.zacsweers.metro.Assisted @@ -33,6 +32,7 @@ import io.element.android.libraries.androidutils.browser.openUrlInChromeCustomTa import io.element.android.libraries.architecture.AsyncData 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.designsystem.components.ProgressDialog import io.element.android.libraries.di.SessionScope @@ -63,6 +63,8 @@ class ResetIdentityFlowNode( fun onDone() } + private val callback: Callback = callback() + sealed interface NavTarget : Parcelable { @Parcelize data object Root : NavTarget @@ -86,7 +88,7 @@ class ResetIdentityFlowNode( cancelResetJob() resetIdentityFlowManager.whenResetIsDone { - plugins().forEach { it.onDone() } + callback.onDone() } } } diff --git a/features/securebackup/impl/src/main/kotlin/io/element/android/features/securebackup/impl/reset/root/ResetIdentityRootNode.kt b/features/securebackup/impl/src/main/kotlin/io/element/android/features/securebackup/impl/reset/root/ResetIdentityRootNode.kt index 8267242f97..aee266b249 100644 --- a/features/securebackup/impl/src/main/kotlin/io/element/android/features/securebackup/impl/reset/root/ResetIdentityRootNode.kt +++ b/features/securebackup/impl/src/main/kotlin/io/element/android/features/securebackup/impl/reset/root/ResetIdentityRootNode.kt @@ -15,6 +15,7 @@ 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) @@ -27,8 +28,8 @@ class ResetIdentityRootNode( fun onContinue() } + private val callback: Callback = callback() private val presenter = ResetIdentityRootPresenter() - private val callback: Callback = plugins.filterIsInstance().first() @Composable override fun View(modifier: Modifier) { diff --git a/features/securebackup/impl/src/main/kotlin/io/element/android/features/securebackup/impl/root/SecureBackupRootNode.kt b/features/securebackup/impl/src/main/kotlin/io/element/android/features/securebackup/impl/root/SecureBackupRootNode.kt index e8d13a3d38..6b29bb6928 100644 --- a/features/securebackup/impl/src/main/kotlin/io/element/android/features/securebackup/impl/root/SecureBackupRootNode.kt +++ b/features/securebackup/impl/src/main/kotlin/io/element/android/features/securebackup/impl/root/SecureBackupRootNode.kt @@ -14,11 +14,11 @@ import androidx.compose.ui.platform.UriHandler import com.bumble.appyx.core.modality.BuildContext import com.bumble.appyx.core.node.Node import com.bumble.appyx.core.plugin.Plugin -import com.bumble.appyx.core.plugin.plugins import dev.zacsweers.metro.Assisted import dev.zacsweers.metro.AssistedInject import io.element.android.annotations.ContributesNode import io.element.android.appconfig.LearnMoreConfig +import io.element.android.libraries.architecture.callback import io.element.android.libraries.di.SessionScope @ContributesNode(SessionScope::class) @@ -38,21 +38,7 @@ class SecureBackupRootNode( fun navigateToEnterRecoveryKey() } - private fun onSetupClick() { - plugins().forEach { it.navigateToSetup() } - } - - private fun onChangeClick() { - plugins().forEach { it.navigateToChange() } - } - - private fun onDisableClick() { - plugins().forEach { it.navigateToDisable() } - } - - private fun onConfirmRecoveryKeyClick() { - plugins().forEach { it.navigateToEnterRecoveryKey() } - } + private val callback: Callback = callback() private fun onLearnMoreClick(uriHandler: UriHandler) { uriHandler.openUri(LearnMoreConfig.SECURE_BACKUP_URL) @@ -65,10 +51,10 @@ class SecureBackupRootNode( SecureBackupRootView( state = state, onBackClick = ::navigateUp, - onSetupClick = ::onSetupClick, - onChangeClick = ::onChangeClick, - onDisableClick = ::onDisableClick, - onConfirmRecoveryKeyClick = ::onConfirmRecoveryKeyClick, + onSetupClick = callback::navigateToSetup, + onChangeClick = callback::navigateToChange, + onDisableClick = callback::navigateToDisable, + onConfirmRecoveryKeyClick = callback::navigateToEnterRecoveryKey, onLearnMoreClick = { onLearnMoreClick(uriHandler) }, modifier = modifier, ) diff --git a/features/share/impl/src/main/kotlin/io/element/android/features/share/impl/ShareNode.kt b/features/share/impl/src/main/kotlin/io/element/android/features/share/impl/ShareNode.kt index 12d2f5bff5..c36f5cc97d 100644 --- a/features/share/impl/src/main/kotlin/io/element/android/features/share/impl/ShareNode.kt +++ b/features/share/impl/src/main/kotlin/io/element/android/features/share/impl/ShareNode.kt @@ -23,6 +23,7 @@ import dev.zacsweers.metro.AssistedInject import io.element.android.annotations.ContributesNode import io.element.android.features.share.api.ShareEntryPoint 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.di.SessionScope import io.element.android.libraries.matrix.api.core.RoomId @@ -52,7 +53,7 @@ class ShareNode( private val inputs = inputs() private val presenter = presenterFactory.create(inputs.intent) - private val callbacks = plugins.filterIsInstance() + private val callback: ShareEntryPoint.Callback = callback() override fun resolve(navTarget: NavTarget, buildContext: BuildContext): Node { val callback = object : RoomSelectEntryPoint.Callback { @@ -61,7 +62,7 @@ class ShareNode( } override fun onCancel() { - onShareDone(emptyList()) + callback.onDone(emptyList()) } } @@ -82,12 +83,8 @@ class ShareNode( val state = presenter.present() ShareView( state = state, - onShareSuccess = ::onShareDone, + onShareSuccess = callback::onDone, ) } } - - private fun onShareDone(roomIds: List) { - callbacks.forEach { it.onDone(roomIds) } - } } diff --git a/features/space/impl/src/main/kotlin/io/element/android/features/space/impl/SpaceFlowNode.kt b/features/space/impl/src/main/kotlin/io/element/android/features/space/impl/SpaceFlowNode.kt index fb3de4a9be..1ef496d319 100644 --- a/features/space/impl/src/main/kotlin/io/element/android/features/space/impl/SpaceFlowNode.kt +++ b/features/space/impl/src/main/kotlin/io/element/android/features/space/impl/SpaceFlowNode.kt @@ -28,6 +28,7 @@ import io.element.android.features.space.impl.leave.LeaveSpaceNode import io.element.android.features.space.impl.root.SpaceNode 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.inputs import io.element.android.libraries.di.DependencyInjectionGraphOwner @@ -52,7 +53,7 @@ class SpaceFlowNode( plugins = plugins, ), DependencyInjectionGraphOwner { private val inputs: SpaceEntryPoint.Inputs = inputs() - private val callback = plugins.filterIsInstance().single() + private val callback: SpaceEntryPoint.Callback = callback() private val spaceRoomList = spaceService.spaceRoomList(inputs.roomId) override val graph = graphFactory.create(spaceRoomList) diff --git a/features/space/impl/src/main/kotlin/io/element/android/features/space/impl/root/SpaceNode.kt b/features/space/impl/src/main/kotlin/io/element/android/features/space/impl/root/SpaceNode.kt index 28481651eb..174fa71ee8 100644 --- a/features/space/impl/src/main/kotlin/io/element/android/features/space/impl/root/SpaceNode.kt +++ b/features/space/impl/src/main/kotlin/io/element/android/features/space/impl/root/SpaceNode.kt @@ -22,6 +22,7 @@ import io.element.android.features.invite.api.acceptdecline.AcceptDeclineInviteV import io.element.android.features.space.impl.di.SpaceFlowScope import io.element.android.libraries.androidutils.R import io.element.android.libraries.androidutils.system.startSharePlainTextIntent +import io.element.android.libraries.architecture.callback import io.element.android.libraries.matrix.api.MatrixClient import io.element.android.libraries.matrix.api.core.RoomId import io.element.android.libraries.matrix.api.spaces.SpaceRoomList @@ -46,7 +47,7 @@ class SpaceNode( fun startLeaveSpaceFlow() } - private val callback = plugins.filterIsInstance().single() + private val callback: Callback = callback() private fun onShareRoom(context: Context) = lifecycleScope.launch { matrixClient.getRoom(spaceRoomList.roomId)?.use { room -> diff --git a/features/startchat/impl/src/main/kotlin/io/element/android/features/startchat/impl/StartChatFlowNode.kt b/features/startchat/impl/src/main/kotlin/io/element/android/features/startchat/impl/StartChatFlowNode.kt index e875dcc748..55ff1d46f9 100644 --- a/features/startchat/impl/src/main/kotlin/io/element/android/features/startchat/impl/StartChatFlowNode.kt +++ b/features/startchat/impl/src/main/kotlin/io/element/android/features/startchat/impl/StartChatFlowNode.kt @@ -16,7 +16,6 @@ import com.bumble.appyx.core.modality.BuildContext import com.bumble.appyx.core.navigation.transition.JumpToEndTransitionHandler import com.bumble.appyx.core.node.Node import com.bumble.appyx.core.plugin.Plugin -import com.bumble.appyx.core.plugin.plugins import com.bumble.appyx.navmodel.backstack.BackStack import dev.zacsweers.metro.Assisted import dev.zacsweers.metro.AssistedInject @@ -29,6 +28,7 @@ import io.element.android.features.startchat.impl.root.StartChatNode import io.element.android.libraries.architecture.BackstackView import io.element.android.libraries.architecture.BaseFlowNode import io.element.android.libraries.architecture.OverlayView +import io.element.android.libraries.architecture.callback import io.element.android.libraries.architecture.createNode import io.element.android.libraries.di.SessionScope import io.element.android.libraries.matrix.api.core.RoomId @@ -60,15 +60,12 @@ class StartChatFlowNode( data object JoinByAddress : NavTarget } + private val callback: StartChatEntryPoint.Callback = callback() private val navigator = DefaultStartChatNavigator( backstack = backstack, overlay = overlay, - openRoom = { roomIdOrAlias, viaServers -> - plugins().forEach { it.onRoomCreated(roomIdOrAlias, viaServers) } - }, - openRoomDirectory = { - plugins().forEach { it.navigateToRoomDirectory() } - } + openRoom = callback::onRoomCreated, + openRoomDirectory = callback::navigateToRoomDirectory, ) override fun resolve(navTarget: NavTarget, buildContext: BuildContext): Node { diff --git a/features/userprofile/impl/src/main/kotlin/io/element/android/features/userprofile/impl/UserProfileFlowNode.kt b/features/userprofile/impl/src/main/kotlin/io/element/android/features/userprofile/impl/UserProfileFlowNode.kt index c9df5024be..45b1e95f14 100644 --- a/features/userprofile/impl/src/main/kotlin/io/element/android/features/userprofile/impl/UserProfileFlowNode.kt +++ b/features/userprofile/impl/src/main/kotlin/io/element/android/features/userprofile/impl/UserProfileFlowNode.kt @@ -13,7 +13,6 @@ import androidx.compose.ui.Modifier import com.bumble.appyx.core.modality.BuildContext import com.bumble.appyx.core.node.Node import com.bumble.appyx.core.plugin.Plugin -import com.bumble.appyx.core.plugin.plugins import com.bumble.appyx.navmodel.backstack.BackStack import com.bumble.appyx.navmodel.backstack.operation.pop import com.bumble.appyx.navmodel.backstack.operation.push @@ -28,6 +27,7 @@ import io.element.android.features.userprofile.shared.UserProfileNodeHelper import io.element.android.features.verifysession.api.OutgoingVerificationEntryPoint 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.inputs import io.element.android.libraries.di.SessionScope @@ -67,6 +67,7 @@ class UserProfileFlowNode( data class VerifyUser(val userId: UserId) : NavTarget } + private val callback: UserProfileEntryPoint.Callback = callback() private val inputs = inputs() override fun resolve(navTarget: NavTarget, buildContext: BuildContext): Node { @@ -78,7 +79,7 @@ class UserProfileFlowNode( } override fun navigateToRoom(roomId: RoomId) { - plugins().forEach { it.navigateToRoom(roomId) } + callback.navigateToRoom(roomId) } override fun startCall(dmRoomId: RoomId) { diff --git a/features/verifysession/impl/src/main/kotlin/io/element/android/features/verifysession/impl/incoming/IncomingVerificationNode.kt b/features/verifysession/impl/src/main/kotlin/io/element/android/features/verifysession/impl/incoming/IncomingVerificationNode.kt index a17054b9e6..fed3014925 100644 --- a/features/verifysession/impl/src/main/kotlin/io/element/android/features/verifysession/impl/incoming/IncomingVerificationNode.kt +++ b/features/verifysession/impl/src/main/kotlin/io/element/android/features/verifysession/impl/incoming/IncomingVerificationNode.kt @@ -12,11 +12,11 @@ import androidx.compose.ui.Modifier import com.bumble.appyx.core.modality.BuildContext import com.bumble.appyx.core.node.Node import com.bumble.appyx.core.plugin.Plugin -import com.bumble.appyx.core.plugin.plugins import dev.zacsweers.metro.Assisted import dev.zacsweers.metro.AssistedInject import io.element.android.annotations.ContributesNode import io.element.android.features.verifysession.api.IncomingVerificationEntryPoint +import io.element.android.libraries.architecture.callback import io.element.android.libraries.architecture.inputs import io.element.android.libraries.di.SessionScope @@ -28,13 +28,14 @@ class IncomingVerificationNode( presenterFactory: IncomingVerificationPresenter.Factory, ) : Node(buildContext, plugins = plugins), IncomingVerificationNavigator { + private val callback: IncomingVerificationEntryPoint.Callback = callback() private val presenter = presenterFactory.create( verificationRequest = inputs().verificationRequest, navigator = this, ) override fun onFinish() { - plugins().forEach { it.onDone() } + callback.onDone() } @Composable diff --git a/features/verifysession/impl/src/main/kotlin/io/element/android/features/verifysession/impl/outgoing/OutgoingVerificationNode.kt b/features/verifysession/impl/src/main/kotlin/io/element/android/features/verifysession/impl/outgoing/OutgoingVerificationNode.kt index c5a04f7834..fa5ba8d3f8 100644 --- a/features/verifysession/impl/src/main/kotlin/io/element/android/features/verifysession/impl/outgoing/OutgoingVerificationNode.kt +++ b/features/verifysession/impl/src/main/kotlin/io/element/android/features/verifysession/impl/outgoing/OutgoingVerificationNode.kt @@ -12,11 +12,11 @@ import androidx.compose.ui.Modifier import com.bumble.appyx.core.modality.BuildContext import com.bumble.appyx.core.node.Node import com.bumble.appyx.core.plugin.Plugin -import com.bumble.appyx.core.plugin.plugins import dev.zacsweers.metro.Assisted import dev.zacsweers.metro.AssistedInject import io.element.android.annotations.ContributesNode import io.element.android.features.verifysession.api.OutgoingVerificationEntryPoint +import io.element.android.libraries.architecture.callback import io.element.android.libraries.architecture.inputs import io.element.android.libraries.di.SessionScope @@ -27,8 +27,7 @@ class OutgoingVerificationNode( @Assisted plugins: List, presenterFactory: OutgoingVerificationPresenter.Factory, ) : Node(buildContext, plugins = plugins) { - private val callback = plugins().first() - + private val callback: OutgoingVerificationEntryPoint.Callback = callback() private val inputs = inputs() private val presenter = presenterFactory.create( diff --git a/features/viewfolder/impl/src/main/kotlin/io/element/android/features/viewfolder/impl/file/ViewFileNode.kt b/features/viewfolder/impl/src/main/kotlin/io/element/android/features/viewfolder/impl/file/ViewFileNode.kt index 41369dda07..e474073e6f 100644 --- a/features/viewfolder/impl/src/main/kotlin/io/element/android/features/viewfolder/impl/file/ViewFileNode.kt +++ b/features/viewfolder/impl/src/main/kotlin/io/element/android/features/viewfolder/impl/file/ViewFileNode.kt @@ -12,12 +12,12 @@ import androidx.compose.ui.Modifier import com.bumble.appyx.core.modality.BuildContext import com.bumble.appyx.core.node.Node import com.bumble.appyx.core.plugin.Plugin -import com.bumble.appyx.core.plugin.plugins import dev.zacsweers.metro.AppScope import dev.zacsweers.metro.Assisted import dev.zacsweers.metro.AssistedInject import io.element.android.annotations.ContributesNode import io.element.android.libraries.architecture.NodeInputs +import io.element.android.libraries.architecture.callback import io.element.android.libraries.architecture.inputs @ContributesNode(AppScope::class) @@ -36,6 +36,7 @@ class ViewFileNode( fun onBackClick() } + private val callback: Callback = callback() private val inputs: Inputs = inputs() private val presenter = presenterFactory.create( @@ -43,17 +44,13 @@ class ViewFileNode( name = inputs.name, ) - private fun onBackClick() { - plugins().forEach { it.onBackClick() } - } - @Composable override fun View(modifier: Modifier) { val state = presenter.present() ViewFileView( state = state, modifier = modifier, - onBackClick = ::onBackClick, + onBackClick = callback::onBackClick, ) } } diff --git a/features/viewfolder/impl/src/main/kotlin/io/element/android/features/viewfolder/impl/folder/ViewFolderNode.kt b/features/viewfolder/impl/src/main/kotlin/io/element/android/features/viewfolder/impl/folder/ViewFolderNode.kt index b7c6fe1bd1..faea81c084 100644 --- a/features/viewfolder/impl/src/main/kotlin/io/element/android/features/viewfolder/impl/folder/ViewFolderNode.kt +++ b/features/viewfolder/impl/src/main/kotlin/io/element/android/features/viewfolder/impl/folder/ViewFolderNode.kt @@ -12,13 +12,13 @@ import androidx.compose.ui.Modifier import com.bumble.appyx.core.modality.BuildContext import com.bumble.appyx.core.node.Node import com.bumble.appyx.core.plugin.Plugin -import com.bumble.appyx.core.plugin.plugins import 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.viewfolder.impl.model.Item import io.element.android.libraries.architecture.NodeInputs +import io.element.android.libraries.architecture.callback import io.element.android.libraries.architecture.inputs @ContributesNode(AppScope::class) @@ -38,6 +38,7 @@ class ViewFolderNode( fun navigateToItem(item: Item) } + private val callback: Callback = callback() private val inputs: Inputs = inputs() private val presenter = presenterFactory.create( @@ -45,22 +46,14 @@ class ViewFolderNode( path = inputs.path, ) - private fun onBackClick() { - plugins().forEach { it.onBackClick() } - } - - private fun onNavigateTo(item: Item) { - plugins().forEach { it.navigateToItem(item) } - } - @Composable override fun View(modifier: Modifier) { val state = presenter.present() ViewFolderView( state = state, modifier = modifier, - onNavigateTo = ::onNavigateTo, - onBackClick = ::onBackClick, + onNavigateTo = callback::navigateToItem, + onBackClick = callback::onBackClick, ) } } diff --git a/features/viewfolder/impl/src/main/kotlin/io/element/android/features/viewfolder/impl/root/ViewFolderFlowNode.kt b/features/viewfolder/impl/src/main/kotlin/io/element/android/features/viewfolder/impl/root/ViewFolderFlowNode.kt index 3c7935464b..4695576f9d 100644 --- a/features/viewfolder/impl/src/main/kotlin/io/element/android/features/viewfolder/impl/root/ViewFolderFlowNode.kt +++ b/features/viewfolder/impl/src/main/kotlin/io/element/android/features/viewfolder/impl/root/ViewFolderFlowNode.kt @@ -13,7 +13,6 @@ import androidx.compose.ui.Modifier import com.bumble.appyx.core.modality.BuildContext import com.bumble.appyx.core.node.Node import com.bumble.appyx.core.plugin.Plugin -import com.bumble.appyx.core.plugin.plugins import com.bumble.appyx.navmodel.backstack.BackStack import com.bumble.appyx.navmodel.backstack.operation.pop import com.bumble.appyx.navmodel.backstack.operation.push @@ -28,6 +27,7 @@ import io.element.android.features.viewfolder.impl.model.Item 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.createNode import io.element.android.libraries.architecture.inputs import kotlinx.parcelize.Parcelize @@ -65,6 +65,7 @@ class ViewFolderFlowNode( val rootPath: String, ) : NodeInputs + private val callback: ViewFolderEntryPoint.Callback = callback() private val inputs: Inputs = inputs() override fun resolve(navTarget: NavTarget, buildContext: BuildContext): Node { @@ -108,7 +109,7 @@ class ViewFolderFlowNode( ): Node { val callback: ViewFolderNode.Callback = object : ViewFolderNode.Callback { override fun onBackClick() { - onDone() + callback.onDone() } override fun navigateToItem(item: Item) { @@ -133,8 +134,4 @@ class ViewFolderFlowNode( override fun View(modifier: Modifier) { BackstackView() } - - private fun onDone() { - plugins().forEach { it.onDone() } - } } diff --git a/libraries/accountselect/impl/src/main/kotlin/io/element/android/libraries/accountselect/impl/AccountSelectNode.kt b/libraries/accountselect/impl/src/main/kotlin/io/element/android/libraries/accountselect/impl/AccountSelectNode.kt index f0a543340c..c1a0fbff65 100644 --- a/libraries/accountselect/impl/src/main/kotlin/io/element/android/libraries/accountselect/impl/AccountSelectNode.kt +++ b/libraries/accountselect/impl/src/main/kotlin/io/element/android/libraries/accountselect/impl/AccountSelectNode.kt @@ -17,7 +17,7 @@ import dev.zacsweers.metro.Assisted import dev.zacsweers.metro.AssistedInject import io.element.android.annotations.ContributesNode import io.element.android.libraries.accountselect.api.AccountSelectEntryPoint -import io.element.android.libraries.matrix.api.core.SessionId +import io.element.android.libraries.architecture.callback @ContributesNode(AppScope::class) @AssistedInject @@ -26,23 +26,15 @@ class AccountSelectNode( @Assisted plugins: List, private val presenter: AccountSelectPresenter, ) : Node(buildContext, plugins = plugins) { - private val callbacks = plugins.filterIsInstance() - - private fun onDismiss() { - callbacks.forEach { it.onCancel() } - } - - private fun onAccountSelected(sessionId: SessionId) { - callbacks.forEach { it.onAccountSelected(sessionId) } - } + private val callback: AccountSelectEntryPoint.Callback = callback() @Composable override fun View(modifier: Modifier) { val state = presenter.present() AccountSelectView( state = state, - onDismiss = ::onDismiss, - onSelectAccount = ::onAccountSelected, + onDismiss = callback::onCancel, + onSelectAccount = callback::onAccountSelected, modifier = modifier, ) } diff --git a/libraries/architecture/src/main/kotlin/io/element/android/libraries/architecture/NodeCallback.kt b/libraries/architecture/src/main/kotlin/io/element/android/libraries/architecture/NodeCallback.kt new file mode 100644 index 0000000000..5054f62290 --- /dev/null +++ b/libraries/architecture/src/main/kotlin/io/element/android/libraries/architecture/NodeCallback.kt @@ -0,0 +1,16 @@ +/* + * Copyright 2023, 2024 New Vector Ltd. + * + * SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial + * Please see LICENSE files in the repository root for full details. + */ + +package io.element.android.libraries.architecture + +import com.bumble.appyx.core.node.Node +import com.bumble.appyx.core.plugin.Plugin +import com.bumble.appyx.core.plugin.plugins + +inline fun Node.callback(): I { + return requireNotNull(plugins().singleOrNull()) { "Make sure to actually pass a Callback plugin to your node" } +} diff --git a/libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/gallery/MediaGalleryNode.kt b/libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/gallery/MediaGalleryNode.kt index ff1359b672..d784f972d0 100644 --- a/libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/gallery/MediaGalleryNode.kt +++ b/libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/gallery/MediaGalleryNode.kt @@ -13,10 +13,10 @@ import androidx.compose.ui.Modifier import com.bumble.appyx.core.modality.BuildContext import com.bumble.appyx.core.node.Node import com.bumble.appyx.core.plugin.Plugin -import com.bumble.appyx.core.plugin.plugins import 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.RoomScope import io.element.android.libraries.matrix.api.core.EventId import io.element.android.libraries.mediaviewer.impl.gallery.di.LocalMediaItemPresenterFactories @@ -43,28 +43,14 @@ class MediaGalleryNode( fun forward(eventId: EventId) } - private fun onBackClick() { - plugins().forEach { - it.onBackClick() - } - } + private val callback: Callback = callback() override fun onViewInTimelineClick(eventId: EventId) { - plugins().forEach { - it.viewInTimeline(eventId) - } + callback.viewInTimeline(eventId) } override fun onForwardClick(eventId: EventId) { - plugins().forEach { - it.forward(eventId) - } - } - - private fun onItemClick(item: MediaItem.Event) { - plugins().forEach { - it.showItem(item) - } + callback.forward(eventId) } @Composable @@ -75,8 +61,8 @@ class MediaGalleryNode( val state = presenter.present() MediaGalleryView( state = state, - onBackClick = ::onBackClick, - onItemClick = ::onItemClick, + onBackClick = callback::onBackClick, + onItemClick = callback::showItem, modifier = modifier, ) } diff --git a/libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/gallery/root/MediaGalleryFlowNode.kt b/libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/gallery/root/MediaGalleryFlowNode.kt index b72a3fbd46..a57b9203f4 100644 --- a/libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/gallery/root/MediaGalleryFlowNode.kt +++ b/libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/gallery/root/MediaGalleryFlowNode.kt @@ -13,13 +13,13 @@ import androidx.compose.ui.Modifier import com.bumble.appyx.core.modality.BuildContext import com.bumble.appyx.core.node.Node import com.bumble.appyx.core.plugin.Plugin -import com.bumble.appyx.core.plugin.plugins import com.bumble.appyx.navmodel.backstack.BackStack import dev.zacsweers.metro.Assisted import dev.zacsweers.metro.AssistedInject import io.element.android.annotations.ContributesNode import io.element.android.libraries.architecture.BackstackWithOverlayBox 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.overlay.Overlay import io.element.android.libraries.architecture.overlay.operation.hide @@ -70,38 +70,22 @@ class MediaGalleryFlowNode( ) : NavTarget } - private fun onBackClick() { - plugins().forEach { - it.onBackClick() - } - } - - private fun onViewInTimeline(eventId: EventId) { - plugins().forEach { - it.viewInTimeline(eventId) - } - } - - private fun forwardEvent(eventId: EventId) { - plugins().forEach { - it.forward(eventId) - } - } + private val callback: MediaGalleryEntryPoint.Callback = callback() override fun resolve(navTarget: NavTarget, buildContext: BuildContext): Node { return when (navTarget) { NavTarget.Root -> { val callback = object : MediaGalleryNode.Callback { override fun onBackClick() { - this@MediaGalleryFlowNode.onBackClick() + callback.onBackClick() } override fun viewInTimeline(eventId: EventId) { - this@MediaGalleryFlowNode.onViewInTimeline(eventId) + callback.viewInTimeline(eventId) } override fun forward(eventId: EventId) { - forwardEvent(eventId) + callback.forward(eventId) } override fun showItem(item: MediaItem.Event) { @@ -132,12 +116,12 @@ class MediaGalleryFlowNode( } override fun viewInTimeline(eventId: EventId) { - this@MediaGalleryFlowNode.onViewInTimeline(eventId) + callback.viewInTimeline(eventId) } override fun forwardEvent(eventId: EventId) { // Need to go to the parent because of the overlay - this@MediaGalleryFlowNode.forwardEvent(eventId) + callback.forward(eventId) } } mediaViewerEntryPoint.nodeBuilder(this, buildContext) diff --git a/libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/viewer/MediaViewerNode.kt b/libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/viewer/MediaViewerNode.kt index a62784555a..79a95c4648 100644 --- a/libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/viewer/MediaViewerNode.kt +++ b/libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/viewer/MediaViewerNode.kt @@ -15,7 +15,6 @@ import androidx.compose.ui.Modifier import com.bumble.appyx.core.modality.BuildContext import com.bumble.appyx.core.node.Node import com.bumble.appyx.core.plugin.Plugin -import com.bumble.appyx.core.plugin.plugins import dev.zacsweers.metro.Assisted import dev.zacsweers.metro.AssistedInject import io.element.android.annotations.ContributesNode @@ -23,6 +22,7 @@ import io.element.android.compound.colors.SemanticColorsLightDark import io.element.android.compound.theme.ForcedDarkElementTheme import io.element.android.features.enterprise.api.EnterpriseService import io.element.android.features.viewfolder.api.TextFileViewer +import io.element.android.libraries.architecture.callback import io.element.android.libraries.architecture.inputs import io.element.android.libraries.audio.api.AudioFocus import io.element.android.libraries.core.coroutine.CoroutineDispatchers @@ -57,28 +57,19 @@ class MediaViewerNode( private val enterpriseService: EnterpriseService, ) : Node(buildContext, plugins = plugins), MediaViewerNavigator { + private val callback: MediaViewerEntryPoint.Callback = callback() private val inputs = inputs() - private fun onDone() { - plugins().forEach { - it.onDone() - } - } - override fun onViewInTimelineClick(eventId: EventId) { - plugins().forEach { - it.viewInTimeline(eventId) - } + callback.viewInTimeline(eventId) } override fun onForwardClick(eventId: EventId) { - plugins().forEach { - it.forwardEvent(eventId) - } + callback.forwardEvent(eventId) } override fun onItemDeleted() { - onDone() + callback.onDone() } private val mediaGallerySource = if (inputs.mode == MediaViewerEntryPoint.MediaViewerMode.SingleMedia) { @@ -153,7 +144,7 @@ class MediaViewerNode( textFileViewer = textFileViewer, modifier = modifier, audioFocus = audioFocus, - onBackClick = ::onDone, + onBackClick = callback::onDone, ) } } diff --git a/libraries/push/impl/src/main/kotlin/io/element/android/libraries/push/impl/troubleshoot/IgnoredUsersTest.kt b/libraries/push/impl/src/main/kotlin/io/element/android/libraries/push/impl/troubleshoot/IgnoredUsersTest.kt index 93e855c94d..e753e4d9e0 100644 --- a/libraries/push/impl/src/main/kotlin/io/element/android/libraries/push/impl/troubleshoot/IgnoredUsersTest.kt +++ b/libraries/push/impl/src/main/kotlin/io/element/android/libraries/push/impl/troubleshoot/IgnoredUsersTest.kt @@ -62,7 +62,7 @@ class IgnoredUsersTest( coroutineScope: CoroutineScope, navigator: NotificationTroubleshootNavigator, ) { - navigator.openIgnoredUsers() + navigator.navigateToBlockedUsers() } override suspend fun reset() = delegate.reset() diff --git a/libraries/push/impl/src/test/kotlin/io/element/android/libraries/push/impl/troubleshoot/IgnoredUsersTestTest.kt b/libraries/push/impl/src/test/kotlin/io/element/android/libraries/push/impl/troubleshoot/IgnoredUsersTestTest.kt index e38baa7321..eebfd9d15b 100644 --- a/libraries/push/impl/src/test/kotlin/io/element/android/libraries/push/impl/troubleshoot/IgnoredUsersTestTest.kt +++ b/libraries/push/impl/src/test/kotlin/io/element/android/libraries/push/impl/troubleshoot/IgnoredUsersTestTest.kt @@ -39,7 +39,7 @@ class IgnoredUsersTestTest { ) val openIgnoredUsersResult = lambdaRecorder {} val navigator = object : NotificationTroubleshootNavigator { - override fun openIgnoredUsers() = openIgnoredUsersResult() + override fun navigateToBlockedUsers() = openIgnoredUsersResult() } sut.quickFix( coroutineScope = backgroundScope, diff --git a/libraries/roomselect/impl/src/main/kotlin/io/element/android/libraries/roomselect/impl/RoomSelectNode.kt b/libraries/roomselect/impl/src/main/kotlin/io/element/android/libraries/roomselect/impl/RoomSelectNode.kt index e72c45ed22..5c05dcf6ec 100644 --- a/libraries/roomselect/impl/src/main/kotlin/io/element/android/libraries/roomselect/impl/RoomSelectNode.kt +++ b/libraries/roomselect/impl/src/main/kotlin/io/element/android/libraries/roomselect/impl/RoomSelectNode.kt @@ -16,9 +16,9 @@ import dev.zacsweers.metro.Assisted import dev.zacsweers.metro.AssistedInject import io.element.android.annotations.ContributesNode 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.di.SessionScope -import io.element.android.libraries.matrix.api.core.RoomId import io.element.android.libraries.roomselect.api.RoomSelectEntryPoint import io.element.android.libraries.roomselect.api.RoomSelectMode @@ -35,24 +35,15 @@ class RoomSelectNode( private val inputs: Inputs = inputs() private val presenter = presenterFactory.create(inputs.mode) - - private val callbacks = plugins.filterIsInstance() - - private fun onDismiss() { - callbacks.forEach { it.onCancel() } - } - - private fun onRoomSelected(roomIds: List) { - callbacks.forEach { it.onRoomSelected(roomIds) } - } + private val callback: RoomSelectEntryPoint.Callback = callback() @Composable override fun View(modifier: Modifier) { val state = presenter.present() RoomSelectView( state = state, - onDismiss = ::onDismiss, - onSubmit = ::onRoomSelected, + onDismiss = callback::onCancel, + onSubmit = callback::onRoomSelected, modifier = modifier ) } diff --git a/libraries/troubleshoot/api/src/main/kotlin/io/element/android/libraries/troubleshoot/api/test/NotificationTroubleshootNavigator.kt b/libraries/troubleshoot/api/src/main/kotlin/io/element/android/libraries/troubleshoot/api/test/NotificationTroubleshootNavigator.kt index 0cce358072..75c8a83ae7 100644 --- a/libraries/troubleshoot/api/src/main/kotlin/io/element/android/libraries/troubleshoot/api/test/NotificationTroubleshootNavigator.kt +++ b/libraries/troubleshoot/api/src/main/kotlin/io/element/android/libraries/troubleshoot/api/test/NotificationTroubleshootNavigator.kt @@ -8,5 +8,5 @@ package io.element.android.libraries.troubleshoot.api.test interface NotificationTroubleshootNavigator { - fun openIgnoredUsers() + fun navigateToBlockedUsers() } diff --git a/libraries/troubleshoot/impl/src/main/kotlin/io/element/android/libraries/troubleshoot/impl/TroubleshootNotificationsNode.kt b/libraries/troubleshoot/impl/src/main/kotlin/io/element/android/libraries/troubleshoot/impl/TroubleshootNotificationsNode.kt index 9ab1156d49..22ccda67ce 100644 --- a/libraries/troubleshoot/impl/src/main/kotlin/io/element/android/libraries/troubleshoot/impl/TroubleshootNotificationsNode.kt +++ b/libraries/troubleshoot/impl/src/main/kotlin/io/element/android/libraries/troubleshoot/impl/TroubleshootNotificationsNode.kt @@ -12,11 +12,11 @@ import androidx.compose.ui.Modifier import com.bumble.appyx.core.modality.BuildContext import com.bumble.appyx.core.node.Node import com.bumble.appyx.core.plugin.Plugin -import com.bumble.appyx.core.plugin.plugins import dev.zacsweers.metro.Assisted import dev.zacsweers.metro.AssistedInject import im.vector.app.features.analytics.plan.MobileScreen import io.element.android.annotations.ContributesNode +import io.element.android.libraries.architecture.callback import io.element.android.libraries.di.SessionScope import io.element.android.libraries.troubleshoot.api.NotificationTroubleShootEntryPoint import io.element.android.libraries.troubleshoot.api.test.NotificationTroubleshootNavigator @@ -31,20 +31,13 @@ class TroubleshootNotificationsNode( factory: TroubleshootNotificationsPresenter.Factory, ) : Node(buildContext, plugins = plugins), NotificationTroubleshootNavigator { + private val callback: NotificationTroubleShootEntryPoint.Callback = callback() private val presenter = factory.create( navigator = this, ) - private fun onDone() { - plugins().forEach { - it.onDone() - } - } - - override fun openIgnoredUsers() { - plugins().forEach { - it.navigateToBlockedUsers() - } + override fun navigateToBlockedUsers() { + callback.navigateToBlockedUsers() } @Composable @@ -53,7 +46,7 @@ class TroubleshootNotificationsNode( val state = presenter.present() TroubleshootNotificationsView( state = state, - onBackClick = ::onDone, + onBackClick = callback::onDone, modifier = modifier, ) } diff --git a/libraries/troubleshoot/impl/src/main/kotlin/io/element/android/libraries/troubleshoot/impl/history/PushHistoryNode.kt b/libraries/troubleshoot/impl/src/main/kotlin/io/element/android/libraries/troubleshoot/impl/history/PushHistoryNode.kt index e8b17bf2ca..532c2230ee 100644 --- a/libraries/troubleshoot/impl/src/main/kotlin/io/element/android/libraries/troubleshoot/impl/history/PushHistoryNode.kt +++ b/libraries/troubleshoot/impl/src/main/kotlin/io/element/android/libraries/troubleshoot/impl/history/PushHistoryNode.kt @@ -12,11 +12,11 @@ import androidx.compose.ui.Modifier import com.bumble.appyx.core.modality.BuildContext import com.bumble.appyx.core.node.Node import com.bumble.appyx.core.plugin.Plugin -import com.bumble.appyx.core.plugin.plugins import dev.zacsweers.metro.Assisted import dev.zacsweers.metro.AssistedInject import im.vector.app.features.analytics.plan.MobileScreen import io.element.android.annotations.ContributesNode +import io.element.android.libraries.architecture.callback 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 @@ -31,16 +31,10 @@ class PushHistoryNode( presenterFactory: PushHistoryPresenter.Factory, private val screenTracker: ScreenTracker, ) : Node(buildContext, plugins = plugins), PushHistoryNavigator { - private fun onDone() { - plugins().forEach { - it.onDone() - } - } + private val callback: PushHistoryEntryPoint.Callback = callback() override fun navigateTo(roomId: RoomId, eventId: EventId) { - plugins().forEach { - it.navigateToEvent(roomId, eventId) - } + callback.navigateToEvent(roomId, eventId) } private val presenter = presenterFactory.create(this) @@ -51,7 +45,7 @@ class PushHistoryNode( val state = presenter.present() PushHistoryView( state = state, - onBackClick = ::onDone, + onBackClick = callback::onDone, modifier = modifier, ) } diff --git a/libraries/troubleshoot/impl/src/test/kotlin/io/element/android/libraries/troubleshoot/impl/TroubleshootNotificationsPresenterTest.kt b/libraries/troubleshoot/impl/src/test/kotlin/io/element/android/libraries/troubleshoot/impl/TroubleshootNotificationsPresenterTest.kt index f8be5a5696..751328578d 100644 --- a/libraries/troubleshoot/impl/src/test/kotlin/io/element/android/libraries/troubleshoot/impl/TroubleshootNotificationsPresenterTest.kt +++ b/libraries/troubleshoot/impl/src/test/kotlin/io/element/android/libraries/troubleshoot/impl/TroubleshootNotificationsPresenterTest.kt @@ -180,7 +180,7 @@ private fun createTroubleshootTestSuite( internal fun createTroubleshootNotificationsPresenter( navigator: NotificationTroubleshootNavigator = object : NotificationTroubleshootNavigator { - override fun openIgnoredUsers() = lambdaError() + override fun navigateToBlockedUsers() = lambdaError() }, troubleshootTestSuite: TroubleshootTestSuite = createTroubleshootTestSuite(), ): TroubleshootNotificationsPresenter { diff --git a/libraries/troubleshoot/test/src/main/kotlin/io/element/android/libraries/troubleshoot/test/FakeNotificationTroubleshootNavigator.kt b/libraries/troubleshoot/test/src/main/kotlin/io/element/android/libraries/troubleshoot/test/FakeNotificationTroubleshootNavigator.kt index 63445e5a3e..ea736b6a7b 100644 --- a/libraries/troubleshoot/test/src/main/kotlin/io/element/android/libraries/troubleshoot/test/FakeNotificationTroubleshootNavigator.kt +++ b/libraries/troubleshoot/test/src/main/kotlin/io/element/android/libraries/troubleshoot/test/FakeNotificationTroubleshootNavigator.kt @@ -13,5 +13,5 @@ import io.element.android.tests.testutils.lambda.lambdaError class FakeNotificationTroubleshootNavigator( private val openIgnoredUsersResult: () -> Unit = { lambdaError() }, ) : NotificationTroubleshootNavigator { - override fun openIgnoredUsers() = openIgnoredUsersResult() + override fun navigateToBlockedUsers() = openIgnoredUsersResult() } From 566515ca8875cc4bc10d7e2ff2a58bfed58b4c88 Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Thu, 30 Oct 2025 11:37:59 +0100 Subject: [PATCH 07/46] Remove NodeBuilder to ensure that Params and Callback are always provided. --- .../android/appnav/LoggedInFlowNode.kt | 84 +++++++++------- .../android/appnav/NotLoggedInFlowNode.kt | 19 ++-- .../io/element/android/appnav/RootFlowNode.kt | 24 +++-- .../android/appnav/room/RoomFlowNode.kt | 20 ++-- .../room/joined/JoinedRoomLoadedFlowNode.kt | 40 ++++---- .../appnav/JoinedRoomLoadedFlowNodeTest.kt | 95 +++++++------------ .../FakeJoinedRoomLoadedFlowNodeCallback.kt | 18 ++++ .../api/ChangeRoomMemberRolesEntryPoint.kt | 13 ++- .../DefaultChangeRoomMemberRolesEntyPoint.kt | 36 +++---- ...faultChangeRoomMemberRolesEntyPointTest.kt | 10 +- .../createroom/api/CreateRoomEntryPoint.kt | 7 +- .../impl/DefaultCreateRoomEntryPoint.kt | 16 +--- .../impl/DefaultCreateRoomEntryPointTest.kt | 8 +- .../features/forward/api/ForwardEntryPoint.kt | 8 +- .../forward/impl/DefaultForwardEntryPoint.kt | 29 ++---- .../forward/impl/ForwardMessagesNode.kt | 10 +- .../impl/DefaultForwardEntryPointTest.kt | 19 ++-- .../features/ftue/impl/FtueFlowNode.kt | 9 +- .../FtueSessionVerificationFlowNode.kt | 42 ++++---- .../ftue/impl/DefaultFtueEntryPointTest.kt | 12 +-- .../features/home/api/HomeEntryPoint.kt | 6 +- .../home/impl/DefaultHomeEntryPoint.kt | 16 +--- .../features/home/impl/HomeFlowNode.kt | 10 +- .../home/impl/DefaultHomeEntryPointTest.kt | 10 +- .../location/api/SendLocationEntryPoint.kt | 9 +- .../send/DefaultSendLocationEntryPoint.kt | 20 ++-- .../send/DefaultSendLocationEntryPointTest.kt | 7 +- .../lockscreen/api/LockScreenEntryPoint.kt | 7 +- .../impl/DefaultLockScreenEntryPoint.kt | 30 +++--- .../impl/DefaultLockScreenEntryPointTest.kt | 18 ++-- .../features/login/api/LoginEntryPoint.kt | 8 +- .../login/impl/DefaultLoginEntryPoint.kt | 29 ++---- .../login/impl/DefaultLoginEntryPointTest.kt | 10 +- .../features/logout/api/LogoutEntryPoint.kt | 7 +- .../logout/impl/DefaultLogoutEntryPoint.kt | 16 +--- .../impl/DefaultLogoutEntryPointTest.kt | 8 +- .../messages/api/MessagesEntryPoint.kt | 8 +- .../impl/DefaultMessagesEntryPoint.kt | 25 +---- .../messages/impl/MessagesFlowNode.kt | 60 ++++++------ .../impl/DefaultMessagesEntryPointTest.kt | 38 ++++++-- .../poll/api/create/CreatePollEntryPoint.kt | 7 +- .../create/DefaultCreatePollEntryPoint.kt | 19 +--- .../poll/impl/history/PollHistoryFlowNode.kt | 10 +- .../create/DefaultCreatePollEntryPointTest.kt | 8 +- .../DefaultPollHistoryEntryPointTest.kt | 6 +- .../preferences/api/PreferencesEntryPoint.kt | 8 +- .../impl/DefaultPreferencesEntryPoint.kt | 29 ++---- .../preferences/impl/PreferencesFlowNode.kt | 39 +++++--- .../impl/DefaultPreferencesEntryPointTest.kt | 36 +++++-- .../api/bugreport/BugReportEntryPoint.kt | 7 +- .../impl/bugreport/BugReportFlowNode.kt | 11 ++- .../bugreport/DefaultBugReportEntryPoint.kt | 16 +--- .../DefaultBugReportEntryPointTest.kt | 15 ++- .../api/RoomAliasResolverEntryPoint.kt | 8 +- .../DefaultRoomAliasResolverEntryPoint.kt | 29 ++---- .../DefaultRoomAliasResolverEntryPointTest.kt | 10 +- .../roomdetails/api/RoomDetailsEntryPoint.kt | 8 +- .../impl/DefaultRoomDetailsEntryPoint.kt | 29 ++---- .../roomdetails/impl/RoomDetailsFlowNode.kt | 57 ++++++----- .../RolesAndPermissionsFlowNode.kt | 20 ++-- .../impl/DefaultRoomDetailsEntryPointTest.kt | 47 +++++++-- .../api/RoomDirectoryEntryPoint.kt | 7 +- .../impl/DefaultRoomDirectoryEntryPoint.kt | 16 +--- .../DefaultRoomDirectoryEntryPointTest.kt | 8 +- .../api/SecureBackupEntryPoint.kt | 8 +- .../impl/DefaultSecureBackupEntryPoint.kt | 29 ++---- .../impl/DefaultSecureBackupEntryPointTest.kt | 10 +- .../features/share/api/ShareEntryPoint.kt | 11 +-- .../share/impl/DefaultShareEntryPoint.kt | 27 ++---- .../android/features/share/impl/ShareNode.kt | 10 +- .../share/impl/DefaultShareEntryPointTest.kt | 19 ++-- .../signedout/api/SignedOutEntryPoint.kt | 7 +- .../impl/DefaultSignedOutEntryPoint.kt | 19 +--- .../impl/DefaultSignedOutEntryPointTest.kt | 8 +- .../features/space/api/SpaceEntryPoint.kt | 12 +-- .../space/impl/DefaultSpaceEntryPoint.kt | 23 +---- .../space/impl/DefaultSpaceEntryPointTest.kt | 10 +- .../startchat/api/StartChatEntryPoint.kt | 6 +- .../impl/DefaultStartChatEntryPoint.kt | 16 +--- .../startchat/impl/StartChatFlowNode.kt | 8 +- .../impl/DefaultStartChatEntryPointTest.kt | 14 ++- .../userprofile/api/UserProfileEntryPoint.kt | 8 +- .../impl/DefaultUserProfileEntryPoint.kt | 29 ++---- .../userprofile/impl/UserProfileFlowNode.kt | 38 ++++++-- .../impl/DefaultUserProfileEntryPointTest.kt | 25 +++-- .../api/IncomingVerificationEntryPoint.kt | 8 +- .../api/OutgoingVerificationEntryPoint.kt | 8 +- .../DefaultIncomingVerificationEntryPoint.kt | 26 ++--- .../DefaultOutgoingVerificationEntryPoint.kt | 26 ++--- ...faultIncomingVerificationEntryPointTest.kt | 10 +- ...faultOutgoingVerificationEntryPointTest.kt | 10 +- .../viewfolder/api/ViewFolderEntryPoint.kt | 8 +- .../impl/DefaultViewFolderEntryPoint.kt | 27 ++---- .../impl/DefaultViewFolderEntryPointTest.kt | 10 +- .../api/AccountSelectEntryPoint.kt | 7 +- .../impl/DefaultAccountSelectEntryPoint.kt | 16 +--- .../DefaultAccountSelectEntryPointTest.kt | 8 +- .../mediaviewer/api/MediaGalleryEntryPoint.kt | 7 +- .../mediaviewer/api/MediaViewerEntryPoint.kt | 9 +- .../impl/DefaultMediaGalleryEntryPoint.kt | 19 +--- .../impl/DefaultMediaViewerEntryPoint.kt | 83 +++++++--------- .../impl/gallery/root/MediaGalleryFlowNode.kt | 26 ++--- .../impl/DefaultMediaGalleryEntryPointTest.kt | 16 +++- .../impl/DefaultMediaViewerEntryPointTest.kt | 27 +++--- .../roomselect/api/RoomSelectEntryPoint.kt | 7 +- .../impl/DefaultRoomSelectEntryPoint.kt | 27 ++---- .../impl/DefaultRoomSelectEntryPointTest.kt | 10 +- .../api/NotificationTroubleShootEntryPoint.kt | 7 +- .../troubleshoot/api/PushHistoryEntryPoint.kt | 7 +- ...faultNotificationTroubleShootEntryPoint.kt | 16 +--- .../history/DefaultPushHistoryEntryPoint.kt | 16 +--- ...tNotificationTroubleShootEntryPointTest.kt | 8 +- .../DefaultPushHistoryEntryPointTest.kt | 8 +- ...Template Module Feature Entry Point API.kt | 7 +- ...te Module Feature Entry Point Flow Impl.kt | 16 +--- 115 files changed, 954 insertions(+), 1174 deletions(-) create mode 100644 appnav/src/test/kotlin/io/element/android/appnav/room/joined/FakeJoinedRoomLoadedFlowNodeCallback.kt diff --git a/appnav/src/main/kotlin/io/element/android/appnav/LoggedInFlowNode.kt b/appnav/src/main/kotlin/io/element/android/appnav/LoggedInFlowNode.kt index 466abc9e36..ae61a03281 100644 --- a/appnav/src/main/kotlin/io/element/android/appnav/LoggedInFlowNode.kt +++ b/appnav/src/main/kotlin/io/element/android/appnav/LoggedInFlowNode.kt @@ -333,10 +333,11 @@ class LoggedInFlowNode( callback.navigateToBugReport() } } - homeEntryPoint - .nodeBuilder(this, buildContext) - .callback(callback) - .build() + homeEntryPoint.createNode( + parentNode = this, + buildContext = buildContext, + callback = callback, + ) } is NavTarget.Room -> { val joinedRoomCallback = object : JoinedRoomLoadedFlowNode.Callback { @@ -389,10 +390,12 @@ class LoggedInFlowNode( backstack.push(NavTarget.Room(roomId.toRoomIdOrAlias())) } } - userProfileEntryPoint.nodeBuilder(this, buildContext) - .params(UserProfileEntryPoint.Params(userId = navTarget.userId)) - .callback(callback) - .build() + userProfileEntryPoint.createNode( + parentNode = this, + buildContext = buildContext, + params = UserProfileEntryPoint.Params(userId = navTarget.userId), + callback = callback, + ) } is NavTarget.Settings -> { val callback = object : PreferencesEntryPoint.Callback { @@ -417,10 +420,12 @@ class LoggedInFlowNode( } } val inputs = PreferencesEntryPoint.Params(navTarget.initialElement) - preferencesEntryPoint.nodeBuilder(this, buildContext) - .params(inputs) - .callback(callback) - .build() + preferencesEntryPoint.createNode( + parentNode = this, + buildContext = buildContext, + params = inputs, + callback = callback, + ) } NavTarget.CreateRoom -> { val callback = object : StartChatEntryPoint.Callback { @@ -433,27 +438,32 @@ class LoggedInFlowNode( } } - startChatEntryPoint - .nodeBuilder(this, buildContext) - .callback(callback) - .build() + startChatEntryPoint.createNode( + parentNode = this, + buildContext = buildContext, + callback = callback, + ) } is NavTarget.SecureBackup -> { - secureBackupEntryPoint.nodeBuilder(this, buildContext) - .params(SecureBackupEntryPoint.Params(initialElement = navTarget.initialElement)) - .callback(object : SecureBackupEntryPoint.Callback { + secureBackupEntryPoint.createNode( + parentNode = this, + buildContext = buildContext, + params = SecureBackupEntryPoint.Params(initialElement = navTarget.initialElement), + callback = object : SecureBackupEntryPoint.Callback { override fun onDone() { backstack.pop() } - }) - .build() + }, + ) } NavTarget.Ftue -> { ftueEntryPoint.createNode(this, buildContext) } NavTarget.RoomDirectory -> { - roomDirectoryEntryPoint.nodeBuilder(this, buildContext) - .callback(object : RoomDirectoryEntryPoint.Callback { + roomDirectoryEntryPoint.createNode( + parentNode = this, + buildContext = buildContext, + callback = object : RoomDirectoryEntryPoint.Callback { override fun navigateToRoom(roomDescription: RoomDescription) { backstack.push( NavTarget.Room( @@ -463,31 +473,35 @@ class LoggedInFlowNode( ) ) } - }) - .build() + }, + ) } is NavTarget.IncomingShare -> { - shareEntryPoint.nodeBuilder(this, buildContext) - .callback(object : ShareEntryPoint.Callback { + shareEntryPoint.createNode( + parentNode = this, + buildContext = buildContext, + params = ShareEntryPoint.Params(intent = navTarget.intent), + callback = object : ShareEntryPoint.Callback { override fun onDone(roomIds: List) { navigateUp() roomIds.singleOrNull()?.let { roomId -> backstack.push(NavTarget.Room(roomId.toRoomIdOrAlias())) } } - }) - .params(ShareEntryPoint.Params(intent = navTarget.intent)) - .build() + }, + ) } is NavTarget.IncomingVerificationRequest -> { - incomingVerificationEntryPoint.nodeBuilder(this, buildContext) - .params(IncomingVerificationEntryPoint.Params(navTarget.data)) - .callback(object : IncomingVerificationEntryPoint.Callback { + incomingVerificationEntryPoint.createNode( + parentNode = this, + buildContext = buildContext, + params = IncomingVerificationEntryPoint.Params(navTarget.data), + callback = object : IncomingVerificationEntryPoint.Callback { override fun onDone() { backstack.pop() } - }) - .build() + }, + ) } } } diff --git a/appnav/src/main/kotlin/io/element/android/appnav/NotLoggedInFlowNode.kt b/appnav/src/main/kotlin/io/element/android/appnav/NotLoggedInFlowNode.kt index bb0ffa82c1..b372155bd3 100644 --- a/appnav/src/main/kotlin/io/element/android/appnav/NotLoggedInFlowNode.kt +++ b/appnav/src/main/kotlin/io/element/android/appnav/NotLoggedInFlowNode.kt @@ -83,16 +83,15 @@ class NotLoggedInFlowNode( callback.navigateToBugReport() } } - loginEntryPoint - .nodeBuilder(this, buildContext) - .params( - LoginEntryPoint.Params( - accountProvider = inputs.loginParams?.accountProvider, - loginHint = inputs.loginParams?.loginHint, - ) - ) - .callback(callback) - .build() + loginEntryPoint.createNode( + parentNode = this, + buildContext = buildContext, + params = LoginEntryPoint.Params( + accountProvider = inputs.loginParams?.accountProvider, + loginHint = inputs.loginParams?.loginHint, + ), + callback = callback, + ) } } } diff --git a/appnav/src/main/kotlin/io/element/android/appnav/RootFlowNode.kt b/appnav/src/main/kotlin/io/element/android/appnav/RootFlowNode.kt index 676cc75767..bdad3c2ab0 100644 --- a/appnav/src/main/kotlin/io/element/android/appnav/RootFlowNode.kt +++ b/appnav/src/main/kotlin/io/element/android/appnav/RootFlowNode.kt @@ -249,11 +249,13 @@ class RootFlowNode( createNode(buildContext, plugins = listOf(params, callback)) } is NavTarget.SignedOutFlow -> { - signedOutEntryPoint.nodeBuilder(this, buildContext).params( - SignedOutEntryPoint.Params( - sessionId = navTarget.sessionId - ) - ).build() + signedOutEntryPoint.createNode( + parentNode = this, + buildContext = buildContext, + params = SignedOutEntryPoint.Params( + sessionId = navTarget.sessionId, + ), + ) } NavTarget.SplashScreen -> emptyNode(buildContext) NavTarget.BugReport -> { @@ -262,7 +264,11 @@ class RootFlowNode( backstack.pop() } } - bugReportEntryPoint.nodeBuilder(this, buildContext).callback(callback).build() + bugReportEntryPoint.createNode( + parentNode = this, + buildContext = buildContext, + callback = callback, + ) } is NavTarget.AccountSelect -> { val callback: AccountSelectEntryPoint.Callback = object : AccountSelectEntryPoint.Callback { @@ -287,7 +293,11 @@ class RootFlowNode( backstack.pop() } } - accountSelectEntryPoint.nodeBuilder(this, buildContext).callback(callback).build() + accountSelectEntryPoint.createNode( + parentNode = this, + buildContext = buildContext, + callback = callback, + ) } } } diff --git a/appnav/src/main/kotlin/io/element/android/appnav/room/RoomFlowNode.kt b/appnav/src/main/kotlin/io/element/android/appnav/room/RoomFlowNode.kt index 87713ad38e..6283dbb3f9 100644 --- a/appnav/src/main/kotlin/io/element/android/appnav/room/RoomFlowNode.kt +++ b/appnav/src/main/kotlin/io/element/android/appnav/room/RoomFlowNode.kt @@ -180,10 +180,12 @@ class RoomFlowNode( } } val params = Params(navTarget.roomAlias) - roomAliasResolverEntryPoint.nodeBuilder(this, buildContext) - .callback(callback) - .params(params) - .build() + roomAliasResolverEntryPoint.createNode( + parentNode = this, + buildContext = buildContext, + params = params, + callback = callback, + ) } is NavTarget.JoinRoom -> { val inputs = JoinRoomEntryPoint.Inputs( @@ -205,10 +207,12 @@ class RoomFlowNode( } is NavTarget.JoinedSpace -> { val spaceCallback = plugins().single() - spaceEntryPoint.nodeBuilder(this, buildContext) - .inputs(SpaceEntryPoint.Inputs(roomId = navTarget.spaceId)) - .callback(spaceCallback) - .build() + spaceEntryPoint.createNode( + parentNode = this, + buildContext = buildContext, + inputs = SpaceEntryPoint.Inputs(roomId = navTarget.spaceId), + callback = spaceCallback, + ) } } } 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 index 760adfab25..16eaff89b1 100644 --- 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 @@ -140,10 +140,12 @@ class JoinedRoomLoadedFlowNode( backstack.push(NavTarget.ForwardEvent(eventId)) } } - return roomDetailsEntryPoint.nodeBuilder(this, buildContext) - .params(RoomDetailsEntryPoint.Params(initialTarget)) - .callback(callback) - .build() + return roomDetailsEntryPoint.createNode( + parentNode = this, + buildContext = buildContext, + params = RoomDetailsEntryPoint.Params(initialTarget), + callback = callback, + ) } override fun resolve(navTarget: NavTarget, buildContext: BuildContext): Node { @@ -177,10 +179,12 @@ class JoinedRoomLoadedFlowNode( } } } - forwardEntryPoint.nodeBuilder(this, buildContext) - .params(params) - .callback(callback) - .build() + forwardEntryPoint.createNode( + parentNode = this, + buildContext = buildContext, + params = params, + callback = callback, + ) } } } @@ -199,10 +203,12 @@ class JoinedRoomLoadedFlowNode( backstack.push(NavTarget.RoomMemberList) } } - return spaceEntryPoint.nodeBuilder(this, buildContext) - .inputs(SpaceEntryPoint.Inputs(roomId = inputs.room.roomId)) - .callback(callback) - .build() + return spaceEntryPoint.createNode( + parentNode = this, + buildContext = buildContext, + inputs = SpaceEntryPoint.Inputs(roomId = inputs.room.roomId), + callback = callback, + ) } private fun createMessagesNode( @@ -233,10 +239,12 @@ class JoinedRoomLoadedFlowNode( val params = MessagesEntryPoint.Params( MessagesEntryPoint.InitialTarget.Messages(navTarget.focusedEventId) ) - return messagesEntryPoint.nodeBuilder(this, buildContext) - .params(params) - .callback(callback) - .build() + return messagesEntryPoint.createNode( + parentNode = this, + buildContext = buildContext, + params = params, + callback = callback, + ) } sealed interface NavTarget : Parcelable { diff --git a/appnav/src/test/kotlin/io/element/android/appnav/JoinedRoomLoadedFlowNodeTest.kt b/appnav/src/test/kotlin/io/element/android/appnav/JoinedRoomLoadedFlowNodeTest.kt index d9070b97bc..f3ba7a8ad7 100644 --- a/appnav/src/test/kotlin/io/element/android/appnav/JoinedRoomLoadedFlowNodeTest.kt +++ b/appnav/src/test/kotlin/io/element/android/appnav/JoinedRoomLoadedFlowNodeTest.kt @@ -19,6 +19,7 @@ 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.messages.api.MessagesEntryPoint @@ -48,29 +49,20 @@ class JoinedRoomLoadedFlowNodeTest { @get:Rule val mainDispatcherRule = MainDispatcherRule() - private class FakeMessagesEntryPoint : MessagesEntryPoint, MessagesEntryPoint.NodeBuilder { - var buildContext: BuildContext? = null + private class FakeMessagesEntryPoint : MessagesEntryPoint { var nodeId: String? = null var parameters: MessagesEntryPoint.Params? = null var callback: MessagesEntryPoint.Callback? = null - override fun nodeBuilder(parentNode: Node, buildContext: BuildContext): MessagesEntryPoint.NodeBuilder { - this.buildContext = buildContext - return this - } - - override fun params(params: MessagesEntryPoint.Params): MessagesEntryPoint.NodeBuilder { + override fun createNode( + parentNode: Node, + buildContext: BuildContext, + params: MessagesEntryPoint.Params, + callback: MessagesEntryPoint.Callback, + ): Node { parameters = params - return this - } - - override fun callback(callback: MessagesEntryPoint.Callback): MessagesEntryPoint.NodeBuilder { this.callback = callback - return this - } - - override fun build(): Node { - return node(buildContext!!) {}.also { + return node(buildContext) {}.also { nodeId = it.id } } @@ -85,55 +77,36 @@ class JoinedRoomLoadedFlowNodeTest { private class FakeRoomDetailsEntryPoint : RoomDetailsEntryPoint { var nodeId: String? = null - override fun nodeBuilder(parentNode: Node, buildContext: BuildContext): RoomDetailsEntryPoint.NodeBuilder { - return object : RoomDetailsEntryPoint.NodeBuilder { - override fun params(params: RoomDetailsEntryPoint.Params): RoomDetailsEntryPoint.NodeBuilder { - return this - } - - override fun callback(callback: RoomDetailsEntryPoint.Callback): RoomDetailsEntryPoint.NodeBuilder { - return this - } - - override fun build(): Node { - return node(buildContext) {}.also { - nodeId = it.id - } - } - } + 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 nodeBuilder(parentNode: Node, buildContext: BuildContext): SpaceEntryPoint.NodeBuilder { - return object : SpaceEntryPoint.NodeBuilder { - override fun inputs(inputs: SpaceEntryPoint.Inputs): SpaceEntryPoint.NodeBuilder { - return this - } - - override fun callback(callback: SpaceEntryPoint.Callback): SpaceEntryPoint.NodeBuilder { - return this - } - - override fun build(): Node { - return node(buildContext) {}.also { - nodeId = it.id - } - } - } + override fun createNode( + parentNode: Node, + buildContext: BuildContext, + inputs: SpaceEntryPoint.Inputs, + callback: SpaceEntryPoint.Callback, + ) = node(buildContext) {}.also { + nodeId = it.id } } private class FakeForwardEntryPoint : ForwardEntryPoint { - override fun nodeBuilder(parentNode: Node, buildContext: BuildContext): ForwardEntryPoint.NodeBuilder { - return object : ForwardEntryPoint.NodeBuilder { - override fun params(params: ForwardEntryPoint.Params) = this - override fun callback(callback: ForwardEntryPoint.Callback) = this - override fun build() = node(buildContext) {} - } - } + override fun createNode( + parentNode: Node, + buildContext: BuildContext, + params: ForwardEntryPoint.Params, + callback: ForwardEntryPoint.Callback, + ) = node(buildContext) {} } private fun TestScope.createJoinedRoomLoadedFlowNode( @@ -165,7 +138,7 @@ class JoinedRoomLoadedFlowNodeTest { val fakeMessagesEntryPoint = FakeMessagesEntryPoint() val inputs = JoinedRoomLoadedFlowNode.Inputs(room, RoomNavigationTarget.Root()) val roomFlowNode = createJoinedRoomLoadedFlowNode( - plugins = listOf(inputs), + plugins = listOf(inputs, FakeJoinedRoomLoadedFlowNodeCallback()), messagesEntryPoint = fakeMessagesEntryPoint, ) // WHEN @@ -185,7 +158,7 @@ class JoinedRoomLoadedFlowNodeTest { val spaceEntryPoint = FakeSpaceEntryPoint() val inputs = JoinedRoomLoadedFlowNode.Inputs(room, RoomNavigationTarget.Root()) val roomFlowNode = createJoinedRoomLoadedFlowNode( - plugins = listOf(inputs), + plugins = listOf(inputs, FakeJoinedRoomLoadedFlowNodeCallback()), spaceEntryPoint = spaceEntryPoint, ) // WHEN @@ -206,7 +179,7 @@ class JoinedRoomLoadedFlowNodeTest { val fakeRoomDetailsEntryPoint = FakeRoomDetailsEntryPoint() val inputs = JoinedRoomLoadedFlowNode.Inputs(room, RoomNavigationTarget.Root()) val roomFlowNode = createJoinedRoomLoadedFlowNode( - plugins = listOf(inputs), + plugins = listOf(inputs, FakeJoinedRoomLoadedFlowNodeCallback()), messagesEntryPoint = fakeMessagesEntryPoint, roomDetailsEntryPoint = fakeRoomDetailsEntryPoint, ) @@ -228,7 +201,7 @@ class JoinedRoomLoadedFlowNodeTest { val inputs = JoinedRoomLoadedFlowNode.Inputs(room, RoomNavigationTarget.Root()) val activeRoomsHolder = ActiveRoomsHolder() val roomFlowNode = createJoinedRoomLoadedFlowNode( - plugins = listOf(inputs), + plugins = listOf(inputs, FakeJoinedRoomLoadedFlowNodeCallback()), messagesEntryPoint = fakeMessagesEntryPoint, roomDetailsEntryPoint = fakeRoomDetailsEntryPoint, activeRoomsHolder = activeRoomsHolder, @@ -253,7 +226,7 @@ class JoinedRoomLoadedFlowNodeTest { addRoom(room) } val roomFlowNode = createJoinedRoomLoadedFlowNode( - plugins = listOf(inputs), + plugins = listOf(inputs, FakeJoinedRoomLoadedFlowNodeCallback()), messagesEntryPoint = fakeMessagesEntryPoint, roomDetailsEntryPoint = fakeRoomDetailsEntryPoint, activeRoomsHolder = activeRoomsHolder, 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 0000000000..0e2e0c17f8 --- /dev/null +++ b/appnav/src/test/kotlin/io/element/android/appnav/room/joined/FakeJoinedRoomLoadedFlowNodeCallback.kt @@ -0,0 +1,18 @@ +/* + * Copyright 2025 New Vector Ltd. + * + * SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial + * Please see LICENSE files in the repository root for full details. + */ + +package io.element.android.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/features/changeroommemberroles/api/src/main/kotlin/io/element/android/features/changeroommemberroes/api/ChangeRoomMemberRolesEntryPoint.kt b/features/changeroommemberroles/api/src/main/kotlin/io/element/android/features/changeroommemberroes/api/ChangeRoomMemberRolesEntryPoint.kt index b6f7680b38..72c5de5bfe 100644 --- a/features/changeroommemberroles/api/src/main/kotlin/io/element/android/features/changeroommemberroes/api/ChangeRoomMemberRolesEntryPoint.kt +++ b/features/changeroommemberroles/api/src/main/kotlin/io/element/android/features/changeroommemberroes/api/ChangeRoomMemberRolesEntryPoint.kt @@ -15,13 +15,12 @@ import io.element.android.libraries.matrix.api.core.RoomId import io.element.android.libraries.matrix.api.room.JoinedRoom fun interface ChangeRoomMemberRolesEntryPoint : FeatureEntryPoint { - fun builder(parentNode: Node, buildContext: BuildContext): Builder - - interface Builder { - fun room(room: JoinedRoom): Builder - fun listType(changeRoomMemberRolesListType: ChangeRoomMemberRolesListType): Builder - fun build(): Node - } + fun createNode( + parentNode: Node, + buildContext: BuildContext, + room: JoinedRoom, + listType: ChangeRoomMemberRolesListType, + ): Node interface NodeProxy { val roomId: RoomId diff --git a/features/changeroommemberroles/impl/src/main/kotlin/io/element/android/features/changeroommemberroles/impl/DefaultChangeRoomMemberRolesEntyPoint.kt b/features/changeroommemberroles/impl/src/main/kotlin/io/element/android/features/changeroommemberroles/impl/DefaultChangeRoomMemberRolesEntyPoint.kt index 53fb89720b..4bdce08e9a 100644 --- a/features/changeroommemberroles/impl/src/main/kotlin/io/element/android/features/changeroommemberroles/impl/DefaultChangeRoomMemberRolesEntyPoint.kt +++ b/features/changeroommemberroles/impl/src/main/kotlin/io/element/android/features/changeroommemberroles/impl/DefaultChangeRoomMemberRolesEntyPoint.kt @@ -18,29 +18,17 @@ import io.element.android.libraries.matrix.api.room.JoinedRoom @ContributesBinding(SessionScope::class) class DefaultChangeRoomMemberRolesEntyPoint : ChangeRoomMemberRolesEntryPoint { - override fun builder(parentNode: Node, buildContext: BuildContext): ChangeRoomMemberRolesEntryPoint.Builder { - return object : ChangeRoomMemberRolesEntryPoint.Builder { - private lateinit var changeRoomMemberRolesListType: ChangeRoomMemberRolesListType - private lateinit var room: JoinedRoom - - override fun room(room: JoinedRoom): ChangeRoomMemberRolesEntryPoint.Builder { - this.room = room - return this - } - - override fun listType(changeRoomMemberRolesListType: ChangeRoomMemberRolesListType): ChangeRoomMemberRolesEntryPoint.Builder { - this.changeRoomMemberRolesListType = changeRoomMemberRolesListType - return this - } - - override fun build(): Node { - return parentNode.createNode( - buildContext = buildContext, - plugins = listOf( - ChangeRoomMemberRolesRootNode.Inputs(joinedRoom = room, listType = changeRoomMemberRolesListType), - ) - ) - } - } + override fun createNode( + parentNode: Node, + buildContext: BuildContext, + room: JoinedRoom, + listType: ChangeRoomMemberRolesListType, + ): Node { + return parentNode.createNode( + buildContext = buildContext, + plugins = listOf( + ChangeRoomMemberRolesRootNode.Inputs(joinedRoom = room, listType = listType), + ) + ) } } diff --git a/features/changeroommemberroles/impl/src/test/kotlin/io/element/android/features/changeroommemberroles/impl/DefaultChangeRoomMemberRolesEntyPointTest.kt b/features/changeroommemberroles/impl/src/test/kotlin/io/element/android/features/changeroommemberroles/impl/DefaultChangeRoomMemberRolesEntyPointTest.kt index 621af8edaf..6f17a5025d 100644 --- a/features/changeroommemberroles/impl/src/test/kotlin/io/element/android/features/changeroommemberroles/impl/DefaultChangeRoomMemberRolesEntyPointTest.kt +++ b/features/changeroommemberroles/impl/src/test/kotlin/io/element/android/features/changeroommemberroles/impl/DefaultChangeRoomMemberRolesEntyPointTest.kt @@ -31,10 +31,12 @@ class DefaultChangeRoomMemberRolesEntyPointTest { } val room = FakeJoinedRoom() val listType = ChangeRoomMemberRolesListType.Admins - val result = entryPoint.builder(parentNode, BuildContext.root(null)) - .room(FakeJoinedRoom()) - .listType(listType) - .build() + val result = entryPoint.createNode( + parentNode = parentNode, + buildContext = BuildContext.root(null), + room = FakeJoinedRoom(), + listType = listType, + ) assertThat(result).isInstanceOf(ChangeRoomMemberRolesRootNode::class.java) // Search for the Inputs plugin val input = result.plugins.filterIsInstance().single() diff --git a/features/createroom/api/src/main/kotlin/io/element/android/features/createroom/api/CreateRoomEntryPoint.kt b/features/createroom/api/src/main/kotlin/io/element/android/features/createroom/api/CreateRoomEntryPoint.kt index 5fc71f2a3b..f30cbd9c91 100644 --- a/features/createroom/api/src/main/kotlin/io/element/android/features/createroom/api/CreateRoomEntryPoint.kt +++ b/features/createroom/api/src/main/kotlin/io/element/android/features/createroom/api/CreateRoomEntryPoint.kt @@ -14,12 +14,7 @@ import io.element.android.libraries.architecture.FeatureEntryPoint import io.element.android.libraries.matrix.api.core.RoomId interface CreateRoomEntryPoint : FeatureEntryPoint { - fun nodeBuilder(parentNode: Node, buildContext: BuildContext): NodeBuilder - - interface NodeBuilder { - fun callback(callback: Callback): NodeBuilder - fun build(): Node - } + fun createNode(parentNode: Node, buildContext: BuildContext, callback: Callback): Node interface Callback : Plugin { fun onRoomCreated(roomId: RoomId) diff --git a/features/createroom/impl/src/main/kotlin/io/element/android/features/createroom/impl/DefaultCreateRoomEntryPoint.kt b/features/createroom/impl/src/main/kotlin/io/element/android/features/createroom/impl/DefaultCreateRoomEntryPoint.kt index 3ee0a92338..819cfd1208 100644 --- a/features/createroom/impl/src/main/kotlin/io/element/android/features/createroom/impl/DefaultCreateRoomEntryPoint.kt +++ b/features/createroom/impl/src/main/kotlin/io/element/android/features/createroom/impl/DefaultCreateRoomEntryPoint.kt @@ -9,7 +9,6 @@ package io.element.android.features.createroom.impl 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.ContributesBinding import io.element.android.features.createroom.api.CreateRoomEntryPoint import io.element.android.libraries.architecture.createNode @@ -17,18 +16,7 @@ import io.element.android.libraries.di.SessionScope @ContributesBinding(SessionScope::class) class DefaultCreateRoomEntryPoint : CreateRoomEntryPoint { - override fun nodeBuilder(parentNode: Node, buildContext: BuildContext): CreateRoomEntryPoint.NodeBuilder { - val plugins = ArrayList() - - return object : CreateRoomEntryPoint.NodeBuilder { - override fun callback(callback: CreateRoomEntryPoint.Callback): CreateRoomEntryPoint.NodeBuilder { - plugins += callback - return this - } - - override fun build(): Node { - return parentNode.createNode(buildContext, plugins) - } - } + override fun createNode(parentNode: Node, buildContext: BuildContext, callback: CreateRoomEntryPoint.Callback): Node { + return parentNode.createNode(buildContext, listOf(callback)) } } diff --git a/features/createroom/impl/src/test/kotlin/io/element/android/features/createroom/impl/DefaultCreateRoomEntryPointTest.kt b/features/createroom/impl/src/test/kotlin/io/element/android/features/createroom/impl/DefaultCreateRoomEntryPointTest.kt index 61c7c052c5..4690b5b7f3 100644 --- a/features/createroom/impl/src/test/kotlin/io/element/android/features/createroom/impl/DefaultCreateRoomEntryPointTest.kt +++ b/features/createroom/impl/src/test/kotlin/io/element/android/features/createroom/impl/DefaultCreateRoomEntryPointTest.kt @@ -38,9 +38,11 @@ class DefaultCreateRoomEntryPointTest { val callback = object : CreateRoomEntryPoint.Callback { override fun onRoomCreated(roomId: RoomId) = lambdaError() } - val result = entryPoint.nodeBuilder(parentNode, BuildContext.root(null)) - .callback(callback) - .build() + val result = entryPoint.createNode( + parentNode = parentNode, + buildContext = BuildContext.root(null), + callback = callback, + ) assertThat(result.plugins).contains(callback) } } diff --git a/features/forward/api/src/main/kotlin/io/element/android/features/forward/api/ForwardEntryPoint.kt b/features/forward/api/src/main/kotlin/io/element/android/features/forward/api/ForwardEntryPoint.kt index d822c0adb8..d20d9a8f70 100644 --- a/features/forward/api/src/main/kotlin/io/element/android/features/forward/api/ForwardEntryPoint.kt +++ b/features/forward/api/src/main/kotlin/io/element/android/features/forward/api/ForwardEntryPoint.kt @@ -17,12 +17,6 @@ import io.element.android.libraries.matrix.api.core.RoomId import io.element.android.libraries.matrix.api.timeline.TimelineProvider interface ForwardEntryPoint : FeatureEntryPoint { - interface NodeBuilder { - fun params(params: Params): NodeBuilder - fun callback(callback: Callback): NodeBuilder - fun build(): Node - } - interface Callback : Plugin { fun onDone(roomIds: List) } @@ -32,5 +26,5 @@ interface ForwardEntryPoint : FeatureEntryPoint { val timelineProvider: TimelineProvider, ) : NodeInputs - fun nodeBuilder(parentNode: Node, buildContext: BuildContext): NodeBuilder + fun createNode(parentNode: Node, buildContext: BuildContext, params: Params, callback: Callback): Node } diff --git a/features/forward/impl/src/main/kotlin/io/element/android/features/forward/impl/DefaultForwardEntryPoint.kt b/features/forward/impl/src/main/kotlin/io/element/android/features/forward/impl/DefaultForwardEntryPoint.kt index 55eede7b57..faa0787419 100644 --- a/features/forward/impl/src/main/kotlin/io/element/android/features/forward/impl/DefaultForwardEntryPoint.kt +++ b/features/forward/impl/src/main/kotlin/io/element/android/features/forward/impl/DefaultForwardEntryPoint.kt @@ -9,7 +9,6 @@ package io.element.android.features.forward.impl 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.ContributesBinding import io.element.android.features.forward.api.ForwardEntryPoint import io.element.android.libraries.architecture.createNode @@ -17,26 +16,16 @@ import io.element.android.libraries.di.SessionScope @ContributesBinding(SessionScope::class) class DefaultForwardEntryPoint : ForwardEntryPoint { - override fun nodeBuilder(parentNode: Node, buildContext: BuildContext): ForwardEntryPoint.NodeBuilder { - val plugins = ArrayList() - - return object : ForwardEntryPoint.NodeBuilder { - override fun params(params: ForwardEntryPoint.Params): ForwardEntryPoint.NodeBuilder { - plugins += ForwardMessagesNode.Inputs( + override fun createNode(parentNode: Node, buildContext: BuildContext, params: ForwardEntryPoint.Params, callback: ForwardEntryPoint.Callback): Node { + return parentNode.createNode( + buildContext = buildContext, + plugins = listOf( + ForwardMessagesNode.Inputs( eventId = params.eventId, timelineProvider = params.timelineProvider, - ) - return this - } - - override fun callback(callback: ForwardEntryPoint.Callback): ForwardEntryPoint.NodeBuilder { - plugins += callback - return this - } - - override fun build(): Node { - return parentNode.createNode(buildContext, plugins) - } - } + ), + callback, + ) + ) } } diff --git a/features/forward/impl/src/main/kotlin/io/element/android/features/forward/impl/ForwardMessagesNode.kt b/features/forward/impl/src/main/kotlin/io/element/android/features/forward/impl/ForwardMessagesNode.kt index 6fb1b2dc0e..a38f71264b 100644 --- a/features/forward/impl/src/main/kotlin/io/element/android/features/forward/impl/ForwardMessagesNode.kt +++ b/features/forward/impl/src/main/kotlin/io/element/android/features/forward/impl/ForwardMessagesNode.kt @@ -70,10 +70,12 @@ class ForwardMessagesNode( } } - return roomSelectEntryPoint.nodeBuilder(this, buildContext) - .callback(callback) - .params(RoomSelectEntryPoint.Params(mode = RoomSelectMode.Forward)) - .build() + return roomSelectEntryPoint.createNode( + parentNode = this, + buildContext = buildContext, + params = RoomSelectEntryPoint.Params(mode = RoomSelectMode.Forward), + callback = callback, + ) } @Composable diff --git a/features/forward/impl/src/test/kotlin/io/element/android/features/forward/impl/DefaultForwardEntryPointTest.kt b/features/forward/impl/src/test/kotlin/io/element/android/features/forward/impl/DefaultForwardEntryPointTest.kt index dabb8af4a1..6b0927cbfe 100644 --- a/features/forward/impl/src/test/kotlin/io/element/android/features/forward/impl/DefaultForwardEntryPointTest.kt +++ b/features/forward/impl/src/test/kotlin/io/element/android/features/forward/impl/DefaultForwardEntryPointTest.kt @@ -39,9 +39,12 @@ class DefaultForwardEntryPointTest { plugins = plugins, presenterFactory = { _, _ -> createForwardMessagesPresenter() }, roomSelectEntryPoint = object : RoomSelectEntryPoint { - override fun nodeBuilder(parentNode: Node, buildContext: BuildContext): RoomSelectEntryPoint.NodeBuilder { - lambdaError() - } + override fun createNode( + parentNode: Node, + buildContext: BuildContext, + params: RoomSelectEntryPoint.Params, + callback: RoomSelectEntryPoint.Callback, + ) = lambdaError() } ) } @@ -52,10 +55,12 @@ class DefaultForwardEntryPointTest { eventId = AN_EVENT_ID, timelineProvider = FakeTimelineProvider(), ) - val result = entryPoint.nodeBuilder(parentNode, BuildContext.root(null)) - .params(params) - .callback(callback) - .build() + val result = entryPoint.createNode( + parentNode = parentNode, + buildContext = BuildContext.root(null), + params = params, + callback = callback, + ) assertThat(result).isInstanceOf(ForwardMessagesNode::class.java) assertThat(result.plugins).contains( ForwardMessagesNode.Inputs( diff --git a/features/ftue/impl/src/main/kotlin/io/element/android/features/ftue/impl/FtueFlowNode.kt b/features/ftue/impl/src/main/kotlin/io/element/android/features/ftue/impl/FtueFlowNode.kt index 6552a3b360..7c045f0150 100644 --- a/features/ftue/impl/src/main/kotlin/io/element/android/features/ftue/impl/FtueFlowNode.kt +++ b/features/ftue/impl/src/main/kotlin/io/element/android/features/ftue/impl/FtueFlowNode.kt @@ -110,9 +110,12 @@ class FtueFlowNode( defaultFtueService.updateFtueStep() } } - lockScreenEntryPoint.nodeBuilder(this, buildContext, LockScreenEntryPoint.Target.Setup) - .callback(callback) - .build() + lockScreenEntryPoint.createNode( + parentNode = this, + buildContext = buildContext, + navTarget = LockScreenEntryPoint.Target.Setup, + callback = callback, + ) } } } diff --git a/features/ftue/impl/src/main/kotlin/io/element/android/features/ftue/impl/sessionverification/FtueSessionVerificationFlowNode.kt b/features/ftue/impl/src/main/kotlin/io/element/android/features/ftue/impl/sessionverification/FtueSessionVerificationFlowNode.kt index 47f2da3455..13da4a0748 100644 --- a/features/ftue/impl/src/main/kotlin/io/element/android/features/ftue/impl/sessionverification/FtueSessionVerificationFlowNode.kt +++ b/features/ftue/impl/src/main/kotlin/io/element/android/features/ftue/impl/sessionverification/FtueSessionVerificationFlowNode.kt @@ -103,14 +103,14 @@ class FtueSessionVerificationFlowNode( createNode(buildContext, plugins = listOf(callback)) } is NavTarget.UseAnotherDevice -> { - outgoingVerificationEntryPoint.nodeBuilder(this, buildContext) - .params( - OutgoingVerificationEntryPoint.Params( - showDeviceVerifiedScreen = true, - verificationRequest = VerificationRequest.Outgoing.CurrentSession, - ) - ) - .callback(object : OutgoingVerificationEntryPoint.Callback { + outgoingVerificationEntryPoint.createNode( + parentNode = this, + buildContext = buildContext, + params = OutgoingVerificationEntryPoint.Params( + showDeviceVerifiedScreen = true, + verificationRequest = VerificationRequest.Outgoing.CurrentSession, + ), + callback = object : OutgoingVerificationEntryPoint.Callback { override fun onDone() { callback.onDone() } @@ -123,24 +123,28 @@ class FtueSessionVerificationFlowNode( // Note that this callback is never called. The "Learn more" link is not displayed // for the self session interactive verification. } - }) - .build() + } + ) } is NavTarget.EnterRecoveryKey -> { - secureBackupEntryPoint.nodeBuilder(this, buildContext) - .params(SecureBackupEntryPoint.Params(SecureBackupEntryPoint.InitialTarget.EnterRecoveryKey)) - .callback(secureBackupEntryPointCallback) - .build() + secureBackupEntryPoint.createNode( + parentNode = this, + buildContext = buildContext, + params = SecureBackupEntryPoint.Params(SecureBackupEntryPoint.InitialTarget.EnterRecoveryKey), + callback = secureBackupEntryPointCallback + ) } is NavTarget.ResetIdentity -> { - secureBackupEntryPoint.nodeBuilder(this, buildContext) - .params(SecureBackupEntryPoint.Params(SecureBackupEntryPoint.InitialTarget.ResetIdentity)) - .callback(object : SecureBackupEntryPoint.Callback { + secureBackupEntryPoint.createNode( + parentNode = this, + buildContext = buildContext, + params = SecureBackupEntryPoint.Params(SecureBackupEntryPoint.InitialTarget.ResetIdentity), + callback = object : SecureBackupEntryPoint.Callback { override fun onDone() { callback.onDone() } - }) - .build() + }, + ) } } } diff --git a/features/ftue/impl/src/test/kotlin/io/element/android/features/ftue/impl/DefaultFtueEntryPointTest.kt b/features/ftue/impl/src/test/kotlin/io/element/android/features/ftue/impl/DefaultFtueEntryPointTest.kt index 3a8ed11ea2..c528d9c8b9 100644 --- a/features/ftue/impl/src/test/kotlin/io/element/android/features/ftue/impl/DefaultFtueEntryPointTest.kt +++ b/features/ftue/impl/src/test/kotlin/io/element/android/features/ftue/impl/DefaultFtueEntryPointTest.kt @@ -11,6 +11,7 @@ import android.content.Context import android.content.Intent import androidx.arch.core.executor.testing.InstantTaskExecutorRule import com.bumble.appyx.core.modality.BuildContext +import com.bumble.appyx.core.node.Node import com.bumble.appyx.testing.junit4.util.MainDispatcherRule import com.google.common.truth.Truth.assertThat import io.element.android.features.lockscreen.api.LockScreenEntryPoint @@ -37,13 +38,12 @@ class DefaultFtueEntryPointTest { analyticsEntryPoint = { _, _ -> lambdaError() }, defaultFtueService = createDefaultFtueService(), lockScreenEntryPoint = object : LockScreenEntryPoint { - override fun nodeBuilder( - parentNode: com.bumble.appyx.core.node.Node, + override fun createNode( + parentNode: Node, buildContext: BuildContext, - navTarget: LockScreenEntryPoint.Target - ): LockScreenEntryPoint.NodeBuilder { - lambdaError() - } + navTarget: LockScreenEntryPoint.Target, + callback: LockScreenEntryPoint.Callback, + ) = lambdaError() override fun pinUnlockIntent(context: Context): Intent { lambdaError() diff --git a/features/home/api/src/main/kotlin/io/element/android/features/home/api/HomeEntryPoint.kt b/features/home/api/src/main/kotlin/io/element/android/features/home/api/HomeEntryPoint.kt index daf020f26c..3f8da8bc1a 100644 --- a/features/home/api/src/main/kotlin/io/element/android/features/home/api/HomeEntryPoint.kt +++ b/features/home/api/src/main/kotlin/io/element/android/features/home/api/HomeEntryPoint.kt @@ -14,11 +14,7 @@ import io.element.android.libraries.architecture.FeatureEntryPoint import io.element.android.libraries.matrix.api.core.RoomId interface HomeEntryPoint : FeatureEntryPoint { - fun nodeBuilder(parentNode: Node, buildContext: BuildContext): NodeBuilder - interface NodeBuilder { - fun callback(callback: Callback): NodeBuilder - fun build(): Node - } + fun createNode(parentNode: Node, buildContext: BuildContext, callback: Callback): Node interface Callback : Plugin { fun navigateToRoom(roomId: RoomId) diff --git a/features/home/impl/src/main/kotlin/io/element/android/features/home/impl/DefaultHomeEntryPoint.kt b/features/home/impl/src/main/kotlin/io/element/android/features/home/impl/DefaultHomeEntryPoint.kt index 39c647f8f8..a85c5df07d 100644 --- a/features/home/impl/src/main/kotlin/io/element/android/features/home/impl/DefaultHomeEntryPoint.kt +++ b/features/home/impl/src/main/kotlin/io/element/android/features/home/impl/DefaultHomeEntryPoint.kt @@ -9,7 +9,6 @@ package io.element.android.features.home.impl 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.AppScope import dev.zacsweers.metro.ContributesBinding import io.element.android.features.home.api.HomeEntryPoint @@ -17,18 +16,7 @@ import io.element.android.libraries.architecture.createNode @ContributesBinding(AppScope::class) class DefaultHomeEntryPoint : HomeEntryPoint { - override fun nodeBuilder(parentNode: Node, buildContext: BuildContext): HomeEntryPoint.NodeBuilder { - val plugins = ArrayList() - - return object : HomeEntryPoint.NodeBuilder { - override fun callback(callback: HomeEntryPoint.Callback): HomeEntryPoint.NodeBuilder { - plugins += callback - return this - } - - override fun build(): Node { - return parentNode.createNode(buildContext, plugins) - } - } + override fun createNode(parentNode: Node, buildContext: BuildContext, callback: HomeEntryPoint.Callback): Node { + return parentNode.createNode(buildContext, listOf(callback)) } } diff --git a/features/home/impl/src/main/kotlin/io/element/android/features/home/impl/HomeFlowNode.kt b/features/home/impl/src/main/kotlin/io/element/android/features/home/impl/HomeFlowNode.kt index eb3a8bd880..7e542b5651 100644 --- a/features/home/impl/src/main/kotlin/io/element/android/features/home/impl/HomeFlowNode.kt +++ b/features/home/impl/src/main/kotlin/io/element/android/features/home/impl/HomeFlowNode.kt @@ -190,10 +190,12 @@ class HomeFlowNode( is NavTarget.DeclineInviteAndBlockUser -> declineInviteAndBlockUserEntryPoint.createNode(this, buildContext, navTarget.inviteData) is NavTarget.SelectNewOwnersWhenLeavingRoom -> { val room = runBlocking { matrixClient.getJoinedRoom(navTarget.roomId) } ?: error("Room ${navTarget.roomId} not found") - changeRoomMemberRolesEntryPoint.builder(this, buildContext) - .room(room) - .listType(ChangeRoomMemberRolesListType.SelectNewOwnersWhenLeaving) - .build() + changeRoomMemberRolesEntryPoint.createNode( + parentNode = this, + buildContext = buildContext, + room = room, + listType = ChangeRoomMemberRolesListType.SelectNewOwnersWhenLeaving, + ) } NavTarget.Root -> rootNode(buildContext) } diff --git a/features/home/impl/src/test/kotlin/io/element/android/features/home/impl/DefaultHomeEntryPointTest.kt b/features/home/impl/src/test/kotlin/io/element/android/features/home/impl/DefaultHomeEntryPointTest.kt index b2cbea8d76..489234a827 100644 --- a/features/home/impl/src/test/kotlin/io/element/android/features/home/impl/DefaultHomeEntryPointTest.kt +++ b/features/home/impl/src/test/kotlin/io/element/android/features/home/impl/DefaultHomeEntryPointTest.kt @@ -36,7 +36,7 @@ class DefaultHomeEntryPointTest { directLogoutView = { _ -> lambdaError() }, reportRoomEntryPoint = { _, _, _ -> lambdaError() }, declineInviteAndBlockUserEntryPoint = { _, _, _ -> lambdaError() }, - changeRoomMemberRolesEntryPoint = { _, _ -> lambdaError() }, + changeRoomMemberRolesEntryPoint = { _, _, _, _ -> lambdaError() }, leaveRoomRenderer = { _, _, _ -> lambdaError() }, ) } @@ -49,9 +49,11 @@ class DefaultHomeEntryPointTest { override fun navigateToRoomSettings(roomId: RoomId) = lambdaError() override fun navigateToBugReport() = lambdaError() } - val result = entryPoint.nodeBuilder(parentNode, BuildContext.root(null)) - .callback(callback) - .build() + val result = entryPoint.createNode( + parentNode = parentNode, + buildContext = BuildContext.root(null), + callback = callback, + ) assertThat(result).isInstanceOf(HomeFlowNode::class.java) assertThat(result.plugins).contains(callback) } diff --git a/features/location/api/src/main/kotlin/io/element/android/features/location/api/SendLocationEntryPoint.kt b/features/location/api/src/main/kotlin/io/element/android/features/location/api/SendLocationEntryPoint.kt index 1528e6cb14..afd1b895b5 100644 --- a/features/location/api/src/main/kotlin/io/element/android/features/location/api/SendLocationEntryPoint.kt +++ b/features/location/api/src/main/kotlin/io/element/android/features/location/api/SendLocationEntryPoint.kt @@ -18,8 +18,9 @@ import io.element.android.libraries.matrix.api.timeline.Timeline * Allows a user to share a location message within a room. */ interface SendLocationEntryPoint : FeatureEntryPoint { - fun builder(timelineMode: Timeline.Mode): Builder - interface Builder { - fun build(parentNode: Node, buildContext: BuildContext): Node - } + fun createNode( + parentNode: Node, + buildContext: BuildContext, + timelineMode: Timeline.Mode, + ): Node } diff --git a/features/location/impl/src/main/kotlin/io/element/android/features/location/impl/send/DefaultSendLocationEntryPoint.kt b/features/location/impl/src/main/kotlin/io/element/android/features/location/impl/send/DefaultSendLocationEntryPoint.kt index 806fc5b741..2a8e9309a1 100644 --- a/features/location/impl/src/main/kotlin/io/element/android/features/location/impl/send/DefaultSendLocationEntryPoint.kt +++ b/features/location/impl/src/main/kotlin/io/element/android/features/location/impl/send/DefaultSendLocationEntryPoint.kt @@ -17,16 +17,14 @@ import io.element.android.libraries.matrix.api.timeline.Timeline @ContributesBinding(AppScope::class) class DefaultSendLocationEntryPoint : SendLocationEntryPoint { - override fun builder(timelineMode: Timeline.Mode): SendLocationEntryPoint.Builder { - return Builder(timelineMode) - } - - class Builder(private val timelineMode: Timeline.Mode) : SendLocationEntryPoint.Builder { - override fun build(parentNode: Node, buildContext: BuildContext): Node { - return parentNode.createNode( - buildContext = buildContext, - plugins = listOf(SendLocationNode.Inputs(timelineMode)) - ) - } + override fun createNode( + parentNode: Node, + buildContext: BuildContext, + timelineMode: Timeline.Mode, + ): Node { + return parentNode.createNode( + buildContext = buildContext, + plugins = listOf(SendLocationNode.Inputs(timelineMode)) + ) } } diff --git a/features/location/impl/src/test/kotlin/io/element/android/features/location/impl/send/DefaultSendLocationEntryPointTest.kt b/features/location/impl/src/test/kotlin/io/element/android/features/location/impl/send/DefaultSendLocationEntryPointTest.kt index 9be79c7092..4cac3df6a2 100644 --- a/features/location/impl/src/test/kotlin/io/element/android/features/location/impl/send/DefaultSendLocationEntryPointTest.kt +++ b/features/location/impl/src/test/kotlin/io/element/android/features/location/impl/send/DefaultSendLocationEntryPointTest.kt @@ -47,8 +47,11 @@ class DefaultSendLocationEntryPointTest { ) } val timelineMode = Timeline.Mode.Live - val result = entryPoint.builder(timelineMode) - .build(parentNode, BuildContext.root(null)) + val result = entryPoint.createNode( + parentNode = parentNode, + buildContext = BuildContext.root(null), + timelineMode = timelineMode, + ) assertThat(result).isInstanceOf(SendLocationNode::class.java) assertThat(result.plugins).contains(SendLocationNode.Inputs(timelineMode)) } diff --git a/features/lockscreen/api/src/main/kotlin/io/element/android/features/lockscreen/api/LockScreenEntryPoint.kt b/features/lockscreen/api/src/main/kotlin/io/element/android/features/lockscreen/api/LockScreenEntryPoint.kt index e9ba05ba74..c7741ac197 100644 --- a/features/lockscreen/api/src/main/kotlin/io/element/android/features/lockscreen/api/LockScreenEntryPoint.kt +++ b/features/lockscreen/api/src/main/kotlin/io/element/android/features/lockscreen/api/LockScreenEntryPoint.kt @@ -15,14 +15,9 @@ import com.bumble.appyx.core.plugin.Plugin import io.element.android.libraries.architecture.FeatureEntryPoint interface LockScreenEntryPoint : FeatureEntryPoint { - fun nodeBuilder(parentNode: Node, buildContext: BuildContext, navTarget: Target): NodeBuilder + fun createNode(parentNode: Node, buildContext: BuildContext, navTarget: Target, callback: Callback): Node fun pinUnlockIntent(context: Context): Intent - interface NodeBuilder { - fun callback(callback: Callback): NodeBuilder - fun build(): Node - } - interface Callback : Plugin { fun onSetupDone() } diff --git a/features/lockscreen/impl/src/main/kotlin/io/element/android/features/lockscreen/impl/DefaultLockScreenEntryPoint.kt b/features/lockscreen/impl/src/main/kotlin/io/element/android/features/lockscreen/impl/DefaultLockScreenEntryPoint.kt index 0e22131e4c..39430c5ad1 100644 --- a/features/lockscreen/impl/src/main/kotlin/io/element/android/features/lockscreen/impl/DefaultLockScreenEntryPoint.kt +++ b/features/lockscreen/impl/src/main/kotlin/io/element/android/features/lockscreen/impl/DefaultLockScreenEntryPoint.kt @@ -19,26 +19,24 @@ import io.element.android.libraries.architecture.createNode @ContributesBinding(AppScope::class) class DefaultLockScreenEntryPoint : LockScreenEntryPoint { - override fun nodeBuilder(parentNode: Node, buildContext: BuildContext, navTarget: LockScreenEntryPoint.Target): LockScreenEntryPoint.NodeBuilder { - val callbacks = mutableListOf() - - return object : LockScreenEntryPoint.NodeBuilder { - override fun callback(callback: LockScreenEntryPoint.Callback): LockScreenEntryPoint.NodeBuilder { - callbacks += callback - return this - } - - override fun build(): Node { - val inputs = LockScreenFlowNode.Inputs( + override fun createNode( + parentNode: Node, + buildContext: BuildContext, + navTarget: LockScreenEntryPoint.Target, + callback: LockScreenEntryPoint.Callback, + ): Node { + return parentNode.createNode( + buildContext = buildContext, + plugins = listOf( + LockScreenFlowNode.Inputs( when (navTarget) { LockScreenEntryPoint.Target.Setup -> LockScreenFlowNode.NavTarget.Setup LockScreenEntryPoint.Target.Settings -> LockScreenFlowNode.NavTarget.Settings } - ) - val plugins = listOf(inputs) + callbacks - return parentNode.createNode(buildContext, plugins) - } - } + ), + callback, + ) + ) } override fun pinUnlockIntent(context: Context): Intent { diff --git a/features/lockscreen/impl/src/test/kotlin/io/element/android/features/lockscreen/impl/DefaultLockScreenEntryPointTest.kt b/features/lockscreen/impl/src/test/kotlin/io/element/android/features/lockscreen/impl/DefaultLockScreenEntryPointTest.kt index 822d275063..15473fe43c 100644 --- a/features/lockscreen/impl/src/test/kotlin/io/element/android/features/lockscreen/impl/DefaultLockScreenEntryPointTest.kt +++ b/features/lockscreen/impl/src/test/kotlin/io/element/android/features/lockscreen/impl/DefaultLockScreenEntryPointTest.kt @@ -37,9 +37,12 @@ class DefaultLockScreenEntryPointTest { override fun onSetupDone() = lambdaError() } val navTarget = LockScreenEntryPoint.Target.Setup - val result = entryPoint.nodeBuilder(parentNode, BuildContext.root(null), navTarget) - .callback(callback) - .build() + val result = entryPoint.createNode( + parentNode = parentNode, + buildContext = BuildContext.root(null), + navTarget = navTarget, + callback = callback, + ) assertThat(result).isInstanceOf(LockScreenFlowNode::class.java) assertThat(result.plugins).contains(LockScreenFlowNode.Inputs(LockScreenFlowNode.NavTarget.Setup)) assertThat(result.plugins).contains(callback) @@ -58,9 +61,12 @@ class DefaultLockScreenEntryPointTest { override fun onSetupDone() = lambdaError() } val navTarget = LockScreenEntryPoint.Target.Settings - val result = entryPoint.nodeBuilder(parentNode, BuildContext.root(null), navTarget) - .callback(callback) - .build() + val result = entryPoint.createNode( + parentNode = parentNode, + buildContext = BuildContext.root(null), + navTarget = navTarget, + callback = callback, + ) assertThat(result).isInstanceOf(LockScreenFlowNode::class.java) assertThat(result.plugins).contains(LockScreenFlowNode.Inputs(LockScreenFlowNode.NavTarget.Settings)) assertThat(result.plugins).contains(callback) diff --git a/features/login/api/src/main/kotlin/io/element/android/features/login/api/LoginEntryPoint.kt b/features/login/api/src/main/kotlin/io/element/android/features/login/api/LoginEntryPoint.kt index 3bb1db478b..e2e60af1ed 100644 --- a/features/login/api/src/main/kotlin/io/element/android/features/login/api/LoginEntryPoint.kt +++ b/features/login/api/src/main/kotlin/io/element/android/features/login/api/LoginEntryPoint.kt @@ -22,11 +22,5 @@ interface LoginEntryPoint : FeatureEntryPoint { fun navigateToBugReport() } - fun nodeBuilder(parentNode: Node, buildContext: BuildContext): NodeBuilder - - interface NodeBuilder { - fun params(params: Params): NodeBuilder - fun callback(callback: Callback): NodeBuilder - fun build(): Node - } + fun createNode(parentNode: Node, buildContext: BuildContext, params: Params, callback: Callback): Node } diff --git a/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/DefaultLoginEntryPoint.kt b/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/DefaultLoginEntryPoint.kt index ed695f7b8e..a95b7b54a7 100644 --- a/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/DefaultLoginEntryPoint.kt +++ b/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/DefaultLoginEntryPoint.kt @@ -9,7 +9,6 @@ package io.element.android.features.login.impl 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.AppScope import dev.zacsweers.metro.ContributesBinding import io.element.android.features.login.api.LoginEntryPoint @@ -17,26 +16,16 @@ import io.element.android.libraries.architecture.createNode @ContributesBinding(AppScope::class) class DefaultLoginEntryPoint : LoginEntryPoint { - override fun nodeBuilder(parentNode: Node, buildContext: BuildContext): LoginEntryPoint.NodeBuilder { - val plugins = ArrayList() - - return object : LoginEntryPoint.NodeBuilder { - override fun params(params: LoginEntryPoint.Params): LoginEntryPoint.NodeBuilder { - plugins += LoginFlowNode.Params( + override fun createNode(parentNode: Node, buildContext: BuildContext, params: LoginEntryPoint.Params, callback: LoginEntryPoint.Callback): Node { + return parentNode.createNode( + buildContext = buildContext, + plugins = listOf( + LoginFlowNode.Params( accountProvider = params.accountProvider, loginHint = params.loginHint, - ) - return this - } - - override fun callback(callback: LoginEntryPoint.Callback): LoginEntryPoint.NodeBuilder { - plugins += callback - return this - } - - override fun build(): Node { - return parentNode.createNode(buildContext, plugins) - } - } + ), + callback, + ) + ) } } diff --git a/features/login/impl/src/test/kotlin/io/element/android/features/login/impl/DefaultLoginEntryPointTest.kt b/features/login/impl/src/test/kotlin/io/element/android/features/login/impl/DefaultLoginEntryPointTest.kt index d39cea9865..4a6f6cae22 100644 --- a/features/login/impl/src/test/kotlin/io/element/android/features/login/impl/DefaultLoginEntryPointTest.kt +++ b/features/login/impl/src/test/kotlin/io/element/android/features/login/impl/DefaultLoginEntryPointTest.kt @@ -45,10 +45,12 @@ class DefaultLoginEntryPointTest { accountProvider = "ac", loginHint = "lh", ) - val result = entryPoint.nodeBuilder(parentNode, BuildContext.root(null)) - .params(params) - .callback(callback) - .build() + val result = entryPoint.createNode( + parentNode = parentNode, + buildContext = BuildContext.root(null), + params = params, + callback = callback, + ) assertThat(result).isInstanceOf(LoginFlowNode::class.java) assertThat(result.plugins).contains(LoginFlowNode.Params(params.accountProvider, params.loginHint)) assertThat(result.plugins).contains(callback) diff --git a/features/logout/api/src/main/kotlin/io/element/android/features/logout/api/LogoutEntryPoint.kt b/features/logout/api/src/main/kotlin/io/element/android/features/logout/api/LogoutEntryPoint.kt index 676216d8f4..41ce730b1c 100644 --- a/features/logout/api/src/main/kotlin/io/element/android/features/logout/api/LogoutEntryPoint.kt +++ b/features/logout/api/src/main/kotlin/io/element/android/features/logout/api/LogoutEntryPoint.kt @@ -13,12 +13,7 @@ import com.bumble.appyx.core.plugin.Plugin import io.element.android.libraries.architecture.FeatureEntryPoint interface LogoutEntryPoint : FeatureEntryPoint { - fun nodeBuilder(parentNode: Node, buildContext: BuildContext): NodeBuilder - - interface NodeBuilder { - fun callback(callback: Callback): NodeBuilder - fun build(): Node - } + fun createNode(parentNode: Node, buildContext: BuildContext, callback: Callback): Node interface Callback : Plugin { fun navigateToSecureBackup() diff --git a/features/logout/impl/src/main/kotlin/io/element/android/features/logout/impl/DefaultLogoutEntryPoint.kt b/features/logout/impl/src/main/kotlin/io/element/android/features/logout/impl/DefaultLogoutEntryPoint.kt index adcc060b46..4ca840ad04 100644 --- a/features/logout/impl/src/main/kotlin/io/element/android/features/logout/impl/DefaultLogoutEntryPoint.kt +++ b/features/logout/impl/src/main/kotlin/io/element/android/features/logout/impl/DefaultLogoutEntryPoint.kt @@ -9,7 +9,6 @@ package io.element.android.features.logout.impl 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.AppScope import dev.zacsweers.metro.ContributesBinding import io.element.android.features.logout.api.LogoutEntryPoint @@ -17,18 +16,7 @@ import io.element.android.libraries.architecture.createNode @ContributesBinding(AppScope::class) class DefaultLogoutEntryPoint : LogoutEntryPoint { - override fun nodeBuilder(parentNode: Node, buildContext: BuildContext): LogoutEntryPoint.NodeBuilder { - val plugins = ArrayList() - - return object : LogoutEntryPoint.NodeBuilder { - override fun callback(callback: LogoutEntryPoint.Callback): LogoutEntryPoint.NodeBuilder { - plugins += callback - return this - } - - override fun build(): Node { - return parentNode.createNode(buildContext, plugins) - } - } + override fun createNode(parentNode: Node, buildContext: BuildContext, callback: LogoutEntryPoint.Callback): Node { + return parentNode.createNode(buildContext, listOf(callback)) } } diff --git a/features/logout/impl/src/test/kotlin/io/element/android/features/logout/impl/DefaultLogoutEntryPointTest.kt b/features/logout/impl/src/test/kotlin/io/element/android/features/logout/impl/DefaultLogoutEntryPointTest.kt index 7e831bccf5..dd4b3b36fc 100644 --- a/features/logout/impl/src/test/kotlin/io/element/android/features/logout/impl/DefaultLogoutEntryPointTest.kt +++ b/features/logout/impl/src/test/kotlin/io/element/android/features/logout/impl/DefaultLogoutEntryPointTest.kt @@ -34,9 +34,11 @@ class DefaultLogoutEntryPointTest { val callback = object : LogoutEntryPoint.Callback { override fun navigateToSecureBackup() = lambdaError() } - val result = entryPoint.nodeBuilder(parentNode, BuildContext.root(null)) - .callback(callback) - .build() + val result = entryPoint.createNode( + parentNode = parentNode, + buildContext = BuildContext.root(null), + callback = callback, + ) assertThat(result).isInstanceOf(LogoutNode::class.java) assertThat(result.plugins).contains(callback) } diff --git a/features/messages/api/src/main/kotlin/io/element/android/features/messages/api/MessagesEntryPoint.kt b/features/messages/api/src/main/kotlin/io/element/android/features/messages/api/MessagesEntryPoint.kt index 6540e03684..46e20ab2d7 100644 --- a/features/messages/api/src/main/kotlin/io/element/android/features/messages/api/MessagesEntryPoint.kt +++ b/features/messages/api/src/main/kotlin/io/element/android/features/messages/api/MessagesEntryPoint.kt @@ -31,12 +31,6 @@ interface MessagesEntryPoint : FeatureEntryPoint { data object PinnedMessages : InitialTarget } - interface NodeBuilder { - fun params(params: Params): NodeBuilder - fun callback(callback: Callback): NodeBuilder - fun build(): Node - } - interface Callback : Plugin { fun navigateToRoomDetails() fun navigateToRoomMemberDetails(userId: UserId) @@ -47,7 +41,7 @@ interface MessagesEntryPoint : FeatureEntryPoint { data class Params(val initialTarget: InitialTarget) : NodeInputs - fun nodeBuilder(parentNode: Node, buildContext: BuildContext): NodeBuilder + fun createNode(parentNode: Node, buildContext: BuildContext, params: Params, callback: Callback): Node } interface MessagesEntryPointNode { diff --git a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/DefaultMessagesEntryPoint.kt b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/DefaultMessagesEntryPoint.kt index 9085bcb283..c48fafb6a2 100644 --- a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/DefaultMessagesEntryPoint.kt +++ b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/DefaultMessagesEntryPoint.kt @@ -9,34 +9,15 @@ package io.element.android.features.messages.impl 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.ContributesBinding import io.element.android.features.messages.api.MessagesEntryPoint -import io.element.android.libraries.architecture.NodeFactoriesBindings -import io.element.android.libraries.architecture.bindings +import io.element.android.libraries.architecture.createNode import io.element.android.libraries.di.SessionScope @ContributesBinding(SessionScope::class) class DefaultMessagesEntryPoint : MessagesEntryPoint { - override fun nodeBuilder(parentNode: Node, buildContext: BuildContext): MessagesEntryPoint.NodeBuilder { - val nodeFactories = parentNode.bindings().nodeFactories() - val plugins = ArrayList() - - return object : MessagesEntryPoint.NodeBuilder { - override fun params(params: MessagesEntryPoint.Params): MessagesEntryPoint.NodeBuilder { - plugins += MessagesEntryPoint.Params(params.initialTarget) - return this - } - - override fun callback(callback: MessagesEntryPoint.Callback): MessagesEntryPoint.NodeBuilder { - plugins += callback - return this - } - - override fun build(): Node { - return nodeFactories[MessagesFlowNode::class]!!.create(buildContext, plugins) - } - } + override fun createNode(parentNode: Node, buildContext: BuildContext, params: MessagesEntryPoint.Params, callback: MessagesEntryPoint.Callback): Node { + return parentNode.createNode(buildContext, listOf(params, callback)) } } diff --git a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/MessagesFlowNode.kt b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/MessagesFlowNode.kt index a65595788a..d8a684b8dd 100644 --- a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/MessagesFlowNode.kt +++ b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/MessagesFlowNode.kt @@ -320,10 +320,12 @@ class MessagesFlowNode( callback.forwardEvent(eventId) } } - mediaViewerEntryPoint.nodeBuilder(this, buildContext) - .params(params) - .callback(callback) - .build() + mediaViewerEntryPoint.createNode( + parentNode = this, + buildContext = buildContext, + params = params, + callback = callback + ) } is NavTarget.AttachmentPreview -> { val inputs = AttachmentsPreviewNode.Inputs( @@ -356,39 +358,43 @@ class MessagesFlowNode( } } } - forwardEntryPoint.nodeBuilder(this, buildContext) - .params(params) - .callback(callback) - .build() + forwardEntryPoint.createNode( + parentNode = this, + buildContext = buildContext, + params = params, + callback = callback, + ) } is NavTarget.ReportMessage -> { val inputs = ReportMessageNode.Inputs(navTarget.eventId, navTarget.senderId) createNode(buildContext, listOf(inputs)) } is NavTarget.SendLocation -> { - sendLocationEntryPoint - .builder(navTarget.timelineMode) - .build(this, buildContext) + sendLocationEntryPoint.createNode( + parentNode = this, + buildContext = buildContext, + timelineMode = navTarget.timelineMode, + ) } is NavTarget.CreatePoll -> { - createPollEntryPoint.nodeBuilder(this, buildContext) - .params( - CreatePollEntryPoint.Params( - timelineMode = navTarget.timelineMode, - mode = CreatePollMode.NewPoll - ) - ) - .build() + createPollEntryPoint.createNode( + parentNode = this, + buildContext = buildContext, + params = CreatePollEntryPoint.Params( + timelineMode = navTarget.timelineMode, + mode = CreatePollMode.NewPoll + ), + ) } is NavTarget.EditPoll -> { - createPollEntryPoint.nodeBuilder(this, buildContext) - .params( - CreatePollEntryPoint.Params( - timelineMode = navTarget.timelineMode, - mode = CreatePollMode.EditPoll(eventId = navTarget.eventId) - ) - ) - .build() + createPollEntryPoint.createNode( + parentNode = this, + buildContext = buildContext, + params = CreatePollEntryPoint.Params( + timelineMode = navTarget.timelineMode, + mode = CreatePollMode.EditPoll(eventId = navTarget.eventId) + ), + ) } NavTarget.PinnedMessagesList -> { val callback = object : PinnedMessagesListNode.Callback { diff --git a/features/messages/impl/src/test/kotlin/io/element/android/features/messages/impl/DefaultMessagesEntryPointTest.kt b/features/messages/impl/src/test/kotlin/io/element/android/features/messages/impl/DefaultMessagesEntryPointTest.kt index 1df6fc25f1..774f38acf8 100644 --- a/features/messages/impl/src/test/kotlin/io/element/android/features/messages/impl/DefaultMessagesEntryPointTest.kt +++ b/features/messages/impl/src/test/kotlin/io/element/android/features/messages/impl/DefaultMessagesEntryPointTest.kt @@ -24,6 +24,7 @@ import io.element.android.features.messages.api.MessagesEntryPoint import io.element.android.features.messages.impl.pinned.banner.createPinnedEventsTimelineProvider import io.element.android.features.messages.impl.timeline.createTimelineController import io.element.android.features.poll.api.create.CreatePollEntryPoint +import io.element.android.features.poll.api.create.CreatePollEntryPoint.Params import io.element.android.libraries.dateformatter.test.FakeDateFormatter import io.element.android.libraries.matrix.api.core.EventId import io.element.android.libraries.matrix.api.core.RoomId @@ -65,13 +66,21 @@ class DefaultMessagesEntryPointTest { roomListService = FakeRoomListService(), sessionId = A_SESSION_ID, sendLocationEntryPoint = object : SendLocationEntryPoint { - override fun builder(timelineMode: Timeline.Mode) = lambdaError() + override fun createNode( + parentNode: Node, + buildContext: BuildContext, + timelineMode: Timeline.Mode, + ) = lambdaError() }, showLocationEntryPoint = object : ShowLocationEntryPoint { override fun createNode(parentNode: Node, buildContext: BuildContext, inputs: ShowLocationEntryPoint.Inputs) = lambdaError() }, createPollEntryPoint = object : CreatePollEntryPoint { - override fun nodeBuilder(parentNode: Node, buildContext: BuildContext) = lambdaError() + override fun createNode( + parentNode: Node, + buildContext: BuildContext, + params: Params, + ) = lambdaError() }, elementCallEntryPoint = object : ElementCallEntryPoint { override fun startCall(callType: CallType) = lambdaError() @@ -89,10 +98,21 @@ class DefaultMessagesEntryPointTest { ) = lambdaError() }, mediaViewerEntryPoint = object : MediaViewerEntryPoint { - override fun nodeBuilder(parentNode: Node, buildContext: BuildContext) = lambdaError() + override fun createParamsForAvatar(filename: String, avatarUrl: String) = lambdaError() + override fun createNode( + parentNode: Node, + buildContext: BuildContext, + params: MediaViewerEntryPoint.Params, + callback: MediaViewerEntryPoint.Callback, + ) = lambdaError() }, forwardEntryPoint = object : ForwardEntryPoint { - override fun nodeBuilder(parentNode: Node, buildContext: BuildContext) = lambdaError() + override fun createNode( + parentNode: Node, + buildContext: BuildContext, + params: ForwardEntryPoint.Params, + callback: ForwardEntryPoint.Callback, + ) = lambdaError() }, analyticsService = FakeAnalyticsService(), locationService = FakeLocationService(), @@ -124,10 +144,12 @@ class DefaultMessagesEntryPointTest { } val initialTarget = MessagesEntryPoint.InitialTarget.Messages(focusedEventId = AN_EVENT_ID) val params = MessagesEntryPoint.Params(initialTarget) - val result = entryPoint.nodeBuilder(parentNode, BuildContext.root(null)) - .params(params) - .callback(callback) - .build() + val result = entryPoint.createNode( + parentNode = parentNode, + buildContext = BuildContext.root(null), + params = params, + callback = callback, + ) assertThat(result).isInstanceOf(MessagesFlowNode::class.java) assertThat(result.plugins).contains(MessagesEntryPoint.Params(initialTarget)) assertThat(result.plugins).contains(callback) diff --git a/features/poll/api/src/main/kotlin/io/element/android/features/poll/api/create/CreatePollEntryPoint.kt b/features/poll/api/src/main/kotlin/io/element/android/features/poll/api/create/CreatePollEntryPoint.kt index 348f2f6c60..5d82fb1fd3 100644 --- a/features/poll/api/src/main/kotlin/io/element/android/features/poll/api/create/CreatePollEntryPoint.kt +++ b/features/poll/api/src/main/kotlin/io/element/android/features/poll/api/create/CreatePollEntryPoint.kt @@ -18,10 +18,5 @@ interface CreatePollEntryPoint : FeatureEntryPoint { val mode: CreatePollMode, ) - fun nodeBuilder(parentNode: Node, buildContext: BuildContext): NodeBuilder - - interface NodeBuilder { - fun params(params: Params): NodeBuilder - fun build(): Node - } + fun createNode(parentNode: Node, buildContext: BuildContext, params: Params): Node } diff --git a/features/poll/impl/src/main/kotlin/io/element/android/features/poll/impl/create/DefaultCreatePollEntryPoint.kt b/features/poll/impl/src/main/kotlin/io/element/android/features/poll/impl/create/DefaultCreatePollEntryPoint.kt index d8df6c2d01..652f5db20d 100644 --- a/features/poll/impl/src/main/kotlin/io/element/android/features/poll/impl/create/DefaultCreatePollEntryPoint.kt +++ b/features/poll/impl/src/main/kotlin/io/element/android/features/poll/impl/create/DefaultCreatePollEntryPoint.kt @@ -9,7 +9,6 @@ package io.element.android.features.poll.impl.create 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.AppScope import dev.zacsweers.metro.ContributesBinding import io.element.android.features.poll.api.create.CreatePollEntryPoint @@ -17,18 +16,10 @@ import io.element.android.libraries.architecture.createNode @ContributesBinding(AppScope::class) class DefaultCreatePollEntryPoint : CreatePollEntryPoint { - override fun nodeBuilder(parentNode: Node, buildContext: BuildContext): CreatePollEntryPoint.NodeBuilder { - val plugins = ArrayList() - - return object : CreatePollEntryPoint.NodeBuilder { - override fun params(params: CreatePollEntryPoint.Params): CreatePollEntryPoint.NodeBuilder { - plugins += CreatePollNode.Inputs(timelineMode = params.timelineMode, mode = params.mode) - return this - } - - override fun build(): Node { - return parentNode.createNode(buildContext, plugins) - } - } + override fun createNode(parentNode: Node, buildContext: BuildContext, params: CreatePollEntryPoint.Params): Node { + return parentNode.createNode( + buildContext = buildContext, + plugins = listOf(CreatePollNode.Inputs(timelineMode = params.timelineMode, mode = params.mode)) + ) } } diff --git a/features/poll/impl/src/main/kotlin/io/element/android/features/poll/impl/history/PollHistoryFlowNode.kt b/features/poll/impl/src/main/kotlin/io/element/android/features/poll/impl/history/PollHistoryFlowNode.kt index 0f8ae56887..6b43a06d01 100644 --- a/features/poll/impl/src/main/kotlin/io/element/android/features/poll/impl/history/PollHistoryFlowNode.kt +++ b/features/poll/impl/src/main/kotlin/io/element/android/features/poll/impl/history/PollHistoryFlowNode.kt @@ -53,14 +53,14 @@ class PollHistoryFlowNode( override fun resolve(navTarget: NavTarget, buildContext: BuildContext): Node { return when (navTarget) { is NavTarget.EditPoll -> { - createPollEntryPoint.nodeBuilder(this, buildContext) - .params( - CreatePollEntryPoint.Params( + createPollEntryPoint.createNode( + parentNode = this, + buildContext = buildContext, + params = CreatePollEntryPoint.Params( timelineMode = Timeline.Mode.Live, mode = CreatePollMode.EditPoll(eventId = navTarget.pollStartEventId) - ) ) - .build() + ) } NavTarget.Root -> { val callback = object : PollHistoryNode.Callback { diff --git a/features/poll/impl/src/test/kotlin/io/element/android/features/poll/impl/create/DefaultCreatePollEntryPointTest.kt b/features/poll/impl/src/test/kotlin/io/element/android/features/poll/impl/create/DefaultCreatePollEntryPointTest.kt index bf77cb4535..464fae98a0 100644 --- a/features/poll/impl/src/test/kotlin/io/element/android/features/poll/impl/create/DefaultCreatePollEntryPointTest.kt +++ b/features/poll/impl/src/test/kotlin/io/element/android/features/poll/impl/create/DefaultCreatePollEntryPointTest.kt @@ -53,9 +53,11 @@ class DefaultCreatePollEntryPointTest { timelineMode = Timeline.Mode.Live, mode = CreatePollMode.NewPoll, ) - val result = entryPoint.nodeBuilder(parentNode, BuildContext.root(null)) - .params(params) - .build() + val result = entryPoint.createNode( + parentNode = parentNode, + buildContext = BuildContext.root(null), + params = params, + ) assertThat(result).isInstanceOf(CreatePollNode::class.java) assertThat(result.plugins).contains(CreatePollNode.Inputs(timelineMode = params.timelineMode, mode = params.mode)) } diff --git a/features/poll/impl/src/test/kotlin/io/element/android/features/poll/impl/history/DefaultPollHistoryEntryPointTest.kt b/features/poll/impl/src/test/kotlin/io/element/android/features/poll/impl/history/DefaultPollHistoryEntryPointTest.kt index dfab33e837..fbec294962 100644 --- a/features/poll/impl/src/test/kotlin/io/element/android/features/poll/impl/history/DefaultPollHistoryEntryPointTest.kt +++ b/features/poll/impl/src/test/kotlin/io/element/android/features/poll/impl/history/DefaultPollHistoryEntryPointTest.kt @@ -34,7 +34,11 @@ class DefaultPollHistoryEntryPointTest { buildContext = buildContext, plugins = plugins, createPollEntryPoint = object : CreatePollEntryPoint { - override fun nodeBuilder(parentNode: Node, buildContext: BuildContext) = lambdaError() + override fun createNode( + parentNode: Node, + buildContext: BuildContext, + params: CreatePollEntryPoint.Params, + ) = lambdaError() } ) } diff --git a/features/preferences/api/src/main/kotlin/io/element/android/features/preferences/api/PreferencesEntryPoint.kt b/features/preferences/api/src/main/kotlin/io/element/android/features/preferences/api/PreferencesEntryPoint.kt index b828fab0ff..d2e1db6b4b 100644 --- a/features/preferences/api/src/main/kotlin/io/element/android/features/preferences/api/PreferencesEntryPoint.kt +++ b/features/preferences/api/src/main/kotlin/io/element/android/features/preferences/api/PreferencesEntryPoint.kt @@ -31,13 +31,7 @@ interface PreferencesEntryPoint : FeatureEntryPoint { data class Params(val initialElement: InitialTarget) : NodeInputs - fun nodeBuilder(parentNode: Node, buildContext: BuildContext): NodeBuilder - - interface NodeBuilder { - fun params(params: Params): NodeBuilder - fun callback(callback: Callback): NodeBuilder - fun build(): Node - } + fun createNode(parentNode: Node, buildContext: BuildContext, params: Params, callback: Callback): Node interface Callback : Plugin { fun navigateToAddAccount() diff --git a/features/preferences/impl/src/main/kotlin/io/element/android/features/preferences/impl/DefaultPreferencesEntryPoint.kt b/features/preferences/impl/src/main/kotlin/io/element/android/features/preferences/impl/DefaultPreferencesEntryPoint.kt index 7d32b3d8d9..ffc9a2b798 100644 --- a/features/preferences/impl/src/main/kotlin/io/element/android/features/preferences/impl/DefaultPreferencesEntryPoint.kt +++ b/features/preferences/impl/src/main/kotlin/io/element/android/features/preferences/impl/DefaultPreferencesEntryPoint.kt @@ -9,7 +9,6 @@ package io.element.android.features.preferences.impl 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.AppScope import dev.zacsweers.metro.ContributesBinding import io.element.android.features.preferences.api.PreferencesEntryPoint @@ -17,24 +16,16 @@ import io.element.android.libraries.architecture.createNode @ContributesBinding(AppScope::class) class DefaultPreferencesEntryPoint : PreferencesEntryPoint { - override fun nodeBuilder(parentNode: Node, buildContext: BuildContext): PreferencesEntryPoint.NodeBuilder { - return object : PreferencesEntryPoint.NodeBuilder { - val plugins = ArrayList() - - override fun params(params: PreferencesEntryPoint.Params): PreferencesEntryPoint.NodeBuilder { - plugins += params - return this - } - - override fun callback(callback: PreferencesEntryPoint.Callback): PreferencesEntryPoint.NodeBuilder { - plugins += callback - return this - } - - override fun build(): Node { - return parentNode.createNode(buildContext, plugins) - } - } + override fun createNode( + parentNode: Node, + buildContext: BuildContext, + params: PreferencesEntryPoint.Params, + callback: PreferencesEntryPoint.Callback, + ): Node { + return parentNode.createNode( + buildContext = buildContext, + plugins = listOf(params, callback) + ) } } diff --git a/features/preferences/impl/src/main/kotlin/io/element/android/features/preferences/impl/PreferencesFlowNode.kt b/features/preferences/impl/src/main/kotlin/io/element/android/features/preferences/impl/PreferencesFlowNode.kt index 8f3bc6eb5c..0fcabfad28 100644 --- a/features/preferences/impl/src/main/kotlin/io/element/android/features/preferences/impl/PreferencesFlowNode.kt +++ b/features/preferences/impl/src/main/kotlin/io/element/android/features/preferences/impl/PreferencesFlowNode.kt @@ -215,8 +215,10 @@ class PreferencesFlowNode( createNode(buildContext, listOf(notificationSettingsCallback)) } NavTarget.TroubleshootNotifications -> { - notificationTroubleShootEntryPoint.nodeBuilder(this, buildContext) - .callback(object : NotificationTroubleShootEntryPoint.Callback { + notificationTroubleShootEntryPoint.createNode( + parentNode = this, + buildContext = buildContext, + callback = object : NotificationTroubleShootEntryPoint.Callback { override fun onDone() { if (backstack.canPop()) { backstack.pop() @@ -228,12 +230,14 @@ class PreferencesFlowNode( override fun navigateToBlockedUsers() { backstack.push(NavTarget.BlockedUsers) } - }) - .build() + }, + ) } NavTarget.PushHistory -> { - pushHistoryEntryPoint.nodeBuilder(this, buildContext) - .callback(object : PushHistoryEntryPoint.Callback { + pushHistoryEntryPoint.createNode( + this, + buildContext, + object : PushHistoryEntryPoint.Callback { override fun onDone() { if (backstack.canPop()) { backstack.pop() @@ -245,8 +249,8 @@ class PreferencesFlowNode( override fun navigateToEvent(roomId: RoomId, eventId: EventId) { callback.navigateToEvent(roomId, eventId) } - }) - .build() + }, + ) } is NavTarget.EditDefaultNotificationSetting -> { val callback = object : EditDefaultNotificationSettingNode.Callback { @@ -265,7 +269,16 @@ class PreferencesFlowNode( createNode(buildContext, listOf(inputs)) } NavTarget.LockScreenSettings -> { - lockScreenEntryPoint.nodeBuilder(this, buildContext, LockScreenEntryPoint.Target.Settings).build() + lockScreenEntryPoint.createNode( + parentNode = this, + buildContext = buildContext, + navTarget = LockScreenEntryPoint.Target.Settings, + callback = object : LockScreenEntryPoint.Callback { + override fun onSetupDone() { + // No op + } + } + ) } NavTarget.BlockedUsers -> { createNode(buildContext) @@ -276,9 +289,11 @@ class PreferencesFlowNode( callback.navigateToSecureBackup() } } - logoutEntryPoint.nodeBuilder(this, buildContext) - .callback(callBack) - .build() + logoutEntryPoint.createNode( + parentNode = this, + buildContext = buildContext, + callback = callBack, + ) } is NavTarget.OssLicenses -> { openSourceLicensesEntryPoint.createNode(this, buildContext) diff --git a/features/preferences/impl/src/test/kotlin/io/element/android/features/preferences/impl/DefaultPreferencesEntryPointTest.kt b/features/preferences/impl/src/test/kotlin/io/element/android/features/preferences/impl/DefaultPreferencesEntryPointTest.kt index deb15561de..e7c2f861d3 100644 --- a/features/preferences/impl/src/test/kotlin/io/element/android/features/preferences/impl/DefaultPreferencesEntryPointTest.kt +++ b/features/preferences/impl/src/test/kotlin/io/element/android/features/preferences/impl/DefaultPreferencesEntryPointTest.kt @@ -42,17 +42,35 @@ class DefaultPreferencesEntryPointTest { buildContext = buildContext, plugins = plugins, lockScreenEntryPoint = object : LockScreenEntryPoint { - override fun nodeBuilder(parentNode: Node, buildContext: BuildContext, navTarget: LockScreenEntryPoint.Target) = lambdaError() + override fun createNode( + parentNode: Node, + buildContext: BuildContext, + navTarget: LockScreenEntryPoint.Target, + callback: LockScreenEntryPoint.Callback, + ) = lambdaError() + override fun pinUnlockIntent(context: Context) = lambdaError() }, notificationTroubleShootEntryPoint = object : NotificationTroubleShootEntryPoint { - override fun nodeBuilder(parentNode: Node, buildContext: BuildContext) = lambdaError() + override fun createNode( + parentNode: Node, + buildContext: BuildContext, + callback: NotificationTroubleShootEntryPoint.Callback, + ) = lambdaError() }, pushHistoryEntryPoint = object : PushHistoryEntryPoint { - override fun nodeBuilder(parentNode: Node, buildContext: BuildContext) = lambdaError() + override fun createNode( + parentNode: Node, + buildContext: BuildContext, + callback: PushHistoryEntryPoint.Callback, + ) = lambdaError() }, logoutEntryPoint = object : LogoutEntryPoint { - override fun nodeBuilder(parentNode: Node, buildContext: BuildContext) = lambdaError() + override fun createNode( + parentNode: Node, + buildContext: BuildContext, + callback: LogoutEntryPoint.Callback, + ) = lambdaError() }, openSourceLicensesEntryPoint = object : OpenSourceLicensesEntryPoint { override fun createNode(parentNode: Node, buildContext: BuildContext) = lambdaError() @@ -72,10 +90,12 @@ class DefaultPreferencesEntryPointTest { val params = PreferencesEntryPoint.Params( initialElement = PreferencesEntryPoint.InitialTarget.NotificationSettings, ) - val result = entryPoint.nodeBuilder(parentNode, BuildContext.root(null)) - .params(params) - .callback(callback) - .build() + val result = entryPoint.createNode( + parentNode = parentNode, + buildContext = BuildContext.root(null), + params = params, + callback = callback, + ) assertThat(result).isInstanceOf(PreferencesFlowNode::class.java) assertThat(result.plugins).contains(params) assertThat(result.plugins).contains(callback) diff --git a/features/rageshake/api/src/main/kotlin/io/element/android/features/rageshake/api/bugreport/BugReportEntryPoint.kt b/features/rageshake/api/src/main/kotlin/io/element/android/features/rageshake/api/bugreport/BugReportEntryPoint.kt index 0eb84b529b..f0c73a9c0e 100644 --- a/features/rageshake/api/src/main/kotlin/io/element/android/features/rageshake/api/bugreport/BugReportEntryPoint.kt +++ b/features/rageshake/api/src/main/kotlin/io/element/android/features/rageshake/api/bugreport/BugReportEntryPoint.kt @@ -13,12 +13,7 @@ import com.bumble.appyx.core.plugin.Plugin import io.element.android.libraries.architecture.FeatureEntryPoint interface BugReportEntryPoint : FeatureEntryPoint { - fun nodeBuilder(parentNode: Node, buildContext: BuildContext): NodeBuilder - - interface NodeBuilder { - fun callback(callback: Callback): NodeBuilder - fun build(): Node - } + fun createNode(parentNode: Node, buildContext: BuildContext, callback: Callback): Node interface Callback : Plugin { fun onDone() diff --git a/features/rageshake/impl/src/main/kotlin/io/element/android/features/rageshake/impl/bugreport/BugReportFlowNode.kt b/features/rageshake/impl/src/main/kotlin/io/element/android/features/rageshake/impl/bugreport/BugReportFlowNode.kt index 2893fa4d09..8749199fd1 100644 --- a/features/rageshake/impl/src/main/kotlin/io/element/android/features/rageshake/impl/bugreport/BugReportFlowNode.kt +++ b/features/rageshake/impl/src/main/kotlin/io/element/android/features/rageshake/impl/bugreport/BugReportFlowNode.kt @@ -77,11 +77,12 @@ class BugReportFlowNode( val params = ViewFolderEntryPoint.Params( rootPath = navTarget.rootPath, ) - viewFolderEntryPoint - .nodeBuilder(this, buildContext) - .params(params) - .callback(callback) - .build() + viewFolderEntryPoint.createNode( + parentNode = this, + buildContext = buildContext, + params = params, + callback = callback, + ) } } } diff --git a/features/rageshake/impl/src/main/kotlin/io/element/android/features/rageshake/impl/bugreport/DefaultBugReportEntryPoint.kt b/features/rageshake/impl/src/main/kotlin/io/element/android/features/rageshake/impl/bugreport/DefaultBugReportEntryPoint.kt index b4cfe28bc8..57b4e1a3e5 100644 --- a/features/rageshake/impl/src/main/kotlin/io/element/android/features/rageshake/impl/bugreport/DefaultBugReportEntryPoint.kt +++ b/features/rageshake/impl/src/main/kotlin/io/element/android/features/rageshake/impl/bugreport/DefaultBugReportEntryPoint.kt @@ -9,7 +9,6 @@ package io.element.android.features.rageshake.impl.bugreport 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.AppScope import dev.zacsweers.metro.ContributesBinding import io.element.android.features.rageshake.api.bugreport.BugReportEntryPoint @@ -17,18 +16,7 @@ import io.element.android.libraries.architecture.createNode @ContributesBinding(AppScope::class) class DefaultBugReportEntryPoint : BugReportEntryPoint { - override fun nodeBuilder(parentNode: Node, buildContext: BuildContext): BugReportEntryPoint.NodeBuilder { - val plugins = ArrayList() - - return object : BugReportEntryPoint.NodeBuilder { - override fun callback(callback: BugReportEntryPoint.Callback): BugReportEntryPoint.NodeBuilder { - plugins += callback - return this - } - - override fun build(): Node { - return parentNode.createNode(buildContext, plugins) - } - } + override fun createNode(parentNode: Node, buildContext: BuildContext, callback: BugReportEntryPoint.Callback): Node { + return parentNode.createNode(buildContext, listOf(callback)) } } diff --git a/features/rageshake/impl/src/test/kotlin/io/element/android/features/rageshake/impl/bugreport/DefaultBugReportEntryPointTest.kt b/features/rageshake/impl/src/test/kotlin/io/element/android/features/rageshake/impl/bugreport/DefaultBugReportEntryPointTest.kt index 23d74f7247..bc4b805f2b 100644 --- a/features/rageshake/impl/src/test/kotlin/io/element/android/features/rageshake/impl/bugreport/DefaultBugReportEntryPointTest.kt +++ b/features/rageshake/impl/src/test/kotlin/io/element/android/features/rageshake/impl/bugreport/DefaultBugReportEntryPointTest.kt @@ -35,16 +35,23 @@ class DefaultBugReportEntryPointTest { buildContext = buildContext, plugins = plugins, viewFolderEntryPoint = object : ViewFolderEntryPoint { - override fun nodeBuilder(parentNode: Node, buildContext: BuildContext) = lambdaError() + override fun createNode( + parentNode: Node, + buildContext: BuildContext, + params: ViewFolderEntryPoint.Params, + callback: ViewFolderEntryPoint.Callback, + ) = lambdaError() }, ) } val callback = object : BugReportEntryPoint.Callback { override fun onDone() = lambdaError() } - val result = entryPoint.nodeBuilder(parentNode, BuildContext.root(null)) - .callback(callback) - .build() + val result = entryPoint.createNode( + parentNode = parentNode, + buildContext = BuildContext.root(null), + callback = callback, + ) assertThat(result).isInstanceOf(BugReportFlowNode::class.java) assertThat(result.plugins).contains(callback) } diff --git a/features/roomaliasresolver/api/src/main/kotlin/io/element/android/features/roomaliasesolver/api/RoomAliasResolverEntryPoint.kt b/features/roomaliasresolver/api/src/main/kotlin/io/element/android/features/roomaliasesolver/api/RoomAliasResolverEntryPoint.kt index 420bcfa97c..28931e9b0d 100644 --- a/features/roomaliasresolver/api/src/main/kotlin/io/element/android/features/roomaliasesolver/api/RoomAliasResolverEntryPoint.kt +++ b/features/roomaliasresolver/api/src/main/kotlin/io/element/android/features/roomaliasesolver/api/RoomAliasResolverEntryPoint.kt @@ -16,13 +16,7 @@ import io.element.android.libraries.matrix.api.core.RoomAlias import io.element.android.libraries.matrix.api.room.alias.ResolvedRoomAlias interface RoomAliasResolverEntryPoint : FeatureEntryPoint { - fun nodeBuilder(parentNode: Node, buildContext: BuildContext): NodeBuilder - - interface NodeBuilder { - fun callback(callback: Callback): NodeBuilder - fun params(params: Params): NodeBuilder - fun build(): Node - } + fun createNode(parentNode: Node, buildContext: BuildContext, params: Params, callback: Callback): Node interface Callback : Plugin { fun onAliasResolved(data: ResolvedRoomAlias) diff --git a/features/roomaliasresolver/impl/src/main/kotlin/io/element/android/features/roomaliasresolver/impl/DefaultRoomAliasResolverEntryPoint.kt b/features/roomaliasresolver/impl/src/main/kotlin/io/element/android/features/roomaliasresolver/impl/DefaultRoomAliasResolverEntryPoint.kt index df653437f1..b6e4fe6716 100644 --- a/features/roomaliasresolver/impl/src/main/kotlin/io/element/android/features/roomaliasresolver/impl/DefaultRoomAliasResolverEntryPoint.kt +++ b/features/roomaliasresolver/impl/src/main/kotlin/io/element/android/features/roomaliasresolver/impl/DefaultRoomAliasResolverEntryPoint.kt @@ -9,7 +9,6 @@ package io.element.android.features.roomaliasresolver.impl 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.AppScope import dev.zacsweers.metro.ContributesBinding import io.element.android.features.roomaliasesolver.api.RoomAliasResolverEntryPoint @@ -17,23 +16,15 @@ import io.element.android.libraries.architecture.createNode @ContributesBinding(AppScope::class) class DefaultRoomAliasResolverEntryPoint : RoomAliasResolverEntryPoint { - override fun nodeBuilder(parentNode: Node, buildContext: BuildContext): RoomAliasResolverEntryPoint.NodeBuilder { - val plugins = ArrayList() - - return object : RoomAliasResolverEntryPoint.NodeBuilder { - override fun callback(callback: RoomAliasResolverEntryPoint.Callback): RoomAliasResolverEntryPoint.NodeBuilder { - plugins += callback - return this - } - - override fun params(params: RoomAliasResolverEntryPoint.Params): RoomAliasResolverEntryPoint.NodeBuilder { - plugins += params - return this - } - - override fun build(): Node { - return parentNode.createNode(buildContext, plugins) - } - } + override fun createNode( + parentNode: Node, + buildContext: BuildContext, + params: RoomAliasResolverEntryPoint.Params, + callback: RoomAliasResolverEntryPoint.Callback, + ): Node { + return parentNode.createNode( + buildContext = buildContext, + plugins = listOf(params, callback), + ) } } diff --git a/features/roomaliasresolver/impl/src/test/kotlin/io/element/android/features/roomaliasresolver/impl/DefaultRoomAliasResolverEntryPointTest.kt b/features/roomaliasresolver/impl/src/test/kotlin/io/element/android/features/roomaliasresolver/impl/DefaultRoomAliasResolverEntryPointTest.kt index 238b35017b..6e3dbb2ba8 100644 --- a/features/roomaliasresolver/impl/src/test/kotlin/io/element/android/features/roomaliasresolver/impl/DefaultRoomAliasResolverEntryPointTest.kt +++ b/features/roomaliasresolver/impl/src/test/kotlin/io/element/android/features/roomaliasresolver/impl/DefaultRoomAliasResolverEntryPointTest.kt @@ -43,10 +43,12 @@ class DefaultRoomAliasResolverEntryPointTest { val params = RoomAliasResolverEntryPoint.Params( roomAlias = A_ROOM_ALIAS ) - val result = entryPoint.nodeBuilder(parentNode, BuildContext.root(null)) - .params(params) - .callback(callback) - .build() + val result = entryPoint.createNode( + parentNode = parentNode, + buildContext = BuildContext.root(null), + params = params, + callback = callback, + ) assertThat(result).isInstanceOf(RoomAliasResolverNode::class.java) assertThat(result.plugins).contains(params) assertThat(result.plugins).contains(callback) diff --git a/features/roomdetails/api/src/main/kotlin/io/element/android/features/roomdetails/api/RoomDetailsEntryPoint.kt b/features/roomdetails/api/src/main/kotlin/io/element/android/features/roomdetails/api/RoomDetailsEntryPoint.kt index 4b47f6b276..bdee602f55 100644 --- a/features/roomdetails/api/src/main/kotlin/io/element/android/features/roomdetails/api/RoomDetailsEntryPoint.kt +++ b/features/roomdetails/api/src/main/kotlin/io/element/android/features/roomdetails/api/RoomDetailsEntryPoint.kt @@ -43,11 +43,5 @@ interface RoomDetailsEntryPoint : FeatureEntryPoint { fun startForwardEventFlow(eventId: EventId) } - interface NodeBuilder { - fun params(params: Params): NodeBuilder - fun callback(callback: Callback): NodeBuilder - fun build(): Node - } - - fun nodeBuilder(parentNode: Node, buildContext: BuildContext): NodeBuilder + fun createNode(parentNode: Node, buildContext: BuildContext, params: Params, callback: Callback): Node } diff --git a/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/DefaultRoomDetailsEntryPoint.kt b/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/DefaultRoomDetailsEntryPoint.kt index 5679b8c361..8066cc70f5 100644 --- a/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/DefaultRoomDetailsEntryPoint.kt +++ b/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/DefaultRoomDetailsEntryPoint.kt @@ -9,7 +9,6 @@ package io.element.android.features.roomdetails.impl 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.AppScope import dev.zacsweers.metro.ContributesBinding import io.element.android.features.roomdetails.api.RoomDetailsEntryPoint @@ -19,24 +18,16 @@ import io.element.android.libraries.architecture.createNode @ContributesBinding(AppScope::class) class DefaultRoomDetailsEntryPoint : RoomDetailsEntryPoint { - override fun nodeBuilder(parentNode: Node, buildContext: BuildContext): RoomDetailsEntryPoint.NodeBuilder { - return object : RoomDetailsEntryPoint.NodeBuilder { - val plugins = ArrayList() - - override fun params(params: RoomDetailsEntryPoint.Params): RoomDetailsEntryPoint.NodeBuilder { - plugins += params - return this - } - - override fun callback(callback: RoomDetailsEntryPoint.Callback): RoomDetailsEntryPoint.NodeBuilder { - plugins += callback - return this - } - - override fun build(): Node { - return parentNode.createNode(buildContext, plugins) - } - } + override fun createNode( + parentNode: Node, + buildContext: BuildContext, + params: RoomDetailsEntryPoint.Params, + callback: RoomDetailsEntryPoint.Callback, + ): Node { + return parentNode.createNode( + buildContext = buildContext, + plugins = listOf(params, callback) + ) } } diff --git a/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/RoomDetailsFlowNode.kt b/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/RoomDetailsFlowNode.kt index 8ca5745ad1..3ed0ce9d92 100644 --- a/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/RoomDetailsFlowNode.kt +++ b/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/RoomDetailsFlowNode.kt @@ -303,13 +303,16 @@ class RoomDetailsFlowNode( // Cannot happen } } - mediaViewerEntryPoint.nodeBuilder(this, buildContext) - .avatar( - navTarget.name, - navTarget.avatarUrl, - ) - .callback(callback) - .build() + val params = mediaViewerEntryPoint.createParamsForAvatar( + filename = navTarget.name, + avatarUrl = navTarget.avatarUrl, + ) + mediaViewerEntryPoint.createNode( + parentNode = this, + buildContext = buildContext, + params = params, + callback = callback, + ) } is NavTarget.PollHistory -> { pollHistoryEntryPoint.createNode(this, buildContext) @@ -332,9 +335,11 @@ class RoomDetailsFlowNode( callback.startForwardEventFlow(eventId) } } - mediaGalleryEntryPoint.nodeBuilder(this, buildContext) - .callback(callback) - .build() + mediaGalleryEntryPoint.createNode( + parentNode = this, + buildContext = buildContext, + callback = callback, + ) } is NavTarget.AdminSettings -> { @@ -361,10 +366,12 @@ class RoomDetailsFlowNode( callback.navigateToRoom(roomId, emptyList()) } } - return messagesEntryPoint.nodeBuilder(this, buildContext) - .params(params) - .callback(callback) - .build() + return messagesEntryPoint.createNode( + parentNode = this, + buildContext = buildContext, + params = params, + callback = callback, + ) } NavTarget.KnockRequestsList -> { knockRequestsListEntryPoint.createNode(this, buildContext) @@ -377,9 +384,11 @@ class RoomDetailsFlowNode( showDeviceVerifiedScreen = true, verificationRequest = VerificationRequest.Outgoing.User(userId = navTarget.userId) ) - outgoingVerificationEntryPoint.nodeBuilder(this, buildContext) - .params(params) - .callback(object : OutgoingVerificationEntryPoint.Callback { + outgoingVerificationEntryPoint.createNode( + parentNode = this, + buildContext = buildContext, + params = params, + callback = object : OutgoingVerificationEntryPoint.Callback { override fun onDone() { backstack.pop() } @@ -391,18 +400,20 @@ class RoomDetailsFlowNode( override fun navigateToLearnMoreAboutEncryption() { learnMoreUrl.value = LearnMoreConfig.ENCRYPTION_URL } - }) - .build() + }, + ) } is NavTarget.ReportRoom -> { reportRoomEntryPoint.createNode(this, buildContext, room.roomId) } is NavTarget.SelectNewOwnersWhenLeaving -> { - changeRoomMemberRolesEntryPoint.builder(this, buildContext) - .room(room) - .listType(ChangeRoomMemberRolesListType.SelectNewOwnersWhenLeaving) - .build() + changeRoomMemberRolesEntryPoint.createNode( + parentNode = this, + buildContext = buildContext, + room = room, + listType = ChangeRoomMemberRolesListType.SelectNewOwnersWhenLeaving, + ) } } } diff --git a/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/rolesandpermissions/RolesAndPermissionsFlowNode.kt b/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/rolesandpermissions/RolesAndPermissionsFlowNode.kt index 62689489eb..aeee51a81d 100644 --- a/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/rolesandpermissions/RolesAndPermissionsFlowNode.kt +++ b/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/rolesandpermissions/RolesAndPermissionsFlowNode.kt @@ -101,16 +101,20 @@ class RolesAndPermissionsFlowNode( ) } is NavTarget.AdminList -> { - changeRoomMemberRolesEntryPoint.builder(this, buildContext) - .room(joinedRoom) - .listType(ChangeRoomMemberRolesListType.Admins) - .build() + changeRoomMemberRolesEntryPoint.createNode( + parentNode = this, + buildContext = buildContext, + room = joinedRoom, + listType = ChangeRoomMemberRolesListType.Admins, + ) } is NavTarget.ModeratorList -> { - changeRoomMemberRolesEntryPoint.builder(this, buildContext) - .room(joinedRoom) - .listType(ChangeRoomMemberRolesListType.Moderators) - .build() + changeRoomMemberRolesEntryPoint.createNode( + parentNode = this, + buildContext = buildContext, + room = joinedRoom, + listType = ChangeRoomMemberRolesListType.Moderators, + ) } is NavTarget.ChangeRoomPermissions -> { val inputs = ChangeRoomPermissionsNode.Inputs(navTarget.section) diff --git a/features/roomdetails/impl/src/test/kotlin/io/element/android/features/roomdetails/impl/DefaultRoomDetailsEntryPointTest.kt b/features/roomdetails/impl/src/test/kotlin/io/element/android/features/roomdetails/impl/DefaultRoomDetailsEntryPointTest.kt index 0872567523..6de949d0a4 100644 --- a/features/roomdetails/impl/src/test/kotlin/io/element/android/features/roomdetails/impl/DefaultRoomDetailsEntryPointTest.kt +++ b/features/roomdetails/impl/src/test/kotlin/io/element/android/features/roomdetails/impl/DefaultRoomDetailsEntryPointTest.kt @@ -15,6 +15,7 @@ import com.google.common.truth.Truth.assertThat import io.element.android.features.call.api.CallType import io.element.android.features.call.api.ElementCallEntryPoint import io.element.android.features.changeroommemberroes.api.ChangeRoomMemberRolesEntryPoint +import io.element.android.features.changeroommemberroes.api.ChangeRoomMemberRolesListType import io.element.android.features.knockrequests.api.list.KnockRequestsListEntryPoint import io.element.android.features.messages.api.MessagesEntryPoint import io.element.android.features.poll.api.history.PollHistoryEntryPoint @@ -25,6 +26,7 @@ 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.UserId import io.element.android.libraries.matrix.api.permalink.PermalinkData +import io.element.android.libraries.matrix.api.room.JoinedRoom import io.element.android.libraries.matrix.test.A_USER_ID import io.element.android.libraries.matrix.test.room.FakeJoinedRoom import io.element.android.libraries.mediaviewer.api.MediaGalleryEntryPoint @@ -71,25 +73,50 @@ class DefaultRoomDetailsEntryPointTest { room = FakeJoinedRoom(), analyticsService = FakeAnalyticsService(), messagesEntryPoint = object : MessagesEntryPoint { - override fun nodeBuilder(parentNode: Node, buildContext: BuildContext) = lambdaError() + override fun createNode( + parentNode: Node, + buildContext: BuildContext, + params: MessagesEntryPoint.Params, + callback: MessagesEntryPoint.Callback, + ) = lambdaError() }, knockRequestsListEntryPoint = object : KnockRequestsListEntryPoint { override fun createNode(parentNode: Node, buildContext: BuildContext) = lambdaError() }, mediaViewerEntryPoint = object : MediaViewerEntryPoint { - override fun nodeBuilder(parentNode: Node, buildContext: BuildContext) = lambdaError() + override fun createParamsForAvatar(filename: String, avatarUrl: String) = lambdaError() + override fun createNode( + parentNode: Node, + buildContext: BuildContext, + params: MediaViewerEntryPoint.Params, + callback: MediaViewerEntryPoint.Callback, + ) = lambdaError() }, mediaGalleryEntryPoint = object : MediaGalleryEntryPoint { - override fun nodeBuilder(parentNode: Node, buildContext: BuildContext) = lambdaError() + override fun createNode( + parentNode: Node, + buildContext: BuildContext, + callback: MediaGalleryEntryPoint.Callback, + ) = lambdaError() }, outgoingVerificationEntryPoint = object : OutgoingVerificationEntryPoint { - override fun nodeBuilder(parentNode: Node, buildContext: BuildContext) = lambdaError() + override fun createNode( + parentNode: Node, + buildContext: BuildContext, + params: OutgoingVerificationEntryPoint.Params, + callback: OutgoingVerificationEntryPoint.Callback, + ) = lambdaError() }, reportRoomEntryPoint = object : ReportRoomEntryPoint { override fun createNode(parentNode: Node, buildContext: BuildContext, roomId: RoomId) = lambdaError() }, changeRoomMemberRolesEntryPoint = object : ChangeRoomMemberRolesEntryPoint { - override fun builder(parentNode: Node, buildContext: BuildContext) = lambdaError() + override fun createNode( + parentNode: Node, + buildContext: BuildContext, + room: JoinedRoom, + listType: ChangeRoomMemberRolesListType, + ) = lambdaError() }, ) } @@ -102,10 +129,12 @@ class DefaultRoomDetailsEntryPointTest { val params = RoomDetailsEntryPoint.Params( initialElement = RoomDetailsEntryPoint.InitialTarget.RoomDetails, ) - val result = entryPoint.nodeBuilder(parentNode, BuildContext.root(null)) - .params(params) - .callback(callback) - .build() + val result = entryPoint.createNode( + parentNode = parentNode, + buildContext = BuildContext.root(null), + params = params, + callback = callback, + ) assertThat(result).isInstanceOf(RoomDetailsFlowNode::class.java) assertThat(result.plugins).contains(params) assertThat(result.plugins).contains(callback) diff --git a/features/roomdirectory/api/src/main/kotlin/io/element/android/features/roomdirectory/api/RoomDirectoryEntryPoint.kt b/features/roomdirectory/api/src/main/kotlin/io/element/android/features/roomdirectory/api/RoomDirectoryEntryPoint.kt index 7a1764106a..88cea23a05 100644 --- a/features/roomdirectory/api/src/main/kotlin/io/element/android/features/roomdirectory/api/RoomDirectoryEntryPoint.kt +++ b/features/roomdirectory/api/src/main/kotlin/io/element/android/features/roomdirectory/api/RoomDirectoryEntryPoint.kt @@ -13,12 +13,7 @@ import com.bumble.appyx.core.plugin.Plugin import io.element.android.libraries.architecture.FeatureEntryPoint interface RoomDirectoryEntryPoint : FeatureEntryPoint { - fun nodeBuilder(parentNode: Node, buildContext: BuildContext): NodeBuilder - - interface NodeBuilder { - fun callback(callback: Callback): NodeBuilder - fun build(): Node - } + fun createNode(parentNode: Node, buildContext: BuildContext, callback: Callback): Node interface Callback : Plugin { fun navigateToRoom(roomDescription: RoomDescription) diff --git a/features/roomdirectory/impl/src/main/kotlin/io/element/android/features/roomdirectory/impl/DefaultRoomDirectoryEntryPoint.kt b/features/roomdirectory/impl/src/main/kotlin/io/element/android/features/roomdirectory/impl/DefaultRoomDirectoryEntryPoint.kt index 6716bbbf97..a2f8921f66 100644 --- a/features/roomdirectory/impl/src/main/kotlin/io/element/android/features/roomdirectory/impl/DefaultRoomDirectoryEntryPoint.kt +++ b/features/roomdirectory/impl/src/main/kotlin/io/element/android/features/roomdirectory/impl/DefaultRoomDirectoryEntryPoint.kt @@ -9,7 +9,6 @@ package io.element.android.features.roomdirectory.impl 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.AppScope import dev.zacsweers.metro.ContributesBinding import io.element.android.features.roomdirectory.api.RoomDirectoryEntryPoint @@ -18,18 +17,7 @@ import io.element.android.libraries.architecture.createNode @ContributesBinding(AppScope::class) class DefaultRoomDirectoryEntryPoint : RoomDirectoryEntryPoint { - override fun nodeBuilder(parentNode: Node, buildContext: BuildContext): RoomDirectoryEntryPoint.NodeBuilder { - val plugins = ArrayList() - - return object : RoomDirectoryEntryPoint.NodeBuilder { - override fun callback(callback: RoomDirectoryEntryPoint.Callback): RoomDirectoryEntryPoint.NodeBuilder { - plugins += callback - return this - } - - override fun build(): Node { - return parentNode.createNode(buildContext, plugins) - } - } + override fun createNode(parentNode: Node, buildContext: BuildContext, callback: RoomDirectoryEntryPoint.Callback): Node { + return parentNode.createNode(buildContext, listOf(callback)) } } diff --git a/features/roomdirectory/impl/src/test/kotlin/io/element/android/features/roomdirectory/impl/DefaultRoomDirectoryEntryPointTest.kt b/features/roomdirectory/impl/src/test/kotlin/io/element/android/features/roomdirectory/impl/DefaultRoomDirectoryEntryPointTest.kt index 50d15b66aa..24205d6681 100644 --- a/features/roomdirectory/impl/src/test/kotlin/io/element/android/features/roomdirectory/impl/DefaultRoomDirectoryEntryPointTest.kt +++ b/features/roomdirectory/impl/src/test/kotlin/io/element/android/features/roomdirectory/impl/DefaultRoomDirectoryEntryPointTest.kt @@ -37,9 +37,11 @@ class DefaultRoomDirectoryEntryPointTest { val callback = object : RoomDirectoryEntryPoint.Callback { override fun navigateToRoom(roomDescription: RoomDescription) = lambdaError() } - val result = entryPoint.nodeBuilder(parentNode, BuildContext.root(null)) - .callback(callback) - .build() + val result = entryPoint.createNode( + parentNode = parentNode, + buildContext = BuildContext.root(null), + callback = callback, + ) assertThat(result).isInstanceOf(RoomDirectoryNode::class.java) assertThat(result.plugins).contains(callback) } diff --git a/features/securebackup/api/src/main/kotlin/io/element/android/features/securebackup/api/SecureBackupEntryPoint.kt b/features/securebackup/api/src/main/kotlin/io/element/android/features/securebackup/api/SecureBackupEntryPoint.kt index 4fb2ab00cc..8361ea5580 100644 --- a/features/securebackup/api/src/main/kotlin/io/element/android/features/securebackup/api/SecureBackupEntryPoint.kt +++ b/features/securebackup/api/src/main/kotlin/io/element/android/features/securebackup/api/SecureBackupEntryPoint.kt @@ -32,15 +32,9 @@ interface SecureBackupEntryPoint : FeatureEntryPoint { data class Params(val initialElement: InitialTarget) : NodeInputs - fun nodeBuilder(parentNode: Node, buildContext: BuildContext): NodeBuilder + fun createNode(parentNode: Node, buildContext: BuildContext, params: Params, callback: Callback): Node interface Callback : Plugin { fun onDone() } - - interface NodeBuilder { - fun params(params: Params): NodeBuilder - fun callback(callback: Callback): NodeBuilder - fun build(): Node - } } diff --git a/features/securebackup/impl/src/main/kotlin/io/element/android/features/securebackup/impl/DefaultSecureBackupEntryPoint.kt b/features/securebackup/impl/src/main/kotlin/io/element/android/features/securebackup/impl/DefaultSecureBackupEntryPoint.kt index 9e8138ca8c..b2c533b53b 100644 --- a/features/securebackup/impl/src/main/kotlin/io/element/android/features/securebackup/impl/DefaultSecureBackupEntryPoint.kt +++ b/features/securebackup/impl/src/main/kotlin/io/element/android/features/securebackup/impl/DefaultSecureBackupEntryPoint.kt @@ -9,7 +9,6 @@ package io.element.android.features.securebackup.impl 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.AppScope import dev.zacsweers.metro.ContributesBinding import io.element.android.features.securebackup.api.SecureBackupEntryPoint @@ -17,23 +16,15 @@ import io.element.android.libraries.architecture.createNode @ContributesBinding(AppScope::class) class DefaultSecureBackupEntryPoint : SecureBackupEntryPoint { - override fun nodeBuilder(parentNode: Node, buildContext: BuildContext): SecureBackupEntryPoint.NodeBuilder { - val plugins = ArrayList() - - return object : SecureBackupEntryPoint.NodeBuilder { - override fun params(params: SecureBackupEntryPoint.Params): SecureBackupEntryPoint.NodeBuilder { - plugins += params - return this - } - - override fun callback(callback: SecureBackupEntryPoint.Callback): SecureBackupEntryPoint.NodeBuilder { - plugins += callback - return this - } - - override fun build(): Node { - return parentNode.createNode(buildContext, plugins) - } - } + override fun createNode( + parentNode: Node, + buildContext: BuildContext, + params: SecureBackupEntryPoint.Params, + callback: SecureBackupEntryPoint.Callback, + ): Node { + return parentNode.createNode( + buildContext = buildContext, + plugins = listOf(params, callback) + ) } } diff --git a/features/securebackup/impl/src/test/kotlin/io/element/android/features/securebackup/impl/DefaultSecureBackupEntryPointTest.kt b/features/securebackup/impl/src/test/kotlin/io/element/android/features/securebackup/impl/DefaultSecureBackupEntryPointTest.kt index 7741b5141a..04d0030753 100644 --- a/features/securebackup/impl/src/test/kotlin/io/element/android/features/securebackup/impl/DefaultSecureBackupEntryPointTest.kt +++ b/features/securebackup/impl/src/test/kotlin/io/element/android/features/securebackup/impl/DefaultSecureBackupEntryPointTest.kt @@ -37,10 +37,12 @@ class DefaultSecureBackupEntryPointTest { override fun onDone() = lambdaError() } val params = SecureBackupEntryPoint.Params(SecureBackupEntryPoint.InitialTarget.ResetIdentity) - val result = entryPoint.nodeBuilder(parentNode, BuildContext.root(null)) - .params(params) - .callback(callback) - .build() + val result = entryPoint.createNode( + parentNode = parentNode, + buildContext = BuildContext.root(null), + params = params, + callback = callback, + ) assertThat(result).isInstanceOf(SecureBackupFlowNode::class.java) assertThat(result.plugins).contains(params) assertThat(result.plugins).contains(callback) diff --git a/features/share/api/src/main/kotlin/io/element/android/features/share/api/ShareEntryPoint.kt b/features/share/api/src/main/kotlin/io/element/android/features/share/api/ShareEntryPoint.kt index dd2889e10a..163bdf17af 100644 --- a/features/share/api/src/main/kotlin/io/element/android/features/share/api/ShareEntryPoint.kt +++ b/features/share/api/src/main/kotlin/io/element/android/features/share/api/ShareEntryPoint.kt @@ -12,21 +12,14 @@ import com.bumble.appyx.core.modality.BuildContext import com.bumble.appyx.core.node.Node import com.bumble.appyx.core.plugin.Plugin import io.element.android.libraries.architecture.FeatureEntryPoint -import io.element.android.libraries.architecture.NodeInputs import io.element.android.libraries.matrix.api.core.RoomId interface ShareEntryPoint : FeatureEntryPoint { - data class Params(val intent: Intent) : NodeInputs + data class Params(val intent: Intent) - fun nodeBuilder(parentNode: Node, buildContext: BuildContext): NodeBuilder + fun createNode(parentNode: Node, buildContext: BuildContext, params: Params, callback: Callback): Node interface Callback : Plugin { fun onDone(roomIds: List) } - - interface NodeBuilder { - fun params(params: Params): NodeBuilder - fun callback(callback: Callback): NodeBuilder - fun build(): Node - } } diff --git a/features/share/impl/src/main/kotlin/io/element/android/features/share/impl/DefaultShareEntryPoint.kt b/features/share/impl/src/main/kotlin/io/element/android/features/share/impl/DefaultShareEntryPoint.kt index 5008c5dbfb..83f4317e0d 100644 --- a/features/share/impl/src/main/kotlin/io/element/android/features/share/impl/DefaultShareEntryPoint.kt +++ b/features/share/impl/src/main/kotlin/io/element/android/features/share/impl/DefaultShareEntryPoint.kt @@ -9,7 +9,6 @@ package io.element.android.features.share.impl import com.bumble.appyx.core.modality.BuildContext import com.bumble.appyx.core.node.Node -import com.bumble.appyx.core.plugin.Plugin import dev.zacsweers.metro.ContributesBinding import io.element.android.features.share.api.ShareEntryPoint import io.element.android.libraries.architecture.createNode @@ -17,23 +16,13 @@ import io.element.android.libraries.di.SessionScope @ContributesBinding(SessionScope::class) class DefaultShareEntryPoint : ShareEntryPoint { - override fun nodeBuilder(parentNode: Node, buildContext: BuildContext): ShareEntryPoint.NodeBuilder { - val plugins = ArrayList() - - return object : ShareEntryPoint.NodeBuilder { - override fun params(params: ShareEntryPoint.Params): ShareEntryPoint.NodeBuilder { - plugins += ShareNode.Inputs(intent = params.intent) - return this - } - - override fun callback(callback: ShareEntryPoint.Callback): ShareEntryPoint.NodeBuilder { - plugins += callback - return this - } - - override fun build(): Node { - return parentNode.createNode(buildContext, plugins) - } - } + override fun createNode(parentNode: Node, buildContext: BuildContext, params: ShareEntryPoint.Params, callback: ShareEntryPoint.Callback): Node { + return parentNode.createNode( + buildContext = buildContext, + plugins = listOf( + ShareNode.Inputs(intent = params.intent), + callback, + ) + ) } } diff --git a/features/share/impl/src/main/kotlin/io/element/android/features/share/impl/ShareNode.kt b/features/share/impl/src/main/kotlin/io/element/android/features/share/impl/ShareNode.kt index c36f5cc97d..977211ca05 100644 --- a/features/share/impl/src/main/kotlin/io/element/android/features/share/impl/ShareNode.kt +++ b/features/share/impl/src/main/kotlin/io/element/android/features/share/impl/ShareNode.kt @@ -66,10 +66,12 @@ class ShareNode( } } - return roomSelectEntryPoint.nodeBuilder(this, buildContext) - .callback(callback) - .params(RoomSelectEntryPoint.Params(mode = RoomSelectMode.Share)) - .build() + return roomSelectEntryPoint.createNode( + parentNode = this, + buildContext = buildContext, + params = RoomSelectEntryPoint.Params(mode = RoomSelectMode.Share), + callback = callback, + ) } @Composable diff --git a/features/share/impl/src/test/kotlin/io/element/android/features/share/impl/DefaultShareEntryPointTest.kt b/features/share/impl/src/test/kotlin/io/element/android/features/share/impl/DefaultShareEntryPointTest.kt index 66ee853d26..f93aac53ba 100644 --- a/features/share/impl/src/test/kotlin/io/element/android/features/share/impl/DefaultShareEntryPointTest.kt +++ b/features/share/impl/src/test/kotlin/io/element/android/features/share/impl/DefaultShareEntryPointTest.kt @@ -38,9 +38,12 @@ class DefaultShareEntryPointTest { plugins = plugins, presenterFactory = { createSharePresenter() }, roomSelectEntryPoint = object : RoomSelectEntryPoint { - override fun nodeBuilder(parentNode: Node, buildContext: BuildContext): RoomSelectEntryPoint.NodeBuilder { - lambdaError() - } + override fun createNode( + parentNode: Node, + buildContext: BuildContext, + params: RoomSelectEntryPoint.Params, + callback: RoomSelectEntryPoint.Callback, + ) = lambdaError() }, ) } @@ -50,10 +53,12 @@ class DefaultShareEntryPointTest { val params = ShareEntryPoint.Params( intent = Intent(), ) - val result = entryPoint.nodeBuilder(parentNode, BuildContext.root(null)) - .params(params) - .callback(callback) - .build() + val result = entryPoint.createNode( + parentNode = parentNode, + buildContext = BuildContext.root(null), + params = params, + callback = callback, + ) assertThat(result).isInstanceOf(ShareNode::class.java) assertThat(result.plugins).contains(ShareNode.Inputs(params.intent)) assertThat(result.plugins).contains(callback) diff --git a/features/signedout/api/src/main/kotlin/io/element/android/features/signedout/api/SignedOutEntryPoint.kt b/features/signedout/api/src/main/kotlin/io/element/android/features/signedout/api/SignedOutEntryPoint.kt index 9651327dc5..12824bb12f 100644 --- a/features/signedout/api/src/main/kotlin/io/element/android/features/signedout/api/SignedOutEntryPoint.kt +++ b/features/signedout/api/src/main/kotlin/io/element/android/features/signedout/api/SignedOutEntryPoint.kt @@ -17,10 +17,5 @@ interface SignedOutEntryPoint : FeatureEntryPoint { val sessionId: SessionId, ) - fun nodeBuilder(parentNode: Node, buildContext: BuildContext): NodeBuilder - - interface NodeBuilder { - fun params(params: Params): NodeBuilder - fun build(): Node - } + fun createNode(parentNode: Node, buildContext: BuildContext, params: Params): Node } diff --git a/features/signedout/impl/src/main/kotlin/io/element/android/features/signedout/impl/DefaultSignedOutEntryPoint.kt b/features/signedout/impl/src/main/kotlin/io/element/android/features/signedout/impl/DefaultSignedOutEntryPoint.kt index 3bbaebb9b1..8f89a8a0f9 100644 --- a/features/signedout/impl/src/main/kotlin/io/element/android/features/signedout/impl/DefaultSignedOutEntryPoint.kt +++ b/features/signedout/impl/src/main/kotlin/io/element/android/features/signedout/impl/DefaultSignedOutEntryPoint.kt @@ -9,7 +9,6 @@ package io.element.android.features.signedout.impl 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.AppScope import dev.zacsweers.metro.ContributesBinding import io.element.android.features.signedout.api.SignedOutEntryPoint @@ -17,18 +16,10 @@ import io.element.android.libraries.architecture.createNode @ContributesBinding(AppScope::class) class DefaultSignedOutEntryPoint : SignedOutEntryPoint { - override fun nodeBuilder(parentNode: Node, buildContext: BuildContext): SignedOutEntryPoint.NodeBuilder { - val plugins = ArrayList() - - return object : SignedOutEntryPoint.NodeBuilder { - override fun params(params: SignedOutEntryPoint.Params): SignedOutEntryPoint.NodeBuilder { - plugins += SignedOutNode.Inputs(params.sessionId) - return this - } - - override fun build(): Node { - return parentNode.createNode(buildContext, plugins) - } - } + override fun createNode(parentNode: Node, buildContext: BuildContext, params: SignedOutEntryPoint.Params): Node { + return parentNode.createNode( + buildContext = buildContext, + plugins = listOf(SignedOutNode.Inputs(params.sessionId)) + ) } } diff --git a/features/signedout/impl/src/test/kotlin/io/element/android/features/signedout/impl/DefaultSignedOutEntryPointTest.kt b/features/signedout/impl/src/test/kotlin/io/element/android/features/signedout/impl/DefaultSignedOutEntryPointTest.kt index 6366ba5ea1..64c48d9a5f 100644 --- a/features/signedout/impl/src/test/kotlin/io/element/android/features/signedout/impl/DefaultSignedOutEntryPointTest.kt +++ b/features/signedout/impl/src/test/kotlin/io/element/android/features/signedout/impl/DefaultSignedOutEntryPointTest.kt @@ -34,9 +34,11 @@ class DefaultSignedOutEntryPointTest { ) } val params = SignedOutEntryPoint.Params(A_SESSION_ID) - val result = entryPoint.nodeBuilder(parentNode, BuildContext.root(null)) - .params(params) - .build() + val result = entryPoint.createNode( + parentNode = parentNode, + buildContext = BuildContext.root(null), + params = params, + ) assertThat(result).isInstanceOf(SignedOutNode::class.java) assertThat(result.plugins).contains(SignedOutNode.Inputs(params.sessionId)) } diff --git a/features/space/api/src/main/kotlin/io/element/android/features/space/api/SpaceEntryPoint.kt b/features/space/api/src/main/kotlin/io/element/android/features/space/api/SpaceEntryPoint.kt index e939a75d15..6b5bd7f892 100644 --- a/features/space/api/src/main/kotlin/io/element/android/features/space/api/SpaceEntryPoint.kt +++ b/features/space/api/src/main/kotlin/io/element/android/features/space/api/SpaceEntryPoint.kt @@ -15,16 +15,12 @@ import io.element.android.libraries.architecture.NodeInputs import io.element.android.libraries.matrix.api.core.RoomId interface SpaceEntryPoint : FeatureEntryPoint { - fun nodeBuilder( + fun createNode( parentNode: Node, buildContext: BuildContext, - ): NodeBuilder - - interface NodeBuilder { - fun inputs(inputs: Inputs): NodeBuilder - fun callback(callback: Callback): NodeBuilder - fun build(): Node - } + inputs: Inputs, + callback: Callback + ): Node data class Inputs( val roomId: RoomId diff --git a/features/space/impl/src/main/kotlin/io/element/android/features/space/impl/DefaultSpaceEntryPoint.kt b/features/space/impl/src/main/kotlin/io/element/android/features/space/impl/DefaultSpaceEntryPoint.kt index 5bcf2cf801..e68bbc89db 100644 --- a/features/space/impl/src/main/kotlin/io/element/android/features/space/impl/DefaultSpaceEntryPoint.kt +++ b/features/space/impl/src/main/kotlin/io/element/android/features/space/impl/DefaultSpaceEntryPoint.kt @@ -9,7 +9,6 @@ package io.element.android.features.space.impl 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.ContributesBinding import io.element.android.features.space.api.SpaceEntryPoint import io.element.android.libraries.architecture.createNode @@ -17,22 +16,10 @@ import io.element.android.libraries.di.SessionScope @ContributesBinding(SessionScope::class) class DefaultSpaceEntryPoint : SpaceEntryPoint { - override fun nodeBuilder(parentNode: Node, buildContext: BuildContext): SpaceEntryPoint.NodeBuilder { - val plugins = mutableSetOf() - return object : SpaceEntryPoint.NodeBuilder { - override fun inputs(inputs: SpaceEntryPoint.Inputs): SpaceEntryPoint.NodeBuilder { - plugins.add(inputs) - return this - } - - override fun callback(callback: SpaceEntryPoint.Callback): SpaceEntryPoint.NodeBuilder { - plugins.add(callback) - return this - } - - override fun build(): Node { - return parentNode.createNode(buildContext, plugins = plugins.toList()) - } - } + override fun createNode(parentNode: Node, buildContext: BuildContext, inputs: SpaceEntryPoint.Inputs, callback: SpaceEntryPoint.Callback): Node { + return parentNode.createNode( + buildContext = buildContext, + plugins = listOf(inputs, callback), + ) } } diff --git a/features/space/impl/src/test/kotlin/io/element/android/features/space/impl/DefaultSpaceEntryPointTest.kt b/features/space/impl/src/test/kotlin/io/element/android/features/space/impl/DefaultSpaceEntryPointTest.kt index 3cf6e398f2..3fd260dd4f 100644 --- a/features/space/impl/src/test/kotlin/io/element/android/features/space/impl/DefaultSpaceEntryPointTest.kt +++ b/features/space/impl/src/test/kotlin/io/element/android/features/space/impl/DefaultSpaceEntryPointTest.kt @@ -48,10 +48,12 @@ class DefaultSpaceEntryPointTest { override fun navigateToRoomDetails() = lambdaError() override fun navigateToRoomMemberList() = lambdaError() } - val result = entryPoint.nodeBuilder(parentNode, BuildContext.root(null)) - .inputs(nodeInputs) - .callback(callback) - .build() + val result = entryPoint.createNode( + parentNode = parentNode, + buildContext = BuildContext.root(null), + inputs = nodeInputs, + callback = callback, + ) assertThat(result).isInstanceOf(SpaceFlowNode::class.java) assertThat(result.plugins).contains(nodeInputs) assertThat(result.plugins).contains(callback) diff --git a/features/startchat/api/src/main/kotlin/io/element/android/features/startchat/api/StartChatEntryPoint.kt b/features/startchat/api/src/main/kotlin/io/element/android/features/startchat/api/StartChatEntryPoint.kt index ca200bed1a..0e530b3943 100644 --- a/features/startchat/api/src/main/kotlin/io/element/android/features/startchat/api/StartChatEntryPoint.kt +++ b/features/startchat/api/src/main/kotlin/io/element/android/features/startchat/api/StartChatEntryPoint.kt @@ -14,11 +14,7 @@ import io.element.android.libraries.architecture.FeatureEntryPoint import io.element.android.libraries.matrix.api.core.RoomIdOrAlias interface StartChatEntryPoint : FeatureEntryPoint { - fun nodeBuilder(parentNode: Node, buildContext: BuildContext): NodeBuilder - interface NodeBuilder { - fun callback(callback: Callback): NodeBuilder - fun build(): Node - } + fun createNode(parentNode: Node, buildContext: BuildContext, callback: Callback): Node interface Callback : Plugin { fun onRoomCreated(roomIdOrAlias: RoomIdOrAlias, serverNames: List) diff --git a/features/startchat/impl/src/main/kotlin/io/element/android/features/startchat/impl/DefaultStartChatEntryPoint.kt b/features/startchat/impl/src/main/kotlin/io/element/android/features/startchat/impl/DefaultStartChatEntryPoint.kt index 801d5e0466..18df585fa0 100644 --- a/features/startchat/impl/src/main/kotlin/io/element/android/features/startchat/impl/DefaultStartChatEntryPoint.kt +++ b/features/startchat/impl/src/main/kotlin/io/element/android/features/startchat/impl/DefaultStartChatEntryPoint.kt @@ -9,7 +9,6 @@ package io.element.android.features.startchat.impl import com.bumble.appyx.core.modality.BuildContext import com.bumble.appyx.core.node.Node -import com.bumble.appyx.core.plugin.Plugin import dev.zacsweers.metro.AppScope import dev.zacsweers.metro.ContributesBinding import io.element.android.features.startchat.api.StartChatEntryPoint @@ -17,18 +16,7 @@ import io.element.android.libraries.architecture.createNode @ContributesBinding(AppScope::class) class DefaultStartChatEntryPoint : StartChatEntryPoint { - override fun nodeBuilder(parentNode: Node, buildContext: BuildContext): StartChatEntryPoint.NodeBuilder { - val plugins = ArrayList() - - return object : StartChatEntryPoint.NodeBuilder { - override fun callback(callback: StartChatEntryPoint.Callback): StartChatEntryPoint.NodeBuilder { - plugins += callback - return this - } - - override fun build(): Node { - return parentNode.createNode(buildContext, plugins) - } - } + override fun createNode(parentNode: Node, buildContext: BuildContext, callback: StartChatEntryPoint.Callback): Node { + return parentNode.createNode(buildContext, listOf(callback)) } } diff --git a/features/startchat/impl/src/main/kotlin/io/element/android/features/startchat/impl/StartChatFlowNode.kt b/features/startchat/impl/src/main/kotlin/io/element/android/features/startchat/impl/StartChatFlowNode.kt index 55ff1d46f9..ee30f4997c 100644 --- a/features/startchat/impl/src/main/kotlin/io/element/android/features/startchat/impl/StartChatFlowNode.kt +++ b/features/startchat/impl/src/main/kotlin/io/element/android/features/startchat/impl/StartChatFlowNode.kt @@ -79,9 +79,11 @@ class StartChatFlowNode( navigator.onRoomCreated(roomId.toRoomIdOrAlias(), emptyList()) } } - createRoomEntryPoint.nodeBuilder(parentNode = this, buildContext = buildContext) - .callback(callback) - .build() + createRoomEntryPoint.createNode( + parentNode = this, + buildContext = buildContext, + callback = callback, + ) } NavTarget.JoinByAddress -> { createNode(buildContext = buildContext, plugins = listOf(navigator)) diff --git a/features/startchat/impl/src/test/kotlin/io/element/android/features/startchat/impl/DefaultStartChatEntryPointTest.kt b/features/startchat/impl/src/test/kotlin/io/element/android/features/startchat/impl/DefaultStartChatEntryPointTest.kt index 6da424c01a..2ead91b31c 100644 --- a/features/startchat/impl/src/test/kotlin/io/element/android/features/startchat/impl/DefaultStartChatEntryPointTest.kt +++ b/features/startchat/impl/src/test/kotlin/io/element/android/features/startchat/impl/DefaultStartChatEntryPointTest.kt @@ -35,7 +35,11 @@ class DefaultStartChatEntryPointTest { buildContext = buildContext, plugins = plugins, createRoomEntryPoint = object : CreateRoomEntryPoint { - override fun nodeBuilder(parentNode: Node, buildContext: BuildContext) = lambdaError() + override fun createNode( + parentNode: Node, + buildContext: BuildContext, + callback: CreateRoomEntryPoint.Callback, + ) = lambdaError() }, ) } @@ -43,9 +47,11 @@ class DefaultStartChatEntryPointTest { override fun onRoomCreated(roomIdOrAlias: RoomIdOrAlias, serverNames: List) = lambdaError() override fun navigateToRoomDirectory() = lambdaError() } - val result = entryPoint.nodeBuilder(parentNode, BuildContext.root(null)) - .callback(callback) - .build() + val result = entryPoint.createNode( + parentNode = parentNode, + buildContext = BuildContext.root(null), + callback = callback, + ) assertThat(result).isInstanceOf(StartChatFlowNode::class.java) assertThat(result.plugins).contains(callback) } diff --git a/features/userprofile/api/src/main/kotlin/io/element/android/features/userprofile/api/UserProfileEntryPoint.kt b/features/userprofile/api/src/main/kotlin/io/element/android/features/userprofile/api/UserProfileEntryPoint.kt index 20f4a10955..4053efea0d 100644 --- a/features/userprofile/api/src/main/kotlin/io/element/android/features/userprofile/api/UserProfileEntryPoint.kt +++ b/features/userprofile/api/src/main/kotlin/io/element/android/features/userprofile/api/UserProfileEntryPoint.kt @@ -22,11 +22,5 @@ interface UserProfileEntryPoint : FeatureEntryPoint { fun navigateToRoom(roomId: RoomId) } - interface NodeBuilder { - fun params(params: Params): NodeBuilder - fun callback(callback: Callback): NodeBuilder - fun build(): Node - } - - fun nodeBuilder(parentNode: Node, buildContext: BuildContext): NodeBuilder + fun createNode(parentNode: Node, buildContext: BuildContext, params: Params, callback: Callback): Node } diff --git a/features/userprofile/impl/src/main/kotlin/io/element/android/features/userprofile/impl/DefaultUserProfileEntryPoint.kt b/features/userprofile/impl/src/main/kotlin/io/element/android/features/userprofile/impl/DefaultUserProfileEntryPoint.kt index 84f1b728e6..e69ef185c0 100644 --- a/features/userprofile/impl/src/main/kotlin/io/element/android/features/userprofile/impl/DefaultUserProfileEntryPoint.kt +++ b/features/userprofile/impl/src/main/kotlin/io/element/android/features/userprofile/impl/DefaultUserProfileEntryPoint.kt @@ -9,7 +9,6 @@ package io.element.android.features.userprofile.impl 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.AppScope import dev.zacsweers.metro.ContributesBinding import io.element.android.features.userprofile.api.UserProfileEntryPoint @@ -17,23 +16,15 @@ import io.element.android.libraries.architecture.createNode @ContributesBinding(AppScope::class) class DefaultUserProfileEntryPoint : UserProfileEntryPoint { - override fun nodeBuilder(parentNode: Node, buildContext: BuildContext): UserProfileEntryPoint.NodeBuilder { - return object : UserProfileEntryPoint.NodeBuilder { - val plugins = ArrayList() - - override fun params(params: UserProfileEntryPoint.Params): UserProfileEntryPoint.NodeBuilder { - plugins += params - return this - } - - override fun callback(callback: UserProfileEntryPoint.Callback): UserProfileEntryPoint.NodeBuilder { - plugins += callback - return this - } - - override fun build(): Node { - return parentNode.createNode(buildContext, plugins) - } - } + override fun createNode( + parentNode: Node, + buildContext: BuildContext, + params: UserProfileEntryPoint.Params, + callback: UserProfileEntryPoint.Callback, + ): Node { + return parentNode.createNode( + buildContext = buildContext, + plugins = listOf(params, callback), + ) } } diff --git a/features/userprofile/impl/src/main/kotlin/io/element/android/features/userprofile/impl/UserProfileFlowNode.kt b/features/userprofile/impl/src/main/kotlin/io/element/android/features/userprofile/impl/UserProfileFlowNode.kt index 45b1e95f14..fd019c3587 100644 --- a/features/userprofile/impl/src/main/kotlin/io/element/android/features/userprofile/impl/UserProfileFlowNode.kt +++ b/features/userprofile/impl/src/main/kotlin/io/element/android/features/userprofile/impl/UserProfileFlowNode.kt @@ -107,22 +107,40 @@ class UserProfileFlowNode( // Cannot happen } } - mediaViewerEntryPoint.nodeBuilder(this, buildContext) - .avatar( - filename = navTarget.name, - avatarUrl = navTarget.avatarUrl - ) - .callback(callback) - .build() + val params = mediaViewerEntryPoint.createParamsForAvatar( + filename = navTarget.name, + avatarUrl = navTarget.avatarUrl, + ) + mediaViewerEntryPoint.createNode( + parentNode = this, + buildContext = buildContext, + params = params, + callback = callback, + ) } is NavTarget.VerifyUser -> { val params = OutgoingVerificationEntryPoint.Params( showDeviceVerifiedScreen = false, verificationRequest = VerificationRequest.Outgoing.User(userId = navTarget.userId) ) - outgoingVerificationEntryPoint.nodeBuilder(this, buildContext) - .params(params) - .build() + outgoingVerificationEntryPoint.createNode( + parentNode = this, + buildContext = buildContext, + params = params, + callback = object : OutgoingVerificationEntryPoint.Callback { + override fun navigateToLearnMoreAboutEncryption() { + // No op + } + + override fun onBack() { + // No op + } + + override fun onDone() { + // No op + } + } + ) } } } diff --git a/features/userprofile/impl/src/test/kotlin/io/element/android/features/userprofile/impl/DefaultUserProfileEntryPointTest.kt b/features/userprofile/impl/src/test/kotlin/io/element/android/features/userprofile/impl/DefaultUserProfileEntryPointTest.kt index 493b9045cc..486f72f672 100644 --- a/features/userprofile/impl/src/test/kotlin/io/element/android/features/userprofile/impl/DefaultUserProfileEntryPointTest.kt +++ b/features/userprofile/impl/src/test/kotlin/io/element/android/features/userprofile/impl/DefaultUserProfileEntryPointTest.kt @@ -59,10 +59,21 @@ class DefaultUserProfileEntryPointTest { ) = lambdaError() }, mediaViewerEntryPoint = object : MediaViewerEntryPoint { - override fun nodeBuilder(parentNode: Node, buildContext: BuildContext) = lambdaError() + override fun createParamsForAvatar(filename: String, avatarUrl: String) = lambdaError() + override fun createNode( + parentNode: Node, + buildContext: BuildContext, + params: MediaViewerEntryPoint.Params, + callback: MediaViewerEntryPoint.Callback + ) = lambdaError() }, outgoingVerificationEntryPoint = object : OutgoingVerificationEntryPoint { - override fun nodeBuilder(parentNode: Node, buildContext: BuildContext) = lambdaError() + override fun createNode( + parentNode: Node, + buildContext: BuildContext, + params: OutgoingVerificationEntryPoint.Params, + callback: OutgoingVerificationEntryPoint.Callback, + ) = lambdaError() }, ) } @@ -74,10 +85,12 @@ class DefaultUserProfileEntryPointTest { val params = UserProfileEntryPoint.Params( userId = A_USER_ID, ) - val result = entryPoint.nodeBuilder(parentNode, BuildContext.root(null)) - .params(params) - .callback(callback) - .build() + val result = entryPoint.createNode( + parentNode = parentNode, + buildContext = BuildContext.root(null), + params = params, + callback = callback, + ) assertThat(result).isInstanceOf(UserProfileFlowNode::class.java) assertThat(result.plugins).contains(params) assertThat(result.plugins).contains(callback) diff --git a/features/verifysession/api/src/main/kotlin/io/element/android/features/verifysession/api/IncomingVerificationEntryPoint.kt b/features/verifysession/api/src/main/kotlin/io/element/android/features/verifysession/api/IncomingVerificationEntryPoint.kt index 9d90f33e8d..c72f7d4f6b 100644 --- a/features/verifysession/api/src/main/kotlin/io/element/android/features/verifysession/api/IncomingVerificationEntryPoint.kt +++ b/features/verifysession/api/src/main/kotlin/io/element/android/features/verifysession/api/IncomingVerificationEntryPoint.kt @@ -19,13 +19,7 @@ interface IncomingVerificationEntryPoint : FeatureEntryPoint { val verificationRequest: VerificationRequest.Incoming, ) : NodeInputs - fun nodeBuilder(parentNode: Node, buildContext: BuildContext): NodeBuilder - - interface NodeBuilder { - fun callback(callback: Callback): NodeBuilder - fun params(params: Params): NodeBuilder - fun build(): Node - } + fun createNode(parentNode: Node, buildContext: BuildContext, params: Params, callback: Callback): Node interface Callback : Plugin { fun onDone() diff --git a/features/verifysession/api/src/main/kotlin/io/element/android/features/verifysession/api/OutgoingVerificationEntryPoint.kt b/features/verifysession/api/src/main/kotlin/io/element/android/features/verifysession/api/OutgoingVerificationEntryPoint.kt index 0d4fe76156..36a04b43c7 100644 --- a/features/verifysession/api/src/main/kotlin/io/element/android/features/verifysession/api/OutgoingVerificationEntryPoint.kt +++ b/features/verifysession/api/src/main/kotlin/io/element/android/features/verifysession/api/OutgoingVerificationEntryPoint.kt @@ -20,13 +20,7 @@ interface OutgoingVerificationEntryPoint : FeatureEntryPoint { val verificationRequest: VerificationRequest.Outgoing, ) : NodeInputs - fun nodeBuilder(parentNode: Node, buildContext: BuildContext): NodeBuilder - - interface NodeBuilder { - fun callback(callback: Callback): NodeBuilder - fun params(params: Params): NodeBuilder - fun build(): Node - } + fun createNode(parentNode: Node, buildContext: BuildContext, params: Params, callback: Callback): Node interface Callback : Plugin { fun navigateToLearnMoreAboutEncryption() diff --git a/features/verifysession/impl/src/main/kotlin/io/element/android/features/verifysession/impl/incoming/DefaultIncomingVerificationEntryPoint.kt b/features/verifysession/impl/src/main/kotlin/io/element/android/features/verifysession/impl/incoming/DefaultIncomingVerificationEntryPoint.kt index b1d890b9ef..9d6d91c79a 100644 --- a/features/verifysession/impl/src/main/kotlin/io/element/android/features/verifysession/impl/incoming/DefaultIncomingVerificationEntryPoint.kt +++ b/features/verifysession/impl/src/main/kotlin/io/element/android/features/verifysession/impl/incoming/DefaultIncomingVerificationEntryPoint.kt @@ -9,7 +9,6 @@ package io.element.android.features.verifysession.impl.incoming 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.AppScope import dev.zacsweers.metro.ContributesBinding import io.element.android.features.verifysession.api.IncomingVerificationEntryPoint @@ -17,23 +16,12 @@ import io.element.android.libraries.architecture.createNode @ContributesBinding(AppScope::class) class DefaultIncomingVerificationEntryPoint : IncomingVerificationEntryPoint { - override fun nodeBuilder(parentNode: Node, buildContext: BuildContext): IncomingVerificationEntryPoint.NodeBuilder { - val plugins = ArrayList() - - return object : IncomingVerificationEntryPoint.NodeBuilder { - override fun callback(callback: IncomingVerificationEntryPoint.Callback): IncomingVerificationEntryPoint.NodeBuilder { - plugins += callback - return this - } - - override fun params(params: IncomingVerificationEntryPoint.Params): IncomingVerificationEntryPoint.NodeBuilder { - plugins += params - return this - } - - override fun build(): Node { - return parentNode.createNode(buildContext, plugins) - } - } + override fun createNode( + parentNode: Node, + buildContext: BuildContext, + params: IncomingVerificationEntryPoint.Params, + callback: IncomingVerificationEntryPoint.Callback, + ): Node { + return parentNode.createNode(buildContext, listOf(params, callback)) } } diff --git a/features/verifysession/impl/src/main/kotlin/io/element/android/features/verifysession/impl/outgoing/DefaultOutgoingVerificationEntryPoint.kt b/features/verifysession/impl/src/main/kotlin/io/element/android/features/verifysession/impl/outgoing/DefaultOutgoingVerificationEntryPoint.kt index a6b587308a..3328b1df1e 100644 --- a/features/verifysession/impl/src/main/kotlin/io/element/android/features/verifysession/impl/outgoing/DefaultOutgoingVerificationEntryPoint.kt +++ b/features/verifysession/impl/src/main/kotlin/io/element/android/features/verifysession/impl/outgoing/DefaultOutgoingVerificationEntryPoint.kt @@ -9,7 +9,6 @@ package io.element.android.features.verifysession.impl.outgoing 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.AppScope import dev.zacsweers.metro.ContributesBinding import io.element.android.features.verifysession.api.OutgoingVerificationEntryPoint @@ -17,23 +16,12 @@ import io.element.android.libraries.architecture.createNode @ContributesBinding(AppScope::class) class DefaultOutgoingVerificationEntryPoint : OutgoingVerificationEntryPoint { - override fun nodeBuilder(parentNode: Node, buildContext: BuildContext): OutgoingVerificationEntryPoint.NodeBuilder { - val plugins = ArrayList() - - return object : OutgoingVerificationEntryPoint.NodeBuilder { - override fun callback(callback: OutgoingVerificationEntryPoint.Callback): OutgoingVerificationEntryPoint.NodeBuilder { - plugins += callback - return this - } - - override fun params(params: OutgoingVerificationEntryPoint.Params): OutgoingVerificationEntryPoint.NodeBuilder { - plugins += params - return this - } - - override fun build(): Node { - return parentNode.createNode(buildContext, plugins) - } - } + override fun createNode( + parentNode: Node, + buildContext: BuildContext, + params: OutgoingVerificationEntryPoint.Params, + callback: OutgoingVerificationEntryPoint.Callback, + ): Node { + return parentNode.createNode(buildContext, listOf(params, callback)) } } diff --git a/features/verifysession/impl/src/test/kotlin/io/element/android/features/verifysession/impl/incoming/DefaultIncomingVerificationEntryPointTest.kt b/features/verifysession/impl/src/test/kotlin/io/element/android/features/verifysession/impl/incoming/DefaultIncomingVerificationEntryPointTest.kt index ad586fc7fb..437657b811 100644 --- a/features/verifysession/impl/src/test/kotlin/io/element/android/features/verifysession/impl/incoming/DefaultIncomingVerificationEntryPointTest.kt +++ b/features/verifysession/impl/src/test/kotlin/io/element/android/features/verifysession/impl/incoming/DefaultIncomingVerificationEntryPointTest.kt @@ -37,10 +37,12 @@ class DefaultIncomingVerificationEntryPointTest { val params = IncomingVerificationEntryPoint.Params( verificationRequest = anIncomingSessionVerificationRequest() ) - val result = entryPoint.nodeBuilder(parentNode, BuildContext.root(null)) - .params(params) - .callback(callback) - .build() + val result = entryPoint.createNode( + parentNode = parentNode, + buildContext = BuildContext.root(null), + params = params, + callback = callback, + ) assertThat(result).isInstanceOf(IncomingVerificationNode::class.java) assertThat(result.plugins).contains(params) assertThat(result.plugins).contains(callback) diff --git a/features/verifysession/impl/src/test/kotlin/io/element/android/features/verifysession/impl/outgoing/DefaultOutgoingVerificationEntryPointTest.kt b/features/verifysession/impl/src/test/kotlin/io/element/android/features/verifysession/impl/outgoing/DefaultOutgoingVerificationEntryPointTest.kt index 7e152383f9..80906bc86a 100644 --- a/features/verifysession/impl/src/test/kotlin/io/element/android/features/verifysession/impl/outgoing/DefaultOutgoingVerificationEntryPointTest.kt +++ b/features/verifysession/impl/src/test/kotlin/io/element/android/features/verifysession/impl/outgoing/DefaultOutgoingVerificationEntryPointTest.kt @@ -42,10 +42,12 @@ class DefaultOutgoingVerificationEntryPointTest { showDeviceVerifiedScreen = true, verificationRequest = anOutgoingSessionVerificationRequest(), ) - val result = entryPoint.nodeBuilder(parentNode, BuildContext.root(null)) - .params(params) - .callback(callback) - .build() + val result = entryPoint.createNode( + parentNode = parentNode, + buildContext = BuildContext.root(null), + params = params, + callback = callback, + ) assertThat(result).isInstanceOf(OutgoingVerificationNode::class.java) assertThat(result.plugins).contains(params) assertThat(result.plugins).contains(callback) diff --git a/features/viewfolder/api/src/main/kotlin/io/element/android/features/viewfolder/api/ViewFolderEntryPoint.kt b/features/viewfolder/api/src/main/kotlin/io/element/android/features/viewfolder/api/ViewFolderEntryPoint.kt index e7f6f580a7..1778ad0fc0 100644 --- a/features/viewfolder/api/src/main/kotlin/io/element/android/features/viewfolder/api/ViewFolderEntryPoint.kt +++ b/features/viewfolder/api/src/main/kotlin/io/element/android/features/viewfolder/api/ViewFolderEntryPoint.kt @@ -17,13 +17,7 @@ interface ViewFolderEntryPoint : FeatureEntryPoint { val rootPath: String, ) - fun nodeBuilder(parentNode: Node, buildContext: BuildContext): NodeBuilder - - interface NodeBuilder { - fun params(params: Params): NodeBuilder - fun callback(callback: Callback): NodeBuilder - fun build(): Node - } + fun createNode(parentNode: Node, buildContext: BuildContext, params: Params, callback: Callback): Node interface Callback : Plugin { fun onDone() diff --git a/features/viewfolder/impl/src/main/kotlin/io/element/android/features/viewfolder/impl/DefaultViewFolderEntryPoint.kt b/features/viewfolder/impl/src/main/kotlin/io/element/android/features/viewfolder/impl/DefaultViewFolderEntryPoint.kt index 2aa341d5b4..d1d7af9117 100644 --- a/features/viewfolder/impl/src/main/kotlin/io/element/android/features/viewfolder/impl/DefaultViewFolderEntryPoint.kt +++ b/features/viewfolder/impl/src/main/kotlin/io/element/android/features/viewfolder/impl/DefaultViewFolderEntryPoint.kt @@ -9,7 +9,6 @@ package io.element.android.features.viewfolder.impl 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.AppScope import dev.zacsweers.metro.ContributesBinding import io.element.android.features.viewfolder.api.ViewFolderEntryPoint @@ -18,23 +17,13 @@ import io.element.android.libraries.architecture.createNode @ContributesBinding(AppScope::class) class DefaultViewFolderEntryPoint : ViewFolderEntryPoint { - override fun nodeBuilder(parentNode: Node, buildContext: BuildContext): ViewFolderEntryPoint.NodeBuilder { - val plugins = ArrayList() - - return object : ViewFolderEntryPoint.NodeBuilder { - override fun params(params: ViewFolderEntryPoint.Params): ViewFolderEntryPoint.NodeBuilder { - plugins += ViewFolderFlowNode.Inputs(params.rootPath) - return this - } - - override fun callback(callback: ViewFolderEntryPoint.Callback): ViewFolderEntryPoint.NodeBuilder { - plugins += callback - return this - } - - override fun build(): Node { - return parentNode.createNode(buildContext, plugins) - } - } + override fun createNode(parentNode: Node, buildContext: BuildContext, params: ViewFolderEntryPoint.Params, callback: ViewFolderEntryPoint.Callback): Node { + return parentNode.createNode( + buildContext = buildContext, + plugins = listOf( + ViewFolderFlowNode.Inputs(params.rootPath), + callback, + ), + ) } } diff --git a/features/viewfolder/impl/src/test/kotlin/io/element/android/features/viewfolder/impl/DefaultViewFolderEntryPointTest.kt b/features/viewfolder/impl/src/test/kotlin/io/element/android/features/viewfolder/impl/DefaultViewFolderEntryPointTest.kt index 47d5992d8c..a8e643e1f5 100644 --- a/features/viewfolder/impl/src/test/kotlin/io/element/android/features/viewfolder/impl/DefaultViewFolderEntryPointTest.kt +++ b/features/viewfolder/impl/src/test/kotlin/io/element/android/features/viewfolder/impl/DefaultViewFolderEntryPointTest.kt @@ -40,10 +40,12 @@ class DefaultViewFolderEntryPointTest { val params = ViewFolderEntryPoint.Params( rootPath = "path", ) - val result = entryPoint.nodeBuilder(parentNode, BuildContext.root(null)) - .params(params) - .callback(callback) - .build() + val result = entryPoint.createNode( + parentNode = parentNode, + buildContext = BuildContext.root(null), + params = params, + callback = callback, + ) assertThat(result).isInstanceOf(ViewFolderFlowNode::class.java) assertThat(result.plugins).contains(ViewFolderFlowNode.Inputs(params.rootPath)) assertThat(result.plugins).contains(callback) diff --git a/libraries/accountselect/api/src/main/kotlin/io/element/android/libraries/accountselect/api/AccountSelectEntryPoint.kt b/libraries/accountselect/api/src/main/kotlin/io/element/android/libraries/accountselect/api/AccountSelectEntryPoint.kt index 112293eb6a..8ce2023655 100644 --- a/libraries/accountselect/api/src/main/kotlin/io/element/android/libraries/accountselect/api/AccountSelectEntryPoint.kt +++ b/libraries/accountselect/api/src/main/kotlin/io/element/android/libraries/accountselect/api/AccountSelectEntryPoint.kt @@ -14,12 +14,7 @@ import io.element.android.libraries.architecture.FeatureEntryPoint import io.element.android.libraries.matrix.api.core.SessionId interface AccountSelectEntryPoint : FeatureEntryPoint { - fun nodeBuilder(parentNode: Node, buildContext: BuildContext): NodeBuilder - - interface NodeBuilder { - fun callback(callback: Callback): NodeBuilder - fun build(): Node - } + fun createNode(parentNode: Node, buildContext: BuildContext, callback: Callback): Node interface Callback : Plugin { fun onAccountSelected(sessionId: SessionId) diff --git a/libraries/accountselect/impl/src/main/kotlin/io/element/android/libraries/accountselect/impl/DefaultAccountSelectEntryPoint.kt b/libraries/accountselect/impl/src/main/kotlin/io/element/android/libraries/accountselect/impl/DefaultAccountSelectEntryPoint.kt index bd35d3e6f0..21e26d376b 100644 --- a/libraries/accountselect/impl/src/main/kotlin/io/element/android/libraries/accountselect/impl/DefaultAccountSelectEntryPoint.kt +++ b/libraries/accountselect/impl/src/main/kotlin/io/element/android/libraries/accountselect/impl/DefaultAccountSelectEntryPoint.kt @@ -9,7 +9,6 @@ package io.element.android.libraries.accountselect.impl 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.AppScope import dev.zacsweers.metro.ContributesBinding import io.element.android.libraries.accountselect.api.AccountSelectEntryPoint @@ -17,18 +16,7 @@ import io.element.android.libraries.architecture.createNode @ContributesBinding(AppScope::class) class DefaultAccountSelectEntryPoint : AccountSelectEntryPoint { - override fun nodeBuilder(parentNode: Node, buildContext: BuildContext): AccountSelectEntryPoint.NodeBuilder { - val plugins = ArrayList() - - return object : AccountSelectEntryPoint.NodeBuilder { - override fun callback(callback: AccountSelectEntryPoint.Callback): AccountSelectEntryPoint.NodeBuilder { - plugins += callback - return this - } - - override fun build(): Node { - return parentNode.createNode(buildContext, plugins) - } - } + override fun createNode(parentNode: Node, buildContext: BuildContext, callback: AccountSelectEntryPoint.Callback): Node { + return parentNode.createNode(buildContext, listOf(callback)) } } diff --git a/libraries/accountselect/impl/src/test/kotlin/io/element/android/libraries/accountselect/impl/DefaultAccountSelectEntryPointTest.kt b/libraries/accountselect/impl/src/test/kotlin/io/element/android/libraries/accountselect/impl/DefaultAccountSelectEntryPointTest.kt index 230248d421..b36fcb5ab8 100644 --- a/libraries/accountselect/impl/src/test/kotlin/io/element/android/libraries/accountselect/impl/DefaultAccountSelectEntryPointTest.kt +++ b/libraries/accountselect/impl/src/test/kotlin/io/element/android/libraries/accountselect/impl/DefaultAccountSelectEntryPointTest.kt @@ -35,9 +35,11 @@ class DefaultAccountSelectEntryPointTest { override fun onAccountSelected(sessionId: SessionId) = lambdaError() override fun onCancel() = lambdaError() } - val result = entryPoint.nodeBuilder(parentNode, BuildContext.root(null)) - .callback(callback) - .build() + val result = entryPoint.createNode( + parentNode = parentNode, + buildContext = BuildContext.root(null), + callback = callback, + ) assertThat(result).isInstanceOf(AccountSelectNode::class.java) assertThat(result.plugins).contains(callback) } diff --git a/libraries/mediaviewer/api/src/main/kotlin/io/element/android/libraries/mediaviewer/api/MediaGalleryEntryPoint.kt b/libraries/mediaviewer/api/src/main/kotlin/io/element/android/libraries/mediaviewer/api/MediaGalleryEntryPoint.kt index 702ce181db..b3e832da22 100644 --- a/libraries/mediaviewer/api/src/main/kotlin/io/element/android/libraries/mediaviewer/api/MediaGalleryEntryPoint.kt +++ b/libraries/mediaviewer/api/src/main/kotlin/io/element/android/libraries/mediaviewer/api/MediaGalleryEntryPoint.kt @@ -14,12 +14,7 @@ import io.element.android.libraries.architecture.FeatureEntryPoint import io.element.android.libraries.matrix.api.core.EventId interface MediaGalleryEntryPoint : FeatureEntryPoint { - fun nodeBuilder(parentNode: Node, buildContext: BuildContext): NodeBuilder - - interface NodeBuilder { - fun callback(callback: Callback): NodeBuilder - fun build(): Node - } + fun createNode(parentNode: Node, buildContext: BuildContext, callback: Callback): Node interface Callback : Plugin { fun onBackClick() diff --git a/libraries/mediaviewer/api/src/main/kotlin/io/element/android/libraries/mediaviewer/api/MediaViewerEntryPoint.kt b/libraries/mediaviewer/api/src/main/kotlin/io/element/android/libraries/mediaviewer/api/MediaViewerEntryPoint.kt index da1227d66b..2b17b63b26 100644 --- a/libraries/mediaviewer/api/src/main/kotlin/io/element/android/libraries/mediaviewer/api/MediaViewerEntryPoint.kt +++ b/libraries/mediaviewer/api/src/main/kotlin/io/element/android/libraries/mediaviewer/api/MediaViewerEntryPoint.kt @@ -19,14 +19,9 @@ import io.element.android.libraries.matrix.api.timeline.Timeline import kotlinx.parcelize.Parcelize interface MediaViewerEntryPoint : FeatureEntryPoint { - fun nodeBuilder(parentNode: Node, buildContext: BuildContext): NodeBuilder + fun createNode(parentNode: Node, buildContext: BuildContext, params: Params, callback: Callback): Node - interface NodeBuilder { - fun callback(callback: Callback): NodeBuilder - fun params(params: Params): NodeBuilder - fun avatar(filename: String, avatarUrl: String): NodeBuilder - fun build(): Node - } + fun createParamsForAvatar(filename: String, avatarUrl: String): Params interface Callback : Plugin { fun onDone() diff --git a/libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/DefaultMediaGalleryEntryPoint.kt b/libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/DefaultMediaGalleryEntryPoint.kt index 75686b637a..515c04bc20 100644 --- a/libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/DefaultMediaGalleryEntryPoint.kt +++ b/libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/DefaultMediaGalleryEntryPoint.kt @@ -9,7 +9,6 @@ package io.element.android.libraries.mediaviewer.impl 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.AppScope import dev.zacsweers.metro.ContributesBinding import io.element.android.libraries.architecture.createNode @@ -18,18 +17,10 @@ import io.element.android.libraries.mediaviewer.impl.gallery.root.MediaGalleryFl @ContributesBinding(AppScope::class) class DefaultMediaGalleryEntryPoint : MediaGalleryEntryPoint { - override fun nodeBuilder(parentNode: Node, buildContext: BuildContext): MediaGalleryEntryPoint.NodeBuilder { - val plugins = ArrayList() - - return object : MediaGalleryEntryPoint.NodeBuilder { - override fun callback(callback: MediaGalleryEntryPoint.Callback): MediaGalleryEntryPoint.NodeBuilder { - plugins += callback - return this - } - - override fun build(): Node { - return parentNode.createNode(buildContext, plugins) - } - } + override fun createNode(parentNode: Node, buildContext: BuildContext, callback: MediaGalleryEntryPoint.Callback): Node { + return parentNode.createNode( + buildContext = buildContext, + plugins = listOf(callback), + ) } } diff --git a/libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/DefaultMediaViewerEntryPoint.kt b/libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/DefaultMediaViewerEntryPoint.kt index da7c797bfb..7d683bf3df 100644 --- a/libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/DefaultMediaViewerEntryPoint.kt +++ b/libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/DefaultMediaViewerEntryPoint.kt @@ -9,7 +9,6 @@ package io.element.android.libraries.mediaviewer.impl 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.AppScope import dev.zacsweers.metro.ContributesBinding import io.element.android.libraries.architecture.createNode @@ -22,52 +21,42 @@ import io.element.android.libraries.mediaviewer.impl.viewer.MediaViewerNode @ContributesBinding(AppScope::class) class DefaultMediaViewerEntryPoint : MediaViewerEntryPoint { - override fun nodeBuilder(parentNode: Node, buildContext: BuildContext): MediaViewerEntryPoint.NodeBuilder { - val plugins = ArrayList() + override fun createParamsForAvatar(filename: String, avatarUrl: String): MediaViewerEntryPoint.Params { + // We need to fake the MimeType here for the viewer to work. + val mimeType = MimeTypes.Images + return MediaViewerEntryPoint.Params( + mode = MediaViewerEntryPoint.MediaViewerMode.SingleMedia, + eventId = null, + mediaInfo = MediaInfo( + filename = filename, + fileSize = null, + caption = null, + mimeType = mimeType, + formattedFileSize = "", + fileExtension = "", + senderId = UserId("@dummy:server.org"), + senderName = null, + senderAvatar = null, + dateSent = null, + dateSentFull = null, + waveform = null, + duration = null, + ), + mediaSource = MediaSource(url = avatarUrl), + thumbnailSource = null, + canShowInfo = false, + ) + } - return object : MediaViewerEntryPoint.NodeBuilder { - override fun callback(callback: MediaViewerEntryPoint.Callback): MediaViewerEntryPoint.NodeBuilder { - plugins += callback - return this - } - - override fun params(params: MediaViewerEntryPoint.Params): MediaViewerEntryPoint.NodeBuilder { - plugins += params - return this - } - - override fun avatar(filename: String, avatarUrl: String): MediaViewerEntryPoint.NodeBuilder { - // We need to fake the MimeType here for the viewer to work. - val mimeType = MimeTypes.Images - return params( - MediaViewerEntryPoint.Params( - mode = MediaViewerEntryPoint.MediaViewerMode.SingleMedia, - eventId = null, - mediaInfo = MediaInfo( - filename = filename, - fileSize = null, - caption = null, - mimeType = mimeType, - formattedFileSize = "", - fileExtension = "", - senderId = UserId("@dummy:server.org"), - senderName = null, - senderAvatar = null, - dateSent = null, - dateSentFull = null, - waveform = null, - duration = null, - ), - mediaSource = MediaSource(url = avatarUrl), - thumbnailSource = null, - canShowInfo = false, - ) - ) - } - - override fun build(): Node { - return parentNode.createNode(buildContext, plugins) - } - } + override fun createNode( + parentNode: Node, + buildContext: BuildContext, + params: MediaViewerEntryPoint.Params, + callback: MediaViewerEntryPoint.Callback, + ): Node { + return parentNode.createNode( + buildContext = buildContext, + plugins = listOf(params, callback), + ) } } diff --git a/libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/gallery/root/MediaGalleryFlowNode.kt b/libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/gallery/root/MediaGalleryFlowNode.kt index a57b9203f4..cc71b49dac 100644 --- a/libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/gallery/root/MediaGalleryFlowNode.kt +++ b/libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/gallery/root/MediaGalleryFlowNode.kt @@ -124,19 +124,19 @@ class MediaGalleryFlowNode( callback.forward(eventId) } } - mediaViewerEntryPoint.nodeBuilder(this, buildContext) - .params( - MediaViewerEntryPoint.Params( - mode = navTarget.mode, - eventId = navTarget.eventId, - mediaInfo = navTarget.mediaInfo, - mediaSource = navTarget.mediaSource, - thumbnailSource = navTarget.thumbnailSource, - canShowInfo = true, - ) - ) - .callback(callback) - .build() + mediaViewerEntryPoint.createNode( + parentNode = this, + buildContext = buildContext, + params = MediaViewerEntryPoint.Params( + mode = navTarget.mode, + eventId = navTarget.eventId, + mediaInfo = navTarget.mediaInfo, + mediaSource = navTarget.mediaSource, + thumbnailSource = navTarget.thumbnailSource, + canShowInfo = true, + ), + callback = callback, + ) } } } diff --git a/libraries/mediaviewer/impl/src/test/kotlin/io/element/android/libraries/mediaviewer/impl/DefaultMediaGalleryEntryPointTest.kt b/libraries/mediaviewer/impl/src/test/kotlin/io/element/android/libraries/mediaviewer/impl/DefaultMediaGalleryEntryPointTest.kt index 8d38615ff3..8b2574054b 100644 --- a/libraries/mediaviewer/impl/src/test/kotlin/io/element/android/libraries/mediaviewer/impl/DefaultMediaGalleryEntryPointTest.kt +++ b/libraries/mediaviewer/impl/src/test/kotlin/io/element/android/libraries/mediaviewer/impl/DefaultMediaGalleryEntryPointTest.kt @@ -36,7 +36,13 @@ class DefaultMediaGalleryEntryPointTest { buildContext = buildContext, plugins = plugins, mediaViewerEntryPoint = object : MediaViewerEntryPoint { - override fun nodeBuilder(parentNode: Node, buildContext: BuildContext) = lambdaError() + override fun createParamsForAvatar(filename: String, avatarUrl: String) = lambdaError() + override fun createNode( + parentNode: Node, + buildContext: BuildContext, + params: MediaViewerEntryPoint.Params, + callback: MediaViewerEntryPoint.Callback, + ) = lambdaError() }, ) } @@ -45,9 +51,11 @@ class DefaultMediaGalleryEntryPointTest { override fun viewInTimeline(eventId: EventId) = lambdaError() override fun forward(eventId: EventId) = lambdaError() } - val result = entryPoint.nodeBuilder(parentNode, BuildContext.root(null)) - .callback(callback) - .build() + val result = entryPoint.createNode( + parentNode = parentNode, + buildContext = BuildContext.root(null), + callback = callback, + ) assertThat(result).isInstanceOf(MediaGalleryFlowNode::class.java) assertThat(result.plugins).contains(callback) } diff --git a/libraries/mediaviewer/impl/src/test/kotlin/io/element/android/libraries/mediaviewer/impl/DefaultMediaViewerEntryPointTest.kt b/libraries/mediaviewer/impl/src/test/kotlin/io/element/android/libraries/mediaviewer/impl/DefaultMediaViewerEntryPointTest.kt index ab31b5611e..b53fe7913c 100644 --- a/libraries/mediaviewer/impl/src/test/kotlin/io/element/android/libraries/mediaviewer/impl/DefaultMediaViewerEntryPointTest.kt +++ b/libraries/mediaviewer/impl/src/test/kotlin/io/element/android/libraries/mediaviewer/impl/DefaultMediaViewerEntryPointTest.kt @@ -75,10 +75,12 @@ class DefaultMediaViewerEntryPointTest { override fun forwardEvent(eventId: EventId) = lambdaError() } val params = createMediaViewerEntryPointParams() - val result = entryPoint.nodeBuilder(parentNode, BuildContext.root(null)) - .params(params) - .callback(callback) - .build() + val result = entryPoint.createNode( + parentNode = parentNode, + buildContext = BuildContext.root(null), + params = params, + callback = callback, + ) assertThat(result).isInstanceOf(MediaViewerNode::class.java) assertThat(result.plugins).contains(params) assertThat(result.plugins).contains(callback) @@ -118,13 +120,16 @@ class DefaultMediaViewerEntryPointTest { override fun viewInTimeline(eventId: EventId) = lambdaError() override fun forwardEvent(eventId: EventId) = lambdaError() } - val result = entryPoint.nodeBuilder(parentNode, BuildContext.root(null)) - .avatar( - filename = "fn", - avatarUrl = "avatarUrl", - ) - .callback(callback) - .build() + val params = entryPoint.createParamsForAvatar( + filename = "fn", + avatarUrl = "avatarUrl", + ) + val result = entryPoint.createNode( + parentNode = parentNode, + buildContext = BuildContext.root(null), + params = params, + callback = callback, + ) assertThat(result).isInstanceOf(MediaViewerNode::class.java) assertThat(result.plugins).contains( MediaViewerEntryPoint.Params( diff --git a/libraries/roomselect/api/src/main/kotlin/io/element/android/libraries/roomselect/api/RoomSelectEntryPoint.kt b/libraries/roomselect/api/src/main/kotlin/io/element/android/libraries/roomselect/api/RoomSelectEntryPoint.kt index a5d13609bd..7cc581d921 100644 --- a/libraries/roomselect/api/src/main/kotlin/io/element/android/libraries/roomselect/api/RoomSelectEntryPoint.kt +++ b/libraries/roomselect/api/src/main/kotlin/io/element/android/libraries/roomselect/api/RoomSelectEntryPoint.kt @@ -18,12 +18,7 @@ interface RoomSelectEntryPoint : FeatureEntryPoint { val mode: RoomSelectMode, ) - fun nodeBuilder(parentNode: Node, buildContext: BuildContext): NodeBuilder - interface NodeBuilder { - fun params(params: Params): NodeBuilder - fun callback(callback: Callback): NodeBuilder - fun build(): Node - } + fun createNode(parentNode: Node, buildContext: BuildContext, params: Params, callback: Callback): Node interface Callback : Plugin { fun onRoomSelected(roomIds: List) diff --git a/libraries/roomselect/impl/src/main/kotlin/io/element/android/libraries/roomselect/impl/DefaultRoomSelectEntryPoint.kt b/libraries/roomselect/impl/src/main/kotlin/io/element/android/libraries/roomselect/impl/DefaultRoomSelectEntryPoint.kt index db17e3bd31..5ba20ffd8f 100644 --- a/libraries/roomselect/impl/src/main/kotlin/io/element/android/libraries/roomselect/impl/DefaultRoomSelectEntryPoint.kt +++ b/libraries/roomselect/impl/src/main/kotlin/io/element/android/libraries/roomselect/impl/DefaultRoomSelectEntryPoint.kt @@ -9,7 +9,6 @@ package io.element.android.libraries.roomselect.impl 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.ContributesBinding import io.element.android.libraries.architecture.createNode import io.element.android.libraries.di.SessionScope @@ -17,23 +16,13 @@ import io.element.android.libraries.roomselect.api.RoomSelectEntryPoint @ContributesBinding(SessionScope::class) class DefaultRoomSelectEntryPoint : RoomSelectEntryPoint { - override fun nodeBuilder(parentNode: Node, buildContext: BuildContext): RoomSelectEntryPoint.NodeBuilder { - val plugins = ArrayList() - - return object : RoomSelectEntryPoint.NodeBuilder { - override fun params(params: RoomSelectEntryPoint.Params): RoomSelectEntryPoint.NodeBuilder { - plugins += RoomSelectNode.Inputs(mode = params.mode) - return this - } - - override fun callback(callback: RoomSelectEntryPoint.Callback): RoomSelectEntryPoint.NodeBuilder { - plugins += callback - return this - } - - override fun build(): Node { - return parentNode.createNode(buildContext, plugins) - } - } + override fun createNode(parentNode: Node, buildContext: BuildContext, params: RoomSelectEntryPoint.Params, callback: RoomSelectEntryPoint.Callback): Node { + return parentNode.createNode( + buildContext = buildContext, + plugins = listOf( + RoomSelectNode.Inputs(mode = params.mode), + callback, + ) + ) } } diff --git a/libraries/roomselect/impl/src/test/kotlin/io/element/android/libraries/roomselect/impl/DefaultRoomSelectEntryPointTest.kt b/libraries/roomselect/impl/src/test/kotlin/io/element/android/libraries/roomselect/impl/DefaultRoomSelectEntryPointTest.kt index bb9c15e7e6..0bd16f77b0 100644 --- a/libraries/roomselect/impl/src/test/kotlin/io/element/android/libraries/roomselect/impl/DefaultRoomSelectEntryPointTest.kt +++ b/libraries/roomselect/impl/src/test/kotlin/io/element/android/libraries/roomselect/impl/DefaultRoomSelectEntryPointTest.kt @@ -42,10 +42,12 @@ class DefaultRoomSelectEntryPointTest { override fun onCancel() = lambdaError() } val params = RoomSelectEntryPoint.Params(testMode) - val result = entryPoint.nodeBuilder(parentNode, BuildContext.root(null)) - .params(params) - .callback(callback) - .build() + val result = entryPoint.createNode( + parentNode = parentNode, + buildContext = BuildContext.root(null), + params = params, + callback = callback, + ) assertThat(result).isInstanceOf(RoomSelectNode::class.java) assertThat(result.plugins).contains(RoomSelectNode.Inputs(params.mode)) assertThat(result.plugins).contains(callback) diff --git a/libraries/troubleshoot/api/src/main/kotlin/io/element/android/libraries/troubleshoot/api/NotificationTroubleShootEntryPoint.kt b/libraries/troubleshoot/api/src/main/kotlin/io/element/android/libraries/troubleshoot/api/NotificationTroubleShootEntryPoint.kt index 034abe9400..5e5774cdba 100644 --- a/libraries/troubleshoot/api/src/main/kotlin/io/element/android/libraries/troubleshoot/api/NotificationTroubleShootEntryPoint.kt +++ b/libraries/troubleshoot/api/src/main/kotlin/io/element/android/libraries/troubleshoot/api/NotificationTroubleShootEntryPoint.kt @@ -13,12 +13,7 @@ import com.bumble.appyx.core.plugin.Plugin import io.element.android.libraries.architecture.FeatureEntryPoint interface NotificationTroubleShootEntryPoint : FeatureEntryPoint { - fun nodeBuilder(parentNode: Node, buildContext: BuildContext): NodeBuilder - - interface NodeBuilder { - fun callback(callback: Callback): NodeBuilder - fun build(): Node - } + fun createNode(parentNode: Node, buildContext: BuildContext, callback: Callback): Node interface Callback : Plugin { fun onDone() diff --git a/libraries/troubleshoot/api/src/main/kotlin/io/element/android/libraries/troubleshoot/api/PushHistoryEntryPoint.kt b/libraries/troubleshoot/api/src/main/kotlin/io/element/android/libraries/troubleshoot/api/PushHistoryEntryPoint.kt index bd0753d5cd..6836bb59d0 100644 --- a/libraries/troubleshoot/api/src/main/kotlin/io/element/android/libraries/troubleshoot/api/PushHistoryEntryPoint.kt +++ b/libraries/troubleshoot/api/src/main/kotlin/io/element/android/libraries/troubleshoot/api/PushHistoryEntryPoint.kt @@ -15,12 +15,7 @@ import io.element.android.libraries.matrix.api.core.EventId import io.element.android.libraries.matrix.api.core.RoomId interface PushHistoryEntryPoint : FeatureEntryPoint { - fun nodeBuilder(parentNode: Node, buildContext: BuildContext): NodeBuilder - - interface NodeBuilder { - fun callback(callback: Callback): NodeBuilder - fun build(): Node - } + fun createNode(parentNode: Node, buildContext: BuildContext, callback: Callback): Node interface Callback : Plugin { fun onDone() diff --git a/libraries/troubleshoot/impl/src/main/kotlin/io/element/android/libraries/troubleshoot/impl/DefaultNotificationTroubleShootEntryPoint.kt b/libraries/troubleshoot/impl/src/main/kotlin/io/element/android/libraries/troubleshoot/impl/DefaultNotificationTroubleShootEntryPoint.kt index e6af517069..f7b946647b 100644 --- a/libraries/troubleshoot/impl/src/main/kotlin/io/element/android/libraries/troubleshoot/impl/DefaultNotificationTroubleShootEntryPoint.kt +++ b/libraries/troubleshoot/impl/src/main/kotlin/io/element/android/libraries/troubleshoot/impl/DefaultNotificationTroubleShootEntryPoint.kt @@ -9,7 +9,6 @@ package io.element.android.libraries.troubleshoot.impl 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.AppScope import dev.zacsweers.metro.ContributesBinding import io.element.android.libraries.architecture.createNode @@ -17,18 +16,7 @@ import io.element.android.libraries.troubleshoot.api.NotificationTroubleShootEnt @ContributesBinding(AppScope::class) class DefaultNotificationTroubleShootEntryPoint : NotificationTroubleShootEntryPoint { - override fun nodeBuilder(parentNode: Node, buildContext: BuildContext): NotificationTroubleShootEntryPoint.NodeBuilder { - val plugins = ArrayList() - - return object : NotificationTroubleShootEntryPoint.NodeBuilder { - override fun callback(callback: NotificationTroubleShootEntryPoint.Callback): NotificationTroubleShootEntryPoint.NodeBuilder { - plugins += callback - return this - } - - override fun build(): Node { - return parentNode.createNode(buildContext, plugins) - } - } + override fun createNode(parentNode: Node, buildContext: BuildContext, callback: NotificationTroubleShootEntryPoint.Callback): Node { + return parentNode.createNode(buildContext, listOf(callback)) } } diff --git a/libraries/troubleshoot/impl/src/main/kotlin/io/element/android/libraries/troubleshoot/impl/history/DefaultPushHistoryEntryPoint.kt b/libraries/troubleshoot/impl/src/main/kotlin/io/element/android/libraries/troubleshoot/impl/history/DefaultPushHistoryEntryPoint.kt index 0347d911e1..505d4d2b61 100644 --- a/libraries/troubleshoot/impl/src/main/kotlin/io/element/android/libraries/troubleshoot/impl/history/DefaultPushHistoryEntryPoint.kt +++ b/libraries/troubleshoot/impl/src/main/kotlin/io/element/android/libraries/troubleshoot/impl/history/DefaultPushHistoryEntryPoint.kt @@ -9,7 +9,6 @@ package io.element.android.libraries.troubleshoot.impl.history 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.AppScope import dev.zacsweers.metro.ContributesBinding import io.element.android.libraries.architecture.createNode @@ -17,18 +16,7 @@ import io.element.android.libraries.troubleshoot.api.PushHistoryEntryPoint @ContributesBinding(AppScope::class) class DefaultPushHistoryEntryPoint : PushHistoryEntryPoint { - override fun nodeBuilder(parentNode: Node, buildContext: BuildContext): PushHistoryEntryPoint.NodeBuilder { - val plugins = ArrayList() - - return object : PushHistoryEntryPoint.NodeBuilder { - override fun callback(callback: PushHistoryEntryPoint.Callback): PushHistoryEntryPoint.NodeBuilder { - plugins += callback - return this - } - - override fun build(): Node { - return parentNode.createNode(buildContext, plugins) - } - } + override fun createNode(parentNode: Node, buildContext: BuildContext, callback: PushHistoryEntryPoint.Callback): Node { + return parentNode.createNode(buildContext, listOf(callback)) } } diff --git a/libraries/troubleshoot/impl/src/test/kotlin/io/element/android/libraries/troubleshoot/impl/DefaultNotificationTroubleShootEntryPointTest.kt b/libraries/troubleshoot/impl/src/test/kotlin/io/element/android/libraries/troubleshoot/impl/DefaultNotificationTroubleShootEntryPointTest.kt index a506502fc1..1eef24fbcb 100644 --- a/libraries/troubleshoot/impl/src/test/kotlin/io/element/android/libraries/troubleshoot/impl/DefaultNotificationTroubleShootEntryPointTest.kt +++ b/libraries/troubleshoot/impl/src/test/kotlin/io/element/android/libraries/troubleshoot/impl/DefaultNotificationTroubleShootEntryPointTest.kt @@ -36,9 +36,11 @@ class DefaultNotificationTroubleShootEntryPointTest { override fun onDone() = lambdaError() override fun navigateToBlockedUsers() = lambdaError() } - val result = entryPoint.nodeBuilder(parentNode, BuildContext.root(null)) - .callback(callback) - .build() + val result = entryPoint.createNode( + parentNode = parentNode, + buildContext = BuildContext.root(null), + callback = callback, + ) assertThat(result).isInstanceOf(TroubleshootNotificationsNode::class.java) assertThat(result.plugins).contains(callback) } diff --git a/libraries/troubleshoot/impl/src/test/kotlin/io/element/android/libraries/troubleshoot/impl/history/DefaultPushHistoryEntryPointTest.kt b/libraries/troubleshoot/impl/src/test/kotlin/io/element/android/libraries/troubleshoot/impl/history/DefaultPushHistoryEntryPointTest.kt index aa73649c62..b963183ecc 100644 --- a/libraries/troubleshoot/impl/src/test/kotlin/io/element/android/libraries/troubleshoot/impl/history/DefaultPushHistoryEntryPointTest.kt +++ b/libraries/troubleshoot/impl/src/test/kotlin/io/element/android/libraries/troubleshoot/impl/history/DefaultPushHistoryEntryPointTest.kt @@ -48,9 +48,11 @@ class DefaultPushHistoryEntryPointTest { override fun onDone() = lambdaError() override fun navigateToEvent(roomId: RoomId, eventId: EventId) = lambdaError() } - val result = entryPoint.nodeBuilder(parentNode, BuildContext.root(null)) - .callback(callback) - .build() + val result = entryPoint.createNode( + parentNode = parentNode, + buildContext = BuildContext.root(null), + callback = callback, + ) assertThat(result).isInstanceOf(PushHistoryNode::class.java) assertThat(result.plugins).contains(callback) } diff --git a/tools/templates/files/fileTemplates/Template Module Feature Entry Point API.kt b/tools/templates/files/fileTemplates/Template Module Feature Entry Point API.kt index 37f0500444..bc38fb2cad 100644 --- a/tools/templates/files/fileTemplates/Template Module Feature Entry Point API.kt +++ b/tools/templates/files/fileTemplates/Template Module Feature Entry Point API.kt @@ -6,12 +6,7 @@ import com.bumble.appyx.core.plugin.Plugin import io.element.android.libraries.architecture.FeatureEntryPoint interface ${FEATURE_NAME}EntryPoint : FeatureEntryPoint { - fun nodeBuilder(parentNode: Node, buildContext: BuildContext): NodeBuilder - - interface NodeBuilder { - fun callback(callback: Callback): NodeBuilder - fun build(): Node - } + fun createNode(parentNode: Node, buildContext: BuildContext, callback: Callback): Node interface Callback : Plugin { // Add your callbacks diff --git a/tools/templates/files/fileTemplates/Template Module Feature Entry Point Flow Impl.kt b/tools/templates/files/fileTemplates/Template Module Feature Entry Point Flow Impl.kt index 6eba997336..22dd0e1558 100644 --- a/tools/templates/files/fileTemplates/Template Module Feature Entry Point Flow Impl.kt +++ b/tools/templates/files/fileTemplates/Template Module Feature Entry Point Flow Impl.kt @@ -11,19 +11,7 @@ import dev.zacsweers.metro.AppScope @ContributesBinding(AppScope::class) class Default${FEATURE_NAME}EntryPoint() : ${FEATURE_NAME}EntryPoint { - override fun nodeBuilder(parentNode: Node, buildContext: BuildContext): ${FEATURE_NAME}EntryPoint.NodeBuilder { - val plugins = ArrayList() - - return object : ${FEATURE_NAME}EntryPoint.NodeBuilder { - - override fun callback(callback: ${FEATURE_NAME}EntryPoint.Callback): ${FEATURE_NAME}EntryPoint.NodeBuilder { - plugins += callback - return this - } - - override fun build(): Node { - return parentNode.createNode<${FEATURE_NAME}FlowNode>(buildContext, plugins) - } - } + override fun createNode(parentNode: Node, buildContext: BuildContext, callback: ${FEATURE_NAME}EntryPoint.Callback): Node { + return parentNode.createNode<${FEATURE_NAME}FlowNode>(buildContext, listOf(callback)) } } From 05c5f3c914aa0f37b7a59b5c9d6627521a00b690 Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Thu, 30 Oct 2025 13:02:20 +0100 Subject: [PATCH 08/46] Use context parameter for the parentNode --- .../android/appnav/LoggedInFlowNode.kt | 10 +----- .../android/appnav/NotLoggedInFlowNode.kt | 1 - .../io/element/android/appnav/RootFlowNode.kt | 3 -- .../android/appnav/room/RoomFlowNode.kt | 4 +-- .../room/joined/JoinedRoomLoadedFlowNode.kt | 4 --- .../appnav/JoinedRoomLoadedFlowNodeTest.kt | 8 ++--- .../impl/DefaultAnalyticsEntryPoint.kt | 3 +- .../impl/DefaultAnalyticsEntryPointTest.kt | 4 ++- .../api/ChangeRoomMemberRolesEntryPoint.kt | 2 +- .../DefaultChangeRoomMemberRolesEntyPoint.kt | 2 +- ...faultChangeRoomMemberRolesEntyPointTest.kt | 13 ++++---- .../createroom/api/CreateRoomEntryPoint.kt | 3 +- .../impl/DefaultCreateRoomEntryPoint.kt | 3 +- .../impl/DefaultCreateRoomEntryPointTest.kt | 11 ++++--- .../DefaultAccountDeactivationEntryPoint.kt | 3 +- ...efaultAccountDeactivationEntryPointTest.kt | 4 ++- .../features/forward/api/ForwardEntryPoint.kt | 3 +- .../forward/impl/DefaultForwardEntryPoint.kt | 3 +- .../forward/impl/ForwardMessagesNode.kt | 1 - .../impl/DefaultForwardEntryPointTest.kt | 15 +++++---- .../ftue/impl/DefaultFtueEntryPoint.kt | 3 +- .../features/ftue/impl/FtueFlowNode.kt | 3 +- .../FtueSessionVerificationFlowNode.kt | 3 -- .../ftue/impl/DefaultFtueEntryPointTest.kt | 8 +++-- .../features/home/api/HomeEntryPoint.kt | 3 +- .../home/impl/DefaultHomeEntryPoint.kt | 3 +- .../features/home/impl/HomeFlowNode.kt | 5 ++- .../home/impl/DefaultHomeEntryPointTest.kt | 17 +++++----- .../DeclineInviteAndBlockEntryPoint.kt | 3 +- .../DefaultDeclineAndBlockEntryPoint.kt | 3 +- .../DefaultDeclineAndBlockEntryPointTest.kt | 11 ++++--- .../joinroom/api/JoinRoomEntryPoint.kt | 3 +- .../impl/DefaultJoinRoomEntryPoint.kt | 3 +- .../joinroom/impl/JoinRoomFlowNode.kt | 2 +- .../impl/DefaultJoinRoomEntryPointTest.kt | 7 ++-- .../DefaultKnockRequestsListEntryPoint.kt | 3 +- .../DefaultKnockRequestsListEntryPointTest.kt | 4 ++- .../DefaultOpenSourcesLicensesEntryPoint.kt | 3 +- ...efaultOpenSourcesLicensesEntryPointTest.kt | 4 ++- .../location/api/SendLocationEntryPoint.kt | 2 +- .../location/api/ShowLocationEntryPoint.kt | 3 +- .../send/DefaultSendLocationEntryPoint.kt | 2 +- .../show/DefaultShowLocationEntryPoint.kt | 3 +- .../send/DefaultSendLocationEntryPointTest.kt | 11 ++++--- .../show/DefaultShowLocationEntryPointTest.kt | 11 ++++--- .../lockscreen/api/LockScreenEntryPoint.kt | 4 ++- .../impl/DefaultLockScreenEntryPoint.kt | 2 +- .../impl/DefaultLockScreenEntryPointTest.kt | 26 ++++++++------- .../features/login/api/LoginEntryPoint.kt | 3 +- .../login/impl/DefaultLoginEntryPoint.kt | 3 +- .../login/impl/DefaultLoginEntryPointTest.kt | 13 ++++---- .../features/logout/api/LogoutEntryPoint.kt | 3 +- .../logout/impl/DefaultLogoutEntryPoint.kt | 3 +- .../impl/DefaultLogoutEntryPointTest.kt | 11 ++++--- .../messages/api/MessagesEntryPoint.kt | 3 +- .../impl/DefaultMessagesEntryPoint.kt | 3 +- .../messages/impl/MessagesFlowNode.kt | 9 ++--- .../impl/DefaultMessagesEntryPointTest.kt | 27 ++++++++------- .../poll/api/create/CreatePollEntryPoint.kt | 3 +- .../create/DefaultCreatePollEntryPoint.kt | 3 +- .../history/DefaultPollHistoryEntryPoint.kt | 3 +- .../poll/impl/history/PollHistoryFlowNode.kt | 1 - .../create/DefaultCreatePollEntryPointTest.kt | 11 ++++--- .../DefaultPollHistoryEntryPointTest.kt | 6 ++-- .../preferences/api/PreferencesEntryPoint.kt | 3 +- .../impl/DefaultPreferencesEntryPoint.kt | 2 +- .../preferences/impl/PreferencesFlowNode.kt | 12 +++---- .../impl/DefaultPreferencesEntryPointTest.kt | 27 ++++++++------- .../api/bugreport/BugReportEntryPoint.kt | 3 +- .../impl/bugreport/BugReportFlowNode.kt | 1 - .../bugreport/DefaultBugReportEntryPoint.kt | 3 +- .../DefaultBugReportEntryPointTest.kt | 13 ++++---- .../reportroom/api/ReportRoomEntryPoint.kt | 3 +- .../impl/DefaultReportRoomEntryPoint.kt | 3 +- .../impl/DefaultReportRoomEntryPointTest.kt | 4 ++- .../api/RoomAliasResolverEntryPoint.kt | 3 +- .../DefaultRoomAliasResolverEntryPoint.kt | 2 +- .../DefaultRoomAliasResolverEntryPointTest.kt | 13 ++++---- .../roomdetails/api/RoomDetailsEntryPoint.kt | 3 +- .../impl/DefaultRoomDetailsEntryPoint.kt | 2 +- .../roomdetails/impl/RoomDetailsFlowNode.kt | 11 ++----- .../RolesAndPermissionsFlowNode.kt | 2 -- .../impl/DefaultRoomDetailsEntryPointTest.kt | 33 +++++++++++-------- .../api/RoomDirectoryEntryPoint.kt | 3 +- .../impl/DefaultRoomDirectoryEntryPoint.kt | 3 +- .../DefaultRoomDirectoryEntryPointTest.kt | 11 ++++--- .../api/SecureBackupEntryPoint.kt | 3 +- .../impl/DefaultSecureBackupEntryPoint.kt | 2 +- .../impl/DefaultSecureBackupEntryPointTest.kt | 13 ++++---- .../features/share/api/ShareEntryPoint.kt | 3 +- .../share/impl/DefaultShareEntryPoint.kt | 3 +- .../android/features/share/impl/ShareNode.kt | 1 - .../share/impl/DefaultShareEntryPointTest.kt | 15 +++++---- .../signedout/api/SignedOutEntryPoint.kt | 3 +- .../impl/DefaultSignedOutEntryPoint.kt | 3 +- .../impl/DefaultSignedOutEntryPointTest.kt | 11 ++++--- .../features/space/api/SpaceEntryPoint.kt | 2 +- .../space/impl/DefaultSpaceEntryPoint.kt | 3 +- .../space/impl/DefaultSpaceEntryPointTest.kt | 13 ++++---- .../startchat/api/StartChatEntryPoint.kt | 3 +- .../impl/DefaultStartChatEntryPoint.kt | 3 +- .../startchat/impl/StartChatFlowNode.kt | 1 - .../impl/DefaultStartChatEntryPointTest.kt | 13 ++++---- .../userprofile/api/UserProfileEntryPoint.kt | 3 +- .../impl/DefaultUserProfileEntryPoint.kt | 2 +- .../userprofile/impl/UserProfileFlowNode.kt | 2 -- .../impl/DefaultUserProfileEntryPointTest.kt | 17 +++++----- .../api/IncomingVerificationEntryPoint.kt | 3 +- .../api/OutgoingVerificationEntryPoint.kt | 3 +- .../DefaultIncomingVerificationEntryPoint.kt | 2 +- .../DefaultOutgoingVerificationEntryPoint.kt | 2 +- ...faultIncomingVerificationEntryPointTest.kt | 13 ++++---- ...faultOutgoingVerificationEntryPointTest.kt | 13 ++++---- .../viewfolder/api/ViewFolderEntryPoint.kt | 3 +- .../impl/DefaultViewFolderEntryPoint.kt | 3 +- .../impl/DefaultViewFolderEntryPointTest.kt | 13 ++++---- .../api/AccountSelectEntryPoint.kt | 3 +- .../impl/DefaultAccountSelectEntryPoint.kt | 3 +- .../DefaultAccountSelectEntryPointTest.kt | 11 ++++--- .../architecture/FeatureEntryPoint.kt | 3 +- .../mediaviewer/api/MediaGalleryEntryPoint.kt | 3 +- .../mediaviewer/api/MediaViewerEntryPoint.kt | 3 +- .../impl/DefaultMediaGalleryEntryPoint.kt | 3 +- .../impl/DefaultMediaViewerEntryPoint.kt | 2 +- .../impl/gallery/root/MediaGalleryFlowNode.kt | 1 - .../impl/DefaultMediaGalleryEntryPointTest.kt | 13 ++++---- .../impl/DefaultMediaViewerEntryPointTest.kt | 26 ++++++++------- .../roomselect/api/RoomSelectEntryPoint.kt | 3 +- .../impl/DefaultRoomSelectEntryPoint.kt | 3 +- .../impl/DefaultRoomSelectEntryPointTest.kt | 13 ++++---- .../api/NotificationTroubleShootEntryPoint.kt | 3 +- .../troubleshoot/api/PushHistoryEntryPoint.kt | 3 +- ...faultNotificationTroubleShootEntryPoint.kt | 3 +- .../history/DefaultPushHistoryEntryPoint.kt | 3 +- ...tNotificationTroubleShootEntryPointTest.kt | 11 ++++--- .../DefaultPushHistoryEntryPointTest.kt | 11 ++++--- ...Template Module Feature Entry Point API.kt | 3 +- ...te Module Feature Entry Point Flow Impl.kt | 4 +-- 138 files changed, 450 insertions(+), 375 deletions(-) diff --git a/appnav/src/main/kotlin/io/element/android/appnav/LoggedInFlowNode.kt b/appnav/src/main/kotlin/io/element/android/appnav/LoggedInFlowNode.kt index ae61a03281..34815a55a1 100644 --- a/appnav/src/main/kotlin/io/element/android/appnav/LoggedInFlowNode.kt +++ b/appnav/src/main/kotlin/io/element/android/appnav/LoggedInFlowNode.kt @@ -334,7 +334,6 @@ class LoggedInFlowNode( } } homeEntryPoint.createNode( - parentNode = this, buildContext = buildContext, callback = callback, ) @@ -391,7 +390,6 @@ class LoggedInFlowNode( } } userProfileEntryPoint.createNode( - parentNode = this, buildContext = buildContext, params = UserProfileEntryPoint.Params(userId = navTarget.userId), callback = callback, @@ -421,7 +419,6 @@ class LoggedInFlowNode( } val inputs = PreferencesEntryPoint.Params(navTarget.initialElement) preferencesEntryPoint.createNode( - parentNode = this, buildContext = buildContext, params = inputs, callback = callback, @@ -439,14 +436,12 @@ class LoggedInFlowNode( } 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 { @@ -457,11 +452,10 @@ class LoggedInFlowNode( ) } NavTarget.Ftue -> { - ftueEntryPoint.createNode(this, buildContext) + ftueEntryPoint.createNode(buildContext) } NavTarget.RoomDirectory -> { roomDirectoryEntryPoint.createNode( - parentNode = this, buildContext = buildContext, callback = object : RoomDirectoryEntryPoint.Callback { override fun navigateToRoom(roomDescription: RoomDescription) { @@ -478,7 +472,6 @@ class LoggedInFlowNode( } is NavTarget.IncomingShare -> { shareEntryPoint.createNode( - parentNode = this, buildContext = buildContext, params = ShareEntryPoint.Params(intent = navTarget.intent), callback = object : ShareEntryPoint.Callback { @@ -493,7 +486,6 @@ class LoggedInFlowNode( } is NavTarget.IncomingVerificationRequest -> { incomingVerificationEntryPoint.createNode( - parentNode = this, buildContext = buildContext, params = IncomingVerificationEntryPoint.Params(navTarget.data), callback = object : IncomingVerificationEntryPoint.Callback { diff --git a/appnav/src/main/kotlin/io/element/android/appnav/NotLoggedInFlowNode.kt b/appnav/src/main/kotlin/io/element/android/appnav/NotLoggedInFlowNode.kt index b372155bd3..4ca9a2db17 100644 --- a/appnav/src/main/kotlin/io/element/android/appnav/NotLoggedInFlowNode.kt +++ b/appnav/src/main/kotlin/io/element/android/appnav/NotLoggedInFlowNode.kt @@ -84,7 +84,6 @@ class NotLoggedInFlowNode( } } loginEntryPoint.createNode( - parentNode = this, buildContext = buildContext, params = LoginEntryPoint.Params( accountProvider = inputs.loginParams?.accountProvider, diff --git a/appnav/src/main/kotlin/io/element/android/appnav/RootFlowNode.kt b/appnav/src/main/kotlin/io/element/android/appnav/RootFlowNode.kt index bdad3c2ab0..e1322d0bbe 100644 --- a/appnav/src/main/kotlin/io/element/android/appnav/RootFlowNode.kt +++ b/appnav/src/main/kotlin/io/element/android/appnav/RootFlowNode.kt @@ -250,7 +250,6 @@ class RootFlowNode( } is NavTarget.SignedOutFlow -> { signedOutEntryPoint.createNode( - parentNode = this, buildContext = buildContext, params = SignedOutEntryPoint.Params( sessionId = navTarget.sessionId, @@ -265,7 +264,6 @@ class RootFlowNode( } } bugReportEntryPoint.createNode( - parentNode = this, buildContext = buildContext, callback = callback, ) @@ -294,7 +292,6 @@ class RootFlowNode( } } accountSelectEntryPoint.createNode( - parentNode = this, buildContext = buildContext, callback = callback, ) diff --git a/appnav/src/main/kotlin/io/element/android/appnav/room/RoomFlowNode.kt b/appnav/src/main/kotlin/io/element/android/appnav/room/RoomFlowNode.kt index 6283dbb3f9..602979edca 100644 --- a/appnav/src/main/kotlin/io/element/android/appnav/room/RoomFlowNode.kt +++ b/appnav/src/main/kotlin/io/element/android/appnav/room/RoomFlowNode.kt @@ -181,7 +181,6 @@ class RoomFlowNode( } val params = Params(navTarget.roomAlias) roomAliasResolverEntryPoint.createNode( - parentNode = this, buildContext = buildContext, params = params, callback = callback, @@ -195,7 +194,7 @@ class RoomFlowNode( serverNames = navTarget.serverNames, trigger = navTarget.trigger, ) - joinRoomEntryPoint.createNode(this, buildContext, inputs) + joinRoomEntryPoint.createNode(buildContext, inputs) } is NavTarget.JoinedRoom -> { val roomFlowNodeCallback = plugins() @@ -208,7 +207,6 @@ class RoomFlowNode( is NavTarget.JoinedSpace -> { val spaceCallback = plugins().single() spaceEntryPoint.createNode( - parentNode = this, buildContext = buildContext, inputs = SpaceEntryPoint.Inputs(roomId = navTarget.spaceId), callback = spaceCallback, 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 index 16eaff89b1..af0ed4c919 100644 --- 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 @@ -141,7 +141,6 @@ class JoinedRoomLoadedFlowNode( } } return roomDetailsEntryPoint.createNode( - parentNode = this, buildContext = buildContext, params = RoomDetailsEntryPoint.Params(initialTarget), callback = callback, @@ -180,7 +179,6 @@ class JoinedRoomLoadedFlowNode( } } forwardEntryPoint.createNode( - parentNode = this, buildContext = buildContext, params = params, callback = callback, @@ -204,7 +202,6 @@ class JoinedRoomLoadedFlowNode( } } return spaceEntryPoint.createNode( - parentNode = this, buildContext = buildContext, inputs = SpaceEntryPoint.Inputs(roomId = inputs.room.roomId), callback = callback, @@ -240,7 +237,6 @@ class JoinedRoomLoadedFlowNode( MessagesEntryPoint.InitialTarget.Messages(navTarget.focusedEventId) ) return messagesEntryPoint.createNode( - parentNode = this, buildContext = buildContext, params = params, callback = callback, diff --git a/appnav/src/test/kotlin/io/element/android/appnav/JoinedRoomLoadedFlowNodeTest.kt b/appnav/src/test/kotlin/io/element/android/appnav/JoinedRoomLoadedFlowNodeTest.kt index f3ba7a8ad7..91e8a597de 100644 --- a/appnav/src/test/kotlin/io/element/android/appnav/JoinedRoomLoadedFlowNodeTest.kt +++ b/appnav/src/test/kotlin/io/element/android/appnav/JoinedRoomLoadedFlowNodeTest.kt @@ -54,8 +54,8 @@ class JoinedRoomLoadedFlowNodeTest { var parameters: MessagesEntryPoint.Params? = null var callback: MessagesEntryPoint.Callback? = null + context(parentNode: Node) override fun createNode( - parentNode: Node, buildContext: BuildContext, params: MessagesEntryPoint.Params, callback: MessagesEntryPoint.Callback, @@ -77,8 +77,8 @@ class JoinedRoomLoadedFlowNodeTest { private class FakeRoomDetailsEntryPoint : RoomDetailsEntryPoint { var nodeId: String? = null + context(parentNode: Node) override fun createNode( - parentNode: Node, buildContext: BuildContext, params: RoomDetailsEntryPoint.Params, callback: RoomDetailsEntryPoint.Callback, @@ -90,8 +90,8 @@ class JoinedRoomLoadedFlowNodeTest { private class FakeSpaceEntryPoint : SpaceEntryPoint { var nodeId: String? = null + context(parentNode: Node) override fun createNode( - parentNode: Node, buildContext: BuildContext, inputs: SpaceEntryPoint.Inputs, callback: SpaceEntryPoint.Callback, @@ -101,8 +101,8 @@ class JoinedRoomLoadedFlowNodeTest { } private class FakeForwardEntryPoint : ForwardEntryPoint { + context(parentNode: Node) override fun createNode( - parentNode: Node, buildContext: BuildContext, params: ForwardEntryPoint.Params, callback: ForwardEntryPoint.Callback, diff --git a/features/analytics/impl/src/main/kotlin/io/element/android/features/analytics/impl/DefaultAnalyticsEntryPoint.kt b/features/analytics/impl/src/main/kotlin/io/element/android/features/analytics/impl/DefaultAnalyticsEntryPoint.kt index af59c94e0a..09dd1d0181 100644 --- a/features/analytics/impl/src/main/kotlin/io/element/android/features/analytics/impl/DefaultAnalyticsEntryPoint.kt +++ b/features/analytics/impl/src/main/kotlin/io/element/android/features/analytics/impl/DefaultAnalyticsEntryPoint.kt @@ -16,7 +16,8 @@ import io.element.android.libraries.architecture.createNode @ContributesBinding(AppScope::class) class DefaultAnalyticsEntryPoint : AnalyticsEntryPoint { - override fun createNode(parentNode: Node, buildContext: BuildContext): Node { + context(parentNode: Node) + override fun createNode(buildContext: BuildContext): Node { return parentNode.createNode(buildContext) } } diff --git a/features/analytics/impl/src/test/kotlin/io/element/android/features/analytics/impl/DefaultAnalyticsEntryPointTest.kt b/features/analytics/impl/src/test/kotlin/io/element/android/features/analytics/impl/DefaultAnalyticsEntryPointTest.kt index b5ec819632..e87473a447 100644 --- a/features/analytics/impl/src/test/kotlin/io/element/android/features/analytics/impl/DefaultAnalyticsEntryPointTest.kt +++ b/features/analytics/impl/src/test/kotlin/io/element/android/features/analytics/impl/DefaultAnalyticsEntryPointTest.kt @@ -33,7 +33,9 @@ class DefaultAnalyticsEntryPointTest { ) ) } - val result = entryPoint.createNode(parentNode, BuildContext.root(null)) + val result = with(parentNode) { + entryPoint.createNode(BuildContext.root(null)) + } assertThat(result).isInstanceOf(AnalyticsOptInNode::class.java) } } diff --git a/features/changeroommemberroles/api/src/main/kotlin/io/element/android/features/changeroommemberroes/api/ChangeRoomMemberRolesEntryPoint.kt b/features/changeroommemberroles/api/src/main/kotlin/io/element/android/features/changeroommemberroes/api/ChangeRoomMemberRolesEntryPoint.kt index 72c5de5bfe..d21829d695 100644 --- a/features/changeroommemberroles/api/src/main/kotlin/io/element/android/features/changeroommemberroes/api/ChangeRoomMemberRolesEntryPoint.kt +++ b/features/changeroommemberroles/api/src/main/kotlin/io/element/android/features/changeroommemberroes/api/ChangeRoomMemberRolesEntryPoint.kt @@ -15,8 +15,8 @@ import io.element.android.libraries.matrix.api.core.RoomId import io.element.android.libraries.matrix.api.room.JoinedRoom fun interface ChangeRoomMemberRolesEntryPoint : FeatureEntryPoint { + context(parentNode: Node) fun createNode( - parentNode: Node, buildContext: BuildContext, room: JoinedRoom, listType: ChangeRoomMemberRolesListType, diff --git a/features/changeroommemberroles/impl/src/main/kotlin/io/element/android/features/changeroommemberroles/impl/DefaultChangeRoomMemberRolesEntyPoint.kt b/features/changeroommemberroles/impl/src/main/kotlin/io/element/android/features/changeroommemberroles/impl/DefaultChangeRoomMemberRolesEntyPoint.kt index 4bdce08e9a..a3180c9828 100644 --- a/features/changeroommemberroles/impl/src/main/kotlin/io/element/android/features/changeroommemberroles/impl/DefaultChangeRoomMemberRolesEntyPoint.kt +++ b/features/changeroommemberroles/impl/src/main/kotlin/io/element/android/features/changeroommemberroles/impl/DefaultChangeRoomMemberRolesEntyPoint.kt @@ -18,8 +18,8 @@ import io.element.android.libraries.matrix.api.room.JoinedRoom @ContributesBinding(SessionScope::class) class DefaultChangeRoomMemberRolesEntyPoint : ChangeRoomMemberRolesEntryPoint { + context(parentNode: Node) override fun createNode( - parentNode: Node, buildContext: BuildContext, room: JoinedRoom, listType: ChangeRoomMemberRolesListType, diff --git a/features/changeroommemberroles/impl/src/test/kotlin/io/element/android/features/changeroommemberroles/impl/DefaultChangeRoomMemberRolesEntyPointTest.kt b/features/changeroommemberroles/impl/src/test/kotlin/io/element/android/features/changeroommemberroles/impl/DefaultChangeRoomMemberRolesEntyPointTest.kt index 6f17a5025d..c438c5d0e4 100644 --- a/features/changeroommemberroles/impl/src/test/kotlin/io/element/android/features/changeroommemberroles/impl/DefaultChangeRoomMemberRolesEntyPointTest.kt +++ b/features/changeroommemberroles/impl/src/test/kotlin/io/element/android/features/changeroommemberroles/impl/DefaultChangeRoomMemberRolesEntyPointTest.kt @@ -31,12 +31,13 @@ class DefaultChangeRoomMemberRolesEntyPointTest { } val room = FakeJoinedRoom() val listType = ChangeRoomMemberRolesListType.Admins - val result = entryPoint.createNode( - parentNode = parentNode, - buildContext = BuildContext.root(null), - room = FakeJoinedRoom(), - listType = listType, - ) + val result = with(parentNode) { + entryPoint.createNode( + buildContext = BuildContext.root(null), + room = FakeJoinedRoom(), + listType = listType, + ) + } assertThat(result).isInstanceOf(ChangeRoomMemberRolesRootNode::class.java) // Search for the Inputs plugin val input = result.plugins.filterIsInstance().single() diff --git a/features/createroom/api/src/main/kotlin/io/element/android/features/createroom/api/CreateRoomEntryPoint.kt b/features/createroom/api/src/main/kotlin/io/element/android/features/createroom/api/CreateRoomEntryPoint.kt index f30cbd9c91..1a5a1bef5c 100644 --- a/features/createroom/api/src/main/kotlin/io/element/android/features/createroom/api/CreateRoomEntryPoint.kt +++ b/features/createroom/api/src/main/kotlin/io/element/android/features/createroom/api/CreateRoomEntryPoint.kt @@ -14,7 +14,8 @@ import io.element.android.libraries.architecture.FeatureEntryPoint import io.element.android.libraries.matrix.api.core.RoomId interface CreateRoomEntryPoint : FeatureEntryPoint { - fun createNode(parentNode: Node, buildContext: BuildContext, callback: Callback): Node + context(parentNode: Node) + fun createNode(buildContext: BuildContext, callback: Callback): Node interface Callback : Plugin { fun onRoomCreated(roomId: RoomId) diff --git a/features/createroom/impl/src/main/kotlin/io/element/android/features/createroom/impl/DefaultCreateRoomEntryPoint.kt b/features/createroom/impl/src/main/kotlin/io/element/android/features/createroom/impl/DefaultCreateRoomEntryPoint.kt index 819cfd1208..ab00e6402f 100644 --- a/features/createroom/impl/src/main/kotlin/io/element/android/features/createroom/impl/DefaultCreateRoomEntryPoint.kt +++ b/features/createroom/impl/src/main/kotlin/io/element/android/features/createroom/impl/DefaultCreateRoomEntryPoint.kt @@ -16,7 +16,8 @@ import io.element.android.libraries.di.SessionScope @ContributesBinding(SessionScope::class) class DefaultCreateRoomEntryPoint : CreateRoomEntryPoint { - override fun createNode(parentNode: Node, buildContext: BuildContext, callback: CreateRoomEntryPoint.Callback): Node { + context(parentNode: Node) + override fun createNode(buildContext: BuildContext, callback: CreateRoomEntryPoint.Callback): Node { return parentNode.createNode(buildContext, listOf(callback)) } } diff --git a/features/createroom/impl/src/test/kotlin/io/element/android/features/createroom/impl/DefaultCreateRoomEntryPointTest.kt b/features/createroom/impl/src/test/kotlin/io/element/android/features/createroom/impl/DefaultCreateRoomEntryPointTest.kt index 4690b5b7f3..5d415c5d44 100644 --- a/features/createroom/impl/src/test/kotlin/io/element/android/features/createroom/impl/DefaultCreateRoomEntryPointTest.kt +++ b/features/createroom/impl/src/test/kotlin/io/element/android/features/createroom/impl/DefaultCreateRoomEntryPointTest.kt @@ -38,11 +38,12 @@ class DefaultCreateRoomEntryPointTest { val callback = object : CreateRoomEntryPoint.Callback { override fun onRoomCreated(roomId: RoomId) = lambdaError() } - val result = entryPoint.createNode( - parentNode = parentNode, - buildContext = BuildContext.root(null), - callback = callback, - ) + val result = with(parentNode) { + entryPoint.createNode( + buildContext = BuildContext.root(null), + callback = callback, + ) + } assertThat(result.plugins).contains(callback) } } diff --git a/features/deactivation/impl/src/main/kotlin/io/element/android/features/logout/impl/DefaultAccountDeactivationEntryPoint.kt b/features/deactivation/impl/src/main/kotlin/io/element/android/features/logout/impl/DefaultAccountDeactivationEntryPoint.kt index a7c0d50dbe..788cc393ed 100644 --- a/features/deactivation/impl/src/main/kotlin/io/element/android/features/logout/impl/DefaultAccountDeactivationEntryPoint.kt +++ b/features/deactivation/impl/src/main/kotlin/io/element/android/features/logout/impl/DefaultAccountDeactivationEntryPoint.kt @@ -16,7 +16,8 @@ import io.element.android.libraries.architecture.createNode @ContributesBinding(AppScope::class) class DefaultAccountDeactivationEntryPoint : AccountDeactivationEntryPoint { - override fun createNode(parentNode: Node, buildContext: BuildContext): Node { + context(parentNode: Node) + override fun createNode(buildContext: BuildContext): Node { return parentNode.createNode(buildContext) } } diff --git a/features/deactivation/impl/src/test/kotlin/io/element/android/features/logout/impl/DefaultAccountDeactivationEntryPointTest.kt b/features/deactivation/impl/src/test/kotlin/io/element/android/features/logout/impl/DefaultAccountDeactivationEntryPointTest.kt index 05ad52efe9..1e8dfe36cc 100644 --- a/features/deactivation/impl/src/test/kotlin/io/element/android/features/logout/impl/DefaultAccountDeactivationEntryPointTest.kt +++ b/features/deactivation/impl/src/test/kotlin/io/element/android/features/logout/impl/DefaultAccountDeactivationEntryPointTest.kt @@ -28,7 +28,9 @@ class DefaultAccountDeactivationEntryPointTest { presenter = createPresenter(), ) } - val result = entryPoint.createNode(parentNode, BuildContext.root(null)) + val result = with(parentNode) { + entryPoint.createNode(BuildContext.root(null)) + } assertThat(result).isInstanceOf(AccountDeactivationNode::class.java) } } diff --git a/features/forward/api/src/main/kotlin/io/element/android/features/forward/api/ForwardEntryPoint.kt b/features/forward/api/src/main/kotlin/io/element/android/features/forward/api/ForwardEntryPoint.kt index d20d9a8f70..1de948dea3 100644 --- a/features/forward/api/src/main/kotlin/io/element/android/features/forward/api/ForwardEntryPoint.kt +++ b/features/forward/api/src/main/kotlin/io/element/android/features/forward/api/ForwardEntryPoint.kt @@ -26,5 +26,6 @@ interface ForwardEntryPoint : FeatureEntryPoint { val timelineProvider: TimelineProvider, ) : NodeInputs - fun createNode(parentNode: Node, buildContext: BuildContext, params: Params, callback: Callback): Node + context(parentNode: Node) + fun createNode(buildContext: BuildContext, params: Params, callback: Callback): Node } diff --git a/features/forward/impl/src/main/kotlin/io/element/android/features/forward/impl/DefaultForwardEntryPoint.kt b/features/forward/impl/src/main/kotlin/io/element/android/features/forward/impl/DefaultForwardEntryPoint.kt index faa0787419..7cf20c017f 100644 --- a/features/forward/impl/src/main/kotlin/io/element/android/features/forward/impl/DefaultForwardEntryPoint.kt +++ b/features/forward/impl/src/main/kotlin/io/element/android/features/forward/impl/DefaultForwardEntryPoint.kt @@ -16,7 +16,8 @@ import io.element.android.libraries.di.SessionScope @ContributesBinding(SessionScope::class) class DefaultForwardEntryPoint : ForwardEntryPoint { - override fun createNode(parentNode: Node, buildContext: BuildContext, params: ForwardEntryPoint.Params, callback: ForwardEntryPoint.Callback): Node { + context(parentNode: Node) + override fun createNode(buildContext: BuildContext, params: ForwardEntryPoint.Params, callback: ForwardEntryPoint.Callback): Node { return parentNode.createNode( buildContext = buildContext, plugins = listOf( diff --git a/features/forward/impl/src/main/kotlin/io/element/android/features/forward/impl/ForwardMessagesNode.kt b/features/forward/impl/src/main/kotlin/io/element/android/features/forward/impl/ForwardMessagesNode.kt index a38f71264b..f033e97694 100644 --- a/features/forward/impl/src/main/kotlin/io/element/android/features/forward/impl/ForwardMessagesNode.kt +++ b/features/forward/impl/src/main/kotlin/io/element/android/features/forward/impl/ForwardMessagesNode.kt @@ -71,7 +71,6 @@ class ForwardMessagesNode( } return roomSelectEntryPoint.createNode( - parentNode = this, buildContext = buildContext, params = RoomSelectEntryPoint.Params(mode = RoomSelectMode.Forward), callback = callback, diff --git a/features/forward/impl/src/test/kotlin/io/element/android/features/forward/impl/DefaultForwardEntryPointTest.kt b/features/forward/impl/src/test/kotlin/io/element/android/features/forward/impl/DefaultForwardEntryPointTest.kt index 6b0927cbfe..76cd3c0a2f 100644 --- a/features/forward/impl/src/test/kotlin/io/element/android/features/forward/impl/DefaultForwardEntryPointTest.kt +++ b/features/forward/impl/src/test/kotlin/io/element/android/features/forward/impl/DefaultForwardEntryPointTest.kt @@ -39,8 +39,8 @@ class DefaultForwardEntryPointTest { plugins = plugins, presenterFactory = { _, _ -> createForwardMessagesPresenter() }, roomSelectEntryPoint = object : RoomSelectEntryPoint { + context(parentNode: Node) override fun createNode( - parentNode: Node, buildContext: BuildContext, params: RoomSelectEntryPoint.Params, callback: RoomSelectEntryPoint.Callback, @@ -55,12 +55,13 @@ class DefaultForwardEntryPointTest { eventId = AN_EVENT_ID, timelineProvider = FakeTimelineProvider(), ) - val result = entryPoint.createNode( - parentNode = parentNode, - buildContext = BuildContext.root(null), - params = params, - callback = callback, - ) + val result = with(parentNode) { + entryPoint.createNode( + buildContext = BuildContext.root(null), + params = params, + callback = callback, + ) + } assertThat(result).isInstanceOf(ForwardMessagesNode::class.java) assertThat(result.plugins).contains( ForwardMessagesNode.Inputs( diff --git a/features/ftue/impl/src/main/kotlin/io/element/android/features/ftue/impl/DefaultFtueEntryPoint.kt b/features/ftue/impl/src/main/kotlin/io/element/android/features/ftue/impl/DefaultFtueEntryPoint.kt index c480d329a8..184e3bb802 100644 --- a/features/ftue/impl/src/main/kotlin/io/element/android/features/ftue/impl/DefaultFtueEntryPoint.kt +++ b/features/ftue/impl/src/main/kotlin/io/element/android/features/ftue/impl/DefaultFtueEntryPoint.kt @@ -16,7 +16,8 @@ import io.element.android.libraries.architecture.createNode @ContributesBinding(AppScope::class) class DefaultFtueEntryPoint : FtueEntryPoint { - override fun createNode(parentNode: Node, buildContext: BuildContext): Node { + context(parentNode: Node) + override fun createNode(buildContext: BuildContext): Node { return parentNode.createNode(buildContext) } } diff --git a/features/ftue/impl/src/main/kotlin/io/element/android/features/ftue/impl/FtueFlowNode.kt b/features/ftue/impl/src/main/kotlin/io/element/android/features/ftue/impl/FtueFlowNode.kt index 7c045f0150..779e16f310 100644 --- a/features/ftue/impl/src/main/kotlin/io/element/android/features/ftue/impl/FtueFlowNode.kt +++ b/features/ftue/impl/src/main/kotlin/io/element/android/features/ftue/impl/FtueFlowNode.kt @@ -102,7 +102,7 @@ class FtueFlowNode( createNode(buildContext, listOf(callback)) } NavTarget.AnalyticsOptIn -> { - analyticsEntryPoint.createNode(this, buildContext) + analyticsEntryPoint.createNode(buildContext) } NavTarget.LockScreenSetup -> { val callback = object : LockScreenEntryPoint.Callback { @@ -111,7 +111,6 @@ class FtueFlowNode( } } lockScreenEntryPoint.createNode( - parentNode = this, buildContext = buildContext, navTarget = LockScreenEntryPoint.Target.Setup, callback = callback, diff --git a/features/ftue/impl/src/main/kotlin/io/element/android/features/ftue/impl/sessionverification/FtueSessionVerificationFlowNode.kt b/features/ftue/impl/src/main/kotlin/io/element/android/features/ftue/impl/sessionverification/FtueSessionVerificationFlowNode.kt index 13da4a0748..974c66d243 100644 --- a/features/ftue/impl/src/main/kotlin/io/element/android/features/ftue/impl/sessionverification/FtueSessionVerificationFlowNode.kt +++ b/features/ftue/impl/src/main/kotlin/io/element/android/features/ftue/impl/sessionverification/FtueSessionVerificationFlowNode.kt @@ -104,7 +104,6 @@ class FtueSessionVerificationFlowNode( } is NavTarget.UseAnotherDevice -> { outgoingVerificationEntryPoint.createNode( - parentNode = this, buildContext = buildContext, params = OutgoingVerificationEntryPoint.Params( showDeviceVerifiedScreen = true, @@ -128,7 +127,6 @@ class FtueSessionVerificationFlowNode( } is NavTarget.EnterRecoveryKey -> { secureBackupEntryPoint.createNode( - parentNode = this, buildContext = buildContext, params = SecureBackupEntryPoint.Params(SecureBackupEntryPoint.InitialTarget.EnterRecoveryKey), callback = secureBackupEntryPointCallback @@ -136,7 +134,6 @@ class FtueSessionVerificationFlowNode( } is NavTarget.ResetIdentity -> { secureBackupEntryPoint.createNode( - parentNode = this, buildContext = buildContext, params = SecureBackupEntryPoint.Params(SecureBackupEntryPoint.InitialTarget.ResetIdentity), callback = object : SecureBackupEntryPoint.Callback { diff --git a/features/ftue/impl/src/test/kotlin/io/element/android/features/ftue/impl/DefaultFtueEntryPointTest.kt b/features/ftue/impl/src/test/kotlin/io/element/android/features/ftue/impl/DefaultFtueEntryPointTest.kt index c528d9c8b9..ccb4cbe200 100644 --- a/features/ftue/impl/src/test/kotlin/io/element/android/features/ftue/impl/DefaultFtueEntryPointTest.kt +++ b/features/ftue/impl/src/test/kotlin/io/element/android/features/ftue/impl/DefaultFtueEntryPointTest.kt @@ -35,11 +35,11 @@ class DefaultFtueEntryPointTest { FtueFlowNode( buildContext = buildContext, plugins = plugins, - analyticsEntryPoint = { _, _ -> lambdaError() }, + analyticsEntryPoint = { _ -> lambdaError() }, defaultFtueService = createDefaultFtueService(), lockScreenEntryPoint = object : LockScreenEntryPoint { + context(parentNode: Node) override fun createNode( - parentNode: Node, buildContext: BuildContext, navTarget: LockScreenEntryPoint.Target, callback: LockScreenEntryPoint.Callback, @@ -51,7 +51,9 @@ class DefaultFtueEntryPointTest { }, ) } - val result = entryPoint.createNode(parentNode, BuildContext.root(null)) + val result = with(parentNode) { + entryPoint.createNode(BuildContext.root(null)) + } assertThat(result).isInstanceOf(FtueFlowNode::class.java) } } diff --git a/features/home/api/src/main/kotlin/io/element/android/features/home/api/HomeEntryPoint.kt b/features/home/api/src/main/kotlin/io/element/android/features/home/api/HomeEntryPoint.kt index 3f8da8bc1a..101f631cd9 100644 --- a/features/home/api/src/main/kotlin/io/element/android/features/home/api/HomeEntryPoint.kt +++ b/features/home/api/src/main/kotlin/io/element/android/features/home/api/HomeEntryPoint.kt @@ -14,7 +14,8 @@ import io.element.android.libraries.architecture.FeatureEntryPoint import io.element.android.libraries.matrix.api.core.RoomId interface HomeEntryPoint : FeatureEntryPoint { - fun createNode(parentNode: Node, buildContext: BuildContext, callback: Callback): Node + context(parentNode: Node) + fun createNode(buildContext: BuildContext, callback: Callback): Node interface Callback : Plugin { fun navigateToRoom(roomId: RoomId) diff --git a/features/home/impl/src/main/kotlin/io/element/android/features/home/impl/DefaultHomeEntryPoint.kt b/features/home/impl/src/main/kotlin/io/element/android/features/home/impl/DefaultHomeEntryPoint.kt index a85c5df07d..34c9b5f0d9 100644 --- a/features/home/impl/src/main/kotlin/io/element/android/features/home/impl/DefaultHomeEntryPoint.kt +++ b/features/home/impl/src/main/kotlin/io/element/android/features/home/impl/DefaultHomeEntryPoint.kt @@ -16,7 +16,8 @@ import io.element.android.libraries.architecture.createNode @ContributesBinding(AppScope::class) class DefaultHomeEntryPoint : HomeEntryPoint { - override fun createNode(parentNode: Node, buildContext: BuildContext, callback: HomeEntryPoint.Callback): Node { + context(parentNode: Node) + override fun createNode(buildContext: BuildContext, callback: HomeEntryPoint.Callback): Node { return parentNode.createNode(buildContext, listOf(callback)) } } diff --git a/features/home/impl/src/main/kotlin/io/element/android/features/home/impl/HomeFlowNode.kt b/features/home/impl/src/main/kotlin/io/element/android/features/home/impl/HomeFlowNode.kt index 7e542b5651..e3d1df3849 100644 --- a/features/home/impl/src/main/kotlin/io/element/android/features/home/impl/HomeFlowNode.kt +++ b/features/home/impl/src/main/kotlin/io/element/android/features/home/impl/HomeFlowNode.kt @@ -186,12 +186,11 @@ class HomeFlowNode( override fun resolve(navTarget: NavTarget, buildContext: BuildContext): Node { return when (navTarget) { - is NavTarget.ReportRoom -> reportRoomEntryPoint.createNode(this, buildContext, navTarget.roomId) - is NavTarget.DeclineInviteAndBlockUser -> declineInviteAndBlockUserEntryPoint.createNode(this, buildContext, navTarget.inviteData) + is NavTarget.ReportRoom -> reportRoomEntryPoint.createNode(buildContext, navTarget.roomId) + is NavTarget.DeclineInviteAndBlockUser -> declineInviteAndBlockUserEntryPoint.createNode(buildContext, navTarget.inviteData) is NavTarget.SelectNewOwnersWhenLeavingRoom -> { val room = runBlocking { matrixClient.getJoinedRoom(navTarget.roomId) } ?: error("Room ${navTarget.roomId} not found") changeRoomMemberRolesEntryPoint.createNode( - parentNode = this, buildContext = buildContext, room = room, listType = ChangeRoomMemberRolesListType.SelectNewOwnersWhenLeaving, diff --git a/features/home/impl/src/test/kotlin/io/element/android/features/home/impl/DefaultHomeEntryPointTest.kt b/features/home/impl/src/test/kotlin/io/element/android/features/home/impl/DefaultHomeEntryPointTest.kt index 489234a827..47574cd639 100644 --- a/features/home/impl/src/test/kotlin/io/element/android/features/home/impl/DefaultHomeEntryPointTest.kt +++ b/features/home/impl/src/test/kotlin/io/element/android/features/home/impl/DefaultHomeEntryPointTest.kt @@ -34,9 +34,9 @@ class DefaultHomeEntryPointTest { analyticsService = FakeAnalyticsService(), acceptDeclineInviteView = { _, _, _, _ -> lambdaError() }, directLogoutView = { _ -> lambdaError() }, - reportRoomEntryPoint = { _, _, _ -> lambdaError() }, - declineInviteAndBlockUserEntryPoint = { _, _, _ -> lambdaError() }, - changeRoomMemberRolesEntryPoint = { _, _, _, _ -> lambdaError() }, + reportRoomEntryPoint = { _, _ -> lambdaError() }, + declineInviteAndBlockUserEntryPoint = { _, _ -> lambdaError() }, + changeRoomMemberRolesEntryPoint = { _, _, _ -> lambdaError() }, leaveRoomRenderer = { _, _, _ -> lambdaError() }, ) } @@ -49,11 +49,12 @@ class DefaultHomeEntryPointTest { override fun navigateToRoomSettings(roomId: RoomId) = lambdaError() override fun navigateToBugReport() = lambdaError() } - val result = entryPoint.createNode( - parentNode = parentNode, - buildContext = BuildContext.root(null), - callback = callback, - ) + val result = with(parentNode) { + entryPoint.createNode( + buildContext = BuildContext.root(null), + callback = callback, + ) + } assertThat(result).isInstanceOf(HomeFlowNode::class.java) assertThat(result.plugins).contains(callback) } diff --git a/features/invite/api/src/main/kotlin/io/element/android/features/invite/api/declineandblock/DeclineInviteAndBlockEntryPoint.kt b/features/invite/api/src/main/kotlin/io/element/android/features/invite/api/declineandblock/DeclineInviteAndBlockEntryPoint.kt index 8517fe2786..44b88f627b 100644 --- a/features/invite/api/src/main/kotlin/io/element/android/features/invite/api/declineandblock/DeclineInviteAndBlockEntryPoint.kt +++ b/features/invite/api/src/main/kotlin/io/element/android/features/invite/api/declineandblock/DeclineInviteAndBlockEntryPoint.kt @@ -13,5 +13,6 @@ import io.element.android.features.invite.api.InviteData import io.element.android.libraries.architecture.FeatureEntryPoint fun interface DeclineInviteAndBlockEntryPoint : FeatureEntryPoint { - fun createNode(parentNode: Node, buildContext: BuildContext, inviteData: InviteData): Node + context(parentNode: Node) + fun createNode(buildContext: BuildContext, inviteData: InviteData): Node } diff --git a/features/invite/impl/src/main/kotlin/io/element/android/features/invite/impl/declineandblock/DefaultDeclineAndBlockEntryPoint.kt b/features/invite/impl/src/main/kotlin/io/element/android/features/invite/impl/declineandblock/DefaultDeclineAndBlockEntryPoint.kt index e76d173a90..a356636cad 100644 --- a/features/invite/impl/src/main/kotlin/io/element/android/features/invite/impl/declineandblock/DefaultDeclineAndBlockEntryPoint.kt +++ b/features/invite/impl/src/main/kotlin/io/element/android/features/invite/impl/declineandblock/DefaultDeclineAndBlockEntryPoint.kt @@ -17,7 +17,8 @@ import io.element.android.libraries.architecture.createNode @ContributesBinding(AppScope::class) class DefaultDeclineAndBlockEntryPoint : DeclineInviteAndBlockEntryPoint { - override fun createNode(parentNode: Node, buildContext: BuildContext, inviteData: InviteData): Node { + context(parentNode: Node) + override fun createNode(buildContext: BuildContext, inviteData: InviteData): Node { val inputs = DeclineAndBlockNode.Inputs(inviteData) return parentNode.createNode(buildContext, plugins = listOf(inputs)) } diff --git a/features/invite/impl/src/test/kotlin/io/element/android/features/invite/impl/declineandblock/DefaultDeclineAndBlockEntryPointTest.kt b/features/invite/impl/src/test/kotlin/io/element/android/features/invite/impl/declineandblock/DefaultDeclineAndBlockEntryPointTest.kt index 7cdf208b9a..c1919831c0 100644 --- a/features/invite/impl/src/test/kotlin/io/element/android/features/invite/impl/declineandblock/DefaultDeclineAndBlockEntryPointTest.kt +++ b/features/invite/impl/src/test/kotlin/io/element/android/features/invite/impl/declineandblock/DefaultDeclineAndBlockEntryPointTest.kt @@ -30,11 +30,12 @@ class DefaultDeclineAndBlockEntryPointTest { ) } val inviteData = anInviteData() - val result = entryPoint.createNode( - parentNode = parentNode, - buildContext = BuildContext.root(null), - inviteData = inviteData - ) + val result = with(parentNode) { + entryPoint.createNode( + buildContext = BuildContext.root(null), + inviteData = inviteData + ) + } assertThat(result).isInstanceOf(DeclineAndBlockNode::class.java) assertThat(result.plugins).contains(DeclineAndBlockNode.Inputs(inviteData)) } diff --git a/features/joinroom/api/src/main/kotlin/io/element/android/features/joinroom/api/JoinRoomEntryPoint.kt b/features/joinroom/api/src/main/kotlin/io/element/android/features/joinroom/api/JoinRoomEntryPoint.kt index 9af4703949..7b4f9a8ac0 100644 --- a/features/joinroom/api/src/main/kotlin/io/element/android/features/joinroom/api/JoinRoomEntryPoint.kt +++ b/features/joinroom/api/src/main/kotlin/io/element/android/features/joinroom/api/JoinRoomEntryPoint.kt @@ -18,7 +18,8 @@ import io.element.android.libraries.matrix.api.core.RoomIdOrAlias import java.util.Optional interface JoinRoomEntryPoint : FeatureEntryPoint { - fun createNode(parentNode: Node, buildContext: BuildContext, inputs: Inputs): Node + context(parentNode: Node) + fun createNode(buildContext: BuildContext, inputs: Inputs): Node data class Inputs( val roomId: RoomId, diff --git a/features/joinroom/impl/src/main/kotlin/io/element/android/features/joinroom/impl/DefaultJoinRoomEntryPoint.kt b/features/joinroom/impl/src/main/kotlin/io/element/android/features/joinroom/impl/DefaultJoinRoomEntryPoint.kt index c7e5e1d11f..eb1deb4897 100644 --- a/features/joinroom/impl/src/main/kotlin/io/element/android/features/joinroom/impl/DefaultJoinRoomEntryPoint.kt +++ b/features/joinroom/impl/src/main/kotlin/io/element/android/features/joinroom/impl/DefaultJoinRoomEntryPoint.kt @@ -16,7 +16,8 @@ import io.element.android.libraries.architecture.createNode @ContributesBinding(AppScope::class) class DefaultJoinRoomEntryPoint : JoinRoomEntryPoint { - override fun createNode(parentNode: Node, buildContext: BuildContext, inputs: JoinRoomEntryPoint.Inputs): Node { + context(parentNode: Node) + override fun createNode(buildContext: BuildContext, inputs: JoinRoomEntryPoint.Inputs): Node { return parentNode.createNode( buildContext = buildContext, plugins = listOf(inputs) diff --git a/features/joinroom/impl/src/main/kotlin/io/element/android/features/joinroom/impl/JoinRoomFlowNode.kt b/features/joinroom/impl/src/main/kotlin/io/element/android/features/joinroom/impl/JoinRoomFlowNode.kt index f501752544..92cd023bc9 100644 --- a/features/joinroom/impl/src/main/kotlin/io/element/android/features/joinroom/impl/JoinRoomFlowNode.kt +++ b/features/joinroom/impl/src/main/kotlin/io/element/android/features/joinroom/impl/JoinRoomFlowNode.kt @@ -64,7 +64,7 @@ class JoinRoomFlowNode( override fun resolve(navTarget: NavTarget, buildContext: BuildContext): Node { return when (navTarget) { - is NavTarget.DeclineInviteAndBlockUser -> declineAndBlockEntryPoint.createNode(this, buildContext, navTarget.inviteData) + is NavTarget.DeclineInviteAndBlockUser -> declineAndBlockEntryPoint.createNode(buildContext, navTarget.inviteData) NavTarget.Root -> rootNode(buildContext) } } diff --git a/features/joinroom/impl/src/test/kotlin/io/element/android/features/joinroom/impl/DefaultJoinRoomEntryPointTest.kt b/features/joinroom/impl/src/test/kotlin/io/element/android/features/joinroom/impl/DefaultJoinRoomEntryPointTest.kt index af75fd528c..4cf41f1dbc 100644 --- a/features/joinroom/impl/src/test/kotlin/io/element/android/features/joinroom/impl/DefaultJoinRoomEntryPointTest.kt +++ b/features/joinroom/impl/src/test/kotlin/io/element/android/features/joinroom/impl/DefaultJoinRoomEntryPointTest.kt @@ -41,7 +41,8 @@ class DefaultJoinRoomEntryPointTest { presenterFactory = { _, _, _, _, _ -> createJoinRoomPresenter() }, acceptDeclineInviteView = { _, _, _, _ -> lambdaError() }, declineAndBlockEntryPoint = object : DeclineInviteAndBlockEntryPoint { - override fun createNode(parentNode: Node, buildContext: BuildContext, inviteData: InviteData) = lambdaError() + context(parentNode: Node) + override fun createNode(buildContext: BuildContext, inviteData: InviteData) = lambdaError() } ) } @@ -52,7 +53,9 @@ class DefaultJoinRoomEntryPointTest { serverNames = emptyList(), trigger = JoinedRoom.Trigger.RoomDirectory, ) - val result = entryPoint.createNode(parentNode, BuildContext.root(null), inputs) + val result = with(parentNode) { + entryPoint.createNode(BuildContext.root(null), inputs) + } assertThat(result).isInstanceOf(JoinRoomFlowNode::class.java) assertThat(result.plugins).contains(inputs) } diff --git a/features/knockrequests/impl/src/main/kotlin/io/element/android/features/knockrequests/impl/list/DefaultKnockRequestsListEntryPoint.kt b/features/knockrequests/impl/src/main/kotlin/io/element/android/features/knockrequests/impl/list/DefaultKnockRequestsListEntryPoint.kt index c77065324d..a3186072f3 100644 --- a/features/knockrequests/impl/src/main/kotlin/io/element/android/features/knockrequests/impl/list/DefaultKnockRequestsListEntryPoint.kt +++ b/features/knockrequests/impl/src/main/kotlin/io/element/android/features/knockrequests/impl/list/DefaultKnockRequestsListEntryPoint.kt @@ -16,7 +16,8 @@ import io.element.android.libraries.architecture.createNode @ContributesBinding(AppScope::class) class DefaultKnockRequestsListEntryPoint : KnockRequestsListEntryPoint { - override fun createNode(parentNode: Node, buildContext: BuildContext): Node { + context(parentNode: Node) + override fun createNode(buildContext: BuildContext): Node { return parentNode.createNode(buildContext) } } diff --git a/features/knockrequests/impl/src/test/kotlin/io/element/android/features/knockrequests/impl/list/DefaultKnockRequestsListEntryPointTest.kt b/features/knockrequests/impl/src/test/kotlin/io/element/android/features/knockrequests/impl/list/DefaultKnockRequestsListEntryPointTest.kt index b6b6d766c7..2e6a8426e8 100644 --- a/features/knockrequests/impl/src/test/kotlin/io/element/android/features/knockrequests/impl/list/DefaultKnockRequestsListEntryPointTest.kt +++ b/features/knockrequests/impl/src/test/kotlin/io/element/android/features/knockrequests/impl/list/DefaultKnockRequestsListEntryPointTest.kt @@ -30,7 +30,9 @@ class DefaultKnockRequestsListEntryPointTest { presenter = createKnockRequestsListPresenter(), ) } - val result = entryPoint.createNode(parentNode, BuildContext.root(null)) + val result = with(parentNode) { + entryPoint.createNode(BuildContext.root(null)) + } assertThat(result).isInstanceOf(KnockRequestsListNode::class.java) } } diff --git a/features/licenses/impl/src/main/kotlin/io/element/android/features/licenses/impl/DefaultOpenSourcesLicensesEntryPoint.kt b/features/licenses/impl/src/main/kotlin/io/element/android/features/licenses/impl/DefaultOpenSourcesLicensesEntryPoint.kt index 77c56b6d3a..4839c1a8cf 100644 --- a/features/licenses/impl/src/main/kotlin/io/element/android/features/licenses/impl/DefaultOpenSourcesLicensesEntryPoint.kt +++ b/features/licenses/impl/src/main/kotlin/io/element/android/features/licenses/impl/DefaultOpenSourcesLicensesEntryPoint.kt @@ -16,7 +16,8 @@ import io.element.android.libraries.architecture.createNode @ContributesBinding(AppScope::class) class DefaultOpenSourcesLicensesEntryPoint : OpenSourceLicensesEntryPoint { - override fun createNode(parentNode: Node, buildContext: BuildContext): Node { + context(parentNode: Node) + override fun createNode(buildContext: BuildContext): Node { return parentNode.createNode(buildContext) } } diff --git a/features/licenses/impl/src/test/kotlin/io/element/android/features/licenses/impl/DefaultOpenSourcesLicensesEntryPointTest.kt b/features/licenses/impl/src/test/kotlin/io/element/android/features/licenses/impl/DefaultOpenSourcesLicensesEntryPointTest.kt index 3209e28fe6..9fbd370c55 100644 --- a/features/licenses/impl/src/test/kotlin/io/element/android/features/licenses/impl/DefaultOpenSourcesLicensesEntryPointTest.kt +++ b/features/licenses/impl/src/test/kotlin/io/element/android/features/licenses/impl/DefaultOpenSourcesLicensesEntryPointTest.kt @@ -31,7 +31,9 @@ class DefaultOpenSourcesLicensesEntryPointTest { plugins = plugins, ) } - val result = entryPoint.createNode(parentNode, BuildContext.root(null)) + val result = with(parentNode) { + entryPoint.createNode(BuildContext.root(null)) + } assertThat(result).isInstanceOf(DependenciesFlowNode::class.java) } } diff --git a/features/location/api/src/main/kotlin/io/element/android/features/location/api/SendLocationEntryPoint.kt b/features/location/api/src/main/kotlin/io/element/android/features/location/api/SendLocationEntryPoint.kt index afd1b895b5..f522992872 100644 --- a/features/location/api/src/main/kotlin/io/element/android/features/location/api/SendLocationEntryPoint.kt +++ b/features/location/api/src/main/kotlin/io/element/android/features/location/api/SendLocationEntryPoint.kt @@ -18,8 +18,8 @@ import io.element.android.libraries.matrix.api.timeline.Timeline * Allows a user to share a location message within a room. */ interface SendLocationEntryPoint : FeatureEntryPoint { + context(parentNode: Node) fun createNode( - parentNode: Node, buildContext: BuildContext, timelineMode: Timeline.Mode, ): Node diff --git a/features/location/api/src/main/kotlin/io/element/android/features/location/api/ShowLocationEntryPoint.kt b/features/location/api/src/main/kotlin/io/element/android/features/location/api/ShowLocationEntryPoint.kt index 7ae28a1e92..2bf4ac5871 100644 --- a/features/location/api/src/main/kotlin/io/element/android/features/location/api/ShowLocationEntryPoint.kt +++ b/features/location/api/src/main/kotlin/io/element/android/features/location/api/ShowLocationEntryPoint.kt @@ -15,5 +15,6 @@ import io.element.android.libraries.architecture.NodeInputs interface ShowLocationEntryPoint : FeatureEntryPoint { data class Inputs(val location: Location, val description: String?) : NodeInputs - fun createNode(parentNode: Node, buildContext: BuildContext, inputs: Inputs): Node + context(parentNode: Node) + fun createNode(buildContext: BuildContext, inputs: Inputs): Node } diff --git a/features/location/impl/src/main/kotlin/io/element/android/features/location/impl/send/DefaultSendLocationEntryPoint.kt b/features/location/impl/src/main/kotlin/io/element/android/features/location/impl/send/DefaultSendLocationEntryPoint.kt index 2a8e9309a1..6d14dc06dc 100644 --- a/features/location/impl/src/main/kotlin/io/element/android/features/location/impl/send/DefaultSendLocationEntryPoint.kt +++ b/features/location/impl/src/main/kotlin/io/element/android/features/location/impl/send/DefaultSendLocationEntryPoint.kt @@ -17,8 +17,8 @@ import io.element.android.libraries.matrix.api.timeline.Timeline @ContributesBinding(AppScope::class) class DefaultSendLocationEntryPoint : SendLocationEntryPoint { + context(parentNode: Node) override fun createNode( - parentNode: Node, buildContext: BuildContext, timelineMode: Timeline.Mode, ): Node { diff --git a/features/location/impl/src/main/kotlin/io/element/android/features/location/impl/show/DefaultShowLocationEntryPoint.kt b/features/location/impl/src/main/kotlin/io/element/android/features/location/impl/show/DefaultShowLocationEntryPoint.kt index 75a177d21a..ab2c45eb1a 100644 --- a/features/location/impl/src/main/kotlin/io/element/android/features/location/impl/show/DefaultShowLocationEntryPoint.kt +++ b/features/location/impl/src/main/kotlin/io/element/android/features/location/impl/show/DefaultShowLocationEntryPoint.kt @@ -16,7 +16,8 @@ import io.element.android.libraries.architecture.createNode @ContributesBinding(AppScope::class) class DefaultShowLocationEntryPoint : ShowLocationEntryPoint { - override fun createNode(parentNode: Node, buildContext: BuildContext, inputs: ShowLocationEntryPoint.Inputs): Node { + context(parentNode: Node) + override fun createNode(buildContext: BuildContext, inputs: ShowLocationEntryPoint.Inputs): Node { return parentNode.createNode(buildContext, listOf(inputs)) } } diff --git a/features/location/impl/src/test/kotlin/io/element/android/features/location/impl/send/DefaultSendLocationEntryPointTest.kt b/features/location/impl/src/test/kotlin/io/element/android/features/location/impl/send/DefaultSendLocationEntryPointTest.kt index 4cac3df6a2..ff3cc57dcf 100644 --- a/features/location/impl/src/test/kotlin/io/element/android/features/location/impl/send/DefaultSendLocationEntryPointTest.kt +++ b/features/location/impl/src/test/kotlin/io/element/android/features/location/impl/send/DefaultSendLocationEntryPointTest.kt @@ -47,11 +47,12 @@ class DefaultSendLocationEntryPointTest { ) } val timelineMode = Timeline.Mode.Live - val result = entryPoint.createNode( - parentNode = parentNode, - buildContext = BuildContext.root(null), - timelineMode = timelineMode, - ) + val result = with(parentNode) { + entryPoint.createNode( + buildContext = BuildContext.root(null), + timelineMode = timelineMode, + ) + } assertThat(result).isInstanceOf(SendLocationNode::class.java) assertThat(result.plugins).contains(SendLocationNode.Inputs(timelineMode)) } diff --git a/features/location/impl/src/test/kotlin/io/element/android/features/location/impl/show/DefaultShowLocationEntryPointTest.kt b/features/location/impl/src/test/kotlin/io/element/android/features/location/impl/show/DefaultShowLocationEntryPointTest.kt index d31ef0c0e4..b7d7a1be44 100644 --- a/features/location/impl/src/test/kotlin/io/element/android/features/location/impl/show/DefaultShowLocationEntryPointTest.kt +++ b/features/location/impl/src/test/kotlin/io/element/android/features/location/impl/show/DefaultShowLocationEntryPointTest.kt @@ -47,11 +47,12 @@ class DefaultShowLocationEntryPointTest { location = Location(37.4219983, -122.084, 10f), description = "My location", ) - val result = entryPoint.createNode( - parentNode, - BuildContext.root(null), - inputs = inputs, - ) + val result = with(parentNode) { + entryPoint.createNode( + buildContext = BuildContext.root(null), + inputs = inputs, + ) + } assertThat(result).isInstanceOf(ShowLocationNode::class.java) assertThat(result.plugins).contains(inputs) } diff --git a/features/lockscreen/api/src/main/kotlin/io/element/android/features/lockscreen/api/LockScreenEntryPoint.kt b/features/lockscreen/api/src/main/kotlin/io/element/android/features/lockscreen/api/LockScreenEntryPoint.kt index c7741ac197..c5c187db83 100644 --- a/features/lockscreen/api/src/main/kotlin/io/element/android/features/lockscreen/api/LockScreenEntryPoint.kt +++ b/features/lockscreen/api/src/main/kotlin/io/element/android/features/lockscreen/api/LockScreenEntryPoint.kt @@ -15,7 +15,9 @@ import com.bumble.appyx.core.plugin.Plugin import io.element.android.libraries.architecture.FeatureEntryPoint interface LockScreenEntryPoint : FeatureEntryPoint { - fun createNode(parentNode: Node, buildContext: BuildContext, navTarget: Target, callback: Callback): Node + context(parentNode: Node) + fun createNode(buildContext: BuildContext, navTarget: Target, callback: Callback): Node + fun pinUnlockIntent(context: Context): Intent interface Callback : Plugin { diff --git a/features/lockscreen/impl/src/main/kotlin/io/element/android/features/lockscreen/impl/DefaultLockScreenEntryPoint.kt b/features/lockscreen/impl/src/main/kotlin/io/element/android/features/lockscreen/impl/DefaultLockScreenEntryPoint.kt index 39430c5ad1..8651480c37 100644 --- a/features/lockscreen/impl/src/main/kotlin/io/element/android/features/lockscreen/impl/DefaultLockScreenEntryPoint.kt +++ b/features/lockscreen/impl/src/main/kotlin/io/element/android/features/lockscreen/impl/DefaultLockScreenEntryPoint.kt @@ -19,8 +19,8 @@ import io.element.android.libraries.architecture.createNode @ContributesBinding(AppScope::class) class DefaultLockScreenEntryPoint : LockScreenEntryPoint { + context(parentNode: Node) override fun createNode( - parentNode: Node, buildContext: BuildContext, navTarget: LockScreenEntryPoint.Target, callback: LockScreenEntryPoint.Callback, diff --git a/features/lockscreen/impl/src/test/kotlin/io/element/android/features/lockscreen/impl/DefaultLockScreenEntryPointTest.kt b/features/lockscreen/impl/src/test/kotlin/io/element/android/features/lockscreen/impl/DefaultLockScreenEntryPointTest.kt index 15473fe43c..425f5a70e3 100644 --- a/features/lockscreen/impl/src/test/kotlin/io/element/android/features/lockscreen/impl/DefaultLockScreenEntryPointTest.kt +++ b/features/lockscreen/impl/src/test/kotlin/io/element/android/features/lockscreen/impl/DefaultLockScreenEntryPointTest.kt @@ -37,12 +37,13 @@ class DefaultLockScreenEntryPointTest { override fun onSetupDone() = lambdaError() } val navTarget = LockScreenEntryPoint.Target.Setup - val result = entryPoint.createNode( - parentNode = parentNode, - buildContext = BuildContext.root(null), - navTarget = navTarget, - callback = callback, - ) + val result = with(parentNode) { + entryPoint.createNode( + buildContext = BuildContext.root(null), + navTarget = navTarget, + callback = callback, + ) + } assertThat(result).isInstanceOf(LockScreenFlowNode::class.java) assertThat(result.plugins).contains(LockScreenFlowNode.Inputs(LockScreenFlowNode.NavTarget.Setup)) assertThat(result.plugins).contains(callback) @@ -61,12 +62,13 @@ class DefaultLockScreenEntryPointTest { override fun onSetupDone() = lambdaError() } val navTarget = LockScreenEntryPoint.Target.Settings - val result = entryPoint.createNode( - parentNode = parentNode, - buildContext = BuildContext.root(null), - navTarget = navTarget, - callback = callback, - ) + val result = with(parentNode) { + entryPoint.createNode( + buildContext = BuildContext.root(null), + navTarget = navTarget, + callback = callback, + ) + } assertThat(result).isInstanceOf(LockScreenFlowNode::class.java) assertThat(result.plugins).contains(LockScreenFlowNode.Inputs(LockScreenFlowNode.NavTarget.Settings)) assertThat(result.plugins).contains(callback) diff --git a/features/login/api/src/main/kotlin/io/element/android/features/login/api/LoginEntryPoint.kt b/features/login/api/src/main/kotlin/io/element/android/features/login/api/LoginEntryPoint.kt index e2e60af1ed..b9f4228162 100644 --- a/features/login/api/src/main/kotlin/io/element/android/features/login/api/LoginEntryPoint.kt +++ b/features/login/api/src/main/kotlin/io/element/android/features/login/api/LoginEntryPoint.kt @@ -22,5 +22,6 @@ interface LoginEntryPoint : FeatureEntryPoint { fun navigateToBugReport() } - fun createNode(parentNode: Node, buildContext: BuildContext, params: Params, callback: Callback): Node + context(parentNode: Node) + fun createNode(buildContext: BuildContext, params: Params, callback: Callback): Node } diff --git a/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/DefaultLoginEntryPoint.kt b/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/DefaultLoginEntryPoint.kt index a95b7b54a7..327ec5036a 100644 --- a/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/DefaultLoginEntryPoint.kt +++ b/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/DefaultLoginEntryPoint.kt @@ -16,7 +16,8 @@ import io.element.android.libraries.architecture.createNode @ContributesBinding(AppScope::class) class DefaultLoginEntryPoint : LoginEntryPoint { - override fun createNode(parentNode: Node, buildContext: BuildContext, params: LoginEntryPoint.Params, callback: LoginEntryPoint.Callback): Node { + context(parentNode: Node) + override fun createNode(buildContext: BuildContext, params: LoginEntryPoint.Params, callback: LoginEntryPoint.Callback): Node { return parentNode.createNode( buildContext = buildContext, plugins = listOf( diff --git a/features/login/impl/src/test/kotlin/io/element/android/features/login/impl/DefaultLoginEntryPointTest.kt b/features/login/impl/src/test/kotlin/io/element/android/features/login/impl/DefaultLoginEntryPointTest.kt index 4a6f6cae22..2396831b1d 100644 --- a/features/login/impl/src/test/kotlin/io/element/android/features/login/impl/DefaultLoginEntryPointTest.kt +++ b/features/login/impl/src/test/kotlin/io/element/android/features/login/impl/DefaultLoginEntryPointTest.kt @@ -45,12 +45,13 @@ class DefaultLoginEntryPointTest { accountProvider = "ac", loginHint = "lh", ) - val result = entryPoint.createNode( - parentNode = parentNode, - buildContext = BuildContext.root(null), - params = params, - callback = callback, - ) + val result = with(parentNode) { + entryPoint.createNode( + buildContext = BuildContext.root(null), + params = params, + callback = callback, + ) + } assertThat(result).isInstanceOf(LoginFlowNode::class.java) assertThat(result.plugins).contains(LoginFlowNode.Params(params.accountProvider, params.loginHint)) assertThat(result.plugins).contains(callback) diff --git a/features/logout/api/src/main/kotlin/io/element/android/features/logout/api/LogoutEntryPoint.kt b/features/logout/api/src/main/kotlin/io/element/android/features/logout/api/LogoutEntryPoint.kt index 41ce730b1c..207f92a489 100644 --- a/features/logout/api/src/main/kotlin/io/element/android/features/logout/api/LogoutEntryPoint.kt +++ b/features/logout/api/src/main/kotlin/io/element/android/features/logout/api/LogoutEntryPoint.kt @@ -13,7 +13,8 @@ import com.bumble.appyx.core.plugin.Plugin import io.element.android.libraries.architecture.FeatureEntryPoint interface LogoutEntryPoint : FeatureEntryPoint { - fun createNode(parentNode: Node, buildContext: BuildContext, callback: Callback): Node + context(parentNode: Node) + fun createNode(buildContext: BuildContext, callback: Callback): Node interface Callback : Plugin { fun navigateToSecureBackup() diff --git a/features/logout/impl/src/main/kotlin/io/element/android/features/logout/impl/DefaultLogoutEntryPoint.kt b/features/logout/impl/src/main/kotlin/io/element/android/features/logout/impl/DefaultLogoutEntryPoint.kt index 4ca840ad04..42c11cf0d6 100644 --- a/features/logout/impl/src/main/kotlin/io/element/android/features/logout/impl/DefaultLogoutEntryPoint.kt +++ b/features/logout/impl/src/main/kotlin/io/element/android/features/logout/impl/DefaultLogoutEntryPoint.kt @@ -16,7 +16,8 @@ import io.element.android.libraries.architecture.createNode @ContributesBinding(AppScope::class) class DefaultLogoutEntryPoint : LogoutEntryPoint { - override fun createNode(parentNode: Node, buildContext: BuildContext, callback: LogoutEntryPoint.Callback): Node { + context(parentNode: Node) + override fun createNode(buildContext: BuildContext, callback: LogoutEntryPoint.Callback): Node { return parentNode.createNode(buildContext, listOf(callback)) } } diff --git a/features/logout/impl/src/test/kotlin/io/element/android/features/logout/impl/DefaultLogoutEntryPointTest.kt b/features/logout/impl/src/test/kotlin/io/element/android/features/logout/impl/DefaultLogoutEntryPointTest.kt index dd4b3b36fc..b319a30e44 100644 --- a/features/logout/impl/src/test/kotlin/io/element/android/features/logout/impl/DefaultLogoutEntryPointTest.kt +++ b/features/logout/impl/src/test/kotlin/io/element/android/features/logout/impl/DefaultLogoutEntryPointTest.kt @@ -34,11 +34,12 @@ class DefaultLogoutEntryPointTest { val callback = object : LogoutEntryPoint.Callback { override fun navigateToSecureBackup() = lambdaError() } - val result = entryPoint.createNode( - parentNode = parentNode, - buildContext = BuildContext.root(null), - callback = callback, - ) + val result = with(parentNode) { + entryPoint.createNode( + buildContext = BuildContext.root(null), + callback = callback, + ) + } assertThat(result).isInstanceOf(LogoutNode::class.java) assertThat(result.plugins).contains(callback) } diff --git a/features/messages/api/src/main/kotlin/io/element/android/features/messages/api/MessagesEntryPoint.kt b/features/messages/api/src/main/kotlin/io/element/android/features/messages/api/MessagesEntryPoint.kt index 46e20ab2d7..6f883bb683 100644 --- a/features/messages/api/src/main/kotlin/io/element/android/features/messages/api/MessagesEntryPoint.kt +++ b/features/messages/api/src/main/kotlin/io/element/android/features/messages/api/MessagesEntryPoint.kt @@ -41,7 +41,8 @@ interface MessagesEntryPoint : FeatureEntryPoint { data class Params(val initialTarget: InitialTarget) : NodeInputs - fun createNode(parentNode: Node, buildContext: BuildContext, params: Params, callback: Callback): Node + context(parentNode: Node) + fun createNode(buildContext: BuildContext, params: Params, callback: Callback): Node } interface MessagesEntryPointNode { diff --git a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/DefaultMessagesEntryPoint.kt b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/DefaultMessagesEntryPoint.kt index c48fafb6a2..90784912e6 100644 --- a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/DefaultMessagesEntryPoint.kt +++ b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/DefaultMessagesEntryPoint.kt @@ -16,7 +16,8 @@ import io.element.android.libraries.di.SessionScope @ContributesBinding(SessionScope::class) class DefaultMessagesEntryPoint : MessagesEntryPoint { - override fun createNode(parentNode: Node, buildContext: BuildContext, params: MessagesEntryPoint.Params, callback: MessagesEntryPoint.Callback): Node { + context(parentNode: Node) + override fun createNode(buildContext: BuildContext, params: MessagesEntryPoint.Params, callback: MessagesEntryPoint.Callback): Node { return parentNode.createNode(buildContext, listOf(params, callback)) } } diff --git a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/MessagesFlowNode.kt b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/MessagesFlowNode.kt index d8a684b8dd..0c700d5695 100644 --- a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/MessagesFlowNode.kt +++ b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/MessagesFlowNode.kt @@ -321,7 +321,6 @@ class MessagesFlowNode( } } mediaViewerEntryPoint.createNode( - parentNode = this, buildContext = buildContext, params = params, callback = callback @@ -337,7 +336,7 @@ class MessagesFlowNode( } is NavTarget.LocationViewer -> { val inputs = ShowLocationEntryPoint.Inputs(navTarget.location, navTarget.description) - showLocationEntryPoint.createNode(this, buildContext, inputs) + showLocationEntryPoint.createNode(buildContext, inputs) } is NavTarget.EventDebugInfo -> { val inputs = EventDebugInfoNode.Inputs(navTarget.eventId, navTarget.debugInfo) @@ -359,7 +358,6 @@ class MessagesFlowNode( } } forwardEntryPoint.createNode( - parentNode = this, buildContext = buildContext, params = params, callback = callback, @@ -371,14 +369,12 @@ class MessagesFlowNode( } is NavTarget.SendLocation -> { sendLocationEntryPoint.createNode( - parentNode = this, buildContext = buildContext, timelineMode = navTarget.timelineMode, ) } is NavTarget.CreatePoll -> { createPollEntryPoint.createNode( - parentNode = this, buildContext = buildContext, params = CreatePollEntryPoint.Params( timelineMode = navTarget.timelineMode, @@ -388,7 +384,6 @@ class MessagesFlowNode( } is NavTarget.EditPoll -> { createPollEntryPoint.createNode( - parentNode = this, buildContext = buildContext, params = CreatePollEntryPoint.Params( timelineMode = navTarget.timelineMode, @@ -428,7 +423,7 @@ class MessagesFlowNode( createNode(buildContext, plugins = listOf(callback)) } NavTarget.KnockRequestsList -> { - knockRequestsListEntryPoint.createNode(this, buildContext) + knockRequestsListEntryPoint.createNode(buildContext) } is NavTarget.Thread -> { val inputs = ThreadedMessagesNode.Inputs( diff --git a/features/messages/impl/src/test/kotlin/io/element/android/features/messages/impl/DefaultMessagesEntryPointTest.kt b/features/messages/impl/src/test/kotlin/io/element/android/features/messages/impl/DefaultMessagesEntryPointTest.kt index 774f38acf8..5032d324f7 100644 --- a/features/messages/impl/src/test/kotlin/io/element/android/features/messages/impl/DefaultMessagesEntryPointTest.kt +++ b/features/messages/impl/src/test/kotlin/io/element/android/features/messages/impl/DefaultMessagesEntryPointTest.kt @@ -66,18 +66,19 @@ class DefaultMessagesEntryPointTest { roomListService = FakeRoomListService(), sessionId = A_SESSION_ID, sendLocationEntryPoint = object : SendLocationEntryPoint { + context(parentNode: Node) override fun createNode( - parentNode: Node, buildContext: BuildContext, timelineMode: Timeline.Mode, ) = lambdaError() }, showLocationEntryPoint = object : ShowLocationEntryPoint { - override fun createNode(parentNode: Node, buildContext: BuildContext, inputs: ShowLocationEntryPoint.Inputs) = lambdaError() + context(parentNode: Node) + override fun createNode(buildContext: BuildContext, inputs: ShowLocationEntryPoint.Inputs) = lambdaError() }, createPollEntryPoint = object : CreatePollEntryPoint { + context(parentNode: Node) override fun createNode( - parentNode: Node, buildContext: BuildContext, params: Params, ) = lambdaError() @@ -99,16 +100,16 @@ class DefaultMessagesEntryPointTest { }, mediaViewerEntryPoint = object : MediaViewerEntryPoint { override fun createParamsForAvatar(filename: String, avatarUrl: String) = lambdaError() + context(parentNode: Node) override fun createNode( - parentNode: Node, buildContext: BuildContext, params: MediaViewerEntryPoint.Params, callback: MediaViewerEntryPoint.Callback, ) = lambdaError() }, forwardEntryPoint = object : ForwardEntryPoint { + context(parentNode: Node) override fun createNode( - parentNode: Node, buildContext: BuildContext, params: ForwardEntryPoint.Params, callback: ForwardEntryPoint.Callback, @@ -129,7 +130,8 @@ class DefaultMessagesEntryPointTest { pinnedEventsTimelineProvider = createPinnedEventsTimelineProvider(), timelineController = createTimelineController(), knockRequestsListEntryPoint = object : KnockRequestsListEntryPoint { - override fun createNode(parentNode: Node, buildContext: BuildContext) = lambdaError() + context(parentNode: Node) + override fun createNode(buildContext: BuildContext) = lambdaError() }, dateFormatter = FakeDateFormatter(), coroutineDispatchers = testCoroutineDispatchers(), @@ -144,12 +146,13 @@ class DefaultMessagesEntryPointTest { } val initialTarget = MessagesEntryPoint.InitialTarget.Messages(focusedEventId = AN_EVENT_ID) val params = MessagesEntryPoint.Params(initialTarget) - val result = entryPoint.createNode( - parentNode = parentNode, - buildContext = BuildContext.root(null), - params = params, - callback = callback, - ) + val result = with(parentNode) { + entryPoint.createNode( + buildContext = BuildContext.root(null), + params = params, + callback = callback, + ) + } assertThat(result).isInstanceOf(MessagesFlowNode::class.java) assertThat(result.plugins).contains(MessagesEntryPoint.Params(initialTarget)) assertThat(result.plugins).contains(callback) diff --git a/features/poll/api/src/main/kotlin/io/element/android/features/poll/api/create/CreatePollEntryPoint.kt b/features/poll/api/src/main/kotlin/io/element/android/features/poll/api/create/CreatePollEntryPoint.kt index 5d82fb1fd3..202ff9c7c1 100644 --- a/features/poll/api/src/main/kotlin/io/element/android/features/poll/api/create/CreatePollEntryPoint.kt +++ b/features/poll/api/src/main/kotlin/io/element/android/features/poll/api/create/CreatePollEntryPoint.kt @@ -18,5 +18,6 @@ interface CreatePollEntryPoint : FeatureEntryPoint { val mode: CreatePollMode, ) - fun createNode(parentNode: Node, buildContext: BuildContext, params: Params): Node + context(parentNode: Node) + fun createNode(buildContext: BuildContext, params: Params): Node } diff --git a/features/poll/impl/src/main/kotlin/io/element/android/features/poll/impl/create/DefaultCreatePollEntryPoint.kt b/features/poll/impl/src/main/kotlin/io/element/android/features/poll/impl/create/DefaultCreatePollEntryPoint.kt index 652f5db20d..5d3a6d66cb 100644 --- a/features/poll/impl/src/main/kotlin/io/element/android/features/poll/impl/create/DefaultCreatePollEntryPoint.kt +++ b/features/poll/impl/src/main/kotlin/io/element/android/features/poll/impl/create/DefaultCreatePollEntryPoint.kt @@ -16,7 +16,8 @@ import io.element.android.libraries.architecture.createNode @ContributesBinding(AppScope::class) class DefaultCreatePollEntryPoint : CreatePollEntryPoint { - override fun createNode(parentNode: Node, buildContext: BuildContext, params: CreatePollEntryPoint.Params): Node { + context(parentNode: Node) + override fun createNode(buildContext: BuildContext, params: CreatePollEntryPoint.Params): Node { return parentNode.createNode( buildContext = buildContext, plugins = listOf(CreatePollNode.Inputs(timelineMode = params.timelineMode, mode = params.mode)) diff --git a/features/poll/impl/src/main/kotlin/io/element/android/features/poll/impl/history/DefaultPollHistoryEntryPoint.kt b/features/poll/impl/src/main/kotlin/io/element/android/features/poll/impl/history/DefaultPollHistoryEntryPoint.kt index 7f867def0a..c309a5324e 100644 --- a/features/poll/impl/src/main/kotlin/io/element/android/features/poll/impl/history/DefaultPollHistoryEntryPoint.kt +++ b/features/poll/impl/src/main/kotlin/io/element/android/features/poll/impl/history/DefaultPollHistoryEntryPoint.kt @@ -16,7 +16,8 @@ import io.element.android.libraries.architecture.createNode @ContributesBinding(AppScope::class) class DefaultPollHistoryEntryPoint : PollHistoryEntryPoint { - override fun createNode(parentNode: Node, buildContext: BuildContext): Node { + context(parentNode: Node) + override fun createNode(buildContext: BuildContext): Node { return parentNode.createNode(buildContext) } } diff --git a/features/poll/impl/src/main/kotlin/io/element/android/features/poll/impl/history/PollHistoryFlowNode.kt b/features/poll/impl/src/main/kotlin/io/element/android/features/poll/impl/history/PollHistoryFlowNode.kt index 6b43a06d01..56ae72e58f 100644 --- a/features/poll/impl/src/main/kotlin/io/element/android/features/poll/impl/history/PollHistoryFlowNode.kt +++ b/features/poll/impl/src/main/kotlin/io/element/android/features/poll/impl/history/PollHistoryFlowNode.kt @@ -54,7 +54,6 @@ class PollHistoryFlowNode( return when (navTarget) { is NavTarget.EditPoll -> { createPollEntryPoint.createNode( - parentNode = this, buildContext = buildContext, params = CreatePollEntryPoint.Params( timelineMode = Timeline.Mode.Live, diff --git a/features/poll/impl/src/test/kotlin/io/element/android/features/poll/impl/create/DefaultCreatePollEntryPointTest.kt b/features/poll/impl/src/test/kotlin/io/element/android/features/poll/impl/create/DefaultCreatePollEntryPointTest.kt index 464fae98a0..14c41f50cd 100644 --- a/features/poll/impl/src/test/kotlin/io/element/android/features/poll/impl/create/DefaultCreatePollEntryPointTest.kt +++ b/features/poll/impl/src/test/kotlin/io/element/android/features/poll/impl/create/DefaultCreatePollEntryPointTest.kt @@ -53,11 +53,12 @@ class DefaultCreatePollEntryPointTest { timelineMode = Timeline.Mode.Live, mode = CreatePollMode.NewPoll, ) - val result = entryPoint.createNode( - parentNode = parentNode, - buildContext = BuildContext.root(null), - params = params, - ) + val result = with(parentNode) { + entryPoint.createNode( + buildContext = BuildContext.root(null), + params = params, + ) + } assertThat(result).isInstanceOf(CreatePollNode::class.java) assertThat(result.plugins).contains(CreatePollNode.Inputs(timelineMode = params.timelineMode, mode = params.mode)) } diff --git a/features/poll/impl/src/test/kotlin/io/element/android/features/poll/impl/history/DefaultPollHistoryEntryPointTest.kt b/features/poll/impl/src/test/kotlin/io/element/android/features/poll/impl/history/DefaultPollHistoryEntryPointTest.kt index fbec294962..2e8e21f93f 100644 --- a/features/poll/impl/src/test/kotlin/io/element/android/features/poll/impl/history/DefaultPollHistoryEntryPointTest.kt +++ b/features/poll/impl/src/test/kotlin/io/element/android/features/poll/impl/history/DefaultPollHistoryEntryPointTest.kt @@ -34,15 +34,17 @@ class DefaultPollHistoryEntryPointTest { buildContext = buildContext, plugins = plugins, createPollEntryPoint = object : CreatePollEntryPoint { + context(parentNode: Node) override fun createNode( - parentNode: Node, buildContext: BuildContext, params: CreatePollEntryPoint.Params, ) = lambdaError() } ) } - val result = entryPoint.createNode(parentNode, BuildContext.root(null)) + val result = with(parentNode) { + entryPoint.createNode(BuildContext.root(null)) + } assertThat(result).isInstanceOf(PollHistoryFlowNode::class.java) } } diff --git a/features/preferences/api/src/main/kotlin/io/element/android/features/preferences/api/PreferencesEntryPoint.kt b/features/preferences/api/src/main/kotlin/io/element/android/features/preferences/api/PreferencesEntryPoint.kt index d2e1db6b4b..af92b58cbb 100644 --- a/features/preferences/api/src/main/kotlin/io/element/android/features/preferences/api/PreferencesEntryPoint.kt +++ b/features/preferences/api/src/main/kotlin/io/element/android/features/preferences/api/PreferencesEntryPoint.kt @@ -31,7 +31,8 @@ interface PreferencesEntryPoint : FeatureEntryPoint { data class Params(val initialElement: InitialTarget) : NodeInputs - fun createNode(parentNode: Node, buildContext: BuildContext, params: Params, callback: Callback): Node + context(parentNode: Node) + fun createNode(buildContext: BuildContext, params: Params, callback: Callback): Node interface Callback : Plugin { fun navigateToAddAccount() diff --git a/features/preferences/impl/src/main/kotlin/io/element/android/features/preferences/impl/DefaultPreferencesEntryPoint.kt b/features/preferences/impl/src/main/kotlin/io/element/android/features/preferences/impl/DefaultPreferencesEntryPoint.kt index ffc9a2b798..338a3ff434 100644 --- a/features/preferences/impl/src/main/kotlin/io/element/android/features/preferences/impl/DefaultPreferencesEntryPoint.kt +++ b/features/preferences/impl/src/main/kotlin/io/element/android/features/preferences/impl/DefaultPreferencesEntryPoint.kt @@ -16,8 +16,8 @@ import io.element.android.libraries.architecture.createNode @ContributesBinding(AppScope::class) class DefaultPreferencesEntryPoint : PreferencesEntryPoint { + context(parentNode: Node) override fun createNode( - parentNode: Node, buildContext: BuildContext, params: PreferencesEntryPoint.Params, callback: PreferencesEntryPoint.Callback, diff --git a/features/preferences/impl/src/main/kotlin/io/element/android/features/preferences/impl/PreferencesFlowNode.kt b/features/preferences/impl/src/main/kotlin/io/element/android/features/preferences/impl/PreferencesFlowNode.kt index 0fcabfad28..ba5313dd7e 100644 --- a/features/preferences/impl/src/main/kotlin/io/element/android/features/preferences/impl/PreferencesFlowNode.kt +++ b/features/preferences/impl/src/main/kotlin/io/element/android/features/preferences/impl/PreferencesFlowNode.kt @@ -216,7 +216,6 @@ class PreferencesFlowNode( } NavTarget.TroubleshootNotifications -> { notificationTroubleShootEntryPoint.createNode( - parentNode = this, buildContext = buildContext, callback = object : NotificationTroubleShootEntryPoint.Callback { override fun onDone() { @@ -235,9 +234,8 @@ class PreferencesFlowNode( } NavTarget.PushHistory -> { pushHistoryEntryPoint.createNode( - this, - buildContext, - object : PushHistoryEntryPoint.Callback { + buildContext = buildContext, + callback = object : PushHistoryEntryPoint.Callback { override fun onDone() { if (backstack.canPop()) { backstack.pop() @@ -270,7 +268,6 @@ class PreferencesFlowNode( } NavTarget.LockScreenSettings -> { lockScreenEntryPoint.createNode( - parentNode = this, buildContext = buildContext, navTarget = LockScreenEntryPoint.Target.Settings, callback = object : LockScreenEntryPoint.Callback { @@ -290,16 +287,15 @@ class PreferencesFlowNode( } } logoutEntryPoint.createNode( - parentNode = this, buildContext = buildContext, callback = callBack, ) } is NavTarget.OssLicenses -> { - openSourceLicensesEntryPoint.createNode(this, buildContext) + openSourceLicensesEntryPoint.createNode(buildContext) } NavTarget.AccountDeactivation -> { - accountDeactivationEntryPoint.createNode(this, buildContext) + accountDeactivationEntryPoint.createNode(buildContext) } } } diff --git a/features/preferences/impl/src/test/kotlin/io/element/android/features/preferences/impl/DefaultPreferencesEntryPointTest.kt b/features/preferences/impl/src/test/kotlin/io/element/android/features/preferences/impl/DefaultPreferencesEntryPointTest.kt index e7c2f861d3..2a3d40b84a 100644 --- a/features/preferences/impl/src/test/kotlin/io/element/android/features/preferences/impl/DefaultPreferencesEntryPointTest.kt +++ b/features/preferences/impl/src/test/kotlin/io/element/android/features/preferences/impl/DefaultPreferencesEntryPointTest.kt @@ -42,8 +42,8 @@ class DefaultPreferencesEntryPointTest { buildContext = buildContext, plugins = plugins, lockScreenEntryPoint = object : LockScreenEntryPoint { + context(parentNode: Node) override fun createNode( - parentNode: Node, buildContext: BuildContext, navTarget: LockScreenEntryPoint.Target, callback: LockScreenEntryPoint.Callback, @@ -52,31 +52,33 @@ class DefaultPreferencesEntryPointTest { override fun pinUnlockIntent(context: Context) = lambdaError() }, notificationTroubleShootEntryPoint = object : NotificationTroubleShootEntryPoint { + context(parentNode: Node) override fun createNode( - parentNode: Node, buildContext: BuildContext, callback: NotificationTroubleShootEntryPoint.Callback, ) = lambdaError() }, pushHistoryEntryPoint = object : PushHistoryEntryPoint { + context(parentNode: Node) override fun createNode( - parentNode: Node, buildContext: BuildContext, callback: PushHistoryEntryPoint.Callback, ) = lambdaError() }, logoutEntryPoint = object : LogoutEntryPoint { + context(parentNode: Node) override fun createNode( - parentNode: Node, buildContext: BuildContext, callback: LogoutEntryPoint.Callback, ) = lambdaError() }, openSourceLicensesEntryPoint = object : OpenSourceLicensesEntryPoint { - override fun createNode(parentNode: Node, buildContext: BuildContext) = lambdaError() + context(parentNode: Node) + override fun createNode(buildContext: BuildContext) = lambdaError() }, accountDeactivationEntryPoint = object : AccountDeactivationEntryPoint { - override fun createNode(parentNode: Node, buildContext: BuildContext) = lambdaError() + context(parentNode: Node) + override fun createNode(buildContext: BuildContext) = lambdaError() }, ) } @@ -90,12 +92,13 @@ class DefaultPreferencesEntryPointTest { val params = PreferencesEntryPoint.Params( initialElement = PreferencesEntryPoint.InitialTarget.NotificationSettings, ) - val result = entryPoint.createNode( - parentNode = parentNode, - buildContext = BuildContext.root(null), - params = params, - callback = callback, - ) + val result = with(parentNode) { + entryPoint.createNode( + buildContext = BuildContext.root(null), + params = params, + callback = callback, + ) + } assertThat(result).isInstanceOf(PreferencesFlowNode::class.java) assertThat(result.plugins).contains(params) assertThat(result.plugins).contains(callback) diff --git a/features/rageshake/api/src/main/kotlin/io/element/android/features/rageshake/api/bugreport/BugReportEntryPoint.kt b/features/rageshake/api/src/main/kotlin/io/element/android/features/rageshake/api/bugreport/BugReportEntryPoint.kt index f0c73a9c0e..a8fbf56b75 100644 --- a/features/rageshake/api/src/main/kotlin/io/element/android/features/rageshake/api/bugreport/BugReportEntryPoint.kt +++ b/features/rageshake/api/src/main/kotlin/io/element/android/features/rageshake/api/bugreport/BugReportEntryPoint.kt @@ -13,7 +13,8 @@ import com.bumble.appyx.core.plugin.Plugin import io.element.android.libraries.architecture.FeatureEntryPoint interface BugReportEntryPoint : FeatureEntryPoint { - fun createNode(parentNode: Node, buildContext: BuildContext, callback: Callback): Node + context(parentNode: Node) + fun createNode(buildContext: BuildContext, callback: Callback): Node interface Callback : Plugin { fun onDone() diff --git a/features/rageshake/impl/src/main/kotlin/io/element/android/features/rageshake/impl/bugreport/BugReportFlowNode.kt b/features/rageshake/impl/src/main/kotlin/io/element/android/features/rageshake/impl/bugreport/BugReportFlowNode.kt index 8749199fd1..af0c06054f 100644 --- a/features/rageshake/impl/src/main/kotlin/io/element/android/features/rageshake/impl/bugreport/BugReportFlowNode.kt +++ b/features/rageshake/impl/src/main/kotlin/io/element/android/features/rageshake/impl/bugreport/BugReportFlowNode.kt @@ -78,7 +78,6 @@ class BugReportFlowNode( rootPath = navTarget.rootPath, ) viewFolderEntryPoint.createNode( - parentNode = this, buildContext = buildContext, params = params, callback = callback, diff --git a/features/rageshake/impl/src/main/kotlin/io/element/android/features/rageshake/impl/bugreport/DefaultBugReportEntryPoint.kt b/features/rageshake/impl/src/main/kotlin/io/element/android/features/rageshake/impl/bugreport/DefaultBugReportEntryPoint.kt index 57b4e1a3e5..ffdaf41167 100644 --- a/features/rageshake/impl/src/main/kotlin/io/element/android/features/rageshake/impl/bugreport/DefaultBugReportEntryPoint.kt +++ b/features/rageshake/impl/src/main/kotlin/io/element/android/features/rageshake/impl/bugreport/DefaultBugReportEntryPoint.kt @@ -16,7 +16,8 @@ import io.element.android.libraries.architecture.createNode @ContributesBinding(AppScope::class) class DefaultBugReportEntryPoint : BugReportEntryPoint { - override fun createNode(parentNode: Node, buildContext: BuildContext, callback: BugReportEntryPoint.Callback): Node { + context(parentNode: Node) + override fun createNode(buildContext: BuildContext, callback: BugReportEntryPoint.Callback): Node { return parentNode.createNode(buildContext, listOf(callback)) } } diff --git a/features/rageshake/impl/src/test/kotlin/io/element/android/features/rageshake/impl/bugreport/DefaultBugReportEntryPointTest.kt b/features/rageshake/impl/src/test/kotlin/io/element/android/features/rageshake/impl/bugreport/DefaultBugReportEntryPointTest.kt index bc4b805f2b..0294485a15 100644 --- a/features/rageshake/impl/src/test/kotlin/io/element/android/features/rageshake/impl/bugreport/DefaultBugReportEntryPointTest.kt +++ b/features/rageshake/impl/src/test/kotlin/io/element/android/features/rageshake/impl/bugreport/DefaultBugReportEntryPointTest.kt @@ -35,8 +35,8 @@ class DefaultBugReportEntryPointTest { buildContext = buildContext, plugins = plugins, viewFolderEntryPoint = object : ViewFolderEntryPoint { + context(parentNode: Node) override fun createNode( - parentNode: Node, buildContext: BuildContext, params: ViewFolderEntryPoint.Params, callback: ViewFolderEntryPoint.Callback, @@ -47,11 +47,12 @@ class DefaultBugReportEntryPointTest { val callback = object : BugReportEntryPoint.Callback { override fun onDone() = lambdaError() } - val result = entryPoint.createNode( - parentNode = parentNode, - buildContext = BuildContext.root(null), - callback = callback, - ) + val result = with(parentNode) { + entryPoint.createNode( + buildContext = BuildContext.root(null), + callback = callback, + ) + } assertThat(result).isInstanceOf(BugReportFlowNode::class.java) assertThat(result.plugins).contains(callback) } diff --git a/features/reportroom/api/src/main/kotlin/io/element/android/features/reportroom/api/ReportRoomEntryPoint.kt b/features/reportroom/api/src/main/kotlin/io/element/android/features/reportroom/api/ReportRoomEntryPoint.kt index 1eff7f8206..27d8fea348 100644 --- a/features/reportroom/api/src/main/kotlin/io/element/android/features/reportroom/api/ReportRoomEntryPoint.kt +++ b/features/reportroom/api/src/main/kotlin/io/element/android/features/reportroom/api/ReportRoomEntryPoint.kt @@ -13,5 +13,6 @@ import io.element.android.libraries.architecture.FeatureEntryPoint import io.element.android.libraries.matrix.api.core.RoomId fun interface ReportRoomEntryPoint : FeatureEntryPoint { - fun createNode(parentNode: Node, buildContext: BuildContext, roomId: RoomId): Node + context(parentNode: Node) + fun createNode(buildContext: BuildContext, roomId: RoomId): Node } diff --git a/features/reportroom/impl/src/main/kotlin/io/element/android/features/reportroom/impl/DefaultReportRoomEntryPoint.kt b/features/reportroom/impl/src/main/kotlin/io/element/android/features/reportroom/impl/DefaultReportRoomEntryPoint.kt index d2f9eb8d7e..a97f93d79e 100644 --- a/features/reportroom/impl/src/main/kotlin/io/element/android/features/reportroom/impl/DefaultReportRoomEntryPoint.kt +++ b/features/reportroom/impl/src/main/kotlin/io/element/android/features/reportroom/impl/DefaultReportRoomEntryPoint.kt @@ -17,7 +17,8 @@ import io.element.android.libraries.matrix.api.core.RoomId @ContributesBinding(AppScope::class) class DefaultReportRoomEntryPoint : ReportRoomEntryPoint { - override fun createNode(parentNode: Node, buildContext: BuildContext, roomId: RoomId): Node { + context(parentNode: Node) + override fun createNode(buildContext: BuildContext, roomId: RoomId): Node { return parentNode.createNode(buildContext, plugins = listOf(ReportRoomNode.Inputs(roomId))) } } diff --git a/features/reportroom/impl/src/test/kotlin/io/element/android/features/reportroom/impl/DefaultReportRoomEntryPointTest.kt b/features/reportroom/impl/src/test/kotlin/io/element/android/features/reportroom/impl/DefaultReportRoomEntryPointTest.kt index c9f850062e..16cd8d298f 100644 --- a/features/reportroom/impl/src/test/kotlin/io/element/android/features/reportroom/impl/DefaultReportRoomEntryPointTest.kt +++ b/features/reportroom/impl/src/test/kotlin/io/element/android/features/reportroom/impl/DefaultReportRoomEntryPointTest.kt @@ -32,7 +32,9 @@ class DefaultReportRoomEntryPointTest { } ) } - val result = entryPoint.createNode(parentNode, BuildContext.root(null), A_ROOM_ID) + val result = with(parentNode) { + entryPoint.createNode(BuildContext.root(null), A_ROOM_ID) + } assertThat(result).isInstanceOf(ReportRoomNode::class.java) assertThat(result.plugins).contains(ReportRoomNode.Inputs(A_ROOM_ID)) } diff --git a/features/roomaliasresolver/api/src/main/kotlin/io/element/android/features/roomaliasesolver/api/RoomAliasResolverEntryPoint.kt b/features/roomaliasresolver/api/src/main/kotlin/io/element/android/features/roomaliasesolver/api/RoomAliasResolverEntryPoint.kt index 28931e9b0d..067eed7d65 100644 --- a/features/roomaliasresolver/api/src/main/kotlin/io/element/android/features/roomaliasesolver/api/RoomAliasResolverEntryPoint.kt +++ b/features/roomaliasresolver/api/src/main/kotlin/io/element/android/features/roomaliasesolver/api/RoomAliasResolverEntryPoint.kt @@ -16,7 +16,8 @@ import io.element.android.libraries.matrix.api.core.RoomAlias import io.element.android.libraries.matrix.api.room.alias.ResolvedRoomAlias interface RoomAliasResolverEntryPoint : FeatureEntryPoint { - fun createNode(parentNode: Node, buildContext: BuildContext, params: Params, callback: Callback): Node + context(parentNode: Node) + fun createNode(buildContext: BuildContext, params: Params, callback: Callback): Node interface Callback : Plugin { fun onAliasResolved(data: ResolvedRoomAlias) diff --git a/features/roomaliasresolver/impl/src/main/kotlin/io/element/android/features/roomaliasresolver/impl/DefaultRoomAliasResolverEntryPoint.kt b/features/roomaliasresolver/impl/src/main/kotlin/io/element/android/features/roomaliasresolver/impl/DefaultRoomAliasResolverEntryPoint.kt index b6e4fe6716..405317d303 100644 --- a/features/roomaliasresolver/impl/src/main/kotlin/io/element/android/features/roomaliasresolver/impl/DefaultRoomAliasResolverEntryPoint.kt +++ b/features/roomaliasresolver/impl/src/main/kotlin/io/element/android/features/roomaliasresolver/impl/DefaultRoomAliasResolverEntryPoint.kt @@ -16,8 +16,8 @@ import io.element.android.libraries.architecture.createNode @ContributesBinding(AppScope::class) class DefaultRoomAliasResolverEntryPoint : RoomAliasResolverEntryPoint { + context(parentNode: Node) override fun createNode( - parentNode: Node, buildContext: BuildContext, params: RoomAliasResolverEntryPoint.Params, callback: RoomAliasResolverEntryPoint.Callback, diff --git a/features/roomaliasresolver/impl/src/test/kotlin/io/element/android/features/roomaliasresolver/impl/DefaultRoomAliasResolverEntryPointTest.kt b/features/roomaliasresolver/impl/src/test/kotlin/io/element/android/features/roomaliasresolver/impl/DefaultRoomAliasResolverEntryPointTest.kt index 6e3dbb2ba8..f7cc1d57c6 100644 --- a/features/roomaliasresolver/impl/src/test/kotlin/io/element/android/features/roomaliasresolver/impl/DefaultRoomAliasResolverEntryPointTest.kt +++ b/features/roomaliasresolver/impl/src/test/kotlin/io/element/android/features/roomaliasresolver/impl/DefaultRoomAliasResolverEntryPointTest.kt @@ -43,12 +43,13 @@ class DefaultRoomAliasResolverEntryPointTest { val params = RoomAliasResolverEntryPoint.Params( roomAlias = A_ROOM_ALIAS ) - val result = entryPoint.createNode( - parentNode = parentNode, - buildContext = BuildContext.root(null), - params = params, - callback = callback, - ) + val result = with(parentNode) { + entryPoint.createNode( + buildContext = BuildContext.root(null), + params = params, + callback = callback, + ) + } assertThat(result).isInstanceOf(RoomAliasResolverNode::class.java) assertThat(result.plugins).contains(params) assertThat(result.plugins).contains(callback) diff --git a/features/roomdetails/api/src/main/kotlin/io/element/android/features/roomdetails/api/RoomDetailsEntryPoint.kt b/features/roomdetails/api/src/main/kotlin/io/element/android/features/roomdetails/api/RoomDetailsEntryPoint.kt index bdee602f55..ce03aca20a 100644 --- a/features/roomdetails/api/src/main/kotlin/io/element/android/features/roomdetails/api/RoomDetailsEntryPoint.kt +++ b/features/roomdetails/api/src/main/kotlin/io/element/android/features/roomdetails/api/RoomDetailsEntryPoint.kt @@ -43,5 +43,6 @@ interface RoomDetailsEntryPoint : FeatureEntryPoint { fun startForwardEventFlow(eventId: EventId) } - fun createNode(parentNode: Node, buildContext: BuildContext, params: Params, callback: Callback): Node + context(parentNode: Node) + fun createNode(buildContext: BuildContext, params: Params, callback: Callback): Node } diff --git a/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/DefaultRoomDetailsEntryPoint.kt b/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/DefaultRoomDetailsEntryPoint.kt index 8066cc70f5..4f2fb1d741 100644 --- a/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/DefaultRoomDetailsEntryPoint.kt +++ b/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/DefaultRoomDetailsEntryPoint.kt @@ -18,8 +18,8 @@ import io.element.android.libraries.architecture.createNode @ContributesBinding(AppScope::class) class DefaultRoomDetailsEntryPoint : RoomDetailsEntryPoint { + context(parentNode: Node) override fun createNode( - parentNode: Node, buildContext: BuildContext, params: RoomDetailsEntryPoint.Params, callback: RoomDetailsEntryPoint.Callback, diff --git a/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/RoomDetailsFlowNode.kt b/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/RoomDetailsFlowNode.kt index 3ed0ce9d92..ad70f0f0a0 100644 --- a/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/RoomDetailsFlowNode.kt +++ b/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/RoomDetailsFlowNode.kt @@ -308,14 +308,13 @@ class RoomDetailsFlowNode( avatarUrl = navTarget.avatarUrl, ) mediaViewerEntryPoint.createNode( - parentNode = this, buildContext = buildContext, params = params, callback = callback, ) } is NavTarget.PollHistory -> { - pollHistoryEntryPoint.createNode(this, buildContext) + pollHistoryEntryPoint.createNode(buildContext) } is NavTarget.MediaGallery -> { val callback = object : MediaGalleryEntryPoint.Callback { @@ -336,7 +335,6 @@ class RoomDetailsFlowNode( } } mediaGalleryEntryPoint.createNode( - parentNode = this, buildContext = buildContext, callback = callback, ) @@ -367,14 +365,13 @@ class RoomDetailsFlowNode( } } return messagesEntryPoint.createNode( - parentNode = this, buildContext = buildContext, params = params, callback = callback, ) } NavTarget.KnockRequestsList -> { - knockRequestsListEntryPoint.createNode(this, buildContext) + knockRequestsListEntryPoint.createNode(buildContext) } NavTarget.SecurityAndPrivacy -> { createNode(buildContext) @@ -385,7 +382,6 @@ class RoomDetailsFlowNode( verificationRequest = VerificationRequest.Outgoing.User(userId = navTarget.userId) ) outgoingVerificationEntryPoint.createNode( - parentNode = this, buildContext = buildContext, params = params, callback = object : OutgoingVerificationEntryPoint.Callback { @@ -404,12 +400,11 @@ class RoomDetailsFlowNode( ) } is NavTarget.ReportRoom -> { - reportRoomEntryPoint.createNode(this, buildContext, room.roomId) + reportRoomEntryPoint.createNode(buildContext, room.roomId) } is NavTarget.SelectNewOwnersWhenLeaving -> { changeRoomMemberRolesEntryPoint.createNode( - parentNode = this, buildContext = buildContext, room = room, listType = ChangeRoomMemberRolesListType.SelectNewOwnersWhenLeaving, diff --git a/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/rolesandpermissions/RolesAndPermissionsFlowNode.kt b/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/rolesandpermissions/RolesAndPermissionsFlowNode.kt index aeee51a81d..0dee0c2a54 100644 --- a/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/rolesandpermissions/RolesAndPermissionsFlowNode.kt +++ b/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/rolesandpermissions/RolesAndPermissionsFlowNode.kt @@ -102,7 +102,6 @@ class RolesAndPermissionsFlowNode( } is NavTarget.AdminList -> { changeRoomMemberRolesEntryPoint.createNode( - parentNode = this, buildContext = buildContext, room = joinedRoom, listType = ChangeRoomMemberRolesListType.Admins, @@ -110,7 +109,6 @@ class RolesAndPermissionsFlowNode( } is NavTarget.ModeratorList -> { changeRoomMemberRolesEntryPoint.createNode( - parentNode = this, buildContext = buildContext, room = joinedRoom, listType = ChangeRoomMemberRolesListType.Moderators, diff --git a/features/roomdetails/impl/src/test/kotlin/io/element/android/features/roomdetails/impl/DefaultRoomDetailsEntryPointTest.kt b/features/roomdetails/impl/src/test/kotlin/io/element/android/features/roomdetails/impl/DefaultRoomDetailsEntryPointTest.kt index 6de949d0a4..a20aa80daa 100644 --- a/features/roomdetails/impl/src/test/kotlin/io/element/android/features/roomdetails/impl/DefaultRoomDetailsEntryPointTest.kt +++ b/features/roomdetails/impl/src/test/kotlin/io/element/android/features/roomdetails/impl/DefaultRoomDetailsEntryPointTest.kt @@ -53,7 +53,8 @@ class DefaultRoomDetailsEntryPointTest { buildContext = buildContext, plugins = plugins, pollHistoryEntryPoint = object : PollHistoryEntryPoint { - override fun createNode(parentNode: Node, buildContext: BuildContext) = lambdaError() + context(parentNode: Node) + override fun createNode(buildContext: BuildContext) = lambdaError() }, elementCallEntryPoint = object : ElementCallEntryPoint { override fun startCall(callType: CallType) = lambdaError() @@ -73,46 +74,49 @@ class DefaultRoomDetailsEntryPointTest { room = FakeJoinedRoom(), analyticsService = FakeAnalyticsService(), messagesEntryPoint = object : MessagesEntryPoint { + context(parentNode: Node) override fun createNode( - parentNode: Node, buildContext: BuildContext, params: MessagesEntryPoint.Params, callback: MessagesEntryPoint.Callback, ) = lambdaError() }, knockRequestsListEntryPoint = object : KnockRequestsListEntryPoint { - override fun createNode(parentNode: Node, buildContext: BuildContext) = lambdaError() + context(parentNode: Node) + override fun createNode(buildContext: BuildContext) = lambdaError() }, mediaViewerEntryPoint = object : MediaViewerEntryPoint { override fun createParamsForAvatar(filename: String, avatarUrl: String) = lambdaError() + + context(parentNode: Node) override fun createNode( - parentNode: Node, buildContext: BuildContext, params: MediaViewerEntryPoint.Params, callback: MediaViewerEntryPoint.Callback, ) = lambdaError() }, mediaGalleryEntryPoint = object : MediaGalleryEntryPoint { + context(parentNode: Node) override fun createNode( - parentNode: Node, buildContext: BuildContext, callback: MediaGalleryEntryPoint.Callback, ) = lambdaError() }, outgoingVerificationEntryPoint = object : OutgoingVerificationEntryPoint { + context(parentNode: Node) override fun createNode( - parentNode: Node, buildContext: BuildContext, params: OutgoingVerificationEntryPoint.Params, callback: OutgoingVerificationEntryPoint.Callback, ) = lambdaError() }, reportRoomEntryPoint = object : ReportRoomEntryPoint { - override fun createNode(parentNode: Node, buildContext: BuildContext, roomId: RoomId) = lambdaError() + context(parentNode: Node) + override fun createNode(buildContext: BuildContext, roomId: RoomId) = lambdaError() }, changeRoomMemberRolesEntryPoint = object : ChangeRoomMemberRolesEntryPoint { + context(parentNode: Node) override fun createNode( - parentNode: Node, buildContext: BuildContext, room: JoinedRoom, listType: ChangeRoomMemberRolesListType, @@ -129,12 +133,13 @@ class DefaultRoomDetailsEntryPointTest { val params = RoomDetailsEntryPoint.Params( initialElement = RoomDetailsEntryPoint.InitialTarget.RoomDetails, ) - val result = entryPoint.createNode( - parentNode = parentNode, - buildContext = BuildContext.root(null), - params = params, - callback = callback, - ) + val result = with(parentNode) { + entryPoint.createNode( + buildContext = BuildContext.root(null), + params = params, + callback = callback, + ) + } assertThat(result).isInstanceOf(RoomDetailsFlowNode::class.java) assertThat(result.plugins).contains(params) assertThat(result.plugins).contains(callback) diff --git a/features/roomdirectory/api/src/main/kotlin/io/element/android/features/roomdirectory/api/RoomDirectoryEntryPoint.kt b/features/roomdirectory/api/src/main/kotlin/io/element/android/features/roomdirectory/api/RoomDirectoryEntryPoint.kt index 88cea23a05..d290287c2c 100644 --- a/features/roomdirectory/api/src/main/kotlin/io/element/android/features/roomdirectory/api/RoomDirectoryEntryPoint.kt +++ b/features/roomdirectory/api/src/main/kotlin/io/element/android/features/roomdirectory/api/RoomDirectoryEntryPoint.kt @@ -13,7 +13,8 @@ import com.bumble.appyx.core.plugin.Plugin import io.element.android.libraries.architecture.FeatureEntryPoint interface RoomDirectoryEntryPoint : FeatureEntryPoint { - fun createNode(parentNode: Node, buildContext: BuildContext, callback: Callback): Node + context(parentNode: Node) + fun createNode(buildContext: BuildContext, callback: Callback): Node interface Callback : Plugin { fun navigateToRoom(roomDescription: RoomDescription) diff --git a/features/roomdirectory/impl/src/main/kotlin/io/element/android/features/roomdirectory/impl/DefaultRoomDirectoryEntryPoint.kt b/features/roomdirectory/impl/src/main/kotlin/io/element/android/features/roomdirectory/impl/DefaultRoomDirectoryEntryPoint.kt index a2f8921f66..55804d3f68 100644 --- a/features/roomdirectory/impl/src/main/kotlin/io/element/android/features/roomdirectory/impl/DefaultRoomDirectoryEntryPoint.kt +++ b/features/roomdirectory/impl/src/main/kotlin/io/element/android/features/roomdirectory/impl/DefaultRoomDirectoryEntryPoint.kt @@ -17,7 +17,8 @@ import io.element.android.libraries.architecture.createNode @ContributesBinding(AppScope::class) class DefaultRoomDirectoryEntryPoint : RoomDirectoryEntryPoint { - override fun createNode(parentNode: Node, buildContext: BuildContext, callback: RoomDirectoryEntryPoint.Callback): Node { + context(parentNode: Node) + override fun createNode(buildContext: BuildContext, callback: RoomDirectoryEntryPoint.Callback): Node { return parentNode.createNode(buildContext, listOf(callback)) } } diff --git a/features/roomdirectory/impl/src/test/kotlin/io/element/android/features/roomdirectory/impl/DefaultRoomDirectoryEntryPointTest.kt b/features/roomdirectory/impl/src/test/kotlin/io/element/android/features/roomdirectory/impl/DefaultRoomDirectoryEntryPointTest.kt index 24205d6681..332c89b2ae 100644 --- a/features/roomdirectory/impl/src/test/kotlin/io/element/android/features/roomdirectory/impl/DefaultRoomDirectoryEntryPointTest.kt +++ b/features/roomdirectory/impl/src/test/kotlin/io/element/android/features/roomdirectory/impl/DefaultRoomDirectoryEntryPointTest.kt @@ -37,11 +37,12 @@ class DefaultRoomDirectoryEntryPointTest { val callback = object : RoomDirectoryEntryPoint.Callback { override fun navigateToRoom(roomDescription: RoomDescription) = lambdaError() } - val result = entryPoint.createNode( - parentNode = parentNode, - buildContext = BuildContext.root(null), - callback = callback, - ) + val result = with(parentNode) { + entryPoint.createNode( + buildContext = BuildContext.root(null), + callback = callback, + ) + } assertThat(result).isInstanceOf(RoomDirectoryNode::class.java) assertThat(result.plugins).contains(callback) } diff --git a/features/securebackup/api/src/main/kotlin/io/element/android/features/securebackup/api/SecureBackupEntryPoint.kt b/features/securebackup/api/src/main/kotlin/io/element/android/features/securebackup/api/SecureBackupEntryPoint.kt index 8361ea5580..dbaa319034 100644 --- a/features/securebackup/api/src/main/kotlin/io/element/android/features/securebackup/api/SecureBackupEntryPoint.kt +++ b/features/securebackup/api/src/main/kotlin/io/element/android/features/securebackup/api/SecureBackupEntryPoint.kt @@ -32,7 +32,8 @@ interface SecureBackupEntryPoint : FeatureEntryPoint { data class Params(val initialElement: InitialTarget) : NodeInputs - fun createNode(parentNode: Node, buildContext: BuildContext, params: Params, callback: Callback): Node + context(parentNode: Node) + fun createNode(buildContext: BuildContext, params: Params, callback: Callback): Node interface Callback : Plugin { fun onDone() diff --git a/features/securebackup/impl/src/main/kotlin/io/element/android/features/securebackup/impl/DefaultSecureBackupEntryPoint.kt b/features/securebackup/impl/src/main/kotlin/io/element/android/features/securebackup/impl/DefaultSecureBackupEntryPoint.kt index b2c533b53b..49ea66dc79 100644 --- a/features/securebackup/impl/src/main/kotlin/io/element/android/features/securebackup/impl/DefaultSecureBackupEntryPoint.kt +++ b/features/securebackup/impl/src/main/kotlin/io/element/android/features/securebackup/impl/DefaultSecureBackupEntryPoint.kt @@ -16,8 +16,8 @@ import io.element.android.libraries.architecture.createNode @ContributesBinding(AppScope::class) class DefaultSecureBackupEntryPoint : SecureBackupEntryPoint { + context(parentNode: Node) override fun createNode( - parentNode: Node, buildContext: BuildContext, params: SecureBackupEntryPoint.Params, callback: SecureBackupEntryPoint.Callback, diff --git a/features/securebackup/impl/src/test/kotlin/io/element/android/features/securebackup/impl/DefaultSecureBackupEntryPointTest.kt b/features/securebackup/impl/src/test/kotlin/io/element/android/features/securebackup/impl/DefaultSecureBackupEntryPointTest.kt index 04d0030753..7a4c096bfc 100644 --- a/features/securebackup/impl/src/test/kotlin/io/element/android/features/securebackup/impl/DefaultSecureBackupEntryPointTest.kt +++ b/features/securebackup/impl/src/test/kotlin/io/element/android/features/securebackup/impl/DefaultSecureBackupEntryPointTest.kt @@ -37,12 +37,13 @@ class DefaultSecureBackupEntryPointTest { override fun onDone() = lambdaError() } val params = SecureBackupEntryPoint.Params(SecureBackupEntryPoint.InitialTarget.ResetIdentity) - val result = entryPoint.createNode( - parentNode = parentNode, - buildContext = BuildContext.root(null), - params = params, - callback = callback, - ) + val result = with(parentNode) { + entryPoint.createNode( + buildContext = BuildContext.root(null), + params = params, + callback = callback, + ) + } assertThat(result).isInstanceOf(SecureBackupFlowNode::class.java) assertThat(result.plugins).contains(params) assertThat(result.plugins).contains(callback) diff --git a/features/share/api/src/main/kotlin/io/element/android/features/share/api/ShareEntryPoint.kt b/features/share/api/src/main/kotlin/io/element/android/features/share/api/ShareEntryPoint.kt index 163bdf17af..fadd584355 100644 --- a/features/share/api/src/main/kotlin/io/element/android/features/share/api/ShareEntryPoint.kt +++ b/features/share/api/src/main/kotlin/io/element/android/features/share/api/ShareEntryPoint.kt @@ -17,7 +17,8 @@ import io.element.android.libraries.matrix.api.core.RoomId interface ShareEntryPoint : FeatureEntryPoint { data class Params(val intent: Intent) - fun createNode(parentNode: Node, buildContext: BuildContext, params: Params, callback: Callback): Node + context(parentNode: Node) + fun createNode(buildContext: BuildContext, params: Params, callback: Callback): Node interface Callback : Plugin { fun onDone(roomIds: List) diff --git a/features/share/impl/src/main/kotlin/io/element/android/features/share/impl/DefaultShareEntryPoint.kt b/features/share/impl/src/main/kotlin/io/element/android/features/share/impl/DefaultShareEntryPoint.kt index 83f4317e0d..6df01558e5 100644 --- a/features/share/impl/src/main/kotlin/io/element/android/features/share/impl/DefaultShareEntryPoint.kt +++ b/features/share/impl/src/main/kotlin/io/element/android/features/share/impl/DefaultShareEntryPoint.kt @@ -16,7 +16,8 @@ import io.element.android.libraries.di.SessionScope @ContributesBinding(SessionScope::class) class DefaultShareEntryPoint : ShareEntryPoint { - override fun createNode(parentNode: Node, buildContext: BuildContext, params: ShareEntryPoint.Params, callback: ShareEntryPoint.Callback): Node { + context(parentNode: Node) + override fun createNode(buildContext: BuildContext, params: ShareEntryPoint.Params, callback: ShareEntryPoint.Callback): Node { return parentNode.createNode( buildContext = buildContext, plugins = listOf( diff --git a/features/share/impl/src/main/kotlin/io/element/android/features/share/impl/ShareNode.kt b/features/share/impl/src/main/kotlin/io/element/android/features/share/impl/ShareNode.kt index 977211ca05..b3ce268d6c 100644 --- a/features/share/impl/src/main/kotlin/io/element/android/features/share/impl/ShareNode.kt +++ b/features/share/impl/src/main/kotlin/io/element/android/features/share/impl/ShareNode.kt @@ -67,7 +67,6 @@ class ShareNode( } return roomSelectEntryPoint.createNode( - parentNode = this, buildContext = buildContext, params = RoomSelectEntryPoint.Params(mode = RoomSelectMode.Share), callback = callback, diff --git a/features/share/impl/src/test/kotlin/io/element/android/features/share/impl/DefaultShareEntryPointTest.kt b/features/share/impl/src/test/kotlin/io/element/android/features/share/impl/DefaultShareEntryPointTest.kt index f93aac53ba..32207d3d46 100644 --- a/features/share/impl/src/test/kotlin/io/element/android/features/share/impl/DefaultShareEntryPointTest.kt +++ b/features/share/impl/src/test/kotlin/io/element/android/features/share/impl/DefaultShareEntryPointTest.kt @@ -38,8 +38,8 @@ class DefaultShareEntryPointTest { plugins = plugins, presenterFactory = { createSharePresenter() }, roomSelectEntryPoint = object : RoomSelectEntryPoint { + context(parentNode: Node) override fun createNode( - parentNode: Node, buildContext: BuildContext, params: RoomSelectEntryPoint.Params, callback: RoomSelectEntryPoint.Callback, @@ -53,12 +53,13 @@ class DefaultShareEntryPointTest { val params = ShareEntryPoint.Params( intent = Intent(), ) - val result = entryPoint.createNode( - parentNode = parentNode, - buildContext = BuildContext.root(null), - params = params, - callback = callback, - ) + val result = with(parentNode) { + entryPoint.createNode( + buildContext = BuildContext.root(null), + params = params, + callback = callback, + ) + } assertThat(result).isInstanceOf(ShareNode::class.java) assertThat(result.plugins).contains(ShareNode.Inputs(params.intent)) assertThat(result.plugins).contains(callback) diff --git a/features/signedout/api/src/main/kotlin/io/element/android/features/signedout/api/SignedOutEntryPoint.kt b/features/signedout/api/src/main/kotlin/io/element/android/features/signedout/api/SignedOutEntryPoint.kt index 12824bb12f..442ad1ef7d 100644 --- a/features/signedout/api/src/main/kotlin/io/element/android/features/signedout/api/SignedOutEntryPoint.kt +++ b/features/signedout/api/src/main/kotlin/io/element/android/features/signedout/api/SignedOutEntryPoint.kt @@ -17,5 +17,6 @@ interface SignedOutEntryPoint : FeatureEntryPoint { val sessionId: SessionId, ) - fun createNode(parentNode: Node, buildContext: BuildContext, params: Params): Node + context(parentNode: Node) + fun createNode(buildContext: BuildContext, params: Params): Node } diff --git a/features/signedout/impl/src/main/kotlin/io/element/android/features/signedout/impl/DefaultSignedOutEntryPoint.kt b/features/signedout/impl/src/main/kotlin/io/element/android/features/signedout/impl/DefaultSignedOutEntryPoint.kt index 8f89a8a0f9..d25dbf26ad 100644 --- a/features/signedout/impl/src/main/kotlin/io/element/android/features/signedout/impl/DefaultSignedOutEntryPoint.kt +++ b/features/signedout/impl/src/main/kotlin/io/element/android/features/signedout/impl/DefaultSignedOutEntryPoint.kt @@ -16,7 +16,8 @@ import io.element.android.libraries.architecture.createNode @ContributesBinding(AppScope::class) class DefaultSignedOutEntryPoint : SignedOutEntryPoint { - override fun createNode(parentNode: Node, buildContext: BuildContext, params: SignedOutEntryPoint.Params): Node { + context(parentNode: Node) + override fun createNode(buildContext: BuildContext, params: SignedOutEntryPoint.Params): Node { return parentNode.createNode( buildContext = buildContext, plugins = listOf(SignedOutNode.Inputs(params.sessionId)) diff --git a/features/signedout/impl/src/test/kotlin/io/element/android/features/signedout/impl/DefaultSignedOutEntryPointTest.kt b/features/signedout/impl/src/test/kotlin/io/element/android/features/signedout/impl/DefaultSignedOutEntryPointTest.kt index 64c48d9a5f..b6ef121c47 100644 --- a/features/signedout/impl/src/test/kotlin/io/element/android/features/signedout/impl/DefaultSignedOutEntryPointTest.kt +++ b/features/signedout/impl/src/test/kotlin/io/element/android/features/signedout/impl/DefaultSignedOutEntryPointTest.kt @@ -34,11 +34,12 @@ class DefaultSignedOutEntryPointTest { ) } val params = SignedOutEntryPoint.Params(A_SESSION_ID) - val result = entryPoint.createNode( - parentNode = parentNode, - buildContext = BuildContext.root(null), - params = params, - ) + val result = with(parentNode) { + entryPoint.createNode( + buildContext = BuildContext.root(null), + params = params, + ) + } assertThat(result).isInstanceOf(SignedOutNode::class.java) assertThat(result.plugins).contains(SignedOutNode.Inputs(params.sessionId)) } diff --git a/features/space/api/src/main/kotlin/io/element/android/features/space/api/SpaceEntryPoint.kt b/features/space/api/src/main/kotlin/io/element/android/features/space/api/SpaceEntryPoint.kt index 6b5bd7f892..d4d6f8d97b 100644 --- a/features/space/api/src/main/kotlin/io/element/android/features/space/api/SpaceEntryPoint.kt +++ b/features/space/api/src/main/kotlin/io/element/android/features/space/api/SpaceEntryPoint.kt @@ -15,8 +15,8 @@ import io.element.android.libraries.architecture.NodeInputs import io.element.android.libraries.matrix.api.core.RoomId interface SpaceEntryPoint : FeatureEntryPoint { + context(parentNode: Node) fun createNode( - parentNode: Node, buildContext: BuildContext, inputs: Inputs, callback: Callback diff --git a/features/space/impl/src/main/kotlin/io/element/android/features/space/impl/DefaultSpaceEntryPoint.kt b/features/space/impl/src/main/kotlin/io/element/android/features/space/impl/DefaultSpaceEntryPoint.kt index e68bbc89db..8ceafc6ffb 100644 --- a/features/space/impl/src/main/kotlin/io/element/android/features/space/impl/DefaultSpaceEntryPoint.kt +++ b/features/space/impl/src/main/kotlin/io/element/android/features/space/impl/DefaultSpaceEntryPoint.kt @@ -16,7 +16,8 @@ import io.element.android.libraries.di.SessionScope @ContributesBinding(SessionScope::class) class DefaultSpaceEntryPoint : SpaceEntryPoint { - override fun createNode(parentNode: Node, buildContext: BuildContext, inputs: SpaceEntryPoint.Inputs, callback: SpaceEntryPoint.Callback): Node { + context(parentNode: Node) + override fun createNode(buildContext: BuildContext, inputs: SpaceEntryPoint.Inputs, callback: SpaceEntryPoint.Callback): Node { return parentNode.createNode( buildContext = buildContext, plugins = listOf(inputs, callback), diff --git a/features/space/impl/src/test/kotlin/io/element/android/features/space/impl/DefaultSpaceEntryPointTest.kt b/features/space/impl/src/test/kotlin/io/element/android/features/space/impl/DefaultSpaceEntryPointTest.kt index 3fd260dd4f..78931c4caf 100644 --- a/features/space/impl/src/test/kotlin/io/element/android/features/space/impl/DefaultSpaceEntryPointTest.kt +++ b/features/space/impl/src/test/kotlin/io/element/android/features/space/impl/DefaultSpaceEntryPointTest.kt @@ -48,12 +48,13 @@ class DefaultSpaceEntryPointTest { override fun navigateToRoomDetails() = lambdaError() override fun navigateToRoomMemberList() = lambdaError() } - val result = entryPoint.createNode( - parentNode = parentNode, - buildContext = BuildContext.root(null), - inputs = nodeInputs, - callback = callback, - ) + val result = with(parentNode) { + entryPoint.createNode( + buildContext = BuildContext.root(null), + inputs = nodeInputs, + callback = callback, + ) + } assertThat(result).isInstanceOf(SpaceFlowNode::class.java) assertThat(result.plugins).contains(nodeInputs) assertThat(result.plugins).contains(callback) diff --git a/features/startchat/api/src/main/kotlin/io/element/android/features/startchat/api/StartChatEntryPoint.kt b/features/startchat/api/src/main/kotlin/io/element/android/features/startchat/api/StartChatEntryPoint.kt index 0e530b3943..92376974ec 100644 --- a/features/startchat/api/src/main/kotlin/io/element/android/features/startchat/api/StartChatEntryPoint.kt +++ b/features/startchat/api/src/main/kotlin/io/element/android/features/startchat/api/StartChatEntryPoint.kt @@ -14,7 +14,8 @@ import io.element.android.libraries.architecture.FeatureEntryPoint import io.element.android.libraries.matrix.api.core.RoomIdOrAlias interface StartChatEntryPoint : FeatureEntryPoint { - fun createNode(parentNode: Node, buildContext: BuildContext, callback: Callback): Node + context(parentNode: Node) + fun createNode(buildContext: BuildContext, callback: Callback): Node interface Callback : Plugin { fun onRoomCreated(roomIdOrAlias: RoomIdOrAlias, serverNames: List) diff --git a/features/startchat/impl/src/main/kotlin/io/element/android/features/startchat/impl/DefaultStartChatEntryPoint.kt b/features/startchat/impl/src/main/kotlin/io/element/android/features/startchat/impl/DefaultStartChatEntryPoint.kt index 18df585fa0..043cd0df1c 100644 --- a/features/startchat/impl/src/main/kotlin/io/element/android/features/startchat/impl/DefaultStartChatEntryPoint.kt +++ b/features/startchat/impl/src/main/kotlin/io/element/android/features/startchat/impl/DefaultStartChatEntryPoint.kt @@ -16,7 +16,8 @@ import io.element.android.libraries.architecture.createNode @ContributesBinding(AppScope::class) class DefaultStartChatEntryPoint : StartChatEntryPoint { - override fun createNode(parentNode: Node, buildContext: BuildContext, callback: StartChatEntryPoint.Callback): Node { + context(parentNode: Node) + override fun createNode(buildContext: BuildContext, callback: StartChatEntryPoint.Callback): Node { return parentNode.createNode(buildContext, listOf(callback)) } } diff --git a/features/startchat/impl/src/main/kotlin/io/element/android/features/startchat/impl/StartChatFlowNode.kt b/features/startchat/impl/src/main/kotlin/io/element/android/features/startchat/impl/StartChatFlowNode.kt index ee30f4997c..e3c846895c 100644 --- a/features/startchat/impl/src/main/kotlin/io/element/android/features/startchat/impl/StartChatFlowNode.kt +++ b/features/startchat/impl/src/main/kotlin/io/element/android/features/startchat/impl/StartChatFlowNode.kt @@ -80,7 +80,6 @@ class StartChatFlowNode( } } createRoomEntryPoint.createNode( - parentNode = this, buildContext = buildContext, callback = callback, ) diff --git a/features/startchat/impl/src/test/kotlin/io/element/android/features/startchat/impl/DefaultStartChatEntryPointTest.kt b/features/startchat/impl/src/test/kotlin/io/element/android/features/startchat/impl/DefaultStartChatEntryPointTest.kt index 2ead91b31c..248848b764 100644 --- a/features/startchat/impl/src/test/kotlin/io/element/android/features/startchat/impl/DefaultStartChatEntryPointTest.kt +++ b/features/startchat/impl/src/test/kotlin/io/element/android/features/startchat/impl/DefaultStartChatEntryPointTest.kt @@ -35,8 +35,8 @@ class DefaultStartChatEntryPointTest { buildContext = buildContext, plugins = plugins, createRoomEntryPoint = object : CreateRoomEntryPoint { + context(parentNode: Node) override fun createNode( - parentNode: Node, buildContext: BuildContext, callback: CreateRoomEntryPoint.Callback, ) = lambdaError() @@ -47,11 +47,12 @@ class DefaultStartChatEntryPointTest { override fun onRoomCreated(roomIdOrAlias: RoomIdOrAlias, serverNames: List) = lambdaError() override fun navigateToRoomDirectory() = lambdaError() } - val result = entryPoint.createNode( - parentNode = parentNode, - buildContext = BuildContext.root(null), - callback = callback, - ) + val result = with(parentNode) { + entryPoint.createNode( + buildContext = BuildContext.root(null), + callback = callback, + ) + } assertThat(result).isInstanceOf(StartChatFlowNode::class.java) assertThat(result.plugins).contains(callback) } diff --git a/features/userprofile/api/src/main/kotlin/io/element/android/features/userprofile/api/UserProfileEntryPoint.kt b/features/userprofile/api/src/main/kotlin/io/element/android/features/userprofile/api/UserProfileEntryPoint.kt index 4053efea0d..d9ab4ff9e5 100644 --- a/features/userprofile/api/src/main/kotlin/io/element/android/features/userprofile/api/UserProfileEntryPoint.kt +++ b/features/userprofile/api/src/main/kotlin/io/element/android/features/userprofile/api/UserProfileEntryPoint.kt @@ -22,5 +22,6 @@ interface UserProfileEntryPoint : FeatureEntryPoint { fun navigateToRoom(roomId: RoomId) } - fun createNode(parentNode: Node, buildContext: BuildContext, params: Params, callback: Callback): Node + context(parentNode: Node) + fun createNode(buildContext: BuildContext, params: Params, callback: Callback): Node } diff --git a/features/userprofile/impl/src/main/kotlin/io/element/android/features/userprofile/impl/DefaultUserProfileEntryPoint.kt b/features/userprofile/impl/src/main/kotlin/io/element/android/features/userprofile/impl/DefaultUserProfileEntryPoint.kt index e69ef185c0..71353b2cb2 100644 --- a/features/userprofile/impl/src/main/kotlin/io/element/android/features/userprofile/impl/DefaultUserProfileEntryPoint.kt +++ b/features/userprofile/impl/src/main/kotlin/io/element/android/features/userprofile/impl/DefaultUserProfileEntryPoint.kt @@ -16,8 +16,8 @@ import io.element.android.libraries.architecture.createNode @ContributesBinding(AppScope::class) class DefaultUserProfileEntryPoint : UserProfileEntryPoint { + context(parentNode: Node) override fun createNode( - parentNode: Node, buildContext: BuildContext, params: UserProfileEntryPoint.Params, callback: UserProfileEntryPoint.Callback, diff --git a/features/userprofile/impl/src/main/kotlin/io/element/android/features/userprofile/impl/UserProfileFlowNode.kt b/features/userprofile/impl/src/main/kotlin/io/element/android/features/userprofile/impl/UserProfileFlowNode.kt index fd019c3587..187fe36b87 100644 --- a/features/userprofile/impl/src/main/kotlin/io/element/android/features/userprofile/impl/UserProfileFlowNode.kt +++ b/features/userprofile/impl/src/main/kotlin/io/element/android/features/userprofile/impl/UserProfileFlowNode.kt @@ -112,7 +112,6 @@ class UserProfileFlowNode( avatarUrl = navTarget.avatarUrl, ) mediaViewerEntryPoint.createNode( - parentNode = this, buildContext = buildContext, params = params, callback = callback, @@ -124,7 +123,6 @@ class UserProfileFlowNode( verificationRequest = VerificationRequest.Outgoing.User(userId = navTarget.userId) ) outgoingVerificationEntryPoint.createNode( - parentNode = this, buildContext = buildContext, params = params, callback = object : OutgoingVerificationEntryPoint.Callback { diff --git a/features/userprofile/impl/src/test/kotlin/io/element/android/features/userprofile/impl/DefaultUserProfileEntryPointTest.kt b/features/userprofile/impl/src/test/kotlin/io/element/android/features/userprofile/impl/DefaultUserProfileEntryPointTest.kt index 486f72f672..3772b4d415 100644 --- a/features/userprofile/impl/src/test/kotlin/io/element/android/features/userprofile/impl/DefaultUserProfileEntryPointTest.kt +++ b/features/userprofile/impl/src/test/kotlin/io/element/android/features/userprofile/impl/DefaultUserProfileEntryPointTest.kt @@ -60,16 +60,16 @@ class DefaultUserProfileEntryPointTest { }, mediaViewerEntryPoint = object : MediaViewerEntryPoint { override fun createParamsForAvatar(filename: String, avatarUrl: String) = lambdaError() + context(parentNode: Node) override fun createNode( - parentNode: Node, buildContext: BuildContext, params: MediaViewerEntryPoint.Params, callback: MediaViewerEntryPoint.Callback ) = lambdaError() }, outgoingVerificationEntryPoint = object : OutgoingVerificationEntryPoint { + context(parentNode: Node) override fun createNode( - parentNode: Node, buildContext: BuildContext, params: OutgoingVerificationEntryPoint.Params, callback: OutgoingVerificationEntryPoint.Callback, @@ -85,12 +85,13 @@ class DefaultUserProfileEntryPointTest { val params = UserProfileEntryPoint.Params( userId = A_USER_ID, ) - val result = entryPoint.createNode( - parentNode = parentNode, - buildContext = BuildContext.root(null), - params = params, - callback = callback, - ) + val result = with(parentNode) { + entryPoint.createNode( + buildContext = BuildContext.root(null), + params = params, + callback = callback, + ) + } assertThat(result).isInstanceOf(UserProfileFlowNode::class.java) assertThat(result.plugins).contains(params) assertThat(result.plugins).contains(callback) diff --git a/features/verifysession/api/src/main/kotlin/io/element/android/features/verifysession/api/IncomingVerificationEntryPoint.kt b/features/verifysession/api/src/main/kotlin/io/element/android/features/verifysession/api/IncomingVerificationEntryPoint.kt index c72f7d4f6b..c09b47e581 100644 --- a/features/verifysession/api/src/main/kotlin/io/element/android/features/verifysession/api/IncomingVerificationEntryPoint.kt +++ b/features/verifysession/api/src/main/kotlin/io/element/android/features/verifysession/api/IncomingVerificationEntryPoint.kt @@ -19,7 +19,8 @@ interface IncomingVerificationEntryPoint : FeatureEntryPoint { val verificationRequest: VerificationRequest.Incoming, ) : NodeInputs - fun createNode(parentNode: Node, buildContext: BuildContext, params: Params, callback: Callback): Node + context(parentNode: Node) + fun createNode(buildContext: BuildContext, params: Params, callback: Callback): Node interface Callback : Plugin { fun onDone() diff --git a/features/verifysession/api/src/main/kotlin/io/element/android/features/verifysession/api/OutgoingVerificationEntryPoint.kt b/features/verifysession/api/src/main/kotlin/io/element/android/features/verifysession/api/OutgoingVerificationEntryPoint.kt index 36a04b43c7..372426e0d8 100644 --- a/features/verifysession/api/src/main/kotlin/io/element/android/features/verifysession/api/OutgoingVerificationEntryPoint.kt +++ b/features/verifysession/api/src/main/kotlin/io/element/android/features/verifysession/api/OutgoingVerificationEntryPoint.kt @@ -20,7 +20,8 @@ interface OutgoingVerificationEntryPoint : FeatureEntryPoint { val verificationRequest: VerificationRequest.Outgoing, ) : NodeInputs - fun createNode(parentNode: Node, buildContext: BuildContext, params: Params, callback: Callback): Node + context(parentNode: Node) + fun createNode(buildContext: BuildContext, params: Params, callback: Callback): Node interface Callback : Plugin { fun navigateToLearnMoreAboutEncryption() diff --git a/features/verifysession/impl/src/main/kotlin/io/element/android/features/verifysession/impl/incoming/DefaultIncomingVerificationEntryPoint.kt b/features/verifysession/impl/src/main/kotlin/io/element/android/features/verifysession/impl/incoming/DefaultIncomingVerificationEntryPoint.kt index 9d6d91c79a..26f0597ca2 100644 --- a/features/verifysession/impl/src/main/kotlin/io/element/android/features/verifysession/impl/incoming/DefaultIncomingVerificationEntryPoint.kt +++ b/features/verifysession/impl/src/main/kotlin/io/element/android/features/verifysession/impl/incoming/DefaultIncomingVerificationEntryPoint.kt @@ -16,8 +16,8 @@ import io.element.android.libraries.architecture.createNode @ContributesBinding(AppScope::class) class DefaultIncomingVerificationEntryPoint : IncomingVerificationEntryPoint { + context(parentNode: Node) override fun createNode( - parentNode: Node, buildContext: BuildContext, params: IncomingVerificationEntryPoint.Params, callback: IncomingVerificationEntryPoint.Callback, diff --git a/features/verifysession/impl/src/main/kotlin/io/element/android/features/verifysession/impl/outgoing/DefaultOutgoingVerificationEntryPoint.kt b/features/verifysession/impl/src/main/kotlin/io/element/android/features/verifysession/impl/outgoing/DefaultOutgoingVerificationEntryPoint.kt index 3328b1df1e..ab29d152f4 100644 --- a/features/verifysession/impl/src/main/kotlin/io/element/android/features/verifysession/impl/outgoing/DefaultOutgoingVerificationEntryPoint.kt +++ b/features/verifysession/impl/src/main/kotlin/io/element/android/features/verifysession/impl/outgoing/DefaultOutgoingVerificationEntryPoint.kt @@ -16,8 +16,8 @@ import io.element.android.libraries.architecture.createNode @ContributesBinding(AppScope::class) class DefaultOutgoingVerificationEntryPoint : OutgoingVerificationEntryPoint { + context(parentNode: Node) override fun createNode( - parentNode: Node, buildContext: BuildContext, params: OutgoingVerificationEntryPoint.Params, callback: OutgoingVerificationEntryPoint.Callback, diff --git a/features/verifysession/impl/src/test/kotlin/io/element/android/features/verifysession/impl/incoming/DefaultIncomingVerificationEntryPointTest.kt b/features/verifysession/impl/src/test/kotlin/io/element/android/features/verifysession/impl/incoming/DefaultIncomingVerificationEntryPointTest.kt index 437657b811..3a8743dccd 100644 --- a/features/verifysession/impl/src/test/kotlin/io/element/android/features/verifysession/impl/incoming/DefaultIncomingVerificationEntryPointTest.kt +++ b/features/verifysession/impl/src/test/kotlin/io/element/android/features/verifysession/impl/incoming/DefaultIncomingVerificationEntryPointTest.kt @@ -37,12 +37,13 @@ class DefaultIncomingVerificationEntryPointTest { val params = IncomingVerificationEntryPoint.Params( verificationRequest = anIncomingSessionVerificationRequest() ) - val result = entryPoint.createNode( - parentNode = parentNode, - buildContext = BuildContext.root(null), - params = params, - callback = callback, - ) + val result = with(parentNode) { + entryPoint.createNode( + buildContext = BuildContext.root(null), + params = params, + callback = callback, + ) + } assertThat(result).isInstanceOf(IncomingVerificationNode::class.java) assertThat(result.plugins).contains(params) assertThat(result.plugins).contains(callback) diff --git a/features/verifysession/impl/src/test/kotlin/io/element/android/features/verifysession/impl/outgoing/DefaultOutgoingVerificationEntryPointTest.kt b/features/verifysession/impl/src/test/kotlin/io/element/android/features/verifysession/impl/outgoing/DefaultOutgoingVerificationEntryPointTest.kt index 80906bc86a..1f9213a680 100644 --- a/features/verifysession/impl/src/test/kotlin/io/element/android/features/verifysession/impl/outgoing/DefaultOutgoingVerificationEntryPointTest.kt +++ b/features/verifysession/impl/src/test/kotlin/io/element/android/features/verifysession/impl/outgoing/DefaultOutgoingVerificationEntryPointTest.kt @@ -42,12 +42,13 @@ class DefaultOutgoingVerificationEntryPointTest { showDeviceVerifiedScreen = true, verificationRequest = anOutgoingSessionVerificationRequest(), ) - val result = entryPoint.createNode( - parentNode = parentNode, - buildContext = BuildContext.root(null), - params = params, - callback = callback, - ) + val result = with(parentNode) { + entryPoint.createNode( + buildContext = BuildContext.root(null), + params = params, + callback = callback, + ) + } assertThat(result).isInstanceOf(OutgoingVerificationNode::class.java) assertThat(result.plugins).contains(params) assertThat(result.plugins).contains(callback) diff --git a/features/viewfolder/api/src/main/kotlin/io/element/android/features/viewfolder/api/ViewFolderEntryPoint.kt b/features/viewfolder/api/src/main/kotlin/io/element/android/features/viewfolder/api/ViewFolderEntryPoint.kt index 1778ad0fc0..97f6ffbf9e 100644 --- a/features/viewfolder/api/src/main/kotlin/io/element/android/features/viewfolder/api/ViewFolderEntryPoint.kt +++ b/features/viewfolder/api/src/main/kotlin/io/element/android/features/viewfolder/api/ViewFolderEntryPoint.kt @@ -17,7 +17,8 @@ interface ViewFolderEntryPoint : FeatureEntryPoint { val rootPath: String, ) - fun createNode(parentNode: Node, buildContext: BuildContext, params: Params, callback: Callback): Node + context(parentNode: Node) + fun createNode(buildContext: BuildContext, params: Params, callback: Callback): Node interface Callback : Plugin { fun onDone() diff --git a/features/viewfolder/impl/src/main/kotlin/io/element/android/features/viewfolder/impl/DefaultViewFolderEntryPoint.kt b/features/viewfolder/impl/src/main/kotlin/io/element/android/features/viewfolder/impl/DefaultViewFolderEntryPoint.kt index d1d7af9117..8999b853a8 100644 --- a/features/viewfolder/impl/src/main/kotlin/io/element/android/features/viewfolder/impl/DefaultViewFolderEntryPoint.kt +++ b/features/viewfolder/impl/src/main/kotlin/io/element/android/features/viewfolder/impl/DefaultViewFolderEntryPoint.kt @@ -17,7 +17,8 @@ import io.element.android.libraries.architecture.createNode @ContributesBinding(AppScope::class) class DefaultViewFolderEntryPoint : ViewFolderEntryPoint { - override fun createNode(parentNode: Node, buildContext: BuildContext, params: ViewFolderEntryPoint.Params, callback: ViewFolderEntryPoint.Callback): Node { + context(parentNode: Node) + override fun createNode(buildContext: BuildContext, params: ViewFolderEntryPoint.Params, callback: ViewFolderEntryPoint.Callback): Node { return parentNode.createNode( buildContext = buildContext, plugins = listOf( diff --git a/features/viewfolder/impl/src/test/kotlin/io/element/android/features/viewfolder/impl/DefaultViewFolderEntryPointTest.kt b/features/viewfolder/impl/src/test/kotlin/io/element/android/features/viewfolder/impl/DefaultViewFolderEntryPointTest.kt index a8e643e1f5..ae0f4b9f2e 100644 --- a/features/viewfolder/impl/src/test/kotlin/io/element/android/features/viewfolder/impl/DefaultViewFolderEntryPointTest.kt +++ b/features/viewfolder/impl/src/test/kotlin/io/element/android/features/viewfolder/impl/DefaultViewFolderEntryPointTest.kt @@ -40,12 +40,13 @@ class DefaultViewFolderEntryPointTest { val params = ViewFolderEntryPoint.Params( rootPath = "path", ) - val result = entryPoint.createNode( - parentNode = parentNode, - buildContext = BuildContext.root(null), - params = params, - callback = callback, - ) + val result = with(parentNode) { + entryPoint.createNode( + buildContext = BuildContext.root(null), + params = params, + callback = callback, + ) + } assertThat(result).isInstanceOf(ViewFolderFlowNode::class.java) assertThat(result.plugins).contains(ViewFolderFlowNode.Inputs(params.rootPath)) assertThat(result.plugins).contains(callback) diff --git a/libraries/accountselect/api/src/main/kotlin/io/element/android/libraries/accountselect/api/AccountSelectEntryPoint.kt b/libraries/accountselect/api/src/main/kotlin/io/element/android/libraries/accountselect/api/AccountSelectEntryPoint.kt index 8ce2023655..bb2de92662 100644 --- a/libraries/accountselect/api/src/main/kotlin/io/element/android/libraries/accountselect/api/AccountSelectEntryPoint.kt +++ b/libraries/accountselect/api/src/main/kotlin/io/element/android/libraries/accountselect/api/AccountSelectEntryPoint.kt @@ -14,7 +14,8 @@ import io.element.android.libraries.architecture.FeatureEntryPoint import io.element.android.libraries.matrix.api.core.SessionId interface AccountSelectEntryPoint : FeatureEntryPoint { - fun createNode(parentNode: Node, buildContext: BuildContext, callback: Callback): Node + context(parentNode: Node) + fun createNode(buildContext: BuildContext, callback: Callback): Node interface Callback : Plugin { fun onAccountSelected(sessionId: SessionId) diff --git a/libraries/accountselect/impl/src/main/kotlin/io/element/android/libraries/accountselect/impl/DefaultAccountSelectEntryPoint.kt b/libraries/accountselect/impl/src/main/kotlin/io/element/android/libraries/accountselect/impl/DefaultAccountSelectEntryPoint.kt index 21e26d376b..9ecaaf5787 100644 --- a/libraries/accountselect/impl/src/main/kotlin/io/element/android/libraries/accountselect/impl/DefaultAccountSelectEntryPoint.kt +++ b/libraries/accountselect/impl/src/main/kotlin/io/element/android/libraries/accountselect/impl/DefaultAccountSelectEntryPoint.kt @@ -16,7 +16,8 @@ import io.element.android.libraries.architecture.createNode @ContributesBinding(AppScope::class) class DefaultAccountSelectEntryPoint : AccountSelectEntryPoint { - override fun createNode(parentNode: Node, buildContext: BuildContext, callback: AccountSelectEntryPoint.Callback): Node { + context(parentNode: Node) + override fun createNode(buildContext: BuildContext, callback: AccountSelectEntryPoint.Callback): Node { return parentNode.createNode(buildContext, listOf(callback)) } } diff --git a/libraries/accountselect/impl/src/test/kotlin/io/element/android/libraries/accountselect/impl/DefaultAccountSelectEntryPointTest.kt b/libraries/accountselect/impl/src/test/kotlin/io/element/android/libraries/accountselect/impl/DefaultAccountSelectEntryPointTest.kt index b36fcb5ab8..ae3ceb29c7 100644 --- a/libraries/accountselect/impl/src/test/kotlin/io/element/android/libraries/accountselect/impl/DefaultAccountSelectEntryPointTest.kt +++ b/libraries/accountselect/impl/src/test/kotlin/io/element/android/libraries/accountselect/impl/DefaultAccountSelectEntryPointTest.kt @@ -35,11 +35,12 @@ class DefaultAccountSelectEntryPointTest { override fun onAccountSelected(sessionId: SessionId) = lambdaError() override fun onCancel() = lambdaError() } - val result = entryPoint.createNode( - parentNode = parentNode, - buildContext = BuildContext.root(null), - callback = callback, - ) + val result = with(parentNode) { + entryPoint.createNode( + buildContext = BuildContext.root(null), + callback = callback, + ) + } assertThat(result).isInstanceOf(AccountSelectNode::class.java) assertThat(result.plugins).contains(callback) } diff --git a/libraries/architecture/src/main/kotlin/io/element/android/libraries/architecture/FeatureEntryPoint.kt b/libraries/architecture/src/main/kotlin/io/element/android/libraries/architecture/FeatureEntryPoint.kt index d5a932b705..c8b0a00213 100644 --- a/libraries/architecture/src/main/kotlin/io/element/android/libraries/architecture/FeatureEntryPoint.kt +++ b/libraries/architecture/src/main/kotlin/io/element/android/libraries/architecture/FeatureEntryPoint.kt @@ -19,5 +19,6 @@ interface FeatureEntryPoint * Can be used when the feature only exposes a simple node without the need of plugins. */ fun interface SimpleFeatureEntryPoint : FeatureEntryPoint { - fun createNode(parentNode: Node, buildContext: BuildContext): Node + context(parentNode: Node) + fun createNode(buildContext: BuildContext): Node } diff --git a/libraries/mediaviewer/api/src/main/kotlin/io/element/android/libraries/mediaviewer/api/MediaGalleryEntryPoint.kt b/libraries/mediaviewer/api/src/main/kotlin/io/element/android/libraries/mediaviewer/api/MediaGalleryEntryPoint.kt index b3e832da22..b7257e4ed5 100644 --- a/libraries/mediaviewer/api/src/main/kotlin/io/element/android/libraries/mediaviewer/api/MediaGalleryEntryPoint.kt +++ b/libraries/mediaviewer/api/src/main/kotlin/io/element/android/libraries/mediaviewer/api/MediaGalleryEntryPoint.kt @@ -14,7 +14,8 @@ import io.element.android.libraries.architecture.FeatureEntryPoint import io.element.android.libraries.matrix.api.core.EventId interface MediaGalleryEntryPoint : FeatureEntryPoint { - fun createNode(parentNode: Node, buildContext: BuildContext, callback: Callback): Node + context(parentNode: Node) + fun createNode(buildContext: BuildContext, callback: Callback): Node interface Callback : Plugin { fun onBackClick() diff --git a/libraries/mediaviewer/api/src/main/kotlin/io/element/android/libraries/mediaviewer/api/MediaViewerEntryPoint.kt b/libraries/mediaviewer/api/src/main/kotlin/io/element/android/libraries/mediaviewer/api/MediaViewerEntryPoint.kt index 2b17b63b26..a926deb015 100644 --- a/libraries/mediaviewer/api/src/main/kotlin/io/element/android/libraries/mediaviewer/api/MediaViewerEntryPoint.kt +++ b/libraries/mediaviewer/api/src/main/kotlin/io/element/android/libraries/mediaviewer/api/MediaViewerEntryPoint.kt @@ -19,7 +19,8 @@ import io.element.android.libraries.matrix.api.timeline.Timeline import kotlinx.parcelize.Parcelize interface MediaViewerEntryPoint : FeatureEntryPoint { - fun createNode(parentNode: Node, buildContext: BuildContext, params: Params, callback: Callback): Node + context(parentNode: Node) + fun createNode(buildContext: BuildContext, params: Params, callback: Callback): Node fun createParamsForAvatar(filename: String, avatarUrl: String): Params diff --git a/libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/DefaultMediaGalleryEntryPoint.kt b/libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/DefaultMediaGalleryEntryPoint.kt index 515c04bc20..78a15c1997 100644 --- a/libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/DefaultMediaGalleryEntryPoint.kt +++ b/libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/DefaultMediaGalleryEntryPoint.kt @@ -17,7 +17,8 @@ import io.element.android.libraries.mediaviewer.impl.gallery.root.MediaGalleryFl @ContributesBinding(AppScope::class) class DefaultMediaGalleryEntryPoint : MediaGalleryEntryPoint { - override fun createNode(parentNode: Node, buildContext: BuildContext, callback: MediaGalleryEntryPoint.Callback): Node { + context(parentNode: Node) + override fun createNode(buildContext: BuildContext, callback: MediaGalleryEntryPoint.Callback): Node { return parentNode.createNode( buildContext = buildContext, plugins = listOf(callback), diff --git a/libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/DefaultMediaViewerEntryPoint.kt b/libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/DefaultMediaViewerEntryPoint.kt index 7d683bf3df..a1d11811c4 100644 --- a/libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/DefaultMediaViewerEntryPoint.kt +++ b/libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/DefaultMediaViewerEntryPoint.kt @@ -48,8 +48,8 @@ class DefaultMediaViewerEntryPoint : MediaViewerEntryPoint { ) } + context(parentNode: Node) override fun createNode( - parentNode: Node, buildContext: BuildContext, params: MediaViewerEntryPoint.Params, callback: MediaViewerEntryPoint.Callback, diff --git a/libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/gallery/root/MediaGalleryFlowNode.kt b/libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/gallery/root/MediaGalleryFlowNode.kt index cc71b49dac..8b6ec84eb5 100644 --- a/libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/gallery/root/MediaGalleryFlowNode.kt +++ b/libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/gallery/root/MediaGalleryFlowNode.kt @@ -125,7 +125,6 @@ class MediaGalleryFlowNode( } } mediaViewerEntryPoint.createNode( - parentNode = this, buildContext = buildContext, params = MediaViewerEntryPoint.Params( mode = navTarget.mode, diff --git a/libraries/mediaviewer/impl/src/test/kotlin/io/element/android/libraries/mediaviewer/impl/DefaultMediaGalleryEntryPointTest.kt b/libraries/mediaviewer/impl/src/test/kotlin/io/element/android/libraries/mediaviewer/impl/DefaultMediaGalleryEntryPointTest.kt index 8b2574054b..3c54966090 100644 --- a/libraries/mediaviewer/impl/src/test/kotlin/io/element/android/libraries/mediaviewer/impl/DefaultMediaGalleryEntryPointTest.kt +++ b/libraries/mediaviewer/impl/src/test/kotlin/io/element/android/libraries/mediaviewer/impl/DefaultMediaGalleryEntryPointTest.kt @@ -37,8 +37,8 @@ class DefaultMediaGalleryEntryPointTest { plugins = plugins, mediaViewerEntryPoint = object : MediaViewerEntryPoint { override fun createParamsForAvatar(filename: String, avatarUrl: String) = lambdaError() + context(parentNode: Node) override fun createNode( - parentNode: Node, buildContext: BuildContext, params: MediaViewerEntryPoint.Params, callback: MediaViewerEntryPoint.Callback, @@ -51,11 +51,12 @@ class DefaultMediaGalleryEntryPointTest { override fun viewInTimeline(eventId: EventId) = lambdaError() override fun forward(eventId: EventId) = lambdaError() } - val result = entryPoint.createNode( - parentNode = parentNode, - buildContext = BuildContext.root(null), - callback = callback, - ) + val result = with(parentNode) { + entryPoint.createNode( + buildContext = BuildContext.root(null), + callback = callback, + ) + } assertThat(result).isInstanceOf(MediaGalleryFlowNode::class.java) assertThat(result.plugins).contains(callback) } diff --git a/libraries/mediaviewer/impl/src/test/kotlin/io/element/android/libraries/mediaviewer/impl/DefaultMediaViewerEntryPointTest.kt b/libraries/mediaviewer/impl/src/test/kotlin/io/element/android/libraries/mediaviewer/impl/DefaultMediaViewerEntryPointTest.kt index b53fe7913c..2929badf82 100644 --- a/libraries/mediaviewer/impl/src/test/kotlin/io/element/android/libraries/mediaviewer/impl/DefaultMediaViewerEntryPointTest.kt +++ b/libraries/mediaviewer/impl/src/test/kotlin/io/element/android/libraries/mediaviewer/impl/DefaultMediaViewerEntryPointTest.kt @@ -75,12 +75,13 @@ class DefaultMediaViewerEntryPointTest { override fun forwardEvent(eventId: EventId) = lambdaError() } val params = createMediaViewerEntryPointParams() - val result = entryPoint.createNode( - parentNode = parentNode, - buildContext = BuildContext.root(null), - params = params, - callback = callback, - ) + val result = with(parentNode) { + entryPoint.createNode( + buildContext = BuildContext.root(null), + params = params, + callback = callback, + ) + } assertThat(result).isInstanceOf(MediaViewerNode::class.java) assertThat(result.plugins).contains(params) assertThat(result.plugins).contains(callback) @@ -124,12 +125,13 @@ class DefaultMediaViewerEntryPointTest { filename = "fn", avatarUrl = "avatarUrl", ) - val result = entryPoint.createNode( - parentNode = parentNode, - buildContext = BuildContext.root(null), - params = params, - callback = callback, - ) + val result = with(parentNode) { + entryPoint.createNode( + buildContext = BuildContext.root(null), + params = params, + callback = callback, + ) + } assertThat(result).isInstanceOf(MediaViewerNode::class.java) assertThat(result.plugins).contains( MediaViewerEntryPoint.Params( diff --git a/libraries/roomselect/api/src/main/kotlin/io/element/android/libraries/roomselect/api/RoomSelectEntryPoint.kt b/libraries/roomselect/api/src/main/kotlin/io/element/android/libraries/roomselect/api/RoomSelectEntryPoint.kt index 7cc581d921..08aa8a2d34 100644 --- a/libraries/roomselect/api/src/main/kotlin/io/element/android/libraries/roomselect/api/RoomSelectEntryPoint.kt +++ b/libraries/roomselect/api/src/main/kotlin/io/element/android/libraries/roomselect/api/RoomSelectEntryPoint.kt @@ -18,7 +18,8 @@ interface RoomSelectEntryPoint : FeatureEntryPoint { val mode: RoomSelectMode, ) - fun createNode(parentNode: Node, buildContext: BuildContext, params: Params, callback: Callback): Node + context(parentNode: Node) + fun createNode(buildContext: BuildContext, params: Params, callback: Callback): Node interface Callback : Plugin { fun onRoomSelected(roomIds: List) diff --git a/libraries/roomselect/impl/src/main/kotlin/io/element/android/libraries/roomselect/impl/DefaultRoomSelectEntryPoint.kt b/libraries/roomselect/impl/src/main/kotlin/io/element/android/libraries/roomselect/impl/DefaultRoomSelectEntryPoint.kt index 5ba20ffd8f..15da921a49 100644 --- a/libraries/roomselect/impl/src/main/kotlin/io/element/android/libraries/roomselect/impl/DefaultRoomSelectEntryPoint.kt +++ b/libraries/roomselect/impl/src/main/kotlin/io/element/android/libraries/roomselect/impl/DefaultRoomSelectEntryPoint.kt @@ -16,7 +16,8 @@ import io.element.android.libraries.roomselect.api.RoomSelectEntryPoint @ContributesBinding(SessionScope::class) class DefaultRoomSelectEntryPoint : RoomSelectEntryPoint { - override fun createNode(parentNode: Node, buildContext: BuildContext, params: RoomSelectEntryPoint.Params, callback: RoomSelectEntryPoint.Callback): Node { + context(parentNode: Node) + override fun createNode(buildContext: BuildContext, params: RoomSelectEntryPoint.Params, callback: RoomSelectEntryPoint.Callback): Node { return parentNode.createNode( buildContext = buildContext, plugins = listOf( diff --git a/libraries/roomselect/impl/src/test/kotlin/io/element/android/libraries/roomselect/impl/DefaultRoomSelectEntryPointTest.kt b/libraries/roomselect/impl/src/test/kotlin/io/element/android/libraries/roomselect/impl/DefaultRoomSelectEntryPointTest.kt index 0bd16f77b0..6bb68b9707 100644 --- a/libraries/roomselect/impl/src/test/kotlin/io/element/android/libraries/roomselect/impl/DefaultRoomSelectEntryPointTest.kt +++ b/libraries/roomselect/impl/src/test/kotlin/io/element/android/libraries/roomselect/impl/DefaultRoomSelectEntryPointTest.kt @@ -42,12 +42,13 @@ class DefaultRoomSelectEntryPointTest { override fun onCancel() = lambdaError() } val params = RoomSelectEntryPoint.Params(testMode) - val result = entryPoint.createNode( - parentNode = parentNode, - buildContext = BuildContext.root(null), - params = params, - callback = callback, - ) + val result = with(parentNode) { + entryPoint.createNode( + buildContext = BuildContext.root(null), + params = params, + callback = callback, + ) + } assertThat(result).isInstanceOf(RoomSelectNode::class.java) assertThat(result.plugins).contains(RoomSelectNode.Inputs(params.mode)) assertThat(result.plugins).contains(callback) diff --git a/libraries/troubleshoot/api/src/main/kotlin/io/element/android/libraries/troubleshoot/api/NotificationTroubleShootEntryPoint.kt b/libraries/troubleshoot/api/src/main/kotlin/io/element/android/libraries/troubleshoot/api/NotificationTroubleShootEntryPoint.kt index 5e5774cdba..ae32ace777 100644 --- a/libraries/troubleshoot/api/src/main/kotlin/io/element/android/libraries/troubleshoot/api/NotificationTroubleShootEntryPoint.kt +++ b/libraries/troubleshoot/api/src/main/kotlin/io/element/android/libraries/troubleshoot/api/NotificationTroubleShootEntryPoint.kt @@ -13,7 +13,8 @@ import com.bumble.appyx.core.plugin.Plugin import io.element.android.libraries.architecture.FeatureEntryPoint interface NotificationTroubleShootEntryPoint : FeatureEntryPoint { - fun createNode(parentNode: Node, buildContext: BuildContext, callback: Callback): Node + context(parentNode: Node) + fun createNode(buildContext: BuildContext, callback: Callback): Node interface Callback : Plugin { fun onDone() diff --git a/libraries/troubleshoot/api/src/main/kotlin/io/element/android/libraries/troubleshoot/api/PushHistoryEntryPoint.kt b/libraries/troubleshoot/api/src/main/kotlin/io/element/android/libraries/troubleshoot/api/PushHistoryEntryPoint.kt index 6836bb59d0..ba11199330 100644 --- a/libraries/troubleshoot/api/src/main/kotlin/io/element/android/libraries/troubleshoot/api/PushHistoryEntryPoint.kt +++ b/libraries/troubleshoot/api/src/main/kotlin/io/element/android/libraries/troubleshoot/api/PushHistoryEntryPoint.kt @@ -15,7 +15,8 @@ import io.element.android.libraries.matrix.api.core.EventId import io.element.android.libraries.matrix.api.core.RoomId interface PushHistoryEntryPoint : FeatureEntryPoint { - fun createNode(parentNode: Node, buildContext: BuildContext, callback: Callback): Node + context(parentNode: Node) + fun createNode(buildContext: BuildContext, callback: Callback): Node interface Callback : Plugin { fun onDone() diff --git a/libraries/troubleshoot/impl/src/main/kotlin/io/element/android/libraries/troubleshoot/impl/DefaultNotificationTroubleShootEntryPoint.kt b/libraries/troubleshoot/impl/src/main/kotlin/io/element/android/libraries/troubleshoot/impl/DefaultNotificationTroubleShootEntryPoint.kt index f7b946647b..7404aed8ed 100644 --- a/libraries/troubleshoot/impl/src/main/kotlin/io/element/android/libraries/troubleshoot/impl/DefaultNotificationTroubleShootEntryPoint.kt +++ b/libraries/troubleshoot/impl/src/main/kotlin/io/element/android/libraries/troubleshoot/impl/DefaultNotificationTroubleShootEntryPoint.kt @@ -16,7 +16,8 @@ import io.element.android.libraries.troubleshoot.api.NotificationTroubleShootEnt @ContributesBinding(AppScope::class) class DefaultNotificationTroubleShootEntryPoint : NotificationTroubleShootEntryPoint { - override fun createNode(parentNode: Node, buildContext: BuildContext, callback: NotificationTroubleShootEntryPoint.Callback): Node { + context(parentNode: Node) + override fun createNode(buildContext: BuildContext, callback: NotificationTroubleShootEntryPoint.Callback): Node { return parentNode.createNode(buildContext, listOf(callback)) } } diff --git a/libraries/troubleshoot/impl/src/main/kotlin/io/element/android/libraries/troubleshoot/impl/history/DefaultPushHistoryEntryPoint.kt b/libraries/troubleshoot/impl/src/main/kotlin/io/element/android/libraries/troubleshoot/impl/history/DefaultPushHistoryEntryPoint.kt index 505d4d2b61..8477d39714 100644 --- a/libraries/troubleshoot/impl/src/main/kotlin/io/element/android/libraries/troubleshoot/impl/history/DefaultPushHistoryEntryPoint.kt +++ b/libraries/troubleshoot/impl/src/main/kotlin/io/element/android/libraries/troubleshoot/impl/history/DefaultPushHistoryEntryPoint.kt @@ -16,7 +16,8 @@ import io.element.android.libraries.troubleshoot.api.PushHistoryEntryPoint @ContributesBinding(AppScope::class) class DefaultPushHistoryEntryPoint : PushHistoryEntryPoint { - override fun createNode(parentNode: Node, buildContext: BuildContext, callback: PushHistoryEntryPoint.Callback): Node { + context(parentNode: Node) + override fun createNode(buildContext: BuildContext, callback: PushHistoryEntryPoint.Callback): Node { return parentNode.createNode(buildContext, listOf(callback)) } } diff --git a/libraries/troubleshoot/impl/src/test/kotlin/io/element/android/libraries/troubleshoot/impl/DefaultNotificationTroubleShootEntryPointTest.kt b/libraries/troubleshoot/impl/src/test/kotlin/io/element/android/libraries/troubleshoot/impl/DefaultNotificationTroubleShootEntryPointTest.kt index 1eef24fbcb..cf4c62b9b4 100644 --- a/libraries/troubleshoot/impl/src/test/kotlin/io/element/android/libraries/troubleshoot/impl/DefaultNotificationTroubleShootEntryPointTest.kt +++ b/libraries/troubleshoot/impl/src/test/kotlin/io/element/android/libraries/troubleshoot/impl/DefaultNotificationTroubleShootEntryPointTest.kt @@ -36,11 +36,12 @@ class DefaultNotificationTroubleShootEntryPointTest { override fun onDone() = lambdaError() override fun navigateToBlockedUsers() = lambdaError() } - val result = entryPoint.createNode( - parentNode = parentNode, - buildContext = BuildContext.root(null), - callback = callback, - ) + val result = with(parentNode) { + entryPoint.createNode( + buildContext = BuildContext.root(null), + callback = callback, + ) + } assertThat(result).isInstanceOf(TroubleshootNotificationsNode::class.java) assertThat(result.plugins).contains(callback) } diff --git a/libraries/troubleshoot/impl/src/test/kotlin/io/element/android/libraries/troubleshoot/impl/history/DefaultPushHistoryEntryPointTest.kt b/libraries/troubleshoot/impl/src/test/kotlin/io/element/android/libraries/troubleshoot/impl/history/DefaultPushHistoryEntryPointTest.kt index b963183ecc..271cd8d8fd 100644 --- a/libraries/troubleshoot/impl/src/test/kotlin/io/element/android/libraries/troubleshoot/impl/history/DefaultPushHistoryEntryPointTest.kt +++ b/libraries/troubleshoot/impl/src/test/kotlin/io/element/android/libraries/troubleshoot/impl/history/DefaultPushHistoryEntryPointTest.kt @@ -48,11 +48,12 @@ class DefaultPushHistoryEntryPointTest { override fun onDone() = lambdaError() override fun navigateToEvent(roomId: RoomId, eventId: EventId) = lambdaError() } - val result = entryPoint.createNode( - parentNode = parentNode, - buildContext = BuildContext.root(null), - callback = callback, - ) + val result = with(parentNode) { + entryPoint.createNode( + buildContext = BuildContext.root(null), + callback = callback, + ) + } assertThat(result).isInstanceOf(PushHistoryNode::class.java) assertThat(result.plugins).contains(callback) } diff --git a/tools/templates/files/fileTemplates/Template Module Feature Entry Point API.kt b/tools/templates/files/fileTemplates/Template Module Feature Entry Point API.kt index bc38fb2cad..af6cf59c8e 100644 --- a/tools/templates/files/fileTemplates/Template Module Feature Entry Point API.kt +++ b/tools/templates/files/fileTemplates/Template Module Feature Entry Point API.kt @@ -6,7 +6,8 @@ import com.bumble.appyx.core.plugin.Plugin import io.element.android.libraries.architecture.FeatureEntryPoint interface ${FEATURE_NAME}EntryPoint : FeatureEntryPoint { - fun createNode(parentNode: Node, buildContext: BuildContext, callback: Callback): Node + context(parentNode: Node) + fun createNode(buildContext: BuildContext, callback: Callback): Node interface Callback : Plugin { // Add your callbacks diff --git a/tools/templates/files/fileTemplates/Template Module Feature Entry Point Flow Impl.kt b/tools/templates/files/fileTemplates/Template Module Feature Entry Point Flow Impl.kt index 22dd0e1558..eca83b787f 100644 --- a/tools/templates/files/fileTemplates/Template Module Feature Entry Point Flow Impl.kt +++ b/tools/templates/files/fileTemplates/Template Module Feature Entry Point Flow Impl.kt @@ -10,8 +10,8 @@ import dev.zacsweers.metro.AppScope @ContributesBinding(AppScope::class) class Default${FEATURE_NAME}EntryPoint() : ${FEATURE_NAME}EntryPoint { - - override fun createNode(parentNode: Node, buildContext: BuildContext, callback: ${FEATURE_NAME}EntryPoint.Callback): Node { + context(parentNode: Node) + override fun createNode(buildContext: BuildContext, callback: ${FEATURE_NAME}EntryPoint.Callback): Node { return parentNode.createNode<${FEATURE_NAME}FlowNode>(buildContext, listOf(callback)) } } From 0303ac502aefea66ce0d4bd7a481eb7f58c45c2a Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Thu, 30 Oct 2025 15:58:49 +0100 Subject: [PATCH 09/46] More renaming --- .../features/messages/impl/MessagesNavigator.kt | 2 +- .../android/features/messages/impl/MessagesNode.kt | 2 +- .../features/messages/impl/MessagesPresenter.kt | 4 ++-- .../messages/impl/threads/ThreadedMessagesNode.kt | 2 +- .../features/messages/impl/FakeMessagesNavigator.kt | 6 +++--- .../features/messages/impl/MessagesPresenterTest.kt | 12 ++++++------ 6 files changed, 14 insertions(+), 14 deletions(-) diff --git a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/MessagesNavigator.kt b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/MessagesNavigator.kt index 7c55e23323..4a2189ccc7 100644 --- a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/MessagesNavigator.kt +++ b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/MessagesNavigator.kt @@ -23,5 +23,5 @@ interface MessagesNavigator { fun navigateToPreviewAttachments(attachments: ImmutableList, inReplyToEventId: EventId?) fun navigateToRoom(roomId: RoomId, eventId: EventId?, serverNames: List) fun navigateToThread(threadRootId: ThreadId, focusedEventId: EventId?) - fun onNavigateUp() + fun close() } diff --git a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/MessagesNode.kt b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/MessagesNode.kt index 9647ffca17..558d5cf503 100644 --- a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/MessagesNode.kt +++ b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/MessagesNode.kt @@ -224,7 +224,7 @@ class MessagesNode( context.toast(CommonStrings.screen_room_permalink_same_room_android) } - override fun onNavigateUp() = navigateUp() + override fun close() = navigateUp() @Composable override fun View(modifier: Modifier) { diff --git a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/MessagesPresenter.kt b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/MessagesPresenter.kt index aae371998e..acab975a45 100644 --- a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/MessagesPresenter.kt +++ b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/MessagesPresenter.kt @@ -251,7 +251,7 @@ class MessagesPresenter( if (!markingAsReadAndExiting.getAndSet(true)) { val latestEventId = room.liveTimeline.getLatestEventId().getOrElse { Timber.w(it, "Failed to get latest event id to mark as fully read") - navigator.onNavigateUp() + navigator.close() return@launch } latestEventId?.let { eventId -> @@ -259,7 +259,7 @@ class MessagesPresenter( markAsFullyRead(room.roomId, eventId) } } - navigator.onNavigateUp() + navigator.close() markingAsReadAndExiting.set(false) } } diff --git a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/threads/ThreadedMessagesNode.kt b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/threads/ThreadedMessagesNode.kt index 5ce1b76956..c6d5c46b61 100644 --- a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/threads/ThreadedMessagesNode.kt +++ b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/threads/ThreadedMessagesNode.kt @@ -221,7 +221,7 @@ class ThreadedMessagesNode( callback.navigateToThread(threadRootId, focusedEventId) } - override fun onNavigateUp() = navigateUp() + override fun close() = navigateUp() @Composable override fun View(modifier: Modifier) { diff --git a/features/messages/impl/src/test/kotlin/io/element/android/features/messages/impl/FakeMessagesNavigator.kt b/features/messages/impl/src/test/kotlin/io/element/android/features/messages/impl/FakeMessagesNavigator.kt index 04b34fe778..9fd6e4af2a 100644 --- a/features/messages/impl/src/test/kotlin/io/element/android/features/messages/impl/FakeMessagesNavigator.kt +++ b/features/messages/impl/src/test/kotlin/io/element/android/features/messages/impl/FakeMessagesNavigator.kt @@ -24,7 +24,7 @@ class FakeMessagesNavigator( private val onPreviewAttachmentLambda: (attachments: ImmutableList, inReplyToEventId: EventId?) -> Unit = { _, _ -> lambdaError() }, private val onNavigateToRoomLambda: (roomId: RoomId, threadId: EventId?, serverNames: List) -> Unit = { _, _, _ -> lambdaError() }, private val onOpenThreadLambda: (threadRootId: ThreadId, focusedEventId: EventId?) -> Unit = { _, _ -> lambdaError() }, - private val onNavigateUpLambda: () -> Unit = { lambdaError() }, + private val closeLambda: () -> Unit = { lambdaError() }, ) : MessagesNavigator { override fun navigateToEventDebugInfo(eventId: EventId?, debugInfo: TimelineItemDebugInfo) { onShowEventDebugInfoClickLambda(eventId, debugInfo) @@ -54,7 +54,7 @@ class FakeMessagesNavigator( onOpenThreadLambda(threadRootId, focusedEventId) } - override fun onNavigateUp() { - onNavigateUpLambda() + override fun close() { + closeLambda() } } diff --git a/features/messages/impl/src/test/kotlin/io/element/android/features/messages/impl/MessagesPresenterTest.kt b/features/messages/impl/src/test/kotlin/io/element/android/features/messages/impl/MessagesPresenterTest.kt index 34623a0c33..2dd98cc96f 100644 --- a/features/messages/impl/src/test/kotlin/io/element/android/features/messages/impl/MessagesPresenterTest.kt +++ b/features/messages/impl/src/test/kotlin/io/element/android/features/messages/impl/MessagesPresenterTest.kt @@ -1256,8 +1256,8 @@ class MessagesPresenterTest { fun `present - handle MarkAsFullyReadAndExit marks the room as fully read and navigates up`() = runTest { val markAsFullyReadRecorder = lambdaRecorder { _, _ -> } val markAsFullyReadUseCase = FakeMarkAsFullyRead(markAsFullyReadRecorder) - val onNavigateUpRecorder = lambdaRecorder {} - val navigator = FakeMessagesNavigator(onNavigateUpLambda = onNavigateUpRecorder) + val closeLambda = lambdaRecorder {} + val navigator = FakeMessagesNavigator(closeLambda = closeLambda) val presenter = createMessagesPresenter( timeline = FakeTimeline(getLatestEventIdResult = { Result.success(AN_EVENT_ID) }), @@ -1271,7 +1271,7 @@ class MessagesPresenterTest { runCurrent() markAsFullyReadRecorder.assertions().isCalledOnce() - onNavigateUpRecorder.assertions().isCalledOnce() + closeLambda.assertions().isCalledOnce() cancelAndIgnoreRemainingEvents() } @@ -1280,8 +1280,8 @@ class MessagesPresenterTest { @Test fun `present - handle MarkAsFullyReadAndExit still navigates up if marking as read fails`() = runTest { val markAsFullyReadUseCase = FakeMarkAsFullyRead { _, _ -> error("boom") } - val onNavigateUpRecorder = lambdaRecorder {} - val navigator = FakeMessagesNavigator(onNavigateUpLambda = onNavigateUpRecorder) + val closeLambda = lambdaRecorder {} + val navigator = FakeMessagesNavigator(closeLambda = closeLambda) val presenter = createMessagesPresenter( timeline = FakeTimeline(getLatestEventIdResult = { Result.success(AN_EVENT_ID) }), @@ -1294,7 +1294,7 @@ class MessagesPresenterTest { runCurrent() - onNavigateUpRecorder.assertions().isCalledOnce() + closeLambda.assertions().isCalledOnce() cancelAndIgnoreRemainingEvents() } From 187479849d566c8e86c9ff8472b5627a3135328b Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Thu, 30 Oct 2025 18:32:31 +0100 Subject: [PATCH 10/46] Create Fake classes in test modules --- appnav/build.gradle.kts | 1 + .../appnav/JoinedRoomLoadedFlowNodeTest.kt | 10 +- .../test/build.gradle.kts | 21 ++++ .../FakeChangeRoomMemberRolesEntryPoint.kt | 26 +++++ features/createroom/test/build.gradle.kts | 19 ++++ .../api/FakeCreateRoomEntryPoint.kt | 20 ++++ features/deactivation/test/build.gradle.kts | 19 ++++ .../test/FakeAccountDeactivationEntryPoint.kt | 20 ++++ features/forward/impl/build.gradle.kts | 1 + .../impl/DefaultForwardEntryPointTest.kt | 12 +-- features/forward/test/build.gradle.kts | 20 ++++ .../forward/test/FakeForwardEntryPoint.kt | 22 ++++ .../ftue/impl/DefaultFtueEntryPointTest.kt | 18 +--- features/invite/test/build.gradle.kts | 1 + .../FakeDeclineInviteAndBlockEntryPoint.kt | 21 ++++ .../impl/DefaultJoinRoomEntryPointTest.kt | 9 +- features/knockrequests/test/build.gradle.kts | 21 ++++ .../test/FakeKnockRequestsListEntryPoint.kt | 18 ++++ features/licenses/test/build.gradle.kts | 19 ++++ .../test/FakeOpenSourceLicensesEntryPoint.kt | 20 ++++ features/location/test/build.gradle.kts | 5 +- .../test/FakeSendLocationEntryPoint.kt | 22 ++++ .../test/FakeShowLocationEntryPoint.kt | 21 ++++ features/lockscreen/test/build.gradle.kts | 4 +- .../test/FakeLockScreenEntryPoint.kt | 26 +++++ features/logout/test/build.gradle.kts | 1 + .../logout/test/FakeLogoutEntryPoint.kt | 21 ++++ features/messages/impl/build.gradle.kts | 3 + .../impl/DefaultMessagesEntryPointTest.kt | 79 +++----------- features/messages/test/build.gradle.kts | 1 + .../messages/test/FakeMessagesEntryPoint.kt | 22 ++++ .../DefaultPollHistoryEntryPointTest.kt | 12 +-- features/poll/test/build.gradle.kts | 1 + .../test/create/FakeCreatePollEntryPoint.kt | 22 ++++ .../test/history/FakePollHistoryEntryPoint.kt | 20 ++++ features/preferences/impl/build.gradle.kts | 5 + .../impl/DefaultPreferencesEntryPointTest.kt | 59 +++-------- features/rageshake/impl/build.gradle.kts | 1 + .../DefaultBugReportEntryPointTest.kt | 12 +-- features/reportroom/test/build.gradle.kts | 21 ++++ .../test/FakeReportRoomEntryPoint.kt | 21 ++++ features/roomdetails/impl/build.gradle.kts | 8 ++ .../impl/DefaultRoomDetailsEntryPointTest.kt | 100 ++++-------------- features/share/impl/build.gradle.kts | 1 + .../share/impl/DefaultShareEntryPointTest.kt | 12 +-- features/startchat/impl/build.gradle.kts | 1 + .../impl/DefaultStartChatEntryPointTest.kt | 11 +- features/userprofile/impl/build.gradle.kts | 3 + .../impl/DefaultUserProfileEntryPointTest.kt | 45 ++------ features/verifysession/test/build.gradle.kts | 20 ++++ .../FakeIncomingVerificationEntryPoint.kt | 22 ++++ .../FakeOutgoingVerificationEntryPoint.kt | 22 ++++ features/viewfolder/test/build.gradle.kts | 19 ++++ .../test/FakeViewFolderEntryPoint.kt | 22 ++++ .../impl/DefaultMediaGalleryEntryPointTest.kt | 13 +-- .../test/FakeMediaGalleryEntryPoint.kt | 21 ++++ .../test/FakeMediaViewerEntryPoint.kt | 24 +++++ libraries/roomselect/test/build.gradle.kts | 19 ++++ .../test/FakeRoomSelectEntryPoint.kt | 22 ++++ libraries/troubleshoot/test/build.gradle.kts | 1 + .../FakeNotificationTroubleShootEntryPoint.kt | 21 ++++ .../test/FakePushHistoryEntryPoint.kt | 21 ++++ 62 files changed, 798 insertions(+), 327 deletions(-) create mode 100644 features/changeroommemberroles/test/build.gradle.kts create mode 100644 features/changeroommemberroles/test/src/main/kotlin/io/element/android/features/changeroommemberroes/test/FakeChangeRoomMemberRolesEntryPoint.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/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/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/invite/test/src/main/kotlin/io/element/android/features/invite/test/declineandblock/FakeDeclineInviteAndBlockEntryPoint.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/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/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/test/src/main/kotlin/io/element/android/features/lockscreen/test/FakeLockScreenEntryPoint.kt create mode 100644 features/logout/test/src/main/kotlin/io/element/android/features/logout/test/FakeLogoutEntryPoint.kt create mode 100644 features/messages/test/src/main/kotlin/io/element/android/features/messages/test/FakeMessagesEntryPoint.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/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/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/test/build.gradle.kts create mode 100644 features/viewfolder/test/src/main/kotlin/io/element/android/features/viewfolder/test/FakeViewFolderEntryPoint.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/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/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/FakePushHistoryEntryPoint.kt diff --git a/appnav/build.gradle.kts b/appnav/build.gradle.kts index 063e26b9da..9a9ccb2104 100644 --- a/appnav/build.gradle.kts +++ b/appnav/build.gradle.kts @@ -59,6 +59,7 @@ dependencies { 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.test) diff --git a/appnav/src/test/kotlin/io/element/android/appnav/JoinedRoomLoadedFlowNodeTest.kt b/appnav/src/test/kotlin/io/element/android/appnav/JoinedRoomLoadedFlowNodeTest.kt index 91e8a597de..0474be0eb7 100644 --- a/appnav/src/test/kotlin/io/element/android/appnav/JoinedRoomLoadedFlowNodeTest.kt +++ b/appnav/src/test/kotlin/io/element/android/appnav/JoinedRoomLoadedFlowNodeTest.kt @@ -22,6 +22,7 @@ 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 @@ -100,15 +101,6 @@ class JoinedRoomLoadedFlowNodeTest { } } - private class FakeForwardEntryPoint : ForwardEntryPoint { - context(parentNode: Node) - override fun createNode( - buildContext: BuildContext, - params: ForwardEntryPoint.Params, - callback: ForwardEntryPoint.Callback, - ) = node(buildContext) {} - } - private fun TestScope.createJoinedRoomLoadedFlowNode( plugins: List, messagesEntryPoint: MessagesEntryPoint = FakeMessagesEntryPoint(), diff --git a/features/changeroommemberroles/test/build.gradle.kts b/features/changeroommemberroles/test/build.gradle.kts new file mode 100644 index 0000000000..4d85d83c90 --- /dev/null +++ b/features/changeroommemberroles/test/build.gradle.kts @@ -0,0 +1,21 @@ +/* + * Copyright 2025 New Vector Ltd. + * + * SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial + * Please see LICENSE files in the repository root for full details. + */ + +plugins { + id("io.element.android-library") +} + +android { + namespace = "io.element.android.features.changeroommemberroles.test" +} + +dependencies { + implementation(projects.features.changeroommemberroles.api) + implementation(projects.libraries.architecture) + implementation(projects.libraries.matrix.api) + implementation(projects.tests.testutils) +} diff --git a/features/changeroommemberroles/test/src/main/kotlin/io/element/android/features/changeroommemberroes/test/FakeChangeRoomMemberRolesEntryPoint.kt b/features/changeroommemberroles/test/src/main/kotlin/io/element/android/features/changeroommemberroes/test/FakeChangeRoomMemberRolesEntryPoint.kt new file mode 100644 index 0000000000..75057654f3 --- /dev/null +++ b/features/changeroommemberroles/test/src/main/kotlin/io/element/android/features/changeroommemberroes/test/FakeChangeRoomMemberRolesEntryPoint.kt @@ -0,0 +1,26 @@ +/* + * Copyright 2025 New Vector Ltd. + * + * SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial + * Please see LICENSE files in the repository root for full details. + */ + +package io.element.android.features.changeroommemberroes.test + +import com.bumble.appyx.core.modality.BuildContext +import com.bumble.appyx.core.node.Node +import io.element.android.features.changeroommemberroes.api.ChangeRoomMemberRolesEntryPoint +import io.element.android.features.changeroommemberroes.api.ChangeRoomMemberRolesListType +import io.element.android.libraries.matrix.api.room.JoinedRoom +import io.element.android.tests.testutils.lambda.lambdaError + +class FakeChangeRoomMemberRolesEntryPoint : ChangeRoomMemberRolesEntryPoint { + context(parentNode: Node) + override fun createNode( + buildContext: BuildContext, + room: JoinedRoom, + listType: ChangeRoomMemberRolesListType, + ): Node { + lambdaError() + } +} diff --git a/features/createroom/test/build.gradle.kts b/features/createroom/test/build.gradle.kts new file mode 100644 index 0000000000..13c579e5da --- /dev/null +++ b/features/createroom/test/build.gradle.kts @@ -0,0 +1,19 @@ +/* + * Copyright 2025 New Vector Ltd. + * + * SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial + * Please see LICENSE files in the repository root for full details. + */ +plugins { + id("io.element.android-library") +} + +android { + namespace = "io.element.android.features.createroom.test" +} + +dependencies { + implementation(projects.features.createroom.api) + implementation(projects.libraries.architecture) + implementation(projects.tests.testutils) +} diff --git a/features/createroom/test/src/main/kotlin/io/element/android/features/createroom/api/FakeCreateRoomEntryPoint.kt b/features/createroom/test/src/main/kotlin/io/element/android/features/createroom/api/FakeCreateRoomEntryPoint.kt new file mode 100644 index 0000000000..929d22b3de --- /dev/null +++ b/features/createroom/test/src/main/kotlin/io/element/android/features/createroom/api/FakeCreateRoomEntryPoint.kt @@ -0,0 +1,20 @@ +/* + * Copyright 2025 New Vector Ltd. + * + * SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial + * Please see LICENSE files in the repository root for full details. + */ + +package io.element.android.features.createroom.api + +import com.bumble.appyx.core.modality.BuildContext +import com.bumble.appyx.core.node.Node +import io.element.android.tests.testutils.lambda.lambdaError + +class FakeCreateRoomEntryPoint : CreateRoomEntryPoint { + context(parentNode: Node) + override fun createNode( + buildContext: BuildContext, + callback: CreateRoomEntryPoint.Callback, + ): Node = lambdaError() +} diff --git a/features/deactivation/test/build.gradle.kts b/features/deactivation/test/build.gradle.kts new file mode 100644 index 0000000000..57ba7f4421 --- /dev/null +++ b/features/deactivation/test/build.gradle.kts @@ -0,0 +1,19 @@ +/* + * Copyright 2025 New Vector Ltd. + * + * SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial + * Please see LICENSE files in the repository root for full details. + */ +plugins { + id("io.element.android-library") +} + +android { + namespace = "io.element.android.features.deactivation.test" +} + +dependencies { + implementation(projects.features.deactivation.api) + implementation(projects.libraries.architecture) + implementation(projects.tests.testutils) +} diff --git a/features/deactivation/test/src/main/kotlin/io/element/android/features/deactivation/test/FakeAccountDeactivationEntryPoint.kt b/features/deactivation/test/src/main/kotlin/io/element/android/features/deactivation/test/FakeAccountDeactivationEntryPoint.kt new file mode 100644 index 0000000000..8c898dfb6b --- /dev/null +++ b/features/deactivation/test/src/main/kotlin/io/element/android/features/deactivation/test/FakeAccountDeactivationEntryPoint.kt @@ -0,0 +1,20 @@ +/* + * Copyright 2025 New Vector Ltd. + * + * SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial + * Please see LICENSE files in the repository root for full details. + */ + +package io.element.android.features.deactivation.test + +import com.bumble.appyx.core.modality.BuildContext +import com.bumble.appyx.core.node.Node +import io.element.android.features.deactivation.api.AccountDeactivationEntryPoint +import io.element.android.tests.testutils.lambda.lambdaError + +class FakeAccountDeactivationEntryPoint : AccountDeactivationEntryPoint { + context(parentNode: Node) + override fun createNode(buildContext: BuildContext): Node { + lambdaError() + } +} diff --git a/features/forward/impl/build.gradle.kts b/features/forward/impl/build.gradle.kts index 32da0ed7a2..de38d25651 100644 --- a/features/forward/impl/build.gradle.kts +++ b/features/forward/impl/build.gradle.kts @@ -34,5 +34,6 @@ dependencies { testCommonDependencies(libs, true) testImplementation(projects.libraries.matrix.test) + testImplementation(projects.libraries.roomselect.test) testImplementation(projects.libraries.testtags) } diff --git a/features/forward/impl/src/test/kotlin/io/element/android/features/forward/impl/DefaultForwardEntryPointTest.kt b/features/forward/impl/src/test/kotlin/io/element/android/features/forward/impl/DefaultForwardEntryPointTest.kt index 76cd3c0a2f..f344d58063 100644 --- a/features/forward/impl/src/test/kotlin/io/element/android/features/forward/impl/DefaultForwardEntryPointTest.kt +++ b/features/forward/impl/src/test/kotlin/io/element/android/features/forward/impl/DefaultForwardEntryPointTest.kt @@ -9,14 +9,13 @@ package io.element.android.features.forward.impl import androidx.arch.core.executor.testing.InstantTaskExecutorRule import com.bumble.appyx.core.modality.BuildContext -import com.bumble.appyx.core.node.Node import com.bumble.appyx.testing.junit4.util.MainDispatcherRule import com.google.common.truth.Truth.assertThat import io.element.android.features.forward.api.ForwardEntryPoint import io.element.android.libraries.matrix.api.core.RoomId import io.element.android.libraries.matrix.test.AN_EVENT_ID import io.element.android.libraries.matrix.test.timeline.FakeTimelineProvider -import io.element.android.libraries.roomselect.api.RoomSelectEntryPoint +import io.element.android.libraries.roomselect.test.FakeRoomSelectEntryPoint import io.element.android.tests.testutils.lambda.lambdaError import io.element.android.tests.testutils.node.TestParentNode import kotlinx.coroutines.test.runTest @@ -38,14 +37,7 @@ class DefaultForwardEntryPointTest { buildContext = buildContext, plugins = plugins, presenterFactory = { _, _ -> createForwardMessagesPresenter() }, - roomSelectEntryPoint = object : RoomSelectEntryPoint { - context(parentNode: Node) - override fun createNode( - buildContext: BuildContext, - params: RoomSelectEntryPoint.Params, - callback: RoomSelectEntryPoint.Callback, - ) = lambdaError() - } + roomSelectEntryPoint = FakeRoomSelectEntryPoint(), ) } val callback = object : ForwardEntryPoint.Callback { diff --git a/features/forward/test/build.gradle.kts b/features/forward/test/build.gradle.kts new file mode 100644 index 0000000000..a669fe5128 --- /dev/null +++ b/features/forward/test/build.gradle.kts @@ -0,0 +1,20 @@ +/* + * Copyright 2025 New Vector Ltd. + * + * SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial + * Please see LICENSE files in the repository root for full details. + */ +plugins { + id("io.element.android-library") +} + +android { + namespace = "io.element.android.features.forward.test" +} + +dependencies { + implementation(projects.libraries.architecture) + implementation(projects.libraries.matrix.api) + implementation(projects.features.forward.api) + implementation(projects.tests.testutils) +} diff --git a/features/forward/test/src/main/kotlin/io/element/android/features/forward/test/FakeForwardEntryPoint.kt b/features/forward/test/src/main/kotlin/io/element/android/features/forward/test/FakeForwardEntryPoint.kt new file mode 100644 index 0000000000..d42ea203a0 --- /dev/null +++ b/features/forward/test/src/main/kotlin/io/element/android/features/forward/test/FakeForwardEntryPoint.kt @@ -0,0 +1,22 @@ +/* + * Copyright 2025 New Vector Ltd. + * + * SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial + * Please see LICENSE files in the repository root for full details. + */ + +package io.element.android.features.forward.test + +import com.bumble.appyx.core.modality.BuildContext +import com.bumble.appyx.core.node.Node +import io.element.android.features.forward.api.ForwardEntryPoint +import io.element.android.tests.testutils.lambda.lambdaError + +class FakeForwardEntryPoint : ForwardEntryPoint { + context(parentNode: Node) + override fun createNode( + buildContext: BuildContext, + params: ForwardEntryPoint.Params, + callback: ForwardEntryPoint.Callback, + ): Node = lambdaError() +} diff --git a/features/ftue/impl/src/test/kotlin/io/element/android/features/ftue/impl/DefaultFtueEntryPointTest.kt b/features/ftue/impl/src/test/kotlin/io/element/android/features/ftue/impl/DefaultFtueEntryPointTest.kt index ccb4cbe200..efd787b1c4 100644 --- a/features/ftue/impl/src/test/kotlin/io/element/android/features/ftue/impl/DefaultFtueEntryPointTest.kt +++ b/features/ftue/impl/src/test/kotlin/io/element/android/features/ftue/impl/DefaultFtueEntryPointTest.kt @@ -7,14 +7,11 @@ package io.element.android.features.ftue.impl -import android.content.Context -import android.content.Intent import androidx.arch.core.executor.testing.InstantTaskExecutorRule import com.bumble.appyx.core.modality.BuildContext -import com.bumble.appyx.core.node.Node import com.bumble.appyx.testing.junit4.util.MainDispatcherRule import com.google.common.truth.Truth.assertThat -import io.element.android.features.lockscreen.api.LockScreenEntryPoint +import io.element.android.features.lockscreen.test.FakeLockScreenEntryPoint import io.element.android.tests.testutils.lambda.lambdaError import io.element.android.tests.testutils.node.TestParentNode import kotlinx.coroutines.test.runTest @@ -37,18 +34,7 @@ class DefaultFtueEntryPointTest { plugins = plugins, analyticsEntryPoint = { _ -> lambdaError() }, defaultFtueService = createDefaultFtueService(), - lockScreenEntryPoint = object : LockScreenEntryPoint { - context(parentNode: Node) - override fun createNode( - buildContext: BuildContext, - navTarget: LockScreenEntryPoint.Target, - callback: LockScreenEntryPoint.Callback, - ) = lambdaError() - - override fun pinUnlockIntent(context: Context): Intent { - lambdaError() - } - }, + lockScreenEntryPoint = FakeLockScreenEntryPoint(), ) } val result = with(parentNode) { diff --git a/features/invite/test/build.gradle.kts b/features/invite/test/build.gradle.kts index e504873c3b..5669204b69 100644 --- a/features/invite/test/build.gradle.kts +++ b/features/invite/test/build.gradle.kts @@ -26,5 +26,6 @@ dependencies { implementation(libs.coroutines.core) implementation(projects.libraries.matrix.api) implementation(projects.libraries.matrix.test) + implementation(projects.tests.testutils) api(projects.features.invite.api) } diff --git a/features/invite/test/src/main/kotlin/io/element/android/features/invite/test/declineandblock/FakeDeclineInviteAndBlockEntryPoint.kt b/features/invite/test/src/main/kotlin/io/element/android/features/invite/test/declineandblock/FakeDeclineInviteAndBlockEntryPoint.kt new file mode 100644 index 0000000000..75d93666c0 --- /dev/null +++ b/features/invite/test/src/main/kotlin/io/element/android/features/invite/test/declineandblock/FakeDeclineInviteAndBlockEntryPoint.kt @@ -0,0 +1,21 @@ +/* + * Copyright 2025 New Vector Ltd. + * + * SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial + * Please see LICENSE files in the repository root for full details. + */ + +package io.element.android.features.invite.test.declineandblock + +import com.bumble.appyx.core.modality.BuildContext +import com.bumble.appyx.core.node.Node +import io.element.android.features.invite.api.InviteData +import io.element.android.features.invite.api.declineandblock.DeclineInviteAndBlockEntryPoint +import io.element.android.tests.testutils.lambda.lambdaError + +class FakeDeclineInviteAndBlockEntryPoint : DeclineInviteAndBlockEntryPoint { + context(parentNode: Node) + override fun createNode(buildContext: BuildContext, inviteData: InviteData): Node { + lambdaError() + } +} diff --git a/features/joinroom/impl/src/test/kotlin/io/element/android/features/joinroom/impl/DefaultJoinRoomEntryPointTest.kt b/features/joinroom/impl/src/test/kotlin/io/element/android/features/joinroom/impl/DefaultJoinRoomEntryPointTest.kt index 4cf41f1dbc..abde7e9e4e 100644 --- a/features/joinroom/impl/src/test/kotlin/io/element/android/features/joinroom/impl/DefaultJoinRoomEntryPointTest.kt +++ b/features/joinroom/impl/src/test/kotlin/io/element/android/features/joinroom/impl/DefaultJoinRoomEntryPointTest.kt @@ -9,12 +9,10 @@ package io.element.android.features.joinroom.impl import androidx.arch.core.executor.testing.InstantTaskExecutorRule import com.bumble.appyx.core.modality.BuildContext -import com.bumble.appyx.core.node.Node import com.bumble.appyx.testing.junit4.util.MainDispatcherRule import com.google.common.truth.Truth.assertThat import im.vector.app.features.analytics.plan.JoinedRoom -import io.element.android.features.invite.api.InviteData -import io.element.android.features.invite.api.declineandblock.DeclineInviteAndBlockEntryPoint +import io.element.android.features.invite.test.declineandblock.FakeDeclineInviteAndBlockEntryPoint import io.element.android.features.joinroom.api.JoinRoomEntryPoint import io.element.android.libraries.matrix.api.core.toRoomIdOrAlias import io.element.android.libraries.matrix.test.A_ROOM_ID @@ -40,10 +38,7 @@ class DefaultJoinRoomEntryPointTest { plugins = plugins, presenterFactory = { _, _, _, _, _ -> createJoinRoomPresenter() }, acceptDeclineInviteView = { _, _, _, _ -> lambdaError() }, - declineAndBlockEntryPoint = object : DeclineInviteAndBlockEntryPoint { - context(parentNode: Node) - override fun createNode(buildContext: BuildContext, inviteData: InviteData) = lambdaError() - } + declineAndBlockEntryPoint = FakeDeclineInviteAndBlockEntryPoint(), ) } val inputs = JoinRoomEntryPoint.Inputs( diff --git a/features/knockrequests/test/build.gradle.kts b/features/knockrequests/test/build.gradle.kts new file mode 100644 index 0000000000..27928879b2 --- /dev/null +++ b/features/knockrequests/test/build.gradle.kts @@ -0,0 +1,21 @@ +/* + * Copyright 2025 New Vector Ltd. + * + * SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial + * Please see LICENSE files in the repository root for full details. + */ + +plugins { + id("io.element.android-library") +} + +android { + namespace = "io.element.android.features.knockrequests.test" +} + +dependencies { + implementation(projects.features.knockrequests.api) + implementation(projects.libraries.architecture) + implementation(projects.libraries.matrix.api) + implementation(projects.tests.testutils) +} diff --git a/features/knockrequests/test/src/main/kotlin/io/element/android/features/knockrequests/test/FakeKnockRequestsListEntryPoint.kt b/features/knockrequests/test/src/main/kotlin/io/element/android/features/knockrequests/test/FakeKnockRequestsListEntryPoint.kt new file mode 100644 index 0000000000..4c7a6ffdc7 --- /dev/null +++ b/features/knockrequests/test/src/main/kotlin/io/element/android/features/knockrequests/test/FakeKnockRequestsListEntryPoint.kt @@ -0,0 +1,18 @@ +/* + * Copyright 2025 New Vector Ltd. + * + * SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial + * Please see LICENSE files in the repository root for full details. + */ + +package io.element.android.features.knockrequests.test + +import com.bumble.appyx.core.modality.BuildContext +import com.bumble.appyx.core.node.Node +import io.element.android.features.knockrequests.api.list.KnockRequestsListEntryPoint +import io.element.android.tests.testutils.lambda.lambdaError + +class FakeKnockRequestsListEntryPoint : KnockRequestsListEntryPoint { + context(parentNode: Node) + override fun createNode(buildContext: BuildContext): Node = lambdaError() +} diff --git a/features/licenses/test/build.gradle.kts b/features/licenses/test/build.gradle.kts new file mode 100644 index 0000000000..7ac79a9608 --- /dev/null +++ b/features/licenses/test/build.gradle.kts @@ -0,0 +1,19 @@ +/* + * Copyright 2025 New Vector Ltd. + * + * SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial + * Please see LICENSE files in the repository root for full details. + */ +plugins { + id("io.element.android-library") +} + +android { + namespace = "io.element.android.features.licenses.test" +} + +dependencies { + implementation(projects.features.licenses.api) + implementation(projects.libraries.architecture) + implementation(projects.tests.testutils) +} diff --git a/features/licenses/test/src/main/kotlin/io/element/android/features/licenses/test/FakeOpenSourceLicensesEntryPoint.kt b/features/licenses/test/src/main/kotlin/io/element/android/features/licenses/test/FakeOpenSourceLicensesEntryPoint.kt new file mode 100644 index 0000000000..0ce30a7839 --- /dev/null +++ b/features/licenses/test/src/main/kotlin/io/element/android/features/licenses/test/FakeOpenSourceLicensesEntryPoint.kt @@ -0,0 +1,20 @@ +/* + * Copyright 2025 New Vector Ltd. + * + * SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial + * Please see LICENSE files in the repository root for full details. + */ + +package io.element.android.features.licenses.test + +import com.bumble.appyx.core.modality.BuildContext +import com.bumble.appyx.core.node.Node +import io.element.android.features.licenses.api.OpenSourceLicensesEntryPoint +import io.element.android.tests.testutils.lambda.lambdaError + +class FakeOpenSourceLicensesEntryPoint : OpenSourceLicensesEntryPoint { + context(parentNode: Node) + override fun createNode(buildContext: BuildContext): Node { + lambdaError() + } +} diff --git a/features/location/test/build.gradle.kts b/features/location/test/build.gradle.kts index 024ae2c303..2171a0e0f5 100644 --- a/features/location/test/build.gradle.kts +++ b/features/location/test/build.gradle.kts @@ -14,5 +14,8 @@ android { } dependencies { - implementation(projects.features.location.api) + api(projects.features.location.api) + implementation(projects.libraries.matrix.api) + implementation(libs.appyx.core) + implementation(projects.tests.testutils) } diff --git a/features/location/test/src/main/kotlin/io/element/android/features/location/test/FakeSendLocationEntryPoint.kt b/features/location/test/src/main/kotlin/io/element/android/features/location/test/FakeSendLocationEntryPoint.kt new file mode 100644 index 0000000000..7bcccef4bb --- /dev/null +++ b/features/location/test/src/main/kotlin/io/element/android/features/location/test/FakeSendLocationEntryPoint.kt @@ -0,0 +1,22 @@ +/* + * Copyright 2025 New Vector Ltd. + * + * SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial + * Please see LICENSE files in the repository root for full details. + */ + +package io.element.android.features.location.test + +import com.bumble.appyx.core.modality.BuildContext +import com.bumble.appyx.core.node.Node +import io.element.android.features.location.api.SendLocationEntryPoint +import io.element.android.libraries.matrix.api.timeline.Timeline +import io.element.android.tests.testutils.lambda.lambdaError + +class FakeSendLocationEntryPoint : SendLocationEntryPoint { + context(parentNode: Node) + override fun createNode( + buildContext: BuildContext, + timelineMode: Timeline.Mode, + ): Node = lambdaError() +} diff --git a/features/location/test/src/main/kotlin/io/element/android/features/location/test/FakeShowLocationEntryPoint.kt b/features/location/test/src/main/kotlin/io/element/android/features/location/test/FakeShowLocationEntryPoint.kt new file mode 100644 index 0000000000..33d269f68d --- /dev/null +++ b/features/location/test/src/main/kotlin/io/element/android/features/location/test/FakeShowLocationEntryPoint.kt @@ -0,0 +1,21 @@ +/* + * Copyright 2025 New Vector Ltd. + * + * SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial + * Please see LICENSE files in the repository root for full details. + */ + +package io.element.android.features.location.test + +import com.bumble.appyx.core.modality.BuildContext +import com.bumble.appyx.core.node.Node +import io.element.android.features.location.api.ShowLocationEntryPoint +import io.element.android.tests.testutils.lambda.lambdaError + +class FakeShowLocationEntryPoint : ShowLocationEntryPoint { + context(parentNode: Node) + override fun createNode( + buildContext: BuildContext, + inputs: ShowLocationEntryPoint.Inputs, + ): Node = lambdaError() +} diff --git a/features/lockscreen/test/build.gradle.kts b/features/lockscreen/test/build.gradle.kts index 80f46e82c6..5d64c014b9 100644 --- a/features/lockscreen/test/build.gradle.kts +++ b/features/lockscreen/test/build.gradle.kts @@ -14,6 +14,8 @@ android { } dependencies { - implementation(libs.coroutines.core) api(projects.features.lockscreen.api) + implementation(libs.coroutines.core) + implementation(projects.libraries.architecture) + implementation(projects.tests.testutils) } diff --git a/features/lockscreen/test/src/main/kotlin/io/element/android/features/lockscreen/test/FakeLockScreenEntryPoint.kt b/features/lockscreen/test/src/main/kotlin/io/element/android/features/lockscreen/test/FakeLockScreenEntryPoint.kt new file mode 100644 index 0000000000..dc722dd0c8 --- /dev/null +++ b/features/lockscreen/test/src/main/kotlin/io/element/android/features/lockscreen/test/FakeLockScreenEntryPoint.kt @@ -0,0 +1,26 @@ +/* + * Copyright 2025 New Vector Ltd. + * + * SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial + * Please see LICENSE files in the repository root for full details. + */ + +package io.element.android.features.lockscreen.test + +import android.content.Context +import android.content.Intent +import com.bumble.appyx.core.modality.BuildContext +import com.bumble.appyx.core.node.Node +import io.element.android.features.lockscreen.api.LockScreenEntryPoint +import io.element.android.tests.testutils.lambda.lambdaError + +class FakeLockScreenEntryPoint : LockScreenEntryPoint { + context(parentNode: Node) + override fun createNode( + buildContext: BuildContext, + navTarget: LockScreenEntryPoint.Target, + callback: LockScreenEntryPoint.Callback, + ): Node = lambdaError() + + override fun pinUnlockIntent(context: Context): Intent = lambdaError() +} diff --git a/features/logout/test/build.gradle.kts b/features/logout/test/build.gradle.kts index e7647a85db..ff1b6ae180 100644 --- a/features/logout/test/build.gradle.kts +++ b/features/logout/test/build.gradle.kts @@ -15,6 +15,7 @@ android { dependencies { implementation(libs.coroutines.core) + implementation(projects.libraries.architecture) implementation(projects.tests.testutils) api(projects.features.logout.api) } diff --git a/features/logout/test/src/main/kotlin/io/element/android/features/logout/test/FakeLogoutEntryPoint.kt b/features/logout/test/src/main/kotlin/io/element/android/features/logout/test/FakeLogoutEntryPoint.kt new file mode 100644 index 0000000000..4273bf7169 --- /dev/null +++ b/features/logout/test/src/main/kotlin/io/element/android/features/logout/test/FakeLogoutEntryPoint.kt @@ -0,0 +1,21 @@ +/* + * Copyright 2025 New Vector Ltd. + * + * SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial + * Please see LICENSE files in the repository root for full details. + */ + +package io.element.android.features.logout.test + +import com.bumble.appyx.core.modality.BuildContext +import com.bumble.appyx.core.node.Node +import io.element.android.features.logout.api.LogoutEntryPoint +import io.element.android.tests.testutils.lambda.lambdaError + +class FakeLogoutEntryPoint : LogoutEntryPoint { + context(parentNode: Node) + override fun createNode( + buildContext: BuildContext, + callback: LogoutEntryPoint.Callback, + ): Node = lambdaError() +} diff --git a/features/messages/impl/build.gradle.kts b/features/messages/impl/build.gradle.kts index cd72c4d84a..e74072830d 100644 --- a/features/messages/impl/build.gradle.kts +++ b/features/messages/impl/build.gradle.kts @@ -79,6 +79,9 @@ dependencies { testImplementation(projects.libraries.matrix.test) testImplementation(projects.libraries.dateformatter.test) testImplementation(projects.libraries.push.test) + testImplementation(projects.features.call.test) + testImplementation(projects.features.forward.test) + testImplementation(projects.features.knockrequests.test) testImplementation(projects.features.location.test) testImplementation(projects.features.networkmonitor.test) testImplementation(projects.features.messages.test) diff --git a/features/messages/impl/src/test/kotlin/io/element/android/features/messages/impl/DefaultMessagesEntryPointTest.kt b/features/messages/impl/src/test/kotlin/io/element/android/features/messages/impl/DefaultMessagesEntryPointTest.kt index 5032d324f7..2c8cb88875 100644 --- a/features/messages/impl/src/test/kotlin/io/element/android/features/messages/impl/DefaultMessagesEntryPointTest.kt +++ b/features/messages/impl/src/test/kotlin/io/element/android/features/messages/impl/DefaultMessagesEntryPointTest.kt @@ -10,27 +10,23 @@ package io.element.android.features.messages.impl import androidx.arch.core.executor.testing.InstantTaskExecutorRule import androidx.compose.runtime.Composable import com.bumble.appyx.core.modality.BuildContext -import com.bumble.appyx.core.node.Node import com.bumble.appyx.testing.junit4.util.MainDispatcherRule import com.google.common.truth.Truth.assertThat -import io.element.android.features.call.api.CallType -import io.element.android.features.call.api.ElementCallEntryPoint -import io.element.android.features.forward.api.ForwardEntryPoint -import io.element.android.features.knockrequests.api.list.KnockRequestsListEntryPoint -import io.element.android.features.location.api.SendLocationEntryPoint -import io.element.android.features.location.api.ShowLocationEntryPoint +import io.element.android.features.call.test.FakeElementCallEntryPoint +import io.element.android.features.forward.test.FakeForwardEntryPoint +import io.element.android.features.knockrequests.test.FakeKnockRequestsListEntryPoint import io.element.android.features.location.test.FakeLocationService +import io.element.android.features.location.test.FakeSendLocationEntryPoint +import io.element.android.features.location.test.FakeShowLocationEntryPoint import io.element.android.features.messages.api.MessagesEntryPoint import io.element.android.features.messages.impl.pinned.banner.createPinnedEventsTimelineProvider import io.element.android.features.messages.impl.timeline.createTimelineController -import io.element.android.features.poll.api.create.CreatePollEntryPoint -import io.element.android.features.poll.api.create.CreatePollEntryPoint.Params +import io.element.android.features.poll.test.create.FakeCreatePollEntryPoint import io.element.android.libraries.dateformatter.test.FakeDateFormatter 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.UserId import io.element.android.libraries.matrix.api.permalink.PermalinkData -import io.element.android.libraries.matrix.api.timeline.Timeline import io.element.android.libraries.matrix.test.AN_EVENT_ID import io.element.android.libraries.matrix.test.A_SESSION_ID import io.element.android.libraries.matrix.test.A_USER_ID @@ -38,7 +34,7 @@ import io.element.android.libraries.matrix.test.room.FakeBaseRoom import io.element.android.libraries.matrix.test.roomlist.FakeRoomListService import io.element.android.libraries.matrix.ui.messages.RoomMemberProfilesCache import io.element.android.libraries.matrix.ui.messages.RoomNamesCache -import io.element.android.libraries.mediaviewer.api.MediaViewerEntryPoint +import io.element.android.libraries.mediaviewer.test.FakeMediaViewerEntryPoint import io.element.android.libraries.textcomposer.mentions.MentionSpanTheme import io.element.android.libraries.textcomposer.mentions.MentionSpanUpdater import io.element.android.services.analytics.test.FakeAnalyticsService @@ -65,56 +61,12 @@ class DefaultMessagesEntryPointTest { plugins = plugins, roomListService = FakeRoomListService(), sessionId = A_SESSION_ID, - sendLocationEntryPoint = object : SendLocationEntryPoint { - context(parentNode: Node) - override fun createNode( - buildContext: BuildContext, - timelineMode: Timeline.Mode, - ) = lambdaError() - }, - showLocationEntryPoint = object : ShowLocationEntryPoint { - context(parentNode: Node) - override fun createNode(buildContext: BuildContext, inputs: ShowLocationEntryPoint.Inputs) = lambdaError() - }, - createPollEntryPoint = object : CreatePollEntryPoint { - context(parentNode: Node) - override fun createNode( - buildContext: BuildContext, - params: Params, - ) = lambdaError() - }, - elementCallEntryPoint = object : ElementCallEntryPoint { - override fun startCall(callType: CallType) = lambdaError() - override suspend fun handleIncomingCall( - callType: CallType.RoomCall, - eventId: EventId, - senderId: UserId, - roomName: String?, - senderName: String?, - avatarUrl: String?, - timestamp: Long, - expirationTimestamp: Long, - notificationChannelId: String, - textContent: String?, - ) = lambdaError() - }, - mediaViewerEntryPoint = object : MediaViewerEntryPoint { - override fun createParamsForAvatar(filename: String, avatarUrl: String) = lambdaError() - context(parentNode: Node) - override fun createNode( - buildContext: BuildContext, - params: MediaViewerEntryPoint.Params, - callback: MediaViewerEntryPoint.Callback, - ) = lambdaError() - }, - forwardEntryPoint = object : ForwardEntryPoint { - context(parentNode: Node) - override fun createNode( - buildContext: BuildContext, - params: ForwardEntryPoint.Params, - callback: ForwardEntryPoint.Callback, - ) = lambdaError() - }, + sendLocationEntryPoint = FakeSendLocationEntryPoint(), + showLocationEntryPoint = FakeShowLocationEntryPoint(), + createPollEntryPoint = FakeCreatePollEntryPoint(), + elementCallEntryPoint = FakeElementCallEntryPoint(), + mediaViewerEntryPoint = FakeMediaViewerEntryPoint(), + forwardEntryPoint = FakeForwardEntryPoint(), analyticsService = FakeAnalyticsService(), locationService = FakeLocationService(), room = FakeBaseRoom(), @@ -129,10 +81,7 @@ class DefaultMessagesEntryPointTest { mentionSpanTheme = MentionSpanTheme(A_USER_ID), pinnedEventsTimelineProvider = createPinnedEventsTimelineProvider(), timelineController = createTimelineController(), - knockRequestsListEntryPoint = object : KnockRequestsListEntryPoint { - context(parentNode: Node) - override fun createNode(buildContext: BuildContext) = lambdaError() - }, + knockRequestsListEntryPoint = FakeKnockRequestsListEntryPoint(), dateFormatter = FakeDateFormatter(), coroutineDispatchers = testCoroutineDispatchers(), ) diff --git a/features/messages/test/build.gradle.kts b/features/messages/test/build.gradle.kts index 93f5166f29..be94beb01b 100644 --- a/features/messages/test/build.gradle.kts +++ b/features/messages/test/build.gradle.kts @@ -23,4 +23,5 @@ dependencies { implementation(projects.libraries.preferences.api) implementation(projects.libraries.voicerecorder.test) implementation(projects.services.analytics.test) + implementation(projects.tests.testutils) } diff --git a/features/messages/test/src/main/kotlin/io/element/android/features/messages/test/FakeMessagesEntryPoint.kt b/features/messages/test/src/main/kotlin/io/element/android/features/messages/test/FakeMessagesEntryPoint.kt new file mode 100644 index 0000000000..91258521de --- /dev/null +++ b/features/messages/test/src/main/kotlin/io/element/android/features/messages/test/FakeMessagesEntryPoint.kt @@ -0,0 +1,22 @@ +/* + * Copyright 2025 New Vector Ltd. + * + * SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial + * Please see LICENSE files in the repository root for full details. + */ + +package io.element.android.features.messages.test + +import com.bumble.appyx.core.modality.BuildContext +import com.bumble.appyx.core.node.Node +import io.element.android.features.messages.api.MessagesEntryPoint +import io.element.android.tests.testutils.lambda.lambdaError + +class FakeMessagesEntryPoint : MessagesEntryPoint { + context(parentNode: Node) + override fun createNode( + buildContext: BuildContext, + params: MessagesEntryPoint.Params, + callback: MessagesEntryPoint.Callback, + ): Node = lambdaError() +} diff --git a/features/poll/impl/src/test/kotlin/io/element/android/features/poll/impl/history/DefaultPollHistoryEntryPointTest.kt b/features/poll/impl/src/test/kotlin/io/element/android/features/poll/impl/history/DefaultPollHistoryEntryPointTest.kt index 2e8e21f93f..41c99d1cd1 100644 --- a/features/poll/impl/src/test/kotlin/io/element/android/features/poll/impl/history/DefaultPollHistoryEntryPointTest.kt +++ b/features/poll/impl/src/test/kotlin/io/element/android/features/poll/impl/history/DefaultPollHistoryEntryPointTest.kt @@ -9,11 +9,9 @@ package io.element.android.features.poll.impl.history import androidx.arch.core.executor.testing.InstantTaskExecutorRule import com.bumble.appyx.core.modality.BuildContext -import com.bumble.appyx.core.node.Node import com.bumble.appyx.testing.junit4.util.MainDispatcherRule import com.google.common.truth.Truth.assertThat -import io.element.android.features.poll.api.create.CreatePollEntryPoint -import io.element.android.tests.testutils.lambda.lambdaError +import io.element.android.features.poll.test.create.FakeCreatePollEntryPoint import io.element.android.tests.testutils.node.TestParentNode import kotlinx.coroutines.test.runTest import org.junit.Rule @@ -33,13 +31,7 @@ class DefaultPollHistoryEntryPointTest { PollHistoryFlowNode( buildContext = buildContext, plugins = plugins, - createPollEntryPoint = object : CreatePollEntryPoint { - context(parentNode: Node) - override fun createNode( - buildContext: BuildContext, - params: CreatePollEntryPoint.Params, - ) = lambdaError() - } + createPollEntryPoint = FakeCreatePollEntryPoint(), ) } val result = with(parentNode) { diff --git a/features/poll/test/build.gradle.kts b/features/poll/test/build.gradle.kts index 150a0bd3fc..35434f84a3 100644 --- a/features/poll/test/build.gradle.kts +++ b/features/poll/test/build.gradle.kts @@ -17,4 +17,5 @@ dependencies { implementation(projects.libraries.matrix.api) api(projects.features.poll.api) implementation(libs.kotlinx.collections.immutable) + implementation(projects.tests.testutils) } diff --git a/features/poll/test/src/main/kotlin/io/element/android/features/poll/test/create/FakeCreatePollEntryPoint.kt b/features/poll/test/src/main/kotlin/io/element/android/features/poll/test/create/FakeCreatePollEntryPoint.kt new file mode 100644 index 0000000000..3563c341f4 --- /dev/null +++ b/features/poll/test/src/main/kotlin/io/element/android/features/poll/test/create/FakeCreatePollEntryPoint.kt @@ -0,0 +1,22 @@ +/* + * Copyright 2025 New Vector Ltd. + * + * SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial + * Please see LICENSE files in the repository root for full details. + */ + +package io.element.android.features.poll.test.create + +import com.bumble.appyx.core.modality.BuildContext +import com.bumble.appyx.core.node.Node +import io.element.android.features.poll.api.create.CreatePollEntryPoint +import io.element.android.features.poll.api.create.CreatePollEntryPoint.Params +import io.element.android.tests.testutils.lambda.lambdaError + +class FakeCreatePollEntryPoint : CreatePollEntryPoint { + context(parentNode: Node) + override fun createNode( + buildContext: BuildContext, + params: Params, + ): Node = lambdaError() +} diff --git a/features/poll/test/src/main/kotlin/io/element/android/features/poll/test/history/FakePollHistoryEntryPoint.kt b/features/poll/test/src/main/kotlin/io/element/android/features/poll/test/history/FakePollHistoryEntryPoint.kt new file mode 100644 index 0000000000..5e20159fd8 --- /dev/null +++ b/features/poll/test/src/main/kotlin/io/element/android/features/poll/test/history/FakePollHistoryEntryPoint.kt @@ -0,0 +1,20 @@ +/* + * Copyright 2025 New Vector Ltd. + * + * SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial + * Please see LICENSE files in the repository root for full details. + */ + +package io.element.android.features.poll.test.history + +import com.bumble.appyx.core.modality.BuildContext +import com.bumble.appyx.core.node.Node +import io.element.android.features.poll.api.history.PollHistoryEntryPoint +import io.element.android.tests.testutils.lambda.lambdaError + +class FakePollHistoryEntryPoint : PollHistoryEntryPoint { + context(parentNode: Node) + override fun createNode( + buildContext: BuildContext, + ): Node = lambdaError() +} diff --git a/features/preferences/impl/build.gradle.kts b/features/preferences/impl/build.gradle.kts index 6858ebef51..31a7f87440 100644 --- a/features/preferences/impl/build.gradle.kts +++ b/features/preferences/impl/build.gradle.kts @@ -102,8 +102,13 @@ dependencies { testImplementation(projects.libraries.preferences.test) testImplementation(projects.libraries.push.test) testImplementation(projects.libraries.pushstore.test) + testImplementation(projects.libraries.roomselect.test) + testImplementation(projects.libraries.troubleshoot.test) + testImplementation(projects.features.deactivation.test) testImplementation(projects.features.enterprise.test) testImplementation(projects.features.invite.test) + testImplementation(projects.features.licenses.test) + testImplementation(projects.features.lockscreen.test) testImplementation(projects.features.rageshake.test) testImplementation(projects.features.logout.test) testImplementation(projects.libraries.indicator.test) diff --git a/features/preferences/impl/src/test/kotlin/io/element/android/features/preferences/impl/DefaultPreferencesEntryPointTest.kt b/features/preferences/impl/src/test/kotlin/io/element/android/features/preferences/impl/DefaultPreferencesEntryPointTest.kt index 2a3d40b84a..f46a66248e 100644 --- a/features/preferences/impl/src/test/kotlin/io/element/android/features/preferences/impl/DefaultPreferencesEntryPointTest.kt +++ b/features/preferences/impl/src/test/kotlin/io/element/android/features/preferences/impl/DefaultPreferencesEntryPointTest.kt @@ -7,21 +7,19 @@ package io.element.android.features.preferences.impl -import android.content.Context import androidx.arch.core.executor.testing.InstantTaskExecutorRule import com.bumble.appyx.core.modality.BuildContext -import com.bumble.appyx.core.node.Node import com.bumble.appyx.testing.junit4.util.MainDispatcherRule import com.google.common.truth.Truth.assertThat -import io.element.android.features.deactivation.api.AccountDeactivationEntryPoint -import io.element.android.features.licenses.api.OpenSourceLicensesEntryPoint -import io.element.android.features.lockscreen.api.LockScreenEntryPoint -import io.element.android.features.logout.api.LogoutEntryPoint +import io.element.android.features.deactivation.test.FakeAccountDeactivationEntryPoint +import io.element.android.features.licenses.test.FakeOpenSourceLicensesEntryPoint +import io.element.android.features.lockscreen.test.FakeLockScreenEntryPoint +import io.element.android.features.logout.test.FakeLogoutEntryPoint import io.element.android.features.preferences.api.PreferencesEntryPoint import io.element.android.libraries.matrix.api.core.EventId import io.element.android.libraries.matrix.api.core.RoomId -import io.element.android.libraries.troubleshoot.api.NotificationTroubleShootEntryPoint -import io.element.android.libraries.troubleshoot.api.PushHistoryEntryPoint +import io.element.android.libraries.troubleshoot.test.FakeNotificationTroubleShootEntryPoint +import io.element.android.libraries.troubleshoot.test.FakePushHistoryEntryPoint import io.element.android.tests.testutils.lambda.lambdaError import io.element.android.tests.testutils.node.TestParentNode import org.junit.Rule @@ -41,45 +39,12 @@ class DefaultPreferencesEntryPointTest { PreferencesFlowNode( buildContext = buildContext, plugins = plugins, - lockScreenEntryPoint = object : LockScreenEntryPoint { - context(parentNode: Node) - override fun createNode( - buildContext: BuildContext, - navTarget: LockScreenEntryPoint.Target, - callback: LockScreenEntryPoint.Callback, - ) = lambdaError() - - override fun pinUnlockIntent(context: Context) = lambdaError() - }, - notificationTroubleShootEntryPoint = object : NotificationTroubleShootEntryPoint { - context(parentNode: Node) - override fun createNode( - buildContext: BuildContext, - callback: NotificationTroubleShootEntryPoint.Callback, - ) = lambdaError() - }, - pushHistoryEntryPoint = object : PushHistoryEntryPoint { - context(parentNode: Node) - override fun createNode( - buildContext: BuildContext, - callback: PushHistoryEntryPoint.Callback, - ) = lambdaError() - }, - logoutEntryPoint = object : LogoutEntryPoint { - context(parentNode: Node) - override fun createNode( - buildContext: BuildContext, - callback: LogoutEntryPoint.Callback, - ) = lambdaError() - }, - openSourceLicensesEntryPoint = object : OpenSourceLicensesEntryPoint { - context(parentNode: Node) - override fun createNode(buildContext: BuildContext) = lambdaError() - }, - accountDeactivationEntryPoint = object : AccountDeactivationEntryPoint { - context(parentNode: Node) - override fun createNode(buildContext: BuildContext) = lambdaError() - }, + lockScreenEntryPoint = FakeLockScreenEntryPoint(), + notificationTroubleShootEntryPoint = FakeNotificationTroubleShootEntryPoint(), + pushHistoryEntryPoint = FakePushHistoryEntryPoint(), + logoutEntryPoint = FakeLogoutEntryPoint(), + openSourceLicensesEntryPoint = FakeOpenSourceLicensesEntryPoint(), + accountDeactivationEntryPoint = FakeAccountDeactivationEntryPoint(), ) } val callback = object : PreferencesEntryPoint.Callback { diff --git a/features/rageshake/impl/build.gradle.kts b/features/rageshake/impl/build.gradle.kts index b17d78f3aa..ddc1e8a198 100644 --- a/features/rageshake/impl/build.gradle.kts +++ b/features/rageshake/impl/build.gradle.kts @@ -52,6 +52,7 @@ dependencies { testImplementation(projects.libraries.matrix.test) testImplementation(projects.libraries.sessionStorage.test) testImplementation(projects.features.rageshake.test) + testImplementation(projects.features.viewfolder.test) testImplementation(projects.libraries.preferences.test) testImplementation(projects.services.toolbox.test) testImplementation(libs.network.mockwebserver) diff --git a/features/rageshake/impl/src/test/kotlin/io/element/android/features/rageshake/impl/bugreport/DefaultBugReportEntryPointTest.kt b/features/rageshake/impl/src/test/kotlin/io/element/android/features/rageshake/impl/bugreport/DefaultBugReportEntryPointTest.kt index 0294485a15..da3e2e8982 100644 --- a/features/rageshake/impl/src/test/kotlin/io/element/android/features/rageshake/impl/bugreport/DefaultBugReportEntryPointTest.kt +++ b/features/rageshake/impl/src/test/kotlin/io/element/android/features/rageshake/impl/bugreport/DefaultBugReportEntryPointTest.kt @@ -9,11 +9,10 @@ package io.element.android.features.rageshake.impl.bugreport import androidx.arch.core.executor.testing.InstantTaskExecutorRule import com.bumble.appyx.core.modality.BuildContext -import com.bumble.appyx.core.node.Node import com.bumble.appyx.testing.junit4.util.MainDispatcherRule import com.google.common.truth.Truth.assertThat import io.element.android.features.rageshake.api.bugreport.BugReportEntryPoint -import io.element.android.features.viewfolder.api.ViewFolderEntryPoint +import io.element.android.features.viewfolder.test.FakeViewFolderEntryPoint import io.element.android.tests.testutils.lambda.lambdaError import io.element.android.tests.testutils.node.TestParentNode import kotlinx.coroutines.test.runTest @@ -34,14 +33,7 @@ class DefaultBugReportEntryPointTest { BugReportFlowNode( buildContext = buildContext, plugins = plugins, - viewFolderEntryPoint = object : ViewFolderEntryPoint { - context(parentNode: Node) - override fun createNode( - buildContext: BuildContext, - params: ViewFolderEntryPoint.Params, - callback: ViewFolderEntryPoint.Callback, - ) = lambdaError() - }, + viewFolderEntryPoint = FakeViewFolderEntryPoint(), ) } val callback = object : BugReportEntryPoint.Callback { diff --git a/features/reportroom/test/build.gradle.kts b/features/reportroom/test/build.gradle.kts new file mode 100644 index 0000000000..42528ad531 --- /dev/null +++ b/features/reportroom/test/build.gradle.kts @@ -0,0 +1,21 @@ +/* + * Copyright 2025 New Vector Ltd. + * + * SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial + * Please see LICENSE files in the repository root for full details. + */ + +plugins { + id("io.element.android-library") +} + +android { + namespace = "io.element.android.features.reportroom.test" +} + +dependencies { + implementation(projects.features.reportroom.api) + implementation(projects.libraries.architecture) + implementation(projects.libraries.matrix.api) + implementation(projects.tests.testutils) +} diff --git a/features/reportroom/test/src/main/kotlin/io/element/android/features/reportroom/test/FakeReportRoomEntryPoint.kt b/features/reportroom/test/src/main/kotlin/io/element/android/features/reportroom/test/FakeReportRoomEntryPoint.kt new file mode 100644 index 0000000000..0129686ff0 --- /dev/null +++ b/features/reportroom/test/src/main/kotlin/io/element/android/features/reportroom/test/FakeReportRoomEntryPoint.kt @@ -0,0 +1,21 @@ +/* + * Copyright 2025 New Vector Ltd. + * + * SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial + * Please see LICENSE files in the repository root for full details. + */ + +package io.element.android.features.reportroom.test + +import com.bumble.appyx.core.modality.BuildContext +import com.bumble.appyx.core.node.Node +import io.element.android.features.reportroom.api.ReportRoomEntryPoint +import io.element.android.libraries.matrix.api.core.RoomId +import io.element.android.tests.testutils.lambda.lambdaError + +class FakeReportRoomEntryPoint : ReportRoomEntryPoint { + context(parentNode: Node) + override fun createNode(buildContext: BuildContext, roomId: RoomId): Node { + lambdaError() + } +} diff --git a/features/roomdetails/impl/build.gradle.kts b/features/roomdetails/impl/build.gradle.kts index 882058ef48..896fc8dbdc 100644 --- a/features/roomdetails/impl/build.gradle.kts +++ b/features/roomdetails/impl/build.gradle.kts @@ -63,10 +63,18 @@ dependencies { testImplementation(projects.libraries.matrix.test) testImplementation(projects.libraries.mediaupload.test) testImplementation(projects.libraries.mediapickers.test) + testImplementation(projects.libraries.mediaviewer.test) testImplementation(projects.libraries.permissions.test) testImplementation(projects.libraries.preferences.test) testImplementation(projects.libraries.usersearch.test) testImplementation(projects.libraries.featureflag.test) + testImplementation(projects.features.call.test) + testImplementation(projects.features.changeroommemberroles.test) + testImplementation(projects.features.knockrequests.test) + testImplementation(projects.features.messages.test) + testImplementation(projects.features.poll.test) + testImplementation(projects.features.reportroom.test) testImplementation(projects.features.startchat.test) + testImplementation(projects.features.verifysession.test) testImplementation(projects.services.analytics.test) } diff --git a/features/roomdetails/impl/src/test/kotlin/io/element/android/features/roomdetails/impl/DefaultRoomDetailsEntryPointTest.kt b/features/roomdetails/impl/src/test/kotlin/io/element/android/features/roomdetails/impl/DefaultRoomDetailsEntryPointTest.kt index a20aa80daa..45a24902ee 100644 --- a/features/roomdetails/impl/src/test/kotlin/io/element/android/features/roomdetails/impl/DefaultRoomDetailsEntryPointTest.kt +++ b/features/roomdetails/impl/src/test/kotlin/io/element/android/features/roomdetails/impl/DefaultRoomDetailsEntryPointTest.kt @@ -9,28 +9,23 @@ package io.element.android.features.roomdetails.impl import androidx.arch.core.executor.testing.InstantTaskExecutorRule import com.bumble.appyx.core.modality.BuildContext -import com.bumble.appyx.core.node.Node import com.bumble.appyx.testing.junit4.util.MainDispatcherRule import com.google.common.truth.Truth.assertThat -import io.element.android.features.call.api.CallType -import io.element.android.features.call.api.ElementCallEntryPoint -import io.element.android.features.changeroommemberroes.api.ChangeRoomMemberRolesEntryPoint -import io.element.android.features.changeroommemberroes.api.ChangeRoomMemberRolesListType -import io.element.android.features.knockrequests.api.list.KnockRequestsListEntryPoint -import io.element.android.features.messages.api.MessagesEntryPoint -import io.element.android.features.poll.api.history.PollHistoryEntryPoint -import io.element.android.features.reportroom.api.ReportRoomEntryPoint +import io.element.android.features.call.test.FakeElementCallEntryPoint +import io.element.android.features.changeroommemberroes.test.FakeChangeRoomMemberRolesEntryPoint +import io.element.android.features.knockrequests.test.FakeKnockRequestsListEntryPoint +import io.element.android.features.messages.test.FakeMessagesEntryPoint +import io.element.android.features.poll.test.history.FakePollHistoryEntryPoint +import io.element.android.features.reportroom.test.FakeReportRoomEntryPoint import io.element.android.features.roomdetails.api.RoomDetailsEntryPoint -import io.element.android.features.verifysession.api.OutgoingVerificationEntryPoint +import io.element.android.features.verifysession.test.FakeOutgoingVerificationEntryPoint 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.UserId import io.element.android.libraries.matrix.api.permalink.PermalinkData -import io.element.android.libraries.matrix.api.room.JoinedRoom import io.element.android.libraries.matrix.test.A_USER_ID import io.element.android.libraries.matrix.test.room.FakeJoinedRoom -import io.element.android.libraries.mediaviewer.api.MediaGalleryEntryPoint -import io.element.android.libraries.mediaviewer.api.MediaViewerEntryPoint +import io.element.android.libraries.mediaviewer.test.FakeMediaGalleryEntryPoint +import io.element.android.libraries.mediaviewer.test.FakeMediaViewerEntryPoint import io.element.android.services.analytics.test.FakeAnalyticsService import io.element.android.tests.testutils.lambda.lambdaError import io.element.android.tests.testutils.node.TestParentNode @@ -52,76 +47,17 @@ class DefaultRoomDetailsEntryPointTest { RoomDetailsFlowNode( buildContext = buildContext, plugins = plugins, - pollHistoryEntryPoint = object : PollHistoryEntryPoint { - context(parentNode: Node) - override fun createNode(buildContext: BuildContext) = lambdaError() - }, - elementCallEntryPoint = object : ElementCallEntryPoint { - override fun startCall(callType: CallType) = lambdaError() - override suspend fun handleIncomingCall( - callType: CallType.RoomCall, - eventId: EventId, - senderId: UserId, - roomName: String?, - senderName: String?, - avatarUrl: String?, - timestamp: Long, - expirationTimestamp: Long, - notificationChannelId: String, - textContent: String? - ) = lambdaError() - }, + pollHistoryEntryPoint = FakePollHistoryEntryPoint(), + elementCallEntryPoint = FakeElementCallEntryPoint(), room = FakeJoinedRoom(), analyticsService = FakeAnalyticsService(), - messagesEntryPoint = object : MessagesEntryPoint { - context(parentNode: Node) - override fun createNode( - buildContext: BuildContext, - params: MessagesEntryPoint.Params, - callback: MessagesEntryPoint.Callback, - ) = lambdaError() - }, - knockRequestsListEntryPoint = object : KnockRequestsListEntryPoint { - context(parentNode: Node) - override fun createNode(buildContext: BuildContext) = lambdaError() - }, - mediaViewerEntryPoint = object : MediaViewerEntryPoint { - override fun createParamsForAvatar(filename: String, avatarUrl: String) = lambdaError() - - context(parentNode: Node) - override fun createNode( - buildContext: BuildContext, - params: MediaViewerEntryPoint.Params, - callback: MediaViewerEntryPoint.Callback, - ) = lambdaError() - }, - mediaGalleryEntryPoint = object : MediaGalleryEntryPoint { - context(parentNode: Node) - override fun createNode( - buildContext: BuildContext, - callback: MediaGalleryEntryPoint.Callback, - ) = lambdaError() - }, - outgoingVerificationEntryPoint = object : OutgoingVerificationEntryPoint { - context(parentNode: Node) - override fun createNode( - buildContext: BuildContext, - params: OutgoingVerificationEntryPoint.Params, - callback: OutgoingVerificationEntryPoint.Callback, - ) = lambdaError() - }, - reportRoomEntryPoint = object : ReportRoomEntryPoint { - context(parentNode: Node) - override fun createNode(buildContext: BuildContext, roomId: RoomId) = lambdaError() - }, - changeRoomMemberRolesEntryPoint = object : ChangeRoomMemberRolesEntryPoint { - context(parentNode: Node) - override fun createNode( - buildContext: BuildContext, - room: JoinedRoom, - listType: ChangeRoomMemberRolesListType, - ) = lambdaError() - }, + messagesEntryPoint = FakeMessagesEntryPoint(), + knockRequestsListEntryPoint = FakeKnockRequestsListEntryPoint(), + mediaViewerEntryPoint = FakeMediaViewerEntryPoint(), + mediaGalleryEntryPoint = FakeMediaGalleryEntryPoint(), + outgoingVerificationEntryPoint = FakeOutgoingVerificationEntryPoint(), + reportRoomEntryPoint = FakeReportRoomEntryPoint(), + changeRoomMemberRolesEntryPoint = FakeChangeRoomMemberRolesEntryPoint(), ) } val callback = object : RoomDetailsEntryPoint.Callback { diff --git a/features/share/impl/build.gradle.kts b/features/share/impl/build.gradle.kts index 4c62a06352..dfe4d96543 100644 --- a/features/share/impl/build.gradle.kts +++ b/features/share/impl/build.gradle.kts @@ -46,4 +46,5 @@ dependencies { testImplementation(projects.libraries.matrix.test) testImplementation(projects.libraries.mediaupload.test) testImplementation(projects.libraries.preferences.test) + testImplementation(projects.libraries.roomselect.test) } diff --git a/features/share/impl/src/test/kotlin/io/element/android/features/share/impl/DefaultShareEntryPointTest.kt b/features/share/impl/src/test/kotlin/io/element/android/features/share/impl/DefaultShareEntryPointTest.kt index 32207d3d46..bdbeb37d40 100644 --- a/features/share/impl/src/test/kotlin/io/element/android/features/share/impl/DefaultShareEntryPointTest.kt +++ b/features/share/impl/src/test/kotlin/io/element/android/features/share/impl/DefaultShareEntryPointTest.kt @@ -10,12 +10,11 @@ package io.element.android.features.share.impl import android.content.Intent import androidx.arch.core.executor.testing.InstantTaskExecutorRule import com.bumble.appyx.core.modality.BuildContext -import com.bumble.appyx.core.node.Node import com.bumble.appyx.testing.junit4.util.MainDispatcherRule import com.google.common.truth.Truth.assertThat import io.element.android.features.share.api.ShareEntryPoint import io.element.android.libraries.matrix.api.core.RoomId -import io.element.android.libraries.roomselect.api.RoomSelectEntryPoint +import io.element.android.libraries.roomselect.test.FakeRoomSelectEntryPoint import io.element.android.tests.testutils.lambda.lambdaError import io.element.android.tests.testutils.node.TestParentNode import kotlinx.coroutines.test.runTest @@ -37,14 +36,7 @@ class DefaultShareEntryPointTest { buildContext = buildContext, plugins = plugins, presenterFactory = { createSharePresenter() }, - roomSelectEntryPoint = object : RoomSelectEntryPoint { - context(parentNode: Node) - override fun createNode( - buildContext: BuildContext, - params: RoomSelectEntryPoint.Params, - callback: RoomSelectEntryPoint.Callback, - ) = lambdaError() - }, + roomSelectEntryPoint = FakeRoomSelectEntryPoint(), ) } val callback = object : ShareEntryPoint.Callback { diff --git a/features/startchat/impl/build.gradle.kts b/features/startchat/impl/build.gradle.kts index 8ba7593b36..0f1c513db0 100644 --- a/features/startchat/impl/build.gradle.kts +++ b/features/startchat/impl/build.gradle.kts @@ -51,6 +51,7 @@ dependencies { testImplementation(projects.libraries.mediaupload.test) testImplementation(projects.libraries.permissions.test) testImplementation(projects.libraries.usersearch.test) + testImplementation(projects.features.createroom.test) testImplementation(projects.features.startchat.test) testImplementation(projects.libraries.featureflag.test) } diff --git a/features/startchat/impl/src/test/kotlin/io/element/android/features/startchat/impl/DefaultStartChatEntryPointTest.kt b/features/startchat/impl/src/test/kotlin/io/element/android/features/startchat/impl/DefaultStartChatEntryPointTest.kt index 248848b764..e8644da700 100644 --- a/features/startchat/impl/src/test/kotlin/io/element/android/features/startchat/impl/DefaultStartChatEntryPointTest.kt +++ b/features/startchat/impl/src/test/kotlin/io/element/android/features/startchat/impl/DefaultStartChatEntryPointTest.kt @@ -9,10 +9,9 @@ package io.element.android.features.startchat.impl import androidx.arch.core.executor.testing.InstantTaskExecutorRule import com.bumble.appyx.core.modality.BuildContext -import com.bumble.appyx.core.node.Node import com.bumble.appyx.testing.junit4.util.MainDispatcherRule import com.google.common.truth.Truth.assertThat -import io.element.android.features.createroom.api.CreateRoomEntryPoint +import io.element.android.features.createroom.api.FakeCreateRoomEntryPoint import io.element.android.features.startchat.api.StartChatEntryPoint import io.element.android.libraries.matrix.api.core.RoomIdOrAlias import io.element.android.tests.testutils.lambda.lambdaError @@ -34,13 +33,7 @@ class DefaultStartChatEntryPointTest { StartChatFlowNode( buildContext = buildContext, plugins = plugins, - createRoomEntryPoint = object : CreateRoomEntryPoint { - context(parentNode: Node) - override fun createNode( - buildContext: BuildContext, - callback: CreateRoomEntryPoint.Callback, - ) = lambdaError() - }, + createRoomEntryPoint = FakeCreateRoomEntryPoint(), ) } val callback = object : StartChatEntryPoint.Callback { diff --git a/features/userprofile/impl/build.gradle.kts b/features/userprofile/impl/build.gradle.kts index f0c214c22e..b8a5506dd4 100644 --- a/features/userprofile/impl/build.gradle.kts +++ b/features/userprofile/impl/build.gradle.kts @@ -44,6 +44,9 @@ dependencies { testCommonDependencies(libs, true) testImplementation(projects.libraries.matrix.test) + testImplementation(projects.libraries.mediaviewer.test) + testImplementation(projects.features.call.test) + testImplementation(projects.features.verifysession.test) testImplementation(projects.features.startchat.test) testImplementation(projects.features.enterprise.test) } diff --git a/features/userprofile/impl/src/test/kotlin/io/element/android/features/userprofile/impl/DefaultUserProfileEntryPointTest.kt b/features/userprofile/impl/src/test/kotlin/io/element/android/features/userprofile/impl/DefaultUserProfileEntryPointTest.kt index 3772b4d415..520f2e39af 100644 --- a/features/userprofile/impl/src/test/kotlin/io/element/android/features/userprofile/impl/DefaultUserProfileEntryPointTest.kt +++ b/features/userprofile/impl/src/test/kotlin/io/element/android/features/userprofile/impl/DefaultUserProfileEntryPointTest.kt @@ -9,19 +9,15 @@ package io.element.android.features.userprofile.impl import androidx.arch.core.executor.testing.InstantTaskExecutorRule import com.bumble.appyx.core.modality.BuildContext -import com.bumble.appyx.core.node.Node import com.bumble.appyx.testing.junit4.util.MainDispatcherRule import com.google.common.truth.Truth.assertThat -import io.element.android.features.call.api.CallType -import io.element.android.features.call.api.ElementCallEntryPoint +import io.element.android.features.call.test.FakeElementCallEntryPoint import io.element.android.features.userprofile.api.UserProfileEntryPoint -import io.element.android.features.verifysession.api.OutgoingVerificationEntryPoint -import io.element.android.libraries.matrix.api.core.EventId +import io.element.android.features.verifysession.test.FakeOutgoingVerificationEntryPoint import io.element.android.libraries.matrix.api.core.RoomId -import io.element.android.libraries.matrix.api.core.UserId import io.element.android.libraries.matrix.test.A_SESSION_ID import io.element.android.libraries.matrix.test.A_USER_ID -import io.element.android.libraries.mediaviewer.api.MediaViewerEntryPoint +import io.element.android.libraries.mediaviewer.test.FakeMediaViewerEntryPoint import io.element.android.tests.testutils.lambda.lambdaError import io.element.android.tests.testutils.node.TestParentNode import org.junit.Rule @@ -43,38 +39,9 @@ class DefaultUserProfileEntryPointTest { buildContext = buildContext, plugins = plugins, sessionId = A_SESSION_ID, - elementCallEntryPoint = object : ElementCallEntryPoint { - override fun startCall(callType: CallType) = lambdaError() - override suspend fun handleIncomingCall( - callType: CallType.RoomCall, - eventId: EventId, - senderId: UserId, - roomName: String?, - senderName: String?, - avatarUrl: String?, - timestamp: Long, - expirationTimestamp: Long, - notificationChannelId: String, - textContent: String? - ) = lambdaError() - }, - mediaViewerEntryPoint = object : MediaViewerEntryPoint { - override fun createParamsForAvatar(filename: String, avatarUrl: String) = lambdaError() - context(parentNode: Node) - override fun createNode( - buildContext: BuildContext, - params: MediaViewerEntryPoint.Params, - callback: MediaViewerEntryPoint.Callback - ) = lambdaError() - }, - outgoingVerificationEntryPoint = object : OutgoingVerificationEntryPoint { - context(parentNode: Node) - override fun createNode( - buildContext: BuildContext, - params: OutgoingVerificationEntryPoint.Params, - callback: OutgoingVerificationEntryPoint.Callback, - ) = lambdaError() - }, + elementCallEntryPoint = FakeElementCallEntryPoint(), + mediaViewerEntryPoint = FakeMediaViewerEntryPoint(), + outgoingVerificationEntryPoint = FakeOutgoingVerificationEntryPoint(), ) } val callback = object : UserProfileEntryPoint.Callback { diff --git a/features/verifysession/test/build.gradle.kts b/features/verifysession/test/build.gradle.kts new file mode 100644 index 0000000000..f392f8cc6d --- /dev/null +++ b/features/verifysession/test/build.gradle.kts @@ -0,0 +1,20 @@ +/* + * Copyright 2025 New Vector Ltd. + * + * SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial + * Please see LICENSE files in the repository root for full details. + */ + +plugins { + id("io.element.android-library") +} + +android { + namespace = "io.element.android.features.verifysession.test" +} + +dependencies { + implementation(projects.features.verifysession.api) + implementation(projects.libraries.architecture) + implementation(projects.tests.testutils) +} diff --git a/features/verifysession/test/src/main/kotlin/io/element/android/features/verifysession/test/FakeIncomingVerificationEntryPoint.kt b/features/verifysession/test/src/main/kotlin/io/element/android/features/verifysession/test/FakeIncomingVerificationEntryPoint.kt new file mode 100644 index 0000000000..754d493996 --- /dev/null +++ b/features/verifysession/test/src/main/kotlin/io/element/android/features/verifysession/test/FakeIncomingVerificationEntryPoint.kt @@ -0,0 +1,22 @@ +/* + * Copyright 2025 New Vector Ltd. + * + * SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial + * Please see LICENSE files in the repository root for full details. + */ + +package io.element.android.features.verifysession.test + +import com.bumble.appyx.core.modality.BuildContext +import com.bumble.appyx.core.node.Node +import io.element.android.features.verifysession.api.IncomingVerificationEntryPoint +import io.element.android.tests.testutils.lambda.lambdaError + +class FakeIncomingVerificationEntryPoint : IncomingVerificationEntryPoint { + context(parentNode: Node) + override fun createNode( + buildContext: BuildContext, + params: IncomingVerificationEntryPoint.Params, + callback: IncomingVerificationEntryPoint.Callback, + ): Node = lambdaError() +} diff --git a/features/verifysession/test/src/main/kotlin/io/element/android/features/verifysession/test/FakeOutgoingVerificationEntryPoint.kt b/features/verifysession/test/src/main/kotlin/io/element/android/features/verifysession/test/FakeOutgoingVerificationEntryPoint.kt new file mode 100644 index 0000000000..2d5491578e --- /dev/null +++ b/features/verifysession/test/src/main/kotlin/io/element/android/features/verifysession/test/FakeOutgoingVerificationEntryPoint.kt @@ -0,0 +1,22 @@ +/* + * Copyright 2025 New Vector Ltd. + * + * SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial + * Please see LICENSE files in the repository root for full details. + */ + +package io.element.android.features.verifysession.test + +import com.bumble.appyx.core.modality.BuildContext +import com.bumble.appyx.core.node.Node +import io.element.android.features.verifysession.api.OutgoingVerificationEntryPoint +import io.element.android.tests.testutils.lambda.lambdaError + +class FakeOutgoingVerificationEntryPoint : OutgoingVerificationEntryPoint { + context(parentNode: Node) + override fun createNode( + buildContext: BuildContext, + params: OutgoingVerificationEntryPoint.Params, + callback: OutgoingVerificationEntryPoint.Callback, + ): Node = lambdaError() +} diff --git a/features/viewfolder/test/build.gradle.kts b/features/viewfolder/test/build.gradle.kts new file mode 100644 index 0000000000..33bdfe03e2 --- /dev/null +++ b/features/viewfolder/test/build.gradle.kts @@ -0,0 +1,19 @@ +/* + * Copyright 2025 New Vector Ltd. + * + * SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial + * Please see LICENSE files in the repository root for full details. + */ +plugins { + id("io.element.android-library") +} + +android { + namespace = "io.element.android.features.viewfolder.test" +} + +dependencies { + implementation(projects.features.viewfolder.api) + implementation(projects.libraries.architecture) + implementation(projects.tests.testutils) +} diff --git a/features/viewfolder/test/src/main/kotlin/io/element/android/features/viewfolder/test/FakeViewFolderEntryPoint.kt b/features/viewfolder/test/src/main/kotlin/io/element/android/features/viewfolder/test/FakeViewFolderEntryPoint.kt new file mode 100644 index 0000000000..6b0ba721ad --- /dev/null +++ b/features/viewfolder/test/src/main/kotlin/io/element/android/features/viewfolder/test/FakeViewFolderEntryPoint.kt @@ -0,0 +1,22 @@ +/* + * Copyright 2025 New Vector Ltd. + * + * SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial + * Please see LICENSE files in the repository root for full details. + */ + +package io.element.android.features.viewfolder.test + +import com.bumble.appyx.core.modality.BuildContext +import com.bumble.appyx.core.node.Node +import io.element.android.features.viewfolder.api.ViewFolderEntryPoint +import io.element.android.tests.testutils.lambda.lambdaError + +class FakeViewFolderEntryPoint : ViewFolderEntryPoint { + context(parentNode: Node) + override fun createNode( + buildContext: BuildContext, + params: ViewFolderEntryPoint.Params, + callback: ViewFolderEntryPoint.Callback, + ): Node = lambdaError() +} diff --git a/libraries/mediaviewer/impl/src/test/kotlin/io/element/android/libraries/mediaviewer/impl/DefaultMediaGalleryEntryPointTest.kt b/libraries/mediaviewer/impl/src/test/kotlin/io/element/android/libraries/mediaviewer/impl/DefaultMediaGalleryEntryPointTest.kt index 3c54966090..a5dce8f4ec 100644 --- a/libraries/mediaviewer/impl/src/test/kotlin/io/element/android/libraries/mediaviewer/impl/DefaultMediaGalleryEntryPointTest.kt +++ b/libraries/mediaviewer/impl/src/test/kotlin/io/element/android/libraries/mediaviewer/impl/DefaultMediaGalleryEntryPointTest.kt @@ -9,13 +9,12 @@ package io.element.android.libraries.mediaviewer.impl import androidx.arch.core.executor.testing.InstantTaskExecutorRule import com.bumble.appyx.core.modality.BuildContext -import com.bumble.appyx.core.node.Node import com.bumble.appyx.testing.junit4.util.MainDispatcherRule import com.google.common.truth.Truth.assertThat import io.element.android.libraries.matrix.api.core.EventId import io.element.android.libraries.mediaviewer.api.MediaGalleryEntryPoint -import io.element.android.libraries.mediaviewer.api.MediaViewerEntryPoint import io.element.android.libraries.mediaviewer.impl.gallery.root.MediaGalleryFlowNode +import io.element.android.libraries.mediaviewer.test.FakeMediaViewerEntryPoint import io.element.android.tests.testutils.lambda.lambdaError import io.element.android.tests.testutils.node.TestParentNode import org.junit.Rule @@ -35,15 +34,7 @@ class DefaultMediaGalleryEntryPointTest { MediaGalleryFlowNode( buildContext = buildContext, plugins = plugins, - mediaViewerEntryPoint = object : MediaViewerEntryPoint { - override fun createParamsForAvatar(filename: String, avatarUrl: String) = lambdaError() - context(parentNode: Node) - override fun createNode( - buildContext: BuildContext, - params: MediaViewerEntryPoint.Params, - callback: MediaViewerEntryPoint.Callback, - ) = lambdaError() - }, + mediaViewerEntryPoint = FakeMediaViewerEntryPoint(), ) } val callback = object : MediaGalleryEntryPoint.Callback { diff --git a/libraries/mediaviewer/test/src/main/kotlin/io/element/android/libraries/mediaviewer/test/FakeMediaGalleryEntryPoint.kt b/libraries/mediaviewer/test/src/main/kotlin/io/element/android/libraries/mediaviewer/test/FakeMediaGalleryEntryPoint.kt new file mode 100644 index 0000000000..341bf8a65f --- /dev/null +++ b/libraries/mediaviewer/test/src/main/kotlin/io/element/android/libraries/mediaviewer/test/FakeMediaGalleryEntryPoint.kt @@ -0,0 +1,21 @@ +/* + * Copyright 2025 New Vector Ltd. + * + * SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial + * Please see LICENSE files in the repository root for full details. + */ + +package io.element.android.libraries.mediaviewer.test + +import com.bumble.appyx.core.modality.BuildContext +import com.bumble.appyx.core.node.Node +import io.element.android.libraries.mediaviewer.api.MediaGalleryEntryPoint +import io.element.android.tests.testutils.lambda.lambdaError + +class FakeMediaGalleryEntryPoint : MediaGalleryEntryPoint { + context(parentNode: Node) + override fun createNode( + buildContext: BuildContext, + callback: MediaGalleryEntryPoint.Callback, + ): Node = lambdaError() +} diff --git a/libraries/mediaviewer/test/src/main/kotlin/io/element/android/libraries/mediaviewer/test/FakeMediaViewerEntryPoint.kt b/libraries/mediaviewer/test/src/main/kotlin/io/element/android/libraries/mediaviewer/test/FakeMediaViewerEntryPoint.kt new file mode 100644 index 0000000000..52e37e84b9 --- /dev/null +++ b/libraries/mediaviewer/test/src/main/kotlin/io/element/android/libraries/mediaviewer/test/FakeMediaViewerEntryPoint.kt @@ -0,0 +1,24 @@ +/* + * Copyright 2025 New Vector Ltd. + * + * SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial + * Please see LICENSE files in the repository root for full details. + */ + +package io.element.android.libraries.mediaviewer.test + +import com.bumble.appyx.core.modality.BuildContext +import com.bumble.appyx.core.node.Node +import io.element.android.libraries.mediaviewer.api.MediaViewerEntryPoint +import io.element.android.tests.testutils.lambda.lambdaError + +class FakeMediaViewerEntryPoint : MediaViewerEntryPoint { + override fun createParamsForAvatar(filename: String, avatarUrl: String) = lambdaError() + + context(parentNode: Node) + override fun createNode( + buildContext: BuildContext, + params: MediaViewerEntryPoint.Params, + callback: MediaViewerEntryPoint.Callback, + ): Node = lambdaError() +} diff --git a/libraries/roomselect/test/build.gradle.kts b/libraries/roomselect/test/build.gradle.kts new file mode 100644 index 0000000000..c4b63ef3c4 --- /dev/null +++ b/libraries/roomselect/test/build.gradle.kts @@ -0,0 +1,19 @@ +/* + * Copyright 2025 New Vector Ltd. + * + * SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial + * Please see LICENSE files in the repository root for full details. + */ +plugins { + id("io.element.android-library") +} + +android { + namespace = "io.element.android.libraries.roomselect.test" +} + +dependencies { + implementation(projects.libraries.architecture) + implementation(projects.libraries.roomselect.api) + implementation(projects.tests.testutils) +} diff --git a/libraries/roomselect/test/src/main/kotlin/io/element/android/libraries/roomselect/test/FakeRoomSelectEntryPoint.kt b/libraries/roomselect/test/src/main/kotlin/io/element/android/libraries/roomselect/test/FakeRoomSelectEntryPoint.kt new file mode 100644 index 0000000000..3b0ea4ac53 --- /dev/null +++ b/libraries/roomselect/test/src/main/kotlin/io/element/android/libraries/roomselect/test/FakeRoomSelectEntryPoint.kt @@ -0,0 +1,22 @@ +/* + * Copyright 2025 New Vector Ltd. + * + * SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial + * Please see LICENSE files in the repository root for full details. + */ + +package io.element.android.libraries.roomselect.test + +import com.bumble.appyx.core.modality.BuildContext +import com.bumble.appyx.core.node.Node +import io.element.android.libraries.roomselect.api.RoomSelectEntryPoint +import io.element.android.tests.testutils.lambda.lambdaError + +class FakeRoomSelectEntryPoint : RoomSelectEntryPoint { + context(parentNode: Node) + override fun createNode( + buildContext: BuildContext, + params: RoomSelectEntryPoint.Params, + callback: RoomSelectEntryPoint.Callback, + ): Node = lambdaError() +} diff --git a/libraries/troubleshoot/test/build.gradle.kts b/libraries/troubleshoot/test/build.gradle.kts index 8321ea5b4f..643afe8272 100644 --- a/libraries/troubleshoot/test/build.gradle.kts +++ b/libraries/troubleshoot/test/build.gradle.kts @@ -13,6 +13,7 @@ android { } dependencies { + implementation(projects.libraries.architecture) implementation(projects.libraries.troubleshoot.api) implementation(projects.tests.testutils) implementation(libs.coroutines.test) diff --git a/libraries/troubleshoot/test/src/main/kotlin/io/element/android/libraries/troubleshoot/test/FakeNotificationTroubleShootEntryPoint.kt b/libraries/troubleshoot/test/src/main/kotlin/io/element/android/libraries/troubleshoot/test/FakeNotificationTroubleShootEntryPoint.kt new file mode 100644 index 0000000000..84a79382e2 --- /dev/null +++ b/libraries/troubleshoot/test/src/main/kotlin/io/element/android/libraries/troubleshoot/test/FakeNotificationTroubleShootEntryPoint.kt @@ -0,0 +1,21 @@ +/* + * Copyright 2025 New Vector Ltd. + * + * SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial + * Please see LICENSE files in the repository root for full details. + */ + +package io.element.android.libraries.troubleshoot.test + +import com.bumble.appyx.core.modality.BuildContext +import com.bumble.appyx.core.node.Node +import io.element.android.libraries.troubleshoot.api.NotificationTroubleShootEntryPoint +import io.element.android.tests.testutils.lambda.lambdaError + +class FakeNotificationTroubleShootEntryPoint : NotificationTroubleShootEntryPoint { + context(parentNode: Node) + override fun createNode( + buildContext: BuildContext, + callback: NotificationTroubleShootEntryPoint.Callback, + ): Node = lambdaError() +} diff --git a/libraries/troubleshoot/test/src/main/kotlin/io/element/android/libraries/troubleshoot/test/FakePushHistoryEntryPoint.kt b/libraries/troubleshoot/test/src/main/kotlin/io/element/android/libraries/troubleshoot/test/FakePushHistoryEntryPoint.kt new file mode 100644 index 0000000000..7a4e96b839 --- /dev/null +++ b/libraries/troubleshoot/test/src/main/kotlin/io/element/android/libraries/troubleshoot/test/FakePushHistoryEntryPoint.kt @@ -0,0 +1,21 @@ +/* + * Copyright 2025 New Vector Ltd. + * + * SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial + * Please see LICENSE files in the repository root for full details. + */ + +package io.element.android.libraries.troubleshoot.test + +import com.bumble.appyx.core.modality.BuildContext +import com.bumble.appyx.core.node.Node +import io.element.android.libraries.troubleshoot.api.PushHistoryEntryPoint +import io.element.android.tests.testutils.lambda.lambdaError + +class FakePushHistoryEntryPoint : PushHistoryEntryPoint { + context(parentNode: Node) + override fun createNode( + buildContext: BuildContext, + callback: PushHistoryEntryPoint.Callback, + ): Node = lambdaError() +} From 45400d70d2e7658ea740e9cbb18487a1afe91507 Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Thu, 30 Oct 2025 18:47:20 +0100 Subject: [PATCH 11/46] Fix typo in package name. --- .../api/ChangeRoomMemberRolesEntryPoint.kt | 2 +- .../features/changeroommemberroles/impl/ChangeRolesNode.kt | 2 +- .../impl/ChangeRoomMemberRolesRootNode.kt | 4 ++-- .../impl/DefaultChangeRoomMemberRolesEntyPoint.kt | 4 ++-- .../changeroommemberroles/impl/ChangeRolesNodeTest.kt | 2 +- .../impl/DefaultChangeRoomMemberRolesEntyPointTest.kt | 2 +- .../test/FakeChangeRoomMemberRolesEntryPoint.kt | 6 +++--- .../io/element/android/features/home/impl/HomeFlowNode.kt | 4 ++-- .../features/roomdetails/impl/RoomDetailsFlowNode.kt | 4 ++-- .../impl/rolesandpermissions/RolesAndPermissionsFlowNode.kt | 4 ++-- .../roomdetails/impl/DefaultRoomDetailsEntryPointTest.kt | 2 +- 11 files changed, 18 insertions(+), 18 deletions(-) rename features/changeroommemberroles/api/src/main/kotlin/io/element/android/features/{changeroommemberroes => changeroommemberroles}/api/ChangeRoomMemberRolesEntryPoint.kt (94%) rename features/changeroommemberroles/test/src/main/kotlin/io/element/android/features/{changeroommemberroes => changeroommemberroles}/test/FakeChangeRoomMemberRolesEntryPoint.kt (73%) diff --git a/features/changeroommemberroles/api/src/main/kotlin/io/element/android/features/changeroommemberroes/api/ChangeRoomMemberRolesEntryPoint.kt b/features/changeroommemberroles/api/src/main/kotlin/io/element/android/features/changeroommemberroles/api/ChangeRoomMemberRolesEntryPoint.kt similarity index 94% rename from features/changeroommemberroles/api/src/main/kotlin/io/element/android/features/changeroommemberroes/api/ChangeRoomMemberRolesEntryPoint.kt rename to features/changeroommemberroles/api/src/main/kotlin/io/element/android/features/changeroommemberroles/api/ChangeRoomMemberRolesEntryPoint.kt index d21829d695..2b41a0ae76 100644 --- a/features/changeroommemberroles/api/src/main/kotlin/io/element/android/features/changeroommemberroes/api/ChangeRoomMemberRolesEntryPoint.kt +++ b/features/changeroommemberroles/api/src/main/kotlin/io/element/android/features/changeroommemberroles/api/ChangeRoomMemberRolesEntryPoint.kt @@ -5,7 +5,7 @@ * Please see LICENSE files in the repository root for full details. */ -package io.element.android.features.changeroommemberroes.api +package io.element.android.features.changeroommemberroles.api import com.bumble.appyx.core.modality.BuildContext import com.bumble.appyx.core.node.Node diff --git a/features/changeroommemberroles/impl/src/main/kotlin/io/element/android/features/changeroommemberroles/impl/ChangeRolesNode.kt b/features/changeroommemberroles/impl/src/main/kotlin/io/element/android/features/changeroommemberroles/impl/ChangeRolesNode.kt index 1b9c790b25..9edd20b549 100644 --- a/features/changeroommemberroles/impl/src/main/kotlin/io/element/android/features/changeroommemberroles/impl/ChangeRolesNode.kt +++ b/features/changeroommemberroles/impl/src/main/kotlin/io/element/android/features/changeroommemberroles/impl/ChangeRolesNode.kt @@ -17,7 +17,7 @@ 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.features.changeroommemberroes.api.ChangeRoomMemberRolesListType +import io.element.android.features.changeroommemberroles.api.ChangeRoomMemberRolesListType import io.element.android.libraries.architecture.NodeInputs import io.element.android.libraries.architecture.appyx.launchMolecule import io.element.android.libraries.architecture.inputs diff --git a/features/changeroommemberroles/impl/src/main/kotlin/io/element/android/features/changeroommemberroles/impl/ChangeRoomMemberRolesRootNode.kt b/features/changeroommemberroles/impl/src/main/kotlin/io/element/android/features/changeroommemberroles/impl/ChangeRoomMemberRolesRootNode.kt index 2c3f77f208..a7556ef8ca 100644 --- a/features/changeroommemberroles/impl/src/main/kotlin/io/element/android/features/changeroommemberroles/impl/ChangeRoomMemberRolesRootNode.kt +++ b/features/changeroommemberroles/impl/src/main/kotlin/io/element/android/features/changeroommemberroles/impl/ChangeRoomMemberRolesRootNode.kt @@ -20,8 +20,8 @@ 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.features.changeroommemberroes.api.ChangeRoomMemberRolesEntryPoint -import io.element.android.features.changeroommemberroes.api.ChangeRoomMemberRolesListType +import io.element.android.features.changeroommemberroles.api.ChangeRoomMemberRolesEntryPoint +import io.element.android.features.changeroommemberroles.api.ChangeRoomMemberRolesListType import io.element.android.libraries.architecture.NodeInputs import io.element.android.libraries.architecture.createNode import io.element.android.libraries.architecture.inputs diff --git a/features/changeroommemberroles/impl/src/main/kotlin/io/element/android/features/changeroommemberroles/impl/DefaultChangeRoomMemberRolesEntyPoint.kt b/features/changeroommemberroles/impl/src/main/kotlin/io/element/android/features/changeroommemberroles/impl/DefaultChangeRoomMemberRolesEntyPoint.kt index a3180c9828..b5aab56ce5 100644 --- a/features/changeroommemberroles/impl/src/main/kotlin/io/element/android/features/changeroommemberroles/impl/DefaultChangeRoomMemberRolesEntyPoint.kt +++ b/features/changeroommemberroles/impl/src/main/kotlin/io/element/android/features/changeroommemberroles/impl/DefaultChangeRoomMemberRolesEntyPoint.kt @@ -10,8 +10,8 @@ package io.element.android.features.changeroommemberroles.impl import com.bumble.appyx.core.modality.BuildContext import com.bumble.appyx.core.node.Node import dev.zacsweers.metro.ContributesBinding -import io.element.android.features.changeroommemberroes.api.ChangeRoomMemberRolesEntryPoint -import io.element.android.features.changeroommemberroes.api.ChangeRoomMemberRolesListType +import io.element.android.features.changeroommemberroles.api.ChangeRoomMemberRolesEntryPoint +import io.element.android.features.changeroommemberroles.api.ChangeRoomMemberRolesListType import io.element.android.libraries.architecture.createNode import io.element.android.libraries.di.SessionScope import io.element.android.libraries.matrix.api.room.JoinedRoom diff --git a/features/changeroommemberroles/impl/src/test/kotlin/io/element/android/features/changeroommemberroles/impl/ChangeRolesNodeTest.kt b/features/changeroommemberroles/impl/src/test/kotlin/io/element/android/features/changeroommemberroles/impl/ChangeRolesNodeTest.kt index 5a47f52e89..3da57d3380 100644 --- a/features/changeroommemberroles/impl/src/test/kotlin/io/element/android/features/changeroommemberroles/impl/ChangeRolesNodeTest.kt +++ b/features/changeroommemberroles/impl/src/test/kotlin/io/element/android/features/changeroommemberroles/impl/ChangeRolesNodeTest.kt @@ -8,7 +8,7 @@ package io.element.android.features.changeroommemberroles.impl import com.google.common.truth.Truth.assertThat -import io.element.android.features.changeroommemberroes.api.ChangeRoomMemberRolesListType +import io.element.android.features.changeroommemberroles.api.ChangeRoomMemberRolesListType import io.element.android.libraries.matrix.api.room.RoomMember import org.junit.Test diff --git a/features/changeroommemberroles/impl/src/test/kotlin/io/element/android/features/changeroommemberroles/impl/DefaultChangeRoomMemberRolesEntyPointTest.kt b/features/changeroommemberroles/impl/src/test/kotlin/io/element/android/features/changeroommemberroles/impl/DefaultChangeRoomMemberRolesEntyPointTest.kt index c438c5d0e4..efc91b45aa 100644 --- a/features/changeroommemberroles/impl/src/test/kotlin/io/element/android/features/changeroommemberroles/impl/DefaultChangeRoomMemberRolesEntyPointTest.kt +++ b/features/changeroommemberroles/impl/src/test/kotlin/io/element/android/features/changeroommemberroles/impl/DefaultChangeRoomMemberRolesEntyPointTest.kt @@ -10,7 +10,7 @@ package io.element.android.features.changeroommemberroles.impl import androidx.test.ext.junit.runners.AndroidJUnit4 import com.bumble.appyx.core.modality.BuildContext import com.google.common.truth.Truth.assertThat -import io.element.android.features.changeroommemberroes.api.ChangeRoomMemberRolesListType +import io.element.android.features.changeroommemberroles.api.ChangeRoomMemberRolesListType import io.element.android.libraries.matrix.test.room.FakeJoinedRoom import io.element.android.tests.testutils.node.TestParentNode import kotlinx.coroutines.test.runTest diff --git a/features/changeroommemberroles/test/src/main/kotlin/io/element/android/features/changeroommemberroes/test/FakeChangeRoomMemberRolesEntryPoint.kt b/features/changeroommemberroles/test/src/main/kotlin/io/element/android/features/changeroommemberroles/test/FakeChangeRoomMemberRolesEntryPoint.kt similarity index 73% rename from features/changeroommemberroles/test/src/main/kotlin/io/element/android/features/changeroommemberroes/test/FakeChangeRoomMemberRolesEntryPoint.kt rename to features/changeroommemberroles/test/src/main/kotlin/io/element/android/features/changeroommemberroles/test/FakeChangeRoomMemberRolesEntryPoint.kt index 75057654f3..9508447f25 100644 --- a/features/changeroommemberroles/test/src/main/kotlin/io/element/android/features/changeroommemberroes/test/FakeChangeRoomMemberRolesEntryPoint.kt +++ b/features/changeroommemberroles/test/src/main/kotlin/io/element/android/features/changeroommemberroles/test/FakeChangeRoomMemberRolesEntryPoint.kt @@ -5,12 +5,12 @@ * Please see LICENSE files in the repository root for full details. */ -package io.element.android.features.changeroommemberroes.test +package io.element.android.features.changeroommemberroles.test import com.bumble.appyx.core.modality.BuildContext import com.bumble.appyx.core.node.Node -import io.element.android.features.changeroommemberroes.api.ChangeRoomMemberRolesEntryPoint -import io.element.android.features.changeroommemberroes.api.ChangeRoomMemberRolesListType +import io.element.android.features.changeroommemberroles.api.ChangeRoomMemberRolesEntryPoint +import io.element.android.features.changeroommemberroles.api.ChangeRoomMemberRolesListType import io.element.android.libraries.matrix.api.room.JoinedRoom import io.element.android.tests.testutils.lambda.lambdaError diff --git a/features/home/impl/src/main/kotlin/io/element/android/features/home/impl/HomeFlowNode.kt b/features/home/impl/src/main/kotlin/io/element/android/features/home/impl/HomeFlowNode.kt index e3d1df3849..b0848d85af 100644 --- a/features/home/impl/src/main/kotlin/io/element/android/features/home/impl/HomeFlowNode.kt +++ b/features/home/impl/src/main/kotlin/io/element/android/features/home/impl/HomeFlowNode.kt @@ -28,8 +28,8 @@ import dev.zacsweers.metro.Assisted import dev.zacsweers.metro.AssistedInject import im.vector.app.features.analytics.plan.MobileScreen import io.element.android.annotations.ContributesNode -import io.element.android.features.changeroommemberroes.api.ChangeRoomMemberRolesEntryPoint -import io.element.android.features.changeroommemberroes.api.ChangeRoomMemberRolesListType +import io.element.android.features.changeroommemberroles.api.ChangeRoomMemberRolesEntryPoint +import io.element.android.features.changeroommemberroles.api.ChangeRoomMemberRolesListType import io.element.android.features.home.api.HomeEntryPoint import io.element.android.features.home.impl.components.RoomListMenuAction import io.element.android.features.home.impl.model.RoomListRoomSummary diff --git a/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/RoomDetailsFlowNode.kt b/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/RoomDetailsFlowNode.kt index ad70f0f0a0..f5e1307d72 100644 --- a/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/RoomDetailsFlowNode.kt +++ b/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/RoomDetailsFlowNode.kt @@ -26,8 +26,8 @@ import io.element.android.annotations.ContributesNode import io.element.android.appconfig.LearnMoreConfig import io.element.android.features.call.api.CallType import io.element.android.features.call.api.ElementCallEntryPoint -import io.element.android.features.changeroommemberroes.api.ChangeRoomMemberRolesEntryPoint -import io.element.android.features.changeroommemberroes.api.ChangeRoomMemberRolesListType +import io.element.android.features.changeroommemberroles.api.ChangeRoomMemberRolesEntryPoint +import io.element.android.features.changeroommemberroles.api.ChangeRoomMemberRolesListType import io.element.android.features.knockrequests.api.list.KnockRequestsListEntryPoint import io.element.android.features.messages.api.MessagesEntryPoint import io.element.android.features.poll.api.history.PollHistoryEntryPoint diff --git a/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/rolesandpermissions/RolesAndPermissionsFlowNode.kt b/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/rolesandpermissions/RolesAndPermissionsFlowNode.kt index 0dee0c2a54..c923c57f50 100644 --- a/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/rolesandpermissions/RolesAndPermissionsFlowNode.kt +++ b/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/rolesandpermissions/RolesAndPermissionsFlowNode.kt @@ -20,8 +20,8 @@ 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.features.changeroommemberroes.api.ChangeRoomMemberRolesEntryPoint -import io.element.android.features.changeroommemberroes.api.ChangeRoomMemberRolesListType +import io.element.android.features.changeroommemberroles.api.ChangeRoomMemberRolesEntryPoint +import io.element.android.features.changeroommemberroles.api.ChangeRoomMemberRolesListType import io.element.android.features.roomdetails.impl.rolesandpermissions.permissions.ChangeRoomPermissionsNode import io.element.android.features.roomdetails.impl.rolesandpermissions.permissions.ChangeRoomPermissionsSection import io.element.android.libraries.architecture.BackstackView diff --git a/features/roomdetails/impl/src/test/kotlin/io/element/android/features/roomdetails/impl/DefaultRoomDetailsEntryPointTest.kt b/features/roomdetails/impl/src/test/kotlin/io/element/android/features/roomdetails/impl/DefaultRoomDetailsEntryPointTest.kt index 45a24902ee..0e542a96d6 100644 --- a/features/roomdetails/impl/src/test/kotlin/io/element/android/features/roomdetails/impl/DefaultRoomDetailsEntryPointTest.kt +++ b/features/roomdetails/impl/src/test/kotlin/io/element/android/features/roomdetails/impl/DefaultRoomDetailsEntryPointTest.kt @@ -12,7 +12,7 @@ import com.bumble.appyx.core.modality.BuildContext import com.bumble.appyx.testing.junit4.util.MainDispatcherRule import com.google.common.truth.Truth.assertThat import io.element.android.features.call.test.FakeElementCallEntryPoint -import io.element.android.features.changeroommemberroes.test.FakeChangeRoomMemberRolesEntryPoint +import io.element.android.features.changeroommemberroles.test.FakeChangeRoomMemberRolesEntryPoint import io.element.android.features.knockrequests.test.FakeKnockRequestsListEntryPoint import io.element.android.features.messages.test.FakeMessagesEntryPoint import io.element.android.features.poll.test.history.FakePollHistoryEntryPoint From 4dc33d6c11ed29f7dcc9adeeaf821c53c73ddd4d Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Fri, 31 Oct 2025 09:45:43 +0100 Subject: [PATCH 12/46] fix(deps): update dependencyanalysis to v3.4.1 (#5642) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- gradle/libs.versions.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 64085f7306..3b6048c7ee 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -49,7 +49,7 @@ telephoto = "0.18.0" haze = "1.6.10" # Dependency analysis -dependencyAnalysis = "3.4.0" +dependencyAnalysis = "3.4.1" # DI metro = "0.7.2" From aaf6f8535b9153fe0a4cb23a4bf6a9b29b2cf5f5 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Fri, 31 Oct 2025 08:47:43 +0000 Subject: [PATCH 13/46] fix(deps): update dependency com.squareup.okhttp3:okhttp-bom to v5.3.0 --- gradle/libs.versions.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 3b6048c7ee..08ec71915c 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -141,7 +141,7 @@ accompanist_permission = { module = "com.google.accompanist:accompanist-permissi squareup_seismic = "com.squareup:seismic:1.0.3" # network -network_okhttp_bom = "com.squareup.okhttp3:okhttp-bom:5.2.1" +network_okhttp_bom = "com.squareup.okhttp3:okhttp-bom:5.3.0" network_okhttp_logging = { module = "com.squareup.okhttp3:logging-interceptor" } network_okhttp_okhttp = { module = "com.squareup.okhttp3:okhttp" } network_okhttp = { module = "com.squareup.okhttp3:okhttp" } From e70d7671837bc38123ab96868a960a959d44d599 Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Fri, 31 Oct 2025 12:04:57 +0100 Subject: [PATCH 14/46] Remove context(parentNode: Node) and provide the parent Node as a parameter. --- .../android/appnav/LoggedInFlowNode.kt | 10 ++++++- .../android/appnav/NotLoggedInFlowNode.kt | 1 + .../io/element/android/appnav/RootFlowNode.kt | 3 +++ .../android/appnav/room/RoomFlowNode.kt | 8 +++++- .../room/joined/JoinedRoomLoadedFlowNode.kt | 4 +++ .../appnav/JoinedRoomLoadedFlowNodeTest.kt | 6 ++--- .../impl/DefaultAnalyticsEntryPoint.kt | 3 +-- .../impl/DefaultAnalyticsEntryPointTest.kt | 4 +-- .../api/ChangeRoomMemberRolesEntryPoint.kt | 2 +- .../DefaultChangeRoomMemberRolesEntyPoint.kt | 2 +- ...faultChangeRoomMemberRolesEntyPointTest.kt | 13 +++++----- .../FakeChangeRoomMemberRolesEntryPoint.kt | 2 +- .../createroom/api/CreateRoomEntryPoint.kt | 7 +++-- .../impl/DefaultCreateRoomEntryPoint.kt | 7 +++-- .../impl/DefaultCreateRoomEntryPointTest.kt | 11 ++++---- .../api/FakeCreateRoomEntryPoint.kt | 2 +- .../DefaultAccountDeactivationEntryPoint.kt | 3 +-- ...efaultAccountDeactivationEntryPointTest.kt | 4 +-- .../test/FakeAccountDeactivationEntryPoint.kt | 6 +++-- .../features/forward/api/ForwardEntryPoint.kt | 8 ++++-- .../forward/impl/DefaultForwardEntryPoint.kt | 8 ++++-- .../forward/impl/ForwardMessagesNode.kt | 1 + .../impl/DefaultForwardEntryPointTest.kt | 13 +++++----- .../forward/test/FakeForwardEntryPoint.kt | 2 +- .../ftue/impl/DefaultFtueEntryPoint.kt | 3 +-- .../features/ftue/impl/FtueFlowNode.kt | 3 ++- .../FtueSessionVerificationFlowNode.kt | 3 +++ .../ftue/impl/DefaultFtueEntryPointTest.kt | 6 ++--- .../features/home/api/HomeEntryPoint.kt | 7 +++-- .../home/impl/DefaultHomeEntryPoint.kt | 7 +++-- .../features/home/impl/HomeFlowNode.kt | 17 ++++++++++-- .../home/impl/DefaultHomeEntryPointTest.kt | 17 ++++++------ .../DeclineInviteAndBlockEntryPoint.kt | 7 +++-- .../DefaultDeclineAndBlockEntryPoint.kt | 7 +++-- .../DefaultDeclineAndBlockEntryPointTest.kt | 11 ++++---- .../FakeDeclineInviteAndBlockEntryPoint.kt | 7 +++-- .../joinroom/api/JoinRoomEntryPoint.kt | 7 +++-- .../impl/DefaultJoinRoomEntryPoint.kt | 7 +++-- .../joinroom/impl/JoinRoomFlowNode.kt | 6 ++++- .../impl/DefaultJoinRoomEntryPointTest.kt | 8 +++--- .../DefaultKnockRequestsListEntryPoint.kt | 3 +-- .../DefaultKnockRequestsListEntryPointTest.kt | 4 +-- .../test/FakeKnockRequestsListEntryPoint.kt | 6 +++-- .../DefaultOpenSourcesLicensesEntryPoint.kt | 3 +-- ...efaultOpenSourcesLicensesEntryPointTest.kt | 4 +-- .../test/FakeOpenSourceLicensesEntryPoint.kt | 6 +++-- .../location/api/SendLocationEntryPoint.kt | 2 +- .../location/api/ShowLocationEntryPoint.kt | 12 ++++++--- .../send/DefaultSendLocationEntryPoint.kt | 2 +- .../show/DefaultShowLocationEntryPoint.kt | 7 +++-- .../send/DefaultSendLocationEntryPointTest.kt | 11 ++++---- .../show/DefaultShowLocationEntryPointTest.kt | 11 ++++---- .../test/FakeSendLocationEntryPoint.kt | 2 +- .../test/FakeShowLocationEntryPoint.kt | 2 +- .../lockscreen/api/LockScreenEntryPoint.kt | 8 ++++-- .../impl/DefaultLockScreenEntryPoint.kt | 2 +- .../impl/DefaultLockScreenEntryPointTest.kt | 26 +++++++++---------- .../test/FakeLockScreenEntryPoint.kt | 2 +- .../features/login/api/LoginEntryPoint.kt | 8 ++++-- .../login/impl/DefaultLoginEntryPoint.kt | 8 ++++-- .../login/impl/DefaultLoginEntryPointTest.kt | 13 +++++----- .../features/logout/api/LogoutEntryPoint.kt | 7 +++-- .../logout/impl/DefaultLogoutEntryPoint.kt | 7 +++-- .../impl/DefaultLogoutEntryPointTest.kt | 11 ++++---- .../logout/test/FakeLogoutEntryPoint.kt | 2 +- .../messages/api/MessagesEntryPoint.kt | 8 ++++-- .../impl/DefaultMessagesEntryPoint.kt | 8 ++++-- .../messages/impl/MessagesFlowNode.kt | 13 ++++++++-- .../impl/DefaultMessagesEntryPointTest.kt | 13 +++++----- .../messages/test/FakeMessagesEntryPoint.kt | 2 +- .../poll/api/create/CreatePollEntryPoint.kt | 7 +++-- .../create/DefaultCreatePollEntryPoint.kt | 7 +++-- .../history/DefaultPollHistoryEntryPoint.kt | 3 +-- .../poll/impl/history/PollHistoryFlowNode.kt | 1 + .../create/DefaultCreatePollEntryPointTest.kt | 11 ++++---- .../DefaultPollHistoryEntryPointTest.kt | 4 +-- .../test/create/FakeCreatePollEntryPoint.kt | 2 +- .../test/history/FakePollHistoryEntryPoint.kt | 2 +- .../preferences/api/PreferencesEntryPoint.kt | 8 ++++-- .../impl/DefaultPreferencesEntryPoint.kt | 2 +- .../preferences/impl/PreferencesFlowNode.kt | 8 ++++-- .../impl/DefaultPreferencesEntryPointTest.kt | 13 +++++----- .../api/bugreport/BugReportEntryPoint.kt | 7 +++-- .../impl/bugreport/BugReportFlowNode.kt | 1 + .../bugreport/DefaultBugReportEntryPoint.kt | 7 +++-- .../DefaultBugReportEntryPointTest.kt | 11 ++++---- .../reportroom/api/ReportRoomEntryPoint.kt | 7 +++-- .../impl/DefaultReportRoomEntryPoint.kt | 7 +++-- .../impl/DefaultReportRoomEntryPointTest.kt | 8 +++--- .../test/FakeReportRoomEntryPoint.kt | 7 +++-- .../api/RoomAliasResolverEntryPoint.kt | 8 ++++-- .../DefaultRoomAliasResolverEntryPoint.kt | 2 +- .../DefaultRoomAliasResolverEntryPointTest.kt | 13 +++++----- .../roomdetails/api/RoomDetailsEntryPoint.kt | 8 ++++-- .../impl/DefaultRoomDetailsEntryPoint.kt | 2 +- .../roomdetails/impl/RoomDetailsFlowNode.kt | 15 ++++++++--- .../RolesAndPermissionsFlowNode.kt | 2 ++ .../impl/DefaultRoomDetailsEntryPointTest.kt | 13 +++++----- .../api/RoomDirectoryEntryPoint.kt | 7 +++-- .../impl/DefaultRoomDirectoryEntryPoint.kt | 7 +++-- .../DefaultRoomDirectoryEntryPointTest.kt | 11 ++++---- .../api/SecureBackupEntryPoint.kt | 8 ++++-- .../impl/DefaultSecureBackupEntryPoint.kt | 2 +- .../impl/DefaultSecureBackupEntryPointTest.kt | 13 +++++----- .../features/share/api/ShareEntryPoint.kt | 8 ++++-- .../share/impl/DefaultShareEntryPoint.kt | 8 ++++-- .../android/features/share/impl/ShareNode.kt | 1 + .../share/impl/DefaultShareEntryPointTest.kt | 13 +++++----- .../signedout/api/SignedOutEntryPoint.kt | 7 +++-- .../impl/DefaultSignedOutEntryPoint.kt | 7 +++-- .../impl/DefaultSignedOutEntryPointTest.kt | 11 ++++---- .../features/space/api/SpaceEntryPoint.kt | 2 +- .../space/impl/DefaultSpaceEntryPoint.kt | 8 ++++-- .../space/impl/DefaultSpaceEntryPointTest.kt | 13 +++++----- .../startchat/api/StartChatEntryPoint.kt | 7 +++-- .../impl/DefaultStartChatEntryPoint.kt | 7 +++-- .../startchat/impl/StartChatFlowNode.kt | 1 + .../impl/DefaultStartChatEntryPointTest.kt | 11 ++++---- .../userprofile/api/UserProfileEntryPoint.kt | 8 ++++-- .../impl/DefaultUserProfileEntryPoint.kt | 2 +- .../userprofile/impl/UserProfileFlowNode.kt | 2 ++ .../impl/DefaultUserProfileEntryPointTest.kt | 13 +++++----- .../api/IncomingVerificationEntryPoint.kt | 8 ++++-- .../api/OutgoingVerificationEntryPoint.kt | 8 ++++-- .../DefaultIncomingVerificationEntryPoint.kt | 2 +- .../DefaultOutgoingVerificationEntryPoint.kt | 2 +- ...faultIncomingVerificationEntryPointTest.kt | 13 +++++----- ...faultOutgoingVerificationEntryPointTest.kt | 13 +++++----- .../FakeIncomingVerificationEntryPoint.kt | 2 +- .../FakeOutgoingVerificationEntryPoint.kt | 2 +- .../viewfolder/api/ViewFolderEntryPoint.kt | 8 ++++-- .../impl/DefaultViewFolderEntryPoint.kt | 8 ++++-- .../impl/DefaultViewFolderEntryPointTest.kt | 13 +++++----- .../test/FakeViewFolderEntryPoint.kt | 2 +- .../api/AccountSelectEntryPoint.kt | 7 +++-- .../impl/DefaultAccountSelectEntryPoint.kt | 7 +++-- .../DefaultAccountSelectEntryPointTest.kt | 11 ++++---- .../architecture/FeatureEntryPoint.kt | 3 +-- .../mediaviewer/api/MediaGalleryEntryPoint.kt | 7 +++-- .../mediaviewer/api/MediaViewerEntryPoint.kt | 8 ++++-- .../impl/DefaultMediaGalleryEntryPoint.kt | 7 +++-- .../impl/DefaultMediaViewerEntryPoint.kt | 2 +- .../impl/gallery/root/MediaGalleryFlowNode.kt | 1 + .../impl/DefaultMediaGalleryEntryPointTest.kt | 11 ++++---- .../impl/DefaultMediaViewerEntryPointTest.kt | 26 +++++++++---------- .../test/FakeMediaGalleryEntryPoint.kt | 2 +- .../test/FakeMediaViewerEntryPoint.kt | 2 +- .../roomselect/api/RoomSelectEntryPoint.kt | 8 ++++-- .../impl/DefaultRoomSelectEntryPoint.kt | 8 ++++-- .../impl/DefaultRoomSelectEntryPointTest.kt | 13 +++++----- .../test/FakeRoomSelectEntryPoint.kt | 2 +- .../api/NotificationTroubleShootEntryPoint.kt | 7 +++-- .../troubleshoot/api/PushHistoryEntryPoint.kt | 7 +++-- ...faultNotificationTroubleShootEntryPoint.kt | 7 +++-- .../history/DefaultPushHistoryEntryPoint.kt | 7 +++-- ...tNotificationTroubleShootEntryPointTest.kt | 11 ++++---- .../DefaultPushHistoryEntryPointTest.kt | 11 ++++---- .../FakeNotificationTroubleShootEntryPoint.kt | 2 +- .../test/FakePushHistoryEntryPoint.kt | 2 +- ...Template Module Feature Entry Point API.kt | 7 +++-- ...te Module Feature Entry Point Flow Impl.kt | 8 ++++-- 161 files changed, 668 insertions(+), 436 deletions(-) diff --git a/appnav/src/main/kotlin/io/element/android/appnav/LoggedInFlowNode.kt b/appnav/src/main/kotlin/io/element/android/appnav/LoggedInFlowNode.kt index 34815a55a1..ae61a03281 100644 --- a/appnav/src/main/kotlin/io/element/android/appnav/LoggedInFlowNode.kt +++ b/appnav/src/main/kotlin/io/element/android/appnav/LoggedInFlowNode.kt @@ -334,6 +334,7 @@ class LoggedInFlowNode( } } homeEntryPoint.createNode( + parentNode = this, buildContext = buildContext, callback = callback, ) @@ -390,6 +391,7 @@ class LoggedInFlowNode( } } userProfileEntryPoint.createNode( + parentNode = this, buildContext = buildContext, params = UserProfileEntryPoint.Params(userId = navTarget.userId), callback = callback, @@ -419,6 +421,7 @@ class LoggedInFlowNode( } val inputs = PreferencesEntryPoint.Params(navTarget.initialElement) preferencesEntryPoint.createNode( + parentNode = this, buildContext = buildContext, params = inputs, callback = callback, @@ -436,12 +439,14 @@ class LoggedInFlowNode( } 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 { @@ -452,10 +457,11 @@ class LoggedInFlowNode( ) } NavTarget.Ftue -> { - ftueEntryPoint.createNode(buildContext) + ftueEntryPoint.createNode(this, buildContext) } NavTarget.RoomDirectory -> { roomDirectoryEntryPoint.createNode( + parentNode = this, buildContext = buildContext, callback = object : RoomDirectoryEntryPoint.Callback { override fun navigateToRoom(roomDescription: RoomDescription) { @@ -472,6 +478,7 @@ class LoggedInFlowNode( } is NavTarget.IncomingShare -> { shareEntryPoint.createNode( + parentNode = this, buildContext = buildContext, params = ShareEntryPoint.Params(intent = navTarget.intent), callback = object : ShareEntryPoint.Callback { @@ -486,6 +493,7 @@ class LoggedInFlowNode( } is NavTarget.IncomingVerificationRequest -> { incomingVerificationEntryPoint.createNode( + parentNode = this, buildContext = buildContext, params = IncomingVerificationEntryPoint.Params(navTarget.data), callback = object : IncomingVerificationEntryPoint.Callback { diff --git a/appnav/src/main/kotlin/io/element/android/appnav/NotLoggedInFlowNode.kt b/appnav/src/main/kotlin/io/element/android/appnav/NotLoggedInFlowNode.kt index 4ca9a2db17..b372155bd3 100644 --- a/appnav/src/main/kotlin/io/element/android/appnav/NotLoggedInFlowNode.kt +++ b/appnav/src/main/kotlin/io/element/android/appnav/NotLoggedInFlowNode.kt @@ -84,6 +84,7 @@ class NotLoggedInFlowNode( } } loginEntryPoint.createNode( + parentNode = this, buildContext = buildContext, params = LoginEntryPoint.Params( accountProvider = inputs.loginParams?.accountProvider, diff --git a/appnav/src/main/kotlin/io/element/android/appnav/RootFlowNode.kt b/appnav/src/main/kotlin/io/element/android/appnav/RootFlowNode.kt index e1322d0bbe..bdad3c2ab0 100644 --- a/appnav/src/main/kotlin/io/element/android/appnav/RootFlowNode.kt +++ b/appnav/src/main/kotlin/io/element/android/appnav/RootFlowNode.kt @@ -250,6 +250,7 @@ class RootFlowNode( } is NavTarget.SignedOutFlow -> { signedOutEntryPoint.createNode( + parentNode = this, buildContext = buildContext, params = SignedOutEntryPoint.Params( sessionId = navTarget.sessionId, @@ -264,6 +265,7 @@ class RootFlowNode( } } bugReportEntryPoint.createNode( + parentNode = this, buildContext = buildContext, callback = callback, ) @@ -292,6 +294,7 @@ class RootFlowNode( } } accountSelectEntryPoint.createNode( + parentNode = this, buildContext = buildContext, callback = callback, ) diff --git a/appnav/src/main/kotlin/io/element/android/appnav/room/RoomFlowNode.kt b/appnav/src/main/kotlin/io/element/android/appnav/room/RoomFlowNode.kt index 602979edca..a41eb8d777 100644 --- a/appnav/src/main/kotlin/io/element/android/appnav/room/RoomFlowNode.kt +++ b/appnav/src/main/kotlin/io/element/android/appnav/room/RoomFlowNode.kt @@ -181,6 +181,7 @@ class RoomFlowNode( } val params = Params(navTarget.roomAlias) roomAliasResolverEntryPoint.createNode( + parentNode = this, buildContext = buildContext, params = params, callback = callback, @@ -194,7 +195,11 @@ class RoomFlowNode( serverNames = navTarget.serverNames, trigger = navTarget.trigger, ) - joinRoomEntryPoint.createNode(buildContext, inputs) + joinRoomEntryPoint.createNode( + parentNode = this, + buildContext = buildContext, + inputs = inputs, + ) } is NavTarget.JoinedRoom -> { val roomFlowNodeCallback = plugins() @@ -207,6 +212,7 @@ class RoomFlowNode( is NavTarget.JoinedSpace -> { val spaceCallback = plugins().single() spaceEntryPoint.createNode( + parentNode = this, buildContext = buildContext, inputs = SpaceEntryPoint.Inputs(roomId = navTarget.spaceId), callback = spaceCallback, 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 index af0ed4c919..16eaff89b1 100644 --- 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 @@ -141,6 +141,7 @@ class JoinedRoomLoadedFlowNode( } } return roomDetailsEntryPoint.createNode( + parentNode = this, buildContext = buildContext, params = RoomDetailsEntryPoint.Params(initialTarget), callback = callback, @@ -179,6 +180,7 @@ class JoinedRoomLoadedFlowNode( } } forwardEntryPoint.createNode( + parentNode = this, buildContext = buildContext, params = params, callback = callback, @@ -202,6 +204,7 @@ class JoinedRoomLoadedFlowNode( } } return spaceEntryPoint.createNode( + parentNode = this, buildContext = buildContext, inputs = SpaceEntryPoint.Inputs(roomId = inputs.room.roomId), callback = callback, @@ -237,6 +240,7 @@ class JoinedRoomLoadedFlowNode( MessagesEntryPoint.InitialTarget.Messages(navTarget.focusedEventId) ) return messagesEntryPoint.createNode( + parentNode = this, buildContext = buildContext, params = params, callback = callback, diff --git a/appnav/src/test/kotlin/io/element/android/appnav/JoinedRoomLoadedFlowNodeTest.kt b/appnav/src/test/kotlin/io/element/android/appnav/JoinedRoomLoadedFlowNodeTest.kt index 0474be0eb7..e560593399 100644 --- a/appnav/src/test/kotlin/io/element/android/appnav/JoinedRoomLoadedFlowNodeTest.kt +++ b/appnav/src/test/kotlin/io/element/android/appnav/JoinedRoomLoadedFlowNodeTest.kt @@ -55,8 +55,8 @@ class JoinedRoomLoadedFlowNodeTest { var parameters: MessagesEntryPoint.Params? = null var callback: MessagesEntryPoint.Callback? = null - context(parentNode: Node) override fun createNode( + parentNode: Node, buildContext: BuildContext, params: MessagesEntryPoint.Params, callback: MessagesEntryPoint.Callback, @@ -78,8 +78,8 @@ class JoinedRoomLoadedFlowNodeTest { private class FakeRoomDetailsEntryPoint : RoomDetailsEntryPoint { var nodeId: String? = null - context(parentNode: Node) override fun createNode( + parentNode: Node, buildContext: BuildContext, params: RoomDetailsEntryPoint.Params, callback: RoomDetailsEntryPoint.Callback, @@ -91,8 +91,8 @@ class JoinedRoomLoadedFlowNodeTest { private class FakeSpaceEntryPoint : SpaceEntryPoint { var nodeId: String? = null - context(parentNode: Node) override fun createNode( + parentNode: Node, buildContext: BuildContext, inputs: SpaceEntryPoint.Inputs, callback: SpaceEntryPoint.Callback, diff --git a/features/analytics/impl/src/main/kotlin/io/element/android/features/analytics/impl/DefaultAnalyticsEntryPoint.kt b/features/analytics/impl/src/main/kotlin/io/element/android/features/analytics/impl/DefaultAnalyticsEntryPoint.kt index 09dd1d0181..af59c94e0a 100644 --- a/features/analytics/impl/src/main/kotlin/io/element/android/features/analytics/impl/DefaultAnalyticsEntryPoint.kt +++ b/features/analytics/impl/src/main/kotlin/io/element/android/features/analytics/impl/DefaultAnalyticsEntryPoint.kt @@ -16,8 +16,7 @@ import io.element.android.libraries.architecture.createNode @ContributesBinding(AppScope::class) class DefaultAnalyticsEntryPoint : AnalyticsEntryPoint { - context(parentNode: Node) - override fun createNode(buildContext: BuildContext): Node { + override fun createNode(parentNode: Node, buildContext: BuildContext): Node { return parentNode.createNode(buildContext) } } diff --git a/features/analytics/impl/src/test/kotlin/io/element/android/features/analytics/impl/DefaultAnalyticsEntryPointTest.kt b/features/analytics/impl/src/test/kotlin/io/element/android/features/analytics/impl/DefaultAnalyticsEntryPointTest.kt index e87473a447..b5ec819632 100644 --- a/features/analytics/impl/src/test/kotlin/io/element/android/features/analytics/impl/DefaultAnalyticsEntryPointTest.kt +++ b/features/analytics/impl/src/test/kotlin/io/element/android/features/analytics/impl/DefaultAnalyticsEntryPointTest.kt @@ -33,9 +33,7 @@ class DefaultAnalyticsEntryPointTest { ) ) } - val result = with(parentNode) { - entryPoint.createNode(BuildContext.root(null)) - } + val result = entryPoint.createNode(parentNode, BuildContext.root(null)) assertThat(result).isInstanceOf(AnalyticsOptInNode::class.java) } } diff --git a/features/changeroommemberroles/api/src/main/kotlin/io/element/android/features/changeroommemberroles/api/ChangeRoomMemberRolesEntryPoint.kt b/features/changeroommemberroles/api/src/main/kotlin/io/element/android/features/changeroommemberroles/api/ChangeRoomMemberRolesEntryPoint.kt index 2b41a0ae76..7905cdc0ae 100644 --- a/features/changeroommemberroles/api/src/main/kotlin/io/element/android/features/changeroommemberroles/api/ChangeRoomMemberRolesEntryPoint.kt +++ b/features/changeroommemberroles/api/src/main/kotlin/io/element/android/features/changeroommemberroles/api/ChangeRoomMemberRolesEntryPoint.kt @@ -15,8 +15,8 @@ import io.element.android.libraries.matrix.api.core.RoomId import io.element.android.libraries.matrix.api.room.JoinedRoom fun interface ChangeRoomMemberRolesEntryPoint : FeatureEntryPoint { - context(parentNode: Node) fun createNode( + parentNode: Node, buildContext: BuildContext, room: JoinedRoom, listType: ChangeRoomMemberRolesListType, diff --git a/features/changeroommemberroles/impl/src/main/kotlin/io/element/android/features/changeroommemberroles/impl/DefaultChangeRoomMemberRolesEntyPoint.kt b/features/changeroommemberroles/impl/src/main/kotlin/io/element/android/features/changeroommemberroles/impl/DefaultChangeRoomMemberRolesEntyPoint.kt index b5aab56ce5..e76333cda7 100644 --- a/features/changeroommemberroles/impl/src/main/kotlin/io/element/android/features/changeroommemberroles/impl/DefaultChangeRoomMemberRolesEntyPoint.kt +++ b/features/changeroommemberroles/impl/src/main/kotlin/io/element/android/features/changeroommemberroles/impl/DefaultChangeRoomMemberRolesEntyPoint.kt @@ -18,8 +18,8 @@ import io.element.android.libraries.matrix.api.room.JoinedRoom @ContributesBinding(SessionScope::class) class DefaultChangeRoomMemberRolesEntyPoint : ChangeRoomMemberRolesEntryPoint { - context(parentNode: Node) override fun createNode( + parentNode: Node, buildContext: BuildContext, room: JoinedRoom, listType: ChangeRoomMemberRolesListType, diff --git a/features/changeroommemberroles/impl/src/test/kotlin/io/element/android/features/changeroommemberroles/impl/DefaultChangeRoomMemberRolesEntyPointTest.kt b/features/changeroommemberroles/impl/src/test/kotlin/io/element/android/features/changeroommemberroles/impl/DefaultChangeRoomMemberRolesEntyPointTest.kt index efc91b45aa..84e53c0cb6 100644 --- a/features/changeroommemberroles/impl/src/test/kotlin/io/element/android/features/changeroommemberroles/impl/DefaultChangeRoomMemberRolesEntyPointTest.kt +++ b/features/changeroommemberroles/impl/src/test/kotlin/io/element/android/features/changeroommemberroles/impl/DefaultChangeRoomMemberRolesEntyPointTest.kt @@ -31,13 +31,12 @@ class DefaultChangeRoomMemberRolesEntyPointTest { } val room = FakeJoinedRoom() val listType = ChangeRoomMemberRolesListType.Admins - val result = with(parentNode) { - entryPoint.createNode( - buildContext = BuildContext.root(null), - room = FakeJoinedRoom(), - listType = listType, - ) - } + val result = entryPoint.createNode( + parentNode = parentNode, + buildContext = BuildContext.root(null), + room = FakeJoinedRoom(), + listType = listType, + ) assertThat(result).isInstanceOf(ChangeRoomMemberRolesRootNode::class.java) // Search for the Inputs plugin val input = result.plugins.filterIsInstance().single() diff --git a/features/changeroommemberroles/test/src/main/kotlin/io/element/android/features/changeroommemberroles/test/FakeChangeRoomMemberRolesEntryPoint.kt b/features/changeroommemberroles/test/src/main/kotlin/io/element/android/features/changeroommemberroles/test/FakeChangeRoomMemberRolesEntryPoint.kt index 9508447f25..16b404ab5e 100644 --- a/features/changeroommemberroles/test/src/main/kotlin/io/element/android/features/changeroommemberroles/test/FakeChangeRoomMemberRolesEntryPoint.kt +++ b/features/changeroommemberroles/test/src/main/kotlin/io/element/android/features/changeroommemberroles/test/FakeChangeRoomMemberRolesEntryPoint.kt @@ -15,8 +15,8 @@ import io.element.android.libraries.matrix.api.room.JoinedRoom import io.element.android.tests.testutils.lambda.lambdaError class FakeChangeRoomMemberRolesEntryPoint : ChangeRoomMemberRolesEntryPoint { - context(parentNode: Node) override fun createNode( + parentNode: Node, buildContext: BuildContext, room: JoinedRoom, listType: ChangeRoomMemberRolesListType, diff --git a/features/createroom/api/src/main/kotlin/io/element/android/features/createroom/api/CreateRoomEntryPoint.kt b/features/createroom/api/src/main/kotlin/io/element/android/features/createroom/api/CreateRoomEntryPoint.kt index 1a5a1bef5c..c9763f183d 100644 --- a/features/createroom/api/src/main/kotlin/io/element/android/features/createroom/api/CreateRoomEntryPoint.kt +++ b/features/createroom/api/src/main/kotlin/io/element/android/features/createroom/api/CreateRoomEntryPoint.kt @@ -14,8 +14,11 @@ import io.element.android.libraries.architecture.FeatureEntryPoint import io.element.android.libraries.matrix.api.core.RoomId interface CreateRoomEntryPoint : FeatureEntryPoint { - context(parentNode: Node) - fun createNode(buildContext: BuildContext, callback: Callback): Node + fun createNode( + parentNode: Node, + buildContext: BuildContext, + callback: Callback, + ): Node interface Callback : Plugin { fun onRoomCreated(roomId: RoomId) diff --git a/features/createroom/impl/src/main/kotlin/io/element/android/features/createroom/impl/DefaultCreateRoomEntryPoint.kt b/features/createroom/impl/src/main/kotlin/io/element/android/features/createroom/impl/DefaultCreateRoomEntryPoint.kt index ab00e6402f..35b05a548d 100644 --- a/features/createroom/impl/src/main/kotlin/io/element/android/features/createroom/impl/DefaultCreateRoomEntryPoint.kt +++ b/features/createroom/impl/src/main/kotlin/io/element/android/features/createroom/impl/DefaultCreateRoomEntryPoint.kt @@ -16,8 +16,11 @@ import io.element.android.libraries.di.SessionScope @ContributesBinding(SessionScope::class) class DefaultCreateRoomEntryPoint : CreateRoomEntryPoint { - context(parentNode: Node) - override fun createNode(buildContext: BuildContext, callback: CreateRoomEntryPoint.Callback): Node { + override fun createNode( + parentNode: Node, + buildContext: BuildContext, + callback: CreateRoomEntryPoint.Callback, + ): Node { return parentNode.createNode(buildContext, listOf(callback)) } } diff --git a/features/createroom/impl/src/test/kotlin/io/element/android/features/createroom/impl/DefaultCreateRoomEntryPointTest.kt b/features/createroom/impl/src/test/kotlin/io/element/android/features/createroom/impl/DefaultCreateRoomEntryPointTest.kt index 5d415c5d44..4690b5b7f3 100644 --- a/features/createroom/impl/src/test/kotlin/io/element/android/features/createroom/impl/DefaultCreateRoomEntryPointTest.kt +++ b/features/createroom/impl/src/test/kotlin/io/element/android/features/createroom/impl/DefaultCreateRoomEntryPointTest.kt @@ -38,12 +38,11 @@ class DefaultCreateRoomEntryPointTest { val callback = object : CreateRoomEntryPoint.Callback { override fun onRoomCreated(roomId: RoomId) = lambdaError() } - val result = with(parentNode) { - entryPoint.createNode( - buildContext = BuildContext.root(null), - callback = callback, - ) - } + val result = entryPoint.createNode( + parentNode = parentNode, + buildContext = BuildContext.root(null), + callback = callback, + ) assertThat(result.plugins).contains(callback) } } diff --git a/features/createroom/test/src/main/kotlin/io/element/android/features/createroom/api/FakeCreateRoomEntryPoint.kt b/features/createroom/test/src/main/kotlin/io/element/android/features/createroom/api/FakeCreateRoomEntryPoint.kt index 929d22b3de..1f5a217537 100644 --- a/features/createroom/test/src/main/kotlin/io/element/android/features/createroom/api/FakeCreateRoomEntryPoint.kt +++ b/features/createroom/test/src/main/kotlin/io/element/android/features/createroom/api/FakeCreateRoomEntryPoint.kt @@ -12,8 +12,8 @@ import com.bumble.appyx.core.node.Node import io.element.android.tests.testutils.lambda.lambdaError class FakeCreateRoomEntryPoint : CreateRoomEntryPoint { - context(parentNode: Node) override fun createNode( + parentNode: Node, buildContext: BuildContext, callback: CreateRoomEntryPoint.Callback, ): Node = lambdaError() diff --git a/features/deactivation/impl/src/main/kotlin/io/element/android/features/logout/impl/DefaultAccountDeactivationEntryPoint.kt b/features/deactivation/impl/src/main/kotlin/io/element/android/features/logout/impl/DefaultAccountDeactivationEntryPoint.kt index 788cc393ed..a7c0d50dbe 100644 --- a/features/deactivation/impl/src/main/kotlin/io/element/android/features/logout/impl/DefaultAccountDeactivationEntryPoint.kt +++ b/features/deactivation/impl/src/main/kotlin/io/element/android/features/logout/impl/DefaultAccountDeactivationEntryPoint.kt @@ -16,8 +16,7 @@ import io.element.android.libraries.architecture.createNode @ContributesBinding(AppScope::class) class DefaultAccountDeactivationEntryPoint : AccountDeactivationEntryPoint { - context(parentNode: Node) - override fun createNode(buildContext: BuildContext): Node { + override fun createNode(parentNode: Node, buildContext: BuildContext): Node { return parentNode.createNode(buildContext) } } diff --git a/features/deactivation/impl/src/test/kotlin/io/element/android/features/logout/impl/DefaultAccountDeactivationEntryPointTest.kt b/features/deactivation/impl/src/test/kotlin/io/element/android/features/logout/impl/DefaultAccountDeactivationEntryPointTest.kt index 1e8dfe36cc..05ad52efe9 100644 --- a/features/deactivation/impl/src/test/kotlin/io/element/android/features/logout/impl/DefaultAccountDeactivationEntryPointTest.kt +++ b/features/deactivation/impl/src/test/kotlin/io/element/android/features/logout/impl/DefaultAccountDeactivationEntryPointTest.kt @@ -28,9 +28,7 @@ class DefaultAccountDeactivationEntryPointTest { presenter = createPresenter(), ) } - val result = with(parentNode) { - entryPoint.createNode(BuildContext.root(null)) - } + val result = entryPoint.createNode(parentNode, BuildContext.root(null)) assertThat(result).isInstanceOf(AccountDeactivationNode::class.java) } } diff --git a/features/deactivation/test/src/main/kotlin/io/element/android/features/deactivation/test/FakeAccountDeactivationEntryPoint.kt b/features/deactivation/test/src/main/kotlin/io/element/android/features/deactivation/test/FakeAccountDeactivationEntryPoint.kt index 8c898dfb6b..769f07f1a4 100644 --- a/features/deactivation/test/src/main/kotlin/io/element/android/features/deactivation/test/FakeAccountDeactivationEntryPoint.kt +++ b/features/deactivation/test/src/main/kotlin/io/element/android/features/deactivation/test/FakeAccountDeactivationEntryPoint.kt @@ -13,8 +13,10 @@ import io.element.android.features.deactivation.api.AccountDeactivationEntryPoin import io.element.android.tests.testutils.lambda.lambdaError class FakeAccountDeactivationEntryPoint : AccountDeactivationEntryPoint { - context(parentNode: Node) - override fun createNode(buildContext: BuildContext): Node { + override fun createNode( + parentNode: Node, + buildContext: BuildContext, + ): Node { lambdaError() } } diff --git a/features/forward/api/src/main/kotlin/io/element/android/features/forward/api/ForwardEntryPoint.kt b/features/forward/api/src/main/kotlin/io/element/android/features/forward/api/ForwardEntryPoint.kt index 1de948dea3..960c5362c2 100644 --- a/features/forward/api/src/main/kotlin/io/element/android/features/forward/api/ForwardEntryPoint.kt +++ b/features/forward/api/src/main/kotlin/io/element/android/features/forward/api/ForwardEntryPoint.kt @@ -26,6 +26,10 @@ interface ForwardEntryPoint : FeatureEntryPoint { val timelineProvider: TimelineProvider, ) : NodeInputs - context(parentNode: Node) - fun createNode(buildContext: BuildContext, params: Params, callback: Callback): Node + fun createNode( + parentNode: Node, + buildContext: BuildContext, + params: Params, + callback: Callback, + ): Node } diff --git a/features/forward/impl/src/main/kotlin/io/element/android/features/forward/impl/DefaultForwardEntryPoint.kt b/features/forward/impl/src/main/kotlin/io/element/android/features/forward/impl/DefaultForwardEntryPoint.kt index 7cf20c017f..ab472fefbc 100644 --- a/features/forward/impl/src/main/kotlin/io/element/android/features/forward/impl/DefaultForwardEntryPoint.kt +++ b/features/forward/impl/src/main/kotlin/io/element/android/features/forward/impl/DefaultForwardEntryPoint.kt @@ -16,8 +16,12 @@ import io.element.android.libraries.di.SessionScope @ContributesBinding(SessionScope::class) class DefaultForwardEntryPoint : ForwardEntryPoint { - context(parentNode: Node) - override fun createNode(buildContext: BuildContext, params: ForwardEntryPoint.Params, callback: ForwardEntryPoint.Callback): Node { + override fun createNode( + parentNode: Node, + buildContext: BuildContext, + params: ForwardEntryPoint.Params, + callback: ForwardEntryPoint.Callback, + ): Node { return parentNode.createNode( buildContext = buildContext, plugins = listOf( diff --git a/features/forward/impl/src/main/kotlin/io/element/android/features/forward/impl/ForwardMessagesNode.kt b/features/forward/impl/src/main/kotlin/io/element/android/features/forward/impl/ForwardMessagesNode.kt index f033e97694..a38f71264b 100644 --- a/features/forward/impl/src/main/kotlin/io/element/android/features/forward/impl/ForwardMessagesNode.kt +++ b/features/forward/impl/src/main/kotlin/io/element/android/features/forward/impl/ForwardMessagesNode.kt @@ -71,6 +71,7 @@ class ForwardMessagesNode( } return roomSelectEntryPoint.createNode( + parentNode = this, buildContext = buildContext, params = RoomSelectEntryPoint.Params(mode = RoomSelectMode.Forward), callback = callback, diff --git a/features/forward/impl/src/test/kotlin/io/element/android/features/forward/impl/DefaultForwardEntryPointTest.kt b/features/forward/impl/src/test/kotlin/io/element/android/features/forward/impl/DefaultForwardEntryPointTest.kt index f344d58063..28c5f668e6 100644 --- a/features/forward/impl/src/test/kotlin/io/element/android/features/forward/impl/DefaultForwardEntryPointTest.kt +++ b/features/forward/impl/src/test/kotlin/io/element/android/features/forward/impl/DefaultForwardEntryPointTest.kt @@ -47,13 +47,12 @@ class DefaultForwardEntryPointTest { eventId = AN_EVENT_ID, timelineProvider = FakeTimelineProvider(), ) - val result = with(parentNode) { - entryPoint.createNode( - buildContext = BuildContext.root(null), - params = params, - callback = callback, - ) - } + val result = entryPoint.createNode( + parentNode = parentNode, + buildContext = BuildContext.root(null), + params = params, + callback = callback, + ) assertThat(result).isInstanceOf(ForwardMessagesNode::class.java) assertThat(result.plugins).contains( ForwardMessagesNode.Inputs( diff --git a/features/forward/test/src/main/kotlin/io/element/android/features/forward/test/FakeForwardEntryPoint.kt b/features/forward/test/src/main/kotlin/io/element/android/features/forward/test/FakeForwardEntryPoint.kt index d42ea203a0..4882461ad0 100644 --- a/features/forward/test/src/main/kotlin/io/element/android/features/forward/test/FakeForwardEntryPoint.kt +++ b/features/forward/test/src/main/kotlin/io/element/android/features/forward/test/FakeForwardEntryPoint.kt @@ -13,8 +13,8 @@ import io.element.android.features.forward.api.ForwardEntryPoint import io.element.android.tests.testutils.lambda.lambdaError class FakeForwardEntryPoint : ForwardEntryPoint { - context(parentNode: Node) override fun createNode( + parentNode: Node, buildContext: BuildContext, params: ForwardEntryPoint.Params, callback: ForwardEntryPoint.Callback, diff --git a/features/ftue/impl/src/main/kotlin/io/element/android/features/ftue/impl/DefaultFtueEntryPoint.kt b/features/ftue/impl/src/main/kotlin/io/element/android/features/ftue/impl/DefaultFtueEntryPoint.kt index 184e3bb802..c480d329a8 100644 --- a/features/ftue/impl/src/main/kotlin/io/element/android/features/ftue/impl/DefaultFtueEntryPoint.kt +++ b/features/ftue/impl/src/main/kotlin/io/element/android/features/ftue/impl/DefaultFtueEntryPoint.kt @@ -16,8 +16,7 @@ import io.element.android.libraries.architecture.createNode @ContributesBinding(AppScope::class) class DefaultFtueEntryPoint : FtueEntryPoint { - context(parentNode: Node) - override fun createNode(buildContext: BuildContext): Node { + override fun createNode(parentNode: Node, buildContext: BuildContext): Node { return parentNode.createNode(buildContext) } } diff --git a/features/ftue/impl/src/main/kotlin/io/element/android/features/ftue/impl/FtueFlowNode.kt b/features/ftue/impl/src/main/kotlin/io/element/android/features/ftue/impl/FtueFlowNode.kt index 779e16f310..7c045f0150 100644 --- a/features/ftue/impl/src/main/kotlin/io/element/android/features/ftue/impl/FtueFlowNode.kt +++ b/features/ftue/impl/src/main/kotlin/io/element/android/features/ftue/impl/FtueFlowNode.kt @@ -102,7 +102,7 @@ class FtueFlowNode( createNode(buildContext, listOf(callback)) } NavTarget.AnalyticsOptIn -> { - analyticsEntryPoint.createNode(buildContext) + analyticsEntryPoint.createNode(this, buildContext) } NavTarget.LockScreenSetup -> { val callback = object : LockScreenEntryPoint.Callback { @@ -111,6 +111,7 @@ class FtueFlowNode( } } lockScreenEntryPoint.createNode( + parentNode = this, buildContext = buildContext, navTarget = LockScreenEntryPoint.Target.Setup, callback = callback, diff --git a/features/ftue/impl/src/main/kotlin/io/element/android/features/ftue/impl/sessionverification/FtueSessionVerificationFlowNode.kt b/features/ftue/impl/src/main/kotlin/io/element/android/features/ftue/impl/sessionverification/FtueSessionVerificationFlowNode.kt index 974c66d243..13da4a0748 100644 --- a/features/ftue/impl/src/main/kotlin/io/element/android/features/ftue/impl/sessionverification/FtueSessionVerificationFlowNode.kt +++ b/features/ftue/impl/src/main/kotlin/io/element/android/features/ftue/impl/sessionverification/FtueSessionVerificationFlowNode.kt @@ -104,6 +104,7 @@ class FtueSessionVerificationFlowNode( } is NavTarget.UseAnotherDevice -> { outgoingVerificationEntryPoint.createNode( + parentNode = this, buildContext = buildContext, params = OutgoingVerificationEntryPoint.Params( showDeviceVerifiedScreen = true, @@ -127,6 +128,7 @@ class FtueSessionVerificationFlowNode( } is NavTarget.EnterRecoveryKey -> { secureBackupEntryPoint.createNode( + parentNode = this, buildContext = buildContext, params = SecureBackupEntryPoint.Params(SecureBackupEntryPoint.InitialTarget.EnterRecoveryKey), callback = secureBackupEntryPointCallback @@ -134,6 +136,7 @@ class FtueSessionVerificationFlowNode( } is NavTarget.ResetIdentity -> { secureBackupEntryPoint.createNode( + parentNode = this, buildContext = buildContext, params = SecureBackupEntryPoint.Params(SecureBackupEntryPoint.InitialTarget.ResetIdentity), callback = object : SecureBackupEntryPoint.Callback { diff --git a/features/ftue/impl/src/test/kotlin/io/element/android/features/ftue/impl/DefaultFtueEntryPointTest.kt b/features/ftue/impl/src/test/kotlin/io/element/android/features/ftue/impl/DefaultFtueEntryPointTest.kt index efd787b1c4..b7036ee69b 100644 --- a/features/ftue/impl/src/test/kotlin/io/element/android/features/ftue/impl/DefaultFtueEntryPointTest.kt +++ b/features/ftue/impl/src/test/kotlin/io/element/android/features/ftue/impl/DefaultFtueEntryPointTest.kt @@ -32,14 +32,12 @@ class DefaultFtueEntryPointTest { FtueFlowNode( buildContext = buildContext, plugins = plugins, - analyticsEntryPoint = { _ -> lambdaError() }, + analyticsEntryPoint = { _, _ -> lambdaError() }, defaultFtueService = createDefaultFtueService(), lockScreenEntryPoint = FakeLockScreenEntryPoint(), ) } - val result = with(parentNode) { - entryPoint.createNode(BuildContext.root(null)) - } + val result = entryPoint.createNode(parentNode, BuildContext.root(null)) assertThat(result).isInstanceOf(FtueFlowNode::class.java) } } diff --git a/features/home/api/src/main/kotlin/io/element/android/features/home/api/HomeEntryPoint.kt b/features/home/api/src/main/kotlin/io/element/android/features/home/api/HomeEntryPoint.kt index 101f631cd9..91196dc2ad 100644 --- a/features/home/api/src/main/kotlin/io/element/android/features/home/api/HomeEntryPoint.kt +++ b/features/home/api/src/main/kotlin/io/element/android/features/home/api/HomeEntryPoint.kt @@ -14,8 +14,11 @@ import io.element.android.libraries.architecture.FeatureEntryPoint import io.element.android.libraries.matrix.api.core.RoomId interface HomeEntryPoint : FeatureEntryPoint { - context(parentNode: Node) - fun createNode(buildContext: BuildContext, callback: Callback): Node + fun createNode( + parentNode: Node, + buildContext: BuildContext, + callback: Callback, + ): Node interface Callback : Plugin { fun navigateToRoom(roomId: RoomId) diff --git a/features/home/impl/src/main/kotlin/io/element/android/features/home/impl/DefaultHomeEntryPoint.kt b/features/home/impl/src/main/kotlin/io/element/android/features/home/impl/DefaultHomeEntryPoint.kt index 34c9b5f0d9..73b928ce02 100644 --- a/features/home/impl/src/main/kotlin/io/element/android/features/home/impl/DefaultHomeEntryPoint.kt +++ b/features/home/impl/src/main/kotlin/io/element/android/features/home/impl/DefaultHomeEntryPoint.kt @@ -16,8 +16,11 @@ import io.element.android.libraries.architecture.createNode @ContributesBinding(AppScope::class) class DefaultHomeEntryPoint : HomeEntryPoint { - context(parentNode: Node) - override fun createNode(buildContext: BuildContext, callback: HomeEntryPoint.Callback): Node { + override fun createNode( + parentNode: Node, + buildContext: BuildContext, + callback: HomeEntryPoint.Callback, + ): Node { return parentNode.createNode(buildContext, listOf(callback)) } } diff --git a/features/home/impl/src/main/kotlin/io/element/android/features/home/impl/HomeFlowNode.kt b/features/home/impl/src/main/kotlin/io/element/android/features/home/impl/HomeFlowNode.kt index b0848d85af..5380c51295 100644 --- a/features/home/impl/src/main/kotlin/io/element/android/features/home/impl/HomeFlowNode.kt +++ b/features/home/impl/src/main/kotlin/io/element/android/features/home/impl/HomeFlowNode.kt @@ -186,11 +186,24 @@ class HomeFlowNode( override fun resolve(navTarget: NavTarget, buildContext: BuildContext): Node { return when (navTarget) { - is NavTarget.ReportRoom -> reportRoomEntryPoint.createNode(buildContext, navTarget.roomId) - is NavTarget.DeclineInviteAndBlockUser -> declineInviteAndBlockUserEntryPoint.createNode(buildContext, navTarget.inviteData) + is NavTarget.ReportRoom -> { + reportRoomEntryPoint.createNode( + parentNode = this, + buildContext = buildContext, + roomId = navTarget.roomId, + ) + } + is NavTarget.DeclineInviteAndBlockUser -> { + declineInviteAndBlockUserEntryPoint.createNode( + parentNode = this, + buildContext = buildContext, + inviteData = navTarget.inviteData, + ) + } is NavTarget.SelectNewOwnersWhenLeavingRoom -> { val room = runBlocking { matrixClient.getJoinedRoom(navTarget.roomId) } ?: error("Room ${navTarget.roomId} not found") changeRoomMemberRolesEntryPoint.createNode( + parentNode = this, buildContext = buildContext, room = room, listType = ChangeRoomMemberRolesListType.SelectNewOwnersWhenLeaving, diff --git a/features/home/impl/src/test/kotlin/io/element/android/features/home/impl/DefaultHomeEntryPointTest.kt b/features/home/impl/src/test/kotlin/io/element/android/features/home/impl/DefaultHomeEntryPointTest.kt index 47574cd639..489234a827 100644 --- a/features/home/impl/src/test/kotlin/io/element/android/features/home/impl/DefaultHomeEntryPointTest.kt +++ b/features/home/impl/src/test/kotlin/io/element/android/features/home/impl/DefaultHomeEntryPointTest.kt @@ -34,9 +34,9 @@ class DefaultHomeEntryPointTest { analyticsService = FakeAnalyticsService(), acceptDeclineInviteView = { _, _, _, _ -> lambdaError() }, directLogoutView = { _ -> lambdaError() }, - reportRoomEntryPoint = { _, _ -> lambdaError() }, - declineInviteAndBlockUserEntryPoint = { _, _ -> lambdaError() }, - changeRoomMemberRolesEntryPoint = { _, _, _ -> lambdaError() }, + reportRoomEntryPoint = { _, _, _ -> lambdaError() }, + declineInviteAndBlockUserEntryPoint = { _, _, _ -> lambdaError() }, + changeRoomMemberRolesEntryPoint = { _, _, _, _ -> lambdaError() }, leaveRoomRenderer = { _, _, _ -> lambdaError() }, ) } @@ -49,12 +49,11 @@ class DefaultHomeEntryPointTest { override fun navigateToRoomSettings(roomId: RoomId) = lambdaError() override fun navigateToBugReport() = lambdaError() } - val result = with(parentNode) { - entryPoint.createNode( - buildContext = BuildContext.root(null), - callback = callback, - ) - } + val result = entryPoint.createNode( + parentNode = parentNode, + buildContext = BuildContext.root(null), + callback = callback, + ) assertThat(result).isInstanceOf(HomeFlowNode::class.java) assertThat(result.plugins).contains(callback) } diff --git a/features/invite/api/src/main/kotlin/io/element/android/features/invite/api/declineandblock/DeclineInviteAndBlockEntryPoint.kt b/features/invite/api/src/main/kotlin/io/element/android/features/invite/api/declineandblock/DeclineInviteAndBlockEntryPoint.kt index 44b88f627b..1bd4b0031b 100644 --- a/features/invite/api/src/main/kotlin/io/element/android/features/invite/api/declineandblock/DeclineInviteAndBlockEntryPoint.kt +++ b/features/invite/api/src/main/kotlin/io/element/android/features/invite/api/declineandblock/DeclineInviteAndBlockEntryPoint.kt @@ -13,6 +13,9 @@ import io.element.android.features.invite.api.InviteData import io.element.android.libraries.architecture.FeatureEntryPoint fun interface DeclineInviteAndBlockEntryPoint : FeatureEntryPoint { - context(parentNode: Node) - fun createNode(buildContext: BuildContext, inviteData: InviteData): Node + fun createNode( + parentNode: Node, + buildContext: BuildContext, + inviteData: InviteData, + ): Node } diff --git a/features/invite/impl/src/main/kotlin/io/element/android/features/invite/impl/declineandblock/DefaultDeclineAndBlockEntryPoint.kt b/features/invite/impl/src/main/kotlin/io/element/android/features/invite/impl/declineandblock/DefaultDeclineAndBlockEntryPoint.kt index a356636cad..00f91356c4 100644 --- a/features/invite/impl/src/main/kotlin/io/element/android/features/invite/impl/declineandblock/DefaultDeclineAndBlockEntryPoint.kt +++ b/features/invite/impl/src/main/kotlin/io/element/android/features/invite/impl/declineandblock/DefaultDeclineAndBlockEntryPoint.kt @@ -17,8 +17,11 @@ import io.element.android.libraries.architecture.createNode @ContributesBinding(AppScope::class) class DefaultDeclineAndBlockEntryPoint : DeclineInviteAndBlockEntryPoint { - context(parentNode: Node) - override fun createNode(buildContext: BuildContext, inviteData: InviteData): Node { + override fun createNode( + parentNode: Node, + buildContext: BuildContext, + inviteData: InviteData, + ): Node { val inputs = DeclineAndBlockNode.Inputs(inviteData) return parentNode.createNode(buildContext, plugins = listOf(inputs)) } diff --git a/features/invite/impl/src/test/kotlin/io/element/android/features/invite/impl/declineandblock/DefaultDeclineAndBlockEntryPointTest.kt b/features/invite/impl/src/test/kotlin/io/element/android/features/invite/impl/declineandblock/DefaultDeclineAndBlockEntryPointTest.kt index c1919831c0..7cdf208b9a 100644 --- a/features/invite/impl/src/test/kotlin/io/element/android/features/invite/impl/declineandblock/DefaultDeclineAndBlockEntryPointTest.kt +++ b/features/invite/impl/src/test/kotlin/io/element/android/features/invite/impl/declineandblock/DefaultDeclineAndBlockEntryPointTest.kt @@ -30,12 +30,11 @@ class DefaultDeclineAndBlockEntryPointTest { ) } val inviteData = anInviteData() - val result = with(parentNode) { - entryPoint.createNode( - buildContext = BuildContext.root(null), - inviteData = inviteData - ) - } + val result = entryPoint.createNode( + parentNode = parentNode, + buildContext = BuildContext.root(null), + inviteData = inviteData + ) assertThat(result).isInstanceOf(DeclineAndBlockNode::class.java) assertThat(result.plugins).contains(DeclineAndBlockNode.Inputs(inviteData)) } diff --git a/features/invite/test/src/main/kotlin/io/element/android/features/invite/test/declineandblock/FakeDeclineInviteAndBlockEntryPoint.kt b/features/invite/test/src/main/kotlin/io/element/android/features/invite/test/declineandblock/FakeDeclineInviteAndBlockEntryPoint.kt index 75d93666c0..5df4ff6c0f 100644 --- a/features/invite/test/src/main/kotlin/io/element/android/features/invite/test/declineandblock/FakeDeclineInviteAndBlockEntryPoint.kt +++ b/features/invite/test/src/main/kotlin/io/element/android/features/invite/test/declineandblock/FakeDeclineInviteAndBlockEntryPoint.kt @@ -14,8 +14,11 @@ import io.element.android.features.invite.api.declineandblock.DeclineInviteAndBl import io.element.android.tests.testutils.lambda.lambdaError class FakeDeclineInviteAndBlockEntryPoint : DeclineInviteAndBlockEntryPoint { - context(parentNode: Node) - override fun createNode(buildContext: BuildContext, inviteData: InviteData): Node { + override fun createNode( + parentNode: Node, + buildContext: BuildContext, + inviteData: InviteData, + ): Node { lambdaError() } } diff --git a/features/joinroom/api/src/main/kotlin/io/element/android/features/joinroom/api/JoinRoomEntryPoint.kt b/features/joinroom/api/src/main/kotlin/io/element/android/features/joinroom/api/JoinRoomEntryPoint.kt index 7b4f9a8ac0..0860c1053b 100644 --- a/features/joinroom/api/src/main/kotlin/io/element/android/features/joinroom/api/JoinRoomEntryPoint.kt +++ b/features/joinroom/api/src/main/kotlin/io/element/android/features/joinroom/api/JoinRoomEntryPoint.kt @@ -18,8 +18,11 @@ import io.element.android.libraries.matrix.api.core.RoomIdOrAlias import java.util.Optional interface JoinRoomEntryPoint : FeatureEntryPoint { - context(parentNode: Node) - fun createNode(buildContext: BuildContext, inputs: Inputs): Node + fun createNode( + parentNode: Node, + buildContext: BuildContext, + inputs: Inputs, + ): Node data class Inputs( val roomId: RoomId, diff --git a/features/joinroom/impl/src/main/kotlin/io/element/android/features/joinroom/impl/DefaultJoinRoomEntryPoint.kt b/features/joinroom/impl/src/main/kotlin/io/element/android/features/joinroom/impl/DefaultJoinRoomEntryPoint.kt index eb1deb4897..0289dc5993 100644 --- a/features/joinroom/impl/src/main/kotlin/io/element/android/features/joinroom/impl/DefaultJoinRoomEntryPoint.kt +++ b/features/joinroom/impl/src/main/kotlin/io/element/android/features/joinroom/impl/DefaultJoinRoomEntryPoint.kt @@ -16,8 +16,11 @@ import io.element.android.libraries.architecture.createNode @ContributesBinding(AppScope::class) class DefaultJoinRoomEntryPoint : JoinRoomEntryPoint { - context(parentNode: Node) - override fun createNode(buildContext: BuildContext, inputs: JoinRoomEntryPoint.Inputs): Node { + override fun createNode( + parentNode: Node, + buildContext: BuildContext, + inputs: JoinRoomEntryPoint.Inputs, + ): Node { return parentNode.createNode( buildContext = buildContext, plugins = listOf(inputs) diff --git a/features/joinroom/impl/src/main/kotlin/io/element/android/features/joinroom/impl/JoinRoomFlowNode.kt b/features/joinroom/impl/src/main/kotlin/io/element/android/features/joinroom/impl/JoinRoomFlowNode.kt index 92cd023bc9..aa1c0d452f 100644 --- a/features/joinroom/impl/src/main/kotlin/io/element/android/features/joinroom/impl/JoinRoomFlowNode.kt +++ b/features/joinroom/impl/src/main/kotlin/io/element/android/features/joinroom/impl/JoinRoomFlowNode.kt @@ -64,7 +64,11 @@ class JoinRoomFlowNode( override fun resolve(navTarget: NavTarget, buildContext: BuildContext): Node { return when (navTarget) { - is NavTarget.DeclineInviteAndBlockUser -> declineAndBlockEntryPoint.createNode(buildContext, navTarget.inviteData) + is NavTarget.DeclineInviteAndBlockUser -> declineAndBlockEntryPoint.createNode( + parentNode = this, + buildContext = buildContext, + inviteData = navTarget.inviteData, + ) NavTarget.Root -> rootNode(buildContext) } } diff --git a/features/joinroom/impl/src/test/kotlin/io/element/android/features/joinroom/impl/DefaultJoinRoomEntryPointTest.kt b/features/joinroom/impl/src/test/kotlin/io/element/android/features/joinroom/impl/DefaultJoinRoomEntryPointTest.kt index abde7e9e4e..570323c377 100644 --- a/features/joinroom/impl/src/test/kotlin/io/element/android/features/joinroom/impl/DefaultJoinRoomEntryPointTest.kt +++ b/features/joinroom/impl/src/test/kotlin/io/element/android/features/joinroom/impl/DefaultJoinRoomEntryPointTest.kt @@ -48,9 +48,11 @@ class DefaultJoinRoomEntryPointTest { serverNames = emptyList(), trigger = JoinedRoom.Trigger.RoomDirectory, ) - val result = with(parentNode) { - entryPoint.createNode(BuildContext.root(null), inputs) - } + val result = entryPoint.createNode( + parentNode = parentNode, + buildContext = BuildContext.root(null), + inputs = inputs, + ) assertThat(result).isInstanceOf(JoinRoomFlowNode::class.java) assertThat(result.plugins).contains(inputs) } diff --git a/features/knockrequests/impl/src/main/kotlin/io/element/android/features/knockrequests/impl/list/DefaultKnockRequestsListEntryPoint.kt b/features/knockrequests/impl/src/main/kotlin/io/element/android/features/knockrequests/impl/list/DefaultKnockRequestsListEntryPoint.kt index a3186072f3..c77065324d 100644 --- a/features/knockrequests/impl/src/main/kotlin/io/element/android/features/knockrequests/impl/list/DefaultKnockRequestsListEntryPoint.kt +++ b/features/knockrequests/impl/src/main/kotlin/io/element/android/features/knockrequests/impl/list/DefaultKnockRequestsListEntryPoint.kt @@ -16,8 +16,7 @@ import io.element.android.libraries.architecture.createNode @ContributesBinding(AppScope::class) class DefaultKnockRequestsListEntryPoint : KnockRequestsListEntryPoint { - context(parentNode: Node) - override fun createNode(buildContext: BuildContext): Node { + override fun createNode(parentNode: Node, buildContext: BuildContext): Node { return parentNode.createNode(buildContext) } } diff --git a/features/knockrequests/impl/src/test/kotlin/io/element/android/features/knockrequests/impl/list/DefaultKnockRequestsListEntryPointTest.kt b/features/knockrequests/impl/src/test/kotlin/io/element/android/features/knockrequests/impl/list/DefaultKnockRequestsListEntryPointTest.kt index 2e6a8426e8..b6b6d766c7 100644 --- a/features/knockrequests/impl/src/test/kotlin/io/element/android/features/knockrequests/impl/list/DefaultKnockRequestsListEntryPointTest.kt +++ b/features/knockrequests/impl/src/test/kotlin/io/element/android/features/knockrequests/impl/list/DefaultKnockRequestsListEntryPointTest.kt @@ -30,9 +30,7 @@ class DefaultKnockRequestsListEntryPointTest { presenter = createKnockRequestsListPresenter(), ) } - val result = with(parentNode) { - entryPoint.createNode(BuildContext.root(null)) - } + val result = entryPoint.createNode(parentNode, BuildContext.root(null)) assertThat(result).isInstanceOf(KnockRequestsListNode::class.java) } } diff --git a/features/knockrequests/test/src/main/kotlin/io/element/android/features/knockrequests/test/FakeKnockRequestsListEntryPoint.kt b/features/knockrequests/test/src/main/kotlin/io/element/android/features/knockrequests/test/FakeKnockRequestsListEntryPoint.kt index 4c7a6ffdc7..bb5ab5045f 100644 --- a/features/knockrequests/test/src/main/kotlin/io/element/android/features/knockrequests/test/FakeKnockRequestsListEntryPoint.kt +++ b/features/knockrequests/test/src/main/kotlin/io/element/android/features/knockrequests/test/FakeKnockRequestsListEntryPoint.kt @@ -13,6 +13,8 @@ import io.element.android.features.knockrequests.api.list.KnockRequestsListEntry import io.element.android.tests.testutils.lambda.lambdaError class FakeKnockRequestsListEntryPoint : KnockRequestsListEntryPoint { - context(parentNode: Node) - override fun createNode(buildContext: BuildContext): Node = lambdaError() + override fun createNode( + parentNode: Node, + buildContext: BuildContext, + ): Node = lambdaError() } diff --git a/features/licenses/impl/src/main/kotlin/io/element/android/features/licenses/impl/DefaultOpenSourcesLicensesEntryPoint.kt b/features/licenses/impl/src/main/kotlin/io/element/android/features/licenses/impl/DefaultOpenSourcesLicensesEntryPoint.kt index 4839c1a8cf..77c56b6d3a 100644 --- a/features/licenses/impl/src/main/kotlin/io/element/android/features/licenses/impl/DefaultOpenSourcesLicensesEntryPoint.kt +++ b/features/licenses/impl/src/main/kotlin/io/element/android/features/licenses/impl/DefaultOpenSourcesLicensesEntryPoint.kt @@ -16,8 +16,7 @@ import io.element.android.libraries.architecture.createNode @ContributesBinding(AppScope::class) class DefaultOpenSourcesLicensesEntryPoint : OpenSourceLicensesEntryPoint { - context(parentNode: Node) - override fun createNode(buildContext: BuildContext): Node { + override fun createNode(parentNode: Node, buildContext: BuildContext): Node { return parentNode.createNode(buildContext) } } diff --git a/features/licenses/impl/src/test/kotlin/io/element/android/features/licenses/impl/DefaultOpenSourcesLicensesEntryPointTest.kt b/features/licenses/impl/src/test/kotlin/io/element/android/features/licenses/impl/DefaultOpenSourcesLicensesEntryPointTest.kt index 9fbd370c55..3209e28fe6 100644 --- a/features/licenses/impl/src/test/kotlin/io/element/android/features/licenses/impl/DefaultOpenSourcesLicensesEntryPointTest.kt +++ b/features/licenses/impl/src/test/kotlin/io/element/android/features/licenses/impl/DefaultOpenSourcesLicensesEntryPointTest.kt @@ -31,9 +31,7 @@ class DefaultOpenSourcesLicensesEntryPointTest { plugins = plugins, ) } - val result = with(parentNode) { - entryPoint.createNode(BuildContext.root(null)) - } + val result = entryPoint.createNode(parentNode, BuildContext.root(null)) assertThat(result).isInstanceOf(DependenciesFlowNode::class.java) } } diff --git a/features/licenses/test/src/main/kotlin/io/element/android/features/licenses/test/FakeOpenSourceLicensesEntryPoint.kt b/features/licenses/test/src/main/kotlin/io/element/android/features/licenses/test/FakeOpenSourceLicensesEntryPoint.kt index 0ce30a7839..49772dd946 100644 --- a/features/licenses/test/src/main/kotlin/io/element/android/features/licenses/test/FakeOpenSourceLicensesEntryPoint.kt +++ b/features/licenses/test/src/main/kotlin/io/element/android/features/licenses/test/FakeOpenSourceLicensesEntryPoint.kt @@ -13,8 +13,10 @@ import io.element.android.features.licenses.api.OpenSourceLicensesEntryPoint import io.element.android.tests.testutils.lambda.lambdaError class FakeOpenSourceLicensesEntryPoint : OpenSourceLicensesEntryPoint { - context(parentNode: Node) - override fun createNode(buildContext: BuildContext): Node { + override fun createNode( + parentNode: Node, + buildContext: BuildContext, + ): Node { lambdaError() } } diff --git a/features/location/api/src/main/kotlin/io/element/android/features/location/api/SendLocationEntryPoint.kt b/features/location/api/src/main/kotlin/io/element/android/features/location/api/SendLocationEntryPoint.kt index f522992872..afd1b895b5 100644 --- a/features/location/api/src/main/kotlin/io/element/android/features/location/api/SendLocationEntryPoint.kt +++ b/features/location/api/src/main/kotlin/io/element/android/features/location/api/SendLocationEntryPoint.kt @@ -18,8 +18,8 @@ import io.element.android.libraries.matrix.api.timeline.Timeline * Allows a user to share a location message within a room. */ interface SendLocationEntryPoint : FeatureEntryPoint { - context(parentNode: Node) fun createNode( + parentNode: Node, buildContext: BuildContext, timelineMode: Timeline.Mode, ): Node diff --git a/features/location/api/src/main/kotlin/io/element/android/features/location/api/ShowLocationEntryPoint.kt b/features/location/api/src/main/kotlin/io/element/android/features/location/api/ShowLocationEntryPoint.kt index 2bf4ac5871..3c1f3ec288 100644 --- a/features/location/api/src/main/kotlin/io/element/android/features/location/api/ShowLocationEntryPoint.kt +++ b/features/location/api/src/main/kotlin/io/element/android/features/location/api/ShowLocationEntryPoint.kt @@ -13,8 +13,14 @@ import io.element.android.libraries.architecture.FeatureEntryPoint import io.element.android.libraries.architecture.NodeInputs interface ShowLocationEntryPoint : FeatureEntryPoint { - data class Inputs(val location: Location, val description: String?) : NodeInputs + data class Inputs( + val location: Location, + val description: String?, + ) : NodeInputs - context(parentNode: Node) - fun createNode(buildContext: BuildContext, inputs: Inputs): Node + fun createNode( + parentNode: Node, + buildContext: BuildContext, + inputs: Inputs, + ): Node } diff --git a/features/location/impl/src/main/kotlin/io/element/android/features/location/impl/send/DefaultSendLocationEntryPoint.kt b/features/location/impl/src/main/kotlin/io/element/android/features/location/impl/send/DefaultSendLocationEntryPoint.kt index 6d14dc06dc..2a8e9309a1 100644 --- a/features/location/impl/src/main/kotlin/io/element/android/features/location/impl/send/DefaultSendLocationEntryPoint.kt +++ b/features/location/impl/src/main/kotlin/io/element/android/features/location/impl/send/DefaultSendLocationEntryPoint.kt @@ -17,8 +17,8 @@ import io.element.android.libraries.matrix.api.timeline.Timeline @ContributesBinding(AppScope::class) class DefaultSendLocationEntryPoint : SendLocationEntryPoint { - context(parentNode: Node) override fun createNode( + parentNode: Node, buildContext: BuildContext, timelineMode: Timeline.Mode, ): Node { diff --git a/features/location/impl/src/main/kotlin/io/element/android/features/location/impl/show/DefaultShowLocationEntryPoint.kt b/features/location/impl/src/main/kotlin/io/element/android/features/location/impl/show/DefaultShowLocationEntryPoint.kt index ab2c45eb1a..674dea4782 100644 --- a/features/location/impl/src/main/kotlin/io/element/android/features/location/impl/show/DefaultShowLocationEntryPoint.kt +++ b/features/location/impl/src/main/kotlin/io/element/android/features/location/impl/show/DefaultShowLocationEntryPoint.kt @@ -16,8 +16,11 @@ import io.element.android.libraries.architecture.createNode @ContributesBinding(AppScope::class) class DefaultShowLocationEntryPoint : ShowLocationEntryPoint { - context(parentNode: Node) - override fun createNode(buildContext: BuildContext, inputs: ShowLocationEntryPoint.Inputs): Node { + override fun createNode( + parentNode: Node, + buildContext: BuildContext, + inputs: ShowLocationEntryPoint.Inputs, + ): Node { return parentNode.createNode(buildContext, listOf(inputs)) } } diff --git a/features/location/impl/src/test/kotlin/io/element/android/features/location/impl/send/DefaultSendLocationEntryPointTest.kt b/features/location/impl/src/test/kotlin/io/element/android/features/location/impl/send/DefaultSendLocationEntryPointTest.kt index ff3cc57dcf..4cac3df6a2 100644 --- a/features/location/impl/src/test/kotlin/io/element/android/features/location/impl/send/DefaultSendLocationEntryPointTest.kt +++ b/features/location/impl/src/test/kotlin/io/element/android/features/location/impl/send/DefaultSendLocationEntryPointTest.kt @@ -47,12 +47,11 @@ class DefaultSendLocationEntryPointTest { ) } val timelineMode = Timeline.Mode.Live - val result = with(parentNode) { - entryPoint.createNode( - buildContext = BuildContext.root(null), - timelineMode = timelineMode, - ) - } + val result = entryPoint.createNode( + parentNode = parentNode, + buildContext = BuildContext.root(null), + timelineMode = timelineMode, + ) assertThat(result).isInstanceOf(SendLocationNode::class.java) assertThat(result.plugins).contains(SendLocationNode.Inputs(timelineMode)) } diff --git a/features/location/impl/src/test/kotlin/io/element/android/features/location/impl/show/DefaultShowLocationEntryPointTest.kt b/features/location/impl/src/test/kotlin/io/element/android/features/location/impl/show/DefaultShowLocationEntryPointTest.kt index b7d7a1be44..8d0d862c9b 100644 --- a/features/location/impl/src/test/kotlin/io/element/android/features/location/impl/show/DefaultShowLocationEntryPointTest.kt +++ b/features/location/impl/src/test/kotlin/io/element/android/features/location/impl/show/DefaultShowLocationEntryPointTest.kt @@ -47,12 +47,11 @@ class DefaultShowLocationEntryPointTest { location = Location(37.4219983, -122.084, 10f), description = "My location", ) - val result = with(parentNode) { - entryPoint.createNode( - buildContext = BuildContext.root(null), - inputs = inputs, - ) - } + val result = entryPoint.createNode( + parentNode = parentNode, + buildContext = BuildContext.root(null), + inputs = inputs, + ) assertThat(result).isInstanceOf(ShowLocationNode::class.java) assertThat(result.plugins).contains(inputs) } diff --git a/features/location/test/src/main/kotlin/io/element/android/features/location/test/FakeSendLocationEntryPoint.kt b/features/location/test/src/main/kotlin/io/element/android/features/location/test/FakeSendLocationEntryPoint.kt index 7bcccef4bb..ba39be70b1 100644 --- a/features/location/test/src/main/kotlin/io/element/android/features/location/test/FakeSendLocationEntryPoint.kt +++ b/features/location/test/src/main/kotlin/io/element/android/features/location/test/FakeSendLocationEntryPoint.kt @@ -14,8 +14,8 @@ import io.element.android.libraries.matrix.api.timeline.Timeline import io.element.android.tests.testutils.lambda.lambdaError class FakeSendLocationEntryPoint : SendLocationEntryPoint { - context(parentNode: Node) override fun createNode( + parentNode: Node, buildContext: BuildContext, timelineMode: Timeline.Mode, ): Node = lambdaError() diff --git a/features/location/test/src/main/kotlin/io/element/android/features/location/test/FakeShowLocationEntryPoint.kt b/features/location/test/src/main/kotlin/io/element/android/features/location/test/FakeShowLocationEntryPoint.kt index 33d269f68d..a1ff742497 100644 --- a/features/location/test/src/main/kotlin/io/element/android/features/location/test/FakeShowLocationEntryPoint.kt +++ b/features/location/test/src/main/kotlin/io/element/android/features/location/test/FakeShowLocationEntryPoint.kt @@ -13,8 +13,8 @@ import io.element.android.features.location.api.ShowLocationEntryPoint import io.element.android.tests.testutils.lambda.lambdaError class FakeShowLocationEntryPoint : ShowLocationEntryPoint { - context(parentNode: Node) override fun createNode( + parentNode: Node, buildContext: BuildContext, inputs: ShowLocationEntryPoint.Inputs, ): Node = lambdaError() diff --git a/features/lockscreen/api/src/main/kotlin/io/element/android/features/lockscreen/api/LockScreenEntryPoint.kt b/features/lockscreen/api/src/main/kotlin/io/element/android/features/lockscreen/api/LockScreenEntryPoint.kt index c5c187db83..c777d3a6b5 100644 --- a/features/lockscreen/api/src/main/kotlin/io/element/android/features/lockscreen/api/LockScreenEntryPoint.kt +++ b/features/lockscreen/api/src/main/kotlin/io/element/android/features/lockscreen/api/LockScreenEntryPoint.kt @@ -15,8 +15,12 @@ import com.bumble.appyx.core.plugin.Plugin import io.element.android.libraries.architecture.FeatureEntryPoint interface LockScreenEntryPoint : FeatureEntryPoint { - context(parentNode: Node) - fun createNode(buildContext: BuildContext, navTarget: Target, callback: Callback): Node + fun createNode( + parentNode: Node, + buildContext: BuildContext, + navTarget: Target, + callback: Callback, + ): Node fun pinUnlockIntent(context: Context): Intent diff --git a/features/lockscreen/impl/src/main/kotlin/io/element/android/features/lockscreen/impl/DefaultLockScreenEntryPoint.kt b/features/lockscreen/impl/src/main/kotlin/io/element/android/features/lockscreen/impl/DefaultLockScreenEntryPoint.kt index 8651480c37..39430c5ad1 100644 --- a/features/lockscreen/impl/src/main/kotlin/io/element/android/features/lockscreen/impl/DefaultLockScreenEntryPoint.kt +++ b/features/lockscreen/impl/src/main/kotlin/io/element/android/features/lockscreen/impl/DefaultLockScreenEntryPoint.kt @@ -19,8 +19,8 @@ import io.element.android.libraries.architecture.createNode @ContributesBinding(AppScope::class) class DefaultLockScreenEntryPoint : LockScreenEntryPoint { - context(parentNode: Node) override fun createNode( + parentNode: Node, buildContext: BuildContext, navTarget: LockScreenEntryPoint.Target, callback: LockScreenEntryPoint.Callback, diff --git a/features/lockscreen/impl/src/test/kotlin/io/element/android/features/lockscreen/impl/DefaultLockScreenEntryPointTest.kt b/features/lockscreen/impl/src/test/kotlin/io/element/android/features/lockscreen/impl/DefaultLockScreenEntryPointTest.kt index 425f5a70e3..15473fe43c 100644 --- a/features/lockscreen/impl/src/test/kotlin/io/element/android/features/lockscreen/impl/DefaultLockScreenEntryPointTest.kt +++ b/features/lockscreen/impl/src/test/kotlin/io/element/android/features/lockscreen/impl/DefaultLockScreenEntryPointTest.kt @@ -37,13 +37,12 @@ class DefaultLockScreenEntryPointTest { override fun onSetupDone() = lambdaError() } val navTarget = LockScreenEntryPoint.Target.Setup - val result = with(parentNode) { - entryPoint.createNode( - buildContext = BuildContext.root(null), - navTarget = navTarget, - callback = callback, - ) - } + val result = entryPoint.createNode( + parentNode = parentNode, + buildContext = BuildContext.root(null), + navTarget = navTarget, + callback = callback, + ) assertThat(result).isInstanceOf(LockScreenFlowNode::class.java) assertThat(result.plugins).contains(LockScreenFlowNode.Inputs(LockScreenFlowNode.NavTarget.Setup)) assertThat(result.plugins).contains(callback) @@ -62,13 +61,12 @@ class DefaultLockScreenEntryPointTest { override fun onSetupDone() = lambdaError() } val navTarget = LockScreenEntryPoint.Target.Settings - val result = with(parentNode) { - entryPoint.createNode( - buildContext = BuildContext.root(null), - navTarget = navTarget, - callback = callback, - ) - } + val result = entryPoint.createNode( + parentNode = parentNode, + buildContext = BuildContext.root(null), + navTarget = navTarget, + callback = callback, + ) assertThat(result).isInstanceOf(LockScreenFlowNode::class.java) assertThat(result.plugins).contains(LockScreenFlowNode.Inputs(LockScreenFlowNode.NavTarget.Settings)) assertThat(result.plugins).contains(callback) diff --git a/features/lockscreen/test/src/main/kotlin/io/element/android/features/lockscreen/test/FakeLockScreenEntryPoint.kt b/features/lockscreen/test/src/main/kotlin/io/element/android/features/lockscreen/test/FakeLockScreenEntryPoint.kt index dc722dd0c8..1c41d9d6ea 100644 --- a/features/lockscreen/test/src/main/kotlin/io/element/android/features/lockscreen/test/FakeLockScreenEntryPoint.kt +++ b/features/lockscreen/test/src/main/kotlin/io/element/android/features/lockscreen/test/FakeLockScreenEntryPoint.kt @@ -15,8 +15,8 @@ import io.element.android.features.lockscreen.api.LockScreenEntryPoint import io.element.android.tests.testutils.lambda.lambdaError class FakeLockScreenEntryPoint : LockScreenEntryPoint { - context(parentNode: Node) override fun createNode( + parentNode: Node, buildContext: BuildContext, navTarget: LockScreenEntryPoint.Target, callback: LockScreenEntryPoint.Callback, diff --git a/features/login/api/src/main/kotlin/io/element/android/features/login/api/LoginEntryPoint.kt b/features/login/api/src/main/kotlin/io/element/android/features/login/api/LoginEntryPoint.kt index b9f4228162..bebe2f0afc 100644 --- a/features/login/api/src/main/kotlin/io/element/android/features/login/api/LoginEntryPoint.kt +++ b/features/login/api/src/main/kotlin/io/element/android/features/login/api/LoginEntryPoint.kt @@ -22,6 +22,10 @@ interface LoginEntryPoint : FeatureEntryPoint { fun navigateToBugReport() } - context(parentNode: Node) - fun createNode(buildContext: BuildContext, params: Params, callback: Callback): Node + fun createNode( + parentNode: Node, + buildContext: BuildContext, + params: Params, + callback: Callback, + ): Node } diff --git a/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/DefaultLoginEntryPoint.kt b/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/DefaultLoginEntryPoint.kt index 327ec5036a..71fbe1598c 100644 --- a/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/DefaultLoginEntryPoint.kt +++ b/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/DefaultLoginEntryPoint.kt @@ -16,8 +16,12 @@ import io.element.android.libraries.architecture.createNode @ContributesBinding(AppScope::class) class DefaultLoginEntryPoint : LoginEntryPoint { - context(parentNode: Node) - override fun createNode(buildContext: BuildContext, params: LoginEntryPoint.Params, callback: LoginEntryPoint.Callback): Node { + override fun createNode( + parentNode: Node, + buildContext: BuildContext, + params: LoginEntryPoint.Params, + callback: LoginEntryPoint.Callback, + ): Node { return parentNode.createNode( buildContext = buildContext, plugins = listOf( diff --git a/features/login/impl/src/test/kotlin/io/element/android/features/login/impl/DefaultLoginEntryPointTest.kt b/features/login/impl/src/test/kotlin/io/element/android/features/login/impl/DefaultLoginEntryPointTest.kt index 2396831b1d..4a6f6cae22 100644 --- a/features/login/impl/src/test/kotlin/io/element/android/features/login/impl/DefaultLoginEntryPointTest.kt +++ b/features/login/impl/src/test/kotlin/io/element/android/features/login/impl/DefaultLoginEntryPointTest.kt @@ -45,13 +45,12 @@ class DefaultLoginEntryPointTest { accountProvider = "ac", loginHint = "lh", ) - val result = with(parentNode) { - entryPoint.createNode( - buildContext = BuildContext.root(null), - params = params, - callback = callback, - ) - } + val result = entryPoint.createNode( + parentNode = parentNode, + buildContext = BuildContext.root(null), + params = params, + callback = callback, + ) assertThat(result).isInstanceOf(LoginFlowNode::class.java) assertThat(result.plugins).contains(LoginFlowNode.Params(params.accountProvider, params.loginHint)) assertThat(result.plugins).contains(callback) diff --git a/features/logout/api/src/main/kotlin/io/element/android/features/logout/api/LogoutEntryPoint.kt b/features/logout/api/src/main/kotlin/io/element/android/features/logout/api/LogoutEntryPoint.kt index 207f92a489..cf7deaf334 100644 --- a/features/logout/api/src/main/kotlin/io/element/android/features/logout/api/LogoutEntryPoint.kt +++ b/features/logout/api/src/main/kotlin/io/element/android/features/logout/api/LogoutEntryPoint.kt @@ -13,8 +13,11 @@ import com.bumble.appyx.core.plugin.Plugin import io.element.android.libraries.architecture.FeatureEntryPoint interface LogoutEntryPoint : FeatureEntryPoint { - context(parentNode: Node) - fun createNode(buildContext: BuildContext, callback: Callback): Node + fun createNode( + parentNode: Node, + buildContext: BuildContext, + callback: Callback, + ): Node interface Callback : Plugin { fun navigateToSecureBackup() diff --git a/features/logout/impl/src/main/kotlin/io/element/android/features/logout/impl/DefaultLogoutEntryPoint.kt b/features/logout/impl/src/main/kotlin/io/element/android/features/logout/impl/DefaultLogoutEntryPoint.kt index 42c11cf0d6..844c5ad0ad 100644 --- a/features/logout/impl/src/main/kotlin/io/element/android/features/logout/impl/DefaultLogoutEntryPoint.kt +++ b/features/logout/impl/src/main/kotlin/io/element/android/features/logout/impl/DefaultLogoutEntryPoint.kt @@ -16,8 +16,11 @@ import io.element.android.libraries.architecture.createNode @ContributesBinding(AppScope::class) class DefaultLogoutEntryPoint : LogoutEntryPoint { - context(parentNode: Node) - override fun createNode(buildContext: BuildContext, callback: LogoutEntryPoint.Callback): Node { + override fun createNode( + parentNode: Node, + buildContext: BuildContext, + callback: LogoutEntryPoint.Callback, + ): Node { return parentNode.createNode(buildContext, listOf(callback)) } } diff --git a/features/logout/impl/src/test/kotlin/io/element/android/features/logout/impl/DefaultLogoutEntryPointTest.kt b/features/logout/impl/src/test/kotlin/io/element/android/features/logout/impl/DefaultLogoutEntryPointTest.kt index b319a30e44..dd4b3b36fc 100644 --- a/features/logout/impl/src/test/kotlin/io/element/android/features/logout/impl/DefaultLogoutEntryPointTest.kt +++ b/features/logout/impl/src/test/kotlin/io/element/android/features/logout/impl/DefaultLogoutEntryPointTest.kt @@ -34,12 +34,11 @@ class DefaultLogoutEntryPointTest { val callback = object : LogoutEntryPoint.Callback { override fun navigateToSecureBackup() = lambdaError() } - val result = with(parentNode) { - entryPoint.createNode( - buildContext = BuildContext.root(null), - callback = callback, - ) - } + val result = entryPoint.createNode( + parentNode = parentNode, + buildContext = BuildContext.root(null), + callback = callback, + ) assertThat(result).isInstanceOf(LogoutNode::class.java) assertThat(result.plugins).contains(callback) } diff --git a/features/logout/test/src/main/kotlin/io/element/android/features/logout/test/FakeLogoutEntryPoint.kt b/features/logout/test/src/main/kotlin/io/element/android/features/logout/test/FakeLogoutEntryPoint.kt index 4273bf7169..953fe87587 100644 --- a/features/logout/test/src/main/kotlin/io/element/android/features/logout/test/FakeLogoutEntryPoint.kt +++ b/features/logout/test/src/main/kotlin/io/element/android/features/logout/test/FakeLogoutEntryPoint.kt @@ -13,8 +13,8 @@ import io.element.android.features.logout.api.LogoutEntryPoint import io.element.android.tests.testutils.lambda.lambdaError class FakeLogoutEntryPoint : LogoutEntryPoint { - context(parentNode: Node) override fun createNode( + parentNode: Node, buildContext: BuildContext, callback: LogoutEntryPoint.Callback, ): Node = lambdaError() diff --git a/features/messages/api/src/main/kotlin/io/element/android/features/messages/api/MessagesEntryPoint.kt b/features/messages/api/src/main/kotlin/io/element/android/features/messages/api/MessagesEntryPoint.kt index 6f883bb683..54df2b7fec 100644 --- a/features/messages/api/src/main/kotlin/io/element/android/features/messages/api/MessagesEntryPoint.kt +++ b/features/messages/api/src/main/kotlin/io/element/android/features/messages/api/MessagesEntryPoint.kt @@ -41,8 +41,12 @@ interface MessagesEntryPoint : FeatureEntryPoint { data class Params(val initialTarget: InitialTarget) : NodeInputs - context(parentNode: Node) - fun createNode(buildContext: BuildContext, params: Params, callback: Callback): Node + fun createNode( + parentNode: Node, + buildContext: BuildContext, + params: Params, + callback: Callback, + ): Node } interface MessagesEntryPointNode { diff --git a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/DefaultMessagesEntryPoint.kt b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/DefaultMessagesEntryPoint.kt index 90784912e6..1b20580b62 100644 --- a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/DefaultMessagesEntryPoint.kt +++ b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/DefaultMessagesEntryPoint.kt @@ -16,8 +16,12 @@ import io.element.android.libraries.di.SessionScope @ContributesBinding(SessionScope::class) class DefaultMessagesEntryPoint : MessagesEntryPoint { - context(parentNode: Node) - override fun createNode(buildContext: BuildContext, params: MessagesEntryPoint.Params, callback: MessagesEntryPoint.Callback): Node { + override fun createNode( + parentNode: Node, + buildContext: BuildContext, + params: MessagesEntryPoint.Params, + callback: MessagesEntryPoint.Callback, + ): Node { return parentNode.createNode(buildContext, listOf(params, callback)) } } diff --git a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/MessagesFlowNode.kt b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/MessagesFlowNode.kt index 0c700d5695..7d468354d8 100644 --- a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/MessagesFlowNode.kt +++ b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/MessagesFlowNode.kt @@ -321,6 +321,7 @@ class MessagesFlowNode( } } mediaViewerEntryPoint.createNode( + parentNode = this, buildContext = buildContext, params = params, callback = callback @@ -336,7 +337,11 @@ class MessagesFlowNode( } is NavTarget.LocationViewer -> { val inputs = ShowLocationEntryPoint.Inputs(navTarget.location, navTarget.description) - showLocationEntryPoint.createNode(buildContext, inputs) + showLocationEntryPoint.createNode( + parentNode = this, + buildContext = buildContext, + inputs = inputs, + ) } is NavTarget.EventDebugInfo -> { val inputs = EventDebugInfoNode.Inputs(navTarget.eventId, navTarget.debugInfo) @@ -358,6 +363,7 @@ class MessagesFlowNode( } } forwardEntryPoint.createNode( + parentNode = this, buildContext = buildContext, params = params, callback = callback, @@ -369,12 +375,14 @@ class MessagesFlowNode( } is NavTarget.SendLocation -> { sendLocationEntryPoint.createNode( + parentNode = this, buildContext = buildContext, timelineMode = navTarget.timelineMode, ) } is NavTarget.CreatePoll -> { createPollEntryPoint.createNode( + parentNode = this, buildContext = buildContext, params = CreatePollEntryPoint.Params( timelineMode = navTarget.timelineMode, @@ -384,6 +392,7 @@ class MessagesFlowNode( } is NavTarget.EditPoll -> { createPollEntryPoint.createNode( + parentNode = this, buildContext = buildContext, params = CreatePollEntryPoint.Params( timelineMode = navTarget.timelineMode, @@ -423,7 +432,7 @@ class MessagesFlowNode( createNode(buildContext, plugins = listOf(callback)) } NavTarget.KnockRequestsList -> { - knockRequestsListEntryPoint.createNode(buildContext) + knockRequestsListEntryPoint.createNode(this, buildContext) } is NavTarget.Thread -> { val inputs = ThreadedMessagesNode.Inputs( diff --git a/features/messages/impl/src/test/kotlin/io/element/android/features/messages/impl/DefaultMessagesEntryPointTest.kt b/features/messages/impl/src/test/kotlin/io/element/android/features/messages/impl/DefaultMessagesEntryPointTest.kt index 2c8cb88875..880f89f3bc 100644 --- a/features/messages/impl/src/test/kotlin/io/element/android/features/messages/impl/DefaultMessagesEntryPointTest.kt +++ b/features/messages/impl/src/test/kotlin/io/element/android/features/messages/impl/DefaultMessagesEntryPointTest.kt @@ -95,13 +95,12 @@ class DefaultMessagesEntryPointTest { } val initialTarget = MessagesEntryPoint.InitialTarget.Messages(focusedEventId = AN_EVENT_ID) val params = MessagesEntryPoint.Params(initialTarget) - val result = with(parentNode) { - entryPoint.createNode( - buildContext = BuildContext.root(null), - params = params, - callback = callback, - ) - } + val result = entryPoint.createNode( + parentNode = parentNode, + buildContext = BuildContext.root(null), + params = params, + callback = callback, + ) assertThat(result).isInstanceOf(MessagesFlowNode::class.java) assertThat(result.plugins).contains(MessagesEntryPoint.Params(initialTarget)) assertThat(result.plugins).contains(callback) diff --git a/features/messages/test/src/main/kotlin/io/element/android/features/messages/test/FakeMessagesEntryPoint.kt b/features/messages/test/src/main/kotlin/io/element/android/features/messages/test/FakeMessagesEntryPoint.kt index 91258521de..8cd8e6dc89 100644 --- a/features/messages/test/src/main/kotlin/io/element/android/features/messages/test/FakeMessagesEntryPoint.kt +++ b/features/messages/test/src/main/kotlin/io/element/android/features/messages/test/FakeMessagesEntryPoint.kt @@ -13,8 +13,8 @@ import io.element.android.features.messages.api.MessagesEntryPoint import io.element.android.tests.testutils.lambda.lambdaError class FakeMessagesEntryPoint : MessagesEntryPoint { - context(parentNode: Node) override fun createNode( + parentNode: Node, buildContext: BuildContext, params: MessagesEntryPoint.Params, callback: MessagesEntryPoint.Callback, diff --git a/features/poll/api/src/main/kotlin/io/element/android/features/poll/api/create/CreatePollEntryPoint.kt b/features/poll/api/src/main/kotlin/io/element/android/features/poll/api/create/CreatePollEntryPoint.kt index 202ff9c7c1..f1f4ee4f5c 100644 --- a/features/poll/api/src/main/kotlin/io/element/android/features/poll/api/create/CreatePollEntryPoint.kt +++ b/features/poll/api/src/main/kotlin/io/element/android/features/poll/api/create/CreatePollEntryPoint.kt @@ -18,6 +18,9 @@ interface CreatePollEntryPoint : FeatureEntryPoint { val mode: CreatePollMode, ) - context(parentNode: Node) - fun createNode(buildContext: BuildContext, params: Params): Node + fun createNode( + parentNode: Node, + buildContext: BuildContext, + params: Params, + ): Node } diff --git a/features/poll/impl/src/main/kotlin/io/element/android/features/poll/impl/create/DefaultCreatePollEntryPoint.kt b/features/poll/impl/src/main/kotlin/io/element/android/features/poll/impl/create/DefaultCreatePollEntryPoint.kt index 5d3a6d66cb..1e41cdc59e 100644 --- a/features/poll/impl/src/main/kotlin/io/element/android/features/poll/impl/create/DefaultCreatePollEntryPoint.kt +++ b/features/poll/impl/src/main/kotlin/io/element/android/features/poll/impl/create/DefaultCreatePollEntryPoint.kt @@ -16,8 +16,11 @@ import io.element.android.libraries.architecture.createNode @ContributesBinding(AppScope::class) class DefaultCreatePollEntryPoint : CreatePollEntryPoint { - context(parentNode: Node) - override fun createNode(buildContext: BuildContext, params: CreatePollEntryPoint.Params): Node { + override fun createNode( + parentNode: Node, + buildContext: BuildContext, + params: CreatePollEntryPoint.Params, + ): Node { return parentNode.createNode( buildContext = buildContext, plugins = listOf(CreatePollNode.Inputs(timelineMode = params.timelineMode, mode = params.mode)) diff --git a/features/poll/impl/src/main/kotlin/io/element/android/features/poll/impl/history/DefaultPollHistoryEntryPoint.kt b/features/poll/impl/src/main/kotlin/io/element/android/features/poll/impl/history/DefaultPollHistoryEntryPoint.kt index c309a5324e..7f867def0a 100644 --- a/features/poll/impl/src/main/kotlin/io/element/android/features/poll/impl/history/DefaultPollHistoryEntryPoint.kt +++ b/features/poll/impl/src/main/kotlin/io/element/android/features/poll/impl/history/DefaultPollHistoryEntryPoint.kt @@ -16,8 +16,7 @@ import io.element.android.libraries.architecture.createNode @ContributesBinding(AppScope::class) class DefaultPollHistoryEntryPoint : PollHistoryEntryPoint { - context(parentNode: Node) - override fun createNode(buildContext: BuildContext): Node { + override fun createNode(parentNode: Node, buildContext: BuildContext): Node { return parentNode.createNode(buildContext) } } diff --git a/features/poll/impl/src/main/kotlin/io/element/android/features/poll/impl/history/PollHistoryFlowNode.kt b/features/poll/impl/src/main/kotlin/io/element/android/features/poll/impl/history/PollHistoryFlowNode.kt index 56ae72e58f..6b43a06d01 100644 --- a/features/poll/impl/src/main/kotlin/io/element/android/features/poll/impl/history/PollHistoryFlowNode.kt +++ b/features/poll/impl/src/main/kotlin/io/element/android/features/poll/impl/history/PollHistoryFlowNode.kt @@ -54,6 +54,7 @@ class PollHistoryFlowNode( return when (navTarget) { is NavTarget.EditPoll -> { createPollEntryPoint.createNode( + parentNode = this, buildContext = buildContext, params = CreatePollEntryPoint.Params( timelineMode = Timeline.Mode.Live, diff --git a/features/poll/impl/src/test/kotlin/io/element/android/features/poll/impl/create/DefaultCreatePollEntryPointTest.kt b/features/poll/impl/src/test/kotlin/io/element/android/features/poll/impl/create/DefaultCreatePollEntryPointTest.kt index 14c41f50cd..464fae98a0 100644 --- a/features/poll/impl/src/test/kotlin/io/element/android/features/poll/impl/create/DefaultCreatePollEntryPointTest.kt +++ b/features/poll/impl/src/test/kotlin/io/element/android/features/poll/impl/create/DefaultCreatePollEntryPointTest.kt @@ -53,12 +53,11 @@ class DefaultCreatePollEntryPointTest { timelineMode = Timeline.Mode.Live, mode = CreatePollMode.NewPoll, ) - val result = with(parentNode) { - entryPoint.createNode( - buildContext = BuildContext.root(null), - params = params, - ) - } + val result = entryPoint.createNode( + parentNode = parentNode, + buildContext = BuildContext.root(null), + params = params, + ) assertThat(result).isInstanceOf(CreatePollNode::class.java) assertThat(result.plugins).contains(CreatePollNode.Inputs(timelineMode = params.timelineMode, mode = params.mode)) } diff --git a/features/poll/impl/src/test/kotlin/io/element/android/features/poll/impl/history/DefaultPollHistoryEntryPointTest.kt b/features/poll/impl/src/test/kotlin/io/element/android/features/poll/impl/history/DefaultPollHistoryEntryPointTest.kt index 41c99d1cd1..dfee9a7320 100644 --- a/features/poll/impl/src/test/kotlin/io/element/android/features/poll/impl/history/DefaultPollHistoryEntryPointTest.kt +++ b/features/poll/impl/src/test/kotlin/io/element/android/features/poll/impl/history/DefaultPollHistoryEntryPointTest.kt @@ -34,9 +34,7 @@ class DefaultPollHistoryEntryPointTest { createPollEntryPoint = FakeCreatePollEntryPoint(), ) } - val result = with(parentNode) { - entryPoint.createNode(BuildContext.root(null)) - } + val result = entryPoint.createNode(parentNode, BuildContext.root(null)) assertThat(result).isInstanceOf(PollHistoryFlowNode::class.java) } } diff --git a/features/poll/test/src/main/kotlin/io/element/android/features/poll/test/create/FakeCreatePollEntryPoint.kt b/features/poll/test/src/main/kotlin/io/element/android/features/poll/test/create/FakeCreatePollEntryPoint.kt index 3563c341f4..96a63225b2 100644 --- a/features/poll/test/src/main/kotlin/io/element/android/features/poll/test/create/FakeCreatePollEntryPoint.kt +++ b/features/poll/test/src/main/kotlin/io/element/android/features/poll/test/create/FakeCreatePollEntryPoint.kt @@ -14,8 +14,8 @@ import io.element.android.features.poll.api.create.CreatePollEntryPoint.Params import io.element.android.tests.testutils.lambda.lambdaError class FakeCreatePollEntryPoint : CreatePollEntryPoint { - context(parentNode: Node) override fun createNode( + parentNode: Node, buildContext: BuildContext, params: Params, ): Node = lambdaError() diff --git a/features/poll/test/src/main/kotlin/io/element/android/features/poll/test/history/FakePollHistoryEntryPoint.kt b/features/poll/test/src/main/kotlin/io/element/android/features/poll/test/history/FakePollHistoryEntryPoint.kt index 5e20159fd8..725b5dc0ee 100644 --- a/features/poll/test/src/main/kotlin/io/element/android/features/poll/test/history/FakePollHistoryEntryPoint.kt +++ b/features/poll/test/src/main/kotlin/io/element/android/features/poll/test/history/FakePollHistoryEntryPoint.kt @@ -13,8 +13,8 @@ import io.element.android.features.poll.api.history.PollHistoryEntryPoint import io.element.android.tests.testutils.lambda.lambdaError class FakePollHistoryEntryPoint : PollHistoryEntryPoint { - context(parentNode: Node) override fun createNode( + parentNode: Node, buildContext: BuildContext, ): Node = lambdaError() } diff --git a/features/preferences/api/src/main/kotlin/io/element/android/features/preferences/api/PreferencesEntryPoint.kt b/features/preferences/api/src/main/kotlin/io/element/android/features/preferences/api/PreferencesEntryPoint.kt index af92b58cbb..5bb8a68a99 100644 --- a/features/preferences/api/src/main/kotlin/io/element/android/features/preferences/api/PreferencesEntryPoint.kt +++ b/features/preferences/api/src/main/kotlin/io/element/android/features/preferences/api/PreferencesEntryPoint.kt @@ -31,8 +31,12 @@ interface PreferencesEntryPoint : FeatureEntryPoint { data class Params(val initialElement: InitialTarget) : NodeInputs - context(parentNode: Node) - fun createNode(buildContext: BuildContext, params: Params, callback: Callback): Node + fun createNode( + parentNode: Node, + buildContext: BuildContext, + params: Params, + callback: Callback, + ): Node interface Callback : Plugin { fun navigateToAddAccount() diff --git a/features/preferences/impl/src/main/kotlin/io/element/android/features/preferences/impl/DefaultPreferencesEntryPoint.kt b/features/preferences/impl/src/main/kotlin/io/element/android/features/preferences/impl/DefaultPreferencesEntryPoint.kt index 338a3ff434..ffc9a2b798 100644 --- a/features/preferences/impl/src/main/kotlin/io/element/android/features/preferences/impl/DefaultPreferencesEntryPoint.kt +++ b/features/preferences/impl/src/main/kotlin/io/element/android/features/preferences/impl/DefaultPreferencesEntryPoint.kt @@ -16,8 +16,8 @@ import io.element.android.libraries.architecture.createNode @ContributesBinding(AppScope::class) class DefaultPreferencesEntryPoint : PreferencesEntryPoint { - context(parentNode: Node) override fun createNode( + parentNode: Node, buildContext: BuildContext, params: PreferencesEntryPoint.Params, callback: PreferencesEntryPoint.Callback, diff --git a/features/preferences/impl/src/main/kotlin/io/element/android/features/preferences/impl/PreferencesFlowNode.kt b/features/preferences/impl/src/main/kotlin/io/element/android/features/preferences/impl/PreferencesFlowNode.kt index ba5313dd7e..c8520c4f27 100644 --- a/features/preferences/impl/src/main/kotlin/io/element/android/features/preferences/impl/PreferencesFlowNode.kt +++ b/features/preferences/impl/src/main/kotlin/io/element/android/features/preferences/impl/PreferencesFlowNode.kt @@ -216,6 +216,7 @@ class PreferencesFlowNode( } NavTarget.TroubleshootNotifications -> { notificationTroubleShootEntryPoint.createNode( + parentNode = this, buildContext = buildContext, callback = object : NotificationTroubleShootEntryPoint.Callback { override fun onDone() { @@ -234,6 +235,7 @@ class PreferencesFlowNode( } NavTarget.PushHistory -> { pushHistoryEntryPoint.createNode( + parentNode = this, buildContext = buildContext, callback = object : PushHistoryEntryPoint.Callback { override fun onDone() { @@ -268,6 +270,7 @@ class PreferencesFlowNode( } NavTarget.LockScreenSettings -> { lockScreenEntryPoint.createNode( + parentNode = this, buildContext = buildContext, navTarget = LockScreenEntryPoint.Target.Settings, callback = object : LockScreenEntryPoint.Callback { @@ -287,15 +290,16 @@ class PreferencesFlowNode( } } logoutEntryPoint.createNode( + parentNode = this, buildContext = buildContext, callback = callBack, ) } is NavTarget.OssLicenses -> { - openSourceLicensesEntryPoint.createNode(buildContext) + openSourceLicensesEntryPoint.createNode(this, buildContext) } NavTarget.AccountDeactivation -> { - accountDeactivationEntryPoint.createNode(buildContext) + accountDeactivationEntryPoint.createNode(this, buildContext) } } } diff --git a/features/preferences/impl/src/test/kotlin/io/element/android/features/preferences/impl/DefaultPreferencesEntryPointTest.kt b/features/preferences/impl/src/test/kotlin/io/element/android/features/preferences/impl/DefaultPreferencesEntryPointTest.kt index f46a66248e..86ff65677c 100644 --- a/features/preferences/impl/src/test/kotlin/io/element/android/features/preferences/impl/DefaultPreferencesEntryPointTest.kt +++ b/features/preferences/impl/src/test/kotlin/io/element/android/features/preferences/impl/DefaultPreferencesEntryPointTest.kt @@ -57,13 +57,12 @@ class DefaultPreferencesEntryPointTest { val params = PreferencesEntryPoint.Params( initialElement = PreferencesEntryPoint.InitialTarget.NotificationSettings, ) - val result = with(parentNode) { - entryPoint.createNode( - buildContext = BuildContext.root(null), - params = params, - callback = callback, - ) - } + val result = entryPoint.createNode( + parentNode = parentNode, + buildContext = BuildContext.root(null), + params = params, + callback = callback, + ) assertThat(result).isInstanceOf(PreferencesFlowNode::class.java) assertThat(result.plugins).contains(params) assertThat(result.plugins).contains(callback) diff --git a/features/rageshake/api/src/main/kotlin/io/element/android/features/rageshake/api/bugreport/BugReportEntryPoint.kt b/features/rageshake/api/src/main/kotlin/io/element/android/features/rageshake/api/bugreport/BugReportEntryPoint.kt index a8fbf56b75..df6de4746e 100644 --- a/features/rageshake/api/src/main/kotlin/io/element/android/features/rageshake/api/bugreport/BugReportEntryPoint.kt +++ b/features/rageshake/api/src/main/kotlin/io/element/android/features/rageshake/api/bugreport/BugReportEntryPoint.kt @@ -13,8 +13,11 @@ import com.bumble.appyx.core.plugin.Plugin import io.element.android.libraries.architecture.FeatureEntryPoint interface BugReportEntryPoint : FeatureEntryPoint { - context(parentNode: Node) - fun createNode(buildContext: BuildContext, callback: Callback): Node + fun createNode( + parentNode: Node, + buildContext: BuildContext, + callback: Callback, + ): Node interface Callback : Plugin { fun onDone() diff --git a/features/rageshake/impl/src/main/kotlin/io/element/android/features/rageshake/impl/bugreport/BugReportFlowNode.kt b/features/rageshake/impl/src/main/kotlin/io/element/android/features/rageshake/impl/bugreport/BugReportFlowNode.kt index af0c06054f..8749199fd1 100644 --- a/features/rageshake/impl/src/main/kotlin/io/element/android/features/rageshake/impl/bugreport/BugReportFlowNode.kt +++ b/features/rageshake/impl/src/main/kotlin/io/element/android/features/rageshake/impl/bugreport/BugReportFlowNode.kt @@ -78,6 +78,7 @@ class BugReportFlowNode( rootPath = navTarget.rootPath, ) viewFolderEntryPoint.createNode( + parentNode = this, buildContext = buildContext, params = params, callback = callback, diff --git a/features/rageshake/impl/src/main/kotlin/io/element/android/features/rageshake/impl/bugreport/DefaultBugReportEntryPoint.kt b/features/rageshake/impl/src/main/kotlin/io/element/android/features/rageshake/impl/bugreport/DefaultBugReportEntryPoint.kt index ffdaf41167..e094c62244 100644 --- a/features/rageshake/impl/src/main/kotlin/io/element/android/features/rageshake/impl/bugreport/DefaultBugReportEntryPoint.kt +++ b/features/rageshake/impl/src/main/kotlin/io/element/android/features/rageshake/impl/bugreport/DefaultBugReportEntryPoint.kt @@ -16,8 +16,11 @@ import io.element.android.libraries.architecture.createNode @ContributesBinding(AppScope::class) class DefaultBugReportEntryPoint : BugReportEntryPoint { - context(parentNode: Node) - override fun createNode(buildContext: BuildContext, callback: BugReportEntryPoint.Callback): Node { + override fun createNode( + parentNode: Node, + buildContext: BuildContext, + callback: BugReportEntryPoint.Callback, + ): Node { return parentNode.createNode(buildContext, listOf(callback)) } } diff --git a/features/rageshake/impl/src/test/kotlin/io/element/android/features/rageshake/impl/bugreport/DefaultBugReportEntryPointTest.kt b/features/rageshake/impl/src/test/kotlin/io/element/android/features/rageshake/impl/bugreport/DefaultBugReportEntryPointTest.kt index da3e2e8982..fb59100c43 100644 --- a/features/rageshake/impl/src/test/kotlin/io/element/android/features/rageshake/impl/bugreport/DefaultBugReportEntryPointTest.kt +++ b/features/rageshake/impl/src/test/kotlin/io/element/android/features/rageshake/impl/bugreport/DefaultBugReportEntryPointTest.kt @@ -39,12 +39,11 @@ class DefaultBugReportEntryPointTest { val callback = object : BugReportEntryPoint.Callback { override fun onDone() = lambdaError() } - val result = with(parentNode) { - entryPoint.createNode( - buildContext = BuildContext.root(null), - callback = callback, - ) - } + val result = entryPoint.createNode( + parentNode = parentNode, + buildContext = BuildContext.root(null), + callback = callback, + ) assertThat(result).isInstanceOf(BugReportFlowNode::class.java) assertThat(result.plugins).contains(callback) } diff --git a/features/reportroom/api/src/main/kotlin/io/element/android/features/reportroom/api/ReportRoomEntryPoint.kt b/features/reportroom/api/src/main/kotlin/io/element/android/features/reportroom/api/ReportRoomEntryPoint.kt index 27d8fea348..28536d9412 100644 --- a/features/reportroom/api/src/main/kotlin/io/element/android/features/reportroom/api/ReportRoomEntryPoint.kt +++ b/features/reportroom/api/src/main/kotlin/io/element/android/features/reportroom/api/ReportRoomEntryPoint.kt @@ -13,6 +13,9 @@ import io.element.android.libraries.architecture.FeatureEntryPoint import io.element.android.libraries.matrix.api.core.RoomId fun interface ReportRoomEntryPoint : FeatureEntryPoint { - context(parentNode: Node) - fun createNode(buildContext: BuildContext, roomId: RoomId): Node + fun createNode( + parentNode: Node, + buildContext: BuildContext, + roomId: RoomId, + ): Node } diff --git a/features/reportroom/impl/src/main/kotlin/io/element/android/features/reportroom/impl/DefaultReportRoomEntryPoint.kt b/features/reportroom/impl/src/main/kotlin/io/element/android/features/reportroom/impl/DefaultReportRoomEntryPoint.kt index a97f93d79e..7babf80e39 100644 --- a/features/reportroom/impl/src/main/kotlin/io/element/android/features/reportroom/impl/DefaultReportRoomEntryPoint.kt +++ b/features/reportroom/impl/src/main/kotlin/io/element/android/features/reportroom/impl/DefaultReportRoomEntryPoint.kt @@ -17,8 +17,11 @@ import io.element.android.libraries.matrix.api.core.RoomId @ContributesBinding(AppScope::class) class DefaultReportRoomEntryPoint : ReportRoomEntryPoint { - context(parentNode: Node) - override fun createNode(buildContext: BuildContext, roomId: RoomId): Node { + override fun createNode( + parentNode: Node, + buildContext: BuildContext, + roomId: RoomId, + ): Node { return parentNode.createNode(buildContext, plugins = listOf(ReportRoomNode.Inputs(roomId))) } } diff --git a/features/reportroom/impl/src/test/kotlin/io/element/android/features/reportroom/impl/DefaultReportRoomEntryPointTest.kt b/features/reportroom/impl/src/test/kotlin/io/element/android/features/reportroom/impl/DefaultReportRoomEntryPointTest.kt index 16cd8d298f..3de8a6c926 100644 --- a/features/reportroom/impl/src/test/kotlin/io/element/android/features/reportroom/impl/DefaultReportRoomEntryPointTest.kt +++ b/features/reportroom/impl/src/test/kotlin/io/element/android/features/reportroom/impl/DefaultReportRoomEntryPointTest.kt @@ -32,9 +32,11 @@ class DefaultReportRoomEntryPointTest { } ) } - val result = with(parentNode) { - entryPoint.createNode(BuildContext.root(null), A_ROOM_ID) - } + val result = entryPoint.createNode( + parentNode = parentNode, + buildContext = BuildContext.root(null), + roomId = A_ROOM_ID, + ) assertThat(result).isInstanceOf(ReportRoomNode::class.java) assertThat(result.plugins).contains(ReportRoomNode.Inputs(A_ROOM_ID)) } diff --git a/features/reportroom/test/src/main/kotlin/io/element/android/features/reportroom/test/FakeReportRoomEntryPoint.kt b/features/reportroom/test/src/main/kotlin/io/element/android/features/reportroom/test/FakeReportRoomEntryPoint.kt index 0129686ff0..0ff0a3ed89 100644 --- a/features/reportroom/test/src/main/kotlin/io/element/android/features/reportroom/test/FakeReportRoomEntryPoint.kt +++ b/features/reportroom/test/src/main/kotlin/io/element/android/features/reportroom/test/FakeReportRoomEntryPoint.kt @@ -14,8 +14,11 @@ import io.element.android.libraries.matrix.api.core.RoomId import io.element.android.tests.testutils.lambda.lambdaError class FakeReportRoomEntryPoint : ReportRoomEntryPoint { - context(parentNode: Node) - override fun createNode(buildContext: BuildContext, roomId: RoomId): Node { + override fun createNode( + parentNode: Node, + buildContext: BuildContext, + roomId: RoomId, + ): Node { lambdaError() } } diff --git a/features/roomaliasresolver/api/src/main/kotlin/io/element/android/features/roomaliasesolver/api/RoomAliasResolverEntryPoint.kt b/features/roomaliasresolver/api/src/main/kotlin/io/element/android/features/roomaliasesolver/api/RoomAliasResolverEntryPoint.kt index 067eed7d65..1bdde018e0 100644 --- a/features/roomaliasresolver/api/src/main/kotlin/io/element/android/features/roomaliasesolver/api/RoomAliasResolverEntryPoint.kt +++ b/features/roomaliasresolver/api/src/main/kotlin/io/element/android/features/roomaliasesolver/api/RoomAliasResolverEntryPoint.kt @@ -16,8 +16,12 @@ import io.element.android.libraries.matrix.api.core.RoomAlias import io.element.android.libraries.matrix.api.room.alias.ResolvedRoomAlias interface RoomAliasResolverEntryPoint : FeatureEntryPoint { - context(parentNode: Node) - fun createNode(buildContext: BuildContext, params: Params, callback: Callback): Node + fun createNode( + parentNode: Node, + buildContext: BuildContext, + params: Params, + callback: Callback, + ): Node interface Callback : Plugin { fun onAliasResolved(data: ResolvedRoomAlias) diff --git a/features/roomaliasresolver/impl/src/main/kotlin/io/element/android/features/roomaliasresolver/impl/DefaultRoomAliasResolverEntryPoint.kt b/features/roomaliasresolver/impl/src/main/kotlin/io/element/android/features/roomaliasresolver/impl/DefaultRoomAliasResolverEntryPoint.kt index 405317d303..b6e4fe6716 100644 --- a/features/roomaliasresolver/impl/src/main/kotlin/io/element/android/features/roomaliasresolver/impl/DefaultRoomAliasResolverEntryPoint.kt +++ b/features/roomaliasresolver/impl/src/main/kotlin/io/element/android/features/roomaliasresolver/impl/DefaultRoomAliasResolverEntryPoint.kt @@ -16,8 +16,8 @@ import io.element.android.libraries.architecture.createNode @ContributesBinding(AppScope::class) class DefaultRoomAliasResolverEntryPoint : RoomAliasResolverEntryPoint { - context(parentNode: Node) override fun createNode( + parentNode: Node, buildContext: BuildContext, params: RoomAliasResolverEntryPoint.Params, callback: RoomAliasResolverEntryPoint.Callback, diff --git a/features/roomaliasresolver/impl/src/test/kotlin/io/element/android/features/roomaliasresolver/impl/DefaultRoomAliasResolverEntryPointTest.kt b/features/roomaliasresolver/impl/src/test/kotlin/io/element/android/features/roomaliasresolver/impl/DefaultRoomAliasResolverEntryPointTest.kt index f7cc1d57c6..6e3dbb2ba8 100644 --- a/features/roomaliasresolver/impl/src/test/kotlin/io/element/android/features/roomaliasresolver/impl/DefaultRoomAliasResolverEntryPointTest.kt +++ b/features/roomaliasresolver/impl/src/test/kotlin/io/element/android/features/roomaliasresolver/impl/DefaultRoomAliasResolverEntryPointTest.kt @@ -43,13 +43,12 @@ class DefaultRoomAliasResolverEntryPointTest { val params = RoomAliasResolverEntryPoint.Params( roomAlias = A_ROOM_ALIAS ) - val result = with(parentNode) { - entryPoint.createNode( - buildContext = BuildContext.root(null), - params = params, - callback = callback, - ) - } + val result = entryPoint.createNode( + parentNode = parentNode, + buildContext = BuildContext.root(null), + params = params, + callback = callback, + ) assertThat(result).isInstanceOf(RoomAliasResolverNode::class.java) assertThat(result.plugins).contains(params) assertThat(result.plugins).contains(callback) diff --git a/features/roomdetails/api/src/main/kotlin/io/element/android/features/roomdetails/api/RoomDetailsEntryPoint.kt b/features/roomdetails/api/src/main/kotlin/io/element/android/features/roomdetails/api/RoomDetailsEntryPoint.kt index ce03aca20a..3a690ddea6 100644 --- a/features/roomdetails/api/src/main/kotlin/io/element/android/features/roomdetails/api/RoomDetailsEntryPoint.kt +++ b/features/roomdetails/api/src/main/kotlin/io/element/android/features/roomdetails/api/RoomDetailsEntryPoint.kt @@ -43,6 +43,10 @@ interface RoomDetailsEntryPoint : FeatureEntryPoint { fun startForwardEventFlow(eventId: EventId) } - context(parentNode: Node) - fun createNode(buildContext: BuildContext, params: Params, callback: Callback): Node + fun createNode( + parentNode: Node, + buildContext: BuildContext, + params: Params, + callback: Callback, + ): Node } diff --git a/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/DefaultRoomDetailsEntryPoint.kt b/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/DefaultRoomDetailsEntryPoint.kt index 4f2fb1d741..8066cc70f5 100644 --- a/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/DefaultRoomDetailsEntryPoint.kt +++ b/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/DefaultRoomDetailsEntryPoint.kt @@ -18,8 +18,8 @@ import io.element.android.libraries.architecture.createNode @ContributesBinding(AppScope::class) class DefaultRoomDetailsEntryPoint : RoomDetailsEntryPoint { - context(parentNode: Node) override fun createNode( + parentNode: Node, buildContext: BuildContext, params: RoomDetailsEntryPoint.Params, callback: RoomDetailsEntryPoint.Callback, diff --git a/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/RoomDetailsFlowNode.kt b/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/RoomDetailsFlowNode.kt index f5e1307d72..d31adaae8d 100644 --- a/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/RoomDetailsFlowNode.kt +++ b/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/RoomDetailsFlowNode.kt @@ -308,13 +308,14 @@ class RoomDetailsFlowNode( avatarUrl = navTarget.avatarUrl, ) mediaViewerEntryPoint.createNode( + parentNode = this, buildContext = buildContext, params = params, callback = callback, ) } is NavTarget.PollHistory -> { - pollHistoryEntryPoint.createNode(buildContext) + pollHistoryEntryPoint.createNode(this, buildContext) } is NavTarget.MediaGallery -> { val callback = object : MediaGalleryEntryPoint.Callback { @@ -335,6 +336,7 @@ class RoomDetailsFlowNode( } } mediaGalleryEntryPoint.createNode( + parentNode = this, buildContext = buildContext, callback = callback, ) @@ -365,13 +367,14 @@ class RoomDetailsFlowNode( } } return messagesEntryPoint.createNode( + parentNode = this, buildContext = buildContext, params = params, callback = callback, ) } NavTarget.KnockRequestsList -> { - knockRequestsListEntryPoint.createNode(buildContext) + knockRequestsListEntryPoint.createNode(this, buildContext) } NavTarget.SecurityAndPrivacy -> { createNode(buildContext) @@ -382,6 +385,7 @@ class RoomDetailsFlowNode( verificationRequest = VerificationRequest.Outgoing.User(userId = navTarget.userId) ) outgoingVerificationEntryPoint.createNode( + parentNode = this, buildContext = buildContext, params = params, callback = object : OutgoingVerificationEntryPoint.Callback { @@ -400,11 +404,16 @@ class RoomDetailsFlowNode( ) } is NavTarget.ReportRoom -> { - reportRoomEntryPoint.createNode(buildContext, room.roomId) + reportRoomEntryPoint.createNode( + parentNode = this, + buildContext = buildContext, + roomId = room.roomId, + ) } is NavTarget.SelectNewOwnersWhenLeaving -> { changeRoomMemberRolesEntryPoint.createNode( + parentNode = this, buildContext = buildContext, room = room, listType = ChangeRoomMemberRolesListType.SelectNewOwnersWhenLeaving, diff --git a/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/rolesandpermissions/RolesAndPermissionsFlowNode.kt b/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/rolesandpermissions/RolesAndPermissionsFlowNode.kt index c923c57f50..b2b7d46780 100644 --- a/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/rolesandpermissions/RolesAndPermissionsFlowNode.kt +++ b/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/rolesandpermissions/RolesAndPermissionsFlowNode.kt @@ -102,6 +102,7 @@ class RolesAndPermissionsFlowNode( } is NavTarget.AdminList -> { changeRoomMemberRolesEntryPoint.createNode( + parentNode = this, buildContext = buildContext, room = joinedRoom, listType = ChangeRoomMemberRolesListType.Admins, @@ -109,6 +110,7 @@ class RolesAndPermissionsFlowNode( } is NavTarget.ModeratorList -> { changeRoomMemberRolesEntryPoint.createNode( + parentNode = this, buildContext = buildContext, room = joinedRoom, listType = ChangeRoomMemberRolesListType.Moderators, diff --git a/features/roomdetails/impl/src/test/kotlin/io/element/android/features/roomdetails/impl/DefaultRoomDetailsEntryPointTest.kt b/features/roomdetails/impl/src/test/kotlin/io/element/android/features/roomdetails/impl/DefaultRoomDetailsEntryPointTest.kt index 0e542a96d6..ebe92332e8 100644 --- a/features/roomdetails/impl/src/test/kotlin/io/element/android/features/roomdetails/impl/DefaultRoomDetailsEntryPointTest.kt +++ b/features/roomdetails/impl/src/test/kotlin/io/element/android/features/roomdetails/impl/DefaultRoomDetailsEntryPointTest.kt @@ -69,13 +69,12 @@ class DefaultRoomDetailsEntryPointTest { val params = RoomDetailsEntryPoint.Params( initialElement = RoomDetailsEntryPoint.InitialTarget.RoomDetails, ) - val result = with(parentNode) { - entryPoint.createNode( - buildContext = BuildContext.root(null), - params = params, - callback = callback, - ) - } + val result = entryPoint.createNode( + parentNode = parentNode, + buildContext = BuildContext.root(null), + params = params, + callback = callback, + ) assertThat(result).isInstanceOf(RoomDetailsFlowNode::class.java) assertThat(result.plugins).contains(params) assertThat(result.plugins).contains(callback) diff --git a/features/roomdirectory/api/src/main/kotlin/io/element/android/features/roomdirectory/api/RoomDirectoryEntryPoint.kt b/features/roomdirectory/api/src/main/kotlin/io/element/android/features/roomdirectory/api/RoomDirectoryEntryPoint.kt index d290287c2c..c3cb8a199b 100644 --- a/features/roomdirectory/api/src/main/kotlin/io/element/android/features/roomdirectory/api/RoomDirectoryEntryPoint.kt +++ b/features/roomdirectory/api/src/main/kotlin/io/element/android/features/roomdirectory/api/RoomDirectoryEntryPoint.kt @@ -13,8 +13,11 @@ import com.bumble.appyx.core.plugin.Plugin import io.element.android.libraries.architecture.FeatureEntryPoint interface RoomDirectoryEntryPoint : FeatureEntryPoint { - context(parentNode: Node) - fun createNode(buildContext: BuildContext, callback: Callback): Node + fun createNode( + parentNode: Node, + buildContext: BuildContext, + callback: Callback, + ): Node interface Callback : Plugin { fun navigateToRoom(roomDescription: RoomDescription) diff --git a/features/roomdirectory/impl/src/main/kotlin/io/element/android/features/roomdirectory/impl/DefaultRoomDirectoryEntryPoint.kt b/features/roomdirectory/impl/src/main/kotlin/io/element/android/features/roomdirectory/impl/DefaultRoomDirectoryEntryPoint.kt index 55804d3f68..48211d7f59 100644 --- a/features/roomdirectory/impl/src/main/kotlin/io/element/android/features/roomdirectory/impl/DefaultRoomDirectoryEntryPoint.kt +++ b/features/roomdirectory/impl/src/main/kotlin/io/element/android/features/roomdirectory/impl/DefaultRoomDirectoryEntryPoint.kt @@ -17,8 +17,11 @@ import io.element.android.libraries.architecture.createNode @ContributesBinding(AppScope::class) class DefaultRoomDirectoryEntryPoint : RoomDirectoryEntryPoint { - context(parentNode: Node) - override fun createNode(buildContext: BuildContext, callback: RoomDirectoryEntryPoint.Callback): Node { + override fun createNode( + parentNode: Node, + buildContext: BuildContext, + callback: RoomDirectoryEntryPoint.Callback, + ): Node { return parentNode.createNode(buildContext, listOf(callback)) } } diff --git a/features/roomdirectory/impl/src/test/kotlin/io/element/android/features/roomdirectory/impl/DefaultRoomDirectoryEntryPointTest.kt b/features/roomdirectory/impl/src/test/kotlin/io/element/android/features/roomdirectory/impl/DefaultRoomDirectoryEntryPointTest.kt index 332c89b2ae..24205d6681 100644 --- a/features/roomdirectory/impl/src/test/kotlin/io/element/android/features/roomdirectory/impl/DefaultRoomDirectoryEntryPointTest.kt +++ b/features/roomdirectory/impl/src/test/kotlin/io/element/android/features/roomdirectory/impl/DefaultRoomDirectoryEntryPointTest.kt @@ -37,12 +37,11 @@ class DefaultRoomDirectoryEntryPointTest { val callback = object : RoomDirectoryEntryPoint.Callback { override fun navigateToRoom(roomDescription: RoomDescription) = lambdaError() } - val result = with(parentNode) { - entryPoint.createNode( - buildContext = BuildContext.root(null), - callback = callback, - ) - } + val result = entryPoint.createNode( + parentNode = parentNode, + buildContext = BuildContext.root(null), + callback = callback, + ) assertThat(result).isInstanceOf(RoomDirectoryNode::class.java) assertThat(result.plugins).contains(callback) } diff --git a/features/securebackup/api/src/main/kotlin/io/element/android/features/securebackup/api/SecureBackupEntryPoint.kt b/features/securebackup/api/src/main/kotlin/io/element/android/features/securebackup/api/SecureBackupEntryPoint.kt index dbaa319034..cb1af18f24 100644 --- a/features/securebackup/api/src/main/kotlin/io/element/android/features/securebackup/api/SecureBackupEntryPoint.kt +++ b/features/securebackup/api/src/main/kotlin/io/element/android/features/securebackup/api/SecureBackupEntryPoint.kt @@ -32,8 +32,12 @@ interface SecureBackupEntryPoint : FeatureEntryPoint { data class Params(val initialElement: InitialTarget) : NodeInputs - context(parentNode: Node) - fun createNode(buildContext: BuildContext, params: Params, callback: Callback): Node + fun createNode( + parentNode: Node, + buildContext: BuildContext, + params: Params, + callback: Callback, + ): Node interface Callback : Plugin { fun onDone() diff --git a/features/securebackup/impl/src/main/kotlin/io/element/android/features/securebackup/impl/DefaultSecureBackupEntryPoint.kt b/features/securebackup/impl/src/main/kotlin/io/element/android/features/securebackup/impl/DefaultSecureBackupEntryPoint.kt index 49ea66dc79..b2c533b53b 100644 --- a/features/securebackup/impl/src/main/kotlin/io/element/android/features/securebackup/impl/DefaultSecureBackupEntryPoint.kt +++ b/features/securebackup/impl/src/main/kotlin/io/element/android/features/securebackup/impl/DefaultSecureBackupEntryPoint.kt @@ -16,8 +16,8 @@ import io.element.android.libraries.architecture.createNode @ContributesBinding(AppScope::class) class DefaultSecureBackupEntryPoint : SecureBackupEntryPoint { - context(parentNode: Node) override fun createNode( + parentNode: Node, buildContext: BuildContext, params: SecureBackupEntryPoint.Params, callback: SecureBackupEntryPoint.Callback, diff --git a/features/securebackup/impl/src/test/kotlin/io/element/android/features/securebackup/impl/DefaultSecureBackupEntryPointTest.kt b/features/securebackup/impl/src/test/kotlin/io/element/android/features/securebackup/impl/DefaultSecureBackupEntryPointTest.kt index 7a4c096bfc..04d0030753 100644 --- a/features/securebackup/impl/src/test/kotlin/io/element/android/features/securebackup/impl/DefaultSecureBackupEntryPointTest.kt +++ b/features/securebackup/impl/src/test/kotlin/io/element/android/features/securebackup/impl/DefaultSecureBackupEntryPointTest.kt @@ -37,13 +37,12 @@ class DefaultSecureBackupEntryPointTest { override fun onDone() = lambdaError() } val params = SecureBackupEntryPoint.Params(SecureBackupEntryPoint.InitialTarget.ResetIdentity) - val result = with(parentNode) { - entryPoint.createNode( - buildContext = BuildContext.root(null), - params = params, - callback = callback, - ) - } + val result = entryPoint.createNode( + parentNode = parentNode, + buildContext = BuildContext.root(null), + params = params, + callback = callback, + ) assertThat(result).isInstanceOf(SecureBackupFlowNode::class.java) assertThat(result.plugins).contains(params) assertThat(result.plugins).contains(callback) diff --git a/features/share/api/src/main/kotlin/io/element/android/features/share/api/ShareEntryPoint.kt b/features/share/api/src/main/kotlin/io/element/android/features/share/api/ShareEntryPoint.kt index fadd584355..baab6d3d5c 100644 --- a/features/share/api/src/main/kotlin/io/element/android/features/share/api/ShareEntryPoint.kt +++ b/features/share/api/src/main/kotlin/io/element/android/features/share/api/ShareEntryPoint.kt @@ -17,8 +17,12 @@ import io.element.android.libraries.matrix.api.core.RoomId interface ShareEntryPoint : FeatureEntryPoint { data class Params(val intent: Intent) - context(parentNode: Node) - fun createNode(buildContext: BuildContext, params: Params, callback: Callback): Node + fun createNode( + parentNode: Node, + buildContext: BuildContext, + params: Params, + callback: Callback, + ): Node interface Callback : Plugin { fun onDone(roomIds: List) diff --git a/features/share/impl/src/main/kotlin/io/element/android/features/share/impl/DefaultShareEntryPoint.kt b/features/share/impl/src/main/kotlin/io/element/android/features/share/impl/DefaultShareEntryPoint.kt index 6df01558e5..a283bf9d78 100644 --- a/features/share/impl/src/main/kotlin/io/element/android/features/share/impl/DefaultShareEntryPoint.kt +++ b/features/share/impl/src/main/kotlin/io/element/android/features/share/impl/DefaultShareEntryPoint.kt @@ -16,8 +16,12 @@ import io.element.android.libraries.di.SessionScope @ContributesBinding(SessionScope::class) class DefaultShareEntryPoint : ShareEntryPoint { - context(parentNode: Node) - override fun createNode(buildContext: BuildContext, params: ShareEntryPoint.Params, callback: ShareEntryPoint.Callback): Node { + override fun createNode( + parentNode: Node, + buildContext: BuildContext, + params: ShareEntryPoint.Params, + callback: ShareEntryPoint.Callback, + ): Node { return parentNode.createNode( buildContext = buildContext, plugins = listOf( diff --git a/features/share/impl/src/main/kotlin/io/element/android/features/share/impl/ShareNode.kt b/features/share/impl/src/main/kotlin/io/element/android/features/share/impl/ShareNode.kt index b3ce268d6c..977211ca05 100644 --- a/features/share/impl/src/main/kotlin/io/element/android/features/share/impl/ShareNode.kt +++ b/features/share/impl/src/main/kotlin/io/element/android/features/share/impl/ShareNode.kt @@ -67,6 +67,7 @@ class ShareNode( } return roomSelectEntryPoint.createNode( + parentNode = this, buildContext = buildContext, params = RoomSelectEntryPoint.Params(mode = RoomSelectMode.Share), callback = callback, diff --git a/features/share/impl/src/test/kotlin/io/element/android/features/share/impl/DefaultShareEntryPointTest.kt b/features/share/impl/src/test/kotlin/io/element/android/features/share/impl/DefaultShareEntryPointTest.kt index bdbeb37d40..e3d39cf47a 100644 --- a/features/share/impl/src/test/kotlin/io/element/android/features/share/impl/DefaultShareEntryPointTest.kt +++ b/features/share/impl/src/test/kotlin/io/element/android/features/share/impl/DefaultShareEntryPointTest.kt @@ -45,13 +45,12 @@ class DefaultShareEntryPointTest { val params = ShareEntryPoint.Params( intent = Intent(), ) - val result = with(parentNode) { - entryPoint.createNode( - buildContext = BuildContext.root(null), - params = params, - callback = callback, - ) - } + val result = entryPoint.createNode( + parentNode = parentNode, + buildContext = BuildContext.root(null), + params = params, + callback = callback, + ) assertThat(result).isInstanceOf(ShareNode::class.java) assertThat(result.plugins).contains(ShareNode.Inputs(params.intent)) assertThat(result.plugins).contains(callback) diff --git a/features/signedout/api/src/main/kotlin/io/element/android/features/signedout/api/SignedOutEntryPoint.kt b/features/signedout/api/src/main/kotlin/io/element/android/features/signedout/api/SignedOutEntryPoint.kt index 442ad1ef7d..e0af9f491f 100644 --- a/features/signedout/api/src/main/kotlin/io/element/android/features/signedout/api/SignedOutEntryPoint.kt +++ b/features/signedout/api/src/main/kotlin/io/element/android/features/signedout/api/SignedOutEntryPoint.kt @@ -17,6 +17,9 @@ interface SignedOutEntryPoint : FeatureEntryPoint { val sessionId: SessionId, ) - context(parentNode: Node) - fun createNode(buildContext: BuildContext, params: Params): Node + fun createNode( + parentNode: Node, + buildContext: BuildContext, + params: Params, + ): Node } diff --git a/features/signedout/impl/src/main/kotlin/io/element/android/features/signedout/impl/DefaultSignedOutEntryPoint.kt b/features/signedout/impl/src/main/kotlin/io/element/android/features/signedout/impl/DefaultSignedOutEntryPoint.kt index d25dbf26ad..7026f0081b 100644 --- a/features/signedout/impl/src/main/kotlin/io/element/android/features/signedout/impl/DefaultSignedOutEntryPoint.kt +++ b/features/signedout/impl/src/main/kotlin/io/element/android/features/signedout/impl/DefaultSignedOutEntryPoint.kt @@ -16,8 +16,11 @@ import io.element.android.libraries.architecture.createNode @ContributesBinding(AppScope::class) class DefaultSignedOutEntryPoint : SignedOutEntryPoint { - context(parentNode: Node) - override fun createNode(buildContext: BuildContext, params: SignedOutEntryPoint.Params): Node { + override fun createNode( + parentNode: Node, + buildContext: BuildContext, + params: SignedOutEntryPoint.Params, + ): Node { return parentNode.createNode( buildContext = buildContext, plugins = listOf(SignedOutNode.Inputs(params.sessionId)) diff --git a/features/signedout/impl/src/test/kotlin/io/element/android/features/signedout/impl/DefaultSignedOutEntryPointTest.kt b/features/signedout/impl/src/test/kotlin/io/element/android/features/signedout/impl/DefaultSignedOutEntryPointTest.kt index b6ef121c47..64c48d9a5f 100644 --- a/features/signedout/impl/src/test/kotlin/io/element/android/features/signedout/impl/DefaultSignedOutEntryPointTest.kt +++ b/features/signedout/impl/src/test/kotlin/io/element/android/features/signedout/impl/DefaultSignedOutEntryPointTest.kt @@ -34,12 +34,11 @@ class DefaultSignedOutEntryPointTest { ) } val params = SignedOutEntryPoint.Params(A_SESSION_ID) - val result = with(parentNode) { - entryPoint.createNode( - buildContext = BuildContext.root(null), - params = params, - ) - } + val result = entryPoint.createNode( + parentNode = parentNode, + buildContext = BuildContext.root(null), + params = params, + ) assertThat(result).isInstanceOf(SignedOutNode::class.java) assertThat(result.plugins).contains(SignedOutNode.Inputs(params.sessionId)) } diff --git a/features/space/api/src/main/kotlin/io/element/android/features/space/api/SpaceEntryPoint.kt b/features/space/api/src/main/kotlin/io/element/android/features/space/api/SpaceEntryPoint.kt index d4d6f8d97b..6b5bd7f892 100644 --- a/features/space/api/src/main/kotlin/io/element/android/features/space/api/SpaceEntryPoint.kt +++ b/features/space/api/src/main/kotlin/io/element/android/features/space/api/SpaceEntryPoint.kt @@ -15,8 +15,8 @@ import io.element.android.libraries.architecture.NodeInputs import io.element.android.libraries.matrix.api.core.RoomId interface SpaceEntryPoint : FeatureEntryPoint { - context(parentNode: Node) fun createNode( + parentNode: Node, buildContext: BuildContext, inputs: Inputs, callback: Callback diff --git a/features/space/impl/src/main/kotlin/io/element/android/features/space/impl/DefaultSpaceEntryPoint.kt b/features/space/impl/src/main/kotlin/io/element/android/features/space/impl/DefaultSpaceEntryPoint.kt index 8ceafc6ffb..4d30503b80 100644 --- a/features/space/impl/src/main/kotlin/io/element/android/features/space/impl/DefaultSpaceEntryPoint.kt +++ b/features/space/impl/src/main/kotlin/io/element/android/features/space/impl/DefaultSpaceEntryPoint.kt @@ -16,8 +16,12 @@ import io.element.android.libraries.di.SessionScope @ContributesBinding(SessionScope::class) class DefaultSpaceEntryPoint : SpaceEntryPoint { - context(parentNode: Node) - override fun createNode(buildContext: BuildContext, inputs: SpaceEntryPoint.Inputs, callback: SpaceEntryPoint.Callback): Node { + override fun createNode( + parentNode: Node, + buildContext: BuildContext, + inputs: SpaceEntryPoint.Inputs, + callback: SpaceEntryPoint.Callback, + ): Node { return parentNode.createNode( buildContext = buildContext, plugins = listOf(inputs, callback), diff --git a/features/space/impl/src/test/kotlin/io/element/android/features/space/impl/DefaultSpaceEntryPointTest.kt b/features/space/impl/src/test/kotlin/io/element/android/features/space/impl/DefaultSpaceEntryPointTest.kt index 78931c4caf..3fd260dd4f 100644 --- a/features/space/impl/src/test/kotlin/io/element/android/features/space/impl/DefaultSpaceEntryPointTest.kt +++ b/features/space/impl/src/test/kotlin/io/element/android/features/space/impl/DefaultSpaceEntryPointTest.kt @@ -48,13 +48,12 @@ class DefaultSpaceEntryPointTest { override fun navigateToRoomDetails() = lambdaError() override fun navigateToRoomMemberList() = lambdaError() } - val result = with(parentNode) { - entryPoint.createNode( - buildContext = BuildContext.root(null), - inputs = nodeInputs, - callback = callback, - ) - } + val result = entryPoint.createNode( + parentNode = parentNode, + buildContext = BuildContext.root(null), + inputs = nodeInputs, + callback = callback, + ) assertThat(result).isInstanceOf(SpaceFlowNode::class.java) assertThat(result.plugins).contains(nodeInputs) assertThat(result.plugins).contains(callback) diff --git a/features/startchat/api/src/main/kotlin/io/element/android/features/startchat/api/StartChatEntryPoint.kt b/features/startchat/api/src/main/kotlin/io/element/android/features/startchat/api/StartChatEntryPoint.kt index 92376974ec..0e16e05967 100644 --- a/features/startchat/api/src/main/kotlin/io/element/android/features/startchat/api/StartChatEntryPoint.kt +++ b/features/startchat/api/src/main/kotlin/io/element/android/features/startchat/api/StartChatEntryPoint.kt @@ -14,8 +14,11 @@ import io.element.android.libraries.architecture.FeatureEntryPoint import io.element.android.libraries.matrix.api.core.RoomIdOrAlias interface StartChatEntryPoint : FeatureEntryPoint { - context(parentNode: Node) - fun createNode(buildContext: BuildContext, callback: Callback): Node + fun createNode( + parentNode: Node, + buildContext: BuildContext, + callback: Callback, + ): Node interface Callback : Plugin { fun onRoomCreated(roomIdOrAlias: RoomIdOrAlias, serverNames: List) diff --git a/features/startchat/impl/src/main/kotlin/io/element/android/features/startchat/impl/DefaultStartChatEntryPoint.kt b/features/startchat/impl/src/main/kotlin/io/element/android/features/startchat/impl/DefaultStartChatEntryPoint.kt index 043cd0df1c..fa28c882c7 100644 --- a/features/startchat/impl/src/main/kotlin/io/element/android/features/startchat/impl/DefaultStartChatEntryPoint.kt +++ b/features/startchat/impl/src/main/kotlin/io/element/android/features/startchat/impl/DefaultStartChatEntryPoint.kt @@ -16,8 +16,11 @@ import io.element.android.libraries.architecture.createNode @ContributesBinding(AppScope::class) class DefaultStartChatEntryPoint : StartChatEntryPoint { - context(parentNode: Node) - override fun createNode(buildContext: BuildContext, callback: StartChatEntryPoint.Callback): Node { + override fun createNode( + parentNode: Node, + buildContext: BuildContext, + callback: StartChatEntryPoint.Callback, + ): Node { return parentNode.createNode(buildContext, listOf(callback)) } } diff --git a/features/startchat/impl/src/main/kotlin/io/element/android/features/startchat/impl/StartChatFlowNode.kt b/features/startchat/impl/src/main/kotlin/io/element/android/features/startchat/impl/StartChatFlowNode.kt index e3c846895c..ee30f4997c 100644 --- a/features/startchat/impl/src/main/kotlin/io/element/android/features/startchat/impl/StartChatFlowNode.kt +++ b/features/startchat/impl/src/main/kotlin/io/element/android/features/startchat/impl/StartChatFlowNode.kt @@ -80,6 +80,7 @@ class StartChatFlowNode( } } createRoomEntryPoint.createNode( + parentNode = this, buildContext = buildContext, callback = callback, ) diff --git a/features/startchat/impl/src/test/kotlin/io/element/android/features/startchat/impl/DefaultStartChatEntryPointTest.kt b/features/startchat/impl/src/test/kotlin/io/element/android/features/startchat/impl/DefaultStartChatEntryPointTest.kt index e8644da700..1792567a87 100644 --- a/features/startchat/impl/src/test/kotlin/io/element/android/features/startchat/impl/DefaultStartChatEntryPointTest.kt +++ b/features/startchat/impl/src/test/kotlin/io/element/android/features/startchat/impl/DefaultStartChatEntryPointTest.kt @@ -40,12 +40,11 @@ class DefaultStartChatEntryPointTest { override fun onRoomCreated(roomIdOrAlias: RoomIdOrAlias, serverNames: List) = lambdaError() override fun navigateToRoomDirectory() = lambdaError() } - val result = with(parentNode) { - entryPoint.createNode( - buildContext = BuildContext.root(null), - callback = callback, - ) - } + val result = entryPoint.createNode( + parentNode = parentNode, + buildContext = BuildContext.root(null), + callback = callback, + ) assertThat(result).isInstanceOf(StartChatFlowNode::class.java) assertThat(result.plugins).contains(callback) } diff --git a/features/userprofile/api/src/main/kotlin/io/element/android/features/userprofile/api/UserProfileEntryPoint.kt b/features/userprofile/api/src/main/kotlin/io/element/android/features/userprofile/api/UserProfileEntryPoint.kt index d9ab4ff9e5..ef3b0afeaa 100644 --- a/features/userprofile/api/src/main/kotlin/io/element/android/features/userprofile/api/UserProfileEntryPoint.kt +++ b/features/userprofile/api/src/main/kotlin/io/element/android/features/userprofile/api/UserProfileEntryPoint.kt @@ -22,6 +22,10 @@ interface UserProfileEntryPoint : FeatureEntryPoint { fun navigateToRoom(roomId: RoomId) } - context(parentNode: Node) - fun createNode(buildContext: BuildContext, params: Params, callback: Callback): Node + fun createNode( + parentNode: Node, + buildContext: BuildContext, + params: Params, + callback: Callback, + ): Node } diff --git a/features/userprofile/impl/src/main/kotlin/io/element/android/features/userprofile/impl/DefaultUserProfileEntryPoint.kt b/features/userprofile/impl/src/main/kotlin/io/element/android/features/userprofile/impl/DefaultUserProfileEntryPoint.kt index 71353b2cb2..e69ef185c0 100644 --- a/features/userprofile/impl/src/main/kotlin/io/element/android/features/userprofile/impl/DefaultUserProfileEntryPoint.kt +++ b/features/userprofile/impl/src/main/kotlin/io/element/android/features/userprofile/impl/DefaultUserProfileEntryPoint.kt @@ -16,8 +16,8 @@ import io.element.android.libraries.architecture.createNode @ContributesBinding(AppScope::class) class DefaultUserProfileEntryPoint : UserProfileEntryPoint { - context(parentNode: Node) override fun createNode( + parentNode: Node, buildContext: BuildContext, params: UserProfileEntryPoint.Params, callback: UserProfileEntryPoint.Callback, diff --git a/features/userprofile/impl/src/main/kotlin/io/element/android/features/userprofile/impl/UserProfileFlowNode.kt b/features/userprofile/impl/src/main/kotlin/io/element/android/features/userprofile/impl/UserProfileFlowNode.kt index 187fe36b87..fd019c3587 100644 --- a/features/userprofile/impl/src/main/kotlin/io/element/android/features/userprofile/impl/UserProfileFlowNode.kt +++ b/features/userprofile/impl/src/main/kotlin/io/element/android/features/userprofile/impl/UserProfileFlowNode.kt @@ -112,6 +112,7 @@ class UserProfileFlowNode( avatarUrl = navTarget.avatarUrl, ) mediaViewerEntryPoint.createNode( + parentNode = this, buildContext = buildContext, params = params, callback = callback, @@ -123,6 +124,7 @@ class UserProfileFlowNode( verificationRequest = VerificationRequest.Outgoing.User(userId = navTarget.userId) ) outgoingVerificationEntryPoint.createNode( + parentNode = this, buildContext = buildContext, params = params, callback = object : OutgoingVerificationEntryPoint.Callback { diff --git a/features/userprofile/impl/src/test/kotlin/io/element/android/features/userprofile/impl/DefaultUserProfileEntryPointTest.kt b/features/userprofile/impl/src/test/kotlin/io/element/android/features/userprofile/impl/DefaultUserProfileEntryPointTest.kt index 520f2e39af..eca2b4b382 100644 --- a/features/userprofile/impl/src/test/kotlin/io/element/android/features/userprofile/impl/DefaultUserProfileEntryPointTest.kt +++ b/features/userprofile/impl/src/test/kotlin/io/element/android/features/userprofile/impl/DefaultUserProfileEntryPointTest.kt @@ -52,13 +52,12 @@ class DefaultUserProfileEntryPointTest { val params = UserProfileEntryPoint.Params( userId = A_USER_ID, ) - val result = with(parentNode) { - entryPoint.createNode( - buildContext = BuildContext.root(null), - params = params, - callback = callback, - ) - } + val result = entryPoint.createNode( + parentNode = parentNode, + buildContext = BuildContext.root(null), + params = params, + callback = callback, + ) assertThat(result).isInstanceOf(UserProfileFlowNode::class.java) assertThat(result.plugins).contains(params) assertThat(result.plugins).contains(callback) diff --git a/features/verifysession/api/src/main/kotlin/io/element/android/features/verifysession/api/IncomingVerificationEntryPoint.kt b/features/verifysession/api/src/main/kotlin/io/element/android/features/verifysession/api/IncomingVerificationEntryPoint.kt index c09b47e581..e6ea0ed687 100644 --- a/features/verifysession/api/src/main/kotlin/io/element/android/features/verifysession/api/IncomingVerificationEntryPoint.kt +++ b/features/verifysession/api/src/main/kotlin/io/element/android/features/verifysession/api/IncomingVerificationEntryPoint.kt @@ -19,8 +19,12 @@ interface IncomingVerificationEntryPoint : FeatureEntryPoint { val verificationRequest: VerificationRequest.Incoming, ) : NodeInputs - context(parentNode: Node) - fun createNode(buildContext: BuildContext, params: Params, callback: Callback): Node + fun createNode( + parentNode: Node, + buildContext: BuildContext, + params: Params, + callback: Callback, + ): Node interface Callback : Plugin { fun onDone() diff --git a/features/verifysession/api/src/main/kotlin/io/element/android/features/verifysession/api/OutgoingVerificationEntryPoint.kt b/features/verifysession/api/src/main/kotlin/io/element/android/features/verifysession/api/OutgoingVerificationEntryPoint.kt index 372426e0d8..f6c1f41a0b 100644 --- a/features/verifysession/api/src/main/kotlin/io/element/android/features/verifysession/api/OutgoingVerificationEntryPoint.kt +++ b/features/verifysession/api/src/main/kotlin/io/element/android/features/verifysession/api/OutgoingVerificationEntryPoint.kt @@ -20,8 +20,12 @@ interface OutgoingVerificationEntryPoint : FeatureEntryPoint { val verificationRequest: VerificationRequest.Outgoing, ) : NodeInputs - context(parentNode: Node) - fun createNode(buildContext: BuildContext, params: Params, callback: Callback): Node + fun createNode( + parentNode: Node, + buildContext: BuildContext, + params: Params, + callback: Callback, + ): Node interface Callback : Plugin { fun navigateToLearnMoreAboutEncryption() diff --git a/features/verifysession/impl/src/main/kotlin/io/element/android/features/verifysession/impl/incoming/DefaultIncomingVerificationEntryPoint.kt b/features/verifysession/impl/src/main/kotlin/io/element/android/features/verifysession/impl/incoming/DefaultIncomingVerificationEntryPoint.kt index 26f0597ca2..9d6d91c79a 100644 --- a/features/verifysession/impl/src/main/kotlin/io/element/android/features/verifysession/impl/incoming/DefaultIncomingVerificationEntryPoint.kt +++ b/features/verifysession/impl/src/main/kotlin/io/element/android/features/verifysession/impl/incoming/DefaultIncomingVerificationEntryPoint.kt @@ -16,8 +16,8 @@ import io.element.android.libraries.architecture.createNode @ContributesBinding(AppScope::class) class DefaultIncomingVerificationEntryPoint : IncomingVerificationEntryPoint { - context(parentNode: Node) override fun createNode( + parentNode: Node, buildContext: BuildContext, params: IncomingVerificationEntryPoint.Params, callback: IncomingVerificationEntryPoint.Callback, diff --git a/features/verifysession/impl/src/main/kotlin/io/element/android/features/verifysession/impl/outgoing/DefaultOutgoingVerificationEntryPoint.kt b/features/verifysession/impl/src/main/kotlin/io/element/android/features/verifysession/impl/outgoing/DefaultOutgoingVerificationEntryPoint.kt index ab29d152f4..3328b1df1e 100644 --- a/features/verifysession/impl/src/main/kotlin/io/element/android/features/verifysession/impl/outgoing/DefaultOutgoingVerificationEntryPoint.kt +++ b/features/verifysession/impl/src/main/kotlin/io/element/android/features/verifysession/impl/outgoing/DefaultOutgoingVerificationEntryPoint.kt @@ -16,8 +16,8 @@ import io.element.android.libraries.architecture.createNode @ContributesBinding(AppScope::class) class DefaultOutgoingVerificationEntryPoint : OutgoingVerificationEntryPoint { - context(parentNode: Node) override fun createNode( + parentNode: Node, buildContext: BuildContext, params: OutgoingVerificationEntryPoint.Params, callback: OutgoingVerificationEntryPoint.Callback, diff --git a/features/verifysession/impl/src/test/kotlin/io/element/android/features/verifysession/impl/incoming/DefaultIncomingVerificationEntryPointTest.kt b/features/verifysession/impl/src/test/kotlin/io/element/android/features/verifysession/impl/incoming/DefaultIncomingVerificationEntryPointTest.kt index 3a8743dccd..437657b811 100644 --- a/features/verifysession/impl/src/test/kotlin/io/element/android/features/verifysession/impl/incoming/DefaultIncomingVerificationEntryPointTest.kt +++ b/features/verifysession/impl/src/test/kotlin/io/element/android/features/verifysession/impl/incoming/DefaultIncomingVerificationEntryPointTest.kt @@ -37,13 +37,12 @@ class DefaultIncomingVerificationEntryPointTest { val params = IncomingVerificationEntryPoint.Params( verificationRequest = anIncomingSessionVerificationRequest() ) - val result = with(parentNode) { - entryPoint.createNode( - buildContext = BuildContext.root(null), - params = params, - callback = callback, - ) - } + val result = entryPoint.createNode( + parentNode = parentNode, + buildContext = BuildContext.root(null), + params = params, + callback = callback, + ) assertThat(result).isInstanceOf(IncomingVerificationNode::class.java) assertThat(result.plugins).contains(params) assertThat(result.plugins).contains(callback) diff --git a/features/verifysession/impl/src/test/kotlin/io/element/android/features/verifysession/impl/outgoing/DefaultOutgoingVerificationEntryPointTest.kt b/features/verifysession/impl/src/test/kotlin/io/element/android/features/verifysession/impl/outgoing/DefaultOutgoingVerificationEntryPointTest.kt index 1f9213a680..80906bc86a 100644 --- a/features/verifysession/impl/src/test/kotlin/io/element/android/features/verifysession/impl/outgoing/DefaultOutgoingVerificationEntryPointTest.kt +++ b/features/verifysession/impl/src/test/kotlin/io/element/android/features/verifysession/impl/outgoing/DefaultOutgoingVerificationEntryPointTest.kt @@ -42,13 +42,12 @@ class DefaultOutgoingVerificationEntryPointTest { showDeviceVerifiedScreen = true, verificationRequest = anOutgoingSessionVerificationRequest(), ) - val result = with(parentNode) { - entryPoint.createNode( - buildContext = BuildContext.root(null), - params = params, - callback = callback, - ) - } + val result = entryPoint.createNode( + parentNode = parentNode, + buildContext = BuildContext.root(null), + params = params, + callback = callback, + ) assertThat(result).isInstanceOf(OutgoingVerificationNode::class.java) assertThat(result.plugins).contains(params) assertThat(result.plugins).contains(callback) diff --git a/features/verifysession/test/src/main/kotlin/io/element/android/features/verifysession/test/FakeIncomingVerificationEntryPoint.kt b/features/verifysession/test/src/main/kotlin/io/element/android/features/verifysession/test/FakeIncomingVerificationEntryPoint.kt index 754d493996..1001c636e4 100644 --- a/features/verifysession/test/src/main/kotlin/io/element/android/features/verifysession/test/FakeIncomingVerificationEntryPoint.kt +++ b/features/verifysession/test/src/main/kotlin/io/element/android/features/verifysession/test/FakeIncomingVerificationEntryPoint.kt @@ -13,8 +13,8 @@ import io.element.android.features.verifysession.api.IncomingVerificationEntryPo import io.element.android.tests.testutils.lambda.lambdaError class FakeIncomingVerificationEntryPoint : IncomingVerificationEntryPoint { - context(parentNode: Node) override fun createNode( + parentNode: Node, buildContext: BuildContext, params: IncomingVerificationEntryPoint.Params, callback: IncomingVerificationEntryPoint.Callback, diff --git a/features/verifysession/test/src/main/kotlin/io/element/android/features/verifysession/test/FakeOutgoingVerificationEntryPoint.kt b/features/verifysession/test/src/main/kotlin/io/element/android/features/verifysession/test/FakeOutgoingVerificationEntryPoint.kt index 2d5491578e..8deca450cd 100644 --- a/features/verifysession/test/src/main/kotlin/io/element/android/features/verifysession/test/FakeOutgoingVerificationEntryPoint.kt +++ b/features/verifysession/test/src/main/kotlin/io/element/android/features/verifysession/test/FakeOutgoingVerificationEntryPoint.kt @@ -13,8 +13,8 @@ import io.element.android.features.verifysession.api.OutgoingVerificationEntryPo import io.element.android.tests.testutils.lambda.lambdaError class FakeOutgoingVerificationEntryPoint : OutgoingVerificationEntryPoint { - context(parentNode: Node) override fun createNode( + parentNode: Node, buildContext: BuildContext, params: OutgoingVerificationEntryPoint.Params, callback: OutgoingVerificationEntryPoint.Callback, diff --git a/features/viewfolder/api/src/main/kotlin/io/element/android/features/viewfolder/api/ViewFolderEntryPoint.kt b/features/viewfolder/api/src/main/kotlin/io/element/android/features/viewfolder/api/ViewFolderEntryPoint.kt index 97f6ffbf9e..9d756a4529 100644 --- a/features/viewfolder/api/src/main/kotlin/io/element/android/features/viewfolder/api/ViewFolderEntryPoint.kt +++ b/features/viewfolder/api/src/main/kotlin/io/element/android/features/viewfolder/api/ViewFolderEntryPoint.kt @@ -17,8 +17,12 @@ interface ViewFolderEntryPoint : FeatureEntryPoint { val rootPath: String, ) - context(parentNode: Node) - fun createNode(buildContext: BuildContext, params: Params, callback: Callback): Node + fun createNode( + parentNode: Node, + buildContext: BuildContext, + params: Params, + callback: Callback, + ): Node interface Callback : Plugin { fun onDone() diff --git a/features/viewfolder/impl/src/main/kotlin/io/element/android/features/viewfolder/impl/DefaultViewFolderEntryPoint.kt b/features/viewfolder/impl/src/main/kotlin/io/element/android/features/viewfolder/impl/DefaultViewFolderEntryPoint.kt index 8999b853a8..4261c17e72 100644 --- a/features/viewfolder/impl/src/main/kotlin/io/element/android/features/viewfolder/impl/DefaultViewFolderEntryPoint.kt +++ b/features/viewfolder/impl/src/main/kotlin/io/element/android/features/viewfolder/impl/DefaultViewFolderEntryPoint.kt @@ -17,8 +17,12 @@ import io.element.android.libraries.architecture.createNode @ContributesBinding(AppScope::class) class DefaultViewFolderEntryPoint : ViewFolderEntryPoint { - context(parentNode: Node) - override fun createNode(buildContext: BuildContext, params: ViewFolderEntryPoint.Params, callback: ViewFolderEntryPoint.Callback): Node { + override fun createNode( + parentNode: Node, + buildContext: BuildContext, + params: ViewFolderEntryPoint.Params, + callback: ViewFolderEntryPoint.Callback, + ): Node { return parentNode.createNode( buildContext = buildContext, plugins = listOf( diff --git a/features/viewfolder/impl/src/test/kotlin/io/element/android/features/viewfolder/impl/DefaultViewFolderEntryPointTest.kt b/features/viewfolder/impl/src/test/kotlin/io/element/android/features/viewfolder/impl/DefaultViewFolderEntryPointTest.kt index ae0f4b9f2e..a8e643e1f5 100644 --- a/features/viewfolder/impl/src/test/kotlin/io/element/android/features/viewfolder/impl/DefaultViewFolderEntryPointTest.kt +++ b/features/viewfolder/impl/src/test/kotlin/io/element/android/features/viewfolder/impl/DefaultViewFolderEntryPointTest.kt @@ -40,13 +40,12 @@ class DefaultViewFolderEntryPointTest { val params = ViewFolderEntryPoint.Params( rootPath = "path", ) - val result = with(parentNode) { - entryPoint.createNode( - buildContext = BuildContext.root(null), - params = params, - callback = callback, - ) - } + val result = entryPoint.createNode( + parentNode = parentNode, + buildContext = BuildContext.root(null), + params = params, + callback = callback, + ) assertThat(result).isInstanceOf(ViewFolderFlowNode::class.java) assertThat(result.plugins).contains(ViewFolderFlowNode.Inputs(params.rootPath)) assertThat(result.plugins).contains(callback) diff --git a/features/viewfolder/test/src/main/kotlin/io/element/android/features/viewfolder/test/FakeViewFolderEntryPoint.kt b/features/viewfolder/test/src/main/kotlin/io/element/android/features/viewfolder/test/FakeViewFolderEntryPoint.kt index 6b0ba721ad..da908bd925 100644 --- a/features/viewfolder/test/src/main/kotlin/io/element/android/features/viewfolder/test/FakeViewFolderEntryPoint.kt +++ b/features/viewfolder/test/src/main/kotlin/io/element/android/features/viewfolder/test/FakeViewFolderEntryPoint.kt @@ -13,8 +13,8 @@ import io.element.android.features.viewfolder.api.ViewFolderEntryPoint import io.element.android.tests.testutils.lambda.lambdaError class FakeViewFolderEntryPoint : ViewFolderEntryPoint { - context(parentNode: Node) override fun createNode( + parentNode: Node, buildContext: BuildContext, params: ViewFolderEntryPoint.Params, callback: ViewFolderEntryPoint.Callback, diff --git a/libraries/accountselect/api/src/main/kotlin/io/element/android/libraries/accountselect/api/AccountSelectEntryPoint.kt b/libraries/accountselect/api/src/main/kotlin/io/element/android/libraries/accountselect/api/AccountSelectEntryPoint.kt index bb2de92662..c68ec5d95b 100644 --- a/libraries/accountselect/api/src/main/kotlin/io/element/android/libraries/accountselect/api/AccountSelectEntryPoint.kt +++ b/libraries/accountselect/api/src/main/kotlin/io/element/android/libraries/accountselect/api/AccountSelectEntryPoint.kt @@ -14,8 +14,11 @@ import io.element.android.libraries.architecture.FeatureEntryPoint import io.element.android.libraries.matrix.api.core.SessionId interface AccountSelectEntryPoint : FeatureEntryPoint { - context(parentNode: Node) - fun createNode(buildContext: BuildContext, callback: Callback): Node + fun createNode( + parentNode: Node, + buildContext: BuildContext, + callback: Callback, + ): Node interface Callback : Plugin { fun onAccountSelected(sessionId: SessionId) diff --git a/libraries/accountselect/impl/src/main/kotlin/io/element/android/libraries/accountselect/impl/DefaultAccountSelectEntryPoint.kt b/libraries/accountselect/impl/src/main/kotlin/io/element/android/libraries/accountselect/impl/DefaultAccountSelectEntryPoint.kt index 9ecaaf5787..5b6381ce13 100644 --- a/libraries/accountselect/impl/src/main/kotlin/io/element/android/libraries/accountselect/impl/DefaultAccountSelectEntryPoint.kt +++ b/libraries/accountselect/impl/src/main/kotlin/io/element/android/libraries/accountselect/impl/DefaultAccountSelectEntryPoint.kt @@ -16,8 +16,11 @@ import io.element.android.libraries.architecture.createNode @ContributesBinding(AppScope::class) class DefaultAccountSelectEntryPoint : AccountSelectEntryPoint { - context(parentNode: Node) - override fun createNode(buildContext: BuildContext, callback: AccountSelectEntryPoint.Callback): Node { + override fun createNode( + parentNode: Node, + buildContext: BuildContext, + callback: AccountSelectEntryPoint.Callback, + ): Node { return parentNode.createNode(buildContext, listOf(callback)) } } diff --git a/libraries/accountselect/impl/src/test/kotlin/io/element/android/libraries/accountselect/impl/DefaultAccountSelectEntryPointTest.kt b/libraries/accountselect/impl/src/test/kotlin/io/element/android/libraries/accountselect/impl/DefaultAccountSelectEntryPointTest.kt index ae3ceb29c7..b36fcb5ab8 100644 --- a/libraries/accountselect/impl/src/test/kotlin/io/element/android/libraries/accountselect/impl/DefaultAccountSelectEntryPointTest.kt +++ b/libraries/accountselect/impl/src/test/kotlin/io/element/android/libraries/accountselect/impl/DefaultAccountSelectEntryPointTest.kt @@ -35,12 +35,11 @@ class DefaultAccountSelectEntryPointTest { override fun onAccountSelected(sessionId: SessionId) = lambdaError() override fun onCancel() = lambdaError() } - val result = with(parentNode) { - entryPoint.createNode( - buildContext = BuildContext.root(null), - callback = callback, - ) - } + val result = entryPoint.createNode( + parentNode = parentNode, + buildContext = BuildContext.root(null), + callback = callback, + ) assertThat(result).isInstanceOf(AccountSelectNode::class.java) assertThat(result.plugins).contains(callback) } diff --git a/libraries/architecture/src/main/kotlin/io/element/android/libraries/architecture/FeatureEntryPoint.kt b/libraries/architecture/src/main/kotlin/io/element/android/libraries/architecture/FeatureEntryPoint.kt index c8b0a00213..d5a932b705 100644 --- a/libraries/architecture/src/main/kotlin/io/element/android/libraries/architecture/FeatureEntryPoint.kt +++ b/libraries/architecture/src/main/kotlin/io/element/android/libraries/architecture/FeatureEntryPoint.kt @@ -19,6 +19,5 @@ interface FeatureEntryPoint * Can be used when the feature only exposes a simple node without the need of plugins. */ fun interface SimpleFeatureEntryPoint : FeatureEntryPoint { - context(parentNode: Node) - fun createNode(buildContext: BuildContext): Node + fun createNode(parentNode: Node, buildContext: BuildContext): Node } diff --git a/libraries/mediaviewer/api/src/main/kotlin/io/element/android/libraries/mediaviewer/api/MediaGalleryEntryPoint.kt b/libraries/mediaviewer/api/src/main/kotlin/io/element/android/libraries/mediaviewer/api/MediaGalleryEntryPoint.kt index b7257e4ed5..dd71f302d4 100644 --- a/libraries/mediaviewer/api/src/main/kotlin/io/element/android/libraries/mediaviewer/api/MediaGalleryEntryPoint.kt +++ b/libraries/mediaviewer/api/src/main/kotlin/io/element/android/libraries/mediaviewer/api/MediaGalleryEntryPoint.kt @@ -14,8 +14,11 @@ import io.element.android.libraries.architecture.FeatureEntryPoint import io.element.android.libraries.matrix.api.core.EventId interface MediaGalleryEntryPoint : FeatureEntryPoint { - context(parentNode: Node) - fun createNode(buildContext: BuildContext, callback: Callback): Node + fun createNode( + parentNode: Node, + buildContext: BuildContext, + callback: Callback, + ): Node interface Callback : Plugin { fun onBackClick() diff --git a/libraries/mediaviewer/api/src/main/kotlin/io/element/android/libraries/mediaviewer/api/MediaViewerEntryPoint.kt b/libraries/mediaviewer/api/src/main/kotlin/io/element/android/libraries/mediaviewer/api/MediaViewerEntryPoint.kt index a926deb015..201573dc70 100644 --- a/libraries/mediaviewer/api/src/main/kotlin/io/element/android/libraries/mediaviewer/api/MediaViewerEntryPoint.kt +++ b/libraries/mediaviewer/api/src/main/kotlin/io/element/android/libraries/mediaviewer/api/MediaViewerEntryPoint.kt @@ -19,8 +19,12 @@ import io.element.android.libraries.matrix.api.timeline.Timeline import kotlinx.parcelize.Parcelize interface MediaViewerEntryPoint : FeatureEntryPoint { - context(parentNode: Node) - fun createNode(buildContext: BuildContext, params: Params, callback: Callback): Node + fun createNode( + parentNode: Node, + buildContext: BuildContext, + params: Params, + callback: Callback, + ): Node fun createParamsForAvatar(filename: String, avatarUrl: String): Params diff --git a/libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/DefaultMediaGalleryEntryPoint.kt b/libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/DefaultMediaGalleryEntryPoint.kt index 78a15c1997..60935a204c 100644 --- a/libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/DefaultMediaGalleryEntryPoint.kt +++ b/libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/DefaultMediaGalleryEntryPoint.kt @@ -17,8 +17,11 @@ import io.element.android.libraries.mediaviewer.impl.gallery.root.MediaGalleryFl @ContributesBinding(AppScope::class) class DefaultMediaGalleryEntryPoint : MediaGalleryEntryPoint { - context(parentNode: Node) - override fun createNode(buildContext: BuildContext, callback: MediaGalleryEntryPoint.Callback): Node { + override fun createNode( + parentNode: Node, + buildContext: BuildContext, + callback: MediaGalleryEntryPoint.Callback, + ): Node { return parentNode.createNode( buildContext = buildContext, plugins = listOf(callback), diff --git a/libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/DefaultMediaViewerEntryPoint.kt b/libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/DefaultMediaViewerEntryPoint.kt index a1d11811c4..7d683bf3df 100644 --- a/libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/DefaultMediaViewerEntryPoint.kt +++ b/libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/DefaultMediaViewerEntryPoint.kt @@ -48,8 +48,8 @@ class DefaultMediaViewerEntryPoint : MediaViewerEntryPoint { ) } - context(parentNode: Node) override fun createNode( + parentNode: Node, buildContext: BuildContext, params: MediaViewerEntryPoint.Params, callback: MediaViewerEntryPoint.Callback, diff --git a/libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/gallery/root/MediaGalleryFlowNode.kt b/libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/gallery/root/MediaGalleryFlowNode.kt index 8b6ec84eb5..cc71b49dac 100644 --- a/libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/gallery/root/MediaGalleryFlowNode.kt +++ b/libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/gallery/root/MediaGalleryFlowNode.kt @@ -125,6 +125,7 @@ class MediaGalleryFlowNode( } } mediaViewerEntryPoint.createNode( + parentNode = this, buildContext = buildContext, params = MediaViewerEntryPoint.Params( mode = navTarget.mode, diff --git a/libraries/mediaviewer/impl/src/test/kotlin/io/element/android/libraries/mediaviewer/impl/DefaultMediaGalleryEntryPointTest.kt b/libraries/mediaviewer/impl/src/test/kotlin/io/element/android/libraries/mediaviewer/impl/DefaultMediaGalleryEntryPointTest.kt index a5dce8f4ec..189644ebd5 100644 --- a/libraries/mediaviewer/impl/src/test/kotlin/io/element/android/libraries/mediaviewer/impl/DefaultMediaGalleryEntryPointTest.kt +++ b/libraries/mediaviewer/impl/src/test/kotlin/io/element/android/libraries/mediaviewer/impl/DefaultMediaGalleryEntryPointTest.kt @@ -42,12 +42,11 @@ class DefaultMediaGalleryEntryPointTest { override fun viewInTimeline(eventId: EventId) = lambdaError() override fun forward(eventId: EventId) = lambdaError() } - val result = with(parentNode) { - entryPoint.createNode( - buildContext = BuildContext.root(null), - callback = callback, - ) - } + val result = entryPoint.createNode( + parentNode = parentNode, + buildContext = BuildContext.root(null), + callback = callback, + ) assertThat(result).isInstanceOf(MediaGalleryFlowNode::class.java) assertThat(result.plugins).contains(callback) } diff --git a/libraries/mediaviewer/impl/src/test/kotlin/io/element/android/libraries/mediaviewer/impl/DefaultMediaViewerEntryPointTest.kt b/libraries/mediaviewer/impl/src/test/kotlin/io/element/android/libraries/mediaviewer/impl/DefaultMediaViewerEntryPointTest.kt index 2929badf82..b53fe7913c 100644 --- a/libraries/mediaviewer/impl/src/test/kotlin/io/element/android/libraries/mediaviewer/impl/DefaultMediaViewerEntryPointTest.kt +++ b/libraries/mediaviewer/impl/src/test/kotlin/io/element/android/libraries/mediaviewer/impl/DefaultMediaViewerEntryPointTest.kt @@ -75,13 +75,12 @@ class DefaultMediaViewerEntryPointTest { override fun forwardEvent(eventId: EventId) = lambdaError() } val params = createMediaViewerEntryPointParams() - val result = with(parentNode) { - entryPoint.createNode( - buildContext = BuildContext.root(null), - params = params, - callback = callback, - ) - } + val result = entryPoint.createNode( + parentNode = parentNode, + buildContext = BuildContext.root(null), + params = params, + callback = callback, + ) assertThat(result).isInstanceOf(MediaViewerNode::class.java) assertThat(result.plugins).contains(params) assertThat(result.plugins).contains(callback) @@ -125,13 +124,12 @@ class DefaultMediaViewerEntryPointTest { filename = "fn", avatarUrl = "avatarUrl", ) - val result = with(parentNode) { - entryPoint.createNode( - buildContext = BuildContext.root(null), - params = params, - callback = callback, - ) - } + val result = entryPoint.createNode( + parentNode = parentNode, + buildContext = BuildContext.root(null), + params = params, + callback = callback, + ) assertThat(result).isInstanceOf(MediaViewerNode::class.java) assertThat(result.plugins).contains( MediaViewerEntryPoint.Params( diff --git a/libraries/mediaviewer/test/src/main/kotlin/io/element/android/libraries/mediaviewer/test/FakeMediaGalleryEntryPoint.kt b/libraries/mediaviewer/test/src/main/kotlin/io/element/android/libraries/mediaviewer/test/FakeMediaGalleryEntryPoint.kt index 341bf8a65f..9ba6bfee62 100644 --- a/libraries/mediaviewer/test/src/main/kotlin/io/element/android/libraries/mediaviewer/test/FakeMediaGalleryEntryPoint.kt +++ b/libraries/mediaviewer/test/src/main/kotlin/io/element/android/libraries/mediaviewer/test/FakeMediaGalleryEntryPoint.kt @@ -13,8 +13,8 @@ import io.element.android.libraries.mediaviewer.api.MediaGalleryEntryPoint import io.element.android.tests.testutils.lambda.lambdaError class FakeMediaGalleryEntryPoint : MediaGalleryEntryPoint { - context(parentNode: Node) override fun createNode( + parentNode: Node, buildContext: BuildContext, callback: MediaGalleryEntryPoint.Callback, ): Node = lambdaError() diff --git a/libraries/mediaviewer/test/src/main/kotlin/io/element/android/libraries/mediaviewer/test/FakeMediaViewerEntryPoint.kt b/libraries/mediaviewer/test/src/main/kotlin/io/element/android/libraries/mediaviewer/test/FakeMediaViewerEntryPoint.kt index 52e37e84b9..9890169579 100644 --- a/libraries/mediaviewer/test/src/main/kotlin/io/element/android/libraries/mediaviewer/test/FakeMediaViewerEntryPoint.kt +++ b/libraries/mediaviewer/test/src/main/kotlin/io/element/android/libraries/mediaviewer/test/FakeMediaViewerEntryPoint.kt @@ -15,8 +15,8 @@ import io.element.android.tests.testutils.lambda.lambdaError class FakeMediaViewerEntryPoint : MediaViewerEntryPoint { override fun createParamsForAvatar(filename: String, avatarUrl: String) = lambdaError() - context(parentNode: Node) override fun createNode( + parentNode: Node, buildContext: BuildContext, params: MediaViewerEntryPoint.Params, callback: MediaViewerEntryPoint.Callback, diff --git a/libraries/roomselect/api/src/main/kotlin/io/element/android/libraries/roomselect/api/RoomSelectEntryPoint.kt b/libraries/roomselect/api/src/main/kotlin/io/element/android/libraries/roomselect/api/RoomSelectEntryPoint.kt index 08aa8a2d34..1da6c4dd4c 100644 --- a/libraries/roomselect/api/src/main/kotlin/io/element/android/libraries/roomselect/api/RoomSelectEntryPoint.kt +++ b/libraries/roomselect/api/src/main/kotlin/io/element/android/libraries/roomselect/api/RoomSelectEntryPoint.kt @@ -18,8 +18,12 @@ interface RoomSelectEntryPoint : FeatureEntryPoint { val mode: RoomSelectMode, ) - context(parentNode: Node) - fun createNode(buildContext: BuildContext, params: Params, callback: Callback): Node + fun createNode( + parentNode: Node, + buildContext: BuildContext, + params: Params, + callback: Callback, + ): Node interface Callback : Plugin { fun onRoomSelected(roomIds: List) diff --git a/libraries/roomselect/impl/src/main/kotlin/io/element/android/libraries/roomselect/impl/DefaultRoomSelectEntryPoint.kt b/libraries/roomselect/impl/src/main/kotlin/io/element/android/libraries/roomselect/impl/DefaultRoomSelectEntryPoint.kt index 15da921a49..94488ec1c4 100644 --- a/libraries/roomselect/impl/src/main/kotlin/io/element/android/libraries/roomselect/impl/DefaultRoomSelectEntryPoint.kt +++ b/libraries/roomselect/impl/src/main/kotlin/io/element/android/libraries/roomselect/impl/DefaultRoomSelectEntryPoint.kt @@ -16,8 +16,12 @@ import io.element.android.libraries.roomselect.api.RoomSelectEntryPoint @ContributesBinding(SessionScope::class) class DefaultRoomSelectEntryPoint : RoomSelectEntryPoint { - context(parentNode: Node) - override fun createNode(buildContext: BuildContext, params: RoomSelectEntryPoint.Params, callback: RoomSelectEntryPoint.Callback): Node { + override fun createNode( + parentNode: Node, + buildContext: BuildContext, + params: RoomSelectEntryPoint.Params, + callback: RoomSelectEntryPoint.Callback, + ): Node { return parentNode.createNode( buildContext = buildContext, plugins = listOf( diff --git a/libraries/roomselect/impl/src/test/kotlin/io/element/android/libraries/roomselect/impl/DefaultRoomSelectEntryPointTest.kt b/libraries/roomselect/impl/src/test/kotlin/io/element/android/libraries/roomselect/impl/DefaultRoomSelectEntryPointTest.kt index 6bb68b9707..0bd16f77b0 100644 --- a/libraries/roomselect/impl/src/test/kotlin/io/element/android/libraries/roomselect/impl/DefaultRoomSelectEntryPointTest.kt +++ b/libraries/roomselect/impl/src/test/kotlin/io/element/android/libraries/roomselect/impl/DefaultRoomSelectEntryPointTest.kt @@ -42,13 +42,12 @@ class DefaultRoomSelectEntryPointTest { override fun onCancel() = lambdaError() } val params = RoomSelectEntryPoint.Params(testMode) - val result = with(parentNode) { - entryPoint.createNode( - buildContext = BuildContext.root(null), - params = params, - callback = callback, - ) - } + val result = entryPoint.createNode( + parentNode = parentNode, + buildContext = BuildContext.root(null), + params = params, + callback = callback, + ) assertThat(result).isInstanceOf(RoomSelectNode::class.java) assertThat(result.plugins).contains(RoomSelectNode.Inputs(params.mode)) assertThat(result.plugins).contains(callback) diff --git a/libraries/roomselect/test/src/main/kotlin/io/element/android/libraries/roomselect/test/FakeRoomSelectEntryPoint.kt b/libraries/roomselect/test/src/main/kotlin/io/element/android/libraries/roomselect/test/FakeRoomSelectEntryPoint.kt index 3b0ea4ac53..5c7e4d11d8 100644 --- a/libraries/roomselect/test/src/main/kotlin/io/element/android/libraries/roomselect/test/FakeRoomSelectEntryPoint.kt +++ b/libraries/roomselect/test/src/main/kotlin/io/element/android/libraries/roomselect/test/FakeRoomSelectEntryPoint.kt @@ -13,8 +13,8 @@ import io.element.android.libraries.roomselect.api.RoomSelectEntryPoint import io.element.android.tests.testutils.lambda.lambdaError class FakeRoomSelectEntryPoint : RoomSelectEntryPoint { - context(parentNode: Node) override fun createNode( + parentNode: Node, buildContext: BuildContext, params: RoomSelectEntryPoint.Params, callback: RoomSelectEntryPoint.Callback, diff --git a/libraries/troubleshoot/api/src/main/kotlin/io/element/android/libraries/troubleshoot/api/NotificationTroubleShootEntryPoint.kt b/libraries/troubleshoot/api/src/main/kotlin/io/element/android/libraries/troubleshoot/api/NotificationTroubleShootEntryPoint.kt index ae32ace777..7889ba4da3 100644 --- a/libraries/troubleshoot/api/src/main/kotlin/io/element/android/libraries/troubleshoot/api/NotificationTroubleShootEntryPoint.kt +++ b/libraries/troubleshoot/api/src/main/kotlin/io/element/android/libraries/troubleshoot/api/NotificationTroubleShootEntryPoint.kt @@ -13,8 +13,11 @@ import com.bumble.appyx.core.plugin.Plugin import io.element.android.libraries.architecture.FeatureEntryPoint interface NotificationTroubleShootEntryPoint : FeatureEntryPoint { - context(parentNode: Node) - fun createNode(buildContext: BuildContext, callback: Callback): Node + fun createNode( + parentNode: Node, + buildContext: BuildContext, + callback: Callback, + ): Node interface Callback : Plugin { fun onDone() diff --git a/libraries/troubleshoot/api/src/main/kotlin/io/element/android/libraries/troubleshoot/api/PushHistoryEntryPoint.kt b/libraries/troubleshoot/api/src/main/kotlin/io/element/android/libraries/troubleshoot/api/PushHistoryEntryPoint.kt index ba11199330..bef39ecdd4 100644 --- a/libraries/troubleshoot/api/src/main/kotlin/io/element/android/libraries/troubleshoot/api/PushHistoryEntryPoint.kt +++ b/libraries/troubleshoot/api/src/main/kotlin/io/element/android/libraries/troubleshoot/api/PushHistoryEntryPoint.kt @@ -15,8 +15,11 @@ import io.element.android.libraries.matrix.api.core.EventId import io.element.android.libraries.matrix.api.core.RoomId interface PushHistoryEntryPoint : FeatureEntryPoint { - context(parentNode: Node) - fun createNode(buildContext: BuildContext, callback: Callback): Node + fun createNode( + parentNode: Node, + buildContext: BuildContext, + callback: Callback, + ): Node interface Callback : Plugin { fun onDone() diff --git a/libraries/troubleshoot/impl/src/main/kotlin/io/element/android/libraries/troubleshoot/impl/DefaultNotificationTroubleShootEntryPoint.kt b/libraries/troubleshoot/impl/src/main/kotlin/io/element/android/libraries/troubleshoot/impl/DefaultNotificationTroubleShootEntryPoint.kt index 7404aed8ed..285f08b65a 100644 --- a/libraries/troubleshoot/impl/src/main/kotlin/io/element/android/libraries/troubleshoot/impl/DefaultNotificationTroubleShootEntryPoint.kt +++ b/libraries/troubleshoot/impl/src/main/kotlin/io/element/android/libraries/troubleshoot/impl/DefaultNotificationTroubleShootEntryPoint.kt @@ -16,8 +16,11 @@ import io.element.android.libraries.troubleshoot.api.NotificationTroubleShootEnt @ContributesBinding(AppScope::class) class DefaultNotificationTroubleShootEntryPoint : NotificationTroubleShootEntryPoint { - context(parentNode: Node) - override fun createNode(buildContext: BuildContext, callback: NotificationTroubleShootEntryPoint.Callback): Node { + override fun createNode( + parentNode: Node, + buildContext: BuildContext, + callback: NotificationTroubleShootEntryPoint.Callback, + ): Node { return parentNode.createNode(buildContext, listOf(callback)) } } diff --git a/libraries/troubleshoot/impl/src/main/kotlin/io/element/android/libraries/troubleshoot/impl/history/DefaultPushHistoryEntryPoint.kt b/libraries/troubleshoot/impl/src/main/kotlin/io/element/android/libraries/troubleshoot/impl/history/DefaultPushHistoryEntryPoint.kt index 8477d39714..ca0cccc82c 100644 --- a/libraries/troubleshoot/impl/src/main/kotlin/io/element/android/libraries/troubleshoot/impl/history/DefaultPushHistoryEntryPoint.kt +++ b/libraries/troubleshoot/impl/src/main/kotlin/io/element/android/libraries/troubleshoot/impl/history/DefaultPushHistoryEntryPoint.kt @@ -16,8 +16,11 @@ import io.element.android.libraries.troubleshoot.api.PushHistoryEntryPoint @ContributesBinding(AppScope::class) class DefaultPushHistoryEntryPoint : PushHistoryEntryPoint { - context(parentNode: Node) - override fun createNode(buildContext: BuildContext, callback: PushHistoryEntryPoint.Callback): Node { + override fun createNode( + parentNode: Node, + buildContext: BuildContext, + callback: PushHistoryEntryPoint.Callback, + ): Node { return parentNode.createNode(buildContext, listOf(callback)) } } diff --git a/libraries/troubleshoot/impl/src/test/kotlin/io/element/android/libraries/troubleshoot/impl/DefaultNotificationTroubleShootEntryPointTest.kt b/libraries/troubleshoot/impl/src/test/kotlin/io/element/android/libraries/troubleshoot/impl/DefaultNotificationTroubleShootEntryPointTest.kt index cf4c62b9b4..1eef24fbcb 100644 --- a/libraries/troubleshoot/impl/src/test/kotlin/io/element/android/libraries/troubleshoot/impl/DefaultNotificationTroubleShootEntryPointTest.kt +++ b/libraries/troubleshoot/impl/src/test/kotlin/io/element/android/libraries/troubleshoot/impl/DefaultNotificationTroubleShootEntryPointTest.kt @@ -36,12 +36,11 @@ class DefaultNotificationTroubleShootEntryPointTest { override fun onDone() = lambdaError() override fun navigateToBlockedUsers() = lambdaError() } - val result = with(parentNode) { - entryPoint.createNode( - buildContext = BuildContext.root(null), - callback = callback, - ) - } + val result = entryPoint.createNode( + parentNode = parentNode, + buildContext = BuildContext.root(null), + callback = callback, + ) assertThat(result).isInstanceOf(TroubleshootNotificationsNode::class.java) assertThat(result.plugins).contains(callback) } diff --git a/libraries/troubleshoot/impl/src/test/kotlin/io/element/android/libraries/troubleshoot/impl/history/DefaultPushHistoryEntryPointTest.kt b/libraries/troubleshoot/impl/src/test/kotlin/io/element/android/libraries/troubleshoot/impl/history/DefaultPushHistoryEntryPointTest.kt index 271cd8d8fd..b963183ecc 100644 --- a/libraries/troubleshoot/impl/src/test/kotlin/io/element/android/libraries/troubleshoot/impl/history/DefaultPushHistoryEntryPointTest.kt +++ b/libraries/troubleshoot/impl/src/test/kotlin/io/element/android/libraries/troubleshoot/impl/history/DefaultPushHistoryEntryPointTest.kt @@ -48,12 +48,11 @@ class DefaultPushHistoryEntryPointTest { override fun onDone() = lambdaError() override fun navigateToEvent(roomId: RoomId, eventId: EventId) = lambdaError() } - val result = with(parentNode) { - entryPoint.createNode( - buildContext = BuildContext.root(null), - callback = callback, - ) - } + val result = entryPoint.createNode( + parentNode = parentNode, + buildContext = BuildContext.root(null), + callback = callback, + ) assertThat(result).isInstanceOf(PushHistoryNode::class.java) assertThat(result.plugins).contains(callback) } diff --git a/libraries/troubleshoot/test/src/main/kotlin/io/element/android/libraries/troubleshoot/test/FakeNotificationTroubleShootEntryPoint.kt b/libraries/troubleshoot/test/src/main/kotlin/io/element/android/libraries/troubleshoot/test/FakeNotificationTroubleShootEntryPoint.kt index 84a79382e2..38ba5bc32f 100644 --- a/libraries/troubleshoot/test/src/main/kotlin/io/element/android/libraries/troubleshoot/test/FakeNotificationTroubleShootEntryPoint.kt +++ b/libraries/troubleshoot/test/src/main/kotlin/io/element/android/libraries/troubleshoot/test/FakeNotificationTroubleShootEntryPoint.kt @@ -13,8 +13,8 @@ import io.element.android.libraries.troubleshoot.api.NotificationTroubleShootEnt import io.element.android.tests.testutils.lambda.lambdaError class FakeNotificationTroubleShootEntryPoint : NotificationTroubleShootEntryPoint { - context(parentNode: Node) override fun createNode( + parentNode: Node, buildContext: BuildContext, callback: NotificationTroubleShootEntryPoint.Callback, ): Node = lambdaError() diff --git a/libraries/troubleshoot/test/src/main/kotlin/io/element/android/libraries/troubleshoot/test/FakePushHistoryEntryPoint.kt b/libraries/troubleshoot/test/src/main/kotlin/io/element/android/libraries/troubleshoot/test/FakePushHistoryEntryPoint.kt index 7a4e96b839..c87fe43575 100644 --- a/libraries/troubleshoot/test/src/main/kotlin/io/element/android/libraries/troubleshoot/test/FakePushHistoryEntryPoint.kt +++ b/libraries/troubleshoot/test/src/main/kotlin/io/element/android/libraries/troubleshoot/test/FakePushHistoryEntryPoint.kt @@ -13,8 +13,8 @@ import io.element.android.libraries.troubleshoot.api.PushHistoryEntryPoint import io.element.android.tests.testutils.lambda.lambdaError class FakePushHistoryEntryPoint : PushHistoryEntryPoint { - context(parentNode: Node) override fun createNode( + parentNode: Node, buildContext: BuildContext, callback: PushHistoryEntryPoint.Callback, ): Node = lambdaError() diff --git a/tools/templates/files/fileTemplates/Template Module Feature Entry Point API.kt b/tools/templates/files/fileTemplates/Template Module Feature Entry Point API.kt index af6cf59c8e..c4357b2d3c 100644 --- a/tools/templates/files/fileTemplates/Template Module Feature Entry Point API.kt +++ b/tools/templates/files/fileTemplates/Template Module Feature Entry Point API.kt @@ -6,8 +6,11 @@ import com.bumble.appyx.core.plugin.Plugin import io.element.android.libraries.architecture.FeatureEntryPoint interface ${FEATURE_NAME}EntryPoint : FeatureEntryPoint { - context(parentNode: Node) - fun createNode(buildContext: BuildContext, callback: Callback): Node + fun createNode( + parentNode: Node, + buildContext: BuildContext, + callback: Callback, + ): Node interface Callback : Plugin { // Add your callbacks diff --git a/tools/templates/files/fileTemplates/Template Module Feature Entry Point Flow Impl.kt b/tools/templates/files/fileTemplates/Template Module Feature Entry Point Flow Impl.kt index eca83b787f..3642f8e821 100644 --- a/tools/templates/files/fileTemplates/Template Module Feature Entry Point Flow Impl.kt +++ b/tools/templates/files/fileTemplates/Template Module Feature Entry Point Flow Impl.kt @@ -10,8 +10,12 @@ import dev.zacsweers.metro.AppScope @ContributesBinding(AppScope::class) class Default${FEATURE_NAME}EntryPoint() : ${FEATURE_NAME}EntryPoint { - context(parentNode: Node) - override fun createNode(buildContext: BuildContext, callback: ${FEATURE_NAME}EntryPoint.Callback): Node { + + override fun createNode( + parentNode: Node, + buildContext: BuildContext, + callback: ${FEATURE_NAME}EntryPoint.Callback, + ): Node { return parentNode.createNode<${FEATURE_NAME}FlowNode>(buildContext, listOf(callback)) } } From aae384bba898967d40952ad35cb9e06c60f04b0c Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Fri, 31 Oct 2025 12:45:27 +0000 Subject: [PATCH 15/46] fix(deps): update dependency io.element.android:element-call-embedded to v0.16.1 --- gradle/libs.versions.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 08ec71915c..54bc1660f2 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -229,7 +229,7 @@ sigpwned_emoji4j = "com.sigpwned:emoji4j-core:16.0.0" metro_runtime = { module = "dev.zacsweers.metro:runtime", version.ref = "metro" } # Element Call -element_call_embedded = "io.element.android:element-call-embedded:0.16.0" +element_call_embedded = "io.element.android:element-call-embedded:0.16.1" # Auto services google_autoservice = { module = "com.google.auto.service:auto-service", version.ref = "autoservice" } From f7e28346d6e60f7f502ef17407ef9c9311ce1954 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Fri, 31 Oct 2025 13:18:26 +0000 Subject: [PATCH 16/46] chore(deps): update danger/danger-js action to v13.0.5 (#5652) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- .github/workflows/danger.yml | 2 +- .github/workflows/quality.yml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/danger.yml b/.github/workflows/danger.yml index 0868b0729f..e4300b3321 100644 --- a/.github/workflows/danger.yml +++ b/.github/workflows/danger.yml @@ -20,7 +20,7 @@ jobs: - run: | npm install --save-dev @babel/plugin-transform-flow-strip-types - name: Danger - uses: danger/danger-js@bdccecb77e0144055fbaea9224f10cf8b1229b68 # 13.0.4 + uses: danger/danger-js@67ed2c1f42fd2fc198cc3c14b43c8f83351f4fe9 # 13.0.5 with: args: "--dangerfile ./tools/danger/dangerfile.js" env: diff --git a/.github/workflows/quality.yml b/.github/workflows/quality.yml index 5277cbdf05..7190fffe77 100644 --- a/.github/workflows/quality.yml +++ b/.github/workflows/quality.yml @@ -326,7 +326,7 @@ jobs: yarn add danger-plugin-lint-report --dev - name: Danger lint if: always() - uses: danger/danger-js@bdccecb77e0144055fbaea9224f10cf8b1229b68 # 13.0.4 + uses: danger/danger-js@67ed2c1f42fd2fc198cc3c14b43c8f83351f4fe9 # 13.0.5 with: args: "--dangerfile ./tools/danger/dangerfile-lint.js" env: From 04f70c81301ec22258e90a54e5167a8df7eccf8c Mon Sep 17 00:00:00 2001 From: Jorge Martin Espinosa Date: Fri, 31 Oct 2025 16:25:36 +0100 Subject: [PATCH 17/46] Enable `SyncNotificationsWithWorkManager` by default in release mode apps too (#5646) --- .../element/android/libraries/featureflag/api/FeatureFlags.kt | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/libraries/featureflag/api/src/main/kotlin/io/element/android/libraries/featureflag/api/FeatureFlags.kt b/libraries/featureflag/api/src/main/kotlin/io/element/android/libraries/featureflag/api/FeatureFlags.kt index 314d4fef7c..151922213b 100644 --- a/libraries/featureflag/api/src/main/kotlin/io/element/android/libraries/featureflag/api/FeatureFlags.kt +++ b/libraries/featureflag/api/src/main/kotlin/io/element/android/libraries/featureflag/api/FeatureFlags.kt @@ -114,8 +114,7 @@ enum class FeatureFlags( title = "Sync notifications with WorkManager", description = "Use WorkManager to schedule notification sync tasks when a push is received." + " This should improve reliability and battery usage.", - // Enable by default on nightly and debug builds so we can get feedback before enabling it for everyone. - defaultValue = { meta -> meta.buildType != BuildType.RELEASE }, + defaultValue = { true }, isFinished = false, ), } From f5918c7baec8b8f0f5e5f2e427b4eafd6ded717c Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Mon, 3 Nov 2025 09:30:04 +0100 Subject: [PATCH 18/46] fix(deps): update dependency com.google.firebase:firebase-bom to v34.5.0 (#5643) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- gradle/libs.versions.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 08ec71915c..ffc8f5e6d8 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -78,7 +78,7 @@ kotlinpoet-ksp = { module = "com.squareup:kotlinpoet-ksp", version.ref = "kotlin kover_gradle_plugin = { module = "org.jetbrains.kotlinx:kover-gradle-plugin", version.ref = "kover" } ksp_gradle_plugin = { module = "com.google.devtools.ksp:com.google.devtools.ksp.gradle.plugin", version.ref = "ksp" } # https://firebase.google.com/docs/android/setup#available-libraries -google_firebase_bom = "com.google.firebase:firebase-bom:34.4.0" +google_firebase_bom = "com.google.firebase:firebase-bom:34.5.0" firebase_appdistribution_gradle = { module = "com.google.firebase:firebase-appdistribution-gradle", version.ref = "firebaseAppDistribution" } autonomousapps_dependencyanalysis_plugin = { module = "com.autonomousapps:dependency-analysis-gradle-plugin", version.ref = "dependencyAnalysis" } ksp_plugin = { module = "com.google.devtools.ksp:symbol-processing-api", version.ref = "ksp" } From 069adf45cc132fa0dd8b03980738637a36bf4d9a Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Mon, 3 Nov 2025 09:30:28 +0100 Subject: [PATCH 19/46] fix(deps): update firebaseappdistribution to v5.2.0 (#5640) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- gradle/libs.versions.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index ffc8f5e6d8..77c8c7c39c 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -9,7 +9,7 @@ android_gradle_plugin = "8.11.1" kotlin = "2.2.20" kotlinpoet = "2.2.0" ksp = "2.2.20-2.0.2" -firebaseAppDistribution = "5.1.1" +firebaseAppDistribution = "5.2.0" # AndroidX core = "1.17.0" From 19dcdc1a0c38dac31bdf588c9c3b47638b852626 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Mon, 3 Nov 2025 10:24:54 +0100 Subject: [PATCH 20/46] fix(deps): update metro to v0.7.3 (#5663) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- gradle/libs.versions.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 77c8c7c39c..d8dd1b37c3 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -52,7 +52,7 @@ haze = "1.6.10" dependencyAnalysis = "3.4.1" # DI -metro = "0.7.2" +metro = "0.7.3" # Auto service autoservice = "1.1.1" From 2f5d0c340c6a6de932a6eb99f8e4eaf0c12a7480 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Mon, 3 Nov 2025 10:48:06 +0100 Subject: [PATCH 21/46] fix(deps): update dependency org.matrix.rustcomponents:sdk-android to v25.10.31 (#5657) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * fix(deps): update dependency org.matrix.rustcomponents:sdk-android to v25.10.31 * Fix API breaks --------- Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> Co-authored-by: Jorge Martín --- gradle/libs.versions.toml | 2 +- .../libraries/matrix/impl/RustMatrixClientFactory.kt | 10 ++++++---- .../impl/auth/RustMatrixAuthenticationService.kt | 3 --- .../matrix/impl/fixtures/fakes/FakeFfiClientBuilder.kt | 3 ++- 4 files changed, 9 insertions(+), 9 deletions(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index d8dd1b37c3..7f07c14167 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -177,7 +177,7 @@ test_detekt_test = { module = "io.gitlab.arturbosch.detekt:detekt-test", version # https://github.com/matrix-org/matrix-rust-components-kotlin/commits/main/sdk/sdk-android/src/main/kotlin/org/matrix/rustcomponents/sdk/matrix_sdk_ffi.kt # All new features should not be implemented in the pull request that upgrades the version, developers should # only fix API breaks and may add some TODOs. -matrix_sdk = "org.matrix.rustcomponents:sdk-android:25.10.29" +matrix_sdk = "org.matrix.rustcomponents:sdk-android:25.10.31" # Others coil = { module = "io.coil-kt.coil3:coil", version.ref = "coil" } diff --git a/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/RustMatrixClientFactory.kt b/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/RustMatrixClientFactory.kt index 35b5bcf2b9..1882b04021 100644 --- a/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/RustMatrixClientFactory.kt +++ b/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/RustMatrixClientFactory.kt @@ -33,6 +33,7 @@ import org.matrix.rustcomponents.sdk.RequestConfig import org.matrix.rustcomponents.sdk.Session import org.matrix.rustcomponents.sdk.SlidingSyncVersion import org.matrix.rustcomponents.sdk.SlidingSyncVersionBuilder +import org.matrix.rustcomponents.sdk.SqliteStoreBuilder import org.matrix.rustcomponents.sdk.use import timber.log.Timber import uniffi.matrix_sdk_crypto.CollectStrategy @@ -105,12 +106,13 @@ class RustMatrixClientFactory( slidingSyncType: ClientBuilderSlidingSync, ): ClientBuilder { return clientBuilderProvider.provide() - .sessionPaths( - dataPath = sessionPaths.fileDirectory.absolutePath, - cachePath = sessionPaths.cacheDirectory.absolutePath, + .sqliteStore( + SqliteStoreBuilder( + dataPath = sessionPaths.fileDirectory.absolutePath, + cachePath = sessionPaths.cacheDirectory.absolutePath, + ).passphrase(passphrase) ) .setSessionDelegate(sessionDelegate) - .sessionPassphrase(passphrase) .userAgent(userAgentProvider.provide()) .addRootCertificates(userCertificatesProvider.provides()) .autoEnableBackups(true) diff --git a/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/auth/RustMatrixAuthenticationService.kt b/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/auth/RustMatrixAuthenticationService.kt index 408af2eb0a..9859358ae6 100644 --- a/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/auth/RustMatrixAuthenticationService.kt +++ b/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/auth/RustMatrixAuthenticationService.kt @@ -285,7 +285,6 @@ class RustMatrixAuthenticationService( runCatchingExceptions { val client = makeQrCodeLoginClient( sessionPaths = emptySessionPaths, - passphrase = pendingPassphrase, qrCodeData = sdkQrCodeLoginData, ) client.loginWithQrCode( @@ -344,7 +343,6 @@ class RustMatrixAuthenticationService( private suspend fun makeQrCodeLoginClient( sessionPaths: SessionPaths, - passphrase: String?, qrCodeData: QrCodeData, ): Client { Timber.d("Creating client for QR Code login with simplified sliding sync") @@ -354,7 +352,6 @@ class RustMatrixAuthenticationService( passphrase = pendingPassphrase, slidingSyncType = ClientBuilderSlidingSync.Discovered, ) - .sessionPassphrase(passphrase) .serverNameOrHomeserverUrl(qrCodeData.serverName()!!) .build() } diff --git a/libraries/matrix/impl/src/test/kotlin/io/element/android/libraries/matrix/impl/fixtures/fakes/FakeFfiClientBuilder.kt b/libraries/matrix/impl/src/test/kotlin/io/element/android/libraries/matrix/impl/fixtures/fakes/FakeFfiClientBuilder.kt index 6cff38f21a..81dbfafe5e 100644 --- a/libraries/matrix/impl/src/test/kotlin/io/element/android/libraries/matrix/impl/fixtures/fakes/FakeFfiClientBuilder.kt +++ b/libraries/matrix/impl/src/test/kotlin/io/element/android/libraries/matrix/impl/fixtures/fakes/FakeFfiClientBuilder.kt @@ -13,6 +13,7 @@ import org.matrix.rustcomponents.sdk.ClientSessionDelegate import org.matrix.rustcomponents.sdk.NoHandle import org.matrix.rustcomponents.sdk.RequestConfig import org.matrix.rustcomponents.sdk.SlidingSyncVersionBuilder +import org.matrix.rustcomponents.sdk.SqliteStoreBuilder import uniffi.matrix_sdk.BackupDownloadStrategy import uniffi.matrix_sdk_crypto.CollectStrategy import uniffi.matrix_sdk_crypto.DecryptionSettings @@ -29,7 +30,6 @@ class FakeFfiClientBuilder( override fun decryptionSettings(decryptionSettings: DecryptionSettings): ClientBuilder = this override fun disableSslVerification() = this override fun homeserverUrl(url: String) = this - override fun sessionPassphrase(passphrase: String?) = this override fun proxy(url: String) = this override fun requestConfig(config: RequestConfig) = this override fun roomKeyRecipientStrategy(strategy: CollectStrategy) = this @@ -42,5 +42,6 @@ class FakeFfiClientBuilder( override fun username(username: String) = this override fun enableShareHistoryOnInvite(enableShareHistoryOnInvite: Boolean): ClientBuilder = this override fun threadsEnabled(enabled: Boolean, threadSubscriptions: Boolean): ClientBuilder = this + override fun sqliteStore(config: SqliteStoreBuilder): ClientBuilder = this override suspend fun build() = buildResult() } From 287a01773949756f208b9a2ba67bd033cd77ad1b Mon Sep 17 00:00:00 2001 From: ElementBot <110224175+ElementBot@users.noreply.github.com> Date: Mon, 3 Nov 2025 10:58:12 +0100 Subject: [PATCH 22/46] Sync Strings from Localazy (#5662) Co-authored-by: bmarty <3940906+bmarty@users.noreply.github.com> --- .../src/main/res/values-de/translations.xml | 2 +- .../src/main/res/values-et/translations.xml | 2 +- .../src/main/res/values-sk/translations.xml | 2 +- .../main/res/values-zh-rTW/translations.xml | 2 +- .../impl/src/main/res/values/localazy.xml | 2 +- .../src/main/res/values-fa/translations.xml | 2 + .../src/main/res/values-de/translations.xml | 2 +- .../src/main/res/values-et/translations.xml | 2 +- .../src/main/res/values-sk/translations.xml | 2 +- .../main/res/values-zh-rTW/translations.xml | 2 +- .../impl/src/main/res/values/localazy.xml | 2 +- .../src/main/res/values-cs/translations.xml | 2 +- .../src/main/res/values-sk/translations.xml | 4 +- .../impl/src/main/res/values/localazy.xml | 2 + .../src/main/res/values-fa/translations.xml | 6 +- .../src/main/res/values-fa/translations.xml | 2 +- .../src/main/res/values-bg/translations.xml | 2 + .../src/main/res/values-cs/translations.xml | 5 +- .../src/main/res/values-cy/translations.xml | 2 + .../src/main/res/values-da/translations.xml | 2 + .../src/main/res/values-de/translations.xml | 4 + .../src/main/res/values-el/translations.xml | 1 + .../src/main/res/values-es/translations.xml | 1 + .../src/main/res/values-et/translations.xml | 5 + .../src/main/res/values-eu/translations.xml | 1 + .../src/main/res/values-fa/translations.xml | 2 + .../src/main/res/values-fi/translations.xml | 2 + .../src/main/res/values-fr/translations.xml | 2 + .../src/main/res/values-hu/translations.xml | 2 + .../src/main/res/values-in/translations.xml | 1 + .../src/main/res/values-it/translations.xml | 1 + .../src/main/res/values-ko/translations.xml | 1 + .../src/main/res/values-nb/translations.xml | 2 + .../src/main/res/values-pl/translations.xml | 2 + .../main/res/values-pt-rBR/translations.xml | 1 + .../src/main/res/values-pt/translations.xml | 2 + .../src/main/res/values-ro/translations.xml | 2 + .../src/main/res/values-ru/translations.xml | 2 + .../src/main/res/values-sk/translations.xml | 5 +- .../src/main/res/values-sv/translations.xml | 1 + .../src/main/res/values-tr/translations.xml | 1 + .../src/main/res/values-uk/translations.xml | 1 + .../main/res/values-zh-rTW/translations.xml | 4 + .../src/main/res/values-zh/translations.xml | 2 + .../src/main/res/values/localazy.xml | 5 +- ...om.joined_LoadingRoomNodeView_Day_1_de.png | 4 +- ...ard.impl_ForwardMessagesView_Day_3_de.png} | 0 ...impl.edit_RoomDetailsEditView_Day_8_de.png | 3 + ...pl.members_RoomMemberListView_Day_1_de.png | 4 +- ...res.space.impl.root_SpaceView_Day_0_de.png | 4 +- ...res.space.impl.root_SpaceView_Day_1_de.png | 4 +- ...res.space.impl.root_SpaceView_Day_2_de.png | 4 +- ...res.space.impl.root_SpaceView_Day_3_de.png | 4 +- ...res.space.impl.root_SpaceView_Day_4_de.png | 4 +- ...res.space.impl.root_SpaceView_Day_5_de.png | 4 +- ...tails_MediaDetailsBottomSheet_Day_0_de.png | 4 +- ...impl.gallery_MediaGalleryView_Day_8_de.png | 4 +- ...ewer.impl.viewer_MediaViewerView_11_de.png | 4 +- screenshots/html/data.js | 1831 +++++++++-------- 59 files changed, 1024 insertions(+), 956 deletions(-) rename screenshots/de/{features.messages.impl.forward_ForwardMessagesView_Day_3_de.png => features.forward.impl_ForwardMessagesView_Day_3_de.png} (100%) create mode 100644 screenshots/de/features.roomdetails.impl.edit_RoomDetailsEditView_Day_8_de.png diff --git a/features/changeroommemberroles/impl/src/main/res/values-de/translations.xml b/features/changeroommemberroles/impl/src/main/res/values-de/translations.xml index 88d795d614..09a04a4d35 100644 --- a/features/changeroommemberroles/impl/src/main/res/values-de/translations.xml +++ b/features/changeroommemberroles/impl/src/main/res/values-de/translations.xml @@ -33,7 +33,7 @@ "Mitglieder" "Du hast nicht gespeicherte Änderungen." "Änderungen speichern?" - "In diesem Chat gibt es keine gesperrten Nutzer." + "Es gibt keine gesperrten Nutzer." "%1$d Person" "%1$d Personen" diff --git a/features/changeroommemberroles/impl/src/main/res/values-et/translations.xml b/features/changeroommemberroles/impl/src/main/res/values-et/translations.xml index a43a9a89d0..ca7faadde0 100644 --- a/features/changeroommemberroles/impl/src/main/res/values-et/translations.xml +++ b/features/changeroommemberroles/impl/src/main/res/values-et/translations.xml @@ -33,7 +33,7 @@ "Liikmed" "Sul on salvestamata muudatusi" "Kas salvestame muudatused?" - "Jututoas pole suhtluskeeluga kasutajaid" + "Suhtluskeeluga kasutajaid pole" "%1$d osaleja" "%1$d osalejat" diff --git a/features/changeroommemberroles/impl/src/main/res/values-sk/translations.xml b/features/changeroommemberroles/impl/src/main/res/values-sk/translations.xml index 8d5c6e8502..88ff80b71f 100644 --- a/features/changeroommemberroles/impl/src/main/res/values-sk/translations.xml +++ b/features/changeroommemberroles/impl/src/main/res/values-sk/translations.xml @@ -33,7 +33,7 @@ "Členovia" "Máte neuložené zmeny." "Uložiť zmeny?" - "V tejto miestnosti nie sú žiadni zakázaní používatelia." + "Neexistujú žiadni zablokovaní používatelia." "%1$d osoba" "%1$d osoby" diff --git a/features/changeroommemberroles/impl/src/main/res/values-zh-rTW/translations.xml b/features/changeroommemberroles/impl/src/main/res/values-zh-rTW/translations.xml index 2ec5ec64c5..152244e066 100644 --- a/features/changeroommemberroles/impl/src/main/res/values-zh-rTW/translations.xml +++ b/features/changeroommemberroles/impl/src/main/res/values-zh-rTW/translations.xml @@ -33,7 +33,7 @@ "成員" "您有尚未儲存的變更" "是否儲存變更?" - "此聊天室沒有黑名單。" + "沒有被封鎖的使用者。" "%1$d 位夥伴" diff --git a/features/changeroommemberroles/impl/src/main/res/values/localazy.xml b/features/changeroommemberroles/impl/src/main/res/values/localazy.xml index 456426726a..43f6dc10f8 100644 --- a/features/changeroommemberroles/impl/src/main/res/values/localazy.xml +++ b/features/changeroommemberroles/impl/src/main/res/values/localazy.xml @@ -33,7 +33,7 @@ "Members" "You have unsaved changes." "Save changes?" - "There are no banned users in this room." + "There are no banned users." "%1$d person" "%1$d people" diff --git a/features/logout/impl/src/main/res/values-fa/translations.xml b/features/logout/impl/src/main/res/values-fa/translations.xml index 4bf6be1b89..c4c6e823d0 100644 --- a/features/logout/impl/src/main/res/values-fa/translations.xml +++ b/features/logout/impl/src/main/res/values-fa/translations.xml @@ -4,6 +4,7 @@ "خروج" "خروج" "خارج شدن…" + "دارید از واپسین نشستتان خارج می‌شوید. اگر اکنون خارج شوید پیام‌های رمزنگاشته‌تان را از دست خواهید داد." "پشتیبان را خاموش کرده‌اید" "کلیدهایتان هنوز در حال پشتیبان گیریند" "لطفاً پیش از خروج منتظر پایانش شوید." @@ -11,5 +12,6 @@ "خروج" "شما در آستانه خروج از آخرین جلسه خود هستید. اگر اکنون از سیستم خارج شوید، دسترسی به پیام های رمزگذاری شده تان را از دست خواهید داد." "بازگردانی برپا نشده" + "دارید از واپسین نشستتان خارج می‌شوید. اگر اکنون خارج شوید ممکن است پیام‌های رمزنگاشته‌تان را از دست بدهید." "کلید بازیابیتان را ذخیره کرده‌اید؟" diff --git a/features/roomdetails/impl/src/main/res/values-de/translations.xml b/features/roomdetails/impl/src/main/res/values-de/translations.xml index 4a4f8a44b6..f88c017970 100644 --- a/features/roomdetails/impl/src/main/res/values-de/translations.xml +++ b/features/roomdetails/impl/src/main/res/values-de/translations.xml @@ -70,7 +70,7 @@ "Informationen" "Thema" "Chat wird aktualisiert…" - "In diesem Chat gibt es keine gesperrten Nutzer." + "Es gibt keine gesperrten Nutzer." "%1$d Person" "%1$d Personen" diff --git a/features/roomdetails/impl/src/main/res/values-et/translations.xml b/features/roomdetails/impl/src/main/res/values-et/translations.xml index 6de3107def..a8f927e675 100644 --- a/features/roomdetails/impl/src/main/res/values-et/translations.xml +++ b/features/roomdetails/impl/src/main/res/values-et/translations.xml @@ -70,7 +70,7 @@ "Jututoa teave" "Teema" "Uuendame jututuba…" - "Jututoas pole suhtluskeeluga kasutajaid" + "Suhtluskeeluga kasutajaid pole" "%1$d osaleja" "%1$d osalejat" diff --git a/features/roomdetails/impl/src/main/res/values-sk/translations.xml b/features/roomdetails/impl/src/main/res/values-sk/translations.xml index ff3dc18103..fa6fa06957 100644 --- a/features/roomdetails/impl/src/main/res/values-sk/translations.xml +++ b/features/roomdetails/impl/src/main/res/values-sk/translations.xml @@ -70,7 +70,7 @@ "Informácie o miestnosti" "Téma" "Aktualizácia miestnosti…" - "V tejto miestnosti nie sú žiadni zakázaní používatelia." + "Neexistujú žiadni zablokovaní používatelia." "%1$d osoba" "%1$d osoby" diff --git a/features/roomdetails/impl/src/main/res/values-zh-rTW/translations.xml b/features/roomdetails/impl/src/main/res/values-zh-rTW/translations.xml index 888701406d..b1773df979 100644 --- a/features/roomdetails/impl/src/main/res/values-zh-rTW/translations.xml +++ b/features/roomdetails/impl/src/main/res/values-zh-rTW/translations.xml @@ -70,7 +70,7 @@ "聊天室資訊" "主題" "正在更新聊天室…" - "此聊天室沒有黑名單。" + "沒有被封鎖的使用者。" "%1$d 位夥伴" diff --git a/features/roomdetails/impl/src/main/res/values/localazy.xml b/features/roomdetails/impl/src/main/res/values/localazy.xml index ce8eb3a7b7..814f352abd 100644 --- a/features/roomdetails/impl/src/main/res/values/localazy.xml +++ b/features/roomdetails/impl/src/main/res/values/localazy.xml @@ -70,7 +70,7 @@ "Room info" "Topic" "Updating room…" - "There are no banned users in this room." + "There are no banned users." "%1$d person" "%1$d people" diff --git a/features/roommembermoderation/impl/src/main/res/values-cs/translations.xml b/features/roommembermoderation/impl/src/main/res/values-cs/translations.xml index 263aa9a2e0..20fc68c391 100644 --- a/features/roommembermoderation/impl/src/main/res/values-cs/translations.xml +++ b/features/roommembermoderation/impl/src/main/res/values-cs/translations.xml @@ -9,7 +9,7 @@ "Pokud budou pozváni, budou se moci do této místnosti znovu připojit." "Opravdu chcete tohoto člena odebrat?" "Zobrazit profil" - "Odebrat z místnosti" + "Odebrat uživatele" "Odebrat člena a zakázat mu připojení v budoucnu?" "Odstraňování %1$s…" "Zrušit vykázání z místnosti" diff --git a/features/roommembermoderation/impl/src/main/res/values-sk/translations.xml b/features/roommembermoderation/impl/src/main/res/values-sk/translations.xml index ffdd634b0b..c852e7ab29 100644 --- a/features/roommembermoderation/impl/src/main/res/values-sk/translations.xml +++ b/features/roommembermoderation/impl/src/main/res/values-sk/translations.xml @@ -4,12 +4,14 @@ "Zakázať" "Nebudú sa môcť pripojiť k tejto miestnosti znova ani ak budú pozvaní." "Ste si istý, že chcete zakázať tohto člena?" + "Ak dostanú pozvánku, nebudú sa môcť k tomuto priestoru znova pripojiť, ale stále si ponechajú členstvo vo všetkých miestnostiach alebo podpriestoroch." "Zakazuje sa %1$s" "Odstrániť" "V prípade pozvania sa budú môcť znova pripojiť k tejto miestnosti." "Ste si istý, že chcete odstrániť tohto člena?" + "Ak dostanú pozvánku, budú sa môcť k tomuto priestoru znova pripojiť a stále si ponechajú členstvo vo všetkých miestnostiach alebo podpriestoroch." "Zobraziť profil" - "Odstrániť z miestnosti" + "Odstrániť používateľa" "Odstrániť člena a zakázať vstup v budúcnosti?" "Odstraňuje sa %1$s…" "Zrušiť zákaz prístupu do miestnosti" diff --git a/features/roommembermoderation/impl/src/main/res/values/localazy.xml b/features/roommembermoderation/impl/src/main/res/values/localazy.xml index e3f6071898..3d23c8763a 100644 --- a/features/roommembermoderation/impl/src/main/res/values/localazy.xml +++ b/features/roommembermoderation/impl/src/main/res/values/localazy.xml @@ -4,10 +4,12 @@ "Ban" "They won’t be able to join again if invited." "Are you sure you want to ban this member?" + "They won’t be able to join this space again if invited, but they’ll still keep their memberships of any rooms or subspaces." "Banning %1$s" "Remove" "They will be able to join this room again if invited." "Are you sure you want to remove this member?" + "They will be able to join this space again if invited, and they’ll still keep their memberships of any rooms or subspaces." "View profile" "Remove user" "Remove member and ban from joining in the future?" diff --git a/features/verifysession/impl/src/main/res/values-fa/translations.xml b/features/verifysession/impl/src/main/res/values-fa/translations.xml index fc0bace5cd..ffc03e1f19 100644 --- a/features/verifysession/impl/src/main/res/values-fa/translations.xml +++ b/features/verifysession/impl/src/main/res/values-fa/translations.xml @@ -11,10 +11,10 @@ "استفاده از افزاره‌ای دیگر" "منتظر افزارهٔ دیگر…" "يه چيزي درست به نظر نمياد یا زمان درخواست به پایان رسید یا درخواست رد شد." - "تأیید کنید که ایموجی های زیر با ایموجی های نشان داده شده در جلسه دیگر شما مطابقت دارند." + "تأیید تطابق شکلک‌های زیر با شکلک‌های نشان داده شده روی افزارهٔ دیگرتان." "مقایسهٔ شکلک‌ها" "مقایسهٔ اعداد" - "اکنون نشست جدیدتان تأیید شده‌. این نشست به پیام‌های رمزنگارش شده‌تان دسترسی داشته و دیگر کاربران مطمئن می‌بینندش." + "اکنون می‌توانید روی افزارهٔ دیگرتان با امنیت پیام فرستاده و بخوانید." "افزاره تأیید شده" "ورود کلید بازیابی" "برای دسترسی به تاریخچه پیام‌های رمزگذاری‌شده‌تان، ثابت کنید که خودتان هستید." @@ -26,7 +26,7 @@ "شکلک‌ها را مقایسه کنید، از ترتیب نمایش آنان نیز مطمئن شوید." "وارد شده" "صحت‌سنجی شکست خورد" - "اکنون نشست جدیدتان تأیید شده‌. این نشست به پیام‌های رمزنگارش شده‌تان دسترسی داشته و دیگر کاربران مطمئن می‌بینندش." + "اکنون می‌توانید روی افزارهٔ دیگرتان با امنیت پیام فرستاده و بخوانید." "افزاره تأیید شده" "مطابق نیستند" "مطابقند" diff --git a/libraries/textcomposer/impl/src/main/res/values-fa/translations.xml b/libraries/textcomposer/impl/src/main/res/values-fa/translations.xml index 602d35363c..fd55fdf9d9 100644 --- a/libraries/textcomposer/impl/src/main/res/values-fa/translations.xml +++ b/libraries/textcomposer/impl/src/main/res/values-fa/translations.xml @@ -2,7 +2,7 @@ "افزودن پیوست" "تغییر وضعیت سیاههٔ گلوله‌ای" - "بستن گزینه‌های قالب‌بندی" + "لغو و بستن قالب‌بندی متن" "تغییر حالت بلوک کد" "افزودن عنوان" "پیام رمزنگاری شده…" diff --git a/libraries/ui-strings/src/main/res/values-bg/translations.xml b/libraries/ui-strings/src/main/res/values-bg/translations.xml index 57b3a43d1a..42d2608ab6 100644 --- a/libraries/ui-strings/src/main/res/values-bg/translations.xml +++ b/libraries/ui-strings/src/main/res/values-bg/translations.xml @@ -316,6 +316,8 @@ "Отваряне в Google Maps" "Отваряне в OpenStreetMap" "Споделяне на това местоположение" + "Напускане на пространството" + "Защита и поверителност" "Местоположение" "Версия: %1$s (%2$s)" "bg" diff --git a/libraries/ui-strings/src/main/res/values-cs/translations.xml b/libraries/ui-strings/src/main/res/values-cs/translations.xml index 8e86f59c3b..ae50c0f28d 100644 --- a/libraries/ui-strings/src/main/res/values-cs/translations.xml +++ b/libraries/ui-strings/src/main/res/values-cs/translations.xml @@ -97,6 +97,7 @@ "Zapomněli jste heslo?" "Přeposlat" "Přejít zpět" + "Přejít na role a oprávnění" "Přejít do nastavení" "Ignorovat" "Pozvat" @@ -178,7 +179,6 @@ "Pokročilá nastavení" "obrázek" "Analytika" - "Načítání oznámení…" "Opustili jste místnost" "Byli jste odhlášeni z relace" "Vzhled" @@ -476,6 +476,9 @@ Opravdu chcete pokračovat?" "%1$s prostor" "Prostory" "Zobrazit členy" + "Opustit prostor" + "Role a oprávnění" + "Zabezpečení a soukromí" "Zpráva nebyla odeslána, protože ověřená identita uživatele %1$s se změnila." "Zpráva nebyla odeslána, protože%1$s neověřil(a) všechna zařízení." "Zpráva nebyla odeslána, protože jste neověřili jedno nebo více zařízení." diff --git a/libraries/ui-strings/src/main/res/values-cy/translations.xml b/libraries/ui-strings/src/main/res/values-cy/translations.xml index 11b46cb85c..0253c6b01a 100644 --- a/libraries/ui-strings/src/main/res/values-cy/translations.xml +++ b/libraries/ui-strings/src/main/res/values-cy/translations.xml @@ -497,6 +497,8 @@ Ydych chi\'n siŵr eich bod am barhau?" "%1$s • %2$s" "Gofod %1$s" "Gofodau" + "Gadael y gofod" + "Diogelwch a phreifatrwydd" "Heb anfon y neges oherwydd bod hunaniaeth wedi \'i ddilysu %1$s wedi\'i ailosod." "Heb anfon y neges oherwydd nid yw %1$s wedi gwirio pob dyfais." "Heb anfon y neges oherwydd nad ydych wedi gwirio un neu fwy o\'ch dyfeisiau." diff --git a/libraries/ui-strings/src/main/res/values-da/translations.xml b/libraries/ui-strings/src/main/res/values-da/translations.xml index fa91e60b9d..dd40b2e7bb 100644 --- a/libraries/ui-strings/src/main/res/values-da/translations.xml +++ b/libraries/ui-strings/src/main/res/values-da/translations.xml @@ -466,6 +466,8 @@ Er du sikker på, at du vil fortsætte?" "%1$s gruppe" "Grupper" "Vis medlemmer" + "Forlad gruppe" + "Sikkerhed og privatliv" "Beskeden blev ikke sendt fordi %1$s s bekræftede identitet blev nulstillet." "Meddelelsen er ikke sendt, fordi %1$s ikke har bekræftet alle enheder." "Beskeden er ikke sendt, fordi du ikke har verificeret en eller flere af dine enheder." diff --git a/libraries/ui-strings/src/main/res/values-de/translations.xml b/libraries/ui-strings/src/main/res/values-de/translations.xml index d1c8b7a6f4..3f34269879 100644 --- a/libraries/ui-strings/src/main/res/values-de/translations.xml +++ b/libraries/ui-strings/src/main/res/values-de/translations.xml @@ -420,6 +420,7 @@ Möchtest du wirklich fortfahren?" "🔐️ Begleite mich auf %1$s" "Hey, sprich mit mir auf %1$s: %2$s" "%1$s Android" + "Thread in %1$s" "Heftiges Schütteln um Fehler zu melden" "Bildschirmfoto" "%1$s: %2$s" @@ -466,6 +467,9 @@ Möchtest du wirklich fortfahren?" "%1$s • %2$s" "%1$s Space" "Spaces" + "Mitglieder anzeigen" + "Space verlassen" + "Sicherheit & Datenschutz" "Nachricht nicht gesendet, weil sich die verifizierte Identität von %1$s geändert hat." "Die Nachricht wurde nicht gesendet, weil %1$s nicht alle Geräte verifiziert hat." "Die Nachricht wurde nicht gesendet, weil du eines oder mehrere deiner Geräte nicht verifiziert hast." diff --git a/libraries/ui-strings/src/main/res/values-el/translations.xml b/libraries/ui-strings/src/main/res/values-el/translations.xml index 5085f404a1..bfb50b933e 100644 --- a/libraries/ui-strings/src/main/res/values-el/translations.xml +++ b/libraries/ui-strings/src/main/res/values-el/translations.xml @@ -394,6 +394,7 @@ "Άνοιγμα στο Google Maps" "Άνοιγμα στο OpenStreetMap" "Κοινή χρήση αυτής της τοποθεσίας" + "Ασφάλεια & απόρρητο" "Το μήνυμα δεν στάλθηκε γιατί έγινε επαναφορά της επαληθευμένης ταυτότητας του χρήστη %1$s." "Το μήνυμα δεν στάλθηκε επειδή ο χρήστης %1$s δεν έχει επαληθεύσει όλες τις συσκευές." "Το μήνυμα δεν στάλθηκε επειδή δεν έχεις επαληθεύσει τουλάχιστον μία από τις συσκευές σου." diff --git a/libraries/ui-strings/src/main/res/values-es/translations.xml b/libraries/ui-strings/src/main/res/values-es/translations.xml index 4428e0b864..d4420e1f6b 100644 --- a/libraries/ui-strings/src/main/res/values-es/translations.xml +++ b/libraries/ui-strings/src/main/res/values-es/translations.xml @@ -377,6 +377,7 @@ Motivo: %1$s." "Abrir en Google Maps" "Abrir en OpenStreetMap" "Compartir esta ubicación" + "Seguridad y privacidad" "Mensaje no enviado porque la identidad verificada de %1$s fue restablecida." "Mensaje no enviado porque %1$s no ha verificado todos los dispositivos." "Mensaje no enviado porque no has verificado uno o más de tus dispositivos." diff --git a/libraries/ui-strings/src/main/res/values-et/translations.xml b/libraries/ui-strings/src/main/res/values-et/translations.xml index 5f905c136d..e1e76f70da 100644 --- a/libraries/ui-strings/src/main/res/values-et/translations.xml +++ b/libraries/ui-strings/src/main/res/values-et/translations.xml @@ -95,6 +95,7 @@ "Kas unustasid salasõna?" "Edasta" "Tagasi eelmisesse vaatesse" + "Ava „Rollid ja õigused“" "Ava seadistused" "Eira" "Kutsu" @@ -420,6 +421,7 @@ Kas sa oled kindel, et soovid jätkata?" "🔐️ Liitu minuga rakenduses %1$s" "Hei, suhtle minuga %1$s võrgus: %2$s" "%1$s Android" + "Jutulõng „%1$s“ jututoas" "Veast teatamiseks raputa nutiseadet ägedalt" "Ekraanitõmmis" "%1$s: %2$s" @@ -467,6 +469,9 @@ Kas sa oled kindel, et soovid jätkata?" "Kogukond: %1$s" "Kogukonnad" "Vaata liikmeid" + "Lahku kogukonnast" + "Rollid ja õigused" + "Turvalisus ja privaatsus" "Sõnum on saatmata, kuna kasutaja %1$s verifitseeritud identiteet on lähtestatud." "Sõnum on saatmata, kuna %1$s pole verifitseerinud kõiki oma seadmeid." "Kuna sa pole üks või enamgi oma seadet verifitseerinud, siis sinu sõnum on saatmata." diff --git a/libraries/ui-strings/src/main/res/values-eu/translations.xml b/libraries/ui-strings/src/main/res/values-eu/translations.xml index 15bfa21fb5..394ee138a4 100644 --- a/libraries/ui-strings/src/main/res/values-eu/translations.xml +++ b/libraries/ui-strings/src/main/res/values-eu/translations.xml @@ -375,6 +375,7 @@ Ziur jarraitu nahi duzula?" "Ireki Google Maps-en" "Ireki OpenStreetMap-en" "Partekatu kokapen hau" + "Segurtasuna eta pribatutasuna" "Kokapena" "Bertsioa: %1$s (%2$s)" "eu" diff --git a/libraries/ui-strings/src/main/res/values-fa/translations.xml b/libraries/ui-strings/src/main/res/values-fa/translations.xml index 6f55ce0db4..3842880477 100644 --- a/libraries/ui-strings/src/main/res/values-fa/translations.xml +++ b/libraries/ui-strings/src/main/res/values-fa/translations.xml @@ -383,6 +383,8 @@ "‏%1$s فضا" "فضاها" "دیدن اعضا" + "ترک فضا" + "امنیت و محرمانگی" "مکان" "نگارش : %1$s (%2$s)" "fa" diff --git a/libraries/ui-strings/src/main/res/values-fi/translations.xml b/libraries/ui-strings/src/main/res/values-fi/translations.xml index 1885f56f66..ae1e7bf433 100644 --- a/libraries/ui-strings/src/main/res/values-fi/translations.xml +++ b/libraries/ui-strings/src/main/res/values-fi/translations.xml @@ -467,6 +467,8 @@ Haluatko varmasti jatkaa?" "%1$s tila" "Tilat" "Näytä jäsenet" + "Poistu tilasta" + "Turvallisuus ja yksityisyys" "Viestiä ei lähetetty, koska käyttäjän %1$s vahvistettu identiteetti nollattiin." "Viestiä ei lähetetty, koska %1$s ei ole vahvistanut kaikkia laitteitaan." "Viestiä ei lähetetty, koska et ole vahvistanut yhtä tai useampaa laitettasi." diff --git a/libraries/ui-strings/src/main/res/values-fr/translations.xml b/libraries/ui-strings/src/main/res/values-fr/translations.xml index 72e29691fa..d222ffea88 100644 --- a/libraries/ui-strings/src/main/res/values-fr/translations.xml +++ b/libraries/ui-strings/src/main/res/values-fr/translations.xml @@ -467,6 +467,8 @@ Raison : %1$s." "Espace %1$s" "Espaces" "Voir les membres" + "Quitter l’espace" + "Sécurité & confidentialité" "Le message n’a pas été envoyé car l’identité vérifiée de %1$s a été réinitialisée." "Le message n’a pas été envoyé car %1$s n’a pas vérifié tous ses appareils." "Message non envoyé car vous n’avez pas vérifié tous vos appareils." diff --git a/libraries/ui-strings/src/main/res/values-hu/translations.xml b/libraries/ui-strings/src/main/res/values-hu/translations.xml index a55b85b944..44952a9151 100644 --- a/libraries/ui-strings/src/main/res/values-hu/translations.xml +++ b/libraries/ui-strings/src/main/res/values-hu/translations.xml @@ -465,6 +465,8 @@ Biztos, hogy folytatja?" "%1$s • %2$s" "%1$s tér" "Terek" + "Tér elhagyása" + "Biztonság és adatvédelem" "Az üzenet nem lett elküldve, mert %1$s ellenőrzött személyazonossága megváltozott." "Az üzenet nem lett elküldve, mert %1$s nem ellenőrizte az összes eszközét." "Az üzenet nem lett elküldve, mert egy vagy több eszközét nem ellenőrizte." diff --git a/libraries/ui-strings/src/main/res/values-in/translations.xml b/libraries/ui-strings/src/main/res/values-in/translations.xml index bd7739d5ba..d95548ce4c 100644 --- a/libraries/ui-strings/src/main/res/values-in/translations.xml +++ b/libraries/ui-strings/src/main/res/values-in/translations.xml @@ -399,6 +399,7 @@ Apakah Anda yakin ingin melanjutkan?" "Buka di Google Maps" "Buka di OpenStreetMap" "Bagikan lokasi ini" + "Keamanan & privasi" "Pesan tidak terkirim karena identitas terverifikasi %1$s telah diatur ulang." "Pesan tidak terkirim karena %1$s belum memverifikasi semua perangkat." "Pesan tidak terkirim karena Anda belum memverifikasi satu atau beberapa perangkat Anda." diff --git a/libraries/ui-strings/src/main/res/values-it/translations.xml b/libraries/ui-strings/src/main/res/values-it/translations.xml index 77a1a20782..b0f637a133 100644 --- a/libraries/ui-strings/src/main/res/values-it/translations.xml +++ b/libraries/ui-strings/src/main/res/values-it/translations.xml @@ -447,6 +447,7 @@ Sei sicuro di voler continuare?" "Spazi che hai creato o a cui hai aderito." "%1$s • %2$s" "Spazi" + "Sicurezza e privacy" "Messaggio non inviato perché l\'identità verificata di %1$s è stata reimpostata." "Messaggio non inviato perché %1$s non ha verificato tutti i dispositivi." "Messaggio non inviato perché non hai verificato uno o più dispositivi." diff --git a/libraries/ui-strings/src/main/res/values-ko/translations.xml b/libraries/ui-strings/src/main/res/values-ko/translations.xml index 256e561db5..f7d3d65da5 100644 --- a/libraries/ui-strings/src/main/res/values-ko/translations.xml +++ b/libraries/ui-strings/src/main/res/values-ko/translations.xml @@ -440,6 +440,7 @@ "당신이 스페이스를 만들거나 가입했습니다." "%1$s•%2$s" "스페이스" + "보안 및 개인정보 보호" "%1$s의 인증된 신원이 재설정되어 메시지가 전송되지 않았습니다." "%1$s 이 모든 장치를 확인하지 않았기 때문에 메시지가 전송되지 않았습니다." "하나 이상의 기기를 확인하지 않았기 때문에 메시지가 전송되지 않았습니다." diff --git a/libraries/ui-strings/src/main/res/values-nb/translations.xml b/libraries/ui-strings/src/main/res/values-nb/translations.xml index e64a005577..83694a16b8 100644 --- a/libraries/ui-strings/src/main/res/values-nb/translations.xml +++ b/libraries/ui-strings/src/main/res/values-nb/translations.xml @@ -465,6 +465,8 @@ Er du sikker på at du vil fortsette?" "%1$s område" "Områder" "Vis medlemmer" + "Forlat område" + "Sikkerhet og personvern" "Meldingen ble ikke sendt fordi %1$ss verifiserte identitet er tilbakestilt." "Meldingen ble ikke sendt fordi %1$s ikke har verifisert alle enheter." "Meldingen ble ikke sendt fordi du ikke har verifisert en eller flere av enhetene dine." diff --git a/libraries/ui-strings/src/main/res/values-pl/translations.xml b/libraries/ui-strings/src/main/res/values-pl/translations.xml index e4186fd0f2..6ab2aa615d 100644 --- a/libraries/ui-strings/src/main/res/values-pl/translations.xml +++ b/libraries/ui-strings/src/main/res/values-pl/translations.xml @@ -475,6 +475,8 @@ Czy na pewno chcesz kontynuować?" "%1$s • %2$s" "Przestrzeń %1$s" "Przestrzenie" + "Opuść przestrzeń" + "Bezpieczeństwo i prywatność" "Wiadomość nie została wysłana, ponieważ tożsamość %1$s została zresetowana." "Wiadomość nie została wysłana, ponieważ %1$s nie zweryfikował wszystkich urządzeń." "Wiadomość nie została wysłana, ponieważ nie zweryfikowałeś jednego lub więcej swoich urządzeń." diff --git a/libraries/ui-strings/src/main/res/values-pt-rBR/translations.xml b/libraries/ui-strings/src/main/res/values-pt-rBR/translations.xml index fabc600b67..8256d9b429 100644 --- a/libraries/ui-strings/src/main/res/values-pt-rBR/translations.xml +++ b/libraries/ui-strings/src/main/res/values-pt-rBR/translations.xml @@ -428,6 +428,7 @@ Você tem certeza de que deseja continuar?" "Os espaços que você criou ou entrou." "%1$s • %2$s" "Espaços" + "Segurança e privacidade" "Mensagem não enviada porque a identidade verificada de %1$s foi redefinida." "A mensagem não foi enviada porque %1$s não verificou todos os dispositivos." "Mensagem não enviada porque você não verificou um ou mais dos seus dispositivos." diff --git a/libraries/ui-strings/src/main/res/values-pt/translations.xml b/libraries/ui-strings/src/main/res/values-pt/translations.xml index 5e55f3a9de..b754842c1d 100644 --- a/libraries/ui-strings/src/main/res/values-pt/translations.xml +++ b/libraries/ui-strings/src/main/res/values-pt/translations.xml @@ -461,6 +461,8 @@ Tens a certeza de que queres continuar?" "%1$s • %2$s" "Espaço %1$s" "Espaços" + "Sair do espaço" + "Segurança e privacidade" "Mensagem não enviada porque a identidade verificada de %1$s foi reposta." "Mensagem não enviada porque %1$s não verificou todos os dispositivos." "Mensagem não enviada porque não verificou um ou mais dos seus dispositivos." diff --git a/libraries/ui-strings/src/main/res/values-ro/translations.xml b/libraries/ui-strings/src/main/res/values-ro/translations.xml index 0cf1acf673..e5936ee4bf 100644 --- a/libraries/ui-strings/src/main/res/values-ro/translations.xml +++ b/libraries/ui-strings/src/main/res/values-ro/translations.xml @@ -475,6 +475,8 @@ Sunteți sigur că doriți să continuați?" "%1$s • %2$s" "Spațiu %1$s" "Spații" + "Părăsiți spațiul" + "Securitate & confidențialitate" "Mesajul nu a fost trimis deoarece identitatea verificată a lui %1$s s-a schimbat." "Mesajul nu a fost trimis deoarece %1$s nu a verificat toate dispozitivele." "Mesajul nu a fost trimis deoarece nu ați verificat unul sau mai multe dispozitive." diff --git a/libraries/ui-strings/src/main/res/values-ru/translations.xml b/libraries/ui-strings/src/main/res/values-ru/translations.xml index fc856adf94..6de1d6855c 100644 --- a/libraries/ui-strings/src/main/res/values-ru/translations.xml +++ b/libraries/ui-strings/src/main/res/values-ru/translations.xml @@ -473,6 +473,8 @@ "%1$s • %2$s" "%1$s пространство" "Пространства" + "Покинуть пространство" + "Безопасность и конфиденциальность" "Сообщение не отправлено, потому что подтвержденная личность %1$s была сброшена." "Сообщение не отправлено, потому что %1$s не проверил одно или несколько устройств." "Сообщение не отправлено, поскольку вы не подтвердили одно или несколько своих устройств." diff --git a/libraries/ui-strings/src/main/res/values-sk/translations.xml b/libraries/ui-strings/src/main/res/values-sk/translations.xml index 263c1282b5..ed2fe96842 100644 --- a/libraries/ui-strings/src/main/res/values-sk/translations.xml +++ b/libraries/ui-strings/src/main/res/values-sk/translations.xml @@ -97,6 +97,7 @@ "Zabudnuté heslo?" "Preposlať" "Ísť späť" + "Prejsť na roly a oprávnenia" "Prejsť na nastavenia" "Ignorovať" "Pozvať" @@ -178,7 +179,6 @@ "Pokročilé nastavenia" "obrázok" "Analytika" - "Načítavajú sa upozornenia…" "Opustili ste miestnosť" "Boli ste odhlásení zo relácie." "Vzhľad" @@ -478,6 +478,9 @@ Naozaj chcete pokračovať?" "%1$s priestor" "Priestory" "Zobraziť členov" + "Opustiť priestor" + "Roly a oprávnenia" + "Bezpečnosť a súkromie" "Správa nebola odoslaná, pretože sa zmenila overená totožnosť používateľa %1$s." "Správa nebola odoslaná, pretože %1$s neoveril/a všetky zariadenia." "Správa nebola odoslaná, pretože ste neoverili jedno alebo viac svojich zariadení." diff --git a/libraries/ui-strings/src/main/res/values-sv/translations.xml b/libraries/ui-strings/src/main/res/values-sv/translations.xml index e3cf26193e..838f17e2ff 100644 --- a/libraries/ui-strings/src/main/res/values-sv/translations.xml +++ b/libraries/ui-strings/src/main/res/values-sv/translations.xml @@ -445,6 +445,7 @@ Anledning:%1$s." "Utrymmen som du har skapat eller gått med i." "%1$s • %2$s" "Utrymmen" + "Säkerhet och sekretess" "Meddelandet skickades inte eftersom verifierad identitet för %1$s återställdes." "Meddelandet skickades inte eftersom %1$s inte har verifierat alla enheter." "Meddelandet skickades inte eftersom du inte har verifierat en eller flera av dina enheter." diff --git a/libraries/ui-strings/src/main/res/values-tr/translations.xml b/libraries/ui-strings/src/main/res/values-tr/translations.xml index c72f5a6139..b93df93242 100644 --- a/libraries/ui-strings/src/main/res/values-tr/translations.xml +++ b/libraries/ui-strings/src/main/res/values-tr/translations.xml @@ -365,6 +365,7 @@ Devam etmek istediğinizden emin misiniz?" "Google Maps\'te aç" "OpenStreetMap\'te aç" "Bu konumu paylaş" + "Güvenlik ve gizlilik" "%1$s kullanıcısının doğrulanmış kimliği değiştiği için ileti gönderilmedi." "%1$s tüm cihazları doğrulamadığı için mesaj gönderilmedi." "Bir veya daha fazla cihazınızı doğrulamadığınız için mesaj gönderilmedi." diff --git a/libraries/ui-strings/src/main/res/values-uk/translations.xml b/libraries/ui-strings/src/main/res/values-uk/translations.xml index a4c171a21b..e67544455a 100644 --- a/libraries/ui-strings/src/main/res/values-uk/translations.xml +++ b/libraries/ui-strings/src/main/res/values-uk/translations.xml @@ -461,6 +461,7 @@ "Простори, які ви створили або до яких приєдналися." "%1$s • %2$s" "Простори" + "Безпека й приватність" "Повідомлення не надіслано, оскільки підтверджену особистість %1$s скинуто." "Повідомлення не надіслано, оскільки %1$s перевірив не всі пристрої." "Повідомлення не надіслано, оскільки ви не підтвердили один або кілька своїх пристроїв." diff --git a/libraries/ui-strings/src/main/res/values-zh-rTW/translations.xml b/libraries/ui-strings/src/main/res/values-zh-rTW/translations.xml index 3f6aa4f320..9bfee19c57 100644 --- a/libraries/ui-strings/src/main/res/values-zh-rTW/translations.xml +++ b/libraries/ui-strings/src/main/res/values-zh-rTW/translations.xml @@ -412,6 +412,7 @@ "🔐️ 在 %1$s 上加入我" "嘿,來 %1$s 和我聊天:%2$s" "%1$s Android" + "在 %1$s 的討論串" "憤怒搖晃以回報臭蟲" "螢幕截圖" "%1$s:%2$s" @@ -457,6 +458,9 @@ "%1$s • %2$s" "%1$s 空間" "空間" + "檢視成員" + "離開空間" + "安全與隱私" "因為 %1$s 的驗證身份已重設,因此未傳送訊息。" "訊息未傳送,因為 %1$s 尚未驗證所有裝置。" "因為您尚未驗證一個或多個裝置,因此未傳送訊息" diff --git a/libraries/ui-strings/src/main/res/values-zh/translations.xml b/libraries/ui-strings/src/main/res/values-zh/translations.xml index a4144eb8f0..955df716b8 100644 --- a/libraries/ui-strings/src/main/res/values-zh/translations.xml +++ b/libraries/ui-strings/src/main/res/values-zh/translations.xml @@ -452,6 +452,8 @@ "您创建或加入的空间。" "%1$s • %2$s" "空间" + "离开空间" + "安全与隐私" "消息未发送,因为%1$s的已验证身份已被重置。" "消息未发送,因为%1$s尚未验证所有设备。" "消息未发送,因为您有尚未验证的设备。" diff --git a/libraries/ui-strings/src/main/res/values/localazy.xml b/libraries/ui-strings/src/main/res/values/localazy.xml index 8ca9198cfe..47fd764f6c 100644 --- a/libraries/ui-strings/src/main/res/values/localazy.xml +++ b/libraries/ui-strings/src/main/res/values/localazy.xml @@ -95,6 +95,7 @@ "Forgot password?" "Forward" "Go back" + "Go to roles & permissions" "Go to settings" "Ignore" "Invite" @@ -176,7 +177,6 @@ "Advanced settings" "an image" "Analytics" - "Fetching notifications…" "You left the room" "You were logged out of the session" "Appearance" @@ -469,6 +469,9 @@ Are you sure you want to continue?" "%1$s space" "Spaces" "View members" + "Leave space" + "Roles & permissions" + "Security & privacy" "Message not sent because %1$s’s verified identity was reset." "Message not sent because %1$s has not verified all devices." "Message not sent because you have not verified one or more of your devices." diff --git a/screenshots/de/appnav.room.joined_LoadingRoomNodeView_Day_1_de.png b/screenshots/de/appnav.room.joined_LoadingRoomNodeView_Day_1_de.png index 04fcabdf4d..f7a5852846 100644 --- a/screenshots/de/appnav.room.joined_LoadingRoomNodeView_Day_1_de.png +++ b/screenshots/de/appnav.room.joined_LoadingRoomNodeView_Day_1_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:cf9acfcae8fa5c62a6d002ea931165e98b0b9389714f2b5a012d59fc607be388 -size 11051 +oid sha256:173c488c77b3ba1f0b8190c626e51d12d221e4b85aaa83b3fe5caf3e25fe458d +size 10189 diff --git a/screenshots/de/features.messages.impl.forward_ForwardMessagesView_Day_3_de.png b/screenshots/de/features.forward.impl_ForwardMessagesView_Day_3_de.png similarity index 100% rename from screenshots/de/features.messages.impl.forward_ForwardMessagesView_Day_3_de.png rename to screenshots/de/features.forward.impl_ForwardMessagesView_Day_3_de.png diff --git a/screenshots/de/features.roomdetails.impl.edit_RoomDetailsEditView_Day_8_de.png b/screenshots/de/features.roomdetails.impl.edit_RoomDetailsEditView_Day_8_de.png new file mode 100644 index 0000000000..02051a08da --- /dev/null +++ b/screenshots/de/features.roomdetails.impl.edit_RoomDetailsEditView_Day_8_de.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:12f8ce1dbeb1a16ab8351486310fdeabba566db4aad460fc4e1e1f7fdbe63bf7 +size 37209 diff --git a/screenshots/de/features.roomdetails.impl.members_RoomMemberListView_Day_1_de.png b/screenshots/de/features.roomdetails.impl.members_RoomMemberListView_Day_1_de.png index 482c1c948f..8e26af29d4 100644 --- a/screenshots/de/features.roomdetails.impl.members_RoomMemberListView_Day_1_de.png +++ b/screenshots/de/features.roomdetails.impl.members_RoomMemberListView_Day_1_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:fc00250676d4b227efd4792461f78ea76b4fb7be4200b5fddb7419679a385181 -size 47183 +oid sha256:8b5883dce06f6c481b1d20e08ba4833f67b69714c23c60b4ffe88d0dee0d4797 +size 52280 diff --git a/screenshots/de/features.space.impl.root_SpaceView_Day_0_de.png b/screenshots/de/features.space.impl.root_SpaceView_Day_0_de.png index 423f728994..66bcb88c50 100644 --- a/screenshots/de/features.space.impl.root_SpaceView_Day_0_de.png +++ b/screenshots/de/features.space.impl.root_SpaceView_Day_0_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:7bd48a463398ab53d8930c31ed8351b597b98b8502a8f5b1d634b7a802b13224 -size 34842 +oid sha256:6efe4f355c6372ad031136f6f2de51c3c6132e18ddc70f558c16ee921befefa0 +size 34819 diff --git a/screenshots/de/features.space.impl.root_SpaceView_Day_1_de.png b/screenshots/de/features.space.impl.root_SpaceView_Day_1_de.png index 238139c94f..71f98c9def 100644 --- a/screenshots/de/features.space.impl.root_SpaceView_Day_1_de.png +++ b/screenshots/de/features.space.impl.root_SpaceView_Day_1_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:01b313b5135b1c2dbc4bd808472c9d3113f4e1aba4ddea8111bae9038f7a5bfc -size 35886 +oid sha256:3af3d6c1c57c37f88f37624614a1bca7e9fcae0042482d293f2eef69a7350713 +size 35864 diff --git a/screenshots/de/features.space.impl.root_SpaceView_Day_2_de.png b/screenshots/de/features.space.impl.root_SpaceView_Day_2_de.png index ac2147d97f..68e0fdf009 100644 --- a/screenshots/de/features.space.impl.root_SpaceView_Day_2_de.png +++ b/screenshots/de/features.space.impl.root_SpaceView_Day_2_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:e1f22f80f55dfbcc863e9ae1770aa5de2ea1c80f389fca3b4460b51856144cac -size 36184 +oid sha256:65fab252bd1c0920692404f0067323bfb33df9124ba5dc3ad5be5008295fbc0f +size 36158 diff --git a/screenshots/de/features.space.impl.root_SpaceView_Day_3_de.png b/screenshots/de/features.space.impl.root_SpaceView_Day_3_de.png index e79a267816..1c22e938cb 100644 --- a/screenshots/de/features.space.impl.root_SpaceView_Day_3_de.png +++ b/screenshots/de/features.space.impl.root_SpaceView_Day_3_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:a6b4b1feee6815dab72dc3c48e082dcde654e7c9c611a5ecc8ebe5cbfbbc1ebb -size 65211 +oid sha256:ecb9ad959737f80864480f7fa3cce8e31a1b0c2aa84d5b49ff8b119b1aa5bc1e +size 65190 diff --git a/screenshots/de/features.space.impl.root_SpaceView_Day_4_de.png b/screenshots/de/features.space.impl.root_SpaceView_Day_4_de.png index 45495330f9..52dd6c93a0 100644 --- a/screenshots/de/features.space.impl.root_SpaceView_Day_4_de.png +++ b/screenshots/de/features.space.impl.root_SpaceView_Day_4_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:b4fd28760ff4386ea8fbc45ab5d42a5d89881afbd4771c978d45e0a279bb75fc -size 65828 +oid sha256:fcdf0489810fe2035f072cdb5cc5e3c78cb3ee4e5d220148ed2721dbf324d7e6 +size 65805 diff --git a/screenshots/de/features.space.impl.root_SpaceView_Day_5_de.png b/screenshots/de/features.space.impl.root_SpaceView_Day_5_de.png index f68d2fba50..ff45615538 100644 --- a/screenshots/de/features.space.impl.root_SpaceView_Day_5_de.png +++ b/screenshots/de/features.space.impl.root_SpaceView_Day_5_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:601299d37927f03b696a2589ebcb481ae7efa13a35c49f9621f786a5f87f3130 -size 60275 +oid sha256:7a9166782d34d5388b8cdcdf270f8ac854bad44e24a30f35661af2a93cdbeb4a +size 60269 diff --git a/screenshots/de/libraries.mediaviewer.impl.details_MediaDetailsBottomSheet_Day_0_de.png b/screenshots/de/libraries.mediaviewer.impl.details_MediaDetailsBottomSheet_Day_0_de.png index 8be502c48e..eebead276c 100644 --- a/screenshots/de/libraries.mediaviewer.impl.details_MediaDetailsBottomSheet_Day_0_de.png +++ b/screenshots/de/libraries.mediaviewer.impl.details_MediaDetailsBottomSheet_Day_0_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:57800bd0df9e4eabd4ed60d9868ba4e0dd82ea2268567893252b21b3bdf769e2 -size 43078 +oid sha256:bea0bbfeeffc6e4fcfcf5c2802e415eec785f923f114afcb31f8e80f49b97f01 +size 45514 diff --git a/screenshots/de/libraries.mediaviewer.impl.gallery_MediaGalleryView_Day_8_de.png b/screenshots/de/libraries.mediaviewer.impl.gallery_MediaGalleryView_Day_8_de.png index 91c9af4023..90ed906e03 100644 --- a/screenshots/de/libraries.mediaviewer.impl.gallery_MediaGalleryView_Day_8_de.png +++ b/screenshots/de/libraries.mediaviewer.impl.gallery_MediaGalleryView_Day_8_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:748a0d0bd122a55520ebdd673300321fb41c06b24f84baeeab17c4a253e34cc2 -size 45804 +oid sha256:be243fc9a55bd214187605b79226885382f0a92601ceeac4e6495179d982683d +size 45443 diff --git a/screenshots/de/libraries.mediaviewer.impl.viewer_MediaViewerView_11_de.png b/screenshots/de/libraries.mediaviewer.impl.viewer_MediaViewerView_11_de.png index bf12cfa991..212b565f9f 100644 --- a/screenshots/de/libraries.mediaviewer.impl.viewer_MediaViewerView_11_de.png +++ b/screenshots/de/libraries.mediaviewer.impl.viewer_MediaViewerView_11_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:19e9bd753d0e325d905ec71b9f4912eb4f10264ea9a92a98346b209ec039c856 -size 42635 +oid sha256:1b8297bd3c5532a327728b0d517e6a634bf4f689df3f3e8a039814eb26f659af +size 43984 diff --git a/screenshots/html/data.js b/screenshots/html/data.js index 650364a46c..317e8e04d7 100644 --- a/screenshots/html/data.js +++ b/screenshots/html/data.js @@ -1,80 +1,80 @@ // Generated file, do not edit export const screenshots = [ ["en","en-dark","de",], -["features.preferences.impl.about_AboutView_Day_0_en","features.preferences.impl.about_AboutView_Night_0_en",20385,], +["features.preferences.impl.about_AboutView_Day_0_en","features.preferences.impl.about_AboutView_Night_0_en",20392,], ["features.invite.impl.acceptdecline_AcceptDeclineInviteView_Day_0_en","features.invite.impl.acceptdecline_AcceptDeclineInviteView_Night_0_en",0,], -["features.invite.impl.acceptdecline_AcceptDeclineInviteView_Day_1_en","features.invite.impl.acceptdecline_AcceptDeclineInviteView_Night_1_en",20385,], -["features.invite.impl.acceptdecline_AcceptDeclineInviteView_Day_2_en","features.invite.impl.acceptdecline_AcceptDeclineInviteView_Night_2_en",20385,], -["features.invite.impl.acceptdecline_AcceptDeclineInviteView_Day_3_en","features.invite.impl.acceptdecline_AcceptDeclineInviteView_Night_3_en",20385,], -["features.invite.impl.acceptdecline_AcceptDeclineInviteView_Day_4_en","features.invite.impl.acceptdecline_AcceptDeclineInviteView_Night_4_en",20385,], -["features.invite.impl.acceptdecline_AcceptDeclineInviteView_Day_5_en","features.invite.impl.acceptdecline_AcceptDeclineInviteView_Night_5_en",20385,], -["features.logout.impl_AccountDeactivationView_Day_0_en","features.logout.impl_AccountDeactivationView_Night_0_en",20385,], -["features.logout.impl_AccountDeactivationView_Day_1_en","features.logout.impl_AccountDeactivationView_Night_1_en",20385,], -["features.logout.impl_AccountDeactivationView_Day_2_en","features.logout.impl_AccountDeactivationView_Night_2_en",20385,], -["features.logout.impl_AccountDeactivationView_Day_3_en","features.logout.impl_AccountDeactivationView_Night_3_en",20385,], -["features.logout.impl_AccountDeactivationView_Day_4_en","features.logout.impl_AccountDeactivationView_Night_4_en",20385,], -["features.login.impl.accountprovider_AccountProviderOtherView_Day_0_en","features.login.impl.accountprovider_AccountProviderOtherView_Night_0_en",20385,], +["features.invite.impl.acceptdecline_AcceptDeclineInviteView_Day_1_en","features.invite.impl.acceptdecline_AcceptDeclineInviteView_Night_1_en",20392,], +["features.invite.impl.acceptdecline_AcceptDeclineInviteView_Day_2_en","features.invite.impl.acceptdecline_AcceptDeclineInviteView_Night_2_en",20392,], +["features.invite.impl.acceptdecline_AcceptDeclineInviteView_Day_3_en","features.invite.impl.acceptdecline_AcceptDeclineInviteView_Night_3_en",20392,], +["features.invite.impl.acceptdecline_AcceptDeclineInviteView_Day_4_en","features.invite.impl.acceptdecline_AcceptDeclineInviteView_Night_4_en",20392,], +["features.invite.impl.acceptdecline_AcceptDeclineInviteView_Day_5_en","features.invite.impl.acceptdecline_AcceptDeclineInviteView_Night_5_en",20392,], +["features.logout.impl_AccountDeactivationView_Day_0_en","features.logout.impl_AccountDeactivationView_Night_0_en",20392,], +["features.logout.impl_AccountDeactivationView_Day_1_en","features.logout.impl_AccountDeactivationView_Night_1_en",20392,], +["features.logout.impl_AccountDeactivationView_Day_2_en","features.logout.impl_AccountDeactivationView_Night_2_en",20392,], +["features.logout.impl_AccountDeactivationView_Day_3_en","features.logout.impl_AccountDeactivationView_Night_3_en",20392,], +["features.logout.impl_AccountDeactivationView_Day_4_en","features.logout.impl_AccountDeactivationView_Night_4_en",20392,], +["features.login.impl.accountprovider_AccountProviderOtherView_Day_0_en","features.login.impl.accountprovider_AccountProviderOtherView_Night_0_en",20392,], ["features.login.impl.accountprovider_AccountProviderView_Day_0_en","features.login.impl.accountprovider_AccountProviderView_Night_0_en",0,], ["features.login.impl.accountprovider_AccountProviderView_Day_1_en","features.login.impl.accountprovider_AccountProviderView_Night_1_en",0,], ["features.login.impl.accountprovider_AccountProviderView_Day_2_en","features.login.impl.accountprovider_AccountProviderView_Night_2_en",0,], ["features.login.impl.accountprovider_AccountProviderView_Day_3_en","features.login.impl.accountprovider_AccountProviderView_Night_3_en",0,], -["libraries.accountselect.impl_AccountSelectView_Day_0_en","libraries.accountselect.impl_AccountSelectView_Night_0_en",20385,], -["libraries.accountselect.impl_AccountSelectView_Day_1_en","libraries.accountselect.impl_AccountSelectView_Night_1_en",20385,], +["libraries.accountselect.impl_AccountSelectView_Day_0_en","libraries.accountselect.impl_AccountSelectView_Night_0_en",20392,], +["libraries.accountselect.impl_AccountSelectView_Day_1_en","libraries.accountselect.impl_AccountSelectView_Night_1_en",20392,], ["features.messages.impl.actionlist_ActionListViewContent_Day_0_en","features.messages.impl.actionlist_ActionListViewContent_Night_0_en",0,], -["features.messages.impl.actionlist_ActionListViewContent_Day_10_en","features.messages.impl.actionlist_ActionListViewContent_Night_10_en",20385,], -["features.messages.impl.actionlist_ActionListViewContent_Day_11_en","features.messages.impl.actionlist_ActionListViewContent_Night_11_en",20385,], -["features.messages.impl.actionlist_ActionListViewContent_Day_12_en","features.messages.impl.actionlist_ActionListViewContent_Night_12_en",20385,], +["features.messages.impl.actionlist_ActionListViewContent_Day_10_en","features.messages.impl.actionlist_ActionListViewContent_Night_10_en",20392,], +["features.messages.impl.actionlist_ActionListViewContent_Day_11_en","features.messages.impl.actionlist_ActionListViewContent_Night_11_en",20392,], +["features.messages.impl.actionlist_ActionListViewContent_Day_12_en","features.messages.impl.actionlist_ActionListViewContent_Night_12_en",20392,], ["features.messages.impl.actionlist_ActionListViewContent_Day_1_en","features.messages.impl.actionlist_ActionListViewContent_Night_1_en",0,], -["features.messages.impl.actionlist_ActionListViewContent_Day_2_en","features.messages.impl.actionlist_ActionListViewContent_Night_2_en",20385,], -["features.messages.impl.actionlist_ActionListViewContent_Day_3_en","features.messages.impl.actionlist_ActionListViewContent_Night_3_en",20385,], -["features.messages.impl.actionlist_ActionListViewContent_Day_4_en","features.messages.impl.actionlist_ActionListViewContent_Night_4_en",20385,], -["features.messages.impl.actionlist_ActionListViewContent_Day_5_en","features.messages.impl.actionlist_ActionListViewContent_Night_5_en",20385,], -["features.messages.impl.actionlist_ActionListViewContent_Day_6_en","features.messages.impl.actionlist_ActionListViewContent_Night_6_en",20385,], -["features.messages.impl.actionlist_ActionListViewContent_Day_7_en","features.messages.impl.actionlist_ActionListViewContent_Night_7_en",20385,], -["features.messages.impl.actionlist_ActionListViewContent_Day_8_en","features.messages.impl.actionlist_ActionListViewContent_Night_8_en",20385,], -["features.messages.impl.actionlist_ActionListViewContent_Day_9_en","features.messages.impl.actionlist_ActionListViewContent_Night_9_en",20385,], -["features.createroom.impl.addpeople_AddPeopleView_Day_0_en","features.createroom.impl.addpeople_AddPeopleView_Night_0_en",20385,], -["features.createroom.impl.addpeople_AddPeopleView_Day_1_en","features.createroom.impl.addpeople_AddPeopleView_Night_1_en",20385,], -["features.createroom.impl.addpeople_AddPeopleView_Day_2_en","features.createroom.impl.addpeople_AddPeopleView_Night_2_en",20385,], -["features.createroom.impl.addpeople_AddPeopleView_Day_3_en","features.createroom.impl.addpeople_AddPeopleView_Night_3_en",20385,], -["features.preferences.impl.advanced_AdvancedSettingsViewDark_0_en","",20385,], -["features.preferences.impl.advanced_AdvancedSettingsViewDark_1_en","",20385,], -["features.preferences.impl.advanced_AdvancedSettingsViewDark_2_en","",20385,], -["features.preferences.impl.advanced_AdvancedSettingsViewDark_3_en","",20385,], -["features.preferences.impl.advanced_AdvancedSettingsViewDark_4_en","",20385,], -["features.preferences.impl.advanced_AdvancedSettingsViewDark_5_en","",20385,], -["features.preferences.impl.advanced_AdvancedSettingsViewDark_6_en","",20385,], -["features.preferences.impl.advanced_AdvancedSettingsViewDark_7_en","",20385,], -["features.preferences.impl.advanced_AdvancedSettingsViewDark_8_en","",20385,], -["features.preferences.impl.advanced_AdvancedSettingsViewLight_0_en","",20385,], -["features.preferences.impl.advanced_AdvancedSettingsViewLight_1_en","",20385,], -["features.preferences.impl.advanced_AdvancedSettingsViewLight_2_en","",20385,], -["features.preferences.impl.advanced_AdvancedSettingsViewLight_3_en","",20385,], -["features.preferences.impl.advanced_AdvancedSettingsViewLight_4_en","",20385,], -["features.preferences.impl.advanced_AdvancedSettingsViewLight_5_en","",20385,], -["features.preferences.impl.advanced_AdvancedSettingsViewLight_6_en","",20385,], -["features.preferences.impl.advanced_AdvancedSettingsViewLight_7_en","",20385,], -["features.preferences.impl.advanced_AdvancedSettingsViewLight_8_en","",20385,], -["libraries.designsystem.components.dialogs_AlertDialogContent_Dialogs_en","",20385,], -["libraries.designsystem.components.dialogs_AlertDialog_Day_0_en","libraries.designsystem.components.dialogs_AlertDialog_Night_0_en",20385,], +["features.messages.impl.actionlist_ActionListViewContent_Day_2_en","features.messages.impl.actionlist_ActionListViewContent_Night_2_en",20392,], +["features.messages.impl.actionlist_ActionListViewContent_Day_3_en","features.messages.impl.actionlist_ActionListViewContent_Night_3_en",20392,], +["features.messages.impl.actionlist_ActionListViewContent_Day_4_en","features.messages.impl.actionlist_ActionListViewContent_Night_4_en",20392,], +["features.messages.impl.actionlist_ActionListViewContent_Day_5_en","features.messages.impl.actionlist_ActionListViewContent_Night_5_en",20392,], +["features.messages.impl.actionlist_ActionListViewContent_Day_6_en","features.messages.impl.actionlist_ActionListViewContent_Night_6_en",20392,], +["features.messages.impl.actionlist_ActionListViewContent_Day_7_en","features.messages.impl.actionlist_ActionListViewContent_Night_7_en",20392,], +["features.messages.impl.actionlist_ActionListViewContent_Day_8_en","features.messages.impl.actionlist_ActionListViewContent_Night_8_en",20392,], +["features.messages.impl.actionlist_ActionListViewContent_Day_9_en","features.messages.impl.actionlist_ActionListViewContent_Night_9_en",20392,], +["features.createroom.impl.addpeople_AddPeopleView_Day_0_en","features.createroom.impl.addpeople_AddPeopleView_Night_0_en",20392,], +["features.createroom.impl.addpeople_AddPeopleView_Day_1_en","features.createroom.impl.addpeople_AddPeopleView_Night_1_en",20392,], +["features.createroom.impl.addpeople_AddPeopleView_Day_2_en","features.createroom.impl.addpeople_AddPeopleView_Night_2_en",20392,], +["features.createroom.impl.addpeople_AddPeopleView_Day_3_en","features.createroom.impl.addpeople_AddPeopleView_Night_3_en",20392,], +["features.preferences.impl.advanced_AdvancedSettingsViewDark_0_en","",20392,], +["features.preferences.impl.advanced_AdvancedSettingsViewDark_1_en","",20392,], +["features.preferences.impl.advanced_AdvancedSettingsViewDark_2_en","",20392,], +["features.preferences.impl.advanced_AdvancedSettingsViewDark_3_en","",20392,], +["features.preferences.impl.advanced_AdvancedSettingsViewDark_4_en","",20392,], +["features.preferences.impl.advanced_AdvancedSettingsViewDark_5_en","",20392,], +["features.preferences.impl.advanced_AdvancedSettingsViewDark_6_en","",20392,], +["features.preferences.impl.advanced_AdvancedSettingsViewDark_7_en","",20392,], +["features.preferences.impl.advanced_AdvancedSettingsViewDark_8_en","",20392,], +["features.preferences.impl.advanced_AdvancedSettingsViewLight_0_en","",20392,], +["features.preferences.impl.advanced_AdvancedSettingsViewLight_1_en","",20392,], +["features.preferences.impl.advanced_AdvancedSettingsViewLight_2_en","",20392,], +["features.preferences.impl.advanced_AdvancedSettingsViewLight_3_en","",20392,], +["features.preferences.impl.advanced_AdvancedSettingsViewLight_4_en","",20392,], +["features.preferences.impl.advanced_AdvancedSettingsViewLight_5_en","",20392,], +["features.preferences.impl.advanced_AdvancedSettingsViewLight_6_en","",20392,], +["features.preferences.impl.advanced_AdvancedSettingsViewLight_7_en","",20392,], +["features.preferences.impl.advanced_AdvancedSettingsViewLight_8_en","",20392,], +["libraries.designsystem.components.dialogs_AlertDialogContent_Dialogs_en","",20392,], +["libraries.designsystem.components.dialogs_AlertDialog_Day_0_en","libraries.designsystem.components.dialogs_AlertDialog_Night_0_en",20392,], ["libraries.designsystem.theme.components_AllIcons_Icons_en","",0,], -["features.analytics.impl_AnalyticsOptInView_Day_0_en","features.analytics.impl_AnalyticsOptInView_Night_0_en",20385,], -["features.analytics.impl_AnalyticsOptInView_Day_1_en","features.analytics.impl_AnalyticsOptInView_Night_1_en",20385,], -["features.analytics.api.preferences_AnalyticsPreferencesView_Day_0_en","features.analytics.api.preferences_AnalyticsPreferencesView_Night_0_en",20385,], -["features.analytics.api.preferences_AnalyticsPreferencesView_Day_1_en","features.analytics.api.preferences_AnalyticsPreferencesView_Night_1_en",20385,], -["features.preferences.impl.analytics_AnalyticsSettingsView_Day_0_en","features.preferences.impl.analytics_AnalyticsSettingsView_Night_0_en",20385,], +["features.analytics.impl_AnalyticsOptInView_Day_0_en","features.analytics.impl_AnalyticsOptInView_Night_0_en",20392,], +["features.analytics.impl_AnalyticsOptInView_Day_1_en","features.analytics.impl_AnalyticsOptInView_Night_1_en",20392,], +["features.analytics.api.preferences_AnalyticsPreferencesView_Day_0_en","features.analytics.api.preferences_AnalyticsPreferencesView_Night_0_en",20392,], +["features.analytics.api.preferences_AnalyticsPreferencesView_Day_1_en","features.analytics.api.preferences_AnalyticsPreferencesView_Night_1_en",20392,], +["features.preferences.impl.analytics_AnalyticsSettingsView_Day_0_en","features.preferences.impl.analytics_AnalyticsSettingsView_Night_0_en",20392,], ["libraries.designsystem.components_Announcement_Day_0_en","libraries.designsystem.components_Announcement_Night_0_en",0,], -["services.apperror.impl_AppErrorView_Day_0_en","services.apperror.impl_AppErrorView_Night_0_en",20385,], +["services.apperror.impl_AppErrorView_Day_0_en","services.apperror.impl_AppErrorView_Night_0_en",20392,], ["libraries.designsystem.components.async_AsyncActionView_Day_0_en","libraries.designsystem.components.async_AsyncActionView_Night_0_en",0,], -["libraries.designsystem.components.async_AsyncActionView_Day_1_en","libraries.designsystem.components.async_AsyncActionView_Night_1_en",20385,], +["libraries.designsystem.components.async_AsyncActionView_Day_1_en","libraries.designsystem.components.async_AsyncActionView_Night_1_en",20392,], ["libraries.designsystem.components.async_AsyncActionView_Day_2_en","libraries.designsystem.components.async_AsyncActionView_Night_2_en",0,], -["libraries.designsystem.components.async_AsyncActionView_Day_3_en","libraries.designsystem.components.async_AsyncActionView_Night_3_en",20385,], +["libraries.designsystem.components.async_AsyncActionView_Day_3_en","libraries.designsystem.components.async_AsyncActionView_Night_3_en",20392,], ["libraries.designsystem.components.async_AsyncActionView_Day_4_en","libraries.designsystem.components.async_AsyncActionView_Night_4_en",0,], -["libraries.designsystem.components.async_AsyncFailure_Day_0_en","libraries.designsystem.components.async_AsyncFailure_Night_0_en",20385,], +["libraries.designsystem.components.async_AsyncFailure_Day_0_en","libraries.designsystem.components.async_AsyncFailure_Night_0_en",20392,], ["libraries.designsystem.components.async_AsyncIndicatorFailure_Day_0_en","libraries.designsystem.components.async_AsyncIndicatorFailure_Night_0_en",0,], ["libraries.designsystem.components.async_AsyncIndicatorLoading_Day_0_en","libraries.designsystem.components.async_AsyncIndicatorLoading_Night_0_en",0,], ["libraries.designsystem.components.async_AsyncLoading_Day_0_en","libraries.designsystem.components.async_AsyncLoading_Night_0_en",0,], -["features.messages.impl.messagecomposer_AttachmentSourcePickerMenu_Day_0_en","features.messages.impl.messagecomposer_AttachmentSourcePickerMenu_Night_0_en",20385,], +["features.messages.impl.messagecomposer_AttachmentSourcePickerMenu_Day_0_en","features.messages.impl.messagecomposer_AttachmentSourcePickerMenu_Night_0_en",20392,], ["libraries.matrix.ui.components_AttachmentThumbnail_Day_0_en","libraries.matrix.ui.components_AttachmentThumbnail_Night_0_en",0,], ["libraries.matrix.ui.components_AttachmentThumbnail_Day_1_en","libraries.matrix.ui.components_AttachmentThumbnail_Night_1_en",0,], ["libraries.matrix.ui.components_AttachmentThumbnail_Day_2_en","libraries.matrix.ui.components_AttachmentThumbnail_Night_2_en",0,], @@ -84,19 +84,19 @@ export const screenshots = [ ["libraries.matrix.ui.components_AttachmentThumbnail_Day_6_en","libraries.matrix.ui.components_AttachmentThumbnail_Night_6_en",0,], ["libraries.matrix.ui.components_AttachmentThumbnail_Day_7_en","libraries.matrix.ui.components_AttachmentThumbnail_Night_7_en",0,], ["libraries.matrix.ui.components_AttachmentThumbnail_Day_8_en","libraries.matrix.ui.components_AttachmentThumbnail_Night_8_en",0,], -["features.messages.impl.attachments.preview_AttachmentsView_0_en","",20385,], -["features.messages.impl.attachments.preview_AttachmentsView_1_en","",20385,], -["features.messages.impl.attachments.preview_AttachmentsView_2_en","",20385,], -["features.messages.impl.attachments.preview_AttachmentsView_3_en","",20385,], -["features.messages.impl.attachments.preview_AttachmentsView_4_en","",20385,], -["features.messages.impl.attachments.preview_AttachmentsView_5_en","",20385,], -["features.messages.impl.attachments.preview_AttachmentsView_6_en","",20385,], -["features.messages.impl.attachments.preview_AttachmentsView_7_en","",20385,], -["features.messages.impl.attachments.preview_AttachmentsView_8_en","",20385,], +["features.messages.impl.attachments.preview_AttachmentsView_0_en","",20392,], +["features.messages.impl.attachments.preview_AttachmentsView_1_en","",20392,], +["features.messages.impl.attachments.preview_AttachmentsView_2_en","",20392,], +["features.messages.impl.attachments.preview_AttachmentsView_3_en","",20392,], +["features.messages.impl.attachments.preview_AttachmentsView_4_en","",20392,], +["features.messages.impl.attachments.preview_AttachmentsView_5_en","",20392,], +["features.messages.impl.attachments.preview_AttachmentsView_6_en","",20392,], +["features.messages.impl.attachments.preview_AttachmentsView_7_en","",20392,], +["features.messages.impl.attachments.preview_AttachmentsView_8_en","",20392,], ["libraries.mediaviewer.impl.gallery.ui_AudioItemView_Day_0_en","libraries.mediaviewer.impl.gallery.ui_AudioItemView_Night_0_en",0,], ["libraries.mediaviewer.impl.gallery.ui_AudioItemView_Day_1_en","libraries.mediaviewer.impl.gallery.ui_AudioItemView_Night_1_en",0,], ["libraries.mediaviewer.impl.gallery.ui_AudioItemView_Day_2_en","libraries.mediaviewer.impl.gallery.ui_AudioItemView_Night_2_en",0,], -["libraries.matrix.ui.components_AvatarActionBottomSheet_Day_0_en","libraries.matrix.ui.components_AvatarActionBottomSheet_Night_0_en",20385,], +["libraries.matrix.ui.components_AvatarActionBottomSheet_Day_0_en","libraries.matrix.ui.components_AvatarActionBottomSheet_Night_0_en",20392,], ["libraries.designsystem.components.avatar.internal_AvatarCluster_Avatars_en","",0,], ["libraries.designsystem.components.avatar_AvatarRowLastOnTopRtl_Day_0_en","libraries.designsystem.components.avatar_AvatarRowLastOnTopRtl_Night_0_en",0,], ["libraries.designsystem.components.avatar_AvatarRowLastOnTopRtl_Day_1_en","libraries.designsystem.components.avatar_AvatarRowLastOnTopRtl_Night_1_en",0,], @@ -123,22 +123,22 @@ export const screenshots = [ ["libraries.designsystem.modifiers_BackgroundVerticalGradientDisabled_Day_0_en","libraries.designsystem.modifiers_BackgroundVerticalGradientDisabled_Night_0_en",0,], ["libraries.designsystem.modifiers_BackgroundVerticalGradient_Day_0_en","libraries.designsystem.modifiers_BackgroundVerticalGradient_Night_0_en",0,], ["libraries.designsystem.components_Badge_Day_0_en","libraries.designsystem.components_Badge_Night_0_en",0,], -["features.home.impl.components_BatteryOptimizationBanner_Day_0_en","features.home.impl.components_BatteryOptimizationBanner_Night_0_en",20385,], +["features.home.impl.components_BatteryOptimizationBanner_Day_0_en","features.home.impl.components_BatteryOptimizationBanner_Night_0_en",20392,], ["libraries.designsystem.atomic.atoms_BetaLabel_Day_0_en","libraries.designsystem.atomic.atoms_BetaLabel_Night_0_en",0,], ["libraries.designsystem.components_BigIcon_Day_0_en","libraries.designsystem.components_BigIcon_Night_0_en",0,], -["features.preferences.impl.blockedusers_BlockedUsersView_Day_0_en","features.preferences.impl.blockedusers_BlockedUsersView_Night_0_en",20385,], -["features.preferences.impl.blockedusers_BlockedUsersView_Day_1_en","features.preferences.impl.blockedusers_BlockedUsersView_Night_1_en",20385,], -["features.preferences.impl.blockedusers_BlockedUsersView_Day_2_en","features.preferences.impl.blockedusers_BlockedUsersView_Night_2_en",20385,], -["features.preferences.impl.blockedusers_BlockedUsersView_Day_3_en","features.preferences.impl.blockedusers_BlockedUsersView_Night_3_en",20385,], -["features.preferences.impl.blockedusers_BlockedUsersView_Day_4_en","features.preferences.impl.blockedusers_BlockedUsersView_Night_4_en",20385,], -["features.preferences.impl.blockedusers_BlockedUsersView_Day_5_en","features.preferences.impl.blockedusers_BlockedUsersView_Night_5_en",20385,], -["features.preferences.impl.blockedusers_BlockedUsersView_Day_6_en","features.preferences.impl.blockedusers_BlockedUsersView_Night_6_en",20385,], +["features.preferences.impl.blockedusers_BlockedUsersView_Day_0_en","features.preferences.impl.blockedusers_BlockedUsersView_Night_0_en",20392,], +["features.preferences.impl.blockedusers_BlockedUsersView_Day_1_en","features.preferences.impl.blockedusers_BlockedUsersView_Night_1_en",20392,], +["features.preferences.impl.blockedusers_BlockedUsersView_Day_2_en","features.preferences.impl.blockedusers_BlockedUsersView_Night_2_en",20392,], +["features.preferences.impl.blockedusers_BlockedUsersView_Day_3_en","features.preferences.impl.blockedusers_BlockedUsersView_Night_3_en",20392,], +["features.preferences.impl.blockedusers_BlockedUsersView_Day_4_en","features.preferences.impl.blockedusers_BlockedUsersView_Night_4_en",20392,], +["features.preferences.impl.blockedusers_BlockedUsersView_Day_5_en","features.preferences.impl.blockedusers_BlockedUsersView_Night_5_en",20392,], +["features.preferences.impl.blockedusers_BlockedUsersView_Day_6_en","features.preferences.impl.blockedusers_BlockedUsersView_Night_6_en",20392,], ["libraries.designsystem.theme.components_BottomSheetDragHandle_Day_0_en","libraries.designsystem.theme.components_BottomSheetDragHandle_Night_0_en",0,], -["features.rageshake.impl.bugreport_BugReportViewDay_0_en","",20385,], -["features.rageshake.impl.bugreport_BugReportViewDay_1_en","",20385,], -["features.rageshake.impl.bugreport_BugReportViewDay_2_en","",20385,], -["features.rageshake.impl.bugreport_BugReportViewDay_3_en","",20385,], -["features.rageshake.impl.bugreport_BugReportViewDay_4_en","",20385,], +["features.rageshake.impl.bugreport_BugReportViewDay_0_en","",20392,], +["features.rageshake.impl.bugreport_BugReportViewDay_1_en","",20392,], +["features.rageshake.impl.bugreport_BugReportViewDay_2_en","",20392,], +["features.rageshake.impl.bugreport_BugReportViewDay_3_en","",20392,], +["features.rageshake.impl.bugreport_BugReportViewDay_4_en","",20392,], ["features.rageshake.impl.bugreport_BugReportViewNight_0_en","",0,], ["features.rageshake.impl.bugreport_BugReportViewNight_1_en","",0,], ["features.rageshake.impl.bugreport_BugReportViewNight_2_en","",0,], @@ -148,125 +148,125 @@ export const screenshots = [ ["libraries.designsystem.atomic.molecules_ButtonRowMolecule_Day_0_en","libraries.designsystem.atomic.molecules_ButtonRowMolecule_Night_0_en",0,], ["features.messages.impl.timeline.components_CallMenuItem_Day_0_en","features.messages.impl.timeline.components_CallMenuItem_Night_0_en",0,], ["features.messages.impl.timeline.components_CallMenuItem_Day_1_en","features.messages.impl.timeline.components_CallMenuItem_Night_1_en",0,], -["features.messages.impl.timeline.components_CallMenuItem_Day_2_en","features.messages.impl.timeline.components_CallMenuItem_Night_2_en",20385,], -["features.messages.impl.timeline.components_CallMenuItem_Day_3_en","features.messages.impl.timeline.components_CallMenuItem_Night_3_en",20385,], +["features.messages.impl.timeline.components_CallMenuItem_Day_2_en","features.messages.impl.timeline.components_CallMenuItem_Night_2_en",20392,], +["features.messages.impl.timeline.components_CallMenuItem_Day_3_en","features.messages.impl.timeline.components_CallMenuItem_Night_3_en",20392,], ["features.messages.impl.timeline.components_CallMenuItem_Day_4_en","features.messages.impl.timeline.components_CallMenuItem_Night_4_en",0,], ["features.messages.impl.timeline.components_CallMenuItem_Day_5_en","features.messages.impl.timeline.components_CallMenuItem_Night_5_en",0,], ["features.call.impl.ui_CallScreenView_Day_0_en","features.call.impl.ui_CallScreenView_Night_0_en",0,], -["features.call.impl.ui_CallScreenView_Day_1_en","features.call.impl.ui_CallScreenView_Night_1_en",20385,], -["features.call.impl.ui_CallScreenView_Day_2_en","features.call.impl.ui_CallScreenView_Night_2_en",20385,], -["features.call.impl.ui_CallScreenView_Day_3_en","features.call.impl.ui_CallScreenView_Night_3_en",20385,], -["libraries.textcomposer_CaptionWarningBottomSheet_Day_0_en","libraries.textcomposer_CaptionWarningBottomSheet_Night_0_en",20385,], -["features.login.impl.screens.changeaccountprovider_ChangeAccountProviderView_Day_0_en","features.login.impl.screens.changeaccountprovider_ChangeAccountProviderView_Night_0_en",20385,], -["features.login.impl.screens.changeaccountprovider_ChangeAccountProviderView_Day_1_en","features.login.impl.screens.changeaccountprovider_ChangeAccountProviderView_Night_1_en",20385,], -["features.changeroommemberroles.impl_ChangeRolesView_Day_0_en","features.changeroommemberroles.impl_ChangeRolesView_Night_0_en",20385,], -["features.changeroommemberroles.impl_ChangeRolesView_Day_10_en","features.changeroommemberroles.impl_ChangeRolesView_Night_10_en",20385,], -["features.changeroommemberroles.impl_ChangeRolesView_Day_11_en","features.changeroommemberroles.impl_ChangeRolesView_Night_11_en",20385,], -["features.changeroommemberroles.impl_ChangeRolesView_Day_12_en","features.changeroommemberroles.impl_ChangeRolesView_Night_12_en",20385,], -["features.changeroommemberroles.impl_ChangeRolesView_Day_1_en","features.changeroommemberroles.impl_ChangeRolesView_Night_1_en",20385,], -["features.changeroommemberroles.impl_ChangeRolesView_Day_2_en","features.changeroommemberroles.impl_ChangeRolesView_Night_2_en",20385,], -["features.changeroommemberroles.impl_ChangeRolesView_Day_3_en","features.changeroommemberroles.impl_ChangeRolesView_Night_3_en",20385,], -["features.changeroommemberroles.impl_ChangeRolesView_Day_4_en","features.changeroommemberroles.impl_ChangeRolesView_Night_4_en",20385,], +["features.call.impl.ui_CallScreenView_Day_1_en","features.call.impl.ui_CallScreenView_Night_1_en",20392,], +["features.call.impl.ui_CallScreenView_Day_2_en","features.call.impl.ui_CallScreenView_Night_2_en",20392,], +["features.call.impl.ui_CallScreenView_Day_3_en","features.call.impl.ui_CallScreenView_Night_3_en",20392,], +["libraries.textcomposer_CaptionWarningBottomSheet_Day_0_en","libraries.textcomposer_CaptionWarningBottomSheet_Night_0_en",20392,], +["features.login.impl.screens.changeaccountprovider_ChangeAccountProviderView_Day_0_en","features.login.impl.screens.changeaccountprovider_ChangeAccountProviderView_Night_0_en",20392,], +["features.login.impl.screens.changeaccountprovider_ChangeAccountProviderView_Day_1_en","features.login.impl.screens.changeaccountprovider_ChangeAccountProviderView_Night_1_en",20392,], +["features.changeroommemberroles.impl_ChangeRolesView_Day_0_en","features.changeroommemberroles.impl_ChangeRolesView_Night_0_en",20392,], +["features.changeroommemberroles.impl_ChangeRolesView_Day_10_en","features.changeroommemberroles.impl_ChangeRolesView_Night_10_en",20392,], +["features.changeroommemberroles.impl_ChangeRolesView_Day_11_en","features.changeroommemberroles.impl_ChangeRolesView_Night_11_en",20392,], +["features.changeroommemberroles.impl_ChangeRolesView_Day_12_en","features.changeroommemberroles.impl_ChangeRolesView_Night_12_en",20392,], +["features.changeroommemberroles.impl_ChangeRolesView_Day_1_en","features.changeroommemberroles.impl_ChangeRolesView_Night_1_en",20392,], +["features.changeroommemberroles.impl_ChangeRolesView_Day_2_en","features.changeroommemberroles.impl_ChangeRolesView_Night_2_en",20392,], +["features.changeroommemberroles.impl_ChangeRolesView_Day_3_en","features.changeroommemberroles.impl_ChangeRolesView_Night_3_en",20392,], +["features.changeroommemberroles.impl_ChangeRolesView_Day_4_en","features.changeroommemberroles.impl_ChangeRolesView_Night_4_en",20392,], ["features.changeroommemberroles.impl_ChangeRolesView_Day_5_en","features.changeroommemberroles.impl_ChangeRolesView_Night_5_en",0,], -["features.changeroommemberroles.impl_ChangeRolesView_Day_6_en","features.changeroommemberroles.impl_ChangeRolesView_Night_6_en",20385,], -["features.changeroommemberroles.impl_ChangeRolesView_Day_7_en","features.changeroommemberroles.impl_ChangeRolesView_Night_7_en",20385,], -["features.changeroommemberroles.impl_ChangeRolesView_Day_8_en","features.changeroommemberroles.impl_ChangeRolesView_Night_8_en",20385,], -["features.changeroommemberroles.impl_ChangeRolesView_Day_9_en","features.changeroommemberroles.impl_ChangeRolesView_Night_9_en",20385,], -["features.roomdetails.impl.rolesandpermissions.permissions_ChangeRoomPermissionsView_Day_0_en","features.roomdetails.impl.rolesandpermissions.permissions_ChangeRoomPermissionsView_Night_0_en",20385,], -["features.roomdetails.impl.rolesandpermissions.permissions_ChangeRoomPermissionsView_Day_1_en","features.roomdetails.impl.rolesandpermissions.permissions_ChangeRoomPermissionsView_Night_1_en",20385,], -["features.roomdetails.impl.rolesandpermissions.permissions_ChangeRoomPermissionsView_Day_2_en","features.roomdetails.impl.rolesandpermissions.permissions_ChangeRoomPermissionsView_Night_2_en",20385,], -["features.roomdetails.impl.rolesandpermissions.permissions_ChangeRoomPermissionsView_Day_3_en","features.roomdetails.impl.rolesandpermissions.permissions_ChangeRoomPermissionsView_Night_3_en",20385,], -["features.roomdetails.impl.rolesandpermissions.permissions_ChangeRoomPermissionsView_Day_4_en","features.roomdetails.impl.rolesandpermissions.permissions_ChangeRoomPermissionsView_Night_4_en",20385,], -["features.roomdetails.impl.rolesandpermissions.permissions_ChangeRoomPermissionsView_Day_5_en","features.roomdetails.impl.rolesandpermissions.permissions_ChangeRoomPermissionsView_Night_5_en",20385,], -["features.roomdetails.impl.rolesandpermissions.permissions_ChangeRoomPermissionsView_Day_6_en","features.roomdetails.impl.rolesandpermissions.permissions_ChangeRoomPermissionsView_Night_6_en",20385,], +["features.changeroommemberroles.impl_ChangeRolesView_Day_6_en","features.changeroommemberroles.impl_ChangeRolesView_Night_6_en",20392,], +["features.changeroommemberroles.impl_ChangeRolesView_Day_7_en","features.changeroommemberroles.impl_ChangeRolesView_Night_7_en",20392,], +["features.changeroommemberroles.impl_ChangeRolesView_Day_8_en","features.changeroommemberroles.impl_ChangeRolesView_Night_8_en",20392,], +["features.changeroommemberroles.impl_ChangeRolesView_Day_9_en","features.changeroommemberroles.impl_ChangeRolesView_Night_9_en",20392,], +["features.roomdetails.impl.rolesandpermissions.permissions_ChangeRoomPermissionsView_Day_0_en","features.roomdetails.impl.rolesandpermissions.permissions_ChangeRoomPermissionsView_Night_0_en",20392,], +["features.roomdetails.impl.rolesandpermissions.permissions_ChangeRoomPermissionsView_Day_1_en","features.roomdetails.impl.rolesandpermissions.permissions_ChangeRoomPermissionsView_Night_1_en",20392,], +["features.roomdetails.impl.rolesandpermissions.permissions_ChangeRoomPermissionsView_Day_2_en","features.roomdetails.impl.rolesandpermissions.permissions_ChangeRoomPermissionsView_Night_2_en",20392,], +["features.roomdetails.impl.rolesandpermissions.permissions_ChangeRoomPermissionsView_Day_3_en","features.roomdetails.impl.rolesandpermissions.permissions_ChangeRoomPermissionsView_Night_3_en",20392,], +["features.roomdetails.impl.rolesandpermissions.permissions_ChangeRoomPermissionsView_Day_4_en","features.roomdetails.impl.rolesandpermissions.permissions_ChangeRoomPermissionsView_Night_4_en",20392,], +["features.roomdetails.impl.rolesandpermissions.permissions_ChangeRoomPermissionsView_Day_5_en","features.roomdetails.impl.rolesandpermissions.permissions_ChangeRoomPermissionsView_Night_5_en",20392,], +["features.roomdetails.impl.rolesandpermissions.permissions_ChangeRoomPermissionsView_Day_6_en","features.roomdetails.impl.rolesandpermissions.permissions_ChangeRoomPermissionsView_Night_6_en",20392,], ["features.login.impl.changeserver_ChangeServerView_Day_0_en","features.login.impl.changeserver_ChangeServerView_Night_0_en",0,], -["features.login.impl.changeserver_ChangeServerView_Day_1_en","features.login.impl.changeserver_ChangeServerView_Night_1_en",20385,], -["features.login.impl.changeserver_ChangeServerView_Day_2_en","features.login.impl.changeserver_ChangeServerView_Night_2_en",20385,], -["features.login.impl.changeserver_ChangeServerView_Day_3_en","features.login.impl.changeserver_ChangeServerView_Night_3_en",20385,], -["features.login.impl.changeserver_ChangeServerView_Day_4_en","features.login.impl.changeserver_ChangeServerView_Night_4_en",20385,], +["features.login.impl.changeserver_ChangeServerView_Day_1_en","features.login.impl.changeserver_ChangeServerView_Night_1_en",20392,], +["features.login.impl.changeserver_ChangeServerView_Day_2_en","features.login.impl.changeserver_ChangeServerView_Night_2_en",20392,], +["features.login.impl.changeserver_ChangeServerView_Day_3_en","features.login.impl.changeserver_ChangeServerView_Night_3_en",20392,], +["features.login.impl.changeserver_ChangeServerView_Day_4_en","features.login.impl.changeserver_ChangeServerView_Night_4_en",20392,], ["libraries.matrix.ui.components_CheckableResolvedUserRow_en","",0,], -["libraries.matrix.ui.components_CheckableUnresolvedUserRow_en","",20385,], +["libraries.matrix.ui.components_CheckableUnresolvedUserRow_en","",20392,], ["libraries.designsystem.theme.components_Checkboxes_Toggles_en","",0,], -["features.login.impl.screens.chooseaccountprovider_ChooseAccountProviderView_Day_0_en","features.login.impl.screens.chooseaccountprovider_ChooseAccountProviderView_Night_0_en",20385,], -["features.login.impl.screens.chooseaccountprovider_ChooseAccountProviderView_Day_1_en","features.login.impl.screens.chooseaccountprovider_ChooseAccountProviderView_Night_1_en",20385,], -["features.login.impl.screens.chooseaccountprovider_ChooseAccountProviderView_Day_2_en","features.login.impl.screens.chooseaccountprovider_ChooseAccountProviderView_Night_2_en",20385,], -["features.ftue.impl.sessionverification.choosemode_ChooseSelfVerificationModeView_Day_0_en","features.ftue.impl.sessionverification.choosemode_ChooseSelfVerificationModeView_Night_0_en",20385,], -["features.ftue.impl.sessionverification.choosemode_ChooseSelfVerificationModeView_Day_1_en","features.ftue.impl.sessionverification.choosemode_ChooseSelfVerificationModeView_Night_1_en",20385,], -["features.ftue.impl.sessionverification.choosemode_ChooseSelfVerificationModeView_Day_2_en","features.ftue.impl.sessionverification.choosemode_ChooseSelfVerificationModeView_Night_2_en",20385,], -["features.ftue.impl.sessionverification.choosemode_ChooseSelfVerificationModeView_Day_3_en","features.ftue.impl.sessionverification.choosemode_ChooseSelfVerificationModeView_Night_3_en",20385,], +["features.login.impl.screens.chooseaccountprovider_ChooseAccountProviderView_Day_0_en","features.login.impl.screens.chooseaccountprovider_ChooseAccountProviderView_Night_0_en",20392,], +["features.login.impl.screens.chooseaccountprovider_ChooseAccountProviderView_Day_1_en","features.login.impl.screens.chooseaccountprovider_ChooseAccountProviderView_Night_1_en",20392,], +["features.login.impl.screens.chooseaccountprovider_ChooseAccountProviderView_Day_2_en","features.login.impl.screens.chooseaccountprovider_ChooseAccountProviderView_Night_2_en",20392,], +["features.ftue.impl.sessionverification.choosemode_ChooseSelfVerificationModeView_Day_0_en","features.ftue.impl.sessionverification.choosemode_ChooseSelfVerificationModeView_Night_0_en",20392,], +["features.ftue.impl.sessionverification.choosemode_ChooseSelfVerificationModeView_Day_1_en","features.ftue.impl.sessionverification.choosemode_ChooseSelfVerificationModeView_Night_1_en",20392,], +["features.ftue.impl.sessionverification.choosemode_ChooseSelfVerificationModeView_Day_2_en","features.ftue.impl.sessionverification.choosemode_ChooseSelfVerificationModeView_Night_2_en",20392,], +["features.ftue.impl.sessionverification.choosemode_ChooseSelfVerificationModeView_Day_3_en","features.ftue.impl.sessionverification.choosemode_ChooseSelfVerificationModeView_Night_3_en",20392,], ["libraries.designsystem.theme.components_CircularProgressIndicator_Progress_Indicators_en","",0,], ["libraries.designsystem.components_ClickableLinkText_Text_en","",0,], ["libraries.designsystem.theme_ColorAliases_Day_0_en","libraries.designsystem.theme_ColorAliases_Night_0_en",0,], -["libraries.designsystem.atomic.molecules_ComposerAlertMolecule_Day_0_en","libraries.designsystem.atomic.molecules_ComposerAlertMolecule_Night_0_en",20385,], -["libraries.designsystem.atomic.molecules_ComposerAlertMolecule_Day_1_en","libraries.designsystem.atomic.molecules_ComposerAlertMolecule_Night_1_en",20385,], -["libraries.textcomposer_ComposerModeView_Day_0_en","libraries.textcomposer_ComposerModeView_Night_0_en",20385,], +["libraries.designsystem.atomic.molecules_ComposerAlertMolecule_Day_0_en","libraries.designsystem.atomic.molecules_ComposerAlertMolecule_Night_0_en",20392,], +["libraries.designsystem.atomic.molecules_ComposerAlertMolecule_Day_1_en","libraries.designsystem.atomic.molecules_ComposerAlertMolecule_Night_1_en",20392,], +["libraries.textcomposer_ComposerModeView_Day_0_en","libraries.textcomposer_ComposerModeView_Night_0_en",20392,], ["libraries.textcomposer_ComposerModeView_Day_1_en","libraries.textcomposer_ComposerModeView_Night_1_en",0,], ["libraries.textcomposer_ComposerModeView_Day_2_en","libraries.textcomposer_ComposerModeView_Night_2_en",0,], ["libraries.textcomposer_ComposerModeView_Day_3_en","libraries.textcomposer_ComposerModeView_Night_3_en",0,], -["features.createroom.impl.configureroom_ConfigureRoomViewDark_0_en","",20385,], -["features.createroom.impl.configureroom_ConfigureRoomViewDark_1_en","",20385,], -["features.createroom.impl.configureroom_ConfigureRoomViewDark_2_en","",20385,], -["features.createroom.impl.configureroom_ConfigureRoomViewDark_3_en","",20385,], -["features.createroom.impl.configureroom_ConfigureRoomViewDark_4_en","",20385,], -["features.createroom.impl.configureroom_ConfigureRoomViewDark_5_en","",20385,], -["features.createroom.impl.configureroom_ConfigureRoomViewLight_0_en","",20385,], -["features.createroom.impl.configureroom_ConfigureRoomViewLight_1_en","",20385,], -["features.createroom.impl.configureroom_ConfigureRoomViewLight_2_en","",20385,], -["features.createroom.impl.configureroom_ConfigureRoomViewLight_3_en","",20385,], -["features.createroom.impl.configureroom_ConfigureRoomViewLight_4_en","",20385,], -["features.createroom.impl.configureroom_ConfigureRoomViewLight_5_en","",20385,], -["features.login.impl.screens.confirmaccountprovider_ConfirmAccountProviderView_Day_0_en","features.login.impl.screens.confirmaccountprovider_ConfirmAccountProviderView_Night_0_en",20385,], -["features.login.impl.screens.confirmaccountprovider_ConfirmAccountProviderView_Day_1_en","features.login.impl.screens.confirmaccountprovider_ConfirmAccountProviderView_Night_1_en",20385,], -["features.login.impl.screens.confirmaccountprovider_ConfirmAccountProviderView_Day_2_en","features.login.impl.screens.confirmaccountprovider_ConfirmAccountProviderView_Night_2_en",20385,], -["features.home.impl.components_ConfirmRecoveryKeyBanner_Day_0_en","features.home.impl.components_ConfirmRecoveryKeyBanner_Night_0_en",20385,], +["features.createroom.impl.configureroom_ConfigureRoomViewDark_0_en","",20392,], +["features.createroom.impl.configureroom_ConfigureRoomViewDark_1_en","",20392,], +["features.createroom.impl.configureroom_ConfigureRoomViewDark_2_en","",20392,], +["features.createroom.impl.configureroom_ConfigureRoomViewDark_3_en","",20392,], +["features.createroom.impl.configureroom_ConfigureRoomViewDark_4_en","",20392,], +["features.createroom.impl.configureroom_ConfigureRoomViewDark_5_en","",20392,], +["features.createroom.impl.configureroom_ConfigureRoomViewLight_0_en","",20392,], +["features.createroom.impl.configureroom_ConfigureRoomViewLight_1_en","",20392,], +["features.createroom.impl.configureroom_ConfigureRoomViewLight_2_en","",20392,], +["features.createroom.impl.configureroom_ConfigureRoomViewLight_3_en","",20392,], +["features.createroom.impl.configureroom_ConfigureRoomViewLight_4_en","",20392,], +["features.createroom.impl.configureroom_ConfigureRoomViewLight_5_en","",20392,], +["features.login.impl.screens.confirmaccountprovider_ConfirmAccountProviderView_Day_0_en","features.login.impl.screens.confirmaccountprovider_ConfirmAccountProviderView_Night_0_en",20392,], +["features.login.impl.screens.confirmaccountprovider_ConfirmAccountProviderView_Day_1_en","features.login.impl.screens.confirmaccountprovider_ConfirmAccountProviderView_Night_1_en",20392,], +["features.login.impl.screens.confirmaccountprovider_ConfirmAccountProviderView_Day_2_en","features.login.impl.screens.confirmaccountprovider_ConfirmAccountProviderView_Night_2_en",20392,], +["features.home.impl.components_ConfirmRecoveryKeyBanner_Day_0_en","features.home.impl.components_ConfirmRecoveryKeyBanner_Night_0_en",20392,], ["libraries.designsystem.components.dialogs_ConfirmationDialogContent_Dialogs_en","",0,], ["libraries.designsystem.components.dialogs_ConfirmationDialog_Day_0_en","libraries.designsystem.components.dialogs_ConfirmationDialog_Night_0_en",0,], ["features.networkmonitor.api.ui_ConnectivityIndicator_Day_0_en","features.networkmonitor.api.ui_ConnectivityIndicator_Night_0_en",0,], ["libraries.designsystem.atomic.atoms_CounterAtom_Day_0_en","libraries.designsystem.atomic.atoms_CounterAtom_Night_0_en",0,], -["features.rageshake.api.crash_CrashDetectionView_Day_0_en","features.rageshake.api.crash_CrashDetectionView_Night_0_en",20385,], -["features.login.impl.screens.createaccount_CreateAccountView_Day_0_en","features.login.impl.screens.createaccount_CreateAccountView_Night_0_en",20385,], -["features.login.impl.screens.createaccount_CreateAccountView_Day_1_en","features.login.impl.screens.createaccount_CreateAccountView_Night_1_en",20385,], -["features.login.impl.screens.createaccount_CreateAccountView_Day_2_en","features.login.impl.screens.createaccount_CreateAccountView_Night_2_en",20385,], -["features.login.impl.screens.createaccount_CreateAccountView_Day_3_en","features.login.impl.screens.createaccount_CreateAccountView_Night_3_en",20385,], -["libraries.matrix.ui.components_CreateDmConfirmationBottomSheet_Day_0_en","libraries.matrix.ui.components_CreateDmConfirmationBottomSheet_Night_0_en",20385,], -["libraries.matrix.ui.components_CreateDmConfirmationBottomSheet_Day_1_en","libraries.matrix.ui.components_CreateDmConfirmationBottomSheet_Night_1_en",20385,], -["features.poll.impl.create_CreatePollView_Day_0_en","features.poll.impl.create_CreatePollView_Night_0_en",20385,], -["features.poll.impl.create_CreatePollView_Day_1_en","features.poll.impl.create_CreatePollView_Night_1_en",20385,], -["features.poll.impl.create_CreatePollView_Day_2_en","features.poll.impl.create_CreatePollView_Night_2_en",20385,], -["features.poll.impl.create_CreatePollView_Day_3_en","features.poll.impl.create_CreatePollView_Night_3_en",20385,], -["features.poll.impl.create_CreatePollView_Day_4_en","features.poll.impl.create_CreatePollView_Night_4_en",20385,], -["features.poll.impl.create_CreatePollView_Day_5_en","features.poll.impl.create_CreatePollView_Night_5_en",20385,], -["features.poll.impl.create_CreatePollView_Day_6_en","features.poll.impl.create_CreatePollView_Night_6_en",20385,], -["features.poll.impl.create_CreatePollView_Day_7_en","features.poll.impl.create_CreatePollView_Night_7_en",20385,], -["libraries.dateformatter.impl.previews_DateFormatterModeView_0_en","",20385,], -["libraries.dateformatter.impl.previews_DateFormatterModeView_1_en","",20385,], -["libraries.dateformatter.impl.previews_DateFormatterModeView_2_en","",20385,], -["libraries.dateformatter.impl.previews_DateFormatterModeView_3_en","",20385,], -["libraries.dateformatter.impl.previews_DateFormatterModeView_4_en","",20385,], +["features.rageshake.api.crash_CrashDetectionView_Day_0_en","features.rageshake.api.crash_CrashDetectionView_Night_0_en",20392,], +["features.login.impl.screens.createaccount_CreateAccountView_Day_0_en","features.login.impl.screens.createaccount_CreateAccountView_Night_0_en",20392,], +["features.login.impl.screens.createaccount_CreateAccountView_Day_1_en","features.login.impl.screens.createaccount_CreateAccountView_Night_1_en",20392,], +["features.login.impl.screens.createaccount_CreateAccountView_Day_2_en","features.login.impl.screens.createaccount_CreateAccountView_Night_2_en",20392,], +["features.login.impl.screens.createaccount_CreateAccountView_Day_3_en","features.login.impl.screens.createaccount_CreateAccountView_Night_3_en",20392,], +["libraries.matrix.ui.components_CreateDmConfirmationBottomSheet_Day_0_en","libraries.matrix.ui.components_CreateDmConfirmationBottomSheet_Night_0_en",20392,], +["libraries.matrix.ui.components_CreateDmConfirmationBottomSheet_Day_1_en","libraries.matrix.ui.components_CreateDmConfirmationBottomSheet_Night_1_en",20392,], +["features.poll.impl.create_CreatePollView_Day_0_en","features.poll.impl.create_CreatePollView_Night_0_en",20392,], +["features.poll.impl.create_CreatePollView_Day_1_en","features.poll.impl.create_CreatePollView_Night_1_en",20392,], +["features.poll.impl.create_CreatePollView_Day_2_en","features.poll.impl.create_CreatePollView_Night_2_en",20392,], +["features.poll.impl.create_CreatePollView_Day_3_en","features.poll.impl.create_CreatePollView_Night_3_en",20392,], +["features.poll.impl.create_CreatePollView_Day_4_en","features.poll.impl.create_CreatePollView_Night_4_en",20392,], +["features.poll.impl.create_CreatePollView_Day_5_en","features.poll.impl.create_CreatePollView_Night_5_en",20392,], +["features.poll.impl.create_CreatePollView_Day_6_en","features.poll.impl.create_CreatePollView_Night_6_en",20392,], +["features.poll.impl.create_CreatePollView_Day_7_en","features.poll.impl.create_CreatePollView_Night_7_en",20392,], +["libraries.dateformatter.impl.previews_DateFormatterModeView_0_en","",20392,], +["libraries.dateformatter.impl.previews_DateFormatterModeView_1_en","",20392,], +["libraries.dateformatter.impl.previews_DateFormatterModeView_2_en","",20392,], +["libraries.dateformatter.impl.previews_DateFormatterModeView_3_en","",20392,], +["libraries.dateformatter.impl.previews_DateFormatterModeView_4_en","",20392,], ["libraries.mediaviewer.impl.gallery.ui_DateItemView_Day_0_en","libraries.mediaviewer.impl.gallery.ui_DateItemView_Night_0_en",0,], ["libraries.mediaviewer.impl.gallery.ui_DateItemView_Day_1_en","libraries.mediaviewer.impl.gallery.ui_DateItemView_Night_1_en",0,], -["libraries.designsystem.theme.components.previews_DatePickerDark_DateTime_pickers_en","",20385,], -["libraries.designsystem.theme.components.previews_DatePickerLight_DateTime_pickers_en","",20385,], -["features.invite.impl.declineandblock_DeclineAndBlockView_Day_0_en","features.invite.impl.declineandblock_DeclineAndBlockView_Night_0_en",20385,], -["features.invite.impl.declineandblock_DeclineAndBlockView_Day_1_en","features.invite.impl.declineandblock_DeclineAndBlockView_Night_1_en",20385,], -["features.invite.impl.declineandblock_DeclineAndBlockView_Day_2_en","features.invite.impl.declineandblock_DeclineAndBlockView_Night_2_en",20385,], -["features.invite.impl.declineandblock_DeclineAndBlockView_Day_3_en","features.invite.impl.declineandblock_DeclineAndBlockView_Night_3_en",20385,], -["features.invite.impl.declineandblock_DeclineAndBlockView_Day_4_en","features.invite.impl.declineandblock_DeclineAndBlockView_Night_4_en",20385,], +["libraries.designsystem.theme.components.previews_DatePickerDark_DateTime_pickers_en","",20392,], +["libraries.designsystem.theme.components.previews_DatePickerLight_DateTime_pickers_en","",20392,], +["features.invite.impl.declineandblock_DeclineAndBlockView_Day_0_en","features.invite.impl.declineandblock_DeclineAndBlockView_Night_0_en",20392,], +["features.invite.impl.declineandblock_DeclineAndBlockView_Day_1_en","features.invite.impl.declineandblock_DeclineAndBlockView_Night_1_en",20392,], +["features.invite.impl.declineandblock_DeclineAndBlockView_Day_2_en","features.invite.impl.declineandblock_DeclineAndBlockView_Night_2_en",20392,], +["features.invite.impl.declineandblock_DeclineAndBlockView_Day_3_en","features.invite.impl.declineandblock_DeclineAndBlockView_Night_3_en",20392,], +["features.invite.impl.declineandblock_DeclineAndBlockView_Day_4_en","features.invite.impl.declineandblock_DeclineAndBlockView_Night_4_en",20392,], ["features.logout.impl.direct_DefaultDirectLogoutView_Day_0_en","features.logout.impl.direct_DefaultDirectLogoutView_Night_0_en",0,], -["features.logout.impl.direct_DefaultDirectLogoutView_Day_1_en","features.logout.impl.direct_DefaultDirectLogoutView_Night_1_en",20385,], -["features.logout.impl.direct_DefaultDirectLogoutView_Day_2_en","features.logout.impl.direct_DefaultDirectLogoutView_Night_2_en",20385,], -["features.logout.impl.direct_DefaultDirectLogoutView_Day_3_en","features.logout.impl.direct_DefaultDirectLogoutView_Night_3_en",20385,], +["features.logout.impl.direct_DefaultDirectLogoutView_Day_1_en","features.logout.impl.direct_DefaultDirectLogoutView_Night_1_en",20392,], +["features.logout.impl.direct_DefaultDirectLogoutView_Day_2_en","features.logout.impl.direct_DefaultDirectLogoutView_Night_2_en",20392,], +["features.logout.impl.direct_DefaultDirectLogoutView_Day_3_en","features.logout.impl.direct_DefaultDirectLogoutView_Night_3_en",20392,], ["features.logout.impl.direct_DefaultDirectLogoutView_Day_4_en","features.logout.impl.direct_DefaultDirectLogoutView_Night_4_en",0,], -["features.preferences.impl.notifications.edit_DefaultNotificationSettingOption_Day_0_en","features.preferences.impl.notifications.edit_DefaultNotificationSettingOption_Night_0_en",20385,], +["features.preferences.impl.notifications.edit_DefaultNotificationSettingOption_Day_0_en","features.preferences.impl.notifications.edit_DefaultNotificationSettingOption_Night_0_en",20392,], ["features.licenses.impl.details_DependenciesDetailsView_Day_0_en","features.licenses.impl.details_DependenciesDetailsView_Night_0_en",0,], -["features.licenses.impl.list_DependencyLicensesListView_Day_0_en","features.licenses.impl.list_DependencyLicensesListView_Night_0_en",20385,], -["features.licenses.impl.list_DependencyLicensesListView_Day_1_en","features.licenses.impl.list_DependencyLicensesListView_Night_1_en",20385,], -["features.licenses.impl.list_DependencyLicensesListView_Day_2_en","features.licenses.impl.list_DependencyLicensesListView_Night_2_en",20385,], -["features.licenses.impl.list_DependencyLicensesListView_Day_3_en","features.licenses.impl.list_DependencyLicensesListView_Night_3_en",20385,], -["features.preferences.impl.developer_DeveloperSettingsView_Day_0_en","features.preferences.impl.developer_DeveloperSettingsView_Night_0_en",20385,], -["features.preferences.impl.developer_DeveloperSettingsView_Day_1_en","features.preferences.impl.developer_DeveloperSettingsView_Night_1_en",20385,], -["features.preferences.impl.developer_DeveloperSettingsView_Day_2_en","features.preferences.impl.developer_DeveloperSettingsView_Night_2_en",20385,], -["features.preferences.impl.developer_DeveloperSettingsView_Day_3_en","features.preferences.impl.developer_DeveloperSettingsView_Night_3_en",20385,], +["features.licenses.impl.list_DependencyLicensesListView_Day_0_en","features.licenses.impl.list_DependencyLicensesListView_Night_0_en",20392,], +["features.licenses.impl.list_DependencyLicensesListView_Day_1_en","features.licenses.impl.list_DependencyLicensesListView_Night_1_en",20392,], +["features.licenses.impl.list_DependencyLicensesListView_Day_2_en","features.licenses.impl.list_DependencyLicensesListView_Night_2_en",20392,], +["features.licenses.impl.list_DependencyLicensesListView_Day_3_en","features.licenses.impl.list_DependencyLicensesListView_Night_3_en",20392,], +["features.preferences.impl.developer_DeveloperSettingsView_Day_0_en","features.preferences.impl.developer_DeveloperSettingsView_Night_0_en",20392,], +["features.preferences.impl.developer_DeveloperSettingsView_Day_1_en","features.preferences.impl.developer_DeveloperSettingsView_Night_1_en",20392,], +["features.preferences.impl.developer_DeveloperSettingsView_Day_2_en","features.preferences.impl.developer_DeveloperSettingsView_Night_2_en",20392,], +["features.preferences.impl.developer_DeveloperSettingsView_Day_3_en","features.preferences.impl.developer_DeveloperSettingsView_Night_3_en",20392,], ["libraries.designsystem.theme.components_DialogWithDestructiveButton_Dialog_with_destructive_button_Dialogs_en","",0,], ["libraries.designsystem.theme.components_DialogWithOnlyMessageAndOkButton_Dialog_with_only_message_and_ok_button_Dialogs_en","",0,], ["libraries.designsystem.theme.components_DialogWithThirdButton_Dialog_with_third_button_Dialogs_en","",0,], @@ -281,18 +281,18 @@ export const screenshots = [ ["libraries.designsystem.text_DpScale_1_0f__en","",0,], ["libraries.designsystem.text_DpScale_1_5f__en","",0,], ["libraries.designsystem.theme.components_DropdownMenuItem_Menus_en","",0,], -["features.preferences.impl.notifications.edit_EditDefaultNotificationSettingView_Day_0_en","features.preferences.impl.notifications.edit_EditDefaultNotificationSettingView_Night_0_en",20385,], -["features.preferences.impl.notifications.edit_EditDefaultNotificationSettingView_Day_1_en","features.preferences.impl.notifications.edit_EditDefaultNotificationSettingView_Night_1_en",20385,], -["features.preferences.impl.notifications.edit_EditDefaultNotificationSettingView_Day_2_en","features.preferences.impl.notifications.edit_EditDefaultNotificationSettingView_Night_2_en",20385,], -["features.preferences.impl.notifications.edit_EditDefaultNotificationSettingView_Day_3_en","features.preferences.impl.notifications.edit_EditDefaultNotificationSettingView_Night_3_en",20385,], -["features.preferences.impl.notifications.edit_EditDefaultNotificationSettingView_Day_4_en","features.preferences.impl.notifications.edit_EditDefaultNotificationSettingView_Night_4_en",20385,], -["features.roomdetails.impl.securityandprivacy.editroomaddress_EditRoomAddressView_Day_0_en","features.roomdetails.impl.securityandprivacy.editroomaddress_EditRoomAddressView_Night_0_en",20385,], -["features.roomdetails.impl.securityandprivacy.editroomaddress_EditRoomAddressView_Day_1_en","features.roomdetails.impl.securityandprivacy.editroomaddress_EditRoomAddressView_Night_1_en",20385,], -["features.roomdetails.impl.securityandprivacy.editroomaddress_EditRoomAddressView_Day_2_en","features.roomdetails.impl.securityandprivacy.editroomaddress_EditRoomAddressView_Night_2_en",20385,], -["features.roomdetails.impl.securityandprivacy.editroomaddress_EditRoomAddressView_Day_3_en","features.roomdetails.impl.securityandprivacy.editroomaddress_EditRoomAddressView_Night_3_en",20385,], -["features.roomdetails.impl.securityandprivacy.editroomaddress_EditRoomAddressView_Day_4_en","features.roomdetails.impl.securityandprivacy.editroomaddress_EditRoomAddressView_Night_4_en",20385,], -["features.preferences.impl.user.editprofile_EditUserProfileView_Day_0_en","features.preferences.impl.user.editprofile_EditUserProfileView_Night_0_en",20385,], -["features.preferences.impl.user.editprofile_EditUserProfileView_Day_1_en","features.preferences.impl.user.editprofile_EditUserProfileView_Night_1_en",20385,], +["features.preferences.impl.notifications.edit_EditDefaultNotificationSettingView_Day_0_en","features.preferences.impl.notifications.edit_EditDefaultNotificationSettingView_Night_0_en",20392,], +["features.preferences.impl.notifications.edit_EditDefaultNotificationSettingView_Day_1_en","features.preferences.impl.notifications.edit_EditDefaultNotificationSettingView_Night_1_en",20392,], +["features.preferences.impl.notifications.edit_EditDefaultNotificationSettingView_Day_2_en","features.preferences.impl.notifications.edit_EditDefaultNotificationSettingView_Night_2_en",20392,], +["features.preferences.impl.notifications.edit_EditDefaultNotificationSettingView_Day_3_en","features.preferences.impl.notifications.edit_EditDefaultNotificationSettingView_Night_3_en",20392,], +["features.preferences.impl.notifications.edit_EditDefaultNotificationSettingView_Day_4_en","features.preferences.impl.notifications.edit_EditDefaultNotificationSettingView_Night_4_en",20392,], +["features.roomdetails.impl.securityandprivacy.editroomaddress_EditRoomAddressView_Day_0_en","features.roomdetails.impl.securityandprivacy.editroomaddress_EditRoomAddressView_Night_0_en",20392,], +["features.roomdetails.impl.securityandprivacy.editroomaddress_EditRoomAddressView_Day_1_en","features.roomdetails.impl.securityandprivacy.editroomaddress_EditRoomAddressView_Night_1_en",20392,], +["features.roomdetails.impl.securityandprivacy.editroomaddress_EditRoomAddressView_Day_2_en","features.roomdetails.impl.securityandprivacy.editroomaddress_EditRoomAddressView_Night_2_en",20392,], +["features.roomdetails.impl.securityandprivacy.editroomaddress_EditRoomAddressView_Day_3_en","features.roomdetails.impl.securityandprivacy.editroomaddress_EditRoomAddressView_Night_3_en",20392,], +["features.roomdetails.impl.securityandprivacy.editroomaddress_EditRoomAddressView_Day_4_en","features.roomdetails.impl.securityandprivacy.editroomaddress_EditRoomAddressView_Night_4_en",20392,], +["features.preferences.impl.user.editprofile_EditUserProfileView_Day_0_en","features.preferences.impl.user.editprofile_EditUserProfileView_Night_0_en",20392,], +["features.preferences.impl.user.editprofile_EditUserProfileView_Day_1_en","features.preferences.impl.user.editprofile_EditUserProfileView_Night_1_en",20392,], ["libraries.matrix.ui.components_EditableAvatarView_Day_0_en","libraries.matrix.ui.components_EditableAvatarView_Night_0_en",0,], ["libraries.matrix.ui.components_EditableAvatarView_Day_1_en","libraries.matrix.ui.components_EditableAvatarView_Night_1_en",0,], ["libraries.matrix.ui.components_EditableAvatarView_Day_2_en","libraries.matrix.ui.components_EditableAvatarView_Night_2_en",0,], @@ -303,14 +303,14 @@ export const screenshots = [ ["libraries.designsystem.atomic.atoms_ElementLogoAtomMediumNoBlurShadow_Day_0_en","libraries.designsystem.atomic.atoms_ElementLogoAtomMediumNoBlurShadow_Night_0_en",0,], ["libraries.designsystem.atomic.atoms_ElementLogoAtomMedium_Day_0_en","libraries.designsystem.atomic.atoms_ElementLogoAtomMedium_Night_0_en",0,], ["features.messages.impl.timeline.components.customreaction_EmojiItem_Day_0_en","features.messages.impl.timeline.components.customreaction_EmojiItem_Night_0_en",0,], -["features.messages.impl.timeline.components.customreaction.picker_EmojiPicker_Day_0_en","features.messages.impl.timeline.components.customreaction.picker_EmojiPicker_Night_0_en",20385,], -["features.messages.impl.timeline.components.customreaction.picker_EmojiPicker_Day_1_en","features.messages.impl.timeline.components.customreaction.picker_EmojiPicker_Night_1_en",20385,], +["features.messages.impl.timeline.components.customreaction.picker_EmojiPicker_Day_0_en","features.messages.impl.timeline.components.customreaction.picker_EmojiPicker_Night_0_en",20392,], +["features.messages.impl.timeline.components.customreaction.picker_EmojiPicker_Day_1_en","features.messages.impl.timeline.components.customreaction.picker_EmojiPicker_Night_1_en",20392,], ["features.messages.impl.timeline.components.customreaction.picker_EmojiPicker_Day_2_en","features.messages.impl.timeline.components.customreaction.picker_EmojiPicker_Night_2_en",0,], ["features.messages.impl.timeline.components.customreaction.picker_EmojiPicker_Day_3_en","features.messages.impl.timeline.components.customreaction.picker_EmojiPicker_Night_3_en",0,], ["libraries.ui.common.nodes_EmptyView_Day_0_en","libraries.ui.common.nodes_EmptyView_Night_0_en",0,], -["libraries.designsystem.components.dialogs_ErrorDialogContent_Dialogs_en","",20385,], -["libraries.designsystem.components.dialogs_ErrorDialogWithDoNotShowAgain_Day_0_en","libraries.designsystem.components.dialogs_ErrorDialogWithDoNotShowAgain_Night_0_en",20385,], -["libraries.designsystem.components.dialogs_ErrorDialog_Day_0_en","libraries.designsystem.components.dialogs_ErrorDialog_Night_0_en",20385,], +["libraries.designsystem.components.dialogs_ErrorDialogContent_Dialogs_en","",20392,], +["libraries.designsystem.components.dialogs_ErrorDialogWithDoNotShowAgain_Day_0_en","libraries.designsystem.components.dialogs_ErrorDialogWithDoNotShowAgain_Night_0_en",20392,], +["libraries.designsystem.components.dialogs_ErrorDialog_Day_0_en","libraries.designsystem.components.dialogs_ErrorDialog_Night_0_en",20392,], ["features.messages.impl.timeline.debug_EventDebugInfoView_Day_0_en","features.messages.impl.timeline.debug_EventDebugInfoView_Night_0_en",0,], ["libraries.designsystem.components_ExpandableBottomSheetLayout_en","",0,], ["libraries.featureflag.ui_FeatureListView_Day_0_en","libraries.featureflag.ui_FeatureListView_Night_0_en",0,], @@ -329,43 +329,43 @@ export const screenshots = [ ["libraries.designsystem.theme.components_FloatingActionButton_Floating_Action_Buttons_en","",0,], ["libraries.designsystem.atomic.pages_FlowStepPage_Day_0_en","libraries.designsystem.atomic.pages_FlowStepPage_Night_0_en",0,], ["features.messages.impl.timeline.focus_FocusRequestStateView_Day_0_en","features.messages.impl.timeline.focus_FocusRequestStateView_Night_0_en",0,], -["features.messages.impl.timeline.focus_FocusRequestStateView_Day_1_en","features.messages.impl.timeline.focus_FocusRequestStateView_Night_1_en",20385,], -["features.messages.impl.timeline.focus_FocusRequestStateView_Day_2_en","features.messages.impl.timeline.focus_FocusRequestStateView_Night_2_en",20385,], -["features.messages.impl.timeline.focus_FocusRequestStateView_Day_3_en","features.messages.impl.timeline.focus_FocusRequestStateView_Night_3_en",20385,], +["features.messages.impl.timeline.focus_FocusRequestStateView_Day_1_en","features.messages.impl.timeline.focus_FocusRequestStateView_Night_1_en",20392,], +["features.messages.impl.timeline.focus_FocusRequestStateView_Day_2_en","features.messages.impl.timeline.focus_FocusRequestStateView_Night_2_en",20392,], +["features.messages.impl.timeline.focus_FocusRequestStateView_Day_3_en","features.messages.impl.timeline.focus_FocusRequestStateView_Night_3_en",20392,], ["features.messages.impl.timeline.components_FocusedEvent_Day_0_en","features.messages.impl.timeline.components_FocusedEvent_Night_0_en",0,], ["libraries.textcomposer.components_FormattingOption_Day_0_en","libraries.textcomposer.components_FormattingOption_Night_0_en",0,], -["features.messages.impl.forward_ForwardMessagesView_Day_0_en","features.messages.impl.forward_ForwardMessagesView_Night_0_en",0,], -["features.messages.impl.forward_ForwardMessagesView_Day_1_en","features.messages.impl.forward_ForwardMessagesView_Night_1_en",0,], -["features.messages.impl.forward_ForwardMessagesView_Day_2_en","features.messages.impl.forward_ForwardMessagesView_Night_2_en",0,], -["features.messages.impl.forward_ForwardMessagesView_Day_3_en","features.messages.impl.forward_ForwardMessagesView_Night_3_en",20385,], -["features.home.impl.components_FullScreenIntentPermissionBanner_Day_0_en","features.home.impl.components_FullScreenIntentPermissionBanner_Night_0_en",20385,], +["features.forward.impl_ForwardMessagesView_Day_0_en","features.forward.impl_ForwardMessagesView_Night_0_en",0,], +["features.forward.impl_ForwardMessagesView_Day_1_en","features.forward.impl_ForwardMessagesView_Night_1_en",0,], +["features.forward.impl_ForwardMessagesView_Day_2_en","features.forward.impl_ForwardMessagesView_Night_2_en",0,], +["features.forward.impl_ForwardMessagesView_Day_3_en","features.forward.impl_ForwardMessagesView_Night_3_en",20395,], +["features.home.impl.components_FullScreenIntentPermissionBanner_Day_0_en","features.home.impl.components_FullScreenIntentPermissionBanner_Night_0_en",20392,], ["libraries.designsystem.components.button_GradientFloatingActionButtonCircleShape_Day_0_en","libraries.designsystem.components.button_GradientFloatingActionButtonCircleShape_Night_0_en",0,], ["libraries.designsystem.components.button_GradientFloatingActionButton_Day_0_en","libraries.designsystem.components.button_GradientFloatingActionButton_Night_0_en",0,], ["features.messages.impl.timeline.components.group_GroupHeaderView_Day_0_en","features.messages.impl.timeline.components.group_GroupHeaderView_Night_0_en",0,], ["libraries.designsystem.atomic.pages_HeaderFooterPageScrollable_Day_0_en","libraries.designsystem.atomic.pages_HeaderFooterPageScrollable_Night_0_en",0,], ["libraries.designsystem.atomic.pages_HeaderFooterPage_Day_0_en","libraries.designsystem.atomic.pages_HeaderFooterPage_Night_0_en",0,], -["features.home.impl.spaces_HomeSpacesView_Day_0_en","features.home.impl.spaces_HomeSpacesView_Night_0_en",20385,], -["features.home.impl.spaces_HomeSpacesView_Day_1_en","features.home.impl.spaces_HomeSpacesView_Night_1_en",20385,], -["features.home.impl.components_HomeTopBarMultiAccount_Day_0_en","features.home.impl.components_HomeTopBarMultiAccount_Night_0_en",20388,], -["features.home.impl.components_HomeTopBarWithIndicator_Day_0_en","features.home.impl.components_HomeTopBarWithIndicator_Night_0_en",20388,], -["features.home.impl.components_HomeTopBar_Day_0_en","features.home.impl.components_HomeTopBar_Night_0_en",20388,], +["features.home.impl.spaces_HomeSpacesView_Day_0_en","features.home.impl.spaces_HomeSpacesView_Night_0_en",20392,], +["features.home.impl.spaces_HomeSpacesView_Day_1_en","features.home.impl.spaces_HomeSpacesView_Night_1_en",20392,], +["features.home.impl.components_HomeTopBarMultiAccount_Day_0_en","features.home.impl.components_HomeTopBarMultiAccount_Night_0_en",20392,], +["features.home.impl.components_HomeTopBarWithIndicator_Day_0_en","features.home.impl.components_HomeTopBarWithIndicator_Night_0_en",20392,], +["features.home.impl.components_HomeTopBar_Day_0_en","features.home.impl.components_HomeTopBar_Night_0_en",20392,], ["features.home.impl_HomeViewA11y_en","",0,], -["features.home.impl_HomeView_Day_0_en","features.home.impl_HomeView_Night_0_en",20385,], -["features.home.impl_HomeView_Day_10_en","features.home.impl_HomeView_Night_10_en",20385,], +["features.home.impl_HomeView_Day_0_en","features.home.impl_HomeView_Night_0_en",20392,], +["features.home.impl_HomeView_Day_10_en","features.home.impl_HomeView_Night_10_en",20392,], ["features.home.impl_HomeView_Day_11_en","features.home.impl_HomeView_Night_11_en",0,], ["features.home.impl_HomeView_Day_12_en","features.home.impl_HomeView_Night_12_en",0,], -["features.home.impl_HomeView_Day_13_en","features.home.impl_HomeView_Night_13_en",20385,], -["features.home.impl_HomeView_Day_14_en","features.home.impl_HomeView_Night_14_en",20385,], -["features.home.impl_HomeView_Day_15_en","features.home.impl_HomeView_Night_15_en",20385,], -["features.home.impl_HomeView_Day_1_en","features.home.impl_HomeView_Night_1_en",20385,], -["features.home.impl_HomeView_Day_2_en","features.home.impl_HomeView_Night_2_en",20385,], -["features.home.impl_HomeView_Day_3_en","features.home.impl_HomeView_Night_3_en",20385,], -["features.home.impl_HomeView_Day_4_en","features.home.impl_HomeView_Night_4_en",20385,], -["features.home.impl_HomeView_Day_5_en","features.home.impl_HomeView_Night_5_en",20385,], -["features.home.impl_HomeView_Day_6_en","features.home.impl_HomeView_Night_6_en",20385,], -["features.home.impl_HomeView_Day_7_en","features.home.impl_HomeView_Night_7_en",20385,], -["features.home.impl_HomeView_Day_8_en","features.home.impl_HomeView_Night_8_en",20385,], -["features.home.impl_HomeView_Day_9_en","features.home.impl_HomeView_Night_9_en",20385,], +["features.home.impl_HomeView_Day_13_en","features.home.impl_HomeView_Night_13_en",20392,], +["features.home.impl_HomeView_Day_14_en","features.home.impl_HomeView_Night_14_en",20392,], +["features.home.impl_HomeView_Day_15_en","features.home.impl_HomeView_Night_15_en",20392,], +["features.home.impl_HomeView_Day_1_en","features.home.impl_HomeView_Night_1_en",20392,], +["features.home.impl_HomeView_Day_2_en","features.home.impl_HomeView_Night_2_en",20392,], +["features.home.impl_HomeView_Day_3_en","features.home.impl_HomeView_Night_3_en",20392,], +["features.home.impl_HomeView_Day_4_en","features.home.impl_HomeView_Night_4_en",20392,], +["features.home.impl_HomeView_Day_5_en","features.home.impl_HomeView_Night_5_en",20392,], +["features.home.impl_HomeView_Day_6_en","features.home.impl_HomeView_Night_6_en",20392,], +["features.home.impl_HomeView_Day_7_en","features.home.impl_HomeView_Night_7_en",20392,], +["features.home.impl_HomeView_Day_8_en","features.home.impl_HomeView_Night_8_en",20392,], +["features.home.impl_HomeView_Day_9_en","features.home.impl_HomeView_Night_9_en",20392,], ["libraries.designsystem.theme.components_HorizontalDivider_Dividers_en","",0,], ["libraries.designsystem.ruler_HorizontalRuler_Day_0_en","libraries.designsystem.ruler_HorizontalRuler_Night_0_en",0,], ["libraries.designsystem.theme.components_IconButton_Buttons_en","",0,], @@ -378,8 +378,8 @@ export const screenshots = [ ["appicon.enterprise_Icon_en","",0,], ["libraries.designsystem.icons_IconsOther_Day_0_en","libraries.designsystem.icons_IconsOther_Night_0_en",0,], ["features.messages.impl.crypto.identity_IdentityChangeStateView_Day_0_en","features.messages.impl.crypto.identity_IdentityChangeStateView_Night_0_en",0,], -["features.messages.impl.crypto.identity_IdentityChangeStateView_Day_1_en","features.messages.impl.crypto.identity_IdentityChangeStateView_Night_1_en",20385,], -["features.messages.impl.crypto.identity_IdentityChangeStateView_Day_2_en","features.messages.impl.crypto.identity_IdentityChangeStateView_Night_2_en",20385,], +["features.messages.impl.crypto.identity_IdentityChangeStateView_Day_1_en","features.messages.impl.crypto.identity_IdentityChangeStateView_Night_1_en",20392,], +["features.messages.impl.crypto.identity_IdentityChangeStateView_Day_2_en","features.messages.impl.crypto.identity_IdentityChangeStateView_Night_2_en",20392,], ["libraries.mediaviewer.impl.gallery.ui_ImageItemView_Day_0_en","libraries.mediaviewer.impl.gallery.ui_ImageItemView_Night_0_en",0,], ["libraries.matrix.ui.messages.reply_InReplyToView_Day_0_en","libraries.matrix.ui.messages.reply_InReplyToView_Night_0_en",0,], ["libraries.matrix.ui.messages.reply_InReplyToView_Day_10_en","libraries.matrix.ui.messages.reply_InReplyToView_Night_10_en",0,], @@ -387,109 +387,109 @@ export const screenshots = [ ["libraries.matrix.ui.messages.reply_InReplyToView_Day_1_en","libraries.matrix.ui.messages.reply_InReplyToView_Night_1_en",0,], ["libraries.matrix.ui.messages.reply_InReplyToView_Day_2_en","libraries.matrix.ui.messages.reply_InReplyToView_Night_2_en",0,], ["libraries.matrix.ui.messages.reply_InReplyToView_Day_3_en","libraries.matrix.ui.messages.reply_InReplyToView_Night_3_en",0,], -["libraries.matrix.ui.messages.reply_InReplyToView_Day_4_en","libraries.matrix.ui.messages.reply_InReplyToView_Night_4_en",20385,], +["libraries.matrix.ui.messages.reply_InReplyToView_Day_4_en","libraries.matrix.ui.messages.reply_InReplyToView_Night_4_en",20392,], ["libraries.matrix.ui.messages.reply_InReplyToView_Day_5_en","libraries.matrix.ui.messages.reply_InReplyToView_Night_5_en",0,], ["libraries.matrix.ui.messages.reply_InReplyToView_Day_6_en","libraries.matrix.ui.messages.reply_InReplyToView_Night_6_en",0,], ["libraries.matrix.ui.messages.reply_InReplyToView_Day_7_en","libraries.matrix.ui.messages.reply_InReplyToView_Night_7_en",0,], -["libraries.matrix.ui.messages.reply_InReplyToView_Day_8_en","libraries.matrix.ui.messages.reply_InReplyToView_Night_8_en",20385,], +["libraries.matrix.ui.messages.reply_InReplyToView_Day_8_en","libraries.matrix.ui.messages.reply_InReplyToView_Night_8_en",20392,], ["libraries.matrix.ui.messages.reply_InReplyToView_Day_9_en","libraries.matrix.ui.messages.reply_InReplyToView_Night_9_en",0,], -["features.call.impl.ui_IncomingCallScreen_Day_0_en","features.call.impl.ui_IncomingCallScreen_Night_0_en",20385,], +["features.call.impl.ui_IncomingCallScreen_Day_0_en","features.call.impl.ui_IncomingCallScreen_Night_0_en",20392,], ["features.verifysession.impl.incoming_IncomingVerificationViewA11y_en","",0,], -["features.verifysession.impl.incoming_IncomingVerificationView_Day_0_en","features.verifysession.impl.incoming_IncomingVerificationView_Night_0_en",20385,], -["features.verifysession.impl.incoming_IncomingVerificationView_Day_10_en","features.verifysession.impl.incoming_IncomingVerificationView_Night_10_en",20385,], -["features.verifysession.impl.incoming_IncomingVerificationView_Day_11_en","features.verifysession.impl.incoming_IncomingVerificationView_Night_11_en",20385,], -["features.verifysession.impl.incoming_IncomingVerificationView_Day_12_en","features.verifysession.impl.incoming_IncomingVerificationView_Night_12_en",20385,], -["features.verifysession.impl.incoming_IncomingVerificationView_Day_13_en","features.verifysession.impl.incoming_IncomingVerificationView_Night_13_en",20385,], -["features.verifysession.impl.incoming_IncomingVerificationView_Day_1_en","features.verifysession.impl.incoming_IncomingVerificationView_Night_1_en",20385,], -["features.verifysession.impl.incoming_IncomingVerificationView_Day_2_en","features.verifysession.impl.incoming_IncomingVerificationView_Night_2_en",20385,], -["features.verifysession.impl.incoming_IncomingVerificationView_Day_3_en","features.verifysession.impl.incoming_IncomingVerificationView_Night_3_en",20385,], -["features.verifysession.impl.incoming_IncomingVerificationView_Day_4_en","features.verifysession.impl.incoming_IncomingVerificationView_Night_4_en",20385,], -["features.verifysession.impl.incoming_IncomingVerificationView_Day_5_en","features.verifysession.impl.incoming_IncomingVerificationView_Night_5_en",20385,], -["features.verifysession.impl.incoming_IncomingVerificationView_Day_6_en","features.verifysession.impl.incoming_IncomingVerificationView_Night_6_en",20385,], -["features.verifysession.impl.incoming_IncomingVerificationView_Day_7_en","features.verifysession.impl.incoming_IncomingVerificationView_Night_7_en",20385,], -["features.verifysession.impl.incoming_IncomingVerificationView_Day_8_en","features.verifysession.impl.incoming_IncomingVerificationView_Night_8_en",20385,], -["features.verifysession.impl.incoming_IncomingVerificationView_Day_9_en","features.verifysession.impl.incoming_IncomingVerificationView_Night_9_en",20385,], +["features.verifysession.impl.incoming_IncomingVerificationView_Day_0_en","features.verifysession.impl.incoming_IncomingVerificationView_Night_0_en",20392,], +["features.verifysession.impl.incoming_IncomingVerificationView_Day_10_en","features.verifysession.impl.incoming_IncomingVerificationView_Night_10_en",20392,], +["features.verifysession.impl.incoming_IncomingVerificationView_Day_11_en","features.verifysession.impl.incoming_IncomingVerificationView_Night_11_en",20392,], +["features.verifysession.impl.incoming_IncomingVerificationView_Day_12_en","features.verifysession.impl.incoming_IncomingVerificationView_Night_12_en",20392,], +["features.verifysession.impl.incoming_IncomingVerificationView_Day_13_en","features.verifysession.impl.incoming_IncomingVerificationView_Night_13_en",20392,], +["features.verifysession.impl.incoming_IncomingVerificationView_Day_1_en","features.verifysession.impl.incoming_IncomingVerificationView_Night_1_en",20392,], +["features.verifysession.impl.incoming_IncomingVerificationView_Day_2_en","features.verifysession.impl.incoming_IncomingVerificationView_Night_2_en",20392,], +["features.verifysession.impl.incoming_IncomingVerificationView_Day_3_en","features.verifysession.impl.incoming_IncomingVerificationView_Night_3_en",20392,], +["features.verifysession.impl.incoming_IncomingVerificationView_Day_4_en","features.verifysession.impl.incoming_IncomingVerificationView_Night_4_en",20392,], +["features.verifysession.impl.incoming_IncomingVerificationView_Day_5_en","features.verifysession.impl.incoming_IncomingVerificationView_Night_5_en",20392,], +["features.verifysession.impl.incoming_IncomingVerificationView_Day_6_en","features.verifysession.impl.incoming_IncomingVerificationView_Night_6_en",20392,], +["features.verifysession.impl.incoming_IncomingVerificationView_Day_7_en","features.verifysession.impl.incoming_IncomingVerificationView_Night_7_en",20392,], +["features.verifysession.impl.incoming_IncomingVerificationView_Day_8_en","features.verifysession.impl.incoming_IncomingVerificationView_Night_8_en",20392,], +["features.verifysession.impl.incoming_IncomingVerificationView_Day_9_en","features.verifysession.impl.incoming_IncomingVerificationView_Night_9_en",20392,], ["libraries.designsystem.atomic.molecules_InfoListItemMolecule_Day_0_en","libraries.designsystem.atomic.molecules_InfoListItemMolecule_Night_0_en",0,], ["libraries.designsystem.atomic.organisms_InfoListOrganism_Day_0_en","libraries.designsystem.atomic.organisms_InfoListOrganism_Night_0_en",0,], ["libraries.matrix.ui.media_InitialsAvatarBitmapGenerator_Day_0_en","libraries.matrix.ui.media_InitialsAvatarBitmapGenerator_Night_0_en",0,], -["features.call.impl.ui_InvalidAudioDeviceDialog_Day_0_en","features.call.impl.ui_InvalidAudioDeviceDialog_Night_0_en",20385,], -["features.invitepeople.impl_InvitePeopleView_Day_0_en","features.invitepeople.impl_InvitePeopleView_Night_0_en",20385,], -["features.invitepeople.impl_InvitePeopleView_Day_1_en","features.invitepeople.impl_InvitePeopleView_Night_1_en",20385,], +["features.call.impl.ui_InvalidAudioDeviceDialog_Day_0_en","features.call.impl.ui_InvalidAudioDeviceDialog_Night_0_en",20392,], +["features.invitepeople.impl_InvitePeopleView_Day_0_en","features.invitepeople.impl_InvitePeopleView_Night_0_en",20392,], +["features.invitepeople.impl_InvitePeopleView_Day_1_en","features.invitepeople.impl_InvitePeopleView_Night_1_en",20392,], ["features.invitepeople.impl_InvitePeopleView_Day_2_en","features.invitepeople.impl_InvitePeopleView_Night_2_en",0,], ["features.invitepeople.impl_InvitePeopleView_Day_3_en","features.invitepeople.impl_InvitePeopleView_Night_3_en",0,], -["features.invitepeople.impl_InvitePeopleView_Day_4_en","features.invitepeople.impl_InvitePeopleView_Night_4_en",20385,], -["features.invitepeople.impl_InvitePeopleView_Day_5_en","features.invitepeople.impl_InvitePeopleView_Night_5_en",20385,], -["features.invitepeople.impl_InvitePeopleView_Day_6_en","features.invitepeople.impl_InvitePeopleView_Night_6_en",20385,], -["features.invitepeople.impl_InvitePeopleView_Day_7_en","features.invitepeople.impl_InvitePeopleView_Night_7_en",20385,], +["features.invitepeople.impl_InvitePeopleView_Day_4_en","features.invitepeople.impl_InvitePeopleView_Night_4_en",20392,], +["features.invitepeople.impl_InvitePeopleView_Day_5_en","features.invitepeople.impl_InvitePeopleView_Night_5_en",20392,], +["features.invitepeople.impl_InvitePeopleView_Day_6_en","features.invitepeople.impl_InvitePeopleView_Night_6_en",20392,], +["features.invitepeople.impl_InvitePeopleView_Day_7_en","features.invitepeople.impl_InvitePeopleView_Night_7_en",20392,], ["features.invitepeople.impl_InvitePeopleView_Day_8_en","features.invitepeople.impl_InvitePeopleView_Night_8_en",0,], -["features.invitepeople.impl_InvitePeopleView_Day_9_en","features.invitepeople.impl_InvitePeopleView_Night_9_en",20385,], -["libraries.matrix.ui.components_InviteSenderView_Day_0_en","libraries.matrix.ui.components_InviteSenderView_Night_0_en",20385,], -["features.startchat.impl.joinbyaddress_JoinRoomByAddressView_Day_0_en","features.startchat.impl.joinbyaddress_JoinRoomByAddressView_Night_0_en",20385,], -["features.startchat.impl.joinbyaddress_JoinRoomByAddressView_Day_1_en","features.startchat.impl.joinbyaddress_JoinRoomByAddressView_Night_1_en",20385,], -["features.startchat.impl.joinbyaddress_JoinRoomByAddressView_Day_2_en","features.startchat.impl.joinbyaddress_JoinRoomByAddressView_Night_2_en",20385,], -["features.startchat.impl.joinbyaddress_JoinRoomByAddressView_Day_3_en","features.startchat.impl.joinbyaddress_JoinRoomByAddressView_Night_3_en",20385,], -["features.startchat.impl.joinbyaddress_JoinRoomByAddressView_Day_4_en","features.startchat.impl.joinbyaddress_JoinRoomByAddressView_Night_4_en",20385,], -["features.startchat.impl.joinbyaddress_JoinRoomByAddressView_Day_5_en","features.startchat.impl.joinbyaddress_JoinRoomByAddressView_Night_5_en",20385,], +["features.invitepeople.impl_InvitePeopleView_Day_9_en","features.invitepeople.impl_InvitePeopleView_Night_9_en",20392,], +["libraries.matrix.ui.components_InviteSenderView_Day_0_en","libraries.matrix.ui.components_InviteSenderView_Night_0_en",20392,], +["features.startchat.impl.joinbyaddress_JoinRoomByAddressView_Day_0_en","features.startchat.impl.joinbyaddress_JoinRoomByAddressView_Night_0_en",20392,], +["features.startchat.impl.joinbyaddress_JoinRoomByAddressView_Day_1_en","features.startchat.impl.joinbyaddress_JoinRoomByAddressView_Night_1_en",20392,], +["features.startchat.impl.joinbyaddress_JoinRoomByAddressView_Day_2_en","features.startchat.impl.joinbyaddress_JoinRoomByAddressView_Night_2_en",20392,], +["features.startchat.impl.joinbyaddress_JoinRoomByAddressView_Day_3_en","features.startchat.impl.joinbyaddress_JoinRoomByAddressView_Night_3_en",20392,], +["features.startchat.impl.joinbyaddress_JoinRoomByAddressView_Day_4_en","features.startchat.impl.joinbyaddress_JoinRoomByAddressView_Night_4_en",20392,], +["features.startchat.impl.joinbyaddress_JoinRoomByAddressView_Day_5_en","features.startchat.impl.joinbyaddress_JoinRoomByAddressView_Night_5_en",20392,], ["features.joinroom.impl_JoinRoomView_Day_0_en","features.joinroom.impl_JoinRoomView_Night_0_en",0,], -["features.joinroom.impl_JoinRoomView_Day_10_en","features.joinroom.impl_JoinRoomView_Night_10_en",20385,], -["features.joinroom.impl_JoinRoomView_Day_11_en","features.joinroom.impl_JoinRoomView_Night_11_en",20385,], -["features.joinroom.impl_JoinRoomView_Day_12_en","features.joinroom.impl_JoinRoomView_Night_12_en",20385,], -["features.joinroom.impl_JoinRoomView_Day_13_en","features.joinroom.impl_JoinRoomView_Night_13_en",20385,], -["features.joinroom.impl_JoinRoomView_Day_14_en","features.joinroom.impl_JoinRoomView_Night_14_en",20385,], -["features.joinroom.impl_JoinRoomView_Day_15_en","features.joinroom.impl_JoinRoomView_Night_15_en",20385,], -["features.joinroom.impl_JoinRoomView_Day_16_en","features.joinroom.impl_JoinRoomView_Night_16_en",20385,], -["features.joinroom.impl_JoinRoomView_Day_1_en","features.joinroom.impl_JoinRoomView_Night_1_en",20385,], -["features.joinroom.impl_JoinRoomView_Day_2_en","features.joinroom.impl_JoinRoomView_Night_2_en",20385,], -["features.joinroom.impl_JoinRoomView_Day_3_en","features.joinroom.impl_JoinRoomView_Night_3_en",20385,], -["features.joinroom.impl_JoinRoomView_Day_4_en","features.joinroom.impl_JoinRoomView_Night_4_en",20385,], -["features.joinroom.impl_JoinRoomView_Day_5_en","features.joinroom.impl_JoinRoomView_Night_5_en",20385,], -["features.joinroom.impl_JoinRoomView_Day_6_en","features.joinroom.impl_JoinRoomView_Night_6_en",20385,], -["features.joinroom.impl_JoinRoomView_Day_7_en","features.joinroom.impl_JoinRoomView_Night_7_en",20385,], -["features.joinroom.impl_JoinRoomView_Day_8_en","features.joinroom.impl_JoinRoomView_Night_8_en",20385,], -["features.joinroom.impl_JoinRoomView_Day_9_en","features.joinroom.impl_JoinRoomView_Night_9_en",20385,], -["features.knockrequests.impl.banner_KnockRequestsBannerView_Day_0_en","features.knockrequests.impl.banner_KnockRequestsBannerView_Night_0_en",20385,], -["features.knockrequests.impl.banner_KnockRequestsBannerView_Day_1_en","features.knockrequests.impl.banner_KnockRequestsBannerView_Night_1_en",20385,], -["features.knockrequests.impl.banner_KnockRequestsBannerView_Day_2_en","features.knockrequests.impl.banner_KnockRequestsBannerView_Night_2_en",20385,], -["features.knockrequests.impl.banner_KnockRequestsBannerView_Day_3_en","features.knockrequests.impl.banner_KnockRequestsBannerView_Night_3_en",20385,], -["features.knockrequests.impl.banner_KnockRequestsBannerView_Day_4_en","features.knockrequests.impl.banner_KnockRequestsBannerView_Night_4_en",20385,], -["features.knockrequests.impl.banner_KnockRequestsBannerView_Day_5_en","features.knockrequests.impl.banner_KnockRequestsBannerView_Night_5_en",20385,], -["features.knockrequests.impl.banner_KnockRequestsBannerView_Day_6_en","features.knockrequests.impl.banner_KnockRequestsBannerView_Night_6_en",20385,], -["features.knockrequests.impl.list_KnockRequestsListView_Day_0_en","features.knockrequests.impl.list_KnockRequestsListView_Night_0_en",20385,], -["features.knockrequests.impl.list_KnockRequestsListView_Day_10_en","features.knockrequests.impl.list_KnockRequestsListView_Night_10_en",20385,], -["features.knockrequests.impl.list_KnockRequestsListView_Day_1_en","features.knockrequests.impl.list_KnockRequestsListView_Night_1_en",20385,], -["features.knockrequests.impl.list_KnockRequestsListView_Day_2_en","features.knockrequests.impl.list_KnockRequestsListView_Night_2_en",20385,], -["features.knockrequests.impl.list_KnockRequestsListView_Day_3_en","features.knockrequests.impl.list_KnockRequestsListView_Night_3_en",20385,], -["features.knockrequests.impl.list_KnockRequestsListView_Day_4_en","features.knockrequests.impl.list_KnockRequestsListView_Night_4_en",20385,], -["features.knockrequests.impl.list_KnockRequestsListView_Day_5_en","features.knockrequests.impl.list_KnockRequestsListView_Night_5_en",20385,], -["features.knockrequests.impl.list_KnockRequestsListView_Day_6_en","features.knockrequests.impl.list_KnockRequestsListView_Night_6_en",20385,], -["features.knockrequests.impl.list_KnockRequestsListView_Day_7_en","features.knockrequests.impl.list_KnockRequestsListView_Night_7_en",20385,], -["features.knockrequests.impl.list_KnockRequestsListView_Day_8_en","features.knockrequests.impl.list_KnockRequestsListView_Night_8_en",20385,], -["features.knockrequests.impl.list_KnockRequestsListView_Day_9_en","features.knockrequests.impl.list_KnockRequestsListView_Night_9_en",20385,], +["features.joinroom.impl_JoinRoomView_Day_10_en","features.joinroom.impl_JoinRoomView_Night_10_en",20392,], +["features.joinroom.impl_JoinRoomView_Day_11_en","features.joinroom.impl_JoinRoomView_Night_11_en",20392,], +["features.joinroom.impl_JoinRoomView_Day_12_en","features.joinroom.impl_JoinRoomView_Night_12_en",20392,], +["features.joinroom.impl_JoinRoomView_Day_13_en","features.joinroom.impl_JoinRoomView_Night_13_en",20392,], +["features.joinroom.impl_JoinRoomView_Day_14_en","features.joinroom.impl_JoinRoomView_Night_14_en",20392,], +["features.joinroom.impl_JoinRoomView_Day_15_en","features.joinroom.impl_JoinRoomView_Night_15_en",20392,], +["features.joinroom.impl_JoinRoomView_Day_16_en","features.joinroom.impl_JoinRoomView_Night_16_en",20392,], +["features.joinroom.impl_JoinRoomView_Day_1_en","features.joinroom.impl_JoinRoomView_Night_1_en",20392,], +["features.joinroom.impl_JoinRoomView_Day_2_en","features.joinroom.impl_JoinRoomView_Night_2_en",20392,], +["features.joinroom.impl_JoinRoomView_Day_3_en","features.joinroom.impl_JoinRoomView_Night_3_en",20392,], +["features.joinroom.impl_JoinRoomView_Day_4_en","features.joinroom.impl_JoinRoomView_Night_4_en",20392,], +["features.joinroom.impl_JoinRoomView_Day_5_en","features.joinroom.impl_JoinRoomView_Night_5_en",20392,], +["features.joinroom.impl_JoinRoomView_Day_6_en","features.joinroom.impl_JoinRoomView_Night_6_en",20392,], +["features.joinroom.impl_JoinRoomView_Day_7_en","features.joinroom.impl_JoinRoomView_Night_7_en",20392,], +["features.joinroom.impl_JoinRoomView_Day_8_en","features.joinroom.impl_JoinRoomView_Night_8_en",20392,], +["features.joinroom.impl_JoinRoomView_Day_9_en","features.joinroom.impl_JoinRoomView_Night_9_en",20392,], +["features.knockrequests.impl.banner_KnockRequestsBannerView_Day_0_en","features.knockrequests.impl.banner_KnockRequestsBannerView_Night_0_en",20392,], +["features.knockrequests.impl.banner_KnockRequestsBannerView_Day_1_en","features.knockrequests.impl.banner_KnockRequestsBannerView_Night_1_en",20392,], +["features.knockrequests.impl.banner_KnockRequestsBannerView_Day_2_en","features.knockrequests.impl.banner_KnockRequestsBannerView_Night_2_en",20392,], +["features.knockrequests.impl.banner_KnockRequestsBannerView_Day_3_en","features.knockrequests.impl.banner_KnockRequestsBannerView_Night_3_en",20392,], +["features.knockrequests.impl.banner_KnockRequestsBannerView_Day_4_en","features.knockrequests.impl.banner_KnockRequestsBannerView_Night_4_en",20392,], +["features.knockrequests.impl.banner_KnockRequestsBannerView_Day_5_en","features.knockrequests.impl.banner_KnockRequestsBannerView_Night_5_en",20392,], +["features.knockrequests.impl.banner_KnockRequestsBannerView_Day_6_en","features.knockrequests.impl.banner_KnockRequestsBannerView_Night_6_en",20392,], +["features.knockrequests.impl.list_KnockRequestsListView_Day_0_en","features.knockrequests.impl.list_KnockRequestsListView_Night_0_en",20392,], +["features.knockrequests.impl.list_KnockRequestsListView_Day_10_en","features.knockrequests.impl.list_KnockRequestsListView_Night_10_en",20392,], +["features.knockrequests.impl.list_KnockRequestsListView_Day_1_en","features.knockrequests.impl.list_KnockRequestsListView_Night_1_en",20392,], +["features.knockrequests.impl.list_KnockRequestsListView_Day_2_en","features.knockrequests.impl.list_KnockRequestsListView_Night_2_en",20392,], +["features.knockrequests.impl.list_KnockRequestsListView_Day_3_en","features.knockrequests.impl.list_KnockRequestsListView_Night_3_en",20392,], +["features.knockrequests.impl.list_KnockRequestsListView_Day_4_en","features.knockrequests.impl.list_KnockRequestsListView_Night_4_en",20392,], +["features.knockrequests.impl.list_KnockRequestsListView_Day_5_en","features.knockrequests.impl.list_KnockRequestsListView_Night_5_en",20392,], +["features.knockrequests.impl.list_KnockRequestsListView_Day_6_en","features.knockrequests.impl.list_KnockRequestsListView_Night_6_en",20392,], +["features.knockrequests.impl.list_KnockRequestsListView_Day_7_en","features.knockrequests.impl.list_KnockRequestsListView_Night_7_en",20392,], +["features.knockrequests.impl.list_KnockRequestsListView_Day_8_en","features.knockrequests.impl.list_KnockRequestsListView_Night_8_en",20392,], +["features.knockrequests.impl.list_KnockRequestsListView_Day_9_en","features.knockrequests.impl.list_KnockRequestsListView_Night_9_en",20392,], ["libraries.designsystem.components_LabelledCheckbox_Toggles_en","",0,], -["features.preferences.impl.labs_LabsView_Day_0_en","features.preferences.impl.labs_LabsView_Night_0_en",20385,], -["features.preferences.impl.labs_LabsView_Day_1_en","features.preferences.impl.labs_LabsView_Night_1_en",20385,], +["features.preferences.impl.labs_LabsView_Day_0_en","features.preferences.impl.labs_LabsView_Night_0_en",20392,], +["features.preferences.impl.labs_LabsView_Day_1_en","features.preferences.impl.labs_LabsView_Night_1_en",20392,], ["features.leaveroom.impl_LeaveRoomView_Day_0_en","features.leaveroom.impl_LeaveRoomView_Night_0_en",0,], -["features.leaveroom.impl_LeaveRoomView_Day_1_en","features.leaveroom.impl_LeaveRoomView_Night_1_en",20385,], -["features.leaveroom.impl_LeaveRoomView_Day_2_en","features.leaveroom.impl_LeaveRoomView_Night_2_en",20385,], -["features.leaveroom.impl_LeaveRoomView_Day_3_en","features.leaveroom.impl_LeaveRoomView_Night_3_en",20385,], -["features.leaveroom.impl_LeaveRoomView_Day_4_en","features.leaveroom.impl_LeaveRoomView_Night_4_en",20385,], -["features.leaveroom.impl_LeaveRoomView_Day_5_en","features.leaveroom.impl_LeaveRoomView_Night_5_en",20385,], -["features.leaveroom.impl_LeaveRoomView_Day_6_en","features.leaveroom.impl_LeaveRoomView_Night_6_en",20385,], -["features.leaveroom.impl_LeaveRoomView_Day_7_en","features.leaveroom.impl_LeaveRoomView_Night_7_en",20385,], -["features.space.impl.leave_LeaveSpaceView_Day_0_en","features.space.impl.leave_LeaveSpaceView_Night_0_en",20385,], -["features.space.impl.leave_LeaveSpaceView_Day_1_en","features.space.impl.leave_LeaveSpaceView_Night_1_en",20385,], -["features.space.impl.leave_LeaveSpaceView_Day_2_en","features.space.impl.leave_LeaveSpaceView_Night_2_en",20385,], -["features.space.impl.leave_LeaveSpaceView_Day_3_en","features.space.impl.leave_LeaveSpaceView_Night_3_en",20385,], -["features.space.impl.leave_LeaveSpaceView_Day_4_en","features.space.impl.leave_LeaveSpaceView_Night_4_en",20385,], -["features.space.impl.leave_LeaveSpaceView_Day_5_en","features.space.impl.leave_LeaveSpaceView_Night_5_en",20385,], -["features.space.impl.leave_LeaveSpaceView_Day_6_en","features.space.impl.leave_LeaveSpaceView_Night_6_en",20385,], -["features.space.impl.leave_LeaveSpaceView_Day_7_en","features.space.impl.leave_LeaveSpaceView_Night_7_en",20385,], -["features.space.impl.leave_LeaveSpaceView_Day_8_en","features.space.impl.leave_LeaveSpaceView_Night_8_en",20385,], -["features.space.impl.leave_LeaveSpaceView_Day_9_en","features.space.impl.leave_LeaveSpaceView_Night_9_en",20385,], +["features.leaveroom.impl_LeaveRoomView_Day_1_en","features.leaveroom.impl_LeaveRoomView_Night_1_en",20392,], +["features.leaveroom.impl_LeaveRoomView_Day_2_en","features.leaveroom.impl_LeaveRoomView_Night_2_en",20392,], +["features.leaveroom.impl_LeaveRoomView_Day_3_en","features.leaveroom.impl_LeaveRoomView_Night_3_en",20392,], +["features.leaveroom.impl_LeaveRoomView_Day_4_en","features.leaveroom.impl_LeaveRoomView_Night_4_en",20392,], +["features.leaveroom.impl_LeaveRoomView_Day_5_en","features.leaveroom.impl_LeaveRoomView_Night_5_en",20392,], +["features.leaveroom.impl_LeaveRoomView_Day_6_en","features.leaveroom.impl_LeaveRoomView_Night_6_en",20392,], +["features.leaveroom.impl_LeaveRoomView_Day_7_en","features.leaveroom.impl_LeaveRoomView_Night_7_en",20392,], +["features.space.impl.leave_LeaveSpaceView_Day_0_en","features.space.impl.leave_LeaveSpaceView_Night_0_en",20392,], +["features.space.impl.leave_LeaveSpaceView_Day_1_en","features.space.impl.leave_LeaveSpaceView_Night_1_en",20392,], +["features.space.impl.leave_LeaveSpaceView_Day_2_en","features.space.impl.leave_LeaveSpaceView_Night_2_en",20392,], +["features.space.impl.leave_LeaveSpaceView_Day_3_en","features.space.impl.leave_LeaveSpaceView_Night_3_en",20392,], +["features.space.impl.leave_LeaveSpaceView_Day_4_en","features.space.impl.leave_LeaveSpaceView_Night_4_en",20392,], +["features.space.impl.leave_LeaveSpaceView_Day_5_en","features.space.impl.leave_LeaveSpaceView_Night_5_en",20392,], +["features.space.impl.leave_LeaveSpaceView_Day_6_en","features.space.impl.leave_LeaveSpaceView_Night_6_en",20392,], +["features.space.impl.leave_LeaveSpaceView_Day_7_en","features.space.impl.leave_LeaveSpaceView_Night_7_en",20392,], +["features.space.impl.leave_LeaveSpaceView_Day_8_en","features.space.impl.leave_LeaveSpaceView_Night_8_en",20392,], +["features.space.impl.leave_LeaveSpaceView_Day_9_en","features.space.impl.leave_LeaveSpaceView_Night_9_en",20392,], ["libraries.designsystem.background_LightGradientBackground_Day_0_en","libraries.designsystem.background_LightGradientBackground_Night_0_en",0,], ["libraries.designsystem.theme.components_LinearProgressIndicator_Progress_Indicators_en","",0,], ["features.messages.impl.link_LinkView_Day_0_en","features.messages.impl.link_LinkView_Night_0_en",0,], -["features.messages.impl.link_LinkView_Day_1_en","features.messages.impl.link_LinkView_Night_1_en",20385,], +["features.messages.impl.link_LinkView_Day_1_en","features.messages.impl.link_LinkView_Night_1_en",20392,], ["libraries.designsystem.components.dialogs_ListDialogContent_Dialogs_en","",0,], ["libraries.designsystem.components.dialogs_ListDialog_Day_0_en","libraries.designsystem.components.dialogs_ListDialog_Night_0_en",0,], ["libraries.designsystem.theme.components_ListItemPrimaryActionWithIcon_List_item_-_Primary_action_&_Icon_List_items_en","",0,], @@ -544,37 +544,37 @@ export const screenshots = [ ["libraries.designsystem.theme.components_ListSupportingTextSmallPadding_List_supporting_text_-_small_padding_List_sections_en","",0,], ["libraries.textcomposer.components_LiveWaveformView_Day_0_en","libraries.textcomposer.components_LiveWaveformView_Night_0_en",0,], ["appnav.room.joined_LoadingRoomNodeView_Day_0_en","appnav.room.joined_LoadingRoomNodeView_Night_0_en",0,], -["appnav.room.joined_LoadingRoomNodeView_Day_1_en","appnav.room.joined_LoadingRoomNodeView_Night_1_en",20385,], -["features.lockscreen.impl.settings_LockScreenSettingsView_Day_0_en","features.lockscreen.impl.settings_LockScreenSettingsView_Night_0_en",20385,], -["features.lockscreen.impl.settings_LockScreenSettingsView_Day_1_en","features.lockscreen.impl.settings_LockScreenSettingsView_Night_1_en",20385,], -["features.lockscreen.impl.settings_LockScreenSettingsView_Day_2_en","features.lockscreen.impl.settings_LockScreenSettingsView_Night_2_en",20385,], +["appnav.room.joined_LoadingRoomNodeView_Day_1_en","appnav.room.joined_LoadingRoomNodeView_Night_1_en",20392,], +["features.lockscreen.impl.settings_LockScreenSettingsView_Day_0_en","features.lockscreen.impl.settings_LockScreenSettingsView_Night_0_en",20392,], +["features.lockscreen.impl.settings_LockScreenSettingsView_Day_1_en","features.lockscreen.impl.settings_LockScreenSettingsView_Night_1_en",20392,], +["features.lockscreen.impl.settings_LockScreenSettingsView_Day_2_en","features.lockscreen.impl.settings_LockScreenSettingsView_Night_2_en",20392,], ["appnav.loggedin_LoggedInView_Day_0_en","appnav.loggedin_LoggedInView_Night_0_en",0,], -["appnav.loggedin_LoggedInView_Day_1_en","appnav.loggedin_LoggedInView_Night_1_en",20385,], -["appnav.loggedin_LoggedInView_Day_2_en","appnav.loggedin_LoggedInView_Night_2_en",20385,], -["appnav.loggedin_LoggedInView_Day_3_en","appnav.loggedin_LoggedInView_Night_3_en",20385,], -["features.login.impl.login_LoginModeView_Day_0_en","features.login.impl.login_LoginModeView_Night_0_en",20385,], -["features.login.impl.login_LoginModeView_Day_1_en","features.login.impl.login_LoginModeView_Night_1_en",20385,], -["features.login.impl.login_LoginModeView_Day_2_en","features.login.impl.login_LoginModeView_Night_2_en",20385,], -["features.login.impl.login_LoginModeView_Day_3_en","features.login.impl.login_LoginModeView_Night_3_en",20385,], -["features.login.impl.login_LoginModeView_Day_4_en","features.login.impl.login_LoginModeView_Night_4_en",20385,], -["features.login.impl.login_LoginModeView_Day_5_en","features.login.impl.login_LoginModeView_Night_5_en",20385,], -["features.login.impl.screens.loginpassword_LoginPasswordView_Day_0_en","features.login.impl.screens.loginpassword_LoginPasswordView_Night_0_en",20385,], -["features.login.impl.screens.loginpassword_LoginPasswordView_Day_1_en","features.login.impl.screens.loginpassword_LoginPasswordView_Night_1_en",20385,], -["features.login.impl.screens.loginpassword_LoginPasswordView_Day_2_en","features.login.impl.screens.loginpassword_LoginPasswordView_Night_2_en",20385,], -["features.logout.impl_LogoutView_Day_0_en","features.logout.impl_LogoutView_Night_0_en",20385,], -["features.logout.impl_LogoutView_Day_10_en","features.logout.impl_LogoutView_Night_10_en",20385,], -["features.logout.impl_LogoutView_Day_11_en","features.logout.impl_LogoutView_Night_11_en",20385,], -["features.logout.impl_LogoutView_Day_1_en","features.logout.impl_LogoutView_Night_1_en",20385,], -["features.logout.impl_LogoutView_Day_2_en","features.logout.impl_LogoutView_Night_2_en",20385,], -["features.logout.impl_LogoutView_Day_3_en","features.logout.impl_LogoutView_Night_3_en",20385,], -["features.logout.impl_LogoutView_Day_4_en","features.logout.impl_LogoutView_Night_4_en",20385,], -["features.logout.impl_LogoutView_Day_5_en","features.logout.impl_LogoutView_Night_5_en",20385,], -["features.logout.impl_LogoutView_Day_6_en","features.logout.impl_LogoutView_Night_6_en",20385,], -["features.logout.impl_LogoutView_Day_7_en","features.logout.impl_LogoutView_Night_7_en",20385,], -["features.logout.impl_LogoutView_Day_8_en","features.logout.impl_LogoutView_Night_8_en",20385,], -["features.logout.impl_LogoutView_Day_9_en","features.logout.impl_LogoutView_Night_9_en",20385,], +["appnav.loggedin_LoggedInView_Day_1_en","appnav.loggedin_LoggedInView_Night_1_en",20392,], +["appnav.loggedin_LoggedInView_Day_2_en","appnav.loggedin_LoggedInView_Night_2_en",20392,], +["appnav.loggedin_LoggedInView_Day_3_en","appnav.loggedin_LoggedInView_Night_3_en",20392,], +["features.login.impl.login_LoginModeView_Day_0_en","features.login.impl.login_LoginModeView_Night_0_en",20392,], +["features.login.impl.login_LoginModeView_Day_1_en","features.login.impl.login_LoginModeView_Night_1_en",20392,], +["features.login.impl.login_LoginModeView_Day_2_en","features.login.impl.login_LoginModeView_Night_2_en",20392,], +["features.login.impl.login_LoginModeView_Day_3_en","features.login.impl.login_LoginModeView_Night_3_en",20392,], +["features.login.impl.login_LoginModeView_Day_4_en","features.login.impl.login_LoginModeView_Night_4_en",20392,], +["features.login.impl.login_LoginModeView_Day_5_en","features.login.impl.login_LoginModeView_Night_5_en",20392,], +["features.login.impl.screens.loginpassword_LoginPasswordView_Day_0_en","features.login.impl.screens.loginpassword_LoginPasswordView_Night_0_en",20392,], +["features.login.impl.screens.loginpassword_LoginPasswordView_Day_1_en","features.login.impl.screens.loginpassword_LoginPasswordView_Night_1_en",20392,], +["features.login.impl.screens.loginpassword_LoginPasswordView_Day_2_en","features.login.impl.screens.loginpassword_LoginPasswordView_Night_2_en",20392,], +["features.logout.impl_LogoutView_Day_0_en","features.logout.impl_LogoutView_Night_0_en",20392,], +["features.logout.impl_LogoutView_Day_10_en","features.logout.impl_LogoutView_Night_10_en",20392,], +["features.logout.impl_LogoutView_Day_11_en","features.logout.impl_LogoutView_Night_11_en",20392,], +["features.logout.impl_LogoutView_Day_1_en","features.logout.impl_LogoutView_Night_1_en",20392,], +["features.logout.impl_LogoutView_Day_2_en","features.logout.impl_LogoutView_Night_2_en",20392,], +["features.logout.impl_LogoutView_Day_3_en","features.logout.impl_LogoutView_Night_3_en",20392,], +["features.logout.impl_LogoutView_Day_4_en","features.logout.impl_LogoutView_Night_4_en",20392,], +["features.logout.impl_LogoutView_Day_5_en","features.logout.impl_LogoutView_Night_5_en",20392,], +["features.logout.impl_LogoutView_Day_6_en","features.logout.impl_LogoutView_Night_6_en",20392,], +["features.logout.impl_LogoutView_Day_7_en","features.logout.impl_LogoutView_Night_7_en",20392,], +["features.logout.impl_LogoutView_Day_8_en","features.logout.impl_LogoutView_Night_8_en",20392,], +["features.logout.impl_LogoutView_Day_9_en","features.logout.impl_LogoutView_Night_9_en",20392,], ["libraries.designsystem.components.button_MainActionButton_Buttons_en","",0,], -["libraries.textcomposer_MarkdownTextComposerEdit_Day_0_en","libraries.textcomposer_MarkdownTextComposerEdit_Night_0_en",20385,], +["libraries.textcomposer_MarkdownTextComposerEdit_Day_0_en","libraries.textcomposer_MarkdownTextComposerEdit_Night_0_en",20392,], ["libraries.textcomposer.components.markdown_MarkdownTextInput_Day_0_en","libraries.textcomposer.components.markdown_MarkdownTextInput_Night_0_en",0,], ["libraries.designsystem.atomic.atoms_MatrixBadgeAtomInfo_Day_0_en","libraries.designsystem.atomic.atoms_MatrixBadgeAtomInfo_Night_0_en",0,], ["libraries.designsystem.atomic.atoms_MatrixBadgeAtomNegative_Day_0_en","libraries.designsystem.atomic.atoms_MatrixBadgeAtomNegative_Night_0_en",0,], @@ -587,22 +587,22 @@ export const screenshots = [ ["libraries.matrix.ui.components_MatrixUserRow_Day_1_en","libraries.matrix.ui.components_MatrixUserRow_Night_1_en",0,], ["libraries.mediaviewer.impl.local.audio_MediaAudioView_Day_0_en","libraries.mediaviewer.impl.local.audio_MediaAudioView_Night_0_en",0,], ["libraries.mediaviewer.impl.local.audio_MediaAudioView_Day_1_en","libraries.mediaviewer.impl.local.audio_MediaAudioView_Night_1_en",0,], -["libraries.mediaviewer.impl.details_MediaDeleteConfirmationBottomSheet_Day_0_en","libraries.mediaviewer.impl.details_MediaDeleteConfirmationBottomSheet_Night_0_en",20385,], -["libraries.mediaviewer.impl.details_MediaDetailsBottomSheet_Day_0_en","libraries.mediaviewer.impl.details_MediaDetailsBottomSheet_Night_0_en",20385,], +["libraries.mediaviewer.impl.details_MediaDeleteConfirmationBottomSheet_Day_0_en","libraries.mediaviewer.impl.details_MediaDeleteConfirmationBottomSheet_Night_0_en",20392,], +["libraries.mediaviewer.impl.details_MediaDetailsBottomSheet_Day_0_en","libraries.mediaviewer.impl.details_MediaDetailsBottomSheet_Night_0_en",20392,], ["libraries.mediaviewer.impl.local.file_MediaFileView_Day_0_en","libraries.mediaviewer.impl.local.file_MediaFileView_Night_0_en",0,], -["libraries.mediaviewer.impl.gallery_MediaGalleryView_Day_0_en","libraries.mediaviewer.impl.gallery_MediaGalleryView_Night_0_en",20385,], -["libraries.mediaviewer.impl.gallery_MediaGalleryView_Day_10_en","libraries.mediaviewer.impl.gallery_MediaGalleryView_Night_10_en",20385,], -["libraries.mediaviewer.impl.gallery_MediaGalleryView_Day_11_en","libraries.mediaviewer.impl.gallery_MediaGalleryView_Night_11_en",20385,], -["libraries.mediaviewer.impl.gallery_MediaGalleryView_Day_12_en","libraries.mediaviewer.impl.gallery_MediaGalleryView_Night_12_en",20385,], -["libraries.mediaviewer.impl.gallery_MediaGalleryView_Day_1_en","libraries.mediaviewer.impl.gallery_MediaGalleryView_Night_1_en",20385,], -["libraries.mediaviewer.impl.gallery_MediaGalleryView_Day_2_en","libraries.mediaviewer.impl.gallery_MediaGalleryView_Night_2_en",20385,], -["libraries.mediaviewer.impl.gallery_MediaGalleryView_Day_3_en","libraries.mediaviewer.impl.gallery_MediaGalleryView_Night_3_en",20385,], -["libraries.mediaviewer.impl.gallery_MediaGalleryView_Day_4_en","libraries.mediaviewer.impl.gallery_MediaGalleryView_Night_4_en",20385,], -["libraries.mediaviewer.impl.gallery_MediaGalleryView_Day_5_en","libraries.mediaviewer.impl.gallery_MediaGalleryView_Night_5_en",20385,], -["libraries.mediaviewer.impl.gallery_MediaGalleryView_Day_6_en","libraries.mediaviewer.impl.gallery_MediaGalleryView_Night_6_en",20385,], -["libraries.mediaviewer.impl.gallery_MediaGalleryView_Day_7_en","libraries.mediaviewer.impl.gallery_MediaGalleryView_Night_7_en",20385,], -["libraries.mediaviewer.impl.gallery_MediaGalleryView_Day_8_en","libraries.mediaviewer.impl.gallery_MediaGalleryView_Night_8_en",20385,], -["libraries.mediaviewer.impl.gallery_MediaGalleryView_Day_9_en","libraries.mediaviewer.impl.gallery_MediaGalleryView_Night_9_en",20385,], +["libraries.mediaviewer.impl.gallery_MediaGalleryView_Day_0_en","libraries.mediaviewer.impl.gallery_MediaGalleryView_Night_0_en",20392,], +["libraries.mediaviewer.impl.gallery_MediaGalleryView_Day_10_en","libraries.mediaviewer.impl.gallery_MediaGalleryView_Night_10_en",20392,], +["libraries.mediaviewer.impl.gallery_MediaGalleryView_Day_11_en","libraries.mediaviewer.impl.gallery_MediaGalleryView_Night_11_en",20392,], +["libraries.mediaviewer.impl.gallery_MediaGalleryView_Day_12_en","libraries.mediaviewer.impl.gallery_MediaGalleryView_Night_12_en",20392,], +["libraries.mediaviewer.impl.gallery_MediaGalleryView_Day_1_en","libraries.mediaviewer.impl.gallery_MediaGalleryView_Night_1_en",20392,], +["libraries.mediaviewer.impl.gallery_MediaGalleryView_Day_2_en","libraries.mediaviewer.impl.gallery_MediaGalleryView_Night_2_en",20392,], +["libraries.mediaviewer.impl.gallery_MediaGalleryView_Day_3_en","libraries.mediaviewer.impl.gallery_MediaGalleryView_Night_3_en",20392,], +["libraries.mediaviewer.impl.gallery_MediaGalleryView_Day_4_en","libraries.mediaviewer.impl.gallery_MediaGalleryView_Night_4_en",20392,], +["libraries.mediaviewer.impl.gallery_MediaGalleryView_Day_5_en","libraries.mediaviewer.impl.gallery_MediaGalleryView_Night_5_en",20392,], +["libraries.mediaviewer.impl.gallery_MediaGalleryView_Day_6_en","libraries.mediaviewer.impl.gallery_MediaGalleryView_Night_6_en",20392,], +["libraries.mediaviewer.impl.gallery_MediaGalleryView_Day_7_en","libraries.mediaviewer.impl.gallery_MediaGalleryView_Night_7_en",20392,], +["libraries.mediaviewer.impl.gallery_MediaGalleryView_Day_8_en","libraries.mediaviewer.impl.gallery_MediaGalleryView_Night_8_en",20392,], +["libraries.mediaviewer.impl.gallery_MediaGalleryView_Day_9_en","libraries.mediaviewer.impl.gallery_MediaGalleryView_Night_9_en",20392,], ["libraries.mediaviewer.impl.local.image_MediaImageView_Day_0_en","libraries.mediaviewer.impl.local.image_MediaImageView_Night_0_en",0,], ["libraries.mediaviewer.impl.local.player_MediaPlayerControllerView_Day_0_en","libraries.mediaviewer.impl.local.player_MediaPlayerControllerView_Night_0_en",0,], ["libraries.mediaviewer.impl.local.player_MediaPlayerControllerView_Day_1_en","libraries.mediaviewer.impl.local.player_MediaPlayerControllerView_Night_1_en",0,], @@ -610,14 +610,14 @@ export const screenshots = [ ["libraries.mediaviewer.impl.local.video_MediaVideoView_Day_0_en","libraries.mediaviewer.impl.local.video_MediaVideoView_Night_0_en",0,], ["libraries.mediaviewer.impl.viewer_MediaViewerView_0_en","",0,], ["libraries.mediaviewer.impl.viewer_MediaViewerView_10_en","",0,], -["libraries.mediaviewer.impl.viewer_MediaViewerView_11_en","",20385,], -["libraries.mediaviewer.impl.viewer_MediaViewerView_12_en","",20385,], +["libraries.mediaviewer.impl.viewer_MediaViewerView_11_en","",20392,], +["libraries.mediaviewer.impl.viewer_MediaViewerView_12_en","",20392,], ["libraries.mediaviewer.impl.viewer_MediaViewerView_13_en","",0,], -["libraries.mediaviewer.impl.viewer_MediaViewerView_14_en","",20385,], +["libraries.mediaviewer.impl.viewer_MediaViewerView_14_en","",20392,], ["libraries.mediaviewer.impl.viewer_MediaViewerView_15_en","",0,], ["libraries.mediaviewer.impl.viewer_MediaViewerView_16_en","",0,], ["libraries.mediaviewer.impl.viewer_MediaViewerView_1_en","",0,], -["libraries.mediaviewer.impl.viewer_MediaViewerView_2_en","",20385,], +["libraries.mediaviewer.impl.viewer_MediaViewerView_2_en","",20392,], ["libraries.mediaviewer.impl.viewer_MediaViewerView_3_en","",0,], ["libraries.mediaviewer.impl.viewer_MediaViewerView_4_en","",0,], ["libraries.mediaviewer.impl.viewer_MediaViewerView_5_en","",0,], @@ -631,7 +631,7 @@ export const screenshots = [ ["libraries.textcomposer.mentions_MentionSpanTheme_Day_0_en","libraries.textcomposer.mentions_MentionSpanTheme_Night_0_en",0,], ["libraries.designsystem.theme.components.previews_Menu_Menus_en","",0,], ["features.messages.impl.messagecomposer_MessageComposerViewVoice_Day_0_en","features.messages.impl.messagecomposer_MessageComposerViewVoice_Night_0_en",0,], -["features.messages.impl.messagecomposer_MessageComposerView_Day_0_en","features.messages.impl.messagecomposer_MessageComposerView_Night_0_en",20385,], +["features.messages.impl.messagecomposer_MessageComposerView_Day_0_en","features.messages.impl.messagecomposer_MessageComposerView_Night_0_en",20392,], ["features.messages.impl.timeline.components_MessageEventBubble_Day_0_en","features.messages.impl.timeline.components_MessageEventBubble_Night_0_en",0,], ["features.messages.impl.timeline.components_MessageEventBubble_Day_1_en","features.messages.impl.timeline.components_MessageEventBubble_Night_1_en",0,], ["features.messages.impl.timeline.components_MessageEventBubble_Day_2_en","features.messages.impl.timeline.components_MessageEventBubble_Night_2_en",0,], @@ -640,7 +640,7 @@ export const screenshots = [ ["features.messages.impl.timeline.components_MessageEventBubble_Day_5_en","features.messages.impl.timeline.components_MessageEventBubble_Night_5_en",0,], ["features.messages.impl.timeline.components_MessageEventBubble_Day_6_en","features.messages.impl.timeline.components_MessageEventBubble_Night_6_en",0,], ["features.messages.impl.timeline.components_MessageEventBubble_Day_7_en","features.messages.impl.timeline.components_MessageEventBubble_Night_7_en",0,], -["features.messages.impl.timeline.components_MessageShieldView_Day_0_en","features.messages.impl.timeline.components_MessageShieldView_Night_0_en",20385,], +["features.messages.impl.timeline.components_MessageShieldView_Day_0_en","features.messages.impl.timeline.components_MessageShieldView_Night_0_en",20392,], ["features.messages.impl.timeline.components_MessageStateEventContainer_Day_0_en","features.messages.impl.timeline.components_MessageStateEventContainer_Night_0_en",0,], ["features.messages.impl.timeline.components_MessagesReactionButtonAdd_Day_0_en","features.messages.impl.timeline.components_MessagesReactionButtonAdd_Night_0_en",0,], ["features.messages.impl.timeline.components_MessagesReactionButtonExtra_Day_0_en","features.messages.impl.timeline.components_MessagesReactionButtonExtra_Night_0_en",0,], @@ -648,137 +648,137 @@ export const screenshots = [ ["features.messages.impl.timeline.components_MessagesReactionButton_Day_1_en","features.messages.impl.timeline.components_MessagesReactionButton_Night_1_en",0,], ["features.messages.impl.timeline.components_MessagesReactionButton_Day_2_en","features.messages.impl.timeline.components_MessagesReactionButton_Night_2_en",0,], ["features.messages.impl.timeline.components_MessagesReactionButton_Day_3_en","features.messages.impl.timeline.components_MessagesReactionButton_Night_3_en",0,], -["features.messages.impl.topbars_MessagesViewTopBar_Day_0_en","features.messages.impl.topbars_MessagesViewTopBar_Night_0_en",20385,], -["features.messages.impl.crypto.identity_MessagesViewWithIdentityChange_Day_0_en","features.messages.impl.crypto.identity_MessagesViewWithIdentityChange_Night_0_en",20385,], -["features.messages.impl.crypto.identity_MessagesViewWithIdentityChange_Day_1_en","features.messages.impl.crypto.identity_MessagesViewWithIdentityChange_Night_1_en",20385,], -["features.messages.impl.crypto.identity_MessagesViewWithIdentityChange_Day_2_en","features.messages.impl.crypto.identity_MessagesViewWithIdentityChange_Night_2_en",20385,], -["features.messages.impl_MessagesView_Day_0_en","features.messages.impl_MessagesView_Night_0_en",20385,], -["features.messages.impl_MessagesView_Day_1_en","features.messages.impl_MessagesView_Night_1_en",20385,], -["features.messages.impl_MessagesView_Day_2_en","features.messages.impl_MessagesView_Night_2_en",20385,], -["features.messages.impl_MessagesView_Day_3_en","features.messages.impl_MessagesView_Night_3_en",20385,], -["features.messages.impl_MessagesView_Day_4_en","features.messages.impl_MessagesView_Night_4_en",20385,], -["features.messages.impl_MessagesView_Day_5_en","features.messages.impl_MessagesView_Night_5_en",20385,], -["features.messages.impl_MessagesView_Day_6_en","features.messages.impl_MessagesView_Night_6_en",20385,], -["features.messages.impl_MessagesView_Day_7_en","features.messages.impl_MessagesView_Night_7_en",20385,], -["features.messages.impl_MessagesView_Day_8_en","features.messages.impl_MessagesView_Night_8_en",20385,], -["features.messages.impl_MessagesView_Day_9_en","features.messages.impl_MessagesView_Night_9_en",20385,], +["features.messages.impl.topbars_MessagesViewTopBar_Day_0_en","features.messages.impl.topbars_MessagesViewTopBar_Night_0_en",20392,], +["features.messages.impl.crypto.identity_MessagesViewWithIdentityChange_Day_0_en","features.messages.impl.crypto.identity_MessagesViewWithIdentityChange_Night_0_en",20392,], +["features.messages.impl.crypto.identity_MessagesViewWithIdentityChange_Day_1_en","features.messages.impl.crypto.identity_MessagesViewWithIdentityChange_Night_1_en",20392,], +["features.messages.impl.crypto.identity_MessagesViewWithIdentityChange_Day_2_en","features.messages.impl.crypto.identity_MessagesViewWithIdentityChange_Night_2_en",20392,], +["features.messages.impl_MessagesView_Day_0_en","features.messages.impl_MessagesView_Night_0_en",20392,], +["features.messages.impl_MessagesView_Day_1_en","features.messages.impl_MessagesView_Night_1_en",20392,], +["features.messages.impl_MessagesView_Day_2_en","features.messages.impl_MessagesView_Night_2_en",20392,], +["features.messages.impl_MessagesView_Day_3_en","features.messages.impl_MessagesView_Night_3_en",20392,], +["features.messages.impl_MessagesView_Day_4_en","features.messages.impl_MessagesView_Night_4_en",20392,], +["features.messages.impl_MessagesView_Day_5_en","features.messages.impl_MessagesView_Night_5_en",20392,], +["features.messages.impl_MessagesView_Day_6_en","features.messages.impl_MessagesView_Night_6_en",20392,], +["features.messages.impl_MessagesView_Day_7_en","features.messages.impl_MessagesView_Night_7_en",20392,], +["features.messages.impl_MessagesView_Day_8_en","features.messages.impl_MessagesView_Night_8_en",20392,], +["features.messages.impl_MessagesView_Day_9_en","features.messages.impl_MessagesView_Night_9_en",20392,], ["features.migration.impl_MigrationView_Day_0_en","features.migration.impl_MigrationView_Night_0_en",0,], -["features.migration.impl_MigrationView_Day_1_en","features.migration.impl_MigrationView_Night_1_en",20385,], +["features.migration.impl_MigrationView_Day_1_en","features.migration.impl_MigrationView_Night_1_en",20392,], ["libraries.designsystem.theme.components_ModalBottomSheetDark_Bottom_Sheets_en","",0,], ["libraries.designsystem.theme.components_ModalBottomSheetLight_Bottom_Sheets_en","",0,], ["appicon.element_MonochromeIcon_en","",0,], -["features.preferences.impl.root_MultiAccountSection_Day_0_en","features.preferences.impl.root_MultiAccountSection_Night_0_en",20385,], +["features.preferences.impl.root_MultiAccountSection_Day_0_en","features.preferences.impl.root_MultiAccountSection_Night_0_en",20392,], ["libraries.designsystem.components.dialogs_MultipleSelectionDialogContent_Dialogs_en","",0,], ["libraries.designsystem.components.dialogs_MultipleSelectionDialog_Day_0_en","libraries.designsystem.components.dialogs_MultipleSelectionDialog_Night_0_en",0,], ["libraries.designsystem.components.list_MutipleSelectionListItemSelectedTrailingContent_Multiple_selection_List_item_-_selection_in_trailing_content_List_items_en","",0,], ["libraries.designsystem.components.list_MutipleSelectionListItemSelected_Multiple_selection_List_item_-_selection_in_supporting_text_List_items_en","",0,], ["libraries.designsystem.components.list_MutipleSelectionListItem_Multiple_selection_List_item_-_no_selection_List_items_en","",0,], ["libraries.designsystem.theme.components_NavigationBar_App_Bars_en","",0,], -["features.home.impl.components_NewNotificationSoundBanner_Day_0_en","features.home.impl.components_NewNotificationSoundBanner_Night_0_en",20385,], -["features.preferences.impl.notifications_NotificationSettingsView_Day_0_en","features.preferences.impl.notifications_NotificationSettingsView_Night_0_en",20385,], -["features.preferences.impl.notifications_NotificationSettingsView_Day_10_en","features.preferences.impl.notifications_NotificationSettingsView_Night_10_en",20385,], -["features.preferences.impl.notifications_NotificationSettingsView_Day_11_en","features.preferences.impl.notifications_NotificationSettingsView_Night_11_en",20385,], -["features.preferences.impl.notifications_NotificationSettingsView_Day_12_en","features.preferences.impl.notifications_NotificationSettingsView_Night_12_en",20385,], -["features.preferences.impl.notifications_NotificationSettingsView_Day_13_en","features.preferences.impl.notifications_NotificationSettingsView_Night_13_en",20385,], -["features.preferences.impl.notifications_NotificationSettingsView_Day_1_en","features.preferences.impl.notifications_NotificationSettingsView_Night_1_en",20385,], -["features.preferences.impl.notifications_NotificationSettingsView_Day_2_en","features.preferences.impl.notifications_NotificationSettingsView_Night_2_en",20385,], -["features.preferences.impl.notifications_NotificationSettingsView_Day_3_en","features.preferences.impl.notifications_NotificationSettingsView_Night_3_en",20385,], -["features.preferences.impl.notifications_NotificationSettingsView_Day_4_en","features.preferences.impl.notifications_NotificationSettingsView_Night_4_en",20385,], -["features.preferences.impl.notifications_NotificationSettingsView_Day_5_en","features.preferences.impl.notifications_NotificationSettingsView_Night_5_en",20385,], -["features.preferences.impl.notifications_NotificationSettingsView_Day_6_en","features.preferences.impl.notifications_NotificationSettingsView_Night_6_en",20385,], -["features.preferences.impl.notifications_NotificationSettingsView_Day_7_en","features.preferences.impl.notifications_NotificationSettingsView_Night_7_en",20385,], -["features.preferences.impl.notifications_NotificationSettingsView_Day_8_en","features.preferences.impl.notifications_NotificationSettingsView_Night_8_en",20385,], -["features.preferences.impl.notifications_NotificationSettingsView_Day_9_en","features.preferences.impl.notifications_NotificationSettingsView_Night_9_en",20385,], -["features.ftue.impl.notifications_NotificationsOptInView_Day_0_en","features.ftue.impl.notifications_NotificationsOptInView_Night_0_en",20385,], +["features.home.impl.components_NewNotificationSoundBanner_Day_0_en","features.home.impl.components_NewNotificationSoundBanner_Night_0_en",20392,], +["features.preferences.impl.notifications_NotificationSettingsView_Day_0_en","features.preferences.impl.notifications_NotificationSettingsView_Night_0_en",20392,], +["features.preferences.impl.notifications_NotificationSettingsView_Day_10_en","features.preferences.impl.notifications_NotificationSettingsView_Night_10_en",20392,], +["features.preferences.impl.notifications_NotificationSettingsView_Day_11_en","features.preferences.impl.notifications_NotificationSettingsView_Night_11_en",20392,], +["features.preferences.impl.notifications_NotificationSettingsView_Day_12_en","features.preferences.impl.notifications_NotificationSettingsView_Night_12_en",20392,], +["features.preferences.impl.notifications_NotificationSettingsView_Day_13_en","features.preferences.impl.notifications_NotificationSettingsView_Night_13_en",20392,], +["features.preferences.impl.notifications_NotificationSettingsView_Day_1_en","features.preferences.impl.notifications_NotificationSettingsView_Night_1_en",20392,], +["features.preferences.impl.notifications_NotificationSettingsView_Day_2_en","features.preferences.impl.notifications_NotificationSettingsView_Night_2_en",20392,], +["features.preferences.impl.notifications_NotificationSettingsView_Day_3_en","features.preferences.impl.notifications_NotificationSettingsView_Night_3_en",20392,], +["features.preferences.impl.notifications_NotificationSettingsView_Day_4_en","features.preferences.impl.notifications_NotificationSettingsView_Night_4_en",20392,], +["features.preferences.impl.notifications_NotificationSettingsView_Day_5_en","features.preferences.impl.notifications_NotificationSettingsView_Night_5_en",20392,], +["features.preferences.impl.notifications_NotificationSettingsView_Day_6_en","features.preferences.impl.notifications_NotificationSettingsView_Night_6_en",20392,], +["features.preferences.impl.notifications_NotificationSettingsView_Day_7_en","features.preferences.impl.notifications_NotificationSettingsView_Night_7_en",20392,], +["features.preferences.impl.notifications_NotificationSettingsView_Day_8_en","features.preferences.impl.notifications_NotificationSettingsView_Night_8_en",20392,], +["features.preferences.impl.notifications_NotificationSettingsView_Day_9_en","features.preferences.impl.notifications_NotificationSettingsView_Night_9_en",20392,], +["features.ftue.impl.notifications_NotificationsOptInView_Day_0_en","features.ftue.impl.notifications_NotificationsOptInView_Night_0_en",20392,], ["libraries.designsystem.atomic.pages_OnBoardingPage_Day_0_en","libraries.designsystem.atomic.pages_OnBoardingPage_Night_0_en",0,], -["features.login.impl.screens.onboarding_OnBoardingView_Day_0_en","features.login.impl.screens.onboarding_OnBoardingView_Night_0_en",20385,], -["features.login.impl.screens.onboarding_OnBoardingView_Day_1_en","features.login.impl.screens.onboarding_OnBoardingView_Night_1_en",20385,], -["features.login.impl.screens.onboarding_OnBoardingView_Day_2_en","features.login.impl.screens.onboarding_OnBoardingView_Night_2_en",20385,], -["features.login.impl.screens.onboarding_OnBoardingView_Day_3_en","features.login.impl.screens.onboarding_OnBoardingView_Night_3_en",20385,], -["features.login.impl.screens.onboarding_OnBoardingView_Day_4_en","features.login.impl.screens.onboarding_OnBoardingView_Night_4_en",20385,], -["features.login.impl.screens.onboarding_OnBoardingView_Day_5_en","features.login.impl.screens.onboarding_OnBoardingView_Night_5_en",20385,], -["features.login.impl.screens.onboarding_OnBoardingView_Day_6_en","features.login.impl.screens.onboarding_OnBoardingView_Night_6_en",20385,], -["features.login.impl.screens.onboarding_OnBoardingView_Day_7_en","features.login.impl.screens.onboarding_OnBoardingView_Night_7_en",20385,], +["features.login.impl.screens.onboarding_OnBoardingView_Day_0_en","features.login.impl.screens.onboarding_OnBoardingView_Night_0_en",20392,], +["features.login.impl.screens.onboarding_OnBoardingView_Day_1_en","features.login.impl.screens.onboarding_OnBoardingView_Night_1_en",20392,], +["features.login.impl.screens.onboarding_OnBoardingView_Day_2_en","features.login.impl.screens.onboarding_OnBoardingView_Night_2_en",20392,], +["features.login.impl.screens.onboarding_OnBoardingView_Day_3_en","features.login.impl.screens.onboarding_OnBoardingView_Night_3_en",20392,], +["features.login.impl.screens.onboarding_OnBoardingView_Day_4_en","features.login.impl.screens.onboarding_OnBoardingView_Night_4_en",20392,], +["features.login.impl.screens.onboarding_OnBoardingView_Day_5_en","features.login.impl.screens.onboarding_OnBoardingView_Night_5_en",20392,], +["features.login.impl.screens.onboarding_OnBoardingView_Day_6_en","features.login.impl.screens.onboarding_OnBoardingView_Night_6_en",20392,], +["features.login.impl.screens.onboarding_OnBoardingView_Day_7_en","features.login.impl.screens.onboarding_OnBoardingView_Night_7_en",20392,], ["libraries.designsystem.background_OnboardingBackground_Day_0_en","libraries.designsystem.background_OnboardingBackground_Night_0_en",0,], -["libraries.matrix.ui.components_OrganizationHeader_Day_0_en","libraries.matrix.ui.components_OrganizationHeader_Night_0_en",20385,], -["features.verifysession.impl.outgoing_OutgoingVerificationView_Day_0_en","features.verifysession.impl.outgoing_OutgoingVerificationView_Night_0_en",20385,], -["features.verifysession.impl.outgoing_OutgoingVerificationView_Day_10_en","features.verifysession.impl.outgoing_OutgoingVerificationView_Night_10_en",20385,], -["features.verifysession.impl.outgoing_OutgoingVerificationView_Day_11_en","features.verifysession.impl.outgoing_OutgoingVerificationView_Night_11_en",20385,], +["libraries.matrix.ui.components_OrganizationHeader_Day_0_en","libraries.matrix.ui.components_OrganizationHeader_Night_0_en",20392,], +["features.verifysession.impl.outgoing_OutgoingVerificationView_Day_0_en","features.verifysession.impl.outgoing_OutgoingVerificationView_Night_0_en",20392,], +["features.verifysession.impl.outgoing_OutgoingVerificationView_Day_10_en","features.verifysession.impl.outgoing_OutgoingVerificationView_Night_10_en",20392,], +["features.verifysession.impl.outgoing_OutgoingVerificationView_Day_11_en","features.verifysession.impl.outgoing_OutgoingVerificationView_Night_11_en",20392,], ["features.verifysession.impl.outgoing_OutgoingVerificationView_Day_12_en","features.verifysession.impl.outgoing_OutgoingVerificationView_Night_12_en",0,], ["features.verifysession.impl.outgoing_OutgoingVerificationView_Day_13_en","features.verifysession.impl.outgoing_OutgoingVerificationView_Night_13_en",0,], -["features.verifysession.impl.outgoing_OutgoingVerificationView_Day_1_en","features.verifysession.impl.outgoing_OutgoingVerificationView_Night_1_en",20385,], -["features.verifysession.impl.outgoing_OutgoingVerificationView_Day_2_en","features.verifysession.impl.outgoing_OutgoingVerificationView_Night_2_en",20385,], -["features.verifysession.impl.outgoing_OutgoingVerificationView_Day_3_en","features.verifysession.impl.outgoing_OutgoingVerificationView_Night_3_en",20385,], -["features.verifysession.impl.outgoing_OutgoingVerificationView_Day_4_en","features.verifysession.impl.outgoing_OutgoingVerificationView_Night_4_en",20385,], -["features.verifysession.impl.outgoing_OutgoingVerificationView_Day_5_en","features.verifysession.impl.outgoing_OutgoingVerificationView_Night_5_en",20385,], -["features.verifysession.impl.outgoing_OutgoingVerificationView_Day_6_en","features.verifysession.impl.outgoing_OutgoingVerificationView_Night_6_en",20385,], -["features.verifysession.impl.outgoing_OutgoingVerificationView_Day_7_en","features.verifysession.impl.outgoing_OutgoingVerificationView_Night_7_en",20385,], -["features.verifysession.impl.outgoing_OutgoingVerificationView_Day_8_en","features.verifysession.impl.outgoing_OutgoingVerificationView_Night_8_en",20385,], -["features.verifysession.impl.outgoing_OutgoingVerificationView_Day_9_en","features.verifysession.impl.outgoing_OutgoingVerificationView_Night_9_en",20385,], +["features.verifysession.impl.outgoing_OutgoingVerificationView_Day_1_en","features.verifysession.impl.outgoing_OutgoingVerificationView_Night_1_en",20392,], +["features.verifysession.impl.outgoing_OutgoingVerificationView_Day_2_en","features.verifysession.impl.outgoing_OutgoingVerificationView_Night_2_en",20392,], +["features.verifysession.impl.outgoing_OutgoingVerificationView_Day_3_en","features.verifysession.impl.outgoing_OutgoingVerificationView_Night_3_en",20392,], +["features.verifysession.impl.outgoing_OutgoingVerificationView_Day_4_en","features.verifysession.impl.outgoing_OutgoingVerificationView_Night_4_en",20392,], +["features.verifysession.impl.outgoing_OutgoingVerificationView_Day_5_en","features.verifysession.impl.outgoing_OutgoingVerificationView_Night_5_en",20392,], +["features.verifysession.impl.outgoing_OutgoingVerificationView_Day_6_en","features.verifysession.impl.outgoing_OutgoingVerificationView_Night_6_en",20392,], +["features.verifysession.impl.outgoing_OutgoingVerificationView_Day_7_en","features.verifysession.impl.outgoing_OutgoingVerificationView_Night_7_en",20392,], +["features.verifysession.impl.outgoing_OutgoingVerificationView_Day_8_en","features.verifysession.impl.outgoing_OutgoingVerificationView_Night_8_en",20392,], +["features.verifysession.impl.outgoing_OutgoingVerificationView_Day_9_en","features.verifysession.impl.outgoing_OutgoingVerificationView_Night_9_en",20392,], ["libraries.designsystem.theme.components_OutlinedButtonLargeLowPadding_Buttons_en","",0,], ["libraries.designsystem.theme.components_OutlinedButtonLarge_Buttons_en","",0,], ["libraries.designsystem.theme.components_OutlinedButtonMediumLowPadding_Buttons_en","",0,], ["libraries.designsystem.theme.components_OutlinedButtonMedium_Buttons_en","",0,], ["libraries.designsystem.theme.components_OutlinedButtonSmall_Buttons_en","",0,], -["libraries.mediaviewer.impl.local.pdf_PdfPagesErrorView_Day_0_en","libraries.mediaviewer.impl.local.pdf_PdfPagesErrorView_Night_0_en",20385,], -["features.changeroommemberroles.impl_PendingMemberRowWithLongName_Day_0_en","features.changeroommemberroles.impl_PendingMemberRowWithLongName_Night_0_en",20385,], -["libraries.permissions.api_PermissionsView_Day_0_en","libraries.permissions.api_PermissionsView_Night_0_en",20385,], -["libraries.permissions.api_PermissionsView_Day_1_en","libraries.permissions.api_PermissionsView_Night_1_en",20385,], -["libraries.permissions.api_PermissionsView_Day_2_en","libraries.permissions.api_PermissionsView_Night_2_en",20385,], -["libraries.permissions.api_PermissionsView_Day_3_en","libraries.permissions.api_PermissionsView_Night_3_en",20385,], +["libraries.mediaviewer.impl.local.pdf_PdfPagesErrorView_Day_0_en","libraries.mediaviewer.impl.local.pdf_PdfPagesErrorView_Night_0_en",20392,], +["features.changeroommemberroles.impl_PendingMemberRowWithLongName_Day_0_en","features.changeroommemberroles.impl_PendingMemberRowWithLongName_Night_0_en",20392,], +["libraries.permissions.api_PermissionsView_Day_0_en","libraries.permissions.api_PermissionsView_Night_0_en",20392,], +["libraries.permissions.api_PermissionsView_Day_1_en","libraries.permissions.api_PermissionsView_Night_1_en",20392,], +["libraries.permissions.api_PermissionsView_Day_2_en","libraries.permissions.api_PermissionsView_Night_2_en",20392,], +["libraries.permissions.api_PermissionsView_Day_3_en","libraries.permissions.api_PermissionsView_Night_3_en",20392,], ["features.lockscreen.impl.components_PinEntryTextField_Day_0_en","features.lockscreen.impl.components_PinEntryTextField_Night_0_en",0,], ["libraries.designsystem.components_PinIcon_Day_0_en","libraries.designsystem.components_PinIcon_Night_0_en",0,], ["features.lockscreen.impl.unlock.keypad_PinKeypad_Day_0_en","features.lockscreen.impl.unlock.keypad_PinKeypad_Night_0_en",0,], -["features.lockscreen.impl.unlock_PinUnlockViewInApp_Day_0_en","features.lockscreen.impl.unlock_PinUnlockViewInApp_Night_0_en",20385,], -["features.lockscreen.impl.unlock_PinUnlockViewInApp_Day_1_en","features.lockscreen.impl.unlock_PinUnlockViewInApp_Night_1_en",20385,], -["features.lockscreen.impl.unlock_PinUnlockViewInApp_Day_2_en","features.lockscreen.impl.unlock_PinUnlockViewInApp_Night_2_en",20385,], -["features.lockscreen.impl.unlock_PinUnlockViewInApp_Day_3_en","features.lockscreen.impl.unlock_PinUnlockViewInApp_Night_3_en",20385,], -["features.lockscreen.impl.unlock_PinUnlockViewInApp_Day_4_en","features.lockscreen.impl.unlock_PinUnlockViewInApp_Night_4_en",20385,], -["features.lockscreen.impl.unlock_PinUnlockViewInApp_Day_5_en","features.lockscreen.impl.unlock_PinUnlockViewInApp_Night_5_en",20385,], -["features.lockscreen.impl.unlock_PinUnlockViewInApp_Day_6_en","features.lockscreen.impl.unlock_PinUnlockViewInApp_Night_6_en",20385,], -["features.lockscreen.impl.unlock_PinUnlockViewInApp_Day_7_en","features.lockscreen.impl.unlock_PinUnlockViewInApp_Night_7_en",20385,], -["features.lockscreen.impl.unlock_PinUnlockView_Day_0_en","features.lockscreen.impl.unlock_PinUnlockView_Night_0_en",20385,], -["features.lockscreen.impl.unlock_PinUnlockView_Day_1_en","features.lockscreen.impl.unlock_PinUnlockView_Night_1_en",20385,], -["features.lockscreen.impl.unlock_PinUnlockView_Day_2_en","features.lockscreen.impl.unlock_PinUnlockView_Night_2_en",20385,], -["features.lockscreen.impl.unlock_PinUnlockView_Day_3_en","features.lockscreen.impl.unlock_PinUnlockView_Night_3_en",20385,], -["features.lockscreen.impl.unlock_PinUnlockView_Day_4_en","features.lockscreen.impl.unlock_PinUnlockView_Night_4_en",20385,], -["features.lockscreen.impl.unlock_PinUnlockView_Day_5_en","features.lockscreen.impl.unlock_PinUnlockView_Night_5_en",20385,], -["features.lockscreen.impl.unlock_PinUnlockView_Day_6_en","features.lockscreen.impl.unlock_PinUnlockView_Night_6_en",20385,], -["features.lockscreen.impl.unlock_PinUnlockView_Day_7_en","features.lockscreen.impl.unlock_PinUnlockView_Night_7_en",20385,], +["features.lockscreen.impl.unlock_PinUnlockViewInApp_Day_0_en","features.lockscreen.impl.unlock_PinUnlockViewInApp_Night_0_en",20392,], +["features.lockscreen.impl.unlock_PinUnlockViewInApp_Day_1_en","features.lockscreen.impl.unlock_PinUnlockViewInApp_Night_1_en",20392,], +["features.lockscreen.impl.unlock_PinUnlockViewInApp_Day_2_en","features.lockscreen.impl.unlock_PinUnlockViewInApp_Night_2_en",20392,], +["features.lockscreen.impl.unlock_PinUnlockViewInApp_Day_3_en","features.lockscreen.impl.unlock_PinUnlockViewInApp_Night_3_en",20392,], +["features.lockscreen.impl.unlock_PinUnlockViewInApp_Day_4_en","features.lockscreen.impl.unlock_PinUnlockViewInApp_Night_4_en",20392,], +["features.lockscreen.impl.unlock_PinUnlockViewInApp_Day_5_en","features.lockscreen.impl.unlock_PinUnlockViewInApp_Night_5_en",20392,], +["features.lockscreen.impl.unlock_PinUnlockViewInApp_Day_6_en","features.lockscreen.impl.unlock_PinUnlockViewInApp_Night_6_en",20392,], +["features.lockscreen.impl.unlock_PinUnlockViewInApp_Day_7_en","features.lockscreen.impl.unlock_PinUnlockViewInApp_Night_7_en",20392,], +["features.lockscreen.impl.unlock_PinUnlockView_Day_0_en","features.lockscreen.impl.unlock_PinUnlockView_Night_0_en",20392,], +["features.lockscreen.impl.unlock_PinUnlockView_Day_1_en","features.lockscreen.impl.unlock_PinUnlockView_Night_1_en",20392,], +["features.lockscreen.impl.unlock_PinUnlockView_Day_2_en","features.lockscreen.impl.unlock_PinUnlockView_Night_2_en",20392,], +["features.lockscreen.impl.unlock_PinUnlockView_Day_3_en","features.lockscreen.impl.unlock_PinUnlockView_Night_3_en",20392,], +["features.lockscreen.impl.unlock_PinUnlockView_Day_4_en","features.lockscreen.impl.unlock_PinUnlockView_Night_4_en",20392,], +["features.lockscreen.impl.unlock_PinUnlockView_Day_5_en","features.lockscreen.impl.unlock_PinUnlockView_Night_5_en",20392,], +["features.lockscreen.impl.unlock_PinUnlockView_Day_6_en","features.lockscreen.impl.unlock_PinUnlockView_Night_6_en",20392,], +["features.lockscreen.impl.unlock_PinUnlockView_Day_7_en","features.lockscreen.impl.unlock_PinUnlockView_Night_7_en",20392,], ["features.messages.impl.pinned.banner_PinnedMessagesBannerView_Day_0_en","features.messages.impl.pinned.banner_PinnedMessagesBannerView_Night_0_en",0,], -["features.messages.impl.pinned.banner_PinnedMessagesBannerView_Day_10_en","features.messages.impl.pinned.banner_PinnedMessagesBannerView_Night_10_en",20385,], -["features.messages.impl.pinned.banner_PinnedMessagesBannerView_Day_1_en","features.messages.impl.pinned.banner_PinnedMessagesBannerView_Night_1_en",20385,], -["features.messages.impl.pinned.banner_PinnedMessagesBannerView_Day_2_en","features.messages.impl.pinned.banner_PinnedMessagesBannerView_Night_2_en",20385,], -["features.messages.impl.pinned.banner_PinnedMessagesBannerView_Day_3_en","features.messages.impl.pinned.banner_PinnedMessagesBannerView_Night_3_en",20385,], -["features.messages.impl.pinned.banner_PinnedMessagesBannerView_Day_4_en","features.messages.impl.pinned.banner_PinnedMessagesBannerView_Night_4_en",20385,], -["features.messages.impl.pinned.banner_PinnedMessagesBannerView_Day_5_en","features.messages.impl.pinned.banner_PinnedMessagesBannerView_Night_5_en",20385,], -["features.messages.impl.pinned.banner_PinnedMessagesBannerView_Day_6_en","features.messages.impl.pinned.banner_PinnedMessagesBannerView_Night_6_en",20385,], -["features.messages.impl.pinned.banner_PinnedMessagesBannerView_Day_7_en","features.messages.impl.pinned.banner_PinnedMessagesBannerView_Night_7_en",20385,], -["features.messages.impl.pinned.banner_PinnedMessagesBannerView_Day_8_en","features.messages.impl.pinned.banner_PinnedMessagesBannerView_Night_8_en",20385,], -["features.messages.impl.pinned.banner_PinnedMessagesBannerView_Day_9_en","features.messages.impl.pinned.banner_PinnedMessagesBannerView_Night_9_en",20385,], -["features.messages.impl.pinned.list_PinnedMessagesListView_Day_0_en","features.messages.impl.pinned.list_PinnedMessagesListView_Night_0_en",20385,], -["features.messages.impl.pinned.list_PinnedMessagesListView_Day_1_en","features.messages.impl.pinned.list_PinnedMessagesListView_Night_1_en",20385,], -["features.messages.impl.pinned.list_PinnedMessagesListView_Day_2_en","features.messages.impl.pinned.list_PinnedMessagesListView_Night_2_en",20385,], -["features.messages.impl.pinned.list_PinnedMessagesListView_Day_3_en","features.messages.impl.pinned.list_PinnedMessagesListView_Night_3_en",20385,], +["features.messages.impl.pinned.banner_PinnedMessagesBannerView_Day_10_en","features.messages.impl.pinned.banner_PinnedMessagesBannerView_Night_10_en",20392,], +["features.messages.impl.pinned.banner_PinnedMessagesBannerView_Day_1_en","features.messages.impl.pinned.banner_PinnedMessagesBannerView_Night_1_en",20392,], +["features.messages.impl.pinned.banner_PinnedMessagesBannerView_Day_2_en","features.messages.impl.pinned.banner_PinnedMessagesBannerView_Night_2_en",20392,], +["features.messages.impl.pinned.banner_PinnedMessagesBannerView_Day_3_en","features.messages.impl.pinned.banner_PinnedMessagesBannerView_Night_3_en",20392,], +["features.messages.impl.pinned.banner_PinnedMessagesBannerView_Day_4_en","features.messages.impl.pinned.banner_PinnedMessagesBannerView_Night_4_en",20392,], +["features.messages.impl.pinned.banner_PinnedMessagesBannerView_Day_5_en","features.messages.impl.pinned.banner_PinnedMessagesBannerView_Night_5_en",20392,], +["features.messages.impl.pinned.banner_PinnedMessagesBannerView_Day_6_en","features.messages.impl.pinned.banner_PinnedMessagesBannerView_Night_6_en",20392,], +["features.messages.impl.pinned.banner_PinnedMessagesBannerView_Day_7_en","features.messages.impl.pinned.banner_PinnedMessagesBannerView_Night_7_en",20392,], +["features.messages.impl.pinned.banner_PinnedMessagesBannerView_Day_8_en","features.messages.impl.pinned.banner_PinnedMessagesBannerView_Night_8_en",20392,], +["features.messages.impl.pinned.banner_PinnedMessagesBannerView_Day_9_en","features.messages.impl.pinned.banner_PinnedMessagesBannerView_Night_9_en",20392,], +["features.messages.impl.pinned.list_PinnedMessagesListView_Day_0_en","features.messages.impl.pinned.list_PinnedMessagesListView_Night_0_en",20392,], +["features.messages.impl.pinned.list_PinnedMessagesListView_Day_1_en","features.messages.impl.pinned.list_PinnedMessagesListView_Night_1_en",20392,], +["features.messages.impl.pinned.list_PinnedMessagesListView_Day_2_en","features.messages.impl.pinned.list_PinnedMessagesListView_Night_2_en",20392,], +["features.messages.impl.pinned.list_PinnedMessagesListView_Day_3_en","features.messages.impl.pinned.list_PinnedMessagesListView_Night_3_en",20392,], ["libraries.designsystem.atomic.atoms_PlaceholderAtom_Day_0_en","libraries.designsystem.atomic.atoms_PlaceholderAtom_Night_0_en",0,], -["features.poll.api.pollcontent_PollAnswerViewDisclosedNotSelected_Day_0_en","features.poll.api.pollcontent_PollAnswerViewDisclosedNotSelected_Night_0_en",20385,], -["features.poll.api.pollcontent_PollAnswerViewDisclosedSelected_Day_0_en","features.poll.api.pollcontent_PollAnswerViewDisclosedSelected_Night_0_en",20385,], -["features.poll.api.pollcontent_PollAnswerViewEndedSelected_Day_0_en","features.poll.api.pollcontent_PollAnswerViewEndedSelected_Night_0_en",20385,], -["features.poll.api.pollcontent_PollAnswerViewEndedWinnerNotSelected_Day_0_en","features.poll.api.pollcontent_PollAnswerViewEndedWinnerNotSelected_Night_0_en",20385,], -["features.poll.api.pollcontent_PollAnswerViewEndedWinnerSelected_Day_0_en","features.poll.api.pollcontent_PollAnswerViewEndedWinnerSelected_Night_0_en",20385,], +["features.poll.api.pollcontent_PollAnswerViewDisclosedNotSelected_Day_0_en","features.poll.api.pollcontent_PollAnswerViewDisclosedNotSelected_Night_0_en",20392,], +["features.poll.api.pollcontent_PollAnswerViewDisclosedSelected_Day_0_en","features.poll.api.pollcontent_PollAnswerViewDisclosedSelected_Night_0_en",20392,], +["features.poll.api.pollcontent_PollAnswerViewEndedSelected_Day_0_en","features.poll.api.pollcontent_PollAnswerViewEndedSelected_Night_0_en",20392,], +["features.poll.api.pollcontent_PollAnswerViewEndedWinnerNotSelected_Day_0_en","features.poll.api.pollcontent_PollAnswerViewEndedWinnerNotSelected_Night_0_en",20392,], +["features.poll.api.pollcontent_PollAnswerViewEndedWinnerSelected_Day_0_en","features.poll.api.pollcontent_PollAnswerViewEndedWinnerSelected_Night_0_en",20392,], ["features.poll.api.pollcontent_PollAnswerViewUndisclosedNotSelected_Day_0_en","features.poll.api.pollcontent_PollAnswerViewUndisclosedNotSelected_Night_0_en",0,], ["features.poll.api.pollcontent_PollAnswerViewUndisclosedSelected_Day_0_en","features.poll.api.pollcontent_PollAnswerViewUndisclosedSelected_Night_0_en",0,], -["features.poll.api.pollcontent_PollContentViewCreatorEditable_Day_0_en","features.poll.api.pollcontent_PollContentViewCreatorEditable_Night_0_en",20385,], -["features.poll.api.pollcontent_PollContentViewCreatorEnded_Day_0_en","features.poll.api.pollcontent_PollContentViewCreatorEnded_Night_0_en",20385,], -["features.poll.api.pollcontent_PollContentViewCreator_Day_0_en","features.poll.api.pollcontent_PollContentViewCreator_Night_0_en",20385,], -["features.poll.api.pollcontent_PollContentViewDisclosed_Day_0_en","features.poll.api.pollcontent_PollContentViewDisclosed_Night_0_en",20385,], -["features.poll.api.pollcontent_PollContentViewEnded_Day_0_en","features.poll.api.pollcontent_PollContentViewEnded_Night_0_en",20385,], -["features.poll.api.pollcontent_PollContentViewUndisclosed_Day_0_en","features.poll.api.pollcontent_PollContentViewUndisclosed_Night_0_en",20385,], -["features.poll.impl.history_PollHistoryView_Day_0_en","features.poll.impl.history_PollHistoryView_Night_0_en",20385,], -["features.poll.impl.history_PollHistoryView_Day_1_en","features.poll.impl.history_PollHistoryView_Night_1_en",20385,], -["features.poll.impl.history_PollHistoryView_Day_2_en","features.poll.impl.history_PollHistoryView_Night_2_en",20385,], -["features.poll.impl.history_PollHistoryView_Day_3_en","features.poll.impl.history_PollHistoryView_Night_3_en",20385,], -["features.poll.impl.history_PollHistoryView_Day_4_en","features.poll.impl.history_PollHistoryView_Night_4_en",20385,], +["features.poll.api.pollcontent_PollContentViewCreatorEditable_Day_0_en","features.poll.api.pollcontent_PollContentViewCreatorEditable_Night_0_en",20392,], +["features.poll.api.pollcontent_PollContentViewCreatorEnded_Day_0_en","features.poll.api.pollcontent_PollContentViewCreatorEnded_Night_0_en",20392,], +["features.poll.api.pollcontent_PollContentViewCreator_Day_0_en","features.poll.api.pollcontent_PollContentViewCreator_Night_0_en",20392,], +["features.poll.api.pollcontent_PollContentViewDisclosed_Day_0_en","features.poll.api.pollcontent_PollContentViewDisclosed_Night_0_en",20392,], +["features.poll.api.pollcontent_PollContentViewEnded_Day_0_en","features.poll.api.pollcontent_PollContentViewEnded_Night_0_en",20392,], +["features.poll.api.pollcontent_PollContentViewUndisclosed_Day_0_en","features.poll.api.pollcontent_PollContentViewUndisclosed_Night_0_en",20392,], +["features.poll.impl.history_PollHistoryView_Day_0_en","features.poll.impl.history_PollHistoryView_Night_0_en",20392,], +["features.poll.impl.history_PollHistoryView_Day_1_en","features.poll.impl.history_PollHistoryView_Night_1_en",20392,], +["features.poll.impl.history_PollHistoryView_Day_2_en","features.poll.impl.history_PollHistoryView_Night_2_en",20392,], +["features.poll.impl.history_PollHistoryView_Day_3_en","features.poll.impl.history_PollHistoryView_Night_3_en",20392,], +["features.poll.impl.history_PollHistoryView_Day_4_en","features.poll.impl.history_PollHistoryView_Night_4_en",20392,], ["features.poll.api.pollcontent_PollTitleView_Day_0_en","features.poll.api.pollcontent_PollTitleView_Night_0_en",0,], ["libraries.designsystem.components.preferences_PreferenceCategory_Preferences_en","",0,], ["libraries.designsystem.components.preferences_PreferenceCheckbox_Preferences_en","",0,], @@ -792,208 +792,209 @@ export const screenshots = [ ["libraries.designsystem.components.preferences_PreferenceRow_Preferences_en","",0,], ["libraries.designsystem.components.preferences_PreferenceSlide_Preferences_en","",0,], ["libraries.designsystem.components.preferences_PreferenceSwitch_Preferences_en","",0,], -["features.preferences.impl.root_PreferencesRootViewDark_0_en","",20385,], -["features.preferences.impl.root_PreferencesRootViewDark_1_en","",20385,], -["features.preferences.impl.root_PreferencesRootViewLight_0_en","",20385,], -["features.preferences.impl.root_PreferencesRootViewLight_1_en","",20385,], +["features.preferences.impl.root_PreferencesRootViewDark_0_en","",20392,], +["features.preferences.impl.root_PreferencesRootViewDark_1_en","",20392,], +["features.preferences.impl.root_PreferencesRootViewLight_0_en","",20392,], +["features.preferences.impl.root_PreferencesRootViewLight_1_en","",20392,], ["features.messages.impl.timeline.components.event_ProgressButton_Day_0_en","features.messages.impl.timeline.components.event_ProgressButton_Night_0_en",0,], -["libraries.designsystem.components_ProgressDialogContent_Dialogs_en","",20385,], -["libraries.designsystem.components_ProgressDialogWithContent_Day_0_en","libraries.designsystem.components_ProgressDialogWithContent_Night_0_en",20385,], +["libraries.designsystem.components_ProgressDialogContent_Dialogs_en","",20392,], +["libraries.designsystem.components_ProgressDialogWithContent_Day_0_en","libraries.designsystem.components_ProgressDialogWithContent_Night_0_en",20392,], ["libraries.designsystem.components_ProgressDialogWithTextAndContent_Day_0_en","libraries.designsystem.components_ProgressDialogWithTextAndContent_Night_0_en",0,], -["libraries.designsystem.components_ProgressDialog_Day_0_en","libraries.designsystem.components_ProgressDialog_Night_0_en",20385,], -["features.messages.impl.timeline.protection_ProtectedView_Day_0_en","features.messages.impl.timeline.protection_ProtectedView_Night_0_en",20385,], -["features.messages.impl.timeline.protection_ProtectedView_Day_1_en","features.messages.impl.timeline.protection_ProtectedView_Night_1_en",20385,], -["features.messages.impl.timeline.protection_ProtectedView_Day_2_en","features.messages.impl.timeline.protection_ProtectedView_Night_2_en",20385,], -["features.messages.impl.timeline.protection_ProtectedView_Day_3_en","features.messages.impl.timeline.protection_ProtectedView_Night_3_en",20385,], -["libraries.troubleshoot.impl.history_PushHistoryView_Day_0_en","libraries.troubleshoot.impl.history_PushHistoryView_Night_0_en",20385,], -["libraries.troubleshoot.impl.history_PushHistoryView_Day_1_en","libraries.troubleshoot.impl.history_PushHistoryView_Night_1_en",20385,], -["libraries.troubleshoot.impl.history_PushHistoryView_Day_2_en","libraries.troubleshoot.impl.history_PushHistoryView_Night_2_en",20385,], -["libraries.troubleshoot.impl.history_PushHistoryView_Day_3_en","libraries.troubleshoot.impl.history_PushHistoryView_Night_3_en",20385,], -["features.login.impl.screens.qrcode.confirmation_QrCodeConfirmationView_Day_0_en","features.login.impl.screens.qrcode.confirmation_QrCodeConfirmationView_Night_0_en",20385,], -["features.login.impl.screens.qrcode.confirmation_QrCodeConfirmationView_Day_1_en","features.login.impl.screens.qrcode.confirmation_QrCodeConfirmationView_Night_1_en",20385,], -["features.login.impl.screens.qrcode.confirmation_QrCodeConfirmationView_Day_2_en","features.login.impl.screens.qrcode.confirmation_QrCodeConfirmationView_Night_2_en",20385,], -["features.login.impl.screens.qrcode.error_QrCodeErrorView_Day_0_en","features.login.impl.screens.qrcode.error_QrCodeErrorView_Night_0_en",20385,], -["features.login.impl.screens.qrcode.error_QrCodeErrorView_Day_1_en","features.login.impl.screens.qrcode.error_QrCodeErrorView_Night_1_en",20385,], -["features.login.impl.screens.qrcode.error_QrCodeErrorView_Day_2_en","features.login.impl.screens.qrcode.error_QrCodeErrorView_Night_2_en",20385,], -["features.login.impl.screens.qrcode.error_QrCodeErrorView_Day_3_en","features.login.impl.screens.qrcode.error_QrCodeErrorView_Night_3_en",20385,], -["features.login.impl.screens.qrcode.error_QrCodeErrorView_Day_4_en","features.login.impl.screens.qrcode.error_QrCodeErrorView_Night_4_en",20385,], -["features.login.impl.screens.qrcode.error_QrCodeErrorView_Day_5_en","features.login.impl.screens.qrcode.error_QrCodeErrorView_Night_5_en",20385,], -["features.login.impl.screens.qrcode.error_QrCodeErrorView_Day_6_en","features.login.impl.screens.qrcode.error_QrCodeErrorView_Night_6_en",20385,], -["features.login.impl.screens.qrcode.intro_QrCodeIntroView_Day_0_en","features.login.impl.screens.qrcode.intro_QrCodeIntroView_Night_0_en",20385,], -["features.login.impl.screens.qrcode.intro_QrCodeIntroView_Day_1_en","features.login.impl.screens.qrcode.intro_QrCodeIntroView_Night_1_en",20385,], -["features.login.impl.screens.qrcode.scan_QrCodeScanView_Day_0_en","features.login.impl.screens.qrcode.scan_QrCodeScanView_Night_0_en",20385,], -["features.login.impl.screens.qrcode.scan_QrCodeScanView_Day_1_en","features.login.impl.screens.qrcode.scan_QrCodeScanView_Night_1_en",20385,], -["features.login.impl.screens.qrcode.scan_QrCodeScanView_Day_2_en","features.login.impl.screens.qrcode.scan_QrCodeScanView_Night_2_en",20385,], -["features.login.impl.screens.qrcode.scan_QrCodeScanView_Day_3_en","features.login.impl.screens.qrcode.scan_QrCodeScanView_Night_3_en",20385,], -["features.login.impl.screens.qrcode.scan_QrCodeScanView_Day_4_en","features.login.impl.screens.qrcode.scan_QrCodeScanView_Night_4_en",20385,], -["features.login.impl.screens.qrcode.scan_QrCodeScanView_Day_5_en","features.login.impl.screens.qrcode.scan_QrCodeScanView_Night_5_en",20385,], +["libraries.designsystem.components_ProgressDialog_Day_0_en","libraries.designsystem.components_ProgressDialog_Night_0_en",20392,], +["features.messages.impl.timeline.protection_ProtectedView_Day_0_en","features.messages.impl.timeline.protection_ProtectedView_Night_0_en",20392,], +["features.messages.impl.timeline.protection_ProtectedView_Day_1_en","features.messages.impl.timeline.protection_ProtectedView_Night_1_en",20392,], +["features.messages.impl.timeline.protection_ProtectedView_Day_2_en","features.messages.impl.timeline.protection_ProtectedView_Night_2_en",20392,], +["features.messages.impl.timeline.protection_ProtectedView_Day_3_en","features.messages.impl.timeline.protection_ProtectedView_Night_3_en",20392,], +["libraries.troubleshoot.impl.history_PushHistoryView_Day_0_en","libraries.troubleshoot.impl.history_PushHistoryView_Night_0_en",20392,], +["libraries.troubleshoot.impl.history_PushHistoryView_Day_1_en","libraries.troubleshoot.impl.history_PushHistoryView_Night_1_en",20392,], +["libraries.troubleshoot.impl.history_PushHistoryView_Day_2_en","libraries.troubleshoot.impl.history_PushHistoryView_Night_2_en",20392,], +["libraries.troubleshoot.impl.history_PushHistoryView_Day_3_en","libraries.troubleshoot.impl.history_PushHistoryView_Night_3_en",20392,], +["features.login.impl.screens.qrcode.confirmation_QrCodeConfirmationView_Day_0_en","features.login.impl.screens.qrcode.confirmation_QrCodeConfirmationView_Night_0_en",20392,], +["features.login.impl.screens.qrcode.confirmation_QrCodeConfirmationView_Day_1_en","features.login.impl.screens.qrcode.confirmation_QrCodeConfirmationView_Night_1_en",20392,], +["features.login.impl.screens.qrcode.confirmation_QrCodeConfirmationView_Day_2_en","features.login.impl.screens.qrcode.confirmation_QrCodeConfirmationView_Night_2_en",20392,], +["features.login.impl.screens.qrcode.error_QrCodeErrorView_Day_0_en","features.login.impl.screens.qrcode.error_QrCodeErrorView_Night_0_en",20392,], +["features.login.impl.screens.qrcode.error_QrCodeErrorView_Day_1_en","features.login.impl.screens.qrcode.error_QrCodeErrorView_Night_1_en",20392,], +["features.login.impl.screens.qrcode.error_QrCodeErrorView_Day_2_en","features.login.impl.screens.qrcode.error_QrCodeErrorView_Night_2_en",20392,], +["features.login.impl.screens.qrcode.error_QrCodeErrorView_Day_3_en","features.login.impl.screens.qrcode.error_QrCodeErrorView_Night_3_en",20392,], +["features.login.impl.screens.qrcode.error_QrCodeErrorView_Day_4_en","features.login.impl.screens.qrcode.error_QrCodeErrorView_Night_4_en",20392,], +["features.login.impl.screens.qrcode.error_QrCodeErrorView_Day_5_en","features.login.impl.screens.qrcode.error_QrCodeErrorView_Night_5_en",20392,], +["features.login.impl.screens.qrcode.error_QrCodeErrorView_Day_6_en","features.login.impl.screens.qrcode.error_QrCodeErrorView_Night_6_en",20392,], +["features.login.impl.screens.qrcode.intro_QrCodeIntroView_Day_0_en","features.login.impl.screens.qrcode.intro_QrCodeIntroView_Night_0_en",20392,], +["features.login.impl.screens.qrcode.intro_QrCodeIntroView_Day_1_en","features.login.impl.screens.qrcode.intro_QrCodeIntroView_Night_1_en",20392,], +["features.login.impl.screens.qrcode.scan_QrCodeScanView_Day_0_en","features.login.impl.screens.qrcode.scan_QrCodeScanView_Night_0_en",20392,], +["features.login.impl.screens.qrcode.scan_QrCodeScanView_Day_1_en","features.login.impl.screens.qrcode.scan_QrCodeScanView_Night_1_en",20392,], +["features.login.impl.screens.qrcode.scan_QrCodeScanView_Day_2_en","features.login.impl.screens.qrcode.scan_QrCodeScanView_Night_2_en",20392,], +["features.login.impl.screens.qrcode.scan_QrCodeScanView_Day_3_en","features.login.impl.screens.qrcode.scan_QrCodeScanView_Night_3_en",20392,], +["features.login.impl.screens.qrcode.scan_QrCodeScanView_Day_4_en","features.login.impl.screens.qrcode.scan_QrCodeScanView_Night_4_en",20392,], +["features.login.impl.screens.qrcode.scan_QrCodeScanView_Day_5_en","features.login.impl.screens.qrcode.scan_QrCodeScanView_Night_5_en",20392,], ["libraries.designsystem.theme.components_RadioButton_Toggles_en","",0,], -["features.rageshake.api.detection_RageshakeDialogContent_Day_0_en","features.rageshake.api.detection_RageshakeDialogContent_Night_0_en",20385,], -["features.rageshake.api.preferences_RageshakePreferencesView_Day_0_en","features.rageshake.api.preferences_RageshakePreferencesView_Night_0_en",20385,], +["features.rageshake.api.detection_RageshakeDialogContent_Day_0_en","features.rageshake.api.detection_RageshakeDialogContent_Night_0_en",20392,], +["features.rageshake.api.preferences_RageshakePreferencesView_Day_0_en","features.rageshake.api.preferences_RageshakePreferencesView_Night_0_en",20392,], ["features.rageshake.api.preferences_RageshakePreferencesView_Day_1_en","features.rageshake.api.preferences_RageshakePreferencesView_Night_1_en",0,], ["features.messages.impl.timeline.components.reactionsummary_ReactionSummaryViewContent_Day_0_en","features.messages.impl.timeline.components.reactionsummary_ReactionSummaryViewContent_Night_0_en",0,], -["features.messages.impl.timeline.components.receipt.bottomsheet_ReadReceiptBottomSheet_Day_0_en","features.messages.impl.timeline.components.receipt.bottomsheet_ReadReceiptBottomSheet_Night_0_en",20385,], -["features.messages.impl.timeline.components.receipt.bottomsheet_ReadReceiptBottomSheet_Day_1_en","features.messages.impl.timeline.components.receipt.bottomsheet_ReadReceiptBottomSheet_Night_1_en",20385,], -["features.messages.impl.timeline.components.receipt.bottomsheet_ReadReceiptBottomSheet_Day_2_en","features.messages.impl.timeline.components.receipt.bottomsheet_ReadReceiptBottomSheet_Night_2_en",20385,], -["features.messages.impl.timeline.components.receipt.bottomsheet_ReadReceiptBottomSheet_Day_3_en","features.messages.impl.timeline.components.receipt.bottomsheet_ReadReceiptBottomSheet_Night_3_en",20385,], -["features.messages.impl.timeline.components.receipt.bottomsheet_ReadReceiptBottomSheet_Day_4_en","features.messages.impl.timeline.components.receipt.bottomsheet_ReadReceiptBottomSheet_Night_4_en",20385,], -["features.messages.impl.timeline.components.receipt.bottomsheet_ReadReceiptBottomSheet_Day_5_en","features.messages.impl.timeline.components.receipt.bottomsheet_ReadReceiptBottomSheet_Night_5_en",20385,], -["features.securebackup.impl.setup.views_RecoveryKeyView_Day_0_en","features.securebackup.impl.setup.views_RecoveryKeyView_Night_0_en",20385,], -["features.securebackup.impl.setup.views_RecoveryKeyView_Day_10_en","features.securebackup.impl.setup.views_RecoveryKeyView_Night_10_en",20385,], -["features.securebackup.impl.setup.views_RecoveryKeyView_Day_11_en","features.securebackup.impl.setup.views_RecoveryKeyView_Night_11_en",20385,], -["features.securebackup.impl.setup.views_RecoveryKeyView_Day_12_en","features.securebackup.impl.setup.views_RecoveryKeyView_Night_12_en",20385,], -["features.securebackup.impl.setup.views_RecoveryKeyView_Day_13_en","features.securebackup.impl.setup.views_RecoveryKeyView_Night_13_en",20385,], -["features.securebackup.impl.setup.views_RecoveryKeyView_Day_14_en","features.securebackup.impl.setup.views_RecoveryKeyView_Night_14_en",20385,], -["features.securebackup.impl.setup.views_RecoveryKeyView_Day_1_en","features.securebackup.impl.setup.views_RecoveryKeyView_Night_1_en",20385,], -["features.securebackup.impl.setup.views_RecoveryKeyView_Day_2_en","features.securebackup.impl.setup.views_RecoveryKeyView_Night_2_en",20385,], -["features.securebackup.impl.setup.views_RecoveryKeyView_Day_3_en","features.securebackup.impl.setup.views_RecoveryKeyView_Night_3_en",20385,], -["features.securebackup.impl.setup.views_RecoveryKeyView_Day_4_en","features.securebackup.impl.setup.views_RecoveryKeyView_Night_4_en",20385,], -["features.securebackup.impl.setup.views_RecoveryKeyView_Day_5_en","features.securebackup.impl.setup.views_RecoveryKeyView_Night_5_en",20385,], -["features.securebackup.impl.setup.views_RecoveryKeyView_Day_6_en","features.securebackup.impl.setup.views_RecoveryKeyView_Night_6_en",20385,], -["features.securebackup.impl.setup.views_RecoveryKeyView_Day_7_en","features.securebackup.impl.setup.views_RecoveryKeyView_Night_7_en",20385,], -["features.securebackup.impl.setup.views_RecoveryKeyView_Day_8_en","features.securebackup.impl.setup.views_RecoveryKeyView_Night_8_en",20385,], -["features.securebackup.impl.setup.views_RecoveryKeyView_Day_9_en","features.securebackup.impl.setup.views_RecoveryKeyView_Night_9_en",20385,], +["features.messages.impl.timeline.components.receipt.bottomsheet_ReadReceiptBottomSheet_Day_0_en","features.messages.impl.timeline.components.receipt.bottomsheet_ReadReceiptBottomSheet_Night_0_en",20392,], +["features.messages.impl.timeline.components.receipt.bottomsheet_ReadReceiptBottomSheet_Day_1_en","features.messages.impl.timeline.components.receipt.bottomsheet_ReadReceiptBottomSheet_Night_1_en",20392,], +["features.messages.impl.timeline.components.receipt.bottomsheet_ReadReceiptBottomSheet_Day_2_en","features.messages.impl.timeline.components.receipt.bottomsheet_ReadReceiptBottomSheet_Night_2_en",20392,], +["features.messages.impl.timeline.components.receipt.bottomsheet_ReadReceiptBottomSheet_Day_3_en","features.messages.impl.timeline.components.receipt.bottomsheet_ReadReceiptBottomSheet_Night_3_en",20392,], +["features.messages.impl.timeline.components.receipt.bottomsheet_ReadReceiptBottomSheet_Day_4_en","features.messages.impl.timeline.components.receipt.bottomsheet_ReadReceiptBottomSheet_Night_4_en",20392,], +["features.messages.impl.timeline.components.receipt.bottomsheet_ReadReceiptBottomSheet_Day_5_en","features.messages.impl.timeline.components.receipt.bottomsheet_ReadReceiptBottomSheet_Night_5_en",20392,], +["features.securebackup.impl.setup.views_RecoveryKeyView_Day_0_en","features.securebackup.impl.setup.views_RecoveryKeyView_Night_0_en",20392,], +["features.securebackup.impl.setup.views_RecoveryKeyView_Day_10_en","features.securebackup.impl.setup.views_RecoveryKeyView_Night_10_en",20392,], +["features.securebackup.impl.setup.views_RecoveryKeyView_Day_11_en","features.securebackup.impl.setup.views_RecoveryKeyView_Night_11_en",20392,], +["features.securebackup.impl.setup.views_RecoveryKeyView_Day_12_en","features.securebackup.impl.setup.views_RecoveryKeyView_Night_12_en",20392,], +["features.securebackup.impl.setup.views_RecoveryKeyView_Day_13_en","features.securebackup.impl.setup.views_RecoveryKeyView_Night_13_en",20392,], +["features.securebackup.impl.setup.views_RecoveryKeyView_Day_14_en","features.securebackup.impl.setup.views_RecoveryKeyView_Night_14_en",20392,], +["features.securebackup.impl.setup.views_RecoveryKeyView_Day_1_en","features.securebackup.impl.setup.views_RecoveryKeyView_Night_1_en",20392,], +["features.securebackup.impl.setup.views_RecoveryKeyView_Day_2_en","features.securebackup.impl.setup.views_RecoveryKeyView_Night_2_en",20392,], +["features.securebackup.impl.setup.views_RecoveryKeyView_Day_3_en","features.securebackup.impl.setup.views_RecoveryKeyView_Night_3_en",20392,], +["features.securebackup.impl.setup.views_RecoveryKeyView_Day_4_en","features.securebackup.impl.setup.views_RecoveryKeyView_Night_4_en",20392,], +["features.securebackup.impl.setup.views_RecoveryKeyView_Day_5_en","features.securebackup.impl.setup.views_RecoveryKeyView_Night_5_en",20392,], +["features.securebackup.impl.setup.views_RecoveryKeyView_Day_6_en","features.securebackup.impl.setup.views_RecoveryKeyView_Night_6_en",20392,], +["features.securebackup.impl.setup.views_RecoveryKeyView_Day_7_en","features.securebackup.impl.setup.views_RecoveryKeyView_Night_7_en",20392,], +["features.securebackup.impl.setup.views_RecoveryKeyView_Day_8_en","features.securebackup.impl.setup.views_RecoveryKeyView_Night_8_en",20392,], +["features.securebackup.impl.setup.views_RecoveryKeyView_Day_9_en","features.securebackup.impl.setup.views_RecoveryKeyView_Night_9_en",20392,], ["libraries.designsystem.atomic.atoms_RedIndicatorAtom_Day_0_en","libraries.designsystem.atomic.atoms_RedIndicatorAtom_Night_0_en",0,], ["features.messages.impl.timeline.components_ReplySwipeIndicator_Day_0_en","features.messages.impl.timeline.components_ReplySwipeIndicator_Night_0_en",0,], -["features.messages.impl.report_ReportMessageView_Day_0_en","features.messages.impl.report_ReportMessageView_Night_0_en",20385,], -["features.messages.impl.report_ReportMessageView_Day_1_en","features.messages.impl.report_ReportMessageView_Night_1_en",20385,], -["features.messages.impl.report_ReportMessageView_Day_2_en","features.messages.impl.report_ReportMessageView_Night_2_en",20385,], -["features.messages.impl.report_ReportMessageView_Day_3_en","features.messages.impl.report_ReportMessageView_Night_3_en",20385,], -["features.messages.impl.report_ReportMessageView_Day_4_en","features.messages.impl.report_ReportMessageView_Night_4_en",20385,], -["features.messages.impl.report_ReportMessageView_Day_5_en","features.messages.impl.report_ReportMessageView_Night_5_en",20385,], -["features.reportroom.impl_ReportRoomView_Day_0_en","features.reportroom.impl_ReportRoomView_Night_0_en",20385,], -["features.reportroom.impl_ReportRoomView_Day_1_en","features.reportroom.impl_ReportRoomView_Night_1_en",20385,], -["features.reportroom.impl_ReportRoomView_Day_2_en","features.reportroom.impl_ReportRoomView_Night_2_en",20385,], -["features.reportroom.impl_ReportRoomView_Day_3_en","features.reportroom.impl_ReportRoomView_Night_3_en",20385,], -["features.reportroom.impl_ReportRoomView_Day_4_en","features.reportroom.impl_ReportRoomView_Night_4_en",20385,], -["features.securebackup.impl.reset.password_ResetIdentityPasswordView_Day_0_en","features.securebackup.impl.reset.password_ResetIdentityPasswordView_Night_0_en",20385,], -["features.securebackup.impl.reset.password_ResetIdentityPasswordView_Day_1_en","features.securebackup.impl.reset.password_ResetIdentityPasswordView_Night_1_en",20385,], -["features.securebackup.impl.reset.password_ResetIdentityPasswordView_Day_2_en","features.securebackup.impl.reset.password_ResetIdentityPasswordView_Night_2_en",20385,], -["features.securebackup.impl.reset.password_ResetIdentityPasswordView_Day_3_en","features.securebackup.impl.reset.password_ResetIdentityPasswordView_Night_3_en",20385,], -["features.securebackup.impl.reset.root_ResetIdentityRootView_Day_0_en","features.securebackup.impl.reset.root_ResetIdentityRootView_Night_0_en",20385,], -["features.securebackup.impl.reset.root_ResetIdentityRootView_Day_1_en","features.securebackup.impl.reset.root_ResetIdentityRootView_Night_1_en",20385,], +["features.messages.impl.report_ReportMessageView_Day_0_en","features.messages.impl.report_ReportMessageView_Night_0_en",20392,], +["features.messages.impl.report_ReportMessageView_Day_1_en","features.messages.impl.report_ReportMessageView_Night_1_en",20392,], +["features.messages.impl.report_ReportMessageView_Day_2_en","features.messages.impl.report_ReportMessageView_Night_2_en",20392,], +["features.messages.impl.report_ReportMessageView_Day_3_en","features.messages.impl.report_ReportMessageView_Night_3_en",20392,], +["features.messages.impl.report_ReportMessageView_Day_4_en","features.messages.impl.report_ReportMessageView_Night_4_en",20392,], +["features.messages.impl.report_ReportMessageView_Day_5_en","features.messages.impl.report_ReportMessageView_Night_5_en",20392,], +["features.reportroom.impl_ReportRoomView_Day_0_en","features.reportroom.impl_ReportRoomView_Night_0_en",20392,], +["features.reportroom.impl_ReportRoomView_Day_1_en","features.reportroom.impl_ReportRoomView_Night_1_en",20392,], +["features.reportroom.impl_ReportRoomView_Day_2_en","features.reportroom.impl_ReportRoomView_Night_2_en",20392,], +["features.reportroom.impl_ReportRoomView_Day_3_en","features.reportroom.impl_ReportRoomView_Night_3_en",20392,], +["features.reportroom.impl_ReportRoomView_Day_4_en","features.reportroom.impl_ReportRoomView_Night_4_en",20392,], +["features.securebackup.impl.reset.password_ResetIdentityPasswordView_Day_0_en","features.securebackup.impl.reset.password_ResetIdentityPasswordView_Night_0_en",20392,], +["features.securebackup.impl.reset.password_ResetIdentityPasswordView_Day_1_en","features.securebackup.impl.reset.password_ResetIdentityPasswordView_Night_1_en",20392,], +["features.securebackup.impl.reset.password_ResetIdentityPasswordView_Day_2_en","features.securebackup.impl.reset.password_ResetIdentityPasswordView_Night_2_en",20392,], +["features.securebackup.impl.reset.password_ResetIdentityPasswordView_Day_3_en","features.securebackup.impl.reset.password_ResetIdentityPasswordView_Night_3_en",20392,], +["features.securebackup.impl.reset.root_ResetIdentityRootView_Day_0_en","features.securebackup.impl.reset.root_ResetIdentityRootView_Night_0_en",20392,], +["features.securebackup.impl.reset.root_ResetIdentityRootView_Day_1_en","features.securebackup.impl.reset.root_ResetIdentityRootView_Night_1_en",20392,], ["features.messages.impl.crypto.sendfailure.resolve_ResolveVerifiedUserSendFailureView_Day_0_en","features.messages.impl.crypto.sendfailure.resolve_ResolveVerifiedUserSendFailureView_Night_0_en",0,], -["features.messages.impl.crypto.sendfailure.resolve_ResolveVerifiedUserSendFailureView_Day_1_en","features.messages.impl.crypto.sendfailure.resolve_ResolveVerifiedUserSendFailureView_Night_1_en",20385,], -["features.messages.impl.crypto.sendfailure.resolve_ResolveVerifiedUserSendFailureView_Day_2_en","features.messages.impl.crypto.sendfailure.resolve_ResolveVerifiedUserSendFailureView_Night_2_en",20385,], -["libraries.designsystem.components.dialogs_RetryDialogContent_Dialogs_en","",20385,], -["libraries.designsystem.components.dialogs_RetryDialog_Day_0_en","libraries.designsystem.components.dialogs_RetryDialog_Night_0_en",20385,], -["features.roomdetails.impl.rolesandpermissions_RolesAndPermissionsView_Day_0_en","features.roomdetails.impl.rolesandpermissions_RolesAndPermissionsView_Night_0_en",20385,], -["features.roomdetails.impl.rolesandpermissions_RolesAndPermissionsView_Day_1_en","features.roomdetails.impl.rolesandpermissions_RolesAndPermissionsView_Night_1_en",20385,], -["features.roomdetails.impl.rolesandpermissions_RolesAndPermissionsView_Day_2_en","features.roomdetails.impl.rolesandpermissions_RolesAndPermissionsView_Night_2_en",20385,], -["features.roomdetails.impl.rolesandpermissions_RolesAndPermissionsView_Day_3_en","features.roomdetails.impl.rolesandpermissions_RolesAndPermissionsView_Night_3_en",20385,], -["features.roomdetails.impl.rolesandpermissions_RolesAndPermissionsView_Day_4_en","features.roomdetails.impl.rolesandpermissions_RolesAndPermissionsView_Night_4_en",20385,], -["features.roomdetails.impl.rolesandpermissions_RolesAndPermissionsView_Day_5_en","features.roomdetails.impl.rolesandpermissions_RolesAndPermissionsView_Night_5_en",20385,], -["features.roomdetails.impl.rolesandpermissions_RolesAndPermissionsView_Day_6_en","features.roomdetails.impl.rolesandpermissions_RolesAndPermissionsView_Night_6_en",20385,], -["features.roomdetails.impl.rolesandpermissions_RolesAndPermissionsView_Day_7_en","features.roomdetails.impl.rolesandpermissions_RolesAndPermissionsView_Night_7_en",20385,], -["features.roomdetails.impl.rolesandpermissions_RolesAndPermissionsView_Day_8_en","features.roomdetails.impl.rolesandpermissions_RolesAndPermissionsView_Night_8_en",20385,], +["features.messages.impl.crypto.sendfailure.resolve_ResolveVerifiedUserSendFailureView_Day_1_en","features.messages.impl.crypto.sendfailure.resolve_ResolveVerifiedUserSendFailureView_Night_1_en",20392,], +["features.messages.impl.crypto.sendfailure.resolve_ResolveVerifiedUserSendFailureView_Day_2_en","features.messages.impl.crypto.sendfailure.resolve_ResolveVerifiedUserSendFailureView_Night_2_en",20392,], +["libraries.designsystem.components.dialogs_RetryDialogContent_Dialogs_en","",20392,], +["libraries.designsystem.components.dialogs_RetryDialog_Day_0_en","libraries.designsystem.components.dialogs_RetryDialog_Night_0_en",20392,], +["features.roomdetails.impl.rolesandpermissions_RolesAndPermissionsView_Day_0_en","features.roomdetails.impl.rolesandpermissions_RolesAndPermissionsView_Night_0_en",20392,], +["features.roomdetails.impl.rolesandpermissions_RolesAndPermissionsView_Day_1_en","features.roomdetails.impl.rolesandpermissions_RolesAndPermissionsView_Night_1_en",20392,], +["features.roomdetails.impl.rolesandpermissions_RolesAndPermissionsView_Day_2_en","features.roomdetails.impl.rolesandpermissions_RolesAndPermissionsView_Night_2_en",20392,], +["features.roomdetails.impl.rolesandpermissions_RolesAndPermissionsView_Day_3_en","features.roomdetails.impl.rolesandpermissions_RolesAndPermissionsView_Night_3_en",20392,], +["features.roomdetails.impl.rolesandpermissions_RolesAndPermissionsView_Day_4_en","features.roomdetails.impl.rolesandpermissions_RolesAndPermissionsView_Night_4_en",20392,], +["features.roomdetails.impl.rolesandpermissions_RolesAndPermissionsView_Day_5_en","features.roomdetails.impl.rolesandpermissions_RolesAndPermissionsView_Night_5_en",20392,], +["features.roomdetails.impl.rolesandpermissions_RolesAndPermissionsView_Day_6_en","features.roomdetails.impl.rolesandpermissions_RolesAndPermissionsView_Night_6_en",20392,], +["features.roomdetails.impl.rolesandpermissions_RolesAndPermissionsView_Day_7_en","features.roomdetails.impl.rolesandpermissions_RolesAndPermissionsView_Night_7_en",20392,], +["features.roomdetails.impl.rolesandpermissions_RolesAndPermissionsView_Day_8_en","features.roomdetails.impl.rolesandpermissions_RolesAndPermissionsView_Night_8_en",20392,], ["libraries.matrix.ui.room.address_RoomAddressField_Day_0_en","libraries.matrix.ui.room.address_RoomAddressField_Night_0_en",0,], ["features.roomaliasresolver.impl_RoomAliasResolverView_Day_0_en","features.roomaliasresolver.impl_RoomAliasResolverView_Night_0_en",0,], -["features.roomaliasresolver.impl_RoomAliasResolverView_Day_1_en","features.roomaliasresolver.impl_RoomAliasResolverView_Night_1_en",20385,], -["features.roomaliasresolver.impl_RoomAliasResolverView_Day_2_en","features.roomaliasresolver.impl_RoomAliasResolverView_Night_2_en",20385,], -["features.roomdetails.impl_RoomDetailsDark_0_en","",20385,], -["features.roomdetails.impl_RoomDetailsDark_10_en","",20385,], -["features.roomdetails.impl_RoomDetailsDark_11_en","",20385,], -["features.roomdetails.impl_RoomDetailsDark_12_en","",20385,], -["features.roomdetails.impl_RoomDetailsDark_13_en","",20385,], -["features.roomdetails.impl_RoomDetailsDark_14_en","",20385,], -["features.roomdetails.impl_RoomDetailsDark_15_en","",20385,], -["features.roomdetails.impl_RoomDetailsDark_16_en","",20385,], -["features.roomdetails.impl_RoomDetailsDark_17_en","",20385,], -["features.roomdetails.impl_RoomDetailsDark_18_en","",20385,], -["features.roomdetails.impl_RoomDetailsDark_19_en","",20385,], -["features.roomdetails.impl_RoomDetailsDark_1_en","",20385,], -["features.roomdetails.impl_RoomDetailsDark_2_en","",20385,], -["features.roomdetails.impl_RoomDetailsDark_3_en","",20385,], -["features.roomdetails.impl_RoomDetailsDark_4_en","",20385,], -["features.roomdetails.impl_RoomDetailsDark_5_en","",20385,], -["features.roomdetails.impl_RoomDetailsDark_6_en","",20385,], -["features.roomdetails.impl_RoomDetailsDark_7_en","",20385,], -["features.roomdetails.impl_RoomDetailsDark_8_en","",20385,], -["features.roomdetails.impl_RoomDetailsDark_9_en","",20385,], -["features.roomdetails.impl.edit_RoomDetailsEditView_Day_0_en","features.roomdetails.impl.edit_RoomDetailsEditView_Night_0_en",20385,], -["features.roomdetails.impl.edit_RoomDetailsEditView_Day_1_en","features.roomdetails.impl.edit_RoomDetailsEditView_Night_1_en",20385,], -["features.roomdetails.impl.edit_RoomDetailsEditView_Day_2_en","features.roomdetails.impl.edit_RoomDetailsEditView_Night_2_en",20385,], -["features.roomdetails.impl.edit_RoomDetailsEditView_Day_3_en","features.roomdetails.impl.edit_RoomDetailsEditView_Night_3_en",20385,], -["features.roomdetails.impl.edit_RoomDetailsEditView_Day_4_en","features.roomdetails.impl.edit_RoomDetailsEditView_Night_4_en",20385,], -["features.roomdetails.impl.edit_RoomDetailsEditView_Day_5_en","features.roomdetails.impl.edit_RoomDetailsEditView_Night_5_en",20385,], -["features.roomdetails.impl.edit_RoomDetailsEditView_Day_6_en","features.roomdetails.impl.edit_RoomDetailsEditView_Night_6_en",20385,], -["features.roomdetails.impl.edit_RoomDetailsEditView_Day_7_en","features.roomdetails.impl.edit_RoomDetailsEditView_Night_7_en",20385,], -["features.roomdetails.impl_RoomDetails_0_en","",20385,], -["features.roomdetails.impl_RoomDetails_10_en","",20385,], -["features.roomdetails.impl_RoomDetails_11_en","",20385,], -["features.roomdetails.impl_RoomDetails_12_en","",20385,], -["features.roomdetails.impl_RoomDetails_13_en","",20385,], -["features.roomdetails.impl_RoomDetails_14_en","",20385,], -["features.roomdetails.impl_RoomDetails_15_en","",20385,], -["features.roomdetails.impl_RoomDetails_16_en","",20385,], -["features.roomdetails.impl_RoomDetails_17_en","",20385,], -["features.roomdetails.impl_RoomDetails_18_en","",20385,], -["features.roomdetails.impl_RoomDetails_19_en","",20385,], -["features.roomdetails.impl_RoomDetails_1_en","",20385,], -["features.roomdetails.impl_RoomDetails_2_en","",20385,], -["features.roomdetails.impl_RoomDetails_3_en","",20385,], -["features.roomdetails.impl_RoomDetails_4_en","",20385,], -["features.roomdetails.impl_RoomDetails_5_en","",20385,], -["features.roomdetails.impl_RoomDetails_6_en","",20385,], -["features.roomdetails.impl_RoomDetails_7_en","",20385,], -["features.roomdetails.impl_RoomDetails_8_en","",20385,], -["features.roomdetails.impl_RoomDetails_9_en","",20385,], -["features.roomdirectory.impl.root_RoomDirectoryView_Day_0_en","features.roomdirectory.impl.root_RoomDirectoryView_Night_0_en",20385,], -["features.roomdirectory.impl.root_RoomDirectoryView_Day_1_en","features.roomdirectory.impl.root_RoomDirectoryView_Night_1_en",20385,], -["features.roomdirectory.impl.root_RoomDirectoryView_Day_2_en","features.roomdirectory.impl.root_RoomDirectoryView_Night_2_en",20385,], -["features.roomdetails.impl.invite_RoomInviteMembersView_Day_0_en","features.roomdetails.impl.invite_RoomInviteMembersView_Night_0_en",20385,], -["features.roomdetails.impl.invite_RoomInviteMembersView_Day_1_en","features.roomdetails.impl.invite_RoomInviteMembersView_Night_1_en",20385,], -["features.roomdetails.impl.invite_RoomInviteMembersView_Day_2_en","features.roomdetails.impl.invite_RoomInviteMembersView_Night_2_en",20385,], -["features.roomdetails.impl.invite_RoomInviteMembersView_Day_3_en","features.roomdetails.impl.invite_RoomInviteMembersView_Night_3_en",20385,], -["features.home.impl.components_RoomListContentView_Day_0_en","features.home.impl.components_RoomListContentView_Night_0_en",20385,], -["features.home.impl.components_RoomListContentView_Day_1_en","features.home.impl.components_RoomListContentView_Night_1_en",20385,], +["features.roomaliasresolver.impl_RoomAliasResolverView_Day_1_en","features.roomaliasresolver.impl_RoomAliasResolverView_Night_1_en",20392,], +["features.roomaliasresolver.impl_RoomAliasResolverView_Day_2_en","features.roomaliasresolver.impl_RoomAliasResolverView_Night_2_en",20392,], +["features.roomdetails.impl_RoomDetailsDark_0_en","",20392,], +["features.roomdetails.impl_RoomDetailsDark_10_en","",20392,], +["features.roomdetails.impl_RoomDetailsDark_11_en","",20392,], +["features.roomdetails.impl_RoomDetailsDark_12_en","",20392,], +["features.roomdetails.impl_RoomDetailsDark_13_en","",20392,], +["features.roomdetails.impl_RoomDetailsDark_14_en","",20392,], +["features.roomdetails.impl_RoomDetailsDark_15_en","",20392,], +["features.roomdetails.impl_RoomDetailsDark_16_en","",20392,], +["features.roomdetails.impl_RoomDetailsDark_17_en","",20392,], +["features.roomdetails.impl_RoomDetailsDark_18_en","",20392,], +["features.roomdetails.impl_RoomDetailsDark_19_en","",20392,], +["features.roomdetails.impl_RoomDetailsDark_1_en","",20392,], +["features.roomdetails.impl_RoomDetailsDark_2_en","",20392,], +["features.roomdetails.impl_RoomDetailsDark_3_en","",20392,], +["features.roomdetails.impl_RoomDetailsDark_4_en","",20392,], +["features.roomdetails.impl_RoomDetailsDark_5_en","",20392,], +["features.roomdetails.impl_RoomDetailsDark_6_en","",20392,], +["features.roomdetails.impl_RoomDetailsDark_7_en","",20392,], +["features.roomdetails.impl_RoomDetailsDark_8_en","",20392,], +["features.roomdetails.impl_RoomDetailsDark_9_en","",20392,], +["features.roomdetails.impl.edit_RoomDetailsEditView_Day_0_en","features.roomdetails.impl.edit_RoomDetailsEditView_Night_0_en",20392,], +["features.roomdetails.impl.edit_RoomDetailsEditView_Day_1_en","features.roomdetails.impl.edit_RoomDetailsEditView_Night_1_en",20392,], +["features.roomdetails.impl.edit_RoomDetailsEditView_Day_2_en","features.roomdetails.impl.edit_RoomDetailsEditView_Night_2_en",20392,], +["features.roomdetails.impl.edit_RoomDetailsEditView_Day_3_en","features.roomdetails.impl.edit_RoomDetailsEditView_Night_3_en",20392,], +["features.roomdetails.impl.edit_RoomDetailsEditView_Day_4_en","features.roomdetails.impl.edit_RoomDetailsEditView_Night_4_en",20392,], +["features.roomdetails.impl.edit_RoomDetailsEditView_Day_5_en","features.roomdetails.impl.edit_RoomDetailsEditView_Night_5_en",20392,], +["features.roomdetails.impl.edit_RoomDetailsEditView_Day_6_en","features.roomdetails.impl.edit_RoomDetailsEditView_Night_6_en",20392,], +["features.roomdetails.impl.edit_RoomDetailsEditView_Day_7_en","features.roomdetails.impl.edit_RoomDetailsEditView_Night_7_en",20392,], +["features.roomdetails.impl.edit_RoomDetailsEditView_Day_8_en","features.roomdetails.impl.edit_RoomDetailsEditView_Night_8_en",20395,], +["features.roomdetails.impl_RoomDetails_0_en","",20392,], +["features.roomdetails.impl_RoomDetails_10_en","",20392,], +["features.roomdetails.impl_RoomDetails_11_en","",20392,], +["features.roomdetails.impl_RoomDetails_12_en","",20392,], +["features.roomdetails.impl_RoomDetails_13_en","",20392,], +["features.roomdetails.impl_RoomDetails_14_en","",20392,], +["features.roomdetails.impl_RoomDetails_15_en","",20392,], +["features.roomdetails.impl_RoomDetails_16_en","",20392,], +["features.roomdetails.impl_RoomDetails_17_en","",20392,], +["features.roomdetails.impl_RoomDetails_18_en","",20392,], +["features.roomdetails.impl_RoomDetails_19_en","",20392,], +["features.roomdetails.impl_RoomDetails_1_en","",20392,], +["features.roomdetails.impl_RoomDetails_2_en","",20392,], +["features.roomdetails.impl_RoomDetails_3_en","",20392,], +["features.roomdetails.impl_RoomDetails_4_en","",20392,], +["features.roomdetails.impl_RoomDetails_5_en","",20392,], +["features.roomdetails.impl_RoomDetails_6_en","",20392,], +["features.roomdetails.impl_RoomDetails_7_en","",20392,], +["features.roomdetails.impl_RoomDetails_8_en","",20392,], +["features.roomdetails.impl_RoomDetails_9_en","",20392,], +["features.roomdirectory.impl.root_RoomDirectoryView_Day_0_en","features.roomdirectory.impl.root_RoomDirectoryView_Night_0_en",20392,], +["features.roomdirectory.impl.root_RoomDirectoryView_Day_1_en","features.roomdirectory.impl.root_RoomDirectoryView_Night_1_en",20392,], +["features.roomdirectory.impl.root_RoomDirectoryView_Day_2_en","features.roomdirectory.impl.root_RoomDirectoryView_Night_2_en",20392,], +["features.roomdetails.impl.invite_RoomInviteMembersView_Day_0_en","features.roomdetails.impl.invite_RoomInviteMembersView_Night_0_en",20392,], +["features.roomdetails.impl.invite_RoomInviteMembersView_Day_1_en","features.roomdetails.impl.invite_RoomInviteMembersView_Night_1_en",20392,], +["features.roomdetails.impl.invite_RoomInviteMembersView_Day_2_en","features.roomdetails.impl.invite_RoomInviteMembersView_Night_2_en",20392,], +["features.roomdetails.impl.invite_RoomInviteMembersView_Day_3_en","features.roomdetails.impl.invite_RoomInviteMembersView_Night_3_en",20392,], +["features.home.impl.components_RoomListContentView_Day_0_en","features.home.impl.components_RoomListContentView_Night_0_en",20392,], +["features.home.impl.components_RoomListContentView_Day_1_en","features.home.impl.components_RoomListContentView_Night_1_en",20392,], ["features.home.impl.components_RoomListContentView_Day_2_en","features.home.impl.components_RoomListContentView_Night_2_en",0,], -["features.home.impl.components_RoomListContentView_Day_3_en","features.home.impl.components_RoomListContentView_Night_3_en",20385,], -["features.home.impl.components_RoomListContentView_Day_4_en","features.home.impl.components_RoomListContentView_Night_4_en",20385,], -["features.home.impl.components_RoomListContentView_Day_5_en","features.home.impl.components_RoomListContentView_Night_5_en",20385,], -["features.home.impl.roomlist_RoomListDeclineInviteMenuContent_Day_0_en","features.home.impl.roomlist_RoomListDeclineInviteMenuContent_Night_0_en",20385,], -["features.home.impl.filters_RoomListFiltersView_Day_0_en","features.home.impl.filters_RoomListFiltersView_Night_0_en",20385,], -["features.home.impl.filters_RoomListFiltersView_Day_1_en","features.home.impl.filters_RoomListFiltersView_Night_1_en",20385,], -["features.home.impl.roomlist_RoomListModalBottomSheetContent_Day_0_en","features.home.impl.roomlist_RoomListModalBottomSheetContent_Night_0_en",20385,], -["features.home.impl.roomlist_RoomListModalBottomSheetContent_Day_1_en","features.home.impl.roomlist_RoomListModalBottomSheetContent_Night_1_en",20385,], -["features.home.impl.roomlist_RoomListModalBottomSheetContent_Day_2_en","features.home.impl.roomlist_RoomListModalBottomSheetContent_Night_2_en",20385,], +["features.home.impl.components_RoomListContentView_Day_3_en","features.home.impl.components_RoomListContentView_Night_3_en",20392,], +["features.home.impl.components_RoomListContentView_Day_4_en","features.home.impl.components_RoomListContentView_Night_4_en",20392,], +["features.home.impl.components_RoomListContentView_Day_5_en","features.home.impl.components_RoomListContentView_Night_5_en",20392,], +["features.home.impl.roomlist_RoomListDeclineInviteMenuContent_Day_0_en","features.home.impl.roomlist_RoomListDeclineInviteMenuContent_Night_0_en",20392,], +["features.home.impl.filters_RoomListFiltersView_Day_0_en","features.home.impl.filters_RoomListFiltersView_Night_0_en",20392,], +["features.home.impl.filters_RoomListFiltersView_Day_1_en","features.home.impl.filters_RoomListFiltersView_Night_1_en",20392,], +["features.home.impl.roomlist_RoomListModalBottomSheetContent_Day_0_en","features.home.impl.roomlist_RoomListModalBottomSheetContent_Night_0_en",20392,], +["features.home.impl.roomlist_RoomListModalBottomSheetContent_Day_1_en","features.home.impl.roomlist_RoomListModalBottomSheetContent_Night_1_en",20392,], +["features.home.impl.roomlist_RoomListModalBottomSheetContent_Day_2_en","features.home.impl.roomlist_RoomListModalBottomSheetContent_Night_2_en",20392,], ["features.home.impl.search_RoomListSearchContent_Day_0_en","features.home.impl.search_RoomListSearchContent_Night_0_en",0,], -["features.home.impl.search_RoomListSearchContent_Day_1_en","features.home.impl.search_RoomListSearchContent_Night_1_en",20385,], -["features.roomdetails.impl.members_RoomMemberListViewBanned_Day_0_en","features.roomdetails.impl.members_RoomMemberListViewBanned_Night_0_en",20385,], -["features.roomdetails.impl.members_RoomMemberListViewBanned_Day_1_en","features.roomdetails.impl.members_RoomMemberListViewBanned_Night_1_en",20385,], -["features.roomdetails.impl.members_RoomMemberListViewBanned_Day_2_en","features.roomdetails.impl.members_RoomMemberListViewBanned_Night_2_en",20385,], -["features.roomdetails.impl.members_RoomMemberListView_Day_0_en","features.roomdetails.impl.members_RoomMemberListView_Night_0_en",20385,], -["features.roomdetails.impl.members_RoomMemberListView_Day_1_en","features.roomdetails.impl.members_RoomMemberListView_Night_1_en",20385,], -["features.roomdetails.impl.members_RoomMemberListView_Day_2_en","features.roomdetails.impl.members_RoomMemberListView_Night_2_en",20385,], -["features.roomdetails.impl.members_RoomMemberListView_Day_3_en","features.roomdetails.impl.members_RoomMemberListView_Night_3_en",20385,], -["features.roomdetails.impl.members_RoomMemberListView_Day_4_en","features.roomdetails.impl.members_RoomMemberListView_Night_4_en",20385,], -["features.roomdetails.impl.members_RoomMemberListView_Day_5_en","features.roomdetails.impl.members_RoomMemberListView_Night_5_en",20385,], +["features.home.impl.search_RoomListSearchContent_Day_1_en","features.home.impl.search_RoomListSearchContent_Night_1_en",20392,], +["features.roomdetails.impl.members_RoomMemberListViewBanned_Day_0_en","features.roomdetails.impl.members_RoomMemberListViewBanned_Night_0_en",20392,], +["features.roomdetails.impl.members_RoomMemberListViewBanned_Day_1_en","features.roomdetails.impl.members_RoomMemberListViewBanned_Night_1_en",20392,], +["features.roomdetails.impl.members_RoomMemberListViewBanned_Day_2_en","features.roomdetails.impl.members_RoomMemberListViewBanned_Night_2_en",20392,], +["features.roomdetails.impl.members_RoomMemberListView_Day_0_en","features.roomdetails.impl.members_RoomMemberListView_Night_0_en",20392,], +["features.roomdetails.impl.members_RoomMemberListView_Day_1_en","features.roomdetails.impl.members_RoomMemberListView_Night_1_en",20392,], +["features.roomdetails.impl.members_RoomMemberListView_Day_2_en","features.roomdetails.impl.members_RoomMemberListView_Night_2_en",20392,], +["features.roomdetails.impl.members_RoomMemberListView_Day_3_en","features.roomdetails.impl.members_RoomMemberListView_Night_3_en",20392,], +["features.roomdetails.impl.members_RoomMemberListView_Day_4_en","features.roomdetails.impl.members_RoomMemberListView_Night_4_en",20392,], +["features.roomdetails.impl.members_RoomMemberListView_Day_5_en","features.roomdetails.impl.members_RoomMemberListView_Night_5_en",20392,], ["features.roomdetails.impl.members_RoomMemberListView_Day_6_en","features.roomdetails.impl.members_RoomMemberListView_Night_6_en",0,], -["features.roomdetails.impl.members_RoomMemberListView_Day_7_en","features.roomdetails.impl.members_RoomMemberListView_Night_7_en",20385,], -["features.roomdetails.impl.members_RoomMemberListView_Day_8_en","features.roomdetails.impl.members_RoomMemberListView_Night_8_en",20385,], -["features.roomdetails.impl.members_RoomMemberListView_Day_9_en","features.roomdetails.impl.members_RoomMemberListView_Night_9_en",20385,], -["features.roommembermoderation.impl_RoomMemberModerationView_Day_0_en","features.roommembermoderation.impl_RoomMemberModerationView_Night_0_en",20385,], -["features.roommembermoderation.impl_RoomMemberModerationView_Day_1_en","features.roommembermoderation.impl_RoomMemberModerationView_Night_1_en",20385,], -["features.roommembermoderation.impl_RoomMemberModerationView_Day_2_en","features.roommembermoderation.impl_RoomMemberModerationView_Night_2_en",20385,], -["features.roommembermoderation.impl_RoomMemberModerationView_Day_3_en","features.roommembermoderation.impl_RoomMemberModerationView_Night_3_en",20385,], -["features.roommembermoderation.impl_RoomMemberModerationView_Day_4_en","features.roommembermoderation.impl_RoomMemberModerationView_Night_4_en",20385,], -["features.roommembermoderation.impl_RoomMemberModerationView_Day_5_en","features.roommembermoderation.impl_RoomMemberModerationView_Night_5_en",20385,], -["features.roommembermoderation.impl_RoomMemberModerationView_Day_6_en","features.roommembermoderation.impl_RoomMemberModerationView_Night_6_en",20385,], -["features.roommembermoderation.impl_RoomMemberModerationView_Day_7_en","features.roommembermoderation.impl_RoomMemberModerationView_Night_7_en",20385,], -["features.roomdetails.impl.notificationsettings_RoomNotificationSettingsOption_Day_0_en","features.roomdetails.impl.notificationsettings_RoomNotificationSettingsOption_Night_0_en",20385,], -["features.roomdetails.impl.notificationsettings_RoomNotificationSettingsView_Day_0_en","features.roomdetails.impl.notificationsettings_RoomNotificationSettingsView_Night_0_en",20385,], -["features.roomdetails.impl.notificationsettings_RoomNotificationSettingsView_Day_1_en","features.roomdetails.impl.notificationsettings_RoomNotificationSettingsView_Night_1_en",20385,], -["features.roomdetails.impl.notificationsettings_RoomNotificationSettingsView_Day_2_en","features.roomdetails.impl.notificationsettings_RoomNotificationSettingsView_Night_2_en",20385,], -["features.roomdetails.impl.notificationsettings_RoomNotificationSettingsView_Day_3_en","features.roomdetails.impl.notificationsettings_RoomNotificationSettingsView_Night_3_en",20385,], -["features.roomdetails.impl.notificationsettings_RoomNotificationSettingsView_Day_4_en","features.roomdetails.impl.notificationsettings_RoomNotificationSettingsView_Night_4_en",20385,], -["features.roomdetails.impl.notificationsettings_RoomNotificationSettingsView_Day_5_en","features.roomdetails.impl.notificationsettings_RoomNotificationSettingsView_Night_5_en",20385,], -["features.roomdetails.impl.notificationsettings_RoomNotificationSettingsView_Day_6_en","features.roomdetails.impl.notificationsettings_RoomNotificationSettingsView_Night_6_en",20385,], -["libraries.roomselect.impl_RoomSelectView_Day_0_en","libraries.roomselect.impl_RoomSelectView_Night_0_en",20385,], -["libraries.roomselect.impl_RoomSelectView_Day_1_en","libraries.roomselect.impl_RoomSelectView_Night_1_en",20385,], -["libraries.roomselect.impl_RoomSelectView_Day_2_en","libraries.roomselect.impl_RoomSelectView_Night_2_en",20385,], -["libraries.roomselect.impl_RoomSelectView_Day_3_en","libraries.roomselect.impl_RoomSelectView_Night_3_en",20385,], -["libraries.roomselect.impl_RoomSelectView_Day_4_en","libraries.roomselect.impl_RoomSelectView_Night_4_en",20385,], -["libraries.roomselect.impl_RoomSelectView_Day_5_en","libraries.roomselect.impl_RoomSelectView_Night_5_en",20385,], +["features.roomdetails.impl.members_RoomMemberListView_Day_7_en","features.roomdetails.impl.members_RoomMemberListView_Night_7_en",20392,], +["features.roomdetails.impl.members_RoomMemberListView_Day_8_en","features.roomdetails.impl.members_RoomMemberListView_Night_8_en",20392,], +["features.roomdetails.impl.members_RoomMemberListView_Day_9_en","features.roomdetails.impl.members_RoomMemberListView_Night_9_en",20392,], +["features.roommembermoderation.impl_RoomMemberModerationView_Day_0_en","features.roommembermoderation.impl_RoomMemberModerationView_Night_0_en",20392,], +["features.roommembermoderation.impl_RoomMemberModerationView_Day_1_en","features.roommembermoderation.impl_RoomMemberModerationView_Night_1_en",20392,], +["features.roommembermoderation.impl_RoomMemberModerationView_Day_2_en","features.roommembermoderation.impl_RoomMemberModerationView_Night_2_en",20392,], +["features.roommembermoderation.impl_RoomMemberModerationView_Day_3_en","features.roommembermoderation.impl_RoomMemberModerationView_Night_3_en",20392,], +["features.roommembermoderation.impl_RoomMemberModerationView_Day_4_en","features.roommembermoderation.impl_RoomMemberModerationView_Night_4_en",20392,], +["features.roommembermoderation.impl_RoomMemberModerationView_Day_5_en","features.roommembermoderation.impl_RoomMemberModerationView_Night_5_en",20392,], +["features.roommembermoderation.impl_RoomMemberModerationView_Day_6_en","features.roommembermoderation.impl_RoomMemberModerationView_Night_6_en",20392,], +["features.roommembermoderation.impl_RoomMemberModerationView_Day_7_en","features.roommembermoderation.impl_RoomMemberModerationView_Night_7_en",20392,], +["features.roomdetails.impl.notificationsettings_RoomNotificationSettingsOption_Day_0_en","features.roomdetails.impl.notificationsettings_RoomNotificationSettingsOption_Night_0_en",20392,], +["features.roomdetails.impl.notificationsettings_RoomNotificationSettingsView_Day_0_en","features.roomdetails.impl.notificationsettings_RoomNotificationSettingsView_Night_0_en",20392,], +["features.roomdetails.impl.notificationsettings_RoomNotificationSettingsView_Day_1_en","features.roomdetails.impl.notificationsettings_RoomNotificationSettingsView_Night_1_en",20392,], +["features.roomdetails.impl.notificationsettings_RoomNotificationSettingsView_Day_2_en","features.roomdetails.impl.notificationsettings_RoomNotificationSettingsView_Night_2_en",20392,], +["features.roomdetails.impl.notificationsettings_RoomNotificationSettingsView_Day_3_en","features.roomdetails.impl.notificationsettings_RoomNotificationSettingsView_Night_3_en",20392,], +["features.roomdetails.impl.notificationsettings_RoomNotificationSettingsView_Day_4_en","features.roomdetails.impl.notificationsettings_RoomNotificationSettingsView_Night_4_en",20392,], +["features.roomdetails.impl.notificationsettings_RoomNotificationSettingsView_Day_5_en","features.roomdetails.impl.notificationsettings_RoomNotificationSettingsView_Night_5_en",20392,], +["features.roomdetails.impl.notificationsettings_RoomNotificationSettingsView_Day_6_en","features.roomdetails.impl.notificationsettings_RoomNotificationSettingsView_Night_6_en",20392,], +["libraries.roomselect.impl_RoomSelectView_Day_0_en","libraries.roomselect.impl_RoomSelectView_Night_0_en",20392,], +["libraries.roomselect.impl_RoomSelectView_Day_1_en","libraries.roomselect.impl_RoomSelectView_Night_1_en",20392,], +["libraries.roomselect.impl_RoomSelectView_Day_2_en","libraries.roomselect.impl_RoomSelectView_Night_2_en",20392,], +["libraries.roomselect.impl_RoomSelectView_Day_3_en","libraries.roomselect.impl_RoomSelectView_Night_3_en",20392,], +["libraries.roomselect.impl_RoomSelectView_Day_4_en","libraries.roomselect.impl_RoomSelectView_Night_4_en",20392,], +["libraries.roomselect.impl_RoomSelectView_Day_5_en","libraries.roomselect.impl_RoomSelectView_Night_5_en",20392,], ["features.home.impl.components_RoomSummaryPlaceholderRow_Day_0_en","features.home.impl.components_RoomSummaryPlaceholderRow_Night_0_en",0,], ["features.home.impl.components_RoomSummaryRow_Day_0_en","features.home.impl.components_RoomSummaryRow_Night_0_en",0,], ["features.home.impl.components_RoomSummaryRow_Day_10_en","features.home.impl.components_RoomSummaryRow_Night_10_en",0,], @@ -1016,14 +1017,14 @@ export const screenshots = [ ["features.home.impl.components_RoomSummaryRow_Day_26_en","features.home.impl.components_RoomSummaryRow_Night_26_en",0,], ["features.home.impl.components_RoomSummaryRow_Day_27_en","features.home.impl.components_RoomSummaryRow_Night_27_en",0,], ["features.home.impl.components_RoomSummaryRow_Day_28_en","features.home.impl.components_RoomSummaryRow_Night_28_en",0,], -["features.home.impl.components_RoomSummaryRow_Day_29_en","features.home.impl.components_RoomSummaryRow_Night_29_en",20385,], -["features.home.impl.components_RoomSummaryRow_Day_2_en","features.home.impl.components_RoomSummaryRow_Night_2_en",20385,], -["features.home.impl.components_RoomSummaryRow_Day_30_en","features.home.impl.components_RoomSummaryRow_Night_30_en",20385,], -["features.home.impl.components_RoomSummaryRow_Day_31_en","features.home.impl.components_RoomSummaryRow_Night_31_en",20385,], -["features.home.impl.components_RoomSummaryRow_Day_32_en","features.home.impl.components_RoomSummaryRow_Night_32_en",20385,], -["features.home.impl.components_RoomSummaryRow_Day_33_en","features.home.impl.components_RoomSummaryRow_Night_33_en",20385,], -["features.home.impl.components_RoomSummaryRow_Day_34_en","features.home.impl.components_RoomSummaryRow_Night_34_en",20385,], -["features.home.impl.components_RoomSummaryRow_Day_35_en","features.home.impl.components_RoomSummaryRow_Night_35_en",20385,], +["features.home.impl.components_RoomSummaryRow_Day_29_en","features.home.impl.components_RoomSummaryRow_Night_29_en",20392,], +["features.home.impl.components_RoomSummaryRow_Day_2_en","features.home.impl.components_RoomSummaryRow_Night_2_en",20392,], +["features.home.impl.components_RoomSummaryRow_Day_30_en","features.home.impl.components_RoomSummaryRow_Night_30_en",20392,], +["features.home.impl.components_RoomSummaryRow_Day_31_en","features.home.impl.components_RoomSummaryRow_Night_31_en",20392,], +["features.home.impl.components_RoomSummaryRow_Day_32_en","features.home.impl.components_RoomSummaryRow_Night_32_en",20392,], +["features.home.impl.components_RoomSummaryRow_Day_33_en","features.home.impl.components_RoomSummaryRow_Night_33_en",20392,], +["features.home.impl.components_RoomSummaryRow_Day_34_en","features.home.impl.components_RoomSummaryRow_Night_34_en",20392,], +["features.home.impl.components_RoomSummaryRow_Day_35_en","features.home.impl.components_RoomSummaryRow_Night_35_en",20392,], ["features.home.impl.components_RoomSummaryRow_Day_3_en","features.home.impl.components_RoomSummaryRow_Night_3_en",0,], ["features.home.impl.components_RoomSummaryRow_Day_4_en","features.home.impl.components_RoomSummaryRow_Night_4_en",0,], ["features.home.impl.components_RoomSummaryRow_Day_5_en","features.home.impl.components_RoomSummaryRow_Night_5_en",0,], @@ -1031,82 +1032,82 @@ export const screenshots = [ ["features.home.impl.components_RoomSummaryRow_Day_7_en","features.home.impl.components_RoomSummaryRow_Night_7_en",0,], ["features.home.impl.components_RoomSummaryRow_Day_8_en","features.home.impl.components_RoomSummaryRow_Night_8_en",0,], ["features.home.impl.components_RoomSummaryRow_Day_9_en","features.home.impl.components_RoomSummaryRow_Night_9_en",0,], -["appnav.root_RootView_Day_0_en","appnav.root_RootView_Night_0_en",20385,], -["appnav.root_RootView_Day_1_en","appnav.root_RootView_Night_1_en",20385,], -["appnav.root_RootView_Day_2_en","appnav.root_RootView_Night_2_en",20385,], +["appnav.root_RootView_Day_0_en","appnav.root_RootView_Night_0_en",20392,], +["appnav.root_RootView_Day_1_en","appnav.root_RootView_Night_1_en",20392,], +["appnav.root_RootView_Day_2_en","appnav.root_RootView_Night_2_en",20392,], ["appicon.enterprise_RoundIcon_en","",0,], ["appicon.element_RoundIcon_en","",0,], ["libraries.designsystem.atomic.atoms_RoundedIconAtom_Day_0_en","libraries.designsystem.atomic.atoms_RoundedIconAtom_Night_0_en",0,], -["features.verifysession.impl.emoji_SasEmojis_Day_0_en","features.verifysession.impl.emoji_SasEmojis_Night_0_en",20385,], -["features.login.impl.screens.searchaccountprovider_SearchAccountProviderView_Day_0_en","features.login.impl.screens.searchaccountprovider_SearchAccountProviderView_Night_0_en",20385,], -["features.login.impl.screens.searchaccountprovider_SearchAccountProviderView_Day_1_en","features.login.impl.screens.searchaccountprovider_SearchAccountProviderView_Night_1_en",20385,], +["features.verifysession.impl.emoji_SasEmojis_Day_0_en","features.verifysession.impl.emoji_SasEmojis_Night_0_en",20392,], +["features.login.impl.screens.searchaccountprovider_SearchAccountProviderView_Day_0_en","features.login.impl.screens.searchaccountprovider_SearchAccountProviderView_Night_0_en",20392,], +["features.login.impl.screens.searchaccountprovider_SearchAccountProviderView_Day_1_en","features.login.impl.screens.searchaccountprovider_SearchAccountProviderView_Night_1_en",20392,], ["libraries.designsystem.theme.components_SearchBarActiveNoneQuery_Search_views_en","",0,], ["libraries.designsystem.theme.components_SearchBarActiveWithContent_Search_views_en","",0,], -["libraries.designsystem.theme.components_SearchBarActiveWithNoResults_Search_views_en","",20385,], +["libraries.designsystem.theme.components_SearchBarActiveWithNoResults_Search_views_en","",20392,], ["libraries.designsystem.theme.components_SearchBarActiveWithQueryNoBackButton_Search_views_en","",0,], ["libraries.designsystem.theme.components_SearchBarActiveWithQuery_Search_views_en","",0,], ["libraries.designsystem.theme.components_SearchBarInactive_Search_views_en","",0,], -["features.startchat.impl.components_SearchMultipleUsersResultItem_en","",20385,], -["features.startchat.impl.components_SearchSingleUserResultItem_en","",20385,], -["features.securebackup.impl.disable_SecureBackupDisableView_Day_0_en","features.securebackup.impl.disable_SecureBackupDisableView_Night_0_en",20385,], -["features.securebackup.impl.disable_SecureBackupDisableView_Day_1_en","features.securebackup.impl.disable_SecureBackupDisableView_Night_1_en",20385,], -["features.securebackup.impl.disable_SecureBackupDisableView_Day_2_en","features.securebackup.impl.disable_SecureBackupDisableView_Night_2_en",20385,], -["features.securebackup.impl.disable_SecureBackupDisableView_Day_3_en","features.securebackup.impl.disable_SecureBackupDisableView_Night_3_en",20385,], -["features.securebackup.impl.enter_SecureBackupEnterRecoveryKeyView_Day_0_en","features.securebackup.impl.enter_SecureBackupEnterRecoveryKeyView_Night_0_en",20385,], -["features.securebackup.impl.enter_SecureBackupEnterRecoveryKeyView_Day_1_en","features.securebackup.impl.enter_SecureBackupEnterRecoveryKeyView_Night_1_en",20385,], -["features.securebackup.impl.enter_SecureBackupEnterRecoveryKeyView_Day_2_en","features.securebackup.impl.enter_SecureBackupEnterRecoveryKeyView_Night_2_en",20385,], -["features.securebackup.impl.enter_SecureBackupEnterRecoveryKeyView_Day_3_en","features.securebackup.impl.enter_SecureBackupEnterRecoveryKeyView_Night_3_en",20385,], -["features.securebackup.impl.enter_SecureBackupEnterRecoveryKeyView_Day_4_en","features.securebackup.impl.enter_SecureBackupEnterRecoveryKeyView_Night_4_en",20385,], -["features.securebackup.impl.root_SecureBackupRootView_Day_0_en","features.securebackup.impl.root_SecureBackupRootView_Night_0_en",20385,], -["features.securebackup.impl.root_SecureBackupRootView_Day_10_en","features.securebackup.impl.root_SecureBackupRootView_Night_10_en",20385,], -["features.securebackup.impl.root_SecureBackupRootView_Day_11_en","features.securebackup.impl.root_SecureBackupRootView_Night_11_en",20385,], -["features.securebackup.impl.root_SecureBackupRootView_Day_12_en","features.securebackup.impl.root_SecureBackupRootView_Night_12_en",20385,], -["features.securebackup.impl.root_SecureBackupRootView_Day_13_en","features.securebackup.impl.root_SecureBackupRootView_Night_13_en",20385,], -["features.securebackup.impl.root_SecureBackupRootView_Day_14_en","features.securebackup.impl.root_SecureBackupRootView_Night_14_en",20385,], -["features.securebackup.impl.root_SecureBackupRootView_Day_15_en","features.securebackup.impl.root_SecureBackupRootView_Night_15_en",20385,], -["features.securebackup.impl.root_SecureBackupRootView_Day_16_en","features.securebackup.impl.root_SecureBackupRootView_Night_16_en",20385,], -["features.securebackup.impl.root_SecureBackupRootView_Day_17_en","features.securebackup.impl.root_SecureBackupRootView_Night_17_en",20385,], -["features.securebackup.impl.root_SecureBackupRootView_Day_1_en","features.securebackup.impl.root_SecureBackupRootView_Night_1_en",20385,], -["features.securebackup.impl.root_SecureBackupRootView_Day_2_en","features.securebackup.impl.root_SecureBackupRootView_Night_2_en",20385,], -["features.securebackup.impl.root_SecureBackupRootView_Day_3_en","features.securebackup.impl.root_SecureBackupRootView_Night_3_en",20385,], -["features.securebackup.impl.root_SecureBackupRootView_Day_4_en","features.securebackup.impl.root_SecureBackupRootView_Night_4_en",20385,], -["features.securebackup.impl.root_SecureBackupRootView_Day_5_en","features.securebackup.impl.root_SecureBackupRootView_Night_5_en",20385,], -["features.securebackup.impl.root_SecureBackupRootView_Day_6_en","features.securebackup.impl.root_SecureBackupRootView_Night_6_en",20385,], -["features.securebackup.impl.root_SecureBackupRootView_Day_7_en","features.securebackup.impl.root_SecureBackupRootView_Night_7_en",20385,], -["features.securebackup.impl.root_SecureBackupRootView_Day_8_en","features.securebackup.impl.root_SecureBackupRootView_Night_8_en",20385,], -["features.securebackup.impl.root_SecureBackupRootView_Day_9_en","features.securebackup.impl.root_SecureBackupRootView_Night_9_en",20385,], -["features.securebackup.impl.setup_SecureBackupSetupViewChange_Day_0_en","features.securebackup.impl.setup_SecureBackupSetupViewChange_Night_0_en",20385,], -["features.securebackup.impl.setup_SecureBackupSetupViewChange_Day_1_en","features.securebackup.impl.setup_SecureBackupSetupViewChange_Night_1_en",20385,], -["features.securebackup.impl.setup_SecureBackupSetupViewChange_Day_2_en","features.securebackup.impl.setup_SecureBackupSetupViewChange_Night_2_en",20385,], -["features.securebackup.impl.setup_SecureBackupSetupViewChange_Day_3_en","features.securebackup.impl.setup_SecureBackupSetupViewChange_Night_3_en",20385,], -["features.securebackup.impl.setup_SecureBackupSetupViewChange_Day_4_en","features.securebackup.impl.setup_SecureBackupSetupViewChange_Night_4_en",20385,], -["features.securebackup.impl.setup_SecureBackupSetupViewChange_Day_5_en","features.securebackup.impl.setup_SecureBackupSetupViewChange_Night_5_en",20385,], -["features.securebackup.impl.setup_SecureBackupSetupView_Day_0_en","features.securebackup.impl.setup_SecureBackupSetupView_Night_0_en",20385,], -["features.securebackup.impl.setup_SecureBackupSetupView_Day_1_en","features.securebackup.impl.setup_SecureBackupSetupView_Night_1_en",20385,], -["features.securebackup.impl.setup_SecureBackupSetupView_Day_2_en","features.securebackup.impl.setup_SecureBackupSetupView_Night_2_en",20385,], -["features.securebackup.impl.setup_SecureBackupSetupView_Day_3_en","features.securebackup.impl.setup_SecureBackupSetupView_Night_3_en",20385,], -["features.securebackup.impl.setup_SecureBackupSetupView_Day_4_en","features.securebackup.impl.setup_SecureBackupSetupView_Night_4_en",20385,], -["features.securebackup.impl.setup_SecureBackupSetupView_Day_5_en","features.securebackup.impl.setup_SecureBackupSetupView_Night_5_en",20385,], -["features.roomdetails.impl.securityandprivacy_SecurityAndPrivacyViewDark_0_en","",20385,], -["features.roomdetails.impl.securityandprivacy_SecurityAndPrivacyViewDark_1_en","",20385,], -["features.roomdetails.impl.securityandprivacy_SecurityAndPrivacyViewDark_2_en","",20385,], -["features.roomdetails.impl.securityandprivacy_SecurityAndPrivacyViewDark_3_en","",20385,], -["features.roomdetails.impl.securityandprivacy_SecurityAndPrivacyViewDark_4_en","",20385,], -["features.roomdetails.impl.securityandprivacy_SecurityAndPrivacyViewDark_5_en","",20385,], -["features.roomdetails.impl.securityandprivacy_SecurityAndPrivacyViewDark_6_en","",20385,], -["features.roomdetails.impl.securityandprivacy_SecurityAndPrivacyViewDark_7_en","",20385,], -["features.roomdetails.impl.securityandprivacy_SecurityAndPrivacyViewDark_8_en","",20385,], -["features.roomdetails.impl.securityandprivacy_SecurityAndPrivacyViewDark_9_en","",20388,], -["features.roomdetails.impl.securityandprivacy_SecurityAndPrivacyViewLight_0_en","",20385,], -["features.roomdetails.impl.securityandprivacy_SecurityAndPrivacyViewLight_1_en","",20385,], -["features.roomdetails.impl.securityandprivacy_SecurityAndPrivacyViewLight_2_en","",20385,], -["features.roomdetails.impl.securityandprivacy_SecurityAndPrivacyViewLight_3_en","",20385,], -["features.roomdetails.impl.securityandprivacy_SecurityAndPrivacyViewLight_4_en","",20385,], -["features.roomdetails.impl.securityandprivacy_SecurityAndPrivacyViewLight_5_en","",20385,], -["features.roomdetails.impl.securityandprivacy_SecurityAndPrivacyViewLight_6_en","",20385,], -["features.roomdetails.impl.securityandprivacy_SecurityAndPrivacyViewLight_7_en","",20385,], -["features.roomdetails.impl.securityandprivacy_SecurityAndPrivacyViewLight_8_en","",20385,], -["features.roomdetails.impl.securityandprivacy_SecurityAndPrivacyViewLight_9_en","",20388,], +["features.startchat.impl.components_SearchMultipleUsersResultItem_en","",20392,], +["features.startchat.impl.components_SearchSingleUserResultItem_en","",20392,], +["features.securebackup.impl.disable_SecureBackupDisableView_Day_0_en","features.securebackup.impl.disable_SecureBackupDisableView_Night_0_en",20392,], +["features.securebackup.impl.disable_SecureBackupDisableView_Day_1_en","features.securebackup.impl.disable_SecureBackupDisableView_Night_1_en",20392,], +["features.securebackup.impl.disable_SecureBackupDisableView_Day_2_en","features.securebackup.impl.disable_SecureBackupDisableView_Night_2_en",20392,], +["features.securebackup.impl.disable_SecureBackupDisableView_Day_3_en","features.securebackup.impl.disable_SecureBackupDisableView_Night_3_en",20392,], +["features.securebackup.impl.enter_SecureBackupEnterRecoveryKeyView_Day_0_en","features.securebackup.impl.enter_SecureBackupEnterRecoveryKeyView_Night_0_en",20392,], +["features.securebackup.impl.enter_SecureBackupEnterRecoveryKeyView_Day_1_en","features.securebackup.impl.enter_SecureBackupEnterRecoveryKeyView_Night_1_en",20392,], +["features.securebackup.impl.enter_SecureBackupEnterRecoveryKeyView_Day_2_en","features.securebackup.impl.enter_SecureBackupEnterRecoveryKeyView_Night_2_en",20392,], +["features.securebackup.impl.enter_SecureBackupEnterRecoveryKeyView_Day_3_en","features.securebackup.impl.enter_SecureBackupEnterRecoveryKeyView_Night_3_en",20392,], +["features.securebackup.impl.enter_SecureBackupEnterRecoveryKeyView_Day_4_en","features.securebackup.impl.enter_SecureBackupEnterRecoveryKeyView_Night_4_en",20392,], +["features.securebackup.impl.root_SecureBackupRootView_Day_0_en","features.securebackup.impl.root_SecureBackupRootView_Night_0_en",20392,], +["features.securebackup.impl.root_SecureBackupRootView_Day_10_en","features.securebackup.impl.root_SecureBackupRootView_Night_10_en",20392,], +["features.securebackup.impl.root_SecureBackupRootView_Day_11_en","features.securebackup.impl.root_SecureBackupRootView_Night_11_en",20392,], +["features.securebackup.impl.root_SecureBackupRootView_Day_12_en","features.securebackup.impl.root_SecureBackupRootView_Night_12_en",20392,], +["features.securebackup.impl.root_SecureBackupRootView_Day_13_en","features.securebackup.impl.root_SecureBackupRootView_Night_13_en",20392,], +["features.securebackup.impl.root_SecureBackupRootView_Day_14_en","features.securebackup.impl.root_SecureBackupRootView_Night_14_en",20392,], +["features.securebackup.impl.root_SecureBackupRootView_Day_15_en","features.securebackup.impl.root_SecureBackupRootView_Night_15_en",20392,], +["features.securebackup.impl.root_SecureBackupRootView_Day_16_en","features.securebackup.impl.root_SecureBackupRootView_Night_16_en",20392,], +["features.securebackup.impl.root_SecureBackupRootView_Day_17_en","features.securebackup.impl.root_SecureBackupRootView_Night_17_en",20392,], +["features.securebackup.impl.root_SecureBackupRootView_Day_1_en","features.securebackup.impl.root_SecureBackupRootView_Night_1_en",20392,], +["features.securebackup.impl.root_SecureBackupRootView_Day_2_en","features.securebackup.impl.root_SecureBackupRootView_Night_2_en",20392,], +["features.securebackup.impl.root_SecureBackupRootView_Day_3_en","features.securebackup.impl.root_SecureBackupRootView_Night_3_en",20392,], +["features.securebackup.impl.root_SecureBackupRootView_Day_4_en","features.securebackup.impl.root_SecureBackupRootView_Night_4_en",20392,], +["features.securebackup.impl.root_SecureBackupRootView_Day_5_en","features.securebackup.impl.root_SecureBackupRootView_Night_5_en",20392,], +["features.securebackup.impl.root_SecureBackupRootView_Day_6_en","features.securebackup.impl.root_SecureBackupRootView_Night_6_en",20392,], +["features.securebackup.impl.root_SecureBackupRootView_Day_7_en","features.securebackup.impl.root_SecureBackupRootView_Night_7_en",20392,], +["features.securebackup.impl.root_SecureBackupRootView_Day_8_en","features.securebackup.impl.root_SecureBackupRootView_Night_8_en",20392,], +["features.securebackup.impl.root_SecureBackupRootView_Day_9_en","features.securebackup.impl.root_SecureBackupRootView_Night_9_en",20392,], +["features.securebackup.impl.setup_SecureBackupSetupViewChange_Day_0_en","features.securebackup.impl.setup_SecureBackupSetupViewChange_Night_0_en",20392,], +["features.securebackup.impl.setup_SecureBackupSetupViewChange_Day_1_en","features.securebackup.impl.setup_SecureBackupSetupViewChange_Night_1_en",20392,], +["features.securebackup.impl.setup_SecureBackupSetupViewChange_Day_2_en","features.securebackup.impl.setup_SecureBackupSetupViewChange_Night_2_en",20392,], +["features.securebackup.impl.setup_SecureBackupSetupViewChange_Day_3_en","features.securebackup.impl.setup_SecureBackupSetupViewChange_Night_3_en",20392,], +["features.securebackup.impl.setup_SecureBackupSetupViewChange_Day_4_en","features.securebackup.impl.setup_SecureBackupSetupViewChange_Night_4_en",20392,], +["features.securebackup.impl.setup_SecureBackupSetupViewChange_Day_5_en","features.securebackup.impl.setup_SecureBackupSetupViewChange_Night_5_en",20392,], +["features.securebackup.impl.setup_SecureBackupSetupView_Day_0_en","features.securebackup.impl.setup_SecureBackupSetupView_Night_0_en",20392,], +["features.securebackup.impl.setup_SecureBackupSetupView_Day_1_en","features.securebackup.impl.setup_SecureBackupSetupView_Night_1_en",20392,], +["features.securebackup.impl.setup_SecureBackupSetupView_Day_2_en","features.securebackup.impl.setup_SecureBackupSetupView_Night_2_en",20392,], +["features.securebackup.impl.setup_SecureBackupSetupView_Day_3_en","features.securebackup.impl.setup_SecureBackupSetupView_Night_3_en",20392,], +["features.securebackup.impl.setup_SecureBackupSetupView_Day_4_en","features.securebackup.impl.setup_SecureBackupSetupView_Night_4_en",20392,], +["features.securebackup.impl.setup_SecureBackupSetupView_Day_5_en","features.securebackup.impl.setup_SecureBackupSetupView_Night_5_en",20392,], +["features.roomdetails.impl.securityandprivacy_SecurityAndPrivacyViewDark_0_en","",20392,], +["features.roomdetails.impl.securityandprivacy_SecurityAndPrivacyViewDark_1_en","",20392,], +["features.roomdetails.impl.securityandprivacy_SecurityAndPrivacyViewDark_2_en","",20392,], +["features.roomdetails.impl.securityandprivacy_SecurityAndPrivacyViewDark_3_en","",20392,], +["features.roomdetails.impl.securityandprivacy_SecurityAndPrivacyViewDark_4_en","",20392,], +["features.roomdetails.impl.securityandprivacy_SecurityAndPrivacyViewDark_5_en","",20392,], +["features.roomdetails.impl.securityandprivacy_SecurityAndPrivacyViewDark_6_en","",20392,], +["features.roomdetails.impl.securityandprivacy_SecurityAndPrivacyViewDark_7_en","",20392,], +["features.roomdetails.impl.securityandprivacy_SecurityAndPrivacyViewDark_8_en","",20392,], +["features.roomdetails.impl.securityandprivacy_SecurityAndPrivacyViewDark_9_en","",20392,], +["features.roomdetails.impl.securityandprivacy_SecurityAndPrivacyViewLight_0_en","",20392,], +["features.roomdetails.impl.securityandprivacy_SecurityAndPrivacyViewLight_1_en","",20392,], +["features.roomdetails.impl.securityandprivacy_SecurityAndPrivacyViewLight_2_en","",20392,], +["features.roomdetails.impl.securityandprivacy_SecurityAndPrivacyViewLight_3_en","",20392,], +["features.roomdetails.impl.securityandprivacy_SecurityAndPrivacyViewLight_4_en","",20392,], +["features.roomdetails.impl.securityandprivacy_SecurityAndPrivacyViewLight_5_en","",20392,], +["features.roomdetails.impl.securityandprivacy_SecurityAndPrivacyViewLight_6_en","",20392,], +["features.roomdetails.impl.securityandprivacy_SecurityAndPrivacyViewLight_7_en","",20392,], +["features.roomdetails.impl.securityandprivacy_SecurityAndPrivacyViewLight_8_en","",20392,], +["features.roomdetails.impl.securityandprivacy_SecurityAndPrivacyViewLight_9_en","",20392,], ["libraries.designsystem.atomic.atoms_SelectedIndicatorAtom_Day_0_en","libraries.designsystem.atomic.atoms_SelectedIndicatorAtom_Night_0_en",0,], ["libraries.matrix.ui.components_SelectedRoomRtl_Day_0_en","libraries.matrix.ui.components_SelectedRoomRtl_Night_0_en",0,], ["libraries.matrix.ui.components_SelectedRoomRtl_Day_1_en","libraries.matrix.ui.components_SelectedRoomRtl_Night_1_en",0,], @@ -1120,11 +1121,11 @@ export const screenshots = [ ["libraries.matrix.ui.components_SelectedUser_Day_1_en","libraries.matrix.ui.components_SelectedUser_Night_1_en",0,], ["libraries.matrix.ui.components_SelectedUsersRowList_Day_0_en","libraries.matrix.ui.components_SelectedUsersRowList_Night_0_en",0,], ["libraries.textcomposer.components_SendButton_Day_0_en","libraries.textcomposer.components_SendButton_Night_0_en",0,], -["features.location.impl.send_SendLocationView_Day_0_en","features.location.impl.send_SendLocationView_Night_0_en",20385,], -["features.location.impl.send_SendLocationView_Day_1_en","features.location.impl.send_SendLocationView_Night_1_en",20385,], -["features.location.impl.send_SendLocationView_Day_2_en","features.location.impl.send_SendLocationView_Night_2_en",20385,], -["features.location.impl.send_SendLocationView_Day_3_en","features.location.impl.send_SendLocationView_Night_3_en",20385,], -["features.location.impl.send_SendLocationView_Day_4_en","features.location.impl.send_SendLocationView_Night_4_en",20385,], +["features.location.impl.send_SendLocationView_Day_0_en","features.location.impl.send_SendLocationView_Night_0_en",20392,], +["features.location.impl.send_SendLocationView_Day_1_en","features.location.impl.send_SendLocationView_Night_1_en",20392,], +["features.location.impl.send_SendLocationView_Day_2_en","features.location.impl.send_SendLocationView_Night_2_en",20392,], +["features.location.impl.send_SendLocationView_Day_3_en","features.location.impl.send_SendLocationView_Night_3_en",20392,], +["features.location.impl.send_SendLocationView_Day_4_en","features.location.impl.send_SendLocationView_Night_4_en",20392,], ["libraries.matrix.ui.messages.sender_SenderName_Day_0_en","libraries.matrix.ui.messages.sender_SenderName_Night_0_en",0,], ["libraries.matrix.ui.messages.sender_SenderName_Day_1_en","libraries.matrix.ui.messages.sender_SenderName_Night_1_en",0,], ["libraries.matrix.ui.messages.sender_SenderName_Day_2_en","libraries.matrix.ui.messages.sender_SenderName_Night_2_en",0,], @@ -1134,27 +1135,27 @@ export const screenshots = [ ["libraries.matrix.ui.messages.sender_SenderName_Day_6_en","libraries.matrix.ui.messages.sender_SenderName_Night_6_en",0,], ["libraries.matrix.ui.messages.sender_SenderName_Day_7_en","libraries.matrix.ui.messages.sender_SenderName_Night_7_en",0,], ["libraries.matrix.ui.messages.sender_SenderName_Day_8_en","libraries.matrix.ui.messages.sender_SenderName_Night_8_en",0,], -["features.verifysession.impl.incoming.ui_SessionDetailsView_Day_0_en","features.verifysession.impl.incoming.ui_SessionDetailsView_Night_0_en",20385,], -["features.home.impl.components_SetUpRecoveryKeyBanner_Day_0_en","features.home.impl.components_SetUpRecoveryKeyBanner_Night_0_en",20385,], -["features.lockscreen.impl.setup.biometric_SetupBiometricView_Day_0_en","features.lockscreen.impl.setup.biometric_SetupBiometricView_Night_0_en",20385,], -["features.lockscreen.impl.setup.pin_SetupPinView_Day_0_en","features.lockscreen.impl.setup.pin_SetupPinView_Night_0_en",20385,], -["features.lockscreen.impl.setup.pin_SetupPinView_Day_1_en","features.lockscreen.impl.setup.pin_SetupPinView_Night_1_en",20385,], -["features.lockscreen.impl.setup.pin_SetupPinView_Day_2_en","features.lockscreen.impl.setup.pin_SetupPinView_Night_2_en",20385,], -["features.lockscreen.impl.setup.pin_SetupPinView_Day_3_en","features.lockscreen.impl.setup.pin_SetupPinView_Night_3_en",20385,], -["features.lockscreen.impl.setup.pin_SetupPinView_Day_4_en","features.lockscreen.impl.setup.pin_SetupPinView_Night_4_en",20385,], +["features.verifysession.impl.incoming.ui_SessionDetailsView_Day_0_en","features.verifysession.impl.incoming.ui_SessionDetailsView_Night_0_en",20392,], +["features.home.impl.components_SetUpRecoveryKeyBanner_Day_0_en","features.home.impl.components_SetUpRecoveryKeyBanner_Night_0_en",20392,], +["features.lockscreen.impl.setup.biometric_SetupBiometricView_Day_0_en","features.lockscreen.impl.setup.biometric_SetupBiometricView_Night_0_en",20392,], +["features.lockscreen.impl.setup.pin_SetupPinView_Day_0_en","features.lockscreen.impl.setup.pin_SetupPinView_Night_0_en",20392,], +["features.lockscreen.impl.setup.pin_SetupPinView_Day_1_en","features.lockscreen.impl.setup.pin_SetupPinView_Night_1_en",20392,], +["features.lockscreen.impl.setup.pin_SetupPinView_Day_2_en","features.lockscreen.impl.setup.pin_SetupPinView_Night_2_en",20392,], +["features.lockscreen.impl.setup.pin_SetupPinView_Day_3_en","features.lockscreen.impl.setup.pin_SetupPinView_Night_3_en",20392,], +["features.lockscreen.impl.setup.pin_SetupPinView_Day_4_en","features.lockscreen.impl.setup.pin_SetupPinView_Night_4_en",20392,], ["features.share.impl_ShareView_Day_0_en","features.share.impl_ShareView_Night_0_en",0,], ["features.share.impl_ShareView_Day_1_en","features.share.impl_ShareView_Night_1_en",0,], ["features.share.impl_ShareView_Day_2_en","features.share.impl_ShareView_Night_2_en",0,], -["features.share.impl_ShareView_Day_3_en","features.share.impl_ShareView_Night_3_en",20385,], -["features.location.impl.show_ShowLocationView_Day_0_en","features.location.impl.show_ShowLocationView_Night_0_en",20385,], -["features.location.impl.show_ShowLocationView_Day_1_en","features.location.impl.show_ShowLocationView_Night_1_en",20385,], -["features.location.impl.show_ShowLocationView_Day_2_en","features.location.impl.show_ShowLocationView_Night_2_en",20385,], -["features.location.impl.show_ShowLocationView_Day_3_en","features.location.impl.show_ShowLocationView_Night_3_en",20385,], -["features.location.impl.show_ShowLocationView_Day_4_en","features.location.impl.show_ShowLocationView_Night_4_en",20385,], -["features.location.impl.show_ShowLocationView_Day_5_en","features.location.impl.show_ShowLocationView_Night_5_en",20385,], -["features.location.impl.show_ShowLocationView_Day_6_en","features.location.impl.show_ShowLocationView_Night_6_en",20385,], -["features.location.impl.show_ShowLocationView_Day_7_en","features.location.impl.show_ShowLocationView_Night_7_en",20385,], -["features.signedout.impl_SignedOutView_Day_0_en","features.signedout.impl_SignedOutView_Night_0_en",20385,], +["features.share.impl_ShareView_Day_3_en","features.share.impl_ShareView_Night_3_en",20392,], +["features.location.impl.show_ShowLocationView_Day_0_en","features.location.impl.show_ShowLocationView_Night_0_en",20392,], +["features.location.impl.show_ShowLocationView_Day_1_en","features.location.impl.show_ShowLocationView_Night_1_en",20392,], +["features.location.impl.show_ShowLocationView_Day_2_en","features.location.impl.show_ShowLocationView_Night_2_en",20392,], +["features.location.impl.show_ShowLocationView_Day_3_en","features.location.impl.show_ShowLocationView_Night_3_en",20392,], +["features.location.impl.show_ShowLocationView_Day_4_en","features.location.impl.show_ShowLocationView_Night_4_en",20392,], +["features.location.impl.show_ShowLocationView_Day_5_en","features.location.impl.show_ShowLocationView_Night_5_en",20392,], +["features.location.impl.show_ShowLocationView_Day_6_en","features.location.impl.show_ShowLocationView_Night_6_en",20392,], +["features.location.impl.show_ShowLocationView_Day_7_en","features.location.impl.show_ShowLocationView_Night_7_en",20392,], +["features.signedout.impl_SignedOutView_Day_0_en","features.signedout.impl_SignedOutView_Night_0_en",20392,], ["libraries.designsystem.components_SimpleModalBottomSheet_Day_0_en","libraries.designsystem.components_SimpleModalBottomSheet_Night_0_en",0,], ["libraries.designsystem.components.dialogs_SingleSelectionDialogContent_Dialogs_en","",0,], ["libraries.designsystem.components.dialogs_SingleSelectionDialog_Day_0_en","libraries.designsystem.components.dialogs_SingleSelectionDialog_Night_0_en",0,], @@ -1164,98 +1165,98 @@ export const screenshots = [ ["libraries.designsystem.components.list_SingleSelectionListItemUnselectedWithSupportingText_Single_selection_List_item_-_no_selection,_supporting_text_List_items_en","",0,], ["libraries.designsystem.components.list_SingleSelectionListItem_Single_selection_List_item_-_no_selection_List_items_en","",0,], ["libraries.designsystem.theme.components_Sliders_Sliders_en","",0,], -["features.login.impl.dialogs_SlidingSyncNotSupportedDialog_Day_0_en","features.login.impl.dialogs_SlidingSyncNotSupportedDialog_Night_0_en",20385,], +["features.login.impl.dialogs_SlidingSyncNotSupportedDialog_Day_0_en","features.login.impl.dialogs_SlidingSyncNotSupportedDialog_Night_0_en",20392,], ["libraries.designsystem.theme.components_SnackbarWithActionAndCloseButton_Snackbar_with_action_and_close_button_Snackbars_en","",0,], ["libraries.designsystem.theme.components_SnackbarWithActionOnNewLineAndCloseButton_Snackbar_with_action_and_close_button_on_new_line_Snackbars_en","",0,], ["libraries.designsystem.theme.components_SnackbarWithActionOnNewLine_Snackbar_with_action_on_new_line_Snackbars_en","",0,], ["libraries.designsystem.theme.components_SnackbarWithAction_Snackbar_with_action_Snackbars_en","",0,], ["libraries.designsystem.theme.components_Snackbar_Snackbar_Snackbars_en","",0,], -["features.announcement.impl.spaces_SpaceAnnouncementView_Day_0_en","features.announcement.impl.spaces_SpaceAnnouncementView_Night_0_en",20385,], +["features.announcement.impl.spaces_SpaceAnnouncementView_Day_0_en","features.announcement.impl.spaces_SpaceAnnouncementView_Night_0_en",20392,], ["libraries.designsystem.components.avatar.internal_SpaceAvatar_Avatars_en","",0,], -["libraries.matrix.ui.components_SpaceHeaderRootView_Day_0_en","libraries.matrix.ui.components_SpaceHeaderRootView_Night_0_en",20385,], -["libraries.matrix.ui.components_SpaceHeaderView_Day_0_en","libraries.matrix.ui.components_SpaceHeaderView_Night_0_en",20385,], -["libraries.matrix.ui.components_SpaceInfoRow_Day_0_en","libraries.matrix.ui.components_SpaceInfoRow_Night_0_en",20385,], +["libraries.matrix.ui.components_SpaceHeaderRootView_Day_0_en","libraries.matrix.ui.components_SpaceHeaderRootView_Night_0_en",20392,], +["libraries.matrix.ui.components_SpaceHeaderView_Day_0_en","libraries.matrix.ui.components_SpaceHeaderView_Night_0_en",20392,], +["libraries.matrix.ui.components_SpaceInfoRow_Day_0_en","libraries.matrix.ui.components_SpaceInfoRow_Night_0_en",20392,], ["libraries.matrix.ui.components_SpaceMembersViewNoHeroes_Day_0_en","libraries.matrix.ui.components_SpaceMembersViewNoHeroes_Night_0_en",0,], ["libraries.matrix.ui.components_SpaceMembersView_Day_0_en","libraries.matrix.ui.components_SpaceMembersView_Night_0_en",0,], -["libraries.matrix.ui.components_SpaceRoomItemView_Day_0_en","libraries.matrix.ui.components_SpaceRoomItemView_Night_0_en",20385,], -["libraries.matrix.ui.components_SpaceRoomItemView_Day_1_en","libraries.matrix.ui.components_SpaceRoomItemView_Night_1_en",20385,], -["libraries.matrix.ui.components_SpaceRoomItemView_Day_2_en","libraries.matrix.ui.components_SpaceRoomItemView_Night_2_en",20385,], -["libraries.matrix.ui.components_SpaceRoomItemView_Day_3_en","libraries.matrix.ui.components_SpaceRoomItemView_Night_3_en",20385,], -["libraries.matrix.ui.components_SpaceRoomItemView_Day_4_en","libraries.matrix.ui.components_SpaceRoomItemView_Night_4_en",20385,], -["libraries.matrix.ui.components_SpaceRoomItemView_Day_5_en","libraries.matrix.ui.components_SpaceRoomItemView_Night_5_en",20385,], -["libraries.matrix.ui.components_SpaceRoomItemView_Day_6_en","libraries.matrix.ui.components_SpaceRoomItemView_Night_6_en",20385,], -["libraries.matrix.ui.components_SpaceRoomItemView_Day_7_en","libraries.matrix.ui.components_SpaceRoomItemView_Night_7_en",20385,], -["libraries.matrix.ui.components_SpaceRoomItemView_Day_8_en","libraries.matrix.ui.components_SpaceRoomItemView_Night_8_en",20385,], -["features.space.impl.root_SpaceView_Day_0_en","features.space.impl.root_SpaceView_Night_0_en",20385,], -["features.space.impl.root_SpaceView_Day_1_en","features.space.impl.root_SpaceView_Night_1_en",20385,], -["features.space.impl.root_SpaceView_Day_2_en","features.space.impl.root_SpaceView_Night_2_en",20385,], -["features.space.impl.root_SpaceView_Day_3_en","features.space.impl.root_SpaceView_Night_3_en",20385,], -["features.space.impl.root_SpaceView_Day_4_en","features.space.impl.root_SpaceView_Night_4_en",20385,], -["features.space.impl.root_SpaceView_Day_5_en","features.space.impl.root_SpaceView_Night_5_en",20385,], +["libraries.matrix.ui.components_SpaceRoomItemView_Day_0_en","libraries.matrix.ui.components_SpaceRoomItemView_Night_0_en",20392,], +["libraries.matrix.ui.components_SpaceRoomItemView_Day_1_en","libraries.matrix.ui.components_SpaceRoomItemView_Night_1_en",20392,], +["libraries.matrix.ui.components_SpaceRoomItemView_Day_2_en","libraries.matrix.ui.components_SpaceRoomItemView_Night_2_en",20392,], +["libraries.matrix.ui.components_SpaceRoomItemView_Day_3_en","libraries.matrix.ui.components_SpaceRoomItemView_Night_3_en",20392,], +["libraries.matrix.ui.components_SpaceRoomItemView_Day_4_en","libraries.matrix.ui.components_SpaceRoomItemView_Night_4_en",20392,], +["libraries.matrix.ui.components_SpaceRoomItemView_Day_5_en","libraries.matrix.ui.components_SpaceRoomItemView_Night_5_en",20392,], +["libraries.matrix.ui.components_SpaceRoomItemView_Day_6_en","libraries.matrix.ui.components_SpaceRoomItemView_Night_6_en",20392,], +["libraries.matrix.ui.components_SpaceRoomItemView_Day_7_en","libraries.matrix.ui.components_SpaceRoomItemView_Night_7_en",20392,], +["libraries.matrix.ui.components_SpaceRoomItemView_Day_8_en","libraries.matrix.ui.components_SpaceRoomItemView_Night_8_en",20392,], +["features.space.impl.root_SpaceView_Day_0_en","features.space.impl.root_SpaceView_Night_0_en",20392,], +["features.space.impl.root_SpaceView_Day_1_en","features.space.impl.root_SpaceView_Night_1_en",20392,], +["features.space.impl.root_SpaceView_Day_2_en","features.space.impl.root_SpaceView_Night_2_en",20392,], +["features.space.impl.root_SpaceView_Day_3_en","features.space.impl.root_SpaceView_Night_3_en",20392,], +["features.space.impl.root_SpaceView_Day_4_en","features.space.impl.root_SpaceView_Night_4_en",20392,], +["features.space.impl.root_SpaceView_Day_5_en","features.space.impl.root_SpaceView_Night_5_en",20392,], ["libraries.designsystem.modifiers_SquareSizeModifierInsideSquare_en","",0,], ["libraries.designsystem.modifiers_SquareSizeModifierLargeHeight_en","",0,], ["libraries.designsystem.modifiers_SquareSizeModifierLargeWidth_en","",0,], -["features.startchat.impl.root_StartChatView_Day_0_en","features.startchat.impl.root_StartChatView_Night_0_en",20385,], -["features.startchat.impl.root_StartChatView_Day_1_en","features.startchat.impl.root_StartChatView_Night_1_en",20385,], -["features.startchat.impl.root_StartChatView_Day_2_en","features.startchat.impl.root_StartChatView_Night_2_en",20385,], -["features.startchat.impl.root_StartChatView_Day_3_en","features.startchat.impl.root_StartChatView_Night_3_en",20385,], -["features.startchat.impl.root_StartChatView_Day_4_en","features.startchat.impl.root_StartChatView_Night_4_en",20385,], -["features.startchat.impl.root_StartChatView_Day_5_en","features.startchat.impl.root_StartChatView_Night_5_en",20385,], -["features.location.api.internal_StaticMapPlaceholder_Day_0_en","features.location.api.internal_StaticMapPlaceholder_Night_0_en",20385,], +["features.startchat.impl.root_StartChatView_Day_0_en","features.startchat.impl.root_StartChatView_Night_0_en",20392,], +["features.startchat.impl.root_StartChatView_Day_1_en","features.startchat.impl.root_StartChatView_Night_1_en",20392,], +["features.startchat.impl.root_StartChatView_Day_2_en","features.startchat.impl.root_StartChatView_Night_2_en",20392,], +["features.startchat.impl.root_StartChatView_Day_3_en","features.startchat.impl.root_StartChatView_Night_3_en",20392,], +["features.startchat.impl.root_StartChatView_Day_4_en","features.startchat.impl.root_StartChatView_Night_4_en",20392,], +["features.startchat.impl.root_StartChatView_Day_5_en","features.startchat.impl.root_StartChatView_Night_5_en",20392,], +["features.location.api.internal_StaticMapPlaceholder_Day_0_en","features.location.api.internal_StaticMapPlaceholder_Night_0_en",20392,], ["features.location.api_StaticMapView_Day_0_en","features.location.api_StaticMapView_Night_0_en",0,], -["features.messages.impl.messagecomposer.suggestions_SuggestionsPickerView_Day_0_en","features.messages.impl.messagecomposer.suggestions_SuggestionsPickerView_Night_0_en",20385,], +["features.messages.impl.messagecomposer.suggestions_SuggestionsPickerView_Day_0_en","features.messages.impl.messagecomposer.suggestions_SuggestionsPickerView_Night_0_en",20392,], ["libraries.designsystem.atomic.pages_SunsetPage_Day_0_en","libraries.designsystem.atomic.pages_SunsetPage_Night_0_en",0,], ["libraries.designsystem.components.button_SuperButton_Day_0_en","libraries.designsystem.components.button_SuperButton_Night_0_en",0,], ["libraries.designsystem.theme.components_Surface_en","",0,], ["libraries.designsystem.theme.components_Switch_Toggles_en","",0,], -["appnav.loggedin_SyncStateView_Day_0_en","appnav.loggedin_SyncStateView_Night_0_en",20385,], +["appnav.loggedin_SyncStateView_Day_0_en","appnav.loggedin_SyncStateView_Night_0_en",20392,], ["libraries.designsystem.components.avatar.internal_TextAvatar_Avatars_en","",0,], ["libraries.designsystem.theme.components_TextButtonLargeLowPadding_Buttons_en","",0,], ["libraries.designsystem.theme.components_TextButtonLarge_Buttons_en","",0,], ["libraries.designsystem.theme.components_TextButtonMediumLowPadding_Buttons_en","",0,], ["libraries.designsystem.theme.components_TextButtonMedium_Buttons_en","",0,], ["libraries.designsystem.theme.components_TextButtonSmall_Buttons_en","",0,], -["libraries.textcomposer_TextComposerAddCaption_Day_0_en","libraries.textcomposer_TextComposerAddCaption_Night_0_en",20385,], -["libraries.textcomposer_TextComposerCaption_Day_0_en","libraries.textcomposer_TextComposerCaption_Night_0_en",20385,], -["libraries.textcomposer_TextComposerEditCaption_Day_0_en","libraries.textcomposer_TextComposerEditCaption_Night_0_en",20385,], -["libraries.textcomposer_TextComposerEditNotEncrypted_Day_0_en","libraries.textcomposer_TextComposerEditNotEncrypted_Night_0_en",20385,], -["libraries.textcomposer_TextComposerEdit_Day_0_en","libraries.textcomposer_TextComposerEdit_Night_0_en",20385,], -["libraries.textcomposer_TextComposerFormattingNotEncrypted_Day_0_en","libraries.textcomposer_TextComposerFormattingNotEncrypted_Night_0_en",20385,], -["libraries.textcomposer_TextComposerFormatting_Day_0_en","libraries.textcomposer_TextComposerFormatting_Night_0_en",20385,], -["libraries.textcomposer_TextComposerLinkDialogCreateLinkWithoutText_Day_0_en","libraries.textcomposer_TextComposerLinkDialogCreateLinkWithoutText_Night_0_en",20385,], -["libraries.textcomposer_TextComposerLinkDialogCreateLink_Day_0_en","libraries.textcomposer_TextComposerLinkDialogCreateLink_Night_0_en",20385,], -["libraries.textcomposer_TextComposerLinkDialogEditLink_Day_0_en","libraries.textcomposer_TextComposerLinkDialogEditLink_Night_0_en",20385,], -["libraries.textcomposer_TextComposerReplyNotEncrypted_Day_0_en","libraries.textcomposer_TextComposerReplyNotEncrypted_Night_0_en",20385,], -["libraries.textcomposer_TextComposerReplyNotEncrypted_Day_10_en","libraries.textcomposer_TextComposerReplyNotEncrypted_Night_10_en",20385,], -["libraries.textcomposer_TextComposerReplyNotEncrypted_Day_11_en","libraries.textcomposer_TextComposerReplyNotEncrypted_Night_11_en",20385,], -["libraries.textcomposer_TextComposerReplyNotEncrypted_Day_1_en","libraries.textcomposer_TextComposerReplyNotEncrypted_Night_1_en",20385,], -["libraries.textcomposer_TextComposerReplyNotEncrypted_Day_2_en","libraries.textcomposer_TextComposerReplyNotEncrypted_Night_2_en",20385,], -["libraries.textcomposer_TextComposerReplyNotEncrypted_Day_3_en","libraries.textcomposer_TextComposerReplyNotEncrypted_Night_3_en",20385,], -["libraries.textcomposer_TextComposerReplyNotEncrypted_Day_4_en","libraries.textcomposer_TextComposerReplyNotEncrypted_Night_4_en",20385,], -["libraries.textcomposer_TextComposerReplyNotEncrypted_Day_5_en","libraries.textcomposer_TextComposerReplyNotEncrypted_Night_5_en",20385,], -["libraries.textcomposer_TextComposerReplyNotEncrypted_Day_6_en","libraries.textcomposer_TextComposerReplyNotEncrypted_Night_6_en",20385,], -["libraries.textcomposer_TextComposerReplyNotEncrypted_Day_7_en","libraries.textcomposer_TextComposerReplyNotEncrypted_Night_7_en",20385,], -["libraries.textcomposer_TextComposerReplyNotEncrypted_Day_8_en","libraries.textcomposer_TextComposerReplyNotEncrypted_Night_8_en",20385,], -["libraries.textcomposer_TextComposerReplyNotEncrypted_Day_9_en","libraries.textcomposer_TextComposerReplyNotEncrypted_Night_9_en",20385,], -["libraries.textcomposer_TextComposerReply_Day_0_en","libraries.textcomposer_TextComposerReply_Night_0_en",20385,], -["libraries.textcomposer_TextComposerReply_Day_10_en","libraries.textcomposer_TextComposerReply_Night_10_en",20385,], -["libraries.textcomposer_TextComposerReply_Day_11_en","libraries.textcomposer_TextComposerReply_Night_11_en",20385,], -["libraries.textcomposer_TextComposerReply_Day_1_en","libraries.textcomposer_TextComposerReply_Night_1_en",20385,], -["libraries.textcomposer_TextComposerReply_Day_2_en","libraries.textcomposer_TextComposerReply_Night_2_en",20385,], -["libraries.textcomposer_TextComposerReply_Day_3_en","libraries.textcomposer_TextComposerReply_Night_3_en",20385,], -["libraries.textcomposer_TextComposerReply_Day_4_en","libraries.textcomposer_TextComposerReply_Night_4_en",20385,], -["libraries.textcomposer_TextComposerReply_Day_5_en","libraries.textcomposer_TextComposerReply_Night_5_en",20385,], -["libraries.textcomposer_TextComposerReply_Day_6_en","libraries.textcomposer_TextComposerReply_Night_6_en",20385,], -["libraries.textcomposer_TextComposerReply_Day_7_en","libraries.textcomposer_TextComposerReply_Night_7_en",20385,], -["libraries.textcomposer_TextComposerReply_Day_8_en","libraries.textcomposer_TextComposerReply_Night_8_en",20385,], -["libraries.textcomposer_TextComposerReply_Day_9_en","libraries.textcomposer_TextComposerReply_Night_9_en",20385,], -["libraries.textcomposer_TextComposerSimpleNotEncrypted_Day_0_en","libraries.textcomposer_TextComposerSimpleNotEncrypted_Night_0_en",20385,], -["libraries.textcomposer_TextComposerSimple_Day_0_en","libraries.textcomposer_TextComposerSimple_Night_0_en",20385,], -["libraries.textcomposer_TextComposerVoiceNotEncrypted_Day_0_en","libraries.textcomposer_TextComposerVoiceNotEncrypted_Night_0_en",20385,], +["libraries.textcomposer_TextComposerAddCaption_Day_0_en","libraries.textcomposer_TextComposerAddCaption_Night_0_en",20392,], +["libraries.textcomposer_TextComposerCaption_Day_0_en","libraries.textcomposer_TextComposerCaption_Night_0_en",20392,], +["libraries.textcomposer_TextComposerEditCaption_Day_0_en","libraries.textcomposer_TextComposerEditCaption_Night_0_en",20392,], +["libraries.textcomposer_TextComposerEditNotEncrypted_Day_0_en","libraries.textcomposer_TextComposerEditNotEncrypted_Night_0_en",20392,], +["libraries.textcomposer_TextComposerEdit_Day_0_en","libraries.textcomposer_TextComposerEdit_Night_0_en",20392,], +["libraries.textcomposer_TextComposerFormattingNotEncrypted_Day_0_en","libraries.textcomposer_TextComposerFormattingNotEncrypted_Night_0_en",20392,], +["libraries.textcomposer_TextComposerFormatting_Day_0_en","libraries.textcomposer_TextComposerFormatting_Night_0_en",20392,], +["libraries.textcomposer_TextComposerLinkDialogCreateLinkWithoutText_Day_0_en","libraries.textcomposer_TextComposerLinkDialogCreateLinkWithoutText_Night_0_en",20392,], +["libraries.textcomposer_TextComposerLinkDialogCreateLink_Day_0_en","libraries.textcomposer_TextComposerLinkDialogCreateLink_Night_0_en",20392,], +["libraries.textcomposer_TextComposerLinkDialogEditLink_Day_0_en","libraries.textcomposer_TextComposerLinkDialogEditLink_Night_0_en",20392,], +["libraries.textcomposer_TextComposerReplyNotEncrypted_Day_0_en","libraries.textcomposer_TextComposerReplyNotEncrypted_Night_0_en",20392,], +["libraries.textcomposer_TextComposerReplyNotEncrypted_Day_10_en","libraries.textcomposer_TextComposerReplyNotEncrypted_Night_10_en",20392,], +["libraries.textcomposer_TextComposerReplyNotEncrypted_Day_11_en","libraries.textcomposer_TextComposerReplyNotEncrypted_Night_11_en",20392,], +["libraries.textcomposer_TextComposerReplyNotEncrypted_Day_1_en","libraries.textcomposer_TextComposerReplyNotEncrypted_Night_1_en",20392,], +["libraries.textcomposer_TextComposerReplyNotEncrypted_Day_2_en","libraries.textcomposer_TextComposerReplyNotEncrypted_Night_2_en",20392,], +["libraries.textcomposer_TextComposerReplyNotEncrypted_Day_3_en","libraries.textcomposer_TextComposerReplyNotEncrypted_Night_3_en",20392,], +["libraries.textcomposer_TextComposerReplyNotEncrypted_Day_4_en","libraries.textcomposer_TextComposerReplyNotEncrypted_Night_4_en",20392,], +["libraries.textcomposer_TextComposerReplyNotEncrypted_Day_5_en","libraries.textcomposer_TextComposerReplyNotEncrypted_Night_5_en",20392,], +["libraries.textcomposer_TextComposerReplyNotEncrypted_Day_6_en","libraries.textcomposer_TextComposerReplyNotEncrypted_Night_6_en",20392,], +["libraries.textcomposer_TextComposerReplyNotEncrypted_Day_7_en","libraries.textcomposer_TextComposerReplyNotEncrypted_Night_7_en",20392,], +["libraries.textcomposer_TextComposerReplyNotEncrypted_Day_8_en","libraries.textcomposer_TextComposerReplyNotEncrypted_Night_8_en",20392,], +["libraries.textcomposer_TextComposerReplyNotEncrypted_Day_9_en","libraries.textcomposer_TextComposerReplyNotEncrypted_Night_9_en",20392,], +["libraries.textcomposer_TextComposerReply_Day_0_en","libraries.textcomposer_TextComposerReply_Night_0_en",20392,], +["libraries.textcomposer_TextComposerReply_Day_10_en","libraries.textcomposer_TextComposerReply_Night_10_en",20392,], +["libraries.textcomposer_TextComposerReply_Day_11_en","libraries.textcomposer_TextComposerReply_Night_11_en",20392,], +["libraries.textcomposer_TextComposerReply_Day_1_en","libraries.textcomposer_TextComposerReply_Night_1_en",20392,], +["libraries.textcomposer_TextComposerReply_Day_2_en","libraries.textcomposer_TextComposerReply_Night_2_en",20392,], +["libraries.textcomposer_TextComposerReply_Day_3_en","libraries.textcomposer_TextComposerReply_Night_3_en",20392,], +["libraries.textcomposer_TextComposerReply_Day_4_en","libraries.textcomposer_TextComposerReply_Night_4_en",20392,], +["libraries.textcomposer_TextComposerReply_Day_5_en","libraries.textcomposer_TextComposerReply_Night_5_en",20392,], +["libraries.textcomposer_TextComposerReply_Day_6_en","libraries.textcomposer_TextComposerReply_Night_6_en",20392,], +["libraries.textcomposer_TextComposerReply_Day_7_en","libraries.textcomposer_TextComposerReply_Night_7_en",20392,], +["libraries.textcomposer_TextComposerReply_Day_8_en","libraries.textcomposer_TextComposerReply_Night_8_en",20392,], +["libraries.textcomposer_TextComposerReply_Day_9_en","libraries.textcomposer_TextComposerReply_Night_9_en",20392,], +["libraries.textcomposer_TextComposerSimpleNotEncrypted_Day_0_en","libraries.textcomposer_TextComposerSimpleNotEncrypted_Night_0_en",20392,], +["libraries.textcomposer_TextComposerSimple_Day_0_en","libraries.textcomposer_TextComposerSimple_Night_0_en",20392,], +["libraries.textcomposer_TextComposerVoiceNotEncrypted_Day_0_en","libraries.textcomposer_TextComposerVoiceNotEncrypted_Night_0_en",20392,], ["libraries.textcomposer_TextComposerVoice_Day_0_en","libraries.textcomposer_TextComposerVoice_Night_0_en",0,], ["libraries.designsystem.theme.components_TextDark_Text_en","",0,], -["libraries.designsystem.components.dialogs_TextFieldDialogWithError_Day_0_en","libraries.designsystem.components.dialogs_TextFieldDialogWithError_Night_0_en",20385,], -["libraries.designsystem.components.dialogs_TextFieldDialog_Day_0_en","libraries.designsystem.components.dialogs_TextFieldDialog_Night_0_en",20385,], +["libraries.designsystem.components.dialogs_TextFieldDialogWithError_Day_0_en","libraries.designsystem.components.dialogs_TextFieldDialogWithError_Night_0_en",20392,], +["libraries.designsystem.components.dialogs_TextFieldDialog_Day_0_en","libraries.designsystem.components.dialogs_TextFieldDialog_Night_0_en",20392,], ["libraries.designsystem.components.list_TextFieldListItemEmpty_Text_field_List_item_-_empty_List_items_en","",0,], ["libraries.designsystem.components.list_TextFieldListItemTextFieldValue_Text_field_List_item_-_textfieldvalue_List_items_en","",0,], ["libraries.designsystem.components.list_TextFieldListItem_Text_field_List_item_-_text_List_items_en","",0,], @@ -1267,16 +1268,16 @@ export const screenshots = [ ["libraries.mediaviewer.impl.local.txt_TextFileContentView_Day_3_en","libraries.mediaviewer.impl.local.txt_TextFileContentView_Night_3_en",0,], ["libraries.textcomposer.components_TextFormatting_Day_0_en","libraries.textcomposer.components_TextFormatting_Night_0_en",0,], ["libraries.designsystem.theme.components_TextLight_Text_en","",0,], -["features.messages.impl.timeline.components_ThreadSummaryView_Day_0_en","features.messages.impl.timeline.components_ThreadSummaryView_Night_0_en",20385,], -["features.messages.impl.topbars_ThreadTopBar_Day_0_en","features.messages.impl.topbars_ThreadTopBar_Night_0_en",20385,], -["libraries.designsystem.theme.components.previews_TimePickerHorizontal_DateTime_pickers_en","",20385,], -["libraries.designsystem.theme.components.previews_TimePickerVerticalDark_DateTime_pickers_en","",20385,], -["libraries.designsystem.theme.components.previews_TimePickerVerticalLight_DateTime_pickers_en","",20385,], +["features.messages.impl.timeline.components_ThreadSummaryView_Day_0_en","features.messages.impl.timeline.components_ThreadSummaryView_Night_0_en",20392,], +["features.messages.impl.topbars_ThreadTopBar_Day_0_en","features.messages.impl.topbars_ThreadTopBar_Night_0_en",20392,], +["libraries.designsystem.theme.components.previews_TimePickerHorizontal_DateTime_pickers_en","",20392,], +["libraries.designsystem.theme.components.previews_TimePickerVerticalDark_DateTime_pickers_en","",20392,], +["libraries.designsystem.theme.components.previews_TimePickerVerticalLight_DateTime_pickers_en","",20392,], ["features.messages.impl.timeline.components_TimelineEventTimestampView_Day_0_en","features.messages.impl.timeline.components_TimelineEventTimestampView_Night_0_en",0,], ["features.messages.impl.timeline.components_TimelineEventTimestampView_Day_1_en","features.messages.impl.timeline.components_TimelineEventTimestampView_Night_1_en",0,], ["features.messages.impl.timeline.components_TimelineEventTimestampView_Day_2_en","features.messages.impl.timeline.components_TimelineEventTimestampView_Night_2_en",0,], -["features.messages.impl.timeline.components_TimelineEventTimestampView_Day_3_en","features.messages.impl.timeline.components_TimelineEventTimestampView_Night_3_en",20385,], -["features.messages.impl.timeline.components_TimelineEventTimestampView_Day_4_en","features.messages.impl.timeline.components_TimelineEventTimestampView_Night_4_en",20385,], +["features.messages.impl.timeline.components_TimelineEventTimestampView_Day_3_en","features.messages.impl.timeline.components_TimelineEventTimestampView_Night_3_en",20392,], +["features.messages.impl.timeline.components_TimelineEventTimestampView_Day_4_en","features.messages.impl.timeline.components_TimelineEventTimestampView_Night_4_en",20392,], ["features.messages.impl.timeline.components_TimelineEventTimestampView_Day_5_en","features.messages.impl.timeline.components_TimelineEventTimestampView_Night_5_en",0,], ["features.messages.impl.timeline.components_TimelineEventTimestampView_Day_6_en","features.messages.impl.timeline.components_TimelineEventTimestampView_Night_6_en",0,], ["features.messages.impl.timeline.components_TimelineEventTimestampView_Day_7_en","features.messages.impl.timeline.components_TimelineEventTimestampView_Night_7_en",0,], @@ -1286,18 +1287,18 @@ export const screenshots = [ ["features.messages.impl.timeline.components.event_TimelineItemAudioView_Day_2_en","features.messages.impl.timeline.components.event_TimelineItemAudioView_Night_2_en",0,], ["features.messages.impl.timeline.components.event_TimelineItemAudioView_Day_3_en","features.messages.impl.timeline.components.event_TimelineItemAudioView_Night_3_en",0,], ["features.messages.impl.timeline.components.event_TimelineItemAudioView_Day_4_en","features.messages.impl.timeline.components.event_TimelineItemAudioView_Night_4_en",0,], -["features.messages.impl.timeline.components_TimelineItemCallNotifyView_Day_0_en","features.messages.impl.timeline.components_TimelineItemCallNotifyView_Night_0_en",20385,], +["features.messages.impl.timeline.components_TimelineItemCallNotifyView_Day_0_en","features.messages.impl.timeline.components_TimelineItemCallNotifyView_Night_0_en",20392,], ["features.messages.impl.timeline.components.virtual_TimelineItemDaySeparatorView_Day_0_en","features.messages.impl.timeline.components.virtual_TimelineItemDaySeparatorView_Night_0_en",0,], ["features.messages.impl.timeline.components.virtual_TimelineItemDaySeparatorView_Day_1_en","features.messages.impl.timeline.components.virtual_TimelineItemDaySeparatorView_Night_1_en",0,], -["features.messages.impl.timeline.components.event_TimelineItemEncryptedView_Day_0_en","features.messages.impl.timeline.components.event_TimelineItemEncryptedView_Night_0_en",20385,], -["features.messages.impl.timeline.components.event_TimelineItemEncryptedView_Day_1_en","features.messages.impl.timeline.components.event_TimelineItemEncryptedView_Night_1_en",20385,], -["features.messages.impl.timeline.components.event_TimelineItemEncryptedView_Day_2_en","features.messages.impl.timeline.components.event_TimelineItemEncryptedView_Night_2_en",20385,], -["features.messages.impl.timeline.components.event_TimelineItemEncryptedView_Day_3_en","features.messages.impl.timeline.components.event_TimelineItemEncryptedView_Night_3_en",20385,], -["features.messages.impl.timeline.components.event_TimelineItemEncryptedView_Day_4_en","features.messages.impl.timeline.components.event_TimelineItemEncryptedView_Night_4_en",20385,], -["features.messages.impl.timeline.components.event_TimelineItemEncryptedView_Day_5_en","features.messages.impl.timeline.components.event_TimelineItemEncryptedView_Night_5_en",20385,], -["features.messages.impl.timeline.components.event_TimelineItemEncryptedView_Day_6_en","features.messages.impl.timeline.components.event_TimelineItemEncryptedView_Night_6_en",20385,], -["features.messages.impl.timeline.components.event_TimelineItemEncryptedView_Day_7_en","features.messages.impl.timeline.components.event_TimelineItemEncryptedView_Night_7_en",20385,], -["features.messages.impl.timeline.components.event_TimelineItemEncryptedView_Day_8_en","features.messages.impl.timeline.components.event_TimelineItemEncryptedView_Night_8_en",20385,], +["features.messages.impl.timeline.components.event_TimelineItemEncryptedView_Day_0_en","features.messages.impl.timeline.components.event_TimelineItemEncryptedView_Night_0_en",20392,], +["features.messages.impl.timeline.components.event_TimelineItemEncryptedView_Day_1_en","features.messages.impl.timeline.components.event_TimelineItemEncryptedView_Night_1_en",20392,], +["features.messages.impl.timeline.components.event_TimelineItemEncryptedView_Day_2_en","features.messages.impl.timeline.components.event_TimelineItemEncryptedView_Night_2_en",20392,], +["features.messages.impl.timeline.components.event_TimelineItemEncryptedView_Day_3_en","features.messages.impl.timeline.components.event_TimelineItemEncryptedView_Night_3_en",20392,], +["features.messages.impl.timeline.components.event_TimelineItemEncryptedView_Day_4_en","features.messages.impl.timeline.components.event_TimelineItemEncryptedView_Night_4_en",20392,], +["features.messages.impl.timeline.components.event_TimelineItemEncryptedView_Day_5_en","features.messages.impl.timeline.components.event_TimelineItemEncryptedView_Night_5_en",20392,], +["features.messages.impl.timeline.components.event_TimelineItemEncryptedView_Day_6_en","features.messages.impl.timeline.components.event_TimelineItemEncryptedView_Night_6_en",20392,], +["features.messages.impl.timeline.components.event_TimelineItemEncryptedView_Day_7_en","features.messages.impl.timeline.components.event_TimelineItemEncryptedView_Night_7_en",20392,], +["features.messages.impl.timeline.components.event_TimelineItemEncryptedView_Day_8_en","features.messages.impl.timeline.components.event_TimelineItemEncryptedView_Night_8_en",20392,], ["features.messages.impl.timeline.components_TimelineItemEventRowDisambiguated_Day_0_en","features.messages.impl.timeline.components_TimelineItemEventRowDisambiguated_Night_0_en",0,], ["features.messages.impl.timeline.components_TimelineItemEventRowForDirectRoom_Day_0_en","features.messages.impl.timeline.components_TimelineItemEventRowForDirectRoom_Night_0_en",0,], ["features.messages.impl.timeline.components_TimelineItemEventRowLongSenderName_en","",0,], @@ -1305,18 +1306,18 @@ export const screenshots = [ ["features.messages.impl.timeline.components_TimelineItemEventRowTimestamp_Day_0_en","features.messages.impl.timeline.components_TimelineItemEventRowTimestamp_Night_0_en",0,], ["features.messages.impl.timeline.components_TimelineItemEventRowTimestamp_Day_1_en","features.messages.impl.timeline.components_TimelineItemEventRowTimestamp_Night_1_en",0,], ["features.messages.impl.timeline.components_TimelineItemEventRowTimestamp_Day_2_en","features.messages.impl.timeline.components_TimelineItemEventRowTimestamp_Night_2_en",0,], -["features.messages.impl.timeline.components_TimelineItemEventRowTimestamp_Day_3_en","features.messages.impl.timeline.components_TimelineItemEventRowTimestamp_Night_3_en",20385,], -["features.messages.impl.timeline.components_TimelineItemEventRowTimestamp_Day_4_en","features.messages.impl.timeline.components_TimelineItemEventRowTimestamp_Night_4_en",20385,], +["features.messages.impl.timeline.components_TimelineItemEventRowTimestamp_Day_3_en","features.messages.impl.timeline.components_TimelineItemEventRowTimestamp_Night_3_en",20392,], +["features.messages.impl.timeline.components_TimelineItemEventRowTimestamp_Day_4_en","features.messages.impl.timeline.components_TimelineItemEventRowTimestamp_Night_4_en",20392,], ["features.messages.impl.timeline.components_TimelineItemEventRowTimestamp_Day_5_en","features.messages.impl.timeline.components_TimelineItemEventRowTimestamp_Night_5_en",0,], ["features.messages.impl.timeline.components_TimelineItemEventRowTimestamp_Day_6_en","features.messages.impl.timeline.components_TimelineItemEventRowTimestamp_Night_6_en",0,], -["features.messages.impl.timeline.components_TimelineItemEventRowTimestamp_Day_7_en","features.messages.impl.timeline.components_TimelineItemEventRowTimestamp_Night_7_en",20385,], -["features.messages.impl.timeline.components_TimelineItemEventRowUtd_Day_0_en","features.messages.impl.timeline.components_TimelineItemEventRowUtd_Night_0_en",20385,], -["features.messages.impl.timeline.components_TimelineItemEventRowWithManyReactions_Day_0_en","features.messages.impl.timeline.components_TimelineItemEventRowWithManyReactions_Night_0_en",20385,], +["features.messages.impl.timeline.components_TimelineItemEventRowTimestamp_Day_7_en","features.messages.impl.timeline.components_TimelineItemEventRowTimestamp_Night_7_en",20392,], +["features.messages.impl.timeline.components_TimelineItemEventRowUtd_Day_0_en","features.messages.impl.timeline.components_TimelineItemEventRowUtd_Night_0_en",20392,], +["features.messages.impl.timeline.components_TimelineItemEventRowWithManyReactions_Day_0_en","features.messages.impl.timeline.components_TimelineItemEventRowWithManyReactions_Night_0_en",20392,], ["features.messages.impl.timeline.components_TimelineItemEventRowWithRR_Day_0_en","features.messages.impl.timeline.components_TimelineItemEventRowWithRR_Night_0_en",0,], ["features.messages.impl.timeline.components_TimelineItemEventRowWithRR_Day_1_en","features.messages.impl.timeline.components_TimelineItemEventRowWithRR_Night_1_en",0,], ["features.messages.impl.timeline.components_TimelineItemEventRowWithRR_Day_2_en","features.messages.impl.timeline.components_TimelineItemEventRowWithRR_Night_2_en",0,], -["features.messages.impl.timeline.components_TimelineItemEventRowWithReplyInformative_Day_0_en","features.messages.impl.timeline.components_TimelineItemEventRowWithReplyInformative_Night_0_en",20385,], -["features.messages.impl.timeline.components_TimelineItemEventRowWithReplyInformative_Day_1_en","features.messages.impl.timeline.components_TimelineItemEventRowWithReplyInformative_Night_1_en",20385,], +["features.messages.impl.timeline.components_TimelineItemEventRowWithReplyInformative_Day_0_en","features.messages.impl.timeline.components_TimelineItemEventRowWithReplyInformative_Night_0_en",20392,], +["features.messages.impl.timeline.components_TimelineItemEventRowWithReplyInformative_Day_1_en","features.messages.impl.timeline.components_TimelineItemEventRowWithReplyInformative_Night_1_en",20392,], ["features.messages.impl.timeline.components_TimelineItemEventRowWithReplyOther_Day_0_en","features.messages.impl.timeline.components_TimelineItemEventRowWithReplyOther_Night_0_en",0,], ["features.messages.impl.timeline.components_TimelineItemEventRowWithReplyOther_Day_1_en","features.messages.impl.timeline.components_TimelineItemEventRowWithReplyOther_Night_1_en",0,], ["features.messages.impl.timeline.components_TimelineItemEventRowWithReply_Day_0_en","features.messages.impl.timeline.components_TimelineItemEventRowWithReply_Night_0_en",0,], @@ -1325,41 +1326,41 @@ export const screenshots = [ ["features.messages.impl.timeline.components_TimelineItemEventRowWithReply_Day_1_en","features.messages.impl.timeline.components_TimelineItemEventRowWithReply_Night_1_en",0,], ["features.messages.impl.timeline.components_TimelineItemEventRowWithReply_Day_2_en","features.messages.impl.timeline.components_TimelineItemEventRowWithReply_Night_2_en",0,], ["features.messages.impl.timeline.components_TimelineItemEventRowWithReply_Day_3_en","features.messages.impl.timeline.components_TimelineItemEventRowWithReply_Night_3_en",0,], -["features.messages.impl.timeline.components_TimelineItemEventRowWithReply_Day_4_en","features.messages.impl.timeline.components_TimelineItemEventRowWithReply_Night_4_en",20385,], +["features.messages.impl.timeline.components_TimelineItemEventRowWithReply_Day_4_en","features.messages.impl.timeline.components_TimelineItemEventRowWithReply_Night_4_en",20392,], ["features.messages.impl.timeline.components_TimelineItemEventRowWithReply_Day_5_en","features.messages.impl.timeline.components_TimelineItemEventRowWithReply_Night_5_en",0,], ["features.messages.impl.timeline.components_TimelineItemEventRowWithReply_Day_6_en","features.messages.impl.timeline.components_TimelineItemEventRowWithReply_Night_6_en",0,], ["features.messages.impl.timeline.components_TimelineItemEventRowWithReply_Day_7_en","features.messages.impl.timeline.components_TimelineItemEventRowWithReply_Night_7_en",0,], -["features.messages.impl.timeline.components_TimelineItemEventRowWithReply_Day_8_en","features.messages.impl.timeline.components_TimelineItemEventRowWithReply_Night_8_en",20385,], +["features.messages.impl.timeline.components_TimelineItemEventRowWithReply_Day_8_en","features.messages.impl.timeline.components_TimelineItemEventRowWithReply_Night_8_en",20392,], ["features.messages.impl.timeline.components_TimelineItemEventRowWithReply_Day_9_en","features.messages.impl.timeline.components_TimelineItemEventRowWithReply_Night_9_en",0,], -["features.messages.impl.timeline.components_TimelineItemEventRowWithThreadSummary_Day_0_en","features.messages.impl.timeline.components_TimelineItemEventRowWithThreadSummary_Night_0_en",20385,], +["features.messages.impl.timeline.components_TimelineItemEventRowWithThreadSummary_Day_0_en","features.messages.impl.timeline.components_TimelineItemEventRowWithThreadSummary_Night_0_en",20392,], ["features.messages.impl.timeline.components_TimelineItemEventRow_Day_0_en","features.messages.impl.timeline.components_TimelineItemEventRow_Night_0_en",0,], -["features.messages.impl.timeline.components_TimelineItemEventTimestampBelow_en","",20385,], +["features.messages.impl.timeline.components_TimelineItemEventTimestampBelow_en","",20392,], ["features.messages.impl.timeline.components.event_TimelineItemFileView_Day_0_en","features.messages.impl.timeline.components.event_TimelineItemFileView_Night_0_en",0,], ["features.messages.impl.timeline.components.event_TimelineItemFileView_Day_1_en","features.messages.impl.timeline.components.event_TimelineItemFileView_Night_1_en",0,], ["features.messages.impl.timeline.components.event_TimelineItemFileView_Day_2_en","features.messages.impl.timeline.components.event_TimelineItemFileView_Night_2_en",0,], ["features.messages.impl.timeline.components.event_TimelineItemFileView_Day_3_en","features.messages.impl.timeline.components.event_TimelineItemFileView_Night_3_en",0,], ["features.messages.impl.timeline.components.event_TimelineItemFileView_Day_4_en","features.messages.impl.timeline.components.event_TimelineItemFileView_Night_4_en",0,], -["features.messages.impl.timeline.components_TimelineItemGroupedEventsRowContentCollapse_Day_0_en","features.messages.impl.timeline.components_TimelineItemGroupedEventsRowContentCollapse_Night_0_en",20385,], -["features.messages.impl.timeline.components_TimelineItemGroupedEventsRowContentExpanded_Day_0_en","features.messages.impl.timeline.components_TimelineItemGroupedEventsRowContentExpanded_Night_0_en",20385,], -["features.messages.impl.timeline.components.event_TimelineItemImageViewHideMediaContent_Day_0_en","features.messages.impl.timeline.components.event_TimelineItemImageViewHideMediaContent_Night_0_en",20385,], +["features.messages.impl.timeline.components_TimelineItemGroupedEventsRowContentCollapse_Day_0_en","features.messages.impl.timeline.components_TimelineItemGroupedEventsRowContentCollapse_Night_0_en",20392,], +["features.messages.impl.timeline.components_TimelineItemGroupedEventsRowContentExpanded_Day_0_en","features.messages.impl.timeline.components_TimelineItemGroupedEventsRowContentExpanded_Night_0_en",20392,], +["features.messages.impl.timeline.components.event_TimelineItemImageViewHideMediaContent_Day_0_en","features.messages.impl.timeline.components.event_TimelineItemImageViewHideMediaContent_Night_0_en",20392,], ["features.messages.impl.timeline.components.event_TimelineItemImageView_Day_0_en","features.messages.impl.timeline.components.event_TimelineItemImageView_Night_0_en",0,], ["features.messages.impl.timeline.components.event_TimelineItemImageView_Day_1_en","features.messages.impl.timeline.components.event_TimelineItemImageView_Night_1_en",0,], ["features.messages.impl.timeline.components.event_TimelineItemImageView_Day_2_en","features.messages.impl.timeline.components.event_TimelineItemImageView_Night_2_en",0,], ["features.messages.impl.timeline.components.event_TimelineItemImageView_Day_3_en","features.messages.impl.timeline.components.event_TimelineItemImageView_Night_3_en",0,], ["features.messages.impl.timeline.components.event_TimelineItemInformativeView_Day_0_en","features.messages.impl.timeline.components.event_TimelineItemInformativeView_Night_0_en",0,], -["features.messages.impl.timeline.components.event_TimelineItemLegacyCallInviteView_Day_0_en","features.messages.impl.timeline.components.event_TimelineItemLegacyCallInviteView_Night_0_en",20385,], +["features.messages.impl.timeline.components.event_TimelineItemLegacyCallInviteView_Day_0_en","features.messages.impl.timeline.components.event_TimelineItemLegacyCallInviteView_Night_0_en",20392,], ["features.messages.impl.timeline.components.event_TimelineItemLocationView_Day_0_en","features.messages.impl.timeline.components.event_TimelineItemLocationView_Night_0_en",0,], ["features.messages.impl.timeline.components.event_TimelineItemLocationView_Day_1_en","features.messages.impl.timeline.components.event_TimelineItemLocationView_Night_1_en",0,], -["features.messages.impl.timeline.components.event_TimelineItemPollView_Day_0_en","features.messages.impl.timeline.components.event_TimelineItemPollView_Night_0_en",20385,], -["features.messages.impl.timeline.components.event_TimelineItemPollView_Day_1_en","features.messages.impl.timeline.components.event_TimelineItemPollView_Night_1_en",20385,], -["features.messages.impl.timeline.components.event_TimelineItemPollView_Day_2_en","features.messages.impl.timeline.components.event_TimelineItemPollView_Night_2_en",20385,], -["features.messages.impl.timeline.components.event_TimelineItemPollView_Day_3_en","features.messages.impl.timeline.components.event_TimelineItemPollView_Night_3_en",20385,], -["features.messages.impl.timeline.components_TimelineItemReactionsLayout_Day_0_en","features.messages.impl.timeline.components_TimelineItemReactionsLayout_Night_0_en",20385,], +["features.messages.impl.timeline.components.event_TimelineItemPollView_Day_0_en","features.messages.impl.timeline.components.event_TimelineItemPollView_Night_0_en",20392,], +["features.messages.impl.timeline.components.event_TimelineItemPollView_Day_1_en","features.messages.impl.timeline.components.event_TimelineItemPollView_Night_1_en",20392,], +["features.messages.impl.timeline.components.event_TimelineItemPollView_Day_2_en","features.messages.impl.timeline.components.event_TimelineItemPollView_Night_2_en",20392,], +["features.messages.impl.timeline.components.event_TimelineItemPollView_Day_3_en","features.messages.impl.timeline.components.event_TimelineItemPollView_Night_3_en",20392,], +["features.messages.impl.timeline.components_TimelineItemReactionsLayout_Day_0_en","features.messages.impl.timeline.components_TimelineItemReactionsLayout_Night_0_en",20392,], ["features.messages.impl.timeline.components_TimelineItemReactionsViewFew_Day_0_en","features.messages.impl.timeline.components_TimelineItemReactionsViewFew_Night_0_en",0,], -["features.messages.impl.timeline.components_TimelineItemReactionsViewIncoming_Day_0_en","features.messages.impl.timeline.components_TimelineItemReactionsViewIncoming_Night_0_en",20385,], -["features.messages.impl.timeline.components_TimelineItemReactionsViewOutgoing_Day_0_en","features.messages.impl.timeline.components_TimelineItemReactionsViewOutgoing_Night_0_en",20385,], +["features.messages.impl.timeline.components_TimelineItemReactionsViewIncoming_Day_0_en","features.messages.impl.timeline.components_TimelineItemReactionsViewIncoming_Night_0_en",20392,], +["features.messages.impl.timeline.components_TimelineItemReactionsViewOutgoing_Day_0_en","features.messages.impl.timeline.components_TimelineItemReactionsViewOutgoing_Night_0_en",20392,], ["features.messages.impl.timeline.components_TimelineItemReactionsView_Day_0_en","features.messages.impl.timeline.components_TimelineItemReactionsView_Night_0_en",0,], -["features.messages.impl.timeline.components.virtual_TimelineItemReadMarkerView_Day_0_en","features.messages.impl.timeline.components.virtual_TimelineItemReadMarkerView_Night_0_en",20385,], +["features.messages.impl.timeline.components.virtual_TimelineItemReadMarkerView_Day_0_en","features.messages.impl.timeline.components.virtual_TimelineItemReadMarkerView_Night_0_en",20392,], ["features.messages.impl.timeline.components.receipt_TimelineItemReadReceiptView_Day_0_en","features.messages.impl.timeline.components.receipt_TimelineItemReadReceiptView_Night_0_en",0,], ["features.messages.impl.timeline.components.receipt_TimelineItemReadReceiptView_Day_1_en","features.messages.impl.timeline.components.receipt_TimelineItemReadReceiptView_Night_1_en",0,], ["features.messages.impl.timeline.components.receipt_TimelineItemReadReceiptView_Day_2_en","features.messages.impl.timeline.components.receipt_TimelineItemReadReceiptView_Night_2_en",0,], @@ -1368,8 +1369,8 @@ export const screenshots = [ ["features.messages.impl.timeline.components.receipt_TimelineItemReadReceiptView_Day_5_en","features.messages.impl.timeline.components.receipt_TimelineItemReadReceiptView_Night_5_en",0,], ["features.messages.impl.timeline.components.receipt_TimelineItemReadReceiptView_Day_6_en","features.messages.impl.timeline.components.receipt_TimelineItemReadReceiptView_Night_6_en",0,], ["features.messages.impl.timeline.components.receipt_TimelineItemReadReceiptView_Day_7_en","features.messages.impl.timeline.components.receipt_TimelineItemReadReceiptView_Night_7_en",0,], -["features.messages.impl.timeline.components.event_TimelineItemRedactedView_Day_0_en","features.messages.impl.timeline.components.event_TimelineItemRedactedView_Night_0_en",20385,], -["features.messages.impl.timeline.components.virtual_TimelineItemRoomBeginningView_Day_0_en","features.messages.impl.timeline.components.virtual_TimelineItemRoomBeginningView_Night_0_en",20385,], +["features.messages.impl.timeline.components.event_TimelineItemRedactedView_Day_0_en","features.messages.impl.timeline.components.event_TimelineItemRedactedView_Night_0_en",20392,], +["features.messages.impl.timeline.components.virtual_TimelineItemRoomBeginningView_Day_0_en","features.messages.impl.timeline.components.virtual_TimelineItemRoomBeginningView_Night_0_en",20392,], ["features.messages.impl.timeline.components_TimelineItemStateEventRow_Day_0_en","features.messages.impl.timeline.components_TimelineItemStateEventRow_Night_0_en",0,], ["features.messages.impl.timeline.components.event_TimelineItemStateView_Day_0_en","features.messages.impl.timeline.components.event_TimelineItemStateView_Night_0_en",0,], ["features.messages.impl.timeline.components.event_TimelineItemStickerView_Day_0_en","features.messages.impl.timeline.components.event_TimelineItemStickerView_Night_0_en",0,], @@ -1384,8 +1385,8 @@ export const screenshots = [ ["features.messages.impl.timeline.components.event_TimelineItemTextView_Day_3_en","features.messages.impl.timeline.components.event_TimelineItemTextView_Night_3_en",0,], ["features.messages.impl.timeline.components.event_TimelineItemTextView_Day_4_en","features.messages.impl.timeline.components.event_TimelineItemTextView_Night_4_en",0,], ["features.messages.impl.timeline.components.event_TimelineItemTextView_Day_5_en","features.messages.impl.timeline.components.event_TimelineItemTextView_Night_5_en",0,], -["features.messages.impl.timeline.components.event_TimelineItemUnknownView_Day_0_en","features.messages.impl.timeline.components.event_TimelineItemUnknownView_Night_0_en",20385,], -["features.messages.impl.timeline.components.event_TimelineItemVideoViewHideMediaContent_Day_0_en","features.messages.impl.timeline.components.event_TimelineItemVideoViewHideMediaContent_Night_0_en",20385,], +["features.messages.impl.timeline.components.event_TimelineItemUnknownView_Day_0_en","features.messages.impl.timeline.components.event_TimelineItemUnknownView_Night_0_en",20392,], +["features.messages.impl.timeline.components.event_TimelineItemVideoViewHideMediaContent_Day_0_en","features.messages.impl.timeline.components.event_TimelineItemVideoViewHideMediaContent_Night_0_en",20392,], ["features.messages.impl.timeline.components.event_TimelineItemVideoView_Day_0_en","features.messages.impl.timeline.components.event_TimelineItemVideoView_Night_0_en",0,], ["features.messages.impl.timeline.components.event_TimelineItemVideoView_Day_1_en","features.messages.impl.timeline.components.event_TimelineItemVideoView_Night_1_en",0,], ["features.messages.impl.timeline.components.event_TimelineItemVideoView_Day_2_en","features.messages.impl.timeline.components.event_TimelineItemVideoView_Night_2_en",0,], @@ -1408,85 +1409,85 @@ export const screenshots = [ ["features.messages.impl.timeline.components.event_TimelineItemVoiceView_Day_9_en","features.messages.impl.timeline.components.event_TimelineItemVoiceView_Night_9_en",0,], ["features.messages.impl.timeline.components.virtual_TimelineLoadingMoreIndicator_Day_0_en","features.messages.impl.timeline.components.virtual_TimelineLoadingMoreIndicator_Night_0_en",0,], ["features.messages.impl.timeline.components.event_TimelineVideoWithCaptionRow_Day_0_en","features.messages.impl.timeline.components.event_TimelineVideoWithCaptionRow_Night_0_en",0,], -["features.messages.impl.timeline_TimelineViewMessageShield_Day_0_en","features.messages.impl.timeline_TimelineViewMessageShield_Night_0_en",20385,], -["features.messages.impl.timeline_TimelineView_Day_0_en","features.messages.impl.timeline_TimelineView_Night_0_en",20385,], +["features.messages.impl.timeline_TimelineViewMessageShield_Day_0_en","features.messages.impl.timeline_TimelineViewMessageShield_Night_0_en",20392,], +["features.messages.impl.timeline_TimelineView_Day_0_en","features.messages.impl.timeline_TimelineView_Night_0_en",20392,], ["features.messages.impl.timeline_TimelineView_Day_10_en","features.messages.impl.timeline_TimelineView_Night_10_en",0,], -["features.messages.impl.timeline_TimelineView_Day_11_en","features.messages.impl.timeline_TimelineView_Night_11_en",20385,], -["features.messages.impl.timeline_TimelineView_Day_12_en","features.messages.impl.timeline_TimelineView_Night_12_en",20385,], -["features.messages.impl.timeline_TimelineView_Day_13_en","features.messages.impl.timeline_TimelineView_Night_13_en",20385,], -["features.messages.impl.timeline_TimelineView_Day_14_en","features.messages.impl.timeline_TimelineView_Night_14_en",20385,], -["features.messages.impl.timeline_TimelineView_Day_15_en","features.messages.impl.timeline_TimelineView_Night_15_en",20385,], -["features.messages.impl.timeline_TimelineView_Day_16_en","features.messages.impl.timeline_TimelineView_Night_16_en",20385,], -["features.messages.impl.timeline_TimelineView_Day_17_en","features.messages.impl.timeline_TimelineView_Night_17_en",20385,], -["features.messages.impl.timeline_TimelineView_Day_1_en","features.messages.impl.timeline_TimelineView_Night_1_en",20385,], +["features.messages.impl.timeline_TimelineView_Day_11_en","features.messages.impl.timeline_TimelineView_Night_11_en",20392,], +["features.messages.impl.timeline_TimelineView_Day_12_en","features.messages.impl.timeline_TimelineView_Night_12_en",20392,], +["features.messages.impl.timeline_TimelineView_Day_13_en","features.messages.impl.timeline_TimelineView_Night_13_en",20392,], +["features.messages.impl.timeline_TimelineView_Day_14_en","features.messages.impl.timeline_TimelineView_Night_14_en",20392,], +["features.messages.impl.timeline_TimelineView_Day_15_en","features.messages.impl.timeline_TimelineView_Night_15_en",20392,], +["features.messages.impl.timeline_TimelineView_Day_16_en","features.messages.impl.timeline_TimelineView_Night_16_en",20392,], +["features.messages.impl.timeline_TimelineView_Day_17_en","features.messages.impl.timeline_TimelineView_Night_17_en",20392,], +["features.messages.impl.timeline_TimelineView_Day_1_en","features.messages.impl.timeline_TimelineView_Night_1_en",20392,], ["features.messages.impl.timeline_TimelineView_Day_2_en","features.messages.impl.timeline_TimelineView_Night_2_en",0,], ["features.messages.impl.timeline_TimelineView_Day_3_en","features.messages.impl.timeline_TimelineView_Night_3_en",0,], -["features.messages.impl.timeline_TimelineView_Day_4_en","features.messages.impl.timeline_TimelineView_Night_4_en",20385,], +["features.messages.impl.timeline_TimelineView_Day_4_en","features.messages.impl.timeline_TimelineView_Night_4_en",20392,], ["features.messages.impl.timeline_TimelineView_Day_5_en","features.messages.impl.timeline_TimelineView_Night_5_en",0,], -["features.messages.impl.timeline_TimelineView_Day_6_en","features.messages.impl.timeline_TimelineView_Night_6_en",20385,], +["features.messages.impl.timeline_TimelineView_Day_6_en","features.messages.impl.timeline_TimelineView_Night_6_en",20392,], ["features.messages.impl.timeline_TimelineView_Day_7_en","features.messages.impl.timeline_TimelineView_Night_7_en",0,], -["features.messages.impl.timeline_TimelineView_Day_8_en","features.messages.impl.timeline_TimelineView_Night_8_en",20385,], +["features.messages.impl.timeline_TimelineView_Day_8_en","features.messages.impl.timeline_TimelineView_Night_8_en",20392,], ["features.messages.impl.timeline_TimelineView_Day_9_en","features.messages.impl.timeline_TimelineView_Night_9_en",0,], ["libraries.designsystem.components.avatar.internal_TombstonedRoomAvatar_Avatars_en","",0,], ["libraries.designsystem.theme.components_TopAppBarStr_App_Bars_en","",0,], ["libraries.designsystem.theme.components_TopAppBar_App_Bars_en","",0,], -["libraries.troubleshoot.impl_TroubleshootNotificationsView_Day_0_en","libraries.troubleshoot.impl_TroubleshootNotificationsView_Night_0_en",20385,], -["libraries.troubleshoot.impl_TroubleshootNotificationsView_Day_1_en","libraries.troubleshoot.impl_TroubleshootNotificationsView_Night_1_en",20385,], -["libraries.troubleshoot.impl_TroubleshootNotificationsView_Day_2_en","libraries.troubleshoot.impl_TroubleshootNotificationsView_Night_2_en",20385,], -["libraries.troubleshoot.impl_TroubleshootNotificationsView_Day_3_en","libraries.troubleshoot.impl_TroubleshootNotificationsView_Night_3_en",20385,], -["libraries.troubleshoot.impl_TroubleshootNotificationsView_Day_4_en","libraries.troubleshoot.impl_TroubleshootNotificationsView_Night_4_en",20385,], -["libraries.troubleshoot.impl_TroubleshootNotificationsView_Day_5_en","libraries.troubleshoot.impl_TroubleshootNotificationsView_Night_5_en",20385,], -["libraries.troubleshoot.impl_TroubleshootNotificationsView_Day_6_en","libraries.troubleshoot.impl_TroubleshootNotificationsView_Night_6_en",20385,], -["libraries.troubleshoot.impl_TroubleshootNotificationsView_Day_7_en","libraries.troubleshoot.impl_TroubleshootNotificationsView_Night_7_en",20385,], +["libraries.troubleshoot.impl_TroubleshootNotificationsView_Day_0_en","libraries.troubleshoot.impl_TroubleshootNotificationsView_Night_0_en",20392,], +["libraries.troubleshoot.impl_TroubleshootNotificationsView_Day_1_en","libraries.troubleshoot.impl_TroubleshootNotificationsView_Night_1_en",20392,], +["libraries.troubleshoot.impl_TroubleshootNotificationsView_Day_2_en","libraries.troubleshoot.impl_TroubleshootNotificationsView_Night_2_en",20392,], +["libraries.troubleshoot.impl_TroubleshootNotificationsView_Day_3_en","libraries.troubleshoot.impl_TroubleshootNotificationsView_Night_3_en",20392,], +["libraries.troubleshoot.impl_TroubleshootNotificationsView_Day_4_en","libraries.troubleshoot.impl_TroubleshootNotificationsView_Night_4_en",20392,], +["libraries.troubleshoot.impl_TroubleshootNotificationsView_Day_5_en","libraries.troubleshoot.impl_TroubleshootNotificationsView_Night_5_en",20392,], +["libraries.troubleshoot.impl_TroubleshootNotificationsView_Day_6_en","libraries.troubleshoot.impl_TroubleshootNotificationsView_Night_6_en",20392,], +["libraries.troubleshoot.impl_TroubleshootNotificationsView_Day_7_en","libraries.troubleshoot.impl_TroubleshootNotificationsView_Night_7_en",20392,], ["features.messages.impl.typing_TypingNotificationView_Day_0_en","features.messages.impl.typing_TypingNotificationView_Night_0_en",0,], -["features.messages.impl.typing_TypingNotificationView_Day_1_en","features.messages.impl.typing_TypingNotificationView_Night_1_en",20385,], -["features.messages.impl.typing_TypingNotificationView_Day_2_en","features.messages.impl.typing_TypingNotificationView_Night_2_en",20385,], -["features.messages.impl.typing_TypingNotificationView_Day_3_en","features.messages.impl.typing_TypingNotificationView_Night_3_en",20385,], -["features.messages.impl.typing_TypingNotificationView_Day_4_en","features.messages.impl.typing_TypingNotificationView_Night_4_en",20385,], -["features.messages.impl.typing_TypingNotificationView_Day_5_en","features.messages.impl.typing_TypingNotificationView_Night_5_en",20385,], -["features.messages.impl.typing_TypingNotificationView_Day_6_en","features.messages.impl.typing_TypingNotificationView_Night_6_en",20385,], +["features.messages.impl.typing_TypingNotificationView_Day_1_en","features.messages.impl.typing_TypingNotificationView_Night_1_en",20392,], +["features.messages.impl.typing_TypingNotificationView_Day_2_en","features.messages.impl.typing_TypingNotificationView_Night_2_en",20392,], +["features.messages.impl.typing_TypingNotificationView_Day_3_en","features.messages.impl.typing_TypingNotificationView_Night_3_en",20392,], +["features.messages.impl.typing_TypingNotificationView_Day_4_en","features.messages.impl.typing_TypingNotificationView_Night_4_en",20392,], +["features.messages.impl.typing_TypingNotificationView_Day_5_en","features.messages.impl.typing_TypingNotificationView_Night_5_en",20392,], +["features.messages.impl.typing_TypingNotificationView_Day_6_en","features.messages.impl.typing_TypingNotificationView_Night_6_en",20392,], ["features.messages.impl.typing_TypingNotificationView_Day_7_en","features.messages.impl.typing_TypingNotificationView_Night_7_en",0,], ["features.messages.impl.typing_TypingNotificationView_Day_8_en","features.messages.impl.typing_TypingNotificationView_Night_8_en",0,], ["libraries.designsystem.atomic.atoms_UnreadIndicatorAtom_Day_0_en","libraries.designsystem.atomic.atoms_UnreadIndicatorAtom_Night_0_en",0,], -["libraries.matrix.ui.components_UnresolvedUserRow_en","",20385,], +["libraries.matrix.ui.components_UnresolvedUserRow_en","",20392,], ["libraries.matrix.ui.components_UnsavedAvatar_Day_0_en","libraries.matrix.ui.components_UnsavedAvatar_Night_0_en",0,], ["libraries.designsystem.components.avatar.internal_UserAvatarColors_Day_0_en","libraries.designsystem.components.avatar.internal_UserAvatarColors_Night_0_en",0,], -["features.roomdetails.impl.notificationsettings_UserDefinedRoomNotificationSettingsView_Day_0_en","features.roomdetails.impl.notificationsettings_UserDefinedRoomNotificationSettingsView_Night_0_en",20385,], -["features.startchat.impl.components_UserListView_Day_0_en","features.startchat.impl.components_UserListView_Night_0_en",20385,], -["features.startchat.impl.components_UserListView_Day_1_en","features.startchat.impl.components_UserListView_Night_1_en",20385,], -["features.startchat.impl.components_UserListView_Day_2_en","features.startchat.impl.components_UserListView_Night_2_en",20385,], +["features.roomdetails.impl.notificationsettings_UserDefinedRoomNotificationSettingsView_Day_0_en","features.roomdetails.impl.notificationsettings_UserDefinedRoomNotificationSettingsView_Night_0_en",20392,], +["features.startchat.impl.components_UserListView_Day_0_en","features.startchat.impl.components_UserListView_Night_0_en",20392,], +["features.startchat.impl.components_UserListView_Day_1_en","features.startchat.impl.components_UserListView_Night_1_en",20392,], +["features.startchat.impl.components_UserListView_Day_2_en","features.startchat.impl.components_UserListView_Night_2_en",20392,], ["features.startchat.impl.components_UserListView_Day_3_en","features.startchat.impl.components_UserListView_Night_3_en",0,], ["features.startchat.impl.components_UserListView_Day_4_en","features.startchat.impl.components_UserListView_Night_4_en",0,], ["features.startchat.impl.components_UserListView_Day_5_en","features.startchat.impl.components_UserListView_Night_5_en",0,], ["features.startchat.impl.components_UserListView_Day_6_en","features.startchat.impl.components_UserListView_Night_6_en",0,], -["features.startchat.impl.components_UserListView_Day_7_en","features.startchat.impl.components_UserListView_Night_7_en",20385,], +["features.startchat.impl.components_UserListView_Day_7_en","features.startchat.impl.components_UserListView_Night_7_en",20392,], ["features.startchat.impl.components_UserListView_Day_8_en","features.startchat.impl.components_UserListView_Night_8_en",0,], -["features.startchat.impl.components_UserListView_Day_9_en","features.startchat.impl.components_UserListView_Night_9_en",20385,], +["features.startchat.impl.components_UserListView_Day_9_en","features.startchat.impl.components_UserListView_Night_9_en",20392,], ["features.preferences.impl.user_UserPreferences_Day_0_en","features.preferences.impl.user_UserPreferences_Night_0_en",0,], ["features.preferences.impl.user_UserPreferences_Day_1_en","features.preferences.impl.user_UserPreferences_Night_1_en",0,], ["features.preferences.impl.user_UserPreferences_Day_2_en","features.preferences.impl.user_UserPreferences_Night_2_en",0,], -["features.userprofile.shared_UserProfileHeaderSectionWithVerificationViolation_Day_0_en","features.userprofile.shared_UserProfileHeaderSectionWithVerificationViolation_Night_0_en",20385,], -["features.userprofile.shared_UserProfileHeaderSection_Day_0_en","features.userprofile.shared_UserProfileHeaderSection_Night_0_en",20385,], -["features.userprofile.shared_UserProfileView_Day_0_en","features.userprofile.shared_UserProfileView_Night_0_en",20385,], -["features.userprofile.shared_UserProfileView_Day_1_en","features.userprofile.shared_UserProfileView_Night_1_en",20385,], -["features.userprofile.shared_UserProfileView_Day_2_en","features.userprofile.shared_UserProfileView_Night_2_en",20385,], -["features.userprofile.shared_UserProfileView_Day_3_en","features.userprofile.shared_UserProfileView_Night_3_en",20385,], -["features.userprofile.shared_UserProfileView_Day_4_en","features.userprofile.shared_UserProfileView_Night_4_en",20385,], -["features.userprofile.shared_UserProfileView_Day_5_en","features.userprofile.shared_UserProfileView_Night_5_en",20385,], -["features.userprofile.shared_UserProfileView_Day_6_en","features.userprofile.shared_UserProfileView_Night_6_en",20385,], -["features.userprofile.shared_UserProfileView_Day_7_en","features.userprofile.shared_UserProfileView_Night_7_en",20385,], -["features.userprofile.shared_UserProfileView_Day_8_en","features.userprofile.shared_UserProfileView_Night_8_en",20385,], -["features.userprofile.shared_UserProfileView_Day_9_en","features.userprofile.shared_UserProfileView_Night_9_en",20385,], +["features.userprofile.shared_UserProfileHeaderSectionWithVerificationViolation_Day_0_en","features.userprofile.shared_UserProfileHeaderSectionWithVerificationViolation_Night_0_en",20392,], +["features.userprofile.shared_UserProfileHeaderSection_Day_0_en","features.userprofile.shared_UserProfileHeaderSection_Night_0_en",20392,], +["features.userprofile.shared_UserProfileView_Day_0_en","features.userprofile.shared_UserProfileView_Night_0_en",20392,], +["features.userprofile.shared_UserProfileView_Day_1_en","features.userprofile.shared_UserProfileView_Night_1_en",20392,], +["features.userprofile.shared_UserProfileView_Day_2_en","features.userprofile.shared_UserProfileView_Night_2_en",20392,], +["features.userprofile.shared_UserProfileView_Day_3_en","features.userprofile.shared_UserProfileView_Night_3_en",20392,], +["features.userprofile.shared_UserProfileView_Day_4_en","features.userprofile.shared_UserProfileView_Night_4_en",20392,], +["features.userprofile.shared_UserProfileView_Day_5_en","features.userprofile.shared_UserProfileView_Night_5_en",20392,], +["features.userprofile.shared_UserProfileView_Day_6_en","features.userprofile.shared_UserProfileView_Night_6_en",20392,], +["features.userprofile.shared_UserProfileView_Day_7_en","features.userprofile.shared_UserProfileView_Night_7_en",20392,], +["features.userprofile.shared_UserProfileView_Day_8_en","features.userprofile.shared_UserProfileView_Night_8_en",20392,], +["features.userprofile.shared_UserProfileView_Day_9_en","features.userprofile.shared_UserProfileView_Night_9_en",20392,], ["features.verifysession.impl.ui_VerificationUserProfileContent_Day_0_en","features.verifysession.impl.ui_VerificationUserProfileContent_Night_0_en",0,], ["libraries.designsystem.ruler_VerticalRuler_Day_0_en","libraries.designsystem.ruler_VerticalRuler_Night_0_en",0,], ["libraries.mediaviewer.impl.gallery.ui_VideoItemView_Day_0_en","libraries.mediaviewer.impl.gallery.ui_VideoItemView_Night_0_en",0,], ["libraries.mediaviewer.impl.gallery.ui_VideoItemView_Day_1_en","libraries.mediaviewer.impl.gallery.ui_VideoItemView_Night_1_en",0,], -["features.preferences.impl.advanced_VideoQualitySelectorDialog_Day_0_en","features.preferences.impl.advanced_VideoQualitySelectorDialog_Night_0_en",20385,], -["features.messages.impl.attachments.preview_VideoQualitySelectorDialog_Day_0_en","features.messages.impl.attachments.preview_VideoQualitySelectorDialog_Night_0_en",20385,], +["features.preferences.impl.advanced_VideoQualitySelectorDialog_Day_0_en","features.preferences.impl.advanced_VideoQualitySelectorDialog_Night_0_en",20392,], +["features.messages.impl.attachments.preview_VideoQualitySelectorDialog_Day_0_en","features.messages.impl.attachments.preview_VideoQualitySelectorDialog_Night_0_en",20392,], ["features.viewfolder.impl.file_ViewFileView_Day_0_en","features.viewfolder.impl.file_ViewFileView_Night_0_en",0,], ["features.viewfolder.impl.file_ViewFileView_Day_1_en","features.viewfolder.impl.file_ViewFileView_Night_1_en",0,], ["features.viewfolder.impl.file_ViewFileView_Day_2_en","features.viewfolder.impl.file_ViewFileView_Night_2_en",0,], -["features.viewfolder.impl.file_ViewFileView_Day_3_en","features.viewfolder.impl.file_ViewFileView_Night_3_en",20385,], +["features.viewfolder.impl.file_ViewFileView_Day_3_en","features.viewfolder.impl.file_ViewFileView_Night_3_en",20392,], ["features.viewfolder.impl.file_ViewFileView_Day_4_en","features.viewfolder.impl.file_ViewFileView_Night_4_en",0,], ["features.viewfolder.impl.file_ViewFileView_Day_5_en","features.viewfolder.impl.file_ViewFileView_Night_5_en",0,], ["features.viewfolder.impl.folder_ViewFolderView_Day_0_en","features.viewfolder.impl.folder_ViewFolderView_Night_0_en",0,], From 444ae96030cfed4bf2e62b3bd8c0062d1fec5627 Mon Sep 17 00:00:00 2001 From: Jorge Martin Espinosa Date: Mon, 27 Oct 2025 17:25:56 +0100 Subject: [PATCH 23/46] =?UTF-8?q?Revert=20"Make=20sure=20declining=20a=20c?= =?UTF-8?q?all=20stops=20observing=20the=20ringing=20call=20state=20(#5?= =?UTF-8?q?=E2=80=A6"=20(#5615)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This reverts commit 10bf5f1c8cfeb4b25ca68b19286718ea588af978. --- .../call/impl/utils/ActiveCallManager.kt | 136 +++++++++--------- .../utils/DefaultActiveCallManagerTest.kt | 45 ------ 2 files changed, 64 insertions(+), 117 deletions(-) diff --git a/features/call/impl/src/main/kotlin/io/element/android/features/call/impl/utils/ActiveCallManager.kt b/features/call/impl/src/main/kotlin/io/element/android/features/call/impl/utils/ActiveCallManager.kt index 0f4a96250b..34f46d1ea0 100644 --- a/features/call/impl/src/main/kotlin/io/element/android/features/call/impl/utils/ActiveCallManager.kt +++ b/features/call/impl/src/main/kotlin/io/element/android/features/call/impl/utils/ActiveCallManager.kt @@ -28,9 +28,7 @@ import io.element.android.libraries.core.extensions.runCatchingExceptions import io.element.android.libraries.di.annotations.AppCoroutineScope import io.element.android.libraries.di.annotations.ApplicationContext import io.element.android.libraries.matrix.api.MatrixClientProvider -import io.element.android.libraries.matrix.api.core.EventId import io.element.android.libraries.matrix.api.core.SessionId -import io.element.android.libraries.matrix.api.room.BaseRoom import io.element.android.libraries.matrix.ui.media.ImageLoaderHolder import io.element.android.libraries.push.api.notifications.ForegroundServiceType import io.element.android.libraries.push.api.notifications.NotificationIdProvider @@ -41,17 +39,16 @@ import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.ExperimentalCoroutinesApi import kotlinx.coroutines.Job import kotlinx.coroutines.delay -import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.StateFlow import kotlinx.coroutines.flow.distinctUntilChanged import kotlinx.coroutines.flow.drop import kotlinx.coroutines.flow.filter +import kotlinx.coroutines.flow.filterNotNull import kotlinx.coroutines.flow.flatMapLatest import kotlinx.coroutines.flow.flowOf import kotlinx.coroutines.flow.launchIn import kotlinx.coroutines.flow.map -import kotlinx.coroutines.flow.mapLatest import kotlinx.coroutines.flow.onEach import kotlinx.coroutines.launch import kotlinx.coroutines.sync.Mutex @@ -183,7 +180,13 @@ class DefaultActiveCallManager( val previousActiveCall = activeCall.value ?: return val notificationData = (previousActiveCall.callState as? CallState.Ringing)?.notificationData ?: return - removeCurrentCall() + activeCall.value = null + if (activeWakeLock?.isHeld == true) { + Timber.tag(tag).d("Releasing partial wakelock after timeout") + activeWakeLock.release() + } + + cancelIncomingCallNotification() if (displayMissedCallNotification) { displayMissedCallNotification(notificationData) @@ -208,16 +211,24 @@ class DefaultActiveCallManager( ?.declineCall(notificationData.eventId) } - removeCurrentCall() + cancelIncomingCallNotification() + if (activeWakeLock?.isHeld == true) { + Timber.tag(tag).d("Releasing partial wakelock after hang up") + activeWakeLock.release() + } + timedOutCallJob?.cancel() + activeCall.value = null } - /** - * Removes the current active call and any associated UI, cancelling the timeouts and wakelocks. - */ override suspend fun joinedCall(callType: CallType) = mutex.withLock { Timber.tag(tag).d("Joined call: $callType") - removeCurrentCall() + cancelIncomingCallNotification() + if (activeWakeLock?.isHeld == true) { + Timber.tag(tag).d("Releasing partial wakelock after joining call") + activeWakeLock.release() + } + timedOutCallJob?.cancel() activeCall.value = ActiveCall( callType = callType, @@ -225,23 +236,6 @@ class DefaultActiveCallManager( ) } - @VisibleForTesting(otherwise = VisibleForTesting.PRIVATE) - internal fun removeCurrentCall() { - // Cancel and remove the timeout call job, if any - timedOutCallJob?.cancel() - timedOutCallJob = null - - // Remove the active call and cancel the notification - activeCall.value = null - cancelIncomingCallNotification() - - // Also remove any wake locks that may be held - if (activeWakeLock?.isHeld == true) { - Timber.tag(tag).d("Releasing partial wakelock after call declined from another session") - activeWakeLock.release() - } - } - @SuppressLint("MissingPermission") private suspend fun showIncomingCallNotification(notificationData: CallNotificationData) { Timber.tag(tag).d("Displaying ringing call notification") @@ -287,75 +281,73 @@ class DefaultActiveCallManager( @OptIn(ExperimentalCoroutinesApi::class) private fun observeRingingCall() { - val roomForActiveCallFlow: Flow?> = activeCall.mapLatest { activeCall -> - val callType = activeCall?.callType as? CallType.RoomCall ?: return@mapLatest null - val ringingInfo = activeCall.callState as? CallState.Ringing ?: return@mapLatest null - val client = matrixClientProvider.getOrRestore(callType.sessionId).getOrNull() ?: run { - Timber.tag(tag).d("Couldn't find session for incoming call: $activeCall") - return@mapLatest null - } - val room = client.getRoom(callType.roomId) ?: run { - Timber.tag(tag).d("Couldn't find room for incoming call: $activeCall") - return@mapLatest null - } + activeCall + .filterNotNull() + .filter { it.callState is CallState.Ringing && it.callType is CallType.RoomCall } + .flatMapLatest { activeCall -> + val callType = activeCall.callType as CallType.RoomCall + val ringingInfo = activeCall.callState as CallState.Ringing + val client = matrixClientProvider.getOrRestore(callType.sessionId).getOrNull() ?: run { + Timber.tag(tag).d("Couldn't find session for incoming call: $activeCall") + return@flatMapLatest flowOf() + } + val room = client.getRoom(callType.roomId) ?: run { + Timber.tag(tag).d("Couldn't find room for incoming call: $activeCall") + return@flatMapLatest flowOf() + } - Timber.tag(tag).d("Found room for ringing call: ${room.roomId}") - - val eventId = ringingInfo.notificationData.eventId - room to eventId - } - - roomForActiveCallFlow - .flatMapLatest { pair -> - val (room, eventId) = pair - // This will cancel the previous iteration of flatMapLatest if the active call is now null - ?: return@flatMapLatest flowOf() + Timber.tag(tag).d("Found room for ringing call: ${room.roomId}") // If we have declined from another phone we want to stop ringing. - room.subscribeToCallDecline(eventId) + room.subscribeToCallDecline(ringingInfo.notificationData.eventId) .filter { decliner -> Timber.tag(tag).d("Call: $activeCall was declined by $decliner") // only want to listen if the call was declined from another of my sessions, // (we are ringing for an incoming call in a DM) - decliner == room.sessionId + decliner == client.sessionId } } .onEach { decliner -> Timber.tag(tag).d("Call: $activeCall was declined by user from another session") - removeCurrentCall() + // Remove the active call and cancel the notification + activeCall.value = null + if (activeWakeLock?.isHeld == true) { + Timber.tag(tag).d("Releasing partial wakelock after call declined from another session") + activeWakeLock.release() + } + cancelIncomingCallNotification() } .launchIn(coroutineScope) - // This will observe ringing calls and ensure they're terminated if the room call is cancelled or if the user // has joined the call from another session. - roomForActiveCallFlow - .flatMapLatest { pair -> - val (room, _) = pair - // This will cancel the previous iteration of flatMapLatest if the active call is now null - ?: return@flatMapLatest flowOf() - - // We now observe the room info for changes to the active call state and the call participants + activeCall + .filterNotNull() + .filter { it.callState is CallState.Ringing && it.callType is CallType.RoomCall } + .flatMapLatest { activeCall -> + val callType = activeCall.callType as CallType.RoomCall + // Get a flow of updated `hasRoomCall` and `activeRoomCallParticipants` values for the room + val room = matrixClientProvider.getOrRestore(callType.sessionId).getOrNull()?.getRoom(callType.roomId) ?: run { + Timber.tag(tag).d("Couldn't find room for incoming call: $activeCall") + return@flatMapLatest flowOf() + } room.roomInfoFlow.map { - val participants = it.activeRoomCallParticipants - Timber.tag(tag).d("Room call status changed for ringing call | hasRoomCall: ${it.hasRoomCall} | participants: $participants") - val userIsInTheCall = room.sessionId in participants - it.hasRoomCall to userIsInTheCall + Timber.tag(tag).d("Has room call status changed for ringing call: ${it.hasRoomCall}") + it.hasRoomCall to (callType.sessionId in it.activeRoomCallParticipants) } } - // Filter out duplicate values + // We only want to check if the room active call status changes .distinctUntilChanged() // Skip the first one, we're not interested in it (if the check below passes, it had to be active anyway) .drop(1) .onEach { (roomHasActiveCall, userIsInTheCall) -> if (!roomHasActiveCall) { - val notificationData = (activeCall.value?.callState as? CallState.Ringing)?.notificationData - removeCurrentCall() - - if (notificationData != null) { - displayMissedCallNotification(notificationData) - } + // The call was cancelled + timedOutCallJob?.cancel() + incomingCallTimedOut(displayMissedCallNotification = true) } else if (userIsInTheCall) { - removeCurrentCall() + // The user joined the call from another session + timedOutCallJob?.cancel() + incomingCallTimedOut(displayMissedCallNotification = false) } } .launchIn(coroutineScope) diff --git a/features/call/impl/src/test/kotlin/io/element/android/features/call/utils/DefaultActiveCallManagerTest.kt b/features/call/impl/src/test/kotlin/io/element/android/features/call/utils/DefaultActiveCallManagerTest.kt index d4993cec17..3d1c35df4d 100644 --- a/features/call/impl/src/test/kotlin/io/element/android/features/call/utils/DefaultActiveCallManagerTest.kt +++ b/features/call/impl/src/test/kotlin/io/element/android/features/call/utils/DefaultActiveCallManagerTest.kt @@ -28,7 +28,6 @@ import io.element.android.libraries.matrix.test.AN_EVENT_ID_2 import io.element.android.libraries.matrix.test.A_ROOM_ID import io.element.android.libraries.matrix.test.A_ROOM_ID_2 import io.element.android.libraries.matrix.test.A_SESSION_ID -import io.element.android.libraries.matrix.test.A_USER_ID_2 import io.element.android.libraries.matrix.test.FakeMatrixClient import io.element.android.libraries.matrix.test.FakeMatrixClientProvider import io.element.android.libraries.matrix.test.room.FakeBaseRoom @@ -47,7 +46,6 @@ import io.element.android.tests.testutils.lambda.value import io.element.android.tests.testutils.plantTestTimber import io.mockk.coVerify import io.mockk.mockk -import io.mockk.spyk import io.mockk.verify import kotlinx.coroutines.ExperimentalCoroutinesApi import kotlinx.coroutines.test.TestScope @@ -333,49 +331,6 @@ class DefaultActiveCallManagerTest { assertThat(manager.activeCall.value).isNull() } - @OptIn(ExperimentalCoroutinesApi::class) - @Test - fun `observeRingingCalls - declining won't do anything if the call was already cancelled`() = runTest { - val room = FakeBaseRoom().apply { - givenRoomInfo(aRoomInfo()) - } - val client = FakeMatrixClient().apply { - givenGetRoomResult(A_ROOM_ID, room) - } - val matrixClientProvider = FakeMatrixClientProvider(getClient = { Result.success(client) }) - val notificationManagerCompat = mockk(relaxed = true) - val manager = spyk( - createActiveCallManager( - matrixClientProvider = matrixClientProvider, - notificationManagerCompat = notificationManagerCompat, - ) - ) - - manager.registerIncomingCall(aCallNotificationData()) - - // Call is active (the other user join the call) - room.givenRoomInfo(aRoomInfo(hasRoomCall = true)) - advanceTimeBy(1) - - // Call is cancelled by us, hanging up - manager.hungUpCall(CallType.RoomCall(A_SESSION_ID, A_ROOM_ID)) - advanceTimeBy(1) - - verify(exactly = 1) { notificationManagerCompat.cancel(any()) } - verify(exactly = 1) { manager.removeCurrentCall() } - assertThat(manager.activeCall.value).isNull() - assertThat(manager.activeWakeLock?.isHeld).isNull() - - // Simulate that another user declined the call - room.givenDecliner(A_USER_ID_2, AN_EVENT_ID) - advanceTimeBy(1) - - // Check everything stays the same, no extra call to cancelling notifications - verify(exactly = 1) { notificationManagerCompat.cancel(any()) } - verify(exactly = 1) { manager.removeCurrentCall() } - assertThat(manager.activeWakeLock?.isHeld).isNull() - } - @OptIn(ExperimentalCoroutinesApi::class) @Test fun `observeRingingCalls - will do nothing if either the session or the room are not found`() = runTest { From 2fb3f84d2a37e25d0b796dfc9a245c6cab8d9fae Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jorge=20Mart=C3=ADn?= Date: Mon, 3 Nov 2025 12:29:08 +0100 Subject: [PATCH 24/46] Setting version for the release 25.11.0 --- plugins/src/main/kotlin/Versions.kt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/plugins/src/main/kotlin/Versions.kt b/plugins/src/main/kotlin/Versions.kt index 673f3cb724..401c76d088 100644 --- a/plugins/src/main/kotlin/Versions.kt +++ b/plugins/src/main/kotlin/Versions.kt @@ -38,13 +38,13 @@ private const val versionYear = 25 * Month of the version on 2 digits. Value must be in [1,12]. * Do not update this value. it is updated by the release script. */ -private const val versionMonth = 10 +private const val versionMonth = 11 /** * Release number in the month. Value must be in [0,99]. * Do not update this value. it is updated by the release script. */ -private const val versionReleaseNumber = 1 +private const val versionReleaseNumber = 0 object Versions { /** From 569f9a3735ae95593d5ba3039f447326e08ca118 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jorge=20Mart=C3=ADn?= Date: Mon, 3 Nov 2025 13:11:16 +0100 Subject: [PATCH 25/46] Changelog for version 25.11.0 --- CHANGES.md | 9 +++++++++ fastlane/metadata/android/en-US/changelogs/202511000.txt | 2 ++ 2 files changed, 11 insertions(+) create mode 100644 fastlane/metadata/android/en-US/changelogs/202511000.txt diff --git a/CHANGES.md b/CHANGES.md index 6afb930a5b..1ac0cd1124 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -1,3 +1,12 @@ +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 ============================= 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 0000000000..8afd7460fc --- /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 From 2fd777c2db0178f47ca96d39518714e513e1a327 Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Mon, 3 Nov 2025 13:46:14 +0100 Subject: [PATCH 26/46] Fix navigation issue. --- .../main/kotlin/io/element/android/appnav/LoggedInFlowNode.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/appnav/src/main/kotlin/io/element/android/appnav/LoggedInFlowNode.kt b/appnav/src/main/kotlin/io/element/android/appnav/LoggedInFlowNode.kt index ae61a03281..00529bdf20 100644 --- a/appnav/src/main/kotlin/io/element/android/appnav/LoggedInFlowNode.kt +++ b/appnav/src/main/kotlin/io/element/android/appnav/LoggedInFlowNode.kt @@ -404,7 +404,7 @@ class LoggedInFlowNode( } override fun navigateToBugReport() { - callback.navigateToAddAccount() + callback.navigateToBugReport() } override fun navigateToSecureBackup() { From d373cbe8a7ecc8f337d577d51d775a4e90342c39 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jorge=20Mart=C3=ADn?= Date: Mon, 3 Nov 2025 14:43:18 +0100 Subject: [PATCH 27/46] Create `PinnedEventsTimelineProvider`, expose it in `TimelineBindings` --- .../kotlin/io/element/android/x/di/RoomGraph.kt | 3 ++- .../android/appnav/di/TimelineBindings.kt | 16 ++++++++++++++++ .../api/pinned/PinnedEventsTimelineProvider.kt | 12 ++++++++++++ ...kt => DefaultPinnedEventsTimelineProvider.kt} | 9 ++++++--- 4 files changed, 36 insertions(+), 4 deletions(-) create mode 100644 appnav/src/main/kotlin/io/element/android/appnav/di/TimelineBindings.kt create mode 100644 features/messages/api/src/main/kotlin/io/element/android/features/messages/api/pinned/PinnedEventsTimelineProvider.kt rename features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/pinned/{PinnedEventsTimelineProvider.kt => DefaultPinnedEventsTimelineProvider.kt} (91%) 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 index e48dd52daf..c9dfd266d9 100644 --- a/app/src/main/kotlin/io/element/android/x/di/RoomGraph.kt +++ b/app/src/main/kotlin/io/element/android/x/di/RoomGraph.kt @@ -9,13 +9,14 @@ 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 { +interface RoomGraph : NodeFactoriesBindings, TimelineBindings { @GraphExtension.Factory interface Factory { fun create( 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 0000000000..e338f2ba8e --- /dev/null +++ b/appnav/src/main/kotlin/io/element/android/appnav/di/TimelineBindings.kt @@ -0,0 +1,16 @@ +/* + * Copyright 2025 New Vector Ltd. + * + * SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial + * Please see LICENSE files in the repository root for full details. + */ + +package io.element.android.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/features/messages/api/src/main/kotlin/io/element/android/features/messages/api/pinned/PinnedEventsTimelineProvider.kt b/features/messages/api/src/main/kotlin/io/element/android/features/messages/api/pinned/PinnedEventsTimelineProvider.kt new file mode 100644 index 0000000000..026486e00a --- /dev/null +++ b/features/messages/api/src/main/kotlin/io/element/android/features/messages/api/pinned/PinnedEventsTimelineProvider.kt @@ -0,0 +1,12 @@ +/* + * Copyright 2025 New Vector Ltd. + * + * SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial + * Please see LICENSE files in the repository root for full details. + */ + +package io.element.android.features.messages.api.pinned + +import io.element.android.libraries.matrix.api.timeline.TimelineProvider + +interface PinnedEventsTimelineProvider : TimelineProvider diff --git a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/pinned/PinnedEventsTimelineProvider.kt b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/pinned/DefaultPinnedEventsTimelineProvider.kt similarity index 91% rename from features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/pinned/PinnedEventsTimelineProvider.kt rename to features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/pinned/DefaultPinnedEventsTimelineProvider.kt index 811516e022..0e2de50b86 100644 --- a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/pinned/PinnedEventsTimelineProvider.kt +++ b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/pinned/DefaultPinnedEventsTimelineProvider.kt @@ -7,8 +7,11 @@ package io.element.android.features.messages.impl.pinned +import dev.zacsweers.metro.ContributesBinding import dev.zacsweers.metro.Inject import dev.zacsweers.metro.SingleIn +import dev.zacsweers.metro.binding +import io.element.android.features.messages.api.pinned.PinnedEventsTimelineProvider import io.element.android.libraries.architecture.AsyncData import io.element.android.libraries.core.coroutine.CoroutineDispatchers import io.element.android.libraries.core.coroutine.mapState @@ -17,7 +20,6 @@ import io.element.android.libraries.matrix.api.room.CreateTimelineParams import io.element.android.libraries.matrix.api.room.JoinedRoom import io.element.android.libraries.matrix.api.sync.SyncService import io.element.android.libraries.matrix.api.timeline.Timeline -import io.element.android.libraries.matrix.api.timeline.TimelineProvider import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.coroutineScope import kotlinx.coroutines.flow.MutableStateFlow @@ -29,12 +31,13 @@ import kotlinx.coroutines.flow.onEach import kotlinx.coroutines.withContext @SingleIn(RoomScope::class) +@ContributesBinding(RoomScope::class, binding = binding()) @Inject -class PinnedEventsTimelineProvider( +class DefaultPinnedEventsTimelineProvider( private val room: JoinedRoom, private val syncService: SyncService, private val dispatchers: CoroutineDispatchers, -) : TimelineProvider { +) : PinnedEventsTimelineProvider { private val _timelineStateFlow: MutableStateFlow> = MutableStateFlow(AsyncData.Uninitialized) From 7421e6545c603640fb5eb75463abd1a9e5972832 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jorge=20Mart=C3=ADn?= Date: Mon, 3 Nov 2025 14:43:57 +0100 Subject: [PATCH 28/46] Pass around `fromPinnedEvents` so we can use it to decide whether to forward the event from the main timeline or the pinned events one --- .../features/messages/api/MessagesEntryPoint.kt | 2 +- .../android/features/messages/impl/MessagesFlowNode.kt | 8 ++++---- .../pinned/banner/PinnedMessagesBannerPresenter.kt | 4 ++-- .../impl/pinned/list/PinnedMessagesListPresenter.kt | 4 ++-- .../pinned/banner/PinnedMessagesBannerPresenterTest.kt | 4 ++-- .../pinned/list/PinnedMessagesListPresenterTest.kt | 4 ++-- .../features/roomdetails/api/RoomDetailsEntryPoint.kt | 2 +- .../features/roomdetails/impl/RoomDetailsFlowNode.kt | 10 +++++----- .../features/userprofile/impl/UserProfileFlowNode.kt | 2 +- .../mediaviewer/api/MediaGalleryEntryPoint.kt | 2 +- .../libraries/mediaviewer/api/MediaViewerEntryPoint.kt | 2 +- .../impl/datasource/MediaGalleryDataSource.kt | 5 +++++ .../impl/gallery/root/MediaGalleryFlowNode.kt | 6 +++--- .../mediaviewer/impl/viewer/MediaViewerDataSource.kt | 2 ++ .../mediaviewer/impl/viewer/MediaViewerNavigator.kt | 2 +- .../mediaviewer/impl/viewer/MediaViewerNode.kt | 4 ++-- .../mediaviewer/impl/viewer/MediaViewerPresenter.kt | 2 +- .../impl/viewer/SingleMediaGalleryDataSource.kt | 2 ++ 18 files changed, 38 insertions(+), 29 deletions(-) diff --git a/features/messages/api/src/main/kotlin/io/element/android/features/messages/api/MessagesEntryPoint.kt b/features/messages/api/src/main/kotlin/io/element/android/features/messages/api/MessagesEntryPoint.kt index 54df2b7fec..901a243945 100644 --- a/features/messages/api/src/main/kotlin/io/element/android/features/messages/api/MessagesEntryPoint.kt +++ b/features/messages/api/src/main/kotlin/io/element/android/features/messages/api/MessagesEntryPoint.kt @@ -35,7 +35,7 @@ interface MessagesEntryPoint : FeatureEntryPoint { fun navigateToRoomDetails() fun navigateToRoomMemberDetails(userId: UserId) fun handlePermalinkClick(data: PermalinkData, pushToBackstack: Boolean) - fun forwardEvent(eventId: EventId) + fun forwardEvent(eventId: EventId, fromPinnedEvents: Boolean) fun navigateToRoom(roomId: RoomId) } diff --git a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/MessagesFlowNode.kt b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/MessagesFlowNode.kt index 7d468354d8..b4320ab69e 100644 --- a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/MessagesFlowNode.kt +++ b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/MessagesFlowNode.kt @@ -35,7 +35,7 @@ import io.element.android.features.messages.api.MessagesEntryPoint import io.element.android.features.messages.api.MessagesEntryPointNode import io.element.android.features.messages.impl.attachments.Attachment import io.element.android.features.messages.impl.attachments.preview.AttachmentsPreviewNode -import io.element.android.features.messages.impl.pinned.PinnedEventsTimelineProvider +import io.element.android.features.messages.impl.pinned.DefaultPinnedEventsTimelineProvider import io.element.android.features.messages.impl.pinned.list.PinnedMessagesListNode import io.element.android.features.messages.impl.report.ReportMessageNode import io.element.android.features.messages.impl.threads.ThreadedMessagesNode @@ -115,7 +115,7 @@ class MessagesFlowNode( private val roomNamesCache: RoomNamesCache, private val mentionSpanUpdater: MentionSpanUpdater, private val mentionSpanTheme: MentionSpanTheme, - private val pinnedEventsTimelineProvider: PinnedEventsTimelineProvider, + private val pinnedEventsTimelineProvider: DefaultPinnedEventsTimelineProvider, private val timelineController: TimelineController, private val knockRequestsListEntryPoint: KnockRequestsListEntryPoint, private val dateFormatter: DateFormatter, @@ -315,9 +315,9 @@ class MessagesFlowNode( this@MessagesFlowNode.viewInTimeline(eventId) } - override fun forwardEvent(eventId: EventId) { + override fun forwardEvent(eventId: EventId, fromPinnedEvents: Boolean) { // Need to go to the parent because of the overlay - callback.forwardEvent(eventId) + callback.forwardEvent(eventId, fromPinnedEvents) } } mediaViewerEntryPoint.createNode( diff --git a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/pinned/banner/PinnedMessagesBannerPresenter.kt b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/pinned/banner/PinnedMessagesBannerPresenter.kt index 5833da56dc..c0f2cccb6f 100644 --- a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/pinned/banner/PinnedMessagesBannerPresenter.kt +++ b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/pinned/banner/PinnedMessagesBannerPresenter.kt @@ -18,7 +18,7 @@ import androidx.compose.runtime.rememberUpdatedState import androidx.compose.runtime.saveable.rememberSaveable import androidx.compose.runtime.setValue import dev.zacsweers.metro.Inject -import io.element.android.features.messages.impl.pinned.PinnedEventsTimelineProvider +import io.element.android.features.messages.impl.pinned.DefaultPinnedEventsTimelineProvider import io.element.android.libraries.architecture.AsyncData import io.element.android.libraries.architecture.Presenter import io.element.android.libraries.matrix.api.room.BaseRoom @@ -35,7 +35,7 @@ import kotlinx.coroutines.flow.onEach class PinnedMessagesBannerPresenter( private val room: BaseRoom, private val itemFactory: PinnedMessagesBannerItemFactory, - private val pinnedEventsTimelineProvider: PinnedEventsTimelineProvider, + private val pinnedEventsTimelineProvider: DefaultPinnedEventsTimelineProvider, ) : Presenter { private val pinnedItems = mutableStateOf>>(AsyncData.Uninitialized) diff --git a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/pinned/list/PinnedMessagesListPresenter.kt b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/pinned/list/PinnedMessagesListPresenter.kt index 6d09e12447..764286ce2e 100644 --- a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/pinned/list/PinnedMessagesListPresenter.kt +++ b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/pinned/list/PinnedMessagesListPresenter.kt @@ -26,7 +26,7 @@ import io.element.android.features.messages.impl.UserEventPermissions import io.element.android.features.messages.impl.actionlist.ActionListState import io.element.android.features.messages.impl.actionlist.model.TimelineItemAction import io.element.android.features.messages.impl.link.LinkState -import io.element.android.features.messages.impl.pinned.PinnedEventsTimelineProvider +import io.element.android.features.messages.impl.pinned.DefaultPinnedEventsTimelineProvider import io.element.android.features.messages.impl.timeline.TimelineRoomInfo import io.element.android.features.messages.impl.timeline.factories.TimelineItemsFactory import io.element.android.features.messages.impl.timeline.factories.TimelineItemsFactoryConfig @@ -66,7 +66,7 @@ class PinnedMessagesListPresenter( @Assisted private val navigator: PinnedMessagesListNavigator, private val room: JoinedRoom, timelineItemsFactoryCreator: TimelineItemsFactory.Creator, - private val timelineProvider: PinnedEventsTimelineProvider, + private val timelineProvider: DefaultPinnedEventsTimelineProvider, private val timelineProtectionPresenter: Presenter, private val linkPresenter: Presenter, private val snackbarDispatcher: SnackbarDispatcher, diff --git a/features/messages/impl/src/test/kotlin/io/element/android/features/messages/impl/pinned/banner/PinnedMessagesBannerPresenterTest.kt b/features/messages/impl/src/test/kotlin/io/element/android/features/messages/impl/pinned/banner/PinnedMessagesBannerPresenterTest.kt index 38182dec1d..b1be33d928 100644 --- a/features/messages/impl/src/test/kotlin/io/element/android/features/messages/impl/pinned/banner/PinnedMessagesBannerPresenterTest.kt +++ b/features/messages/impl/src/test/kotlin/io/element/android/features/messages/impl/pinned/banner/PinnedMessagesBannerPresenterTest.kt @@ -8,7 +8,7 @@ package io.element.android.features.messages.impl.pinned.banner import com.google.common.truth.Truth.assertThat -import io.element.android.features.messages.impl.pinned.PinnedEventsTimelineProvider +import io.element.android.features.messages.impl.pinned.DefaultPinnedEventsTimelineProvider import io.element.android.libraries.eventformatter.test.FakePinnedMessagesBannerFormatter import io.element.android.libraries.matrix.api.room.JoinedRoom import io.element.android.libraries.matrix.api.sync.SyncService @@ -195,7 +195,7 @@ class PinnedMessagesBannerPresenterTest { internal fun TestScope.createPinnedEventsTimelineProvider( room: JoinedRoom = FakeJoinedRoom(), syncService: SyncService = FakeSyncService(), -) = PinnedEventsTimelineProvider( +) = DefaultPinnedEventsTimelineProvider( room = room, syncService = syncService, dispatchers = testCoroutineDispatchers(), diff --git a/features/messages/impl/src/test/kotlin/io/element/android/features/messages/impl/pinned/list/PinnedMessagesListPresenterTest.kt b/features/messages/impl/src/test/kotlin/io/element/android/features/messages/impl/pinned/list/PinnedMessagesListPresenterTest.kt index 07778ab381..5087bd3558 100644 --- a/features/messages/impl/src/test/kotlin/io/element/android/features/messages/impl/pinned/list/PinnedMessagesListPresenterTest.kt +++ b/features/messages/impl/src/test/kotlin/io/element/android/features/messages/impl/pinned/list/PinnedMessagesListPresenterTest.kt @@ -13,7 +13,7 @@ import io.element.android.features.messages.impl.actionlist.anActionListState import io.element.android.features.messages.impl.actionlist.model.TimelineItemAction import io.element.android.features.messages.impl.fixtures.aTimelineItemsFactoryCreator import io.element.android.features.messages.impl.link.aLinkState -import io.element.android.features.messages.impl.pinned.PinnedEventsTimelineProvider +import io.element.android.features.messages.impl.pinned.DefaultPinnedEventsTimelineProvider import io.element.android.features.messages.impl.timeline.model.TimelineItem import io.element.android.features.messages.impl.timeline.protection.aTimelineProtectionState import io.element.android.libraries.designsystem.utils.snackbar.SnackbarDispatcher @@ -300,7 +300,7 @@ class PinnedMessagesListPresenterTest { analyticsService: AnalyticsService = FakeAnalyticsService(), featureFlagService: FakeFeatureFlagService = FakeFeatureFlagService(), ): PinnedMessagesListPresenter { - val timelineProvider = PinnedEventsTimelineProvider( + val timelineProvider = DefaultPinnedEventsTimelineProvider( room = room, syncService = syncService, dispatchers = testCoroutineDispatchers(), diff --git a/features/roomdetails/api/src/main/kotlin/io/element/android/features/roomdetails/api/RoomDetailsEntryPoint.kt b/features/roomdetails/api/src/main/kotlin/io/element/android/features/roomdetails/api/RoomDetailsEntryPoint.kt index 3a690ddea6..96ff1ae96e 100644 --- a/features/roomdetails/api/src/main/kotlin/io/element/android/features/roomdetails/api/RoomDetailsEntryPoint.kt +++ b/features/roomdetails/api/src/main/kotlin/io/element/android/features/roomdetails/api/RoomDetailsEntryPoint.kt @@ -40,7 +40,7 @@ interface RoomDetailsEntryPoint : FeatureEntryPoint { fun navigateToGlobalNotificationSettings() fun navigateToRoom(roomId: RoomId, serverNames: List) fun handlePermalinkClick(data: PermalinkData, pushToBackstack: Boolean) - fun startForwardEventFlow(eventId: EventId) + fun startForwardEventFlow(eventId: EventId, fromPinnedEvents: Boolean) } fun createNode( diff --git a/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/RoomDetailsFlowNode.kt b/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/RoomDetailsFlowNode.kt index d31adaae8d..5eee694786 100644 --- a/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/RoomDetailsFlowNode.kt +++ b/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/RoomDetailsFlowNode.kt @@ -299,7 +299,7 @@ class RoomDetailsFlowNode( // Cannot happen } - override fun forwardEvent(eventId: EventId) { + override fun forwardEvent(eventId: EventId, fromPinnedEvents: Boolean) { // Cannot happen } } @@ -331,8 +331,8 @@ class RoomDetailsFlowNode( callback.handlePermalinkClick(permalinkData, pushToBackstack = false) } - override fun forward(eventId: EventId) { - callback.startForwardEventFlow(eventId) + override fun forward(eventId: EventId, fromPinnedEvents: Boolean) { + callback.startForwardEventFlow(eventId, fromPinnedEvents) } } mediaGalleryEntryPoint.createNode( @@ -358,8 +358,8 @@ class RoomDetailsFlowNode( callback.handlePermalinkClick(data, pushToBackstack) } - override fun forwardEvent(eventId: EventId) { - callback.startForwardEventFlow(eventId) + override fun forwardEvent(eventId: EventId, fromPinnedEvents: Boolean) { + callback.startForwardEventFlow(eventId, fromPinnedEvents) } override fun navigateToRoom(roomId: RoomId) { diff --git a/features/userprofile/impl/src/main/kotlin/io/element/android/features/userprofile/impl/UserProfileFlowNode.kt b/features/userprofile/impl/src/main/kotlin/io/element/android/features/userprofile/impl/UserProfileFlowNode.kt index fd019c3587..0b36452b45 100644 --- a/features/userprofile/impl/src/main/kotlin/io/element/android/features/userprofile/impl/UserProfileFlowNode.kt +++ b/features/userprofile/impl/src/main/kotlin/io/element/android/features/userprofile/impl/UserProfileFlowNode.kt @@ -103,7 +103,7 @@ class UserProfileFlowNode( // Cannot happen } - override fun forwardEvent(eventId: EventId) { + override fun forwardEvent(eventId: EventId, fromPinnedEvents: Boolean) { // Cannot happen } } diff --git a/libraries/mediaviewer/api/src/main/kotlin/io/element/android/libraries/mediaviewer/api/MediaGalleryEntryPoint.kt b/libraries/mediaviewer/api/src/main/kotlin/io/element/android/libraries/mediaviewer/api/MediaGalleryEntryPoint.kt index dd71f302d4..2fdcaf1bd0 100644 --- a/libraries/mediaviewer/api/src/main/kotlin/io/element/android/libraries/mediaviewer/api/MediaGalleryEntryPoint.kt +++ b/libraries/mediaviewer/api/src/main/kotlin/io/element/android/libraries/mediaviewer/api/MediaGalleryEntryPoint.kt @@ -23,6 +23,6 @@ interface MediaGalleryEntryPoint : FeatureEntryPoint { interface Callback : Plugin { fun onBackClick() fun viewInTimeline(eventId: EventId) - fun forward(eventId: EventId) + fun forward(eventId: EventId, fromPinnedEvents: Boolean) } } diff --git a/libraries/mediaviewer/api/src/main/kotlin/io/element/android/libraries/mediaviewer/api/MediaViewerEntryPoint.kt b/libraries/mediaviewer/api/src/main/kotlin/io/element/android/libraries/mediaviewer/api/MediaViewerEntryPoint.kt index 201573dc70..ab1c78abea 100644 --- a/libraries/mediaviewer/api/src/main/kotlin/io/element/android/libraries/mediaviewer/api/MediaViewerEntryPoint.kt +++ b/libraries/mediaviewer/api/src/main/kotlin/io/element/android/libraries/mediaviewer/api/MediaViewerEntryPoint.kt @@ -31,7 +31,7 @@ interface MediaViewerEntryPoint : FeatureEntryPoint { interface Callback : Plugin { fun onDone() fun viewInTimeline(eventId: EventId) - fun forwardEvent(eventId: EventId) + fun forwardEvent(eventId: EventId, fromPinnedEvents: Boolean) } data class Params( diff --git a/libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/datasource/MediaGalleryDataSource.kt b/libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/datasource/MediaGalleryDataSource.kt index eb822b4969..46bfedacb1 100644 --- a/libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/datasource/MediaGalleryDataSource.kt +++ b/libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/datasource/MediaGalleryDataSource.kt @@ -32,6 +32,7 @@ interface MediaGalleryDataSource { fun start() fun groupedMediaItemsFlow(): Flow> fun getLastData(): AsyncData + fun fromPinnedEvents(): Boolean suspend fun loadMore(direction: Timeline.PaginationDirection) suspend fun deleteItem(eventId: EventId) } @@ -46,6 +47,10 @@ class TimelineMediaGalleryDataSource( ) : MediaGalleryDataSource { private var timeline: Timeline? = null + override fun fromPinnedEvents(): Boolean { + return timeline?.mode == Timeline.Mode.PinnedEvents + } + private val groupedMediaItemsFlow = MutableSharedFlow>(replay = 1) override fun groupedMediaItemsFlow(): Flow> = groupedMediaItemsFlow diff --git a/libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/gallery/root/MediaGalleryFlowNode.kt b/libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/gallery/root/MediaGalleryFlowNode.kt index cc71b49dac..e21da04586 100644 --- a/libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/gallery/root/MediaGalleryFlowNode.kt +++ b/libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/gallery/root/MediaGalleryFlowNode.kt @@ -85,7 +85,7 @@ class MediaGalleryFlowNode( } override fun forward(eventId: EventId) { - callback.forward(eventId) + callback.forward(eventId, fromPinnedEvents = false) } override fun showItem(item: MediaItem.Event) { @@ -119,9 +119,9 @@ class MediaGalleryFlowNode( callback.viewInTimeline(eventId) } - override fun forwardEvent(eventId: EventId) { + override fun forwardEvent(eventId: EventId, fromPinnedEvents: Boolean) { // Need to go to the parent because of the overlay - callback.forward(eventId) + callback.forward(eventId, fromPinnedEvents) } } mediaViewerEntryPoint.createNode( diff --git a/libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/viewer/MediaViewerDataSource.kt b/libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/viewer/MediaViewerDataSource.kt index 1046a80fe3..62d87a770a 100644 --- a/libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/viewer/MediaViewerDataSource.kt +++ b/libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/viewer/MediaViewerDataSource.kt @@ -61,6 +61,8 @@ class MediaViewerDataSource( private val localMediaStates: MutableMap>> = mutableMapOf() + fun fromPinnedEvents(): Boolean = galleryDataSource.fromPinnedEvents() + fun setup() { galleryDataSource.start() } diff --git a/libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/viewer/MediaViewerNavigator.kt b/libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/viewer/MediaViewerNavigator.kt index 77e253dfa5..b3fa321170 100644 --- a/libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/viewer/MediaViewerNavigator.kt +++ b/libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/viewer/MediaViewerNavigator.kt @@ -11,6 +11,6 @@ import io.element.android.libraries.matrix.api.core.EventId interface MediaViewerNavigator { fun onViewInTimelineClick(eventId: EventId) - fun onForwardClick(eventId: EventId) + fun onForwardClick(eventId: EventId, fromPinnedEvents: Boolean) fun onItemDeleted() } diff --git a/libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/viewer/MediaViewerNode.kt b/libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/viewer/MediaViewerNode.kt index 79a95c4648..195f1589d6 100644 --- a/libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/viewer/MediaViewerNode.kt +++ b/libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/viewer/MediaViewerNode.kt @@ -64,8 +64,8 @@ class MediaViewerNode( callback.viewInTimeline(eventId) } - override fun onForwardClick(eventId: EventId) { - callback.forwardEvent(eventId) + override fun onForwardClick(eventId: EventId, fromPinnedEvents: Boolean) { + callback.forwardEvent(eventId, fromPinnedEvents) } override fun onItemDeleted() { diff --git a/libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/viewer/MediaViewerPresenter.kt b/libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/viewer/MediaViewerPresenter.kt index 726e9989ce..be10af3f6d 100644 --- a/libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/viewer/MediaViewerPresenter.kt +++ b/libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/viewer/MediaViewerPresenter.kt @@ -119,7 +119,7 @@ class MediaViewerPresenter( } is MediaViewerEvents.Forward -> { mediaBottomSheetState = MediaBottomSheetState.Hidden - navigator.onForwardClick(event.eventId) + navigator.onForwardClick(event.eventId, fromPinnedEvents = dataSource.fromPinnedEvents()) } is MediaViewerEvents.OpenInfo -> coroutineScope.launch { mediaBottomSheetState = MediaBottomSheetState.MediaDetailsBottomSheetState( diff --git a/libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/viewer/SingleMediaGalleryDataSource.kt b/libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/viewer/SingleMediaGalleryDataSource.kt index 94ac0fea21..1d683fd8da 100644 --- a/libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/viewer/SingleMediaGalleryDataSource.kt +++ b/libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/viewer/SingleMediaGalleryDataSource.kt @@ -27,6 +27,8 @@ class SingleMediaGalleryDataSource( override fun start() = Unit override fun groupedMediaItemsFlow() = flowOf(AsyncData.Success(data)) override fun getLastData(): AsyncData = AsyncData.Success(data) + override fun fromPinnedEvents(): Boolean = false + override suspend fun loadMore(direction: Timeline.PaginationDirection) = Unit override suspend fun deleteItem(eventId: EventId) = Unit From 0bed2ae386126756b22f16bda077a6181854e302 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jorge=20Mart=C3=ADn?= Date: Mon, 3 Nov 2025 14:44:29 +0100 Subject: [PATCH 29/46] Use the new `fromPinnedEvents` parameter in `JoinedRoomLoadedFlowNode` through `TimelineBindings` --- .../room/joined/JoinedRoomLoadedFlowNode.kt | 19 +++++++++++++------ 1 file changed, 13 insertions(+), 6 deletions(-) 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 index 16eaff89b1..8216ee512c 100644 --- 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 @@ -22,10 +22,12 @@ 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.messages.api.MessagesEntryPointNode +import io.element.android.features.messages.api.pinned.PinnedEventsTimelineProvider import io.element.android.features.roomdetails.api.RoomDetailsEntryPoint import io.element.android.features.space.api.SpaceEntryPoint import io.element.android.libraries.architecture.BackstackView @@ -44,6 +46,7 @@ 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.libraries.matrix.api.timeline.TimelineProvider import io.element.android.services.appnavstate.api.ActiveRoomsHolder import io.element.android.services.appnavstate.api.AppNavigationStateService import kotlinx.coroutines.CoroutineScope @@ -136,8 +139,8 @@ class JoinedRoomLoadedFlowNode( callback.handlePermalinkClick(data, pushToBackstack) } - override fun startForwardEventFlow(eventId: EventId) { - backstack.push(NavTarget.ForwardEvent(eventId)) + override fun startForwardEventFlow(eventId: EventId, fromPinnedEvents: Boolean) { + backstack.push(NavTarget.ForwardEvent(eventId, fromPinnedEvents)) } } return roomDetailsEntryPoint.createNode( @@ -169,7 +172,11 @@ class JoinedRoomLoadedFlowNode( createSpaceNode(buildContext) } is NavTarget.ForwardEvent -> { - val timelineProvider = { MutableStateFlow(inputs.room.liveTimeline).asStateFlow() } + 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) { @@ -228,8 +235,8 @@ class JoinedRoomLoadedFlowNode( callback.handlePermalinkClick(data, pushToBackstack) } - override fun forwardEvent(eventId: EventId) { - backstack.push(NavTarget.ForwardEvent(eventId)) + override fun forwardEvent(eventId: EventId, fromPinnedEvents: Boolean) { + backstack.push(NavTarget.ForwardEvent(eventId, fromPinnedEvents)) } override fun navigateToRoom(roomId: RoomId) { @@ -266,7 +273,7 @@ class JoinedRoomLoadedFlowNode( data class RoomMemberDetails(val userId: UserId) : NavTarget @Parcelize - data class ForwardEvent(val eventId: EventId) : NavTarget + data class ForwardEvent(val eventId: EventId, val fromPinnedEvents: Boolean) : NavTarget @Parcelize data object RoomNotificationSettings : NavTarget From 19b0e27ab20f1e919c3b11556fb19d50b070aeb4 Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Mon, 3 Nov 2025 14:58:40 +0100 Subject: [PATCH 30/46] Update notification sound --- .../push/impl/src/main/res/raw/message.mp3 | Bin 22414 -> 8685 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/libraries/push/impl/src/main/res/raw/message.mp3 b/libraries/push/impl/src/main/res/raw/message.mp3 index 5e9645adaf1f2b7435ef29360c690b8ddc405d3a..abc056786c8504a9441ed74e955d9dcfa6bac927 100644 GIT binary patch literal 8685 zcmd^^cQhQ)!}rJTYOAwYHLC^@RwsnjqJ&s1QDgNkM2K$n-b+@CUZa<25nYr>wCITz zL?noiLS!F)&-0%1{_+0({PTYPn7Q}dnYrKj+%q$G&ec+rfB;wUUmcFB_~!Y@g_BIk;-OB%1}zU1{4Gnah0V(*fZD+rfdCArLOdzD%Cs`7u}1^-Wp zt4}9)i<)qrX$JtH9`;EpYXpESUQDaR1L6hpd-@#2{jS~ygil9(l52f-9a!- zbw{O2=8wY~aOvNHSlKQ?)aBin+Y9!0^x{oeiENnv{zVH@y=Rz$uD~Pw$dA3~p}N#wU730r5L928#8?h%T$&`##T_Pq>HYBgvIhRWvl5SvhmZ~3C96aBAEHG~=QogWP;WS6fZhEN3ul5tqwW` z&;kJYgF*KfEABV|C^fCGi&whx4+X$g3imzSivT&EJj)RnkZjj!)me$7-6Xxy&WQ!( zxClZtacYmXJ*nV>n(ds~r=3Y$fx zu{%(pr}l(nWk&zddSo^ize-a`arT*#4uqxgGr3B-sJ(uBoBmwno91i*KyT+vQNMB- z>`HNTb#`V$!uOa5GH zdD1#&P)J}TRWdB$I{Z5%qbgR)b%w4YiqUx6mzgKjN*Zmy*yL^S!%q1X#E242e*BCY z{YF}xLivV@sh2_3fO8vW{E4@QZAGB|uX&}^g&~uJha3lZFT$GcF9N#li8xutCbJ-D zF7)%G%Pv>6wNNjn)%z~P))=voZ7tT@MKPE*&E?%}Q8iIocq@$^E`T<4;5AKts6TtB zF1m}s<6|#RWOb{CrLXX1YYViJFjUpJsj<9iy7Er}fD0AY4y>^d$^J9jH*kPx^2czgUE#>2QCVD(FcXQxz&~s%6EnL z`a96L^q@0X>XY6JAB$^6`0MvD^C4mdzbUFBN0F;pQ%yN7y=<5$_yC1~aea%1PMZ&@ zl`yeS%gvTt!hWbwdG6ZfW4Jb)UH2EY*NR=qSRp7wG z)BBw+Xfdu_AvR)4ngUVP`i*K-SCr5Ra~bvL$4J~wu>uUKGCx2({&k2r_f-q+skD}C zZ~baY*o}}mt=kX$m>z7{th8Z+Z% zx8~*-r`+rI39AR^_o#^AS=@S4B47pGAv8s`SekWE%vA_jpawz_F<~4V{*nR?= zAQvkbf0Sb)6Uo5 zBh_CAuvS!Z@$oez!Qtq#&TyM|Ct0YLfHU0ZZ~8X9${;^-#7Wl|?}LYVFyh!xsFF&< z+NnLQgHJeB?$>D38jS+J7Pa3ym1b)`x7FX@7I{^t!6vmNI`4Wy3m6z|B=h3q9z~|D z*>L>Adg?@ix-|GiKnv=DhU4dnFuH85HH`%6wf2)xLJa_rfk+UWUj%?b5>IPMeQ#UX zlphe`H!2Soy7Es=2L7utxwRaR7O|G6;aFEs`F>3z#X$?z73uPr8PAmTCksInM${)F zAe%s)xSaX=diXkY^(;#x5`qkNNa!eDId#;aJC?MmwuMh0TUUbWgde{m}n&D;nR zj~1=(6DL_)Ek9i&}|YkWVA>UiW(Kj2&mk^K87?}99I_E z0$aC7l8I+<#D)yVq%AWj%f<&9wYQ>z! za!M-nYar~4YT#2u!^Z$ye64Hraaxq??2B@0{br*VVLQ5R%d9!tcXfllUGzM~zp#D# zs8AO|%XqYCbCaLHgJI_S9#Za?LkFbzAlkC~m8sWrtMk8*`C`#eYi3{LWpp`vxxNAb z9SBFXfkS}sWMOpSO{(}~N#z_IH5?w^|KI*0B%U-S56bq078 z6IrEF$H>+-UuvC9A{i%jcF*pWsyd@)9UtbR+sHiy^SaAyx$&axJ|rRPh?{#ST#rc{yn=jTB1Je>WMJP}tWuVZxJISM`K?{jyG0ytPVBF4p9M(2 z<1)=vYI|^g0{{FV_j1k!E`~Z!Ei>s1ZgqU9^8AiN^wS0n6`==8{^K72m+9#4*D)f+ ztf9T^*BO(shw=xt#<=15y^~`0eQ|$I3ApkD?^MO5QOohdS#iaKp{*0mww5nc(Wl-*Vjfb{=~%sK#>0mX&mNFB&PTNu zEp!zNN&tW+78typVMba1QD!$!mNgWo=P?{9{{z8xbeOWpYjyZzdrlC zP!C4@q#tEXo{E&Z>0-QCTX507XszMw(;XXSO1TKm-5-oBGFyvCF=x5&s8y~u%k<+N zU)HBrO?P_sv=6%l#<3$dMS8a4ExyDx_v8!a##XY&rvTk5I_Xq|InkpVpNyXq;|&b_ zOcOT3t+hW}Qc}l{aAY*S4U7Yx<*qBe?~5D}yUVCG?s7Rn&qBT2R-=cLqsfT;^O;ma zvF9Hpd6DErNYo6db7_5KtZhY*{Kn>QuH-DR=BS-oH9lcg@h9h@;m4f$knw7cexf{w zI90q`DLwvS=*tZz^T9^AuJ;u`u$#%Im6$nosY3Q*iejgM2=j z!e@6*uOB{G?;E-Iq!u8q3tPo8CZP}!>`5}24J%7!mgBqE^GNh!Dbp!Lf%g)ps+6P@8b2dJb=IlWVoz|nDV*Jotbr4UoQ6*H#V6wS_C)k3i5|3v) zSYcV5);;>Dm3utC_yIGMPF~`%DlSbnCE|T>y-XNNqoukNc|cKT-6r>SsJr0JyjW@e zS4iUG3_$+{l2%5#Xo>AD)$E}9)L?PVSRv(Vit#0#dm5`tAoDdTI$ziBp;-RC^v z!k~baU#Cssw6)mAhrz1;Z3#JrYkz4@vh(mBZ7>C$Vzw~#j4S`@IIx`j)c!-(zY^i` z!SEf%#Kwi22aV2s)8sWTaa<#2V}fd`_QoTGi(8=tY_ACppl^bh8}K1^m{teE7dPDP z=CM(4If3{HxMv_SRm@zpf=$q4sgj&2OS-f%^rubJ7ixtbN2fCO^Cd)Y;A0~at6c$u z2J-04gf)fUECNQI=S^Y%;HZ#**Z@~{F0NHHaYq^fWDG`1&qrsl>PG()VyO!(8pX^89kbilMPNsIR3(#vf$dgKgR-gGbhi}n$ zH>J=@|8-EmVg5GFaG365!+rJ||wF(63`8Sq`r z0)V*`9ULzuF9449PCuA6>z_i)3U?rF9xW`kwr6O+pDsz(9qf4efu$5h3;c%R;Ig!m z7OAubG;y;dV!-#O%>D)<#O#uqpm<^JfjS=VK>Cav*6Gy-Polb?%S)`hWU<$tt4$Sg znMu3SC}bPEV(@m1>=-=}MXbtDbn2Jb+#I{4+>$NPz3vr`E^bZWX&DL(mrlyPPn_pV z5l2MUDn=weElsm-U(sx9YV`nO^`I#UJz-_p*6r-Pv-|26)3T*Rdm#L0hm-ZJ zmEWZLc^-Q0Umrkfy;2U4&3(3kgsg!zSf*v|f*!sXhGGm5j!;SW36<`Jo?4N}F5_P> zpIhu!B#+B>0T8ofPXL5Z48z@#oFRqnpe0QJZ%q}u`AW^?x=Y6kb>iUV# zaIeBwGe^rYZ~ifBw-?CUGa1`C*{dOozDB1&^XF#zuy-e7bW=oYDM4E68emm}=5Bqx zyL|xB(k73&xh6H-k7sg183l@!rzj(8UPom>+otPW-XXo{&wXp2r@q`;9j=}|c#H+e zmMb&8jKw0NSYF1M!X>A!rKR5-Cq1)N&WhoE6BWtcGd>jNy_aeuzke@tbpKguT!*VK zuZVllq^$J>RZ#UvtRXz3G}|Hg$Emk-OQ69{ZA`;`!bM#W^7n@N0sYJBL#4*tjpkSZ ztX&#NWr0P7s<)i6u{1;WugbKV`1i*~E0$o<1~hbt*9KrquD%aZy?HXyj4-SK5tORPjLBo0zDE!i;2Fj~aC!9zp;bfC?Xd zW0giB98n?Ufe)uuI&R%-_m*8xt%h50FFYOoUQ!Rg?z8Yp=5SM7idlO7PSGZ

q)t zZ98?m7I$5NB$1MTu_RmyysMK6fvNB%!0e z4arpY?6OvfAR{6jrEwr}>3WSn6?g>`uTHuNRARP2KI8e0Vn4$uvthpzd>S&sbNL-% zfP?CtSSr~!mo_HEBVECTvxg7&ce)B2+>k@A=LhCdnvrA*EtAWycGg(C_DesXUq<@& z@5RVCPq?$uC(U7tE!w+0xLty0bO0Z$2&%)`nRfd}@1E6otx!Se+sf&|u*mYB3w(!@ zv0TKo@}U_3vvcvpk%;s`n%!<8*z6gjZr%LbU@wQ(m&9+APTge{NrgnP&N8^oZmjto zb!V`Kgx-x-CsyDNt}9EOA~1a_5D-SxP^)K`LeAfO*`5AAe>t$%4hhTiGvM^!jp>JW zN0wP%{iP(ngFTGHul!Ghf%?H=5^@%#U$9uLz&$g%a)+E zlyQTf0l6no9Q)(@FBWg*UpF;7D3eyiEQWgqyv|>Q{X1FH1cXL?ji*W_V_v!)K@;YljDQ03b>a27+WUTE`j6AkRgKT6zw!jmM6F|RKyralV(1-=wO=ei2p(p9m zb0weJ)Xt@JGXVbkC_p4NBVy)j{1P|dPa-ZTapixT2vjJeWgE?kP#OFZ3>j2?A*>Nm{uFFCICotov6v(dl2{X*M6XT&GixlQGcP8}h{40;5koV|Bz2 znA}FY`P405IlMb;uJXAl3V!g1J+O%aW=_YfXg^e4hPR+kF=+~04+ND_x={GOj!#qb z_}K)}ddn$ai$M==(Z59aVcCyRu|lBybn(Y6AO9TF^^6BqodDsjn#X_WDiRM_iGMq< z$A!Zc`}O7~kU!)i18$btEa$M?NlD_~`}TP@VJQ8;vfy6Ytd5^JK8{COhgYa;yer0#{-aa!4jtE9(Ug4rDXgW`Ef#Hi;YY>o#7N^Ijru#Ls&;dwM_>3IaD z7ZIWa9sQ;rD4K&S2$gL6^HbBYauE?bLgR?SaHJX60y}Dqq_?NWg#dC701%x}u86U6 z(jVgnQEBrMX9!PU`QHqa2vi!G$VH~Qy#BpNq6wl_CS{>^8X$@++%k%wtWw|~udzQ6 zEBrGOTDNB2noG!k>8;(M)qPR&cUksS5YF-}m$qrN$?R4-JDIn+<)pyZN1yf85I`vAK6= zI=bk$BBkw9^X9h^o40wu?FwnZ)=83WX%?Km0yFmnes~O4f9M(>ViWhc_RXWf!$JD1 zjub=Ci(ZLB#mr&RwoY@&IJz9ybAsu!kJVVD3>B!f(%X%`W}mLwR9;%D02(top6F1p zSHm#w>n8kat@CHf{u6yZ`zMt=tCv51Pd2tYE8p2-CmAJ+%P6k9&ebuNxOYB!ubvoU zg|DcSKhtWKtJpWy5gZkOStv_(TFEY;k_AXN`etr_#z}lF`TEI_*1{fLoeiUo zuH%ZRwJNL0=%0MS45#XmTPyAu-~1&Fe*2Gb%{a%fEB~EwvoM7_6V_sghuUQ2q$D6+ z9}ZZBTc2_?mrWE`j=%9-r&fR;ve{n6A_8v;sSFSr^2*zCF`>2h=wUukg#SzUXZGv@ zqd48WJ_!gAQ~0tc+c|)SEwBv7*weTMY5B+|XGhje(qjWd8XDSh&&1c(+KibgKFx!X zshbiC!;;wHDreXb1!PE;-!A;;qp;DCk%@6RPjlDa*Q!4JYbHwPj@9Seza#-bNRyQ> zuxF571vwp>!^(XYFT40Y=2Ll6dwN+(rK6eoulgZ#9nEghO{E2O;`FXmH}BRTTom*y zBXWFM2LA#$@y>tuJ~kK6Ivkq!vi*4}s zFFEg~%%Ujva-!+l?bd9*3L^BPZkrI4&Tlv0mOX3hezJEg4t@^J75m$vrVV)K(jtdHYNBwh_H+OS!#tD|ZnmA%Wx6B^t`e&3?^z$D4^h#A!gd!m=- zX&3Rlcs zDN@LzUO~sCAsB^`$ln$W+rM7l&Mdzhtc7w_Q)xN3aN5YQ<14g?3CSrklzzq{cjhgmcN(5R{XiuZ<*;y zl3kP&du?l8J-;yiZ1%jS)<&vVyS*h8*{2&K{&ji7z|(-W+M({~GqY$EgSfr%F`CiS z=~g2q7Q*}IJ}0rN+M|xR+EWynC5(fJ@4abGPQHmsjxWFE!^H}CiNiqFYHL&a`e)Pmq*fBbzYwb##GSZN6!Ej8!6qY3pmOnlCCLA$o%|Obe-s%2 literal 22414 zcmeGEWl$X77ygS5?(Uia1{-Wa2Q-NxVw`;aCdii_n-;xZV8s)4hfn->?FT` zopWB^m$&NP@26^acXfAFcR$rnuf12VZe=-sG{9egatLJv?C%2I-zM*5?QHGh1ypzS zvbXUETKEIil;xD|tj(=tHPqDp?m+RkS-aQ*e0_a+o$amc|83&6bano_`ak|t;6DZa zQ{X=Z{!`#T1^!duKL!3%;6DZaQ{X=Z{!`#T1^$0rfj>VEto}b;qOyyP>)(Bd{x(to zKv4=n_z(L30se=`|4{sg?*Fj-hx`8s{zu~f$p0U;|LFQ3`kmV$cPnLuR`_WU=pk^arz6L%@&eS1sm>B58=v|k6Y7K3jK66`LL7$H|QldxM zpu)fM1t&bIoi}}Vf81SnZMg{ZRb7$aJ^c7n=yfxtHnscqx3EjOi!fcn^5#`@Rn@%Y z@t?=n)IUfIi4?1s3v5(ENbkT^Aqg9Ap*SsDkx0|De$;Kng@UeRd$||#WhyiZY z*rV&N?6$`F!e2hWf5Z6a58UzS3!~2VkMBRe^?wQcY4&gW=THBa>sOz?z5n0iDeu#d zyEpWb#j@xqgqjD%Kx}D%?4y(vv4|!y`imbG-wXbHmn4cB_=N?_5k7%nE@%3aez<^d?p6WABm;eJ51wb_l z=WACy_ly(JM}@IR}51)xD&>xf;INz|FdPyG)Xyhmb$Q0wkX$X?zy- z^_2K&-61^ParNb!t&@U%0Z%)bAfy=MlXgb!$uM_i(fh=@y}hBYB4u79Ex=~N}Z>pyMKFv=NI0svCff5jV+>swj?440Zr z54nvBDuGTQCK^hX1SpnhgUOl`5}2`oQzQrrHcT*ZH%xZD#~Ud^T0RSEQ{x1_lCs@)`#FGx{tA_85s;+bYo}*9{!jB|=jZfLkq{<}a zJwrM`fseC5HG|>?o2TPG;qwdgDL4hbo06TO%iH_GC^Nml|9UruAg!79TuyW6 z%+7CROb~cP55SmXn0j~G@G0Y)(NQ&zh%QK+}q`d_NFB^WQ8-2fgHh#IAap_Yy>SyXy`Dn)Z{Ki;h zy`%3(Q;M~Rt)cI|G54EqnLlK)%;$U!T+`nt_CAe^<^Fov@oE3tdy~)pNsfo$l&bLA z-xm;MEW?q&;E5&Xe59|#nH7k^1{-w@S&18ozVn1UKtCcGz%^GzM;m;H6d(>k0V5Hp zl^DfBN7UpYUz}qb(I@R_TZ2;H7s8h@9q!E6f3!42d*0B)>;+C z8f8QMG9!)>#H_6$Tyi-Wz{KhMZk!jAh$)M{(*>2{(Q(-Q1NFpPMlXJl#AV6O6&^)X zp~8!z2@NS^qS-CUAfO+jz!5T)XcT7?N)`&&TxKQH^-NfnAitL7N7r%IQ5C$vrk)d7 z;rJ}!2QgP@#{!M>M;1@Xlg*gphXl*89LO_G+n7NHw-996OxfmHbC`<306;OG*=;lG z6=iZCUP)IqjSZe%0r7rhrDH+U{K)#o7h8|V$mS8+10u){Hw(TyYf^7!FLk)6?gx*p zw^!vtQ`=oZ?T`!psJ$)eXx=d<@}A4KPT-!l+{UK3`gwl{!1ebbCC?CJ%4?{8_T#NGN-4n$8~yyiy<8>U{TQlmnUB`DOH6mT>=N z+*GU>w%)U!l{#z0TIgdceh9QM3}~f522L8z0v<#OJ$N9L7FEWjl=y?@9ss}!&z`q7 zB^X_Y3-pn@k;w#d5t*1ZdW={>0f7VNUlyimo1`}ewludqw@l=jTq63lUyWDvUQ17V@gD%O)h3C_XH}MXne7n)jfLj zQkflI2T>McKu2m|&^t@nK{X75@ys$_lq~h$YYtXErc_D5hvc}6ox;Br642#6v#2%L zIFx~-sPvq@o6cd*ax{(MhH-K52a@QmjLEV#@R`)arf^YmT-3zM)apHehBNpXD~cV} zCY$7|UuJ606`X5Pw$2%HU(~ES^7t?ep?VaYdbNTsp&a+sajBJ!h&%84#x;+h(+q6d zAM_i@1rDL?0Y7VEL=7!)U4ZX2^@qfupZ+ej%7_mYkq>~#W>5!S4{l}5rp(aKlJlsd z0^9~0#Vu#|ZZo1GA;X_MM{{82ZdMqoI8fkZ{K)4lLu{jrF2-jL#Htdi5PN`oH75GV zK+r9%>S2Kp59@nVtIG#h=ju$J)o-*u>k-ty1J;EJ*W0R$Eb$3zhrH+QLPfTFO&tTC z4x2i&2#Z{yMOoXv-|n9NWT@!(>V5dZ_v%vkm;T$l_UaRe%)lK)Ec6>B!2kqnP0tPqj}(%aE=@|_xRw%oMKI&(|{r_AenX}EEqeiXwB+pHSvMr&o{{t zgU&K|PYr~bB-dhUgGMjYE4Eo!M$Xgqus&KkShyNQ$kN1DhOW1J1mVlj!2&x46kqgz z*9%`xLVfNN!_+*n7cs|eh}J{TjO>t`dhe{6B0h`dDbVAxA~Cf6&=}HC;pjxWvWocO zHuk5*^PN%UC?8{?!SC;H9G8B7{sUiDQ*V0xr^eEiI_9_IpEd75NB=xVgYL(*{y(3; zPu`jwndo?&(+0Z1u?MgrB=|a%0B%T#2tRgIDZe!i8ZOBjNDYo9+Se*bJ@&P^k|ZmV z&ag*L2tsVu6#Qm(>TIki>o%)q1*U3>X9e^(5+Sc@Ou_b6=`gr5|FaJ~tcl8_aw*c? z!72BJPj|gRkDm&HmW>{q8#eROGIOu4e8u?!#kx(~@}!-ZQoiQx={vk3c${^u{WHP; zj-*=q#n(gIE26m^M|*$@nwnup>JZW}#0~ixb;{g4`@l9YZo!ozA{ogBctTc&IML$| zh7bZsg1t~CLtyAy!EjV5bO3r_I~72e1s;ql6&)U-xniB(zS18%)zY<=m)|CIQnC5Z zzdQgcq^IKf7oM-jUz8MHu?0O7JtWaMJsOtiEndIK@wd><{1|;kO~)%AT_kVCcUhg4 z;86MtbI#7od*Ler7el4%T&X+A79*p;-}5ZaZR+Q%LETJ(%9s+qy6%4}-zV#k9eFjm<zzPEwK z#qw>0@T$Eo%jLsbeM((IV4!O~x`1{?#^3%K09lRBMqxf;F;mIbM2Bu^2f^eE)wIw? zWy1`iM0%k`Vi(6FcTmRwgOW&m!bn_TG*SoylWJEA7p)8+#h}y{kXDlp^})|V3#DX` z(AC389zLhdZKKtpF|i(ugH*S_8*!G+>Y$LIyq4t}bkxxcME;Pd9QRt1V7k2dGQspo z$<^qsC}YH)G)Rd}YJb9h$^X6EO{cbzO0mH+{AbU^2W!Q-kFQ%du^4BIET#)!tZGEl z{)gw>hlUfiz9+h4JmeHu`bimC<@^+j;`SYijh(*uKU97kxy>>i^Hku5RrEOs0Jwjp zGEZP)e`HV~C8o0xQEF0jb^3z!le%1i8pvaVlTCn$(Ts9zm6JwkvqcRoX9~9<6Pd2G zoL02l^14Sk20rOx*H-ypo{`t#--G+s;S407dC?M<>FioZEtnQIC|{;2P)@F4GFANgnDS^s&a5TLE#s@-Ru^9Hz>-jfws4c!sFJr> ziYRd|rggw-bxhn;w;Pn#QD#i`%CO96dh4`N#r6x$X2#u0;MKwx zC&Br?-J!fxCo>|~IJh$KY1sio+ImIUcm<+ZPsCq{n z>`AXA0#Un$SxUd07FcKrU7MYFK zZo%1T;i`K}{aQ1o8To`Vp@9(1S?&>&!%te&v$WpONO~-S1HPsq|+*hCG9Uwu4u~o^^dmej%LIr zP{>8n008u0;(>g!8R7V^%h;?^+Zz%L13Ri5C@nyICCtQAkqa1Q))Lq^v$r#___Wk~ zXvDG_mpHhXQ8gl<*O&sILeg8EQAfmUUkl8Pr!g7t?p6=p^kh`>s;yG7>C6<<7!Er0 z-Ck)G);Wfb?hkKhV9dsH zqDdm?*P8a65VhlTU84_KzutcO*qb!VJ{EKsJ;<1As(n?m^y%Ab<@_8M2=$lB;kRk}JJajaf+(48|fWc9)q= z>867Z4e}4QU=!oTsHFbLcjyO z*mB2Om>UJgs8!lQP|7+v+3L}wqxuKx78bUXd9g2kIni{5$bFTRhfH`p^@0WSSm=5F zeRdmVC7y&WCtJGL#|w9RHc^%c)PGf8N?>Ip5CHia(21N2-m&OqjP%$Km~df=bwVzO z1_h)l{BCtn#*{-?m6Z*JUzs+^w7IX-^(Q8aln|4n`aKe7U)h8cFdQoj-Rey5M({_%PxZlc-?tNrjQ)td!vNju-$V*k3U#YZ4#TL{i;vT0lzBD;bB(pJ0 z=p`nUu7>wab>J5}AI(W13t6E+CX1=KR;)tb2WOJU)9jWdqgjf=;y(NClbnjDE zi#UFa#^s9=^)#3ARtXz70OB$M1b{FFM?y5DhoPK!w8B5zv-w%&VG#GhH_uhkBK!p_ zWQDk4S|qzt(%lcP$1b^otdqjwn-tl9FiBPl#gayqcRf66_1iIjFb@xU$LgmaZuj4L z-KrHxZswk7S5Q%j=Ft$ba|}gBYe$}QI_YT7bFHeX>=yZuE$i+MlYhBEchLM5*eCb7zoo0`r*p%2<&x&Nj39GM#Am;UyT_;P%EWI5&bfK5tNe~?am$a+ zWM9@Cy3f$tEGS)HE1PuBD|rfi>9+KJC{J-THF_MIx36fs94e=`uoc&rV)h?3kEE{8 zgV)5=CCg@`0v2r-p_aq@p|@7aF=$H4jJ(R0EKJP$wiy#D+O7Ke;ur zd$848ykz9}utxu)$Xgi))iDIZx_EyiY~VUN2sVAtdWP~?$IHMg#=}T74A-`M<*Hn5 zIGcMdddn75>u&LJM8{xXw#J5pBv`q1a5xexa=@8_pwhDSyqkeVs$sdzeRmdRXc?Ed zG2QXXnfa`qUr$dhJ%r^CJxzl#gIn`EE7YQ2bK9y@*%k*y*`f`hqqU~$P}0r1GV9pK zCmVNIr)QjSS-(*Od|a~8DPwHY_TC3^#kSp%?LWO9nele3B)s0DS54;jeoZS5yu^N$ zy8{69NC5`uFo1vkE9aAtMei@o|HB+|r6I!kCZ5d<;}lh6H)gn6V#n}TbIyPwe)y28 zQ}wjZ`Nz=>YLUTHtdaHPGKrd*YA0xL*BH`+Nt#%aOR{U^XA^D4VVs?MGrdC4b+mSI zE%mS1xJZS|2$sF!sBuq{g|BU+ScavC*z1f~(}4X4&3p-Cz#CcZ{e->*k1?{smFUwY zgHLAC^1dJCkL@g+Nb>m-<1}*g{Vd{xTaKulVVzGDH2%93foTM8%r{Q%dN=D|zfE+D zZ~9HepKf2RPkp$1O6mRTO$5|49nGGhs$(q&De`f=0Bs2ERM7LjrAztTl_9I#!%UsDRD~Ij_m$#rN+|y#EGL-+@^V`s{0 zM`ahCSI!VdM`Oj-x<_ZPGyVA`Ub0?AAr>rPb!IcN*Lt{GlHl&P8_a z5}j)4^o{zTlxH(Lmp2kj zPbCwX18)OA?2gT6Rq{4!-{|ATkn?c%tF$?{xGYm-Eu)3=XFZ#&YgEV?=b%U)h{7Nq z#KpZB7I$dgquTacB_yXFw8jiyg~s1+O%ujIpnZ7s?n939kF zPYWY1)sYB>;9HJrU|KSk))xHPVrEfHy3n+>wnhkP$mEUn+hT!XVN+6*x6MF$U~#4=+29GYF*CFtSEeg@>S3Q#)JOip`(40u8uoJLsOPc-{jb{ z)2-LDP~CCd7L-je6=$GMa|7KDK01Uho;(;$)i7m@h;}Q7kQLY#Pv*urgR(<_j>Igv ztqoThY@7Uy=O*z&BjP!}OpviWIQnb__Nx0HtyKRERpnQRIR=#rEYBMMD|ji74pUa@uD$V52T1(ydJi*%IRg6p&BA{aQl zVm9-)%fbR7EiIhd73b?^-tqM>OCI-|O2|K4v3QsL^RG+7hg^Rtyf4;nm-8a1Z@59` zG-p5gE)T+PpTC^^1xXISpwIZ^YNl;?WR5kXU!Tr`6xvj3Z&H%G-Dv;l05UNZvk zyw|gL4)E;;8Bk4TPLl6BM@3SaO%z~(W$(aR&MDR20lF)q7=Uz^Nfa&ecdBTzJ0R+O z5)%^(__J_3O&${Ny@=tf5(Z#+xQUF@HX+b7MV4_F*m`zc5;FR(>*6}R{JGyqpJ@jr z_T;v=BSGom;n0_y)6GsT6>T!XD!GpGnw`w|W$SAcQyLZK{;zY&M}##HENy-=&*rEl zd`LH}$B)`j_2Q-rbrdJnhs6<`-u}c1s_G(3V3`oGFVwjXv=io)XPo^rh~f zAD2=LwODql*)b~9WLA`fG-ICzf2U%Kdbd=ws*wXdIKaaRr^JHJyvQ*E1k2HL6N8aJ z>7|*8Ce6C7gbNNm(&k?A)QfXvIzGdU>BNJrqqL|tnviavwU_f~Ka@P^FXt|&;em34 zyJZhEDa3D^O-qZJxZIN05RWraqMUh<#Y_x|FNVtT)F&+dHJ2F*bl*0t^#yCK9i>W^ zirfg+5$(>FD+VV<-Sm|XuUE1W)wxue=`+_KpUuU_4=o&HaT67;;_GslHZnTUmfs*f zE!;$RH|X1#v-R_co;a5(4h@x8vNfg}3k4`P((rMq@h|J<34QBp?*dvx!vi8)T%Pdc zcQsBP{rl&mo?7|CK>3eCXNjZ#CK*={1GwiJK=3n8*pi&3#@la`9 zz}MJ%Z!^F4OeJ%_bQi|#`apZB*7eu03+7U8UEFx`EDfc=N#n zY0Wxl()vrp@R8zSKCc8T4beiS5j*H5$?w7}-kGGAiWhWA@RGG^V>A*hL7!Mu% z5lQWkK!Uu%)Y!a7;!_1%&QK9A;=`&ws>a!IBuN!_&u|l~6LRDUaB@I$WpE*y5(7Yx zebEI)Wv9?gX^!z>kH{w%>kte@n*CH~)p~WR#WO2c%b*EInp*m1o)+0afqFFqEkThM zQdWBXh{?jZaTT8oEJ34-#&}=ejJF$%5A%(+5JOs$NK(^-NtSE9;wiBC)4 zTmSi28Sv2{;62_?f5=ml{>>XFHhR`$^!dy1xRSmdoWJqcR6ZciU3Ftw$Uef9gd?E! zz4*%I$=I!VOAkIxF@GJSs4zrKYkZh_cR60yGH$KX%Tf)|;9n@#(4?NTMeWhxp~FO= zJ}+=_?$OlwV#TjY>vz7bRq{!WIEtxVq6Xu;fR&eJUBj{EN$C48{mKo3*ClN0Tn#_) z>RSQOFbpV{G2|dFzVCJ*;Qiyqc6-2hHr1Iby0H%Fh#9-G_MW@~!8f;9ad5$3h94$yE;;cNxH1 z4ULJt=CZtHwstBdZ^Qv>sSFx>QUhm)Om0P$uV{;1`(CO+iq*XC@mj8WN$;sTqi_J4 z81>L@%cAv&xXCqM5*3BU%vr&MUI*(hDTP>U{D^ze5{R8R$W<6F|D;Jg_&484FfhK_`QNz$OcbnITI6W2p(y0)Xa(0Pl zq+xsZ?qat(B{ayB`~wiOp0t-{h8?uBpS`zEhn1BuRrsujm2lKG!N__@Fp*IUb+|OJ zM!%4C*u(g3RQ+ZzGuV;nctf4Zz!5F37YTpro-u8O$Fq2zUXy{2K0 z+fnVzG6YVa86N#X;qZ79aa~f&mOm8GXhf7alUaX9s&$9o9DO}{oIbQiGBk=~ZiCf{ zQ?3}N;>xF*7oVtAJq5O#?P`47wC;m^KZUP5o)kF?qJs^k&`=jpbO%0K_|;e6oqA0Yc-&V2O60QHR%h{5?BFyGHL zoFwtrzmOF7<#u?Sau#<@Qjfc+ow(-E9&jlju@`*ExkK=T7R;{t3)S()DBmq_t(nHl_Gh|J z)6I=*`de$dy1-uc#47Qo0)BKauT!SQ;mf@BS1Lu;_lk#k1A1Zs5eC#@v8x$iy`J}k zpDKA=V_n-*2qg)mkYs>%Bx`6YvXfE5YJ%&?g%R}(6UzV{gDF@YKoiUXfKhXrnB&>C z*Duhord<8TkLMx!B<`c98$I*S}a!DybnSWmNJ=iRZGT1Jdt zEXOVfubV1x)|m?{7>HNM%(7|aT+>_j^7b9x&GbO>AXj;LQc%q>{gQ02R zxiP)vxEyX$$8OSfq}J$YD9o>uXV+B3uIn_obtp5J*~`!_2+RdF6^a8%XgO&}>vY1_ zC@GZUuC!y^W3TUDiW$0%nHiLEzwS4N7n=D@d9p8@J>8uX^3+XplSk=dF7#=*TON*n zp>B%EV`pa7M{%h-b&tlUOB6{mzjV#ba=GfTiBj z@UMTro0DEA=|8-|XQt;lMx8$mkE?l(#Q9d?mh~|ai@9T4#vA4j5AX>3`aStne02C* zURpFLKEDG653j!_)8vnOYm{W)`Zt8Ie003TVC(cbtwxl}OQ`$9Dq}ZqQBmiGI|bM+ z=T_Kow8>OHsLss9K=MsSPlVb2`eU-dZ*#0bg=(HMPvS z^lCO=j>5zWj`k?&Gw$v!t|k<0{6Ix@TGW(d;rz zVd&6D{J!SQ?)3Sdojb$EB$p;F8(s2s18rE1WJF3Pi#2{X-4spuQ8Qa~&-+3HvmTn+ zoStzQlA7d}v66TsgM{}4UpyC3ZwO4DUs1uTWhIb#oR)~9J|C-)#Y7kR z=u{l>+H*cOc3Bth4#@0qKh--poIH^(kQ5WGDn-16y*|#7O&Zn(V%$R508)@7*?0kw zli)223PdsvI>W0z~KTdYrMdWtGHf zkc2cH`9)E%sQ@>H1>7Od9>$c&m^w=pF0VdxshUdA;)KTzyw21i5rC;)i~8kjc~Ei( z%F`v9+NZ z;O@VXn+L;eW<-bw@P5vDwNAxk#FNlioS5SLhDT^?Gn1faG14;uo9_%U2~avMV>{RV zZFs{U-nvg(9B{0H<^C6cc@oyD1Ek2Fl!3GJBBZaBL52~Z0UFkzIN)FZUX&+`rX0|9 z!c+fdgiXK)>LR75z+4(|9Xl`rkE~WR`)o|oRK&_dai=9n;yPyyi zi?#JkyG%XqB)XxhyfF6BK(1XM4snX8ur4UZm!R+Gbh-cRVp^i zAT-O|F$O=<0V(3KX1lVN$gN~T1ZWlIhG&y`JGq|a$j-J79Ua8fv{4v$J!8$yBKN7R zJ|1|HyFrlWw7Nr5p7b7SZ3D#uM>K_;59OHRr>rNr9!RL3u&Nyb7PmZJGm zRq0x7(c9WO6hT$l^_JL9+H6wJxXJ?X4X%(v@Qv0lp_|VFkUDT_ok0KTo(JXMEY9Da z2RlRD9YY+`0fF@Oqm9>~M@CEcBvam9oTF+`~1vc48=(M+E3g%$@P-f85 zY(T-L&J`=4$CC*!QpaiBOLm;%OrAs$daO^7e@|Ma_sYGJEW9$M$A;800Zz+4D-_LC zIfA0s$-`8kHNj?A=@iOZToAtNl*%|M8eUg6F+$c|xlCWj{VlAu58I*3R!7q?)0Nrr-MB8 zH&fFbiMj&3NG{9PSB25LYaVtIB(RO}kXnQ8RuC!fCz%PE+8H&fJU3RnJbCtCsi_KA zps`Zpg2{3QfjJ7zj6IqttkgJWmqG@CpY$GLf=Mce7d#HJs_x}9adoL9Yi)iCT3SEi zA_GKv%97#Js%>A(m*IB}R`(#amAUj&LE6U(;C;kZxt&@8!B+?xKBiRuupb+tYQ4!^ zJmpv@q!=Y{{W*7HeNS9^VT0iGY@GG9Ig~}-*#bwJ+Ulp3ePz+W*rr~&t<1%Zw_JOS zhnz@nR@uQGPbuzuO|x>Xqs|m<{qVcB}I!bHqw z*M=S=Jf7viUcMCcF){-r$B|6VkmoL%XK(J2IH)q8>Hms_D0rKiiJK$3%xsxqTHeHb z?G}&Rl!Qk+tX<+4REz{|RDB=jjN44C{kMQYgjNP@Dx_*rPJTmqmBm?!2XruqYTQ`R zcCNu`pQ8LF!1Y$8&?&#qRsihq4io44r0YPLebm0Yt5T4P8Pc;^)4Kai&4QJAnsGHG z9WlsUu@zGy_im;|^!&T(7D=I+4)wI}oU2KX4efIaDPKw%cZ7LZ$?skWpX5fJ>ee_h zS-u6&+qpI&eMN(EUJc!}GnFxckO^%)4pXw`fa%(VvU95E{F5}xa%yQ*{r}JRCb|$5 z)P2A}1cX?FMaO|oNFH?`3rY7PSfm8lg~`MgF*3vz(5A(z3Dzk0Fv+N7elJbxMQZ&p zaoe?CZ^E6fC z(!6yWs;;8?`tyTnD%gy%P|fb6OU7Cpc!Yv;;<6@vjnj}AK+Fxn#r6b@LIm0BS~$lb zUVyJJ!eYOTm{$L-0z{N>O@Z~4iihc_&u%h?j;YfMUW0z{s1)JRGq>Qe(MKns#jf-A z*la0#Q{cQ5mzAHQ(&KQ6+ljp&Jy<^|eH$y>ZiC;MP`E)Ef7P6d8ebi$+}cLko2ydZ zBG8xvN}CzHYNce$!{NNnI*U(Fi7GTkSIU&zEZmAb){h`GJoR&c<2KkFAIHo5^KS>i z8cu*@*hgi+V3Y9TD;$u4?$LK1f8aEl#7m4O5Dj~aLG!~kE;=iV%6%EO$Pnn5A75x> zO^y@O)O={qJhe>0g-6@P0)LD|N(^ZPkd$?f zr=^<^Bo+k%;UNM{IlhGwi>amyL_bXp7;*ypI_%%<1wx0r@wX~|cl19cwKj*{!4v28V} zLUR|CA`Ni7OaA7Mv&^sWtsY`XG09&q)k2`CW!O?G&<;3Dh1aMA9sV#uFsB$2r#J>r z6T%J3%;I&64j;atn9U*@e!KwP&cK^@TU(SmXeR!&tK=tNh11w*{7hlyC^T8#MhcZmQ*Ws~Enx%pA`s=q0c8-q%gN2Ec}>X9 zRKv6Nv{t^ksE#-;LY8GuOC9>?t}7i%cc9m3Xp-O&fx%L`WO<9?AFf8t%}a?SK?sOT zME>CIGU0#TQ)z(40u-^-p-)d18?@JHAr6AAIo|hti^Fbd%o2|E|)DuvDt>*D*bp`2Lh0S|VTzdkV7>CQj`ivcU<)A2`8{mmH7Z zbP6Rjl_?(FL01T&&i?1$KQSL#1H{8N%!$A7>ASnmVAG!-T+Kg^nNE|~4!LMf!60Xd zDTsU9Zz`5j(P_W+OeRcsS{!k;^G+Pd1ML)3$!*1K$nYg~vNAIGk`tw@$h4!^o=YIj zp}OtBI+G5#cJCM+BbdHmx88W_d?pc#R$1&x#oD+|dPGo&SnjY^`9ePbOqB)kO5}U$ z_3hYdX#fwq$uaSw;&F^_2E5Xq$kA$?mxU`ozvtF%-+HO;#IZWSl)Jm(-Q`kabgd;r z5@9D+`a(Uc!lc*Zn~eD1b@+#O{9`p_(8*du-41`~D`WGIrjijDmJ=Lui8#yk$ari8 zR?w5{5ZSR36EP|osmN$KPr%D=qKVrG7tOzgl4xug?ilvY{x}sUS~kW ze3Z#?aa6q8xp*n}fkp?=Q=H}TWeF8VLRFw6&}g@|;^A)=o+~k~VdeTxlj83C)@<+jYpUA>s5Czr5o{z2)|VHGorBSq@)IPuFeK1V)%Z?tvW@(*;z$C8}C?Y zN~7H)YFyrmVk~L~bMj;NOotEdak$qpa~Y$iSHHjB_cJ{$M?7OQ2|B7YdW!Ft7G>NH zD!K>jHI}#E!&A*4_U?D@IscBhf^mT8WdMO!P(>BX_~efe5DIJ)ZXP{StGqo%vvJ__ zq+q4DI#adpB+}w^RIfSu0vB!4%!+!Rcy-I$qXbu-tRlQr8%;*)m#vvzcfTT81UXw_ z^U%o9+iG@AM7*9y^67&03CBmnF69_673?(DW;X)Vy%Z=4g4_=rrN?9?)hx`s-JFp} zLTeIXVXhHN3S*++vLLats7_9kB&bHy!X>S1Rbdw3JC@ag*~>W&x^cues|i|1q@ks5o*q7YWM!c|p_9y@fesDyGWYVoL~Lpp0kLO>e;&|?|XI@ z^}bd|R~aA5YX@2@Ug4OwG}6IIuEeE)yNUXoUb)9RR^~X&$&MOH-gS$WiZWF96q6{6 zmLDpV_4Y!X*;^XETc$qX8;=9d?X+4h#G>E>5h1$e9qigC%B=j}@aE6MM3iN0O!-aftxx&4I<3+D);G3_8jXfTs`2*dSmo>9 z?x3+svr~$miWgA$+f1OyQ=j+SxH-DQ>?TGPv*b>Ln#CC#{pi|Yc7^OiOZF%YCNURJ z*;bXe(WkHE+N&tl85<^&GKAcQ)rH>1)Jw#`1TfoAwQ;&@VnZJ{LRXYwRoA=`%7dm9 zj3uc(MFu;aArxCi0p69oMXdGmmgVmb^~4S-S9@d-&vlKMPOmYH?VMLRzI!EPWn@s* zBVsSICL!HlJzXc#(cm8G=D`tc)zQJOLQE){P)q=`a7|e=+FHAXTmsowPJXA@l3^5Odnud>?)0@_;QI1FIHi?ktSY4H`j=u|bYVL_{wDw{>wyXt- zq)0~pDnIV4Z0!5o#M|i2x@~Fs`qZmHLC>VZN`(-!vaF8Z~*SaunnycY$-Ty{m(o zF|@k^B~{dloTO?&O0&kP)*)xIJMk&T-YMwWxanZ*rGjgG1Z z>3T7xfMGK3p@EnscG_~e0_exX=o4Mly464@UM{(P;PB5CaqF(H=;Ol zI`gwuC1yV%5Q~x>0W-)y3sH?K3xxVaOR{ToScZu zWzd%j_Q>zvS+_rcpZIjBVDemBP~8W3QI4@6tg?z^O0*BY&BmNmGgrY#MC{LJH<#Zp zai^wKsL|AFYqu@pSk{phHtlL_eJT32?vJk(jfVQ_j)1KS0odIK54%UB&;Ne3iu?qUz_4$^DVSoo>q^#p1Bg52BkPrJ`7 z76%>dOt~8@##h=H>*KCoV^?_ zCKhf%#t;1?*nO6Q!Dr$D>G{(2^Yyg^E}fmny6r{QdBZ z)J6ysw~|STBi{v>o&5-1o(Sh8zFU~YbpTP2=dajcr<8jmm@`!)G^?ZQP|e{(l*+hw z1ZwsV~Lc_i%*DA_$3F`qK+$(OB90*F78ndR;jU6JTCiTpfi9u0pj?Vqx=|+5D?YOAuY@Nr;#X03t3GCQgi6NOS`5 z)Rg82vPwu7$8(_f$hbQeI>r;bl!R`{Bn#*H6Q~^j2AbK@~#05y9Gy~9=BR`7E$OHlB@}JdGIJGM3 z<(HF(SDSltjfjMi9(^PGeh4h@keS}$NLrZ^yt8Q+Lbvw9`5@n2kx6>cSuzLLk(ZgC zK25{#tf9=3JC%dSr8x6~sT5(GD1WO}D%nr$r^0K}HCIL_6Oy|b_Z*%xZ>WUdap@;l zO&wf|S;?lW&NgDZpUIf_36xY~OzPEyzD!~=g=!w&%4ZSj%TE&OB0j0*vRCI;;CYJC zdgOAqq?eN$Yd6i3b&biUu}0#>(x+$=X-kb~UosQgJyzJc^@LF=Svt+9u^qd_`-X0AM$(kkml zr)RIeD6a>9yc?9qrd9OxxK({5OH?&|lvcrgR-ta~TmFY3Wm< Date: Fri, 31 Oct 2025 15:02:26 +0100 Subject: [PATCH 31/46] Rename MessagesEntryPointNode to MessagesEntryPoint.NodeProxy for consistency. We already have a NodeProxy. --- .../android/appnav/room/joined/JoinedRoomLoadedFlowNode.kt | 3 +-- .../android/features/messages/api/MessagesEntryPoint.kt | 6 +++--- .../android/features/messages/impl/MessagesFlowNode.kt | 4 +--- 3 files changed, 5 insertions(+), 8 deletions(-) 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 index 8216ee512c..2faed24a19 100644 --- 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 @@ -26,7 +26,6 @@ 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.messages.api.MessagesEntryPointNode import io.element.android.features.messages.api.pinned.PinnedEventsTimelineProvider import io.element.android.features.roomdetails.api.RoomDetailsEntryPoint import io.element.android.features.space.api.SpaceEntryPoint @@ -283,7 +282,7 @@ class JoinedRoomLoadedFlowNode( val messageNode = waitForChildAttached { navTarget -> navTarget is NavTarget.Messages } - (messageNode as? MessagesEntryPointNode)?.attachThread(threadId, focusedEventId) + (messageNode as? MessagesEntryPoint.NodeProxy)?.attachThread(threadId, focusedEventId) } @Composable diff --git a/features/messages/api/src/main/kotlin/io/element/android/features/messages/api/MessagesEntryPoint.kt b/features/messages/api/src/main/kotlin/io/element/android/features/messages/api/MessagesEntryPoint.kt index 901a243945..99f9ed79a0 100644 --- a/features/messages/api/src/main/kotlin/io/element/android/features/messages/api/MessagesEntryPoint.kt +++ b/features/messages/api/src/main/kotlin/io/element/android/features/messages/api/MessagesEntryPoint.kt @@ -47,8 +47,8 @@ interface MessagesEntryPoint : FeatureEntryPoint { params: Params, callback: Callback, ): Node -} -interface MessagesEntryPointNode { - suspend fun attachThread(threadId: ThreadId, focusedEventId: EventId?) + interface NodeProxy { + suspend fun attachThread(threadId: ThreadId, focusedEventId: EventId?) + } } diff --git a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/MessagesFlowNode.kt b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/MessagesFlowNode.kt index b4320ab69e..d51ebd250e 100644 --- a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/MessagesFlowNode.kt +++ b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/MessagesFlowNode.kt @@ -32,7 +32,6 @@ import io.element.android.features.location.api.LocationService import io.element.android.features.location.api.SendLocationEntryPoint import io.element.android.features.location.api.ShowLocationEntryPoint import io.element.android.features.messages.api.MessagesEntryPoint -import io.element.android.features.messages.api.MessagesEntryPointNode import io.element.android.features.messages.impl.attachments.Attachment import io.element.android.features.messages.impl.attachments.preview.AttachmentsPreviewNode import io.element.android.features.messages.impl.pinned.DefaultPinnedEventsTimelineProvider @@ -130,8 +129,7 @@ class MessagesFlowNode( ), buildContext = buildContext, plugins = plugins, -), - MessagesEntryPointNode { +), MessagesEntryPoint.NodeProxy { sealed interface NavTarget : Parcelable { @Parcelize data class Messages(val focusedEventId: EventId?) : NavTarget From bb28fd6e9243b573bd91eee594b3d9b72aa2e02b Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Fri, 31 Oct 2025 17:03:54 +0100 Subject: [PATCH 32/46] Forward Event error: Log error and use generic error dialog. --- features/forward/impl/build.gradle.kts | 1 + .../features/forward/impl/ForwardMessagesPresenter.kt | 7 ++++++- .../android/features/forward/impl/ForwardMessagesView.kt | 5 +++++ 3 files changed, 12 insertions(+), 1 deletion(-) diff --git a/features/forward/impl/build.gradle.kts b/features/forward/impl/build.gradle.kts index de38d25651..0364ffadd8 100644 --- a/features/forward/impl/build.gradle.kts +++ b/features/forward/impl/build.gradle.kts @@ -31,6 +31,7 @@ dependencies { implementation(projects.libraries.designsystem) implementation(projects.libraries.matrix.api) implementation(projects.libraries.roomselect.api) + implementation(projects.libraries.uiStrings) testCommonDependencies(libs, true) testImplementation(projects.libraries.matrix.test) diff --git a/features/forward/impl/src/main/kotlin/io/element/android/features/forward/impl/ForwardMessagesPresenter.kt b/features/forward/impl/src/main/kotlin/io/element/android/features/forward/impl/ForwardMessagesPresenter.kt index 63fbb0bc7c..c495bd0dc4 100644 --- a/features/forward/impl/src/main/kotlin/io/element/android/features/forward/impl/ForwardMessagesPresenter.kt +++ b/features/forward/impl/src/main/kotlin/io/element/android/features/forward/impl/ForwardMessagesPresenter.kt @@ -23,6 +23,7 @@ import io.element.android.libraries.matrix.api.timeline.TimelineProvider import io.element.android.libraries.matrix.api.timeline.getActiveTimeline import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.launch +import timber.log.Timber @AssistedInject class ForwardMessagesPresenter( @@ -63,7 +64,11 @@ class ForwardMessagesPresenter( roomIds: List, ) = launch { suspend { - timelineProvider.getActiveTimeline().forwardEvent(eventId, roomIds).getOrThrow() + timelineProvider.getActiveTimeline().forwardEvent(eventId, roomIds) + .onFailure { + Timber.e(it, "Error while forwarding event") + } + .getOrThrow() roomIds }.runCatchingUpdatingState(forwardingActionState) } diff --git a/features/forward/impl/src/main/kotlin/io/element/android/features/forward/impl/ForwardMessagesView.kt b/features/forward/impl/src/main/kotlin/io/element/android/features/forward/impl/ForwardMessagesView.kt index 214c795851..3e092c70fa 100644 --- a/features/forward/impl/src/main/kotlin/io/element/android/features/forward/impl/ForwardMessagesView.kt +++ b/features/forward/impl/src/main/kotlin/io/element/android/features/forward/impl/ForwardMessagesView.kt @@ -8,11 +8,13 @@ package io.element.android.features.forward.impl import androidx.compose.runtime.Composable +import androidx.compose.ui.res.stringResource import androidx.compose.ui.tooling.preview.PreviewParameter import io.element.android.libraries.designsystem.components.async.AsyncActionView import io.element.android.libraries.designsystem.preview.ElementPreview import io.element.android.libraries.designsystem.preview.PreviewsDayNight import io.element.android.libraries.matrix.api.core.RoomId +import io.element.android.libraries.ui.strings.CommonStrings @Composable fun ForwardMessagesView( @@ -24,6 +26,9 @@ fun ForwardMessagesView( onSuccess = { onForwardSuccess(it) }, + errorMessage = { + stringResource(id = CommonStrings.error_unknown) + }, onErrorDismiss = { state.eventSink(ForwardMessagesEvents.ClearError) }, From 5b18f6f93ef8113af9477ca627c3fbf10927f11e Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Mon, 3 Nov 2025 15:53:31 +0100 Subject: [PATCH 33/46] Code cleanup --- .../android/appnav/room/joined/JoinedRoomLoadedFlowNode.kt | 4 ---- .../impl/pinned/DefaultPinnedEventsTimelineProvider.kt | 5 +---- .../features/messages/impl/DefaultMessagesEntryPointTest.kt | 2 +- .../roomdetails/impl/DefaultRoomDetailsEntryPointTest.kt | 2 +- .../mediaviewer/impl/DefaultMediaGalleryEntryPointTest.kt | 2 +- .../mediaviewer/impl/DefaultMediaViewerEntryPointTest.kt | 4 ++-- .../impl/datasource/FakeMediaGalleryDataSource.kt | 4 ++++ .../mediaviewer/impl/viewer/FakeMediaViewerNavigator.kt | 6 +++--- .../mediaviewer/impl/viewer/MediaViewerPresenterTest.kt | 5 +++-- 9 files changed, 16 insertions(+), 18 deletions(-) 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 index 2faed24a19..419dc074fc 100644 --- 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 @@ -26,7 +26,6 @@ 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.messages.api.pinned.PinnedEventsTimelineProvider import io.element.android.features.roomdetails.api.RoomDetailsEntryPoint import io.element.android.features.space.api.SpaceEntryPoint import io.element.android.libraries.architecture.BackstackView @@ -45,12 +44,9 @@ 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.libraries.matrix.api.timeline.TimelineProvider import io.element.android.services.appnavstate.api.ActiveRoomsHolder import io.element.android.services.appnavstate.api.AppNavigationStateService import kotlinx.coroutines.CoroutineScope -import kotlinx.coroutines.flow.MutableStateFlow -import kotlinx.coroutines.flow.asStateFlow import kotlinx.coroutines.launch import kotlinx.parcelize.Parcelize import timber.log.Timber diff --git a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/pinned/DefaultPinnedEventsTimelineProvider.kt b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/pinned/DefaultPinnedEventsTimelineProvider.kt index 0e2de50b86..f4641c8a66 100644 --- a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/pinned/DefaultPinnedEventsTimelineProvider.kt +++ b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/pinned/DefaultPinnedEventsTimelineProvider.kt @@ -8,9 +8,7 @@ package io.element.android.features.messages.impl.pinned import dev.zacsweers.metro.ContributesBinding -import dev.zacsweers.metro.Inject import dev.zacsweers.metro.SingleIn -import dev.zacsweers.metro.binding import io.element.android.features.messages.api.pinned.PinnedEventsTimelineProvider import io.element.android.libraries.architecture.AsyncData import io.element.android.libraries.core.coroutine.CoroutineDispatchers @@ -31,8 +29,7 @@ import kotlinx.coroutines.flow.onEach import kotlinx.coroutines.withContext @SingleIn(RoomScope::class) -@ContributesBinding(RoomScope::class, binding = binding()) -@Inject +@ContributesBinding(RoomScope::class) class DefaultPinnedEventsTimelineProvider( private val room: JoinedRoom, private val syncService: SyncService, diff --git a/features/messages/impl/src/test/kotlin/io/element/android/features/messages/impl/DefaultMessagesEntryPointTest.kt b/features/messages/impl/src/test/kotlin/io/element/android/features/messages/impl/DefaultMessagesEntryPointTest.kt index 880f89f3bc..e9502346b4 100644 --- a/features/messages/impl/src/test/kotlin/io/element/android/features/messages/impl/DefaultMessagesEntryPointTest.kt +++ b/features/messages/impl/src/test/kotlin/io/element/android/features/messages/impl/DefaultMessagesEntryPointTest.kt @@ -90,7 +90,7 @@ class DefaultMessagesEntryPointTest { override fun navigateToRoomDetails() = lambdaError() override fun navigateToRoomMemberDetails(userId: UserId) = lambdaError() override fun handlePermalinkClick(data: PermalinkData, pushToBackstack: Boolean) = lambdaError() - override fun forwardEvent(eventId: EventId) = lambdaError() + override fun forwardEvent(eventId: EventId, fromPinnedEvents: Boolean) = lambdaError() override fun navigateToRoom(roomId: RoomId) = lambdaError() } val initialTarget = MessagesEntryPoint.InitialTarget.Messages(focusedEventId = AN_EVENT_ID) diff --git a/features/roomdetails/impl/src/test/kotlin/io/element/android/features/roomdetails/impl/DefaultRoomDetailsEntryPointTest.kt b/features/roomdetails/impl/src/test/kotlin/io/element/android/features/roomdetails/impl/DefaultRoomDetailsEntryPointTest.kt index ebe92332e8..f9bc40b711 100644 --- a/features/roomdetails/impl/src/test/kotlin/io/element/android/features/roomdetails/impl/DefaultRoomDetailsEntryPointTest.kt +++ b/features/roomdetails/impl/src/test/kotlin/io/element/android/features/roomdetails/impl/DefaultRoomDetailsEntryPointTest.kt @@ -64,7 +64,7 @@ class DefaultRoomDetailsEntryPointTest { override fun navigateToGlobalNotificationSettings() = lambdaError() override fun navigateToRoom(roomId: RoomId, serverNames: List) = lambdaError() override fun handlePermalinkClick(data: PermalinkData, pushToBackstack: Boolean) = lambdaError() - override fun startForwardEventFlow(eventId: EventId) = lambdaError() + override fun startForwardEventFlow(eventId: EventId, fromPinnedEvents: Boolean) = lambdaError() } val params = RoomDetailsEntryPoint.Params( initialElement = RoomDetailsEntryPoint.InitialTarget.RoomDetails, diff --git a/libraries/mediaviewer/impl/src/test/kotlin/io/element/android/libraries/mediaviewer/impl/DefaultMediaGalleryEntryPointTest.kt b/libraries/mediaviewer/impl/src/test/kotlin/io/element/android/libraries/mediaviewer/impl/DefaultMediaGalleryEntryPointTest.kt index 189644ebd5..991e29cd98 100644 --- a/libraries/mediaviewer/impl/src/test/kotlin/io/element/android/libraries/mediaviewer/impl/DefaultMediaGalleryEntryPointTest.kt +++ b/libraries/mediaviewer/impl/src/test/kotlin/io/element/android/libraries/mediaviewer/impl/DefaultMediaGalleryEntryPointTest.kt @@ -40,7 +40,7 @@ class DefaultMediaGalleryEntryPointTest { val callback = object : MediaGalleryEntryPoint.Callback { override fun onBackClick() = lambdaError() override fun viewInTimeline(eventId: EventId) = lambdaError() - override fun forward(eventId: EventId) = lambdaError() + override fun forward(eventId: EventId, fromPinnedEvents: Boolean) = lambdaError() } val result = entryPoint.createNode( parentNode = parentNode, diff --git a/libraries/mediaviewer/impl/src/test/kotlin/io/element/android/libraries/mediaviewer/impl/DefaultMediaViewerEntryPointTest.kt b/libraries/mediaviewer/impl/src/test/kotlin/io/element/android/libraries/mediaviewer/impl/DefaultMediaViewerEntryPointTest.kt index b53fe7913c..f6246545b5 100644 --- a/libraries/mediaviewer/impl/src/test/kotlin/io/element/android/libraries/mediaviewer/impl/DefaultMediaViewerEntryPointTest.kt +++ b/libraries/mediaviewer/impl/src/test/kotlin/io/element/android/libraries/mediaviewer/impl/DefaultMediaViewerEntryPointTest.kt @@ -72,7 +72,7 @@ class DefaultMediaViewerEntryPointTest { val callback = object : MediaViewerEntryPoint.Callback { override fun onDone() = lambdaError() override fun viewInTimeline(eventId: EventId) = lambdaError() - override fun forwardEvent(eventId: EventId) = lambdaError() + override fun forwardEvent(eventId: EventId, fromPinnedEvents: Boolean) = lambdaError() } val params = createMediaViewerEntryPointParams() val result = entryPoint.createNode( @@ -118,7 +118,7 @@ class DefaultMediaViewerEntryPointTest { val callback = object : MediaViewerEntryPoint.Callback { override fun onDone() = lambdaError() override fun viewInTimeline(eventId: EventId) = lambdaError() - override fun forwardEvent(eventId: EventId) = lambdaError() + override fun forwardEvent(eventId: EventId, fromPinnedEvents: Boolean) = lambdaError() } val params = entryPoint.createParamsForAvatar( filename = "fn", diff --git a/libraries/mediaviewer/impl/src/test/kotlin/io/element/android/libraries/mediaviewer/impl/datasource/FakeMediaGalleryDataSource.kt b/libraries/mediaviewer/impl/src/test/kotlin/io/element/android/libraries/mediaviewer/impl/datasource/FakeMediaGalleryDataSource.kt index ea4bdfbad8..552e6baaff 100644 --- a/libraries/mediaviewer/impl/src/test/kotlin/io/element/android/libraries/mediaviewer/impl/datasource/FakeMediaGalleryDataSource.kt +++ b/libraries/mediaviewer/impl/src/test/kotlin/io/element/android/libraries/mediaviewer/impl/datasource/FakeMediaGalleryDataSource.kt @@ -38,6 +38,10 @@ class FakeMediaGalleryDataSource( return groupedMediaItemsFlow.replayCache.firstOrNull() ?: AsyncData.Uninitialized } + override fun fromPinnedEvents(): Boolean { + TODO("Not yet implemented") + } + override suspend fun loadMore(direction: Timeline.PaginationDirection) { loadMoreLambda(direction) } diff --git a/libraries/mediaviewer/impl/src/test/kotlin/io/element/android/libraries/mediaviewer/impl/viewer/FakeMediaViewerNavigator.kt b/libraries/mediaviewer/impl/src/test/kotlin/io/element/android/libraries/mediaviewer/impl/viewer/FakeMediaViewerNavigator.kt index 791527445b..d223ad1ce9 100644 --- a/libraries/mediaviewer/impl/src/test/kotlin/io/element/android/libraries/mediaviewer/impl/viewer/FakeMediaViewerNavigator.kt +++ b/libraries/mediaviewer/impl/src/test/kotlin/io/element/android/libraries/mediaviewer/impl/viewer/FakeMediaViewerNavigator.kt @@ -12,15 +12,15 @@ import io.element.android.tests.testutils.lambda.lambdaError class FakeMediaViewerNavigator( private val onViewInTimelineClickLambda: (EventId) -> Unit = { lambdaError() }, - private val onForwardClickLambda: (EventId) -> Unit = { lambdaError() }, + private val onForwardClickLambda: (EventId, Boolean) -> Unit = { _, _ -> lambdaError() }, private val onItemDeletedLambda: () -> Unit = { lambdaError() }, ) : MediaViewerNavigator { override fun onViewInTimelineClick(eventId: EventId) { onViewInTimelineClickLambda(eventId) } - override fun onForwardClick(eventId: EventId) { - onForwardClickLambda(eventId) + override fun onForwardClick(eventId: EventId, fromPinnedEvents: Boolean) { + onForwardClickLambda(eventId, fromPinnedEvents) } override fun onItemDeleted() { diff --git a/libraries/mediaviewer/impl/src/test/kotlin/io/element/android/libraries/mediaviewer/impl/viewer/MediaViewerPresenterTest.kt b/libraries/mediaviewer/impl/src/test/kotlin/io/element/android/libraries/mediaviewer/impl/viewer/MediaViewerPresenterTest.kt index 359eda7a5e..c0ea46b307 100644 --- a/libraries/mediaviewer/impl/src/test/kotlin/io/element/android/libraries/mediaviewer/impl/viewer/MediaViewerPresenterTest.kt +++ b/libraries/mediaviewer/impl/src/test/kotlin/io/element/android/libraries/mediaviewer/impl/viewer/MediaViewerPresenterTest.kt @@ -785,7 +785,7 @@ class MediaViewerPresenterTest { @Test fun `present - forward hides the bottom sheet and invokes the navigator`() = runTest { - val onForwardClickLambda = lambdaRecorder { } + val onForwardClickLambda = lambdaRecorder { _, _ -> } val navigator = FakeMediaViewerNavigator( onForwardClickLambda = onForwardClickLambda, ) @@ -804,7 +804,8 @@ class MediaViewerPresenterTest { initialState.eventSink(MediaViewerEvents.Forward(AN_EVENT_ID)) val finalState = awaitItem() assertThat(finalState.mediaBottomSheetState).isEqualTo(MediaBottomSheetState.Hidden) - onForwardClickLambda.assertions().isCalledOnce().with(value(AN_EVENT_ID)) + onForwardClickLambda.assertions().isCalledOnce() + .with(value(AN_EVENT_ID), value(false)) } } From c99350612931ce5aec2f25174a48e1735dc95242 Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Mon, 3 Nov 2025 16:07:13 +0100 Subject: [PATCH 34/46] Code cleanup --- .../impl/datasource/MediaGalleryDataSource.kt | 5 ----- .../impl/viewer/MediaViewerDataSource.kt | 2 -- .../mediaviewer/impl/viewer/MediaViewerNode.kt | 14 +++++++++----- .../impl/viewer/MediaViewerPresenter.kt | 6 +++++- .../impl/viewer/SingleMediaGalleryDataSource.kt | 1 - .../impl/datasource/FakeMediaGalleryDataSource.kt | 4 ---- 6 files changed, 14 insertions(+), 18 deletions(-) diff --git a/libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/datasource/MediaGalleryDataSource.kt b/libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/datasource/MediaGalleryDataSource.kt index 46bfedacb1..eb822b4969 100644 --- a/libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/datasource/MediaGalleryDataSource.kt +++ b/libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/datasource/MediaGalleryDataSource.kt @@ -32,7 +32,6 @@ interface MediaGalleryDataSource { fun start() fun groupedMediaItemsFlow(): Flow> fun getLastData(): AsyncData - fun fromPinnedEvents(): Boolean suspend fun loadMore(direction: Timeline.PaginationDirection) suspend fun deleteItem(eventId: EventId) } @@ -47,10 +46,6 @@ class TimelineMediaGalleryDataSource( ) : MediaGalleryDataSource { private var timeline: Timeline? = null - override fun fromPinnedEvents(): Boolean { - return timeline?.mode == Timeline.Mode.PinnedEvents - } - private val groupedMediaItemsFlow = MutableSharedFlow>(replay = 1) override fun groupedMediaItemsFlow(): Flow> = groupedMediaItemsFlow diff --git a/libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/viewer/MediaViewerDataSource.kt b/libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/viewer/MediaViewerDataSource.kt index 62d87a770a..1046a80fe3 100644 --- a/libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/viewer/MediaViewerDataSource.kt +++ b/libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/viewer/MediaViewerDataSource.kt @@ -61,8 +61,6 @@ class MediaViewerDataSource( private val localMediaStates: MutableMap>> = mutableMapOf() - fun fromPinnedEvents(): Boolean = galleryDataSource.fromPinnedEvents() - fun setup() { galleryDataSource.start() } diff --git a/libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/viewer/MediaViewerNode.kt b/libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/viewer/MediaViewerNode.kt index 195f1589d6..f47f341657 100644 --- a/libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/viewer/MediaViewerNode.kt +++ b/libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/viewer/MediaViewerNode.kt @@ -81,11 +81,7 @@ class MediaViewerNode( timelineMediaGalleryDataSource } else { // Can we use a specific timeline? - val timelineMode = when (val mode = inputs.mode) { - is MediaViewerEntryPoint.MediaViewerMode.TimelineImagesAndVideos -> mode.timelineMode - is MediaViewerEntryPoint.MediaViewerMode.TimelineFilesAndAudios -> mode.timelineMode - else -> null - } + val timelineMode = inputs.mode.getTimelineMode() when (timelineMode) { null -> timelineMediaGalleryDataSource Timeline.Mode.Live, @@ -149,3 +145,11 @@ class MediaViewerNode( } } } + +internal fun MediaViewerEntryPoint.MediaViewerMode.getTimelineMode(): Timeline.Mode? { + return when (this) { + is MediaViewerEntryPoint.MediaViewerMode.TimelineImagesAndVideos -> timelineMode + is MediaViewerEntryPoint.MediaViewerMode.TimelineFilesAndAudios -> timelineMode + else -> null + } +} diff --git a/libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/viewer/MediaViewerPresenter.kt b/libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/viewer/MediaViewerPresenter.kt index be10af3f6d..a04a1a370a 100644 --- a/libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/viewer/MediaViewerPresenter.kt +++ b/libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/viewer/MediaViewerPresenter.kt @@ -33,6 +33,7 @@ import io.element.android.libraries.matrix.api.core.EventId import io.element.android.libraries.matrix.api.room.JoinedRoom import io.element.android.libraries.matrix.api.room.powerlevels.canRedactOther import io.element.android.libraries.matrix.api.room.powerlevels.canRedactOwn +import io.element.android.libraries.matrix.api.timeline.Timeline import io.element.android.libraries.matrix.api.timeline.item.event.toEventOrTransactionId import io.element.android.libraries.mediaviewer.api.MediaViewerEntryPoint import io.element.android.libraries.mediaviewer.api.local.LocalMedia @@ -119,7 +120,10 @@ class MediaViewerPresenter( } is MediaViewerEvents.Forward -> { mediaBottomSheetState = MediaBottomSheetState.Hidden - navigator.onForwardClick(event.eventId, fromPinnedEvents = dataSource.fromPinnedEvents()) + navigator.onForwardClick( + eventId = event.eventId, + fromPinnedEvents = inputs.mode.getTimelineMode() == Timeline.Mode.PinnedEvents, + ) } is MediaViewerEvents.OpenInfo -> coroutineScope.launch { mediaBottomSheetState = MediaBottomSheetState.MediaDetailsBottomSheetState( diff --git a/libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/viewer/SingleMediaGalleryDataSource.kt b/libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/viewer/SingleMediaGalleryDataSource.kt index 1d683fd8da..31964a6629 100644 --- a/libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/viewer/SingleMediaGalleryDataSource.kt +++ b/libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/viewer/SingleMediaGalleryDataSource.kt @@ -27,7 +27,6 @@ class SingleMediaGalleryDataSource( override fun start() = Unit override fun groupedMediaItemsFlow() = flowOf(AsyncData.Success(data)) override fun getLastData(): AsyncData = AsyncData.Success(data) - override fun fromPinnedEvents(): Boolean = false override suspend fun loadMore(direction: Timeline.PaginationDirection) = Unit override suspend fun deleteItem(eventId: EventId) = Unit diff --git a/libraries/mediaviewer/impl/src/test/kotlin/io/element/android/libraries/mediaviewer/impl/datasource/FakeMediaGalleryDataSource.kt b/libraries/mediaviewer/impl/src/test/kotlin/io/element/android/libraries/mediaviewer/impl/datasource/FakeMediaGalleryDataSource.kt index 552e6baaff..ea4bdfbad8 100644 --- a/libraries/mediaviewer/impl/src/test/kotlin/io/element/android/libraries/mediaviewer/impl/datasource/FakeMediaGalleryDataSource.kt +++ b/libraries/mediaviewer/impl/src/test/kotlin/io/element/android/libraries/mediaviewer/impl/datasource/FakeMediaGalleryDataSource.kt @@ -38,10 +38,6 @@ class FakeMediaGalleryDataSource( return groupedMediaItemsFlow.replayCache.firstOrNull() ?: AsyncData.Uninitialized } - override fun fromPinnedEvents(): Boolean { - TODO("Not yet implemented") - } - override suspend fun loadMore(direction: Timeline.PaginationDirection) { loadMoreLambda(direction) } From 2eeb5fe1ccd540200b6ce30bbc3cbba9a99b5d71 Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Mon, 3 Nov 2025 16:08:59 +0100 Subject: [PATCH 35/46] Add test on forwarding from pinned event --- .../impl/viewer/MediaViewerPresenterTest.kt | 27 +++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git a/libraries/mediaviewer/impl/src/test/kotlin/io/element/android/libraries/mediaviewer/impl/viewer/MediaViewerPresenterTest.kt b/libraries/mediaviewer/impl/src/test/kotlin/io/element/android/libraries/mediaviewer/impl/viewer/MediaViewerPresenterTest.kt index c0ea46b307..f6de72b2d8 100644 --- a/libraries/mediaviewer/impl/src/test/kotlin/io/element/android/libraries/mediaviewer/impl/viewer/MediaViewerPresenterTest.kt +++ b/libraries/mediaviewer/impl/src/test/kotlin/io/element/android/libraries/mediaviewer/impl/viewer/MediaViewerPresenterTest.kt @@ -809,6 +809,33 @@ class MediaViewerPresenterTest { } } + @Test + fun `present - forward from pinned events hides the bottom sheet and invokes the navigator`() = runTest { + val onForwardClickLambda = lambdaRecorder { _, _ -> } + val navigator = FakeMediaViewerNavigator( + onForwardClickLambda = onForwardClickLambda, + ) + val presenter = createMediaViewerPresenter( + mode = MediaViewerEntryPoint.MediaViewerMode.TimelineFilesAndAudios(timelineMode = Timeline.Mode.PinnedEvents), + localMediaFactory = localMediaFactory, + mediaViewerNavigator = navigator, + room = FakeJoinedRoom( + baseRoom = FakeBaseRoom(canRedactOwnResult = { Result.success(true) }), + ), + ) + presenter.test { + val initialState = awaitItem() + initialState.eventSink(MediaViewerEvents.OpenInfo(aMediaViewerPageData())) + val withBottomSheetState = awaitItem() + assertThat(withBottomSheetState.mediaBottomSheetState).isInstanceOf(MediaBottomSheetState.MediaDetailsBottomSheetState::class.java) + initialState.eventSink(MediaViewerEvents.Forward(AN_EVENT_ID)) + val finalState = awaitItem() + assertThat(finalState.mediaBottomSheetState).isEqualTo(MediaBottomSheetState.Hidden) + onForwardClickLambda.assertions().isCalledOnce() + .with(value(AN_EVENT_ID), value(true)) + } + } + private suspend fun ReceiveTurbine.awaitFirstItem(): T { return awaitItem() } From 5b398adfcf7d5a5aa244dba285d015e236256d35 Mon Sep 17 00:00:00 2001 From: ElementBot Date: Mon, 3 Nov 2025 17:14:23 +0000 Subject: [PATCH 36/46] Update screenshots --- .../features.forward.impl_ForwardMessagesView_Day_3_en.png | 4 ++-- .../features.forward.impl_ForwardMessagesView_Night_3_en.png | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/tests/uitests/src/test/snapshots/images/features.forward.impl_ForwardMessagesView_Day_3_en.png b/tests/uitests/src/test/snapshots/images/features.forward.impl_ForwardMessagesView_Day_3_en.png index c913d383ca..7866726430 100644 --- a/tests/uitests/src/test/snapshots/images/features.forward.impl_ForwardMessagesView_Day_3_en.png +++ b/tests/uitests/src/test/snapshots/images/features.forward.impl_ForwardMessagesView_Day_3_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:5c6ab936964323971e9b4927684e3ae2da96884b340569aebe6e6a711bd6c241 -size 8446 +oid sha256:9bd3fe043d7fffab7b19b5af9de7ef58ce8d2d97018a058b5b3c94cb55b277b9 +size 11273 diff --git a/tests/uitests/src/test/snapshots/images/features.forward.impl_ForwardMessagesView_Night_3_en.png b/tests/uitests/src/test/snapshots/images/features.forward.impl_ForwardMessagesView_Night_3_en.png index 33799bf61d..ff6610c109 100644 --- a/tests/uitests/src/test/snapshots/images/features.forward.impl_ForwardMessagesView_Night_3_en.png +++ b/tests/uitests/src/test/snapshots/images/features.forward.impl_ForwardMessagesView_Night_3_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:cd3611749f6ad60bc647236c5a10694b8ac9d1aa84e546740c1bf85df277c6f9 -size 7668 +oid sha256:97bc2d4c9621a21533da2d35abe90a5e1c1ef1bc356a6342736b61f7be8d8e3b +size 10357 From 0743b56bc4327d585cf39ab751a22ca5d69b42b6 Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Mon, 3 Nov 2025 18:49:00 +0100 Subject: [PATCH 37/46] Always use the handleEvent(s) function the same way. --- .../android/features/call/impl/ui/CallScreenPresenter.kt | 2 +- .../android/features/forward/impl/ForwardMessagesPresenter.kt | 2 +- .../features/messages/impl/actionlist/ActionListPresenter.kt | 2 +- .../video/DefaultMediaOptimizationSelectorPresenter.kt | 2 +- .../messages/impl/messagecomposer/MessageComposerPresenter.kt | 2 +- .../features/messages/impl/timeline/TimelinePresenter.kt | 2 +- .../components/customreaction/CustomReactionPresenter.kt | 2 +- .../components/reactionsummary/ReactionSummaryPresenter.kt | 2 +- .../receipt/bottomsheet/ReadReceiptBottomSheetPresenter.kt | 2 +- .../impl/timeline/protection/TimelineProtectionPresenter.kt | 2 +- .../impl/user/editprofile/EditUserProfilePresenter.kt | 2 +- .../roomdetails/impl/members/RoomMemberListPresenter.kt | 2 +- .../notificationsettings/RoomNotificationSettingsPresenter.kt | 2 +- .../impl/rolesandpermissions/RolesAndPermissionsPresenter.kt | 2 +- .../permissions/ChangeRoomPermissionsPresenter.kt | 2 +- .../impl/RoomMemberModerationPresenter.kt | 2 +- .../io/element/android/features/share/impl/SharePresenter.kt | 2 +- .../libraries/permissions/impl/DefaultPermissionsPresenter.kt | 2 +- .../android/libraries/roomselect/impl/RoomSelectPresenter.kt | 2 +- .../libraries/voiceplayer/impl/VoiceMessagePresenter.kt | 4 ++-- 20 files changed, 21 insertions(+), 21 deletions(-) diff --git a/features/call/impl/src/main/kotlin/io/element/android/features/call/impl/ui/CallScreenPresenter.kt b/features/call/impl/src/main/kotlin/io/element/android/features/call/impl/ui/CallScreenPresenter.kt index 7604dbae18..a7302c9730 100644 --- a/features/call/impl/src/main/kotlin/io/element/android/features/call/impl/ui/CallScreenPresenter.kt +++ b/features/call/impl/src/main/kotlin/io/element/android/features/call/impl/ui/CallScreenPresenter.kt @@ -201,7 +201,7 @@ class CallScreenPresenter( userAgent = userAgent, isCallActive = isWidgetLoaded, isInWidgetMode = isInWidgetMode, - eventSink = { handleEvents(it) }, + eventSink = ::handleEvents, ) } diff --git a/features/forward/impl/src/main/kotlin/io/element/android/features/forward/impl/ForwardMessagesPresenter.kt b/features/forward/impl/src/main/kotlin/io/element/android/features/forward/impl/ForwardMessagesPresenter.kt index 63fbb0bc7c..90110b265c 100644 --- a/features/forward/impl/src/main/kotlin/io/element/android/features/forward/impl/ForwardMessagesPresenter.kt +++ b/features/forward/impl/src/main/kotlin/io/element/android/features/forward/impl/ForwardMessagesPresenter.kt @@ -54,7 +54,7 @@ class ForwardMessagesPresenter( return ForwardMessagesState( forwardAction = forwardingActionState.value, - eventSink = { handleEvents(it) } + eventSink = ::handleEvents, ) } diff --git a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/actionlist/ActionListPresenter.kt b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/actionlist/ActionListPresenter.kt index 192ff30f39..370b3853ea 100644 --- a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/actionlist/ActionListPresenter.kt +++ b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/actionlist/ActionListPresenter.kt @@ -122,7 +122,7 @@ class DefaultActionListPresenter( return ActionListState( target = target.value, - eventSink = { handleEvents(it) } + eventSink = ::handleEvents, ) } diff --git a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/attachments/video/DefaultMediaOptimizationSelectorPresenter.kt b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/attachments/video/DefaultMediaOptimizationSelectorPresenter.kt index b62b4116e6..c0121b98b0 100644 --- a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/attachments/video/DefaultMediaOptimizationSelectorPresenter.kt +++ b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/attachments/video/DefaultMediaOptimizationSelectorPresenter.kt @@ -172,7 +172,7 @@ class DefaultMediaOptimizationSelectorPresenter( selectedVideoPreset = selectedVideoOptimizationPreset.dataOrNull(), displayMediaSelectorViews = displayMediaSelectorViews, displayVideoPresetSelectorDialog = displayVideoPresetSelectorDialog, - eventSink = { handleEvent(it) }, + eventSink = ::handleEvent, ) } diff --git a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/messagecomposer/MessageComposerPresenter.kt b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/messagecomposer/MessageComposerPresenter.kt index 612797261a..f7dd029826 100644 --- a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/messagecomposer/MessageComposerPresenter.kt +++ b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/messagecomposer/MessageComposerPresenter.kt @@ -382,7 +382,7 @@ class MessageComposerPresenter( suggestions = suggestions.toImmutableList(), resolveMentionDisplay = resolveMentionDisplay, resolveAtRoomMentionDisplay = resolveAtRoomMentionDisplay, - eventSink = { handleEvents(it) }, + eventSink = ::handleEvents, ) } diff --git a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/TimelinePresenter.kt b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/TimelinePresenter.kt index 8602de0532..6f9dab56c8 100644 --- a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/TimelinePresenter.kt +++ b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/TimelinePresenter.kt @@ -289,7 +289,7 @@ class TimelinePresenter( messageShield = messageShield.value, resolveVerifiedUserSendFailureState = resolveVerifiedUserSendFailureState, displayThreadSummaries = displayThreadSummaries, - eventSink = { handleEvents(it) } + eventSink = ::handleEvents, ) } diff --git a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/components/customreaction/CustomReactionPresenter.kt b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/components/customreaction/CustomReactionPresenter.kt index 3d1cc93d58..bbddbb1066 100644 --- a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/components/customreaction/CustomReactionPresenter.kt +++ b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/components/customreaction/CustomReactionPresenter.kt @@ -71,7 +71,7 @@ class CustomReactionPresenter( target = target.value, selectedEmoji = selectedEmoji, recentEmojis = recentEmojis, - eventSink = { handleEvents(it) } + eventSink = ::handleEvents, ) } } diff --git a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/components/reactionsummary/ReactionSummaryPresenter.kt b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/components/reactionsummary/ReactionSummaryPresenter.kt index 4354ef5b25..c3fb43d374 100644 --- a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/components/reactionsummary/ReactionSummaryPresenter.kt +++ b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/components/reactionsummary/ReactionSummaryPresenter.kt @@ -48,7 +48,7 @@ class ReactionSummaryPresenter( } return ReactionSummaryState( target = targetWithAvatars.value, - eventSink = { handleEvents(it) } + eventSink = ::handleEvents, ) } diff --git a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/components/receipt/bottomsheet/ReadReceiptBottomSheetPresenter.kt b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/components/receipt/bottomsheet/ReadReceiptBottomSheetPresenter.kt index 33316a134a..a520f1fee1 100644 --- a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/components/receipt/bottomsheet/ReadReceiptBottomSheetPresenter.kt +++ b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/components/receipt/bottomsheet/ReadReceiptBottomSheetPresenter.kt @@ -36,7 +36,7 @@ class ReadReceiptBottomSheetPresenter : Presenter { return ReadReceiptBottomSheetState( selectedEvent = selectedEvent, - eventSink = { handleEvent(it) }, + eventSink = ::handleEvent, ) } } diff --git a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/protection/TimelineProtectionPresenter.kt b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/protection/TimelineProtectionPresenter.kt index 0d9db51d98..ded49a3804 100644 --- a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/protection/TimelineProtectionPresenter.kt +++ b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/protection/TimelineProtectionPresenter.kt @@ -56,7 +56,7 @@ class TimelineProtectionPresenter( return TimelineProtectionState( protectionState = protectionState, - eventSink = { event -> handleEvent(event) } + eventSink = ::handleEvent, ) } } diff --git a/features/preferences/impl/src/main/kotlin/io/element/android/features/preferences/impl/user/editprofile/EditUserProfilePresenter.kt b/features/preferences/impl/src/main/kotlin/io/element/android/features/preferences/impl/user/editprofile/EditUserProfilePresenter.kt index c894aae05d..3aa9c61555 100644 --- a/features/preferences/impl/src/main/kotlin/io/element/android/features/preferences/impl/user/editprofile/EditUserProfilePresenter.kt +++ b/features/preferences/impl/src/main/kotlin/io/element/android/features/preferences/impl/user/editprofile/EditUserProfilePresenter.kt @@ -143,7 +143,7 @@ class EditUserProfilePresenter( saveButtonEnabled = canSave && saveAction.value !is AsyncAction.Loading, saveAction = saveAction.value, cameraPermissionState = cameraPermissionState, - eventSink = { handleEvents(it) }, + eventSink = ::handleEvents, ) } diff --git a/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/members/RoomMemberListPresenter.kt b/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/members/RoomMemberListPresenter.kt index 69efd04b9e..90619d2e2d 100644 --- a/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/members/RoomMemberListPresenter.kt +++ b/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/members/RoomMemberListPresenter.kt @@ -179,7 +179,7 @@ class RoomMemberListPresenter( isSearchActive = isSearchActive, canInvite = canInvite, moderationState = roomModerationState, - eventSink = { handleEvents(it) }, + eventSink = ::handleEvents, ) } diff --git a/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/notificationsettings/RoomNotificationSettingsPresenter.kt b/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/notificationsettings/RoomNotificationSettingsPresenter.kt index 413e71169a..7bfdf9949c 100644 --- a/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/notificationsettings/RoomNotificationSettingsPresenter.kt +++ b/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/notificationsettings/RoomNotificationSettingsPresenter.kt @@ -135,7 +135,7 @@ class RoomNotificationSettingsPresenter( setNotificationSettingAction = setNotificationSettingAction.value, restoreDefaultAction = restoreDefaultAction.value, displayMentionsOnlyDisclaimer = shouldDisplayMentionsOnlyDisclaimer, - eventSink = { handleEvents(it) }, + eventSink = ::handleEvents, ) } diff --git a/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/rolesandpermissions/RolesAndPermissionsPresenter.kt b/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/rolesandpermissions/RolesAndPermissionsPresenter.kt index 2ad4c84028..e7033d37be 100644 --- a/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/rolesandpermissions/RolesAndPermissionsPresenter.kt +++ b/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/rolesandpermissions/RolesAndPermissionsPresenter.kt @@ -100,7 +100,7 @@ class RolesAndPermissionsPresenter( canDemoteSelf = canDemoteSelf.value, changeOwnRoleAction = changeOwnRoleAction.value, resetPermissionsAction = resetPermissionsAction.value, - eventSink = { handleEvent(it) }, + eventSink = ::handleEvent, ) } diff --git a/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/rolesandpermissions/permissions/ChangeRoomPermissionsPresenter.kt b/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/rolesandpermissions/permissions/ChangeRoomPermissionsPresenter.kt index ec90df1d5e..e9636978d5 100644 --- a/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/rolesandpermissions/permissions/ChangeRoomPermissionsPresenter.kt +++ b/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/rolesandpermissions/permissions/ChangeRoomPermissionsPresenter.kt @@ -112,7 +112,7 @@ class ChangeRoomPermissionsPresenter( hasChanges = hasChanges, saveAction = saveAction, confirmExitAction = confirmExitAction, - eventSink = { handleEvent(it) } + eventSink = ::handleEvent, ) } diff --git a/features/roommembermoderation/impl/src/main/kotlin/io/element/android/features/roommembermoderation/impl/RoomMemberModerationPresenter.kt b/features/roommembermoderation/impl/src/main/kotlin/io/element/android/features/roommembermoderation/impl/RoomMemberModerationPresenter.kt index 2ddb3ad34a..995baa069b 100644 --- a/features/roommembermoderation/impl/src/main/kotlin/io/element/android/features/roommembermoderation/impl/RoomMemberModerationPresenter.kt +++ b/features/roommembermoderation/impl/src/main/kotlin/io/element/android/features/roommembermoderation/impl/RoomMemberModerationPresenter.kt @@ -140,7 +140,7 @@ class RoomMemberModerationPresenter( kickUserAsyncAction = kickUserAsyncAction.value, banUserAsyncAction = banUserAsyncAction.value, unbanUserAsyncAction = unbanUserAsyncAction.value, - eventSink = { handleEvent(it) }, + eventSink = ::handleEvent, ) } diff --git a/features/share/impl/src/main/kotlin/io/element/android/features/share/impl/SharePresenter.kt b/features/share/impl/src/main/kotlin/io/element/android/features/share/impl/SharePresenter.kt index d3222edf5e..f5ce67498e 100644 --- a/features/share/impl/src/main/kotlin/io/element/android/features/share/impl/SharePresenter.kt +++ b/features/share/impl/src/main/kotlin/io/element/android/features/share/impl/SharePresenter.kt @@ -63,7 +63,7 @@ class SharePresenter( return ShareState( shareAction = shareActionState.value, - eventSink = { handleEvents(it) } + eventSink = ::handleEvents, ) } diff --git a/libraries/permissions/impl/src/main/kotlin/io/element/android/libraries/permissions/impl/DefaultPermissionsPresenter.kt b/libraries/permissions/impl/src/main/kotlin/io/element/android/libraries/permissions/impl/DefaultPermissionsPresenter.kt index f12d92a50d..c6bfbd73ed 100644 --- a/libraries/permissions/impl/src/main/kotlin/io/element/android/libraries/permissions/impl/DefaultPermissionsPresenter.kt +++ b/libraries/permissions/impl/src/main/kotlin/io/element/android/libraries/permissions/impl/DefaultPermissionsPresenter.kt @@ -125,7 +125,7 @@ class DefaultPermissionsPresenter( showDialog = showDialog.value, permissionAlreadyAsked = isAlreadyAsked, permissionAlreadyDenied = isAlreadyDenied, - eventSink = { handleEvents(it) } + eventSink = ::handleEvents, ) } diff --git a/libraries/roomselect/impl/src/main/kotlin/io/element/android/libraries/roomselect/impl/RoomSelectPresenter.kt b/libraries/roomselect/impl/src/main/kotlin/io/element/android/libraries/roomselect/impl/RoomSelectPresenter.kt index ffd3fda5c0..841b955018 100644 --- a/libraries/roomselect/impl/src/main/kotlin/io/element/android/libraries/roomselect/impl/RoomSelectPresenter.kt +++ b/libraries/roomselect/impl/src/main/kotlin/io/element/android/libraries/roomselect/impl/RoomSelectPresenter.kt @@ -87,7 +87,7 @@ class RoomSelectPresenter( query = searchQuery, isSearchActive = isSearchActive, selectedRooms = selectedRooms, - eventSink = { handleEvents(it) } + eventSink = ::handleEvents, ) } } diff --git a/libraries/voiceplayer/impl/src/main/kotlin/io/element/android/libraries/voiceplayer/impl/VoiceMessagePresenter.kt b/libraries/voiceplayer/impl/src/main/kotlin/io/element/android/libraries/voiceplayer/impl/VoiceMessagePresenter.kt index c7811f6d17..74c6aae39a 100644 --- a/libraries/voiceplayer/impl/src/main/kotlin/io/element/android/libraries/voiceplayer/impl/VoiceMessagePresenter.kt +++ b/libraries/voiceplayer/impl/src/main/kotlin/io/element/android/libraries/voiceplayer/impl/VoiceMessagePresenter.kt @@ -84,7 +84,7 @@ class VoiceMessagePresenter( } } - fun eventSink(event: VoiceMessageEvents) { + fun handleEvent(event: VoiceMessageEvents) { when (event) { is VoiceMessageEvents.PlayPause -> { if (playerState.isPlaying) { @@ -119,7 +119,7 @@ class VoiceMessagePresenter( progress = progress, time = time, showCursor = showCursor, - eventSink = { eventSink(it) }, + eventSink = ::handleEvent, ) } } From 18e46644ba41c0e52781e9a494b20de4d9bc753f Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Mon, 3 Nov 2025 18:53:30 +0100 Subject: [PATCH 38/46] Revert "Update notification sound" --- .../push/impl/src/main/res/raw/message.mp3 | Bin 8685 -> 22414 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/libraries/push/impl/src/main/res/raw/message.mp3 b/libraries/push/impl/src/main/res/raw/message.mp3 index abc056786c8504a9441ed74e955d9dcfa6bac927..5e9645adaf1f2b7435ef29360c690b8ddc405d3a 100644 GIT binary patch literal 22414 zcmeGEWl$X77ygS5?(Uia1{-Wa2Q-NxVw`;aCdii_n-;xZV8s)4hfn->?FT` zopWB^m$&NP@26^acXfAFcR$rnuf12VZe=-sG{9egatLJv?C%2I-zM*5?QHGh1ypzS zvbXUETKEIil;xD|tj(=tHPqDp?m+RkS-aQ*e0_a+o$amc|83&6bano_`ak|t;6DZa zQ{X=Z{!`#T1^!duKL!3%;6DZaQ{X=Z{!`#T1^$0rfj>VEto}b;qOyyP>)(Bd{x(to zKv4=n_z(L30se=`|4{sg?*Fj-hx`8s{zu~f$p0U;|LFQ3`kmV$cPnLuR`_WU=pk^arz6L%@&eS1sm>B58=v|k6Y7K3jK66`LL7$H|QldxM zpu)fM1t&bIoi}}Vf81SnZMg{ZRb7$aJ^c7n=yfxtHnscqx3EjOi!fcn^5#`@Rn@%Y z@t?=n)IUfIi4?1s3v5(ENbkT^Aqg9Ap*SsDkx0|De$;Kng@UeRd$||#WhyiZY z*rV&N?6$`F!e2hWf5Z6a58UzS3!~2VkMBRe^?wQcY4&gW=THBa>sOz?z5n0iDeu#d zyEpWb#j@xqgqjD%Kx}D%?4y(vv4|!y`imbG-wXbHmn4cB_=N?_5k7%nE@%3aez<^d?p6WABm;eJ51wb_l z=WACy_ly(JM}@IR}51)xD&>xf;INz|FdPyG)Xyhmb$Q0wkX$X?zy- z^_2K&-61^ParNb!t&@U%0Z%)bAfy=MlXgb!$uM_i(fh=@y}hBYB4u79Ex=~N}Z>pyMKFv=NI0svCff5jV+>swj?440Zr z54nvBDuGTQCK^hX1SpnhgUOl`5}2`oQzQrrHcT*ZH%xZD#~Ud^T0RSEQ{x1_lCs@)`#FGx{tA_85s;+bYo}*9{!jB|=jZfLkq{<}a zJwrM`fseC5HG|>?o2TPG;qwdgDL4hbo06TO%iH_GC^Nml|9UruAg!79TuyW6 z%+7CROb~cP55SmXn0j~G@G0Y)(NQ&zh%QK+}q`d_NFB^WQ8-2fgHh#IAap_Yy>SyXy`Dn)Z{Ki;h zy`%3(Q;M~Rt)cI|G54EqnLlK)%;$U!T+`nt_CAe^<^Fov@oE3tdy~)pNsfo$l&bLA z-xm;MEW?q&;E5&Xe59|#nH7k^1{-w@S&18ozVn1UKtCcGz%^GzM;m;H6d(>k0V5Hp zl^DfBN7UpYUz}qb(I@R_TZ2;H7s8h@9q!E6f3!42d*0B)>;+C z8f8QMG9!)>#H_6$Tyi-Wz{KhMZk!jAh$)M{(*>2{(Q(-Q1NFpPMlXJl#AV6O6&^)X zp~8!z2@NS^qS-CUAfO+jz!5T)XcT7?N)`&&TxKQH^-NfnAitL7N7r%IQ5C$vrk)d7 z;rJ}!2QgP@#{!M>M;1@Xlg*gphXl*89LO_G+n7NHw-996OxfmHbC`<306;OG*=;lG z6=iZCUP)IqjSZe%0r7rhrDH+U{K)#o7h8|V$mS8+10u){Hw(TyYf^7!FLk)6?gx*p zw^!vtQ`=oZ?T`!psJ$)eXx=d<@}A4KPT-!l+{UK3`gwl{!1ebbCC?CJ%4?{8_T#NGN-4n$8~yyiy<8>U{TQlmnUB`DOH6mT>=N z+*GU>w%)U!l{#z0TIgdceh9QM3}~f522L8z0v<#OJ$N9L7FEWjl=y?@9ss}!&z`q7 zB^X_Y3-pn@k;w#d5t*1ZdW={>0f7VNUlyimo1`}ewludqw@l=jTq63lUyWDvUQ17V@gD%O)h3C_XH}MXne7n)jfLj zQkflI2T>McKu2m|&^t@nK{X75@ys$_lq~h$YYtXErc_D5hvc}6ox;Br642#6v#2%L zIFx~-sPvq@o6cd*ax{(MhH-K52a@QmjLEV#@R`)arf^YmT-3zM)apHehBNpXD~cV} zCY$7|UuJ606`X5Pw$2%HU(~ES^7t?ep?VaYdbNTsp&a+sajBJ!h&%84#x;+h(+q6d zAM_i@1rDL?0Y7VEL=7!)U4ZX2^@qfupZ+ej%7_mYkq>~#W>5!S4{l}5rp(aKlJlsd z0^9~0#Vu#|ZZo1GA;X_MM{{82ZdMqoI8fkZ{K)4lLu{jrF2-jL#Htdi5PN`oH75GV zK+r9%>S2Kp59@nVtIG#h=ju$J)o-*u>k-ty1J;EJ*W0R$Eb$3zhrH+QLPfTFO&tTC z4x2i&2#Z{yMOoXv-|n9NWT@!(>V5dZ_v%vkm;T$l_UaRe%)lK)Ec6>B!2kqnP0tPqj}(%aE=@|_xRw%oMKI&(|{r_AenX}EEqeiXwB+pHSvMr&o{{t zgU&K|PYr~bB-dhUgGMjYE4Eo!M$Xgqus&KkShyNQ$kN1DhOW1J1mVlj!2&x46kqgz z*9%`xLVfNN!_+*n7cs|eh}J{TjO>t`dhe{6B0h`dDbVAxA~Cf6&=}HC;pjxWvWocO zHuk5*^PN%UC?8{?!SC;H9G8B7{sUiDQ*V0xr^eEiI_9_IpEd75NB=xVgYL(*{y(3; zPu`jwndo?&(+0Z1u?MgrB=|a%0B%T#2tRgIDZe!i8ZOBjNDYo9+Se*bJ@&P^k|ZmV z&ag*L2tsVu6#Qm(>TIki>o%)q1*U3>X9e^(5+Sc@Ou_b6=`gr5|FaJ~tcl8_aw*c? z!72BJPj|gRkDm&HmW>{q8#eROGIOu4e8u?!#kx(~@}!-ZQoiQx={vk3c${^u{WHP; zj-*=q#n(gIE26m^M|*$@nwnup>JZW}#0~ixb;{g4`@l9YZo!ozA{ogBctTc&IML$| zh7bZsg1t~CLtyAy!EjV5bO3r_I~72e1s;ql6&)U-xniB(zS18%)zY<=m)|CIQnC5Z zzdQgcq^IKf7oM-jUz8MHu?0O7JtWaMJsOtiEndIK@wd><{1|;kO~)%AT_kVCcUhg4 z;86MtbI#7od*Ler7el4%T&X+A79*p;-}5ZaZR+Q%LETJ(%9s+qy6%4}-zV#k9eFjm<zzPEwK z#qw>0@T$Eo%jLsbeM((IV4!O~x`1{?#^3%K09lRBMqxf;F;mIbM2Bu^2f^eE)wIw? zWy1`iM0%k`Vi(6FcTmRwgOW&m!bn_TG*SoylWJEA7p)8+#h}y{kXDlp^})|V3#DX` z(AC389zLhdZKKtpF|i(ugH*S_8*!G+>Y$LIyq4t}bkxxcME;Pd9QRt1V7k2dGQspo z$<^qsC}YH)G)Rd}YJb9h$^X6EO{cbzO0mH+{AbU^2W!Q-kFQ%du^4BIET#)!tZGEl z{)gw>hlUfiz9+h4JmeHu`bimC<@^+j;`SYijh(*uKU97kxy>>i^Hku5RrEOs0Jwjp zGEZP)e`HV~C8o0xQEF0jb^3z!le%1i8pvaVlTCn$(Ts9zm6JwkvqcRoX9~9<6Pd2G zoL02l^14Sk20rOx*H-ypo{`t#--G+s;S407dC?M<>FioZEtnQIC|{;2P)@F4GFANgnDS^s&a5TLE#s@-Ru^9Hz>-jfws4c!sFJr> ziYRd|rggw-bxhn;w;Pn#QD#i`%CO96dh4`N#r6x$X2#u0;MKwx zC&Br?-J!fxCo>|~IJh$KY1sio+ImIUcm<+ZPsCq{n z>`AXA0#Un$SxUd07FcKrU7MYFK zZo%1T;i`K}{aQ1o8To`Vp@9(1S?&>&!%te&v$WpONO~-S1HPsq|+*hCG9Uwu4u~o^^dmej%LIr zP{>8n008u0;(>g!8R7V^%h;?^+Zz%L13Ri5C@nyICCtQAkqa1Q))Lq^v$r#___Wk~ zXvDG_mpHhXQ8gl<*O&sILeg8EQAfmUUkl8Pr!g7t?p6=p^kh`>s;yG7>C6<<7!Er0 z-Ck)G);Wfb?hkKhV9dsH zqDdm?*P8a65VhlTU84_KzutcO*qb!VJ{EKsJ;<1As(n?m^y%Ab<@_8M2=$lB;kRk}JJajaf+(48|fWc9)q= z>867Z4e}4QU=!oTsHFbLcjyO z*mB2Om>UJgs8!lQP|7+v+3L}wqxuKx78bUXd9g2kIni{5$bFTRhfH`p^@0WSSm=5F zeRdmVC7y&WCtJGL#|w9RHc^%c)PGf8N?>Ip5CHia(21N2-m&OqjP%$Km~df=bwVzO z1_h)l{BCtn#*{-?m6Z*JUzs+^w7IX-^(Q8aln|4n`aKe7U)h8cFdQoj-Rey5M({_%PxZlc-?tNrjQ)td!vNju-$V*k3U#YZ4#TL{i;vT0lzBD;bB(pJ0 z=p`nUu7>wab>J5}AI(W13t6E+CX1=KR;)tb2WOJU)9jWdqgjf=;y(NClbnjDE zi#UFa#^s9=^)#3ARtXz70OB$M1b{FFM?y5DhoPK!w8B5zv-w%&VG#GhH_uhkBK!p_ zWQDk4S|qzt(%lcP$1b^otdqjwn-tl9FiBPl#gayqcRf66_1iIjFb@xU$LgmaZuj4L z-KrHxZswk7S5Q%j=Ft$ba|}gBYe$}QI_YT7bFHeX>=yZuE$i+MlYhBEchLM5*eCb7zoo0`r*p%2<&x&Nj39GM#Am;UyT_;P%EWI5&bfK5tNe~?am$a+ zWM9@Cy3f$tEGS)HE1PuBD|rfi>9+KJC{J-THF_MIx36fs94e=`uoc&rV)h?3kEE{8 zgV)5=CCg@`0v2r-p_aq@p|@7aF=$H4jJ(R0EKJP$wiy#D+O7Ke;ur zd$848ykz9}utxu)$Xgi))iDIZx_EyiY~VUN2sVAtdWP~?$IHMg#=}T74A-`M<*Hn5 zIGcMdddn75>u&LJM8{xXw#J5pBv`q1a5xexa=@8_pwhDSyqkeVs$sdzeRmdRXc?Ed zG2QXXnfa`qUr$dhJ%r^CJxzl#gIn`EE7YQ2bK9y@*%k*y*`f`hqqU~$P}0r1GV9pK zCmVNIr)QjSS-(*Od|a~8DPwHY_TC3^#kSp%?LWO9nele3B)s0DS54;jeoZS5yu^N$ zy8{69NC5`uFo1vkE9aAtMei@o|HB+|r6I!kCZ5d<;}lh6H)gn6V#n}TbIyPwe)y28 zQ}wjZ`Nz=>YLUTHtdaHPGKrd*YA0xL*BH`+Nt#%aOR{U^XA^D4VVs?MGrdC4b+mSI zE%mS1xJZS|2$sF!sBuq{g|BU+ScavC*z1f~(}4X4&3p-Cz#CcZ{e->*k1?{smFUwY zgHLAC^1dJCkL@g+Nb>m-<1}*g{Vd{xTaKulVVzGDH2%93foTM8%r{Q%dN=D|zfE+D zZ~9HepKf2RPkp$1O6mRTO$5|49nGGhs$(q&De`f=0Bs2ERM7LjrAztTl_9I#!%UsDRD~Ij_m$#rN+|y#EGL-+@^V`s{0 zM`ahCSI!VdM`Oj-x<_ZPGyVA`Ub0?AAr>rPb!IcN*Lt{GlHl&P8_a z5}j)4^o{zTlxH(Lmp2kj zPbCwX18)OA?2gT6Rq{4!-{|ATkn?c%tF$?{xGYm-Eu)3=XFZ#&YgEV?=b%U)h{7Nq z#KpZB7I$dgquTacB_yXFw8jiyg~s1+O%ujIpnZ7s?n939kF zPYWY1)sYB>;9HJrU|KSk))xHPVrEfHy3n+>wnhkP$mEUn+hT!XVN+6*x6MF$U~#4=+29GYF*CFtSEeg@>S3Q#)JOip`(40u8uoJLsOPc-{jb{ z)2-LDP~CCd7L-je6=$GMa|7KDK01Uho;(;$)i7m@h;}Q7kQLY#Pv*urgR(<_j>Igv ztqoThY@7Uy=O*z&BjP!}OpviWIQnb__Nx0HtyKRERpnQRIR=#rEYBMMD|ji74pUa@uD$V52T1(ydJi*%IRg6p&BA{aQl zVm9-)%fbR7EiIhd73b?^-tqM>OCI-|O2|K4v3QsL^RG+7hg^Rtyf4;nm-8a1Z@59` zG-p5gE)T+PpTC^^1xXISpwIZ^YNl;?WR5kXU!Tr`6xvj3Z&H%G-Dv;l05UNZvk zyw|gL4)E;;8Bk4TPLl6BM@3SaO%z~(W$(aR&MDR20lF)q7=Uz^Nfa&ecdBTzJ0R+O z5)%^(__J_3O&${Ny@=tf5(Z#+xQUF@HX+b7MV4_F*m`zc5;FR(>*6}R{JGyqpJ@jr z_T;v=BSGom;n0_y)6GsT6>T!XD!GpGnw`w|W$SAcQyLZK{;zY&M}##HENy-=&*rEl zd`LH}$B)`j_2Q-rbrdJnhs6<`-u}c1s_G(3V3`oGFVwjXv=io)XPo^rh~f zAD2=LwODql*)b~9WLA`fG-ICzf2U%Kdbd=ws*wXdIKaaRr^JHJyvQ*E1k2HL6N8aJ z>7|*8Ce6C7gbNNm(&k?A)QfXvIzGdU>BNJrqqL|tnviavwU_f~Ka@P^FXt|&;em34 zyJZhEDa3D^O-qZJxZIN05RWraqMUh<#Y_x|FNVtT)F&+dHJ2F*bl*0t^#yCK9i>W^ zirfg+5$(>FD+VV<-Sm|XuUE1W)wxue=`+_KpUuU_4=o&HaT67;;_GslHZnTUmfs*f zE!;$RH|X1#v-R_co;a5(4h@x8vNfg}3k4`P((rMq@h|J<34QBp?*dvx!vi8)T%Pdc zcQsBP{rl&mo?7|CK>3eCXNjZ#CK*={1GwiJK=3n8*pi&3#@la`9 zz}MJ%Z!^F4OeJ%_bQi|#`apZB*7eu03+7U8UEFx`EDfc=N#n zY0Wxl()vrp@R8zSKCc8T4beiS5j*H5$?w7}-kGGAiWhWA@RGG^V>A*hL7!Mu% z5lQWkK!Uu%)Y!a7;!_1%&QK9A;=`&ws>a!IBuN!_&u|l~6LRDUaB@I$WpE*y5(7Yx zebEI)Wv9?gX^!z>kH{w%>kte@n*CH~)p~WR#WO2c%b*EInp*m1o)+0afqFFqEkThM zQdWBXh{?jZaTT8oEJ34-#&}=ejJF$%5A%(+5JOs$NK(^-NtSE9;wiBC)4 zTmSi28Sv2{;62_?f5=ml{>>XFHhR`$^!dy1xRSmdoWJqcR6ZciU3Ftw$Uef9gd?E! zz4*%I$=I!VOAkIxF@GJSs4zrKYkZh_cR60yGH$KX%Tf)|;9n@#(4?NTMeWhxp~FO= zJ}+=_?$OlwV#TjY>vz7bRq{!WIEtxVq6Xu;fR&eJUBj{EN$C48{mKo3*ClN0Tn#_) z>RSQOFbpV{G2|dFzVCJ*;Qiyqc6-2hHr1Iby0H%Fh#9-G_MW@~!8f;9ad5$3h94$yE;;cNxH1 z4ULJt=CZtHwstBdZ^Qv>sSFx>QUhm)Om0P$uV{;1`(CO+iq*XC@mj8WN$;sTqi_J4 z81>L@%cAv&xXCqM5*3BU%vr&MUI*(hDTP>U{D^ze5{R8R$W<6F|D;Jg_&484FfhK_`QNz$OcbnITI6W2p(y0)Xa(0Pl zq+xsZ?qat(B{ayB`~wiOp0t-{h8?uBpS`zEhn1BuRrsujm2lKG!N__@Fp*IUb+|OJ zM!%4C*u(g3RQ+ZzGuV;nctf4Zz!5F37YTpro-u8O$Fq2zUXy{2K0 z+fnVzG6YVa86N#X;qZ79aa~f&mOm8GXhf7alUaX9s&$9o9DO}{oIbQiGBk=~ZiCf{ zQ?3}N;>xF*7oVtAJq5O#?P`47wC;m^KZUP5o)kF?qJs^k&`=jpbO%0K_|;e6oqA0Yc-&V2O60QHR%h{5?BFyGHL zoFwtrzmOF7<#u?Sau#<@Qjfc+ow(-E9&jlju@`*ExkK=T7R;{t3)S()DBmq_t(nHl_Gh|J z)6I=*`de$dy1-uc#47Qo0)BKauT!SQ;mf@BS1Lu;_lk#k1A1Zs5eC#@v8x$iy`J}k zpDKA=V_n-*2qg)mkYs>%Bx`6YvXfE5YJ%&?g%R}(6UzV{gDF@YKoiUXfKhXrnB&>C z*Duhord<8TkLMx!B<`c98$I*S}a!DybnSWmNJ=iRZGT1Jdt zEXOVfubV1x)|m?{7>HNM%(7|aT+>_j^7b9x&GbO>AXj;LQc%q>{gQ02R zxiP)vxEyX$$8OSfq}J$YD9o>uXV+B3uIn_obtp5J*~`!_2+RdF6^a8%XgO&}>vY1_ zC@GZUuC!y^W3TUDiW$0%nHiLEzwS4N7n=D@d9p8@J>8uX^3+XplSk=dF7#=*TON*n zp>B%EV`pa7M{%h-b&tlUOB6{mzjV#ba=GfTiBj z@UMTro0DEA=|8-|XQt;lMx8$mkE?l(#Q9d?mh~|ai@9T4#vA4j5AX>3`aStne02C* zURpFLKEDG653j!_)8vnOYm{W)`Zt8Ie003TVC(cbtwxl}OQ`$9Dq}ZqQBmiGI|bM+ z=T_Kow8>OHsLss9K=MsSPlVb2`eU-dZ*#0bg=(HMPvS z^lCO=j>5zWj`k?&Gw$v!t|k<0{6Ix@TGW(d;rz zVd&6D{J!SQ?)3Sdojb$EB$p;F8(s2s18rE1WJF3Pi#2{X-4spuQ8Qa~&-+3HvmTn+ zoStzQlA7d}v66TsgM{}4UpyC3ZwO4DUs1uTWhIb#oR)~9J|C-)#Y7kR z=u{l>+H*cOc3Bth4#@0qKh--poIH^(kQ5WGDn-16y*|#7O&Zn(V%$R508)@7*?0kw zli)223PdsvI>W0z~KTdYrMdWtGHf zkc2cH`9)E%sQ@>H1>7Od9>$c&m^w=pF0VdxshUdA;)KTzyw21i5rC;)i~8kjc~Ei( z%F`v9+NZ z;O@VXn+L;eW<-bw@P5vDwNAxk#FNlioS5SLhDT^?Gn1faG14;uo9_%U2~avMV>{RV zZFs{U-nvg(9B{0H<^C6cc@oyD1Ek2Fl!3GJBBZaBL52~Z0UFkzIN)FZUX&+`rX0|9 z!c+fdgiXK)>LR75z+4(|9Xl`rkE~WR`)o|oRK&_dai=9n;yPyyi zi?#JkyG%XqB)XxhyfF6BK(1XM4snX8ur4UZm!R+Gbh-cRVp^i zAT-O|F$O=<0V(3KX1lVN$gN~T1ZWlIhG&y`JGq|a$j-J79Ua8fv{4v$J!8$yBKN7R zJ|1|HyFrlWw7Nr5p7b7SZ3D#uM>K_;59OHRr>rNr9!RL3u&Nyb7PmZJGm zRq0x7(c9WO6hT$l^_JL9+H6wJxXJ?X4X%(v@Qv0lp_|VFkUDT_ok0KTo(JXMEY9Da z2RlRD9YY+`0fF@Oqm9>~M@CEcBvam9oTF+`~1vc48=(M+E3g%$@P-f85 zY(T-L&J`=4$CC*!QpaiBOLm;%OrAs$daO^7e@|Ma_sYGJEW9$M$A;800Zz+4D-_LC zIfA0s$-`8kHNj?A=@iOZToAtNl*%|M8eUg6F+$c|xlCWj{VlAu58I*3R!7q?)0Nrr-MB8 zH&fFbiMj&3NG{9PSB25LYaVtIB(RO}kXnQ8RuC!fCz%PE+8H&fJU3RnJbCtCsi_KA zps`Zpg2{3QfjJ7zj6IqttkgJWmqG@CpY$GLf=Mce7d#HJs_x}9adoL9Yi)iCT3SEi zA_GKv%97#Js%>A(m*IB}R`(#amAUj&LE6U(;C;kZxt&@8!B+?xKBiRuupb+tYQ4!^ zJmpv@q!=Y{{W*7HeNS9^VT0iGY@GG9Ig~}-*#bwJ+Ulp3ePz+W*rr~&t<1%Zw_JOS zhnz@nR@uQGPbuzuO|x>Xqs|m<{qVcB}I!bHqw z*M=S=Jf7viUcMCcF){-r$B|6VkmoL%XK(J2IH)q8>Hms_D0rKiiJK$3%xsxqTHeHb z?G}&Rl!Qk+tX<+4REz{|RDB=jjN44C{kMQYgjNP@Dx_*rPJTmqmBm?!2XruqYTQ`R zcCNu`pQ8LF!1Y$8&?&#qRsihq4io44r0YPLebm0Yt5T4P8Pc;^)4Kai&4QJAnsGHG z9WlsUu@zGy_im;|^!&T(7D=I+4)wI}oU2KX4efIaDPKw%cZ7LZ$?skWpX5fJ>ee_h zS-u6&+qpI&eMN(EUJc!}GnFxckO^%)4pXw`fa%(VvU95E{F5}xa%yQ*{r}JRCb|$5 z)P2A}1cX?FMaO|oNFH?`3rY7PSfm8lg~`MgF*3vz(5A(z3Dzk0Fv+N7elJbxMQZ&p zaoe?CZ^E6fC z(!6yWs;;8?`tyTnD%gy%P|fb6OU7Cpc!Yv;;<6@vjnj}AK+Fxn#r6b@LIm0BS~$lb zUVyJJ!eYOTm{$L-0z{N>O@Z~4iihc_&u%h?j;YfMUW0z{s1)JRGq>Qe(MKns#jf-A z*la0#Q{cQ5mzAHQ(&KQ6+ljp&Jy<^|eH$y>ZiC;MP`E)Ef7P6d8ebi$+}cLko2ydZ zBG8xvN}CzHYNce$!{NNnI*U(Fi7GTkSIU&zEZmAb){h`GJoR&c<2KkFAIHo5^KS>i z8cu*@*hgi+V3Y9TD;$u4?$LK1f8aEl#7m4O5Dj~aLG!~kE;=iV%6%EO$Pnn5A75x> zO^y@O)O={qJhe>0g-6@P0)LD|N(^ZPkd$?f zr=^<^Bo+k%;UNM{IlhGwi>amyL_bXp7;*ypI_%%<1wx0r@wX~|cl19cwKj*{!4v28V} zLUR|CA`Ni7OaA7Mv&^sWtsY`XG09&q)k2`CW!O?G&<;3Dh1aMA9sV#uFsB$2r#J>r z6T%J3%;I&64j;atn9U*@e!KwP&cK^@TU(SmXeR!&tK=tNh11w*{7hlyC^T8#MhcZmQ*Ws~Enx%pA`s=q0c8-q%gN2Ec}>X9 zRKv6Nv{t^ksE#-;LY8GuOC9>?t}7i%cc9m3Xp-O&fx%L`WO<9?AFf8t%}a?SK?sOT zME>CIGU0#TQ)z(40u-^-p-)d18?@JHAr6AAIo|hti^Fbd%o2|E|)DuvDt>*D*bp`2Lh0S|VTzdkV7>CQj`ivcU<)A2`8{mmH7Z zbP6Rjl_?(FL01T&&i?1$KQSL#1H{8N%!$A7>ASnmVAG!-T+Kg^nNE|~4!LMf!60Xd zDTsU9Zz`5j(P_W+OeRcsS{!k;^G+Pd1ML)3$!*1K$nYg~vNAIGk`tw@$h4!^o=YIj zp}OtBI+G5#cJCM+BbdHmx88W_d?pc#R$1&x#oD+|dPGo&SnjY^`9ePbOqB)kO5}U$ z_3hYdX#fwq$uaSw;&F^_2E5Xq$kA$?mxU`ozvtF%-+HO;#IZWSl)Jm(-Q`kabgd;r z5@9D+`a(Uc!lc*Zn~eD1b@+#O{9`p_(8*du-41`~D`WGIrjijDmJ=Lui8#yk$ari8 zR?w5{5ZSR36EP|osmN$KPr%D=qKVrG7tOzgl4xug?ilvY{x}sUS~kW ze3Z#?aa6q8xp*n}fkp?=Q=H}TWeF8VLRFw6&}g@|;^A)=o+~k~VdeTxlj83C)@<+jYpUA>s5Czr5o{z2)|VHGorBSq@)IPuFeK1V)%Z?tvW@(*;z$C8}C?Y zN~7H)YFyrmVk~L~bMj;NOotEdak$qpa~Y$iSHHjB_cJ{$M?7OQ2|B7YdW!Ft7G>NH zD!K>jHI}#E!&A*4_U?D@IscBhf^mT8WdMO!P(>BX_~efe5DIJ)ZXP{StGqo%vvJ__ zq+q4DI#adpB+}w^RIfSu0vB!4%!+!Rcy-I$qXbu-tRlQr8%;*)m#vvzcfTT81UXw_ z^U%o9+iG@AM7*9y^67&03CBmnF69_673?(DW;X)Vy%Z=4g4_=rrN?9?)hx`s-JFp} zLTeIXVXhHN3S*++vLLats7_9kB&bHy!X>S1Rbdw3JC@ag*~>W&x^cues|i|1q@ks5o*q7YWM!c|p_9y@fesDyGWYVoL~Lpp0kLO>e;&|?|XI@ z^}bd|R~aA5YX@2@Ug4OwG}6IIuEeE)yNUXoUb)9RR^~X&$&MOH-gS$WiZWF96q6{6 zmLDpV_4Y!X*;^XETc$qX8;=9d?X+4h#G>E>5h1$e9qigC%B=j}@aE6MM3iN0O!-aftxx&4I<3+D);G3_8jXfTs`2*dSmo>9 z?x3+svr~$miWgA$+f1OyQ=j+SxH-DQ>?TGPv*b>Ln#CC#{pi|Yc7^OiOZF%YCNURJ z*;bXe(WkHE+N&tl85<^&GKAcQ)rH>1)Jw#`1TfoAwQ;&@VnZJ{LRXYwRoA=`%7dm9 zj3uc(MFu;aArxCi0p69oMXdGmmgVmb^~4S-S9@d-&vlKMPOmYH?VMLRzI!EPWn@s* zBVsSICL!HlJzXc#(cm8G=D`tc)zQJOLQE){P)q=`a7|e=+FHAXTmsowPJXA@l3^5Odnud>?)0@_;QI1FIHi?ktSY4H`j=u|bYVL_{wDw{>wyXt- zq)0~pDnIV4Z0!5o#M|i2x@~Fs`qZmHLC>VZN`(-!vaF8Z~*SaunnycY$-Ty{m(o zF|@k^B~{dloTO?&O0&kP)*)xIJMk&T-YMwWxanZ*rGjgG1Z z>3T7xfMGK3p@EnscG_~e0_exX=o4Mly464@UM{(P;PB5CaqF(H=;Ol zI`gwuC1yV%5Q~x>0W-)y3sH?K3xxVaOR{ToScZu zWzd%j_Q>zvS+_rcpZIjBVDemBP~8W3QI4@6tg?z^O0*BY&BmNmGgrY#MC{LJH<#Zp zai^wKsL|AFYqu@pSk{phHtlL_eJT32?vJk(jfVQ_j)1KS0odIK54%UB&;Ne3iu?qUz_4$^DVSoo>q^#p1Bg52BkPrJ`7 z76%>dOt~8@##h=H>*KCoV^?_ zCKhf%#t;1?*nO6Q!Dr$D>G{(2^Yyg^E}fmny6r{QdBZ z)J6ysw~|STBi{v>o&5-1o(Sh8zFU~YbpTP2=dajcr<8jmm@`!)G^?ZQP|e{(l*+hw z1ZwsV~Lc_i%*DA_$3F`qK+$(OB90*F78ndR;jU6JTCiTpfi9u0pj?Vqx=|+5D?YOAuY@Nr;#X03t3GCQgi6NOS`5 z)Rg82vPwu7$8(_f$hbQeI>r;bl!R`{Bn#*H6Q~^j2AbK@~#05y9Gy~9=BR`7E$OHlB@}JdGIJGM3 z<(HF(SDSltjfjMi9(^PGeh4h@keS}$NLrZ^yt8Q+Lbvw9`5@n2kx6>cSuzLLk(ZgC zK25{#tf9=3JC%dSr8x6~sT5(GD1WO}D%nr$r^0K}HCIL_6Oy|b_Z*%xZ>WUdap@;l zO&wf|S;?lW&NgDZpUIf_36xY~OzPEyzD!~=g=!w&%4ZSj%TE&OB0j0*vRCI;;CYJC zdgOAqq?eN$Yd6i3b&biUu}0#>(x+$=X-kb~UosQgJyzJc^@LF=Svt+9u^qd_`-X0AM$(kkml zr)RIeD6a>9yc?9qrd9OxxK({5OH?&|lvcrgR-ta~TmFY3Wm<wCITz zL?noiLS!F)&-0%1{_+0({PTYPn7Q}dnYrKj+%q$G&ec+rfB;wUUmcFB_~!Y@g_BIk;-OB%1}zU1{4Gnah0V(*fZD+rfdCArLOdzD%Cs`7u}1^-Wp zt4}9)i<)qrX$JtH9`;EpYXpESUQDaR1L6hpd-@#2{jS~ygil9(l52f-9a!- zbw{O2=8wY~aOvNHSlKQ?)aBin+Y9!0^x{oeiENnv{zVH@y=Rz$uD~Pw$dA3~p}N#wU730r5L928#8?h%T$&`##T_Pq>HYBgvIhRWvl5SvhmZ~3C96aBAEHG~=QogWP;WS6fZhEN3ul5tqwW` z&;kJYgF*KfEABV|C^fCGi&whx4+X$g3imzSivT&EJj)RnkZjj!)me$7-6Xxy&WQ!( zxClZtacYmXJ*nV>n(ds~r=3Y$fx zu{%(pr}l(nWk&zddSo^ize-a`arT*#4uqxgGr3B-sJ(uBoBmwno91i*KyT+vQNMB- z>`HNTb#`V$!uOa5GH zdD1#&P)J}TRWdB$I{Z5%qbgR)b%w4YiqUx6mzgKjN*Zmy*yL^S!%q1X#E242e*BCY z{YF}xLivV@sh2_3fO8vW{E4@QZAGB|uX&}^g&~uJha3lZFT$GcF9N#li8xutCbJ-D zF7)%G%Pv>6wNNjn)%z~P))=voZ7tT@MKPE*&E?%}Q8iIocq@$^E`T<4;5AKts6TtB zF1m}s<6|#RWOb{CrLXX1YYViJFjUpJsj<9iy7Er}fD0AY4y>^d$^J9jH*kPx^2czgUE#>2QCVD(FcXQxz&~s%6EnL z`a96L^q@0X>XY6JAB$^6`0MvD^C4mdzbUFBN0F;pQ%yN7y=<5$_yC1~aea%1PMZ&@ zl`yeS%gvTt!hWbwdG6ZfW4Jb)UH2EY*NR=qSRp7wG z)BBw+Xfdu_AvR)4ngUVP`i*K-SCr5Ra~bvL$4J~wu>uUKGCx2({&k2r_f-q+skD}C zZ~baY*o}}mt=kX$m>z7{th8Z+Z% zx8~*-r`+rI39AR^_o#^AS=@S4B47pGAv8s`SekWE%vA_jpawz_F<~4V{*nR?= zAQvkbf0Sb)6Uo5 zBh_CAuvS!Z@$oez!Qtq#&TyM|Ct0YLfHU0ZZ~8X9${;^-#7Wl|?}LYVFyh!xsFF&< z+NnLQgHJeB?$>D38jS+J7Pa3ym1b)`x7FX@7I{^t!6vmNI`4Wy3m6z|B=h3q9z~|D z*>L>Adg?@ix-|GiKnv=DhU4dnFuH85HH`%6wf2)xLJa_rfk+UWUj%?b5>IPMeQ#UX zlphe`H!2Soy7Es=2L7utxwRaR7O|G6;aFEs`F>3z#X$?z73uPr8PAmTCksInM${)F zAe%s)xSaX=diXkY^(;#x5`qkNNa!eDId#;aJC?MmwuMh0TUUbWgde{m}n&D;nR zj~1=(6DL_)Ek9i&}|YkWVA>UiW(Kj2&mk^K87?}99I_E z0$aC7l8I+<#D)yVq%AWj%f<&9wYQ>z! za!M-nYar~4YT#2u!^Z$ye64Hraaxq??2B@0{br*VVLQ5R%d9!tcXfllUGzM~zp#D# zs8AO|%XqYCbCaLHgJI_S9#Za?LkFbzAlkC~m8sWrtMk8*`C`#eYi3{LWpp`vxxNAb z9SBFXfkS}sWMOpSO{(}~N#z_IH5?w^|KI*0B%U-S56bq078 z6IrEF$H>+-UuvC9A{i%jcF*pWsyd@)9UtbR+sHiy^SaAyx$&axJ|rRPh?{#ST#rc{yn=jTB1Je>WMJP}tWuVZxJISM`K?{jyG0ytPVBF4p9M(2 z<1)=vYI|^g0{{FV_j1k!E`~Z!Ei>s1ZgqU9^8AiN^wS0n6`==8{^K72m+9#4*D)f+ ztf9T^*BO(shw=xt#<=15y^~`0eQ|$I3ApkD?^MO5QOohdS#iaKp{*0mww5nc(Wl-*Vjfb{=~%sK#>0mX&mNFB&PTNu zEp!zNN&tW+78typVMba1QD!$!mNgWo=P?{9{{z8xbeOWpYjyZzdrlC zP!C4@q#tEXo{E&Z>0-QCTX507XszMw(;XXSO1TKm-5-oBGFyvCF=x5&s8y~u%k<+N zU)HBrO?P_sv=6%l#<3$dMS8a4ExyDx_v8!a##XY&rvTk5I_Xq|InkpVpNyXq;|&b_ zOcOT3t+hW}Qc}l{aAY*S4U7Yx<*qBe?~5D}yUVCG?s7Rn&qBT2R-=cLqsfT;^O;ma zvF9Hpd6DErNYo6db7_5KtZhY*{Kn>QuH-DR=BS-oH9lcg@h9h@;m4f$knw7cexf{w zI90q`DLwvS=*tZz^T9^AuJ;u`u$#%Im6$nosY3Q*iejgM2=j z!e@6*uOB{G?;E-Iq!u8q3tPo8CZP}!>`5}24J%7!mgBqE^GNh!Dbp!Lf%g)ps+6P@8b2dJb=IlWVoz|nDV*Jotbr4UoQ6*H#V6wS_C)k3i5|3v) zSYcV5);;>Dm3utC_yIGMPF~`%DlSbnCE|T>y-XNNqoukNc|cKT-6r>SsJr0JyjW@e zS4iUG3_$+{l2%5#Xo>AD)$E}9)L?PVSRv(Vit#0#dm5`tAoDdTI$ziBp;-RC^v z!k~baU#Cssw6)mAhrz1;Z3#JrYkz4@vh(mBZ7>C$Vzw~#j4S`@IIx`j)c!-(zY^i` z!SEf%#Kwi22aV2s)8sWTaa<#2V}fd`_QoTGi(8=tY_ACppl^bh8}K1^m{teE7dPDP z=CM(4If3{HxMv_SRm@zpf=$q4sgj&2OS-f%^rubJ7ixtbN2fCO^Cd)Y;A0~at6c$u z2J-04gf)fUECNQI=S^Y%;HZ#**Z@~{F0NHHaYq^fWDG`1&qrsl>PG()VyO!(8pX^89kbilMPNsIR3(#vf$dgKgR-gGbhi}n$ zH>J=@|8-EmVg5GFaG365!+rJ||wF(63`8Sq`r z0)V*`9ULzuF9449PCuA6>z_i)3U?rF9xW`kwr6O+pDsz(9qf4efu$5h3;c%R;Ig!m z7OAubG;y;dV!-#O%>D)<#O#uqpm<^JfjS=VK>Cav*6Gy-Polb?%S)`hWU<$tt4$Sg znMu3SC}bPEV(@m1>=-=}MXbtDbn2Jb+#I{4+>$NPz3vr`E^bZWX&DL(mrlyPPn_pV z5l2MUDn=weElsm-U(sx9YV`nO^`I#UJz-_p*6r-Pv-|26)3T*Rdm#L0hm-ZJ zmEWZLc^-Q0Umrkfy;2U4&3(3kgsg!zSf*v|f*!sXhGGm5j!;SW36<`Jo?4N}F5_P> zpIhu!B#+B>0T8ofPXL5Z48z@#oFRqnpe0QJZ%q}u`AW^?x=Y6kb>iUV# zaIeBwGe^rYZ~ifBw-?CUGa1`C*{dOozDB1&^XF#zuy-e7bW=oYDM4E68emm}=5Bqx zyL|xB(k73&xh6H-k7sg183l@!rzj(8UPom>+otPW-XXo{&wXp2r@q`;9j=}|c#H+e zmMb&8jKw0NSYF1M!X>A!rKR5-Cq1)N&WhoE6BWtcGd>jNy_aeuzke@tbpKguT!*VK zuZVllq^$J>RZ#UvtRXz3G}|Hg$Emk-OQ69{ZA`;`!bM#W^7n@N0sYJBL#4*tjpkSZ ztX&#NWr0P7s<)i6u{1;WugbKV`1i*~E0$o<1~hbt*9KrquD%aZy?HXyj4-SK5tORPjLBo0zDE!i;2Fj~aC!9zp;bfC?Xd zW0giB98n?Ufe)uuI&R%-_m*8xt%h50FFYOoUQ!Rg?z8Yp=5SM7idlO7PSGZ

q)t zZ98?m7I$5NB$1MTu_RmyysMK6fvNB%!0e z4arpY?6OvfAR{6jrEwr}>3WSn6?g>`uTHuNRARP2KI8e0Vn4$uvthpzd>S&sbNL-% zfP?CtSSr~!mo_HEBVECTvxg7&ce)B2+>k@A=LhCdnvrA*EtAWycGg(C_DesXUq<@& z@5RVCPq?$uC(U7tE!w+0xLty0bO0Z$2&%)`nRfd}@1E6otx!Se+sf&|u*mYB3w(!@ zv0TKo@}U_3vvcvpk%;s`n%!<8*z6gjZr%LbU@wQ(m&9+APTge{NrgnP&N8^oZmjto zb!V`Kgx-x-CsyDNt}9EOA~1a_5D-SxP^)K`LeAfO*`5AAe>t$%4hhTiGvM^!jp>JW zN0wP%{iP(ngFTGHul!Ghf%?H=5^@%#U$9uLz&$g%a)+E zlyQTf0l6no9Q)(@FBWg*UpF;7D3eyiEQWgqyv|>Q{X1FH1cXL?ji*W_V_v!)K@;YljDQ03b>a27+WUTE`j6AkRgKT6zw!jmM6F|RKyralV(1-=wO=ei2p(p9m zb0weJ)Xt@JGXVbkC_p4NBVy)j{1P|dPa-ZTapixT2vjJeWgE?kP#OFZ3>j2?A*>Nm{uFFCICotov6v(dl2{X*M6XT&GixlQGcP8}h{40;5koV|Bz2 znA}FY`P405IlMb;uJXAl3V!g1J+O%aW=_YfXg^e4hPR+kF=+~04+ND_x={GOj!#qb z_}K)}ddn$ai$M==(Z59aVcCyRu|lBybn(Y6AO9TF^^6BqodDsjn#X_WDiRM_iGMq< z$A!Zc`}O7~kU!)i18$btEa$M?NlD_~`}TP@VJQ8;vfy6Ytd5^JK8{COhgYa;yer0#{-aa!4jtE9(Ug4rDXgW`Ef#Hi;YY>o#7N^Ijru#Ls&;dwM_>3IaD z7ZIWa9sQ;rD4K&S2$gL6^HbBYauE?bLgR?SaHJX60y}Dqq_?NWg#dC701%x}u86U6 z(jVgnQEBrMX9!PU`QHqa2vi!G$VH~Qy#BpNq6wl_CS{>^8X$@++%k%wtWw|~udzQ6 zEBrGOTDNB2noG!k>8;(M)qPR&cUksS5YF-}m$qrN$?R4-JDIn+<)pyZN1yf85I`vAK6= zI=bk$BBkw9^X9h^o40wu?FwnZ)=83WX%?Km0yFmnes~O4f9M(>ViWhc_RXWf!$JD1 zjub=Ci(ZLB#mr&RwoY@&IJz9ybAsu!kJVVD3>B!f(%X%`W}mLwR9;%D02(top6F1p zSHm#w>n8kat@CHf{u6yZ`zMt=tCv51Pd2tYE8p2-CmAJ+%P6k9&ebuNxOYB!ubvoU zg|DcSKhtWKtJpWy5gZkOStv_(TFEY;k_AXN`etr_#z}lF`TEI_*1{fLoeiUo zuH%ZRwJNL0=%0MS45#XmTPyAu-~1&Fe*2Gb%{a%fEB~EwvoM7_6V_sghuUQ2q$D6+ z9}ZZBTc2_?mrWE`j=%9-r&fR;ve{n6A_8v;sSFSr^2*zCF`>2h=wUukg#SzUXZGv@ zqd48WJ_!gAQ~0tc+c|)SEwBv7*weTMY5B+|XGhje(qjWd8XDSh&&1c(+KibgKFx!X zshbiC!;;wHDreXb1!PE;-!A;;qp;DCk%@6RPjlDa*Q!4JYbHwPj@9Seza#-bNRyQ> zuxF571vwp>!^(XYFT40Y=2Ll6dwN+(rK6eoulgZ#9nEghO{E2O;`FXmH}BRTTom*y zBXWFM2LA#$@y>tuJ~kK6Ivkq!vi*4}s zFFEg~%%Ujva-!+l?bd9*3L^BPZkrI4&Tlv0mOX3hezJEg4t@^J75m$vrVV)K(jtdHYNBwh_H+OS!#tD|ZnmA%Wx6B^t`e&3?^z$D4^h#A!gd!m=- zX&3Rlcs zDN@LzUO~sCAsB^`$ln$W+rM7l&Mdzhtc7w_Q)xN3aN5YQ<14g?3CSrklzzq{cjhgmcN(5R{XiuZ<*;y zl3kP&du?l8J-;yiZ1%jS)<&vVyS*h8*{2&K{&ji7z|(-W+M({~GqY$EgSfr%F`CiS z=~g2q7Q*}IJ}0rN+M|xR+EWynC5(fJ@4abGPQHmsjxWFE!^H}CiNiqFYHL&a`e)Pmq*fBbzYwb##GSZN6!Ej8!6qY3pmOnlCCLA$o%|Obe-s%2 From 3ab67bf4216be079db3b1c9682fb621d06826eff Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Mon, 3 Nov 2025 19:08:49 +0100 Subject: [PATCH 39/46] Use the new notification sound only on debug and night --- libraries/push/impl/build.gradle.kts | 4 ++++ .../push/impl/src/debug/res/raw/message.mp3 | Bin 0 -> 8685 bytes .../push/impl/src/nightly/res/raw/message.mp3 | Bin 0 -> 8685 bytes .../src/{main => release}/res/raw/message.mp3 | Bin 4 files changed, 4 insertions(+) create mode 100644 libraries/push/impl/src/debug/res/raw/message.mp3 create mode 100644 libraries/push/impl/src/nightly/res/raw/message.mp3 rename libraries/push/impl/src/{main => release}/res/raw/message.mp3 (100%) diff --git a/libraries/push/impl/build.gradle.kts b/libraries/push/impl/build.gradle.kts index 87b3c681f1..b0e32481a4 100644 --- a/libraries/push/impl/build.gradle.kts +++ b/libraries/push/impl/build.gradle.kts @@ -21,6 +21,10 @@ android { isIncludeAndroidResources = true } } + + buildTypes { + register("nightly") + } } setupDependencyInjection() diff --git a/libraries/push/impl/src/debug/res/raw/message.mp3 b/libraries/push/impl/src/debug/res/raw/message.mp3 new file mode 100644 index 0000000000000000000000000000000000000000..abc056786c8504a9441ed74e955d9dcfa6bac927 GIT binary patch literal 8685 zcmd^^cQhQ)!}rJTYOAwYHLC^@RwsnjqJ&s1QDgNkM2K$n-b+@CUZa<25nYr>wCITz zL?noiLS!F)&-0%1{_+0({PTYPn7Q}dnYrKj+%q$G&ec+rfB;wUUmcFB_~!Y@g_BIk;-OB%1}zU1{4Gnah0V(*fZD+rfdCArLOdzD%Cs`7u}1^-Wp zt4}9)i<)qrX$JtH9`;EpYXpESUQDaR1L6hpd-@#2{jS~ygil9(l52f-9a!- zbw{O2=8wY~aOvNHSlKQ?)aBin+Y9!0^x{oeiENnv{zVH@y=Rz$uD~Pw$dA3~p}N#wU730r5L928#8?h%T$&`##T_Pq>HYBgvIhRWvl5SvhmZ~3C96aBAEHG~=QogWP;WS6fZhEN3ul5tqwW` z&;kJYgF*KfEABV|C^fCGi&whx4+X$g3imzSivT&EJj)RnkZjj!)me$7-6Xxy&WQ!( zxClZtacYmXJ*nV>n(ds~r=3Y$fx zu{%(pr}l(nWk&zddSo^ize-a`arT*#4uqxgGr3B-sJ(uBoBmwno91i*KyT+vQNMB- z>`HNTb#`V$!uOa5GH zdD1#&P)J}TRWdB$I{Z5%qbgR)b%w4YiqUx6mzgKjN*Zmy*yL^S!%q1X#E242e*BCY z{YF}xLivV@sh2_3fO8vW{E4@QZAGB|uX&}^g&~uJha3lZFT$GcF9N#li8xutCbJ-D zF7)%G%Pv>6wNNjn)%z~P))=voZ7tT@MKPE*&E?%}Q8iIocq@$^E`T<4;5AKts6TtB zF1m}s<6|#RWOb{CrLXX1YYViJFjUpJsj<9iy7Er}fD0AY4y>^d$^J9jH*kPx^2czgUE#>2QCVD(FcXQxz&~s%6EnL z`a96L^q@0X>XY6JAB$^6`0MvD^C4mdzbUFBN0F;pQ%yN7y=<5$_yC1~aea%1PMZ&@ zl`yeS%gvTt!hWbwdG6ZfW4Jb)UH2EY*NR=qSRp7wG z)BBw+Xfdu_AvR)4ngUVP`i*K-SCr5Ra~bvL$4J~wu>uUKGCx2({&k2r_f-q+skD}C zZ~baY*o}}mt=kX$m>z7{th8Z+Z% zx8~*-r`+rI39AR^_o#^AS=@S4B47pGAv8s`SekWE%vA_jpawz_F<~4V{*nR?= zAQvkbf0Sb)6Uo5 zBh_CAuvS!Z@$oez!Qtq#&TyM|Ct0YLfHU0ZZ~8X9${;^-#7Wl|?}LYVFyh!xsFF&< z+NnLQgHJeB?$>D38jS+J7Pa3ym1b)`x7FX@7I{^t!6vmNI`4Wy3m6z|B=h3q9z~|D z*>L>Adg?@ix-|GiKnv=DhU4dnFuH85HH`%6wf2)xLJa_rfk+UWUj%?b5>IPMeQ#UX zlphe`H!2Soy7Es=2L7utxwRaR7O|G6;aFEs`F>3z#X$?z73uPr8PAmTCksInM${)F zAe%s)xSaX=diXkY^(;#x5`qkNNa!eDId#;aJC?MmwuMh0TUUbWgde{m}n&D;nR zj~1=(6DL_)Ek9i&}|YkWVA>UiW(Kj2&mk^K87?}99I_E z0$aC7l8I+<#D)yVq%AWj%f<&9wYQ>z! za!M-nYar~4YT#2u!^Z$ye64Hraaxq??2B@0{br*VVLQ5R%d9!tcXfllUGzM~zp#D# zs8AO|%XqYCbCaLHgJI_S9#Za?LkFbzAlkC~m8sWrtMk8*`C`#eYi3{LWpp`vxxNAb z9SBFXfkS}sWMOpSO{(}~N#z_IH5?w^|KI*0B%U-S56bq078 z6IrEF$H>+-UuvC9A{i%jcF*pWsyd@)9UtbR+sHiy^SaAyx$&axJ|rRPh?{#ST#rc{yn=jTB1Je>WMJP}tWuVZxJISM`K?{jyG0ytPVBF4p9M(2 z<1)=vYI|^g0{{FV_j1k!E`~Z!Ei>s1ZgqU9^8AiN^wS0n6`==8{^K72m+9#4*D)f+ ztf9T^*BO(shw=xt#<=15y^~`0eQ|$I3ApkD?^MO5QOohdS#iaKp{*0mww5nc(Wl-*Vjfb{=~%sK#>0mX&mNFB&PTNu zEp!zNN&tW+78typVMba1QD!$!mNgWo=P?{9{{z8xbeOWpYjyZzdrlC zP!C4@q#tEXo{E&Z>0-QCTX507XszMw(;XXSO1TKm-5-oBGFyvCF=x5&s8y~u%k<+N zU)HBrO?P_sv=6%l#<3$dMS8a4ExyDx_v8!a##XY&rvTk5I_Xq|InkpVpNyXq;|&b_ zOcOT3t+hW}Qc}l{aAY*S4U7Yx<*qBe?~5D}yUVCG?s7Rn&qBT2R-=cLqsfT;^O;ma zvF9Hpd6DErNYo6db7_5KtZhY*{Kn>QuH-DR=BS-oH9lcg@h9h@;m4f$knw7cexf{w zI90q`DLwvS=*tZz^T9^AuJ;u`u$#%Im6$nosY3Q*iejgM2=j z!e@6*uOB{G?;E-Iq!u8q3tPo8CZP}!>`5}24J%7!mgBqE^GNh!Dbp!Lf%g)ps+6P@8b2dJb=IlWVoz|nDV*Jotbr4UoQ6*H#V6wS_C)k3i5|3v) zSYcV5);;>Dm3utC_yIGMPF~`%DlSbnCE|T>y-XNNqoukNc|cKT-6r>SsJr0JyjW@e zS4iUG3_$+{l2%5#Xo>AD)$E}9)L?PVSRv(Vit#0#dm5`tAoDdTI$ziBp;-RC^v z!k~baU#Cssw6)mAhrz1;Z3#JrYkz4@vh(mBZ7>C$Vzw~#j4S`@IIx`j)c!-(zY^i` z!SEf%#Kwi22aV2s)8sWTaa<#2V}fd`_QoTGi(8=tY_ACppl^bh8}K1^m{teE7dPDP z=CM(4If3{HxMv_SRm@zpf=$q4sgj&2OS-f%^rubJ7ixtbN2fCO^Cd)Y;A0~at6c$u z2J-04gf)fUECNQI=S^Y%;HZ#**Z@~{F0NHHaYq^fWDG`1&qrsl>PG()VyO!(8pX^89kbilMPNsIR3(#vf$dgKgR-gGbhi}n$ zH>J=@|8-EmVg5GFaG365!+rJ||wF(63`8Sq`r z0)V*`9ULzuF9449PCuA6>z_i)3U?rF9xW`kwr6O+pDsz(9qf4efu$5h3;c%R;Ig!m z7OAubG;y;dV!-#O%>D)<#O#uqpm<^JfjS=VK>Cav*6Gy-Polb?%S)`hWU<$tt4$Sg znMu3SC}bPEV(@m1>=-=}MXbtDbn2Jb+#I{4+>$NPz3vr`E^bZWX&DL(mrlyPPn_pV z5l2MUDn=weElsm-U(sx9YV`nO^`I#UJz-_p*6r-Pv-|26)3T*Rdm#L0hm-ZJ zmEWZLc^-Q0Umrkfy;2U4&3(3kgsg!zSf*v|f*!sXhGGm5j!;SW36<`Jo?4N}F5_P> zpIhu!B#+B>0T8ofPXL5Z48z@#oFRqnpe0QJZ%q}u`AW^?x=Y6kb>iUV# zaIeBwGe^rYZ~ifBw-?CUGa1`C*{dOozDB1&^XF#zuy-e7bW=oYDM4E68emm}=5Bqx zyL|xB(k73&xh6H-k7sg183l@!rzj(8UPom>+otPW-XXo{&wXp2r@q`;9j=}|c#H+e zmMb&8jKw0NSYF1M!X>A!rKR5-Cq1)N&WhoE6BWtcGd>jNy_aeuzke@tbpKguT!*VK zuZVllq^$J>RZ#UvtRXz3G}|Hg$Emk-OQ69{ZA`;`!bM#W^7n@N0sYJBL#4*tjpkSZ ztX&#NWr0P7s<)i6u{1;WugbKV`1i*~E0$o<1~hbt*9KrquD%aZy?HXyj4-SK5tORPjLBo0zDE!i;2Fj~aC!9zp;bfC?Xd zW0giB98n?Ufe)uuI&R%-_m*8xt%h50FFYOoUQ!Rg?z8Yp=5SM7idlO7PSGZ

q)t zZ98?m7I$5NB$1MTu_RmyysMK6fvNB%!0e z4arpY?6OvfAR{6jrEwr}>3WSn6?g>`uTHuNRARP2KI8e0Vn4$uvthpzd>S&sbNL-% zfP?CtSSr~!mo_HEBVECTvxg7&ce)B2+>k@A=LhCdnvrA*EtAWycGg(C_DesXUq<@& z@5RVCPq?$uC(U7tE!w+0xLty0bO0Z$2&%)`nRfd}@1E6otx!Se+sf&|u*mYB3w(!@ zv0TKo@}U_3vvcvpk%;s`n%!<8*z6gjZr%LbU@wQ(m&9+APTge{NrgnP&N8^oZmjto zb!V`Kgx-x-CsyDNt}9EOA~1a_5D-SxP^)K`LeAfO*`5AAe>t$%4hhTiGvM^!jp>JW zN0wP%{iP(ngFTGHul!Ghf%?H=5^@%#U$9uLz&$g%a)+E zlyQTf0l6no9Q)(@FBWg*UpF;7D3eyiEQWgqyv|>Q{X1FH1cXL?ji*W_V_v!)K@;YljDQ03b>a27+WUTE`j6AkRgKT6zw!jmM6F|RKyralV(1-=wO=ei2p(p9m zb0weJ)Xt@JGXVbkC_p4NBVy)j{1P|dPa-ZTapixT2vjJeWgE?kP#OFZ3>j2?A*>Nm{uFFCICotov6v(dl2{X*M6XT&GixlQGcP8}h{40;5koV|Bz2 znA}FY`P405IlMb;uJXAl3V!g1J+O%aW=_YfXg^e4hPR+kF=+~04+ND_x={GOj!#qb z_}K)}ddn$ai$M==(Z59aVcCyRu|lBybn(Y6AO9TF^^6BqodDsjn#X_WDiRM_iGMq< z$A!Zc`}O7~kU!)i18$btEa$M?NlD_~`}TP@VJQ8;vfy6Ytd5^JK8{COhgYa;yer0#{-aa!4jtE9(Ug4rDXgW`Ef#Hi;YY>o#7N^Ijru#Ls&;dwM_>3IaD z7ZIWa9sQ;rD4K&S2$gL6^HbBYauE?bLgR?SaHJX60y}Dqq_?NWg#dC701%x}u86U6 z(jVgnQEBrMX9!PU`QHqa2vi!G$VH~Qy#BpNq6wl_CS{>^8X$@++%k%wtWw|~udzQ6 zEBrGOTDNB2noG!k>8;(M)qPR&cUksS5YF-}m$qrN$?R4-JDIn+<)pyZN1yf85I`vAK6= zI=bk$BBkw9^X9h^o40wu?FwnZ)=83WX%?Km0yFmnes~O4f9M(>ViWhc_RXWf!$JD1 zjub=Ci(ZLB#mr&RwoY@&IJz9ybAsu!kJVVD3>B!f(%X%`W}mLwR9;%D02(top6F1p zSHm#w>n8kat@CHf{u6yZ`zMt=tCv51Pd2tYE8p2-CmAJ+%P6k9&ebuNxOYB!ubvoU zg|DcSKhtWKtJpWy5gZkOStv_(TFEY;k_AXN`etr_#z}lF`TEI_*1{fLoeiUo zuH%ZRwJNL0=%0MS45#XmTPyAu-~1&Fe*2Gb%{a%fEB~EwvoM7_6V_sghuUQ2q$D6+ z9}ZZBTc2_?mrWE`j=%9-r&fR;ve{n6A_8v;sSFSr^2*zCF`>2h=wUukg#SzUXZGv@ zqd48WJ_!gAQ~0tc+c|)SEwBv7*weTMY5B+|XGhje(qjWd8XDSh&&1c(+KibgKFx!X zshbiC!;;wHDreXb1!PE;-!A;;qp;DCk%@6RPjlDa*Q!4JYbHwPj@9Seza#-bNRyQ> zuxF571vwp>!^(XYFT40Y=2Ll6dwN+(rK6eoulgZ#9nEghO{E2O;`FXmH}BRTTom*y zBXWFM2LA#$@y>tuJ~kK6Ivkq!vi*4}s zFFEg~%%Ujva-!+l?bd9*3L^BPZkrI4&Tlv0mOX3hezJEg4t@^J75m$vrVV)K(jtdHYNBwh_H+OS!#tD|ZnmA%Wx6B^t`e&3?^z$D4^h#A!gd!m=- zX&3Rlcs zDN@LzUO~sCAsB^`$ln$W+rM7l&Mdzhtc7w_Q)xN3aN5YQ<14g?3CSrklzzq{cjhgmcN(5R{XiuZ<*;y zl3kP&du?l8J-;yiZ1%jS)<&vVyS*h8*{2&K{&ji7z|(-W+M({~GqY$EgSfr%F`CiS z=~g2q7Q*}IJ}0rN+M|xR+EWynC5(fJ@4abGPQHmsjxWFE!^H}CiNiqFYHL&a`e)Pmq*fBbzYwb##GSZN6!Ej8!6qY3pmOnlCCLA$o%|Obe-s%2 literal 0 HcmV?d00001 diff --git a/libraries/push/impl/src/nightly/res/raw/message.mp3 b/libraries/push/impl/src/nightly/res/raw/message.mp3 new file mode 100644 index 0000000000000000000000000000000000000000..abc056786c8504a9441ed74e955d9dcfa6bac927 GIT binary patch literal 8685 zcmd^^cQhQ)!}rJTYOAwYHLC^@RwsnjqJ&s1QDgNkM2K$n-b+@CUZa<25nYr>wCITz zL?noiLS!F)&-0%1{_+0({PTYPn7Q}dnYrKj+%q$G&ec+rfB;wUUmcFB_~!Y@g_BIk;-OB%1}zU1{4Gnah0V(*fZD+rfdCArLOdzD%Cs`7u}1^-Wp zt4}9)i<)qrX$JtH9`;EpYXpESUQDaR1L6hpd-@#2{jS~ygil9(l52f-9a!- zbw{O2=8wY~aOvNHSlKQ?)aBin+Y9!0^x{oeiENnv{zVH@y=Rz$uD~Pw$dA3~p}N#wU730r5L928#8?h%T$&`##T_Pq>HYBgvIhRWvl5SvhmZ~3C96aBAEHG~=QogWP;WS6fZhEN3ul5tqwW` z&;kJYgF*KfEABV|C^fCGi&whx4+X$g3imzSivT&EJj)RnkZjj!)me$7-6Xxy&WQ!( zxClZtacYmXJ*nV>n(ds~r=3Y$fx zu{%(pr}l(nWk&zddSo^ize-a`arT*#4uqxgGr3B-sJ(uBoBmwno91i*KyT+vQNMB- z>`HNTb#`V$!uOa5GH zdD1#&P)J}TRWdB$I{Z5%qbgR)b%w4YiqUx6mzgKjN*Zmy*yL^S!%q1X#E242e*BCY z{YF}xLivV@sh2_3fO8vW{E4@QZAGB|uX&}^g&~uJha3lZFT$GcF9N#li8xutCbJ-D zF7)%G%Pv>6wNNjn)%z~P))=voZ7tT@MKPE*&E?%}Q8iIocq@$^E`T<4;5AKts6TtB zF1m}s<6|#RWOb{CrLXX1YYViJFjUpJsj<9iy7Er}fD0AY4y>^d$^J9jH*kPx^2czgUE#>2QCVD(FcXQxz&~s%6EnL z`a96L^q@0X>XY6JAB$^6`0MvD^C4mdzbUFBN0F;pQ%yN7y=<5$_yC1~aea%1PMZ&@ zl`yeS%gvTt!hWbwdG6ZfW4Jb)UH2EY*NR=qSRp7wG z)BBw+Xfdu_AvR)4ngUVP`i*K-SCr5Ra~bvL$4J~wu>uUKGCx2({&k2r_f-q+skD}C zZ~baY*o}}mt=kX$m>z7{th8Z+Z% zx8~*-r`+rI39AR^_o#^AS=@S4B47pGAv8s`SekWE%vA_jpawz_F<~4V{*nR?= zAQvkbf0Sb)6Uo5 zBh_CAuvS!Z@$oez!Qtq#&TyM|Ct0YLfHU0ZZ~8X9${;^-#7Wl|?}LYVFyh!xsFF&< z+NnLQgHJeB?$>D38jS+J7Pa3ym1b)`x7FX@7I{^t!6vmNI`4Wy3m6z|B=h3q9z~|D z*>L>Adg?@ix-|GiKnv=DhU4dnFuH85HH`%6wf2)xLJa_rfk+UWUj%?b5>IPMeQ#UX zlphe`H!2Soy7Es=2L7utxwRaR7O|G6;aFEs`F>3z#X$?z73uPr8PAmTCksInM${)F zAe%s)xSaX=diXkY^(;#x5`qkNNa!eDId#;aJC?MmwuMh0TUUbWgde{m}n&D;nR zj~1=(6DL_)Ek9i&}|YkWVA>UiW(Kj2&mk^K87?}99I_E z0$aC7l8I+<#D)yVq%AWj%f<&9wYQ>z! za!M-nYar~4YT#2u!^Z$ye64Hraaxq??2B@0{br*VVLQ5R%d9!tcXfllUGzM~zp#D# zs8AO|%XqYCbCaLHgJI_S9#Za?LkFbzAlkC~m8sWrtMk8*`C`#eYi3{LWpp`vxxNAb z9SBFXfkS}sWMOpSO{(}~N#z_IH5?w^|KI*0B%U-S56bq078 z6IrEF$H>+-UuvC9A{i%jcF*pWsyd@)9UtbR+sHiy^SaAyx$&axJ|rRPh?{#ST#rc{yn=jTB1Je>WMJP}tWuVZxJISM`K?{jyG0ytPVBF4p9M(2 z<1)=vYI|^g0{{FV_j1k!E`~Z!Ei>s1ZgqU9^8AiN^wS0n6`==8{^K72m+9#4*D)f+ ztf9T^*BO(shw=xt#<=15y^~`0eQ|$I3ApkD?^MO5QOohdS#iaKp{*0mww5nc(Wl-*Vjfb{=~%sK#>0mX&mNFB&PTNu zEp!zNN&tW+78typVMba1QD!$!mNgWo=P?{9{{z8xbeOWpYjyZzdrlC zP!C4@q#tEXo{E&Z>0-QCTX507XszMw(;XXSO1TKm-5-oBGFyvCF=x5&s8y~u%k<+N zU)HBrO?P_sv=6%l#<3$dMS8a4ExyDx_v8!a##XY&rvTk5I_Xq|InkpVpNyXq;|&b_ zOcOT3t+hW}Qc}l{aAY*S4U7Yx<*qBe?~5D}yUVCG?s7Rn&qBT2R-=cLqsfT;^O;ma zvF9Hpd6DErNYo6db7_5KtZhY*{Kn>QuH-DR=BS-oH9lcg@h9h@;m4f$knw7cexf{w zI90q`DLwvS=*tZz^T9^AuJ;u`u$#%Im6$nosY3Q*iejgM2=j z!e@6*uOB{G?;E-Iq!u8q3tPo8CZP}!>`5}24J%7!mgBqE^GNh!Dbp!Lf%g)ps+6P@8b2dJb=IlWVoz|nDV*Jotbr4UoQ6*H#V6wS_C)k3i5|3v) zSYcV5);;>Dm3utC_yIGMPF~`%DlSbnCE|T>y-XNNqoukNc|cKT-6r>SsJr0JyjW@e zS4iUG3_$+{l2%5#Xo>AD)$E}9)L?PVSRv(Vit#0#dm5`tAoDdTI$ziBp;-RC^v z!k~baU#Cssw6)mAhrz1;Z3#JrYkz4@vh(mBZ7>C$Vzw~#j4S`@IIx`j)c!-(zY^i` z!SEf%#Kwi22aV2s)8sWTaa<#2V}fd`_QoTGi(8=tY_ACppl^bh8}K1^m{teE7dPDP z=CM(4If3{HxMv_SRm@zpf=$q4sgj&2OS-f%^rubJ7ixtbN2fCO^Cd)Y;A0~at6c$u z2J-04gf)fUECNQI=S^Y%;HZ#**Z@~{F0NHHaYq^fWDG`1&qrsl>PG()VyO!(8pX^89kbilMPNsIR3(#vf$dgKgR-gGbhi}n$ zH>J=@|8-EmVg5GFaG365!+rJ||wF(63`8Sq`r z0)V*`9ULzuF9449PCuA6>z_i)3U?rF9xW`kwr6O+pDsz(9qf4efu$5h3;c%R;Ig!m z7OAubG;y;dV!-#O%>D)<#O#uqpm<^JfjS=VK>Cav*6Gy-Polb?%S)`hWU<$tt4$Sg znMu3SC}bPEV(@m1>=-=}MXbtDbn2Jb+#I{4+>$NPz3vr`E^bZWX&DL(mrlyPPn_pV z5l2MUDn=weElsm-U(sx9YV`nO^`I#UJz-_p*6r-Pv-|26)3T*Rdm#L0hm-ZJ zmEWZLc^-Q0Umrkfy;2U4&3(3kgsg!zSf*v|f*!sXhGGm5j!;SW36<`Jo?4N}F5_P> zpIhu!B#+B>0T8ofPXL5Z48z@#oFRqnpe0QJZ%q}u`AW^?x=Y6kb>iUV# zaIeBwGe^rYZ~ifBw-?CUGa1`C*{dOozDB1&^XF#zuy-e7bW=oYDM4E68emm}=5Bqx zyL|xB(k73&xh6H-k7sg183l@!rzj(8UPom>+otPW-XXo{&wXp2r@q`;9j=}|c#H+e zmMb&8jKw0NSYF1M!X>A!rKR5-Cq1)N&WhoE6BWtcGd>jNy_aeuzke@tbpKguT!*VK zuZVllq^$J>RZ#UvtRXz3G}|Hg$Emk-OQ69{ZA`;`!bM#W^7n@N0sYJBL#4*tjpkSZ ztX&#NWr0P7s<)i6u{1;WugbKV`1i*~E0$o<1~hbt*9KrquD%aZy?HXyj4-SK5tORPjLBo0zDE!i;2Fj~aC!9zp;bfC?Xd zW0giB98n?Ufe)uuI&R%-_m*8xt%h50FFYOoUQ!Rg?z8Yp=5SM7idlO7PSGZ

q)t zZ98?m7I$5NB$1MTu_RmyysMK6fvNB%!0e z4arpY?6OvfAR{6jrEwr}>3WSn6?g>`uTHuNRARP2KI8e0Vn4$uvthpzd>S&sbNL-% zfP?CtSSr~!mo_HEBVECTvxg7&ce)B2+>k@A=LhCdnvrA*EtAWycGg(C_DesXUq<@& z@5RVCPq?$uC(U7tE!w+0xLty0bO0Z$2&%)`nRfd}@1E6otx!Se+sf&|u*mYB3w(!@ zv0TKo@}U_3vvcvpk%;s`n%!<8*z6gjZr%LbU@wQ(m&9+APTge{NrgnP&N8^oZmjto zb!V`Kgx-x-CsyDNt}9EOA~1a_5D-SxP^)K`LeAfO*`5AAe>t$%4hhTiGvM^!jp>JW zN0wP%{iP(ngFTGHul!Ghf%?H=5^@%#U$9uLz&$g%a)+E zlyQTf0l6no9Q)(@FBWg*UpF;7D3eyiEQWgqyv|>Q{X1FH1cXL?ji*W_V_v!)K@;YljDQ03b>a27+WUTE`j6AkRgKT6zw!jmM6F|RKyralV(1-=wO=ei2p(p9m zb0weJ)Xt@JGXVbkC_p4NBVy)j{1P|dPa-ZTapixT2vjJeWgE?kP#OFZ3>j2?A*>Nm{uFFCICotov6v(dl2{X*M6XT&GixlQGcP8}h{40;5koV|Bz2 znA}FY`P405IlMb;uJXAl3V!g1J+O%aW=_YfXg^e4hPR+kF=+~04+ND_x={GOj!#qb z_}K)}ddn$ai$M==(Z59aVcCyRu|lBybn(Y6AO9TF^^6BqodDsjn#X_WDiRM_iGMq< z$A!Zc`}O7~kU!)i18$btEa$M?NlD_~`}TP@VJQ8;vfy6Ytd5^JK8{COhgYa;yer0#{-aa!4jtE9(Ug4rDXgW`Ef#Hi;YY>o#7N^Ijru#Ls&;dwM_>3IaD z7ZIWa9sQ;rD4K&S2$gL6^HbBYauE?bLgR?SaHJX60y}Dqq_?NWg#dC701%x}u86U6 z(jVgnQEBrMX9!PU`QHqa2vi!G$VH~Qy#BpNq6wl_CS{>^8X$@++%k%wtWw|~udzQ6 zEBrGOTDNB2noG!k>8;(M)qPR&cUksS5YF-}m$qrN$?R4-JDIn+<)pyZN1yf85I`vAK6= zI=bk$BBkw9^X9h^o40wu?FwnZ)=83WX%?Km0yFmnes~O4f9M(>ViWhc_RXWf!$JD1 zjub=Ci(ZLB#mr&RwoY@&IJz9ybAsu!kJVVD3>B!f(%X%`W}mLwR9;%D02(top6F1p zSHm#w>n8kat@CHf{u6yZ`zMt=tCv51Pd2tYE8p2-CmAJ+%P6k9&ebuNxOYB!ubvoU zg|DcSKhtWKtJpWy5gZkOStv_(TFEY;k_AXN`etr_#z}lF`TEI_*1{fLoeiUo zuH%ZRwJNL0=%0MS45#XmTPyAu-~1&Fe*2Gb%{a%fEB~EwvoM7_6V_sghuUQ2q$D6+ z9}ZZBTc2_?mrWE`j=%9-r&fR;ve{n6A_8v;sSFSr^2*zCF`>2h=wUukg#SzUXZGv@ zqd48WJ_!gAQ~0tc+c|)SEwBv7*weTMY5B+|XGhje(qjWd8XDSh&&1c(+KibgKFx!X zshbiC!;;wHDreXb1!PE;-!A;;qp;DCk%@6RPjlDa*Q!4JYbHwPj@9Seza#-bNRyQ> zuxF571vwp>!^(XYFT40Y=2Ll6dwN+(rK6eoulgZ#9nEghO{E2O;`FXmH}BRTTom*y zBXWFM2LA#$@y>tuJ~kK6Ivkq!vi*4}s zFFEg~%%Ujva-!+l?bd9*3L^BPZkrI4&Tlv0mOX3hezJEg4t@^J75m$vrVV)K(jtdHYNBwh_H+OS!#tD|ZnmA%Wx6B^t`e&3?^z$D4^h#A!gd!m=- zX&3Rlcs zDN@LzUO~sCAsB^`$ln$W+rM7l&Mdzhtc7w_Q)xN3aN5YQ<14g?3CSrklzzq{cjhgmcN(5R{XiuZ<*;y zl3kP&du?l8J-;yiZ1%jS)<&vVyS*h8*{2&K{&ji7z|(-W+M({~GqY$EgSfr%F`CiS z=~g2q7Q*}IJ}0rN+M|xR+EWynC5(fJ@4abGPQHmsjxWFE!^H}CiNiqFYHL&a`e)Pmq*fBbzYwb##GSZN6!Ej8!6qY3pmOnlCCLA$o%|Obe-s%2 literal 0 HcmV?d00001 diff --git a/libraries/push/impl/src/main/res/raw/message.mp3 b/libraries/push/impl/src/release/res/raw/message.mp3 similarity index 100% rename from libraries/push/impl/src/main/res/raw/message.mp3 rename to libraries/push/impl/src/release/res/raw/message.mp3 From 7a7a6256763c7d04d14b7ae53d2344bac120b1e9 Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Mon, 3 Nov 2025 22:18:50 +0100 Subject: [PATCH 40/46] Need to provide matchingFallbacks --- libraries/push/impl/build.gradle.kts | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/libraries/push/impl/build.gradle.kts b/libraries/push/impl/build.gradle.kts index b0e32481a4..091c74992f 100644 --- a/libraries/push/impl/build.gradle.kts +++ b/libraries/push/impl/build.gradle.kts @@ -23,7 +23,9 @@ android { } buildTypes { - register("nightly") + register("nightly") { + matchingFallbacks += listOf("release") + } } } From f1ad56bef1fe1b4f5fd16e42b34795eb2edcbdd7 Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Mon, 3 Nov 2025 22:29:38 +0100 Subject: [PATCH 41/46] Move dependencies block out of the android block. --- libraries/compound/build.gradle.kts | 16 ++++---- libraries/cryptography/test/build.gradle.kts | 8 ++-- libraries/dateformatter/api/build.gradle.kts | 8 ++-- libraries/dateformatter/impl/build.gradle.kts | 30 +++++++------- libraries/dateformatter/test/build.gradle.kts | 10 ++--- libraries/designsystem/build.gradle.kts | 40 +++++++++---------- libraries/featureflag/test/build.gradle.kts | 14 +++---- libraries/mediapickers/api/build.gradle.kts | 16 ++++---- libraries/mediapickers/test/build.gradle.kts | 12 +++--- libraries/preferences/test/build.gradle.kts | 16 ++++---- libraries/previewutils/build.gradle.kts | 14 +++---- libraries/ui-utils/build.gradle.kts | 14 +++---- 12 files changed, 99 insertions(+), 99 deletions(-) diff --git a/libraries/compound/build.gradle.kts b/libraries/compound/build.gradle.kts index cbdb09d451..933ef3e495 100644 --- a/libraries/compound/build.gradle.kts +++ b/libraries/compound/build.gradle.kts @@ -18,12 +18,12 @@ android { testOptions { unitTests.isIncludeAndroidResources = true } - - dependencies { - implementation(libs.showkase) - testCommonDependencies(libs) - testImplementation(libs.test.roborazzi) - testImplementation(libs.test.roborazzi.compose) - testImplementation(libs.test.roborazzi.junit) - } +} + +dependencies { + implementation(libs.showkase) + testCommonDependencies(libs) + testImplementation(libs.test.roborazzi) + testImplementation(libs.test.roborazzi.compose) + testImplementation(libs.test.roborazzi.junit) } diff --git a/libraries/cryptography/test/build.gradle.kts b/libraries/cryptography/test/build.gradle.kts index 5564c972f9..e3a110d8fb 100644 --- a/libraries/cryptography/test/build.gradle.kts +++ b/libraries/cryptography/test/build.gradle.kts @@ -11,8 +11,8 @@ plugins { android { namespace = "io.element.android.libraries.cryptography.test" - - dependencies { - api(projects.libraries.cryptography.api) - } +} + +dependencies { + api(projects.libraries.cryptography.api) } diff --git a/libraries/dateformatter/api/build.gradle.kts b/libraries/dateformatter/api/build.gradle.kts index cebb9d4049..99c22515fd 100644 --- a/libraries/dateformatter/api/build.gradle.kts +++ b/libraries/dateformatter/api/build.gradle.kts @@ -13,8 +13,8 @@ plugins { android { namespace = "io.element.android.libraries.dateformatter.api" - - dependencies { - testCommonDependencies(libs) - } +} + +dependencies { + testCommonDependencies(libs) } diff --git a/libraries/dateformatter/impl/build.gradle.kts b/libraries/dateformatter/impl/build.gradle.kts index 72da2f81f6..15c0034f91 100644 --- a/libraries/dateformatter/impl/build.gradle.kts +++ b/libraries/dateformatter/impl/build.gradle.kts @@ -30,19 +30,19 @@ android { ) } } - - dependencies { - implementation(projects.libraries.core) - implementation(projects.libraries.designsystem) - implementation(projects.libraries.di) - implementation(projects.libraries.uiStrings) - implementation(projects.services.toolbox.api) - - api(projects.libraries.dateformatter.api) - api(libs.datetime) - - testCommonDependencies(libs, true) - testImplementation(projects.libraries.dateformatter.test) - testImplementation(projects.services.toolbox.test) - } +} + +dependencies { + implementation(projects.libraries.core) + implementation(projects.libraries.designsystem) + implementation(projects.libraries.di) + implementation(projects.libraries.uiStrings) + implementation(projects.services.toolbox.api) + + api(projects.libraries.dateformatter.api) + api(libs.datetime) + + testCommonDependencies(libs, true) + testImplementation(projects.libraries.dateformatter.test) + testImplementation(projects.services.toolbox.test) } diff --git a/libraries/dateformatter/test/build.gradle.kts b/libraries/dateformatter/test/build.gradle.kts index 6f3877ea80..af8b2a8e19 100644 --- a/libraries/dateformatter/test/build.gradle.kts +++ b/libraries/dateformatter/test/build.gradle.kts @@ -11,9 +11,9 @@ plugins { android { namespace = "io.element.android.libraries.dateformatter.test" - - dependencies { - api(projects.libraries.dateformatter.api) - api(libs.datetime) - } +} + +dependencies { + api(projects.libraries.dateformatter.api) + api(libs.datetime) } diff --git a/libraries/designsystem/build.gradle.kts b/libraries/designsystem/build.gradle.kts index ff0b4878b2..8750b04683 100644 --- a/libraries/designsystem/build.gradle.kts +++ b/libraries/designsystem/build.gradle.kts @@ -25,24 +25,24 @@ android { consumerProguardFiles("consumer-rules.pro") } } - - dependencies { - api(projects.libraries.compound) - - implementation(libs.androidx.compose.material3.windowsizeclass) - implementation(libs.androidx.compose.material3.adaptive) - implementation(libs.coil.compose) - implementation(libs.vanniktech.blurhash) - implementation(projects.libraries.androidutils) - implementation(projects.libraries.architecture) - implementation(projects.libraries.core) - implementation(projects.libraries.preferences.api) - implementation(projects.libraries.testtags) - implementation(projects.libraries.uiStrings) - - ksp(libs.showkase.processor) - implementation(libs.showkase) - - testCommonDependencies(libs) - } +} + +dependencies { + api(projects.libraries.compound) + + implementation(libs.androidx.compose.material3.windowsizeclass) + implementation(libs.androidx.compose.material3.adaptive) + implementation(libs.coil.compose) + implementation(libs.vanniktech.blurhash) + implementation(projects.libraries.androidutils) + implementation(projects.libraries.architecture) + implementation(projects.libraries.core) + implementation(projects.libraries.preferences.api) + implementation(projects.libraries.testtags) + implementation(projects.libraries.uiStrings) + + ksp(libs.showkase.processor) + implementation(libs.showkase) + + testCommonDependencies(libs) } diff --git a/libraries/featureflag/test/build.gradle.kts b/libraries/featureflag/test/build.gradle.kts index e2920a07b7..f2361417a0 100644 --- a/libraries/featureflag/test/build.gradle.kts +++ b/libraries/featureflag/test/build.gradle.kts @@ -11,11 +11,11 @@ plugins { android { namespace = "io.element.android.libraries.featureflag.test" - - dependencies { - api(projects.libraries.featureflag.api) - implementation(projects.libraries.core) - implementation(projects.libraries.matrix.test) - implementation(libs.coroutines.core) - } +} + +dependencies { + api(projects.libraries.featureflag.api) + implementation(projects.libraries.core) + implementation(projects.libraries.matrix.test) + implementation(libs.coroutines.core) } diff --git a/libraries/mediapickers/api/build.gradle.kts b/libraries/mediapickers/api/build.gradle.kts index c130cd7900..aaf9b4cd0c 100644 --- a/libraries/mediapickers/api/build.gradle.kts +++ b/libraries/mediapickers/api/build.gradle.kts @@ -13,12 +13,12 @@ plugins { android { namespace = "io.element.android.libraries.mediapickers.api" - - dependencies { - implementation(projects.libraries.uiStrings) - implementation(projects.libraries.core) - implementation(projects.libraries.di) - - testCommonDependencies(libs) - } +} + +dependencies { + implementation(projects.libraries.uiStrings) + implementation(projects.libraries.core) + implementation(projects.libraries.di) + + testCommonDependencies(libs) } diff --git a/libraries/mediapickers/test/build.gradle.kts b/libraries/mediapickers/test/build.gradle.kts index ee743bb63d..dc37741b02 100644 --- a/libraries/mediapickers/test/build.gradle.kts +++ b/libraries/mediapickers/test/build.gradle.kts @@ -15,10 +15,10 @@ setupDependencyInjection() android { namespace = "io.element.android.libraries.mediapickers.test" - - dependencies { - implementation(projects.libraries.core) - implementation(projects.libraries.di) - api(projects.libraries.mediapickers.api) - } +} + +dependencies { + implementation(projects.libraries.core) + implementation(projects.libraries.di) + api(projects.libraries.mediapickers.api) } diff --git a/libraries/preferences/test/build.gradle.kts b/libraries/preferences/test/build.gradle.kts index 9db4ab1866..44116aac13 100644 --- a/libraries/preferences/test/build.gradle.kts +++ b/libraries/preferences/test/build.gradle.kts @@ -11,12 +11,12 @@ plugins { android { namespace = "io.element.android.libraries.preferences.test" - - dependencies { - api(projects.libraries.preferences.api) - implementation(projects.libraries.matrix.api) - implementation(projects.tests.testutils) - implementation(libs.coroutines.core) - implementation(libs.androidx.datastore.preferences) - } +} + +dependencies { + api(projects.libraries.preferences.api) + implementation(projects.libraries.matrix.api) + implementation(projects.tests.testutils) + implementation(libs.coroutines.core) + implementation(libs.androidx.datastore.preferences) } diff --git a/libraries/previewutils/build.gradle.kts b/libraries/previewutils/build.gradle.kts index 92218e9286..111cb4c830 100644 --- a/libraries/previewutils/build.gradle.kts +++ b/libraries/previewutils/build.gradle.kts @@ -11,11 +11,11 @@ plugins { android { namespace = "io.element.android.libraries.previewutils" - - dependencies { - implementation(projects.libraries.designsystem) - implementation(projects.libraries.matrix.api) - - implementation(libs.kotlinx.collections.immutable) - } +} + +dependencies { + implementation(projects.libraries.designsystem) + implementation(projects.libraries.matrix.api) + + implementation(libs.kotlinx.collections.immutable) } diff --git a/libraries/ui-utils/build.gradle.kts b/libraries/ui-utils/build.gradle.kts index 95ce3d21a1..227bdd7f49 100644 --- a/libraries/ui-utils/build.gradle.kts +++ b/libraries/ui-utils/build.gradle.kts @@ -13,11 +13,11 @@ plugins { android { namespace = "io.element.android.libraries.ui.utils" - - dependencies { - implementation(projects.libraries.androidutils) - implementation(projects.services.toolbox.impl) - - testCommonDependencies(libs) - } +} + +dependencies { + implementation(projects.libraries.androidutils) + implementation(projects.services.toolbox.impl) + + testCommonDependencies(libs) } From 1e517252e156a28ae06df172359e53462ac97cca Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Tue, 4 Nov 2025 08:23:34 +0000 Subject: [PATCH 42/46] fix(deps): update roborazzi to v1.51.0 --- gradle/libs.versions.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 7f07c14167..cbf32ec299 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -33,7 +33,7 @@ accompanist = "0.37.3" # Test test_core = "1.7.0" -roborazzi = "1.50.0" +roborazzi = "1.51.0" # Jetbrain datetime = "0.7.1" From 8d529849e88441ffcd83b7a28d66ea6953f49be8 Mon Sep 17 00:00:00 2001 From: Jorge Martin Espinosa Date: Tue, 4 Nov 2025 11:36:17 +0100 Subject: [PATCH 43/46] Try fixing 'Timeline Event object has already been destroyed' (#5675) This will display a fallback notification. I don't see how the current code could cause it, but I tried to re-structure it a bit so we don't have nested `use` usages and `timestamp` is fetched ahead of time. --- .../libraries/matrix/impl/notification/NotificationMapper.kt | 5 +++-- .../notification/TimelineEventToNotificationContentMapper.kt | 3 ++- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/notification/NotificationMapper.kt b/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/notification/NotificationMapper.kt index bad622e456..7e06eb3c75 100644 --- a/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/notification/NotificationMapper.kt +++ b/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/notification/NotificationMapper.kt @@ -39,6 +39,7 @@ class NotificationMapper( isDirect = item.roomInfo.isDirect, activeMembersCount = item.roomInfo.joinedMembersCount.toInt(), ) + val timestamp = item.timestamp() ?: clock.epochMillis() NotificationData( sessionId = sessionId, eventId = eventId, @@ -53,8 +54,8 @@ class NotificationMapper( isDm = isDm, isEncrypted = item.roomInfo.isEncrypted.orFalse(), isNoisy = item.isNoisy.orFalse(), - timestamp = item.timestamp() ?: clock.epochMillis(), - content = item.event.use { notificationContentMapper.map(it) }.getOrThrow(), + timestamp = timestamp, + content = notificationContentMapper.map(item.event).getOrThrow(), hasMention = item.hasMention.orFalse(), ) } diff --git a/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/notification/TimelineEventToNotificationContentMapper.kt b/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/notification/TimelineEventToNotificationContentMapper.kt index 2ca4a3c823..b2952461df 100644 --- a/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/notification/TimelineEventToNotificationContentMapper.kt +++ b/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/notification/TimelineEventToNotificationContentMapper.kt @@ -25,8 +25,9 @@ class TimelineEventToNotificationContentMapper { fun map(timelineEvent: TimelineEvent): Result { return runCatchingExceptions { timelineEvent.use { + val senderId = UserId(timelineEvent.senderId()) timelineEvent.eventType().use { eventType -> - eventType.toContent(senderId = UserId(timelineEvent.senderId())) + eventType.toContent(senderId = senderId) } } } From 90704208601b5afff4f49a5d66b8b7ffdfd06c5a Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Tue, 4 Nov 2025 15:25:13 +0100 Subject: [PATCH 44/46] Session database: add count query. --- .../android/libraries/sessionstorage/api/SessionStore.kt | 5 +++++ .../sessionstorage/impl/DatabaseSessionStore.kt | 9 +++++++++ .../android/libraries/matrix/session/SessionData.sq | 3 +++ .../sessionstorage/impl/DatabaseSessionStoreTest.kt | 6 ++++++ .../sessionstorage/test/InMemorySessionStore.kt | 4 ++++ 5 files changed, 27 insertions(+) diff --git a/libraries/session-storage/api/src/main/kotlin/io/element/android/libraries/sessionstorage/api/SessionStore.kt b/libraries/session-storage/api/src/main/kotlin/io/element/android/libraries/sessionstorage/api/SessionStore.kt index 7900b4d90d..f3b66d73c0 100644 --- a/libraries/session-storage/api/src/main/kotlin/io/element/android/libraries/sessionstorage/api/SessionStore.kt +++ b/libraries/session-storage/api/src/main/kotlin/io/element/android/libraries/sessionstorage/api/SessionStore.kt @@ -50,6 +50,11 @@ interface SessionStore { */ suspend fun getAllSessions(): List + /** + * Get the number of sessions. + */ + suspend fun numberOfSessions(): Int + /** * Get the latest session, or null if no session exists. */ diff --git a/libraries/session-storage/impl/src/main/kotlin/io/element/android/libraries/sessionstorage/impl/DatabaseSessionStore.kt b/libraries/session-storage/impl/src/main/kotlin/io/element/android/libraries/sessionstorage/impl/DatabaseSessionStore.kt index 0560d3076a..81353f5305 100644 --- a/libraries/session-storage/impl/src/main/kotlin/io/element/android/libraries/sessionstorage/impl/DatabaseSessionStore.kt +++ b/libraries/session-storage/impl/src/main/kotlin/io/element/android/libraries/sessionstorage/impl/DatabaseSessionStore.kt @@ -161,6 +161,15 @@ class DatabaseSessionStore( } } + override suspend fun numberOfSessions(): Int { + return sessionDataMutex.withLock { + database.sessionDataQueries.count() + .executeAsOneOrNull() + ?.toInt() + ?: 0 + } + } + override fun sessionsFlow(): Flow> { return database.sessionDataQueries.selectAll() .asFlow() diff --git a/libraries/session-storage/impl/src/main/sqldelight/io/element/android/libraries/matrix/session/SessionData.sq b/libraries/session-storage/impl/src/main/sqldelight/io/element/android/libraries/matrix/session/SessionData.sq index 53d07bfba3..b61c746fb8 100644 --- a/libraries/session-storage/impl/src/main/sqldelight/io/element/android/libraries/matrix/session/SessionData.sq +++ b/libraries/session-storage/impl/src/main/sqldelight/io/element/android/libraries/matrix/session/SessionData.sq @@ -47,6 +47,9 @@ SELECT * FROM SessionData ORDER BY lastUsageIndex DESC LIMIT 1; selectAll: SELECT * FROM SessionData ORDER BY lastUsageIndex DESC; +count: +SELECT count(*) FROM SessionData; + selectByUserId: SELECT * FROM SessionData WHERE userId = ?; diff --git a/libraries/session-storage/impl/src/test/kotlin/io/element/android/libraries/sessionstorage/impl/DatabaseSessionStoreTest.kt b/libraries/session-storage/impl/src/test/kotlin/io/element/android/libraries/sessionstorage/impl/DatabaseSessionStoreTest.kt index d1fef8a39a..f28d9e21df 100644 --- a/libraries/session-storage/impl/src/test/kotlin/io/element/android/libraries/sessionstorage/impl/DatabaseSessionStoreTest.kt +++ b/libraries/session-storage/impl/src/test/kotlin/io/element/android/libraries/sessionstorage/impl/DatabaseSessionStoreTest.kt @@ -52,6 +52,7 @@ class DatabaseSessionStoreTest { assertThat(database.sessionDataQueries.selectLatest().executeAsOneOrNull()).isEqualTo(aSessionData) assertThat(database.sessionDataQueries.selectAll().executeAsList().size).isEqualTo(1) + assertThat(database.sessionDataQueries.count().executeAsOneOrNull()).isEqualTo(1) } @Test @@ -109,6 +110,7 @@ class DatabaseSessionStoreTest { assertThat(foundSession).isEqualTo(aSessionData) assertThat(database.sessionDataQueries.selectAll().executeAsList().size).isEqualTo(2) + assertThat(database.sessionDataQueries.count().executeAsOneOrNull()).isEqualTo(2) } @Test @@ -196,12 +198,16 @@ class DatabaseSessionStoreTest { position = 1, lastUsageIndex = 1, ) + assertThat(database.sessionDataQueries.count().executeAsOneOrNull()).isEqualTo(1) databaseSessionStore.addSession(secondSessionData.toApiModel()) assertThat(awaitItem().size).isEqualTo(2) + assertThat(database.sessionDataQueries.count().executeAsOneOrNull()).isEqualTo(2) databaseSessionStore.removeSession(aSessionData.userId) assertThat(awaitItem().size).isEqualTo(1) + assertThat(database.sessionDataQueries.count().executeAsOneOrNull()).isEqualTo(1) databaseSessionStore.removeSession(secondSessionData.userId) assertThat(awaitItem()).isEmpty() + assertThat(database.sessionDataQueries.count().executeAsOneOrNull()).isEqualTo(0) } } diff --git a/libraries/session-storage/test/src/main/kotlin/io/element/android/libraries/sessionstorage/test/InMemorySessionStore.kt b/libraries/session-storage/test/src/main/kotlin/io/element/android/libraries/sessionstorage/test/InMemorySessionStore.kt index c8f3078e7a..00dd9ad9c0 100644 --- a/libraries/session-storage/test/src/main/kotlin/io/element/android/libraries/sessionstorage/test/InMemorySessionStore.kt +++ b/libraries/session-storage/test/src/main/kotlin/io/element/android/libraries/sessionstorage/test/InMemorySessionStore.kt @@ -67,6 +67,10 @@ class InMemorySessionStore( return sessionDataListFlow.value } + override suspend fun numberOfSessions(): Int { + return sessionDataListFlow.value.size + } + override suspend fun getLatestSession(): SessionData? { return sessionDataListFlow.value.firstOrNull() } From 0367ae610cfede75081de620802bd66736d844b8 Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Tue, 4 Nov 2025 15:30:29 +0100 Subject: [PATCH 45/46] Session database: use the new count API. --- .../src/main/kotlin/io/element/android/appnav/RootFlowNode.kt | 4 ++-- .../login/impl/screens/onboarding/OnBoardingPresenter.kt | 2 +- .../features/rageshake/impl/reporter/DefaultBugReporter.kt | 2 +- .../android/features/signedout/impl/SignedOutPresenterTest.kt | 2 ++ 4 files changed, 6 insertions(+), 4 deletions(-) diff --git a/appnav/src/main/kotlin/io/element/android/appnav/RootFlowNode.kt b/appnav/src/main/kotlin/io/element/android/appnav/RootFlowNode.kt index bdad3c2ab0..0332f34306 100644 --- a/appnav/src/main/kotlin/io/element/android/appnav/RootFlowNode.kt +++ b/appnav/src/main/kotlin/io/element/android/appnav/RootFlowNode.kt @@ -349,7 +349,7 @@ class RootFlowNode( } else { // wait for the current session to be restored val loggedInFlowNode = attachSession(latestSessionId) - if (sessionStore.getAllSessions().size > 1) { + if (sessionStore.numberOfSessions() > 1) { // Several accounts, let the user choose which one to use backstack.push( NavTarget.AccountSelect( @@ -379,7 +379,7 @@ class RootFlowNode( is PermalinkData.FallbackLink -> Unit is PermalinkData.RoomEmailInviteLink -> Unit else -> { - if (sessionStore.getAllSessions().size > 1) { + if (sessionStore.numberOfSessions() > 1) { // Several accounts, let the user choose which one to use backstack.push( NavTarget.AccountSelect( diff --git a/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/screens/onboarding/OnBoardingPresenter.kt b/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/screens/onboarding/OnBoardingPresenter.kt index e7e20aa70d..44d8095fa3 100644 --- a/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/screens/onboarding/OnBoardingPresenter.kt +++ b/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/screens/onboarding/OnBoardingPresenter.kt @@ -90,7 +90,7 @@ class OnBoardingPresenter( } val isAddingAccount by produceState(initialValue = false) { // We are adding an account if there is at least one session already stored - value = sessionStore.getAllSessions().isNotEmpty() + value = sessionStore.numberOfSessions() > 0 } val loginMode by loginHelper.collectLoginMode() diff --git a/features/rageshake/impl/src/main/kotlin/io/element/android/features/rageshake/impl/reporter/DefaultBugReporter.kt b/features/rageshake/impl/src/main/kotlin/io/element/android/features/rageshake/impl/reporter/DefaultBugReporter.kt index 89bec00ac5..7f173a8fe1 100755 --- a/features/rageshake/impl/src/main/kotlin/io/element/android/features/rageshake/impl/reporter/DefaultBugReporter.kt +++ b/features/rageshake/impl/src/main/kotlin/io/element/android/features/rageshake/impl/reporter/DefaultBugReporter.kt @@ -165,7 +165,7 @@ class DefaultBugReporter( } } val sessionData = sessionStore.getLatestSession() - val numberOfAccounts = sessionStore.getAllSessions().size + val numberOfAccounts = sessionStore.numberOfSessions() val deviceId = sessionData?.deviceId ?: "undefined" val userId = sessionData?.userId?.let { UserId(it) } // build the multi part request diff --git a/features/signedout/impl/src/test/kotlin/io/element/android/features/signedout/impl/SignedOutPresenterTest.kt b/features/signedout/impl/src/test/kotlin/io/element/android/features/signedout/impl/SignedOutPresenterTest.kt index e53c0af112..d5a9a910a0 100644 --- a/features/signedout/impl/src/test/kotlin/io/element/android/features/signedout/impl/SignedOutPresenterTest.kt +++ b/features/signedout/impl/src/test/kotlin/io/element/android/features/signedout/impl/SignedOutPresenterTest.kt @@ -58,9 +58,11 @@ class SignedOutPresenterTest { val initialState = awaitItem() assertThat(initialState.signedOutSession).isEqualTo(aSessionData) assertThat(sessionStore.getAllSessions()).isNotEmpty() + assertThat(sessionStore.numberOfSessions()).isEqualTo(1) initialState.eventSink(SignedOutEvents.SignInAgain) assertThat(awaitItem().signedOutSession).isNull() assertThat(sessionStore.getAllSessions()).isEmpty() + assertThat(sessionStore.numberOfSessions()).isEqualTo(0) } } } From 015b497d5afd04e9460138f346a54fb51a7d48bf Mon Sep 17 00:00:00 2001 From: Jorge Martin Espinosa Date: Tue, 4 Nov 2025 15:43:00 +0100 Subject: [PATCH 46/46] Use the SDK Client to check whether a homeserver is compatible (#5664) * Use the SDK `Client` to check whether a HS is compatible * Remove usage of unused `WellKnown`, keep `ElementWellKnown` * Make `HomeServerLoginCompatibilityChecker.check` return `true/false` values to distinguish non-valid homeservers from a failed check * Use `inMemoryStore` and `serverNameOrHomeserverUrl` * Do some cleanup of `isValid` and `isWellknownValid` * Make the debounce for starting the search a bit higher, as checking for the homeservers seems more resource-intensive now --- .../impl/accountprovider/AccountProvider.kt | 1 - .../AccountProviderProvider.kt | 4 +- .../login/impl/resolver/HomeserverData.kt | 2 - .../login/impl/resolver/HomeserverResolver.kt | 42 ++---- .../ChangeAccountProviderPresenter.kt | 1 - .../ChooseAccountProviderPresenter.kt | 1 - .../SearchAccountProviderPresenter.kt | 4 +- .../SearchAccountProviderStateProvider.kt | 12 +- .../SearchAccountProviderView.kt | 1 - .../AccountProviderDataSourceTest.kt | 4 - .../ChangeAccountProviderPresenterTest.kt | 4 - .../ChooseAccountProviderPresenterTest.kt | 2 - .../SearchAccountProviderPresenterTest.kt | 111 ++++++-------- .../HomeServerLoginCompatibilityChecker.kt | 19 +++ ...RustHomeServerLoginCompatibilityChecker.kt | 36 +++++ ...HomeserverLoginCompatibilityCheckerTest.kt | 54 +++++++ .../fakes/FakeFfiHomeserverLoginDetails.kt | 6 +- ...FakeHomeServerLoginCompatibilityChecker.kt | 18 +++ .../api/SessionWellknownRetriever.kt | 1 - .../libraries/wellknown/api/WellKnown.kt | 17 --- .../wellknown/api/WellknownRetriever.kt | 1 - .../impl/DefaultSessionWellknownRetriever.kt | 12 -- .../impl/DefaultWellknownRetriever.kt | 22 --- .../libraries/wellknown/impl/Mapper.kt | 11 -- .../DefaultSessionWellknownRetrieverTest.kt | 138 ------------------ .../test/FakeSessionWellknownRetriever.kt | 6 - .../wellknown/test/FakeWellknownRetriever.kt | 6 - 27 files changed, 195 insertions(+), 341 deletions(-) create mode 100644 libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/auth/HomeServerLoginCompatibilityChecker.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/test/kotlin/io/element/android/libraries/matrix/impl/auth/RustHomeserverLoginCompatibilityCheckerTest.kt create mode 100644 libraries/matrix/test/src/main/kotlin/io/element/android/libraries/matrix/test/auth/FakeHomeServerLoginCompatibilityChecker.kt delete mode 100644 libraries/wellknown/api/src/main/kotlin/io/element/android/libraries/wellknown/api/WellKnown.kt diff --git a/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/accountprovider/AccountProvider.kt b/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/accountprovider/AccountProvider.kt index 0fcef6bedf..2d9c2d2e9c 100644 --- a/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/accountprovider/AccountProvider.kt +++ b/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/accountprovider/AccountProvider.kt @@ -13,5 +13,4 @@ data class AccountProvider( val subtitle: String? = null, val isPublic: Boolean = false, val isMatrixOrg: Boolean = false, - val isValid: Boolean = false, ) diff --git a/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/accountprovider/AccountProviderProvider.kt b/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/accountprovider/AccountProviderProvider.kt index a5f0fd7d3b..886f0efb82 100644 --- a/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/accountprovider/AccountProviderProvider.kt +++ b/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/accountprovider/AccountProviderProvider.kt @@ -15,7 +15,7 @@ open class AccountProviderProvider : PreviewParameterProvider { get() = sequenceOf( anAccountProvider(), anAccountProvider().copy(subtitle = null), - anAccountProvider().copy(subtitle = null, title = "invalid", isValid = false), + anAccountProvider().copy(subtitle = null, title = "invalid"), anAccountProvider().copy(subtitle = null, title = "Other", isPublic = false, isMatrixOrg = false), // Add other state here ) @@ -26,11 +26,9 @@ fun anAccountProvider( subtitle: String? = "Matrix.org is an open network for secure, decentralized communication.", isPublic: Boolean = true, isMatrixOrg: Boolean = true, - isValid: Boolean = true, ) = AccountProvider( url = url, subtitle = subtitle, isPublic = isPublic, isMatrixOrg = isMatrixOrg, - isValid = isValid, ) diff --git a/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/resolver/HomeserverData.kt b/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/resolver/HomeserverData.kt index 0b4b088938..1e219a8a3b 100644 --- a/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/resolver/HomeserverData.kt +++ b/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/resolver/HomeserverData.kt @@ -10,6 +10,4 @@ package io.element.android.features.login.impl.resolver data class HomeserverData( // The computed homeserver url, for which a wellknown file has been retrieved, or just a valid Url val homeserverUrl: String, - // True if a wellknown file has been found and is valid. If false, it means that the [homeserverUrl] is valid - val isWellknownValid: Boolean, ) diff --git a/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/resolver/HomeserverResolver.kt b/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/resolver/HomeserverResolver.kt index 7b6f3e4102..c43839517c 100644 --- a/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/resolver/HomeserverResolver.kt +++ b/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/resolver/HomeserverResolver.kt @@ -8,19 +8,16 @@ package io.element.android.features.login.impl.resolver import dev.zacsweers.metro.Inject -import io.element.android.libraries.core.bool.orFalse import io.element.android.libraries.core.coroutine.CoroutineDispatchers import io.element.android.libraries.core.coroutine.parallelMap -import io.element.android.libraries.core.data.tryOrNull import io.element.android.libraries.core.uri.ensureProtocol import io.element.android.libraries.core.uri.isValidUrl -import io.element.android.libraries.wellknown.api.WellKnown -import io.element.android.libraries.wellknown.api.WellknownRetriever +import io.element.android.libraries.matrix.api.auth.HomeServerLoginCompatibilityChecker import kotlinx.coroutines.currentCoroutineContext import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.flow import kotlinx.coroutines.withContext -import kotlinx.coroutines.withTimeout +import timber.log.Timber import java.util.Collections /** @@ -29,7 +26,7 @@ import java.util.Collections @Inject class HomeserverResolver( private val dispatchers: CoroutineDispatchers, - private val wellknownRetriever: WellknownRetriever, + private val homeServerLoginCompatibilityChecker: HomeServerLoginCompatibilityChecker, ) { fun resolve(userInput: String): Flow> = flow { val flowContext = currentCoroutineContext() @@ -41,20 +38,14 @@ class HomeserverResolver( // Run all the requests in parallel withContext(dispatchers.io) { list.parallelMap { url -> - val wellKnown = tryOrNull { - withTimeout(5000) { - wellknownRetriever.getWellKnown(url) - } - } - val isValid = wellKnown?.dataOrNull()?.isValid().orFalse() + val isValid = homeServerLoginCompatibilityChecker.check(url) + .onFailure { Timber.w(it, "Failed to check compatibility with homeserver $url") } + .getOrNull() + ?: return@parallelMap + + // Emit the list as soon as possible if (isValid) { - // Emit the list as soon as possible - currentList.add( - HomeserverData( - homeserverUrl = url, - isWellknownValid = true, - ) - ) + currentList.add(HomeserverData(homeserverUrl = url)) withContext(flowContext) { emit(currentList.toList()) } @@ -63,14 +54,7 @@ class HomeserverResolver( } // If list is empty, and the user has entered an URL, do not block the user. if (currentList.isEmpty() && trimmedUserInput.isValidUrl()) { - emit( - listOf( - HomeserverData( - homeserverUrl = trimmedUserInput, - isWellknownValid = false, - ) - ) - ) + emit(listOf(HomeserverData(homeserverUrl = trimmedUserInput))) } } @@ -88,7 +72,3 @@ class HomeserverResolver( } } } - -private fun WellKnown.isValid(): Boolean { - return homeServer?.baseURL?.isNotBlank().orFalse() -} diff --git a/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/screens/changeaccountprovider/ChangeAccountProviderPresenter.kt b/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/screens/changeaccountprovider/ChangeAccountProviderPresenter.kt index 8e6a3ef0ba..940889728e 100644 --- a/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/screens/changeaccountprovider/ChangeAccountProviderPresenter.kt +++ b/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/screens/changeaccountprovider/ChangeAccountProviderPresenter.kt @@ -37,7 +37,6 @@ class ChangeAccountProviderPresenter( subtitle = null, isPublic = url == AuthenticationConfig.MATRIX_ORG_URL, isMatrixOrg = url == AuthenticationConfig.MATRIX_ORG_URL, - isValid = true, ) } .toImmutableList() diff --git a/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/screens/chooseaccountprovider/ChooseAccountProviderPresenter.kt b/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/screens/chooseaccountprovider/ChooseAccountProviderPresenter.kt index 73f03ba7c8..0c915959cb 100644 --- a/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/screens/chooseaccountprovider/ChooseAccountProviderPresenter.kt +++ b/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/screens/chooseaccountprovider/ChooseAccountProviderPresenter.kt @@ -67,7 +67,6 @@ class ChooseAccountProviderPresenter( subtitle = null, isPublic = url == AuthenticationConfig.MATRIX_ORG_URL, isMatrixOrg = url == AuthenticationConfig.MATRIX_ORG_URL, - isValid = true, ) } .toImmutableList() diff --git a/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/screens/searchaccountprovider/SearchAccountProviderPresenter.kt b/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/screens/searchaccountprovider/SearchAccountProviderPresenter.kt index 0aa06ca632..657a21111c 100644 --- a/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/screens/searchaccountprovider/SearchAccountProviderPresenter.kt +++ b/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/screens/searchaccountprovider/SearchAccountProviderPresenter.kt @@ -57,14 +57,14 @@ class SearchAccountProviderPresenter( userInput = userInput, userInputResult = data.value, changeServerState = changeServerState, - eventSink = ::handleEvents + eventSink = ::handleEvents, ) } private fun CoroutineScope.onUserInput(userInput: String, data: MutableState>>) = launch { data.value = AsyncData.Uninitialized // Debounce - delay(300) + delay(500) data.value = AsyncData.Loading() homeserverResolver.resolve(userInput).collect { data.value = AsyncData.Success(it) diff --git a/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/screens/searchaccountprovider/SearchAccountProviderStateProvider.kt b/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/screens/searchaccountprovider/SearchAccountProviderStateProvider.kt index fb0e0f5c5a..3dd7a3d8c5 100644 --- a/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/screens/searchaccountprovider/SearchAccountProviderStateProvider.kt +++ b/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/screens/searchaccountprovider/SearchAccountProviderStateProvider.kt @@ -34,18 +34,14 @@ fun aSearchAccountProviderState( fun aHomeserverDataList(): List { return listOf( - aHomeserverData(isWellknownValid = true), - aHomeserverData(homeserverUrl = "https://no.sliding.sync", isWellknownValid = true), - aHomeserverData(homeserverUrl = "https://invalid", isWellknownValid = false), + aHomeserverData(homeserverUrl = AuthenticationConfig.MATRIX_ORG_URL), + aHomeserverData(homeserverUrl = "https://no.sliding.sync"), + aHomeserverData(homeserverUrl = "https://invalid"), ) } fun aHomeserverData( homeserverUrl: String = AuthenticationConfig.MATRIX_ORG_URL, - isWellknownValid: Boolean = true, ): HomeserverData { - return HomeserverData( - homeserverUrl = homeserverUrl, - isWellknownValid = isWellknownValid, - ) + return HomeserverData(homeserverUrl = homeserverUrl,) } diff --git a/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/screens/searchaccountprovider/SearchAccountProviderView.kt b/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/screens/searchaccountprovider/SearchAccountProviderView.kt index 13bfd9e38e..2b289aa4c1 100644 --- a/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/screens/searchaccountprovider/SearchAccountProviderView.kt +++ b/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/screens/searchaccountprovider/SearchAccountProviderView.kt @@ -192,7 +192,6 @@ private fun HomeserverData.toAccountProvider(): AccountProvider { // There is no need to know for other servers right now isPublic = isMatrixOrg, isMatrixOrg = isMatrixOrg, - isValid = isWellknownValid, ) } diff --git a/features/login/impl/src/test/kotlin/io/element/android/features/login/impl/accountprovider/AccountProviderDataSourceTest.kt b/features/login/impl/src/test/kotlin/io/element/android/features/login/impl/accountprovider/AccountProviderDataSourceTest.kt index 3d84a1da41..8a8f6864cf 100644 --- a/features/login/impl/src/test/kotlin/io/element/android/features/login/impl/accountprovider/AccountProviderDataSourceTest.kt +++ b/features/login/impl/src/test/kotlin/io/element/android/features/login/impl/accountprovider/AccountProviderDataSourceTest.kt @@ -33,7 +33,6 @@ class AccountProviderDataSourceTest { subtitle = null, isPublic = true, isMatrixOrg = true, - isValid = false, ) ) } @@ -55,7 +54,6 @@ class AccountProviderDataSourceTest { subtitle = null, isPublic = true, isMatrixOrg = true, - isValid = false, ) ) } @@ -77,7 +75,6 @@ class AccountProviderDataSourceTest { subtitle = null, isPublic = true, isMatrixOrg = true, - isValid = false, ) ) } @@ -98,7 +95,6 @@ class AccountProviderDataSourceTest { subtitle = null, isPublic = false, isMatrixOrg = false, - isValid = false, ) ) sut.reset() diff --git a/features/login/impl/src/test/kotlin/io/element/android/features/login/impl/screens/changeaccountprovider/ChangeAccountProviderPresenterTest.kt b/features/login/impl/src/test/kotlin/io/element/android/features/login/impl/screens/changeaccountprovider/ChangeAccountProviderPresenterTest.kt index 89abc6ddef..f2e933390b 100644 --- a/features/login/impl/src/test/kotlin/io/element/android/features/login/impl/screens/changeaccountprovider/ChangeAccountProviderPresenterTest.kt +++ b/features/login/impl/src/test/kotlin/io/element/android/features/login/impl/screens/changeaccountprovider/ChangeAccountProviderPresenterTest.kt @@ -46,7 +46,6 @@ class ChangeAccountProviderPresenterTest { subtitle = null, isPublic = true, isMatrixOrg = true, - isValid = true, ) ) ) @@ -76,7 +75,6 @@ class ChangeAccountProviderPresenterTest { subtitle = null, isPublic = true, isMatrixOrg = true, - isValid = true, ), AccountProvider( url = "https://element.io", @@ -84,7 +82,6 @@ class ChangeAccountProviderPresenterTest { subtitle = null, isPublic = false, isMatrixOrg = false, - isValid = true, ) ) ) @@ -114,7 +111,6 @@ class ChangeAccountProviderPresenterTest { subtitle = null, isPublic = true, isMatrixOrg = true, - isValid = true, ) ) ) diff --git a/features/login/impl/src/test/kotlin/io/element/android/features/login/impl/screens/chooseaccountprovider/ChooseAccountProviderPresenterTest.kt b/features/login/impl/src/test/kotlin/io/element/android/features/login/impl/screens/chooseaccountprovider/ChooseAccountProviderPresenterTest.kt index 5bad8a3638..2e13b0e555 100644 --- a/features/login/impl/src/test/kotlin/io/element/android/features/login/impl/screens/chooseaccountprovider/ChooseAccountProviderPresenterTest.kt +++ b/features/login/impl/src/test/kotlin/io/element/android/features/login/impl/screens/chooseaccountprovider/ChooseAccountProviderPresenterTest.kt @@ -37,14 +37,12 @@ class ChooseAccountProviderPresenterTest { subtitle = null, isPublic = false, isMatrixOrg = false, - isValid = true, ) val accountProvider2 = AccountProvider( url = ACCOUNT_PROVIDER_FROM_CONFIG_2.ensureProtocol(), subtitle = null, isPublic = false, isMatrixOrg = false, - isValid = true, ) } diff --git a/features/login/impl/src/test/kotlin/io/element/android/features/login/impl/screens/searchaccountprovider/SearchAccountProviderPresenterTest.kt b/features/login/impl/src/test/kotlin/io/element/android/features/login/impl/screens/searchaccountprovider/SearchAccountProviderPresenterTest.kt index 79cd3c954a..67453119c7 100644 --- a/features/login/impl/src/test/kotlin/io/element/android/features/login/impl/screens/searchaccountprovider/SearchAccountProviderPresenterTest.kt +++ b/features/login/impl/src/test/kotlin/io/element/android/features/login/impl/screens/searchaccountprovider/SearchAccountProviderPresenterTest.kt @@ -13,12 +13,8 @@ import app.cash.turbine.test import com.google.common.truth.Truth.assertThat import io.element.android.features.login.impl.changeserver.aChangeServerState import io.element.android.features.login.impl.resolver.HomeserverResolver -import io.element.android.features.wellknown.test.FakeWellknownRetriever import io.element.android.libraries.architecture.AsyncData -import io.element.android.libraries.matrix.test.A_HOMESERVER_URL -import io.element.android.libraries.wellknown.api.WellKnown -import io.element.android.libraries.wellknown.api.WellKnownBaseConfig -import io.element.android.libraries.wellknown.api.WellknownRetrieverResult +import io.element.android.libraries.matrix.test.auth.FakeHomeServerLoginCompatibilityChecker import io.element.android.tests.testutils.WarmUpRule import io.element.android.tests.testutils.lambda.lambdaRecorder import io.element.android.tests.testutils.lambda.value @@ -33,9 +29,9 @@ class SearchAccountProviderPresenterTest { @Test fun `present - initial state`() = runTest { - val fakeWellknownRetriever = FakeWellknownRetriever() + val fakeLoginCompatibilityChecker = FakeHomeServerLoginCompatibilityChecker(checkResult = { Result.success(true) }) val presenter = SearchAccountProviderPresenter( - homeserverResolver = HomeserverResolver(testCoroutineDispatchers(), fakeWellknownRetriever), + homeserverResolver = HomeserverResolver(testCoroutineDispatchers(), fakeLoginCompatibilityChecker), changeServerPresenter = { aChangeServerState() } ) moleculeFlow(RecompositionMode.Immediate) { @@ -47,9 +43,35 @@ class SearchAccountProviderPresenterTest { } } + @Test + fun `present - error while checking login compatibility`() = runTest { + val fakeLoginCompatibilityChecker = FakeHomeServerLoginCompatibilityChecker(checkResult = { Result.failure(IllegalStateException("Oops")) }) + val presenter = SearchAccountProviderPresenter( + homeserverResolver = HomeserverResolver(testCoroutineDispatchers(), fakeLoginCompatibilityChecker), + changeServerPresenter = { aChangeServerState() } + ) + moleculeFlow(RecompositionMode.Immediate) { + presenter.present() + }.test { + val initialState = awaitItem() + initialState.eventSink.invoke(SearchAccountProviderEvents.UserInput("https://test.org")) + val withInputState = awaitItem() + assertThat(withInputState.userInput).isEqualTo("https://test.org") + assertThat(initialState.userInputResult).isEqualTo(AsyncData.Uninitialized) + assertThat(awaitItem().userInputResult).isInstanceOf(AsyncData.Loading::class.java) + assertThat(awaitItem().userInputResult).isEqualTo( + AsyncData.Success( + listOf( + aHomeserverData(homeserverUrl = "https://test.org") + ) + ) + ) + } + } + @Test fun `present - enter text no result`() = runTest { - val fakeWellknownRetriever = FakeWellknownRetriever() + val fakeWellknownRetriever = FakeHomeServerLoginCompatibilityChecker(checkResult = { Result.success(false) }) val presenter = SearchAccountProviderPresenter( homeserverResolver = HomeserverResolver(testCoroutineDispatchers(), fakeWellknownRetriever), changeServerPresenter = { aChangeServerState() } @@ -67,48 +89,20 @@ class SearchAccountProviderPresenterTest { } } - @Test - fun `present - enter valid url no wellknown`() = runTest { - val fakeWellknownRetriever = FakeWellknownRetriever() - val presenter = SearchAccountProviderPresenter( - homeserverResolver = HomeserverResolver(testCoroutineDispatchers(), fakeWellknownRetriever), - changeServerPresenter = { aChangeServerState() } - ) - moleculeFlow(RecompositionMode.Immediate) { - presenter.present() - }.test { - val initialState = awaitItem() - initialState.eventSink.invoke(SearchAccountProviderEvents.UserInput("https://test.org")) - val withInputState = awaitItem() - assertThat(withInputState.userInput).isEqualTo("https://test.org") - assertThat(initialState.userInputResult).isEqualTo(AsyncData.Uninitialized) - assertThat(awaitItem().userInputResult).isInstanceOf(AsyncData.Loading::class.java) - assertThat(awaitItem().userInputResult).isEqualTo( - AsyncData.Success( - listOf( - aHomeserverData(homeserverUrl = "https://test.org", isWellknownValid = false) - ) - ) - ) - } - } - @Test fun `present - enter text one result with wellknown`() = runTest { - val getWellKnownResult = lambdaRecorder> { + val checkResult = lambdaRecorder> { when (it) { - "https://test.org" -> WellknownRetrieverResult.NotFound - "https://test.com" -> WellknownRetrieverResult.NotFound - "https://test.io" -> WellknownRetrieverResult.Success(aWellKnown()) - "https://test" -> WellknownRetrieverResult.NotFound + "https://test.org" -> Result.success(false) + "https://test.com" -> Result.success(false) + "https://test.io" -> Result.success(true) + "https://test" -> Result.success(false) else -> error("should not happen") } } - val fakeWellknownRetriever = FakeWellknownRetriever( - getWellKnownResult = getWellKnownResult, - ) + val fakeLoginCompatibilityChecker = FakeHomeServerLoginCompatibilityChecker(checkResult = checkResult) val presenter = SearchAccountProviderPresenter( - homeserverResolver = HomeserverResolver(testCoroutineDispatchers(), fakeWellknownRetriever), + homeserverResolver = HomeserverResolver(testCoroutineDispatchers(), fakeLoginCompatibilityChecker), changeServerPresenter = { aChangeServerState() } ) moleculeFlow(RecompositionMode.Immediate) { @@ -127,7 +121,7 @@ class SearchAccountProviderPresenterTest { ) ) ) - getWellKnownResult.assertions().isCalledExactly(4) + checkResult.assertions().isCalledExactly(4) .withSequence( listOf(value("https://test.org")), listOf(value("https://test.com")), @@ -139,20 +133,18 @@ class SearchAccountProviderPresenterTest { @Test fun `present - enter text two results with wellknown`() = runTest { - val getWellKnownResult = lambdaRecorder> { + val checkResult = lambdaRecorder> { when (it) { - "https://test.org" -> WellknownRetrieverResult.Success(aWellKnown()) - "https://test.com" -> WellknownRetrieverResult.NotFound - "https://test.io" -> WellknownRetrieverResult.Success(aWellKnown()) - "https://test" -> WellknownRetrieverResult.NotFound + "https://test.org" -> Result.success(true) + "https://test.com" -> Result.success(false) + "https://test.io" -> Result.success(true) + "https://test" -> Result.success(false) else -> error("should not happen") } } - val fakeWellknownRetriever = FakeWellknownRetriever( - getWellKnownResult = getWellKnownResult, - ) + val fakeLoginCompatibilityChecker = FakeHomeServerLoginCompatibilityChecker(checkResult = checkResult) val presenter = SearchAccountProviderPresenter( - homeserverResolver = HomeserverResolver(testCoroutineDispatchers(), fakeWellknownRetriever), + homeserverResolver = HomeserverResolver(testCoroutineDispatchers(), fakeLoginCompatibilityChecker), changeServerPresenter = { aChangeServerState() } ) moleculeFlow(RecompositionMode.Immediate) { @@ -179,7 +171,7 @@ class SearchAccountProviderPresenterTest { ) ) ) - getWellKnownResult.assertions().isCalledExactly(4) + checkResult.assertions().isCalledExactly(4) .withSequence( listOf(value("https://test.org")), listOf(value("https://test.com")), @@ -188,15 +180,4 @@ class SearchAccountProviderPresenterTest { ) } } - - private fun aWellKnown(): WellKnown { - return WellKnown( - homeServer = WellKnownBaseConfig( - baseURL = A_HOMESERVER_URL - ), - identityServer = WellKnownBaseConfig( - baseURL = A_HOMESERVER_URL - ), - ) - } } diff --git a/libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/auth/HomeServerLoginCompatibilityChecker.kt b/libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/auth/HomeServerLoginCompatibilityChecker.kt new file mode 100644 index 0000000000..aec1665455 --- /dev/null +++ b/libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/auth/HomeServerLoginCompatibilityChecker.kt @@ -0,0 +1,19 @@ +/* + * Copyright 2025 New Vector Ltd. + * + * SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial + * Please see LICENSE files in the repository root for full details. + */ + +package io.element.android.libraries.matrix.api.auth + +/** + * Checks the homeserver's compatibility with Element X. + */ +interface HomeServerLoginCompatibilityChecker { + /** + * Performs the compatibility check given the homeserver's [url]. + * @return a `true` value if the homeserver is compatible, `false` if not, or a failure result if the check unexpectedly failed. + */ + suspend fun check(url: String): Result +} diff --git a/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/auth/RustHomeServerLoginCompatibilityChecker.kt b/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/auth/RustHomeServerLoginCompatibilityChecker.kt new file mode 100644 index 0000000000..8cfaca077b --- /dev/null +++ b/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/auth/RustHomeServerLoginCompatibilityChecker.kt @@ -0,0 +1,36 @@ +/* + * Copyright 2025 New Vector Ltd. + * + * SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial + * Please see LICENSE files in the repository root for full details. + */ + +package io.element.android.libraries.matrix.impl.auth + +import dev.zacsweers.metro.AppScope +import dev.zacsweers.metro.ContributesBinding +import dev.zacsweers.metro.Inject +import io.element.android.libraries.core.extensions.runCatchingExceptions +import io.element.android.libraries.matrix.api.auth.HomeServerLoginCompatibilityChecker +import io.element.android.libraries.matrix.impl.ClientBuilderProvider +import timber.log.Timber + +@ContributesBinding(AppScope::class) +@Inject +class RustHomeServerLoginCompatibilityChecker( + private val clientBuilderProvider: ClientBuilderProvider, +) : HomeServerLoginCompatibilityChecker { + override suspend fun check(url: String): Result = runCatchingExceptions { + clientBuilderProvider.provide() + .inMemoryStore() + .serverNameOrHomeserverUrl(url) + .build() + .use { + it.homeserverLoginDetails() + } + .use { + Timber.d("Homeserver $url | OIDC: ${it.supportsOidcLogin()} | Password: ${it.supportsPasswordLogin()} | SSO: ${it.supportsSsoLogin()}") + it.supportsOidcLogin() || it.supportsPasswordLogin() + } + } +} diff --git a/libraries/matrix/impl/src/test/kotlin/io/element/android/libraries/matrix/impl/auth/RustHomeserverLoginCompatibilityCheckerTest.kt b/libraries/matrix/impl/src/test/kotlin/io/element/android/libraries/matrix/impl/auth/RustHomeserverLoginCompatibilityCheckerTest.kt new file mode 100644 index 0000000000..4557d47f5b --- /dev/null +++ b/libraries/matrix/impl/src/test/kotlin/io/element/android/libraries/matrix/impl/auth/RustHomeserverLoginCompatibilityCheckerTest.kt @@ -0,0 +1,54 @@ +/* + * Copyright 2025 New Vector Ltd. + * + * SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial + * Please see LICENSE files in the repository root for full details. + */ + +package io.element.android.libraries.matrix.impl.auth + +import com.google.common.truth.Truth.assertThat +import io.element.android.libraries.matrix.impl.FakeClientBuilderProvider +import io.element.android.libraries.matrix.impl.fixtures.fakes.FakeFfiClient +import io.element.android.libraries.matrix.impl.fixtures.fakes.FakeFfiClientBuilder +import io.element.android.libraries.matrix.impl.fixtures.fakes.FakeFfiHomeserverLoginDetails +import kotlinx.coroutines.test.runTest +import org.junit.Ignore +import org.junit.Test + +@Ignore("JNA direct mapping has broken unit tests with FFI fakes") +class RustHomeserverLoginCompatibilityCheckerTest { + @Test + fun `check - is valid if it supports OIDC login`() = runTest { + val sut = createChecker { FakeFfiHomeserverLoginDetails(supportsOidcLogin = true) } + assertThat(sut.check("https://matrix.host.org").getOrNull()).isTrue() + } + + @Test + fun `check - is valid if it supports password login`() = runTest { + val sut = createChecker { FakeFfiHomeserverLoginDetails(supportsPasswordLogin = true) } + assertThat(sut.check("https://matrix.host.org").getOrNull()).isTrue() + } + + @Test + fun `check - is not valid if it only supports SSO login`() = runTest { + val sut = createChecker { FakeFfiHomeserverLoginDetails(supportsSsoLogin = true) } + assertThat(sut.check("https://matrix.host.org").getOrNull()).isFalse() + } + + @Test + fun `check - is not valid if fetching the data fails`() = runTest { + val sut = createChecker { error("Unexpected error!") } + assertThat(sut.check("https://matrix.host.org").isFailure).isTrue() + } + + private fun createChecker( + result: () -> FakeFfiHomeserverLoginDetails, + ) = RustHomeServerLoginCompatibilityChecker( + clientBuilderProvider = FakeClientBuilderProvider { + FakeFfiClientBuilder { + FakeFfiClient(homeserverLoginDetailsResult = result) + } + } + ) +} diff --git a/libraries/matrix/impl/src/test/kotlin/io/element/android/libraries/matrix/impl/fixtures/fakes/FakeFfiHomeserverLoginDetails.kt b/libraries/matrix/impl/src/test/kotlin/io/element/android/libraries/matrix/impl/fixtures/fakes/FakeFfiHomeserverLoginDetails.kt index 85328a2d4d..7951309bcd 100644 --- a/libraries/matrix/impl/src/test/kotlin/io/element/android/libraries/matrix/impl/fixtures/fakes/FakeFfiHomeserverLoginDetails.kt +++ b/libraries/matrix/impl/src/test/kotlin/io/element/android/libraries/matrix/impl/fixtures/fakes/FakeFfiHomeserverLoginDetails.kt @@ -12,10 +12,12 @@ import org.matrix.rustcomponents.sdk.NoHandle class FakeFfiHomeserverLoginDetails( private val url: String = "https://example.org", - private val supportsPasswordLogin: Boolean = true, - private val supportsOidcLogin: Boolean = false + private val supportsPasswordLogin: Boolean = false, + private val supportsOidcLogin: Boolean = false, + private val supportsSsoLogin: Boolean = false, ) : HomeserverLoginDetails(NoHandle) { override fun url(): String = url override fun supportsOidcLogin(): Boolean = supportsOidcLogin override fun supportsPasswordLogin(): Boolean = supportsPasswordLogin + override fun supportsSsoLogin(): Boolean = supportsSsoLogin } diff --git a/libraries/matrix/test/src/main/kotlin/io/element/android/libraries/matrix/test/auth/FakeHomeServerLoginCompatibilityChecker.kt b/libraries/matrix/test/src/main/kotlin/io/element/android/libraries/matrix/test/auth/FakeHomeServerLoginCompatibilityChecker.kt new file mode 100644 index 0000000000..934784b684 --- /dev/null +++ b/libraries/matrix/test/src/main/kotlin/io/element/android/libraries/matrix/test/auth/FakeHomeServerLoginCompatibilityChecker.kt @@ -0,0 +1,18 @@ +/* + * Copyright 2025 New Vector Ltd. + * + * SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial + * Please see LICENSE files in the repository root for full details. + */ + +package io.element.android.libraries.matrix.test.auth + +import io.element.android.libraries.matrix.api.auth.HomeServerLoginCompatibilityChecker + +class FakeHomeServerLoginCompatibilityChecker( + private val checkResult: (String) -> Result, +) : HomeServerLoginCompatibilityChecker { + override suspend fun check(url: String): Result { + return checkResult(url) + } +} diff --git a/libraries/wellknown/api/src/main/kotlin/io/element/android/libraries/wellknown/api/SessionWellknownRetriever.kt b/libraries/wellknown/api/src/main/kotlin/io/element/android/libraries/wellknown/api/SessionWellknownRetriever.kt index 1c5570db94..2a986fcc28 100644 --- a/libraries/wellknown/api/src/main/kotlin/io/element/android/libraries/wellknown/api/SessionWellknownRetriever.kt +++ b/libraries/wellknown/api/src/main/kotlin/io/element/android/libraries/wellknown/api/SessionWellknownRetriever.kt @@ -8,6 +8,5 @@ package io.element.android.libraries.wellknown.api interface SessionWellknownRetriever { - suspend fun getWellKnown(): WellknownRetrieverResult suspend fun getElementWellKnown(): WellknownRetrieverResult } diff --git a/libraries/wellknown/api/src/main/kotlin/io/element/android/libraries/wellknown/api/WellKnown.kt b/libraries/wellknown/api/src/main/kotlin/io/element/android/libraries/wellknown/api/WellKnown.kt deleted file mode 100644 index 59f63d1655..0000000000 --- a/libraries/wellknown/api/src/main/kotlin/io/element/android/libraries/wellknown/api/WellKnown.kt +++ /dev/null @@ -1,17 +0,0 @@ -/* - * Copyright 2023, 2024 New Vector Ltd. - * - * SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial - * Please see LICENSE files in the repository root for full details. - */ - -package io.element.android.libraries.wellknown.api - -data class WellKnown( - val homeServer: WellKnownBaseConfig?, - val identityServer: WellKnownBaseConfig?, -) - -data class WellKnownBaseConfig( - val baseURL: String? -) diff --git a/libraries/wellknown/api/src/main/kotlin/io/element/android/libraries/wellknown/api/WellknownRetriever.kt b/libraries/wellknown/api/src/main/kotlin/io/element/android/libraries/wellknown/api/WellknownRetriever.kt index 4675a0cb18..5c146fbbad 100644 --- a/libraries/wellknown/api/src/main/kotlin/io/element/android/libraries/wellknown/api/WellknownRetriever.kt +++ b/libraries/wellknown/api/src/main/kotlin/io/element/android/libraries/wellknown/api/WellknownRetriever.kt @@ -8,6 +8,5 @@ package io.element.android.libraries.wellknown.api interface WellknownRetriever { - suspend fun getWellKnown(baseUrl: String): WellknownRetrieverResult suspend fun getElementWellKnown(baseUrl: String): WellknownRetrieverResult } diff --git a/libraries/wellknown/impl/src/main/kotlin/io/element/android/libraries/wellknown/impl/DefaultSessionWellknownRetriever.kt b/libraries/wellknown/impl/src/main/kotlin/io/element/android/libraries/wellknown/impl/DefaultSessionWellknownRetriever.kt index ad463bd2d2..a4b394a427 100644 --- a/libraries/wellknown/impl/src/main/kotlin/io/element/android/libraries/wellknown/impl/DefaultSessionWellknownRetriever.kt +++ b/libraries/wellknown/impl/src/main/kotlin/io/element/android/libraries/wellknown/impl/DefaultSessionWellknownRetriever.kt @@ -15,7 +15,6 @@ import io.element.android.libraries.matrix.api.MatrixClient import io.element.android.libraries.matrix.api.exception.ClientException import io.element.android.libraries.wellknown.api.ElementWellKnown import io.element.android.libraries.wellknown.api.SessionWellknownRetriever -import io.element.android.libraries.wellknown.api.WellKnown import io.element.android.libraries.wellknown.api.WellknownRetrieverResult import timber.log.Timber @@ -26,17 +25,6 @@ class DefaultSessionWellknownRetriever( ) : SessionWellknownRetriever { private val domain by lazy { matrixClient.userIdServerName() } - override suspend fun getWellKnown(): WellknownRetrieverResult { - val url = "https://$domain/.well-known/matrix/client" - return matrixClient - .getUrl(url) - .mapCatchingExceptions { - val data = String(it) - json().decodeFromString(data).map() - } - .toWellknownRetrieverResult() - } - override suspend fun getElementWellKnown(): WellknownRetrieverResult { val url = "https://$domain/.well-known/element/element.json" return matrixClient diff --git a/libraries/wellknown/impl/src/main/kotlin/io/element/android/libraries/wellknown/impl/DefaultWellknownRetriever.kt b/libraries/wellknown/impl/src/main/kotlin/io/element/android/libraries/wellknown/impl/DefaultWellknownRetriever.kt index a6014f773c..1312436654 100644 --- a/libraries/wellknown/impl/src/main/kotlin/io/element/android/libraries/wellknown/impl/DefaultWellknownRetriever.kt +++ b/libraries/wellknown/impl/src/main/kotlin/io/element/android/libraries/wellknown/impl/DefaultWellknownRetriever.kt @@ -13,7 +13,6 @@ import io.element.android.libraries.core.extensions.runCatchingExceptions import io.element.android.libraries.core.uri.ensureProtocol import io.element.android.libraries.network.RetrofitFactory import io.element.android.libraries.wellknown.api.ElementWellKnown -import io.element.android.libraries.wellknown.api.WellKnown import io.element.android.libraries.wellknown.api.WellknownRetriever import io.element.android.libraries.wellknown.api.WellknownRetrieverResult import retrofit2.HttpException @@ -24,27 +23,6 @@ import java.net.HttpURLConnection class DefaultWellknownRetriever( private val retrofitFactory: RetrofitFactory, ) : WellknownRetriever { - override suspend fun getWellKnown(baseUrl: String): WellknownRetrieverResult { - return buildWellknownApi(baseUrl) - .map { wellknownApi -> - try { - val result = wellknownApi.getWellKnown().map() - WellknownRetrieverResult.Success(result) - } catch (e: Exception) { - Timber.e(e, "Failed to retrieve well-known data for $baseUrl") - if ((e as? HttpException)?.code() == HttpURLConnection.HTTP_NOT_FOUND) { - WellknownRetrieverResult.NotFound - } else { - WellknownRetrieverResult.Error(e) - } - } - } - .fold( - onSuccess = { it }, - onFailure = { WellknownRetrieverResult.Error(it as Exception) } - ) - } - override suspend fun getElementWellKnown(baseUrl: String): WellknownRetrieverResult { return buildWellknownApi(baseUrl) .map { wellknownApi -> diff --git a/libraries/wellknown/impl/src/main/kotlin/io/element/android/libraries/wellknown/impl/Mapper.kt b/libraries/wellknown/impl/src/main/kotlin/io/element/android/libraries/wellknown/impl/Mapper.kt index 169757caa9..3b705e09c8 100644 --- a/libraries/wellknown/impl/src/main/kotlin/io/element/android/libraries/wellknown/impl/Mapper.kt +++ b/libraries/wellknown/impl/src/main/kotlin/io/element/android/libraries/wellknown/impl/Mapper.kt @@ -8,8 +8,6 @@ package io.element.android.libraries.wellknown.impl import io.element.android.libraries.wellknown.api.ElementWellKnown -import io.element.android.libraries.wellknown.api.WellKnown -import io.element.android.libraries.wellknown.api.WellKnownBaseConfig internal fun InternalElementWellKnown.map() = ElementWellKnown( registrationHelperUrl = registrationHelperUrl, @@ -17,12 +15,3 @@ internal fun InternalElementWellKnown.map() = ElementWellKnown( rageshakeUrl = rageshakeUrl, brandColor = brandColor, ) - -internal fun InternalWellKnown.map() = WellKnown( - homeServer = homeServer?.map(), - identityServer = identityServer?.map(), -) - -internal fun InternalWellKnownBaseConfig.map() = WellKnownBaseConfig( - baseURL = baseURL, -) diff --git a/libraries/wellknown/impl/src/test/kotlin/io/element/android/libraries/wellknown/impl/DefaultSessionWellknownRetrieverTest.kt b/libraries/wellknown/impl/src/test/kotlin/io/element/android/libraries/wellknown/impl/DefaultSessionWellknownRetrieverTest.kt index 12b961ff9e..63dca38aac 100644 --- a/libraries/wellknown/impl/src/test/kotlin/io/element/android/libraries/wellknown/impl/DefaultSessionWellknownRetrieverTest.kt +++ b/libraries/wellknown/impl/src/test/kotlin/io/element/android/libraries/wellknown/impl/DefaultSessionWellknownRetrieverTest.kt @@ -12,8 +12,6 @@ import io.element.android.libraries.androidutils.json.DefaultJsonProvider import io.element.android.libraries.matrix.test.AN_EXCEPTION import io.element.android.libraries.matrix.test.FakeMatrixClient import io.element.android.libraries.wellknown.api.ElementWellKnown -import io.element.android.libraries.wellknown.api.WellKnown -import io.element.android.libraries.wellknown.api.WellKnownBaseConfig import io.element.android.libraries.wellknown.api.WellknownRetrieverResult import io.element.android.tests.testutils.lambda.lambdaRecorder import io.element.android.tests.testutils.lambda.value @@ -21,142 +19,6 @@ import kotlinx.coroutines.test.runTest import org.junit.Test class DefaultSessionWellknownRetrieverTest { - @Test - fun `get empty wellknown`() = runTest { - val getUrlLambda = lambdaRecorder> { - Result.success("{}".toByteArray()) - } - val sut = createDefaultSessionWellknownRetriever( - getUrlLambda = getUrlLambda, - ) - assertThat(sut.getWellKnown()).isEqualTo( - WellknownRetrieverResult.Success( - WellKnown( - homeServer = null, - identityServer = null, - ) - ) - ) - getUrlLambda.assertions().isCalledOnce() - .with(value("https://user.domain.org/.well-known/matrix/client")) - } - - @Test - fun `get wellknown with full content`() = runTest { - val sut = createDefaultSessionWellknownRetriever( - getUrlLambda = { - Result.success( - """{ - "m.homeserver": { - "base_url": "https://example.org" - }, - "m.identity_server": { - "base_url": "https://identity.example.org" - } - }""".trimIndent().toByteArray() - ) - } - ) - assertThat(sut.getWellKnown()).isEqualTo( - WellknownRetrieverResult.Success( - WellKnown( - homeServer = WellKnownBaseConfig( - baseURL = "https://example.org", - ), - identityServer = WellKnownBaseConfig( - baseURL = "https://identity.example.org", - ), - ) - ) - ) - } - - @Test - fun `get wellknown with full content empty base_url`() = runTest { - val sut = createDefaultSessionWellknownRetriever( - getUrlLambda = { - Result.success( - """{ - "m.homeserver": { - "base_url": "https://example.org" - }, - "m.identity_server": {} - }""".trimIndent().toByteArray() - ) - } - ) - assertThat(sut.getWellKnown()).isEqualTo( - WellknownRetrieverResult.Success( - WellKnown( - homeServer = WellKnownBaseConfig( - baseURL = "https://example.org", - ), - identityServer = WellKnownBaseConfig( - baseURL = null, - ), - ) - ) - ) - } - - @Test - fun `get wellknown with unknown key`() = runTest { - val sut = createDefaultSessionWellknownRetriever( - getUrlLambda = { - Result.success( - """{ - "m.homeserver": { - "base_url": "https://example.org" - }, - "m.identity_server": { - "base_url": "https://identity.example.org" - }, - "other": true - }""".trimIndent().toByteArray() - ) - }, - ) - assertThat(sut.getWellKnown()).isEqualTo( - WellknownRetrieverResult.Success( - WellKnown( - homeServer = WellKnownBaseConfig( - baseURL = "https://example.org", - ), - identityServer = WellKnownBaseConfig( - baseURL = "https://identity.example.org", - ), - ) - ) - ) - } - - @Test - fun `get wellknown json error`() = runTest { - val sut = createDefaultSessionWellknownRetriever( - getUrlLambda = { - Result.success( - """{ - "m.homeserver": { - "base_url": "https://example.org" - }, - error - }""".trimIndent().toByteArray() - ) - } - ) - assertThat(sut.getWellKnown()).isInstanceOf(WellknownRetrieverResult.Error::class.java) - } - - @Test - fun `get wellknown network error`() = runTest { - val sut = createDefaultSessionWellknownRetriever( - getUrlLambda = { - Result.failure(AN_EXCEPTION) - } - ) - assertThat(sut.getWellKnown()).isInstanceOf(WellknownRetrieverResult.Error::class.java) - } - @Test fun `get empty element wellknown`() = runTest { val getUrlLambda = lambdaRecorder> { diff --git a/libraries/wellknown/test/src/main/kotlin/io/element/android/features/wellknown/test/FakeSessionWellknownRetriever.kt b/libraries/wellknown/test/src/main/kotlin/io/element/android/features/wellknown/test/FakeSessionWellknownRetriever.kt index d90a02ac96..5ab66701be 100644 --- a/libraries/wellknown/test/src/main/kotlin/io/element/android/features/wellknown/test/FakeSessionWellknownRetriever.kt +++ b/libraries/wellknown/test/src/main/kotlin/io/element/android/features/wellknown/test/FakeSessionWellknownRetriever.kt @@ -9,18 +9,12 @@ package io.element.android.features.wellknown.test import io.element.android.libraries.wellknown.api.ElementWellKnown import io.element.android.libraries.wellknown.api.SessionWellknownRetriever -import io.element.android.libraries.wellknown.api.WellKnown import io.element.android.libraries.wellknown.api.WellknownRetrieverResult import io.element.android.tests.testutils.simulateLongTask class FakeSessionWellknownRetriever( - private val getWellKnownResult: () -> WellknownRetrieverResult = { WellknownRetrieverResult.NotFound }, private val getElementWellKnownResult: () -> WellknownRetrieverResult = { WellknownRetrieverResult.NotFound }, ) : SessionWellknownRetriever { - override suspend fun getWellKnown(): WellknownRetrieverResult = simulateLongTask { - getWellKnownResult() - } - override suspend fun getElementWellKnown(): WellknownRetrieverResult = simulateLongTask { getElementWellKnownResult() } diff --git a/libraries/wellknown/test/src/main/kotlin/io/element/android/features/wellknown/test/FakeWellknownRetriever.kt b/libraries/wellknown/test/src/main/kotlin/io/element/android/features/wellknown/test/FakeWellknownRetriever.kt index 52bb1cfa4c..4c4a31a572 100644 --- a/libraries/wellknown/test/src/main/kotlin/io/element/android/features/wellknown/test/FakeWellknownRetriever.kt +++ b/libraries/wellknown/test/src/main/kotlin/io/element/android/features/wellknown/test/FakeWellknownRetriever.kt @@ -8,19 +8,13 @@ package io.element.android.features.wellknown.test import io.element.android.libraries.wellknown.api.ElementWellKnown -import io.element.android.libraries.wellknown.api.WellKnown import io.element.android.libraries.wellknown.api.WellknownRetriever import io.element.android.libraries.wellknown.api.WellknownRetrieverResult import io.element.android.tests.testutils.simulateLongTask class FakeWellknownRetriever( - private val getWellKnownResult: (String) -> WellknownRetrieverResult = { WellknownRetrieverResult.NotFound }, private val getElementWellKnownResult: (String) -> WellknownRetrieverResult = { WellknownRetrieverResult.NotFound }, ) : WellknownRetriever { - override suspend fun getWellKnown(baseUrl: String): WellknownRetrieverResult = simulateLongTask { - getWellKnownResult(baseUrl) - } - override suspend fun getElementWellKnown(baseUrl: String): WellknownRetrieverResult = simulateLongTask { getElementWellKnownResult(baseUrl) }