Merge commit '5d625330b03d7fad12bdb5482b3c3fe19c32be88' into feature/basis_merge_1824

# Conflicts:
#	.github/workflows/ci-build.yml
#	.github/workflows/ci-tests.yml
#	.github/workflows/release-alpha.yml
#	.github/workflows/triage-move-labelled.yml
#	.github/workflows/triage-priority-bugs.yml
#	.gitignore
#	CHANGES.md
#	Config/AppConfiguration.swift
#	Config/AppIdentifiers.xcconfig
#	Config/AppVersion.xcconfig
#	Config/BuildSettings.swift
#	Config/CommonConfiguration.swift
#	Gemfile
#	Gemfile.lock
#	IDETemplateMacros.plist
#	Podfile
#	Podfile.lock
#	README.md
#	Riot.xcodeproj/xcshareddata/xcschemes/Riot.xcscheme
#	Riot/Assets/Images.xcassets/Common/reveal_password_button.imageset/reveal_password_button.png
#	Riot/Assets/Images.xcassets/Common/reveal_password_button.imageset/reveal_password_button@2x.png
#	Riot/Assets/Images.xcassets/Common/reveal_password_button.imageset/reveal_password_button@3x.png
#	Riot/Assets/Images.xcassets/People/people_floating_action.imageset/Contents.json
#	Riot/Assets/Images.xcassets/Rooms/rooms_floating_action.imageset/Contents.json
#	Riot/Assets/Images.xcassets/Secrets/Recovery/secrets_recovery_key.imageset/Contents.json
#	Riot/Assets/Images.xcassets/Secrets/Recovery/secrets_recovery_passphrase.imageset/Contents.json
#	Riot/Assets/Images.xcassets/Secrets/Setup/secrets_setup_key.imageset/Contents.json
#	Riot/Assets/Images.xcassets/Secrets/Setup/secrets_setup_passphrase.imageset/Contents.json
#	Riot/Assets/Images.xcassets/TabBar/tab_people.imageset/Contents.json
#	Riot/Assets/Images.xcassets/TabBar/tab_rooms.imageset/Contents.json
#	Riot/Assets/SharedImages.xcassets/AppIcon.appiconset/Contents.json
#	Riot/Assets/SharedImages.xcassets/horizontal_logo.imageset/Contents.json
#	Riot/Assets/ar.lproj/InfoPlist.strings
#	Riot/Assets/cs.lproj/Vector.strings
#	Riot/Assets/de.lproj/InfoPlist.strings
#	Riot/Assets/de.lproj/Localizable.strings
#	Riot/Assets/de.lproj/Vector.strings
#	Riot/Assets/en.lproj/Localizable.strings
#	Riot/Assets/en.lproj/Untranslated.strings
#	Riot/Assets/en.lproj/Vector.strings
#	Riot/Assets/es.lproj/InfoPlist.strings
#	Riot/Assets/es.lproj/Vector.strings
#	Riot/Assets/et.lproj/InfoPlist.strings
#	Riot/Assets/et.lproj/Vector.strings
#	Riot/Assets/fr.lproj/InfoPlist.strings
#	Riot/Assets/fr.lproj/Vector.strings
#	Riot/Assets/hu.lproj/InfoPlist.strings
#	Riot/Assets/hu.lproj/Vector.strings
#	Riot/Assets/id.lproj/InfoPlist.strings
#	Riot/Assets/id.lproj/Vector.strings
#	Riot/Assets/is.lproj/InfoPlist.strings
#	Riot/Assets/is.lproj/Vector.strings
#	Riot/Assets/it.lproj/InfoPlist.strings
#	Riot/Assets/it.lproj/Vector.strings
#	Riot/Assets/ja.lproj/InfoPlist.strings
#	Riot/Assets/ja.lproj/Localizable.strings
#	Riot/Assets/ja.lproj/Vector.strings
#	Riot/Assets/nl.lproj/InfoPlist.strings
#	Riot/Assets/nl.lproj/Vector.strings
#	Riot/Assets/pl.lproj/InfoPlist.strings
#	Riot/Assets/pl.lproj/Vector.strings
#	Riot/Assets/pt_BR.lproj/InfoPlist.strings
#	Riot/Assets/pt_BR.lproj/Vector.strings
#	Riot/Assets/ru.lproj/InfoPlist.strings
#	Riot/Assets/ru.lproj/Vector.strings
#	Riot/Assets/sk.lproj/InfoPlist.strings
#	Riot/Assets/sk.lproj/Vector.strings
#	Riot/Assets/sq.lproj/InfoPlist.strings
#	Riot/Assets/sq.lproj/Vector.strings
#	Riot/Assets/sv.lproj/InfoPlist.strings
#	Riot/Assets/sv.lproj/Vector.strings
#	Riot/Assets/third_party_licenses.html
#	Riot/Assets/uk.lproj/InfoPlist.strings
#	Riot/Assets/uk.lproj/Vector.strings
#	Riot/Assets/zh_Hans.lproj/InfoPlist.strings
#	Riot/Assets/zh_Hans.lproj/Localizable.strings
#	Riot/Assets/zh_Hans.lproj/Vector.strings
#	Riot/Assets/zh_Hant.lproj/Vector.strings
#	Riot/Categories/MXKRoomBubbleTableViewCell+Riot.h
#	Riot/Categories/MXKRoomBubbleTableViewCell+Riot.m
#	Riot/Categories/MXRestClient+Async.swift
#	Riot/Categories/MXSession+Riot.m
#	Riot/Categories/NSAttributedString.swift
#	Riot/Categories/Publisher+Riot.swift
#	Riot/Categories/RoomBubbleCellData.swift
#	Riot/Categories/UILabel.swift
#	Riot/Categories/UIScrollView.swift
#	Riot/Categories/UIView.swift
#	Riot/Categories/UIViewController.swift
#	Riot/Generated/Images.swift
#	Riot/Generated/Strings.swift
#	Riot/Generated/UntranslatedStrings.swift
#	Riot/Managers/EncryptionKeyManager/EncryptionKeyManager.swift
#	Riot/Managers/LocalAuthentication/LocalAuthenticationService.swift
#	Riot/Managers/PushNotification/PushNotificationService.m
#	Riot/Managers/PushNotification/PushNotificationStore.swift
#	Riot/Managers/Settings/RiotSettings.swift
#	Riot/Managers/Settings/Shared/RiotSharedSettings.swift
#	Riot/Managers/Theme/Themes/DarkTheme.swift
#	Riot/Managers/Theme/Themes/DefaultTheme.swift
#	Riot/Managers/UISIAutoReporter/UISIAutoReporter.swift
#	Riot/Model/HomeserverConfiguration/HomeserverConfigurationBuilder.swift
#	Riot/Modules/Analytics/Analytics.swift
#	Riot/Modules/Analytics/AnalyticsUIElement.swift
#	Riot/Modules/Analytics/DecryptionFailureTracker.m
#	Riot/Modules/Application/AppCoordinator.swift
#	Riot/Modules/Application/LegacyAppDelegate.h
#	Riot/Modules/Application/LegacyAppDelegate.m
#	Riot/Modules/Authentication/AuthenticationCoordinatorProtocol.swift
#	Riot/Modules/Common/Avatar/AvatarView.swift
#	Riot/Modules/Common/Recents/DataSources/RecentsDataSource.h
#	Riot/Modules/Common/Recents/DataSources/RecentsDataSource.m
#	Riot/Modules/Common/Recents/RecentsViewController.h
#	Riot/Modules/Common/Recents/RecentsViewController.m
#	Riot/Modules/Common/Recents/Views/RecentTableViewCell.m
#	Riot/Modules/Common/SwiftUI/VectorHostingController.swift
#	Riot/Modules/Common/Toasts/RoundedToastView.swift
#	Riot/Modules/Common/Toasts/ToastViewState.swift
#	Riot/Modules/Common/UserIndicators/UserIndicatorPresenter.swift
#	Riot/Modules/Common/UserIndicators/UserIndicatorStore.swift
#	Riot/Modules/Common/UserIndicators/ViewPresenters/ToastViewPresenter.swift
#	Riot/Modules/Common/WebViewController/WebViewViewController.m
#	Riot/Modules/Communities/Home/GroupHomeViewController.m
#	Riot/Modules/Communities/Members/GroupParticipantsViewController.m
#	Riot/Modules/Communities/Rooms/GroupRoomsViewController.m
#	Riot/Modules/Contacts/ContactsTableViewController.m
#	Riot/Modules/Contacts/ContactsTableViewController.xib
#	Riot/Modules/Contacts/Details/ContactDetailsViewController.m
#	Riot/Modules/Contacts/Views/ContactTableViewCell.m
#	Riot/Modules/Contacts/Views/ContactTableViewCell.xib
#	Riot/Modules/ContextMenu/ActionProviders/RoomActionProvider.swift
#	Riot/Modules/ContextMenu/Services/RoomContextActionService.swift
#	Riot/Modules/CreateRoom/CreateRoomCoordinator.swift
#	Riot/Modules/CreateRoom/EnterNewRoomDetails/EnterNewRoomDetailsCoordinator.swift
#	Riot/Modules/CreateRoom/EnterNewRoomDetails/EnterNewRoomDetailsViewController.swift
#	Riot/Modules/CreateRoom/EnterNewRoomDetails/EnterNewRoomDetailsViewModel.swift
#	Riot/Modules/DeepLink/UniversalLinkParameters.swift
#	Riot/Modules/Favorites/FavouritesViewController.h
#	Riot/Modules/Favorites/FavouritesViewController.m
#	Riot/Modules/GlobalSearch/UnifiedSearchViewController.m
#	Riot/Modules/Home/HomeViewController.m
#	Riot/Modules/Home/Views/RoomCollectionViewCell.m
#	Riot/Modules/Integrations/WidgetPicker/WidgetPickerViewController.m
#	Riot/Modules/Integrations/Widgets/StickerPicker/StickerPickerViewController.m
#	Riot/Modules/KeyBackup/ManualExport/EncryptionKeysExportPresenter.swift
#	Riot/Modules/KeyVerification/Common/KeyVerificationCoordinator.swift
#	Riot/Modules/KeyVerification/Common/Verify/Scanning/KeyVerificationVerifyByScanningViewController.swift
#	Riot/Modules/KeyVerification/Device/SelfVerifyWait/KeyVerificationSelfVerifyWaitCoordinator.swift
#	Riot/Modules/KeyVerification/Device/SelfVerifyWait/KeyVerificationSelfVerifyWaitViewController.storyboard
#	Riot/Modules/KeyVerification/Device/SelfVerifyWait/KeyVerificationSelfVerifyWaitViewController.swift
#	Riot/Modules/KeyVerification/User/SessionStatus/UserVerificationSessionStatusViewController.swift
#	Riot/Modules/LocationSharing/LocationManager.swift
#	Riot/Modules/LocationSharing/UserLocationService.swift
#	Riot/Modules/LocationSharing/UserLocationServiceProvider.swift
#	Riot/Modules/MatrixKit/Categories/NSBundle+MatrixKit.m
#	Riot/Modules/MatrixKit/Controllers/MXKAccountDetailsViewController.m
#	Riot/Modules/MatrixKit/Controllers/MXKAuthenticationViewController.m
#	Riot/Modules/MatrixKit/Controllers/MXKRoomMemberDetailsViewController.h
#	Riot/Modules/MatrixKit/Controllers/MXKViewController.h
#	Riot/Modules/MatrixKit/Models/Account/MXKAccount.h
#	Riot/Modules/MatrixKit/Models/Account/MXKAccount.m
#	Riot/Modules/MatrixKit/Models/Account/MXKAccountManager.h
#	Riot/Modules/MatrixKit/Models/Account/MXKAccountManager.m
#	Riot/Modules/MatrixKit/Models/Contact/MXKContact.h
#	Riot/Modules/MatrixKit/Models/Room/MXKRoomBubbleCellData.h
#	Riot/Modules/MatrixKit/Models/Room/MXKRoomBubbleCellData.m
#	Riot/Modules/MatrixKit/Models/Room/MXKRoomBubbleCellDataStoring.h
#	Riot/Modules/MatrixKit/Models/Room/MXKRoomBubbleCellDataWithAppendingMode.m
#	Riot/Modules/MatrixKit/Models/Room/MXKRoomBubbleComponent.h
#	Riot/Modules/MatrixKit/Models/Room/MXKRoomBubbleComponent.m
#	Riot/Modules/MatrixKit/Models/Room/MXKRoomDataSource.m
#	Riot/Modules/MatrixKit/Models/Room/MXKSendReplyEventStringLocalizer.swift
#	Riot/Modules/MatrixKit/Utils/ErrorPresentation/MXKErrorPresentableBuilder.m
#	Riot/Modules/MatrixKit/Utils/EventFormatter/MXKEventFormatter.h
#	Riot/Modules/MatrixKit/Utils/EventFormatter/MXKEventFormatter.m
#	Riot/Modules/MatrixKit/Utils/MXKTools.h
#	Riot/Modules/MatrixKit/Utils/MXKTools.m
#	Riot/Modules/MatrixKit/Views/Account/MXKAccountTableViewCell.m
#	Riot/Modules/MatrixKit/Views/MXKTableViewCell/MXKTableViewCellWithLabelAndTextField.xib
#	Riot/Modules/MatrixKit/Views/MXKTableViewCell/MXKTableViewCellWithTextFieldAndButton.m
#	Riot/Modules/MatrixKit/Views/RoomInputToolbar/MXKRoomInputToolbarView.m
#	Riot/Modules/MatrixKit/Views/RoomMemberList/MXKRoomMemberTableViewCell.m
#	Riot/Modules/MediaPicker/MediaPickerViewController.m
#	Riot/Modules/MediaPicker/SingleImagePickerPresenter.swift
#	Riot/Modules/MediaPickerV2/MediaPickerPresenter.swift
#	Riot/Modules/Onboarding/OnboardingCoordinator.swift
#	Riot/Modules/Onboarding/OnboardingCoordinatorBridgePresenter.swift
#	Riot/Modules/Onboarding/OnboardingCoordinatorProtocol.swift
#	Riot/Modules/People/PeopleViewController.h
#	Riot/Modules/People/PeopleViewController.m
#	Riot/Modules/Pills/PillTextAttachment.swift
#	Riot/Modules/Pills/PillsFormatter.swift
#	Riot/Modules/QRCode/QRCodeGenerator.swift
#	Riot/Modules/Room/CellData/RoomBubbleCellData.m
#	Riot/Modules/Room/ContextualMenu/ReactionsMenu/ReactionsMenuViewModel.swift
#	Riot/Modules/Room/CreationModal/RoomCreationEventsModal/RoomCreationEventsModalCoordinator.swift
#	Riot/Modules/Room/CreationModal/RoomCreationEventsModal/RoomCreationEventsModalViewModel.swift
#	Riot/Modules/Room/CreationModal/RoomCreationModalCoordinatorBridgePresenter.swift
#	Riot/Modules/Room/DataSources/RoomDataSource.m
#	Riot/Modules/Room/DataSources/RoomDataSource.swift
#	Riot/Modules/Room/EditHistory/EditHistoryViewModel.swift
#	Riot/Modules/Room/Files/RoomFilesViewController.m
#	Riot/Modules/Room/Location/RoomTimelineLocationView.swift
#	Riot/Modules/Room/Location/RoomTimelineLocationView.xib
#	Riot/Modules/Room/MXKRoomViewController.h
#	Riot/Modules/Room/MXKRoomViewController.m
#	Riot/Modules/Room/Members/Detail/RoomMemberDetailsViewController.h
#	Riot/Modules/Room/Members/Detail/RoomMemberDetailsViewController.m
#	Riot/Modules/Room/Members/RoomParticipantsViewController.h
#	Riot/Modules/Room/Members/RoomParticipantsViewController.m
#	Riot/Modules/Room/ParticipantsInviteModal/ContactsPicker/ContactsPickerViewModel.swift
#	Riot/Modules/Room/RoomCoordinator.swift
#	Riot/Modules/Room/RoomInfo/RoomInfoCoordinator.swift
#	Riot/Modules/Room/RoomInfo/RoomInfoList/RoomInfoListViewAction.swift
#	Riot/Modules/Room/RoomInfo/RoomInfoList/RoomInfoListViewController.swift
#	Riot/Modules/Room/RoomInfo/RoomInfoList/RoomInfoListViewModel.swift
#	Riot/Modules/Room/RoomInfo/RoomInfoList/RoomInfoListViewModelType.swift
#	Riot/Modules/Room/RoomInfo/RoomInfoList/RoomInfoListViewState.swift
#	Riot/Modules/Room/RoomInfo/RoomInfoList/Views/RoomInfoBasicView.swift
#	Riot/Modules/Room/RoomViewController.m
#	Riot/Modules/Room/Settings/RoomSettingsViewController.m
#	Riot/Modules/Room/TimelineCells/BaseRoomCell/RoomCellContentView.xib
#	Riot/Modules/Room/TimelineCells/Common/MXKRoomBubbleTableViewCell.m
#	Riot/Modules/Room/TimelineCells/RoomCreationIntro/RoomCreationIntroCell.swift
#	Riot/Modules/Room/TimelineCells/RoomCreationIntro/RoomCreationIntroCellContentView.swift
#	Riot/Modules/Room/TimelineCells/RoomCreationIntro/RoomCreationIntroViewData.swift
#	Riot/Modules/Room/TimelineCells/RoomMembership/RoomMembershipCollapsedBubbleCell.m
#	Riot/Modules/Room/TimelineCells/RoomTimelineCellIdentifier.h
#	Riot/Modules/Room/TimelineCells/Styles/Bubble/BubbleRoomTimelineCellProvider.m
#	Riot/Modules/Room/TimelineCells/Styles/Bubble/BubbleRoomTimelineStyle.swift
#	Riot/Modules/Room/TimelineCells/Styles/Bubble/Cells/FileWithoutThumbnail/Common/FileWithoutThumbnailBaseBubbleCell.swift
#	Riot/Modules/Room/TimelineCells/Styles/Bubble/Cells/FileWithoutThumbnail/Common/FileWithoutThumbnailCellContentView.swift
#	Riot/Modules/Room/TimelineCells/Styles/Bubble/Cells/FileWithoutThumbnail/Common/FileWithoutThumbnailCellContentView.xib
#	Riot/Modules/Room/TimelineCells/Styles/Plain/Cells/FileAttachment/Incoming/Clear/RoomIncomingAttachmentBubbleCell.xib
#	Riot/Modules/Room/TimelineCells/Styles/Plain/Cells/FileAttachment/Incoming/Clear/RoomIncomingAttachmentWithPaginationTitleBubbleCell.xib
#	Riot/Modules/Room/TimelineCells/Styles/Plain/Cells/FileAttachment/Incoming/Encrypted/RoomIncomingEncryptedAttachmentBubbleCell.xib
#	Riot/Modules/Room/TimelineCells/Styles/Plain/Cells/FileAttachment/Incoming/Encrypted/RoomIncomingEncryptedAttachmentWithPaginationTitleBubbleCell.xib
#	Riot/Modules/Room/TimelineCells/Styles/Plain/Cells/FileAttachment/Outgoing/Clear/RoomOutgoingAttachmentBubbleCell.xib
#	Riot/Modules/Room/TimelineCells/Styles/Plain/Cells/FileAttachment/Outgoing/Clear/RoomOutgoingAttachmentWithPaginationTitleBubbleCell.xib
#	Riot/Modules/Room/TimelineCells/Styles/Plain/Cells/FileAttachment/Outgoing/Encrypted/RoomOutgoingEncryptedAttachmentBubbleCell.xib
#	Riot/Modules/Room/TimelineCells/Styles/Plain/Cells/FileAttachment/Outgoing/Encrypted/RoomOutgoingEncryptedAttachmentWithPaginationTitleBubbleCell.xib
#	Riot/Modules/Room/TimelineCells/Styles/Plain/Cells/Location/LocationPlainCell.swift
#	Riot/Modules/Room/TimelineCells/Styles/Plain/Cells/Poll/PollPlainCell.swift
#	Riot/Modules/Room/TimelineCells/Styles/Plain/Cells/Sticker/RoomSelectedStickerBubbleCell.xib
#	Riot/Modules/Room/TimelineCells/Styles/Plain/Cells/TextMessage/Incoming/Clear/RoomIncomingTextMsgBubbleCell.xib
#	Riot/Modules/Room/TimelineCells/Styles/Plain/Cells/TextMessage/Incoming/Clear/RoomIncomingTextMsgWithPaginationTitleBubbleCell.xib
#	Riot/Modules/Room/TimelineCells/Styles/Plain/Cells/TextMessage/Incoming/Encrypted/RoomIncomingEncryptedTextMsgBubbleCell.xib
#	Riot/Modules/Room/TimelineCells/Styles/Plain/Cells/TextMessage/Incoming/Encrypted/RoomIncomingEncryptedTextMsgWithPaginationTitleBubbleCell.xib
#	Riot/Modules/Room/TimelineCells/Styles/Plain/Cells/TextMessage/Outgoing/Clear/RoomOutgoingTextMsgBubbleCell.xib
#	Riot/Modules/Room/TimelineCells/Styles/Plain/Cells/TextMessage/Outgoing/Clear/RoomOutgoingTextMsgWithPaginationTitleBubbleCell.xib
#	Riot/Modules/Room/TimelineCells/Styles/Plain/Cells/TextMessage/Outgoing/Encrypted/RoomOutgoingEncryptedTextMsgBubbleCell.xib
#	Riot/Modules/Room/TimelineCells/Styles/Plain/Cells/TextMessage/Outgoing/Encrypted/RoomOutgoingEncryptedTextMsgWithPaginationTitleBubbleCell.xib
#	Riot/Modules/Room/TimelineCells/Styles/Plain/PlainRoomTimelineCellProvider.m
#	Riot/Modules/Room/TimelineCells/Styles/Plain/PlainRoomTimelineStyle.swift
#	Riot/Modules/Room/TimelineCells/Styles/RoomTimelineStyle.swift
#	Riot/Modules/Room/TimelineDecorations/Reactions/RoomReactionActionViewCell.swift
#	Riot/Modules/Room/TimelineDecorations/Reactions/RoomReactionActionViewCell.xib
#	Riot/Modules/Room/TimelineDecorations/Reactions/RoomReactionViewCell.xib
#	Riot/Modules/Room/TimelineDecorations/Reactions/RoomReactionsView.swift
#	Riot/Modules/Room/TimelineDecorations/Reactions/RoomReactionsViewModel.swift
#	Riot/Modules/Room/TimelineDecorations/Reactions/RoomReactionsViewModelType.swift
#	Riot/Modules/Room/TimelineDecorations/Threads/Summary/ThreadSummaryView.swift
#	Riot/Modules/Room/VoiceMessages/VoiceMessageAudioConverter.swift
#	Riot/Modules/Room/VoiceMessages/VoiceMessageAudioRecorder.swift
#	Riot/Modules/Room/VoiceMessages/VoiceMessagePlaybackView.swift
#	Riot/Modules/Room/VoiceMessages/VoiceMessagePlaybackView.xib
#	Riot/Modules/Room/VoiceMessages/VoiceMessageToolbarView.swift
#	Riot/Modules/Rooms/RoomsViewController.h
#	Riot/Modules/Rooms/ShowDirectory/Cells/Network/DirectoryNetworkTableHeaderFooterView.swift
#	Riot/Modules/Rooms/ShowDirectory/Cells/Room/DirectoryRoomTableViewCell.swift
#	Riot/Modules/Rooms/ShowDirectory/Cells/Room/DirectoryRoomTableViewCell.xib
#	Riot/Modules/Rooms/ShowDirectory/PublicRoomsDirectoryViewModel.swift
#	Riot/Modules/Rooms/ShowDirectory/ShowDirectoryViewController.swift
#	Riot/Modules/Rooms/ShowDirectory/ShowDirectoryViewModel.swift
#	Riot/Modules/Secrets/Recover/RecoverWithKey/SecretsRecoveryWithKeyCoordinator.swift
#	Riot/Modules/Secrets/Recover/RecoverWithKey/SecretsRecoveryWithKeyViewController.swift
#	Riot/Modules/Secrets/Recover/RecoverWithPassphrase/SecretsRecoveryWithPassphraseCoordinator.swift
#	Riot/Modules/Secrets/Recover/RecoverWithPassphrase/SecretsRecoveryWithPassphraseViewController.swift
#	Riot/Modules/Secrets/Recover/SecretsRecoveryCoordinator.swift
#	Riot/Modules/Secrets/Reset/SecretsResetViewController.storyboard
#	Riot/Modules/Secrets/Reset/SecretsResetViewController.swift
#	Riot/Modules/Secrets/Setup/RecoveryKey/SecretsSetupRecoveryKeyViewController.swift
#	Riot/Modules/Secrets/Setup/RecoveryPassphrase/SecretsSetupRecoveryPassphraseViewController.storyboard
#	Riot/Modules/Secrets/Setup/RecoveryPassphrase/SecretsSetupRecoveryPassphraseViewController.swift
#	Riot/Modules/SecureBackup/Setup/Intro/SecureBackupSetupIntroViewController.swift
#	Riot/Modules/SecureBackup/Setup/Intro/SecureBackupSetupIntroViewModel.swift
#	Riot/Modules/SecureBackup/Setup/Intro/SecureBackupSetupIntroViewModelType.swift
#	Riot/Modules/SecureBackup/Setup/SecureBackupSetupCoordinator.swift
#	Riot/Modules/SetPinCode/EnterPinCode/EnterPinCodeViewController.storyboard
#	Riot/Modules/SetPinCode/EnterPinCode/EnterPinCodeViewController.swift
#	Riot/Modules/SetPinCode/EnterPinCode/EnterPinCodeViewModel.swift
#	Riot/Modules/SetPinCode/PinCodePreferences.swift
#	Riot/Modules/SetPinCode/SetPinCoordinator.swift
#	Riot/Modules/SetPinCode/SetPinCoordinatorBridgePresenter.swift
#	Riot/Modules/SetPinCode/SetupBiometrics/BiometricsAuthenticationPresenter.swift
#	Riot/Modules/SetPinCode/SetupBiometrics/SetupBiometricsCoordinator.swift
#	Riot/Modules/SetPinCode/SetupBiometrics/SetupBiometricsViewController.swift
#	Riot/Modules/SetPinCode/SetupBiometrics/SetupBiometricsViewModel.swift
#	Riot/Modules/Settings/DeactivateAccount/DeactivateAccountViewController.m
#	Riot/Modules/Settings/Security/ManageSession/ManageSessionViewController.m
#	Riot/Modules/Settings/Security/SecurityViewController.m
#	Riot/Modules/Settings/SettingsViewController.m
#	Riot/Modules/SideMenu/SideMenuCoordinator.swift
#	Riot/Modules/SideMenu/SideMenuViewModel.swift
#	Riot/Modules/Spaces/SpaceList/SpaceListViewModel.swift
#	Riot/Modules/Spaces/SpaceMenu/SpaceMenuPresenter.swift
#	Riot/Modules/Spaces/SpaceMenu/SpaceMenuViewModel.swift
#	Riot/Modules/Spaces/SpaceRoomList/ExploreRoomCoordinator.swift
#	Riot/Modules/SplitView/SplitViewCoordinator.swift
#	Riot/Modules/SplitView/SplitViewCoordinatorType.swift
#	Riot/Modules/StartChat/StartChatViewController.m
#	Riot/Modules/TabBar/MasterTabBarController.h
#	Riot/Modules/TabBar/MasterTabBarController.m
#	Riot/Modules/TabBar/TabBarCoordinator.swift
#	Riot/Modules/TabBar/TabBarCoordinatorType.swift
#	Riot/Modules/Threads/ThreadList/ThreadListViewModel.swift
#	Riot/SupportingFiles/Info.plist
#	Riot/SupportingFiles/Riot-Bridging-Header.h
#	Riot/SupportingFiles/Riot.entitlements
#	Riot/Utils/EventFormatter+DTCoreTextFix.m
#	Riot/Utils/EventFormatter.m
#	Riot/Utils/Tools.h
#	Riot/Utils/Tools.m
#	Riot/Utils/URLValidator.swift
#	Riot/Utils/UniversalLink.h
#	Riot/Utils/UniversalLink.m
#	Riot/target.yml
#	RiotNSE/NotificationService.swift
#	RiotNSE/RiotNSE.entitlements
#	RiotNSE/target.yml
#	RiotShareExtension/Shared/View/ShareViewController.m
#	RiotShareExtension/SupportingFiles/Info.plist
#	RiotShareExtension/target.yml
#	RiotSwiftUI/Modules/AnalyticsPrompt/AnalyticsPromptViewModel.swift
#	RiotSwiftUI/Modules/AnalyticsPrompt/Coordinator/AnalyticsPromptCoordinator.swift
#	RiotSwiftUI/Modules/AnalyticsPrompt/Coordinator/AnalyticsPromptStrings.swift
#	RiotSwiftUI/Modules/AnalyticsPrompt/MockAnalyticsPromptScreenState.swift
#	RiotSwiftUI/Modules/AnalyticsPrompt/Test/UI/AnalyticsPromptUITests.swift
#	RiotSwiftUI/Modules/AnalyticsPrompt/View/AnalyticsPrompt.swift
#	RiotSwiftUI/Modules/AnalyticsPrompt/View/AnalyticsPromptCheckmarkItem.swift
#	RiotSwiftUI/Modules/Authentication/Common/AuthenticationHomeserverViewData.swift
#	RiotSwiftUI/Modules/Authentication/Common/AuthenticationModels.swift
#	RiotSwiftUI/Modules/Authentication/Common/AuthenticationServerInfoSection.swift
#	RiotSwiftUI/Modules/Authentication/Common/Service/MatrixSDK/AuthenticationRestClient.swift
#	RiotSwiftUI/Modules/Authentication/Common/Service/MatrixSDK/AuthenticationService.swift
#	RiotSwiftUI/Modules/Authentication/Common/Service/MatrixSDK/AuthenticationState.swift
#	RiotSwiftUI/Modules/Authentication/Common/Service/MatrixSDK/LoginModels.swift
#	RiotSwiftUI/Modules/Authentication/Common/Service/MatrixSDK/LoginParameters.swift
#	RiotSwiftUI/Modules/Authentication/Common/Service/MatrixSDK/LoginWizard.swift
#	RiotSwiftUI/Modules/Authentication/Common/Service/MatrixSDK/RegistrationParameters.swift
#	RiotSwiftUI/Modules/Authentication/Common/Service/MatrixSDK/RegistrationWizard.swift
#	RiotSwiftUI/Modules/Authentication/Common/Service/MatrixSDK/SessionCreator.swift
#	RiotSwiftUI/Modules/Authentication/Common/Service/MatrixSDK/ThreePIDModels.swift
#	RiotSwiftUI/Modules/Authentication/Login/AuthenticationLoginModels.swift
#	RiotSwiftUI/Modules/Authentication/Login/Coordinator/AuthenticationLoginCoordinator.swift
#	RiotSwiftUI/Modules/Authentication/Login/Test/UI/AuthenticationLoginUITests.swift
#	RiotSwiftUI/Modules/Authentication/Login/Test/Unit/AuthenticationLoginViewModelTests.swift
#	RiotSwiftUI/Modules/Authentication/Login/View/AuthenticationLoginScreen.swift
#	RiotSwiftUI/Modules/Authentication/ReCaptcha/Test/UI/AuthenticationReCaptchaUITests.swift
#	RiotSwiftUI/Modules/Authentication/ReCaptcha/View/AuthenticationReCaptchaScreen.swift
#	RiotSwiftUI/Modules/Authentication/ReCaptcha/View/AuthenticationReCaptchaWebView.swift
#	RiotSwiftUI/Modules/Authentication/Registration/AuthenticationRegistrationModels.swift
#	RiotSwiftUI/Modules/Authentication/Registration/AuthenticationRegistrationViewModel.swift
#	RiotSwiftUI/Modules/Authentication/Registration/AuthenticationRegistrationViewModelProtocol.swift
#	RiotSwiftUI/Modules/Authentication/Registration/Coordinator/AuthenticationRegistrationCoordinator.swift
#	RiotSwiftUI/Modules/Authentication/Registration/MockAuthenticationRegistrationScreenState.swift
#	RiotSwiftUI/Modules/Authentication/Registration/Test/UI/AuthenticationRegistrationUITests.swift
#	RiotSwiftUI/Modules/Authentication/Registration/Test/Unit/AuthenticationRegistrationViewModelTests.swift
#	RiotSwiftUI/Modules/Authentication/Registration/View/AuthenticationRegistrationScreen.swift
#	RiotSwiftUI/Modules/Authentication/ServerSelection/AuthenticationServerSelectionModels.swift
#	RiotSwiftUI/Modules/Authentication/ServerSelection/AuthenticationServerSelectionViewModel.swift
#	RiotSwiftUI/Modules/Authentication/ServerSelection/Coordinator/AuthenticationServerSelectionCoordinator.swift
#	RiotSwiftUI/Modules/Authentication/ServerSelection/MockAuthenticationServerSelectionScreenState.swift
#	RiotSwiftUI/Modules/Authentication/ServerSelection/Test/UI/AuthenticationServerSelectionUITests.swift
#	RiotSwiftUI/Modules/Authentication/ServerSelection/Test/Unit/AuthenticationServerSelectionViewModelTests.swift
#	RiotSwiftUI/Modules/Authentication/ServerSelection/View/AuthenticationServerSelectionScreen.swift
#	RiotSwiftUI/Modules/Authentication/Terms/AuthenticationTermsModels.swift
#	RiotSwiftUI/Modules/Authentication/Terms/AuthenticationTermsViewModel.swift
#	RiotSwiftUI/Modules/Authentication/Terms/Coordinator/AuthenticationTermsCoordinator.swift
#	RiotSwiftUI/Modules/Authentication/Terms/MockAuthenticationTermsScreenState.swift
#	RiotSwiftUI/Modules/Authentication/Terms/Test/UI/AuthenticationTermsUITests.swift
#	RiotSwiftUI/Modules/Authentication/Terms/View/AuthenticationTermsScreen.swift
#	RiotSwiftUI/Modules/Authentication/Terms/View/AuthenticationTermsToggleStyle.swift
#	RiotSwiftUI/Modules/Authentication/VerifyEmail/AuthenticationVerifyEmailModels.swift
#	RiotSwiftUI/Modules/Authentication/VerifyEmail/AuthenticationVerifyEmailViewModel.swift
#	RiotSwiftUI/Modules/Authentication/VerifyEmail/Coordinator/AuthenticationVerifyEmailCoordinator.swift
#	RiotSwiftUI/Modules/Authentication/VerifyEmail/MockAuthenticationVerifyEmailScreenState.swift
#	RiotSwiftUI/Modules/Authentication/VerifyEmail/Test/UI/AuthenticationVerifyEmailUITests.swift
#	RiotSwiftUI/Modules/Authentication/VerifyEmail/Test/Unit/AuthenticationVerifyEmailViewModelTests.swift
#	RiotSwiftUI/Modules/Authentication/VerifyEmail/View/AuthenticationVerifyEmailForm.swift
#	RiotSwiftUI/Modules/Authentication/VerifyEmail/View/AuthenticationVerifyEmailScreen.swift
#	RiotSwiftUI/Modules/Authentication/VerifyMsisdn/AuthenticationVerifyMsisdnModels.swift
#	RiotSwiftUI/Modules/Authentication/VerifyMsisdn/AuthenticationVerifyMsisdnViewModel.swift
#	RiotSwiftUI/Modules/Authentication/VerifyMsisdn/Coordinator/AuthenticationVerifyMsisdnCoordinator.swift
#	RiotSwiftUI/Modules/Authentication/VerifyMsisdn/MockAuthenticationVerifyMsisdnScreenState.swift
#	RiotSwiftUI/Modules/Authentication/VerifyMsisdn/Test/UI/AuthenticationVerifyMsisdnUITests.swift
#	RiotSwiftUI/Modules/Authentication/VerifyMsisdn/Test/Unit/AuthenticationVerifyMsisdnViewModelTests.swift
#	RiotSwiftUI/Modules/Authentication/VerifyMsisdn/View/AuthenticationVerifyMsisdnForm.swift
#	RiotSwiftUI/Modules/Common/ActivityIndicator/ActivityIndicator.swift
#	RiotSwiftUI/Modules/Common/ActivityIndicator/ActivityIndicatorModifier.swift
#	RiotSwiftUI/Modules/Common/Avatar/Service/MatrixSDK/AvatarService.swift
#	RiotSwiftUI/Modules/Common/Avatar/Service/Mock/MockAvatarService.swift
#	RiotSwiftUI/Modules/Common/Avatar/View/AvatarImage.swift
#	RiotSwiftUI/Modules/Common/Avatar/View/PlaceholderAvatarImage.swift
#	RiotSwiftUI/Modules/Common/Avatar/View/SpaceAvatarImage.swift
#	RiotSwiftUI/Modules/Common/Avatar/ViewModel/AvatarServiceProtocol.swift
#	RiotSwiftUI/Modules/Common/Avatar/ViewModel/AvatarViewModel.swift
#	RiotSwiftUI/Modules/Common/Bridging/VectorContentView.swift
#	RiotSwiftUI/Modules/Common/DependencyInjection/DependencyContainerKey.swift
#	RiotSwiftUI/Modules/Common/EffectsScene/EffectsScene.swift
#	RiotSwiftUI/Modules/Common/EffectsScene/EffectsView.swift
#	RiotSwiftUI/Modules/Common/Extensions/Publisher.swift
#	RiotSwiftUI/Modules/Common/Mock/MockAppScreens.swift
#	RiotSwiftUI/Modules/Common/Mock/MockScreenState.swift
#	RiotSwiftUI/Modules/Common/Mock/ScreenList.swift
#	RiotSwiftUI/Modules/Common/Mock/ScreenStateInfo.swift
#	RiotSwiftUI/Modules/Common/Mock/StateRenderer.swift
#	RiotSwiftUI/Modules/Common/Test/UI/MockScreenTest.swift
#	RiotSwiftUI/Modules/Common/Test/UI/XCUIApplication+Riot.swift
#	RiotSwiftUI/Modules/Common/Test/XCTestPublisherExtensions.swift
#	RiotSwiftUI/Modules/Common/Theme/ThemeIdentifierExtensions.swift
#	RiotSwiftUI/Modules/Common/Theme/ThemeKey.swift
#	RiotSwiftUI/Modules/Common/Theme/ThemePublisher.swift
#	RiotSwiftUI/Modules/Common/Theme/ThemeSwiftUI.swift
#	RiotSwiftUI/Modules/Common/Theme/ThemeUsersColorsExtension.swift
#	RiotSwiftUI/Modules/Common/Theme/Themes/DarkThemeSwiftUI.swift
#	RiotSwiftUI/Modules/Common/Theme/Themes/DefaultThemeSwiftUI.swift
#	RiotSwiftUI/Modules/Common/Util/BorderModifier.swift
#	RiotSwiftUI/Modules/Common/Util/BorderedInputFieldStyle.swift
#	RiotSwiftUI/Modules/Common/Util/ClearViewModifier.swift
#	RiotSwiftUI/Modules/Common/Util/InlineTextButton.swift
#	RiotSwiftUI/Modules/Common/Util/MultilineTextField.swift
#	RiotSwiftUI/Modules/Common/Util/OptionButton.swift
#	RiotSwiftUI/Modules/Common/Util/PrimaryActionButtonStyle.swift
#	RiotSwiftUI/Modules/Common/Util/RadioButton.swift
#	RiotSwiftUI/Modules/Common/Util/RoundedBorderTextEditor.swift
#	RiotSwiftUI/Modules/Common/Util/RoundedBorderTextField.swift
#	RiotSwiftUI/Modules/Common/Util/RoundedCornerShape.swift
#	RiotSwiftUI/Modules/Common/Util/SafeBindingCollectionEnumerator.swift
#	RiotSwiftUI/Modules/Common/Util/ScreenTrackerViewModifier.swift
#	RiotSwiftUI/Modules/Common/Util/SearchBar.swift
#	RiotSwiftUI/Modules/Common/Util/SecondaryActionButtonStyle.swift
#	RiotSwiftUI/Modules/Common/Util/StyledText.swift
#	RiotSwiftUI/Modules/Common/Util/ThemableButton.swift
#	RiotSwiftUI/Modules/Common/Util/ThemableNavigationBar.swift
#	RiotSwiftUI/Modules/Common/Util/ThemableTextEditor.swift
#	RiotSwiftUI/Modules/Common/Util/ThemableTextField.swift
#	RiotSwiftUI/Modules/Common/Util/WaitOverlay.swift
#	RiotSwiftUI/Modules/Common/ViewFrameReader/FramePreferenceKey.swift
#	RiotSwiftUI/Modules/Common/ViewFrameReader/ViewFrameReader.swift
#	RiotSwiftUI/Modules/Common/ViewModel/StateStoreViewModel.swift
#	RiotSwiftUI/Modules/Onboarding/Avatar/Coordinator/OnboardingAvatarCoordinator.swift
#	RiotSwiftUI/Modules/Onboarding/Avatar/MockOnboardingAvatarScreenState.swift
#	RiotSwiftUI/Modules/Onboarding/Avatar/Test/UI/OnboardingAvatarUITests.swift
#	RiotSwiftUI/Modules/Onboarding/Avatar/Test/Unit/OnboardingAvatarViewModelTests.swift
#	RiotSwiftUI/Modules/Onboarding/Celebration/Test/UI/OnboardingCelebrationUITests.swift
#	RiotSwiftUI/Modules/Onboarding/Celebration/View/OnboardingCelebrationScreen.swift
#	RiotSwiftUI/Modules/Onboarding/Common/OnboardingIcon.swift
#	RiotSwiftUI/Modules/Onboarding/Common/OnboardingMetrics.swift
#	RiotSwiftUI/Modules/Onboarding/Congratulations/OnboardingCongratulationsModels.swift
#	RiotSwiftUI/Modules/Onboarding/Congratulations/Test/UI/OnboardingCongratulationsUITests.swift
#	RiotSwiftUI/Modules/Onboarding/Congratulations/View/OnboardingCongratulationsScreen.swift
#	RiotSwiftUI/Modules/Onboarding/DisplayName/Coordinator/OnboardingDisplayNameCoordinator.swift
#	RiotSwiftUI/Modules/Onboarding/DisplayName/Test/UI/OnboardingDisplayNameUITests.swift
#	RiotSwiftUI/Modules/Onboarding/DisplayName/View/OnboardingDisplayNameScreen.swift
#	RiotSwiftUI/Modules/Onboarding/SplashScreen/OnboardingSplashScreenModels.swift
#	RiotSwiftUI/Modules/Onboarding/SplashScreen/View/OnboardingSplashScreen.swift
#	RiotSwiftUI/Modules/Onboarding/SplashScreen/View/OnboardingSplashScreenPage.swift
#	RiotSwiftUI/Modules/Onboarding/SplashScreen/View/OnboardingSplashScreenPageIndicator.swift
#	RiotSwiftUI/Modules/Onboarding/UseCase/Coordinator/OnboardingUseCaseSelectionCoordinator.swift
#	RiotSwiftUI/Modules/Onboarding/UseCase/OnboardingUseCaseModels.swift
#	RiotSwiftUI/Modules/Onboarding/UseCase/Test/UI/OnboardingUseCaseUITests.swift
#	RiotSwiftUI/Modules/Onboarding/UseCase/View/OnboardingUseCaseSelectionScreen.swift
#	RiotSwiftUI/Modules/Room/LiveLocationSharingViewer/Coordinator/LiveLocationSharingViewerCoordinator.swift
#	RiotSwiftUI/Modules/Room/LiveLocationSharingViewer/LiveLocationSharingViewerModels.swift
#	RiotSwiftUI/Modules/Room/LiveLocationSharingViewer/LiveLocationSharingViewerViewModel.swift
#	RiotSwiftUI/Modules/Room/LiveLocationSharingViewer/LiveLocationSharingViewerViewModelProtocol.swift
#	RiotSwiftUI/Modules/Room/LiveLocationSharingViewer/MockLiveLocationSharingViewerScreenState.swift
#	RiotSwiftUI/Modules/Room/LiveLocationSharingViewer/Service/LiveLocationSharingViewerServiceProtocol.swift
#	RiotSwiftUI/Modules/Room/LiveLocationSharingViewer/Service/MatrixSDK/LiveLocationSharingViewerService.swift
#	RiotSwiftUI/Modules/Room/LiveLocationSharingViewer/Service/Mock/MockLiveLocationSharingViewerService.swift
#	RiotSwiftUI/Modules/Room/LiveLocationSharingViewer/Test/UI/LiveLocationSharingViewerUITests.swift
#	RiotSwiftUI/Modules/Room/LiveLocationSharingViewer/Test/Unit/LiveLocationSharingViewerViewModelTests.swift
#	RiotSwiftUI/Modules/Room/LiveLocationSharingViewer/View/LiveLocationListItem.swift
#	RiotSwiftUI/Modules/Room/LiveLocationSharingViewer/View/LiveLocationSharingViewer.swift
#	RiotSwiftUI/Modules/Room/LocationSharing/Coordinator/LocationSharingCoordinator.swift
#	RiotSwiftUI/Modules/Room/LocationSharing/LocationSharingModels.swift
#	RiotSwiftUI/Modules/Room/LocationSharing/LocationSharingScreenState.swift
#	RiotSwiftUI/Modules/Room/LocationSharing/LocationSharingViewModel.swift
#	RiotSwiftUI/Modules/Room/LocationSharing/Service/MatrixSDK/LocationSharingService.swift
#	RiotSwiftUI/Modules/Room/LocationSharing/Service/Mock/MockLocationSharingService.swift
#	RiotSwiftUI/Modules/Room/LocationSharing/Test/UI/LocationSharingUITests.swift
#	RiotSwiftUI/Modules/Room/LocationSharing/Test/Unit/LocationSharingViewModelTests.swift
#	RiotSwiftUI/Modules/Room/LocationSharing/View/LocationSharingMapView.swift
#	RiotSwiftUI/Modules/Room/LocationSharing/View/LocationSharingMarkerView.swift
#	RiotSwiftUI/Modules/Room/LocationSharing/View/LocationSharingOptionButton.swift
#	RiotSwiftUI/Modules/Room/LocationSharing/View/LocationSharingView.swift
#	RiotSwiftUI/Modules/Room/LocationSharing/View/MapCreditsView.swift
#	RiotSwiftUI/Modules/Room/LocationSharing/View/UserLocationAnnotationView.swift
#	RiotSwiftUI/Modules/Room/NotificationSettings/Coordinator/RoomNotificationSettingsCoordinator.swift
#	RiotSwiftUI/Modules/Room/NotificationSettings/View/FormItemButtonStyle.swift
#	RiotSwiftUI/Modules/Room/NotificationSettings/View/FormPickerItem.swift
#	RiotSwiftUI/Modules/Room/NotificationSettings/View/FormSectionFooter.swift
#	RiotSwiftUI/Modules/Room/NotificationSettings/View/FormSectionHeader.swift
#	RiotSwiftUI/Modules/Room/NotificationSettings/View/RoomNotificationSettings.swift
#	RiotSwiftUI/Modules/Room/NotificationSettings/View/RoomNotificationSettingsHeader.swift
#	RiotSwiftUI/Modules/Room/NotificationSettings/View/VectorForm.swift
#	RiotSwiftUI/Modules/Room/NotificationSettings/ViewModel/RoomNotificationSettingsSwiftUIViewModel.swift
#	RiotSwiftUI/Modules/Room/PollEditForm/Coordinator/PollEditFormCoordinator.swift
#	RiotSwiftUI/Modules/Room/PollEditForm/PollEditFormScreenState.swift
#	RiotSwiftUI/Modules/Room/PollEditForm/PollEditFormViewModel.swift
#	RiotSwiftUI/Modules/Room/PollEditForm/Test/UI/PollEditFormUITests.swift
#	RiotSwiftUI/Modules/Room/PollEditForm/Test/Unit/PollEditFormViewModelTests.swift
#	RiotSwiftUI/Modules/Room/PollEditForm/View/PollEditForm.swift
#	RiotSwiftUI/Modules/Room/PollEditForm/View/PollEditFormAnswerOptionView.swift
#	RiotSwiftUI/Modules/Room/PollEditForm/View/PollEditFormTypePicker.swift
#	RiotSwiftUI/Modules/Room/RoomAccess/Coordinator/RoomAccessCoordinator.swift
#	RiotSwiftUI/Modules/Room/RoomAccess/Coordinator/RoomAccessCoordinatorBridgePresenter.swift
#	RiotSwiftUI/Modules/Room/RoomAccess/RoomAccessTypeChooser/Coordinator/RoomAccessTypeChooserCoordinator.swift
#	RiotSwiftUI/Modules/Room/RoomAccess/RoomAccessTypeChooser/MockRoomAccessTypeChooserScreenState.swift
#	RiotSwiftUI/Modules/Room/RoomAccess/RoomAccessTypeChooser/RoomAccessTypeChooserViewModel.swift
#	RiotSwiftUI/Modules/Room/RoomAccess/RoomAccessTypeChooser/RoomAccessTypeChooserViewModelProtocol.swift
#	RiotSwiftUI/Modules/Room/RoomAccess/RoomAccessTypeChooser/Service/MatrixSDK/RoomAccessTypeChooserService.swift
#	RiotSwiftUI/Modules/Room/RoomAccess/RoomAccessTypeChooser/Service/Mock/MockRoomAccessTypeChooserService.swift
#	RiotSwiftUI/Modules/Room/RoomAccess/RoomAccessTypeChooser/Service/RoomAccessTypeChooserServiceProtocol.swift
#	RiotSwiftUI/Modules/Room/RoomAccess/RoomAccessTypeChooser/Test/UI/RoomAccessTypeChooserUITests.swift
#	RiotSwiftUI/Modules/Room/RoomAccess/RoomAccessTypeChooser/Test/Unit/RoomAccessTypeChooserViewModelTests.swift
#	RiotSwiftUI/Modules/Room/RoomAccess/RoomAccessTypeChooser/View/RoomAccessTypeChooser.swift
#	RiotSwiftUI/Modules/Room/RoomAccess/RoomAccessTypeChooser/View/RoomAccessTypeChooserRow.swift
#	RiotSwiftUI/Modules/Room/RoomAccess/RoomRestrictedAccessSpaceChooser/Coordinator/RoomRestrictedAccessSpaceChooserViewProvider.swift
#	RiotSwiftUI/Modules/Room/RoomAccess/RoomRestrictedAccessSpaceChooser/View/RoomRestrictedAccessSpaceChooserSelector.swift
#	RiotSwiftUI/Modules/Room/RoomSuggestion/Coordinator/RoomSuggestionCoordinator.swift
#	RiotSwiftUI/Modules/Room/RoomSuggestion/Coordinator/RoomSuggestionCoordinatorBridgePresenter.swift
#	RiotSwiftUI/Modules/Room/RoomSuggestion/RoomSuggestionSpaceChooser/Coordinator/RoomSuggestionSpaceChooserViewProvider.swift
#	RiotSwiftUI/Modules/Room/RoomSuggestion/RoomSuggestionSpaceChooser/View/RoomSuggestionSpaceChooserSelector.swift
#	RiotSwiftUI/Modules/Room/RoomUpgrade/Coordinator/RoomUpgradeCoordinator.swift
#	RiotSwiftUI/Modules/Room/RoomUpgrade/MockRoomUpgradeScreenState.swift
#	RiotSwiftUI/Modules/Room/RoomUpgrade/RoomUpgradeViewModel.swift
#	RiotSwiftUI/Modules/Room/RoomUpgrade/RoomUpgradeViewModelProtocol.swift
#	RiotSwiftUI/Modules/Room/RoomUpgrade/Service/MatrixSDK/RoomUpgradeService.swift
#	RiotSwiftUI/Modules/Room/RoomUpgrade/Service/Mock/MockRoomUpgradeService.swift
#	RiotSwiftUI/Modules/Room/RoomUpgrade/Service/RoomUpgradeServiceProtocol.swift
#	RiotSwiftUI/Modules/Room/RoomUpgrade/Test/UI/RoomUpgradeUITests.swift
#	RiotSwiftUI/Modules/Room/RoomUpgrade/Test/Unit/RoomUpgradeViewModelTests.swift
#	RiotSwiftUI/Modules/Room/RoomUpgrade/View/RoomUpgrade.swift
#	RiotSwiftUI/Modules/Room/StaticLocationSharingViewer/Coordinator/StaticLocationViewingCoordinator.swift
#	RiotSwiftUI/Modules/Room/StaticLocationSharingViewer/MockStaticLocationViewingScreenState.swift
#	RiotSwiftUI/Modules/Room/StaticLocationSharingViewer/StaticLocationViewingModels.swift
#	RiotSwiftUI/Modules/Room/StaticLocationSharingViewer/StaticLocationViewingViewModel.swift
#	RiotSwiftUI/Modules/Room/StaticLocationSharingViewer/StaticLocationViewingViewModelProtocol.swift
#	RiotSwiftUI/Modules/Room/StaticLocationSharingViewer/Test/UI/StaticLocationViewingUITests.swift
#	RiotSwiftUI/Modules/Room/StaticLocationSharingViewer/Test/Unit/StaticLocationViewingViewModelTests.swift
#	RiotSwiftUI/Modules/Room/StaticLocationSharingViewer/View/StaticLocationView.swift
#	RiotSwiftUI/Modules/Room/TimelinePoll/Coordinator/TimelinePollCoordinator.swift
#	RiotSwiftUI/Modules/Room/TimelinePoll/Coordinator/TimelinePollProvider.swift
#	RiotSwiftUI/Modules/Room/TimelinePoll/Test/UI/TimelinePollUITests.swift
#	RiotSwiftUI/Modules/Room/TimelinePoll/Test/Unit/TimelinePollViewModelTests.swift
#	RiotSwiftUI/Modules/Room/TimelinePoll/TimelinePollScreenState.swift
#	RiotSwiftUI/Modules/Room/TimelinePoll/TimelinePollViewModel.swift
#	RiotSwiftUI/Modules/Room/TimelinePoll/TimelinePollViewModelProtocol.swift
#	RiotSwiftUI/Modules/Room/TimelinePoll/View/TimelinePollAnswerOptionButton.swift
#	RiotSwiftUI/Modules/Room/TimelinePoll/View/TimelinePollView.swift
#	RiotSwiftUI/Modules/Room/UserSuggestion/Coordinator/UserSuggestionCoordinator.swift
#	RiotSwiftUI/Modules/Room/UserSuggestion/Coordinator/UserSuggestionCoordinatorBridge.swift
#	RiotSwiftUI/Modules/Room/UserSuggestion/Service/UserSuggestionService.swift
#	RiotSwiftUI/Modules/Room/UserSuggestion/Service/UserSuggestionServiceProtocol.swift
#	RiotSwiftUI/Modules/Room/UserSuggestion/Test/UI/UserSuggestionUITests.swift
#	RiotSwiftUI/Modules/Room/UserSuggestion/Test/Unit/UserSuggestionServiceTests.swift
#	RiotSwiftUI/Modules/Room/UserSuggestion/UserSuggestionScreenState.swift
#	RiotSwiftUI/Modules/Room/UserSuggestion/UserSuggestionViewModel.swift
#	RiotSwiftUI/Modules/Room/UserSuggestion/View/UserSuggestionList.swift
#	RiotSwiftUI/Modules/Room/UserSuggestion/View/UserSuggestionListItem.swift
#	RiotSwiftUI/Modules/Room/UserSuggestion/View/UserSuggestionListWithInput.swift
#	RiotSwiftUI/Modules/Settings/Notifications/Coordinator/NotificationSettingsBridgePresenter.swift
#	RiotSwiftUI/Modules/Settings/Notifications/Coordinator/NotificationSettingsCoordinator.swift
#	RiotSwiftUI/Modules/Settings/Notifications/Model/NotificationSettingsScreen.swift
#	RiotSwiftUI/Modules/Settings/Notifications/Service/MatrixSDK/MXNotificationSettingsService.swift
#	RiotSwiftUI/Modules/Settings/Notifications/Service/Mock/MockNotificationSettingsService.swift
#	RiotSwiftUI/Modules/Settings/Notifications/Service/NotificationSettingsServiceType.swift
#	RiotSwiftUI/Modules/Settings/Notifications/View/Chip.swift
#	RiotSwiftUI/Modules/Settings/Notifications/View/Chips.swift
#	RiotSwiftUI/Modules/Settings/Notifications/View/ChipsInput.swift
#	RiotSwiftUI/Modules/Settings/Notifications/View/DefaultNotificationSettings.swift
#	RiotSwiftUI/Modules/Settings/Notifications/View/FormInputFieldStyle.swift
#	RiotSwiftUI/Modules/Settings/Notifications/View/MentionsAndKeywordNotificationSettings.swift
#	RiotSwiftUI/Modules/Settings/Notifications/View/NotificationSettings.swift
#	RiotSwiftUI/Modules/Settings/Notifications/View/NotificationSettingsKeywords.swift
#	RiotSwiftUI/Modules/Settings/Notifications/View/OtherNotificationSettings.swift
#	RiotSwiftUI/Modules/Settings/Notifications/ViewModel/NotificationSettingsViewModel.swift
#	RiotSwiftUI/Modules/Spaces/AddRoomSelector/Coordinator/AddRoomSelectorViewProvider.swift
#	RiotSwiftUI/Modules/Spaces/AddRoomSelector/View/AddRoomSelector.swift
#	RiotSwiftUI/Modules/Spaces/LeaveSpace/Coordinator/LeaveSpaceViewProvider.swift
#	RiotSwiftUI/Modules/Spaces/LeaveSpace/View/LeaveSpace.swift
#	RiotSwiftUI/Modules/Spaces/MatrixItemChooser/Coordinator/MatrixItemChooserCoordinator.swift
#	RiotSwiftUI/Modules/Spaces/MatrixItemChooser/MatrixItemChooserViewModel.swift
#	RiotSwiftUI/Modules/Spaces/MatrixItemChooser/MatrixItemChooserViewModelProtocol.swift
#	RiotSwiftUI/Modules/Spaces/MatrixItemChooser/MockMatrixItemChooserScreenState.swift
#	RiotSwiftUI/Modules/Spaces/MatrixItemChooser/Service/MatrixItemChooserServiceProtocol.swift
#	RiotSwiftUI/Modules/Spaces/MatrixItemChooser/Service/MatrixSDK/MatrixItemChooserService.swift
#	RiotSwiftUI/Modules/Spaces/MatrixItemChooser/Service/Mock/MockMatrixItemChooserService.swift
#	RiotSwiftUI/Modules/Spaces/MatrixItemChooser/Test/UI/MatrixItemChooserUITests.swift
#	RiotSwiftUI/Modules/Spaces/MatrixItemChooser/Test/Unit/MatrixItemChooserViewModelTests.swift
#	RiotSwiftUI/Modules/Spaces/MatrixItemChooser/View/MatrixItemChooser.swift
#	RiotSwiftUI/Modules/Spaces/MatrixItemChooser/View/MatrixItemChooserListRow.swift
#	RiotSwiftUI/Modules/Spaces/MatrixItemChooser/View/MatrixItemChooserSectionHeader.swift
#	RiotSwiftUI/Modules/Spaces/RoomAncestorSelector/Coordinator/RoomAncestorSelectorViewProvider.swift
#	RiotSwiftUI/Modules/Spaces/RoomAncestorSelector/View/RoomAncestorSelector.swift
#	RiotSwiftUI/Modules/Spaces/SpaceCreation/Coordinator/SpaceCreationCoordinator.swift
#	RiotSwiftUI/Modules/Spaces/SpaceCreation/SpaceCreationEmailInvites/Coordinator/SpaceCreationEmailInvitesCoordinator.swift
#	RiotSwiftUI/Modules/Spaces/SpaceCreation/SpaceCreationEmailInvites/Service/MatrixSDK/SpaceCreationEmailInvitesService.swift
#	RiotSwiftUI/Modules/Spaces/SpaceCreation/SpaceCreationEmailInvites/Service/Mock/MockSpaceCreationEmailInvitesScreenState.swift
#	RiotSwiftUI/Modules/Spaces/SpaceCreation/SpaceCreationEmailInvites/Service/Mock/MockSpaceCreationEmailInvitesService.swift
#	RiotSwiftUI/Modules/Spaces/SpaceCreation/SpaceCreationEmailInvites/Service/SpaceCreationEmailInvitesServiceProtocol.swift
#	RiotSwiftUI/Modules/Spaces/SpaceCreation/SpaceCreationEmailInvites/Test/UI/SpaceCreationEmailInvitesUITests.swift
#	RiotSwiftUI/Modules/Spaces/SpaceCreation/SpaceCreationEmailInvites/Test/Unit/SpaceCreationEmailInvitesViewModelTests.swift
#	RiotSwiftUI/Modules/Spaces/SpaceCreation/SpaceCreationEmailInvites/View/SpaceCreationEmailInvites.swift
#	RiotSwiftUI/Modules/Spaces/SpaceCreation/SpaceCreationEmailInvites/ViewModel/SpaceCreationEmailInvitesViewModel.swift
#	RiotSwiftUI/Modules/Spaces/SpaceCreation/SpaceCreationEmailInvites/ViewModel/SpaceCreationEmailInvitesViewModelProtocol.swift
#	RiotSwiftUI/Modules/Spaces/SpaceCreation/SpaceCreationMatrixItemChooser/Coordinator/SpaceCreationMatrixItemChooserViewProvider.swift
#	RiotSwiftUI/Modules/Spaces/SpaceCreation/SpaceCreationMatrixItemChooser/View/SpaceCreationMatrixItemChooser.swift
#	RiotSwiftUI/Modules/Spaces/SpaceCreation/SpaceCreationMenu/Coordinator/SpaceCreationMenuCoordinator.swift
#	RiotSwiftUI/Modules/Spaces/SpaceCreation/SpaceCreationMenu/Test/UI/SpaceCreationMenuUITests.swift
#	RiotSwiftUI/Modules/Spaces/SpaceCreation/SpaceCreationMenu/Test/Unit/SpaceCreationMenuViewModelTests.swift
#	RiotSwiftUI/Modules/Spaces/SpaceCreation/SpaceCreationMenu/View/SpaceCreationMenu.swift
#	RiotSwiftUI/Modules/Spaces/SpaceCreation/SpaceCreationMenu/ViewModel/SpaceCreationMenuViewModel.swift
#	RiotSwiftUI/Modules/Spaces/SpaceCreation/SpaceCreationMenu/ViewModel/SpaceCreationMenuViewModelProtocol.swift
#	RiotSwiftUI/Modules/Spaces/SpaceCreation/SpaceCreationPostProcess/Coordinator/SpaceCreationPostProcessCoordinator.swift
#	RiotSwiftUI/Modules/Spaces/SpaceCreation/SpaceCreationPostProcess/Service/MatrixSDK/SpaceCreationPostProcessService.swift
#	RiotSwiftUI/Modules/Spaces/SpaceCreation/SpaceCreationPostProcess/Service/Mock/MockSpaceCreationPostProcessScreenState.swift
#	RiotSwiftUI/Modules/Spaces/SpaceCreation/SpaceCreationPostProcess/Service/Mock/MockSpaceCreationPostProcessService.swift
#	RiotSwiftUI/Modules/Spaces/SpaceCreation/SpaceCreationPostProcess/Service/SpaceCreationPostProcessServiceProtocol.swift
#	RiotSwiftUI/Modules/Spaces/SpaceCreation/SpaceCreationPostProcess/Test/UI/SpaceCreationPostProcessUITests.swift
#	RiotSwiftUI/Modules/Spaces/SpaceCreation/SpaceCreationPostProcess/Test/Unit/SpaceCreationPostProcessViewModelTests.swift
#	RiotSwiftUI/Modules/Spaces/SpaceCreation/SpaceCreationPostProcess/View/SpaceCreationPostProcess.swift
#	RiotSwiftUI/Modules/Spaces/SpaceCreation/SpaceCreationPostProcess/View/SpaceCreationPostProcessItem.swift
#	RiotSwiftUI/Modules/Spaces/SpaceCreation/SpaceCreationPostProcess/ViewModel/SpaceCreationPostProcessViewModel.swift
#	RiotSwiftUI/Modules/Spaces/SpaceCreation/SpaceCreationPostProcess/ViewModel/SpaceCreationPostProcessViewModelProtocol.swift
#	RiotSwiftUI/Modules/Spaces/SpaceCreation/SpaceCreationRooms/Coordinator/SpaceCreationRoomsCoordinator.swift
#	RiotSwiftUI/Modules/Spaces/SpaceCreation/SpaceCreationRooms/Service/Mock/MockSpaceCreationRoomsScreenState.swift
#	RiotSwiftUI/Modules/Spaces/SpaceCreation/SpaceCreationRooms/Test/UI/SpaceCreationRoomsUITests.swift
#	RiotSwiftUI/Modules/Spaces/SpaceCreation/SpaceCreationRooms/Test/Unit/SpaceCreationRoomsViewModelTests.swift
#	RiotSwiftUI/Modules/Spaces/SpaceCreation/SpaceCreationRooms/View/SpaceCreationRooms.swift
#	RiotSwiftUI/Modules/Spaces/SpaceCreation/SpaceCreationRooms/ViewModel/SpaceCreationRoomsViewModel.swift
#	RiotSwiftUI/Modules/Spaces/SpaceCreation/SpaceCreationRooms/ViewModel/SpaceCreationRoomsViewModelProtocol.swift
#	RiotSwiftUI/Modules/Spaces/SpaceCreation/SpaceCreationSettings/Coordinator/SpaceCreationSettingsCoordinator.swift
#	RiotSwiftUI/Modules/Spaces/SpaceCreation/SpaceCreationSettings/Service/MatrixSDK/SpaceCreationSettingsService.swift
#	RiotSwiftUI/Modules/Spaces/SpaceCreation/SpaceCreationSettings/Service/Mock/MockSpaceCreationSettingsScreenState.swift
#	RiotSwiftUI/Modules/Spaces/SpaceCreation/SpaceCreationSettings/Service/Mock/MockSpaceCreationSettingsService.swift
#	RiotSwiftUI/Modules/Spaces/SpaceCreation/SpaceCreationSettings/Service/SpaceCreationSettingsServiceProtocol.swift
#	RiotSwiftUI/Modules/Spaces/SpaceCreation/SpaceCreationSettings/Test/UI/SpaceCreationSettingsUITests.swift
#	RiotSwiftUI/Modules/Spaces/SpaceCreation/SpaceCreationSettings/Test/Unit/SpaceCreationSettingsViewModelTests.swift
#	RiotSwiftUI/Modules/Spaces/SpaceCreation/SpaceCreationSettings/View/SpaceCreationSettings.swift
#	RiotSwiftUI/Modules/Spaces/SpaceCreation/SpaceCreationSettings/ViewModel/SpaceCreationSettingsViewModel.swift
#	RiotSwiftUI/Modules/Spaces/SpaceSettings/Coordinator/SpaceSettingsModalCoordinator.swift
#	RiotSwiftUI/Modules/Spaces/SpaceSettings/Coordinator/SpaceSettingsModalCoordinatorBridgePresenter.swift
#	RiotSwiftUI/Modules/Spaces/SpaceSettings/SpaceSettings/Coordinator/SpaceSettingsCoordinator.swift
#	RiotSwiftUI/Modules/Spaces/SpaceSettings/SpaceSettings/MockSpaceSettingsScreenState.swift
#	RiotSwiftUI/Modules/Spaces/SpaceSettings/SpaceSettings/Service/MatrixSDK/SpaceSettingsService.swift
#	RiotSwiftUI/Modules/Spaces/SpaceSettings/SpaceSettings/Service/Mock/MockSpaceSettingsService.swift
#	RiotSwiftUI/Modules/Spaces/SpaceSettings/SpaceSettings/Service/SpaceSettingsServiceProtocol.swift
#	RiotSwiftUI/Modules/Spaces/SpaceSettings/SpaceSettings/SpaceSettingsViewModel.swift
#	RiotSwiftUI/Modules/Spaces/SpaceSettings/SpaceSettings/SpaceSettingsViewModelProtocol.swift
#	RiotSwiftUI/Modules/Spaces/SpaceSettings/SpaceSettings/Test/UI/SpaceSettingsUITests.swift
#	RiotSwiftUI/Modules/Spaces/SpaceSettings/SpaceSettings/Test/Unit/SpaceSettingsViewModelTests.swift
#	RiotSwiftUI/Modules/Spaces/SpaceSettings/SpaceSettings/View/SpaceSettings.swift
#	RiotSwiftUI/Modules/Spaces/SpaceSettings/SpaceSettings/View/SpaceSettingsOptionListItem.swift
#	RiotSwiftUI/Modules/Template/SimpleScreenExample/Test/UI/TemplateSimpleScreenUITests.swift
#	RiotSwiftUI/Modules/Template/SimpleUserProfileExample/Test/UI/TemplateUserProfileUITests.swift
#	RiotSwiftUI/Modules/Template/TemplateAdvancedRoomsExample/TemplateRoomChat/Test/UI/TemplateRoomChatUITests.swift
#	RiotSwiftUI/Modules/Template/TemplateAdvancedRoomsExample/TemplateRoomList/Test/UI/TemplateRoomListUITests.swift
#	RiotSwiftUI/RiotSwiftUIApp.swift
#	RiotSwiftUI/target.yml
#	RiotSwiftUI/targetUITests.yml
#	RiotTests/MatrixKitTests/MXKEventFormatter+Tests.h
#	RiotTests/MatrixKitTests/MXKEventFormatterTests.m
#	RiotTests/MatrixKitTests/MXKRoomDataSourceTests.swift
#	RiotTests/MatrixKitTests/MatrixKitTests-Bridging-Header.h
#	RiotTests/Modules/Authentication/AuthenticationServiceTests.swift
#	RiotTests/OnboardingTests.swift
#	RiotTests/PillsFormatterTests.swift
#	RiotTests/target.yml
#	SiriIntents/IntentHandler.m
#	SiriIntents/target.yml
#	Tools/SwiftGen/swiftgen-config.yml
#	Tools/Templates/buildable/SimpleScreenTemplate/SimpleScreenTemplateViewController.storyboard
#	fastlane/.env.default
#	fastlane/Fastfile
#	project.yml
This commit is contained in:
Frank Rotermund
2022-09-19 11:31:20 +02:00
773 changed files with 15324 additions and 7024 deletions
+142 -136
View File
@@ -1237,7 +1237,7 @@ static CGSize kThreadListBarButtonItemImageSize;
}
}
- (BOOL)isIRCStyleCommand:(NSString*)string
- (BOOL)sendAsIRCStyleCommandIfPossible:(NSString*)string
{
// Override the default behavior for `/join` command in order to open automatically the joined room
@@ -1280,7 +1280,7 @@ static CGSize kThreadListBarButtonItemImageSize;
}
return YES;
}
return [super isIRCStyleCommand:string];
return [super sendAsIRCStyleCommandIfPossible:string];
}
- (void)setKeyboardHeight:(CGFloat)keyboardHeight
@@ -1327,52 +1327,6 @@ static CGSize kThreadListBarButtonItemImageSize;
- (void)sendTextMessage:(NSString*)msgTxt
{
/* $$$
PerformanceProfile *sendTextMessageProfile = [[PerformanceProfile alloc] initWithThreshold:BuildSettings.bwiSendMessageThreshold];
[sendTextMessageProfile startMeasurement];
if (self.inputToolBarSendMode == RoomInputToolbarViewSendModeReply && customizedRoomDataSource.selectedEventId)
{
[self.roomDataSource sendReplyToEventWithId:customizedRoomDataSource.selectedEventId withTextMessage:msgTxt success:^(NSString *string)
{
[self finishTextMessageProfil:sendTextMessageProfile];
} failure:^(NSError *error) {
// Just log the error. The message will be displayed in red in the room history
MXLogDebug(@"[MXKRoomViewController] sendTextMessage failed.");
[sendTextMessageProfile abortMeasurement];
}];
}
else if (self.inputToolBarSendMode == RoomInputToolbarViewSendModeEdit && customizedRoomDataSource.selectedEventId)
{
[self.roomDataSource replaceTextMessageForEventWithId:customizedRoomDataSource.selectedEventId withTextMessage:msgTxt success:^(NSString *string)
{
[self finishTextMessageProfil:sendTextMessageProfile];
} failure:^(NSError *error) {
// Just log the error. The message will be displayed in red
MXLogDebug(@"[MXKRoomViewController] sendTextMessage failed.");
[sendTextMessageProfile abortMeasurement];
}];
}
else
{
// Let the datasource send it and manage the local echo
[self.roomDataSource sendTextMessage:msgTxt success:^(NSString *string)
{
[self finishTextMessageProfil:sendTextMessageProfile];
}
failure:^(NSError *error)
{
// Just log the error. The message will be displayed in red in the room history
MXLogDebug(@"[MXKRoomViewController] sendTextMessage failed.");
[sendTextMessageProfile abortMeasurement];
}];
}
if (customizedRoomDataSource.selectedEventId)
{
[self cancelEventSelection];
*/
// The event modified is always fetch from the actual data source
MXEvent *eventModified = [self.roomDataSource eventWithEventId:self.customizedRoomDataSource.selectedEventId];
@@ -1602,6 +1556,38 @@ static CGSize kThreadListBarButtonItemImageSize;
return item;
}
- (UIBarButtonItem *)joinJitsiBarButtonItem
{
CallTileActionButton *button = [CallTileActionButton new];
[button setImage:AssetImages.callVideoIcon.image
forState:UIControlStateNormal];
[button setTitle:[VectorL10n roomJoinGroupCall]
forState:UIControlStateNormal];
[button addTarget:self
action:@selector(onVideoCallPressed:)
forControlEvents:UIControlEventTouchUpInside];
button.contentEdgeInsets = UIEdgeInsetsMake(4, 12, 4, 12);
UIBarButtonItem *item;
if (RiotSettings.shared.enableThreads)
{
// Add some spacing when there is a threads button
UIView *buttonContainer = [[UIView alloc] initWithFrame:CGRectZero];
[buttonContainer vc_addSubViewMatchingParent:button withInsets:UIEdgeInsetsMake(0, 0, 0, -12)];
item = [[UIBarButtonItem alloc] initWithCustomView:buttonContainer];
}
else
{
item = [[UIBarButtonItem alloc] initWithCustomView:button];
}
item.accessibilityLabel = [VectorL10n roomAccessibilityVideoCall];
return item;
}
- (UIBarButtonItem *)threadMoreBarButtonItem
{
UIBarButtonItem *item = [[UIBarButtonItem alloc] initWithImage:AssetImages.roomContextMenuMore.image
@@ -1806,18 +1792,7 @@ static CGSize kThreadListBarButtonItemImageSize;
}
else
{
// show Join button
CallTileActionButton *button = [CallTileActionButton new];
[button setImage:AssetImages.callVideoIcon.image
forState:UIControlStateNormal];
[button setTitle:[VectorL10n roomJoinGroupCall]
forState:UIControlStateNormal];
[button addTarget:self
action:@selector(onVideoCallPressed:)
forControlEvents:UIControlEventTouchUpInside];
button.contentEdgeInsets = UIEdgeInsetsMake(4, 12, 4, 12);
UIBarButtonItem *item = [[UIBarButtonItem alloc] initWithCustomView:button];
item.accessibilityLabel = [VectorL10n roomAccessibilityVideoCall];
UIBarButtonItem *item = [self joinJitsiBarButtonItem];
[rightBarButtonItems addObject:item];
hasCustomJoinButton = YES;
@@ -1911,6 +1886,9 @@ static CGSize kThreadListBarButtonItemImageSize;
// Update encryption decoration if needed
[self updateEncryptionDecorationForRoomInputToolbar:roomInputToolbarView];
// Update actions when the input toolbar refreshed
[self setupActions];
}
else if (self.inputToolbarView && [self.inputToolbarView isKindOfClass:DisabledRoomInputToolbarView.class])
{
@@ -2096,11 +2074,11 @@ static CGSize kThreadListBarButtonItemImageSize;
self.mediaPickerPresenter = mediaPickerPresenter;
}
- (void)showRoomCreationModalWithBubbleData:(id<MXKRoomBubbleCellDataStoring>) bubbleData
- (void)showRoomCreationModal
{
[self.roomCreationModalCoordinatorBridgePresenter dismissWithAnimated:NO completion:nil];
self.roomCreationModalCoordinatorBridgePresenter = [[RoomCreationModalCoordinatorBridgePresenter alloc] initWithSession:self.mainSession bubbleData:bubbleData roomState:self.roomDataSource.roomState];
self.roomCreationModalCoordinatorBridgePresenter = [[RoomCreationModalCoordinatorBridgePresenter alloc] initWithSession:self.mainSession roomState:self.roomDataSource.roomState];
self.roomCreationModalCoordinatorBridgePresenter.delegate = self;
[self.roomCreationModalCoordinatorBridgePresenter presentFrom:self animated:YES];
}
@@ -2434,19 +2412,24 @@ static CGSize kThreadListBarButtonItemImageSize;
- (ScreenPresentationParameters*)buildUniversalLinkPresentationParameters
{
return [[ScreenPresentationParameters alloc] initWithRestoreInitialDisplay:NO stackAboveVisibleViews:BwiBuildSettings.allowSplitViewDetailsScreenStacking sender:self sourceView:nil];
return [[ScreenPresentationParameters alloc] initWithRestoreInitialDisplay:NO stackAboveVisibleViews:BuildSettings.allowSplitViewDetailsScreenStacking sender:self sourceView:nil];
}
- (BOOL)handleUniversalLinkURL:(NSURL*)universalLinkURL
- (BOOL)handleUniversalLinkURL:(NSURL*)url
{
UniversalLinkParameters *parameters = [[UniversalLinkParameters alloc] initWithUniversalLinkURL:universalLinkURL presentationParameters:[self buildUniversalLinkPresentationParameters]];
ScreenPresentationParameters *screenParameters = [self buildUniversalLinkPresentationParameters];
UniversalLinkParameters *parameters = [[UniversalLinkParameters alloc] initWithUrl:url
presentationParameters:screenParameters];
return [self handleUniversalLinkWithParameters:parameters];
}
- (BOOL)handleUniversalLinkFragment:(NSString*)fragment fromURL:(NSURL*)universalLinkURL
- (BOOL)handleUniversalLinkFragment:(NSString*)fragment fromURL:(NSURL*)url
{
ScreenPresentationParameters *screenParameters = [self buildUniversalLinkPresentationParameters];
UniversalLink *universalLink = [[UniversalLink alloc] initWithUrl:url];
UniversalLinkParameters *parameters = [[UniversalLinkParameters alloc] initWithFragment:fragment
universalLinkURL:universalLinkURL presentationParameters:[self buildUniversalLinkPresentationParameters]];
universalLink:universalLink
presentationParameters:screenParameters];
return [self handleUniversalLinkWithParameters:parameters];
}
@@ -2497,6 +2480,35 @@ static CGSize kThreadListBarButtonItemImageSize;
[self updateLiveLocationBannerViewVisibility];
}
- (void)showEmojiPickerForEventId:(NSString *)eventId
{
EmojiPickerCoordinatorBridgePresenter *emojiPickerCoordinatorBridgePresenter = [[EmojiPickerCoordinatorBridgePresenter alloc] initWithSession:self.mainSession roomId:self.roomDataSource.roomId eventId:eventId];
emojiPickerCoordinatorBridgePresenter.delegate = self;
NSInteger cellRow = [self.roomDataSource indexOfCellDataWithEventId:eventId];
UIView *sourceView;
CGRect sourceRect = CGRectNull;
if (cellRow >= 0)
{
NSIndexPath *cellIndexPath = [NSIndexPath indexPathForRow:cellRow inSection:0];
UITableViewCell *cell = [self.bubblesTableView cellForRowAtIndexPath:cellIndexPath];
sourceView = cell;
if ([cell isKindOfClass:[MXKRoomBubbleTableViewCell class]])
{
MXKRoomBubbleTableViewCell *roomBubbleTableViewCell = (MXKRoomBubbleTableViewCell*)cell;
NSInteger bubbleComponentIndex = [roomBubbleTableViewCell.bubbleData bubbleComponentIndexForEventId:eventId];
sourceRect = [roomBubbleTableViewCell componentFrameInContentViewForIndex:bubbleComponentIndex];
}
}
[emojiPickerCoordinatorBridgePresenter presentFrom:self sourceView:sourceView sourceRect:sourceRect animated:YES];
self.emojiPickerCoordinatorBridgePresenter = emojiPickerCoordinatorBridgePresenter;
}
#pragma mark - Jitsi
- (void)showJitsiCallWithWidget:(Widget*)widget
@@ -2834,7 +2846,7 @@ static CGSize kThreadListBarButtonItemImageSize;
}
BOOL showEncryptionBadge = NO;
RoomTimelineCellIdentifier cellIdentifier = RoomTimelineCellIdentifierEmpty;
RoomTimelineCellIdentifier cellIdentifier;
id<MXKRoomBubbleCellDataStoring> bubbleData = (id<MXKRoomBubbleCellDataStoring>)cellData;
@@ -3288,7 +3300,6 @@ static CGSize kThreadListBarButtonItemImageSize;
// Show contextual menu on single tap if bubble is not collapsed
if (bubbleData.collapsed)
{
[self showRoomCreationModalWithBubbleData:bubbleData];
}
else
{
@@ -3454,6 +3465,14 @@ static CGSize kThreadListBarButtonItemImageSize;
[self showReactionHistoryForEventId:tappedEventId animated:YES];
}
}
else if ([actionIdentifier isEqualToString:kMXKRoomBubbleCellTapOnAddReaction])
{
NSString *tappedEventId = userInfo[kMXKRoomBubbleCellEventIdKey];
if (tappedEventId)
{
[self showEmojiPickerForEventId:tappedEventId];
}
}
else if ([actionIdentifier isEqualToString:RoomDirectCallStatusCell.callBackAction])
{
MXEvent *callInviteEvent = userInfo[kMXKRoomBubbleCellEventKey];
@@ -3542,6 +3561,10 @@ static CGSize kThreadListBarButtonItemImageSize;
{
[self showRoomTopicChange];
}
else if ([actionIdentifier isEqualToString:RoomCreationIntroCell.tapOnRoomName])
{
[self showRoomCreationModal];
}
else
{
// Keep default implementation for other actions
@@ -3685,23 +3708,8 @@ static CGSize kThreadListBarButtonItemImageSize;
}]];
}
if (selectedEvent.sentState == MXEventSentStateSent &&
selectedEvent.eventType != MXEventTypePollStart &&
!selectedEvent.location)
{
[self.eventMenuBuilder addItemWithType:EventMenuItemTypeForward
action:[UIAlertAction actionWithTitle:[VectorL10n roomEventActionForward]
style:UIAlertActionStyleDefault
handler:^(UIAlertAction * action) {
MXStrongifyAndReturnIfNil(self);
[self cancelEventSelection];
[self presentEventForwardingDialogForSelectedEvent:selectedEvent];
}]];
}
if (!isJitsiCallEvent && selectedEvent.eventType != MXEventTypePollStart)
if (!isJitsiCallEvent && selectedEvent.eventType != MXEventTypePollStart &&
selectedEvent.eventType != MXEventTypeBeaconInfo)
{
[self.eventMenuBuilder addItemWithType:EventMenuItemTypeQuote
action:[UIAlertAction actionWithTitle:[VectorL10n roomEventActionQuote]
@@ -3710,16 +3718,20 @@ static CGSize kThreadListBarButtonItemImageSize;
MXStrongifyAndReturnIfNil(self);
[self cancelEventSelection];
// Quote the message a la Markdown into the input toolbar composer
self.inputToolbarView.textMessage = [NSString stringWithFormat:@"%@\n>%@\n\n", self.inputToolbarView.textMessage, selectedComponent.textMessage];
NSString *prefix = [self.inputToolbarView.textMessage length] ? [NSString stringWithFormat:@"%@\n", self.inputToolbarView.textMessage] : @"";
self.inputToolbarView.textMessage = [NSString stringWithFormat:@"%@>%@\n\n", prefix, selectedComponent.textMessage];
// And display the keyboard
[self.inputToolbarView becomeFirstResponder];
}]];
}
if (selectedEvent.sentState == MXEventSentStateSent && selectedEvent.eventType != MXEventTypePollStart)
if (selectedEvent.sentState == MXEventSentStateSent &&
selectedEvent.eventType != MXEventTypePollStart &&
// Forwarding of live-location shares still to be implemented
selectedEvent.eventType != MXEventTypeBeaconInfo)
{
[self.eventMenuBuilder addItemWithType:EventMenuItemTypeForward
action:[UIAlertAction actionWithTitle:[VectorL10n roomEventActionForward]
@@ -3733,7 +3745,8 @@ static CGSize kThreadListBarButtonItemImageSize;
}]];
}
if (!isJitsiCallEvent && BuildSettings.messageDetailsAllowShare && selectedEvent.eventType != MXEventTypePollStart)
if (!isJitsiCallEvent && BuildSettings.messageDetailsAllowShare && selectedEvent.eventType != MXEventTypePollStart &&
selectedEvent.eventType != MXEventTypeBeaconInfo)
{
[self.eventMenuBuilder addItemWithType:EventMenuItemTypeShare
action:[UIAlertAction actionWithTitle:[VectorL10n roomEventActionShare]
@@ -4158,7 +4171,7 @@ static CGSize kThreadListBarButtonItemImageSize;
}]];
}
if (!isJitsiCallEvent && self.roomDataSource.room.summary.isEncrypted && RiotSettings.shared.roomContextualMenuShowEncryptionOption)
if (!isJitsiCallEvent && self.roomDataSource.room.summary.isEncrypted)
{
[self.eventMenuBuilder addItemWithType:EventMenuItemTypeViewEncryption
action:[UIAlertAction actionWithTitle:[VectorL10n roomEventActionViewEncryption]
@@ -4172,17 +4185,16 @@ static CGSize kThreadListBarButtonItemImageSize;
[self showEncryptionInformation:selectedEvent];
}]];
}
[self.eventMenuBuilder addItemWithType:EventMenuItemTypeCancel
action:[UIAlertAction actionWithTitle:[VectorL10n cancel]
style:UIAlertActionStyleCancel
handler:^(UIAlertAction * action) {
MXStrongifyAndReturnIfNil(self);
[self hideContextualMenuAnimated:YES];
}]];
}
[self.eventMenuBuilder addItemWithType:EventMenuItemTypeCancel
action:[UIAlertAction actionWithTitle:[VectorL10n cancel]
style:UIAlertActionStyleCancel
handler:^(UIAlertAction * action) {
MXStrongifyAndReturnIfNil(self);
[self hideContextualMenuAnimated:YES];
}]];
// Do not display empty action sheet
if (!self.eventMenuBuilder.isEmpty)
@@ -4562,9 +4574,6 @@ static CGSize kThreadListBarButtonItemImageSize;
unknownDevices = nil;
}
}
// Hide back button title
self.navigationItem.backBarButtonItem = [[UIBarButtonItem alloc] initWithTitle:@"" style:UIBarButtonItemStylePlain target:nil action:nil];
}
#pragma mark - VoIP
@@ -4819,7 +4828,28 @@ static CGSize kThreadListBarButtonItemImageSize;
- (void)roomInputToolbarView:(RoomInputToolbarView *)toolbarView sendAttributedTextMessage:(NSAttributedString *)attributedTextMessage
{
[self sendAttributedTextMessage:attributedTextMessage];
BOOL isMessageAHandledCommand = NO;
// "/me" command is supported with Pills in RoomDataSource.
if (![attributedTextMessage.string hasPrefix:kMXKSlashCmdEmote])
{
// Other commands currently work with identifiers (e.g. ban, invite, op, etc).
NSString *message;
if (@available(iOS 15.0, *))
{
message = [PillsFormatter stringByReplacingPillsIn:attributedTextMessage mode:PillsReplacementTextModeIdentifier];
}
else
{
message = attributedTextMessage.string;
}
// Try to send the slash command
isMessageAHandledCommand = [self sendAsIRCStyleCommandIfPossible:message];
}
if (!isMessageAHandledCommand)
{
[self sendAttributedTextMessage:attributedTextMessage];
}
}
#pragma mark - MXKRoomMemberDetailsViewControllerDelegate
@@ -5541,8 +5571,6 @@ static CGSize kThreadListBarButtonItemImageSize;
}
else if ([AppDelegate theDelegate].isOffline)
{
self.activitiesViewExpanded = YES;
[roomActivitiesView displayNetworkErrorNotification:[VectorL10n roomOfflineNotification]];
}
else if (self.customizedRoomDataSource.roomState.isObsolete)
{
@@ -6778,8 +6806,7 @@ static CGSize kThreadListBarButtonItemImageSize;
MXKRoomBubbleTableViewCell *roomBubbleTableViewCell = (MXKRoomBubbleTableViewCell *)cell;
MXKAttachment *attachment = roomBubbleTableViewCell.bubbleData.attachment;
BOOL result = (event.eventType != MXEventTypePollStart && (!attachment || attachment.type != MXKAttachmentTypeSticker));
BOOL result = !attachment || attachment.type != MXKAttachmentTypeSticker;
if (attachment && !BuildSettings.messageDetailsAllowCopyMedia)
{
@@ -6805,6 +6832,8 @@ static CGSize kThreadListBarButtonItemImageSize;
case MXEventTypeKeyVerificationMac:
case MXEventTypeKeyVerificationDone:
case MXEventTypeKeyVerificationCancel:
case MXEventTypePollStart:
case MXEventTypeBeaconInfo:
result = NO;
break;
case MXEventTypeCustom:
@@ -6850,7 +6879,8 @@ static CGSize kThreadListBarButtonItemImageSize;
{
if (@available(iOS 15.0, *))
{
MXKPasteboardManager.shared.pasteboard.string = [PillsFormatter stringByReplacingPillsIn:attributedTextMessage asMarkdown:YES];
MXKPasteboardManager.shared.pasteboard.string = [PillsFormatter stringByReplacingPillsIn:attributedTextMessage
mode:PillsReplacementTextModeMarkdown];
}
else
{
@@ -7212,32 +7242,8 @@ static CGSize kThreadListBarButtonItemImageSize;
- (void)reactionsMenuViewModelDidTapMoreReactions:(ReactionsMenuViewModel *)viewModel forEventId:(NSString *)eventId
{
[self hideContextualMenuAnimated:YES];
EmojiPickerCoordinatorBridgePresenter *emojiPickerCoordinatorBridgePresenter = [[EmojiPickerCoordinatorBridgePresenter alloc] initWithSession:self.mainSession roomId:self.roomDataSource.roomId eventId:eventId];
emojiPickerCoordinatorBridgePresenter.delegate = self;
NSInteger cellRow = [self.roomDataSource indexOfCellDataWithEventId:eventId];
UIView *sourceView;
CGRect sourceRect = CGRectNull;
if (cellRow >= 0)
{
NSIndexPath *cellIndexPath = [NSIndexPath indexPathForRow:cellRow inSection:0];
UITableViewCell *cell = [self.bubblesTableView cellForRowAtIndexPath:cellIndexPath];
sourceView = cell;
if ([cell isKindOfClass:[MXKRoomBubbleTableViewCell class]])
{
MXKRoomBubbleTableViewCell *roomBubbleTableViewCell = (MXKRoomBubbleTableViewCell*)cell;
NSInteger bubbleComponentIndex = [roomBubbleTableViewCell.bubbleData bubbleComponentIndexForEventId:eventId];
sourceRect = [roomBubbleTableViewCell componentFrameInContentViewForIndex:bubbleComponentIndex];
}
}
[emojiPickerCoordinatorBridgePresenter presentFrom:self sourceView:sourceView sourceRect:sourceRect animated:YES];
self.emojiPickerCoordinatorBridgePresenter = emojiPickerCoordinatorBridgePresenter;
[self showEmojiPickerForEventId:eventId];
}
#pragma mark -