diff --git a/ElementX.xcodeproj/project.pbxproj b/ElementX.xcodeproj/project.pbxproj index 012ef578b..233901f41 100644 --- a/ElementX.xcodeproj/project.pbxproj +++ b/ElementX.xcodeproj/project.pbxproj @@ -24,7 +24,6 @@ /* Begin PBXBuildFile section */ 0033481EE363E4914295F188 /* LocalizationTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = C070FD43DC6BF4E50217965A /* LocalizationTests.swift */; }; - 0045F04EEA78E4B0F5CF0478 /* NSEUserSessionMock.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4FBDD04CDFF421AC09D4A99D /* NSEUserSessionMock.swift */; }; 00C3023B6DF55024D8876B76 /* ShareExtension.appex in Embed Foundation Extensions */ = {isa = PBXBuildFile; fileRef = 3D8BEEFCA07BEA43F4F4BF77 /* ShareExtension.appex */; settings = {ATTRIBUTES = (RemoveHeadersOnCopy, ); }; }; 01373C1AC4839604C4FDA404 /* test_apple_image.heic in Resources */ = {isa = PBXBuildFile; fileRef = BB576F4118C35E6B5124FA22 /* test_apple_image.heic */; }; 01681E8B20AD6F0D237F2DC1 /* IdentityConfirmedScreenViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9C6624240FFD32B7F0834229 /* IdentityConfirmedScreenViewModel.swift */; }; @@ -179,7 +178,6 @@ 1C598D3B785645AAC7B35760 /* ReportRoomScreenCoordinator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 292EEE1F71DCC205C45728F7 /* ReportRoomScreenCoordinator.swift */; }; 1C6B06DB15EC194AF35C05DB /* RoomPowerLevelsProxy.swift in Sources */ = {isa = PBXBuildFile; fileRef = CFFA5E881D281810AB428EA3 /* RoomPowerLevelsProxy.swift */; }; 1C8BC70A18060677E295A846 /* ShareToMapsAppActivity.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4481799F455B3DA243BDA2AC /* ShareToMapsAppActivity.swift */; }; - 1C99300428FA56D2D03F3BFA /* NSEMediaProviderMock.swift in Sources */ = {isa = PBXBuildFile; fileRef = BE3F571528E5B67DAC636637 /* NSEMediaProviderMock.swift */; }; 1C9BB74711E5F24C77B7FED0 /* RoomMembersListScreenCoordinator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5AEA0B743847CFA5B3C38EE4 /* RoomMembersListScreenCoordinator.swift */; }; 1D5DC685CED904386C89B7DA /* NSRegularExpresion.swift in Sources */ = {isa = PBXBuildFile; fileRef = 95BAC0F6C9644336E9567EE6 /* NSRegularExpresion.swift */; }; 1D623953F970D11F6F38499C /* AppLockService.swift in Sources */ = {isa = PBXBuildFile; fileRef = 851B95BB98649B8E773D6790 /* AppLockService.swift */; }; @@ -235,6 +233,7 @@ 27FEF0F40750465195C9D6D6 /* RoomSelectionScreenModels.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1B9D191A81FFB0C72CE73E77 /* RoomSelectionScreenModels.swift */; }; 281BED345D59A9A6A99E9D98 /* UNNotificationContent.swift in Sources */ = {isa = PBXBuildFile; fileRef = BE148A4FFEE853C5A281500C /* UNNotificationContent.swift */; }; 2835FD52F3F618D07F799B3D /* Publisher.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7310D8DFE01AF45F0689C3AA /* Publisher.swift */; }; + 28426806399E3659BEBC5918 /* NotificationHandler.swift in Sources */ = {isa = PBXBuildFile; fileRef = BB6ED50FE104992419310EEB /* NotificationHandler.swift */; }; 288408E6151D7BD3EBAA073A /* RoomScreenHook.swift in Sources */ = {isa = PBXBuildFile; fileRef = B343C5255FB408DDE853CFDF /* RoomScreenHook.swift */; }; 28E8C44DD6E39BEB2A1599C8 /* AccessibilityTestsAppCoordinator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5CABD320DE5566D133890B24 /* AccessibilityTestsAppCoordinator.swift */; }; 2932570AA418974979D16DED /* UserPreference.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5E6DE144D887A254F4CAF203 /* UserPreference.swift */; }; @@ -262,7 +261,6 @@ 2CA61BB208CD82EBDB58CD13 /* VideoRoomTimelineView.swift in Sources */ = {isa = PBXBuildFile; fileRef = ED0CBEAB5F796BEFBAF7BB6A /* VideoRoomTimelineView.swift */; }; 2CA6ABBC9A88EB89EA52FCCB /* ConfettiScene.scn in Resources */ = {isa = PBXBuildFile; fileRef = B61C339A2FDDBD067FF6635C /* ConfettiScene.scn */; }; 2CC3F27CD76DB00A747BEA6C /* AppSettings.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7BD5523BDEDB247E29228476 /* AppSettings.swift */; }; - 2CE6E081DB07A061F50338D7 /* NotificationItemProxyMock.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8684EEE970FEC511F8D28554 /* NotificationItemProxyMock.swift */; }; 2D0E3983288E2D35613AD681 /* SecureBackupControllerMock.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4AB29A2D95D3469B5F016655 /* SecureBackupControllerMock.swift */; }; 2D2D8A53B35BE8D8A01449C6 /* PinnedEventsBannerStateTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6FA38E813BE14149F173F461 /* PinnedEventsBannerStateTests.swift */; }; 2D38D39B1789B91AE69F477F /* PhotoLibraryManagerMock.swift in Sources */ = {isa = PBXBuildFile; fileRef = DD955A0380C287C418F1A74D /* PhotoLibraryManagerMock.swift */; }; @@ -345,7 +343,6 @@ 3C31E1A65EEB61E72E1113B4 /* AudioRecorderProtocol.swift in Sources */ = {isa = PBXBuildFile; fileRef = BBEC57C204D77908E355EF42 /* AudioRecorderProtocol.swift */; }; 3C549A0BF39F8A854D45D9FD /* Kingfisher in Frameworks */ = {isa = PBXBuildFile; productRef = 0DD568A494247444A4B56031 /* Kingfisher */; }; 3C73442084BF8A6939F0F80B /* AnalyticsService.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5445FCE0CE15E634FDC1A2E2 /* AnalyticsService.swift */; }; - 3C80B06AC8C2A759ED322B49 /* SDKGeneratedMocks.swift in Sources */ = {isa = PBXBuildFile; fileRef = C2F079B5DBD0D85FEA687AAE /* SDKGeneratedMocks.swift */; }; 3CB9EC9B670C90618B839D1B /* RemotePreference.swift in Sources */ = {isa = PBXBuildFile; fileRef = 69A05E85E4872C3221C5C287 /* RemotePreference.swift */; }; 3CE4C5071B6D2576E2473989 /* OrderedSet.swift in Sources */ = {isa = PBXBuildFile; fileRef = 62B07B296D7A9D2F09120853 /* OrderedSet.swift */; }; 3D0DAED550E967AB49F1758C /* CXProviderProtocol.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5E68CA59F66CE43B66D129E9 /* CXProviderProtocol.swift */; }; @@ -457,6 +454,7 @@ 4FFDC274824F7CC0BBDF581E /* BugReportScreenModels.swift in Sources */ = {isa = PBXBuildFile; fileRef = 51C2BCE0BC1FC69C1B36E688 /* BugReportScreenModels.swift */; }; 50381244BA280451771BE3ED /* PINTextFieldTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = EF13BFD415CA84B1272E94F8 /* PINTextFieldTests.swift */; }; 5038E69A5E6A89DE1A345E04 /* ShouldScrollOnKeyboardDidShow.swift in Sources */ = {isa = PBXBuildFile; fileRef = 832397B5C3D00A4BF52C5F0B /* ShouldScrollOnKeyboardDidShow.swift */; }; + 5044C78B1B49328F5BB1FEB8 /* NotificationItemProxyProtocol.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3DDB7A9BB466C56614BB589D /* NotificationItemProxyProtocol.swift */; }; 50539366B408780B232C1910 /* EstimatedWaveformView.swift in Sources */ = {isa = PBXBuildFile; fileRef = AD0FF64B0E6470F66F42E182 /* EstimatedWaveformView.swift */; }; 5100F53E6884A15F9BA07CC3 /* AttributedStringTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 37CA26F55123E36B50DB0B3A /* AttributedStringTests.swift */; }; 510C4EDF826CA9C6CEEC6C95 /* ManageRoomMemberSheetViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9A34D9BCA1A7D9A56E1EAF1D /* ManageRoomMemberSheetViewModel.swift */; }; @@ -479,7 +477,9 @@ 5470E62F65AE1803BBF3D528 /* CXProviderMock.swift in Sources */ = {isa = PBXBuildFile; fileRef = 86E1BAA7232081635662A83F /* CXProviderMock.swift */; }; 54AE8860D668AFD96E7E177B /* UITestsScreenIdentifier.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6CEBE5EA91E8691EDF364EC2 /* UITestsScreenIdentifier.swift */; }; 54FDA3625AACBD9E438D084D /* BlurEffectView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 07934EF08BB39353E4A94272 /* BlurEffectView.swift */; }; + 5500904C40D67D131E7E9A26 /* NotificationContentBuilder.swift in Sources */ = {isa = PBXBuildFile; fileRef = D7BB243B26D54EF1A0C422C0 /* NotificationContentBuilder.swift */; }; 5518DA4A6C9B4FC4B497EA9A /* LogViewerScreenModels.swift in Sources */ = {isa = PBXBuildFile; fileRef = 01B795AAAB7B8747FE2FF311 /* LogViewerScreenModels.swift */; }; + 551E03A935A6B73158A1AB4A /* NSEUserSessionMock.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4107DE842B9E8625291033AF /* NSEUserSessionMock.swift */; }; 558E2673B04FDD06A1A12DD3 /* LogViewerScreenViewModelProtocol.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7463464054DDF194C54F0B04 /* LogViewerScreenViewModelProtocol.swift */; }; 558F37B1A8F2C4CC9B1ACEDA /* Collections in Frameworks */ = {isa = PBXBuildFile; productRef = CAA3B9DF998B397C9EE64E8B /* Collections */; }; 55CDD3968D95D1A820B5491E /* PlaceholderAvatarImage.swift in Sources */ = {isa = PBXBuildFile; fileRef = C705E605EF57C19DBE86FFA1 /* PlaceholderAvatarImage.swift */; }; @@ -610,6 +610,7 @@ 6BAD956B909A6E29F6CC6E7C /* ButtonStyle.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8CC23C63849452BC86EA2852 /* ButtonStyle.swift */; }; 6BAE34CFA9821709CFE61E50 /* DeveloperOptionsScreenHook.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0F60FDB3AEFC60830BD289FE /* DeveloperOptionsScreenHook.swift */; }; 6C34237AFB808E38FC8776B9 /* RoomStateEventStringBuilder.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8D55702474F279D910D2D162 /* RoomStateEventStringBuilder.swift */; }; + 6C8BAF1E91618D69E7D652B2 /* NotificationServiceExtension.swift in Sources */ = {isa = PBXBuildFile; fileRef = 27A1AD6389A4659AF0CEAE62 /* NotificationServiceExtension.swift */; }; 6C98153D60FF9B648C166C27 /* TimelineItemMenu.swift in Sources */ = {isa = PBXBuildFile; fileRef = 91FFE1F410969ECB23FE9BB2 /* TimelineItemMenu.swift */; }; 6CAADDC6318E41C7D7AA9526 /* SpaceScreen.swift in Sources */ = {isa = PBXBuildFile; fileRef = 646B50583A2CE6DA67F7739A /* SpaceScreen.swift */; }; 6CBC544A7CC4DDDBDED4D0A6 /* AppIcon.icon in Resources */ = {isa = PBXBuildFile; fileRef = 4B1F71AC585827E6C416C15A /* AppIcon.icon */; }; @@ -701,6 +702,7 @@ 7BDC3976D88D40D2A45BEB8C /* NSRegularExpresion.swift in Sources */ = {isa = PBXBuildFile; fileRef = 95BAC0F6C9644336E9567EE6 /* NSRegularExpresion.swift */; }; 7BF368A78E6D9AFD222F25AF /* SecureBackupScreenViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7AE094FCB6387D268C436161 /* SecureBackupScreenViewModel.swift */; }; 7C0E29E0279866C62EC67A28 /* JoinRoomScreenViewModelTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = DE5127D6EA05B2E45D0A7D59 /* JoinRoomScreenViewModelTests.swift */; }; + 7C101936C8F3DAF8D8166124 /* DataProtectionManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75821CD31A4BD02B99C327A4 /* DataProtectionManager.swift */; }; 7C164A642E8932B5F9004550 /* test_voice_message.m4a in Resources */ = {isa = PBXBuildFile; fileRef = DCA2D836BD10303F37FAAEED /* test_voice_message.m4a */; }; 7C1A7B594B2F8143F0DD0005 /* ElementXAttributeScope.swift in Sources */ = {isa = PBXBuildFile; fileRef = C024C151639C4E1B91FCC68B /* ElementXAttributeScope.swift */; }; 7C545FFEC9930F7247352593 /* SecurityAndPrivacyScreenViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 978092B01BEAB39F2C4389AE /* SecurityAndPrivacyScreenViewModel.swift */; }; @@ -829,6 +831,7 @@ 9278EC51D24E57445B290521 /* AudioSessionProtocol.swift in Sources */ = {isa = PBXBuildFile; fileRef = BB284643AF7AB131E307DCE0 /* AudioSessionProtocol.swift */; }; 9295F1F5E04484E10780BCE8 /* CharacterSet.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1F8C01DEEA83903D45069BBD /* CharacterSet.swift */; }; 92D9088B901CEBB1A99ECA4E /* RoomMemberProxyMock.swift in Sources */ = {isa = PBXBuildFile; fileRef = 36FD673E24FBFCFDF398716A /* RoomMemberProxyMock.swift */; }; + 9312F5A17AE59A9E910C51D6 /* NotificationItemProxyMock.swift in Sources */ = {isa = PBXBuildFile; fileRef = 840182D7A61402D5947DE094 /* NotificationItemProxyMock.swift */; }; 9322949BFCA6278921085862 /* DeactivateAccountScreenModels.swift in Sources */ = {isa = PBXBuildFile; fileRef = 664D3C710B4A12CE4E623645 /* DeactivateAccountScreenModels.swift */; }; 934051B17A884AB0635DF81B /* BlockedUsersScreenViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = A010B8EAD1A9F6B4686DF2F4 /* BlockedUsersScreenViewModel.swift */; }; 937985546F708339711ECDFC /* ComposerToolbar.swift in Sources */ = {isa = PBXBuildFile; fileRef = 85666E40F7E817809B4FD787 /* ComposerToolbar.swift */; }; @@ -919,7 +922,6 @@ A17FAD2EBC53E17B5FD384DB /* InviteUsersScreenViewModelProtocol.swift in Sources */ = {isa = PBXBuildFile; fileRef = 22730A30C50AC2E3D5BA8642 /* InviteUsersScreenViewModelProtocol.swift */; }; A1BA8D6BABAFA9BAAEAA3FFD /* NotificationSettingsProxyProtocol.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4FDD775CFD72DD2D3C8A8390 /* NotificationSettingsProxyProtocol.swift */; }; A1DF0E1E526A981ED6D5DF44 /* UserIndicatorControllerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2429224EB0EEA34D35CE9249 /* UserIndicatorControllerTests.swift */; }; - A1FC9BC2D28C6463A08C2C5D /* GeneratedMocks.swift in Sources */ = {isa = PBXBuildFile; fileRef = CBE6BD6D8EC1CFABFCBC447A /* GeneratedMocks.swift */; }; A2091F4B1332D9BF273B09D5 /* SpaceServiceProxyMock.swift in Sources */ = {isa = PBXBuildFile; fileRef = EF36FC3DE25B20B7FA91F1FD /* SpaceServiceProxyMock.swift */; }; A216C83ADCF32BA5EF8A6FBC /* InviteUsersViewModelTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 845DDBDE5A0887E73D38B826 /* InviteUsersViewModelTests.swift */; }; A2172B5A26976F9174228B8A /* AppHooks.swift in Sources */ = {isa = PBXBuildFile; fileRef = B6E4AB573FAEBB7B853DD04C /* AppHooks.swift */; }; @@ -1202,6 +1204,7 @@ D6152E21036B88C44ECB22E7 /* EncryptionResetPasswordScreenViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 303D9438EFB481F57A366E82 /* EncryptionResetPasswordScreenViewModel.swift */; }; D63974A88CF2BC721F109C77 /* Compound in Frameworks */ = {isa = PBXBuildFile; productRef = DCA3C4A997AD28E6918D4CE5 /* Compound */; }; D6DE764B17FB4A9A12C33BF4 /* MessageComposer.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9F1DF3FFFE5ED2B8133F43A7 /* MessageComposer.swift */; }; + D75C591C44C2510FDFA9C3D8 /* Dynamic in Frameworks */ = {isa = PBXBuildFile; productRef = AFAD718C6621B94813B960B4 /* Dynamic */; }; D7CDBAE82782BD0529DECB5F /* AttributedString.swift in Sources */ = {isa = PBXBuildFile; fileRef = 52BD6ED18E2EB61E28C340AD /* AttributedString.swift */; }; D820B3C223E4C2E77BB2A2BF /* ElementCallServiceTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7EA2AFF6EB59FE25234D29F3 /* ElementCallServiceTests.swift */; }; D8459AAD6969B1431ECBE990 /* UnsupportedRoomTimelineView.swift in Sources */ = {isa = PBXBuildFile; fileRef = C9E535B3388755B65C34CD10 /* UnsupportedRoomTimelineView.swift */; }; @@ -1274,6 +1277,7 @@ E5E43A0CA99AF5BA11B194A2 /* EncryptionSettingsTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 57AD14D3ADADE8F6A10F9E88 /* EncryptionSettingsTests.swift */; }; E5F4C992845388B50BABACAA /* ServerSelectionScreenCoordinator.swift in Sources */ = {isa = PBXBuildFile; fileRef = BB8BC4C791D0E88CFCF4E5DF /* ServerSelectionScreenCoordinator.swift */; }; E67418DACEDBC29E988E6ACD /* message.caf in Resources */ = {isa = PBXBuildFile; fileRef = ED482057AE39D5C6D9C5F3D8 /* message.caf */; }; + E6A2F6E4795C1054025AACFF /* NotificationItemProxy.swift in Sources */ = {isa = PBXBuildFile; fileRef = F3AB32690C6CE5C62A86D6FA /* NotificationItemProxy.swift */; }; E6FA87F773424B27614B23E9 /* TimelineItemAccessibilityModifier.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1DA7E93C2E148B96EF6A8500 /* TimelineItemAccessibilityModifier.swift */; }; E75CE800B3E64D0F7F8E228D /* TemplateScreenViewModelTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = C08E9043618AE5B0BF7B07E1 /* TemplateScreenViewModelTests.swift */; }; E77FE06B165A38BF1735509F /* SecureBackupScreenCoordinator.swift in Sources */ = {isa = PBXBuildFile; fileRef = FDF73F49E6B6683F7E2D26F0 /* SecureBackupScreenCoordinator.swift */; }; @@ -1287,6 +1291,7 @@ E8C4D9F93F0DCED211D5F187 /* HTMLParserStyle.swift in Sources */ = {isa = PBXBuildFile; fileRef = E3877D3CFAC1D33823359BAF /* HTMLParserStyle.swift */; }; E8C65C19F7C40EE545172DD6 /* RoomScreenFooterView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4137900E28201C314C835C11 /* RoomScreenFooterView.swift */; }; E9347F56CF0683208F4D9249 /* RoomNotificationSettingsScreenViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 81A9B5225D0881CEFA2CF7C9 /* RoomNotificationSettingsScreenViewModel.swift */; }; + E938F7A45D6A3DBBE6789A03 /* NSEUserSession.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6C9651CD1066F239C7739240 /* NSEUserSession.swift */; }; E9560744F7B0292E20ECE5F2 /* RoomDetailsScreenViewModelProtocol.swift in Sources */ = {isa = PBXBuildFile; fileRef = 63E8A1E8EE094F570573B6E8 /* RoomDetailsScreenViewModelProtocol.swift */; }; E96005321849DBD7C72A28F2 /* UITestsAppCoordinator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 46C208DA43CE25D13E670F40 /* UITestsAppCoordinator.swift */; }; E9985DCD1B0D026D7E8BF809 /* ServerSelectionTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6640DB5B9171D163E6742639 /* ServerSelectionTests.swift */; }; @@ -1858,6 +1863,7 @@ 40A66E8BC8D9AE4A08EFB2DF /* RoomInfoProxy.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RoomInfoProxy.swift; sourceTree = ""; }; 40B21E611DADDEF00307E7AC /* String.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = String.swift; sourceTree = ""; }; 4100DDE6BF3C566AB66B80CC /* MentionSuggestionItemView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MentionSuggestionItemView.swift; sourceTree = ""; }; + 4107DE842B9E8625291033AF /* NSEUserSessionMock.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NSEUserSessionMock.swift; sourceTree = ""; }; 4137900E28201C314C835C11 /* RoomScreenFooterView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RoomScreenFooterView.swift; sourceTree = ""; }; 41656BC6267D55C56A2AAC08 /* EditRoomAddressScreenCoordinator.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = EditRoomAddressScreenCoordinator.swift; sourceTree = ""; }; 4176C3E20C772DE8D182863C /* LegalInformationScreen.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LegalInformationScreen.swift; sourceTree = ""; }; @@ -1939,7 +1945,6 @@ 4F75EF13F49DD2204E760910 /* FileRoomTimelineView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FileRoomTimelineView.swift; sourceTree = ""; }; 4FA29BAE9B0F2D90E57B261C /* UserSessionFlowCoordinatorTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UserSessionFlowCoordinatorTests.swift; sourceTree = ""; }; 4FAC770857E525B51E277D8C /* SpaceListScreenModels.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SpaceListScreenModels.swift; sourceTree = ""; }; - 4FBDD04CDFF421AC09D4A99D /* NSEUserSessionMock.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NSEUserSessionMock.swift; sourceTree = ""; }; 4FCB2126C091EEF2454B4D56 /* RoomFlowCoordinatorTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RoomFlowCoordinatorTests.swift; sourceTree = ""; }; 4FDD775CFD72DD2D3C8A8390 /* NotificationSettingsProxyProtocol.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NotificationSettingsProxyProtocol.swift; sourceTree = ""; }; 502F986D57158674172C58E3 /* AppLockSetupSettingsScreenModels.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppLockSetupSettingsScreenModels.swift; sourceTree = ""; }; @@ -2197,6 +2202,7 @@ 83B4E3F1265581683E4997B8 /* RoomSelectionScreenViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RoomSelectionScreenViewModel.swift; sourceTree = ""; }; 83B574805B9812C111D6215D /* Tracing.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Tracing.swift; sourceTree = ""; }; 83E2B20431F890ED64255CA1 /* AdvancedSettingsScreenViewModelProtocol.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AdvancedSettingsScreenViewModelProtocol.swift; sourceTree = ""; }; + 840182D7A61402D5947DE094 /* NotificationItemProxyMock.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NotificationItemProxyMock.swift; sourceTree = ""; }; 84311D707B09854D67F78BBF /* de */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = de; path = de.lproj/InfoPlist.strings; sourceTree = ""; }; 845DDBDE5A0887E73D38B826 /* InviteUsersViewModelTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = InviteUsersViewModelTests.swift; sourceTree = ""; }; 848F69921527D31CAACB93AF /* SecureBackupLogoutConfirmationScreenViewModelTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SecureBackupLogoutConfirmationScreenViewModelTests.swift; sourceTree = ""; }; @@ -2219,7 +2225,6 @@ 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 = ""; }; - 8684EEE970FEC511F8D28554 /* NotificationItemProxyMock.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NotificationItemProxyMock.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 = ""; }; @@ -2512,7 +2517,6 @@ BD5480F03306234FC086E93B /* HomeScreenNewSoundBanner.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HomeScreenNewSoundBanner.swift; sourceTree = ""; }; BDE3EDEA7E64D68FEB828F83 /* SpaceSettingsFlowCoordinator.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SpaceSettingsFlowCoordinator.swift; sourceTree = ""; }; BE148A4FFEE853C5A281500C /* UNNotificationContent.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UNNotificationContent.swift; sourceTree = ""; }; - BE3F571528E5B67DAC636637 /* NSEMediaProviderMock.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NSEMediaProviderMock.swift; sourceTree = ""; }; BE89A8BD65CCE3FCC925CA14 /* TimelineItemReplyDetails.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TimelineItemReplyDetails.swift; sourceTree = ""; }; BE98688578F8B0541D853695 /* test_pdf.pdf */ = {isa = PBXFileReference; lastKnownFileType = image.pdf; path = test_pdf.pdf; sourceTree = ""; }; BE9BBB18FB27F09032AD8769 /* NotificationPermissionsScreenViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NotificationPermissionsScreenViewModel.swift; sourceTree = ""; }; @@ -2591,7 +2595,6 @@ CB7B588A06911B455AC0B4C9 /* ManageRoomMemberSheetViewModelProtocol.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ManageRoomMemberSheetViewModelProtocol.swift; sourceTree = ""; }; CBA95E52C4C6EE8769A63E57 /* eo */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = eo; path = eo.lproj/Localizable.strings; sourceTree = ""; }; CBBCC6E74774E79B599625D0 /* es */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = es; path = es.lproj/Localizable.strings; sourceTree = ""; }; - CBE6BD6D8EC1CFABFCBC447A /* GeneratedMocks.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = GeneratedMocks.swift; sourceTree = ""; }; CBF9AEA706926DD0DA2B954C /* JoinedRoomSize+MemberCount.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "JoinedRoomSize+MemberCount.swift"; sourceTree = ""; }; CC03209FDE8CE0810617BFFF /* RoomMembersListScreenMemberCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RoomMembersListScreenMemberCell.swift; sourceTree = ""; }; CC1DDB2293A51EA4C2739351 /* RoomListFiltersEmptyStateView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RoomListFiltersEmptyStateView.swift; sourceTree = ""; }; @@ -2889,6 +2892,7 @@ 7FF27DA70D833CFC5724EFC5 /* MatrixRustSDK in Frameworks */, BCA5E2157CE27AB6F1D043D3 /* AsyncAlgorithms in Frameworks */, B5C40DCFFDFBA0F86E228602 /* Clocks in Frameworks */, + D75C591C44C2510FDFA9C3D8 /* Dynamic in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -3565,7 +3569,9 @@ 7F957320D0EB7D7B4E30C79D /* KnockRequestProxyMock.swift */, 6F65E4BB9E82EB8373207CF8 /* MediaProviderMock.swift */, 8DA1E8F287680C8ED25EDBAC /* NetworkMonitorMock.swift */, + 840182D7A61402D5947DE094 /* NotificationItemProxyMock.swift */, 382B50F7E379B3DBBD174364 /* NotificationSettingsProxyMock.swift */, + 4107DE842B9E8625291033AF /* NSEUserSessionMock.swift */, B2AD8A56CD37E23071A2F4BF /* PHGPostHogMock.swift */, DD955A0380C287C418F1A74D /* PhotoLibraryManagerMock.swift */, D38391154120264910D19528 /* PollMock.swift */, @@ -4424,14 +4430,6 @@ path = View; sourceTree = ""; }; - 61685085A756A39D8AC1570E /* Generated */ = { - isa = PBXGroup; - children = ( - CBE6BD6D8EC1CFABFCBC447A /* GeneratedMocks.swift */, - ); - path = Generated; - sourceTree = ""; - }; 63E514D74481A3D9556DFFC3 /* SecureBackupLogoutConfirmationScreen */ = { isa = PBXGroup; children = ( @@ -5075,7 +5073,6 @@ BB6ED50FE104992419310EEB /* NotificationHandler.swift */, 27A1AD6389A4659AF0CEAE62 /* NotificationServiceExtension.swift */, 6C9651CD1066F239C7739240 /* NSEUserSession.swift */, - 9999304B1B799F22FF4010A1 /* Mocks */, 10450069C1510FAFAEABB4AA /* NotificationItemProxy */, ); path = Sources; @@ -5363,17 +5360,6 @@ path = Spaces; sourceTree = ""; }; - 9999304B1B799F22FF4010A1 /* Mocks */ = { - isa = PBXGroup; - children = ( - 8684EEE970FEC511F8D28554 /* NotificationItemProxyMock.swift */, - BE3F571528E5B67DAC636637 /* NSEMediaProviderMock.swift */, - 4FBDD04CDFF421AC09D4A99D /* NSEUserSessionMock.swift */, - 61685085A756A39D8AC1570E /* Generated */, - ); - path = Mocks; - sourceTree = ""; - }; 99B9B46F2D621380428E68F7 /* ElementX */ = { isa = PBXGroup; children = ( @@ -6751,6 +6737,7 @@ C07EA60CAB296D7726210F5B /* MatrixRustSDK */, 5A8EF1A5F9629FCA309D4B2A /* AsyncAlgorithms */, FFA423B0A7BBD8AA9BB91AB0 /* Clocks */, + AFAD718C6621B94813B960B4 /* Dynamic */, ); productName = UnitTests; productReference = AAC9344689121887B74877AF /* UnitTests.xctest */; @@ -6885,7 +6872,6 @@ isa = PBXNativeTarget; buildConfigurationList = CBD61DB8FBC472BAA66A0CBD /* Build configuration list for PBXNativeTarget "NSE" */; buildPhases = ( - D31C9B2FB9B5011A90C3FDD7 /* 🧙 Sourcery - Generate mocks */, 064584F7D1F4A58D753BDD96 /* Sources */, 804B8DA568046249B1261739 /* Resources */, BF59B36A7B2DB184B62826F6 /* Frameworks */, @@ -7006,6 +6992,7 @@ F76A08D0EA29A07A54F4EB4D /* XCRemoteSwiftPackageReference "swift-collections" */, 4C34425923978C97409A3EF2 /* XCRemoteSwiftPackageReference "DSWaveformImage" */, D5F7D47BBAAE0CF1DDEB3034 /* XCRemoteSwiftPackageReference "DeviceKit" */, + 75CC627F59499C9E93D8FDAD /* XCRemoteSwiftPackageReference "Dynamic" */, 8213398B60F9B660D9216ADF /* XCRemoteSwiftPackageReference "element-call-swift" */, 821C67C9A7F8CC3FD41B28B4 /* XCRemoteSwiftPackageReference "emojibase-bindings" */, 701C7BEF8F70F7A83E852DCC /* XCRemoteSwiftPackageReference "GZIP" */, @@ -7288,25 +7275,6 @@ shellPath = /bin/sh; shellScript = "export PATH=\"$PATH:/opt/homebrew/bin\"\nif which sourcery >/dev/null; then\n sourcery --config Tools/Sourcery/TestablePreviewsDictionary.yml\n sourcery --config Tools/Sourcery/AccessibilityTests.yml\nelse\n echo \"warning: Sourcery not installed, run swift run tools setup-project\"\nfi\n"; }; - D31C9B2FB9B5011A90C3FDD7 /* 🧙 Sourcery - Generate mocks */ = { - isa = PBXShellScriptBuildPhase; - alwaysOutOfDate = 1; - buildActionMask = 2147483647; - files = ( - ); - inputFileListPaths = ( - ); - inputPaths = ( - ); - name = "🧙 Sourcery - Generate mocks"; - outputFileListPaths = ( - ); - outputPaths = ( - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "export PATH=\"$PATH:/opt/homebrew/bin\"\nif which sourcery >/dev/null; then\n sourcery --config Tools/Sourcery/NSEAutoMockableConfig.yml\nelse\n echo \"warning: Sourcery not installed, run swift run tools setup-project\"\nfi\n"; - }; /* End PBXShellScriptBuildPhase section */ /* Begin PBXSourcesBuildPhase section */ @@ -7338,7 +7306,6 @@ 89198AE2649DD77673D5793B /* ExtensionLogger.swift in Sources */, A33784831AD880A670CAA9F9 /* FileManager.swift in Sources */, 0DFCEAB8C82B151718F71D49 /* FrequentlyUsedEmoji.swift in Sources */, - A1FC9BC2D28C6463A08C2C5D /* GeneratedMocks.swift in Sources */, 31CCF3159E5CE1C05AE5781B /* HTMLFixtures.swift in Sources */, 59F940FCBE6BC343AECEF75E /* ImageCache.swift in Sources */, EBE13FAB4E29738AC41BD3E5 /* InfoPlistReader.swift in Sources */, @@ -7355,9 +7322,7 @@ 9DD5AA10E85137140FEA86A3 /* MediaProvider.swift in Sources */, 7A642EE5F1ADC5D520F21924 /* MediaProviderProtocol.swift in Sources */, E2DB696117BAEABAD5718023 /* MediaSourceProxy.swift in Sources */, - 1C99300428FA56D2D03F3BFA /* NSEMediaProviderMock.swift in Sources */, 4CB30D9BD72CA3FEEFAA0793 /* NSEUserSession.swift in Sources */, - 0045F04EEA78E4B0F5CF0478 /* NSEUserSessionMock.swift in Sources */, 1D5DC685CED904386C89B7DA /* NSRegularExpresion.swift in Sources */, 94F0B78928E952689ACDB271 /* NetworkMonitor.swift in Sources */, 4DEEFB73181C3B023DB42686 /* NetworkMonitorProtocol.swift in Sources */, @@ -7365,7 +7330,6 @@ 2689D22EF1D10D22B0A4DAEA /* NotificationContentBuilder.swift in Sources */, A07178337F3C0B208B5A77A8 /* NotificationHandler.swift in Sources */, 5415236FA271AF7885D4995E /* NotificationItemProxy.swift in Sources */, - 2CE6E081DB07A061F50338D7 /* NotificationItemProxyMock.swift in Sources */, CBBBE597BE74A2DF68DE2209 /* NotificationItemProxyProtocol.swift in Sources */, B14BC354E56616B6B7D9A3D7 /* NotificationServiceExtension.swift in Sources */, A5F50F36E56E5D3C241E2BE3 /* OIDCConfiguration.swift in Sources */, @@ -7379,7 +7343,6 @@ F65F3909769E7C48B3309D9D /* RemoteSettingsHook.swift in Sources */, 414F50CFCFEEE2611127DCFB /* RestorationToken.swift in Sources */, 17BC15DA08A52587466698C5 /* RoomMessageEventStringBuilder.swift in Sources */, - 3C80B06AC8C2A759ED322B49 /* SDKGeneratedMocks.swift in Sources */, 06D17F7813AA931FF18FD5D0 /* SDKListener.swift in Sources */, F71C2B24AFB566119ACCDDA1 /* Secrets.swift in Sources */, 7573D682F089205F7F1D96CF /* SessionDirectories.swift in Sources */, @@ -7808,6 +7771,7 @@ A722F426FD81FC67706BB1E0 /* CustomLayoutLabelStyle.swift in Sources */, 12C867E85E6D12EEDFD0B127 /* CustomStringConvertible.swift in Sources */, 9905C1B1C6EFE38F3A6533F3 /* Data.swift in Sources */, + 7C101936C8F3DAF8D8166124 /* DataProtectionManager.swift in Sources */, C6C06DDA8881260303FBA3A0 /* Date.swift in Sources */, 99C463F12F89C99C77D02077 /* DeactivateAccountScreen.swift in Sources */, 3E3CC3D17908A3BB9F224CC5 /* DeactivateAccountScreenCoordinator.swift in Sources */, @@ -8066,6 +8030,8 @@ C97325EFDCCEE457432A9E82 /* MessageText.swift in Sources */, AF2ABA2794E376B64104C964 /* MockSoftLogoutScreenState.swift in Sources */, 530C2238E40F71223327FC95 /* MockTimelineController.swift in Sources */, + E938F7A45D6A3DBBE6789A03 /* NSEUserSession.swift in Sources */, + 551E03A935A6B73158A1AB4A /* NSEUserSessionMock.swift in Sources */, F9842667B68DC6FA1F9ECCBB /* NSItemProvider.swift in Sources */, EA01A06EEDFEF4AE7652E5F3 /* NSRegularExpresion.swift in Sources */, FA2BBAE9FC5E2E9F960C0980 /* NavigationCoordinators.swift in Sources */, @@ -8079,6 +8045,11 @@ 9408CE8B8865C0C8DD4C9869 /* NoticeRoomTimelineItemContent.swift in Sources */, 7F825CBD857D65DC986087BA /* NoticeRoomTimelineView.swift in Sources */, 3F70E237CE4C3FAB02FC227F /* NotificationConstants.swift in Sources */, + 5500904C40D67D131E7E9A26 /* NotificationContentBuilder.swift in Sources */, + 28426806399E3659BEBC5918 /* NotificationHandler.swift in Sources */, + E6A2F6E4795C1054025AACFF /* NotificationItemProxy.swift in Sources */, + 9312F5A17AE59A9E910C51D6 /* NotificationItemProxyMock.swift in Sources */, + 5044C78B1B49328F5BB1FEB8 /* NotificationItemProxyProtocol.swift in Sources */, 652ACCF104A8CEF30788963C /* NotificationManager.swift in Sources */, 06D3942496E9E0E655F14D21 /* NotificationManagerProtocol.swift in Sources */, 5139F4BD5A5DF6F8D11A9BDE /* NotificationPermissionsScreen.swift in Sources */, @@ -8086,6 +8057,7 @@ 3E7B65C2C97748D5D65AAA8B /* NotificationPermissionsScreenModels.swift in Sources */, D4D7CCECC6C0AAFC42E165BB /* NotificationPermissionsScreenViewModel.swift in Sources */, C8A9C595038AFA2D707AC8C1 /* NotificationPermissionsScreenViewModelProtocol.swift in Sources */, + 6C8BAF1E91618D69E7D652B2 /* NotificationServiceExtension.swift in Sources */, C0090506A52A1991BAF4BA68 /* NotificationSettingsChatType.swift in Sources */, AA93B3F9B5DD097DEF79F981 /* NotificationSettingsEditScreen.swift in Sources */, 53A59720F4729D9BBFFB7CAB /* NotificationSettingsEditScreenCoordinator.swift in Sources */, @@ -9538,6 +9510,14 @@ minimumVersion = 1.3.2; }; }; + 75CC627F59499C9E93D8FDAD /* XCRemoteSwiftPackageReference "Dynamic" */ = { + isa = XCRemoteSwiftPackageReference; + repositoryURL = "https://github.com/mhdhejazi/Dynamic"; + requirement = { + kind = exactVersion; + version = 1.2; + }; + }; 8213398B60F9B660D9216ADF /* XCRemoteSwiftPackageReference "element-call-swift" */ = { isa = XCRemoteSwiftPackageReference; repositoryURL = "https://github.com/element-hq/element-call-swift"; @@ -9910,6 +9890,11 @@ package = F76A08D0EA29A07A54F4EB4D /* XCRemoteSwiftPackageReference "swift-collections" */; productName = Collections; }; + AFAD718C6621B94813B960B4 /* Dynamic */ = { + isa = XCSwiftPackageProductDependency; + package = 75CC627F59499C9E93D8FDAD /* XCRemoteSwiftPackageReference "Dynamic" */; + productName = Dynamic; + }; B1E8B697DF78FE7F61FC6CA4 /* MatrixRustSDK */ = { isa = XCSwiftPackageProductDependency; package = 6FC4820D8D4559CEECA064D7 /* XCRemoteSwiftPackageReference "matrix-rust-components-swift" */; diff --git a/ElementX.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved b/ElementX.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved index 172165b9d..5d1aceab3 100644 --- a/ElementX.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved +++ b/ElementX.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved @@ -45,6 +45,15 @@ "version" : "1.7.18" } }, + { + "identity" : "dynamic", + "kind" : "remoteSourceControl", + "location" : "https://github.com/mhdhejazi/Dynamic", + "state" : { + "revision" : "ab9a2570862d54aed2663691bb767f881226a12f", + "version" : "1.2.0" + } + }, { "identity" : "element-call-swift", "kind" : "remoteSourceControl", diff --git a/NSE/Sources/NotificationContentBuilder.swift b/NSE/Sources/NotificationContentBuilder.swift index 05b368fd0..cf5306e5e 100644 --- a/NSE/Sources/NotificationContentBuilder.swift +++ b/NSE/Sources/NotificationContentBuilder.swift @@ -110,13 +110,13 @@ struct NotificationContentBuilder { notificationContent.body = body let name = notificationItem.senderDisplayName ?? notificationItem.roomDisplayName - await addSenderIcon(notificationContent: ¬ificationContent, - senderID: notificationItem.senderID, - senderAvatarDisplayName: name, - senderDisplayName: name, - icon: icon(for: notificationItem), - forcePlaceholder: userSession.inviteAvatarsVisibility == .off, - mediaProvider: mediaProvider) + await addCommunicationContext(notificationContent: ¬ificationContent, + senderID: notificationItem.senderID, + senderAvatarDisplayName: name, + senderDisplayName: name, + icon: icon(for: notificationItem), + forcePlaceholder: userSession.inviteAvatarsVisibility == .off, + mediaProvider: mediaProvider) } private func processMessageLike(notificationContent: inout UNMutableNotificationContent, @@ -136,12 +136,12 @@ struct NotificationContentBuilder { let senderDisplayName = notificationItem.hasMention ? L10n.notificationSenderMentionReply(senderAvatarDisplayName) : senderAvatarDisplayName - await addSenderIcon(notificationContent: ¬ificationContent, - senderID: notificationItem.senderID, - senderAvatarDisplayName: senderAvatarDisplayName, - senderDisplayName: senderDisplayName, - icon: icon(for: notificationItem), - mediaProvider: mediaProvider) + await addCommunicationContext(notificationContent: ¬ificationContent, + senderID: notificationItem.senderID, + senderAvatarDisplayName: senderAvatarDisplayName, + senderDisplayName: senderDisplayName, + icon: icon(for: notificationItem), + mediaProvider: mediaProvider) } private func icon(for notificationItem: NotificationItemProxyProtocol) -> NotificationIcon { @@ -231,13 +231,13 @@ struct NotificationContentBuilder { } } - private func addSenderIcon(notificationContent: inout UNMutableNotificationContent, - senderID: String, - senderAvatarDisplayName: String, - senderDisplayName: String, - icon: NotificationIcon, - forcePlaceholder: Bool = false, - mediaProvider: MediaProviderProtocol) async { + private func addCommunicationContext(notificationContent: inout UNMutableNotificationContent, + senderID: String, + senderAvatarDisplayName: String, + senderDisplayName: String, + icon: NotificationIcon, + forcePlaceholder: Bool = false, + mediaProvider: MediaProviderProtocol) async { var fetchedImage: INImage? let image: INImage if !forcePlaceholder, @@ -297,7 +297,9 @@ struct NotificationContentBuilder { interaction.direction = .incoming // Donate the interaction before updating notification content. - try? await interaction.donate() + if !ProcessInfo.isRunningTests { + try? await interaction.donate() + } // Update notification content before displaying the // communication notification. diff --git a/UnitTests/Sources/NotificationContentBuilderTests.swift b/UnitTests/Sources/NotificationContentBuilderTests.swift index 7918822e3..a8430b507 100644 --- a/UnitTests/Sources/NotificationContentBuilderTests.swift +++ b/UnitTests/Sources/NotificationContentBuilderTests.swift @@ -5,6 +5,7 @@ // Please see LICENSE files in the repository root for full details. // +import Dynamic import MatrixRustSDK import XCTest @@ -13,8 +14,10 @@ import XCTest final class NotificationContentBuilderTests: XCTestCase { var notificationContentBuilder: NotificationContentBuilder! var mediaProvider: MediaProviderMock! + var notificationContent: UNMutableNotificationContent! override func setUp() { + notificationContent = .init() let stringBuilder = RoomMessageEventStringBuilder(attributedStringBuilder: AttributedStringBuilder(mentionBuilder: PlainMentionBuilder()), destination: .notification) mediaProvider = MediaProviderMock(configuration: .init()) @@ -23,17 +26,215 @@ final class NotificationContentBuilderTests: XCTestCase { } func testDMMessageNotification() async { - let notificationItem = NotificationItemProxyMock(.init(senderDisplayName: "Alice", + let notificationItem = NotificationItemProxyMock(.init(roomID: "!test:matrix.org", + receiverID: "@bob:matrix.org", + senderDisplayName: "Alice", roomDisplayName: "Alice", roomJoinedMembers: 2, isRoomDirect: true, - isRoomPrivate: true)) - var notificationContent = UNMutableNotificationContent() + isRoomPrivate: true, + isNoisy: true)) await notificationContentBuilder.process(notificationContent: ¬ificationContent, notificationItem: notificationItem, mediaProvider: mediaProvider) - XCTAssertEqual(notificationContent.title, "Alice") + let communicationContext = Dynamic(notificationContent, memberName: "communicationContext") + // Checking if nil without using asObject always fails + XCTAssertNil(communicationContext.displayName.asObject) + XCTAssertEqual(communicationContext.sender.displayName, "Alice") XCTAssertEqual(notificationContent.body, "Hello world!") + XCTAssertEqual(notificationContent.categoryIdentifier, NotificationConstants.Category.message) + XCTAssertNil(notificationContent.threadRootEventID) + XCTAssertNotNil(notificationContent.sound) + // Remember we remove the @ due to an iOS bug + XCTAssertEqual(notificationContent.threadIdentifier, "bob:matrix.org!test:matrix.org") + XCTAssertEqual(notificationContent.attachments, []) + } + + func testDMMessageNotificationWithMention() async { + let notificationItem = NotificationItemProxyMock(.init(roomID: "!test:matrix.org", + receiverID: "@bob:matrix.org", + senderDisplayName: "Alice", + roomDisplayName: "Alice", + roomJoinedMembers: 2, + isRoomDirect: true, + isRoomPrivate: true, + isNoisy: true, + hasMention: true)) + + await notificationContentBuilder.process(notificationContent: ¬ificationContent, + notificationItem: notificationItem, + mediaProvider: mediaProvider) + + let communicationContext = Dynamic(notificationContent, memberName: "communicationContext") + // Checking if nil without using asObject always fails + XCTAssertNil(communicationContext.displayName.asObject) + XCTAssertEqual(communicationContext.sender.displayName, L10n.notificationSenderMentionReply("Alice")) + XCTAssertEqual(notificationContent.body, "Hello world!") + XCTAssertEqual(notificationContent.categoryIdentifier, NotificationConstants.Category.message) + XCTAssertNil(notificationContent.threadRootEventID) + XCTAssertNotNil(notificationContent.sound) + // Remember we remove the @ due to an iOS bug + XCTAssertEqual(notificationContent.threadIdentifier, "bob:matrix.org!test:matrix.org") + XCTAssertEqual(notificationContent.attachments, []) + } + + func testDMMessageNotificationWithThread() async { + let notificationItem = NotificationItemProxyMock(.init(roomID: "!test:matrix.org", + receiverID: "@bob:matrix.org", + senderDisplayName: "Alice", + roomDisplayName: "Alice", + roomJoinedMembers: 2, + isRoomDirect: true, + isRoomPrivate: true, + isNoisy: true, + hasMention: false, + threadRootEventID: "thread")) + + await notificationContentBuilder.process(notificationContent: ¬ificationContent, + notificationItem: notificationItem, + mediaProvider: mediaProvider) + + let communicationContext = Dynamic(notificationContent, memberName: "communicationContext") + XCTAssertEqual(communicationContext.displayName, L10n.commonThread) + XCTAssertEqual(communicationContext.sender.displayName, "Alice") + XCTAssertEqual(notificationContent.body, "Hello world!") + XCTAssertEqual(notificationContent.categoryIdentifier, NotificationConstants.Category.message) + XCTAssertNotNil(notificationContent.threadRootEventID) + XCTAssertNotNil(notificationContent.sound) + // Remember we remove the @ due to an iOS bug + XCTAssertEqual(notificationContent.threadIdentifier, "bob:matrix.org!test:matrix.orgthread") + XCTAssertEqual(notificationContent.attachments, []) + } + + func testDMMessageNotificationWithThreadAndMention() async { + let notificationItem = NotificationItemProxyMock(.init(roomID: "!test:matrix.org", + receiverID: "@bob:matrix.org", + senderDisplayName: "Alice", + roomDisplayName: "Alice", + roomJoinedMembers: 2, + isRoomDirect: true, + isRoomPrivate: true, + isNoisy: true, + hasMention: true, + threadRootEventID: "thread")) + + await notificationContentBuilder.process(notificationContent: ¬ificationContent, + notificationItem: notificationItem, + mediaProvider: mediaProvider) + + let communicationContext = Dynamic(notificationContent, memberName: "communicationContext") + XCTAssertEqual(communicationContext.displayName, L10n.commonThread) + XCTAssertEqual(communicationContext.sender.displayName, L10n.notificationSenderMentionReply("Alice")) + XCTAssertEqual(notificationContent.body, "Hello world!") + XCTAssertEqual(notificationContent.categoryIdentifier, NotificationConstants.Category.message) + XCTAssertNotNil(notificationContent.threadRootEventID) + XCTAssertNotNil(notificationContent.sound) + // Remember we remove the @ due to an iOS bug + XCTAssertEqual(notificationContent.threadIdentifier, "bob:matrix.org!test:matrix.orgthread") + XCTAssertEqual(notificationContent.attachments, []) + } + + func testRoomMessageNotification() async { + let notificationItem = NotificationItemProxyMock(.init(roomID: "!testroom:matrix.org", + receiverID: "@bob:matrix.org", + senderDisplayName: "Alice", + roomDisplayName: "General", + roomJoinedMembers: 5, + isRoomDirect: false, + isRoomPrivate: false, + isNoisy: false)) + + await notificationContentBuilder.process(notificationContent: ¬ificationContent, + notificationItem: notificationItem, + mediaProvider: mediaProvider) + let communicationContext = Dynamic(notificationContent, memberName: "communicationContext") + + XCTAssertEqual(communicationContext.displayName, "General") + XCTAssertEqual(communicationContext.sender.displayName, "Alice") + XCTAssertEqual(notificationContent.body, "Hello world!") + XCTAssertEqual(notificationContent.categoryIdentifier, NotificationConstants.Category.message) + XCTAssertNil(notificationContent.threadRootEventID) + XCTAssertNil(notificationContent.sound) + // Remember we remove the @ due to an iOS bug + XCTAssertEqual(notificationContent.threadIdentifier, "bob:matrix.org!testroom:matrix.org") + XCTAssertEqual(notificationContent.attachments, []) + } + + func testRoomMessageNotificationWithMention() async { + let notificationItem = NotificationItemProxyMock(.init(roomID: "!testroom:matrix.org", + receiverID: "@bob:matrix.org", + senderDisplayName: "Alice", + roomDisplayName: "General", + roomJoinedMembers: 5, + isRoomDirect: false, + isRoomPrivate: false, + isNoisy: true, + hasMention: true)) + + await notificationContentBuilder.process(notificationContent: ¬ificationContent, + notificationItem: notificationItem, + mediaProvider: mediaProvider) + + let communicationContext = Dynamic(notificationContent, memberName: "communicationContext") + XCTAssertEqual(communicationContext.displayName, "General") + XCTAssertEqual(communicationContext.sender.displayName, L10n.notificationSenderMentionReply("Alice")) + XCTAssertEqual(notificationContent.body, "Hello world!") + XCTAssertEqual(notificationContent.categoryIdentifier, NotificationConstants.Category.message) + XCTAssertNil(notificationContent.threadRootEventID) + XCTAssertNotNil(notificationContent.sound) + XCTAssertEqual(notificationContent.threadIdentifier, "bob:matrix.org!testroom:matrix.org") + XCTAssertEqual(notificationContent.attachments, []) + } + + func testRoomMessageNotificationWithThread() async { + let notificationItem = NotificationItemProxyMock(.init(roomID: "!testroom:matrix.org", + receiverID: "@bob:matrix.org", + senderDisplayName: "Alice", + roomDisplayName: "General", + roomJoinedMembers: 5, + isRoomDirect: false, + isRoomPrivate: false, + isNoisy: false, + threadRootEventID: "thread123")) + + await notificationContentBuilder.process(notificationContent: ¬ificationContent, + notificationItem: notificationItem, + mediaProvider: mediaProvider) + + let communicationContext = Dynamic(notificationContent, memberName: "communicationContext") + XCTAssertEqual(communicationContext.displayName, L10n.notificationThreadInRoom("General")) + XCTAssertEqual(communicationContext.sender.displayName, "Alice") + XCTAssertEqual(notificationContent.body, "Hello world!") + XCTAssertEqual(notificationContent.categoryIdentifier, NotificationConstants.Category.message) + XCTAssertNotNil(notificationContent.threadRootEventID) + XCTAssertNil(notificationContent.sound) + XCTAssertEqual(notificationContent.threadIdentifier, "bob:matrix.org!testroom:matrix.orgthread123") + XCTAssertEqual(notificationContent.attachments, []) + } + + func testRoomMessageNotificationWithThreadAndMention() async { + let notificationItem = NotificationItemProxyMock(.init(roomID: "!testroom:matrix.org", + receiverID: "@bob:matrix.org", + senderDisplayName: "Alice", + roomDisplayName: "General", + roomJoinedMembers: 5, + isRoomDirect: false, + isRoomPrivate: false, + isNoisy: true, + hasMention: true, + threadRootEventID: "thread123")) + await notificationContentBuilder.process(notificationContent: ¬ificationContent, + notificationItem: notificationItem, + mediaProvider: mediaProvider) + let communicationContext = Dynamic(notificationContent, memberName: "communicationContext") + XCTAssertEqual(communicationContext.displayName, L10n.notificationThreadInRoom("General")) + XCTAssertEqual(communicationContext.sender.displayName, L10n.notificationSenderMentionReply("Alice")) + XCTAssertEqual(notificationContent.body, "Hello world!") + XCTAssertEqual(notificationContent.categoryIdentifier, NotificationConstants.Category.message) + XCTAssertNotNil(notificationContent.threadRootEventID) + XCTAssertNotNil(notificationContent.sound) + XCTAssertEqual(notificationContent.threadIdentifier, "bob:matrix.org!testroom:matrix.orgthread123") + XCTAssertEqual(notificationContent.attachments, []) } } diff --git a/UnitTests/SupportingFiles/target.yml b/UnitTests/SupportingFiles/target.yml index a26efd5b7..b6f254a30 100644 --- a/UnitTests/SupportingFiles/target.yml +++ b/UnitTests/SupportingFiles/target.yml @@ -34,6 +34,7 @@ targets: - package: MatrixRustSDK - package: AsyncAlgorithms - package: Clocks + - package: Dynamic info: path: ../SupportingFiles/Info.plist diff --git a/project.yml b/project.yml index 52809a5c6..b527e3e9c 100644 --- a/project.yml +++ b/project.yml @@ -114,6 +114,9 @@ packages: DSWaveformImage: url: https://github.com/dmrschmidt/DSWaveformImage exactVersion: 14.1.1 + Dynamic: + url: https://github.com/mhdhejazi/Dynamic + exactVersion: 1.2 GZIP: url: https://github.com/nicklockwood/GZIP minorVersion: 1.3.2