From 34eb596c1a9c006939e756cc2b5e79023ba3c953 Mon Sep 17 00:00:00 2001 From: Stefan Ceriu Date: Tue, 20 Aug 2024 16:13:27 +0300 Subject: [PATCH] Introduce a new RoomProxyType and treat rooms differently based on their membership state --- ElementX.xcodeproj/project.pbxproj | 20 +- .../Sources/Application/AppCoordinator.swift | 13 +- .../RoomFlowCoordinator.swift | 26 +- ...omRolesAndPermissionsFlowCoordinator.swift | 4 +- .../UserSessionFlowCoordinator.swift | 4 +- ElementX/Sources/Mocks/ClientProxyMock.swift | 2 +- .../Mocks/Generated/GeneratedMocks.swift | 6189 +++++++++-------- .../Mocks/Generated/SDKGeneratedMocks.swift | 76 + ...xyMock.swift => JoinedRoomProxyMock.swift} | 17 +- .../Screens/CallScreen/View/CallScreen.swift | 2 +- .../HomeScreen/HomeScreenViewModel.swift | 66 +- .../InviteUsersScreenModels.swift | 2 +- .../JoinRoomScreenViewModel.swift | 35 +- .../MediaUploadPreviewScreenCoordinator.swift | 2 +- .../MediaUploadPreviewScreenViewModel.swift | 4 +- .../View/MediaUploadPreviewScreen.swift | 2 +- .../MessageForwardingScreenViewModel.swift | 2 +- ...innedEventsTimelineScreenCoordinator.swift | 2 +- .../View/PinnedEventsTimelineScreen.swift | 2 +- .../ReportContentScreenCoordinator.swift | 2 +- .../ReportContentScreenViewModel.swift | 4 +- .../View/ReportContentScreen.swift | 2 +- ...omChangePermissionsScreenCoordinator.swift | 2 +- ...RoomChangePermissionsScreenViewModel.swift | 4 +- .../View/RoomChangePermissionsScreen.swift | 2 +- .../RoomChangeRolesScreenCoordinator.swift | 2 +- .../RoomChangeRolesScreenViewModel.swift | 4 +- .../View/RoomChangeRolesScreen.swift | 2 +- .../RoomDetailsEditScreenCoordinator.swift | 2 +- .../RoomDetailsEditScreenViewModel.swift | 4 +- .../View/RoomDetailsEditScreen.swift | 12 +- .../RoomDetailsScreenCoordinator.swift | 2 +- .../RoomDetailsScreenViewModel.swift | 4 +- .../View/RoomDetailsScreen.swift | 52 +- .../RoomMemberDetailsScreenCoordinator.swift | 2 +- .../RoomMemberDetailsScreenViewModel.swift | 4 +- .../View/RoomMemberDetailsScreen.swift | 2 +- .../RoomMembersListScreenCoordinator.swift | 2 +- .../RoomMembersListScreenViewModel.swift | 4 +- .../RoomMembersListManageMemberSheet.swift | 2 +- .../View/RoomMembersListScreen.swift | 8 +- .../RoomMembersListScreenMemberCell.swift | 4 +- ...otificationSettingsScreenCoordinator.swift | 2 +- ...mNotificationSettingsScreenViewModel.swift | 4 +- ...otificationSettingsCustomSectionView.swift | 4 +- .../View/RoomNotificationSettingsScreen.swift | 4 +- ...otificationSettingsUserDefinedScreen.swift | 4 +- .../View/RoomPollsHistoryScreen.swift | 4 +- ...RolesAndPermissionsScreenCoordinator.swift | 2 +- ...omRolesAndPermissionsScreenViewModel.swift | 4 +- .../View/RoomRolesAndPermissionsScreen.swift | 2 +- .../CompletionSuggestionService.swift | 4 +- .../RoomScreen/RoomScreenCoordinator.swift | 2 +- .../RoomScreen/RoomScreenViewModel.swift | 6 +- .../Screens/RoomScreen/View/RoomScreen.swift | 6 +- ...icationSettingsEditScreenCoordinator.swift | 2 +- ...ificationSettingsEditScreenViewModel.swift | 2 +- .../Timeline/TimelineInteractionHandler.swift | 4 +- .../Screens/Timeline/TimelineViewModel.swift | 6 +- .../ReadReceiptsSummaryView.swift | 2 +- .../TimelineReadReceiptsView.swift | 2 +- .../HighlightedTimelineItemModifier.swift | 2 +- .../Screens/Timeline/View/TimelineView.swift | 4 +- .../Sources/Services/Client/ClientProxy.swift | 87 +- .../Services/Client/ClientProxyProtocol.swift | 2 +- .../ComposerDraft/ComposerDraftService.swift | 4 +- .../ElementCallConfiguration.swift | 4 +- .../ElementCall/ElementCallService.swift | 2 +- .../Polls/PollInteractionHandler.swift | 4 +- .../Services/Room/InvitedRoomProxy.swift | 111 + ...{RoomProxy.swift => JoinedRoomProxy.swift} | 83 +- .../Services/Room/RoomProxyProtocol.swift | 62 +- .../MockRoomTimelineController.swift | 2 +- .../RoomTimelineController.swift | 4 +- .../RoomTimelineControllerFactory.swift | 4 +- ...oomTimelineControllerFactoryProtocol.swift | 4 +- .../VoiceMessage/VoiceMessageRecorder.swift | 2 +- .../VoiceMessageRecorderProtocol.swift | 2 +- .../UITests/UITestsAppCoordinator.swift | 34 +- .../CompletionSuggestionServiceTests.swift | 6 +- .../Sources/HomeScreenViewModelTests.swift | 10 +- .../Sources/InviteUsersViewModelTests.swift | 2 +- ...essageForwardingScreenViewModelTests.swift | 2 +- UnitTests/Sources/PillContextTests.swift | 6 +- .../Sources/ReportContentViewModelTests.swift | 4 +- ...hangePermissionsScreenViewModelTests.swift | 4 +- .../RoomChangeRolesScreenViewModelTests.swift | 4 +- .../RoomDetailsEditScreenViewModelTests.swift | 4 +- .../Sources/RoomDetailsViewModelTests.swift | 40 +- .../Sources/RoomFlowCoordinatorTests.swift | 4 +- .../RoomMemberDetailsViewModelTests.swift | 4 +- .../RoomMembersListScreenViewModelTests.swift | 4 +- ...ficationSettingsScreenViewModelTests.swift | 10 +- ...esAndPermissionsScreenViewModelTests.swift | 4 +- .../Sources/RoomScreenViewModelTests.swift | 8 +- .../Sources/TimelineViewModelTests.swift | 20 +- .../Sources/VoiceMessageRecorderTests.swift | 12 +- 97 files changed, 3755 insertions(+), 3474 deletions(-) rename ElementX/Sources/Mocks/{RoomProxyMock.swift => JoinedRoomProxyMock.swift} (96%) create mode 100644 ElementX/Sources/Services/Room/InvitedRoomProxy.swift rename ElementX/Sources/Services/Room/{RoomProxy.swift => JoinedRoomProxy.swift} (96%) diff --git a/ElementX.xcodeproj/project.pbxproj b/ElementX.xcodeproj/project.pbxproj index 7492aaf17..b58403f00 100644 --- a/ElementX.xcodeproj/project.pbxproj +++ b/ElementX.xcodeproj/project.pbxproj @@ -169,6 +169,7 @@ 256D76972BA3254F7CB7F88B /* LocationAnnotation.swift in Sources */ = {isa = PBXBuildFile; fileRef = AAD8234D0E9C9B12BF9F240B /* LocationAnnotation.swift */; }; 25C4C1100B6EA79F5CC7CBB5 /* AppLockSetupPINScreenViewModelTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 989D7380D9C86B3A10D30B13 /* AppLockSetupPINScreenViewModelTests.swift */; }; 260FFC1475EE94F641C3F3F9 /* PollFormScreenViewModelProtocol.swift in Sources */ = {isa = PBXBuildFile; fileRef = A40F1985065500F0E7F61A27 /* PollFormScreenViewModelProtocol.swift */; }; + 261261778DEFAEFC042B875E /* JoinedRoomProxy.swift in Sources */ = {isa = PBXBuildFile; fileRef = 07C6B0B087FE6601C3F77816 /* JoinedRoomProxy.swift */; }; 2689D22EF1D10D22B0A4DAEA /* NotificationContentBuilder.swift in Sources */ = {isa = PBXBuildFile; fileRef = D7BB243B26D54EF1A0C422C0 /* NotificationContentBuilder.swift */; }; 273AB64B9A26B61C51858867 /* AsyncSequence.swift in Sources */ = {isa = PBXBuildFile; fileRef = A73A07BAEDD74C48795A996A /* AsyncSequence.swift */; }; 274CE3C986841D15FD530BF5 /* ShimmerModifier.swift in Sources */ = {isa = PBXBuildFile; fileRef = 97CE98208321C4D66E363612 /* ShimmerModifier.swift */; }; @@ -352,7 +353,6 @@ 4EAC427267424192964B16B3 /* AppSettingsHook.swift in Sources */ = {isa = PBXBuildFile; fileRef = 13BE9781699FB510E9263192 /* AppSettingsHook.swift */; }; 4F2DF6138E87A4B8C2488CA3 /* VoiceMessageCacheProtocol.swift in Sources */ = {isa = PBXBuildFile; fileRef = 43A84EE187D0C772E18A4E39 /* VoiceMessageCacheProtocol.swift */; }; 4FC085B1E5D1EB804495E2F4 /* MockMediaProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4FD6E621CC5E6D4830D96D2D /* MockMediaProvider.swift */; }; - 4FC1EFE4968A259CBBACFAFB /* RoomProxy.swift in Sources */ = {isa = PBXBuildFile; fileRef = A65F140F9FE5E8D4DAEFF354 /* RoomProxy.swift */; }; 4FDC8A9764CFDA90CE035725 /* Duration.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7FB2253D36E81E045E1CB432 /* Duration.swift */; }; 4FE688FE9375B2FBF424146A /* TextBasedRoomTimelineViewProtocol.swift in Sources */ = {isa = PBXBuildFile; fileRef = A6EA0D8B0BBD8805F7D5A133 /* TextBasedRoomTimelineViewProtocol.swift */; }; 4FF90E2242DBD596E1ED2E27 /* AppCoordinatorStateMachine.swift in Sources */ = {isa = PBXBuildFile; fileRef = 077D7C3BE199B6E5DDEC07EC /* AppCoordinatorStateMachine.swift */; }; @@ -552,6 +552,7 @@ 7C384A8E54A4B60A14CDE8E5 /* WaitlistScreenCoordinator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 12F1E7F9C2BE8BB751037826 /* WaitlistScreenCoordinator.swift */; }; 7C6376192F578E0BA801BFEC /* AnalyticsSettingsScreenModels.swift in Sources */ = {isa = PBXBuildFile; fileRef = 42C64A14EE89928207E3B42B /* AnalyticsSettingsScreenModels.swift */; }; 7CD16990BA843BE9ED639129 /* ImageRoomTimelineItem.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3DFE4453AB0B34C203447162 /* ImageRoomTimelineItem.swift */; }; + 7D249465ED00988EEEC14E05 /* JoinedRoomProxyMock.swift in Sources */ = {isa = PBXBuildFile; fileRef = 867DC9530C42F7B5176BE465 /* JoinedRoomProxyMock.swift */; }; 7D261B5119E78CC8E771CA15 /* GlobalSearchScreenCoordinator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 74653BE903970C0E36867D46 /* GlobalSearchScreenCoordinator.swift */; }; 7D58B4F46CAA9A7C3E4C6A30 /* UserDetailsEditScreen.swift in Sources */ = {isa = PBXBuildFile; fileRef = 88410BD213FDF9B28E8B671F /* UserDetailsEditScreen.swift */; }; 7D6DC832DE7A3DE874E2E9BC /* SnapshotTesting in Frameworks */ = {isa = PBXBuildFile; productRef = 7B6BC3219ADD8AA0311D2B86 /* SnapshotTesting */; }; @@ -610,6 +611,7 @@ 89658A44C9FC19B58FD1C226 /* ServerConfirmationScreenViewModelTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = F08776C48FFB47CACF64ED10 /* ServerConfirmationScreenViewModelTests.swift */; }; 899359A4D1147601F6C4E364 /* PillConstants.swift in Sources */ = {isa = PBXBuildFile; fileRef = CB8D34E94AB07128DB73D6C7 /* PillConstants.swift */; }; 899793EFC63DF93C3E0141E7 /* RoomMemberDetailsScreenCoordinator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0FA60F848D1C14F873F9621A /* RoomMemberDetailsScreenCoordinator.swift */; }; + 89B909AC66B96FA054EF3C14 /* InvitedRoomProxy.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0E95B3BDB80531C85CD50AE6 /* InvitedRoomProxy.swift */; }; 8A0BD60CA4A6004DB06B5403 /* MediaUploadingPreprocessor.swift in Sources */ = {isa = PBXBuildFile; fileRef = 669F35C505ACE1110589F875 /* MediaUploadingPreprocessor.swift */; }; 8A5064CAC8E5F3B18645621D /* CallNotificationRoomTimelineView.swift in Sources */ = {isa = PBXBuildFile; fileRef = AD6E082B0507FB28F966516A /* CallNotificationRoomTimelineView.swift */; }; 8A83D715940378B9BA9F739E /* RoomInviterLabel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7EB58E4E8D6D634C246AD5C2 /* RoomInviterLabel.swift */; }; @@ -833,7 +835,6 @@ BCC864190651B3A3CF51E4DF /* MediaFileHandleProxy.swift in Sources */ = {isa = PBXBuildFile; fileRef = DEC1D382565A4E9CAC2F14EA /* MediaFileHandleProxy.swift */; }; BD0BE20DBCE31253AE4490A1 /* RoomListFiltersEmptyStateView.swift in Sources */ = {isa = PBXBuildFile; fileRef = CC1DDB2293A51EA4C2739351 /* RoomListFiltersEmptyStateView.swift */; }; BD11E639CF566A9DA8FCA717 /* RoundedLabelItem.swift in Sources */ = {isa = PBXBuildFile; fileRef = DE7C80EF77AD102053D3646E /* RoundedLabelItem.swift */; }; - BD203FC6A7AE7637EA003643 /* RoomProxyMock.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1ABDE6F66532CBEB0E016F94 /* RoomProxyMock.swift */; }; BD6685592716CA957D7BAAC4 /* RoomChangeRolesScreenSelectedItem.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3D9B45D584D232CB9E5C7734 /* RoomChangeRolesScreenSelectedItem.swift */; }; BD782053BE4C3D2F0BDE5699 /* ServiceLocator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 57F95CADD0A5DBD76B990FCB /* ServiceLocator.swift */; }; BDA68E8D95B2B24B28825B8B /* LoginScreenViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3C368CAB3063EF275357ECD4 /* LoginScreenViewModel.swift */; }; @@ -1210,6 +1211,7 @@ 06FAE373A7F20780BA84B59C /* MessageForwardingScreenCoordinator.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MessageForwardingScreenCoordinator.swift; sourceTree = ""; }; 07579F9C29001E40715F3014 /* NotificationSettingsChatType.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NotificationSettingsChatType.swift; sourceTree = ""; }; 077D7C3BE199B6E5DDEC07EC /* AppCoordinatorStateMachine.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppCoordinatorStateMachine.swift; sourceTree = ""; }; + 07C6B0B087FE6601C3F77816 /* JoinedRoomProxy.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = JoinedRoomProxy.swift; sourceTree = ""; }; 08283301736A6FE9D558B2CB /* AppLockScreenViewModelProtocol.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppLockScreenViewModelProtocol.swift; sourceTree = ""; }; 0833F51229E166BCA141D004 /* RoomRolesAndPermissionsFlowCoordinator.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RoomRolesAndPermissionsFlowCoordinator.swift; sourceTree = ""; }; 086B997409328F091EBA43CE /* RoomScreenUITests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RoomScreenUITests.swift; sourceTree = ""; }; @@ -1235,6 +1237,7 @@ 0DBB08A95EFA668F2CF27211 /* AppLockSetupFlowCoordinator.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppLockSetupFlowCoordinator.swift; sourceTree = ""; }; 0DF5CBAF69BDF5DF31C661E1 /* IntentionalMentions.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = IntentionalMentions.swift; sourceTree = ""; }; 0E8BDC092D817B68CD9040C5 /* UserSessionStore.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UserSessionStore.swift; sourceTree = ""; }; + 0E95B3BDB80531C85CD50AE6 /* InvitedRoomProxy.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = InvitedRoomProxy.swift; sourceTree = ""; }; 0EE9EAF0309A2A1D67D8FAF5 /* sv */ = {isa = PBXFileReference; lastKnownFileType = text.plist.stringsdict; name = sv; path = sv.lproj/Localizable.stringsdict; sourceTree = ""; }; 0F5567A7EF6F2AB9473236F6 /* DocumentPicker.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DocumentPicker.swift; sourceTree = ""; }; 0F64447FF544298A6A3BEF85 /* NotificationSettingsScreenModels.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NotificationSettingsScreenModels.swift; sourceTree = ""; }; @@ -1280,7 +1283,6 @@ 1A4D29F2683F5772AC72406F /* MapTilerStaticMap.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MapTilerStaticMap.swift; sourceTree = ""; }; 1A7ED2EF5BDBAD2A7DBC4636 /* GeoURITests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = GeoURITests.swift; sourceTree = ""; }; 1AB58EF0176D4CFB1040DA22 /* WaitlistScreenViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WaitlistScreenViewModel.swift; sourceTree = ""; }; - 1ABDE6F66532CBEB0E016F94 /* RoomProxyMock.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RoomProxyMock.swift; sourceTree = ""; }; 1B2AC540DE619B36832A5DB5 /* LocationRoomTimelineItem.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LocationRoomTimelineItem.swift; sourceTree = ""; }; 1B53D6C5C0D14B04D3AB3F6E /* PillAttachmentViewProvider.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PillAttachmentViewProvider.swift; sourceTree = ""; }; 1B564D748B67A156F413CD97 /* NotificationSettingsEditScreenModels.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NotificationSettingsEditScreenModels.swift; sourceTree = ""; }; @@ -1746,6 +1748,7 @@ 8610C1D21565C950BCA6A454 /* AppLockSetupSettingsScreenViewModelProtocol.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppLockSetupSettingsScreenViewModelProtocol.swift; sourceTree = ""; }; 86376BEE425704AEE197CA54 /* PillContext.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PillContext.swift; sourceTree = ""; }; 8642512079EEFD622E3AA66B /* BlockedUsersScreenModels.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BlockedUsersScreenModels.swift; sourceTree = ""; }; + 867DC9530C42F7B5176BE465 /* JoinedRoomProxyMock.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = JoinedRoomProxyMock.swift; sourceTree = ""; }; 869A8A4632E511351BFE2EC4 /* JoinRoomScreen.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = JoinRoomScreen.swift; sourceTree = ""; }; 86A6F283BC574FDB96ABBB07 /* DeveloperOptionsScreenViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DeveloperOptionsScreenViewModel.swift; sourceTree = ""; }; 86C8CE2630F54D5FE1591786 /* ro */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ro; path = ro.lproj/InfoPlist.strings; sourceTree = ""; }; @@ -1865,7 +1868,6 @@ A443FAE2EE820A5790C35C8D /* et */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = et; path = et.lproj/Localizable.strings; sourceTree = ""; }; A4A1003A0F7A1DFB47F4E2D0 /* TimelineItemMock.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TimelineItemMock.swift; sourceTree = ""; }; A58E93D91DE3288010390DEE /* EmojiDetectionTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = EmojiDetectionTests.swift; sourceTree = ""; }; - A65F140F9FE5E8D4DAEFF354 /* RoomProxy.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RoomProxy.swift; sourceTree = ""; }; A69869844D2B6F5BD9AABF85 /* OIDCConfigurationProxy.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = OIDCConfigurationProxy.swift; sourceTree = ""; }; A6B19D10B102956066AF117B /* PollOptionView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PollOptionView.swift; sourceTree = ""; }; A6B891A6DA826E2461DBB40F /* PHGPostHogConfiguration.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PHGPostHogConfiguration.swift; sourceTree = ""; }; @@ -2828,6 +2830,7 @@ 4E600B315B920B9687F8EE1B /* ComposerDraftServiceMock.swift */, E321E840DCC63790049984F4 /* ElementCallServiceMock.swift */, 1C7A6BBC686B1F840FA807FB /* EventTimelineItemSDKMock.swift */, + 867DC9530C42F7B5176BE465 /* JoinedRoomProxyMock.swift */, 8DA1E8F287680C8ED25EDBAC /* NetworkMonitorMock.swift */, 382B50F7E379B3DBBD174364 /* NotificationSettingsProxyMock.swift */, B2AD8A56CD37E23071A2F4BF /* PHGPostHogMock.swift */, @@ -2835,7 +2838,6 @@ 894EE8F5B399A165BA2A6634 /* RoomDirectorySearchMock.swift */, 36FD673E24FBFCFDF398716A /* RoomMemberProxyMock.swift */, F5D1BAA90F3A073D91B4F16B /* RoomNotificationSettingsProxyMock.swift */, - 1ABDE6F66532CBEB0E016F94 /* RoomProxyMock.swift */, FC83F47D2173B7538AA72E0E /* RoomSummaryProviderMock.swift */, D479DF730528153665E5782E /* RoomTimelineControllerFactoryMock.swift */, F74532E01B317C56C1BE8FA8 /* RoomTimelineProviderMock.swift */, @@ -3114,9 +3116,10 @@ 40E6246F03D1FE377BC5D963 /* Room */ = { isa = PBXGroup; children = ( + 0E95B3BDB80531C85CD50AE6 /* InvitedRoomProxy.swift */, + 07C6B0B087FE6601C3F77816 /* JoinedRoomProxy.swift */, B6404166CBF5CC88673FF9E2 /* RoomDetails.swift */, 974AEAF3FE0C577A6C04AD6E /* RoomPermissions.swift */, - A65F140F9FE5E8D4DAEFF354 /* RoomProxy.swift */, 47111410B6E659A697D472B5 /* RoomProxyProtocol.swift */, 2C0F49BD446849654C0D24E0 /* RoomMember */, 70DABA39C844CA931B829395 /* RoomSummary */, @@ -6354,11 +6357,14 @@ 61941DEE5F3834765770BE01 /* InviteUsersScreenSelectedItem.swift in Sources */, F519DE17A3A0F760307B2E6D /* InviteUsersScreenViewModel.swift in Sources */, A17FAD2EBC53E17B5FD384DB /* InviteUsersScreenViewModelProtocol.swift in Sources */, + 89B909AC66B96FA054EF3C14 /* InvitedRoomProxy.swift in Sources */, 6A54F52443EC52AC5CD772C0 /* JoinRoomScreen.swift in Sources */, AFE2AB612A1460E49578D746 /* JoinRoomScreenCoordinator.swift in Sources */, DEDBD3E9CFCC9F20CAC79881 /* JoinRoomScreenModels.swift in Sources */, EF47D802A404A53F15D5D4B6 /* JoinRoomScreenViewModel.swift in Sources */, 7B66DA4E7E5FE4D1A0FCEAA4 /* JoinRoomScreenViewModelProtocol.swift in Sources */, + 261261778DEFAEFC042B875E /* JoinedRoomProxy.swift in Sources */, + 7D249465ED00988EEEC14E05 /* JoinedRoomProxyMock.swift in Sources */, E3CA565A4B9704F191B191F0 /* JoinedRoomSize+MemberCount.swift in Sources */, 1FE593ECEC40A43789105D80 /* KeychainController.swift in Sources */, FD29471C72872F8B7580E3E1 /* KeychainControllerMock.swift in Sources */, @@ -6625,8 +6631,6 @@ 51B3B19FA5F91B455C807BA7 /* RoomPollsHistoryScreenModels.swift in Sources */, 79741C1953269FF1A211D246 /* RoomPollsHistoryScreenViewModel.swift in Sources */, F103924DED414ADFE398CE99 /* RoomPollsHistoryScreenViewModelProtocol.swift in Sources */, - 4FC1EFE4968A259CBBACFAFB /* RoomProxy.swift in Sources */, - BD203FC6A7AE7637EA003643 /* RoomProxyMock.swift in Sources */, FA9C427FFB11B1AA2DCC5602 /* RoomProxyProtocol.swift in Sources */, DC77E9DB2CFBE84A2BDF20C5 /* RoomRolesAndPermissionsFlowCoordinator.swift in Sources */, D10BA4F041DC58580A440A32 /* RoomRolesAndPermissionsScreen.swift in Sources */, diff --git a/ElementX/Sources/Application/AppCoordinator.swift b/ElementX/Sources/Application/AppCoordinator.swift index a4c0cee69..1da3b89ca 100644 --- a/ElementX/Sources/Application/AppCoordinator.swift +++ b/ElementX/Sources/Application/AppCoordinator.swift @@ -325,10 +325,15 @@ class AppCoordinator: AppCoordinatorProtocol, AuthenticationFlowCoordinatorDeleg guard let roomID = content.userInfo[NotificationConstants.UserInfoKey.roomIdentifier] as? String else { return } - let roomProxy = await userSession.clientProxy.roomForIdentifier(roomID) - switch await roomProxy?.timeline.sendMessage(replyText, - html: nil, - intentionalMentions: .empty) { + + guard case let .joined(roomProxy) = await userSession.clientProxy.roomForIdentifier(roomID) else { + MXLog.error("Tried to reply in an unjoined room: \(roomID)") + return + } + + switch await roomProxy.timeline.sendMessage(replyText, + html: nil, + intentionalMentions: .empty) { case .success: break default: diff --git a/ElementX/Sources/FlowCoordinators/RoomFlowCoordinator.swift b/ElementX/Sources/FlowCoordinators/RoomFlowCoordinator.swift index 5e5d334f4..c024238cc 100644 --- a/ElementX/Sources/FlowCoordinators/RoomFlowCoordinator.swift +++ b/ElementX/Sources/FlowCoordinators/RoomFlowCoordinator.swift @@ -20,7 +20,7 @@ import SwiftUI import UserNotifications enum RoomFlowCoordinatorAction: Equatable { - case presentCallScreen(roomProxy: RoomProxyProtocol) + case presentCallScreen(roomProxy: JoinedRoomProxyProtocol) case finished static func == (lhs: RoomFlowCoordinatorAction, rhs: RoomFlowCoordinatorAction) -> Bool { @@ -63,7 +63,7 @@ class RoomFlowCoordinator: FlowCoordinatorProtocol { private let analytics: AnalyticsService private let userIndicatorController: UserIndicatorControllerProtocol - private var roomProxy: RoomProxyProtocol! + private var roomProxy: JoinedRoomProxyProtocol! private var roomScreenCoordinator: RoomScreenCoordinator? private weak var joinRoomScreenCoordinator: JoinRoomScreenCoordinator? @@ -139,7 +139,7 @@ class RoomFlowCoordinator: FlowCoordinatorProtocol { Task { if roomProxy == nil { - guard let roomProxy = await userSession.clientProxy.roomForIdentifier(roomID) else { + guard case let .joined(roomProxy) = await userSession.clientProxy.roomForIdentifier(roomID) else { return } @@ -173,7 +173,7 @@ class RoomFlowCoordinator: FlowCoordinatorProtocol { } private func presentCallScreen(roomID: String) async { - guard let roomProxy = await userSession.clientProxy.roomForIdentifier(roomID) else { + guard case let .joined(roomProxy) = await userSession.clientProxy.roomForIdentifier(roomID) else { return } @@ -183,13 +183,13 @@ class RoomFlowCoordinator: FlowCoordinatorProtocol { private func handleRoomRoute(roomID: String, via: [String], focussedEventID: String? = nil, animated: Bool) async { guard roomID == self.roomID else { fatalError("Navigation route doesn't belong to this room flow.") } - guard let roomProxy = await userSession.clientProxy.roomForIdentifier(roomID) else { + guard let room = await userSession.clientProxy.roomForIdentifier(roomID) else { stateMachine.tryEvent(.presentJoinRoomScreen(via: via), userInfo: EventUserInfo(animated: animated)) return } - switch roomProxy.membership { - case .joined: + switch room { + case .joined(let roomProxy): await storeAndSubscribeToRoomProxy(roomProxy) stateMachine.tryEvent(.presentRoom(focussedEventID: focussedEventID), userInfo: EventUserInfo(animated: animated)) default: @@ -207,7 +207,7 @@ class RoomFlowCoordinator: FlowCoordinatorProtocol { // MARK: - Private - private func storeAndSubscribeToRoomProxy(_ roomProxy: RoomProxyProtocol) async { + private func storeAndSubscribeToRoomProxy(_ roomProxy: JoinedRoomProxyProtocol) async { if let oldRoomProxy = self.roomProxy { if oldRoomProxy.id != roomProxy.id { fatalError("Trying to create different room proxies for the same flow coordinator") @@ -216,11 +216,7 @@ class RoomFlowCoordinator: FlowCoordinatorProtocol { MXLog.warning("Found an existing proxy, returning.") return } - - guard roomProxy.membership == .joined else { - fatalError("Requesting room details for an unjoined room") - } - + await roomProxy.subscribeForUpdates() // Make sure not to set this until after the subscription has succeeded, otherwise the @@ -658,7 +654,7 @@ class RoomFlowCoordinator: FlowCoordinatorProtocol { Task { [weak self] in guard let self else { return } - if let roomProxy = await userSession.clientProxy.roomForIdentifier(roomID) { + if case let .joined(roomProxy) = await userSession.clientProxy.roomForIdentifier(roomID) { await storeAndSubscribeToRoomProxy(roomProxy) stateMachine.tryEvent(.presentRoom(focussedEventID: nil), userInfo: EventUserInfo(animated: animated)) @@ -1300,7 +1296,7 @@ class RoomFlowCoordinator: FlowCoordinatorProtocol { } } - private func inviteUsers(_ users: [String], in room: RoomProxyProtocol) { + private func inviteUsers(_ users: [String], in room: JoinedRoomProxyProtocol) { navigationStackCoordinator.setSheetCoordinator(nil) Task { diff --git a/ElementX/Sources/FlowCoordinators/RoomRolesAndPermissionsFlowCoordinator.swift b/ElementX/Sources/FlowCoordinators/RoomRolesAndPermissionsFlowCoordinator.swift index eedf252c3..a683c7c9b 100644 --- a/ElementX/Sources/FlowCoordinators/RoomRolesAndPermissionsFlowCoordinator.swift +++ b/ElementX/Sources/FlowCoordinators/RoomRolesAndPermissionsFlowCoordinator.swift @@ -24,7 +24,7 @@ enum RoomRolesAndPermissionsFlowCoordinatorAction: Equatable { } struct RoomRolesAndPermissionsFlowCoordinatorParameters { - let roomProxy: RoomProxyProtocol + let roomProxy: JoinedRoomProxyProtocol let mediaProvider: MediaProviderProtocol let navigationStackCoordinator: NavigationStackCoordinator let userIndicatorController: UserIndicatorControllerProtocol @@ -32,7 +32,7 @@ struct RoomRolesAndPermissionsFlowCoordinatorParameters { } class RoomRolesAndPermissionsFlowCoordinator: FlowCoordinatorProtocol { - private let roomProxy: RoomProxyProtocol + private let roomProxy: JoinedRoomProxyProtocol private let navigationStackCoordinator: NavigationStackCoordinator private let mediaProvider: MediaProviderProtocol private let userIndicatorController: UserIndicatorControllerProtocol diff --git a/ElementX/Sources/FlowCoordinators/UserSessionFlowCoordinator.swift b/ElementX/Sources/FlowCoordinators/UserSessionFlowCoordinator.swift index 53a0637ac..9842b3ff6 100644 --- a/ElementX/Sources/FlowCoordinators/UserSessionFlowCoordinator.swift +++ b/ElementX/Sources/FlowCoordinators/UserSessionFlowCoordinator.swift @@ -561,14 +561,14 @@ class UserSessionFlowCoordinator: FlowCoordinatorProtocol { } private func presentCallScreen(roomID: String) async { - guard let roomProxy = await userSession.clientProxy.roomForIdentifier(roomID) else { + guard case let .joined(roomProxy) = await userSession.clientProxy.roomForIdentifier(roomID) else { return } presentCallScreen(roomProxy: roomProxy) } - private func presentCallScreen(roomProxy: RoomProxyProtocol) { + private func presentCallScreen(roomProxy: JoinedRoomProxyProtocol) { let colorScheme: ColorScheme = appMediator.windowManager.mainWindow.traitCollection.userInterfaceStyle == .light ? .light : .dark presentCallScreen(configuration: .init(roomProxy: roomProxy, clientProxy: userSession.clientProxy, diff --git a/ElementX/Sources/Mocks/ClientProxyMock.swift b/ElementX/Sources/Mocks/ClientProxyMock.swift index 9122ae7ed..943fe32b7 100644 --- a/ElementX/Sources/Mocks/ClientProxyMock.swift +++ b/ElementX/Sources/Mocks/ClientProxyMock.swift @@ -94,7 +94,7 @@ extension ClientProxyMock { return nil } - return await RoomProxyMock(.init(id: room.id, name: room.name)) + return await .joined(JoinedRoomProxyMock(.init(id: room.id, name: room.name))) } } } diff --git a/ElementX/Sources/Mocks/Generated/GeneratedMocks.swift b/ElementX/Sources/Mocks/Generated/GeneratedMocks.swift index b5c063390..e1f88901a 100644 --- a/ElementX/Sources/Mocks/Generated/GeneratedMocks.swift +++ b/ElementX/Sources/Mocks/Generated/GeneratedMocks.swift @@ -2681,13 +2681,13 @@ class ClientProxyMock: ClientProxyProtocol { var roomForIdentifierReceivedIdentifier: String? var roomForIdentifierReceivedInvocations: [String] = [] - var roomForIdentifierUnderlyingReturnValue: RoomProxyProtocol? - var roomForIdentifierReturnValue: RoomProxyProtocol? { + var roomForIdentifierUnderlyingReturnValue: RoomProxyType? + var roomForIdentifierReturnValue: RoomProxyType? { get { if Thread.isMainThread { return roomForIdentifierUnderlyingReturnValue } else { - var returnValue: RoomProxyProtocol?? = nil + var returnValue: RoomProxyType?? = nil DispatchQueue.main.sync { returnValue = roomForIdentifierUnderlyingReturnValue } @@ -2705,9 +2705,9 @@ class ClientProxyMock: ClientProxyProtocol { } } } - var roomForIdentifierClosure: ((String) async -> RoomProxyProtocol?)? + var roomForIdentifierClosure: ((String) async -> RoomProxyType?)? - func roomForIdentifier(_ identifier: String) async -> RoomProxyProtocol? { + func roomForIdentifier(_ identifier: String) async -> RoomProxyType? { roomForIdentifierCallsCount += 1 roomForIdentifierReceivedIdentifier = identifier DispatchQueue.main.async { @@ -5213,6 +5213,3115 @@ class ElementCallWidgetDriverMock: ElementCallWidgetDriverProtocol { } } } +class InvitedRoomProxyMock: InvitedRoomProxyProtocol { + var inviterCallsCount = 0 + var inviterCalled: Bool { + return inviterCallsCount > 0 + } + + var inviter: RoomMemberProxyProtocol? { + get async { + inviterCallsCount += 1 + if let inviterClosure = inviterClosure { + return await inviterClosure() + } else { + return underlyingInviter + } + } + } + var underlyingInviter: RoomMemberProxyProtocol? + var inviterClosure: (() async -> RoomMemberProxyProtocol?)? + var id: String { + get { return underlyingId } + set(value) { underlyingId = value } + } + var underlyingId: String! + var canonicalAlias: String? + var ownUserID: String { + get { return underlyingOwnUserID } + set(value) { underlyingOwnUserID = value } + } + var underlyingOwnUserID: String! + var name: String? + var topic: String? + var avatar: RoomAvatar { + get { return underlyingAvatar } + set(value) { underlyingAvatar = value } + } + var underlyingAvatar: RoomAvatar! + var avatarURL: URL? + var isPublic: Bool { + get { return underlyingIsPublic } + set(value) { underlyingIsPublic = value } + } + var underlyingIsPublic: Bool! + var isDirect: Bool { + get { return underlyingIsDirect } + set(value) { underlyingIsDirect = value } + } + var underlyingIsDirect: Bool! + var isSpace: Bool { + get { return underlyingIsSpace } + set(value) { underlyingIsSpace = value } + } + var underlyingIsSpace: Bool! + var joinedMembersCount: Int { + get { return underlyingJoinedMembersCount } + set(value) { underlyingJoinedMembersCount = value } + } + var underlyingJoinedMembersCount: Int! + var activeMembersCount: Int { + get { return underlyingActiveMembersCount } + set(value) { underlyingActiveMembersCount = value } + } + var underlyingActiveMembersCount: Int! + + //MARK: - rejectInvitation + + var rejectInvitationUnderlyingCallsCount = 0 + var rejectInvitationCallsCount: Int { + get { + if Thread.isMainThread { + return rejectInvitationUnderlyingCallsCount + } else { + var returnValue: Int? = nil + DispatchQueue.main.sync { + returnValue = rejectInvitationUnderlyingCallsCount + } + + return returnValue! + } + } + set { + if Thread.isMainThread { + rejectInvitationUnderlyingCallsCount = newValue + } else { + DispatchQueue.main.sync { + rejectInvitationUnderlyingCallsCount = newValue + } + } + } + } + var rejectInvitationCalled: Bool { + return rejectInvitationCallsCount > 0 + } + + var rejectInvitationUnderlyingReturnValue: Result! + var rejectInvitationReturnValue: Result! { + get { + if Thread.isMainThread { + return rejectInvitationUnderlyingReturnValue + } else { + var returnValue: Result? = nil + DispatchQueue.main.sync { + returnValue = rejectInvitationUnderlyingReturnValue + } + + return returnValue! + } + } + set { + if Thread.isMainThread { + rejectInvitationUnderlyingReturnValue = newValue + } else { + DispatchQueue.main.sync { + rejectInvitationUnderlyingReturnValue = newValue + } + } + } + } + var rejectInvitationClosure: (() async -> Result)? + + func rejectInvitation() async -> Result { + rejectInvitationCallsCount += 1 + if let rejectInvitationClosure = rejectInvitationClosure { + return await rejectInvitationClosure() + } else { + return rejectInvitationReturnValue + } + } + //MARK: - acceptInvitation + + var acceptInvitationUnderlyingCallsCount = 0 + var acceptInvitationCallsCount: Int { + get { + if Thread.isMainThread { + return acceptInvitationUnderlyingCallsCount + } else { + var returnValue: Int? = nil + DispatchQueue.main.sync { + returnValue = acceptInvitationUnderlyingCallsCount + } + + return returnValue! + } + } + set { + if Thread.isMainThread { + acceptInvitationUnderlyingCallsCount = newValue + } else { + DispatchQueue.main.sync { + acceptInvitationUnderlyingCallsCount = newValue + } + } + } + } + var acceptInvitationCalled: Bool { + return acceptInvitationCallsCount > 0 + } + + var acceptInvitationUnderlyingReturnValue: Result! + var acceptInvitationReturnValue: Result! { + get { + if Thread.isMainThread { + return acceptInvitationUnderlyingReturnValue + } else { + var returnValue: Result? = nil + DispatchQueue.main.sync { + returnValue = acceptInvitationUnderlyingReturnValue + } + + return returnValue! + } + } + set { + if Thread.isMainThread { + acceptInvitationUnderlyingReturnValue = newValue + } else { + DispatchQueue.main.sync { + acceptInvitationUnderlyingReturnValue = newValue + } + } + } + } + var acceptInvitationClosure: (() async -> Result)? + + func acceptInvitation() async -> Result { + acceptInvitationCallsCount += 1 + if let acceptInvitationClosure = acceptInvitationClosure { + return await acceptInvitationClosure() + } else { + return acceptInvitationReturnValue + } + } +} +class JoinedRoomProxyMock: JoinedRoomProxyProtocol { + var isEncrypted: Bool { + get { return underlyingIsEncrypted } + set(value) { underlyingIsEncrypted = value } + } + var underlyingIsEncrypted: Bool! + var isFavouriteCallsCount = 0 + var isFavouriteCalled: Bool { + return isFavouriteCallsCount > 0 + } + + var isFavourite: Bool { + get async { + isFavouriteCallsCount += 1 + if let isFavouriteClosure = isFavouriteClosure { + return await isFavouriteClosure() + } else { + return underlyingIsFavourite + } + } + } + var underlyingIsFavourite: Bool! + var isFavouriteClosure: (() async -> Bool)? + var pinnedEventIDsCallsCount = 0 + var pinnedEventIDsCalled: Bool { + return pinnedEventIDsCallsCount > 0 + } + + var pinnedEventIDs: Set { + get async { + pinnedEventIDsCallsCount += 1 + if let pinnedEventIDsClosure = pinnedEventIDsClosure { + return await pinnedEventIDsClosure() + } else { + return underlyingPinnedEventIDs + } + } + } + var underlyingPinnedEventIDs: Set! + var pinnedEventIDsClosure: (() async -> Set)? + var hasOngoingCall: Bool { + get { return underlyingHasOngoingCall } + set(value) { underlyingHasOngoingCall = value } + } + var underlyingHasOngoingCall: Bool! + var activeRoomCallParticipants: [String] = [] + var membersPublisher: CurrentValuePublisher<[RoomMemberProxyProtocol], Never> { + get { return underlyingMembersPublisher } + set(value) { underlyingMembersPublisher = value } + } + var underlyingMembersPublisher: CurrentValuePublisher<[RoomMemberProxyProtocol], Never>! + var typingMembersPublisher: CurrentValuePublisher<[String], Never> { + get { return underlyingTypingMembersPublisher } + set(value) { underlyingTypingMembersPublisher = value } + } + var underlyingTypingMembersPublisher: CurrentValuePublisher<[String], Never>! + var actionsPublisher: AnyPublisher { + get { return underlyingActionsPublisher } + set(value) { underlyingActionsPublisher = value } + } + var underlyingActionsPublisher: AnyPublisher! + var timeline: TimelineProxyProtocol { + get { return underlyingTimeline } + set(value) { underlyingTimeline = value } + } + var underlyingTimeline: TimelineProxyProtocol! + var pinnedEventsTimelineCallsCount = 0 + var pinnedEventsTimelineCalled: Bool { + return pinnedEventsTimelineCallsCount > 0 + } + + var pinnedEventsTimeline: TimelineProxyProtocol? { + get async { + pinnedEventsTimelineCallsCount += 1 + if let pinnedEventsTimelineClosure = pinnedEventsTimelineClosure { + return await pinnedEventsTimelineClosure() + } else { + return underlyingPinnedEventsTimeline + } + } + } + var underlyingPinnedEventsTimeline: TimelineProxyProtocol? + var pinnedEventsTimelineClosure: (() async -> TimelineProxyProtocol?)? + var id: String { + get { return underlyingId } + set(value) { underlyingId = value } + } + var underlyingId: String! + var canonicalAlias: String? + var ownUserID: String { + get { return underlyingOwnUserID } + set(value) { underlyingOwnUserID = value } + } + var underlyingOwnUserID: String! + var name: String? + var topic: String? + var avatar: RoomAvatar { + get { return underlyingAvatar } + set(value) { underlyingAvatar = value } + } + var underlyingAvatar: RoomAvatar! + var avatarURL: URL? + var isPublic: Bool { + get { return underlyingIsPublic } + set(value) { underlyingIsPublic = value } + } + var underlyingIsPublic: Bool! + var isDirect: Bool { + get { return underlyingIsDirect } + set(value) { underlyingIsDirect = value } + } + var underlyingIsDirect: Bool! + var isSpace: Bool { + get { return underlyingIsSpace } + set(value) { underlyingIsSpace = value } + } + var underlyingIsSpace: Bool! + var joinedMembersCount: Int { + get { return underlyingJoinedMembersCount } + set(value) { underlyingJoinedMembersCount = value } + } + var underlyingJoinedMembersCount: Int! + var activeMembersCount: Int { + get { return underlyingActiveMembersCount } + set(value) { underlyingActiveMembersCount = value } + } + var underlyingActiveMembersCount: Int! + + //MARK: - subscribeForUpdates + + var subscribeForUpdatesUnderlyingCallsCount = 0 + var subscribeForUpdatesCallsCount: Int { + get { + if Thread.isMainThread { + return subscribeForUpdatesUnderlyingCallsCount + } else { + var returnValue: Int? = nil + DispatchQueue.main.sync { + returnValue = subscribeForUpdatesUnderlyingCallsCount + } + + return returnValue! + } + } + set { + if Thread.isMainThread { + subscribeForUpdatesUnderlyingCallsCount = newValue + } else { + DispatchQueue.main.sync { + subscribeForUpdatesUnderlyingCallsCount = newValue + } + } + } + } + var subscribeForUpdatesCalled: Bool { + return subscribeForUpdatesCallsCount > 0 + } + var subscribeForUpdatesClosure: (() async -> Void)? + + func subscribeForUpdates() async { + subscribeForUpdatesCallsCount += 1 + await subscribeForUpdatesClosure?() + } + //MARK: - subscribeToRoomInfoUpdates + + var subscribeToRoomInfoUpdatesUnderlyingCallsCount = 0 + var subscribeToRoomInfoUpdatesCallsCount: Int { + get { + if Thread.isMainThread { + return subscribeToRoomInfoUpdatesUnderlyingCallsCount + } else { + var returnValue: Int? = nil + DispatchQueue.main.sync { + returnValue = subscribeToRoomInfoUpdatesUnderlyingCallsCount + } + + return returnValue! + } + } + set { + if Thread.isMainThread { + subscribeToRoomInfoUpdatesUnderlyingCallsCount = newValue + } else { + DispatchQueue.main.sync { + subscribeToRoomInfoUpdatesUnderlyingCallsCount = newValue + } + } + } + } + var subscribeToRoomInfoUpdatesCalled: Bool { + return subscribeToRoomInfoUpdatesCallsCount > 0 + } + var subscribeToRoomInfoUpdatesClosure: (() -> Void)? + + func subscribeToRoomInfoUpdates() { + subscribeToRoomInfoUpdatesCallsCount += 1 + subscribeToRoomInfoUpdatesClosure?() + } + //MARK: - timelineFocusedOnEvent + + var timelineFocusedOnEventEventIDNumberOfEventsUnderlyingCallsCount = 0 + var timelineFocusedOnEventEventIDNumberOfEventsCallsCount: Int { + get { + if Thread.isMainThread { + return timelineFocusedOnEventEventIDNumberOfEventsUnderlyingCallsCount + } else { + var returnValue: Int? = nil + DispatchQueue.main.sync { + returnValue = timelineFocusedOnEventEventIDNumberOfEventsUnderlyingCallsCount + } + + return returnValue! + } + } + set { + if Thread.isMainThread { + timelineFocusedOnEventEventIDNumberOfEventsUnderlyingCallsCount = newValue + } else { + DispatchQueue.main.sync { + timelineFocusedOnEventEventIDNumberOfEventsUnderlyingCallsCount = newValue + } + } + } + } + var timelineFocusedOnEventEventIDNumberOfEventsCalled: Bool { + return timelineFocusedOnEventEventIDNumberOfEventsCallsCount > 0 + } + var timelineFocusedOnEventEventIDNumberOfEventsReceivedArguments: (eventID: String, numberOfEvents: UInt16)? + var timelineFocusedOnEventEventIDNumberOfEventsReceivedInvocations: [(eventID: String, numberOfEvents: UInt16)] = [] + + var timelineFocusedOnEventEventIDNumberOfEventsUnderlyingReturnValue: Result! + var timelineFocusedOnEventEventIDNumberOfEventsReturnValue: Result! { + get { + if Thread.isMainThread { + return timelineFocusedOnEventEventIDNumberOfEventsUnderlyingReturnValue + } else { + var returnValue: Result? = nil + DispatchQueue.main.sync { + returnValue = timelineFocusedOnEventEventIDNumberOfEventsUnderlyingReturnValue + } + + return returnValue! + } + } + set { + if Thread.isMainThread { + timelineFocusedOnEventEventIDNumberOfEventsUnderlyingReturnValue = newValue + } else { + DispatchQueue.main.sync { + timelineFocusedOnEventEventIDNumberOfEventsUnderlyingReturnValue = newValue + } + } + } + } + var timelineFocusedOnEventEventIDNumberOfEventsClosure: ((String, UInt16) async -> Result)? + + func timelineFocusedOnEvent(eventID: String, numberOfEvents: UInt16) async -> Result { + timelineFocusedOnEventEventIDNumberOfEventsCallsCount += 1 + timelineFocusedOnEventEventIDNumberOfEventsReceivedArguments = (eventID: eventID, numberOfEvents: numberOfEvents) + DispatchQueue.main.async { + self.timelineFocusedOnEventEventIDNumberOfEventsReceivedInvocations.append((eventID: eventID, numberOfEvents: numberOfEvents)) + } + if let timelineFocusedOnEventEventIDNumberOfEventsClosure = timelineFocusedOnEventEventIDNumberOfEventsClosure { + return await timelineFocusedOnEventEventIDNumberOfEventsClosure(eventID, numberOfEvents) + } else { + return timelineFocusedOnEventEventIDNumberOfEventsReturnValue + } + } + //MARK: - redact + + var redactUnderlyingCallsCount = 0 + var redactCallsCount: Int { + get { + if Thread.isMainThread { + return redactUnderlyingCallsCount + } else { + var returnValue: Int? = nil + DispatchQueue.main.sync { + returnValue = redactUnderlyingCallsCount + } + + return returnValue! + } + } + set { + if Thread.isMainThread { + redactUnderlyingCallsCount = newValue + } else { + DispatchQueue.main.sync { + redactUnderlyingCallsCount = newValue + } + } + } + } + var redactCalled: Bool { + return redactCallsCount > 0 + } + var redactReceivedEventID: String? + var redactReceivedInvocations: [String] = [] + + var redactUnderlyingReturnValue: Result! + var redactReturnValue: Result! { + get { + if Thread.isMainThread { + return redactUnderlyingReturnValue + } else { + var returnValue: Result? = nil + DispatchQueue.main.sync { + returnValue = redactUnderlyingReturnValue + } + + return returnValue! + } + } + set { + if Thread.isMainThread { + redactUnderlyingReturnValue = newValue + } else { + DispatchQueue.main.sync { + redactUnderlyingReturnValue = newValue + } + } + } + } + var redactClosure: ((String) async -> Result)? + + func redact(_ eventID: String) async -> Result { + redactCallsCount += 1 + redactReceivedEventID = eventID + DispatchQueue.main.async { + self.redactReceivedInvocations.append(eventID) + } + if let redactClosure = redactClosure { + return await redactClosure(eventID) + } else { + return redactReturnValue + } + } + //MARK: - reportContent + + var reportContentReasonUnderlyingCallsCount = 0 + var reportContentReasonCallsCount: Int { + get { + if Thread.isMainThread { + return reportContentReasonUnderlyingCallsCount + } else { + var returnValue: Int? = nil + DispatchQueue.main.sync { + returnValue = reportContentReasonUnderlyingCallsCount + } + + return returnValue! + } + } + set { + if Thread.isMainThread { + reportContentReasonUnderlyingCallsCount = newValue + } else { + DispatchQueue.main.sync { + reportContentReasonUnderlyingCallsCount = newValue + } + } + } + } + var reportContentReasonCalled: Bool { + return reportContentReasonCallsCount > 0 + } + var reportContentReasonReceivedArguments: (eventID: String, reason: String?)? + var reportContentReasonReceivedInvocations: [(eventID: String, reason: String?)] = [] + + var reportContentReasonUnderlyingReturnValue: Result! + var reportContentReasonReturnValue: Result! { + get { + if Thread.isMainThread { + return reportContentReasonUnderlyingReturnValue + } else { + var returnValue: Result? = nil + DispatchQueue.main.sync { + returnValue = reportContentReasonUnderlyingReturnValue + } + + return returnValue! + } + } + set { + if Thread.isMainThread { + reportContentReasonUnderlyingReturnValue = newValue + } else { + DispatchQueue.main.sync { + reportContentReasonUnderlyingReturnValue = newValue + } + } + } + } + var reportContentReasonClosure: ((String, String?) async -> Result)? + + func reportContent(_ eventID: String, reason: String?) async -> Result { + reportContentReasonCallsCount += 1 + reportContentReasonReceivedArguments = (eventID: eventID, reason: reason) + DispatchQueue.main.async { + self.reportContentReasonReceivedInvocations.append((eventID: eventID, reason: reason)) + } + if let reportContentReasonClosure = reportContentReasonClosure { + return await reportContentReasonClosure(eventID, reason) + } else { + return reportContentReasonReturnValue + } + } + //MARK: - leaveRoom + + var leaveRoomUnderlyingCallsCount = 0 + var leaveRoomCallsCount: Int { + get { + if Thread.isMainThread { + return leaveRoomUnderlyingCallsCount + } else { + var returnValue: Int? = nil + DispatchQueue.main.sync { + returnValue = leaveRoomUnderlyingCallsCount + } + + return returnValue! + } + } + set { + if Thread.isMainThread { + leaveRoomUnderlyingCallsCount = newValue + } else { + DispatchQueue.main.sync { + leaveRoomUnderlyingCallsCount = newValue + } + } + } + } + var leaveRoomCalled: Bool { + return leaveRoomCallsCount > 0 + } + + var leaveRoomUnderlyingReturnValue: Result! + var leaveRoomReturnValue: Result! { + get { + if Thread.isMainThread { + return leaveRoomUnderlyingReturnValue + } else { + var returnValue: Result? = nil + DispatchQueue.main.sync { + returnValue = leaveRoomUnderlyingReturnValue + } + + return returnValue! + } + } + set { + if Thread.isMainThread { + leaveRoomUnderlyingReturnValue = newValue + } else { + DispatchQueue.main.sync { + leaveRoomUnderlyingReturnValue = newValue + } + } + } + } + var leaveRoomClosure: (() async -> Result)? + + func leaveRoom() async -> Result { + leaveRoomCallsCount += 1 + if let leaveRoomClosure = leaveRoomClosure { + return await leaveRoomClosure() + } else { + return leaveRoomReturnValue + } + } + //MARK: - updateMembers + + var updateMembersUnderlyingCallsCount = 0 + var updateMembersCallsCount: Int { + get { + if Thread.isMainThread { + return updateMembersUnderlyingCallsCount + } else { + var returnValue: Int? = nil + DispatchQueue.main.sync { + returnValue = updateMembersUnderlyingCallsCount + } + + return returnValue! + } + } + set { + if Thread.isMainThread { + updateMembersUnderlyingCallsCount = newValue + } else { + DispatchQueue.main.sync { + updateMembersUnderlyingCallsCount = newValue + } + } + } + } + var updateMembersCalled: Bool { + return updateMembersCallsCount > 0 + } + var updateMembersClosure: (() async -> Void)? + + func updateMembers() async { + updateMembersCallsCount += 1 + await updateMembersClosure?() + } + //MARK: - getMember + + var getMemberUserIDUnderlyingCallsCount = 0 + var getMemberUserIDCallsCount: Int { + get { + if Thread.isMainThread { + return getMemberUserIDUnderlyingCallsCount + } else { + var returnValue: Int? = nil + DispatchQueue.main.sync { + returnValue = getMemberUserIDUnderlyingCallsCount + } + + return returnValue! + } + } + set { + if Thread.isMainThread { + getMemberUserIDUnderlyingCallsCount = newValue + } else { + DispatchQueue.main.sync { + getMemberUserIDUnderlyingCallsCount = newValue + } + } + } + } + var getMemberUserIDCalled: Bool { + return getMemberUserIDCallsCount > 0 + } + var getMemberUserIDReceivedUserID: String? + var getMemberUserIDReceivedInvocations: [String] = [] + + var getMemberUserIDUnderlyingReturnValue: Result! + var getMemberUserIDReturnValue: Result! { + get { + if Thread.isMainThread { + return getMemberUserIDUnderlyingReturnValue + } else { + var returnValue: Result? = nil + DispatchQueue.main.sync { + returnValue = getMemberUserIDUnderlyingReturnValue + } + + return returnValue! + } + } + set { + if Thread.isMainThread { + getMemberUserIDUnderlyingReturnValue = newValue + } else { + DispatchQueue.main.sync { + getMemberUserIDUnderlyingReturnValue = newValue + } + } + } + } + var getMemberUserIDClosure: ((String) async -> Result)? + + func getMember(userID: String) async -> Result { + getMemberUserIDCallsCount += 1 + getMemberUserIDReceivedUserID = userID + DispatchQueue.main.async { + self.getMemberUserIDReceivedInvocations.append(userID) + } + if let getMemberUserIDClosure = getMemberUserIDClosure { + return await getMemberUserIDClosure(userID) + } else { + return getMemberUserIDReturnValue + } + } + //MARK: - invite + + var inviteUserIDUnderlyingCallsCount = 0 + var inviteUserIDCallsCount: Int { + get { + if Thread.isMainThread { + return inviteUserIDUnderlyingCallsCount + } else { + var returnValue: Int? = nil + DispatchQueue.main.sync { + returnValue = inviteUserIDUnderlyingCallsCount + } + + return returnValue! + } + } + set { + if Thread.isMainThread { + inviteUserIDUnderlyingCallsCount = newValue + } else { + DispatchQueue.main.sync { + inviteUserIDUnderlyingCallsCount = newValue + } + } + } + } + var inviteUserIDCalled: Bool { + return inviteUserIDCallsCount > 0 + } + var inviteUserIDReceivedUserID: String? + var inviteUserIDReceivedInvocations: [String] = [] + + var inviteUserIDUnderlyingReturnValue: Result! + var inviteUserIDReturnValue: Result! { + get { + if Thread.isMainThread { + return inviteUserIDUnderlyingReturnValue + } else { + var returnValue: Result? = nil + DispatchQueue.main.sync { + returnValue = inviteUserIDUnderlyingReturnValue + } + + return returnValue! + } + } + set { + if Thread.isMainThread { + inviteUserIDUnderlyingReturnValue = newValue + } else { + DispatchQueue.main.sync { + inviteUserIDUnderlyingReturnValue = newValue + } + } + } + } + var inviteUserIDClosure: ((String) async -> Result)? + + func invite(userID: String) async -> Result { + inviteUserIDCallsCount += 1 + inviteUserIDReceivedUserID = userID + DispatchQueue.main.async { + self.inviteUserIDReceivedInvocations.append(userID) + } + if let inviteUserIDClosure = inviteUserIDClosure { + return await inviteUserIDClosure(userID) + } else { + return inviteUserIDReturnValue + } + } + //MARK: - setName + + var setNameUnderlyingCallsCount = 0 + var setNameCallsCount: Int { + get { + if Thread.isMainThread { + return setNameUnderlyingCallsCount + } else { + var returnValue: Int? = nil + DispatchQueue.main.sync { + returnValue = setNameUnderlyingCallsCount + } + + return returnValue! + } + } + set { + if Thread.isMainThread { + setNameUnderlyingCallsCount = newValue + } else { + DispatchQueue.main.sync { + setNameUnderlyingCallsCount = newValue + } + } + } + } + var setNameCalled: Bool { + return setNameCallsCount > 0 + } + var setNameReceivedName: String? + var setNameReceivedInvocations: [String] = [] + + var setNameUnderlyingReturnValue: Result! + var setNameReturnValue: Result! { + get { + if Thread.isMainThread { + return setNameUnderlyingReturnValue + } else { + var returnValue: Result? = nil + DispatchQueue.main.sync { + returnValue = setNameUnderlyingReturnValue + } + + return returnValue! + } + } + set { + if Thread.isMainThread { + setNameUnderlyingReturnValue = newValue + } else { + DispatchQueue.main.sync { + setNameUnderlyingReturnValue = newValue + } + } + } + } + var setNameClosure: ((String) async -> Result)? + + func setName(_ name: String) async -> Result { + setNameCallsCount += 1 + setNameReceivedName = name + DispatchQueue.main.async { + self.setNameReceivedInvocations.append(name) + } + if let setNameClosure = setNameClosure { + return await setNameClosure(name) + } else { + return setNameReturnValue + } + } + //MARK: - setTopic + + var setTopicUnderlyingCallsCount = 0 + var setTopicCallsCount: Int { + get { + if Thread.isMainThread { + return setTopicUnderlyingCallsCount + } else { + var returnValue: Int? = nil + DispatchQueue.main.sync { + returnValue = setTopicUnderlyingCallsCount + } + + return returnValue! + } + } + set { + if Thread.isMainThread { + setTopicUnderlyingCallsCount = newValue + } else { + DispatchQueue.main.sync { + setTopicUnderlyingCallsCount = newValue + } + } + } + } + var setTopicCalled: Bool { + return setTopicCallsCount > 0 + } + var setTopicReceivedTopic: String? + var setTopicReceivedInvocations: [String] = [] + + var setTopicUnderlyingReturnValue: Result! + var setTopicReturnValue: Result! { + get { + if Thread.isMainThread { + return setTopicUnderlyingReturnValue + } else { + var returnValue: Result? = nil + DispatchQueue.main.sync { + returnValue = setTopicUnderlyingReturnValue + } + + return returnValue! + } + } + set { + if Thread.isMainThread { + setTopicUnderlyingReturnValue = newValue + } else { + DispatchQueue.main.sync { + setTopicUnderlyingReturnValue = newValue + } + } + } + } + var setTopicClosure: ((String) async -> Result)? + + func setTopic(_ topic: String) async -> Result { + setTopicCallsCount += 1 + setTopicReceivedTopic = topic + DispatchQueue.main.async { + self.setTopicReceivedInvocations.append(topic) + } + if let setTopicClosure = setTopicClosure { + return await setTopicClosure(topic) + } else { + return setTopicReturnValue + } + } + //MARK: - removeAvatar + + var removeAvatarUnderlyingCallsCount = 0 + var removeAvatarCallsCount: Int { + get { + if Thread.isMainThread { + return removeAvatarUnderlyingCallsCount + } else { + var returnValue: Int? = nil + DispatchQueue.main.sync { + returnValue = removeAvatarUnderlyingCallsCount + } + + return returnValue! + } + } + set { + if Thread.isMainThread { + removeAvatarUnderlyingCallsCount = newValue + } else { + DispatchQueue.main.sync { + removeAvatarUnderlyingCallsCount = newValue + } + } + } + } + var removeAvatarCalled: Bool { + return removeAvatarCallsCount > 0 + } + + var removeAvatarUnderlyingReturnValue: Result! + var removeAvatarReturnValue: Result! { + get { + if Thread.isMainThread { + return removeAvatarUnderlyingReturnValue + } else { + var returnValue: Result? = nil + DispatchQueue.main.sync { + returnValue = removeAvatarUnderlyingReturnValue + } + + return returnValue! + } + } + set { + if Thread.isMainThread { + removeAvatarUnderlyingReturnValue = newValue + } else { + DispatchQueue.main.sync { + removeAvatarUnderlyingReturnValue = newValue + } + } + } + } + var removeAvatarClosure: (() async -> Result)? + + func removeAvatar() async -> Result { + removeAvatarCallsCount += 1 + if let removeAvatarClosure = removeAvatarClosure { + return await removeAvatarClosure() + } else { + return removeAvatarReturnValue + } + } + //MARK: - uploadAvatar + + var uploadAvatarMediaUnderlyingCallsCount = 0 + var uploadAvatarMediaCallsCount: Int { + get { + if Thread.isMainThread { + return uploadAvatarMediaUnderlyingCallsCount + } else { + var returnValue: Int? = nil + DispatchQueue.main.sync { + returnValue = uploadAvatarMediaUnderlyingCallsCount + } + + return returnValue! + } + } + set { + if Thread.isMainThread { + uploadAvatarMediaUnderlyingCallsCount = newValue + } else { + DispatchQueue.main.sync { + uploadAvatarMediaUnderlyingCallsCount = newValue + } + } + } + } + var uploadAvatarMediaCalled: Bool { + return uploadAvatarMediaCallsCount > 0 + } + var uploadAvatarMediaReceivedMedia: MediaInfo? + var uploadAvatarMediaReceivedInvocations: [MediaInfo] = [] + + var uploadAvatarMediaUnderlyingReturnValue: Result! + var uploadAvatarMediaReturnValue: Result! { + get { + if Thread.isMainThread { + return uploadAvatarMediaUnderlyingReturnValue + } else { + var returnValue: Result? = nil + DispatchQueue.main.sync { + returnValue = uploadAvatarMediaUnderlyingReturnValue + } + + return returnValue! + } + } + set { + if Thread.isMainThread { + uploadAvatarMediaUnderlyingReturnValue = newValue + } else { + DispatchQueue.main.sync { + uploadAvatarMediaUnderlyingReturnValue = newValue + } + } + } + } + var uploadAvatarMediaClosure: ((MediaInfo) async -> Result)? + + func uploadAvatar(media: MediaInfo) async -> Result { + uploadAvatarMediaCallsCount += 1 + uploadAvatarMediaReceivedMedia = media + DispatchQueue.main.async { + self.uploadAvatarMediaReceivedInvocations.append(media) + } + if let uploadAvatarMediaClosure = uploadAvatarMediaClosure { + return await uploadAvatarMediaClosure(media) + } else { + return uploadAvatarMediaReturnValue + } + } + //MARK: - markAsRead + + var markAsReadReceiptTypeUnderlyingCallsCount = 0 + var markAsReadReceiptTypeCallsCount: Int { + get { + if Thread.isMainThread { + return markAsReadReceiptTypeUnderlyingCallsCount + } else { + var returnValue: Int? = nil + DispatchQueue.main.sync { + returnValue = markAsReadReceiptTypeUnderlyingCallsCount + } + + return returnValue! + } + } + set { + if Thread.isMainThread { + markAsReadReceiptTypeUnderlyingCallsCount = newValue + } else { + DispatchQueue.main.sync { + markAsReadReceiptTypeUnderlyingCallsCount = newValue + } + } + } + } + var markAsReadReceiptTypeCalled: Bool { + return markAsReadReceiptTypeCallsCount > 0 + } + var markAsReadReceiptTypeReceivedReceiptType: ReceiptType? + var markAsReadReceiptTypeReceivedInvocations: [ReceiptType] = [] + + var markAsReadReceiptTypeUnderlyingReturnValue: Result! + var markAsReadReceiptTypeReturnValue: Result! { + get { + if Thread.isMainThread { + return markAsReadReceiptTypeUnderlyingReturnValue + } else { + var returnValue: Result? = nil + DispatchQueue.main.sync { + returnValue = markAsReadReceiptTypeUnderlyingReturnValue + } + + return returnValue! + } + } + set { + if Thread.isMainThread { + markAsReadReceiptTypeUnderlyingReturnValue = newValue + } else { + DispatchQueue.main.sync { + markAsReadReceiptTypeUnderlyingReturnValue = newValue + } + } + } + } + var markAsReadReceiptTypeClosure: ((ReceiptType) async -> Result)? + + func markAsRead(receiptType: ReceiptType) async -> Result { + markAsReadReceiptTypeCallsCount += 1 + markAsReadReceiptTypeReceivedReceiptType = receiptType + DispatchQueue.main.async { + self.markAsReadReceiptTypeReceivedInvocations.append(receiptType) + } + if let markAsReadReceiptTypeClosure = markAsReadReceiptTypeClosure { + return await markAsReadReceiptTypeClosure(receiptType) + } else { + return markAsReadReceiptTypeReturnValue + } + } + //MARK: - edit + + var editEventIDNewContentUnderlyingCallsCount = 0 + var editEventIDNewContentCallsCount: Int { + get { + if Thread.isMainThread { + return editEventIDNewContentUnderlyingCallsCount + } else { + var returnValue: Int? = nil + DispatchQueue.main.sync { + returnValue = editEventIDNewContentUnderlyingCallsCount + } + + return returnValue! + } + } + set { + if Thread.isMainThread { + editEventIDNewContentUnderlyingCallsCount = newValue + } else { + DispatchQueue.main.sync { + editEventIDNewContentUnderlyingCallsCount = newValue + } + } + } + } + var editEventIDNewContentCalled: Bool { + return editEventIDNewContentCallsCount > 0 + } + var editEventIDNewContentReceivedArguments: (eventID: String, newContent: RoomMessageEventContentWithoutRelation)? + var editEventIDNewContentReceivedInvocations: [(eventID: String, newContent: RoomMessageEventContentWithoutRelation)] = [] + + var editEventIDNewContentUnderlyingReturnValue: Result! + var editEventIDNewContentReturnValue: Result! { + get { + if Thread.isMainThread { + return editEventIDNewContentUnderlyingReturnValue + } else { + var returnValue: Result? = nil + DispatchQueue.main.sync { + returnValue = editEventIDNewContentUnderlyingReturnValue + } + + return returnValue! + } + } + set { + if Thread.isMainThread { + editEventIDNewContentUnderlyingReturnValue = newValue + } else { + DispatchQueue.main.sync { + editEventIDNewContentUnderlyingReturnValue = newValue + } + } + } + } + var editEventIDNewContentClosure: ((String, RoomMessageEventContentWithoutRelation) async -> Result)? + + func edit(eventID: String, newContent: RoomMessageEventContentWithoutRelation) async -> Result { + editEventIDNewContentCallsCount += 1 + editEventIDNewContentReceivedArguments = (eventID: eventID, newContent: newContent) + DispatchQueue.main.async { + self.editEventIDNewContentReceivedInvocations.append((eventID: eventID, newContent: newContent)) + } + if let editEventIDNewContentClosure = editEventIDNewContentClosure { + return await editEventIDNewContentClosure(eventID, newContent) + } else { + return editEventIDNewContentReturnValue + } + } + //MARK: - sendTypingNotification + + var sendTypingNotificationIsTypingUnderlyingCallsCount = 0 + var sendTypingNotificationIsTypingCallsCount: Int { + get { + if Thread.isMainThread { + return sendTypingNotificationIsTypingUnderlyingCallsCount + } else { + var returnValue: Int? = nil + DispatchQueue.main.sync { + returnValue = sendTypingNotificationIsTypingUnderlyingCallsCount + } + + return returnValue! + } + } + set { + if Thread.isMainThread { + sendTypingNotificationIsTypingUnderlyingCallsCount = newValue + } else { + DispatchQueue.main.sync { + sendTypingNotificationIsTypingUnderlyingCallsCount = newValue + } + } + } + } + var sendTypingNotificationIsTypingCalled: Bool { + return sendTypingNotificationIsTypingCallsCount > 0 + } + var sendTypingNotificationIsTypingReceivedIsTyping: Bool? + var sendTypingNotificationIsTypingReceivedInvocations: [Bool] = [] + + var sendTypingNotificationIsTypingUnderlyingReturnValue: Result! + var sendTypingNotificationIsTypingReturnValue: Result! { + get { + if Thread.isMainThread { + return sendTypingNotificationIsTypingUnderlyingReturnValue + } else { + var returnValue: Result? = nil + DispatchQueue.main.sync { + returnValue = sendTypingNotificationIsTypingUnderlyingReturnValue + } + + return returnValue! + } + } + set { + if Thread.isMainThread { + sendTypingNotificationIsTypingUnderlyingReturnValue = newValue + } else { + DispatchQueue.main.sync { + sendTypingNotificationIsTypingUnderlyingReturnValue = newValue + } + } + } + } + var sendTypingNotificationIsTypingClosure: ((Bool) async -> Result)? + + @discardableResult + func sendTypingNotification(isTyping: Bool) async -> Result { + sendTypingNotificationIsTypingCallsCount += 1 + sendTypingNotificationIsTypingReceivedIsTyping = isTyping + DispatchQueue.main.async { + self.sendTypingNotificationIsTypingReceivedInvocations.append(isTyping) + } + if let sendTypingNotificationIsTypingClosure = sendTypingNotificationIsTypingClosure { + return await sendTypingNotificationIsTypingClosure(isTyping) + } else { + return sendTypingNotificationIsTypingReturnValue + } + } + //MARK: - flagAsUnread + + var flagAsUnreadUnderlyingCallsCount = 0 + var flagAsUnreadCallsCount: Int { + get { + if Thread.isMainThread { + return flagAsUnreadUnderlyingCallsCount + } else { + var returnValue: Int? = nil + DispatchQueue.main.sync { + returnValue = flagAsUnreadUnderlyingCallsCount + } + + return returnValue! + } + } + set { + if Thread.isMainThread { + flagAsUnreadUnderlyingCallsCount = newValue + } else { + DispatchQueue.main.sync { + flagAsUnreadUnderlyingCallsCount = newValue + } + } + } + } + var flagAsUnreadCalled: Bool { + return flagAsUnreadCallsCount > 0 + } + var flagAsUnreadReceivedIsUnread: Bool? + var flagAsUnreadReceivedInvocations: [Bool] = [] + + var flagAsUnreadUnderlyingReturnValue: Result! + var flagAsUnreadReturnValue: Result! { + get { + if Thread.isMainThread { + return flagAsUnreadUnderlyingReturnValue + } else { + var returnValue: Result? = nil + DispatchQueue.main.sync { + returnValue = flagAsUnreadUnderlyingReturnValue + } + + return returnValue! + } + } + set { + if Thread.isMainThread { + flagAsUnreadUnderlyingReturnValue = newValue + } else { + DispatchQueue.main.sync { + flagAsUnreadUnderlyingReturnValue = newValue + } + } + } + } + var flagAsUnreadClosure: ((Bool) async -> Result)? + + func flagAsUnread(_ isUnread: Bool) async -> Result { + flagAsUnreadCallsCount += 1 + flagAsUnreadReceivedIsUnread = isUnread + DispatchQueue.main.async { + self.flagAsUnreadReceivedInvocations.append(isUnread) + } + if let flagAsUnreadClosure = flagAsUnreadClosure { + return await flagAsUnreadClosure(isUnread) + } else { + return flagAsUnreadReturnValue + } + } + //MARK: - flagAsFavourite + + var flagAsFavouriteUnderlyingCallsCount = 0 + var flagAsFavouriteCallsCount: Int { + get { + if Thread.isMainThread { + return flagAsFavouriteUnderlyingCallsCount + } else { + var returnValue: Int? = nil + DispatchQueue.main.sync { + returnValue = flagAsFavouriteUnderlyingCallsCount + } + + return returnValue! + } + } + set { + if Thread.isMainThread { + flagAsFavouriteUnderlyingCallsCount = newValue + } else { + DispatchQueue.main.sync { + flagAsFavouriteUnderlyingCallsCount = newValue + } + } + } + } + var flagAsFavouriteCalled: Bool { + return flagAsFavouriteCallsCount > 0 + } + var flagAsFavouriteReceivedIsFavourite: Bool? + var flagAsFavouriteReceivedInvocations: [Bool] = [] + + var flagAsFavouriteUnderlyingReturnValue: Result! + var flagAsFavouriteReturnValue: Result! { + get { + if Thread.isMainThread { + return flagAsFavouriteUnderlyingReturnValue + } else { + var returnValue: Result? = nil + DispatchQueue.main.sync { + returnValue = flagAsFavouriteUnderlyingReturnValue + } + + return returnValue! + } + } + set { + if Thread.isMainThread { + flagAsFavouriteUnderlyingReturnValue = newValue + } else { + DispatchQueue.main.sync { + flagAsFavouriteUnderlyingReturnValue = newValue + } + } + } + } + var flagAsFavouriteClosure: ((Bool) async -> Result)? + + func flagAsFavourite(_ isFavourite: Bool) async -> Result { + flagAsFavouriteCallsCount += 1 + flagAsFavouriteReceivedIsFavourite = isFavourite + DispatchQueue.main.async { + self.flagAsFavouriteReceivedInvocations.append(isFavourite) + } + if let flagAsFavouriteClosure = flagAsFavouriteClosure { + return await flagAsFavouriteClosure(isFavourite) + } else { + return flagAsFavouriteReturnValue + } + } + //MARK: - powerLevels + + var powerLevelsUnderlyingCallsCount = 0 + var powerLevelsCallsCount: Int { + get { + if Thread.isMainThread { + return powerLevelsUnderlyingCallsCount + } else { + var returnValue: Int? = nil + DispatchQueue.main.sync { + returnValue = powerLevelsUnderlyingCallsCount + } + + return returnValue! + } + } + set { + if Thread.isMainThread { + powerLevelsUnderlyingCallsCount = newValue + } else { + DispatchQueue.main.sync { + powerLevelsUnderlyingCallsCount = newValue + } + } + } + } + var powerLevelsCalled: Bool { + return powerLevelsCallsCount > 0 + } + + var powerLevelsUnderlyingReturnValue: Result! + var powerLevelsReturnValue: Result! { + get { + if Thread.isMainThread { + return powerLevelsUnderlyingReturnValue + } else { + var returnValue: Result? = nil + DispatchQueue.main.sync { + returnValue = powerLevelsUnderlyingReturnValue + } + + return returnValue! + } + } + set { + if Thread.isMainThread { + powerLevelsUnderlyingReturnValue = newValue + } else { + DispatchQueue.main.sync { + powerLevelsUnderlyingReturnValue = newValue + } + } + } + } + var powerLevelsClosure: (() async -> Result)? + + func powerLevels() async -> Result { + powerLevelsCallsCount += 1 + if let powerLevelsClosure = powerLevelsClosure { + return await powerLevelsClosure() + } else { + return powerLevelsReturnValue + } + } + //MARK: - applyPowerLevelChanges + + var applyPowerLevelChangesUnderlyingCallsCount = 0 + var applyPowerLevelChangesCallsCount: Int { + get { + if Thread.isMainThread { + return applyPowerLevelChangesUnderlyingCallsCount + } else { + var returnValue: Int? = nil + DispatchQueue.main.sync { + returnValue = applyPowerLevelChangesUnderlyingCallsCount + } + + return returnValue! + } + } + set { + if Thread.isMainThread { + applyPowerLevelChangesUnderlyingCallsCount = newValue + } else { + DispatchQueue.main.sync { + applyPowerLevelChangesUnderlyingCallsCount = newValue + } + } + } + } + var applyPowerLevelChangesCalled: Bool { + return applyPowerLevelChangesCallsCount > 0 + } + var applyPowerLevelChangesReceivedChanges: RoomPowerLevelChanges? + var applyPowerLevelChangesReceivedInvocations: [RoomPowerLevelChanges] = [] + + var applyPowerLevelChangesUnderlyingReturnValue: Result! + var applyPowerLevelChangesReturnValue: Result! { + get { + if Thread.isMainThread { + return applyPowerLevelChangesUnderlyingReturnValue + } else { + var returnValue: Result? = nil + DispatchQueue.main.sync { + returnValue = applyPowerLevelChangesUnderlyingReturnValue + } + + return returnValue! + } + } + set { + if Thread.isMainThread { + applyPowerLevelChangesUnderlyingReturnValue = newValue + } else { + DispatchQueue.main.sync { + applyPowerLevelChangesUnderlyingReturnValue = newValue + } + } + } + } + var applyPowerLevelChangesClosure: ((RoomPowerLevelChanges) async -> Result)? + + func applyPowerLevelChanges(_ changes: RoomPowerLevelChanges) async -> Result { + applyPowerLevelChangesCallsCount += 1 + applyPowerLevelChangesReceivedChanges = changes + DispatchQueue.main.async { + self.applyPowerLevelChangesReceivedInvocations.append(changes) + } + if let applyPowerLevelChangesClosure = applyPowerLevelChangesClosure { + return await applyPowerLevelChangesClosure(changes) + } else { + return applyPowerLevelChangesReturnValue + } + } + //MARK: - resetPowerLevels + + var resetPowerLevelsUnderlyingCallsCount = 0 + var resetPowerLevelsCallsCount: Int { + get { + if Thread.isMainThread { + return resetPowerLevelsUnderlyingCallsCount + } else { + var returnValue: Int? = nil + DispatchQueue.main.sync { + returnValue = resetPowerLevelsUnderlyingCallsCount + } + + return returnValue! + } + } + set { + if Thread.isMainThread { + resetPowerLevelsUnderlyingCallsCount = newValue + } else { + DispatchQueue.main.sync { + resetPowerLevelsUnderlyingCallsCount = newValue + } + } + } + } + var resetPowerLevelsCalled: Bool { + return resetPowerLevelsCallsCount > 0 + } + + var resetPowerLevelsUnderlyingReturnValue: Result! + var resetPowerLevelsReturnValue: Result! { + get { + if Thread.isMainThread { + return resetPowerLevelsUnderlyingReturnValue + } else { + var returnValue: Result? = nil + DispatchQueue.main.sync { + returnValue = resetPowerLevelsUnderlyingReturnValue + } + + return returnValue! + } + } + set { + if Thread.isMainThread { + resetPowerLevelsUnderlyingReturnValue = newValue + } else { + DispatchQueue.main.sync { + resetPowerLevelsUnderlyingReturnValue = newValue + } + } + } + } + var resetPowerLevelsClosure: (() async -> Result)? + + func resetPowerLevels() async -> Result { + resetPowerLevelsCallsCount += 1 + if let resetPowerLevelsClosure = resetPowerLevelsClosure { + return await resetPowerLevelsClosure() + } else { + return resetPowerLevelsReturnValue + } + } + //MARK: - suggestedRole + + var suggestedRoleForUnderlyingCallsCount = 0 + var suggestedRoleForCallsCount: Int { + get { + if Thread.isMainThread { + return suggestedRoleForUnderlyingCallsCount + } else { + var returnValue: Int? = nil + DispatchQueue.main.sync { + returnValue = suggestedRoleForUnderlyingCallsCount + } + + return returnValue! + } + } + set { + if Thread.isMainThread { + suggestedRoleForUnderlyingCallsCount = newValue + } else { + DispatchQueue.main.sync { + suggestedRoleForUnderlyingCallsCount = newValue + } + } + } + } + var suggestedRoleForCalled: Bool { + return suggestedRoleForCallsCount > 0 + } + var suggestedRoleForReceivedUserID: String? + var suggestedRoleForReceivedInvocations: [String] = [] + + var suggestedRoleForUnderlyingReturnValue: Result! + var suggestedRoleForReturnValue: Result! { + get { + if Thread.isMainThread { + return suggestedRoleForUnderlyingReturnValue + } else { + var returnValue: Result? = nil + DispatchQueue.main.sync { + returnValue = suggestedRoleForUnderlyingReturnValue + } + + return returnValue! + } + } + set { + if Thread.isMainThread { + suggestedRoleForUnderlyingReturnValue = newValue + } else { + DispatchQueue.main.sync { + suggestedRoleForUnderlyingReturnValue = newValue + } + } + } + } + var suggestedRoleForClosure: ((String) async -> Result)? + + func suggestedRole(for userID: String) async -> Result { + suggestedRoleForCallsCount += 1 + suggestedRoleForReceivedUserID = userID + DispatchQueue.main.async { + self.suggestedRoleForReceivedInvocations.append(userID) + } + if let suggestedRoleForClosure = suggestedRoleForClosure { + return await suggestedRoleForClosure(userID) + } else { + return suggestedRoleForReturnValue + } + } + //MARK: - updatePowerLevelsForUsers + + var updatePowerLevelsForUsersUnderlyingCallsCount = 0 + var updatePowerLevelsForUsersCallsCount: Int { + get { + if Thread.isMainThread { + return updatePowerLevelsForUsersUnderlyingCallsCount + } else { + var returnValue: Int? = nil + DispatchQueue.main.sync { + returnValue = updatePowerLevelsForUsersUnderlyingCallsCount + } + + return returnValue! + } + } + set { + if Thread.isMainThread { + updatePowerLevelsForUsersUnderlyingCallsCount = newValue + } else { + DispatchQueue.main.sync { + updatePowerLevelsForUsersUnderlyingCallsCount = newValue + } + } + } + } + var updatePowerLevelsForUsersCalled: Bool { + return updatePowerLevelsForUsersCallsCount > 0 + } + var updatePowerLevelsForUsersReceivedUpdates: [(userID: String, powerLevel: Int64)]? + var updatePowerLevelsForUsersReceivedInvocations: [[(userID: String, powerLevel: Int64)]] = [] + + var updatePowerLevelsForUsersUnderlyingReturnValue: Result! + var updatePowerLevelsForUsersReturnValue: Result! { + get { + if Thread.isMainThread { + return updatePowerLevelsForUsersUnderlyingReturnValue + } else { + var returnValue: Result? = nil + DispatchQueue.main.sync { + returnValue = updatePowerLevelsForUsersUnderlyingReturnValue + } + + return returnValue! + } + } + set { + if Thread.isMainThread { + updatePowerLevelsForUsersUnderlyingReturnValue = newValue + } else { + DispatchQueue.main.sync { + updatePowerLevelsForUsersUnderlyingReturnValue = newValue + } + } + } + } + var updatePowerLevelsForUsersClosure: (([(userID: String, powerLevel: Int64)]) async -> Result)? + + func updatePowerLevelsForUsers(_ updates: [(userID: String, powerLevel: Int64)]) async -> Result { + updatePowerLevelsForUsersCallsCount += 1 + updatePowerLevelsForUsersReceivedUpdates = updates + DispatchQueue.main.async { + self.updatePowerLevelsForUsersReceivedInvocations.append(updates) + } + if let updatePowerLevelsForUsersClosure = updatePowerLevelsForUsersClosure { + return await updatePowerLevelsForUsersClosure(updates) + } else { + return updatePowerLevelsForUsersReturnValue + } + } + //MARK: - canUser + + var canUserUserIDSendStateEventUnderlyingCallsCount = 0 + var canUserUserIDSendStateEventCallsCount: Int { + get { + if Thread.isMainThread { + return canUserUserIDSendStateEventUnderlyingCallsCount + } else { + var returnValue: Int? = nil + DispatchQueue.main.sync { + returnValue = canUserUserIDSendStateEventUnderlyingCallsCount + } + + return returnValue! + } + } + set { + if Thread.isMainThread { + canUserUserIDSendStateEventUnderlyingCallsCount = newValue + } else { + DispatchQueue.main.sync { + canUserUserIDSendStateEventUnderlyingCallsCount = newValue + } + } + } + } + var canUserUserIDSendStateEventCalled: Bool { + return canUserUserIDSendStateEventCallsCount > 0 + } + var canUserUserIDSendStateEventReceivedArguments: (userID: String, event: StateEventType)? + var canUserUserIDSendStateEventReceivedInvocations: [(userID: String, event: StateEventType)] = [] + + var canUserUserIDSendStateEventUnderlyingReturnValue: Result! + var canUserUserIDSendStateEventReturnValue: Result! { + get { + if Thread.isMainThread { + return canUserUserIDSendStateEventUnderlyingReturnValue + } else { + var returnValue: Result? = nil + DispatchQueue.main.sync { + returnValue = canUserUserIDSendStateEventUnderlyingReturnValue + } + + return returnValue! + } + } + set { + if Thread.isMainThread { + canUserUserIDSendStateEventUnderlyingReturnValue = newValue + } else { + DispatchQueue.main.sync { + canUserUserIDSendStateEventUnderlyingReturnValue = newValue + } + } + } + } + var canUserUserIDSendStateEventClosure: ((String, StateEventType) async -> Result)? + + func canUser(userID: String, sendStateEvent event: StateEventType) async -> Result { + canUserUserIDSendStateEventCallsCount += 1 + canUserUserIDSendStateEventReceivedArguments = (userID: userID, event: event) + DispatchQueue.main.async { + self.canUserUserIDSendStateEventReceivedInvocations.append((userID: userID, event: event)) + } + if let canUserUserIDSendStateEventClosure = canUserUserIDSendStateEventClosure { + return await canUserUserIDSendStateEventClosure(userID, event) + } else { + return canUserUserIDSendStateEventReturnValue + } + } + //MARK: - canUserInvite + + var canUserInviteUserIDUnderlyingCallsCount = 0 + var canUserInviteUserIDCallsCount: Int { + get { + if Thread.isMainThread { + return canUserInviteUserIDUnderlyingCallsCount + } else { + var returnValue: Int? = nil + DispatchQueue.main.sync { + returnValue = canUserInviteUserIDUnderlyingCallsCount + } + + return returnValue! + } + } + set { + if Thread.isMainThread { + canUserInviteUserIDUnderlyingCallsCount = newValue + } else { + DispatchQueue.main.sync { + canUserInviteUserIDUnderlyingCallsCount = newValue + } + } + } + } + var canUserInviteUserIDCalled: Bool { + return canUserInviteUserIDCallsCount > 0 + } + var canUserInviteUserIDReceivedUserID: String? + var canUserInviteUserIDReceivedInvocations: [String] = [] + + var canUserInviteUserIDUnderlyingReturnValue: Result! + var canUserInviteUserIDReturnValue: Result! { + get { + if Thread.isMainThread { + return canUserInviteUserIDUnderlyingReturnValue + } else { + var returnValue: Result? = nil + DispatchQueue.main.sync { + returnValue = canUserInviteUserIDUnderlyingReturnValue + } + + return returnValue! + } + } + set { + if Thread.isMainThread { + canUserInviteUserIDUnderlyingReturnValue = newValue + } else { + DispatchQueue.main.sync { + canUserInviteUserIDUnderlyingReturnValue = newValue + } + } + } + } + var canUserInviteUserIDClosure: ((String) async -> Result)? + + func canUserInvite(userID: String) async -> Result { + canUserInviteUserIDCallsCount += 1 + canUserInviteUserIDReceivedUserID = userID + DispatchQueue.main.async { + self.canUserInviteUserIDReceivedInvocations.append(userID) + } + if let canUserInviteUserIDClosure = canUserInviteUserIDClosure { + return await canUserInviteUserIDClosure(userID) + } else { + return canUserInviteUserIDReturnValue + } + } + //MARK: - canUserRedactOther + + var canUserRedactOtherUserIDUnderlyingCallsCount = 0 + var canUserRedactOtherUserIDCallsCount: Int { + get { + if Thread.isMainThread { + return canUserRedactOtherUserIDUnderlyingCallsCount + } else { + var returnValue: Int? = nil + DispatchQueue.main.sync { + returnValue = canUserRedactOtherUserIDUnderlyingCallsCount + } + + return returnValue! + } + } + set { + if Thread.isMainThread { + canUserRedactOtherUserIDUnderlyingCallsCount = newValue + } else { + DispatchQueue.main.sync { + canUserRedactOtherUserIDUnderlyingCallsCount = newValue + } + } + } + } + var canUserRedactOtherUserIDCalled: Bool { + return canUserRedactOtherUserIDCallsCount > 0 + } + var canUserRedactOtherUserIDReceivedUserID: String? + var canUserRedactOtherUserIDReceivedInvocations: [String] = [] + + var canUserRedactOtherUserIDUnderlyingReturnValue: Result! + var canUserRedactOtherUserIDReturnValue: Result! { + get { + if Thread.isMainThread { + return canUserRedactOtherUserIDUnderlyingReturnValue + } else { + var returnValue: Result? = nil + DispatchQueue.main.sync { + returnValue = canUserRedactOtherUserIDUnderlyingReturnValue + } + + return returnValue! + } + } + set { + if Thread.isMainThread { + canUserRedactOtherUserIDUnderlyingReturnValue = newValue + } else { + DispatchQueue.main.sync { + canUserRedactOtherUserIDUnderlyingReturnValue = newValue + } + } + } + } + var canUserRedactOtherUserIDClosure: ((String) async -> Result)? + + func canUserRedactOther(userID: String) async -> Result { + canUserRedactOtherUserIDCallsCount += 1 + canUserRedactOtherUserIDReceivedUserID = userID + DispatchQueue.main.async { + self.canUserRedactOtherUserIDReceivedInvocations.append(userID) + } + if let canUserRedactOtherUserIDClosure = canUserRedactOtherUserIDClosure { + return await canUserRedactOtherUserIDClosure(userID) + } else { + return canUserRedactOtherUserIDReturnValue + } + } + //MARK: - canUserRedactOwn + + var canUserRedactOwnUserIDUnderlyingCallsCount = 0 + var canUserRedactOwnUserIDCallsCount: Int { + get { + if Thread.isMainThread { + return canUserRedactOwnUserIDUnderlyingCallsCount + } else { + var returnValue: Int? = nil + DispatchQueue.main.sync { + returnValue = canUserRedactOwnUserIDUnderlyingCallsCount + } + + return returnValue! + } + } + set { + if Thread.isMainThread { + canUserRedactOwnUserIDUnderlyingCallsCount = newValue + } else { + DispatchQueue.main.sync { + canUserRedactOwnUserIDUnderlyingCallsCount = newValue + } + } + } + } + var canUserRedactOwnUserIDCalled: Bool { + return canUserRedactOwnUserIDCallsCount > 0 + } + var canUserRedactOwnUserIDReceivedUserID: String? + var canUserRedactOwnUserIDReceivedInvocations: [String] = [] + + var canUserRedactOwnUserIDUnderlyingReturnValue: Result! + var canUserRedactOwnUserIDReturnValue: Result! { + get { + if Thread.isMainThread { + return canUserRedactOwnUserIDUnderlyingReturnValue + } else { + var returnValue: Result? = nil + DispatchQueue.main.sync { + returnValue = canUserRedactOwnUserIDUnderlyingReturnValue + } + + return returnValue! + } + } + set { + if Thread.isMainThread { + canUserRedactOwnUserIDUnderlyingReturnValue = newValue + } else { + DispatchQueue.main.sync { + canUserRedactOwnUserIDUnderlyingReturnValue = newValue + } + } + } + } + var canUserRedactOwnUserIDClosure: ((String) async -> Result)? + + func canUserRedactOwn(userID: String) async -> Result { + canUserRedactOwnUserIDCallsCount += 1 + canUserRedactOwnUserIDReceivedUserID = userID + DispatchQueue.main.async { + self.canUserRedactOwnUserIDReceivedInvocations.append(userID) + } + if let canUserRedactOwnUserIDClosure = canUserRedactOwnUserIDClosure { + return await canUserRedactOwnUserIDClosure(userID) + } else { + return canUserRedactOwnUserIDReturnValue + } + } + //MARK: - canUserKick + + var canUserKickUserIDUnderlyingCallsCount = 0 + var canUserKickUserIDCallsCount: Int { + get { + if Thread.isMainThread { + return canUserKickUserIDUnderlyingCallsCount + } else { + var returnValue: Int? = nil + DispatchQueue.main.sync { + returnValue = canUserKickUserIDUnderlyingCallsCount + } + + return returnValue! + } + } + set { + if Thread.isMainThread { + canUserKickUserIDUnderlyingCallsCount = newValue + } else { + DispatchQueue.main.sync { + canUserKickUserIDUnderlyingCallsCount = newValue + } + } + } + } + var canUserKickUserIDCalled: Bool { + return canUserKickUserIDCallsCount > 0 + } + var canUserKickUserIDReceivedUserID: String? + var canUserKickUserIDReceivedInvocations: [String] = [] + + var canUserKickUserIDUnderlyingReturnValue: Result! + var canUserKickUserIDReturnValue: Result! { + get { + if Thread.isMainThread { + return canUserKickUserIDUnderlyingReturnValue + } else { + var returnValue: Result? = nil + DispatchQueue.main.sync { + returnValue = canUserKickUserIDUnderlyingReturnValue + } + + return returnValue! + } + } + set { + if Thread.isMainThread { + canUserKickUserIDUnderlyingReturnValue = newValue + } else { + DispatchQueue.main.sync { + canUserKickUserIDUnderlyingReturnValue = newValue + } + } + } + } + var canUserKickUserIDClosure: ((String) async -> Result)? + + func canUserKick(userID: String) async -> Result { + canUserKickUserIDCallsCount += 1 + canUserKickUserIDReceivedUserID = userID + DispatchQueue.main.async { + self.canUserKickUserIDReceivedInvocations.append(userID) + } + if let canUserKickUserIDClosure = canUserKickUserIDClosure { + return await canUserKickUserIDClosure(userID) + } else { + return canUserKickUserIDReturnValue + } + } + //MARK: - canUserBan + + var canUserBanUserIDUnderlyingCallsCount = 0 + var canUserBanUserIDCallsCount: Int { + get { + if Thread.isMainThread { + return canUserBanUserIDUnderlyingCallsCount + } else { + var returnValue: Int? = nil + DispatchQueue.main.sync { + returnValue = canUserBanUserIDUnderlyingCallsCount + } + + return returnValue! + } + } + set { + if Thread.isMainThread { + canUserBanUserIDUnderlyingCallsCount = newValue + } else { + DispatchQueue.main.sync { + canUserBanUserIDUnderlyingCallsCount = newValue + } + } + } + } + var canUserBanUserIDCalled: Bool { + return canUserBanUserIDCallsCount > 0 + } + var canUserBanUserIDReceivedUserID: String? + var canUserBanUserIDReceivedInvocations: [String] = [] + + var canUserBanUserIDUnderlyingReturnValue: Result! + var canUserBanUserIDReturnValue: Result! { + get { + if Thread.isMainThread { + return canUserBanUserIDUnderlyingReturnValue + } else { + var returnValue: Result? = nil + DispatchQueue.main.sync { + returnValue = canUserBanUserIDUnderlyingReturnValue + } + + return returnValue! + } + } + set { + if Thread.isMainThread { + canUserBanUserIDUnderlyingReturnValue = newValue + } else { + DispatchQueue.main.sync { + canUserBanUserIDUnderlyingReturnValue = newValue + } + } + } + } + var canUserBanUserIDClosure: ((String) async -> Result)? + + func canUserBan(userID: String) async -> Result { + canUserBanUserIDCallsCount += 1 + canUserBanUserIDReceivedUserID = userID + DispatchQueue.main.async { + self.canUserBanUserIDReceivedInvocations.append(userID) + } + if let canUserBanUserIDClosure = canUserBanUserIDClosure { + return await canUserBanUserIDClosure(userID) + } else { + return canUserBanUserIDReturnValue + } + } + //MARK: - canUserTriggerRoomNotification + + var canUserTriggerRoomNotificationUserIDUnderlyingCallsCount = 0 + var canUserTriggerRoomNotificationUserIDCallsCount: Int { + get { + if Thread.isMainThread { + return canUserTriggerRoomNotificationUserIDUnderlyingCallsCount + } else { + var returnValue: Int? = nil + DispatchQueue.main.sync { + returnValue = canUserTriggerRoomNotificationUserIDUnderlyingCallsCount + } + + return returnValue! + } + } + set { + if Thread.isMainThread { + canUserTriggerRoomNotificationUserIDUnderlyingCallsCount = newValue + } else { + DispatchQueue.main.sync { + canUserTriggerRoomNotificationUserIDUnderlyingCallsCount = newValue + } + } + } + } + var canUserTriggerRoomNotificationUserIDCalled: Bool { + return canUserTriggerRoomNotificationUserIDCallsCount > 0 + } + var canUserTriggerRoomNotificationUserIDReceivedUserID: String? + var canUserTriggerRoomNotificationUserIDReceivedInvocations: [String] = [] + + var canUserTriggerRoomNotificationUserIDUnderlyingReturnValue: Result! + var canUserTriggerRoomNotificationUserIDReturnValue: Result! { + get { + if Thread.isMainThread { + return canUserTriggerRoomNotificationUserIDUnderlyingReturnValue + } else { + var returnValue: Result? = nil + DispatchQueue.main.sync { + returnValue = canUserTriggerRoomNotificationUserIDUnderlyingReturnValue + } + + return returnValue! + } + } + set { + if Thread.isMainThread { + canUserTriggerRoomNotificationUserIDUnderlyingReturnValue = newValue + } else { + DispatchQueue.main.sync { + canUserTriggerRoomNotificationUserIDUnderlyingReturnValue = newValue + } + } + } + } + var canUserTriggerRoomNotificationUserIDClosure: ((String) async -> Result)? + + func canUserTriggerRoomNotification(userID: String) async -> Result { + canUserTriggerRoomNotificationUserIDCallsCount += 1 + canUserTriggerRoomNotificationUserIDReceivedUserID = userID + DispatchQueue.main.async { + self.canUserTriggerRoomNotificationUserIDReceivedInvocations.append(userID) + } + if let canUserTriggerRoomNotificationUserIDClosure = canUserTriggerRoomNotificationUserIDClosure { + return await canUserTriggerRoomNotificationUserIDClosure(userID) + } else { + return canUserTriggerRoomNotificationUserIDReturnValue + } + } + //MARK: - canUserPinOrUnpin + + var canUserPinOrUnpinUserIDUnderlyingCallsCount = 0 + var canUserPinOrUnpinUserIDCallsCount: Int { + get { + if Thread.isMainThread { + return canUserPinOrUnpinUserIDUnderlyingCallsCount + } else { + var returnValue: Int? = nil + DispatchQueue.main.sync { + returnValue = canUserPinOrUnpinUserIDUnderlyingCallsCount + } + + return returnValue! + } + } + set { + if Thread.isMainThread { + canUserPinOrUnpinUserIDUnderlyingCallsCount = newValue + } else { + DispatchQueue.main.sync { + canUserPinOrUnpinUserIDUnderlyingCallsCount = newValue + } + } + } + } + var canUserPinOrUnpinUserIDCalled: Bool { + return canUserPinOrUnpinUserIDCallsCount > 0 + } + var canUserPinOrUnpinUserIDReceivedUserID: String? + var canUserPinOrUnpinUserIDReceivedInvocations: [String] = [] + + var canUserPinOrUnpinUserIDUnderlyingReturnValue: Result! + var canUserPinOrUnpinUserIDReturnValue: Result! { + get { + if Thread.isMainThread { + return canUserPinOrUnpinUserIDUnderlyingReturnValue + } else { + var returnValue: Result? = nil + DispatchQueue.main.sync { + returnValue = canUserPinOrUnpinUserIDUnderlyingReturnValue + } + + return returnValue! + } + } + set { + if Thread.isMainThread { + canUserPinOrUnpinUserIDUnderlyingReturnValue = newValue + } else { + DispatchQueue.main.sync { + canUserPinOrUnpinUserIDUnderlyingReturnValue = newValue + } + } + } + } + var canUserPinOrUnpinUserIDClosure: ((String) async -> Result)? + + func canUserPinOrUnpin(userID: String) async -> Result { + canUserPinOrUnpinUserIDCallsCount += 1 + canUserPinOrUnpinUserIDReceivedUserID = userID + DispatchQueue.main.async { + self.canUserPinOrUnpinUserIDReceivedInvocations.append(userID) + } + if let canUserPinOrUnpinUserIDClosure = canUserPinOrUnpinUserIDClosure { + return await canUserPinOrUnpinUserIDClosure(userID) + } else { + return canUserPinOrUnpinUserIDReturnValue + } + } + //MARK: - kickUser + + var kickUserUnderlyingCallsCount = 0 + var kickUserCallsCount: Int { + get { + if Thread.isMainThread { + return kickUserUnderlyingCallsCount + } else { + var returnValue: Int? = nil + DispatchQueue.main.sync { + returnValue = kickUserUnderlyingCallsCount + } + + return returnValue! + } + } + set { + if Thread.isMainThread { + kickUserUnderlyingCallsCount = newValue + } else { + DispatchQueue.main.sync { + kickUserUnderlyingCallsCount = newValue + } + } + } + } + var kickUserCalled: Bool { + return kickUserCallsCount > 0 + } + var kickUserReceivedUserID: String? + var kickUserReceivedInvocations: [String] = [] + + var kickUserUnderlyingReturnValue: Result! + var kickUserReturnValue: Result! { + get { + if Thread.isMainThread { + return kickUserUnderlyingReturnValue + } else { + var returnValue: Result? = nil + DispatchQueue.main.sync { + returnValue = kickUserUnderlyingReturnValue + } + + return returnValue! + } + } + set { + if Thread.isMainThread { + kickUserUnderlyingReturnValue = newValue + } else { + DispatchQueue.main.sync { + kickUserUnderlyingReturnValue = newValue + } + } + } + } + var kickUserClosure: ((String) async -> Result)? + + func kickUser(_ userID: String) async -> Result { + kickUserCallsCount += 1 + kickUserReceivedUserID = userID + DispatchQueue.main.async { + self.kickUserReceivedInvocations.append(userID) + } + if let kickUserClosure = kickUserClosure { + return await kickUserClosure(userID) + } else { + return kickUserReturnValue + } + } + //MARK: - banUser + + var banUserUnderlyingCallsCount = 0 + var banUserCallsCount: Int { + get { + if Thread.isMainThread { + return banUserUnderlyingCallsCount + } else { + var returnValue: Int? = nil + DispatchQueue.main.sync { + returnValue = banUserUnderlyingCallsCount + } + + return returnValue! + } + } + set { + if Thread.isMainThread { + banUserUnderlyingCallsCount = newValue + } else { + DispatchQueue.main.sync { + banUserUnderlyingCallsCount = newValue + } + } + } + } + var banUserCalled: Bool { + return banUserCallsCount > 0 + } + var banUserReceivedUserID: String? + var banUserReceivedInvocations: [String] = [] + + var banUserUnderlyingReturnValue: Result! + var banUserReturnValue: Result! { + get { + if Thread.isMainThread { + return banUserUnderlyingReturnValue + } else { + var returnValue: Result? = nil + DispatchQueue.main.sync { + returnValue = banUserUnderlyingReturnValue + } + + return returnValue! + } + } + set { + if Thread.isMainThread { + banUserUnderlyingReturnValue = newValue + } else { + DispatchQueue.main.sync { + banUserUnderlyingReturnValue = newValue + } + } + } + } + var banUserClosure: ((String) async -> Result)? + + func banUser(_ userID: String) async -> Result { + banUserCallsCount += 1 + banUserReceivedUserID = userID + DispatchQueue.main.async { + self.banUserReceivedInvocations.append(userID) + } + if let banUserClosure = banUserClosure { + return await banUserClosure(userID) + } else { + return banUserReturnValue + } + } + //MARK: - unbanUser + + var unbanUserUnderlyingCallsCount = 0 + var unbanUserCallsCount: Int { + get { + if Thread.isMainThread { + return unbanUserUnderlyingCallsCount + } else { + var returnValue: Int? = nil + DispatchQueue.main.sync { + returnValue = unbanUserUnderlyingCallsCount + } + + return returnValue! + } + } + set { + if Thread.isMainThread { + unbanUserUnderlyingCallsCount = newValue + } else { + DispatchQueue.main.sync { + unbanUserUnderlyingCallsCount = newValue + } + } + } + } + var unbanUserCalled: Bool { + return unbanUserCallsCount > 0 + } + var unbanUserReceivedUserID: String? + var unbanUserReceivedInvocations: [String] = [] + + var unbanUserUnderlyingReturnValue: Result! + var unbanUserReturnValue: Result! { + get { + if Thread.isMainThread { + return unbanUserUnderlyingReturnValue + } else { + var returnValue: Result? = nil + DispatchQueue.main.sync { + returnValue = unbanUserUnderlyingReturnValue + } + + return returnValue! + } + } + set { + if Thread.isMainThread { + unbanUserUnderlyingReturnValue = newValue + } else { + DispatchQueue.main.sync { + unbanUserUnderlyingReturnValue = newValue + } + } + } + } + var unbanUserClosure: ((String) async -> Result)? + + func unbanUser(_ userID: String) async -> Result { + unbanUserCallsCount += 1 + unbanUserReceivedUserID = userID + DispatchQueue.main.async { + self.unbanUserReceivedInvocations.append(userID) + } + if let unbanUserClosure = unbanUserClosure { + return await unbanUserClosure(userID) + } else { + return unbanUserReturnValue + } + } + //MARK: - canUserJoinCall + + var canUserJoinCallUserIDUnderlyingCallsCount = 0 + var canUserJoinCallUserIDCallsCount: Int { + get { + if Thread.isMainThread { + return canUserJoinCallUserIDUnderlyingCallsCount + } else { + var returnValue: Int? = nil + DispatchQueue.main.sync { + returnValue = canUserJoinCallUserIDUnderlyingCallsCount + } + + return returnValue! + } + } + set { + if Thread.isMainThread { + canUserJoinCallUserIDUnderlyingCallsCount = newValue + } else { + DispatchQueue.main.sync { + canUserJoinCallUserIDUnderlyingCallsCount = newValue + } + } + } + } + var canUserJoinCallUserIDCalled: Bool { + return canUserJoinCallUserIDCallsCount > 0 + } + var canUserJoinCallUserIDReceivedUserID: String? + var canUserJoinCallUserIDReceivedInvocations: [String] = [] + + var canUserJoinCallUserIDUnderlyingReturnValue: Result! + var canUserJoinCallUserIDReturnValue: Result! { + get { + if Thread.isMainThread { + return canUserJoinCallUserIDUnderlyingReturnValue + } else { + var returnValue: Result? = nil + DispatchQueue.main.sync { + returnValue = canUserJoinCallUserIDUnderlyingReturnValue + } + + return returnValue! + } + } + set { + if Thread.isMainThread { + canUserJoinCallUserIDUnderlyingReturnValue = newValue + } else { + DispatchQueue.main.sync { + canUserJoinCallUserIDUnderlyingReturnValue = newValue + } + } + } + } + var canUserJoinCallUserIDClosure: ((String) async -> Result)? + + func canUserJoinCall(userID: String) async -> Result { + canUserJoinCallUserIDCallsCount += 1 + canUserJoinCallUserIDReceivedUserID = userID + DispatchQueue.main.async { + self.canUserJoinCallUserIDReceivedInvocations.append(userID) + } + if let canUserJoinCallUserIDClosure = canUserJoinCallUserIDClosure { + return await canUserJoinCallUserIDClosure(userID) + } else { + return canUserJoinCallUserIDReturnValue + } + } + //MARK: - elementCallWidgetDriver + + var elementCallWidgetDriverDeviceIDUnderlyingCallsCount = 0 + var elementCallWidgetDriverDeviceIDCallsCount: Int { + get { + if Thread.isMainThread { + return elementCallWidgetDriverDeviceIDUnderlyingCallsCount + } else { + var returnValue: Int? = nil + DispatchQueue.main.sync { + returnValue = elementCallWidgetDriverDeviceIDUnderlyingCallsCount + } + + return returnValue! + } + } + set { + if Thread.isMainThread { + elementCallWidgetDriverDeviceIDUnderlyingCallsCount = newValue + } else { + DispatchQueue.main.sync { + elementCallWidgetDriverDeviceIDUnderlyingCallsCount = newValue + } + } + } + } + var elementCallWidgetDriverDeviceIDCalled: Bool { + return elementCallWidgetDriverDeviceIDCallsCount > 0 + } + var elementCallWidgetDriverDeviceIDReceivedDeviceID: String? + var elementCallWidgetDriverDeviceIDReceivedInvocations: [String] = [] + + var elementCallWidgetDriverDeviceIDUnderlyingReturnValue: ElementCallWidgetDriverProtocol! + var elementCallWidgetDriverDeviceIDReturnValue: ElementCallWidgetDriverProtocol! { + get { + if Thread.isMainThread { + return elementCallWidgetDriverDeviceIDUnderlyingReturnValue + } else { + var returnValue: ElementCallWidgetDriverProtocol? = nil + DispatchQueue.main.sync { + returnValue = elementCallWidgetDriverDeviceIDUnderlyingReturnValue + } + + return returnValue! + } + } + set { + if Thread.isMainThread { + elementCallWidgetDriverDeviceIDUnderlyingReturnValue = newValue + } else { + DispatchQueue.main.sync { + elementCallWidgetDriverDeviceIDUnderlyingReturnValue = newValue + } + } + } + } + var elementCallWidgetDriverDeviceIDClosure: ((String) -> ElementCallWidgetDriverProtocol)? + + func elementCallWidgetDriver(deviceID: String) -> ElementCallWidgetDriverProtocol { + elementCallWidgetDriverDeviceIDCallsCount += 1 + elementCallWidgetDriverDeviceIDReceivedDeviceID = deviceID + DispatchQueue.main.async { + self.elementCallWidgetDriverDeviceIDReceivedInvocations.append(deviceID) + } + if let elementCallWidgetDriverDeviceIDClosure = elementCallWidgetDriverDeviceIDClosure { + return elementCallWidgetDriverDeviceIDClosure(deviceID) + } else { + return elementCallWidgetDriverDeviceIDReturnValue + } + } + //MARK: - sendCallNotificationIfNeeded + + var sendCallNotificationIfNeededUnderlyingCallsCount = 0 + var sendCallNotificationIfNeededCallsCount: Int { + get { + if Thread.isMainThread { + return sendCallNotificationIfNeededUnderlyingCallsCount + } else { + var returnValue: Int? = nil + DispatchQueue.main.sync { + returnValue = sendCallNotificationIfNeededUnderlyingCallsCount + } + + return returnValue! + } + } + set { + if Thread.isMainThread { + sendCallNotificationIfNeededUnderlyingCallsCount = newValue + } else { + DispatchQueue.main.sync { + sendCallNotificationIfNeededUnderlyingCallsCount = newValue + } + } + } + } + var sendCallNotificationIfNeededCalled: Bool { + return sendCallNotificationIfNeededCallsCount > 0 + } + + var sendCallNotificationIfNeededUnderlyingReturnValue: Result! + var sendCallNotificationIfNeededReturnValue: Result! { + get { + if Thread.isMainThread { + return sendCallNotificationIfNeededUnderlyingReturnValue + } else { + var returnValue: Result? = nil + DispatchQueue.main.sync { + returnValue = sendCallNotificationIfNeededUnderlyingReturnValue + } + + return returnValue! + } + } + set { + if Thread.isMainThread { + sendCallNotificationIfNeededUnderlyingReturnValue = newValue + } else { + DispatchQueue.main.sync { + sendCallNotificationIfNeededUnderlyingReturnValue = newValue + } + } + } + } + var sendCallNotificationIfNeededClosure: (() async -> Result)? + + func sendCallNotificationIfNeeded() async -> Result { + sendCallNotificationIfNeededCallsCount += 1 + if let sendCallNotificationIfNeededClosure = sendCallNotificationIfNeededClosure { + return await sendCallNotificationIfNeededClosure() + } else { + return sendCallNotificationIfNeededReturnValue + } + } + //MARK: - matrixToPermalink + + var matrixToPermalinkUnderlyingCallsCount = 0 + var matrixToPermalinkCallsCount: Int { + get { + if Thread.isMainThread { + return matrixToPermalinkUnderlyingCallsCount + } else { + var returnValue: Int? = nil + DispatchQueue.main.sync { + returnValue = matrixToPermalinkUnderlyingCallsCount + } + + return returnValue! + } + } + set { + if Thread.isMainThread { + matrixToPermalinkUnderlyingCallsCount = newValue + } else { + DispatchQueue.main.sync { + matrixToPermalinkUnderlyingCallsCount = newValue + } + } + } + } + var matrixToPermalinkCalled: Bool { + return matrixToPermalinkCallsCount > 0 + } + + var matrixToPermalinkUnderlyingReturnValue: Result! + var matrixToPermalinkReturnValue: Result! { + get { + if Thread.isMainThread { + return matrixToPermalinkUnderlyingReturnValue + } else { + var returnValue: Result? = nil + DispatchQueue.main.sync { + returnValue = matrixToPermalinkUnderlyingReturnValue + } + + return returnValue! + } + } + set { + if Thread.isMainThread { + matrixToPermalinkUnderlyingReturnValue = newValue + } else { + DispatchQueue.main.sync { + matrixToPermalinkUnderlyingReturnValue = newValue + } + } + } + } + var matrixToPermalinkClosure: (() async -> Result)? + + func matrixToPermalink() async -> Result { + matrixToPermalinkCallsCount += 1 + if let matrixToPermalinkClosure = matrixToPermalinkClosure { + return await matrixToPermalinkClosure() + } else { + return matrixToPermalinkReturnValue + } + } + //MARK: - matrixToEventPermalink + + var matrixToEventPermalinkUnderlyingCallsCount = 0 + var matrixToEventPermalinkCallsCount: Int { + get { + if Thread.isMainThread { + return matrixToEventPermalinkUnderlyingCallsCount + } else { + var returnValue: Int? = nil + DispatchQueue.main.sync { + returnValue = matrixToEventPermalinkUnderlyingCallsCount + } + + return returnValue! + } + } + set { + if Thread.isMainThread { + matrixToEventPermalinkUnderlyingCallsCount = newValue + } else { + DispatchQueue.main.sync { + matrixToEventPermalinkUnderlyingCallsCount = newValue + } + } + } + } + var matrixToEventPermalinkCalled: Bool { + return matrixToEventPermalinkCallsCount > 0 + } + var matrixToEventPermalinkReceivedEventID: String? + var matrixToEventPermalinkReceivedInvocations: [String] = [] + + var matrixToEventPermalinkUnderlyingReturnValue: Result! + var matrixToEventPermalinkReturnValue: Result! { + get { + if Thread.isMainThread { + return matrixToEventPermalinkUnderlyingReturnValue + } else { + var returnValue: Result? = nil + DispatchQueue.main.sync { + returnValue = matrixToEventPermalinkUnderlyingReturnValue + } + + return returnValue! + } + } + set { + if Thread.isMainThread { + matrixToEventPermalinkUnderlyingReturnValue = newValue + } else { + DispatchQueue.main.sync { + matrixToEventPermalinkUnderlyingReturnValue = newValue + } + } + } + } + var matrixToEventPermalinkClosure: ((String) async -> Result)? + + func matrixToEventPermalink(_ eventID: String) async -> Result { + matrixToEventPermalinkCallsCount += 1 + matrixToEventPermalinkReceivedEventID = eventID + DispatchQueue.main.async { + self.matrixToEventPermalinkReceivedInvocations.append(eventID) + } + if let matrixToEventPermalinkClosure = matrixToEventPermalinkClosure { + return await matrixToEventPermalinkClosure(eventID) + } else { + return matrixToEventPermalinkReturnValue + } + } + //MARK: - saveDraft + + var saveDraftUnderlyingCallsCount = 0 + var saveDraftCallsCount: Int { + get { + if Thread.isMainThread { + return saveDraftUnderlyingCallsCount + } else { + var returnValue: Int? = nil + DispatchQueue.main.sync { + returnValue = saveDraftUnderlyingCallsCount + } + + return returnValue! + } + } + set { + if Thread.isMainThread { + saveDraftUnderlyingCallsCount = newValue + } else { + DispatchQueue.main.sync { + saveDraftUnderlyingCallsCount = newValue + } + } + } + } + var saveDraftCalled: Bool { + return saveDraftCallsCount > 0 + } + var saveDraftReceivedDraft: ComposerDraft? + var saveDraftReceivedInvocations: [ComposerDraft] = [] + + var saveDraftUnderlyingReturnValue: Result! + var saveDraftReturnValue: Result! { + get { + if Thread.isMainThread { + return saveDraftUnderlyingReturnValue + } else { + var returnValue: Result? = nil + DispatchQueue.main.sync { + returnValue = saveDraftUnderlyingReturnValue + } + + return returnValue! + } + } + set { + if Thread.isMainThread { + saveDraftUnderlyingReturnValue = newValue + } else { + DispatchQueue.main.sync { + saveDraftUnderlyingReturnValue = newValue + } + } + } + } + var saveDraftClosure: ((ComposerDraft) async -> Result)? + + func saveDraft(_ draft: ComposerDraft) async -> Result { + saveDraftCallsCount += 1 + saveDraftReceivedDraft = draft + DispatchQueue.main.async { + self.saveDraftReceivedInvocations.append(draft) + } + if let saveDraftClosure = saveDraftClosure { + return await saveDraftClosure(draft) + } else { + return saveDraftReturnValue + } + } + //MARK: - loadDraft + + var loadDraftUnderlyingCallsCount = 0 + var loadDraftCallsCount: Int { + get { + if Thread.isMainThread { + return loadDraftUnderlyingCallsCount + } else { + var returnValue: Int? = nil + DispatchQueue.main.sync { + returnValue = loadDraftUnderlyingCallsCount + } + + return returnValue! + } + } + set { + if Thread.isMainThread { + loadDraftUnderlyingCallsCount = newValue + } else { + DispatchQueue.main.sync { + loadDraftUnderlyingCallsCount = newValue + } + } + } + } + var loadDraftCalled: Bool { + return loadDraftCallsCount > 0 + } + + var loadDraftUnderlyingReturnValue: Result! + var loadDraftReturnValue: Result! { + get { + if Thread.isMainThread { + return loadDraftUnderlyingReturnValue + } else { + var returnValue: Result? = nil + DispatchQueue.main.sync { + returnValue = loadDraftUnderlyingReturnValue + } + + return returnValue! + } + } + set { + if Thread.isMainThread { + loadDraftUnderlyingReturnValue = newValue + } else { + DispatchQueue.main.sync { + loadDraftUnderlyingReturnValue = newValue + } + } + } + } + var loadDraftClosure: (() async -> Result)? + + func loadDraft() async -> Result { + loadDraftCallsCount += 1 + if let loadDraftClosure = loadDraftClosure { + return await loadDraftClosure() + } else { + return loadDraftReturnValue + } + } + //MARK: - clearDraft + + var clearDraftUnderlyingCallsCount = 0 + var clearDraftCallsCount: Int { + get { + if Thread.isMainThread { + return clearDraftUnderlyingCallsCount + } else { + var returnValue: Int? = nil + DispatchQueue.main.sync { + returnValue = clearDraftUnderlyingCallsCount + } + + return returnValue! + } + } + set { + if Thread.isMainThread { + clearDraftUnderlyingCallsCount = newValue + } else { + DispatchQueue.main.sync { + clearDraftUnderlyingCallsCount = newValue + } + } + } + } + var clearDraftCalled: Bool { + return clearDraftCallsCount > 0 + } + + var clearDraftUnderlyingReturnValue: Result! + var clearDraftReturnValue: Result! { + get { + if Thread.isMainThread { + return clearDraftUnderlyingReturnValue + } else { + var returnValue: Result? = nil + DispatchQueue.main.sync { + returnValue = clearDraftUnderlyingReturnValue + } + + return returnValue! + } + } + set { + if Thread.isMainThread { + clearDraftUnderlyingReturnValue = newValue + } else { + DispatchQueue.main.sync { + clearDraftUnderlyingReturnValue = newValue + } + } + } + } + var clearDraftClosure: (() async -> Result)? + + func clearDraft() async -> Result { + clearDraftCallsCount += 1 + if let clearDraftClosure = clearDraftClosure { + return await clearDraftClosure() + } else { + return clearDraftReturnValue + } + } +} class KeychainControllerMock: KeychainControllerProtocol { //MARK: - setRestorationToken @@ -8465,88 +11574,6 @@ class RoomProxyMock: RoomProxyProtocol { set(value) { underlyingId = value } } var underlyingId: String! - var isDirect: Bool { - get { return underlyingIsDirect } - set(value) { underlyingIsDirect = value } - } - var underlyingIsDirect: Bool! - var isPublic: Bool { - get { return underlyingIsPublic } - set(value) { underlyingIsPublic = value } - } - var underlyingIsPublic: Bool! - var isSpace: Bool { - get { return underlyingIsSpace } - set(value) { underlyingIsSpace = value } - } - var underlyingIsSpace: Bool! - var isEncrypted: Bool { - get { return underlyingIsEncrypted } - set(value) { underlyingIsEncrypted = value } - } - var underlyingIsEncrypted: Bool! - var isFavouriteCallsCount = 0 - var isFavouriteCalled: Bool { - return isFavouriteCallsCount > 0 - } - - var isFavourite: Bool { - get async { - isFavouriteCallsCount += 1 - if let isFavouriteClosure = isFavouriteClosure { - return await isFavouriteClosure() - } else { - return underlyingIsFavourite - } - } - } - var underlyingIsFavourite: Bool! - var isFavouriteClosure: (() async -> Bool)? - var pinnedEventIDsCallsCount = 0 - var pinnedEventIDsCalled: Bool { - return pinnedEventIDsCallsCount > 0 - } - - var pinnedEventIDs: Set { - get async { - pinnedEventIDsCallsCount += 1 - if let pinnedEventIDsClosure = pinnedEventIDsClosure { - return await pinnedEventIDsClosure() - } else { - return underlyingPinnedEventIDs - } - } - } - var underlyingPinnedEventIDs: Set! - var pinnedEventIDsClosure: (() async -> Set)? - var membership: Membership { - get { return underlyingMembership } - set(value) { underlyingMembership = value } - } - var underlyingMembership: Membership! - var inviterCallsCount = 0 - var inviterCalled: Bool { - return inviterCallsCount > 0 - } - - var inviter: RoomMemberProxyProtocol? { - get async { - inviterCallsCount += 1 - if let inviterClosure = inviterClosure { - return await inviterClosure() - } else { - return underlyingInviter - } - } - } - var underlyingInviter: RoomMemberProxyProtocol? - var inviterClosure: (() async -> RoomMemberProxyProtocol?)? - var hasOngoingCall: Bool { - get { return underlyingHasOngoingCall } - set(value) { underlyingHasOngoingCall = value } - } - var underlyingHasOngoingCall: Bool! - var activeRoomCallParticipants: [String] = [] var canonicalAlias: String? var ownUserID: String { get { return underlyingOwnUserID } @@ -8561,16 +11588,21 @@ class RoomProxyMock: RoomProxyProtocol { } var underlyingAvatar: RoomAvatar! var avatarURL: URL? - var membersPublisher: CurrentValuePublisher<[RoomMemberProxyProtocol], Never> { - get { return underlyingMembersPublisher } - set(value) { underlyingMembersPublisher = value } + var isPublic: Bool { + get { return underlyingIsPublic } + set(value) { underlyingIsPublic = value } } - var underlyingMembersPublisher: CurrentValuePublisher<[RoomMemberProxyProtocol], Never>! - var typingMembersPublisher: CurrentValuePublisher<[String], Never> { - get { return underlyingTypingMembersPublisher } - set(value) { underlyingTypingMembersPublisher = value } + var underlyingIsPublic: Bool! + var isDirect: Bool { + get { return underlyingIsDirect } + set(value) { underlyingIsDirect = value } } - var underlyingTypingMembersPublisher: CurrentValuePublisher<[String], Never>! + var underlyingIsDirect: Bool! + var isSpace: Bool { + get { return underlyingIsSpace } + set(value) { underlyingIsSpace = value } + } + var underlyingIsSpace: Bool! var joinedMembersCount: Int { get { return underlyingJoinedMembersCount } set(value) { underlyingJoinedMembersCount = value } @@ -8581,2950 +11613,7 @@ class RoomProxyMock: RoomProxyProtocol { set(value) { underlyingActiveMembersCount = value } } var underlyingActiveMembersCount: Int! - var actionsPublisher: AnyPublisher { - get { return underlyingActionsPublisher } - set(value) { underlyingActionsPublisher = value } - } - var underlyingActionsPublisher: AnyPublisher! - var timeline: TimelineProxyProtocol { - get { return underlyingTimeline } - set(value) { underlyingTimeline = value } - } - var underlyingTimeline: TimelineProxyProtocol! - var pinnedEventsTimelineCallsCount = 0 - var pinnedEventsTimelineCalled: Bool { - return pinnedEventsTimelineCallsCount > 0 - } - var pinnedEventsTimeline: TimelineProxyProtocol? { - get async { - pinnedEventsTimelineCallsCount += 1 - if let pinnedEventsTimelineClosure = pinnedEventsTimelineClosure { - return await pinnedEventsTimelineClosure() - } else { - return underlyingPinnedEventsTimeline - } - } - } - var underlyingPinnedEventsTimeline: TimelineProxyProtocol? - var pinnedEventsTimelineClosure: (() async -> TimelineProxyProtocol?)? - - //MARK: - subscribeForUpdates - - var subscribeForUpdatesUnderlyingCallsCount = 0 - var subscribeForUpdatesCallsCount: Int { - get { - if Thread.isMainThread { - return subscribeForUpdatesUnderlyingCallsCount - } else { - var returnValue: Int? = nil - DispatchQueue.main.sync { - returnValue = subscribeForUpdatesUnderlyingCallsCount - } - - return returnValue! - } - } - set { - if Thread.isMainThread { - subscribeForUpdatesUnderlyingCallsCount = newValue - } else { - DispatchQueue.main.sync { - subscribeForUpdatesUnderlyingCallsCount = newValue - } - } - } - } - var subscribeForUpdatesCalled: Bool { - return subscribeForUpdatesCallsCount > 0 - } - var subscribeForUpdatesClosure: (() async -> Void)? - - func subscribeForUpdates() async { - subscribeForUpdatesCallsCount += 1 - await subscribeForUpdatesClosure?() - } - //MARK: - subscribeToRoomInfoUpdates - - var subscribeToRoomInfoUpdatesUnderlyingCallsCount = 0 - var subscribeToRoomInfoUpdatesCallsCount: Int { - get { - if Thread.isMainThread { - return subscribeToRoomInfoUpdatesUnderlyingCallsCount - } else { - var returnValue: Int? = nil - DispatchQueue.main.sync { - returnValue = subscribeToRoomInfoUpdatesUnderlyingCallsCount - } - - return returnValue! - } - } - set { - if Thread.isMainThread { - subscribeToRoomInfoUpdatesUnderlyingCallsCount = newValue - } else { - DispatchQueue.main.sync { - subscribeToRoomInfoUpdatesUnderlyingCallsCount = newValue - } - } - } - } - var subscribeToRoomInfoUpdatesCalled: Bool { - return subscribeToRoomInfoUpdatesCallsCount > 0 - } - var subscribeToRoomInfoUpdatesClosure: (() -> Void)? - - func subscribeToRoomInfoUpdates() { - subscribeToRoomInfoUpdatesCallsCount += 1 - subscribeToRoomInfoUpdatesClosure?() - } - //MARK: - timelineFocusedOnEvent - - var timelineFocusedOnEventEventIDNumberOfEventsUnderlyingCallsCount = 0 - var timelineFocusedOnEventEventIDNumberOfEventsCallsCount: Int { - get { - if Thread.isMainThread { - return timelineFocusedOnEventEventIDNumberOfEventsUnderlyingCallsCount - } else { - var returnValue: Int? = nil - DispatchQueue.main.sync { - returnValue = timelineFocusedOnEventEventIDNumberOfEventsUnderlyingCallsCount - } - - return returnValue! - } - } - set { - if Thread.isMainThread { - timelineFocusedOnEventEventIDNumberOfEventsUnderlyingCallsCount = newValue - } else { - DispatchQueue.main.sync { - timelineFocusedOnEventEventIDNumberOfEventsUnderlyingCallsCount = newValue - } - } - } - } - var timelineFocusedOnEventEventIDNumberOfEventsCalled: Bool { - return timelineFocusedOnEventEventIDNumberOfEventsCallsCount > 0 - } - var timelineFocusedOnEventEventIDNumberOfEventsReceivedArguments: (eventID: String, numberOfEvents: UInt16)? - var timelineFocusedOnEventEventIDNumberOfEventsReceivedInvocations: [(eventID: String, numberOfEvents: UInt16)] = [] - - var timelineFocusedOnEventEventIDNumberOfEventsUnderlyingReturnValue: Result! - var timelineFocusedOnEventEventIDNumberOfEventsReturnValue: Result! { - get { - if Thread.isMainThread { - return timelineFocusedOnEventEventIDNumberOfEventsUnderlyingReturnValue - } else { - var returnValue: Result? = nil - DispatchQueue.main.sync { - returnValue = timelineFocusedOnEventEventIDNumberOfEventsUnderlyingReturnValue - } - - return returnValue! - } - } - set { - if Thread.isMainThread { - timelineFocusedOnEventEventIDNumberOfEventsUnderlyingReturnValue = newValue - } else { - DispatchQueue.main.sync { - timelineFocusedOnEventEventIDNumberOfEventsUnderlyingReturnValue = newValue - } - } - } - } - var timelineFocusedOnEventEventIDNumberOfEventsClosure: ((String, UInt16) async -> Result)? - - func timelineFocusedOnEvent(eventID: String, numberOfEvents: UInt16) async -> Result { - timelineFocusedOnEventEventIDNumberOfEventsCallsCount += 1 - timelineFocusedOnEventEventIDNumberOfEventsReceivedArguments = (eventID: eventID, numberOfEvents: numberOfEvents) - DispatchQueue.main.async { - self.timelineFocusedOnEventEventIDNumberOfEventsReceivedInvocations.append((eventID: eventID, numberOfEvents: numberOfEvents)) - } - if let timelineFocusedOnEventEventIDNumberOfEventsClosure = timelineFocusedOnEventEventIDNumberOfEventsClosure { - return await timelineFocusedOnEventEventIDNumberOfEventsClosure(eventID, numberOfEvents) - } else { - return timelineFocusedOnEventEventIDNumberOfEventsReturnValue - } - } - //MARK: - redact - - var redactUnderlyingCallsCount = 0 - var redactCallsCount: Int { - get { - if Thread.isMainThread { - return redactUnderlyingCallsCount - } else { - var returnValue: Int? = nil - DispatchQueue.main.sync { - returnValue = redactUnderlyingCallsCount - } - - return returnValue! - } - } - set { - if Thread.isMainThread { - redactUnderlyingCallsCount = newValue - } else { - DispatchQueue.main.sync { - redactUnderlyingCallsCount = newValue - } - } - } - } - var redactCalled: Bool { - return redactCallsCount > 0 - } - var redactReceivedEventID: String? - var redactReceivedInvocations: [String] = [] - - var redactUnderlyingReturnValue: Result! - var redactReturnValue: Result! { - get { - if Thread.isMainThread { - return redactUnderlyingReturnValue - } else { - var returnValue: Result? = nil - DispatchQueue.main.sync { - returnValue = redactUnderlyingReturnValue - } - - return returnValue! - } - } - set { - if Thread.isMainThread { - redactUnderlyingReturnValue = newValue - } else { - DispatchQueue.main.sync { - redactUnderlyingReturnValue = newValue - } - } - } - } - var redactClosure: ((String) async -> Result)? - - func redact(_ eventID: String) async -> Result { - redactCallsCount += 1 - redactReceivedEventID = eventID - DispatchQueue.main.async { - self.redactReceivedInvocations.append(eventID) - } - if let redactClosure = redactClosure { - return await redactClosure(eventID) - } else { - return redactReturnValue - } - } - //MARK: - reportContent - - var reportContentReasonUnderlyingCallsCount = 0 - var reportContentReasonCallsCount: Int { - get { - if Thread.isMainThread { - return reportContentReasonUnderlyingCallsCount - } else { - var returnValue: Int? = nil - DispatchQueue.main.sync { - returnValue = reportContentReasonUnderlyingCallsCount - } - - return returnValue! - } - } - set { - if Thread.isMainThread { - reportContentReasonUnderlyingCallsCount = newValue - } else { - DispatchQueue.main.sync { - reportContentReasonUnderlyingCallsCount = newValue - } - } - } - } - var reportContentReasonCalled: Bool { - return reportContentReasonCallsCount > 0 - } - var reportContentReasonReceivedArguments: (eventID: String, reason: String?)? - var reportContentReasonReceivedInvocations: [(eventID: String, reason: String?)] = [] - - var reportContentReasonUnderlyingReturnValue: Result! - var reportContentReasonReturnValue: Result! { - get { - if Thread.isMainThread { - return reportContentReasonUnderlyingReturnValue - } else { - var returnValue: Result? = nil - DispatchQueue.main.sync { - returnValue = reportContentReasonUnderlyingReturnValue - } - - return returnValue! - } - } - set { - if Thread.isMainThread { - reportContentReasonUnderlyingReturnValue = newValue - } else { - DispatchQueue.main.sync { - reportContentReasonUnderlyingReturnValue = newValue - } - } - } - } - var reportContentReasonClosure: ((String, String?) async -> Result)? - - func reportContent(_ eventID: String, reason: String?) async -> Result { - reportContentReasonCallsCount += 1 - reportContentReasonReceivedArguments = (eventID: eventID, reason: reason) - DispatchQueue.main.async { - self.reportContentReasonReceivedInvocations.append((eventID: eventID, reason: reason)) - } - if let reportContentReasonClosure = reportContentReasonClosure { - return await reportContentReasonClosure(eventID, reason) - } else { - return reportContentReasonReturnValue - } - } - //MARK: - leaveRoom - - var leaveRoomUnderlyingCallsCount = 0 - var leaveRoomCallsCount: Int { - get { - if Thread.isMainThread { - return leaveRoomUnderlyingCallsCount - } else { - var returnValue: Int? = nil - DispatchQueue.main.sync { - returnValue = leaveRoomUnderlyingCallsCount - } - - return returnValue! - } - } - set { - if Thread.isMainThread { - leaveRoomUnderlyingCallsCount = newValue - } else { - DispatchQueue.main.sync { - leaveRoomUnderlyingCallsCount = newValue - } - } - } - } - var leaveRoomCalled: Bool { - return leaveRoomCallsCount > 0 - } - - var leaveRoomUnderlyingReturnValue: Result! - var leaveRoomReturnValue: Result! { - get { - if Thread.isMainThread { - return leaveRoomUnderlyingReturnValue - } else { - var returnValue: Result? = nil - DispatchQueue.main.sync { - returnValue = leaveRoomUnderlyingReturnValue - } - - return returnValue! - } - } - set { - if Thread.isMainThread { - leaveRoomUnderlyingReturnValue = newValue - } else { - DispatchQueue.main.sync { - leaveRoomUnderlyingReturnValue = newValue - } - } - } - } - var leaveRoomClosure: (() async -> Result)? - - func leaveRoom() async -> Result { - leaveRoomCallsCount += 1 - if let leaveRoomClosure = leaveRoomClosure { - return await leaveRoomClosure() - } else { - return leaveRoomReturnValue - } - } - //MARK: - updateMembers - - var updateMembersUnderlyingCallsCount = 0 - var updateMembersCallsCount: Int { - get { - if Thread.isMainThread { - return updateMembersUnderlyingCallsCount - } else { - var returnValue: Int? = nil - DispatchQueue.main.sync { - returnValue = updateMembersUnderlyingCallsCount - } - - return returnValue! - } - } - set { - if Thread.isMainThread { - updateMembersUnderlyingCallsCount = newValue - } else { - DispatchQueue.main.sync { - updateMembersUnderlyingCallsCount = newValue - } - } - } - } - var updateMembersCalled: Bool { - return updateMembersCallsCount > 0 - } - var updateMembersClosure: (() async -> Void)? - - func updateMembers() async { - updateMembersCallsCount += 1 - await updateMembersClosure?() - } - //MARK: - getMember - - var getMemberUserIDUnderlyingCallsCount = 0 - var getMemberUserIDCallsCount: Int { - get { - if Thread.isMainThread { - return getMemberUserIDUnderlyingCallsCount - } else { - var returnValue: Int? = nil - DispatchQueue.main.sync { - returnValue = getMemberUserIDUnderlyingCallsCount - } - - return returnValue! - } - } - set { - if Thread.isMainThread { - getMemberUserIDUnderlyingCallsCount = newValue - } else { - DispatchQueue.main.sync { - getMemberUserIDUnderlyingCallsCount = newValue - } - } - } - } - var getMemberUserIDCalled: Bool { - return getMemberUserIDCallsCount > 0 - } - var getMemberUserIDReceivedUserID: String? - var getMemberUserIDReceivedInvocations: [String] = [] - - var getMemberUserIDUnderlyingReturnValue: Result! - var getMemberUserIDReturnValue: Result! { - get { - if Thread.isMainThread { - return getMemberUserIDUnderlyingReturnValue - } else { - var returnValue: Result? = nil - DispatchQueue.main.sync { - returnValue = getMemberUserIDUnderlyingReturnValue - } - - return returnValue! - } - } - set { - if Thread.isMainThread { - getMemberUserIDUnderlyingReturnValue = newValue - } else { - DispatchQueue.main.sync { - getMemberUserIDUnderlyingReturnValue = newValue - } - } - } - } - var getMemberUserIDClosure: ((String) async -> Result)? - - func getMember(userID: String) async -> Result { - getMemberUserIDCallsCount += 1 - getMemberUserIDReceivedUserID = userID - DispatchQueue.main.async { - self.getMemberUserIDReceivedInvocations.append(userID) - } - if let getMemberUserIDClosure = getMemberUserIDClosure { - return await getMemberUserIDClosure(userID) - } else { - return getMemberUserIDReturnValue - } - } - //MARK: - rejectInvitation - - var rejectInvitationUnderlyingCallsCount = 0 - var rejectInvitationCallsCount: Int { - get { - if Thread.isMainThread { - return rejectInvitationUnderlyingCallsCount - } else { - var returnValue: Int? = nil - DispatchQueue.main.sync { - returnValue = rejectInvitationUnderlyingCallsCount - } - - return returnValue! - } - } - set { - if Thread.isMainThread { - rejectInvitationUnderlyingCallsCount = newValue - } else { - DispatchQueue.main.sync { - rejectInvitationUnderlyingCallsCount = newValue - } - } - } - } - var rejectInvitationCalled: Bool { - return rejectInvitationCallsCount > 0 - } - - var rejectInvitationUnderlyingReturnValue: Result! - var rejectInvitationReturnValue: Result! { - get { - if Thread.isMainThread { - return rejectInvitationUnderlyingReturnValue - } else { - var returnValue: Result? = nil - DispatchQueue.main.sync { - returnValue = rejectInvitationUnderlyingReturnValue - } - - return returnValue! - } - } - set { - if Thread.isMainThread { - rejectInvitationUnderlyingReturnValue = newValue - } else { - DispatchQueue.main.sync { - rejectInvitationUnderlyingReturnValue = newValue - } - } - } - } - var rejectInvitationClosure: (() async -> Result)? - - func rejectInvitation() async -> Result { - rejectInvitationCallsCount += 1 - if let rejectInvitationClosure = rejectInvitationClosure { - return await rejectInvitationClosure() - } else { - return rejectInvitationReturnValue - } - } - //MARK: - acceptInvitation - - var acceptInvitationUnderlyingCallsCount = 0 - var acceptInvitationCallsCount: Int { - get { - if Thread.isMainThread { - return acceptInvitationUnderlyingCallsCount - } else { - var returnValue: Int? = nil - DispatchQueue.main.sync { - returnValue = acceptInvitationUnderlyingCallsCount - } - - return returnValue! - } - } - set { - if Thread.isMainThread { - acceptInvitationUnderlyingCallsCount = newValue - } else { - DispatchQueue.main.sync { - acceptInvitationUnderlyingCallsCount = newValue - } - } - } - } - var acceptInvitationCalled: Bool { - return acceptInvitationCallsCount > 0 - } - - var acceptInvitationUnderlyingReturnValue: Result! - var acceptInvitationReturnValue: Result! { - get { - if Thread.isMainThread { - return acceptInvitationUnderlyingReturnValue - } else { - var returnValue: Result? = nil - DispatchQueue.main.sync { - returnValue = acceptInvitationUnderlyingReturnValue - } - - return returnValue! - } - } - set { - if Thread.isMainThread { - acceptInvitationUnderlyingReturnValue = newValue - } else { - DispatchQueue.main.sync { - acceptInvitationUnderlyingReturnValue = newValue - } - } - } - } - var acceptInvitationClosure: (() async -> Result)? - - func acceptInvitation() async -> Result { - acceptInvitationCallsCount += 1 - if let acceptInvitationClosure = acceptInvitationClosure { - return await acceptInvitationClosure() - } else { - return acceptInvitationReturnValue - } - } - //MARK: - invite - - var inviteUserIDUnderlyingCallsCount = 0 - var inviteUserIDCallsCount: Int { - get { - if Thread.isMainThread { - return inviteUserIDUnderlyingCallsCount - } else { - var returnValue: Int? = nil - DispatchQueue.main.sync { - returnValue = inviteUserIDUnderlyingCallsCount - } - - return returnValue! - } - } - set { - if Thread.isMainThread { - inviteUserIDUnderlyingCallsCount = newValue - } else { - DispatchQueue.main.sync { - inviteUserIDUnderlyingCallsCount = newValue - } - } - } - } - var inviteUserIDCalled: Bool { - return inviteUserIDCallsCount > 0 - } - var inviteUserIDReceivedUserID: String? - var inviteUserIDReceivedInvocations: [String] = [] - - var inviteUserIDUnderlyingReturnValue: Result! - var inviteUserIDReturnValue: Result! { - get { - if Thread.isMainThread { - return inviteUserIDUnderlyingReturnValue - } else { - var returnValue: Result? = nil - DispatchQueue.main.sync { - returnValue = inviteUserIDUnderlyingReturnValue - } - - return returnValue! - } - } - set { - if Thread.isMainThread { - inviteUserIDUnderlyingReturnValue = newValue - } else { - DispatchQueue.main.sync { - inviteUserIDUnderlyingReturnValue = newValue - } - } - } - } - var inviteUserIDClosure: ((String) async -> Result)? - - func invite(userID: String) async -> Result { - inviteUserIDCallsCount += 1 - inviteUserIDReceivedUserID = userID - DispatchQueue.main.async { - self.inviteUserIDReceivedInvocations.append(userID) - } - if let inviteUserIDClosure = inviteUserIDClosure { - return await inviteUserIDClosure(userID) - } else { - return inviteUserIDReturnValue - } - } - //MARK: - setName - - var setNameUnderlyingCallsCount = 0 - var setNameCallsCount: Int { - get { - if Thread.isMainThread { - return setNameUnderlyingCallsCount - } else { - var returnValue: Int? = nil - DispatchQueue.main.sync { - returnValue = setNameUnderlyingCallsCount - } - - return returnValue! - } - } - set { - if Thread.isMainThread { - setNameUnderlyingCallsCount = newValue - } else { - DispatchQueue.main.sync { - setNameUnderlyingCallsCount = newValue - } - } - } - } - var setNameCalled: Bool { - return setNameCallsCount > 0 - } - var setNameReceivedName: String? - var setNameReceivedInvocations: [String] = [] - - var setNameUnderlyingReturnValue: Result! - var setNameReturnValue: Result! { - get { - if Thread.isMainThread { - return setNameUnderlyingReturnValue - } else { - var returnValue: Result? = nil - DispatchQueue.main.sync { - returnValue = setNameUnderlyingReturnValue - } - - return returnValue! - } - } - set { - if Thread.isMainThread { - setNameUnderlyingReturnValue = newValue - } else { - DispatchQueue.main.sync { - setNameUnderlyingReturnValue = newValue - } - } - } - } - var setNameClosure: ((String) async -> Result)? - - func setName(_ name: String) async -> Result { - setNameCallsCount += 1 - setNameReceivedName = name - DispatchQueue.main.async { - self.setNameReceivedInvocations.append(name) - } - if let setNameClosure = setNameClosure { - return await setNameClosure(name) - } else { - return setNameReturnValue - } - } - //MARK: - setTopic - - var setTopicUnderlyingCallsCount = 0 - var setTopicCallsCount: Int { - get { - if Thread.isMainThread { - return setTopicUnderlyingCallsCount - } else { - var returnValue: Int? = nil - DispatchQueue.main.sync { - returnValue = setTopicUnderlyingCallsCount - } - - return returnValue! - } - } - set { - if Thread.isMainThread { - setTopicUnderlyingCallsCount = newValue - } else { - DispatchQueue.main.sync { - setTopicUnderlyingCallsCount = newValue - } - } - } - } - var setTopicCalled: Bool { - return setTopicCallsCount > 0 - } - var setTopicReceivedTopic: String? - var setTopicReceivedInvocations: [String] = [] - - var setTopicUnderlyingReturnValue: Result! - var setTopicReturnValue: Result! { - get { - if Thread.isMainThread { - return setTopicUnderlyingReturnValue - } else { - var returnValue: Result? = nil - DispatchQueue.main.sync { - returnValue = setTopicUnderlyingReturnValue - } - - return returnValue! - } - } - set { - if Thread.isMainThread { - setTopicUnderlyingReturnValue = newValue - } else { - DispatchQueue.main.sync { - setTopicUnderlyingReturnValue = newValue - } - } - } - } - var setTopicClosure: ((String) async -> Result)? - - func setTopic(_ topic: String) async -> Result { - setTopicCallsCount += 1 - setTopicReceivedTopic = topic - DispatchQueue.main.async { - self.setTopicReceivedInvocations.append(topic) - } - if let setTopicClosure = setTopicClosure { - return await setTopicClosure(topic) - } else { - return setTopicReturnValue - } - } - //MARK: - removeAvatar - - var removeAvatarUnderlyingCallsCount = 0 - var removeAvatarCallsCount: Int { - get { - if Thread.isMainThread { - return removeAvatarUnderlyingCallsCount - } else { - var returnValue: Int? = nil - DispatchQueue.main.sync { - returnValue = removeAvatarUnderlyingCallsCount - } - - return returnValue! - } - } - set { - if Thread.isMainThread { - removeAvatarUnderlyingCallsCount = newValue - } else { - DispatchQueue.main.sync { - removeAvatarUnderlyingCallsCount = newValue - } - } - } - } - var removeAvatarCalled: Bool { - return removeAvatarCallsCount > 0 - } - - var removeAvatarUnderlyingReturnValue: Result! - var removeAvatarReturnValue: Result! { - get { - if Thread.isMainThread { - return removeAvatarUnderlyingReturnValue - } else { - var returnValue: Result? = nil - DispatchQueue.main.sync { - returnValue = removeAvatarUnderlyingReturnValue - } - - return returnValue! - } - } - set { - if Thread.isMainThread { - removeAvatarUnderlyingReturnValue = newValue - } else { - DispatchQueue.main.sync { - removeAvatarUnderlyingReturnValue = newValue - } - } - } - } - var removeAvatarClosure: (() async -> Result)? - - func removeAvatar() async -> Result { - removeAvatarCallsCount += 1 - if let removeAvatarClosure = removeAvatarClosure { - return await removeAvatarClosure() - } else { - return removeAvatarReturnValue - } - } - //MARK: - uploadAvatar - - var uploadAvatarMediaUnderlyingCallsCount = 0 - var uploadAvatarMediaCallsCount: Int { - get { - if Thread.isMainThread { - return uploadAvatarMediaUnderlyingCallsCount - } else { - var returnValue: Int? = nil - DispatchQueue.main.sync { - returnValue = uploadAvatarMediaUnderlyingCallsCount - } - - return returnValue! - } - } - set { - if Thread.isMainThread { - uploadAvatarMediaUnderlyingCallsCount = newValue - } else { - DispatchQueue.main.sync { - uploadAvatarMediaUnderlyingCallsCount = newValue - } - } - } - } - var uploadAvatarMediaCalled: Bool { - return uploadAvatarMediaCallsCount > 0 - } - var uploadAvatarMediaReceivedMedia: MediaInfo? - var uploadAvatarMediaReceivedInvocations: [MediaInfo] = [] - - var uploadAvatarMediaUnderlyingReturnValue: Result! - var uploadAvatarMediaReturnValue: Result! { - get { - if Thread.isMainThread { - return uploadAvatarMediaUnderlyingReturnValue - } else { - var returnValue: Result? = nil - DispatchQueue.main.sync { - returnValue = uploadAvatarMediaUnderlyingReturnValue - } - - return returnValue! - } - } - set { - if Thread.isMainThread { - uploadAvatarMediaUnderlyingReturnValue = newValue - } else { - DispatchQueue.main.sync { - uploadAvatarMediaUnderlyingReturnValue = newValue - } - } - } - } - var uploadAvatarMediaClosure: ((MediaInfo) async -> Result)? - - func uploadAvatar(media: MediaInfo) async -> Result { - uploadAvatarMediaCallsCount += 1 - uploadAvatarMediaReceivedMedia = media - DispatchQueue.main.async { - self.uploadAvatarMediaReceivedInvocations.append(media) - } - if let uploadAvatarMediaClosure = uploadAvatarMediaClosure { - return await uploadAvatarMediaClosure(media) - } else { - return uploadAvatarMediaReturnValue - } - } - //MARK: - markAsRead - - var markAsReadReceiptTypeUnderlyingCallsCount = 0 - var markAsReadReceiptTypeCallsCount: Int { - get { - if Thread.isMainThread { - return markAsReadReceiptTypeUnderlyingCallsCount - } else { - var returnValue: Int? = nil - DispatchQueue.main.sync { - returnValue = markAsReadReceiptTypeUnderlyingCallsCount - } - - return returnValue! - } - } - set { - if Thread.isMainThread { - markAsReadReceiptTypeUnderlyingCallsCount = newValue - } else { - DispatchQueue.main.sync { - markAsReadReceiptTypeUnderlyingCallsCount = newValue - } - } - } - } - var markAsReadReceiptTypeCalled: Bool { - return markAsReadReceiptTypeCallsCount > 0 - } - var markAsReadReceiptTypeReceivedReceiptType: ReceiptType? - var markAsReadReceiptTypeReceivedInvocations: [ReceiptType] = [] - - var markAsReadReceiptTypeUnderlyingReturnValue: Result! - var markAsReadReceiptTypeReturnValue: Result! { - get { - if Thread.isMainThread { - return markAsReadReceiptTypeUnderlyingReturnValue - } else { - var returnValue: Result? = nil - DispatchQueue.main.sync { - returnValue = markAsReadReceiptTypeUnderlyingReturnValue - } - - return returnValue! - } - } - set { - if Thread.isMainThread { - markAsReadReceiptTypeUnderlyingReturnValue = newValue - } else { - DispatchQueue.main.sync { - markAsReadReceiptTypeUnderlyingReturnValue = newValue - } - } - } - } - var markAsReadReceiptTypeClosure: ((ReceiptType) async -> Result)? - - func markAsRead(receiptType: ReceiptType) async -> Result { - markAsReadReceiptTypeCallsCount += 1 - markAsReadReceiptTypeReceivedReceiptType = receiptType - DispatchQueue.main.async { - self.markAsReadReceiptTypeReceivedInvocations.append(receiptType) - } - if let markAsReadReceiptTypeClosure = markAsReadReceiptTypeClosure { - return await markAsReadReceiptTypeClosure(receiptType) - } else { - return markAsReadReceiptTypeReturnValue - } - } - //MARK: - edit - - var editEventIDNewContentUnderlyingCallsCount = 0 - var editEventIDNewContentCallsCount: Int { - get { - if Thread.isMainThread { - return editEventIDNewContentUnderlyingCallsCount - } else { - var returnValue: Int? = nil - DispatchQueue.main.sync { - returnValue = editEventIDNewContentUnderlyingCallsCount - } - - return returnValue! - } - } - set { - if Thread.isMainThread { - editEventIDNewContentUnderlyingCallsCount = newValue - } else { - DispatchQueue.main.sync { - editEventIDNewContentUnderlyingCallsCount = newValue - } - } - } - } - var editEventIDNewContentCalled: Bool { - return editEventIDNewContentCallsCount > 0 - } - var editEventIDNewContentReceivedArguments: (eventID: String, newContent: RoomMessageEventContentWithoutRelation)? - var editEventIDNewContentReceivedInvocations: [(eventID: String, newContent: RoomMessageEventContentWithoutRelation)] = [] - - var editEventIDNewContentUnderlyingReturnValue: Result! - var editEventIDNewContentReturnValue: Result! { - get { - if Thread.isMainThread { - return editEventIDNewContentUnderlyingReturnValue - } else { - var returnValue: Result? = nil - DispatchQueue.main.sync { - returnValue = editEventIDNewContentUnderlyingReturnValue - } - - return returnValue! - } - } - set { - if Thread.isMainThread { - editEventIDNewContentUnderlyingReturnValue = newValue - } else { - DispatchQueue.main.sync { - editEventIDNewContentUnderlyingReturnValue = newValue - } - } - } - } - var editEventIDNewContentClosure: ((String, RoomMessageEventContentWithoutRelation) async -> Result)? - - func edit(eventID: String, newContent: RoomMessageEventContentWithoutRelation) async -> Result { - editEventIDNewContentCallsCount += 1 - editEventIDNewContentReceivedArguments = (eventID: eventID, newContent: newContent) - DispatchQueue.main.async { - self.editEventIDNewContentReceivedInvocations.append((eventID: eventID, newContent: newContent)) - } - if let editEventIDNewContentClosure = editEventIDNewContentClosure { - return await editEventIDNewContentClosure(eventID, newContent) - } else { - return editEventIDNewContentReturnValue - } - } - //MARK: - sendTypingNotification - - var sendTypingNotificationIsTypingUnderlyingCallsCount = 0 - var sendTypingNotificationIsTypingCallsCount: Int { - get { - if Thread.isMainThread { - return sendTypingNotificationIsTypingUnderlyingCallsCount - } else { - var returnValue: Int? = nil - DispatchQueue.main.sync { - returnValue = sendTypingNotificationIsTypingUnderlyingCallsCount - } - - return returnValue! - } - } - set { - if Thread.isMainThread { - sendTypingNotificationIsTypingUnderlyingCallsCount = newValue - } else { - DispatchQueue.main.sync { - sendTypingNotificationIsTypingUnderlyingCallsCount = newValue - } - } - } - } - var sendTypingNotificationIsTypingCalled: Bool { - return sendTypingNotificationIsTypingCallsCount > 0 - } - var sendTypingNotificationIsTypingReceivedIsTyping: Bool? - var sendTypingNotificationIsTypingReceivedInvocations: [Bool] = [] - - var sendTypingNotificationIsTypingUnderlyingReturnValue: Result! - var sendTypingNotificationIsTypingReturnValue: Result! { - get { - if Thread.isMainThread { - return sendTypingNotificationIsTypingUnderlyingReturnValue - } else { - var returnValue: Result? = nil - DispatchQueue.main.sync { - returnValue = sendTypingNotificationIsTypingUnderlyingReturnValue - } - - return returnValue! - } - } - set { - if Thread.isMainThread { - sendTypingNotificationIsTypingUnderlyingReturnValue = newValue - } else { - DispatchQueue.main.sync { - sendTypingNotificationIsTypingUnderlyingReturnValue = newValue - } - } - } - } - var sendTypingNotificationIsTypingClosure: ((Bool) async -> Result)? - - @discardableResult - func sendTypingNotification(isTyping: Bool) async -> Result { - sendTypingNotificationIsTypingCallsCount += 1 - sendTypingNotificationIsTypingReceivedIsTyping = isTyping - DispatchQueue.main.async { - self.sendTypingNotificationIsTypingReceivedInvocations.append(isTyping) - } - if let sendTypingNotificationIsTypingClosure = sendTypingNotificationIsTypingClosure { - return await sendTypingNotificationIsTypingClosure(isTyping) - } else { - return sendTypingNotificationIsTypingReturnValue - } - } - //MARK: - flagAsUnread - - var flagAsUnreadUnderlyingCallsCount = 0 - var flagAsUnreadCallsCount: Int { - get { - if Thread.isMainThread { - return flagAsUnreadUnderlyingCallsCount - } else { - var returnValue: Int? = nil - DispatchQueue.main.sync { - returnValue = flagAsUnreadUnderlyingCallsCount - } - - return returnValue! - } - } - set { - if Thread.isMainThread { - flagAsUnreadUnderlyingCallsCount = newValue - } else { - DispatchQueue.main.sync { - flagAsUnreadUnderlyingCallsCount = newValue - } - } - } - } - var flagAsUnreadCalled: Bool { - return flagAsUnreadCallsCount > 0 - } - var flagAsUnreadReceivedIsUnread: Bool? - var flagAsUnreadReceivedInvocations: [Bool] = [] - - var flagAsUnreadUnderlyingReturnValue: Result! - var flagAsUnreadReturnValue: Result! { - get { - if Thread.isMainThread { - return flagAsUnreadUnderlyingReturnValue - } else { - var returnValue: Result? = nil - DispatchQueue.main.sync { - returnValue = flagAsUnreadUnderlyingReturnValue - } - - return returnValue! - } - } - set { - if Thread.isMainThread { - flagAsUnreadUnderlyingReturnValue = newValue - } else { - DispatchQueue.main.sync { - flagAsUnreadUnderlyingReturnValue = newValue - } - } - } - } - var flagAsUnreadClosure: ((Bool) async -> Result)? - - func flagAsUnread(_ isUnread: Bool) async -> Result { - flagAsUnreadCallsCount += 1 - flagAsUnreadReceivedIsUnread = isUnread - DispatchQueue.main.async { - self.flagAsUnreadReceivedInvocations.append(isUnread) - } - if let flagAsUnreadClosure = flagAsUnreadClosure { - return await flagAsUnreadClosure(isUnread) - } else { - return flagAsUnreadReturnValue - } - } - //MARK: - flagAsFavourite - - var flagAsFavouriteUnderlyingCallsCount = 0 - var flagAsFavouriteCallsCount: Int { - get { - if Thread.isMainThread { - return flagAsFavouriteUnderlyingCallsCount - } else { - var returnValue: Int? = nil - DispatchQueue.main.sync { - returnValue = flagAsFavouriteUnderlyingCallsCount - } - - return returnValue! - } - } - set { - if Thread.isMainThread { - flagAsFavouriteUnderlyingCallsCount = newValue - } else { - DispatchQueue.main.sync { - flagAsFavouriteUnderlyingCallsCount = newValue - } - } - } - } - var flagAsFavouriteCalled: Bool { - return flagAsFavouriteCallsCount > 0 - } - var flagAsFavouriteReceivedIsFavourite: Bool? - var flagAsFavouriteReceivedInvocations: [Bool] = [] - - var flagAsFavouriteUnderlyingReturnValue: Result! - var flagAsFavouriteReturnValue: Result! { - get { - if Thread.isMainThread { - return flagAsFavouriteUnderlyingReturnValue - } else { - var returnValue: Result? = nil - DispatchQueue.main.sync { - returnValue = flagAsFavouriteUnderlyingReturnValue - } - - return returnValue! - } - } - set { - if Thread.isMainThread { - flagAsFavouriteUnderlyingReturnValue = newValue - } else { - DispatchQueue.main.sync { - flagAsFavouriteUnderlyingReturnValue = newValue - } - } - } - } - var flagAsFavouriteClosure: ((Bool) async -> Result)? - - func flagAsFavourite(_ isFavourite: Bool) async -> Result { - flagAsFavouriteCallsCount += 1 - flagAsFavouriteReceivedIsFavourite = isFavourite - DispatchQueue.main.async { - self.flagAsFavouriteReceivedInvocations.append(isFavourite) - } - if let flagAsFavouriteClosure = flagAsFavouriteClosure { - return await flagAsFavouriteClosure(isFavourite) - } else { - return flagAsFavouriteReturnValue - } - } - //MARK: - powerLevels - - var powerLevelsUnderlyingCallsCount = 0 - var powerLevelsCallsCount: Int { - get { - if Thread.isMainThread { - return powerLevelsUnderlyingCallsCount - } else { - var returnValue: Int? = nil - DispatchQueue.main.sync { - returnValue = powerLevelsUnderlyingCallsCount - } - - return returnValue! - } - } - set { - if Thread.isMainThread { - powerLevelsUnderlyingCallsCount = newValue - } else { - DispatchQueue.main.sync { - powerLevelsUnderlyingCallsCount = newValue - } - } - } - } - var powerLevelsCalled: Bool { - return powerLevelsCallsCount > 0 - } - - var powerLevelsUnderlyingReturnValue: Result! - var powerLevelsReturnValue: Result! { - get { - if Thread.isMainThread { - return powerLevelsUnderlyingReturnValue - } else { - var returnValue: Result? = nil - DispatchQueue.main.sync { - returnValue = powerLevelsUnderlyingReturnValue - } - - return returnValue! - } - } - set { - if Thread.isMainThread { - powerLevelsUnderlyingReturnValue = newValue - } else { - DispatchQueue.main.sync { - powerLevelsUnderlyingReturnValue = newValue - } - } - } - } - var powerLevelsClosure: (() async -> Result)? - - func powerLevels() async -> Result { - powerLevelsCallsCount += 1 - if let powerLevelsClosure = powerLevelsClosure { - return await powerLevelsClosure() - } else { - return powerLevelsReturnValue - } - } - //MARK: - applyPowerLevelChanges - - var applyPowerLevelChangesUnderlyingCallsCount = 0 - var applyPowerLevelChangesCallsCount: Int { - get { - if Thread.isMainThread { - return applyPowerLevelChangesUnderlyingCallsCount - } else { - var returnValue: Int? = nil - DispatchQueue.main.sync { - returnValue = applyPowerLevelChangesUnderlyingCallsCount - } - - return returnValue! - } - } - set { - if Thread.isMainThread { - applyPowerLevelChangesUnderlyingCallsCount = newValue - } else { - DispatchQueue.main.sync { - applyPowerLevelChangesUnderlyingCallsCount = newValue - } - } - } - } - var applyPowerLevelChangesCalled: Bool { - return applyPowerLevelChangesCallsCount > 0 - } - var applyPowerLevelChangesReceivedChanges: RoomPowerLevelChanges? - var applyPowerLevelChangesReceivedInvocations: [RoomPowerLevelChanges] = [] - - var applyPowerLevelChangesUnderlyingReturnValue: Result! - var applyPowerLevelChangesReturnValue: Result! { - get { - if Thread.isMainThread { - return applyPowerLevelChangesUnderlyingReturnValue - } else { - var returnValue: Result? = nil - DispatchQueue.main.sync { - returnValue = applyPowerLevelChangesUnderlyingReturnValue - } - - return returnValue! - } - } - set { - if Thread.isMainThread { - applyPowerLevelChangesUnderlyingReturnValue = newValue - } else { - DispatchQueue.main.sync { - applyPowerLevelChangesUnderlyingReturnValue = newValue - } - } - } - } - var applyPowerLevelChangesClosure: ((RoomPowerLevelChanges) async -> Result)? - - func applyPowerLevelChanges(_ changes: RoomPowerLevelChanges) async -> Result { - applyPowerLevelChangesCallsCount += 1 - applyPowerLevelChangesReceivedChanges = changes - DispatchQueue.main.async { - self.applyPowerLevelChangesReceivedInvocations.append(changes) - } - if let applyPowerLevelChangesClosure = applyPowerLevelChangesClosure { - return await applyPowerLevelChangesClosure(changes) - } else { - return applyPowerLevelChangesReturnValue - } - } - //MARK: - resetPowerLevels - - var resetPowerLevelsUnderlyingCallsCount = 0 - var resetPowerLevelsCallsCount: Int { - get { - if Thread.isMainThread { - return resetPowerLevelsUnderlyingCallsCount - } else { - var returnValue: Int? = nil - DispatchQueue.main.sync { - returnValue = resetPowerLevelsUnderlyingCallsCount - } - - return returnValue! - } - } - set { - if Thread.isMainThread { - resetPowerLevelsUnderlyingCallsCount = newValue - } else { - DispatchQueue.main.sync { - resetPowerLevelsUnderlyingCallsCount = newValue - } - } - } - } - var resetPowerLevelsCalled: Bool { - return resetPowerLevelsCallsCount > 0 - } - - var resetPowerLevelsUnderlyingReturnValue: Result! - var resetPowerLevelsReturnValue: Result! { - get { - if Thread.isMainThread { - return resetPowerLevelsUnderlyingReturnValue - } else { - var returnValue: Result? = nil - DispatchQueue.main.sync { - returnValue = resetPowerLevelsUnderlyingReturnValue - } - - return returnValue! - } - } - set { - if Thread.isMainThread { - resetPowerLevelsUnderlyingReturnValue = newValue - } else { - DispatchQueue.main.sync { - resetPowerLevelsUnderlyingReturnValue = newValue - } - } - } - } - var resetPowerLevelsClosure: (() async -> Result)? - - func resetPowerLevels() async -> Result { - resetPowerLevelsCallsCount += 1 - if let resetPowerLevelsClosure = resetPowerLevelsClosure { - return await resetPowerLevelsClosure() - } else { - return resetPowerLevelsReturnValue - } - } - //MARK: - suggestedRole - - var suggestedRoleForUnderlyingCallsCount = 0 - var suggestedRoleForCallsCount: Int { - get { - if Thread.isMainThread { - return suggestedRoleForUnderlyingCallsCount - } else { - var returnValue: Int? = nil - DispatchQueue.main.sync { - returnValue = suggestedRoleForUnderlyingCallsCount - } - - return returnValue! - } - } - set { - if Thread.isMainThread { - suggestedRoleForUnderlyingCallsCount = newValue - } else { - DispatchQueue.main.sync { - suggestedRoleForUnderlyingCallsCount = newValue - } - } - } - } - var suggestedRoleForCalled: Bool { - return suggestedRoleForCallsCount > 0 - } - var suggestedRoleForReceivedUserID: String? - var suggestedRoleForReceivedInvocations: [String] = [] - - var suggestedRoleForUnderlyingReturnValue: Result! - var suggestedRoleForReturnValue: Result! { - get { - if Thread.isMainThread { - return suggestedRoleForUnderlyingReturnValue - } else { - var returnValue: Result? = nil - DispatchQueue.main.sync { - returnValue = suggestedRoleForUnderlyingReturnValue - } - - return returnValue! - } - } - set { - if Thread.isMainThread { - suggestedRoleForUnderlyingReturnValue = newValue - } else { - DispatchQueue.main.sync { - suggestedRoleForUnderlyingReturnValue = newValue - } - } - } - } - var suggestedRoleForClosure: ((String) async -> Result)? - - func suggestedRole(for userID: String) async -> Result { - suggestedRoleForCallsCount += 1 - suggestedRoleForReceivedUserID = userID - DispatchQueue.main.async { - self.suggestedRoleForReceivedInvocations.append(userID) - } - if let suggestedRoleForClosure = suggestedRoleForClosure { - return await suggestedRoleForClosure(userID) - } else { - return suggestedRoleForReturnValue - } - } - //MARK: - updatePowerLevelsForUsers - - var updatePowerLevelsForUsersUnderlyingCallsCount = 0 - var updatePowerLevelsForUsersCallsCount: Int { - get { - if Thread.isMainThread { - return updatePowerLevelsForUsersUnderlyingCallsCount - } else { - var returnValue: Int? = nil - DispatchQueue.main.sync { - returnValue = updatePowerLevelsForUsersUnderlyingCallsCount - } - - return returnValue! - } - } - set { - if Thread.isMainThread { - updatePowerLevelsForUsersUnderlyingCallsCount = newValue - } else { - DispatchQueue.main.sync { - updatePowerLevelsForUsersUnderlyingCallsCount = newValue - } - } - } - } - var updatePowerLevelsForUsersCalled: Bool { - return updatePowerLevelsForUsersCallsCount > 0 - } - var updatePowerLevelsForUsersReceivedUpdates: [(userID: String, powerLevel: Int64)]? - var updatePowerLevelsForUsersReceivedInvocations: [[(userID: String, powerLevel: Int64)]] = [] - - var updatePowerLevelsForUsersUnderlyingReturnValue: Result! - var updatePowerLevelsForUsersReturnValue: Result! { - get { - if Thread.isMainThread { - return updatePowerLevelsForUsersUnderlyingReturnValue - } else { - var returnValue: Result? = nil - DispatchQueue.main.sync { - returnValue = updatePowerLevelsForUsersUnderlyingReturnValue - } - - return returnValue! - } - } - set { - if Thread.isMainThread { - updatePowerLevelsForUsersUnderlyingReturnValue = newValue - } else { - DispatchQueue.main.sync { - updatePowerLevelsForUsersUnderlyingReturnValue = newValue - } - } - } - } - var updatePowerLevelsForUsersClosure: (([(userID: String, powerLevel: Int64)]) async -> Result)? - - func updatePowerLevelsForUsers(_ updates: [(userID: String, powerLevel: Int64)]) async -> Result { - updatePowerLevelsForUsersCallsCount += 1 - updatePowerLevelsForUsersReceivedUpdates = updates - DispatchQueue.main.async { - self.updatePowerLevelsForUsersReceivedInvocations.append(updates) - } - if let updatePowerLevelsForUsersClosure = updatePowerLevelsForUsersClosure { - return await updatePowerLevelsForUsersClosure(updates) - } else { - return updatePowerLevelsForUsersReturnValue - } - } - //MARK: - canUser - - var canUserUserIDSendStateEventUnderlyingCallsCount = 0 - var canUserUserIDSendStateEventCallsCount: Int { - get { - if Thread.isMainThread { - return canUserUserIDSendStateEventUnderlyingCallsCount - } else { - var returnValue: Int? = nil - DispatchQueue.main.sync { - returnValue = canUserUserIDSendStateEventUnderlyingCallsCount - } - - return returnValue! - } - } - set { - if Thread.isMainThread { - canUserUserIDSendStateEventUnderlyingCallsCount = newValue - } else { - DispatchQueue.main.sync { - canUserUserIDSendStateEventUnderlyingCallsCount = newValue - } - } - } - } - var canUserUserIDSendStateEventCalled: Bool { - return canUserUserIDSendStateEventCallsCount > 0 - } - var canUserUserIDSendStateEventReceivedArguments: (userID: String, event: StateEventType)? - var canUserUserIDSendStateEventReceivedInvocations: [(userID: String, event: StateEventType)] = [] - - var canUserUserIDSendStateEventUnderlyingReturnValue: Result! - var canUserUserIDSendStateEventReturnValue: Result! { - get { - if Thread.isMainThread { - return canUserUserIDSendStateEventUnderlyingReturnValue - } else { - var returnValue: Result? = nil - DispatchQueue.main.sync { - returnValue = canUserUserIDSendStateEventUnderlyingReturnValue - } - - return returnValue! - } - } - set { - if Thread.isMainThread { - canUserUserIDSendStateEventUnderlyingReturnValue = newValue - } else { - DispatchQueue.main.sync { - canUserUserIDSendStateEventUnderlyingReturnValue = newValue - } - } - } - } - var canUserUserIDSendStateEventClosure: ((String, StateEventType) async -> Result)? - - func canUser(userID: String, sendStateEvent event: StateEventType) async -> Result { - canUserUserIDSendStateEventCallsCount += 1 - canUserUserIDSendStateEventReceivedArguments = (userID: userID, event: event) - DispatchQueue.main.async { - self.canUserUserIDSendStateEventReceivedInvocations.append((userID: userID, event: event)) - } - if let canUserUserIDSendStateEventClosure = canUserUserIDSendStateEventClosure { - return await canUserUserIDSendStateEventClosure(userID, event) - } else { - return canUserUserIDSendStateEventReturnValue - } - } - //MARK: - canUserInvite - - var canUserInviteUserIDUnderlyingCallsCount = 0 - var canUserInviteUserIDCallsCount: Int { - get { - if Thread.isMainThread { - return canUserInviteUserIDUnderlyingCallsCount - } else { - var returnValue: Int? = nil - DispatchQueue.main.sync { - returnValue = canUserInviteUserIDUnderlyingCallsCount - } - - return returnValue! - } - } - set { - if Thread.isMainThread { - canUserInviteUserIDUnderlyingCallsCount = newValue - } else { - DispatchQueue.main.sync { - canUserInviteUserIDUnderlyingCallsCount = newValue - } - } - } - } - var canUserInviteUserIDCalled: Bool { - return canUserInviteUserIDCallsCount > 0 - } - var canUserInviteUserIDReceivedUserID: String? - var canUserInviteUserIDReceivedInvocations: [String] = [] - - var canUserInviteUserIDUnderlyingReturnValue: Result! - var canUserInviteUserIDReturnValue: Result! { - get { - if Thread.isMainThread { - return canUserInviteUserIDUnderlyingReturnValue - } else { - var returnValue: Result? = nil - DispatchQueue.main.sync { - returnValue = canUserInviteUserIDUnderlyingReturnValue - } - - return returnValue! - } - } - set { - if Thread.isMainThread { - canUserInviteUserIDUnderlyingReturnValue = newValue - } else { - DispatchQueue.main.sync { - canUserInviteUserIDUnderlyingReturnValue = newValue - } - } - } - } - var canUserInviteUserIDClosure: ((String) async -> Result)? - - func canUserInvite(userID: String) async -> Result { - canUserInviteUserIDCallsCount += 1 - canUserInviteUserIDReceivedUserID = userID - DispatchQueue.main.async { - self.canUserInviteUserIDReceivedInvocations.append(userID) - } - if let canUserInviteUserIDClosure = canUserInviteUserIDClosure { - return await canUserInviteUserIDClosure(userID) - } else { - return canUserInviteUserIDReturnValue - } - } - //MARK: - canUserRedactOther - - var canUserRedactOtherUserIDUnderlyingCallsCount = 0 - var canUserRedactOtherUserIDCallsCount: Int { - get { - if Thread.isMainThread { - return canUserRedactOtherUserIDUnderlyingCallsCount - } else { - var returnValue: Int? = nil - DispatchQueue.main.sync { - returnValue = canUserRedactOtherUserIDUnderlyingCallsCount - } - - return returnValue! - } - } - set { - if Thread.isMainThread { - canUserRedactOtherUserIDUnderlyingCallsCount = newValue - } else { - DispatchQueue.main.sync { - canUserRedactOtherUserIDUnderlyingCallsCount = newValue - } - } - } - } - var canUserRedactOtherUserIDCalled: Bool { - return canUserRedactOtherUserIDCallsCount > 0 - } - var canUserRedactOtherUserIDReceivedUserID: String? - var canUserRedactOtherUserIDReceivedInvocations: [String] = [] - - var canUserRedactOtherUserIDUnderlyingReturnValue: Result! - var canUserRedactOtherUserIDReturnValue: Result! { - get { - if Thread.isMainThread { - return canUserRedactOtherUserIDUnderlyingReturnValue - } else { - var returnValue: Result? = nil - DispatchQueue.main.sync { - returnValue = canUserRedactOtherUserIDUnderlyingReturnValue - } - - return returnValue! - } - } - set { - if Thread.isMainThread { - canUserRedactOtherUserIDUnderlyingReturnValue = newValue - } else { - DispatchQueue.main.sync { - canUserRedactOtherUserIDUnderlyingReturnValue = newValue - } - } - } - } - var canUserRedactOtherUserIDClosure: ((String) async -> Result)? - - func canUserRedactOther(userID: String) async -> Result { - canUserRedactOtherUserIDCallsCount += 1 - canUserRedactOtherUserIDReceivedUserID = userID - DispatchQueue.main.async { - self.canUserRedactOtherUserIDReceivedInvocations.append(userID) - } - if let canUserRedactOtherUserIDClosure = canUserRedactOtherUserIDClosure { - return await canUserRedactOtherUserIDClosure(userID) - } else { - return canUserRedactOtherUserIDReturnValue - } - } - //MARK: - canUserRedactOwn - - var canUserRedactOwnUserIDUnderlyingCallsCount = 0 - var canUserRedactOwnUserIDCallsCount: Int { - get { - if Thread.isMainThread { - return canUserRedactOwnUserIDUnderlyingCallsCount - } else { - var returnValue: Int? = nil - DispatchQueue.main.sync { - returnValue = canUserRedactOwnUserIDUnderlyingCallsCount - } - - return returnValue! - } - } - set { - if Thread.isMainThread { - canUserRedactOwnUserIDUnderlyingCallsCount = newValue - } else { - DispatchQueue.main.sync { - canUserRedactOwnUserIDUnderlyingCallsCount = newValue - } - } - } - } - var canUserRedactOwnUserIDCalled: Bool { - return canUserRedactOwnUserIDCallsCount > 0 - } - var canUserRedactOwnUserIDReceivedUserID: String? - var canUserRedactOwnUserIDReceivedInvocations: [String] = [] - - var canUserRedactOwnUserIDUnderlyingReturnValue: Result! - var canUserRedactOwnUserIDReturnValue: Result! { - get { - if Thread.isMainThread { - return canUserRedactOwnUserIDUnderlyingReturnValue - } else { - var returnValue: Result? = nil - DispatchQueue.main.sync { - returnValue = canUserRedactOwnUserIDUnderlyingReturnValue - } - - return returnValue! - } - } - set { - if Thread.isMainThread { - canUserRedactOwnUserIDUnderlyingReturnValue = newValue - } else { - DispatchQueue.main.sync { - canUserRedactOwnUserIDUnderlyingReturnValue = newValue - } - } - } - } - var canUserRedactOwnUserIDClosure: ((String) async -> Result)? - - func canUserRedactOwn(userID: String) async -> Result { - canUserRedactOwnUserIDCallsCount += 1 - canUserRedactOwnUserIDReceivedUserID = userID - DispatchQueue.main.async { - self.canUserRedactOwnUserIDReceivedInvocations.append(userID) - } - if let canUserRedactOwnUserIDClosure = canUserRedactOwnUserIDClosure { - return await canUserRedactOwnUserIDClosure(userID) - } else { - return canUserRedactOwnUserIDReturnValue - } - } - //MARK: - canUserKick - - var canUserKickUserIDUnderlyingCallsCount = 0 - var canUserKickUserIDCallsCount: Int { - get { - if Thread.isMainThread { - return canUserKickUserIDUnderlyingCallsCount - } else { - var returnValue: Int? = nil - DispatchQueue.main.sync { - returnValue = canUserKickUserIDUnderlyingCallsCount - } - - return returnValue! - } - } - set { - if Thread.isMainThread { - canUserKickUserIDUnderlyingCallsCount = newValue - } else { - DispatchQueue.main.sync { - canUserKickUserIDUnderlyingCallsCount = newValue - } - } - } - } - var canUserKickUserIDCalled: Bool { - return canUserKickUserIDCallsCount > 0 - } - var canUserKickUserIDReceivedUserID: String? - var canUserKickUserIDReceivedInvocations: [String] = [] - - var canUserKickUserIDUnderlyingReturnValue: Result! - var canUserKickUserIDReturnValue: Result! { - get { - if Thread.isMainThread { - return canUserKickUserIDUnderlyingReturnValue - } else { - var returnValue: Result? = nil - DispatchQueue.main.sync { - returnValue = canUserKickUserIDUnderlyingReturnValue - } - - return returnValue! - } - } - set { - if Thread.isMainThread { - canUserKickUserIDUnderlyingReturnValue = newValue - } else { - DispatchQueue.main.sync { - canUserKickUserIDUnderlyingReturnValue = newValue - } - } - } - } - var canUserKickUserIDClosure: ((String) async -> Result)? - - func canUserKick(userID: String) async -> Result { - canUserKickUserIDCallsCount += 1 - canUserKickUserIDReceivedUserID = userID - DispatchQueue.main.async { - self.canUserKickUserIDReceivedInvocations.append(userID) - } - if let canUserKickUserIDClosure = canUserKickUserIDClosure { - return await canUserKickUserIDClosure(userID) - } else { - return canUserKickUserIDReturnValue - } - } - //MARK: - canUserBan - - var canUserBanUserIDUnderlyingCallsCount = 0 - var canUserBanUserIDCallsCount: Int { - get { - if Thread.isMainThread { - return canUserBanUserIDUnderlyingCallsCount - } else { - var returnValue: Int? = nil - DispatchQueue.main.sync { - returnValue = canUserBanUserIDUnderlyingCallsCount - } - - return returnValue! - } - } - set { - if Thread.isMainThread { - canUserBanUserIDUnderlyingCallsCount = newValue - } else { - DispatchQueue.main.sync { - canUserBanUserIDUnderlyingCallsCount = newValue - } - } - } - } - var canUserBanUserIDCalled: Bool { - return canUserBanUserIDCallsCount > 0 - } - var canUserBanUserIDReceivedUserID: String? - var canUserBanUserIDReceivedInvocations: [String] = [] - - var canUserBanUserIDUnderlyingReturnValue: Result! - var canUserBanUserIDReturnValue: Result! { - get { - if Thread.isMainThread { - return canUserBanUserIDUnderlyingReturnValue - } else { - var returnValue: Result? = nil - DispatchQueue.main.sync { - returnValue = canUserBanUserIDUnderlyingReturnValue - } - - return returnValue! - } - } - set { - if Thread.isMainThread { - canUserBanUserIDUnderlyingReturnValue = newValue - } else { - DispatchQueue.main.sync { - canUserBanUserIDUnderlyingReturnValue = newValue - } - } - } - } - var canUserBanUserIDClosure: ((String) async -> Result)? - - func canUserBan(userID: String) async -> Result { - canUserBanUserIDCallsCount += 1 - canUserBanUserIDReceivedUserID = userID - DispatchQueue.main.async { - self.canUserBanUserIDReceivedInvocations.append(userID) - } - if let canUserBanUserIDClosure = canUserBanUserIDClosure { - return await canUserBanUserIDClosure(userID) - } else { - return canUserBanUserIDReturnValue - } - } - //MARK: - canUserTriggerRoomNotification - - var canUserTriggerRoomNotificationUserIDUnderlyingCallsCount = 0 - var canUserTriggerRoomNotificationUserIDCallsCount: Int { - get { - if Thread.isMainThread { - return canUserTriggerRoomNotificationUserIDUnderlyingCallsCount - } else { - var returnValue: Int? = nil - DispatchQueue.main.sync { - returnValue = canUserTriggerRoomNotificationUserIDUnderlyingCallsCount - } - - return returnValue! - } - } - set { - if Thread.isMainThread { - canUserTriggerRoomNotificationUserIDUnderlyingCallsCount = newValue - } else { - DispatchQueue.main.sync { - canUserTriggerRoomNotificationUserIDUnderlyingCallsCount = newValue - } - } - } - } - var canUserTriggerRoomNotificationUserIDCalled: Bool { - return canUserTriggerRoomNotificationUserIDCallsCount > 0 - } - var canUserTriggerRoomNotificationUserIDReceivedUserID: String? - var canUserTriggerRoomNotificationUserIDReceivedInvocations: [String] = [] - - var canUserTriggerRoomNotificationUserIDUnderlyingReturnValue: Result! - var canUserTriggerRoomNotificationUserIDReturnValue: Result! { - get { - if Thread.isMainThread { - return canUserTriggerRoomNotificationUserIDUnderlyingReturnValue - } else { - var returnValue: Result? = nil - DispatchQueue.main.sync { - returnValue = canUserTriggerRoomNotificationUserIDUnderlyingReturnValue - } - - return returnValue! - } - } - set { - if Thread.isMainThread { - canUserTriggerRoomNotificationUserIDUnderlyingReturnValue = newValue - } else { - DispatchQueue.main.sync { - canUserTriggerRoomNotificationUserIDUnderlyingReturnValue = newValue - } - } - } - } - var canUserTriggerRoomNotificationUserIDClosure: ((String) async -> Result)? - - func canUserTriggerRoomNotification(userID: String) async -> Result { - canUserTriggerRoomNotificationUserIDCallsCount += 1 - canUserTriggerRoomNotificationUserIDReceivedUserID = userID - DispatchQueue.main.async { - self.canUserTriggerRoomNotificationUserIDReceivedInvocations.append(userID) - } - if let canUserTriggerRoomNotificationUserIDClosure = canUserTriggerRoomNotificationUserIDClosure { - return await canUserTriggerRoomNotificationUserIDClosure(userID) - } else { - return canUserTriggerRoomNotificationUserIDReturnValue - } - } - //MARK: - canUserPinOrUnpin - - var canUserPinOrUnpinUserIDUnderlyingCallsCount = 0 - var canUserPinOrUnpinUserIDCallsCount: Int { - get { - if Thread.isMainThread { - return canUserPinOrUnpinUserIDUnderlyingCallsCount - } else { - var returnValue: Int? = nil - DispatchQueue.main.sync { - returnValue = canUserPinOrUnpinUserIDUnderlyingCallsCount - } - - return returnValue! - } - } - set { - if Thread.isMainThread { - canUserPinOrUnpinUserIDUnderlyingCallsCount = newValue - } else { - DispatchQueue.main.sync { - canUserPinOrUnpinUserIDUnderlyingCallsCount = newValue - } - } - } - } - var canUserPinOrUnpinUserIDCalled: Bool { - return canUserPinOrUnpinUserIDCallsCount > 0 - } - var canUserPinOrUnpinUserIDReceivedUserID: String? - var canUserPinOrUnpinUserIDReceivedInvocations: [String] = [] - - var canUserPinOrUnpinUserIDUnderlyingReturnValue: Result! - var canUserPinOrUnpinUserIDReturnValue: Result! { - get { - if Thread.isMainThread { - return canUserPinOrUnpinUserIDUnderlyingReturnValue - } else { - var returnValue: Result? = nil - DispatchQueue.main.sync { - returnValue = canUserPinOrUnpinUserIDUnderlyingReturnValue - } - - return returnValue! - } - } - set { - if Thread.isMainThread { - canUserPinOrUnpinUserIDUnderlyingReturnValue = newValue - } else { - DispatchQueue.main.sync { - canUserPinOrUnpinUserIDUnderlyingReturnValue = newValue - } - } - } - } - var canUserPinOrUnpinUserIDClosure: ((String) async -> Result)? - - func canUserPinOrUnpin(userID: String) async -> Result { - canUserPinOrUnpinUserIDCallsCount += 1 - canUserPinOrUnpinUserIDReceivedUserID = userID - DispatchQueue.main.async { - self.canUserPinOrUnpinUserIDReceivedInvocations.append(userID) - } - if let canUserPinOrUnpinUserIDClosure = canUserPinOrUnpinUserIDClosure { - return await canUserPinOrUnpinUserIDClosure(userID) - } else { - return canUserPinOrUnpinUserIDReturnValue - } - } - //MARK: - kickUser - - var kickUserUnderlyingCallsCount = 0 - var kickUserCallsCount: Int { - get { - if Thread.isMainThread { - return kickUserUnderlyingCallsCount - } else { - var returnValue: Int? = nil - DispatchQueue.main.sync { - returnValue = kickUserUnderlyingCallsCount - } - - return returnValue! - } - } - set { - if Thread.isMainThread { - kickUserUnderlyingCallsCount = newValue - } else { - DispatchQueue.main.sync { - kickUserUnderlyingCallsCount = newValue - } - } - } - } - var kickUserCalled: Bool { - return kickUserCallsCount > 0 - } - var kickUserReceivedUserID: String? - var kickUserReceivedInvocations: [String] = [] - - var kickUserUnderlyingReturnValue: Result! - var kickUserReturnValue: Result! { - get { - if Thread.isMainThread { - return kickUserUnderlyingReturnValue - } else { - var returnValue: Result? = nil - DispatchQueue.main.sync { - returnValue = kickUserUnderlyingReturnValue - } - - return returnValue! - } - } - set { - if Thread.isMainThread { - kickUserUnderlyingReturnValue = newValue - } else { - DispatchQueue.main.sync { - kickUserUnderlyingReturnValue = newValue - } - } - } - } - var kickUserClosure: ((String) async -> Result)? - - func kickUser(_ userID: String) async -> Result { - kickUserCallsCount += 1 - kickUserReceivedUserID = userID - DispatchQueue.main.async { - self.kickUserReceivedInvocations.append(userID) - } - if let kickUserClosure = kickUserClosure { - return await kickUserClosure(userID) - } else { - return kickUserReturnValue - } - } - //MARK: - banUser - - var banUserUnderlyingCallsCount = 0 - var banUserCallsCount: Int { - get { - if Thread.isMainThread { - return banUserUnderlyingCallsCount - } else { - var returnValue: Int? = nil - DispatchQueue.main.sync { - returnValue = banUserUnderlyingCallsCount - } - - return returnValue! - } - } - set { - if Thread.isMainThread { - banUserUnderlyingCallsCount = newValue - } else { - DispatchQueue.main.sync { - banUserUnderlyingCallsCount = newValue - } - } - } - } - var banUserCalled: Bool { - return banUserCallsCount > 0 - } - var banUserReceivedUserID: String? - var banUserReceivedInvocations: [String] = [] - - var banUserUnderlyingReturnValue: Result! - var banUserReturnValue: Result! { - get { - if Thread.isMainThread { - return banUserUnderlyingReturnValue - } else { - var returnValue: Result? = nil - DispatchQueue.main.sync { - returnValue = banUserUnderlyingReturnValue - } - - return returnValue! - } - } - set { - if Thread.isMainThread { - banUserUnderlyingReturnValue = newValue - } else { - DispatchQueue.main.sync { - banUserUnderlyingReturnValue = newValue - } - } - } - } - var banUserClosure: ((String) async -> Result)? - - func banUser(_ userID: String) async -> Result { - banUserCallsCount += 1 - banUserReceivedUserID = userID - DispatchQueue.main.async { - self.banUserReceivedInvocations.append(userID) - } - if let banUserClosure = banUserClosure { - return await banUserClosure(userID) - } else { - return banUserReturnValue - } - } - //MARK: - unbanUser - - var unbanUserUnderlyingCallsCount = 0 - var unbanUserCallsCount: Int { - get { - if Thread.isMainThread { - return unbanUserUnderlyingCallsCount - } else { - var returnValue: Int? = nil - DispatchQueue.main.sync { - returnValue = unbanUserUnderlyingCallsCount - } - - return returnValue! - } - } - set { - if Thread.isMainThread { - unbanUserUnderlyingCallsCount = newValue - } else { - DispatchQueue.main.sync { - unbanUserUnderlyingCallsCount = newValue - } - } - } - } - var unbanUserCalled: Bool { - return unbanUserCallsCount > 0 - } - var unbanUserReceivedUserID: String? - var unbanUserReceivedInvocations: [String] = [] - - var unbanUserUnderlyingReturnValue: Result! - var unbanUserReturnValue: Result! { - get { - if Thread.isMainThread { - return unbanUserUnderlyingReturnValue - } else { - var returnValue: Result? = nil - DispatchQueue.main.sync { - returnValue = unbanUserUnderlyingReturnValue - } - - return returnValue! - } - } - set { - if Thread.isMainThread { - unbanUserUnderlyingReturnValue = newValue - } else { - DispatchQueue.main.sync { - unbanUserUnderlyingReturnValue = newValue - } - } - } - } - var unbanUserClosure: ((String) async -> Result)? - - func unbanUser(_ userID: String) async -> Result { - unbanUserCallsCount += 1 - unbanUserReceivedUserID = userID - DispatchQueue.main.async { - self.unbanUserReceivedInvocations.append(userID) - } - if let unbanUserClosure = unbanUserClosure { - return await unbanUserClosure(userID) - } else { - return unbanUserReturnValue - } - } - //MARK: - canUserJoinCall - - var canUserJoinCallUserIDUnderlyingCallsCount = 0 - var canUserJoinCallUserIDCallsCount: Int { - get { - if Thread.isMainThread { - return canUserJoinCallUserIDUnderlyingCallsCount - } else { - var returnValue: Int? = nil - DispatchQueue.main.sync { - returnValue = canUserJoinCallUserIDUnderlyingCallsCount - } - - return returnValue! - } - } - set { - if Thread.isMainThread { - canUserJoinCallUserIDUnderlyingCallsCount = newValue - } else { - DispatchQueue.main.sync { - canUserJoinCallUserIDUnderlyingCallsCount = newValue - } - } - } - } - var canUserJoinCallUserIDCalled: Bool { - return canUserJoinCallUserIDCallsCount > 0 - } - var canUserJoinCallUserIDReceivedUserID: String? - var canUserJoinCallUserIDReceivedInvocations: [String] = [] - - var canUserJoinCallUserIDUnderlyingReturnValue: Result! - var canUserJoinCallUserIDReturnValue: Result! { - get { - if Thread.isMainThread { - return canUserJoinCallUserIDUnderlyingReturnValue - } else { - var returnValue: Result? = nil - DispatchQueue.main.sync { - returnValue = canUserJoinCallUserIDUnderlyingReturnValue - } - - return returnValue! - } - } - set { - if Thread.isMainThread { - canUserJoinCallUserIDUnderlyingReturnValue = newValue - } else { - DispatchQueue.main.sync { - canUserJoinCallUserIDUnderlyingReturnValue = newValue - } - } - } - } - var canUserJoinCallUserIDClosure: ((String) async -> Result)? - - func canUserJoinCall(userID: String) async -> Result { - canUserJoinCallUserIDCallsCount += 1 - canUserJoinCallUserIDReceivedUserID = userID - DispatchQueue.main.async { - self.canUserJoinCallUserIDReceivedInvocations.append(userID) - } - if let canUserJoinCallUserIDClosure = canUserJoinCallUserIDClosure { - return await canUserJoinCallUserIDClosure(userID) - } else { - return canUserJoinCallUserIDReturnValue - } - } - //MARK: - elementCallWidgetDriver - - var elementCallWidgetDriverDeviceIDUnderlyingCallsCount = 0 - var elementCallWidgetDriverDeviceIDCallsCount: Int { - get { - if Thread.isMainThread { - return elementCallWidgetDriverDeviceIDUnderlyingCallsCount - } else { - var returnValue: Int? = nil - DispatchQueue.main.sync { - returnValue = elementCallWidgetDriverDeviceIDUnderlyingCallsCount - } - - return returnValue! - } - } - set { - if Thread.isMainThread { - elementCallWidgetDriverDeviceIDUnderlyingCallsCount = newValue - } else { - DispatchQueue.main.sync { - elementCallWidgetDriverDeviceIDUnderlyingCallsCount = newValue - } - } - } - } - var elementCallWidgetDriverDeviceIDCalled: Bool { - return elementCallWidgetDriverDeviceIDCallsCount > 0 - } - var elementCallWidgetDriverDeviceIDReceivedDeviceID: String? - var elementCallWidgetDriverDeviceIDReceivedInvocations: [String] = [] - - var elementCallWidgetDriverDeviceIDUnderlyingReturnValue: ElementCallWidgetDriverProtocol! - var elementCallWidgetDriverDeviceIDReturnValue: ElementCallWidgetDriverProtocol! { - get { - if Thread.isMainThread { - return elementCallWidgetDriverDeviceIDUnderlyingReturnValue - } else { - var returnValue: ElementCallWidgetDriverProtocol? = nil - DispatchQueue.main.sync { - returnValue = elementCallWidgetDriverDeviceIDUnderlyingReturnValue - } - - return returnValue! - } - } - set { - if Thread.isMainThread { - elementCallWidgetDriverDeviceIDUnderlyingReturnValue = newValue - } else { - DispatchQueue.main.sync { - elementCallWidgetDriverDeviceIDUnderlyingReturnValue = newValue - } - } - } - } - var elementCallWidgetDriverDeviceIDClosure: ((String) -> ElementCallWidgetDriverProtocol)? - - func elementCallWidgetDriver(deviceID: String) -> ElementCallWidgetDriverProtocol { - elementCallWidgetDriverDeviceIDCallsCount += 1 - elementCallWidgetDriverDeviceIDReceivedDeviceID = deviceID - DispatchQueue.main.async { - self.elementCallWidgetDriverDeviceIDReceivedInvocations.append(deviceID) - } - if let elementCallWidgetDriverDeviceIDClosure = elementCallWidgetDriverDeviceIDClosure { - return elementCallWidgetDriverDeviceIDClosure(deviceID) - } else { - return elementCallWidgetDriverDeviceIDReturnValue - } - } - //MARK: - sendCallNotificationIfNeeded - - var sendCallNotificationIfNeededUnderlyingCallsCount = 0 - var sendCallNotificationIfNeededCallsCount: Int { - get { - if Thread.isMainThread { - return sendCallNotificationIfNeededUnderlyingCallsCount - } else { - var returnValue: Int? = nil - DispatchQueue.main.sync { - returnValue = sendCallNotificationIfNeededUnderlyingCallsCount - } - - return returnValue! - } - } - set { - if Thread.isMainThread { - sendCallNotificationIfNeededUnderlyingCallsCount = newValue - } else { - DispatchQueue.main.sync { - sendCallNotificationIfNeededUnderlyingCallsCount = newValue - } - } - } - } - var sendCallNotificationIfNeededCalled: Bool { - return sendCallNotificationIfNeededCallsCount > 0 - } - - var sendCallNotificationIfNeededUnderlyingReturnValue: Result! - var sendCallNotificationIfNeededReturnValue: Result! { - get { - if Thread.isMainThread { - return sendCallNotificationIfNeededUnderlyingReturnValue - } else { - var returnValue: Result? = nil - DispatchQueue.main.sync { - returnValue = sendCallNotificationIfNeededUnderlyingReturnValue - } - - return returnValue! - } - } - set { - if Thread.isMainThread { - sendCallNotificationIfNeededUnderlyingReturnValue = newValue - } else { - DispatchQueue.main.sync { - sendCallNotificationIfNeededUnderlyingReturnValue = newValue - } - } - } - } - var sendCallNotificationIfNeededClosure: (() async -> Result)? - - func sendCallNotificationIfNeeded() async -> Result { - sendCallNotificationIfNeededCallsCount += 1 - if let sendCallNotificationIfNeededClosure = sendCallNotificationIfNeededClosure { - return await sendCallNotificationIfNeededClosure() - } else { - return sendCallNotificationIfNeededReturnValue - } - } - //MARK: - matrixToPermalink - - var matrixToPermalinkUnderlyingCallsCount = 0 - var matrixToPermalinkCallsCount: Int { - get { - if Thread.isMainThread { - return matrixToPermalinkUnderlyingCallsCount - } else { - var returnValue: Int? = nil - DispatchQueue.main.sync { - returnValue = matrixToPermalinkUnderlyingCallsCount - } - - return returnValue! - } - } - set { - if Thread.isMainThread { - matrixToPermalinkUnderlyingCallsCount = newValue - } else { - DispatchQueue.main.sync { - matrixToPermalinkUnderlyingCallsCount = newValue - } - } - } - } - var matrixToPermalinkCalled: Bool { - return matrixToPermalinkCallsCount > 0 - } - - var matrixToPermalinkUnderlyingReturnValue: Result! - var matrixToPermalinkReturnValue: Result! { - get { - if Thread.isMainThread { - return matrixToPermalinkUnderlyingReturnValue - } else { - var returnValue: Result? = nil - DispatchQueue.main.sync { - returnValue = matrixToPermalinkUnderlyingReturnValue - } - - return returnValue! - } - } - set { - if Thread.isMainThread { - matrixToPermalinkUnderlyingReturnValue = newValue - } else { - DispatchQueue.main.sync { - matrixToPermalinkUnderlyingReturnValue = newValue - } - } - } - } - var matrixToPermalinkClosure: (() async -> Result)? - - func matrixToPermalink() async -> Result { - matrixToPermalinkCallsCount += 1 - if let matrixToPermalinkClosure = matrixToPermalinkClosure { - return await matrixToPermalinkClosure() - } else { - return matrixToPermalinkReturnValue - } - } - //MARK: - matrixToEventPermalink - - var matrixToEventPermalinkUnderlyingCallsCount = 0 - var matrixToEventPermalinkCallsCount: Int { - get { - if Thread.isMainThread { - return matrixToEventPermalinkUnderlyingCallsCount - } else { - var returnValue: Int? = nil - DispatchQueue.main.sync { - returnValue = matrixToEventPermalinkUnderlyingCallsCount - } - - return returnValue! - } - } - set { - if Thread.isMainThread { - matrixToEventPermalinkUnderlyingCallsCount = newValue - } else { - DispatchQueue.main.sync { - matrixToEventPermalinkUnderlyingCallsCount = newValue - } - } - } - } - var matrixToEventPermalinkCalled: Bool { - return matrixToEventPermalinkCallsCount > 0 - } - var matrixToEventPermalinkReceivedEventID: String? - var matrixToEventPermalinkReceivedInvocations: [String] = [] - - var matrixToEventPermalinkUnderlyingReturnValue: Result! - var matrixToEventPermalinkReturnValue: Result! { - get { - if Thread.isMainThread { - return matrixToEventPermalinkUnderlyingReturnValue - } else { - var returnValue: Result? = nil - DispatchQueue.main.sync { - returnValue = matrixToEventPermalinkUnderlyingReturnValue - } - - return returnValue! - } - } - set { - if Thread.isMainThread { - matrixToEventPermalinkUnderlyingReturnValue = newValue - } else { - DispatchQueue.main.sync { - matrixToEventPermalinkUnderlyingReturnValue = newValue - } - } - } - } - var matrixToEventPermalinkClosure: ((String) async -> Result)? - - func matrixToEventPermalink(_ eventID: String) async -> Result { - matrixToEventPermalinkCallsCount += 1 - matrixToEventPermalinkReceivedEventID = eventID - DispatchQueue.main.async { - self.matrixToEventPermalinkReceivedInvocations.append(eventID) - } - if let matrixToEventPermalinkClosure = matrixToEventPermalinkClosure { - return await matrixToEventPermalinkClosure(eventID) - } else { - return matrixToEventPermalinkReturnValue - } - } - //MARK: - saveDraft - - var saveDraftUnderlyingCallsCount = 0 - var saveDraftCallsCount: Int { - get { - if Thread.isMainThread { - return saveDraftUnderlyingCallsCount - } else { - var returnValue: Int? = nil - DispatchQueue.main.sync { - returnValue = saveDraftUnderlyingCallsCount - } - - return returnValue! - } - } - set { - if Thread.isMainThread { - saveDraftUnderlyingCallsCount = newValue - } else { - DispatchQueue.main.sync { - saveDraftUnderlyingCallsCount = newValue - } - } - } - } - var saveDraftCalled: Bool { - return saveDraftCallsCount > 0 - } - var saveDraftReceivedDraft: ComposerDraft? - var saveDraftReceivedInvocations: [ComposerDraft] = [] - - var saveDraftUnderlyingReturnValue: Result! - var saveDraftReturnValue: Result! { - get { - if Thread.isMainThread { - return saveDraftUnderlyingReturnValue - } else { - var returnValue: Result? = nil - DispatchQueue.main.sync { - returnValue = saveDraftUnderlyingReturnValue - } - - return returnValue! - } - } - set { - if Thread.isMainThread { - saveDraftUnderlyingReturnValue = newValue - } else { - DispatchQueue.main.sync { - saveDraftUnderlyingReturnValue = newValue - } - } - } - } - var saveDraftClosure: ((ComposerDraft) async -> Result)? - - func saveDraft(_ draft: ComposerDraft) async -> Result { - saveDraftCallsCount += 1 - saveDraftReceivedDraft = draft - DispatchQueue.main.async { - self.saveDraftReceivedInvocations.append(draft) - } - if let saveDraftClosure = saveDraftClosure { - return await saveDraftClosure(draft) - } else { - return saveDraftReturnValue - } - } - //MARK: - loadDraft - - var loadDraftUnderlyingCallsCount = 0 - var loadDraftCallsCount: Int { - get { - if Thread.isMainThread { - return loadDraftUnderlyingCallsCount - } else { - var returnValue: Int? = nil - DispatchQueue.main.sync { - returnValue = loadDraftUnderlyingCallsCount - } - - return returnValue! - } - } - set { - if Thread.isMainThread { - loadDraftUnderlyingCallsCount = newValue - } else { - DispatchQueue.main.sync { - loadDraftUnderlyingCallsCount = newValue - } - } - } - } - var loadDraftCalled: Bool { - return loadDraftCallsCount > 0 - } - - var loadDraftUnderlyingReturnValue: Result! - var loadDraftReturnValue: Result! { - get { - if Thread.isMainThread { - return loadDraftUnderlyingReturnValue - } else { - var returnValue: Result? = nil - DispatchQueue.main.sync { - returnValue = loadDraftUnderlyingReturnValue - } - - return returnValue! - } - } - set { - if Thread.isMainThread { - loadDraftUnderlyingReturnValue = newValue - } else { - DispatchQueue.main.sync { - loadDraftUnderlyingReturnValue = newValue - } - } - } - } - var loadDraftClosure: (() async -> Result)? - - func loadDraft() async -> Result { - loadDraftCallsCount += 1 - if let loadDraftClosure = loadDraftClosure { - return await loadDraftClosure() - } else { - return loadDraftReturnValue - } - } - //MARK: - clearDraft - - var clearDraftUnderlyingCallsCount = 0 - var clearDraftCallsCount: Int { - get { - if Thread.isMainThread { - return clearDraftUnderlyingCallsCount - } else { - var returnValue: Int? = nil - DispatchQueue.main.sync { - returnValue = clearDraftUnderlyingCallsCount - } - - return returnValue! - } - } - set { - if Thread.isMainThread { - clearDraftUnderlyingCallsCount = newValue - } else { - DispatchQueue.main.sync { - clearDraftUnderlyingCallsCount = newValue - } - } - } - } - var clearDraftCalled: Bool { - return clearDraftCallsCount > 0 - } - - var clearDraftUnderlyingReturnValue: Result! - var clearDraftReturnValue: Result! { - get { - if Thread.isMainThread { - return clearDraftUnderlyingReturnValue - } else { - var returnValue: Result? = nil - DispatchQueue.main.sync { - returnValue = clearDraftUnderlyingReturnValue - } - - return returnValue! - } - } - set { - if Thread.isMainThread { - clearDraftUnderlyingReturnValue = newValue - } else { - DispatchQueue.main.sync { - clearDraftUnderlyingReturnValue = newValue - } - } - } - } - var clearDraftClosure: (() async -> Result)? - - func clearDraft() async -> Result { - clearDraftCallsCount += 1 - if let clearDraftClosure = clearDraftClosure { - return await clearDraftClosure() - } else { - return clearDraftReturnValue - } - } } class RoomSummaryProviderMock: RoomSummaryProviderProtocol { var roomListPublisher: CurrentValuePublisher<[RoomSummary], Never> { @@ -11693,8 +11782,8 @@ class RoomTimelineControllerFactoryMock: RoomTimelineControllerFactoryProtocol { var buildRoomTimelineControllerRoomProxyInitialFocussedEventIDTimelineItemFactoryCalled: Bool { return buildRoomTimelineControllerRoomProxyInitialFocussedEventIDTimelineItemFactoryCallsCount > 0 } - var buildRoomTimelineControllerRoomProxyInitialFocussedEventIDTimelineItemFactoryReceivedArguments: (roomProxy: RoomProxyProtocol, initialFocussedEventID: String?, timelineItemFactory: RoomTimelineItemFactoryProtocol)? - var buildRoomTimelineControllerRoomProxyInitialFocussedEventIDTimelineItemFactoryReceivedInvocations: [(roomProxy: RoomProxyProtocol, initialFocussedEventID: String?, timelineItemFactory: RoomTimelineItemFactoryProtocol)] = [] + var buildRoomTimelineControllerRoomProxyInitialFocussedEventIDTimelineItemFactoryReceivedArguments: (roomProxy: JoinedRoomProxyProtocol, initialFocussedEventID: String?, timelineItemFactory: RoomTimelineItemFactoryProtocol)? + var buildRoomTimelineControllerRoomProxyInitialFocussedEventIDTimelineItemFactoryReceivedInvocations: [(roomProxy: JoinedRoomProxyProtocol, initialFocussedEventID: String?, timelineItemFactory: RoomTimelineItemFactoryProtocol)] = [] var buildRoomTimelineControllerRoomProxyInitialFocussedEventIDTimelineItemFactoryUnderlyingReturnValue: RoomTimelineControllerProtocol! var buildRoomTimelineControllerRoomProxyInitialFocussedEventIDTimelineItemFactoryReturnValue: RoomTimelineControllerProtocol! { @@ -11720,9 +11809,9 @@ class RoomTimelineControllerFactoryMock: RoomTimelineControllerFactoryProtocol { } } } - var buildRoomTimelineControllerRoomProxyInitialFocussedEventIDTimelineItemFactoryClosure: ((RoomProxyProtocol, String?, RoomTimelineItemFactoryProtocol) -> RoomTimelineControllerProtocol)? + var buildRoomTimelineControllerRoomProxyInitialFocussedEventIDTimelineItemFactoryClosure: ((JoinedRoomProxyProtocol, String?, RoomTimelineItemFactoryProtocol) -> RoomTimelineControllerProtocol)? - func buildRoomTimelineController(roomProxy: RoomProxyProtocol, initialFocussedEventID: String?, timelineItemFactory: RoomTimelineItemFactoryProtocol) -> RoomTimelineControllerProtocol { + func buildRoomTimelineController(roomProxy: JoinedRoomProxyProtocol, initialFocussedEventID: String?, timelineItemFactory: RoomTimelineItemFactoryProtocol) -> RoomTimelineControllerProtocol { buildRoomTimelineControllerRoomProxyInitialFocussedEventIDTimelineItemFactoryCallsCount += 1 buildRoomTimelineControllerRoomProxyInitialFocussedEventIDTimelineItemFactoryReceivedArguments = (roomProxy: roomProxy, initialFocussedEventID: initialFocussedEventID, timelineItemFactory: timelineItemFactory) DispatchQueue.main.async { @@ -11763,8 +11852,8 @@ class RoomTimelineControllerFactoryMock: RoomTimelineControllerFactoryProtocol { var buildRoomPinnedTimelineControllerRoomProxyTimelineItemFactoryCalled: Bool { return buildRoomPinnedTimelineControllerRoomProxyTimelineItemFactoryCallsCount > 0 } - var buildRoomPinnedTimelineControllerRoomProxyTimelineItemFactoryReceivedArguments: (roomProxy: RoomProxyProtocol, timelineItemFactory: RoomTimelineItemFactoryProtocol)? - var buildRoomPinnedTimelineControllerRoomProxyTimelineItemFactoryReceivedInvocations: [(roomProxy: RoomProxyProtocol, timelineItemFactory: RoomTimelineItemFactoryProtocol)] = [] + var buildRoomPinnedTimelineControllerRoomProxyTimelineItemFactoryReceivedArguments: (roomProxy: JoinedRoomProxyProtocol, timelineItemFactory: RoomTimelineItemFactoryProtocol)? + var buildRoomPinnedTimelineControllerRoomProxyTimelineItemFactoryReceivedInvocations: [(roomProxy: JoinedRoomProxyProtocol, timelineItemFactory: RoomTimelineItemFactoryProtocol)] = [] var buildRoomPinnedTimelineControllerRoomProxyTimelineItemFactoryUnderlyingReturnValue: RoomTimelineControllerProtocol? var buildRoomPinnedTimelineControllerRoomProxyTimelineItemFactoryReturnValue: RoomTimelineControllerProtocol? { @@ -11790,9 +11879,9 @@ class RoomTimelineControllerFactoryMock: RoomTimelineControllerFactoryProtocol { } } } - var buildRoomPinnedTimelineControllerRoomProxyTimelineItemFactoryClosure: ((RoomProxyProtocol, RoomTimelineItemFactoryProtocol) async -> RoomTimelineControllerProtocol?)? + var buildRoomPinnedTimelineControllerRoomProxyTimelineItemFactoryClosure: ((JoinedRoomProxyProtocol, RoomTimelineItemFactoryProtocol) async -> RoomTimelineControllerProtocol?)? - func buildRoomPinnedTimelineController(roomProxy: RoomProxyProtocol, timelineItemFactory: RoomTimelineItemFactoryProtocol) async -> RoomTimelineControllerProtocol? { + func buildRoomPinnedTimelineController(roomProxy: JoinedRoomProxyProtocol, timelineItemFactory: RoomTimelineItemFactoryProtocol) async -> RoomTimelineControllerProtocol? { buildRoomPinnedTimelineControllerRoomProxyTimelineItemFactoryCallsCount += 1 buildRoomPinnedTimelineControllerRoomProxyTimelineItemFactoryReceivedArguments = (roomProxy: roomProxy, timelineItemFactory: timelineItemFactory) DispatchQueue.main.async { @@ -15509,8 +15598,8 @@ class VoiceMessageRecorderMock: VoiceMessageRecorderProtocol { var sendVoiceMessageInRoomAudioConverterCalled: Bool { return sendVoiceMessageInRoomAudioConverterCallsCount > 0 } - var sendVoiceMessageInRoomAudioConverterReceivedArguments: (roomProxy: RoomProxyProtocol, audioConverter: AudioConverterProtocol)? - var sendVoiceMessageInRoomAudioConverterReceivedInvocations: [(roomProxy: RoomProxyProtocol, audioConverter: AudioConverterProtocol)] = [] + var sendVoiceMessageInRoomAudioConverterReceivedArguments: (roomProxy: JoinedRoomProxyProtocol, audioConverter: AudioConverterProtocol)? + var sendVoiceMessageInRoomAudioConverterReceivedInvocations: [(roomProxy: JoinedRoomProxyProtocol, audioConverter: AudioConverterProtocol)] = [] var sendVoiceMessageInRoomAudioConverterUnderlyingReturnValue: Result! var sendVoiceMessageInRoomAudioConverterReturnValue: Result! { @@ -15536,9 +15625,9 @@ class VoiceMessageRecorderMock: VoiceMessageRecorderProtocol { } } } - var sendVoiceMessageInRoomAudioConverterClosure: ((RoomProxyProtocol, AudioConverterProtocol) async -> Result)? + var sendVoiceMessageInRoomAudioConverterClosure: ((JoinedRoomProxyProtocol, AudioConverterProtocol) async -> Result)? - func sendVoiceMessage(inRoom roomProxy: RoomProxyProtocol, audioConverter: AudioConverterProtocol) async -> Result { + func sendVoiceMessage(inRoom roomProxy: JoinedRoomProxyProtocol, audioConverter: AudioConverterProtocol) async -> Result { sendVoiceMessageInRoomAudioConverterCallsCount += 1 sendVoiceMessageInRoomAudioConverterReceivedArguments = (roomProxy: roomProxy, audioConverter: audioConverter) DispatchQueue.main.async { diff --git a/ElementX/Sources/Mocks/Generated/SDKGeneratedMocks.swift b/ElementX/Sources/Mocks/Generated/SDKGeneratedMocks.swift index 16157ee58..4776de6d3 100644 --- a/ElementX/Sources/Mocks/Generated/SDKGeneratedMocks.swift +++ b/ElementX/Sources/Mocks/Generated/SDKGeneratedMocks.swift @@ -9863,6 +9863,82 @@ open class NotificationSettingsSDKMock: MatrixRustSDK.NotificationSettings { try await unmuteRoomRoomIdIsEncryptedIsOneToOneClosure?(roomId, isEncrypted, isOneToOne) } } +open class OidcAuthorizationDataSDKMock: MatrixRustSDK.OidcAuthorizationData { + init() { + super.init(noPointer: .init()) + } + + public required init(unsafeFromRawPointer pointer: UnsafeMutableRawPointer) { + fatalError("init(unsafeFromRawPointer:) has not been implemented") + } + + fileprivate var pointer: UnsafeMutableRawPointer! + + //MARK: - loginUrl + + var loginUrlUnderlyingCallsCount = 0 + open var loginUrlCallsCount: Int { + get { + if Thread.isMainThread { + return loginUrlUnderlyingCallsCount + } else { + var returnValue: Int? = nil + DispatchQueue.main.sync { + returnValue = loginUrlUnderlyingCallsCount + } + + return returnValue! + } + } + set { + if Thread.isMainThread { + loginUrlUnderlyingCallsCount = newValue + } else { + DispatchQueue.main.sync { + loginUrlUnderlyingCallsCount = newValue + } + } + } + } + open var loginUrlCalled: Bool { + return loginUrlCallsCount > 0 + } + + var loginUrlUnderlyingReturnValue: String! + open var loginUrlReturnValue: String! { + get { + if Thread.isMainThread { + return loginUrlUnderlyingReturnValue + } else { + var returnValue: String? = nil + DispatchQueue.main.sync { + returnValue = loginUrlUnderlyingReturnValue + } + + return returnValue! + } + } + set { + if Thread.isMainThread { + loginUrlUnderlyingReturnValue = newValue + } else { + DispatchQueue.main.sync { + loginUrlUnderlyingReturnValue = newValue + } + } + } + } + open var loginUrlClosure: (() -> String)? + + open override func loginUrl() -> String { + loginUrlCallsCount += 1 + if let loginUrlClosure = loginUrlClosure { + return loginUrlClosure() + } else { + return loginUrlReturnValue + } + } +} open class QrCodeDataSDKMock: MatrixRustSDK.QrCodeData { init() { super.init(noPointer: .init()) diff --git a/ElementX/Sources/Mocks/RoomProxyMock.swift b/ElementX/Sources/Mocks/JoinedRoomProxyMock.swift similarity index 96% rename from ElementX/Sources/Mocks/RoomProxyMock.swift rename to ElementX/Sources/Mocks/JoinedRoomProxyMock.swift index 21725d80a..9f52b90c4 100644 --- a/ElementX/Sources/Mocks/RoomProxyMock.swift +++ b/ElementX/Sources/Mocks/JoinedRoomProxyMock.swift @@ -17,8 +17,12 @@ import Combine import Foundation +enum RoomProxyMockError: Error { + case generic +} + @MainActor -struct RoomProxyMockConfiguration { +struct JoinedRoomProxyMockConfiguration { var id = UUID().uuidString var name: String? var topic: String? @@ -45,13 +49,9 @@ struct RoomProxyMockConfiguration { var shouldUseAutoUpdatingTimeline = false } -enum RoomProxyMockError: Error { - case generic -} - -extension RoomProxyMock { +extension JoinedRoomProxyMock { @MainActor - convenience init(_ configuration: RoomProxyMockConfiguration) { + convenience init(_ configuration: JoinedRoomProxyMockConfiguration) { self.init() id = configuration.id @@ -86,8 +86,6 @@ extension RoomProxyMock { self.timeline = timeline ownUserID = configuration.ownUserID - membership = .joined - inviterClosure = { configuration.inviter } membersPublisher = CurrentValueSubject(configuration.members).asCurrentValuePublisher() typingMembersPublisher = CurrentValueSubject([]).asCurrentValuePublisher() @@ -96,7 +94,6 @@ extension RoomProxyMock { activeMembersCount = configuration.members.filter { $0.membership == .join || $0.membership == .invite }.count updateMembersClosure = { } - acceptInvitationClosure = { .success(()) } underlyingActionsPublisher = Empty(completeImmediately: false).eraseToAnyPublisher() setNameClosure = { _ in .success(()) } setTopicClosure = { _ in .success(()) } diff --git a/ElementX/Sources/Screens/CallScreen/View/CallScreen.swift b/ElementX/Sources/Screens/CallScreen/View/CallScreen.swift index 7803a1f6f..026ace55f 100644 --- a/ElementX/Sources/Screens/CallScreen/View/CallScreen.swift +++ b/ElementX/Sources/Screens/CallScreen/View/CallScreen.swift @@ -208,7 +208,7 @@ struct CallScreen_Previews: PreviewProvider { clientProxy.getElementWellKnownReturnValue = .success(nil) clientProxy.deviceID = "call-device-id" - let roomProxy = RoomProxyMock() + let roomProxy = JoinedRoomProxyMock() roomProxy.sendCallNotificationIfNeededReturnValue = .success(()) let widgetDriver = ElementCallWidgetDriverMock() diff --git a/ElementX/Sources/Screens/HomeScreen/HomeScreenViewModel.swift b/ElementX/Sources/Screens/HomeScreen/HomeScreenViewModel.swift index 57020416f..16bedbfd8 100644 --- a/ElementX/Sources/Screens/HomeScreen/HomeScreenViewModel.swift +++ b/ElementX/Sources/Screens/HomeScreen/HomeScreenViewModel.swift @@ -142,9 +142,9 @@ class HomeScreenViewModel: HomeScreenViewModelType, HomeScreenViewModelProtocol case .showRoomDetails(roomIdentifier: let roomIdentifier): actionsSubject.send(.presentRoomDetails(roomIdentifier: roomIdentifier)) case .leaveRoom(roomIdentifier: let roomIdentifier): - startLeaveRoomProcess(roomId: roomIdentifier) + startLeaveRoomProcess(roomID: roomIdentifier) case .confirmLeaveRoom(roomIdentifier: let roomIdentifier): - leaveRoom(roomId: roomIdentifier) + Task { await leaveRoom(roomID: roomIdentifier) } case .showSettings: actionsSubject.send(.presentSettingsScreen) case .confirmRecoveryKey: @@ -159,7 +159,7 @@ class HomeScreenViewModel: HomeScreenViewModelType, HomeScreenViewModelProtocol actionsSubject.send(.presentGlobalSearch) case .markRoomAsUnread(let roomIdentifier): Task { - guard let roomProxy = await userSession.clientProxy.roomForIdentifier(roomIdentifier) else { + guard case let .joined(roomProxy) = await userSession.clientProxy.roomForIdentifier(roomIdentifier) else { MXLog.error("Failed retrieving room for identifier: \(roomIdentifier)") return } @@ -173,7 +173,7 @@ class HomeScreenViewModel: HomeScreenViewModelType, HomeScreenViewModelProtocol } case .markRoomAsRead(let roomIdentifier): Task { - guard let roomProxy = await userSession.clientProxy.roomForIdentifier(roomIdentifier) else { + guard case let .joined(roomProxy) = await userSession.clientProxy.roomForIdentifier(roomIdentifier) else { MXLog.error("Failed retrieving room for identifier: \(roomIdentifier)") return } @@ -367,7 +367,7 @@ class HomeScreenViewModel: HomeScreenViewModelType, HomeScreenViewModelProtocol } private func markRoomAsFavourite(_ roomID: String, isFavourite: Bool) async { - guard let roomProxy = await userSession.clientProxy.roomForIdentifier(roomID) else { + guard case let .joined(roomProxy) = await userSession.clientProxy.roomForIdentifier(roomID) else { MXLog.error("Failed retrieving room for identifier: \(roomID)") return } @@ -382,53 +382,47 @@ class HomeScreenViewModel: HomeScreenViewModelType, HomeScreenViewModelProtocol private static let leaveRoomLoadingID = "LeaveRoomLoading" - private func startLeaveRoomProcess(roomId: String) { + private func startLeaveRoomProcess(roomID: String) { Task { defer { userIndicatorController.retractIndicatorWithId(Self.leaveRoomLoadingID) } userIndicatorController.submitIndicator(UserIndicator(id: Self.leaveRoomLoadingID, type: .modal, title: L10n.commonLoading, persistent: true)) - let room = await userSession.clientProxy.roomForIdentifier(roomId) - - guard let room else { + guard case let .joined(roomProxy) = await userSession.clientProxy.roomForIdentifier(roomID) else { state.bindings.alertInfo = AlertInfo(id: UUID(), title: L10n.errorUnknown) return } - if room.isPublic { - state.bindings.leaveRoomAlertItem = LeaveRoomAlertItem(roomID: roomId, isDM: room.isEncryptedOneToOneRoom, state: .public) + if roomProxy.isPublic { + state.bindings.leaveRoomAlertItem = LeaveRoomAlertItem(roomID: roomID, isDM: roomProxy.isEncryptedOneToOneRoom, state: .public) } else { - state.bindings.leaveRoomAlertItem = if room.joinedMembersCount > 1 { - LeaveRoomAlertItem(roomID: roomId, isDM: room.isEncryptedOneToOneRoom, state: .private) + state.bindings.leaveRoomAlertItem = if roomProxy.joinedMembersCount > 1 { + LeaveRoomAlertItem(roomID: roomID, isDM: roomProxy.isEncryptedOneToOneRoom, state: .private) } else { - LeaveRoomAlertItem(roomID: roomId, isDM: room.isEncryptedOneToOneRoom, state: .empty) + LeaveRoomAlertItem(roomID: roomID, isDM: roomProxy.isEncryptedOneToOneRoom, state: .empty) } } } } - private func leaveRoom(roomId: String) { - Task { - defer { - userIndicatorController.retractIndicatorWithId(Self.leaveRoomLoadingID) - } - userIndicatorController.submitIndicator(UserIndicator(id: Self.leaveRoomLoadingID, type: .modal, title: L10n.commonLeavingRoom, persistent: true)) - - let room = await userSession.clientProxy.roomForIdentifier(roomId) - let result = await room?.leaveRoom() - - switch result { - case .none, .some(.failure): - state.bindings.alertInfo = AlertInfo(id: UUID(), title: L10n.errorUnknown) - case .some(.success): - userIndicatorController.submitIndicator(UserIndicator(id: UUID().uuidString, - type: .toast, - title: L10n.commonCurrentUserLeftRoom, - iconName: "checkmark")) - actionsSubject.send(.roomLeft(roomIdentifier: roomId)) - } + private func leaveRoom(roomID: String) async { + defer { + userIndicatorController.retractIndicatorWithId(Self.leaveRoomLoadingID) } + userIndicatorController.submitIndicator(UserIndicator(id: Self.leaveRoomLoadingID, type: .modal, title: L10n.commonLeavingRoom, persistent: true)) + + guard case let .joined(roomProxy) = await userSession.clientProxy.roomForIdentifier(roomID), + case .success = await roomProxy.leaveRoom() else { + state.bindings.alertInfo = AlertInfo(id: UUID(), title: L10n.errorUnknown) + return + } + + userIndicatorController.submitIndicator(UserIndicator(id: UUID().uuidString, + type: .toast, + title: L10n.commonCurrentUserLeftRoom, + iconName: "checkmark")) + actionsSubject.send(.roomLeft(roomIdentifier: roomID)) } // MARK: Invites @@ -440,7 +434,7 @@ class HomeScreenViewModel: HomeScreenViewModelType, HomeScreenViewModelProtocol userIndicatorController.submitIndicator(UserIndicator(id: roomID, type: .modal, title: L10n.commonLoading, persistent: true)) - guard let roomProxy = await userSession.clientProxy.roomForIdentifier(roomID) else { + guard case let .invited(roomProxy) = await userSession.clientProxy.roomForIdentifier(roomID) else { displayError() return } @@ -478,7 +472,7 @@ class HomeScreenViewModel: HomeScreenViewModelType, HomeScreenViewModelProtocol userIndicatorController.submitIndicator(UserIndicator(id: roomID, type: .modal, title: L10n.commonLoading, persistent: true)) - guard let roomProxy = await userSession.clientProxy.roomForIdentifier(roomID) else { + guard case let .invited(roomProxy) = await userSession.clientProxy.roomForIdentifier(roomID) else { displayError() return } diff --git a/ElementX/Sources/Screens/InviteUsersScreen/InviteUsersScreenModels.swift b/ElementX/Sources/Screens/InviteUsersScreen/InviteUsersScreenModels.swift index e52957bb6..513716863 100644 --- a/ElementX/Sources/Screens/InviteUsersScreen/InviteUsersScreenModels.swift +++ b/ElementX/Sources/Screens/InviteUsersScreen/InviteUsersScreenModels.swift @@ -31,7 +31,7 @@ enum InviteUsersScreenViewModelAction { enum InviteUsersScreenRoomType { case draft - case room(roomProxy: RoomProxyProtocol) + case room(roomProxy: JoinedRoomProxyProtocol) } struct InviteUsersScreenViewState: BindableState { diff --git a/ElementX/Sources/Screens/JoinRoomScreen/JoinRoomScreenViewModel.swift b/ElementX/Sources/Screens/JoinRoomScreen/JoinRoomScreenViewModel.swift index c9ec21916..f77afacae 100644 --- a/ElementX/Sources/Screens/JoinRoomScreen/JoinRoomScreenViewModel.swift +++ b/ElementX/Sources/Screens/JoinRoomScreen/JoinRoomScreenViewModel.swift @@ -27,7 +27,7 @@ class JoinRoomScreenViewModel: JoinRoomScreenViewModelType, JoinRoomScreenViewMo private let userIndicatorController: UserIndicatorControllerProtocol private var roomPreviewDetails: RoomPreviewDetails? - private var roomProxy: RoomProxyProtocol? + private var room: RoomProxyType? private let actionsSubject: PassthroughSubject = .init() var actionsPublisher: AnyPublisher { @@ -89,8 +89,8 @@ class JoinRoomScreenViewModel: JoinRoomScreenViewModelType, JoinRoomScreenViewMo // See if we known about the room locally and, if so, have that // take priority over the preview one. - if let roomProxy = await clientProxy.roomForIdentifier(roomID) { - self.roomProxy = roomProxy + if let room = await clientProxy.roomForIdentifier(roomID) { + self.room = room await updateRoomDetails() } @@ -106,8 +106,20 @@ class JoinRoomScreenViewModel: JoinRoomScreenViewModelType, JoinRoomScreenViewMo } private func updateRoomDetails() async { + var roomProxy: RoomProxyProtocol? + var inviter: RoomInviterDetails? + + switch room { + case .joined(let joinedRoomProxy): + roomProxy = joinedRoomProxy + case .invited(let invitedRoomProxy): + inviter = await invitedRoomProxy.inviter.flatMap(RoomInviterDetails.init) + roomProxy = invitedRoomProxy + default: + break + } + let name = roomProxy?.name ?? roomPreviewDetails?.name - let inviter = await roomProxy?.inviter.flatMap(RoomInviterDetails.init) state.roomDetails = JoinRoomScreenRoomDetails(name: name, topic: roomProxy?.topic ?? roomPreviewDetails?.topic, canonicalAlias: roomProxy?.canonicalAlias ?? roomPreviewDetails?.canonicalAlias, @@ -119,9 +131,18 @@ class JoinRoomScreenViewModel: JoinRoomScreenViewModelType, JoinRoomScreenViewMo } private func updateMode() { - if roomProxy?.membership == .invited || roomPreviewDetails?.isInvited ?? false { // Check invites first to show Accept/Decline buttons on public rooms. + // Check invites first to show Accept/Decline buttons on public rooms. + if case .invited = room { state.mode = .invited - } else if roomProxy?.isPublic ?? false || roomPreviewDetails?.isPublic ?? false { + return + } + + if roomPreviewDetails?.isInvited ?? false { + state.mode = .invited + return + } + + if roomPreviewDetails?.isPublic ?? false { state.mode = .join } else if roomPreviewDetails?.canKnock ?? false, allowKnocking { // Knocking is not supported yet, the flag is purely for preview tests. state.mode = .knock @@ -180,7 +201,7 @@ class JoinRoomScreenViewModel: JoinRoomScreenViewModelType, JoinRoomScreenViewMo userIndicatorController.submitIndicator(UserIndicator(id: roomID, type: .modal, title: L10n.commonLoading, persistent: true)) - guard let roomProxy = await clientProxy.roomForIdentifier(roomID) else { + guard case let .invited(roomProxy) = room else { userIndicatorController.submitIndicator(.init(title: L10n.errorUnknown)) return } diff --git a/ElementX/Sources/Screens/MediaUploadPreviewScreen/MediaUploadPreviewScreenCoordinator.swift b/ElementX/Sources/Screens/MediaUploadPreviewScreen/MediaUploadPreviewScreenCoordinator.swift index 253ec3f21..c9dcdc80a 100644 --- a/ElementX/Sources/Screens/MediaUploadPreviewScreen/MediaUploadPreviewScreenCoordinator.swift +++ b/ElementX/Sources/Screens/MediaUploadPreviewScreen/MediaUploadPreviewScreenCoordinator.swift @@ -19,7 +19,7 @@ import SwiftUI struct MediaUploadPreviewScreenCoordinatorParameters { let userIndicatorController: UserIndicatorControllerProtocol - let roomProxy: RoomProxyProtocol + let roomProxy: JoinedRoomProxyProtocol let mediaUploadingPreprocessor: MediaUploadingPreprocessor let title: String? let url: URL diff --git a/ElementX/Sources/Screens/MediaUploadPreviewScreen/MediaUploadPreviewScreenViewModel.swift b/ElementX/Sources/Screens/MediaUploadPreviewScreen/MediaUploadPreviewScreenViewModel.swift index a97369676..c9b2196c7 100644 --- a/ElementX/Sources/Screens/MediaUploadPreviewScreen/MediaUploadPreviewScreenViewModel.swift +++ b/ElementX/Sources/Screens/MediaUploadPreviewScreen/MediaUploadPreviewScreenViewModel.swift @@ -22,7 +22,7 @@ typealias MediaUploadPreviewScreenViewModelType = StateStoreViewModel = .init() @@ -30,7 +30,7 @@ class ReportContentScreenViewModel: ReportContentScreenViewModelType, ReportCont actionsSubject.eraseToAnyPublisher() } - init(eventID: String, senderID: String, roomProxy: RoomProxyProtocol, clientProxy: ClientProxyProtocol) { + init(eventID: String, senderID: String, roomProxy: JoinedRoomProxyProtocol, clientProxy: ClientProxyProtocol) { self.eventID = eventID self.senderID = senderID self.roomProxy = roomProxy diff --git a/ElementX/Sources/Screens/ReportContentScreen/View/ReportContentScreen.swift b/ElementX/Sources/Screens/ReportContentScreen/View/ReportContentScreen.swift index 9d582b67a..52367b93b 100644 --- a/ElementX/Sources/Screens/ReportContentScreen/View/ReportContentScreen.swift +++ b/ElementX/Sources/Screens/ReportContentScreen/View/ReportContentScreen.swift @@ -77,7 +77,7 @@ struct ReportContentScreen: View { struct ReportContentScreen_Previews: PreviewProvider, TestablePreview { static let viewModel = ReportContentScreenViewModel(eventID: "", senderID: "", - roomProxy: RoomProxyMock(.init()), + roomProxy: JoinedRoomProxyMock(.init()), clientProxy: ClientProxyMock(.init())) static var previews: some View { diff --git a/ElementX/Sources/Screens/RoomChangePermissionsScreen/RoomChangePermissionsScreenCoordinator.swift b/ElementX/Sources/Screens/RoomChangePermissionsScreen/RoomChangePermissionsScreenCoordinator.swift index 2ceb15530..9c60e3b76 100644 --- a/ElementX/Sources/Screens/RoomChangePermissionsScreen/RoomChangePermissionsScreenCoordinator.swift +++ b/ElementX/Sources/Screens/RoomChangePermissionsScreen/RoomChangePermissionsScreenCoordinator.swift @@ -20,7 +20,7 @@ import SwiftUI struct RoomChangePermissionsScreenCoordinatorParameters { let permissions: RoomPermissions let permissionsGroup: RoomRolesAndPermissionsScreenPermissionsGroup - let roomProxy: RoomProxyProtocol + let roomProxy: JoinedRoomProxyProtocol let userIndicatorController: UserIndicatorControllerProtocol let analytics: AnalyticsService } diff --git a/ElementX/Sources/Screens/RoomChangePermissionsScreen/RoomChangePermissionsScreenViewModel.swift b/ElementX/Sources/Screens/RoomChangePermissionsScreen/RoomChangePermissionsScreenViewModel.swift index b377cf922..daa54c935 100644 --- a/ElementX/Sources/Screens/RoomChangePermissionsScreen/RoomChangePermissionsScreenViewModel.swift +++ b/ElementX/Sources/Screens/RoomChangePermissionsScreen/RoomChangePermissionsScreenViewModel.swift @@ -21,7 +21,7 @@ import SwiftUI typealias RoomChangePermissionsScreenViewModelType = StateStoreViewModel class RoomChangePermissionsScreenViewModel: RoomChangePermissionsScreenViewModelType, RoomChangePermissionsScreenViewModelProtocol { - private let roomProxy: RoomProxyProtocol + private let roomProxy: JoinedRoomProxyProtocol private let userIndicatorController: UserIndicatorControllerProtocol private let analytics: AnalyticsService @@ -32,7 +32,7 @@ class RoomChangePermissionsScreenViewModel: RoomChangePermissionsScreenViewModel init(currentPermissions: RoomPermissions, group: RoomRolesAndPermissionsScreenPermissionsGroup, - roomProxy: RoomProxyProtocol, + roomProxy: JoinedRoomProxyProtocol, userIndicatorController: UserIndicatorControllerProtocol, analytics: AnalyticsService) { self.roomProxy = roomProxy diff --git a/ElementX/Sources/Screens/RoomChangePermissionsScreen/View/RoomChangePermissionsScreen.swift b/ElementX/Sources/Screens/RoomChangePermissionsScreen/View/RoomChangePermissionsScreen.swift index b89e2fa85..12aa80b39 100644 --- a/ElementX/Sources/Screens/RoomChangePermissionsScreen/View/RoomChangePermissionsScreen.swift +++ b/ElementX/Sources/Screens/RoomChangePermissionsScreen/View/RoomChangePermissionsScreen.swift @@ -86,7 +86,7 @@ struct RoomChangePermissionsScreen_Previews: PreviewProvider, TestablePreview { static func makeViewModel(group: RoomRolesAndPermissionsScreenPermissionsGroup) -> RoomChangePermissionsScreenViewModel { RoomChangePermissionsScreenViewModel(currentPermissions: .init(powerLevels: .mock), group: group, - roomProxy: RoomProxyMock(.init()), + roomProxy: JoinedRoomProxyMock(.init()), userIndicatorController: UserIndicatorControllerMock(), analytics: ServiceLocator.shared.analytics) } diff --git a/ElementX/Sources/Screens/RoomChangeRolesScreen/RoomChangeRolesScreenCoordinator.swift b/ElementX/Sources/Screens/RoomChangeRolesScreen/RoomChangeRolesScreenCoordinator.swift index 854fd6639..cb1c573df 100644 --- a/ElementX/Sources/Screens/RoomChangeRolesScreen/RoomChangeRolesScreenCoordinator.swift +++ b/ElementX/Sources/Screens/RoomChangeRolesScreen/RoomChangeRolesScreenCoordinator.swift @@ -19,7 +19,7 @@ import SwiftUI struct RoomChangeRolesScreenCoordinatorParameters { let mode: RoomMemberDetails.Role - let roomProxy: RoomProxyProtocol + let roomProxy: JoinedRoomProxyProtocol let mediaProvider: MediaProviderProtocol let userIndicatorController: UserIndicatorControllerProtocol let analytics: AnalyticsService diff --git a/ElementX/Sources/Screens/RoomChangeRolesScreen/RoomChangeRolesScreenViewModel.swift b/ElementX/Sources/Screens/RoomChangeRolesScreen/RoomChangeRolesScreenViewModel.swift index 016c235c1..a1e3d7b1e 100644 --- a/ElementX/Sources/Screens/RoomChangeRolesScreen/RoomChangeRolesScreenViewModel.swift +++ b/ElementX/Sources/Screens/RoomChangeRolesScreen/RoomChangeRolesScreenViewModel.swift @@ -20,7 +20,7 @@ import SwiftUI typealias RoomChangeRolesScreenViewModelType = StateStoreViewModel class RoomChangeRolesScreenViewModel: RoomChangeRolesScreenViewModelType, RoomChangeRolesScreenViewModelProtocol { - private let roomProxy: RoomProxyProtocol + private let roomProxy: JoinedRoomProxyProtocol private let userIndicatorController: UserIndicatorControllerProtocol private let analytics: AnalyticsService @@ -30,7 +30,7 @@ class RoomChangeRolesScreenViewModel: RoomChangeRolesScreenViewModelType, RoomCh } init(mode: RoomMemberDetails.Role, - roomProxy: RoomProxyProtocol, + roomProxy: JoinedRoomProxyProtocol, mediaProvider: MediaProviderProtocol, userIndicatorController: UserIndicatorControllerProtocol, analytics: AnalyticsService) { diff --git a/ElementX/Sources/Screens/RoomChangeRolesScreen/View/RoomChangeRolesScreen.swift b/ElementX/Sources/Screens/RoomChangeRolesScreen/View/RoomChangeRolesScreen.swift index 11bee0f65..9cbe4c285 100644 --- a/ElementX/Sources/Screens/RoomChangeRolesScreen/View/RoomChangeRolesScreen.swift +++ b/ElementX/Sources/Screens/RoomChangeRolesScreen/View/RoomChangeRolesScreen.swift @@ -130,7 +130,7 @@ struct RoomChangeRolesScreen_Previews: PreviewProvider, TestablePreview { static func makeViewModel(mode: RoomMemberDetails.Role) -> RoomChangeRolesScreenViewModel { RoomChangeRolesScreenViewModel(mode: mode, - roomProxy: RoomProxyMock(.init(members: .allMembersAsAdmin)), + roomProxy: JoinedRoomProxyMock(.init(members: .allMembersAsAdmin)), mediaProvider: MockMediaProvider(), userIndicatorController: UserIndicatorControllerMock(), analytics: ServiceLocator.shared.analytics) diff --git a/ElementX/Sources/Screens/RoomDetailsEditScreen/RoomDetailsEditScreenCoordinator.swift b/ElementX/Sources/Screens/RoomDetailsEditScreen/RoomDetailsEditScreenCoordinator.swift index 11d9a74e3..0d5d9bf30 100644 --- a/ElementX/Sources/Screens/RoomDetailsEditScreen/RoomDetailsEditScreenCoordinator.swift +++ b/ElementX/Sources/Screens/RoomDetailsEditScreen/RoomDetailsEditScreenCoordinator.swift @@ -18,7 +18,7 @@ import Combine import SwiftUI struct RoomDetailsEditScreenCoordinatorParameters { - let roomProxy: RoomProxyProtocol + let roomProxy: JoinedRoomProxyProtocol let mediaProvider: MediaProviderProtocol weak var navigationStackCoordinator: NavigationStackCoordinator? let userIndicatorController: UserIndicatorControllerProtocol diff --git a/ElementX/Sources/Screens/RoomDetailsEditScreen/RoomDetailsEditScreenViewModel.swift b/ElementX/Sources/Screens/RoomDetailsEditScreen/RoomDetailsEditScreenViewModel.swift index 7e65f13bb..8d2db01d4 100644 --- a/ElementX/Sources/Screens/RoomDetailsEditScreen/RoomDetailsEditScreenViewModel.swift +++ b/ElementX/Sources/Screens/RoomDetailsEditScreen/RoomDetailsEditScreenViewModel.swift @@ -21,7 +21,7 @@ typealias RoomDetailsEditScreenViewModelType = StateStoreViewModel = .init() - private let roomProxy: RoomProxyProtocol + private let roomProxy: JoinedRoomProxyProtocol private let userIndicatorController: UserIndicatorControllerProtocol private let mediaPreprocessor: MediaUploadingPreprocessor = .init() @@ -29,7 +29,7 @@ class RoomDetailsEditScreenViewModel: RoomDetailsEditScreenViewModelType, RoomDe actionsSubject.eraseToAnyPublisher() } - init(roomProxy: RoomProxyProtocol, + init(roomProxy: JoinedRoomProxyProtocol, mediaProvider: MediaProviderProtocol, userIndicatorController: UserIndicatorControllerProtocol) { self.roomProxy = roomProxy diff --git a/ElementX/Sources/Screens/RoomDetailsEditScreen/View/RoomDetailsEditScreen.swift b/ElementX/Sources/Screens/RoomDetailsEditScreen/View/RoomDetailsEditScreen.swift index 67e14224c..0ffe6aa74 100644 --- a/ElementX/Sources/Screens/RoomDetailsEditScreen/View/RoomDetailsEditScreen.swift +++ b/ElementX/Sources/Screens/RoomDetailsEditScreen/View/RoomDetailsEditScreen.swift @@ -157,9 +157,9 @@ struct RoomDetailsEditScreen: View { struct RoomDetailsEditScreen_Previews: PreviewProvider, TestablePreview { static let editableViewModel = { - let roomProxy = RoomProxyMock(.init(id: "test_id", - name: "Room", - members: [.mockMeAdmin])) + let roomProxy = JoinedRoomProxyMock(.init(id: "test_id", + name: "Room", + members: [.mockMeAdmin])) return RoomDetailsEditScreenViewModel(roomProxy: roomProxy, mediaProvider: MockMediaProvider(), @@ -167,9 +167,9 @@ struct RoomDetailsEditScreen_Previews: PreviewProvider, TestablePreview { }() static let readOnlyViewModel = { - let roomProxy = RoomProxyMock(.init(id: "test_id", - name: "Room", - members: [.mockAlice])) + let roomProxy = JoinedRoomProxyMock(.init(id: "test_id", + name: "Room", + members: [.mockAlice])) return RoomDetailsEditScreenViewModel(roomProxy: roomProxy, mediaProvider: MockMediaProvider(), diff --git a/ElementX/Sources/Screens/RoomDetailsScreen/RoomDetailsScreenCoordinator.swift b/ElementX/Sources/Screens/RoomDetailsScreen/RoomDetailsScreenCoordinator.swift index 5a430f3e6..70fa84fc4 100644 --- a/ElementX/Sources/Screens/RoomDetailsScreen/RoomDetailsScreenCoordinator.swift +++ b/ElementX/Sources/Screens/RoomDetailsScreen/RoomDetailsScreenCoordinator.swift @@ -18,7 +18,7 @@ import Combine import SwiftUI struct RoomDetailsScreenCoordinatorParameters { - let roomProxy: RoomProxyProtocol + let roomProxy: JoinedRoomProxyProtocol let clientProxy: ClientProxyProtocol let mediaProvider: MediaProviderProtocol let analyticsService: AnalyticsService diff --git a/ElementX/Sources/Screens/RoomDetailsScreen/RoomDetailsScreenViewModel.swift b/ElementX/Sources/Screens/RoomDetailsScreen/RoomDetailsScreenViewModel.swift index edb9fb96e..7af502d71 100644 --- a/ElementX/Sources/Screens/RoomDetailsScreen/RoomDetailsScreenViewModel.swift +++ b/ElementX/Sources/Screens/RoomDetailsScreen/RoomDetailsScreenViewModel.swift @@ -20,7 +20,7 @@ import SwiftUI typealias RoomDetailsScreenViewModelType = StateStoreViewModel class RoomDetailsScreenViewModel: RoomDetailsScreenViewModelType, RoomDetailsScreenViewModelProtocol { - private let roomProxy: RoomProxyProtocol + private let roomProxy: JoinedRoomProxyProtocol private let clientProxy: ClientProxyProtocol private let analyticsService: AnalyticsService private let mediaProvider: MediaProviderProtocol @@ -54,7 +54,7 @@ class RoomDetailsScreenViewModel: RoomDetailsScreenViewModelType, RoomDetailsScr actionsSubject.eraseToAnyPublisher() } - init(roomProxy: RoomProxyProtocol, + init(roomProxy: JoinedRoomProxyProtocol, clientProxy: ClientProxyProtocol, mediaProvider: MediaProviderProtocol, analyticsService: AnalyticsService, diff --git a/ElementX/Sources/Screens/RoomDetailsScreen/View/RoomDetailsScreen.swift b/ElementX/Sources/Screens/RoomDetailsScreen/View/RoomDetailsScreen.swift index 838a6a504..3f516e6d5 100644 --- a/ElementX/Sources/Screens/RoomDetailsScreen/View/RoomDetailsScreen.swift +++ b/ElementX/Sources/Screens/RoomDetailsScreen/View/RoomDetailsScreen.swift @@ -311,20 +311,20 @@ struct RoomDetailsScreen_Previews: PreviewProvider, TestablePreview { .mockBob, .mockCharlie ] - let roomProxy = RoomProxyMock(.init(id: "room_a_id", - name: "Room A", - topic: """ - Discussions about Element X iOS | https://github.com/vector-im/element-x-ios - - Feature Status: https://github.com/vector-im/element-x-ios/issues/1225 - - App Store: https://apple.co/3r6LJHZ - TestFlight: https://testflight.apple.com/join/uZbeZCOi - """, - isDirect: false, - isEncrypted: true, - canonicalAlias: "#alias:domain.com", - members: members)) + let roomProxy = JoinedRoomProxyMock(.init(id: "room_a_id", + name: "Room A", + topic: """ + Discussions about Element X iOS | https://github.com/vector-im/element-x-ios + + Feature Status: https://github.com/vector-im/element-x-ios/issues/1225 + + App Store: https://apple.co/3r6LJHZ + TestFlight: https://testflight.apple.com/join/uZbeZCOi + """, + isDirect: false, + isEncrypted: true, + canonicalAlias: "#alias:domain.com", + members: members)) var notificationSettingsProxyMockConfiguration = NotificationSettingsProxyMockConfiguration() notificationSettingsProxyMockConfiguration.roomMode.isDefault = false @@ -349,13 +349,13 @@ struct RoomDetailsScreen_Previews: PreviewProvider, TestablePreview { .mockDan ] - let roomProxy = RoomProxyMock(.init(id: "dm_room_id", - name: "DM Room", - topic: "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.", - isDirect: true, - isEncrypted: true, - canonicalAlias: "#alias:domain.com", - members: members)) + let roomProxy = JoinedRoomProxyMock(.init(id: "dm_room_id", + name: "DM Room", + topic: "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.", + isDirect: true, + isEncrypted: true, + canonicalAlias: "#alias:domain.com", + members: members)) let notificationSettingsProxy = NotificationSettingsProxyMock(with: .init()) let appSettings = AppSettings() appSettings.pinningEnabled = true @@ -378,11 +378,11 @@ struct RoomDetailsScreen_Previews: PreviewProvider, TestablePreview { .mockBob, .mockCharlie ] - let roomProxy = RoomProxyMock(.init(id: "simple_room_id", - name: "Room A", - isDirect: false, - isEncrypted: false, - members: members)) + let roomProxy = JoinedRoomProxyMock(.init(id: "simple_room_id", + name: "Room A", + isDirect: false, + isEncrypted: false, + members: members)) let notificationSettingsProxy = NotificationSettingsProxyMock(with: .init()) let appSettings = AppSettings() appSettings.pinningEnabled = true diff --git a/ElementX/Sources/Screens/RoomMemberDetailsScreen/RoomMemberDetailsScreenCoordinator.swift b/ElementX/Sources/Screens/RoomMemberDetailsScreen/RoomMemberDetailsScreenCoordinator.swift index d5c3d5abf..a095d6f6c 100644 --- a/ElementX/Sources/Screens/RoomMemberDetailsScreen/RoomMemberDetailsScreenCoordinator.swift +++ b/ElementX/Sources/Screens/RoomMemberDetailsScreen/RoomMemberDetailsScreenCoordinator.swift @@ -19,7 +19,7 @@ import SwiftUI struct RoomMemberDetailsScreenCoordinatorParameters { let userID: String - let roomProxy: RoomProxyProtocol + let roomProxy: JoinedRoomProxyProtocol let clientProxy: ClientProxyProtocol let mediaProvider: MediaProviderProtocol let userIndicatorController: UserIndicatorControllerProtocol diff --git a/ElementX/Sources/Screens/RoomMemberDetailsScreen/RoomMemberDetailsScreenViewModel.swift b/ElementX/Sources/Screens/RoomMemberDetailsScreen/RoomMemberDetailsScreenViewModel.swift index 07a2a6441..1d5193e37 100644 --- a/ElementX/Sources/Screens/RoomMemberDetailsScreen/RoomMemberDetailsScreenViewModel.swift +++ b/ElementX/Sources/Screens/RoomMemberDetailsScreen/RoomMemberDetailsScreenViewModel.swift @@ -20,7 +20,7 @@ import SwiftUI typealias RoomMemberDetailsScreenViewModelType = StateStoreViewModel class RoomMemberDetailsScreenViewModel: RoomMemberDetailsScreenViewModelType, RoomMemberDetailsScreenViewModelProtocol { - private let roomProxy: RoomProxyProtocol + private let roomProxy: JoinedRoomProxyProtocol private let clientProxy: ClientProxyProtocol private let mediaProvider: MediaProviderProtocol private let userIndicatorController: UserIndicatorControllerProtocol @@ -35,7 +35,7 @@ class RoomMemberDetailsScreenViewModel: RoomMemberDetailsScreenViewModelType, Ro } init(userID: String, - roomProxy: RoomProxyProtocol, + roomProxy: JoinedRoomProxyProtocol, clientProxy: ClientProxyProtocol, mediaProvider: MediaProviderProtocol, userIndicatorController: UserIndicatorControllerProtocol, diff --git a/ElementX/Sources/Screens/RoomMemberDetailsScreen/View/RoomMemberDetailsScreen.swift b/ElementX/Sources/Screens/RoomMemberDetailsScreen/View/RoomMemberDetailsScreen.swift index e69e29a87..8c823e2fd 100644 --- a/ElementX/Sources/Screens/RoomMemberDetailsScreen/View/RoomMemberDetailsScreen.swift +++ b/ElementX/Sources/Screens/RoomMemberDetailsScreen/View/RoomMemberDetailsScreen.swift @@ -143,7 +143,7 @@ struct RoomMemberDetailsScreen_Previews: PreviewProvider, TestablePreview { } static func makeViewModel(member: RoomMemberProxyMock) -> RoomMemberDetailsScreenViewModel { - let roomProxyMock = RoomProxyMock(.init(name: "")) + let roomProxyMock = JoinedRoomProxyMock(.init(name: "")) roomProxyMock.getMemberUserIDReturnValue = .success(member) let clientProxyMock = ClientProxyMock(.init()) diff --git a/ElementX/Sources/Screens/RoomMemberListScreen/RoomMembersListScreenCoordinator.swift b/ElementX/Sources/Screens/RoomMemberListScreen/RoomMembersListScreenCoordinator.swift index 44fbeaf5c..2a0ccffbe 100644 --- a/ElementX/Sources/Screens/RoomMemberListScreen/RoomMembersListScreenCoordinator.swift +++ b/ElementX/Sources/Screens/RoomMemberListScreen/RoomMembersListScreenCoordinator.swift @@ -19,7 +19,7 @@ import SwiftUI struct RoomMembersListScreenCoordinatorParameters { let mediaProvider: MediaProviderProtocol - let roomProxy: RoomProxyProtocol + let roomProxy: JoinedRoomProxyProtocol let userIndicatorController: UserIndicatorControllerProtocol let analytics: AnalyticsService } diff --git a/ElementX/Sources/Screens/RoomMemberListScreen/RoomMembersListScreenViewModel.swift b/ElementX/Sources/Screens/RoomMemberListScreen/RoomMembersListScreenViewModel.swift index ab5f3eb2a..d3717b05b 100644 --- a/ElementX/Sources/Screens/RoomMemberListScreen/RoomMembersListScreenViewModel.swift +++ b/ElementX/Sources/Screens/RoomMemberListScreen/RoomMembersListScreenViewModel.swift @@ -20,7 +20,7 @@ import SwiftUI typealias RoomMembersListScreenViewModelType = StateStoreViewModel class RoomMembersListScreenViewModel: RoomMembersListScreenViewModelType, RoomMembersListScreenViewModelProtocol { - private let roomProxy: RoomProxyProtocol + private let roomProxy: JoinedRoomProxyProtocol private let userIndicatorController: UserIndicatorControllerProtocol private let analytics: AnalyticsService @@ -33,7 +33,7 @@ class RoomMembersListScreenViewModel: RoomMembersListScreenViewModelType, RoomMe } init(initialMode: RoomMembersListScreenMode = .members, - roomProxy: RoomProxyProtocol, + roomProxy: JoinedRoomProxyProtocol, mediaProvider: MediaProviderProtocol, userIndicatorController: UserIndicatorControllerProtocol, analytics: AnalyticsService) { diff --git a/ElementX/Sources/Screens/RoomMemberListScreen/View/RoomMembersListManageMemberSheet.swift b/ElementX/Sources/Screens/RoomMemberListScreen/View/RoomMembersListManageMemberSheet.swift index f1bd9b04d..f5b0609ad 100644 --- a/ElementX/Sources/Screens/RoomMemberListScreen/View/RoomMembersListManageMemberSheet.swift +++ b/ElementX/Sources/Screens/RoomMemberListScreen/View/RoomMembersListManageMemberSheet.swift @@ -108,7 +108,7 @@ struct RoomMembersListManageMemberSheetLive_Previews: PreviewProvider { private extension RoomMembersListScreenViewModel { static var mock: RoomMembersListScreenViewModel { RoomMembersListScreenViewModel(initialMode: .members, - roomProxy: RoomProxyMock(.init(members: .allMembersAsAdmin)), + roomProxy: JoinedRoomProxyMock(.init(members: .allMembersAsAdmin)), mediaProvider: MockMediaProvider(), userIndicatorController: ServiceLocator.shared.userIndicatorController, analytics: ServiceLocator.shared.analytics) diff --git a/ElementX/Sources/Screens/RoomMemberListScreen/View/RoomMembersListScreen.swift b/ElementX/Sources/Screens/RoomMemberListScreen/View/RoomMembersListScreen.swift index ee2ca9c2a..382bd89f3 100644 --- a/ElementX/Sources/Screens/RoomMemberListScreen/View/RoomMembersListScreen.swift +++ b/ElementX/Sources/Screens/RoomMemberListScreen/View/RoomMembersListScreen.swift @@ -179,10 +179,10 @@ struct RoomMembersListScreen_Previews: PreviewProvider, TestablePreview { } return RoomMembersListScreenViewModel(initialMode: initialMode, - roomProxy: RoomProxyMock(.init(name: "Some room", - members: members, - ownUserID: ownUserID, - canUserInvite: false)), + roomProxy: JoinedRoomProxyMock(.init(name: "Some room", + members: members, + ownUserID: ownUserID, + canUserInvite: false)), mediaProvider: MockMediaProvider(), userIndicatorController: ServiceLocator.shared.userIndicatorController, analytics: ServiceLocator.shared.analytics) diff --git a/ElementX/Sources/Screens/RoomMemberListScreen/View/RoomMembersListScreenMemberCell.swift b/ElementX/Sources/Screens/RoomMemberListScreen/View/RoomMembersListScreenMemberCell.swift index 98add929c..7623366c0 100644 --- a/ElementX/Sources/Screens/RoomMemberListScreen/View/RoomMembersListScreenMemberCell.swift +++ b/ElementX/Sources/Screens/RoomMemberListScreen/View/RoomMembersListScreenMemberCell.swift @@ -106,8 +106,8 @@ struct RoomMembersListMemberCell_Previews: PreviewProvider, TestablePreview { .init(with: .init(userID: "@badavatar:matrix.org", avatarURL: .picturesDirectory, membership: .ban)) ] - static let viewModel = RoomMembersListScreenViewModel(roomProxy: RoomProxyMock(.init(name: "Some room", - members: members)), + static let viewModel = RoomMembersListScreenViewModel(roomProxy: JoinedRoomProxyMock(.init(name: "Some room", + members: members)), mediaProvider: MockMediaProvider(), userIndicatorController: ServiceLocator.shared.userIndicatorController, analytics: ServiceLocator.shared.analytics) diff --git a/ElementX/Sources/Screens/RoomNotificationSettingsScreen/RoomNotificationSettingsScreenCoordinator.swift b/ElementX/Sources/Screens/RoomNotificationSettingsScreen/RoomNotificationSettingsScreenCoordinator.swift index c0b2330ee..293c47c33 100644 --- a/ElementX/Sources/Screens/RoomNotificationSettingsScreen/RoomNotificationSettingsScreenCoordinator.swift +++ b/ElementX/Sources/Screens/RoomNotificationSettingsScreen/RoomNotificationSettingsScreenCoordinator.swift @@ -20,7 +20,7 @@ import SwiftUI struct RoomNotificationSettingsScreenCoordinatorParameters { weak var navigationStackCoordinator: NavigationStackCoordinator? let notificationSettingsProxy: NotificationSettingsProxyProtocol - let roomProxy: RoomProxyProtocol + let roomProxy: JoinedRoomProxyProtocol let displayAsUserDefinedRoomSettings: Bool } diff --git a/ElementX/Sources/Screens/RoomNotificationSettingsScreen/RoomNotificationSettingsScreenViewModel.swift b/ElementX/Sources/Screens/RoomNotificationSettingsScreen/RoomNotificationSettingsScreenViewModel.swift index e3fe9b2ca..e7e146ae5 100644 --- a/ElementX/Sources/Screens/RoomNotificationSettingsScreen/RoomNotificationSettingsScreenViewModel.swift +++ b/ElementX/Sources/Screens/RoomNotificationSettingsScreen/RoomNotificationSettingsScreenViewModel.swift @@ -22,7 +22,7 @@ typealias RoomNotificationSettingsScreenViewModelType = StateStoreViewModel = .init() private let notificationSettingsProxy: NotificationSettingsProxyProtocol - private let roomProxy: RoomProxyProtocol + private let roomProxy: JoinedRoomProxyProtocol // periphery:ignore - cancellable tasks cancel when reassigned @CancellableTask private var fetchNotificationSettingsTask: Task? @@ -31,7 +31,7 @@ class RoomNotificationSettingsScreenViewModel: RoomNotificationSettingsScreenVie actionsSubject.eraseToAnyPublisher() } - init(notificationSettingsProxy: NotificationSettingsProxyProtocol, roomProxy: RoomProxyProtocol, displayAsUserDefinedRoomSettings: Bool) { + init(notificationSettingsProxy: NotificationSettingsProxyProtocol, roomProxy: JoinedRoomProxyProtocol, displayAsUserDefinedRoomSettings: Bool) { let bindings = RoomNotificationSettingsScreenViewStateBindings() self.notificationSettingsProxy = notificationSettingsProxy self.roomProxy = roomProxy diff --git a/ElementX/Sources/Screens/RoomNotificationSettingsScreen/View/RoomNotificationSettingsCustomSectionView.swift b/ElementX/Sources/Screens/RoomNotificationSettingsScreen/View/RoomNotificationSettingsCustomSectionView.swift index eb70d56af..d8a038e34 100644 --- a/ElementX/Sources/Screens/RoomNotificationSettingsScreen/View/RoomNotificationSettingsCustomSectionView.swift +++ b/ElementX/Sources/Screens/RoomNotificationSettingsScreen/View/RoomNotificationSettingsCustomSectionView.swift @@ -42,7 +42,7 @@ struct RoomNotificationSettingsCustomSectionView_Previews: PreviewProvider, Test static let viewModel = { let notificationSettingsProxy = NotificationSettingsProxyMock(with: .init(defaultRoomMode: .allMessages, roomMode: .mentionsAndKeywordsOnly)) - let roomProxy = RoomProxyMock(.init(name: "Room", isEncrypted: true)) + let roomProxy = JoinedRoomProxyMock(.init(name: "Room", isEncrypted: true)) return RoomNotificationSettingsScreenViewModel(notificationSettingsProxy: notificationSettingsProxy, roomProxy: roomProxy, @@ -52,7 +52,7 @@ struct RoomNotificationSettingsCustomSectionView_Previews: PreviewProvider, Test static let viewModelUnencrypted = { let notificationSettingsProxy = NotificationSettingsProxyMock(with: .init(defaultRoomMode: .allMessages, roomMode: .mentionsAndKeywordsOnly)) - let roomProxy = RoomProxyMock(.init(name: "Room", isEncrypted: false)) + let roomProxy = JoinedRoomProxyMock(.init(name: "Room", isEncrypted: false)) return RoomNotificationSettingsScreenViewModel(notificationSettingsProxy: notificationSettingsProxy, roomProxy: roomProxy, diff --git a/ElementX/Sources/Screens/RoomNotificationSettingsScreen/View/RoomNotificationSettingsScreen.swift b/ElementX/Sources/Screens/RoomNotificationSettingsScreen/View/RoomNotificationSettingsScreen.swift index e9c7bdbf6..75540c258 100644 --- a/ElementX/Sources/Screens/RoomNotificationSettingsScreen/View/RoomNotificationSettingsScreen.swift +++ b/ElementX/Sources/Screens/RoomNotificationSettingsScreen/View/RoomNotificationSettingsScreen.swift @@ -83,7 +83,7 @@ struct RoomNotificationSettingsScreen_Previews: PreviewProvider, TestablePreview static let viewModel = { let notificationSettingsProxy = NotificationSettingsProxyMock(with: .init(defaultRoomMode: .mentionsAndKeywordsOnly, roomMode: .mentionsAndKeywordsOnly)) - let roomProxy = RoomProxyMock(.init(name: "Room", isEncrypted: true)) + let roomProxy = JoinedRoomProxyMock(.init(name: "Room", isEncrypted: true)) return RoomNotificationSettingsScreenViewModel(notificationSettingsProxy: notificationSettingsProxy, roomProxy: roomProxy, @@ -93,7 +93,7 @@ struct RoomNotificationSettingsScreen_Previews: PreviewProvider, TestablePreview static let viewModelCustom = { let notificationSettingsProxy = NotificationSettingsProxyMock(with: .init(defaultRoomMode: .allMessages, roomMode: .mentionsAndKeywordsOnly)) - let roomProxy = RoomProxyMock(.init(name: "Room", isEncrypted: true)) + let roomProxy = JoinedRoomProxyMock(.init(name: "Room", isEncrypted: true)) return RoomNotificationSettingsScreenViewModel(notificationSettingsProxy: notificationSettingsProxy, roomProxy: roomProxy, diff --git a/ElementX/Sources/Screens/RoomNotificationSettingsScreen/View/RoomNotificationSettingsUserDefinedScreen.swift b/ElementX/Sources/Screens/RoomNotificationSettingsScreen/View/RoomNotificationSettingsUserDefinedScreen.swift index 932273f91..04fe9f5f9 100644 --- a/ElementX/Sources/Screens/RoomNotificationSettingsScreen/View/RoomNotificationSettingsUserDefinedScreen.swift +++ b/ElementX/Sources/Screens/RoomNotificationSettingsScreen/View/RoomNotificationSettingsUserDefinedScreen.swift @@ -52,7 +52,7 @@ struct RoomNotificationSettingsUserDefinedScreen_Previews: PreviewProvider, Test static let viewModel = { let notificationSettingsProxy = NotificationSettingsProxyMock(with: .init(defaultRoomMode: .mentionsAndKeywordsOnly, roomMode: .mentionsAndKeywordsOnly)) - let roomProxy = RoomProxyMock(.init(name: "Room", isEncrypted: true)) + let roomProxy = JoinedRoomProxyMock(.init(name: "Room", isEncrypted: true)) return RoomNotificationSettingsScreenViewModel(notificationSettingsProxy: notificationSettingsProxy, roomProxy: roomProxy, @@ -62,7 +62,7 @@ struct RoomNotificationSettingsUserDefinedScreen_Previews: PreviewProvider, Test static let viewModelUnencrypted = { let notificationSettingsProxy = NotificationSettingsProxyMock(with: .init(defaultRoomMode: .mentionsAndKeywordsOnly, roomMode: .mentionsAndKeywordsOnly)) - let roomProxy = RoomProxyMock(.init(name: "Room", isEncrypted: false)) + let roomProxy = JoinedRoomProxyMock(.init(name: "Room", isEncrypted: false)) return RoomNotificationSettingsScreenViewModel(notificationSettingsProxy: notificationSettingsProxy, roomProxy: roomProxy, diff --git a/ElementX/Sources/Screens/RoomPollsHistoryScreen/View/RoomPollsHistoryScreen.swift b/ElementX/Sources/Screens/RoomPollsHistoryScreen/View/RoomPollsHistoryScreen.swift index 1b8d20313..d92e55723 100644 --- a/ElementX/Sources/Screens/RoomPollsHistoryScreen/View/RoomPollsHistoryScreen.swift +++ b/ElementX/Sources/Screens/RoomPollsHistoryScreen/View/RoomPollsHistoryScreen.swift @@ -124,7 +124,7 @@ struct RoomPollsHistoryScreen_Previews: PreviewProvider, TestablePreview { static let viewModelEmpty: RoomPollsHistoryScreenViewModel = { let roomTimelineController = MockRoomTimelineController() roomTimelineController.timelineItems = [] - let roomProxyMockConfiguration = RoomProxyMockConfiguration(name: "Polls") + let roomProxyMockConfiguration = JoinedRoomProxyMockConfiguration(name: "Polls") let viewModel = RoomPollsHistoryScreenViewModel(pollInteractionHandler: PollInteractionHandlerMock(), roomTimelineController: roomTimelineController, userIndicatorController: UserIndicatorControllerMock()) @@ -146,7 +146,7 @@ struct RoomPollsHistoryScreen_Previews: PreviewProvider, TestablePreview { roomTimelineController.timelineItemsTimestamp[item.id] = date } - let roomProxyMockConfiguration = RoomProxyMockConfiguration(name: "Polls", timelineStartReached: true) + let roomProxyMockConfiguration = JoinedRoomProxyMockConfiguration(name: "Polls", timelineStartReached: true) let viewModel = RoomPollsHistoryScreenViewModel(pollInteractionHandler: PollInteractionHandlerMock(), roomTimelineController: roomTimelineController, userIndicatorController: UserIndicatorControllerMock()) diff --git a/ElementX/Sources/Screens/RoomRolesAndPermissionsScreen/RoomRolesAndPermissionsScreenCoordinator.swift b/ElementX/Sources/Screens/RoomRolesAndPermissionsScreen/RoomRolesAndPermissionsScreenCoordinator.swift index c805b6df4..4590f8dc1 100644 --- a/ElementX/Sources/Screens/RoomRolesAndPermissionsScreen/RoomRolesAndPermissionsScreenCoordinator.swift +++ b/ElementX/Sources/Screens/RoomRolesAndPermissionsScreen/RoomRolesAndPermissionsScreenCoordinator.swift @@ -18,7 +18,7 @@ import Combine import SwiftUI struct RoomRolesAndPermissionsScreenCoordinatorParameters { - let roomProxy: RoomProxyProtocol + let roomProxy: JoinedRoomProxyProtocol let userIndicatorController: UserIndicatorControllerProtocol let analytics: AnalyticsService } diff --git a/ElementX/Sources/Screens/RoomRolesAndPermissionsScreen/RoomRolesAndPermissionsScreenViewModel.swift b/ElementX/Sources/Screens/RoomRolesAndPermissionsScreen/RoomRolesAndPermissionsScreenViewModel.swift index 2bd720f28..13adc9fab 100644 --- a/ElementX/Sources/Screens/RoomRolesAndPermissionsScreen/RoomRolesAndPermissionsScreenViewModel.swift +++ b/ElementX/Sources/Screens/RoomRolesAndPermissionsScreen/RoomRolesAndPermissionsScreenViewModel.swift @@ -20,7 +20,7 @@ import SwiftUI typealias RoomRolesAndPermissionsScreenViewModelType = StateStoreViewModel class RoomRolesAndPermissionsScreenViewModel: RoomRolesAndPermissionsScreenViewModelType, RoomRolesAndPermissionsScreenViewModelProtocol { - private let roomProxy: RoomProxyProtocol + private let roomProxy: JoinedRoomProxyProtocol private let userIndicatorController: UserIndicatorControllerProtocol private let analytics: AnalyticsService @@ -29,7 +29,7 @@ class RoomRolesAndPermissionsScreenViewModel: RoomRolesAndPermissionsScreenViewM actionsSubject.eraseToAnyPublisher() } - init(initialPermissions: RoomPermissions? = nil, roomProxy: RoomProxyProtocol, userIndicatorController: UserIndicatorControllerProtocol, analytics: AnalyticsService) { + init(initialPermissions: RoomPermissions? = nil, roomProxy: JoinedRoomProxyProtocol, userIndicatorController: UserIndicatorControllerProtocol, analytics: AnalyticsService) { self.roomProxy = roomProxy self.userIndicatorController = userIndicatorController self.analytics = analytics diff --git a/ElementX/Sources/Screens/RoomRolesAndPermissionsScreen/View/RoomRolesAndPermissionsScreen.swift b/ElementX/Sources/Screens/RoomRolesAndPermissionsScreen/View/RoomRolesAndPermissionsScreen.swift index cb3aef827..3fe508c28 100644 --- a/ElementX/Sources/Screens/RoomRolesAndPermissionsScreen/View/RoomRolesAndPermissionsScreen.swift +++ b/ElementX/Sources/Screens/RoomRolesAndPermissionsScreen/View/RoomRolesAndPermissionsScreen.swift @@ -127,7 +127,7 @@ struct RoomRolesAndPermissionsScreen: View { struct RoomRolesAndPermissionsScreen_Previews: PreviewProvider, TestablePreview { static let viewModel = RoomRolesAndPermissionsScreenViewModel(initialPermissions: RoomPermissions(powerLevels: .mock), - roomProxy: RoomProxyMock(.init(members: .allMembersAsAdmin)), + roomProxy: JoinedRoomProxyMock(.init(members: .allMembersAsAdmin)), userIndicatorController: UserIndicatorControllerMock(), analytics: ServiceLocator.shared.analytics) static var previews: some View { diff --git a/ElementX/Sources/Screens/RoomScreen/ComposerToolbar/CompletionSuggestionService.swift b/ElementX/Sources/Screens/RoomScreen/ComposerToolbar/CompletionSuggestionService.swift index 7ffae706c..6a48db0b7 100644 --- a/ElementX/Sources/Screens/RoomScreen/ComposerToolbar/CompletionSuggestionService.swift +++ b/ElementX/Sources/Screens/RoomScreen/ComposerToolbar/CompletionSuggestionService.swift @@ -22,13 +22,13 @@ private enum SuggestionTriggerPattern: Character { } final class CompletionSuggestionService: CompletionSuggestionServiceProtocol { - private let roomProxy: RoomProxyProtocol + private let roomProxy: JoinedRoomProxyProtocol private var canMentionAllUsers = false private(set) var suggestionsPublisher: AnyPublisher<[SuggestionItem], Never> = Empty().eraseToAnyPublisher() private let suggestionTriggerSubject = CurrentValueSubject(nil) - init(roomProxy: RoomProxyProtocol) { + init(roomProxy: JoinedRoomProxyProtocol) { self.roomProxy = roomProxy suggestionsPublisher = suggestionTriggerSubject diff --git a/ElementX/Sources/Screens/RoomScreen/RoomScreenCoordinator.swift b/ElementX/Sources/Screens/RoomScreen/RoomScreenCoordinator.swift index 98b0fb503..cea9b0c85 100644 --- a/ElementX/Sources/Screens/RoomScreen/RoomScreenCoordinator.swift +++ b/ElementX/Sources/Screens/RoomScreen/RoomScreenCoordinator.swift @@ -20,7 +20,7 @@ import SwiftUI import WysiwygComposer struct RoomScreenCoordinatorParameters { - let roomProxy: RoomProxyProtocol + let roomProxy: JoinedRoomProxyProtocol var focussedEventID: String? let timelineController: RoomTimelineControllerProtocol let mediaProvider: MediaProviderProtocol diff --git a/ElementX/Sources/Screens/RoomScreen/RoomScreenViewModel.swift b/ElementX/Sources/Screens/RoomScreen/RoomScreenViewModel.swift index a2fead44e..b95005655 100644 --- a/ElementX/Sources/Screens/RoomScreen/RoomScreenViewModel.swift +++ b/ElementX/Sources/Screens/RoomScreen/RoomScreenViewModel.swift @@ -22,7 +22,7 @@ import SwiftUI typealias RoomScreenViewModelType = StateStoreViewModel class RoomScreenViewModel: RoomScreenViewModelType, RoomScreenViewModelProtocol { - private let roomProxy: RoomProxyProtocol + private let roomProxy: JoinedRoomProxyProtocol private let appMediator: AppMediatorProtocol private let appSettings: AppSettings private let analyticsService: AnalyticsService @@ -51,7 +51,7 @@ class RoomScreenViewModel: RoomScreenViewModelType, RoomScreenViewModelProtocol } } - init(roomProxy: RoomProxyProtocol, + init(roomProxy: JoinedRoomProxyProtocol, mediaProvider: MediaProviderProtocol, appMediator: AppMediatorProtocol, appSettings: AppSettings, @@ -183,7 +183,7 @@ class RoomScreenViewModel: RoomScreenViewModelType, RoomScreenViewModelProtocol } extension RoomScreenViewModel { - static func mock(roomProxyMock: RoomProxyMock) -> RoomScreenViewModel { + static func mock(roomProxyMock: JoinedRoomProxyMock) -> RoomScreenViewModel { RoomScreenViewModel(roomProxy: roomProxyMock, mediaProvider: MockMediaProvider(), appMediator: AppMediatorMock.default, diff --git a/ElementX/Sources/Screens/RoomScreen/View/RoomScreen.swift b/ElementX/Sources/Screens/RoomScreen/View/RoomScreen.swift index 21ba52901..9f2dae515 100644 --- a/ElementX/Sources/Screens/RoomScreen/View/RoomScreen.swift +++ b/ElementX/Sources/Screens/RoomScreen/View/RoomScreen.swift @@ -210,9 +210,9 @@ struct RoomScreen: View { // MARK: - Previews struct RoomScreen_Previews: PreviewProvider, TestablePreview { - static let roomProxyMock = RoomProxyMock(.init(id: "stable_id", - name: "Preview room", - hasOngoingCall: true)) + static let roomProxyMock = JoinedRoomProxyMock(.init(id: "stable_id", + name: "Preview room", + hasOngoingCall: true)) static let roomViewModel = RoomScreenViewModel.mock(roomProxyMock: roomProxyMock) static let timelineViewModel = TimelineViewModel(roomProxy: roomProxyMock, timelineController: MockRoomTimelineController(), diff --git a/ElementX/Sources/Screens/Settings/NotificationSettingsEditScreen/NotificationSettingsEditScreenCoordinator.swift b/ElementX/Sources/Screens/Settings/NotificationSettingsEditScreen/NotificationSettingsEditScreenCoordinator.swift index 7ba042bd9..0c995ffa9 100644 --- a/ElementX/Sources/Screens/Settings/NotificationSettingsEditScreen/NotificationSettingsEditScreenCoordinator.swift +++ b/ElementX/Sources/Screens/Settings/NotificationSettingsEditScreen/NotificationSettingsEditScreenCoordinator.swift @@ -57,7 +57,7 @@ final class NotificationSettingsEditScreenCoordinator: CoordinatorProtocol { // MARK: - Private private func presentRoomNotificationSettings(roomID: String) async { - guard let roomProxy = await parameters.userSession.clientProxy.roomForIdentifier(roomID) else { return } + guard case let .joined(roomProxy) = await parameters.userSession.clientProxy.roomForIdentifier(roomID) else { return } let roomNotificationSettingsParameters = RoomNotificationSettingsScreenCoordinatorParameters(navigationStackCoordinator: parameters.navigationStackCoordinator, notificationSettingsProxy: parameters.notificationSettings, diff --git a/ElementX/Sources/Screens/Settings/NotificationSettingsEditScreen/NotificationSettingsEditScreenViewModel.swift b/ElementX/Sources/Screens/Settings/NotificationSettingsEditScreen/NotificationSettingsEditScreenViewModel.swift index 58af7aa49..793a36f9f 100644 --- a/ElementX/Sources/Screens/Settings/NotificationSettingsEditScreen/NotificationSettingsEditScreenViewModel.swift +++ b/ElementX/Sources/Screens/Settings/NotificationSettingsEditScreen/NotificationSettingsEditScreenViewModel.swift @@ -138,7 +138,7 @@ class NotificationSettingsEditScreenViewModel: NotificationSettingsEditScreenVie var roomsWithUserDefinedMode: [NotificationSettingsEditScreenRoom] = [] for roomSummary in filteredRoomsSummary { - guard let roomProxy = await userSession.clientProxy.roomForIdentifier(roomSummary.id) else { continue } + guard case let .joined(roomProxy) = await userSession.clientProxy.roomForIdentifier(roomSummary.id) else { continue } // `isOneToOneRoom` here is not the same as `isDirect` on the room. From the point of view of the push rule, a one-to-one room is a room with exactly two active members. let isOneToOneRoom = roomProxy.activeMembersCount == 2 // display only the rooms we're interested in diff --git a/ElementX/Sources/Screens/Timeline/TimelineInteractionHandler.swift b/ElementX/Sources/Screens/Timeline/TimelineInteractionHandler.swift index 6241667f3..d74e00b0c 100644 --- a/ElementX/Sources/Screens/Timeline/TimelineInteractionHandler.swift +++ b/ElementX/Sources/Screens/Timeline/TimelineInteractionHandler.swift @@ -35,7 +35,7 @@ enum TimelineInteractionHandlerAction { @MainActor class TimelineInteractionHandler { - private let roomProxy: RoomProxyProtocol + private let roomProxy: JoinedRoomProxyProtocol private let timelineController: RoomTimelineControllerProtocol private let mediaProvider: MediaProviderProtocol private let mediaPlayerProvider: MediaPlayerProviderProtocol @@ -60,7 +60,7 @@ class TimelineInteractionHandler { private var resumeVoiceMessagePlaybackAfterScrubbing = false - init(roomProxy: RoomProxyProtocol, + init(roomProxy: JoinedRoomProxyProtocol, timelineController: RoomTimelineControllerProtocol, mediaProvider: MediaProviderProtocol, mediaPlayerProvider: MediaPlayerProviderProtocol, diff --git a/ElementX/Sources/Screens/Timeline/TimelineViewModel.swift b/ElementX/Sources/Screens/Timeline/TimelineViewModel.swift index f024735e6..6d9117ed2 100644 --- a/ElementX/Sources/Screens/Timeline/TimelineViewModel.swift +++ b/ElementX/Sources/Screens/Timeline/TimelineViewModel.swift @@ -29,7 +29,7 @@ class TimelineViewModel: TimelineViewModelType, TimelineViewModelProtocol { static let toastErrorID = "RoomScreenToastError" } - private let roomProxy: RoomProxyProtocol + private let roomProxy: JoinedRoomProxyProtocol private let timelineController: RoomTimelineControllerProtocol private let mediaPlayerProvider: MediaPlayerProviderProtocol private let userIndicatorController: UserIndicatorControllerProtocol @@ -49,7 +49,7 @@ class TimelineViewModel: TimelineViewModelType, TimelineViewModelProtocol { private var paginateBackwardsTask: Task? private var paginateForwardsTask: Task? - init(roomProxy: RoomProxyProtocol, + init(roomProxy: JoinedRoomProxyProtocol, focussedEventID: String? = nil, timelineController: RoomTimelineControllerProtocol, mediaProvider: MediaProviderProtocol, @@ -819,7 +819,7 @@ private extension RoomProxyProtocol { // MARK: - Mocks extension TimelineViewModel { - static let mock = TimelineViewModel(roomProxy: RoomProxyMock(.init(name: "Preview room")), + static let mock = TimelineViewModel(roomProxy: JoinedRoomProxyMock(.init(name: "Preview room")), focussedEventID: nil, timelineController: MockRoomTimelineController(), mediaProvider: MockMediaProvider(), diff --git a/ElementX/Sources/Screens/Timeline/View/ReadReceipts/ReadReceiptsSummaryView.swift b/ElementX/Sources/Screens/Timeline/View/ReadReceipts/ReadReceiptsSummaryView.swift index 8e5e9e45c..ceb018162 100644 --- a/ElementX/Sources/Screens/Timeline/View/ReadReceipts/ReadReceiptsSummaryView.swift +++ b/ElementX/Sources/Screens/Timeline/View/ReadReceipts/ReadReceiptsSummaryView.swift @@ -51,7 +51,7 @@ struct ReadReceiptsSummaryView_Previews: PreviewProvider, TestablePreview { .mockCharlie, .mockDan ] - let roomProxyMock = RoomProxyMock(.init(name: "Room", members: members)) + let roomProxyMock = JoinedRoomProxyMock(.init(name: "Room", members: members)) let mock = TimelineViewModel(roomProxy: roomProxyMock, timelineController: MockRoomTimelineController(), mediaProvider: MockMediaProvider(), diff --git a/ElementX/Sources/Screens/Timeline/View/Supplementary/TimelineReadReceiptsView.swift b/ElementX/Sources/Screens/Timeline/View/Supplementary/TimelineReadReceiptsView.swift index 4eeac31e7..f6a842dd2 100644 --- a/ElementX/Sources/Screens/Timeline/View/Supplementary/TimelineReadReceiptsView.swift +++ b/ElementX/Sources/Screens/Timeline/View/Supplementary/TimelineReadReceiptsView.swift @@ -90,7 +90,7 @@ struct TimelineReadReceiptsView_Previews: PreviewProvider, TestablePreview { .mockMe ] - static let viewModel = TimelineViewModel(roomProxy: RoomProxyMock(.init(name: "Test", members: members)), + static let viewModel = TimelineViewModel(roomProxy: JoinedRoomProxyMock(.init(name: "Test", members: members)), timelineController: MockRoomTimelineController(), mediaProvider: MockMediaProvider(), mediaPlayerProvider: MediaPlayerProviderMock(), diff --git a/ElementX/Sources/Screens/Timeline/View/TimelineItemViews/HighlightedTimelineItemModifier.swift b/ElementX/Sources/Screens/Timeline/View/TimelineItemViews/HighlightedTimelineItemModifier.swift index dae13fbd2..321a1df9d 100644 --- a/ElementX/Sources/Screens/Timeline/View/TimelineItemViews/HighlightedTimelineItemModifier.swift +++ b/ElementX/Sources/Screens/Timeline/View/TimelineItemViews/HighlightedTimelineItemModifier.swift @@ -93,7 +93,7 @@ struct HighlightedTimelineItemModifier_Previews: PreviewProvider, TestablePrevie /// A preview that allows quick testing of the highlight appearance across various timeline scenarios. struct HighlightedTimelineItemTimeline_Previews: PreviewProvider { - static let roomProxyMock = RoomProxyMock(.init(name: "Preview room")) + static let roomProxyMock = JoinedRoomProxyMock(.init(name: "Preview room")) static let roomViewModel = RoomScreenViewModel.mock(roomProxyMock: roomProxyMock) static let focussedEventID = "RoomTimelineItemFixtures.default.5" static let timelineViewModel = TimelineViewModel(roomProxy: roomProxyMock, diff --git a/ElementX/Sources/Screens/Timeline/View/TimelineView.swift b/ElementX/Sources/Screens/Timeline/View/TimelineView.swift index 7308c1702..574c18f1f 100644 --- a/ElementX/Sources/Screens/Timeline/View/TimelineView.swift +++ b/ElementX/Sources/Screens/Timeline/View/TimelineView.swift @@ -79,8 +79,8 @@ struct TimelineView: UIViewControllerRepresentable { // MARK: - Previews struct TimelineView_Previews: PreviewProvider, TestablePreview { - static let roomProxyMock = RoomProxyMock(.init(id: "stable_id", - name: "Preview room")) + static let roomProxyMock = JoinedRoomProxyMock(.init(id: "stable_id", + name: "Preview room")) static let roomViewModel = RoomScreenViewModel.mock(roomProxyMock: roomProxyMock) static let timelineViewModel = TimelineViewModel(roomProxy: roomProxyMock, timelineController: MockRoomTimelineController(), diff --git a/ElementX/Sources/Services/Client/ClientProxy.swift b/ElementX/Sources/Services/Client/ClientProxy.swift index a44da8362..b212a0cbb 100644 --- a/ElementX/Sources/Services/Client/ClientProxy.swift +++ b/ElementX/Sources/Services/Client/ClientProxy.swift @@ -443,23 +443,13 @@ class ClientProxy: ClientProxyProtocol { return result } - func roomForIdentifier(_ identifier: String) async -> RoomProxyProtocol? { - guard let roomListService else { - MXLog.error("Failed retrieving room, room list service not set up") - return nil - } - + func roomForIdentifier(_ identifier: String) async -> RoomProxyType? { // Try fetching the room from the cold cache (if available) first - var (roomListItem, room) = await roomTupleForIdentifier(identifier) - - if let roomListItem, let room { - return await RoomProxy(roomListService: roomListService, - roomListItem: roomListItem, - room: room) + if let room = await buildRoomForIdentifier(identifier) { + return room } // Else wait for the visible rooms list to go into fully loaded - guard let roomSummaryProvider else { MXLog.error("Rooms summary provider not setup yet") return nil @@ -469,21 +459,7 @@ class ClientProxy: ClientProxyProtocol { _ = await roomSummaryProvider.statePublisher.values.first(where: { $0.isLoaded }) } - (roomListItem, room) = await roomTupleForIdentifier(identifier) - - guard let roomListItem else { - MXLog.error("Invalid roomListItem for identifier \(identifier)") - return nil - } - - guard let room else { - MXLog.error("Invalid roomListItem fullRoom for identifier \(identifier)") - return nil - } - - return await RoomProxy(roomListService: roomListService, - roomListItem: roomListItem, - room: room) + return await buildRoomForIdentifier(identifier) } func roomPreviewForIdentifier(_ identifier: String, via: [String]) async -> Result { @@ -703,9 +679,9 @@ class ClientProxy: ClientProxyProtocol { var users: OrderedSet = [] for roomID in roomIdentifiers { - guard let room = await roomForIdentifier(roomID), - room.isDirect, - let members = await room.members() else { + guard case let .joined(roomProxy) = await roomForIdentifier(roomID), + roomProxy.isDirect, + let members = await roomProxy.members() else { continue } @@ -868,19 +844,46 @@ class ClientProxy: ClientProxyProtocol { return .exclude(eventTypes: stateEventFilters.map { FilterTimelineEventType.state(eventType: $0) }) }() - - private func roomTupleForIdentifier(_ identifier: String) async -> (RoomListItem?, Room?) { - do { - let roomListItem = try roomListService?.room(roomId: identifier) - if roomListItem?.isTimelineInitialized() == false { - try await roomListItem?.initTimeline(eventTypeFilter: eventFilters, internalIdPrefix: nil) + + private func buildRoomForIdentifier(_ identifier: String) async -> RoomProxyType? { + guard let roomListService else { + MXLog.error("Failed retrieving room, room list service not set up") + return nil + } + + guard let roomListItem = try? roomListService.room(roomId: identifier) else { + MXLog.error("Failed retrieving room, invalid room list item") + return nil + } + + if roomListItem.isTimelineInitialized() == false { + do { + try await roomListItem.initTimeline(eventTypeFilter: eventFilters, internalIdPrefix: nil) + } catch { + MXLog.error("Failed initializing room timeline with error: \(error)") + return nil + } + } + + guard let room = try? roomListItem.fullRoom() else { + MXLog.error("Failed retrieving room, invalid room list item full room") + return nil + } + + switch room.membership() { + case .invited: + return .invited(InvitedRoomProxy(roomListItem: roomListItem, + room: room)) + case .joined: + guard let roomProxy = await JoinedRoomProxy(roomListService: roomListService, + roomListItem: roomListItem, + room: room) else { + return nil } - let fullRoom = try roomListItem?.fullRoom() - return (roomListItem, fullRoom) - } catch { - MXLog.error("Failed retrieving/initialising room with identifier: \(identifier)") - return (nil, nil) + return .joined(roomProxy) + case .left: + return .left } } diff --git a/ElementX/Sources/Services/Client/ClientProxyProtocol.swift b/ElementX/Sources/Services/Client/ClientProxyProtocol.swift index 62785e59f..e041e06d5 100644 --- a/ElementX/Sources/Services/Client/ClientProxyProtocol.swift +++ b/ElementX/Sources/Services/Client/ClientProxyProtocol.swift @@ -146,7 +146,7 @@ protocol ClientProxyProtocol: AnyObject, MediaLoaderProtocol { func uploadMedia(_ media: MediaInfo) async -> Result - func roomForIdentifier(_ identifier: String) async -> RoomProxyProtocol? + func roomForIdentifier(_ identifier: String) async -> RoomProxyType? func roomPreviewForIdentifier(_ identifier: String, via: [String]) async -> Result diff --git a/ElementX/Sources/Services/ComposerDraft/ComposerDraftService.swift b/ElementX/Sources/Services/ComposerDraft/ComposerDraftService.swift index 615d344e1..682491255 100644 --- a/ElementX/Sources/Services/ComposerDraft/ComposerDraftService.swift +++ b/ElementX/Sources/Services/ComposerDraft/ComposerDraftService.swift @@ -19,11 +19,11 @@ import Foundation import MatrixRustSDK final class ComposerDraftService: ComposerDraftServiceProtocol { - private let roomProxy: RoomProxyProtocol + private let roomProxy: JoinedRoomProxyProtocol private let timelineItemfactory: RoomTimelineItemFactoryProtocol private var volatileDraft: ComposerDraftProxy? - init(roomProxy: RoomProxyProtocol, timelineItemfactory: RoomTimelineItemFactoryProtocol) { + init(roomProxy: JoinedRoomProxyProtocol, timelineItemfactory: RoomTimelineItemFactoryProtocol) { self.roomProxy = roomProxy self.timelineItemfactory = timelineItemfactory } diff --git a/ElementX/Sources/Services/ElementCall/ElementCallConfiguration.swift b/ElementX/Sources/Services/ElementCall/ElementCallConfiguration.swift index b2b3f992a..b9be9fc0d 100644 --- a/ElementX/Sources/Services/ElementCall/ElementCallConfiguration.swift +++ b/ElementX/Sources/Services/ElementCall/ElementCallConfiguration.swift @@ -25,7 +25,7 @@ private enum GenericCallLinkQueryParameters { struct ElementCallConfiguration { enum Kind { case genericCallLink(URL) - case roomCall(roomProxy: RoomProxyProtocol, + case roomCall(roomProxy: JoinedRoomProxyProtocol, clientProxy: ClientProxyProtocol, clientID: String, elementCallBaseURL: URL, @@ -62,7 +62,7 @@ struct ElementCallConfiguration { } /// Creates a configuration for an internal room call. - init(roomProxy: RoomProxyProtocol, + init(roomProxy: JoinedRoomProxyProtocol, clientProxy: ClientProxyProtocol, clientID: String, elementCallBaseURL: URL, diff --git a/ElementX/Sources/Services/ElementCall/ElementCallService.swift b/ElementX/Sources/Services/ElementCall/ElementCallService.swift index 5accc97d8..db0316152 100644 --- a/ElementX/Sources/Services/ElementCall/ElementCallService.swift +++ b/ElementX/Sources/Services/ElementCall/ElementCallService.swift @@ -276,7 +276,7 @@ class ElementCallService: NSObject, ElementCallServiceProtocol, PKPushRegistryDe return } - guard let roomProxy = await clientProxy.roomForIdentifier(incomingCallID.roomID) else { + guard case let .joined(roomProxy) = await clientProxy.roomForIdentifier(incomingCallID.roomID) else { return } diff --git a/ElementX/Sources/Services/Polls/PollInteractionHandler.swift b/ElementX/Sources/Services/Polls/PollInteractionHandler.swift index 507043af9..2ae0c8b79 100644 --- a/ElementX/Sources/Services/Polls/PollInteractionHandler.swift +++ b/ElementX/Sources/Services/Polls/PollInteractionHandler.swift @@ -18,9 +18,9 @@ import Foundation class PollInteractionHandler: PollInteractionHandlerProtocol { let analyticsService: AnalyticsService - let roomProxy: RoomProxyProtocol + let roomProxy: JoinedRoomProxyProtocol - init(analyticsService: AnalyticsService, roomProxy: RoomProxyProtocol) { + init(analyticsService: AnalyticsService, roomProxy: JoinedRoomProxyProtocol) { self.analyticsService = analyticsService self.roomProxy = roomProxy } diff --git a/ElementX/Sources/Services/Room/InvitedRoomProxy.swift b/ElementX/Sources/Services/Room/InvitedRoomProxy.swift new file mode 100644 index 000000000..4ed072425 --- /dev/null +++ b/ElementX/Sources/Services/Room/InvitedRoomProxy.swift @@ -0,0 +1,111 @@ +// +// Copyright 2024 New Vector Ltd +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +import Foundation +import MatrixRustSDK +import UIKit + +class InvitedRoomProxy: InvitedRoomProxyProtocol { + private let roomListItem: RoomListItemProtocol + private let room: RoomProtocol + + // A room identifier is constant and lazy stops it from being fetched + // multiple times over FFI + lazy var id: String = room.id() + + var canonicalAlias: String? { + room.canonicalAlias() + } + + var ownUserID: String { + room.ownUserId() + } + + var name: String? { + roomListItem.displayName() + } + + var topic: String? { + room.topic() + } + + var avatarURL: URL? { + roomListItem.avatarUrl().flatMap(URL.init(string:)) + } + + var avatar: RoomAvatar { + if isDirect, avatarURL == nil { + let heroes = room.heroes() + + if heroes.count == 1 { + return .heroes(heroes.map(UserProfileProxy.init)) + } + } + + return .room(id: id, name: name, avatarURL: avatarURL) + } + + var isDirect: Bool { + room.isDirect() + } + + var isPublic: Bool { + room.isPublic() + } + + var isSpace: Bool { + room.isSpace() + } + + var joinedMembersCount: Int { + Int(room.joinedMembersCount()) + } + + var activeMembersCount: Int { + Int(room.activeMembersCount()) + } + + var inviter: RoomMemberProxyProtocol? { + get async { + await (try? roomListItem.roomInfo().inviter).map(RoomMemberProxy.init) + } + } + + init(roomListItem: RoomListItemProtocol, + room: RoomProtocol) { + self.roomListItem = roomListItem + self.room = room + } + + func acceptInvitation() async -> Result { + do { + try await room.join() + return .success(()) + } catch { + MXLog.error("Failed accepting invitation with error: \(error)") + return .failure(.sdkError(error)) + } + } + + func rejectInvitation() async -> Result { + do { + return try await .success(room.leave()) + } catch { + MXLog.error("Failed rejecting invitiation with error: \(error)") + return .failure(.sdkError(error)) + } + } +} diff --git a/ElementX/Sources/Services/Room/RoomProxy.swift b/ElementX/Sources/Services/Room/JoinedRoomProxy.swift similarity index 96% rename from ElementX/Sources/Services/Room/RoomProxy.swift rename to ElementX/Sources/Services/Room/JoinedRoomProxy.swift index 92990a711..bc1a57b4b 100644 --- a/ElementX/Sources/Services/Room/RoomProxy.swift +++ b/ElementX/Sources/Services/Room/JoinedRoomProxy.swift @@ -19,7 +19,7 @@ import Foundation import MatrixRustSDK import UIKit -class RoomProxy: RoomProxyProtocol { +class JoinedRoomProxy: JoinedRoomProxyProtocol { private let roomListService: RoomListServiceProtocol private let roomListItem: RoomListItemProtocol private let room: RoomProtocol @@ -77,13 +77,19 @@ class RoomProxy: RoomProxyProtocol { typingMembersSubject.asCurrentValuePublisher() } - private let actionsSubject = PassthroughSubject() - var actionsPublisher: AnyPublisher { + private let actionsSubject = PassthroughSubject() + var actionsPublisher: AnyPublisher { actionsSubject.eraseToAnyPublisher() } + // A room identifier is constant and lazy stops it from being fetched + // multiple times over FFI lazy var id: String = room.id() + var canonicalAlias: String? { + room.canonicalAlias() + } + var ownUserID: String { room.ownUserId() } @@ -96,14 +102,20 @@ class RoomProxy: RoomProxyProtocol { room.topic() } - var membership: Membership { - room.membership() + var avatarURL: URL? { + roomListItem.avatarUrl().flatMap(URL.init(string:)) } - var inviter: RoomMemberProxyProtocol? { - get async { - await (try? roomListItem.roomInfo().inviter).map(RoomMemberProxy.init) + var avatar: RoomAvatar { + if isDirect, avatarURL == nil { + let heroes = room.heroes() + + if heroes.count == 1 { + return .heroes(heroes.map(UserProfileProxy.init)) + } } + + return .room(id: id, name: name, avatarURL: avatarURL) } var isDirect: Bool { @@ -118,6 +130,14 @@ class RoomProxy: RoomProxyProtocol { room.isSpace() } + var joinedMembersCount: Int { + Int(room.joinedMembersCount()) + } + + var activeMembersCount: Int { + Int(room.activeMembersCount()) + } + var isEncrypted: Bool { (try? room.isEncrypted()) ?? false } @@ -145,34 +165,6 @@ class RoomProxy: RoomProxyProtocol { room.activeRoomCallParticipants() } - var canonicalAlias: String? { - room.canonicalAlias() - } - - var avatarURL: URL? { - roomListItem.avatarUrl().flatMap(URL.init(string:)) - } - - var avatar: RoomAvatar { - if isDirect, avatarURL == nil { - let heroes = room.heroes() - - if heroes.count == 1 { - return .heroes(heroes.map(UserProfileProxy.init)) - } - } - - return .room(id: id, name: name, avatarURL: avatarURL) - } - - var joinedMembersCount: Int { - Int(room.joinedMembersCount()) - } - - var activeMembersCount: Int { - Int(room.activeMembersCount()) - } - init?(roomListService: RoomListServiceProtocol, roomListItem: RoomListItemProtocol, room: RoomProtocol) async { @@ -315,25 +307,6 @@ class RoomProxy: RoomProxyProtocol { } } - func rejectInvitation() async -> Result { - do { - return try await .success(room.leave()) - } catch { - MXLog.error("Failed rejecting invitiation with error: \(error)") - return .failure(.sdkError(error)) - } - } - - func acceptInvitation() async -> Result { - do { - try await room.join() - return .success(()) - } catch { - MXLog.error("Failed accepting invitation with error: \(error)") - return .failure(.sdkError(error)) - } - } - func invite(userID: String) async -> Result { do { MXLog.info("Inviting user \(userID)") diff --git a/ElementX/Sources/Services/Room/RoomProxyProtocol.swift b/ElementX/Sources/Services/Room/RoomProxyProtocol.swift index fdb67b171..707827282 100644 --- a/ElementX/Sources/Services/Room/RoomProxyProtocol.swift +++ b/ElementX/Sources/Services/Room/RoomProxyProtocol.swift @@ -26,46 +26,62 @@ enum RoomProxyError: Error { case eventNotFound } -enum RoomProxyAction { - case roomInfoUpdate +enum RoomProxyType { + case joined(JoinedRoomProxyProtocol) + case invited(InvitedRoomProxyProtocol) + case left } // sourcery: AutoMockable protocol RoomProxyProtocol { var id: String { get } - var isDirect: Bool { get } - var isPublic: Bool { get } - var isSpace: Bool { get } - var isEncrypted: Bool { get } - var isFavourite: Bool { get async } - var pinnedEventIDs: Set { get async } - var membership: Membership { get } - var inviter: RoomMemberProxyProtocol? { get async } - - var hasOngoingCall: Bool { get } - var activeRoomCallParticipants: [String] { get } - var canonicalAlias: String? { get } + var ownUserID: String { get } var name: String? { get } - var topic: String? { get } /// The room's avatar info for use in a ``RoomAvatarImage``. var avatar: RoomAvatar { get } /// The room's avatar URL. Use this for editing and favour ``avatar`` for display. var avatarURL: URL? { get } + + var isPublic: Bool { get } + var isDirect: Bool { get } + var isSpace: Bool { get } + + var joinedMembersCount: Int { get } + + var activeMembersCount: Int { get } +} + +// sourcery: AutoMockable +protocol InvitedRoomProxyProtocol: RoomProxyProtocol { + var inviter: RoomMemberProxyProtocol? { get async } + + func rejectInvitation() async -> Result + func acceptInvitation() async -> Result +} + +enum JoinedRoomProxyAction { + case roomInfoUpdate +} + +// sourcery: AutoMockable +protocol JoinedRoomProxyProtocol: RoomProxyProtocol { + var isEncrypted: Bool { get } + var isFavourite: Bool { get async } + var pinnedEventIDs: Set { get async } + + var hasOngoingCall: Bool { get } + var activeRoomCallParticipants: [String] { get } var membersPublisher: CurrentValuePublisher<[RoomMemberProxyProtocol], Never> { get } var typingMembersPublisher: CurrentValuePublisher<[String], Never> { get } - var joinedMembersCount: Int { get } - - var activeMembersCount: Int { get } - - var actionsPublisher: AnyPublisher { get } + var actionsPublisher: AnyPublisher { get } var timeline: TimelineProxyProtocol { get } @@ -87,10 +103,6 @@ protocol RoomProxyProtocol { func getMember(userID: String) async -> Result - func rejectInvitation() async -> Result - - func acceptInvitation() async -> Result - func invite(userID: String) async -> Result func setName(_ name: String) async -> Result @@ -155,7 +167,7 @@ protocol RoomProxyProtocol { func clearDraft() async -> Result } -extension RoomProxyProtocol { +extension JoinedRoomProxyProtocol { var details: RoomDetails { RoomDetails(id: id, name: name, diff --git a/ElementX/Sources/Services/Timeline/TimelineController/MockRoomTimelineController.swift b/ElementX/Sources/Services/Timeline/TimelineController/MockRoomTimelineController.swift index 1d452481f..ccaa180f7 100644 --- a/ElementX/Sources/Services/Timeline/TimelineController/MockRoomTimelineController.swift +++ b/ElementX/Sources/Services/Timeline/TimelineController/MockRoomTimelineController.swift @@ -26,7 +26,7 @@ class MockRoomTimelineController: RoomTimelineControllerProtocol { /// An array of timeline items that will be appended in order when ``simulateIncomingItems()`` is called. var incomingItems: [RoomTimelineItemProtocol] = [] - var roomProxy: RoomProxyProtocol? + var roomProxy: JoinedRoomProxyProtocol? var roomID: String { roomProxy?.id ?? "MockRoomIdentifier" } let callbacks = PassthroughSubject() diff --git a/ElementX/Sources/Services/Timeline/TimelineController/RoomTimelineController.swift b/ElementX/Sources/Services/Timeline/TimelineController/RoomTimelineController.swift index ad727a623..b3a14923b 100644 --- a/ElementX/Sources/Services/Timeline/TimelineController/RoomTimelineController.swift +++ b/ElementX/Sources/Services/Timeline/TimelineController/RoomTimelineController.swift @@ -20,7 +20,7 @@ import MatrixRustSDK import UIKit class RoomTimelineController: RoomTimelineControllerProtocol { - private let roomProxy: RoomProxyProtocol + private let roomProxy: JoinedRoomProxyProtocol private let liveTimelineProvider: RoomTimelineProviderProtocol private let timelineItemFactory: RoomTimelineItemFactoryProtocol private let appSettings: AppSettings @@ -41,7 +41,7 @@ class RoomTimelineController: RoomTimelineControllerProtocol { roomProxy.id } - init(roomProxy: RoomProxyProtocol, + init(roomProxy: JoinedRoomProxyProtocol, timelineProxy: TimelineProxyProtocol, initialFocussedEventID: String?, timelineItemFactory: RoomTimelineItemFactoryProtocol, diff --git a/ElementX/Sources/Services/Timeline/TimelineController/RoomTimelineControllerFactory.swift b/ElementX/Sources/Services/Timeline/TimelineController/RoomTimelineControllerFactory.swift index a30ea96a1..456326001 100644 --- a/ElementX/Sources/Services/Timeline/TimelineController/RoomTimelineControllerFactory.swift +++ b/ElementX/Sources/Services/Timeline/TimelineController/RoomTimelineControllerFactory.swift @@ -17,7 +17,7 @@ import Foundation struct RoomTimelineControllerFactory: RoomTimelineControllerFactoryProtocol { - func buildRoomTimelineController(roomProxy: RoomProxyProtocol, + func buildRoomTimelineController(roomProxy: JoinedRoomProxyProtocol, initialFocussedEventID: String?, timelineItemFactory: RoomTimelineItemFactoryProtocol) -> RoomTimelineControllerProtocol { RoomTimelineController(roomProxy: roomProxy, @@ -27,7 +27,7 @@ struct RoomTimelineControllerFactory: RoomTimelineControllerFactoryProtocol { appSettings: ServiceLocator.shared.settings) } - func buildRoomPinnedTimelineController(roomProxy: RoomProxyProtocol, + func buildRoomPinnedTimelineController(roomProxy: JoinedRoomProxyProtocol, timelineItemFactory: RoomTimelineItemFactoryProtocol) async -> RoomTimelineControllerProtocol? { guard let pinnedEventsTimeline = await roomProxy.pinnedEventsTimeline else { return nil diff --git a/ElementX/Sources/Services/Timeline/TimelineController/RoomTimelineControllerFactoryProtocol.swift b/ElementX/Sources/Services/Timeline/TimelineController/RoomTimelineControllerFactoryProtocol.swift index c8c79874f..d1df646f9 100644 --- a/ElementX/Sources/Services/Timeline/TimelineController/RoomTimelineControllerFactoryProtocol.swift +++ b/ElementX/Sources/Services/Timeline/TimelineController/RoomTimelineControllerFactoryProtocol.swift @@ -18,10 +18,10 @@ import Foundation @MainActor protocol RoomTimelineControllerFactoryProtocol { - func buildRoomTimelineController(roomProxy: RoomProxyProtocol, + func buildRoomTimelineController(roomProxy: JoinedRoomProxyProtocol, initialFocussedEventID: String?, timelineItemFactory: RoomTimelineItemFactoryProtocol) -> RoomTimelineControllerProtocol - func buildRoomPinnedTimelineController(roomProxy: RoomProxyProtocol, + func buildRoomPinnedTimelineController(roomProxy: JoinedRoomProxyProtocol, timelineItemFactory: RoomTimelineItemFactoryProtocol) async -> RoomTimelineControllerProtocol? } diff --git a/ElementX/Sources/Services/VoiceMessage/VoiceMessageRecorder.swift b/ElementX/Sources/Services/VoiceMessage/VoiceMessageRecorder.swift index 1d0c641ce..fe15d45d0 100644 --- a/ElementX/Sources/Services/VoiceMessage/VoiceMessageRecorder.swift +++ b/ElementX/Sources/Services/VoiceMessage/VoiceMessageRecorder.swift @@ -154,7 +154,7 @@ class VoiceMessageRecorder: VoiceMessageRecorderProtocol { return .success(waveformData) } - func sendVoiceMessage(inRoom roomProxy: RoomProxyProtocol, audioConverter: AudioConverterProtocol) async -> Result { + func sendVoiceMessage(inRoom roomProxy: JoinedRoomProxyProtocol, audioConverter: AudioConverterProtocol) async -> Result { guard let url = audioRecorder.audioFileURL else { return .failure(VoiceMessageRecorderError.missingRecordingFile) } diff --git a/ElementX/Sources/Services/VoiceMessage/VoiceMessageRecorderProtocol.swift b/ElementX/Sources/Services/VoiceMessage/VoiceMessageRecorderProtocol.swift index ca1d10d97..5c4a99160 100644 --- a/ElementX/Sources/Services/VoiceMessage/VoiceMessageRecorderProtocol.swift +++ b/ElementX/Sources/Services/VoiceMessage/VoiceMessageRecorderProtocol.swift @@ -47,7 +47,7 @@ protocol VoiceMessageRecorderProtocol { func seekPlayback(to progress: Double) async func deleteRecording() async - func sendVoiceMessage(inRoom roomProxy: RoomProxyProtocol, audioConverter: AudioConverterProtocol) async -> Result + func sendVoiceMessage(inRoom roomProxy: JoinedRoomProxyProtocol, audioConverter: AudioConverterProtocol) async -> Result } // sourcery: AutoMockable diff --git a/ElementX/Sources/UITests/UITestsAppCoordinator.swift b/ElementX/Sources/UITests/UITestsAppCoordinator.swift index 53d515909..9234c0bf3 100644 --- a/ElementX/Sources/UITests/UITestsAppCoordinator.swift +++ b/ElementX/Sources/UITests/UITestsAppCoordinator.swift @@ -248,7 +248,7 @@ class MockScreen: Identifiable { return navigationStackCoordinator case .roomPlainNoAvatar: let navigationStackCoordinator = NavigationStackCoordinator() - let parameters = RoomScreenCoordinatorParameters(roomProxy: RoomProxyMock(.init(name: "Some room name", avatarURL: nil)), + let parameters = RoomScreenCoordinatorParameters(roomProxy: JoinedRoomProxyMock(.init(name: "Some room name", avatarURL: nil)), timelineController: MockRoomTimelineController(), mediaProvider: MockMediaProvider(), mediaPlayerProvider: MediaPlayerProviderMock(), @@ -265,7 +265,7 @@ class MockScreen: Identifiable { let navigationStackCoordinator = NavigationStackCoordinator() let timelineController = MockRoomTimelineController() timelineController.timelineItems = RoomTimelineItemFixtures.smallChunk - let parameters = RoomScreenCoordinatorParameters(roomProxy: RoomProxyMock(.init(name: "New room", avatarURL: URL.picturesDirectory)), + let parameters = RoomScreenCoordinatorParameters(roomProxy: JoinedRoomProxyMock(.init(name: "New room", avatarURL: URL.picturesDirectory)), timelineController: timelineController, mediaProvider: MockMediaProvider(), mediaPlayerProvider: MediaPlayerProviderMock(), @@ -282,7 +282,7 @@ class MockScreen: Identifiable { let navigationStackCoordinator = NavigationStackCoordinator() let timelineController = MockRoomTimelineController() timelineController.timelineItems = RoomTimelineItemFixtures.default - let parameters = RoomScreenCoordinatorParameters(roomProxy: RoomProxyMock(.init(name: "New room", avatarURL: URL.picturesDirectory)), + let parameters = RoomScreenCoordinatorParameters(roomProxy: JoinedRoomProxyMock(.init(name: "New room", avatarURL: URL.picturesDirectory)), timelineController: timelineController, mediaProvider: MockMediaProvider(), mediaPlayerProvider: MediaPlayerProviderMock(), @@ -299,7 +299,7 @@ class MockScreen: Identifiable { let navigationStackCoordinator = NavigationStackCoordinator() let timelineController = MockRoomTimelineController() timelineController.timelineItems = RoomTimelineItemFixtures.smallChunkWithReadReceipts - let parameters = RoomScreenCoordinatorParameters(roomProxy: RoomProxyMock(.init(name: "New room", avatarURL: URL.picturesDirectory)), + let parameters = RoomScreenCoordinatorParameters(roomProxy: JoinedRoomProxyMock(.init(name: "New room", avatarURL: URL.picturesDirectory)), timelineController: timelineController, mediaProvider: MockMediaProvider(), mediaPlayerProvider: MediaPlayerProviderMock(), @@ -319,7 +319,7 @@ class MockScreen: Identifiable { timelineController.timelineItems = RoomTimelineItemFixtures.smallChunk timelineController.backPaginationResponses = [RoomTimelineItemFixtures.singleMessageChunk] timelineController.incomingItems = [RoomTimelineItemFixtures.incomingMessage] - let parameters = RoomScreenCoordinatorParameters(roomProxy: RoomProxyMock(.init(name: "Small timeline", avatarURL: URL.picturesDirectory)), + let parameters = RoomScreenCoordinatorParameters(roomProxy: JoinedRoomProxyMock(.init(name: "Small timeline", avatarURL: URL.picturesDirectory)), timelineController: timelineController, mediaProvider: MockMediaProvider(), mediaPlayerProvider: MediaPlayerProviderMock(), @@ -339,7 +339,7 @@ class MockScreen: Identifiable { let timelineController = MockRoomTimelineController(listenForSignals: true) timelineController.timelineItems = RoomTimelineItemFixtures.smallChunk timelineController.backPaginationResponses = [RoomTimelineItemFixtures.largeChunk] - let parameters = RoomScreenCoordinatorParameters(roomProxy: RoomProxyMock(.init(name: "Small timeline, paginating", avatarURL: URL.picturesDirectory)), + let parameters = RoomScreenCoordinatorParameters(roomProxy: JoinedRoomProxyMock(.init(name: "Small timeline, paginating", avatarURL: URL.picturesDirectory)), timelineController: timelineController, mediaProvider: MockMediaProvider(), mediaPlayerProvider: MediaPlayerProviderMock(), @@ -359,7 +359,7 @@ class MockScreen: Identifiable { let timelineController = MockRoomTimelineController(listenForSignals: true) timelineController.timelineItems = RoomTimelineItemFixtures.largeChunk timelineController.backPaginationResponses = [RoomTimelineItemFixtures.largeChunk] - let parameters = RoomScreenCoordinatorParameters(roomProxy: RoomProxyMock(.init(name: "Large timeline", avatarURL: URL.picturesDirectory)), + let parameters = RoomScreenCoordinatorParameters(roomProxy: JoinedRoomProxyMock(.init(name: "Large timeline", avatarURL: URL.picturesDirectory)), timelineController: timelineController, mediaProvider: MockMediaProvider(), mediaPlayerProvider: MediaPlayerProviderMock(), @@ -380,7 +380,7 @@ class MockScreen: Identifiable { timelineController.timelineItems = RoomTimelineItemFixtures.largeChunk timelineController.backPaginationResponses = [RoomTimelineItemFixtures.largeChunk] timelineController.incomingItems = [RoomTimelineItemFixtures.incomingMessage] - let parameters = RoomScreenCoordinatorParameters(roomProxy: RoomProxyMock(.init(name: "Large timeline", avatarURL: URL.picturesDirectory)), + let parameters = RoomScreenCoordinatorParameters(roomProxy: JoinedRoomProxyMock(.init(name: "Large timeline", avatarURL: URL.picturesDirectory)), timelineController: timelineController, mediaProvider: MockMediaProvider(), mediaPlayerProvider: MediaPlayerProviderMock(), @@ -400,7 +400,7 @@ class MockScreen: Identifiable { let timelineController = MockRoomTimelineController(listenForSignals: true) timelineController.timelineItems = RoomTimelineItemFixtures.largeChunk timelineController.incomingItems = [RoomTimelineItemFixtures.incomingMessage] - let parameters = RoomScreenCoordinatorParameters(roomProxy: RoomProxyMock(.init(name: "Large timeline", avatarURL: URL.picturesDirectory)), + let parameters = RoomScreenCoordinatorParameters(roomProxy: JoinedRoomProxyMock(.init(name: "Large timeline", avatarURL: URL.picturesDirectory)), timelineController: timelineController, mediaProvider: MockMediaProvider(), mediaPlayerProvider: MediaPlayerProviderMock(), @@ -419,7 +419,7 @@ class MockScreen: Identifiable { let timelineController = MockRoomTimelineController() timelineController.timelineItems = RoomTimelineItemFixtures.permalinkChunk - let parameters = RoomScreenCoordinatorParameters(roomProxy: RoomProxyMock(.init(name: "Timeline highlight", avatarURL: URL.picturesDirectory)), + let parameters = RoomScreenCoordinatorParameters(roomProxy: JoinedRoomProxyMock(.init(name: "Timeline highlight", avatarURL: URL.picturesDirectory)), timelineController: timelineController, mediaProvider: MockMediaProvider(), mediaPlayerProvider: MediaPlayerProviderMock(), @@ -452,7 +452,7 @@ class MockScreen: Identifiable { let timelineController = MockRoomTimelineController() timelineController.timelineItems = RoomTimelineItemFixtures.disclosedPolls timelineController.incomingItems = [] - let parameters = RoomScreenCoordinatorParameters(roomProxy: RoomProxyMock(.init(name: "Polls timeline", avatarURL: URL.picturesDirectory)), + let parameters = RoomScreenCoordinatorParameters(roomProxy: JoinedRoomProxyMock(.init(name: "Polls timeline", avatarURL: URL.picturesDirectory)), timelineController: timelineController, mediaProvider: MockMediaProvider(), mediaPlayerProvider: MediaPlayerProviderMock(), @@ -472,7 +472,7 @@ class MockScreen: Identifiable { let timelineController = MockRoomTimelineController() timelineController.timelineItems = RoomTimelineItemFixtures.undisclosedPolls timelineController.incomingItems = [] - let parameters = RoomScreenCoordinatorParameters(roomProxy: RoomProxyMock(.init(name: "Polls timeline", avatarURL: URL.picturesDirectory)), + let parameters = RoomScreenCoordinatorParameters(roomProxy: JoinedRoomProxyMock(.init(name: "Polls timeline", avatarURL: URL.picturesDirectory)), timelineController: timelineController, mediaProvider: MockMediaProvider(), mediaPlayerProvider: MediaPlayerProviderMock(), @@ -492,7 +492,7 @@ class MockScreen: Identifiable { let timelineController = MockRoomTimelineController() timelineController.timelineItems = RoomTimelineItemFixtures.outgoingPolls timelineController.incomingItems = [] - let parameters = RoomScreenCoordinatorParameters(roomProxy: RoomProxyMock(.init(name: "Polls timeline", avatarURL: URL.picturesDirectory)), + let parameters = RoomScreenCoordinatorParameters(roomProxy: JoinedRoomProxyMock(.init(name: "Polls timeline", avatarURL: URL.picturesDirectory)), timelineController: timelineController, mediaProvider: MockMediaProvider(), mediaPlayerProvider: MediaPlayerProviderMock(), @@ -546,7 +546,7 @@ class MockScreen: Identifiable { let navigationStackCoordinator = NavigationStackCoordinator() let members: [RoomMemberProxyMock] = [.mockInvitedAlice, .mockBob, .mockCharlie] let coordinator = RoomMembersListScreenCoordinator(parameters: .init(mediaProvider: MockMediaProvider(), - roomProxy: RoomProxyMock(.init(name: "test", members: members)), + roomProxy: JoinedRoomProxyMock(.init(name: "test", members: members)), userIndicatorController: ServiceLocator.shared.userIndicatorController, analytics: ServiceLocator.shared.analytics)) navigationStackCoordinator.setRootCoordinator(coordinator) @@ -554,7 +554,7 @@ class MockScreen: Identifiable { case .roomRolesAndPermissionsFlow: let navigationStackCoordinator = NavigationStackCoordinator() navigationStackCoordinator.setRootCoordinator(BlankFormCoordinator()) - let coordinator = RoomRolesAndPermissionsFlowCoordinator(parameters: .init(roomProxy: RoomProxyMock(.init(members: .allMembersAsAdmin)), + let coordinator = RoomRolesAndPermissionsFlowCoordinator(parameters: .init(roomProxy: JoinedRoomProxyMock(.init(members: .allMembersAsAdmin)), mediaProvider: MockMediaProvider(), navigationStackCoordinator: navigationStackCoordinator, userIndicatorController: ServiceLocator.shared.userIndicatorController, @@ -627,9 +627,9 @@ class MockScreen: Identifiable { let clientProxy = ClientProxyMock(.init(userID: "@mock:client.com", roomSummaryProvider: RoomSummaryProviderMock(.init(state: .loaded(.mockRooms))))) - let roomProxy = RoomProxyMock(.init(id: "whatever", name: "okay", shouldUseAutoUpdatingTimeline: true)) + let roomProxy = JoinedRoomProxyMock(.init(id: "whatever", name: "okay", shouldUseAutoUpdatingTimeline: true)) - clientProxy.roomForIdentifierReturnValue = roomProxy + clientProxy.roomForIdentifierReturnValue = .joined(roomProxy) ServiceLocator.shared.settings.migratedAccounts[clientProxy.userID] = true diff --git a/UnitTests/Sources/CompletionSuggestionServiceTests.swift b/UnitTests/Sources/CompletionSuggestionServiceTests.swift index 26d555726..ef8ab4f9f 100644 --- a/UnitTests/Sources/CompletionSuggestionServiceTests.swift +++ b/UnitTests/Sources/CompletionSuggestionServiceTests.swift @@ -30,7 +30,7 @@ final class CompletionSuggestionServiceTests: XCTestCase { func testUserSuggestions() async throws { let alice: RoomMemberProxyMock = .mockAlice let members: [RoomMemberProxyMock] = [alice, .mockBob, .mockCharlie, .mockMe] - let roomProxyMock = RoomProxyMock(.init(name: "test", members: members)) + let roomProxyMock = JoinedRoomProxyMock(.init(name: "test", members: members)) let service = CompletionSuggestionService(roomProxy: roomProxyMock) var deferred = deferFulfillment(service.suggestionsPublisher) { suggestions in @@ -67,7 +67,7 @@ final class CompletionSuggestionServiceTests: XCTestCase { func testUserSuggestionsIncludingAllUsers() async throws { let alice: RoomMemberProxyMock = .mockAlice let members: [RoomMemberProxyMock] = [alice, .mockBob, .mockCharlie, .mockMe] - let roomProxyMock = RoomProxyMock(.init(name: "test", members: members, canUserTriggerRoomNotification: true)) + let roomProxyMock = JoinedRoomProxyMock(.init(name: "test", members: members, canUserTriggerRoomNotification: true)) let service = CompletionSuggestionService(roomProxy: roomProxyMock) var deferred = deferFulfillment(service.suggestionsPublisher) { suggestions in @@ -93,7 +93,7 @@ final class CompletionSuggestionServiceTests: XCTestCase { let alice: RoomMemberProxyMock = .mockAlice let bob: RoomMemberProxyMock = .mockBob let members: [RoomMemberProxyMock] = [alice, bob, .mockMe] - let roomProxyMock = RoomProxyMock(.init(name: "test", members: members, canUserTriggerRoomNotification: true)) + let roomProxyMock = JoinedRoomProxyMock(.init(name: "test", members: members, canUserTriggerRoomNotification: true)) let service = CompletionSuggestionService(roomProxy: roomProxyMock) var deferred = deferFulfillment(service.suggestionsPublisher) { suggestions in diff --git a/UnitTests/Sources/HomeScreenViewModelTests.swift b/UnitTests/Sources/HomeScreenViewModelTests.swift index f6faa5e95..6be6aee8d 100644 --- a/UnitTests/Sources/HomeScreenViewModelTests.swift +++ b/UnitTests/Sources/HomeScreenViewModelTests.swift @@ -87,7 +87,7 @@ class HomeScreenViewModelTests: XCTestCase { func testLeaveRoomAlert() async throws { let mockRoomId = "1" - clientProxy.roomForIdentifierClosure = { _ in RoomProxyMock(.init(id: mockRoomId, name: "Some room")) } + clientProxy.roomForIdentifierClosure = { _ in .joined(JoinedRoomProxyMock(.init(id: mockRoomId, name: "Some room"))) } let deferred = deferFulfillment(context.$viewState) { value in value.bindings.leaveRoomAlertItem != nil @@ -102,10 +102,10 @@ class HomeScreenViewModelTests: XCTestCase { func testLeaveRoomError() async throws { let mockRoomId = "1" - let room = RoomProxyMock(.init(id: mockRoomId, name: "Some room")) + let room = JoinedRoomProxyMock(.init(id: mockRoomId, name: "Some room")) room.leaveRoomClosure = { .failure(.sdkError(ClientProxyMockError.generic)) } - clientProxy.roomForIdentifierClosure = { _ in room } + clientProxy.roomForIdentifierClosure = { _ in .joined(room) } let deferred = deferFulfillment(context.$viewState) { value in value.bindings.alertInfo != nil @@ -133,10 +133,10 @@ class HomeScreenViewModelTests: XCTestCase { expectation.fulfill() } .store(in: &cancellables) - let room = RoomProxyMock(.init(id: mockRoomId, name: "Some room")) + let room = JoinedRoomProxyMock(.init(id: mockRoomId, name: "Some room")) room.leaveRoomClosure = { .success(()) } - clientProxy.roomForIdentifierClosure = { _ in room } + clientProxy.roomForIdentifierClosure = { _ in .joined(room) } context.send(viewAction: .confirmLeaveRoom(roomIdentifier: mockRoomId)) await fulfillment(of: [expectation]) diff --git a/UnitTests/Sources/InviteUsersViewModelTests.swift b/UnitTests/Sources/InviteUsersViewModelTests.swift index 7deebb12e..fe8baa45b 100644 --- a/UnitTests/Sources/InviteUsersViewModelTests.swift +++ b/UnitTests/Sources/InviteUsersViewModelTests.swift @@ -64,7 +64,7 @@ class InviteUsersScreenViewModelTests: XCTestCase { func testInviteButton() async throws { let mockedMembers: [RoomMemberProxyMock] = [.mockAlice, .mockBob] - setupWithRoomType(roomType: .room(roomProxy: RoomProxyMock(.init(name: "test", members: mockedMembers)))) + setupWithRoomType(roomType: .room(roomProxy: JoinedRoomProxyMock(.init(name: "test", members: mockedMembers)))) let deferredState = deferFulfillment(viewModel.context.$viewState) { state in state.isUserSelected(.mockAlice) diff --git a/UnitTests/Sources/MessageForwardingScreenViewModelTests.swift b/UnitTests/Sources/MessageForwardingScreenViewModelTests.swift index dccf8c3c8..07da08d4d 100644 --- a/UnitTests/Sources/MessageForwardingScreenViewModelTests.swift +++ b/UnitTests/Sources/MessageForwardingScreenViewModelTests.swift @@ -32,7 +32,7 @@ class MessageForwardingScreenViewModelTests: XCTestCase { cancellables.removeAll() let clientProxy = ClientProxyMock(.init()) - clientProxy.roomForIdentifierClosure = { RoomProxyMock(.init(id: $0)) } + clientProxy.roomForIdentifierClosure = { .joined(JoinedRoomProxyMock(.init(id: $0))) } viewModel = MessageForwardingScreenViewModel(forwardingItem: forwardingItem, clientProxy: clientProxy, diff --git a/UnitTests/Sources/PillContextTests.swift b/UnitTests/Sources/PillContextTests.swift index 91b61644a..c5956ef0a 100644 --- a/UnitTests/Sources/PillContextTests.swift +++ b/UnitTests/Sources/PillContextTests.swift @@ -23,7 +23,7 @@ import XCTest class PillContextTests: XCTestCase { func testUser() async throws { let id = "@test:matrix.org" - let proxyMock = RoomProxyMock(.init(name: "Test")) + let proxyMock = JoinedRoomProxyMock(.init(name: "Test")) let subject = CurrentValueSubject<[RoomMemberProxyProtocol], Never>([]) proxyMock.membersPublisher = subject.asCurrentValuePublisher() let mock = TimelineViewModel(roomProxy: proxyMock, @@ -51,7 +51,7 @@ class PillContextTests: XCTestCase { func testOwnUser() async throws { let id = "@test:matrix.org" - let proxyMock = RoomProxyMock(.init(name: "Test", ownUserID: id)) + let proxyMock = JoinedRoomProxyMock(.init(name: "Test", ownUserID: id)) let subject = CurrentValueSubject<[RoomMemberProxyProtocol], Never>([]) proxyMock.membersPublisher = subject.asCurrentValuePublisher() let mock = TimelineViewModel(roomProxy: proxyMock, @@ -72,7 +72,7 @@ class PillContextTests: XCTestCase { let avatarURL = URL(string: "https://matrix.jpg") let id = "test_room" let displayName = "Test" - let proxyMock = RoomProxyMock(.init(id: id, name: displayName, avatarURL: avatarURL)) + let proxyMock = JoinedRoomProxyMock(.init(id: id, name: displayName, avatarURL: avatarURL)) let mockController = MockRoomTimelineController() mockController.roomProxy = proxyMock let mock = TimelineViewModel(roomProxy: proxyMock, diff --git a/UnitTests/Sources/ReportContentViewModelTests.swift b/UnitTests/Sources/ReportContentViewModelTests.swift index ceded0d44..fb6544b46 100644 --- a/UnitTests/Sources/ReportContentViewModelTests.swift +++ b/UnitTests/Sources/ReportContentViewModelTests.swift @@ -25,7 +25,7 @@ class ReportContentScreenViewModelTests: XCTestCase { func testReportContent() async throws { // Given the report content view for some content. - let roomProxy = RoomProxyMock(.init(name: "test")) + let roomProxy = JoinedRoomProxyMock(.init(name: "test")) roomProxy.reportContentReasonReturnValue = .success(()) let clientProxy = ClientProxyMock(.init()) let viewModel = ReportContentScreenViewModel(eventID: eventID, @@ -54,7 +54,7 @@ class ReportContentScreenViewModelTests: XCTestCase { func testReportIgnoringSender() async throws { // Given the report content view for some content. - let roomProxy = RoomProxyMock(.init(name: "test")) + let roomProxy = JoinedRoomProxyMock(.init(name: "test")) roomProxy.reportContentReasonReturnValue = .success(()) let clientProxy = ClientProxyMock(.init()) let viewModel = ReportContentScreenViewModel(eventID: eventID, diff --git a/UnitTests/Sources/RoomChangePermissionsScreenViewModelTests.swift b/UnitTests/Sources/RoomChangePermissionsScreenViewModelTests.swift index 555756bc2..1cba85625 100644 --- a/UnitTests/Sources/RoomChangePermissionsScreenViewModelTests.swift +++ b/UnitTests/Sources/RoomChangePermissionsScreenViewModelTests.swift @@ -20,7 +20,7 @@ import XCTest @MainActor class RoomChangePermissionsScreenViewModelTests: XCTestCase { - var roomProxy: RoomProxyMock! + var roomProxy: JoinedRoomProxyMock! var viewModel: RoomChangePermissionsScreenViewModelProtocol! var context: RoomChangePermissionsScreenViewModelType.Context { @@ -28,7 +28,7 @@ class RoomChangePermissionsScreenViewModelTests: XCTestCase { } override func setUp() { - roomProxy = RoomProxyMock(.init()) + roomProxy = JoinedRoomProxyMock(.init()) viewModel = RoomChangePermissionsScreenViewModel(currentPermissions: .init(powerLevels: .mock), group: .roomDetails, roomProxy: roomProxy, diff --git a/UnitTests/Sources/RoomChangeRolesScreenViewModelTests.swift b/UnitTests/Sources/RoomChangeRolesScreenViewModelTests.swift index ea3a922b0..3fb6a5f1d 100644 --- a/UnitTests/Sources/RoomChangeRolesScreenViewModelTests.swift +++ b/UnitTests/Sources/RoomChangeRolesScreenViewModelTests.swift @@ -21,7 +21,7 @@ import XCTest @MainActor class RoomChangeRolesScreenViewModelTests: XCTestCase { var viewModel: RoomChangeRolesScreenViewModelProtocol! - var roomProxy: RoomProxyMock! + var roomProxy: JoinedRoomProxyMock! var context: RoomChangeRolesScreenViewModelType.Context { viewModel.context @@ -202,7 +202,7 @@ class RoomChangeRolesScreenViewModelTests: XCTestCase { } private func setupViewModel(mode: RoomMemberDetails.Role) { - roomProxy = RoomProxyMock(.init(members: .allMembersAsAdmin)) + roomProxy = JoinedRoomProxyMock(.init(members: .allMembersAsAdmin)) viewModel = RoomChangeRolesScreenViewModel(mode: mode, roomProxy: roomProxy, mediaProvider: MockMediaProvider(), diff --git a/UnitTests/Sources/RoomDetailsEditScreenViewModelTests.swift b/UnitTests/Sources/RoomDetailsEditScreenViewModelTests.swift index 9a2a3a656..3b769d439 100644 --- a/UnitTests/Sources/RoomDetailsEditScreenViewModelTests.swift +++ b/UnitTests/Sources/RoomDetailsEditScreenViewModelTests.swift @@ -117,9 +117,9 @@ class RoomDetailsEditScreenViewModelTests: XCTestCase { // MARK: - Private - private func setupViewModel(roomProxyConfiguration: RoomProxyMockConfiguration) { + private func setupViewModel(roomProxyConfiguration: JoinedRoomProxyMockConfiguration) { userIndicatorController = UserIndicatorControllerMock.default - viewModel = .init(roomProxy: RoomProxyMock(roomProxyConfiguration), + viewModel = .init(roomProxy: JoinedRoomProxyMock(roomProxyConfiguration), mediaProvider: MockMediaProvider(), userIndicatorController: userIndicatorController) } diff --git a/UnitTests/Sources/RoomDetailsViewModelTests.swift b/UnitTests/Sources/RoomDetailsViewModelTests.swift index 2759d89e1..66bf259da 100644 --- a/UnitTests/Sources/RoomDetailsViewModelTests.swift +++ b/UnitTests/Sources/RoomDetailsViewModelTests.swift @@ -24,14 +24,14 @@ import XCTest @MainActor class RoomDetailsScreenViewModelTests: XCTestCase { var viewModel: RoomDetailsScreenViewModel! - var roomProxyMock: RoomProxyMock! + var roomProxyMock: JoinedRoomProxyMock! var notificationSettingsProxyMock: NotificationSettingsProxyMock! var context: RoomDetailsScreenViewModelType.Context { viewModel.context } var cancellables = Set() override func setUp() { cancellables.removeAll() - roomProxyMock = RoomProxyMock(.init(name: "Test")) + roomProxyMock = JoinedRoomProxyMock(.init(name: "Test")) notificationSettingsProxyMock = NotificationSettingsProxyMock(with: NotificationSettingsProxyMockConfiguration()) viewModel = RoomDetailsScreenViewModel(roomProxy: roomProxyMock, clientProxy: ClientProxyMock(.init()), @@ -48,7 +48,7 @@ class RoomDetailsScreenViewModelTests: XCTestCase { func testLeaveRoomTappedWhenPublic() async throws { let mockedMembers: [RoomMemberProxyMock] = [.mockBob, .mockAlice] - roomProxyMock = RoomProxyMock(.init(name: "Test", isPublic: true, members: mockedMembers)) + roomProxyMock = JoinedRoomProxyMock(.init(name: "Test", isPublic: true, members: mockedMembers)) viewModel = RoomDetailsScreenViewModel(roomProxy: roomProxyMock, clientProxy: ClientProxyMock(.init()), mediaProvider: MockMediaProvider(), @@ -71,7 +71,7 @@ class RoomDetailsScreenViewModelTests: XCTestCase { func testLeaveRoomTappedWhenRoomNotPublic() async throws { let mockedMembers: [RoomMemberProxyMock] = [.mockBob, .mockAlice] - roomProxyMock = RoomProxyMock(.init(name: "Test", isPublic: false, members: mockedMembers)) + roomProxyMock = JoinedRoomProxyMock(.init(name: "Test", isPublic: false, members: mockedMembers)) viewModel = RoomDetailsScreenViewModel(roomProxy: roomProxyMock, clientProxy: ClientProxyMock(.init()), mediaProvider: MockMediaProvider(), @@ -95,7 +95,7 @@ class RoomDetailsScreenViewModelTests: XCTestCase { func testLeaveRoomTappedWithLessThanTwoMembers() async { let mockedMembers: [RoomMemberProxyMock] = [.mockAlice] - roomProxyMock = RoomProxyMock(.init(name: "Test", isPublic: false, members: mockedMembers)) + roomProxyMock = JoinedRoomProxyMock(.init(name: "Test", isPublic: false, members: mockedMembers)) viewModel = RoomDetailsScreenViewModel(roomProxy: roomProxyMock, clientProxy: ClientProxyMock(.init()), mediaProvider: MockMediaProvider(), @@ -149,7 +149,7 @@ class RoomDetailsScreenViewModelTests: XCTestCase { func testInitialDMDetailsState() async throws { let recipient = RoomMemberProxyMock.mockDan let mockedMembers: [RoomMemberProxyMock] = [.mockMe, recipient] - roomProxyMock = RoomProxyMock(.init(name: "Test", isDirect: true, isEncrypted: true, members: mockedMembers)) + roomProxyMock = JoinedRoomProxyMock(.init(name: "Test", isDirect: true, isEncrypted: true, members: mockedMembers)) viewModel = RoomDetailsScreenViewModel(roomProxy: roomProxyMock, clientProxy: ClientProxyMock(.init()), mediaProvider: MockMediaProvider(), @@ -173,7 +173,7 @@ class RoomDetailsScreenViewModelTests: XCTestCase { let recipient = RoomMemberProxyMock.mockDan let mockedMembers: [RoomMemberProxyMock] = [.mockMe, recipient] - roomProxyMock = RoomProxyMock(.init(name: "Test", isDirect: true, isEncrypted: true, members: mockedMembers)) + roomProxyMock = JoinedRoomProxyMock(.init(name: "Test", isDirect: true, isEncrypted: true, members: mockedMembers)) viewModel = RoomDetailsScreenViewModel(roomProxy: roomProxyMock, clientProxy: ClientProxyMock(.init()), mediaProvider: MockMediaProvider(), @@ -208,7 +208,7 @@ class RoomDetailsScreenViewModelTests: XCTestCase { let mockedMembers: [RoomMemberProxyMock] = [.mockMe, recipient] let clientProxy = ClientProxyMock(.init()) clientProxy.ignoreUserReturnValue = .failure(.sdkError(ClientProxyMockError.generic)) - roomProxyMock = RoomProxyMock(.init(name: "Test", isDirect: true, isEncrypted: true, members: mockedMembers)) + roomProxyMock = JoinedRoomProxyMock(.init(name: "Test", isDirect: true, isEncrypted: true, members: mockedMembers)) viewModel = RoomDetailsScreenViewModel(roomProxy: roomProxyMock, clientProxy: clientProxy, mediaProvider: MockMediaProvider(), @@ -242,7 +242,7 @@ class RoomDetailsScreenViewModelTests: XCTestCase { func testUnignoreSuccess() async throws { let recipient = RoomMemberProxyMock.mockIgnored let mockedMembers: [RoomMemberProxyMock] = [.mockMe, recipient] - roomProxyMock = RoomProxyMock(.init(name: "Test", isDirect: true, isEncrypted: true, members: mockedMembers)) + roomProxyMock = JoinedRoomProxyMock(.init(name: "Test", isDirect: true, isEncrypted: true, members: mockedMembers)) viewModel = RoomDetailsScreenViewModel(roomProxy: roomProxyMock, clientProxy: ClientProxyMock(.init()), mediaProvider: MockMediaProvider(), @@ -277,7 +277,7 @@ class RoomDetailsScreenViewModelTests: XCTestCase { let mockedMembers: [RoomMemberProxyMock] = [.mockMe, recipient] let clientProxy = ClientProxyMock(.init()) clientProxy.unignoreUserReturnValue = .failure(.sdkError(ClientProxyMockError.generic)) - roomProxyMock = RoomProxyMock(.init(name: "Test", isDirect: true, isEncrypted: true, members: mockedMembers)) + roomProxyMock = JoinedRoomProxyMock(.init(name: "Test", isDirect: true, isEncrypted: true, members: mockedMembers)) viewModel = RoomDetailsScreenViewModel(roomProxy: roomProxyMock, clientProxy: clientProxy, mediaProvider: MockMediaProvider(), @@ -310,10 +310,10 @@ class RoomDetailsScreenViewModelTests: XCTestCase { func testCannotInvitePeople() async { let mockedMembers: [RoomMemberProxyMock] = [.mockMe, .mockAlice] - roomProxyMock = RoomProxyMock(.init(name: "Test", - isPublic: true, - members: mockedMembers, - canUserInvite: false)) + roomProxyMock = JoinedRoomProxyMock(.init(name: "Test", + isPublic: true, + members: mockedMembers, + canUserInvite: false)) viewModel = RoomDetailsScreenViewModel(roomProxy: roomProxyMock, clientProxy: ClientProxyMock(.init()), mediaProvider: MockMediaProvider(), @@ -331,7 +331,7 @@ class RoomDetailsScreenViewModelTests: XCTestCase { func testInvitePeople() async { let mockedMembers: [RoomMemberProxyMock] = [.mockMe, .mockBob, .mockAlice] - roomProxyMock = RoomProxyMock(.init(name: "Test", isPublic: true, members: mockedMembers)) + roomProxyMock = JoinedRoomProxyMock(.init(name: "Test", isPublic: true, members: mockedMembers)) viewModel = RoomDetailsScreenViewModel(roomProxy: roomProxyMock, clientProxy: ClientProxyMock(.init()), mediaProvider: MockMediaProvider(), @@ -365,7 +365,7 @@ class RoomDetailsScreenViewModelTests: XCTestCase { func testCanEditAvatar() async { let mockedMembers: [RoomMemberProxyMock] = [.mockMe, .mockBob, .mockAlice] - roomProxyMock = RoomProxyMock(.init(name: "Test", isDirect: false, isPublic: false, members: mockedMembers)) + roomProxyMock = JoinedRoomProxyMock(.init(name: "Test", isDirect: false, isPublic: false, members: mockedMembers)) roomProxyMock.canUserUserIDSendStateEventClosure = { _, event in .success(event == .roomAvatar) } @@ -389,7 +389,7 @@ class RoomDetailsScreenViewModelTests: XCTestCase { func testCanEditName() async { let mockedMembers: [RoomMemberProxyMock] = [.mockMe, .mockBob, .mockAlice] - roomProxyMock = RoomProxyMock(.init(name: "Test", isDirect: false, isPublic: false, members: mockedMembers)) + roomProxyMock = JoinedRoomProxyMock(.init(name: "Test", isDirect: false, isPublic: false, members: mockedMembers)) roomProxyMock.canUserUserIDSendStateEventClosure = { _, event in .success(event == .roomName) } @@ -413,7 +413,7 @@ class RoomDetailsScreenViewModelTests: XCTestCase { func testCanEditTopic() async { let mockedMembers: [RoomMemberProxyMock] = [.mockMe, .mockBob, .mockAlice] - roomProxyMock = RoomProxyMock(.init(name: "Test", isDirect: false, isPublic: false, members: mockedMembers)) + roomProxyMock = JoinedRoomProxyMock(.init(name: "Test", isDirect: false, isPublic: false, members: mockedMembers)) roomProxyMock.canUserUserIDSendStateEventClosure = { _, event in .success(event == .roomTopic) } @@ -437,7 +437,7 @@ class RoomDetailsScreenViewModelTests: XCTestCase { func testCannotEditRoom() async { let mockedMembers: [RoomMemberProxyMock] = [.mockMe, .mockBob, .mockAlice] - roomProxyMock = RoomProxyMock(.init(name: "Test", isDirect: false, isPublic: false, members: mockedMembers)) + roomProxyMock = JoinedRoomProxyMock(.init(name: "Test", isDirect: false, isPublic: false, members: mockedMembers)) viewModel = RoomDetailsScreenViewModel(roomProxy: roomProxyMock, clientProxy: ClientProxyMock(.init()), mediaProvider: MockMediaProvider(), @@ -458,7 +458,7 @@ class RoomDetailsScreenViewModelTests: XCTestCase { func testCannotEditDirectRoom() async { let mockedMembers: [RoomMemberProxyMock] = [.mockMeAdmin, .mockBob, .mockAlice] - roomProxyMock = RoomProxyMock(.init(name: "Test", isDirect: true, isPublic: false, members: mockedMembers)) + roomProxyMock = JoinedRoomProxyMock(.init(name: "Test", isDirect: true, isPublic: false, members: mockedMembers)) viewModel = RoomDetailsScreenViewModel(roomProxy: roomProxyMock, clientProxy: ClientProxyMock(.init()), mediaProvider: MockMediaProvider(), diff --git a/UnitTests/Sources/RoomFlowCoordinatorTests.swift b/UnitTests/Sources/RoomFlowCoordinatorTests.swift index 5f04315ef..0bbbfefff 100644 --- a/UnitTests/Sources/RoomFlowCoordinatorTests.swift +++ b/UnitTests/Sources/RoomFlowCoordinatorTests.swift @@ -171,7 +171,7 @@ class RoomFlowCoordinatorTests: XCTestCase { // "Join" the room clientProxy.roomForIdentifierClosure = { _ in - RoomProxyMock(.init()) + .joined(JoinedRoomProxyMock(.init())) } try await process(route: .room(roomID: "InvitedRoomID", via: [])) @@ -201,7 +201,7 @@ class RoomFlowCoordinatorTests: XCTestCase { // "Join" the room clientProxy.roomForIdentifierClosure = { _ in - RoomProxyMock(.init()) + .joined(JoinedRoomProxyMock(.init())) } try await process(route: .room(roomID: "InvitedRoomID", via: [])) diff --git a/UnitTests/Sources/RoomMemberDetailsViewModelTests.swift b/UnitTests/Sources/RoomMemberDetailsViewModelTests.swift index 63bd3827f..e51d5eb75 100644 --- a/UnitTests/Sources/RoomMemberDetailsViewModelTests.swift +++ b/UnitTests/Sources/RoomMemberDetailsViewModelTests.swift @@ -21,12 +21,12 @@ import XCTest @MainActor class RoomMemberDetailsViewModelTests: XCTestCase { var viewModel: RoomMemberDetailsScreenViewModelProtocol! - var roomProxyMock: RoomProxyMock! + var roomProxyMock: JoinedRoomProxyMock! var roomMemberProxyMock: RoomMemberProxyMock! var context: RoomMemberDetailsScreenViewModelType.Context { viewModel.context } override func setUp() async throws { - roomProxyMock = RoomProxyMock(.init(name: "")) + roomProxyMock = JoinedRoomProxyMock(.init(name: "")) roomProxyMock.getMemberUserIDClosure = { _ in .success(self.roomMemberProxyMock) diff --git a/UnitTests/Sources/RoomMembersListScreenViewModelTests.swift b/UnitTests/Sources/RoomMembersListScreenViewModelTests.swift index ae2fd28fd..0a753aa0f 100644 --- a/UnitTests/Sources/RoomMembersListScreenViewModelTests.swift +++ b/UnitTests/Sources/RoomMembersListScreenViewModelTests.swift @@ -21,7 +21,7 @@ import XCTest @MainActor class RoomMembersListScreenViewModelTests: XCTestCase { var viewModel: RoomMembersListScreenViewModel! - var roomProxy: RoomProxyMock! + var roomProxy: JoinedRoomProxyMock! var context: RoomMembersListScreenViewModel.Context { viewModel.context @@ -286,7 +286,7 @@ class RoomMembersListScreenViewModelTests: XCTestCase { } private func setup(with members: [RoomMemberProxyMock]) { - roomProxy = RoomProxyMock(.init(name: "test", members: members)) + roomProxy = JoinedRoomProxyMock(.init(name: "test", members: members)) viewModel = .init(roomProxy: roomProxy, mediaProvider: MockMediaProvider(), userIndicatorController: ServiceLocator.shared.userIndicatorController, diff --git a/UnitTests/Sources/RoomNotificationSettingsScreenViewModelTests.swift b/UnitTests/Sources/RoomNotificationSettingsScreenViewModelTests.swift index 93a83812b..313fe6392 100644 --- a/UnitTests/Sources/RoomNotificationSettingsScreenViewModelTests.swift +++ b/UnitTests/Sources/RoomNotificationSettingsScreenViewModelTests.swift @@ -22,18 +22,18 @@ import XCTest @MainActor class RoomNotificationSettingsScreenViewModelTests: XCTestCase { - var roomProxyMock: RoomProxyMock! + var roomProxyMock: JoinedRoomProxyMock! var notificationSettingsProxyMock: NotificationSettingsProxyMock! var cancellables = Set() override func setUpWithError() throws { cancellables.removeAll() - roomProxyMock = RoomProxyMock(.init(name: "Test")) + roomProxyMock = JoinedRoomProxyMock(.init(name: "Test")) notificationSettingsProxyMock = NotificationSettingsProxyMock(with: NotificationSettingsProxyMockConfiguration()) } func testInitialStateDefaultModeEncryptedRoom() async throws { - let roomProxyMock = RoomProxyMock(.init(name: "Test", isEncrypted: true)) + let roomProxyMock = JoinedRoomProxyMock(.init(name: "Test", isEncrypted: true)) let notificationSettingsProxyMock = NotificationSettingsProxyMock(with: NotificationSettingsProxyMockConfiguration()) notificationSettingsProxyMock.getNotificationSettingsRoomIdIsEncryptedIsOneToOneReturnValue = RoomNotificationSettingsProxyMock(with: .init(mode: .mentionsAndKeywordsOnly, isDefault: true)) @@ -55,7 +55,7 @@ class RoomNotificationSettingsScreenViewModelTests: XCTestCase { } func testInitialStateDefaultModeEncryptedRoomWithCanPushEncrypted() async throws { - let roomProxyMock = RoomProxyMock(.init(name: "Test", isEncrypted: true)) + let roomProxyMock = JoinedRoomProxyMock(.init(name: "Test", isEncrypted: true)) let notificationSettingsProxyMock = NotificationSettingsProxyMock(with: .init(canPushEncryptedEvents: true)) notificationSettingsProxyMock.getNotificationSettingsRoomIdIsEncryptedIsOneToOneReturnValue = RoomNotificationSettingsProxyMock(with: .init(mode: .mentionsAndKeywordsOnly, isDefault: true)) @@ -77,7 +77,7 @@ class RoomNotificationSettingsScreenViewModelTests: XCTestCase { } func testInitialStateDefaultModeUnencryptedRoom() async throws { - let roomProxyMock = RoomProxyMock(.init(name: "Test", isEncrypted: false)) + let roomProxyMock = JoinedRoomProxyMock(.init(name: "Test", isEncrypted: false)) let notificationSettingsProxyMock = NotificationSettingsProxyMock(with: NotificationSettingsProxyMockConfiguration()) notificationSettingsProxyMock.getNotificationSettingsRoomIdIsEncryptedIsOneToOneReturnValue = RoomNotificationSettingsProxyMock(with: .init(mode: .mentionsAndKeywordsOnly, isDefault: true)) diff --git a/UnitTests/Sources/RoomRolesAndPermissionsScreenViewModelTests.swift b/UnitTests/Sources/RoomRolesAndPermissionsScreenViewModelTests.swift index 1ce826e56..d6c0ffe76 100644 --- a/UnitTests/Sources/RoomRolesAndPermissionsScreenViewModelTests.swift +++ b/UnitTests/Sources/RoomRolesAndPermissionsScreenViewModelTests.swift @@ -21,7 +21,7 @@ import XCTest @MainActor class RoomRolesAndPermissionsScreenViewModelTests: XCTestCase { var viewModel: RoomRolesAndPermissionsScreenViewModelProtocol! - var roomProxy: RoomProxyMock! + var roomProxy: JoinedRoomProxyMock! var context: RoomRolesAndPermissionsScreenViewModelType.Context { viewModel.context @@ -83,7 +83,7 @@ class RoomRolesAndPermissionsScreenViewModelTests: XCTestCase { } private func setupViewModel(members: [RoomMemberProxyMock]) { - roomProxy = RoomProxyMock(.init(members: members)) + roomProxy = JoinedRoomProxyMock(.init(members: members)) viewModel = RoomRolesAndPermissionsScreenViewModel(roomProxy: roomProxy, userIndicatorController: UserIndicatorControllerMock(), analytics: ServiceLocator.shared.analytics) diff --git a/UnitTests/Sources/RoomScreenViewModelTests.swift b/UnitTests/Sources/RoomScreenViewModelTests.swift index 75890e0da..aaa944f7c 100644 --- a/UnitTests/Sources/RoomScreenViewModelTests.swift +++ b/UnitTests/Sources/RoomScreenViewModelTests.swift @@ -34,8 +34,8 @@ class RoomScreenViewModelTests: XCTestCase { func testPinnedEventsBanner() async throws { ServiceLocator.shared.settings.pinningEnabled = true let timelineSubject = PassthroughSubject() - let updateSubject = PassthroughSubject() - let roomProxyMock = RoomProxyMock(.init()) + let updateSubject = PassthroughSubject() + let roomProxyMock = JoinedRoomProxyMock(.init()) // setup a way to inject the mock of the pinned events timeline roomProxyMock.pinnedEventsTimelineClosure = { await timelineSubject.values.first() @@ -105,8 +105,8 @@ class RoomScreenViewModelTests: XCTestCase { } func testRoomInfoUpdate() async throws { - let updateSubject = PassthroughSubject() - let roomProxyMock = RoomProxyMock(.init(id: "TestID", name: "StartingName", avatarURL: nil, hasOngoingCall: false)) + let updateSubject = PassthroughSubject() + let roomProxyMock = JoinedRoomProxyMock(.init(id: "TestID", name: "StartingName", avatarURL: nil, hasOngoingCall: false)) // setup the room proxy actions publisher roomProxyMock.canUserJoinCallUserIDReturnValue = .success(false) roomProxyMock.underlyingActionsPublisher = updateSubject.eraseToAnyPublisher() diff --git a/UnitTests/Sources/TimelineViewModelTests.swift b/UnitTests/Sources/TimelineViewModelTests.swift index 6e9319084..64a55ae0f 100644 --- a/UnitTests/Sources/TimelineViewModelTests.swift +++ b/UnitTests/Sources/TimelineViewModelTests.swift @@ -328,10 +328,10 @@ class TimelineViewModelTests: XCTestCase { // swiftlint:enable force_unwrapping // swiftlint:disable:next large_tuple private func readReceiptsConfiguration(with items: [RoomTimelineItemProtocol]) -> (TimelineViewModel, - RoomProxyMock, + JoinedRoomProxyMock, TimelineProxyMock, MockRoomTimelineController) { - let roomProxy = RoomProxyMock(.init(name: "")) + let roomProxy = JoinedRoomProxyMock(.init(name: "")) let timelineProxy = TimelineProxyMock() @@ -367,7 +367,7 @@ class TimelineViewModelTests: XCTestCase { // When showing them in a timeline. let timelineController = MockRoomTimelineController() timelineController.timelineItems = [message] - let viewModel = TimelineViewModel(roomProxy: RoomProxyMock(.init(name: "", members: [RoomMemberProxyMock.mockAlice, RoomMemberProxyMock.mockCharlie])), + let viewModel = TimelineViewModel(roomProxy: JoinedRoomProxyMock(.init(name: "", members: [RoomMemberProxyMock.mockAlice, RoomMemberProxyMock.mockCharlie])), timelineController: timelineController, mediaProvider: MockMediaProvider(), mediaPlayerProvider: MediaPlayerProviderMock(), @@ -388,9 +388,9 @@ class TimelineViewModelTests: XCTestCase { // MARK: - Pins func testPinnedEvents() async throws { - let roomProxyMock = RoomProxyMock(.init(name: "", - pinnedEventIDs: .init(["test1"]))) - let actionsSubject = PassthroughSubject() + let roomProxyMock = JoinedRoomProxyMock(.init(name: "", + pinnedEventIDs: .init(["test1"]))) + let actionsSubject = PassthroughSubject() roomProxyMock.underlyingActionsPublisher = actionsSubject.eraseToAnyPublisher() let viewModel = TimelineViewModel(roomProxy: roomProxyMock, timelineController: MockRoomTimelineController(), @@ -417,8 +417,8 @@ class TimelineViewModelTests: XCTestCase { func testCanUserPinEvents() async throws { ServiceLocator.shared.settings.pinningEnabled = true - let roomProxyMock = RoomProxyMock(.init(name: "", canUserPin: false)) - let actionsSubject = PassthroughSubject() + let roomProxyMock = JoinedRoomProxyMock(.init(name: "", canUserPin: false)) + let actionsSubject = PassthroughSubject() roomProxyMock.underlyingActionsPublisher = actionsSubject.eraseToAnyPublisher() let viewModel = TimelineViewModel(roomProxy: roomProxyMock, timelineController: MockRoomTimelineController(), @@ -445,10 +445,10 @@ class TimelineViewModelTests: XCTestCase { // MARK: - Helpers - private func makeViewModel(roomProxy: RoomProxyProtocol? = nil, + private func makeViewModel(roomProxy: JoinedRoomProxyProtocol? = nil, focussedEventID: String? = nil, timelineController: RoomTimelineControllerProtocol) -> TimelineViewModel { - TimelineViewModel(roomProxy: roomProxy ?? RoomProxyMock(.init(name: "")), + TimelineViewModel(roomProxy: roomProxy ?? JoinedRoomProxyMock(.init(name: "")), focussedEventID: focussedEventID, timelineController: timelineController, mediaProvider: MockMediaProvider(), diff --git a/UnitTests/Sources/VoiceMessageRecorderTests.swift b/UnitTests/Sources/VoiceMessageRecorderTests.swift index e9408bc18..1d3645b41 100644 --- a/UnitTests/Sources/VoiceMessageRecorderTests.swift +++ b/UnitTests/Sources/VoiceMessageRecorderTests.swift @@ -204,7 +204,7 @@ class VoiceMessageRecorderTests: XCTestCase { } func testSendVoiceMessage_NoRecordingFile() async throws { - let roomProxy = RoomProxyMock() + let roomProxy = JoinedRoomProxyMock() // If there is no recording file, an error is expected audioRecorder.audioFileURL = nil @@ -219,7 +219,7 @@ class VoiceMessageRecorderTests: XCTestCase { // If the converter returns an error audioConverter.convertToOpusOggSourceURLDestinationURLThrowableError = AudioConverterError.conversionFailed(nil) - let roomProxy = RoomProxyMock() + let roomProxy = JoinedRoomProxyMock() guard case .failure(.failedSendingVoiceMessage) = await voiceMessageRecorder.sendVoiceMessage(inRoom: roomProxy, audioConverter: audioConverter) else { XCTFail("An error is expected") return @@ -237,7 +237,7 @@ class VoiceMessageRecorderTests: XCTestCase { } let timelineProxy = TimelineProxyMock() - let roomProxy = RoomProxyMock() + let roomProxy = JoinedRoomProxyMock() roomProxy.timeline = timelineProxy timelineProxy.sendVoiceMessageUrlAudioInfoWaveformProgressSubjectRequestHandleReturnValue = .failure(.sdkError(SDKError.generic)) guard case .failure(.failedSendingVoiceMessage) = await voiceMessageRecorder.sendVoiceMessage(inRoom: roomProxy, audioConverter: audioConverter) else { @@ -258,7 +258,7 @@ class VoiceMessageRecorderTests: XCTestCase { } let timelineProxy = TimelineProxyMock() - let roomProxy = RoomProxyMock() + let roomProxy = JoinedRoomProxyMock() roomProxy.timeline = timelineProxy timelineProxy.sendVoiceMessageUrlAudioInfoWaveformProgressSubjectRequestHandleReturnValue = .failure(.sdkError(SDKError.generic)) guard case .failure(.failedSendingVoiceMessage) = await voiceMessageRecorder.sendVoiceMessage(inRoom: roomProxy, audioConverter: audioConverter) else { @@ -281,7 +281,7 @@ class VoiceMessageRecorderTests: XCTestCase { // If the media upload fails let timelineProxy = TimelineProxyMock() - let roomProxy = RoomProxyMock() + let roomProxy = JoinedRoomProxyMock() roomProxy.timeline = timelineProxy timelineProxy.sendVoiceMessageUrlAudioInfoWaveformProgressSubjectRequestHandleReturnValue = .failure(.sdkError(SDKError.generic)) guard case .failure(.failedSendingVoiceMessage) = await voiceMessageRecorder.sendVoiceMessage(inRoom: roomProxy, audioConverter: audioConverter) else { @@ -297,7 +297,7 @@ class VoiceMessageRecorderTests: XCTestCase { } let timelineProxy = TimelineProxyMock() - let roomProxy = RoomProxyMock() + let roomProxy = JoinedRoomProxyMock() roomProxy.timeline = timelineProxy audioRecorder.currentTime = 42 audioRecorder.audioFileURL = imageFileURL