From 342feb41131d37b908cfa8ba60e01dbafdba35ca Mon Sep 17 00:00:00 2001 From: Mauro <34335419+Velin92@users.noreply.github.com> Date: Wed, 15 Nov 2023 15:57:17 +0100 Subject: [PATCH] Added a disclaimer in Notification Settings for "Mentions Only" (#2081) --- ElementX.xcodeproj/project.pbxproj | 42 +++++++++------- .../xcshareddata/swiftpm/Package.resolved | 4 +- .../Mocks/Generated/GeneratedMocks.swift | 17 +++++++ .../Mocks/Generated/SDKGeneratedMocks.swift | 2 +- .../Mocks/NotificationSettingsProxyMock.swift | 8 ++- ...RoomNotificationSettingsScreenModels.swift | 9 ++++ ...mNotificationSettingsScreenViewModel.swift | 1 + ...otificationSettingsCustomSectionView.swift | 22 +++++++- ...otificationSettingsUserDefinedScreen.swift | 13 +++++ ...NotificationSettingsEditScreenModels.swift | 9 ++++ ...ificationSettingsEditScreenViewModel.swift | 2 + .../View/NotificationSettingsEditScreen.swift | 21 +++++++- .../NotificationSettingsProxy.swift | 4 ++ .../NotificationSettingsProxyProtocol.swift | 1 + ...tionSettingsEditScreenViewModelTests.swift | 43 ++++++++++++++++ ...ficationSettingsScreenViewModelTests.swift | 50 ++++++++++++++++++- ...tionSettingsEditScreen.Applying-change.png | 4 +- ...icationSettingsEditScreen.Direct-Chats.png | 4 +- ...tScreen.Group-Chats-Without-Disclaimer.png | 3 ++ ...ficationSettingsEditScreen.Group-Chats.png | 4 +- ...otificationSettingsCustomSectionView.1.png | 3 -- ...ionSettingsCustomSectionView.Encrypted.png | 3 ++ ...nSettingsCustomSectionView.Unencrypted.png | 3 ++ ...otificationSettingsUserDefinedScreen.1.png | 3 -- ...ionSettingsUserDefinedScreen.Encrypted.png | 3 ++ ...nSettingsUserDefinedScreen.Unencrypted.png | 3 ++ project.yml | 2 +- 27 files changed, 244 insertions(+), 39 deletions(-) create mode 100644 UnitTests/__Snapshots__/PreviewTests/test_notificationSettingsEditScreen.Group-Chats-Without-Disclaimer.png delete mode 100644 UnitTests/__Snapshots__/PreviewTests/test_roomNotificationSettingsCustomSectionView.1.png create mode 100644 UnitTests/__Snapshots__/PreviewTests/test_roomNotificationSettingsCustomSectionView.Encrypted.png create mode 100644 UnitTests/__Snapshots__/PreviewTests/test_roomNotificationSettingsCustomSectionView.Unencrypted.png delete mode 100644 UnitTests/__Snapshots__/PreviewTests/test_roomNotificationSettingsUserDefinedScreen.1.png create mode 100644 UnitTests/__Snapshots__/PreviewTests/test_roomNotificationSettingsUserDefinedScreen.Encrypted.png create mode 100644 UnitTests/__Snapshots__/PreviewTests/test_roomNotificationSettingsUserDefinedScreen.Unencrypted.png diff --git a/ElementX.xcodeproj/project.pbxproj b/ElementX.xcodeproj/project.pbxproj index 237dab836..27ab0aabf 100644 --- a/ElementX.xcodeproj/project.pbxproj +++ b/ElementX.xcodeproj/project.pbxproj @@ -3,7 +3,7 @@ archiveVersion = 1; classes = { }; - objectVersion = 56; + objectVersion = 54; objects = { /* Begin PBXBuildFile section */ @@ -31,6 +31,7 @@ 06F8EDF52E33A2D36BCC1161 /* AppLockScreen.swift in Sources */ = {isa = PBXBuildFile; fileRef = 56D6F88FE35A0979D2821E06 /* AppLockScreen.swift */; }; 071A017E415AD378F2961B11 /* URL.swift in Sources */ = {isa = PBXBuildFile; fileRef = 227AC5D71A4CE43512062243 /* URL.swift */; }; 07756D532EFE33DD1FA258E5 /* GeoURITests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1A7ED2EF5BDBAD2A7DBC4636 /* GeoURITests.swift */; }; + 077CB230153E072C94B1E6C3 /* AppAppearance.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3D65BCC659FD9087E49B3C25 /* AppAppearance.swift */; }; 07CC13C5729C24255348CBBD /* ElementCallWidgetDriver.swift in Sources */ = {isa = PBXBuildFile; fileRef = 309AD8BAE6437C31BA7157BF /* ElementCallWidgetDriver.swift */; }; 086D01E79C8E8D3F004FAF21 /* AudioPlayerProtocol.swift in Sources */ = {isa = PBXBuildFile; fileRef = AC9104846487244648D32C6D /* AudioPlayerProtocol.swift */; }; 08CB4BD12CEEDE6AAE4A18DD /* WindowManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 035177BCD8E8308B098AC3C2 /* WindowManager.swift */; }; @@ -518,7 +519,6 @@ 890F0D453FE388756479AC97 /* AnalyticsTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = C687844F60BFF532D49A994C /* AnalyticsTests.swift */; }; 8944548A684F1C837CEC47F4 /* RoomMembersListScreenModels.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2D0946F77B696176E062D037 /* RoomMembersListScreenModels.swift */; }; 89658A44C9FC19B58FD1C226 /* ServerConfirmationScreenViewModelTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = F08776C48FFB47CACF64ED10 /* ServerConfirmationScreenViewModelTests.swift */; }; - 897760FA1B292D3BDC0E2059 /* AppAppearance.swift in Sources */ = {isa = PBXBuildFile; fileRef = D4798BA766EBF46C00CE3C8E /* AppAppearance.swift */; }; 899359A4D1147601F6C4E364 /* PillConstants.swift in Sources */ = {isa = PBXBuildFile; fileRef = CB8D34E94AB07128DB73D6C7 /* PillConstants.swift */; }; 899793EFC63DF93C3E0141E7 /* RoomMemberDetailsScreenCoordinator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0FA60F848D1C14F873F9621A /* RoomMemberDetailsScreenCoordinator.swift */; }; 8A0BD60CA4A6004DB06B5403 /* MediaUploadingPreprocessor.swift in Sources */ = {isa = PBXBuildFile; fileRef = 669F35C505ACE1110589F875 /* MediaUploadingPreprocessor.swift */; }; @@ -1043,7 +1043,7 @@ 033DB41C51865A2E83174E87 /* target.yml */ = {isa = PBXFileReference; lastKnownFileType = text.yaml; path = target.yml; sourceTree = ""; }; 035177BCD8E8308B098AC3C2 /* WindowManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WindowManager.swift; sourceTree = ""; }; 0376C429FAB1687C3D905F3E /* MockCoder.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MockCoder.swift; sourceTree = ""; }; - 0392E3FDE372C9B56FEEED8B /* test_voice_message.m4a */ = {isa = PBXFileReference; lastKnownFileType = file; path = test_voice_message.m4a; sourceTree = ""; }; + 0392E3FDE372C9B56FEEED8B /* test_voice_message.m4a */ = {isa = PBXFileReference; path = test_voice_message.m4a; sourceTree = ""; }; 03DD998E523D4EC93C7ED703 /* RoomNotificationSettingsScreenViewModelProtocol.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RoomNotificationSettingsScreenViewModelProtocol.swift; sourceTree = ""; }; 03FABD73FD8086EFAB699F42 /* MediaUploadPreviewScreenViewModelTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MediaUploadPreviewScreenViewModelTests.swift; sourceTree = ""; }; 044E501B8331B339874D1B96 /* CompoundIcon.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CompoundIcon.swift; sourceTree = ""; }; @@ -1104,7 +1104,7 @@ 127C8472672A5BA09EF1ACF8 /* CurrentValuePublisher.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CurrentValuePublisher.swift; sourceTree = ""; }; 12EDAFB64FA5F6812D54F39A /* MigrationScreenViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MigrationScreenViewModel.swift; sourceTree = ""; }; 12F1E7F9C2BE8BB751037826 /* WaitlistScreenCoordinator.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WaitlistScreenCoordinator.swift; sourceTree = ""; }; - 1304D9191300873EADA52D6E /* IntegrationTests.xctestplan */ = {isa = PBXFileReference; lastKnownFileType = text; path = IntegrationTests.xctestplan; sourceTree = ""; }; + 1304D9191300873EADA52D6E /* IntegrationTests.xctestplan */ = {isa = PBXFileReference; path = IntegrationTests.xctestplan; sourceTree = ""; }; 130ED565A078F7E0B59D9D25 /* UNTextInputNotificationResponse+Creator.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "UNTextInputNotificationResponse+Creator.swift"; sourceTree = ""; }; 13802897C7AFA360EA74C0B0 /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.stringsdict; name = en; path = en.lproj/Localizable.stringsdict; sourceTree = ""; }; 1423AB065857FA546444DB15 /* NotificationManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NotificationManager.swift; sourceTree = ""; }; @@ -1251,6 +1251,7 @@ 3D1D4A6D451F43A03CACD01D /* PINTextField.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PINTextField.swift; sourceTree = ""; }; 3D487C1185D658F8B15B8F55 /* SettingsViewModelTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SettingsViewModelTests.swift; sourceTree = ""; }; 3D4DD336905C72F95EAF34B7 /* ElementX-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "ElementX-Bridging-Header.h"; sourceTree = ""; }; + 3D65BCC659FD9087E49B3C25 /* AppAppearance.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppAppearance.swift; sourceTree = ""; }; 3D9FCE4D1E3A81AC1CC5CB91 /* AppLockSetupSettingsScreenCoordinator.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppLockSetupSettingsScreenCoordinator.swift; sourceTree = ""; }; 3DC1943ADE6A62ED5129D7C8 /* LoggingTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LoggingTests.swift; sourceTree = ""; }; 3DF1FFC3336EB23374BBBFCC /* UIKitBackgroundTaskService.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UIKitBackgroundTaskService.swift; sourceTree = ""; }; @@ -1523,7 +1524,7 @@ 8D55702474F279D910D2D162 /* RoomStateEventStringBuilder.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RoomStateEventStringBuilder.swift; sourceTree = ""; }; 8D8169443E5AC5FF71BFB3DB /* cs */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = cs; path = cs.lproj/Localizable.strings; sourceTree = ""; }; 8DC2C9E0E15C79BBDA80F0A2 /* TimelineStyle.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TimelineStyle.swift; sourceTree = ""; }; - 8E088F2A1B9EC529D3221931 /* UITests.xctestplan */ = {isa = PBXFileReference; lastKnownFileType = text; path = UITests.xctestplan; sourceTree = ""; }; + 8E088F2A1B9EC529D3221931 /* UITests.xctestplan */ = {isa = PBXFileReference; path = UITests.xctestplan; sourceTree = ""; }; 8E1BBA73B611EDEEA6E20E05 /* InvitesScreenModels.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = InvitesScreenModels.swift; sourceTree = ""; }; 8EC57A32ABC80D774CC663DB /* SettingsScreenUITests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SettingsScreenUITests.swift; sourceTree = ""; }; 8F21ED7205048668BEB44A38 /* AppActivityView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppActivityView.swift; sourceTree = ""; }; @@ -1659,7 +1660,7 @@ B4CFE236419E830E8946639C /* Analytics+SwiftUI.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "Analytics+SwiftUI.swift"; sourceTree = ""; }; B590BD4507D4F0A377FDE01A /* LoadableAvatarImage.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LoadableAvatarImage.swift; sourceTree = ""; }; B5B243E7818E5E9F6A4EDC7A /* NoticeRoomTimelineView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NoticeRoomTimelineView.swift; sourceTree = ""; }; - B61C339A2FDDBD067FF6635C /* ConfettiScene.scn */ = {isa = PBXFileReference; lastKnownFileType = file.bplist; path = ConfettiScene.scn; sourceTree = ""; }; + B61C339A2FDDBD067FF6635C /* ConfettiScene.scn */ = {isa = PBXFileReference; path = ConfettiScene.scn; sourceTree = ""; }; B6311F21F911E23BE4DF51B4 /* ReadMarkerRoomTimelineView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ReadMarkerRoomTimelineView.swift; sourceTree = ""; }; B63B69F9A2BC74DD40DC75C8 /* AdvancedSettingsScreenViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AdvancedSettingsScreenViewModel.swift; sourceTree = ""; }; B697816AF93DA06EC58C5D70 /* WaitlistScreenViewModelProtocol.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WaitlistScreenViewModelProtocol.swift; sourceTree = ""; }; @@ -1764,7 +1765,7 @@ CD95B3714F806AC9CF9A557B /* ComposerToolbarViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ComposerToolbarViewModel.swift; sourceTree = ""; }; CDB3227C7A74B734924942E9 /* RoomSummaryProvider.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RoomSummaryProvider.swift; sourceTree = ""; }; CEE0E6043EFCF6FD2A341861 /* TimelineReplyView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TimelineReplyView.swift; sourceTree = ""; }; - CEE41494C837AA403A06A5D9 /* UnitTests.xctestplan */ = {isa = PBXFileReference; lastKnownFileType = text; path = UnitTests.xctestplan; sourceTree = ""; }; + CEE41494C837AA403A06A5D9 /* UnitTests.xctestplan */ = {isa = PBXFileReference; path = UnitTests.xctestplan; sourceTree = ""; }; CF48AF076424DBC1615C74AD /* AuthenticationServiceProxy.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AuthenticationServiceProxy.swift; sourceTree = ""; }; D0140615D2232612C813FD6C /* EncryptedHistoryRoomTimelineItem.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = EncryptedHistoryRoomTimelineItem.swift; sourceTree = ""; }; D071F86CD47582B9196C9D16 /* UserDiscoverySection.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UserDiscoverySection.swift; sourceTree = ""; }; @@ -1787,7 +1788,6 @@ D3F219838588C62198E726E3 /* LABiometryType.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LABiometryType.swift; sourceTree = ""; }; D3F275432954C8C6B1B7D966 /* AppLockSetupPINScreen.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppLockSetupPINScreen.swift; sourceTree = ""; }; D45C9EAA86423D7D3126DE4F /* VoiceMessageRecorderProtocol.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = VoiceMessageRecorderProtocol.swift; sourceTree = ""; }; - D4798BA766EBF46C00CE3C8E /* AppAppearance.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppAppearance.swift; sourceTree = ""; }; D49B9785E3AD7D1C15A29F2F /* MediaSourceProxy.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MediaSourceProxy.swift; sourceTree = ""; }; D4DA544B2520BFA65D6DB4BB /* target.yml */ = {isa = PBXFileReference; lastKnownFileType = text.yaml; path = target.yml; sourceTree = ""; }; D529B976F8B2AA654D923422 /* VoiceMessageRoomTimelineItem.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = VoiceMessageRoomTimelineItem.swift; sourceTree = ""; }; @@ -1870,7 +1870,7 @@ ECF79FB25E2D4BD6F50CE7C9 /* RoomMembersListScreenViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RoomMembersListScreenViewModel.swift; sourceTree = ""; }; ED044D00F2176681CC02CD54 /* HomeScreenRoomCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HomeScreenRoomCell.swift; sourceTree = ""; }; ED1D792EB82506A19A72C8DE /* RoomTimelineItemProtocol.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RoomTimelineItemProtocol.swift; sourceTree = ""; }; - ED482057AE39D5C6D9C5F3D8 /* message.caf */ = {isa = PBXFileReference; lastKnownFileType = file; path = message.caf; sourceTree = ""; }; + ED482057AE39D5C6D9C5F3D8 /* message.caf */ = {isa = PBXFileReference; path = message.caf; sourceTree = ""; }; ED983D4DCA5AFA6E1ED96099 /* StateRoomTimelineView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = StateRoomTimelineView.swift; sourceTree = ""; }; EDAA4472821985BF868CC21C /* ServerSelectionViewModelTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ServerSelectionViewModelTests.swift; sourceTree = ""; }; EE378083653EF0C9B5E9D580 /* EmoteRoomTimelineItemContent.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = EmoteRoomTimelineItemContent.swift; sourceTree = ""; }; @@ -1885,7 +1885,7 @@ F174A5627CDB3CAF280D1880 /* EmojiPickerScreenModels.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = EmojiPickerScreenModels.swift; sourceTree = ""; }; F17EFA1D3D09FC2F9C5E1CB2 /* MediaProvider.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MediaProvider.swift; sourceTree = ""; }; F1B8500C152BC59445647DA8 /* UnsupportedRoomTimelineItem.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UnsupportedRoomTimelineItem.swift; sourceTree = ""; }; - F2D513D2477B57F90E98EEC0 /* portrait_test_video.mp4 */ = {isa = PBXFileReference; lastKnownFileType = file; path = portrait_test_video.mp4; sourceTree = ""; }; + F2D513D2477B57F90E98EEC0 /* portrait_test_video.mp4 */ = {isa = PBXFileReference; path = portrait_test_video.mp4; sourceTree = ""; }; F31F59030205A6F65B057E1A /* MatrixEntityRegexTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MatrixEntityRegexTests.swift; sourceTree = ""; }; F348B5F2C12F9D4F4B4D3884 /* VideoRoomTimelineItem.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = VideoRoomTimelineItem.swift; sourceTree = ""; }; F36C0A6D59717193F49EA986 /* UserSessionTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UserSessionTests.swift; sourceTree = ""; }; @@ -4179,6 +4179,7 @@ isa = PBXGroup; children = ( 04BB8DDE245ED86C489BA983 /* AccessibilityIdentifiers.swift */, + 3D65BCC659FD9087E49B3C25 /* AppAppearance.swift */, E24B88AD3D1599E8CB1376E0 /* AvatarSize.swift */, E5272BC4A60B6AD7553BACA1 /* BlurHashDecode.swift */, 9332DFE9642F0A46ECA0497B /* BlurHashEncode.swift */, @@ -4195,7 +4196,6 @@ 53482ECA4B6633961EC224F5 /* ScrollViewAdapter.swift */, 4481799F455B3DA243BDA2AC /* ShareToMapsAppActivity.swift */, B1E227F34BE43B08E098796E /* TestablePreview.swift */, - D4798BA766EBF46C00CE3C8E /* AppAppearance.swift */, 1F2529D434C750ED78ADF1ED /* UserAgentBuilder.swift */, 35FA991289149D31F4286747 /* UserPreference.swift */, 7431C962E314ADAE38B6D708 /* Analytics */, @@ -5301,6 +5301,7 @@ A74438ED16F8683A4B793E6A /* AnalyticsSettingsScreenViewModel.swift in Sources */, 654E802C127B84554042903E /* AnalyticsSettingsScreenViewModelProtocol.swift in Sources */, 8C1A5ECAF895D4CAF8C4D461 /* AppActivityView.swift in Sources */, + 077CB230153E072C94B1E6C3 /* AppAppearance.swift in Sources */, 095C0ACFC234E0550A6404C5 /* AppCoordinator.swift in Sources */, A021827B528F1EDC9101CA58 /* AppCoordinatorProtocol.swift in Sources */, 4FF90E2242DBD596E1ED2E27 /* AppCoordinatorStateMachine.swift in Sources */, @@ -5842,7 +5843,6 @@ BB784A02BADB03C820617A46 /* TextRoomTimelineItem.swift in Sources */, 53F1196F9C69512306A2693F /* TextRoomTimelineItemContent.swift in Sources */, 5E0F2E612718BB4397A6D40A /* TextRoomTimelineView.swift in Sources */, - 897760FA1B292D3BDC0E2059 /* AppAppearance.swift in Sources */, 5B2D1210B40570D87B11BD3B /* ThreadDecorator.swift in Sources */, 43EF6D8E694F54C5471BF5F3 /* TimelineBubbleLayout.swift in Sources */, 5D2AF8C0DF872E7985F8FE54 /* TimelineDeliveryStatusView.swift in Sources */, @@ -6144,7 +6144,9 @@ "@executable_path/../../Frameworks", ); MARKETING_VERSION = "$(MARKETING_VERSION)"; - OTHER_SWIFT_FLAGS = "-DIS_NSE"; + OTHER_SWIFT_FLAGS = ( + "-DIS_NSE", + ); PRODUCT_BUNDLE_IDENTIFIER = "${BASE_BUNDLE_IDENTIFIER}.nse"; PRODUCT_DISPLAY_NAME = "$(APP_DISPLAY_NAME)"; PRODUCT_NAME = NSE; @@ -6169,7 +6171,9 @@ "@executable_path/Frameworks", ); MARKETING_VERSION = "$(MARKETING_VERSION)"; - OTHER_SWIFT_FLAGS = "-DIS_MAIN_APP"; + OTHER_SWIFT_FLAGS = ( + "-DIS_MAIN_APP", + ); PILLS_UT_TYPE_IDENTIFIER = "$(BASE_BUNDLE_IDENTIFIER).pills"; PRODUCT_BUNDLE_IDENTIFIER = "$(BASE_BUNDLE_IDENTIFIER)"; PRODUCT_NAME = "$(APP_NAME)"; @@ -6195,7 +6199,9 @@ "@executable_path/Frameworks", ); MARKETING_VERSION = "$(MARKETING_VERSION)"; - OTHER_SWIFT_FLAGS = "-DIS_MAIN_APP"; + OTHER_SWIFT_FLAGS = ( + "-DIS_MAIN_APP", + ); PILLS_UT_TYPE_IDENTIFIER = "$(BASE_BUNDLE_IDENTIFIER).pills"; PRODUCT_BUNDLE_IDENTIFIER = "$(BASE_BUNDLE_IDENTIFIER)"; PRODUCT_NAME = "$(APP_NAME)"; @@ -6436,7 +6442,9 @@ "@executable_path/../../Frameworks", ); MARKETING_VERSION = "$(MARKETING_VERSION)"; - OTHER_SWIFT_FLAGS = "-DIS_NSE"; + OTHER_SWIFT_FLAGS = ( + "-DIS_NSE", + ); PRODUCT_BUNDLE_IDENTIFIER = "${BASE_BUNDLE_IDENTIFIER}.nse"; PRODUCT_DISPLAY_NAME = "$(APP_DISPLAY_NAME)"; PRODUCT_NAME = NSE; @@ -6632,7 +6640,7 @@ repositoryURL = "https://github.com/matrix-org/matrix-rust-components-swift"; requirement = { kind = exactVersion; - version = "0.0.2-november23"; + version = "0.0.3-november23"; }; }; 821C67C9A7F8CC3FD41B28B4 /* XCRemoteSwiftPackageReference "emojibase-bindings" */ = { diff --git a/ElementX.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved b/ElementX.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved index 540728c76..e2fa51429 100644 --- a/ElementX.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved +++ b/ElementX.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved @@ -130,8 +130,8 @@ "kind" : "remoteSourceControl", "location" : "https://github.com/matrix-org/matrix-rust-components-swift", "state" : { - "revision" : "f647c08eb338ddc20a41429330f366b6bb97d879", - "version" : "0.0.2-november23" + "revision" : "22637fa0dc2d4cec8d3a39515cb844fb5b04f784", + "version" : "0.0.3-november23" } }, { diff --git a/ElementX/Sources/Mocks/Generated/GeneratedMocks.swift b/ElementX/Sources/Mocks/Generated/GeneratedMocks.swift index d21e6e19f..cb04a2dcd 100644 --- a/ElementX/Sources/Mocks/Generated/GeneratedMocks.swift +++ b/ElementX/Sources/Mocks/Generated/GeneratedMocks.swift @@ -1716,6 +1716,23 @@ class NotificationSettingsProxyMock: NotificationSettingsProxyProtocol { return getRoomsWithUserDefinedRulesReturnValue } } + //MARK: - canHomeserverPushEncryptedEventsToDevice + + var canHomeserverPushEncryptedEventsToDeviceCallsCount = 0 + var canHomeserverPushEncryptedEventsToDeviceCalled: Bool { + return canHomeserverPushEncryptedEventsToDeviceCallsCount > 0 + } + var canHomeserverPushEncryptedEventsToDeviceReturnValue: Bool! + var canHomeserverPushEncryptedEventsToDeviceClosure: (() async -> Bool)? + + func canHomeserverPushEncryptedEventsToDevice() async -> Bool { + canHomeserverPushEncryptedEventsToDeviceCallsCount += 1 + if let canHomeserverPushEncryptedEventsToDeviceClosure = canHomeserverPushEncryptedEventsToDeviceClosure { + return await canHomeserverPushEncryptedEventsToDeviceClosure() + } else { + return canHomeserverPushEncryptedEventsToDeviceReturnValue + } + } } class RoomMemberProxyMock: RoomMemberProxyProtocol { var userID: String { diff --git a/ElementX/Sources/Mocks/Generated/SDKGeneratedMocks.swift b/ElementX/Sources/Mocks/Generated/SDKGeneratedMocks.swift index 7b2d1e012..a5518bc5e 100644 --- a/ElementX/Sources/Mocks/Generated/SDKGeneratedMocks.swift +++ b/ElementX/Sources/Mocks/Generated/SDKGeneratedMocks.swift @@ -1,4 +1,4 @@ -// Generated using Sourcery 2.1.1 — https://github.com/krzysztofzablocki/Sourcery +// Generated using Sourcery 2.1.2 — https://github.com/krzysztofzablocki/Sourcery // DO NOT EDIT // swiftlint:disable all diff --git a/ElementX/Sources/Mocks/NotificationSettingsProxyMock.swift b/ElementX/Sources/Mocks/NotificationSettingsProxyMock.swift index 2b24d69ef..459ac8f81 100644 --- a/ElementX/Sources/Mocks/NotificationSettingsProxyMock.swift +++ b/ElementX/Sources/Mocks/NotificationSettingsProxyMock.swift @@ -22,10 +22,12 @@ struct NotificationSettingsProxyMockConfiguration { var callback = PassthroughSubject() var defaultRoomMode: RoomNotificationModeProxy var roomMode: RoomNotificationSettingsProxyMock + var canHomeserverPushEncryptedEvents = false - init(defaultRoomMode: RoomNotificationModeProxy = .allMessages, roomMode: RoomNotificationModeProxy = .allMessages) { + init(defaultRoomMode: RoomNotificationModeProxy = .allMessages, roomMode: RoomNotificationModeProxy = .allMessages, canHomeserverPushEncryptedEvents: Bool = false) { self.defaultRoomMode = defaultRoomMode self.roomMode = RoomNotificationSettingsProxyMock(with: RoomNotificationSettingsProxyMockConfiguration(mode: roomMode, isDefault: defaultRoomMode == roomMode)) + self.canHomeserverPushEncryptedEvents = canHomeserverPushEncryptedEvents } } @@ -80,5 +82,9 @@ extension NotificationSettingsProxyMock { self.callbacks.send(.settingsDidChange) } } + + canHomeserverPushEncryptedEventsToDeviceClosure = { + configuration.canHomeserverPushEncryptedEvents + } } } diff --git a/ElementX/Sources/Screens/RoomNotificationSettingsScreen/RoomNotificationSettingsScreenModels.swift b/ElementX/Sources/Screens/RoomNotificationSettingsScreen/RoomNotificationSettingsScreenModels.swift index cd7790635..2e98e9c41 100644 --- a/ElementX/Sources/Screens/RoomNotificationSettingsScreen/RoomNotificationSettingsScreenModels.swift +++ b/ElementX/Sources/Screens/RoomNotificationSettingsScreen/RoomNotificationSettingsScreenModels.swift @@ -61,6 +61,15 @@ struct RoomNotificationSettingsScreenViewState: BindableState { var navigationTitle: String var customSettingsSectionHeader: String var deletingCustomSetting = false + var shouldDisplayMentionsOnlyDisclaimer = true + + func description(mode: RoomNotificationModeProxy) -> String? { + guard mode == .mentionsAndKeywordsOnly, + shouldDisplayMentionsOnlyDisclaimer else { + return nil + } + return L10n.screenRoomNotificationSettingsMentionsOnlyDisclaimer + } func isSelected(mode: RoomNotificationModeProxy) -> Bool { if case .loaded(let settings) = notificationSettingsState, settings.mode == mode, pendingCustomMode == nil { diff --git a/ElementX/Sources/Screens/RoomNotificationSettingsScreen/RoomNotificationSettingsScreenViewModel.swift b/ElementX/Sources/Screens/RoomNotificationSettingsScreen/RoomNotificationSettingsScreenViewModel.swift index 9a8006dce..dbfba89d7 100644 --- a/ElementX/Sources/Screens/RoomNotificationSettingsScreen/RoomNotificationSettingsScreenViewModel.swift +++ b/ElementX/Sources/Screens/RoomNotificationSettingsScreen/RoomNotificationSettingsScreenViewModel.swift @@ -83,6 +83,7 @@ class RoomNotificationSettingsScreenViewModel: RoomNotificationSettingsScreenVie } private func fetchRoomNotificationSettings() async { + state.shouldDisplayMentionsOnlyDisclaimer = roomProxy.isEncrypted ? await !notificationSettingsProxy.canHomeserverPushEncryptedEventsToDevice() : false do { // `isOneToOne` 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 settings = try await notificationSettingsProxy.getNotificationSettings(roomId: roomProxy.id, diff --git a/ElementX/Sources/Screens/RoomNotificationSettingsScreen/View/RoomNotificationSettingsCustomSectionView.swift b/ElementX/Sources/Screens/RoomNotificationSettingsScreen/View/RoomNotificationSettingsCustomSectionView.swift index 21c6e5910..8e97bba85 100644 --- a/ElementX/Sources/Screens/RoomNotificationSettingsScreen/View/RoomNotificationSettingsCustomSectionView.swift +++ b/ElementX/Sources/Screens/RoomNotificationSettingsScreen/View/RoomNotificationSettingsCustomSectionView.swift @@ -23,7 +23,8 @@ struct RoomNotificationSettingsCustomSectionView: View { var body: some View { Section { ForEach(context.viewState.availableCustomRoomNotificationModes, id: \.self) { mode in - ListRow(label: .plain(title: context.viewState.strings.string(for: mode)), + ListRow(label: .plain(title: context.viewState.strings.string(for: mode), + description: context.viewState.description(mode: mode)), details: (context.viewState.pendingCustomMode == mode) ? .isWaiting(true) : nil, kind: .selection(isSelected: context.viewState.isSelected(mode: mode)) { context.send(viewAction: .setCustomMode(mode)) @@ -40,7 +41,7 @@ struct RoomNotificationSettingsCustomSectionView: View { struct RoomNotificationSettingsCustomSectionView_Previews: PreviewProvider, TestablePreview { static let viewModel = { let notificationSettingsProxy = NotificationSettingsProxyMock(with: .init(defaultRoomMode: .allMessages, roomMode: .mentionsAndKeywordsOnly)) - + let roomProxy = RoomProxyMock(with: .init(displayName: "Room", isEncrypted: true, joinedMembersCount: 4)) return RoomNotificationSettingsScreenViewModel(notificationSettingsProxy: notificationSettingsProxy, @@ -48,10 +49,27 @@ struct RoomNotificationSettingsCustomSectionView_Previews: PreviewProvider, Test displayAsUserDefinedRoomSettings: false) }() + static let viewModelUnencrypted = { + let notificationSettingsProxy = NotificationSettingsProxyMock(with: .init(defaultRoomMode: .allMessages, roomMode: .mentionsAndKeywordsOnly)) + + let roomProxy = RoomProxyMock(with: .init(displayName: "Room", isEncrypted: false, joinedMembersCount: 4)) + + return RoomNotificationSettingsScreenViewModel(notificationSettingsProxy: notificationSettingsProxy, + roomProxy: roomProxy, + displayAsUserDefinedRoomSettings: false) + }() + static var previews: some View { Form { RoomNotificationSettingsCustomSectionView(context: viewModel.context) } .compoundForm() + .previewDisplayName("Encrypted") + + Form { + RoomNotificationSettingsCustomSectionView(context: viewModelUnencrypted.context) + } + .compoundForm() + .previewDisplayName("Unencrypted") } } diff --git a/ElementX/Sources/Screens/RoomNotificationSettingsScreen/View/RoomNotificationSettingsUserDefinedScreen.swift b/ElementX/Sources/Screens/RoomNotificationSettingsScreen/View/RoomNotificationSettingsUserDefinedScreen.swift index f359d2519..6a3c9bd0f 100644 --- a/ElementX/Sources/Screens/RoomNotificationSettingsScreen/View/RoomNotificationSettingsUserDefinedScreen.swift +++ b/ElementX/Sources/Screens/RoomNotificationSettingsScreen/View/RoomNotificationSettingsUserDefinedScreen.swift @@ -58,8 +58,21 @@ struct RoomNotificationSettingsUserDefinedScreen_Previews: PreviewProvider, Test roomProxy: roomProxy, displayAsUserDefinedRoomSettings: true) }() + + static let viewModelUnencrypted = { + let notificationSettingsProxy = NotificationSettingsProxyMock(with: .init(defaultRoomMode: .mentionsAndKeywordsOnly, roomMode: .mentionsAndKeywordsOnly)) + + let roomProxy = RoomProxyMock(with: .init(displayName: "Room", isEncrypted: false, joinedMembersCount: 4)) + + return RoomNotificationSettingsScreenViewModel(notificationSettingsProxy: notificationSettingsProxy, + roomProxy: roomProxy, + displayAsUserDefinedRoomSettings: true) + }() static var previews: some View { RoomNotificationSettingsUserDefinedScreen(context: viewModel.context) + .previewDisplayName("Encrypted") + RoomNotificationSettingsUserDefinedScreen(context: viewModelUnencrypted.context) + .previewDisplayName("Unencrypted") } } diff --git a/ElementX/Sources/Screens/Settings/NotificationSettingsEditScreen/NotificationSettingsEditScreenModels.swift b/ElementX/Sources/Screens/Settings/NotificationSettingsEditScreen/NotificationSettingsEditScreenModels.swift index 8bfabdb3d..ad0edae7e 100644 --- a/ElementX/Sources/Screens/Settings/NotificationSettingsEditScreen/NotificationSettingsEditScreenModels.swift +++ b/ElementX/Sources/Screens/Settings/NotificationSettingsEditScreen/NotificationSettingsEditScreenModels.swift @@ -33,11 +33,20 @@ struct NotificationSettingsEditScreenViewState: BindableState { var defaultMode: NotificationSettingsEditScreenDefaultMode? var pendingMode: NotificationSettingsEditScreenDefaultMode? var roomsWithUserDefinedMode: [NotificationSettingsEditScreenRoom] = [] + var canHomeServerPushEncryptedEvents = false func isSelected(mode: NotificationSettingsEditScreenDefaultMode) -> Bool { pendingMode == nil && defaultMode == mode } + func description(for mode: NotificationSettingsEditScreenDefaultMode) -> String? { + guard mode == .mentionsAndKeywordsOnly, + !canHomeServerPushEncryptedEvents else { + return nil + } + return L10n.screenNotificationSettingsMentionsOnlyDisclaimer + } + var displayRoomsWithCustomSettings: Bool { !roomsWithUserDefinedMode.isEmpty } diff --git a/ElementX/Sources/Screens/Settings/NotificationSettingsEditScreen/NotificationSettingsEditScreenViewModel.swift b/ElementX/Sources/Screens/Settings/NotificationSettingsEditScreen/NotificationSettingsEditScreenViewModel.swift index a47c63e73..e7a0b2c6b 100644 --- a/ElementX/Sources/Screens/Settings/NotificationSettingsEditScreen/NotificationSettingsEditScreenViewModel.swift +++ b/ElementX/Sources/Screens/Settings/NotificationSettingsEditScreen/NotificationSettingsEditScreenViewModel.swift @@ -91,6 +91,7 @@ class NotificationSettingsEditScreenViewModel: NotificationSettingsEditScreenVie if encrypted_mode == unencrypted_mode { mode = encrypted_mode } + let canHomserverPushEncryptedEvents = await notificationSettingsProxy.canHomeserverPushEncryptedEventsToDevice() guard !Task.isCancelled else { return } switch mode { @@ -101,6 +102,7 @@ class NotificationSettingsEditScreenViewModel: NotificationSettingsEditScreenVie default: state.defaultMode = nil } + state.canHomeServerPushEncryptedEvents = canHomserverPushEncryptedEvents } } diff --git a/ElementX/Sources/Screens/Settings/NotificationSettingsEditScreen/View/NotificationSettingsEditScreen.swift b/ElementX/Sources/Screens/Settings/NotificationSettingsEditScreen/View/NotificationSettingsEditScreen.swift index b9962eaf4..515940282 100644 --- a/ElementX/Sources/Screens/Settings/NotificationSettingsEditScreen/View/NotificationSettingsEditScreen.swift +++ b/ElementX/Sources/Screens/Settings/NotificationSettingsEditScreen/View/NotificationSettingsEditScreen.swift @@ -40,7 +40,8 @@ struct NotificationSettingsEditScreen: View { private var notificationModeSection: some View { Section { ForEach(context.viewState.availableDefaultModes, id: \.self) { mode in - ListRow(label: .plain(title: context.viewState.strings.string(for: mode)), + ListRow(label: .plain(title: context.viewState.strings.string(for: mode), + description: context.viewState.description(for: mode)), details: (context.viewState.pendingMode == mode) ? .isWaiting(true) : nil, kind: .selection(isSelected: context.viewState.isSelected(mode: mode)) { context.send(viewAction: .setMode(mode)) @@ -114,6 +115,22 @@ struct NotificationSettingsEditScreen_Previews: PreviewProvider, TestablePreview return viewModel }() + static let viewModelGroupChatsWithouDisclaimer: NotificationSettingsEditScreenViewModel = { + let notificationSettingsProxy = NotificationSettingsProxyMock(with: .init(canHomeserverPushEncryptedEvents: true)) + notificationSettingsProxy.getDefaultRoomNotificationModeIsEncryptedIsOneToOneReturnValue = .allMessages + + notificationSettingsProxy.getRoomsWithUserDefinedRulesReturnValue = [RoomSummary].mockRooms.compactMap(\.id) + let userSession = MockUserSession(clientProxy: MockClientProxy(userID: "@alice:example.com", + roomSummaryProvider: MockRoomSummaryProvider(state: .loaded(.mockRooms))), + mediaProvider: MockMediaProvider(), + voiceMessageMediaManager: VoiceMessageMediaManagerMock()) + var viewModel = NotificationSettingsEditScreenViewModel(chatType: .groupChat, + userSession: userSession, + notificationSettingsProxy: notificationSettingsProxy) + viewModel.fetchInitialContent() + return viewModel + }() + static var previews: some View { NotificationSettingsEditScreen(context: viewModelGroupChats.context) .previewDisplayName("Group Chats") @@ -121,5 +138,7 @@ struct NotificationSettingsEditScreen_Previews: PreviewProvider, TestablePreview .previewDisplayName("Direct Chats") NotificationSettingsEditScreen(context: viewModelDirectApplyingChange.context) .previewDisplayName("Applying change") + NotificationSettingsEditScreen(context: viewModelGroupChatsWithouDisclaimer.context) + .previewDisplayName("Group Chats Without Disclaimer") } } diff --git a/ElementX/Sources/Services/NotificationSettings/NotificationSettingsProxy.swift b/ElementX/Sources/Services/NotificationSettings/NotificationSettingsProxy.swift index 7840e5a8a..df9eabf2f 100644 --- a/ElementX/Sources/Services/NotificationSettings/NotificationSettingsProxy.swift +++ b/ElementX/Sources/Services/NotificationSettings/NotificationSettingsProxy.swift @@ -145,6 +145,10 @@ final class NotificationSettingsProxy: NotificationSettingsProxyProtocol { await notificationSettings.getRoomsWithUserDefinedRules(enabled: true) } + func canHomeserverPushEncryptedEventsToDevice() async -> Bool { + await notificationSettings.canHomeserverPushEncryptedEventToDevice() + } + // MARK: - Private func updatedSettings() async { diff --git a/ElementX/Sources/Services/NotificationSettings/NotificationSettingsProxyProtocol.swift b/ElementX/Sources/Services/NotificationSettings/NotificationSettingsProxyProtocol.swift index 97b80b85b..35c530801 100644 --- a/ElementX/Sources/Services/NotificationSettings/NotificationSettingsProxyProtocol.swift +++ b/ElementX/Sources/Services/NotificationSettings/NotificationSettingsProxyProtocol.swift @@ -41,4 +41,5 @@ protocol NotificationSettingsProxyProtocol { func isCallEnabled() async throws -> Bool func setCallEnabled(enabled: Bool) async throws func getRoomsWithUserDefinedRules() async throws -> [String] + func canHomeserverPushEncryptedEventsToDevice() async -> Bool } diff --git a/UnitTests/Sources/NotificationSettingsEditScreenViewModelTests.swift b/UnitTests/Sources/NotificationSettingsEditScreenViewModelTests.swift index ed875344c..58899ca61 100644 --- a/UnitTests/Sources/NotificationSettingsEditScreenViewModelTests.swift +++ b/UnitTests/Sources/NotificationSettingsEditScreenViewModelTests.swift @@ -72,6 +72,49 @@ class NotificationSettingsEditScreenViewModelTests: XCTestCase { XCTAssertEqual(context.viewState.defaultMode, .mentionsAndKeywordsOnly) XCTAssertNil(context.viewState.bindings.alertInfo) + XCTAssertFalse(context.viewState.canHomeServerPushEncryptedEvents) + XCTAssertNotNil(context.viewState.description(for: .mentionsAndKeywordsOnly)) + } + + func testFetchSettingsWithCanPushEncryptedEvents() async throws { + notificationSettingsProxy.getDefaultRoomNotificationModeIsEncryptedIsOneToOneClosure = { isEncrypted, isOneToOne in + switch (isEncrypted, isOneToOne) { + case (_, true): + return .allMessages + case (_, _): + return .mentionsAndKeywordsOnly + } + } + notificationSettingsProxy.canHomeserverPushEncryptedEventsToDeviceClosure = { + true + } + viewModel = NotificationSettingsEditScreenViewModel(chatType: .groupChat, + userSession: userSession, + notificationSettingsProxy: notificationSettingsProxy) + + let deferred = deferFulfillment(viewModel.context.$viewState) { state in + state.defaultMode != nil + } + + viewModel.fetchInitialContent() + + try await deferred.fulfill() + + // `getDefaultRoomNotificationModeIsEncryptedIsOneToOne` must have been called twice (for encrypted and unencrypted group chats) + let invocations = notificationSettingsProxy.getDefaultRoomNotificationModeIsEncryptedIsOneToOneReceivedInvocations + + XCTAssertEqual(invocations.count, 2) + // First call for encrypted group chats + XCTAssertEqual(invocations[0].isEncrypted, true) + XCTAssertEqual(invocations[0].isOneToOne, false) + // Second call for unencrypted group chats + XCTAssertEqual(invocations[1].isEncrypted, false) + XCTAssertEqual(invocations[1].isOneToOne, false) + + XCTAssertEqual(context.viewState.defaultMode, .mentionsAndKeywordsOnly) + XCTAssertNil(context.viewState.bindings.alertInfo) + XCTAssertTrue(context.viewState.canHomeServerPushEncryptedEvents) + XCTAssertNil(context.viewState.description(for: .mentionsAndKeywordsOnly)) } func testSetModeAllMessages() async throws { diff --git a/UnitTests/Sources/RoomNotificationSettingsScreenViewModelTests.swift b/UnitTests/Sources/RoomNotificationSettingsScreenViewModelTests.swift index 3c5a27d6c..26c8a25d2 100644 --- a/UnitTests/Sources/RoomNotificationSettingsScreenViewModelTests.swift +++ b/UnitTests/Sources/RoomNotificationSettingsScreenViewModelTests.swift @@ -32,8 +32,8 @@ class RoomNotificationSettingsScreenViewModelTests: XCTestCase { notificationSettingsProxyMock = NotificationSettingsProxyMock(with: NotificationSettingsProxyMockConfiguration()) } - func testInitialStateDefaultMode() async throws { - let roomProxyMock = RoomProxyMock(with: .init(displayName: "Test", joinedMembersCount: 0)) + func testInitialStateDefaultModeEncryptedRoom() async throws { + let roomProxyMock = RoomProxyMock(with: .init(displayName: "Test", isEncrypted: true, joinedMembersCount: 0)) let notificationSettingsProxyMock = NotificationSettingsProxyMock(with: NotificationSettingsProxyMockConfiguration()) notificationSettingsProxyMock.getNotificationSettingsRoomIdIsEncryptedIsOneToOneReturnValue = RoomNotificationSettingsProxyMock(with: .init(mode: .mentionsAndKeywordsOnly, isDefault: true)) @@ -50,6 +50,52 @@ class RoomNotificationSettingsScreenViewModelTests: XCTestCase { try await deferred.fulfill() XCTAssertFalse(viewModel.context.allowCustomSetting) + XCTAssertTrue(viewModel.context.viewState.shouldDisplayMentionsOnlyDisclaimer) + XCTAssertNotNil(viewModel.context.viewState.description(mode: .mentionsAndKeywordsOnly)) + } + + func testInitialStateDefaultModeEncryptedRoomWithCanPushEncrypted() async throws { + let roomProxyMock = RoomProxyMock(with: .init(displayName: "Test", isEncrypted: true, joinedMembersCount: 0)) + let notificationSettingsProxyMock = NotificationSettingsProxyMock(with: .init(canHomeserverPushEncryptedEvents: true)) + + notificationSettingsProxyMock.getNotificationSettingsRoomIdIsEncryptedIsOneToOneReturnValue = RoomNotificationSettingsProxyMock(with: .init(mode: .mentionsAndKeywordsOnly, isDefault: true)) + + let viewModel = RoomNotificationSettingsScreenViewModel(notificationSettingsProxy: notificationSettingsProxyMock, + roomProxy: roomProxyMock, + displayAsUserDefinedRoomSettings: false) + + let deferred = deferFulfillment(viewModel.context.$viewState) { state in + state.notificationSettingsState.isLoaded + } + + notificationSettingsProxyMock.callbacks.send(.settingsDidChange) + try await deferred.fulfill() + + XCTAssertFalse(viewModel.context.allowCustomSetting) + XCTAssertFalse(viewModel.context.viewState.shouldDisplayMentionsOnlyDisclaimer) + XCTAssertNil(viewModel.context.viewState.description(mode: .mentionsAndKeywordsOnly)) + } + + func testInitialStateDefaultModeUnencryptedRoom() async throws { + let roomProxyMock = RoomProxyMock(with: .init(displayName: "Test", isEncrypted: false, joinedMembersCount: 0)) + let notificationSettingsProxyMock = NotificationSettingsProxyMock(with: NotificationSettingsProxyMockConfiguration()) + + notificationSettingsProxyMock.getNotificationSettingsRoomIdIsEncryptedIsOneToOneReturnValue = RoomNotificationSettingsProxyMock(with: .init(mode: .mentionsAndKeywordsOnly, isDefault: true)) + + let viewModel = RoomNotificationSettingsScreenViewModel(notificationSettingsProxy: notificationSettingsProxyMock, + roomProxy: roomProxyMock, + displayAsUserDefinedRoomSettings: false) + + let deferred = deferFulfillment(viewModel.context.$viewState) { state in + state.notificationSettingsState.isLoaded + } + + notificationSettingsProxyMock.callbacks.send(.settingsDidChange) + try await deferred.fulfill() + + XCTAssertFalse(viewModel.context.allowCustomSetting) + XCTAssertFalse(viewModel.context.viewState.shouldDisplayMentionsOnlyDisclaimer) + XCTAssertNil(viewModel.context.viewState.description(mode: .mentionsAndKeywordsOnly)) } func testInitialStateCustomMode() async throws { diff --git a/UnitTests/__Snapshots__/PreviewTests/test_notificationSettingsEditScreen.Applying-change.png b/UnitTests/__Snapshots__/PreviewTests/test_notificationSettingsEditScreen.Applying-change.png index ba78f23dc..79c890116 100644 --- a/UnitTests/__Snapshots__/PreviewTests/test_notificationSettingsEditScreen.Applying-change.png +++ b/UnitTests/__Snapshots__/PreviewTests/test_notificationSettingsEditScreen.Applying-change.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:079404f4f75675434fae3f30eb0ed9c1e518ffd54d906377c0c5b0f3a674c9a8 -size 86893 +oid sha256:ce476aa338694340df878df31e12240481afcda2531599c6636d0367356180d0 +size 103319 diff --git a/UnitTests/__Snapshots__/PreviewTests/test_notificationSettingsEditScreen.Direct-Chats.png b/UnitTests/__Snapshots__/PreviewTests/test_notificationSettingsEditScreen.Direct-Chats.png index e1d95c55f..cc7c0c4e1 100644 --- a/UnitTests/__Snapshots__/PreviewTests/test_notificationSettingsEditScreen.Direct-Chats.png +++ b/UnitTests/__Snapshots__/PreviewTests/test_notificationSettingsEditScreen.Direct-Chats.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:22d50be6a710056db52d44a3ccb36b70892a2858efa79e7d48033cd082ba610c -size 86704 +oid sha256:6f0f5853cdc2865fdf622de333e31b53acfccd945f35085990f02031c3978e05 +size 103330 diff --git a/UnitTests/__Snapshots__/PreviewTests/test_notificationSettingsEditScreen.Group-Chats-Without-Disclaimer.png b/UnitTests/__Snapshots__/PreviewTests/test_notificationSettingsEditScreen.Group-Chats-Without-Disclaimer.png new file mode 100644 index 000000000..6156bf275 --- /dev/null +++ b/UnitTests/__Snapshots__/PreviewTests/test_notificationSettingsEditScreen.Group-Chats-Without-Disclaimer.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:16268407b37510cc9ec162e62db9789051471119d5e18dc72a49c8bbc5b09d13 +size 103672 diff --git a/UnitTests/__Snapshots__/PreviewTests/test_notificationSettingsEditScreen.Group-Chats.png b/UnitTests/__Snapshots__/PreviewTests/test_notificationSettingsEditScreen.Group-Chats.png index efefbf6a1..6156bf275 100644 --- a/UnitTests/__Snapshots__/PreviewTests/test_notificationSettingsEditScreen.Group-Chats.png +++ b/UnitTests/__Snapshots__/PreviewTests/test_notificationSettingsEditScreen.Group-Chats.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:ea1a397f5b093408427d418fed45cb52ce9f2660bfcc5b0ddb165dbd04e9b393 -size 87137 +oid sha256:16268407b37510cc9ec162e62db9789051471119d5e18dc72a49c8bbc5b09d13 +size 103672 diff --git a/UnitTests/__Snapshots__/PreviewTests/test_roomNotificationSettingsCustomSectionView.1.png b/UnitTests/__Snapshots__/PreviewTests/test_roomNotificationSettingsCustomSectionView.1.png deleted file mode 100644 index e2d668e17..000000000 --- a/UnitTests/__Snapshots__/PreviewTests/test_roomNotificationSettingsCustomSectionView.1.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:1ed0ca5f41ff96941ae11ab56d0df3b89e55a92b8e601520021a264d0a3ed5c0 -size 89433 diff --git a/UnitTests/__Snapshots__/PreviewTests/test_roomNotificationSettingsCustomSectionView.Encrypted.png b/UnitTests/__Snapshots__/PreviewTests/test_roomNotificationSettingsCustomSectionView.Encrypted.png new file mode 100644 index 000000000..dc03bf7af --- /dev/null +++ b/UnitTests/__Snapshots__/PreviewTests/test_roomNotificationSettingsCustomSectionView.Encrypted.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:6545c6f94180cae00cde1a5851813fda9335db6b9dbdbb41132ebe2d391beaa8 +size 104199 diff --git a/UnitTests/__Snapshots__/PreviewTests/test_roomNotificationSettingsCustomSectionView.Unencrypted.png b/UnitTests/__Snapshots__/PreviewTests/test_roomNotificationSettingsCustomSectionView.Unencrypted.png new file mode 100644 index 000000000..dc03bf7af --- /dev/null +++ b/UnitTests/__Snapshots__/PreviewTests/test_roomNotificationSettingsCustomSectionView.Unencrypted.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:6545c6f94180cae00cde1a5851813fda9335db6b9dbdbb41132ebe2d391beaa8 +size 104199 diff --git a/UnitTests/__Snapshots__/PreviewTests/test_roomNotificationSettingsUserDefinedScreen.1.png b/UnitTests/__Snapshots__/PreviewTests/test_roomNotificationSettingsUserDefinedScreen.1.png deleted file mode 100644 index 9bed34cfc..000000000 --- a/UnitTests/__Snapshots__/PreviewTests/test_roomNotificationSettingsUserDefinedScreen.1.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:4a54e7727b1cb45d7bd3e7b6bde700507d0e27f4ba33b4e97595d23ff785c89f -size 98086 diff --git a/UnitTests/__Snapshots__/PreviewTests/test_roomNotificationSettingsUserDefinedScreen.Encrypted.png b/UnitTests/__Snapshots__/PreviewTests/test_roomNotificationSettingsUserDefinedScreen.Encrypted.png new file mode 100644 index 000000000..46c307678 --- /dev/null +++ b/UnitTests/__Snapshots__/PreviewTests/test_roomNotificationSettingsUserDefinedScreen.Encrypted.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:84816004db958e01290609776f4455e95d73a24a1af223a6af21d0e818a060e2 +size 114117 diff --git a/UnitTests/__Snapshots__/PreviewTests/test_roomNotificationSettingsUserDefinedScreen.Unencrypted.png b/UnitTests/__Snapshots__/PreviewTests/test_roomNotificationSettingsUserDefinedScreen.Unencrypted.png new file mode 100644 index 000000000..46c307678 --- /dev/null +++ b/UnitTests/__Snapshots__/PreviewTests/test_roomNotificationSettingsUserDefinedScreen.Unencrypted.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:84816004db958e01290609776f4455e95d73a24a1af223a6af21d0e818a060e2 +size 114117 diff --git a/project.yml b/project.yml index b3e583af6..d89989d1d 100644 --- a/project.yml +++ b/project.yml @@ -45,7 +45,7 @@ packages: # Element/Matrix dependencies MatrixRustSDK: url: https://github.com/matrix-org/matrix-rust-components-swift - exactVersion: 0.0.2-november23 + exactVersion: 0.0.3-november23 # path: ../matrix-rust-sdk Compound: url: https://github.com/vector-im/compound-ios